@qilitt-mickey/vue3-temp-skill 1.1.22 → 1.1.24
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 +3 -2
- package/package.json +1 -1
- package/references/code-quality.md +15 -1
- package/references/crud-pages.md +287 -5
- package/references/design-handoff.md +37 -3
- package/references/design-system.md +37 -13
- package/references/project-inventory.md +1 -1
package/SKILL.md
CHANGED
|
@@ -70,14 +70,15 @@ 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`) |
|
|
74
|
+
| **设计模式**(设计 Skill 产出存在时触发) | `crud-pages.md` 设计模式样板 + `design-system.md` Step 3.5 |
|
|
74
75
|
|
|
75
76
|
### 标准业务面
|
|
76
77
|
|
|
77
78
|
| 模块 | 关键词 |
|
|
78
79
|
|------|--------|
|
|
79
80
|
| **http-api** | 接口、http、加密、API |
|
|
80
|
-
| **crud-pages** | 列表、表格、查询、管理、CRUD
|
|
81
|
+
| **crud-pages** | 列表、表格、查询、管理、CRUD、新增编辑、操作列、行操作 |
|
|
81
82
|
| **detail-page** | 详情、编辑页、查看页、新开路由、toDetail、activePath、showLink、顶部 tag |
|
|
82
83
|
| **data-writeback** | 回显、回填、useFormCheck |
|
|
83
84
|
| **permission-auth** | 权限、v-auth、roles、ReAuth |
|
package/package.json
CHANGED
|
@@ -37,7 +37,7 @@ lint / type-check **过了也不能放过**下列项。发现即改代码,禁
|
|
|
37
37
|
| `toDetail` / 独立 `*Detail` 路由 | 路由无 `activePath`,或 `showLink` 非 `false` | `detail-page` 三件套 |
|
|
38
38
|
| 同上 | 默认场景缺 `keepAlive`/`moreTags`(业务未声明不要缓存) | 样板默认写出;不要缓存再删 |
|
|
39
39
|
| 同上 | 详情页无 `initToDetail`,或 `name` 与路由不一致 | 对齐 `defineOptions` |
|
|
40
|
-
| 列表页 | 无 `el-card.vts-page-card` / `100vh` 减顶栏定高 / 无 `tableHeight` / 分页在 ReTableBar 外 / 操作列手写多按钮未用 `ReTableOperate` | `crud-pages` L1–L9 |
|
|
40
|
+
| 列表页 | 无 `el-card.vts-page-card` / `100vh` 减顶栏定高 / 无 `tableHeight` / 分页在 ReTableBar 外 / 操作列手写多按钮未用 `ReTableOperate` / 操作列写死 `width` 未用 `resolveOperateColumnWidth` / `ReTableOperate` 未传 `:size="size"` | `crud-pages` L1–L9 |
|
|
41
41
|
| `src/api/**` | 绕过 `@/utils/http`,或虚构 `/api` 前缀,或响应当 `success`/`code` | `http-api` |
|
|
42
42
|
| 下载/导出 API | 无 `responseType: "blob"` | `http-api` / `download-export` |
|
|
43
43
|
| 删除/危险操作 | 无确认框 | `feedback-loading` |
|
|
@@ -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
|
+
| `design-visual.scss` / `design-layout.scss` 存在 | `index.scss` 未 `@use` 加载,或加载顺序不在 `element-plus` 之前 | `design-tokens` → `design-visual` → `design-layout` → `element-plus` |
|
|
50
|
+
| `design-visual.scss` 规则体内出现硬编码值 | 非令牌引用的裸 hex / px / rgba 值 | 全部改为 `var()` 引用令牌 |
|
|
51
|
+
| 视觉层 / 构图层新增规则 | `dark.scss` 缺少对应暗色覆盖 | 每条新规则在 `html.dark` 内有对应覆盖 |
|
|
52
|
+
|
|
53
|
+
### 设计模式专项检查(设计 Skill 产出存在时)
|
|
54
|
+
|
|
55
|
+
| 检查项 | 失败条件 | 修复 |
|
|
56
|
+
|--------|---------|------|
|
|
57
|
+
| 列表页页面标题区 | 设计模式下列表页无 `.vts-page-header`(标题+描述+操作) | 按 `crud-pages.md` 设计模式样板 D2 补充 |
|
|
58
|
+
| 列表页筛选区 | 设计模式下仍用 `bg-bg_color p-5` 而非 `.vts-filter-area` | 升级为 `.vts-filter-area` |
|
|
59
|
+
| 列表页表格区 | 设计模式下表格区无 `.vts-table-area` 包裹 | 外包 `.vts-table-area` |
|
|
60
|
+
| 设计模式值引用 | 页面代码中 CSS 钩子类对应的值非令牌引用 | 值来自 `design-tokens.scss` 令牌变量 |
|
|
61
|
+
|
|
62
|
+
> **放松说明**:设计模式下,允许页面级结构 CSS(`.vts-page-header` 等布局类)。项目 Skill 的禁止项("禁止另建独立重写层文件"等)在**设计模式**下不适用于页面代码中的布局结构实现,仅对全局样式文件生效。
|
|
49
63
|
|
|
50
64
|
## 选型与硬约束
|
|
51
65
|
|
package/references/crud-pages.md
CHANGED
|
@@ -43,13 +43,13 @@ 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
|
|
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` 内、表格下方 |
|
|
50
50
|
| L7 | `RePagination`:`:pagination` + `@handle-current-change` / `@handle-size-change` |
|
|
51
51
|
| L8 | 查询与表之间的额外模块包一根元素绑 `otherRef`(须在表格上方,高度计入 `tableTop`) |
|
|
52
|
-
| L9 | 表格操作列 `ReTableOperate :list
|
|
52
|
+
| L9 | 表格操作列 **必须** `ReTableOperate :list` + `resolveOperateColumnWidth` + `:size="size"`;用户口述多项操作时按下文「需求→落盘」整段生成,禁止手写 `el-button` / 写死列宽 |
|
|
53
53
|
|
|
54
54
|
```vue
|
|
55
55
|
<script setup lang="ts">
|
|
@@ -249,7 +249,256 @@ 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、用户指定设计规范、或命中 `design-system` 模块且设计 Skill 产出可用。
|
|
257
|
+
>
|
|
258
|
+
> **与出厂模式的区别**:出厂模式(上文 L1-L9)直接堆 `el-card` + 查询区 + 表格,无页面标题区。设计模式按设计 Skill 的 `list-page.md` 区域拆分,包含完整的页面标题区、筛选区容器、操作栏、表格区。
|
|
259
|
+
>
|
|
260
|
+
> **结构变化**:
|
|
261
|
+
> - 新增 `.vts-page-header`(标题 + 描述 + 标题区操作按钮)
|
|
262
|
+
> - 查询区从 `bg-bg_color p-5` 升级为 `.vts-filter-area`(有容器感 + 分隔线)
|
|
263
|
+
> - 表格区外包 `.vts-table-area`(有圆角边框包裹)
|
|
264
|
+
> - 主操作按钮(新增/导入)从 `ReTableBar #buttons` 移到 `.vts-page-header__actions`
|
|
265
|
+
|
|
266
|
+
| # | 必须 |
|
|
267
|
+
|---|------|
|
|
268
|
+
| D1 | `el-card` + `class="vts-page-card"` + `ref="content"`(同 L1) |
|
|
269
|
+
| D2 | `.vts-page-header`:标题 18px 加粗 + 描述 13px tertiary + 右侧操作按钮(新增/导入) |
|
|
270
|
+
| D3 | `.vts-filter-area`:筛选区容器(独立背景 + 圆角 + 底部分隔线) |
|
|
271
|
+
| D4 | `.vts-action-bar`:表格上方操作栏(批量删除等 + 右侧刷新/列设置) |
|
|
272
|
+
| D5 | `.vts-table-area`:表格区包裹(圆角 + 边框) |
|
|
273
|
+
| D6 | 表头:品牌色浅底 + 字重 600 + 底部强调线(由 `design-visual.scss` 全局提供) |
|
|
274
|
+
| D7 | 行 hover:品牌色极浅底 + 过渡(由 `design-visual.scss` 全局提供) |
|
|
275
|
+
| D8 | 其余同 L4-L9(ReGrid / ReTableBar / RePagination / ReTableOperate) |
|
|
276
|
+
|
|
277
|
+
```vue
|
|
278
|
+
<script setup lang="ts">
|
|
279
|
+
import type { OperateButton } from "@/components/ReTableOperate";
|
|
280
|
+
import type { Customer, CustomerQuery } from "@/api/customer";
|
|
281
|
+
import { getCustomerList } from "@/api/customer";
|
|
282
|
+
import { ReGrid } from "@/components/ReGrid";
|
|
283
|
+
import { ReGridItem } from "@/components/ReGridItem";
|
|
284
|
+
import { RePagination } from "@/components/RePagination";
|
|
285
|
+
import { ReTableBar } from "@/components/ReTableBar";
|
|
286
|
+
import { ReTableOperate, resolveOperateColumnWidth } from "@/components/ReTableOperate";
|
|
287
|
+
import { useApp } from "@/hooks/useApp";
|
|
288
|
+
import { useTableSearch } from "@/hooks/useTableSearch";
|
|
289
|
+
import { message } from "@/utils/message";
|
|
290
|
+
|
|
291
|
+
defineOptions({ name: "CustomerList" });
|
|
292
|
+
|
|
293
|
+
const { svgLoading } = useApp();
|
|
294
|
+
const formQuery = reactive<CustomerQuery>({ keyword: "", status: undefined });
|
|
295
|
+
|
|
296
|
+
const {
|
|
297
|
+
content,
|
|
298
|
+
otherRef,
|
|
299
|
+
tableHeight,
|
|
300
|
+
paginationRef,
|
|
301
|
+
loading,
|
|
302
|
+
formRef,
|
|
303
|
+
multipleTableRef,
|
|
304
|
+
pagination,
|
|
305
|
+
onSearch,
|
|
306
|
+
tableData,
|
|
307
|
+
gridRef,
|
|
308
|
+
showCollapse,
|
|
309
|
+
collapsed,
|
|
310
|
+
collapsedToggle,
|
|
311
|
+
upBold,
|
|
312
|
+
downBold,
|
|
313
|
+
reset,
|
|
314
|
+
} = useTableSearch(
|
|
315
|
+
formQuery,
|
|
316
|
+
getCustomerList,
|
|
317
|
+
`${import.meta.env.VITE_API_BASE_URL}/console/customer/list`,
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
const tableList = computed(() => tableData.value.tableList as Customer[]);
|
|
321
|
+
|
|
322
|
+
const operateLimit = 3;
|
|
323
|
+
|
|
324
|
+
const operateButtons: OperateButton[] = [
|
|
325
|
+
{
|
|
326
|
+
label: $t("删除"),
|
|
327
|
+
type: "danger",
|
|
328
|
+
icon: "i-ep:delete",
|
|
329
|
+
onClick: (row) => handleDelete(row as Customer),
|
|
330
|
+
},
|
|
331
|
+
];
|
|
332
|
+
|
|
333
|
+
onMounted(() => onSearch());
|
|
334
|
+
|
|
335
|
+
function handleDelete(row: Customer) {
|
|
336
|
+
message($t("删除成功"), { type: "success" });
|
|
337
|
+
onSearch();
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function handleCurrentChange(cur: number) {
|
|
341
|
+
pagination.currentPage = cur;
|
|
342
|
+
onSearch();
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
function handleSizeChange(size: number) {
|
|
346
|
+
pagination.pageSize = size;
|
|
347
|
+
onSearch();
|
|
348
|
+
}
|
|
349
|
+
</script>
|
|
350
|
+
|
|
351
|
+
<template>
|
|
352
|
+
<div>
|
|
353
|
+
<el-card
|
|
354
|
+
ref="content"
|
|
355
|
+
class="vts-page-card"
|
|
356
|
+
shadow="never"
|
|
357
|
+
>
|
|
358
|
+
<!-- D2: 页面标题区 -->
|
|
359
|
+
<div class="vts-page-header">
|
|
360
|
+
<div class="vts-page-header__info">
|
|
361
|
+
<span class="vts-page-header__title">{{ $t("客户列表") }}</span>
|
|
362
|
+
<span class="vts-page-header__desc">{{ $t("管理客户的售价、类型与库存信息") }}</span>
|
|
363
|
+
</div>
|
|
364
|
+
<div class="vts-page-header__actions">
|
|
365
|
+
<el-button
|
|
366
|
+
type="primary"
|
|
367
|
+
v-auth="['admin']"
|
|
368
|
+
@click="handleAdd"
|
|
369
|
+
>
|
|
370
|
+
{{ $t("新增") }}
|
|
371
|
+
</el-button>
|
|
372
|
+
<el-button v-auth="['admin']">{{ $t("导入") }}</el-button>
|
|
373
|
+
</div>
|
|
374
|
+
</div>
|
|
375
|
+
|
|
376
|
+
<!-- D3: 筛选区容器 -->
|
|
377
|
+
<div class="vts-filter-area">
|
|
378
|
+
<el-form
|
|
379
|
+
ref="formRef"
|
|
380
|
+
:inline="true"
|
|
381
|
+
:model="formQuery"
|
|
382
|
+
>
|
|
383
|
+
<ReGrid
|
|
384
|
+
ref="gridRef"
|
|
385
|
+
:collapsed="collapsed"
|
|
386
|
+
:gap="[0, 20]"
|
|
387
|
+
:cols="{ xs: 1, sm: 2, md: 2, lg: 3, xl: 4 }"
|
|
388
|
+
style="max-height: 300px; overflow-y: auto;"
|
|
389
|
+
@should-show-collapse="(val) => (showCollapse = val)"
|
|
390
|
+
>
|
|
391
|
+
<ReGridItem index="0">
|
|
392
|
+
<el-form-item :label="$t('关键词')" prop="keyword" class="w-[100%] !mr-0">
|
|
393
|
+
<el-input v-model="formQuery.keyword" clearable :placeholder="$t('请输入')" />
|
|
394
|
+
</el-form-item>
|
|
395
|
+
</ReGridItem>
|
|
396
|
+
<ReGridItem index="1">
|
|
397
|
+
<el-form-item :label="$t('状态')" prop="status" class="w-[100%] !mr-0">
|
|
398
|
+
<el-select v-model="formQuery.status" clearable :placeholder="$t('请选择')">
|
|
399
|
+
<el-option :label="$t('启用')" :value="1" />
|
|
400
|
+
<el-option :label="$t('禁用')" :value="0" />
|
|
401
|
+
</el-select>
|
|
402
|
+
</el-form-item>
|
|
403
|
+
</ReGridItem>
|
|
404
|
+
<ReGridItem suffix>
|
|
405
|
+
<div class="flex flex-end">
|
|
406
|
+
<el-button
|
|
407
|
+
type="primary"
|
|
408
|
+
:loading="loading"
|
|
409
|
+
@click="pagination.currentPage = 1; pagination.pageSize = 10; onSearch()"
|
|
410
|
+
>
|
|
411
|
+
{{ $t("查询") }}
|
|
412
|
+
</el-button>
|
|
413
|
+
<el-button @click="reset">{{ $t("重置") }}</el-button>
|
|
414
|
+
<el-button
|
|
415
|
+
v-if="showCollapse"
|
|
416
|
+
type="primary"
|
|
417
|
+
link
|
|
418
|
+
class="!font-size-12"
|
|
419
|
+
@click="collapsedToggle"
|
|
420
|
+
>
|
|
421
|
+
{{ collapsed ? $t("展开") : $t("收起") }}
|
|
422
|
+
<el-icon class="el-icon--right">
|
|
423
|
+
<component :is="collapsed ? downBold : upBold" />
|
|
424
|
+
</el-icon>
|
|
425
|
+
</el-button>
|
|
426
|
+
</div>
|
|
427
|
+
</ReGridItem>
|
|
428
|
+
</ReGrid>
|
|
429
|
+
</el-form>
|
|
430
|
+
</div>
|
|
431
|
+
|
|
432
|
+
<div ref="otherRef">
|
|
433
|
+
<!-- 统计/页签等额外模块;无则删除整段 -->
|
|
434
|
+
</div>
|
|
435
|
+
|
|
436
|
+
<!-- D4+D5: 操作栏 + 表格区 -->
|
|
437
|
+
<div class="vts-table-area">
|
|
438
|
+
<ReTableBar :columns="[]" @refresh="onSearch">
|
|
439
|
+
<template #title>
|
|
440
|
+
<span class="truncate font-size-16 font-bold">{{ $t("展示列表") }}</span>
|
|
441
|
+
</template>
|
|
442
|
+
<template #buttons>
|
|
443
|
+
<el-button type="danger" v-auth="['admin']">{{ $t("批量删除") }}</el-button>
|
|
444
|
+
</template>
|
|
445
|
+
<template #default="{ size }">
|
|
446
|
+
<div class="vl-parent">
|
|
447
|
+
<el-table
|
|
448
|
+
ref="multipleTableRef"
|
|
449
|
+
v-loading.lock="loading"
|
|
450
|
+
:element-loading-text="$t('加载中')"
|
|
451
|
+
:element-loading-spinner="svgLoading"
|
|
452
|
+
element-loading-svg-view-box="0, 0, 20, 20"
|
|
453
|
+
:style="{ height: `${tableHeight}px` }"
|
|
454
|
+
:size="size"
|
|
455
|
+
:data="tableList"
|
|
456
|
+
row-key="id"
|
|
457
|
+
>
|
|
458
|
+
<el-table-column prop="code" :label="$t('编号')" min-width="120" />
|
|
459
|
+
<el-table-column prop="name" :label="$t('名称')" min-width="140" />
|
|
460
|
+
<el-table-column
|
|
461
|
+
:label="$t('操作')"
|
|
462
|
+
:width="resolveOperateColumnWidth({ list: operateButtons, limit: operateLimit, size })"
|
|
463
|
+
fixed="right"
|
|
464
|
+
>
|
|
465
|
+
<template #default="{ row, $index }">
|
|
466
|
+
<ReTableOperate
|
|
467
|
+
:list="operateButtons"
|
|
468
|
+
:row="row"
|
|
469
|
+
:index="$index"
|
|
470
|
+
:limit="operateLimit"
|
|
471
|
+
:size="size"
|
|
472
|
+
/>
|
|
473
|
+
</template>
|
|
474
|
+
</el-table-column>
|
|
475
|
+
</el-table>
|
|
476
|
+
<RePagination
|
|
477
|
+
ref="paginationRef"
|
|
478
|
+
:size="size"
|
|
479
|
+
:pagination="pagination"
|
|
480
|
+
@handle-current-change="handleCurrentChange"
|
|
481
|
+
@handle-size-change="handleSizeChange"
|
|
482
|
+
/>
|
|
483
|
+
</div>
|
|
484
|
+
</template>
|
|
485
|
+
</ReTableBar>
|
|
486
|
+
</div>
|
|
487
|
+
</el-card>
|
|
488
|
+
</div>
|
|
489
|
+
</template>
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
**设计模式与出厂模式的关键差异**:
|
|
493
|
+
|
|
494
|
+
| 差异点 | 出厂模式 | 设计模式 |
|
|
495
|
+
|--------|---------|---------|
|
|
496
|
+
| 页面标题 | 无 | `.vts-page-header` 含标题+描述+操作 |
|
|
497
|
+
| 筛选区 | `bg-bg_color p-5` | `.vts-filter-area`(容器感+分隔线) |
|
|
498
|
+
| 主操作按钮位置 | `ReTableBar #buttons` | `.vts-page-header__actions` |
|
|
499
|
+
| 表格区 | 无包裹 | `.vts-table-area`(圆角边框) |
|
|
500
|
+
| 表头底色 | EP 默认浅灰 | 由 `design-visual.scss` 全局提供品牌色浅底+强调线 |
|
|
501
|
+
| 行 hover | EP 默认灰色 | 由 `design-visual.scss` 全局提供品牌色极浅底 |
|
|
253
502
|
|
|
254
503
|
## 操作列按钮过多(ReTableOperate · 强制)
|
|
255
504
|
|
|
@@ -312,6 +561,38 @@ resolveOperateColumnWidth({ list: operateButtons, limit: operateLimit, size, slo
|
|
|
312
561
|
|
|
313
562
|
操作列建议 `fixed="right"`。模版已在 `element-plus.scss` 为含 `.re-table-operate` 的单元格关闭省略号,避免列宽不足时出现 `..`。
|
|
314
563
|
|
|
564
|
+
### 需求 → 落盘(强制 · 自动生成清单)
|
|
565
|
+
|
|
566
|
+
用户只要提到「操作列有 A、B、C…」或「行操作:查看 / 编辑 / …」,**禁止追问是否用 ReTableOperate**,直接按本清单整段落盘(与模版 `views/table/base` 一致):
|
|
567
|
+
|
|
568
|
+
1. **解析按钮序列**:按用户口述顺序写入 `operateButtons: OperateButton[]`(顺序固定,勿按行改数组)。
|
|
569
|
+
2. **折叠阈值**:声明 `const operateLimit = 3`(除非用户明确要求其它平铺数);可见数 > `limit` 时组件自动「更多」,业务页勿自造下拉。
|
|
570
|
+
3. **显隐 / 权限**:状态相关写 `show: row => …`;权限写 `auth`;危险操作用 `type: 'danger'`;图标用 `i-ep:*`。
|
|
571
|
+
4. **列宽动态推算**(禁止写死 `width="200"`):
|
|
572
|
+
```ts
|
|
573
|
+
resolveOperateColumnWidth({ list: operateButtons, limit: operateLimit, size })
|
|
574
|
+
```
|
|
575
|
+
5. **密度联动**:在 `ReTableBar` `#default="{ size }"` 内同时传给 `el-table`、`ReTableOperate`、`resolveOperateColumnWidth`。
|
|
576
|
+
6. **模板落点**:
|
|
577
|
+
```vue
|
|
578
|
+
<ReTableOperate
|
|
579
|
+
:list="operateButtons"
|
|
580
|
+
:row="row"
|
|
581
|
+
:index="$index"
|
|
582
|
+
:limit="operateLimit"
|
|
583
|
+
:size="size"
|
|
584
|
+
/>
|
|
585
|
+
```
|
|
586
|
+
7. **回调**:每个 `onClick` 落真实函数(跳详情 / 确认框 / API),禁止只写 `console.log` 占位(演示页除外)。
|
|
587
|
+
|
|
588
|
+
**口述示例 → 生成预期**
|
|
589
|
+
|
|
590
|
+
| 用户口述 | 生成要点 |
|
|
591
|
+
|----------|----------|
|
|
592
|
+
| 操作列有查看、编辑、删除 | 3 项 ≤ limit → 全部平铺,无「更多」;列宽按最长「查看/编辑/删除」推算 |
|
|
593
|
+
| 操作列有填报、查看、催办、审核、快速通过、发起修订 | 固定顺序;`show` 按状态;>3 自动「更多」;列宽按最长「发起修订」推算 |
|
|
594
|
+
| 已完成可发起修订、导出、审核记录 | 至少 4 项可见时平铺「查看\|发起修订\|更多」 |
|
|
595
|
+
|
|
315
596
|
**反例**:
|
|
316
597
|
- 写死 `width="260"` / 不传 `:size="size"` → 与表格密度不一致、切换紧凑/宽松后按钮错位
|
|
317
598
|
- 列宽 `resolveOperateColumnWidth` 未传 `size` 或与组件 `:size` 不一致 → 推算宽度与实渲染不符
|
|
@@ -319,6 +600,7 @@ resolveOperateColumnWidth({ list: operateButtons, limit: operateLimit, size, slo
|
|
|
319
600
|
- 平铺项按内容宽度自然撑开、无等宽槽 → 「发起修订」等比二字项把「更多」挤偏
|
|
320
601
|
- 给「更多」写 `ml-2` 或用 `type="primary" link` → 与 text 按钮档位不一致
|
|
321
602
|
- 按行拼接不同顺序的 `list` → 同名操作无法对应
|
|
603
|
+
- 用户已列多项操作仍手写 `el-button` 或省略 `resolveOperateColumnWidth` → 违反 L9
|
|
322
604
|
|
|
323
605
|
## 列表 → 详情/编辑
|
|
324
606
|
|
|
@@ -432,6 +714,6 @@ async function onSubmit() {
|
|
|
432
714
|
| 裸 `router.push` 开详情 | `toDetail` + meta(见 detail-page) |
|
|
433
715
|
| 详情根节点 `vts-page-fill` / `h-full` / `overflow-hidden` | `min-height: 100%` + `bg-bg_color`;滚动交给壳层 `el-scrollbar`(见 detail-page ④) |
|
|
434
716
|
| `ReTableOperate :buttons` | `:list` |
|
|
435
|
-
| 操作列手写多颗 `el-button` / 自造更多菜单 | `ReTableOperate`;过多靠 `limit`(默认 3)进「更多」 |
|
|
436
|
-
| 「更多」单独 `ml-2` /
|
|
717
|
+
| 操作列手写多颗 `el-button` / 自造更多菜单 / 写死列宽 | `ReTableOperate` + `resolveOperateColumnWidth` + `:size="size"`;过多靠 `limit`(默认 3)进「更多」 |
|
|
718
|
+
| 「更多」单独 `ml-2` / `link` / 隐藏项占位导致空档 | 从左等宽槽 + text 主题色;见上文「对齐 / 需求→落盘」 |
|
|
437
719
|
| `@show-collapse` | `@should-show-collapse` |
|
|
@@ -147,6 +147,40 @@ tags: [handoff, design-tokens, upstream, artifacts, json]
|
|
|
147
147
|
|
|
148
148
|
细则见 `design-system` 7.5.8。缺档 → 回退至 default(base),回执注明。
|
|
149
149
|
|
|
150
|
+
### `visual` → 视觉表现令牌(`design-tokens.scss` 视觉段 + `design-visual.scss`)
|
|
151
|
+
|
|
152
|
+
有 `visual` 字段时写入 `design-tokens.scss` 的「视觉表现令牌」段;`design-visual.scss` 规则结构不动,只通过令牌值变化生效。
|
|
153
|
+
|
|
154
|
+
| JSON 字段 | CSS 变量 | 用途 |
|
|
155
|
+
|-----------|----------|------|
|
|
156
|
+
| `visual.shadowCardRest` | `--shadow-card-rest` | 卡片静态阴影 |
|
|
157
|
+
| `visual.shadowCardHover` | `--shadow-card-hover` | 卡片悬停阴影 |
|
|
158
|
+
| `visual.shadowButtonHover` | `--shadow-button-hover` | 按钮悬停阴影 |
|
|
159
|
+
| `visual.shadowInputFocus` | `--shadow-input-focus` | 输入框聚焦光环 |
|
|
160
|
+
| `visual.shadowDialog` | `--shadow-dialog` | 弹窗阴影 |
|
|
161
|
+
| `visual.transitionBase` | `--transition-base` | 基础过渡曲线 |
|
|
162
|
+
| `visual.buttonHoverTransform` | `--transform-button-hover` | 按钮 hover 变换 |
|
|
163
|
+
| `visual.tableHeaderBorderBottom` | `--table-header-border-bottom` | 表头强调底线 |
|
|
164
|
+
| `visual.menuActiveBorderRight` | `--menu-active-border-right` | 菜单激活强调条 |
|
|
165
|
+
|
|
166
|
+
缺项 → 保留出厂默认值,回执标明。
|
|
167
|
+
|
|
168
|
+
### `layout` → 页面构图令牌(`design-tokens.scss` 构图段 + `design-layout.scss`)
|
|
169
|
+
|
|
170
|
+
有 `layout` 字段时写入 `design-tokens.scss` 的「页面构图令牌」段;`design-layout.scss` 规则结构不动。
|
|
171
|
+
|
|
172
|
+
| JSON 字段 | CSS 变量 | 用途 |
|
|
173
|
+
|-----------|----------|------|
|
|
174
|
+
| `layout.pageHeaderMargin` | `--page-header-margin` | 标题区下边距 |
|
|
175
|
+
| `layout.filterAreaRadius` | `--filter-area-radius` | 筛选区圆角 |
|
|
176
|
+
| `layout.filterAreaPaddingY` | `--filter-area-padding-y` | 筛选区上下内边距 |
|
|
177
|
+
| `layout.filterAreaPaddingX` | `--filter-area-padding-x` | 筛选区左右内边距 |
|
|
178
|
+
| `layout.actionBarGap` | `--action-bar-gap` | 操作栏按钮间距 |
|
|
179
|
+
| `layout.tableAreaBorderRadius` | `--table-area-border-radius` | 表格区圆角 |
|
|
180
|
+
| `layout.emptyStatePadding` | `--empty-state-padding` | 空状态间距 |
|
|
181
|
+
|
|
182
|
+
缺项 → 保留出厂默认值,回执标明。
|
|
183
|
+
|
|
150
184
|
### 卡片页签关闭色(设计约束)
|
|
151
185
|
|
|
152
186
|
- 关闭 hover:圆形底 `--layout-bg`(=`tokens.layoutBg`)+ 图标 `--error-6` / `tokens.error`(`#F5222D`)
|
|
@@ -158,11 +192,11 @@ tags: [handoff, design-tokens, upstream, artifacts, json]
|
|
|
158
192
|
|
|
159
193
|
| # | 落点 | 写入 |
|
|
160
194
|
|---|------|------|
|
|
161
|
-
| A | `src/styles/design-tokens.scss` | 令牌 CSS;深色侧栏时追加 `--sidebar
|
|
195
|
+
| A | `src/styles/design-tokens.scss` | 令牌 CSS;深色侧栏时追加 `--sidebar-*`;`visual` / `layout` 段 |
|
|
162
196
|
| B | `theme.scss` 当前 `html[data-theme]` | `--vts-theme-*` → `--sidebar-*` |
|
|
163
197
|
| C | `public/platform-config.json` | `EpThemeColor` / `Theme` / `DarkMode` / **`ShowModel`**;`Version` 自增 |
|
|
164
|
-
| D | `index.scss` | `design-tokens`
|
|
165
|
-
| E | `dark.scss` / 语义色 | 跟 `--primary-*` / `--error
|
|
198
|
+
| D | `index.scss` | `design-tokens` → `design-visual` → `design-layout` 最先;按需 `--vts-margin` / `--vts-tag-card-*` |
|
|
199
|
+
| E | `dark.scss` / 语义色 | 跟 `--primary-*` / `--error-*`;视觉层+构图层暗色覆盖 |
|
|
166
200
|
| F | 冲突清单 | `design-system` 第四节 |
|
|
167
201
|
| G | 规范识别回执 | 动手改文件前输出 |
|
|
168
202
|
| H | (可选)`design/design-handoff.json` | 若用户要求落盘,写入校验后的 JSON 副本 |
|
|
@@ -355,20 +355,40 @@ tags: [design-system, design-tokens, antd, semi, arco, vuetify, findesign, eleme
|
|
|
355
355
|
|
|
356
356
|
> 各规范差异项:`antd` 表头 `#fafafa` 不加边框分隔;`semi` 少阴影轻描边;`vuetify` 控件高度 Material 化(input 40px、button 36px);按第五节表微调样板中的数值来源即可,**结构不变**。差异值同样只改令牌数据,不另写选择器。
|
|
357
357
|
|
|
358
|
-
### Step
|
|
358
|
+
### Step 3.5 设计模式页面结构(设计 Skill 产出存在时触发)
|
|
359
359
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
360
|
+
> **职责边界**:项目 Skill 只做令牌数值桥接(Step 2)和 EP 几何重写(Step 3)。页面布局结构和视觉表现**不在全局 CSS 文件中注入**,而是在**页面代码中直接实现**,遵循设计 Skill 的布局规范。
|
|
361
|
+
|
|
362
|
+
触发条件:存在 `design-handoff/v1` JSON、用户指定设计规范、或命中 `design-system` 模块且设计 Skill 产出可用。
|
|
363
|
+
|
|
364
|
+
模版已出厂自带 `design-visual.scss`(视觉基线)和 `design-layout.scss`(构图基线),提供默认的 CSS 钩子类。设计模式下:
|
|
365
|
+
|
|
366
|
+
1. **令牌值桥接**(Step 2 已完成):颜色 / 阴影 / 圆角 / 间距 / 字号数值写入 `design-tokens.scss`
|
|
367
|
+
2. **页面结构按设计 Skill 布局规范生成**:
|
|
368
|
+
- 列表页 → 读设计 Skill 的 `list-page.md` 区域拆分,在页面代码中使用 `.vts-page-header` / `.vts-filter-area` / `.vts-action-bar` / `.vts-table-area` 结构类
|
|
369
|
+
- 详情页 → 读设计 Skill 的详情页规范,使用 `.vts-detail-container`
|
|
370
|
+
- 框架壳层 → 读设计 Skill 的 `unified-framework.md`,顶栏 / 侧栏 / 页签 / 内容区的几何和视觉按规范实现
|
|
371
|
+
3. **组件视觉表现**:`design-visual.scss` 提供全局基线(hover/阴影/过渡),页面内无需重复写
|
|
372
|
+
4. **设计 Skill 布局决策的直接实现**:如设计 Skill 规定顶部导航语言切换为内联文字(中/EN)而非下拉框,则在 `lay-navbar` 组件中直接实现该交互,不通过 CSS 覆盖
|
|
373
|
+
|
|
374
|
+
**关键原则**:设计 Skill 的布局和视觉决策在**页面代码**中实现,不通过全局 CSS 文件注入。项目 Skill 的职责是提供令牌数值和 CSS 钩子类,让页面代码有标准化的引用点。
|
|
375
|
+
|
|
376
|
+
### Step 4 接线 `src/styles/index.scss`
|
|
370
377
|
|
|
371
|
-
|
|
378
|
+
```scss
|
|
379
|
+
@use 'design-tokens'; // 唯一新增:纯数据令牌,必须最先
|
|
380
|
+
@use 'design-visual'; // 视觉表现层:shadow / hover / transition / 交互态
|
|
381
|
+
@use 'design-layout'; // 页面构图层:区域容器 / 间距节奏
|
|
382
|
+
@use 'theme';
|
|
383
|
+
@use 'transition';
|
|
384
|
+
@use 'button';
|
|
385
|
+
@use 'element-plus'; // 模版默认覆盖 + 规范几何重写(已并入)
|
|
386
|
+
@use 'sidebar';
|
|
387
|
+
@use 'dark';
|
|
388
|
+
@use 'vant';
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
唯一顺序要求:`design-tokens` 放最前(供后续文件引用);`design-visual` 和 `design-layout` 紧随其后,在 `element-plus` 之前,确保视觉层在 EP 几何层之前加载。几何重写已并入 `element-plus.scss`,**不再存在**"重写层必须排在覆盖层之后"的顺序陷阱;模版其余 `@use` 顺序保持不动。
|
|
372
392
|
|
|
373
393
|
**字体接管**:
|
|
374
394
|
- 新模版:`index.scss` 已是 `font-family: var(--font-family, ...) !important`,令牌层定义 `--font-family` 即自动生效,无需改动。
|
|
@@ -436,7 +456,11 @@ height: \d+px、padding: \d+px、font-size: \d+px、行内 style="...颜色 hex"
|
|
|
436
456
|
- [ ] 弹窗:`--ds-dialog-bg` 为 **主题色轻渐变**(`primary-bg → component-bg`),非写死蓝渐变;`ElMessageBox` 内容区用 `--message-box-content-padding`(比 `el-dialog` body 更紧凑)
|
|
437
457
|
- [ ] 侧栏:深色主题下 DevTools 检查 `.sidebar-container` computed `background` 为 **`#001529`**(`var(--sidebar-bg)`,非旧版主色纵向渐变);激活项块色 = `--primary-color` / `brandPrimary`;Logo 区 = `--sidebar-logo-bg`
|
|
438
458
|
- [ ] 第四节冲突清单全部处理完毕(逐条回填)
|
|
439
|
-
- [ ] Step 7 存量扫描已执行且结果已输出
|
|
459
|
+
- [ ] Step 7 存量扫描已执行且结果已输出
|
|
460
|
+
- [ ] 设计模式页面结构(设计 Skill 产出存在时):列表页含 `.vts-page-header`(标题+描述+操作)、`.vts-filter-area`(筛选区容器)、`.vts-table-area`(表格区)
|
|
461
|
+
- [ ] 视觉基线:`design-visual.scss` 和 `design-layout.scss` 在 `index.scss` 中已加载且顺序在 `element-plus` 之前
|
|
462
|
+
- [ ] 暗色覆盖:视觉层和构图层在 `dark.scss` 中有对应暗色覆盖
|
|
463
|
+
- [ ] 令牌无硬编码:页面代码中引用的 CSS 钩子类值全部来自令牌变量
|
|
440
464
|
|
|
441
465
|
---
|
|
442
466
|
|
|
@@ -212,7 +212,7 @@ AI 生成业务代码时:以 Skill 模块标准样板为准;先查 `package.
|
|
|
212
212
|
| **ReSmsCode** | 短信倒计时 | `ReSmsCode/` | `verify-captcha` |
|
|
213
213
|
| **ReSvgIcon** | SVG / Iconify | `ReSvgIcon/` | `icons` |
|
|
214
214
|
| **ReTableBar** | 表格工具栏 | `ReTableBar/` | `crud-pages` |
|
|
215
|
-
| **ReTableOperate** | 行操作(`limit` 默认 3
|
|
215
|
+
| **ReTableOperate** | 行操作(`limit` 默认 3;超出进「更多」;列宽用 `resolveOperateColumnWidth`;`:size` 跟表格密度) | `ReTableOperate/` | `crud-pages` |
|
|
216
216
|
| **ReText** | 文本省略 | `ReText/` | `layout-theme` |
|
|
217
217
|
| **ReTimeLine** | 时间轴 | `ReTimeLine/` | `detail-page` / 业务 |
|
|
218
218
|
| **ReTreeLine** | 树连线 | `ReTreeLine/` | `tree-table` |
|