@qilitt-mickey/vue3-temp-skill 1.1.23 → 1.1.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/SKILL.md CHANGED
@@ -29,7 +29,7 @@ tags: [vue3, typescript, element-plus, vant, pinia, vite, unocss, crud, componen
29
29
  - **精简出厂**:模板 `views/` 仅保留登录/首页等壳页面;**业务标准样板**在本包 `references/`(如 `crud-pages`、`detail-page`)
30
30
  - **依赖分层**:`package.json` 仅 **core**;**addon** 默认不装;缺包时装依赖后须按 `addon-enable.md` **逐文件恢复配置**(非自动)
31
31
  - 壳层行为(顶部 tag / 侧栏 / keep-alive / `useDetail`)以**当前项目**已有实现为准
32
- - **双轨**:无设计 handoff → 保持模版出厂;有设计落地 → 读 `design-handoff.md` **原子步骤**(`Theme`/`Version`/令牌整组,禁止只改主色)
32
+ - **双轨**:无设计 handoff → 保持模版出厂;有设计落地 → 读 `design-handoff.md` 逐文件修改清单 + 设计 Skill `project-implementation-protocol.md`
33
33
 
34
34
  ## 使用方式
35
35
 
@@ -70,7 +70,8 @@ tags: [vue3, typescript, element-plus, vant, pinia, vite, unocss, crud, componen
70
70
  | addon / 查 Re* 名 / 装依赖 | `references/project-inventory.md` |
71
71
  | **启用精简模板已删的 addon(装包 + 改配置)** | `references/addon-enable.md`(与功能模块同读) |
72
72
  | 写完代码后(闸门,非功能命中) | `references/code-quality.md` |
73
- | 设计交接块 / **design-handoff/v1 JSON** / 上游令牌产出落地 | `references/design-handoff.md`(+ `design-system`) |
73
+ | 设计交接块 / **design-handoff/v1 JSON** / 上游令牌产出落地 | `references/design-handoff.md`(逐文件修改清单)+ `design-system.md`(项目设计系统说明) |
74
+ | **设计模式**(设计 Skill 产出存在时触发) | `crud-pages.md` 设计模式样板 + 设计 Skill `project-implementation-protocol.md`(1:1 还原协议) |
74
75
 
75
76
  ### 标准业务面
76
77
 
@@ -82,7 +83,7 @@ tags: [vue3, typescript, element-plus, vant, pinia, vite, unocss, crud, componen
82
83
  | **data-writeback** | 回显、回填、useFormCheck |
83
84
  | **permission-auth** | 权限、v-auth、roles、ReAuth |
84
85
  | **layout-theme** | 布局、主题、暗黑、`--vts-*`、UnoCSS |
85
- | **design-system** | 设计规范、UI 规范、按 XX 规范适配、design-tokens、主题色系、设计交接块 |
86
+ | **design-system** | 设计规范、UI 规范、按 XX 规范适配、design-tokens、主题色系、令牌体系、暗色模式 |
86
87
  | **icons** | 图标、svg-icon、Iconify、ReIconPicker、菜单图标 |
87
88
  | **feedback-loading** | message、loading、确认框 |
88
89
  | **base-code-dict** | 字典、baseCode、码表 |
@@ -132,7 +133,7 @@ tags: [vue3, typescript, element-plus, vant, pinia, vite, unocss, crud, componen
132
133
  - 导出 Excel → `download-export`
133
134
  - 菜单/本地图标 → `icons`
134
135
  - 粒子背景 → `particles`
135
- - 按 XX / UI 规范适配、设计交接块、整站风格重构 → `design-system` + `layout-theme`;有令牌/交接产出时加读 `design-handoff.md`
136
+ - 按 XX / UI 规范适配、设计交接块、整站风格重构 → `design-system`(项目设计系统说明)+ `layout-theme`;有令牌/交接产出时加读 `design-handoff.md`(逐文件修改清单)+ 设计 Skill `project-implementation-protocol.md`
136
137
  - 列表→独立详情/编辑页 → `crud-pages` + `detail-page`
137
138
  6. 独立详情路由:跳转与 meta 见 `detail-page`(`toDetail` / `showLink` / `activePath` / `initToDetail`)
138
139
 
@@ -147,7 +148,7 @@ tags: [vue3, typescript, element-plus, vant, pinia, vite, unocss, crud, componen
147
148
  ## 工作流
148
149
 
149
150
  1. **需求分析**:列出功能模块 ID(不含 `code-quality`)
150
- 2. **加载**:`core-kernel` + 命中模块;addon/缺包时加读 `project-inventory` + **`addon-enable`**;设计规范/交接产出时加读 `design-handoff`
151
+ 2. **加载**:`core-kernel` + 命中模块;addon/缺包时加读 `project-inventory` + **`addon-enable`**;设计规范/交接产出时加读 `design-handoff`(逐文件修改清单)+ 设计 Skill `project-implementation-protocol.md`
151
152
  3. **依赖**:缺包按 inventory 第九节精确版本,确认后安装;**再按 `addon-enable` 对应章节改配置**
152
153
  4. **探查**:复用仓库 `Re*` / Hook / utils
153
154
  5. **生成**:可运行代码落盘
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qilitt-mickey/vue3-temp-skill",
3
- "version": "1.1.23",
3
+ "version": "1.1.25",
4
4
  "description": "Vue 3 企业级中后台项目开发规范技能包 — core-kernel 架构、按需功能模块",
5
5
  "bin": {
6
6
  "vue3-temp-skill": "./bin/cli.js"
@@ -46,6 +46,20 @@ lint / type-check **过了也不能放过**下列项。发现即改代码,禁
46
46
  | 新菜单路由 | 父级无 `icon` 或业务页二次挂 `Layout` | `icons` + `core-kernel` |
47
47
  | 列表查询区 `el-form` / 查询按钮 | 写了 `size="small"`(紧凑主题用户未要求) | 不写 size,用 default=`--control-height` |
48
48
  | 本轮新增 addon 并引用对应 `Re*` / Vant / 微信 | 已装包但 `tsconfig exclude` 仍含该路径,或 `addon-enable` 要求的 build/src 未改 | 按 **`addon-enable.md`** 对应章节恢复后重跑 type-check |
49
+ | `element-plus.scss` 内视觉规则(shadow/hover/transition) | 出现非令牌引用的裸 hex / px / rgba 值 | 全部改为 `var()` 引用令牌 |
50
+ | 视觉规则新增 | `dark.scss` 缺少对应暗色覆盖 | 每条新规则在 `html.dark` 内有对应覆盖 |
51
+
52
+ ### 设计模式专项检查(设计 Skill 产出存在时)
53
+
54
+ 设计还原的完整检查清单见设计 Skill 的 `project-implementation-protocol.md`。本闸门只检查项目侧落地结果:
55
+
56
+ | 检查项 | 失败条件 | 修复 |
57
+ |--------|---------|------|
58
+ | 页面区域结构 | JSON `structureRequirements.pageRegions` 指定的区域在页面中缺失 | 按 `crud-pages.md` 设计模式样板 D1-D8 补充 |
59
+ | 框架壳层 | JSON `structureRequirements.frameworkShell` 指定的壳层配置未落地 | 按 `design-handoff.md` 配置文件修改清单 C1-C8 执行 |
60
+ | 交互行为 | JSON `interactionSpecs` 指定的交互未实现 | 按 `project-implementation-protocol.md` 交互保真要求实现 |
61
+ | 令牌引用 | 页面代码中 CSS 钩子类对应的值非令牌引用 | 值来自 `design-tokens.scss` 令牌变量 |
62
+ | 逐文件修改清单 | `design-handoff.md` 清单中有未执行项 | 补齐遗漏项 |
49
63
 
50
64
  ## 选型与硬约束
51
65
 
@@ -101,12 +115,11 @@ lint / type-check **过了也不能放过**下列项。发现即改代码,禁
101
115
 
102
116
  ### design-system(命中时)
103
117
 
104
- - [ ] 规范识别回执;令牌 / `platform-config.json` / 侧栏主题一致
105
- - [ ] 已建 `design-tokens.scss`;`index.scss` 中其 `@use` 最前
106
- - [ ] 冲突清单已逐条处理(见 `design-system`)
107
- - [ ] 有上游设计产出时已读 `design-handoff`:JSON 优先;**原子步骤**含 `Theme=default`(深色侧栏)+ `--sidebar-*` + **`Version++`** + 主色阶;禁止只改 EpThemeColor;错误色 `#F5222D`
118
+ - [ ] 有设计 Skill 产出时已读 `design-handoff.md` 逐文件修改清单并执行
119
+ - [ ] 设计还原检查对照设计 Skill 的 `project-implementation-protocol.md` 检查清单
120
+ - [ ] 令牌 / `platform-config.json` / 侧栏主题三处一致
108
121
  - [ ] **无**设计落地时未改出厂主色 / ShowModel / 壳层 / 弹窗几何默认
109
- - [ ] 组件尺寸三档已落地并桥接 `--el-component-size*`;缺档回退至 default;未全局强制 `size="small"`;**查询区不写 size**(三档对照表 ≠ 查询区要用 small)
122
+ - [ ] 组件尺寸三档已落地并桥接 `--el-component-size*`;缺档回退至 default;查询区不写 size
110
123
 
111
124
  ## 业务
112
125
 
@@ -43,7 +43,7 @@ useTableSearch(formQuery, searchFn, url)
43
43
  |---|------|
44
44
  | L1 | `el-card` + `class="vts-page-card"` + `ref="content"`(禁止挂 `div`) |
45
45
  | L2 | 不要写 `height: calc(100vh - …)` / 不要用 JS 测顶栏定高(壳层 + `.vts-page-card` 已填满) |
46
- | L3 | 查询区 `bg-bg_color p-5`;展示区 `ReTableBar class="bg-bg_color"` |
46
+ | L3 | 查询区 `class="vts-filter-area"`(含容器感+分隔线,等效旧 `bg-bg_color p-5`);展示区 `ReTableBar` 外包 `.vts-table-area` |
47
47
  | L4 | `ReGrid` `:gap="[0,20]"` + cols;表单项 `w-[100%] !mr-0`;`@should-show-collapse` |
48
48
  | L5 | 查询区 `<ReGridItem suffix>`(查询 / 重置 / 展开收起) |
49
49
  | L6 | 表格绑 `ref="multipleTableRef"` + `tableHeight`;分页在 `ReTableBar` `#default` 内、表格下方 |
@@ -249,7 +249,260 @@ function handleSizeChange(size: number) {
249
249
  </template>
250
250
  ```
251
251
 
252
- 补充:`ReTableOperate` 用 `:list`;`defineOptions.name` === 路由 `name`;`svgLoading` 来自 `useApp()`;列表定高走壳层令牌 + `vts-page-card`。
252
+ 补充:`ReTableOperate` 用 `:list`;`defineOptions.name` === 路由 `name`;`svgLoading` 来自 `useApp()`;列表定高走壳层令牌 + `vts-page-card`。
253
+
254
+ ## 列表设计模式样板(设计 Skill 产出存在时使用)
255
+
256
+ > **触发条件**:存在 `design-handoff/v1` JSON(含 `structureRequirements` + `pageStructure` 段)、用户指定设计规范、或命中 `design-system` 模块且设计 Skill 产出可用。
257
+ >
258
+ > **1:1 还原要求**:页面区域结构必须按 JSON `structureRequirements.pageRegions` 实现,框架壳层按 `structureRequirements.frameworkShell` 实现。详见设计 Skill 的 `project-implementation-protocol.md`。
259
+ >
260
+ > **与出厂模式的区别**:出厂模式(上文 L1-L9)直接堆 `el-card` + 查询区 + 表格,无页面标题区。设计模式按 JSON `pageStructure` 区域拆分,包含完整的页面标题区、筛选区容器、操作栏、表格区。
261
+ >
262
+ > **结构变化**(以 JSON `structureRequirements.pageRegions` 为准,下方为默认区域):
263
+ > - 新增 `.vts-page-header`(标题 + 描述 + 标题区操作按钮)— 对应 JSON `pageStructure.regions.header`
264
+ > - 查询区从 `bg-bg_color p-5` 升级为 `.vts-filter-area`(有容器感 + 分隔线)— 对应 `pageStructure.regions.filter`
265
+ > - 表格区外包 `.vts-table-area`(有圆角边框包裹)— 对应 `pageStructure.regions.table`
266
+ > - 主操作按钮(新增/导入)从 `ReTableBar #buttons` 移到 `.vts-page-header__actions`
267
+ > - 若 JSON 指定额外区域(如统计区、页签切换区),按 `pageStructure.regions` 顺序在 `otherRef` 位或独立区域中实现
268
+
269
+ | # | 必须 |
270
+ |---|------|
271
+ | D1 | `el-card` + `class="vts-page-card"` + `ref="content"`(同 L1) |
272
+ | D2 | `.vts-page-header`:标题 18px 加粗 + 描述 13px tertiary + 右侧操作按钮(新增/导入) |
273
+ | D3 | `.vts-filter-area`:筛选区容器(独立背景 + 圆角 + 底部分隔线) |
274
+ | D4 | `.vts-action-bar`:表格上方操作栏(批量删除等 + 右侧刷新/列设置) |
275
+ | D5 | `.vts-table-area`:表格区包裹(圆角 + 边框) |
276
+ | D6 | 表头:品牌色浅底 + 字重 600 + 底部强调线(由 `element-plus.scss` 全局提供) |
277
+ | D7 | 行 hover:品牌色极浅底 + 过渡(由 `element-plus.scss` 全局提供) |
278
+ | D8 | 其余同 L4-L9(ReGrid / ReTableBar / RePagination / ReTableOperate) |
279
+
280
+ ```vue
281
+ <script setup lang="ts">
282
+ import type { OperateButton } from "@/components/ReTableOperate";
283
+ import type { Customer, CustomerQuery } from "@/api/customer";
284
+ import { getCustomerList } from "@/api/customer";
285
+ import { ReGrid } from "@/components/ReGrid";
286
+ import { ReGridItem } from "@/components/ReGridItem";
287
+ import { RePagination } from "@/components/RePagination";
288
+ import { ReTableBar } from "@/components/ReTableBar";
289
+ import { ReTableOperate, resolveOperateColumnWidth } from "@/components/ReTableOperate";
290
+ import { useApp } from "@/hooks/useApp";
291
+ import { useTableSearch } from "@/hooks/useTableSearch";
292
+ import { message } from "@/utils/message";
293
+
294
+ defineOptions({ name: "CustomerList" });
295
+
296
+ const { svgLoading } = useApp();
297
+ const formQuery = reactive<CustomerQuery>({ keyword: "", status: undefined });
298
+
299
+ const {
300
+ content,
301
+ otherRef,
302
+ tableHeight,
303
+ paginationRef,
304
+ loading,
305
+ formRef,
306
+ multipleTableRef,
307
+ pagination,
308
+ onSearch,
309
+ tableData,
310
+ gridRef,
311
+ showCollapse,
312
+ collapsed,
313
+ collapsedToggle,
314
+ upBold,
315
+ downBold,
316
+ reset,
317
+ } = useTableSearch(
318
+ formQuery,
319
+ getCustomerList,
320
+ `${import.meta.env.VITE_API_BASE_URL}/console/customer/list`,
321
+ );
322
+
323
+ const tableList = computed(() => tableData.value.tableList as Customer[]);
324
+
325
+ const operateLimit = 3;
326
+
327
+ const operateButtons: OperateButton[] = [
328
+ {
329
+ label: $t("删除"),
330
+ type: "danger",
331
+ icon: "i-ep:delete",
332
+ onClick: (row) => handleDelete(row as Customer),
333
+ },
334
+ ];
335
+
336
+ onMounted(() => onSearch());
337
+
338
+ function handleDelete(row: Customer) {
339
+ message($t("删除成功"), { type: "success" });
340
+ onSearch();
341
+ }
342
+
343
+ function handleCurrentChange(cur: number) {
344
+ pagination.currentPage = cur;
345
+ onSearch();
346
+ }
347
+
348
+ function handleSizeChange(size: number) {
349
+ pagination.pageSize = size;
350
+ onSearch();
351
+ }
352
+ </script>
353
+
354
+ <template>
355
+ <div>
356
+ <el-card
357
+ ref="content"
358
+ class="vts-page-card"
359
+ shadow="never"
360
+ >
361
+ <!-- D2: 页面标题区 -->
362
+ <div class="vts-page-header">
363
+ <div class="vts-page-header__info">
364
+ <span class="vts-page-header__title">{{ $t("客户列表") }}</span>
365
+ <span class="vts-page-header__desc">{{ $t("管理客户的售价、类型与库存信息") }}</span>
366
+ </div>
367
+ <div class="vts-page-header__actions">
368
+ <el-button
369
+ type="primary"
370
+ v-auth="['admin']"
371
+ @click="handleAdd"
372
+ >
373
+ {{ $t("新增") }}
374
+ </el-button>
375
+ <el-button v-auth="['admin']">{{ $t("导入") }}</el-button>
376
+ </div>
377
+ </div>
378
+
379
+ <!-- D3: 筛选区容器 -->
380
+ <div class="vts-filter-area">
381
+ <el-form
382
+ ref="formRef"
383
+ :inline="true"
384
+ :model="formQuery"
385
+ >
386
+ <ReGrid
387
+ ref="gridRef"
388
+ :collapsed="collapsed"
389
+ :gap="[0, 20]"
390
+ :cols="{ xs: 1, sm: 2, md: 2, lg: 3, xl: 4 }"
391
+ style="max-height: 300px; overflow-y: auto;"
392
+ @should-show-collapse="(val) => (showCollapse = val)"
393
+ >
394
+ <ReGridItem index="0">
395
+ <el-form-item :label="$t('关键词')" prop="keyword" class="w-[100%] !mr-0">
396
+ <el-input v-model="formQuery.keyword" clearable :placeholder="$t('请输入')" />
397
+ </el-form-item>
398
+ </ReGridItem>
399
+ <ReGridItem index="1">
400
+ <el-form-item :label="$t('状态')" prop="status" class="w-[100%] !mr-0">
401
+ <el-select v-model="formQuery.status" clearable :placeholder="$t('请选择')">
402
+ <el-option :label="$t('启用')" :value="1" />
403
+ <el-option :label="$t('禁用')" :value="0" />
404
+ </el-select>
405
+ </el-form-item>
406
+ </ReGridItem>
407
+ <ReGridItem suffix>
408
+ <div class="flex flex-end">
409
+ <el-button
410
+ type="primary"
411
+ :loading="loading"
412
+ @click="pagination.currentPage = 1; pagination.pageSize = 10; onSearch()"
413
+ >
414
+ {{ $t("查询") }}
415
+ </el-button>
416
+ <el-button @click="reset">{{ $t("重置") }}</el-button>
417
+ <el-button
418
+ v-if="showCollapse"
419
+ type="primary"
420
+ link
421
+ class="!font-size-12"
422
+ @click="collapsedToggle"
423
+ >
424
+ {{ collapsed ? $t("展开") : $t("收起") }}
425
+ <el-icon class="el-icon--right">
426
+ <component :is="collapsed ? downBold : upBold" />
427
+ </el-icon>
428
+ </el-button>
429
+ </div>
430
+ </ReGridItem>
431
+ </ReGrid>
432
+ </el-form>
433
+ </div>
434
+
435
+ <div ref="otherRef">
436
+ <!-- 统计/页签等额外模块;无则删除整段 -->
437
+ </div>
438
+
439
+ <!-- D4+D5: 操作栏 + 表格区 -->
440
+ <div class="vts-table-area">
441
+ <ReTableBar :columns="[]" @refresh="onSearch">
442
+ <template #title>
443
+ <span class="truncate font-size-16 font-bold">{{ $t("展示列表") }}</span>
444
+ </template>
445
+ <template #buttons>
446
+ <el-button type="danger" v-auth="['admin']">{{ $t("批量删除") }}</el-button>
447
+ </template>
448
+ <template #default="{ size }">
449
+ <div class="vl-parent">
450
+ <el-table
451
+ ref="multipleTableRef"
452
+ v-loading.lock="loading"
453
+ :element-loading-text="$t('加载中')"
454
+ :element-loading-spinner="svgLoading"
455
+ element-loading-svg-view-box="0, 0, 20, 20"
456
+ :style="{ height: `${tableHeight}px` }"
457
+ :size="size"
458
+ :data="tableList"
459
+ row-key="id"
460
+ >
461
+ <el-table-column prop="code" :label="$t('编号')" min-width="120" />
462
+ <el-table-column prop="name" :label="$t('名称')" min-width="140" />
463
+ <el-table-column
464
+ :label="$t('操作')"
465
+ :width="resolveOperateColumnWidth({ list: operateButtons, limit: operateLimit, size })"
466
+ fixed="right"
467
+ >
468
+ <template #default="{ row, $index }">
469
+ <ReTableOperate
470
+ :list="operateButtons"
471
+ :row="row"
472
+ :index="$index"
473
+ :limit="operateLimit"
474
+ :size="size"
475
+ />
476
+ </template>
477
+ </el-table-column>
478
+ </el-table>
479
+ <RePagination
480
+ ref="paginationRef"
481
+ :size="size"
482
+ :pagination="pagination"
483
+ @handle-current-change="handleCurrentChange"
484
+ @handle-size-change="handleSizeChange"
485
+ />
486
+ </div>
487
+ </template>
488
+ </ReTableBar>
489
+ </div>
490
+ </el-card>
491
+ </div>
492
+ </template>
493
+ ```
494
+
495
+ **设计模式与出厂模式的关键差异**:
496
+
497
+ | 差异点 | 出厂模式 | 设计模式 | JSON 来源 |
498
+ |--------|---------|---------|-----------|
499
+ | 页面标题 | 无 | `.vts-page-header` 含标题+描述+操作 | `structureRequirements.pageRegions.header` |
500
+ | 筛选区 | `bg-bg_color p-5` | `.vts-filter-area`(容器感+分隔线) | `structureRequirements.pageRegions.filter` |
501
+ | 主操作按钮位置 | `ReTableBar #buttons` | `.vts-page-header__actions` | `structureRequirements.pageRegions.header.actions` |
502
+ | 表格区 | 无包裹 | `.vts-table-area`(圆角边框) | `structureRequirements.pageRegions.table` |
503
+ | 表头底色 | EP 默认浅灰 | 由 `element-plus.scss` 全局提供品牌色浅底+强调线 | `visual.tableHeader` |
504
+ | 行 hover | EP 默认灰色 | 由 `element-plus.scss` 全局提供品牌色极浅底 | `visual.rowHover` |
505
+ | 交互行为 | EP 默认 | 按 JSON `interactionSpecs` 实现 | `interactionSpecs` |
253
506
 
254
507
  ## 操作列按钮过多(ReTableOperate · 强制)
255
508