@qilitt-mickey/vue3-temp-skill 1.1.11 → 1.1.13
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/README.md +22 -63
- package/SKILL.md +114 -273
- package/package.json +1 -1
- package/references/api-check.md +33 -313
- package/references/code-quality.md +63 -277
- package/references/core-kernel.md +76 -396
- package/references/crud-pages.md +252 -93
- package/references/data-writeback.md +2 -2
- package/references/design-handoff.md +92 -0
- package/references/design-system.md +70 -60
- package/references/detail-page.md +55 -72
- package/references/form-advanced.md +1 -2
- package/references/layout-theme.md +103 -180
- package/references/mobile-h5.md +11 -11
- package/references/project-inventory.md +9 -10
- package/references/table-vxe.md +7 -13
- package/references/tree-table.md +2 -2
- package/references/websocket-realtime.md +3 -3
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
skill: layout-theme
|
|
3
|
-
description:
|
|
3
|
+
description: 布局、主题色、暗黑模式、侧栏配色、Design Tokens、UnoCSS、响应式。修改布局/主题/颜色时加载。上游设计产出落地见 design-handoff / design-system。
|
|
4
4
|
scope: project
|
|
5
|
-
tags: [vue3, layout, theme, dark-mode, css-variables, design-tokens, element-plus, vant, dual-ui, unocss, chroma-js
|
|
5
|
+
tags: [vue3, layout, theme, dark-mode, css-variables, design-tokens, element-plus, vant, dual-ui, unocss, chroma-js]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# 设计系统、布局与主题适配
|
|
@@ -33,6 +33,8 @@ tags: [vue3, layout, theme, dark-mode, css-variables, design-tokens, element-plu
|
|
|
33
33
|
│ --vts-theme-sidebar-logo Logo 区域背景 │
|
|
34
34
|
│ --vts-theme-menu-title-hover 菜单标题悬停色 │
|
|
35
35
|
│ --vts-theme-menu-active-before 激活指示条颜色 │
|
|
36
|
+
--vts-theme-menu-active-bg 激活菜单块背景色 │
|
|
37
|
+
--vts-sidebar-border-color 侧栏右边框色 │
|
|
36
38
|
├─────────────────────────────────────────────────────────┤
|
|
37
39
|
│ 第三层:Element Plus 变量(由 JS 动态设置) │
|
|
38
40
|
│ --el-color-primary 主题主色 │
|
|
@@ -58,18 +60,28 @@ tags: [vue3, layout, theme, dark-mode, css-variables, design-tokens, element-plu
|
|
|
58
60
|
|
|
59
61
|
### 2.1 侧边栏 8 套配色预设
|
|
60
62
|
|
|
61
|
-
通过 `html[data-theme='<name>']` 切换,定义在 `src/styles/theme.scss
|
|
63
|
+
通过 `html[data-theme='<name>']` 切换,定义在 `src/styles/theme.scss`(模版出厂为单色侧栏变量;上游设计产出落地后可桥接 `--sidebar-*` 渐变,见 `design-handoff.md`)。
|
|
62
64
|
|
|
63
|
-
| 主题名 | 中文名 |
|
|
64
|
-
|
|
65
|
-
| `light` | 亮白色 |
|
|
66
|
-
| `default` | 道奇蓝 | `#001529
|
|
67
|
-
| `saucePurple` | 深紫罗兰 |
|
|
68
|
-
| `pink` | 深粉色 |
|
|
69
|
-
| `dusk` | 猩红色 |
|
|
70
|
-
| `volcano` | 橙红色 |
|
|
71
|
-
| `mingQing` | 绿宝石 |
|
|
72
|
-
| `auroraGreen` | 酸橙绿 |
|
|
65
|
+
| 主题名 | 中文名 | 说明 |
|
|
66
|
+
|--------|--------|------|
|
|
67
|
+
| `light` | 亮白色 | 浅色侧栏 |
|
|
68
|
+
| `default` | 道奇蓝 | 深色侧栏(出厂 `#001529`) |
|
|
69
|
+
| `saucePurple` | 深紫罗兰 | 深色侧栏 |
|
|
70
|
+
| `pink` | 深粉色 | 深色侧栏 |
|
|
71
|
+
| `dusk` | 猩红色 | 深色侧栏 |
|
|
72
|
+
| `volcano` | 橙红色 | 深色侧栏 |
|
|
73
|
+
| `mingQing` | 绿宝石 | 深色侧栏 |
|
|
74
|
+
| `auroraGreen` | 酸橙绿 | 深色侧栏 |
|
|
75
|
+
|
|
76
|
+
> **上游设计技能衔接**:色值与 `data-theme` 对应关系读 upstream 交接块,不在本 Skill 写死。落地时同步 `design-tokens.scss`、`theme.scss` 桥接、`platform-config.json` 的 `Theme` / `EpThemeColor`。
|
|
77
|
+
|
|
78
|
+
### 2.1.1 侧栏扩展变量(设计技能落地后写入)
|
|
79
|
+
|
|
80
|
+
| 令牌 | 用途 |
|
|
81
|
+
|------|------|
|
|
82
|
+
| `--vts-theme-menu-active-bg` | 激活菜单块背景 |
|
|
83
|
+
| `--vts-sidebar-border-color` | 侧栏右边框 |
|
|
84
|
+
| `--sidebar-*` | 由 upstream 主色板派生,见 handoff 文档 |
|
|
73
85
|
|
|
74
86
|
### 2.2 Element Plus 主色动态生成(chroma-js)
|
|
75
87
|
|
|
@@ -92,7 +104,7 @@ tags: [vue3, layout, theme, dark-mode, css-variables, design-tokens, element-plu
|
|
|
92
104
|
|
|
93
105
|
如果需要新增主题色,需要同时修改以下文件:
|
|
94
106
|
|
|
95
|
-
1. `src/styles/theme.scss` — 添加 `html[data-theme='newTheme']` 的
|
|
107
|
+
1. `src/styles/theme.scss` — 添加 `html[data-theme='newTheme']` 的 `--vts-theme-*` 变量(深色侧栏可桥接 upstream `--sidebar-*`)
|
|
96
108
|
2. `src/hooks/useTheme.ts` — 在 `themeColors` 数组中添加 `{ color, themeColor, tip }` 条目
|
|
97
109
|
3. 如果新主题色需要特殊的 EP 主色,还需在 `setLayoutThemeColor()` 中处理分支
|
|
98
110
|
|
|
@@ -128,8 +140,8 @@ html.dark {
|
|
|
128
140
|
--vts-switch-off-color: #ffffff3f; // 亮色: #a6a6a6
|
|
129
141
|
--vts-dialog-bg: var(--ds-dialog-bg, rgb(36 37 37)); // 亮色: var(--ds-dialog-bg, linear-gradient(...))
|
|
130
142
|
|
|
131
|
-
// ===
|
|
132
|
-
.navbar, .tags-view,
|
|
143
|
+
// === 布局区域背景(侧栏保留 theme 令牌,见 dark.scss 侧栏段) ===
|
|
144
|
+
.navbar, .tags-view,
|
|
133
145
|
.horizontal-header, ... {
|
|
134
146
|
background-color: var(--el-bg-color) !important;
|
|
135
147
|
}
|
|
@@ -300,6 +312,55 @@ src/layout/
|
|
|
300
312
|
3. 侧边栏菜单数据来源于路由配置中的 `meta` 信息。
|
|
301
313
|
4. 标签页(TagsView)支持关闭、刷新、关闭其他等操作。
|
|
302
314
|
|
|
315
|
+
### 顶栏高度(headerHeight)
|
|
316
|
+
|
|
317
|
+
| 环节 | 约定 |
|
|
318
|
+
|------|------|
|
|
319
|
+
| 测量 | `lay-header` 用 `ResizeObserver` 测量 `.fixed-header`,写入 `$storage.configure.headerHeight` |
|
|
320
|
+
| 重测 | 切换 `layout`、`hideTabs`、`hiddenSideBar` 后 `nextTick` 再测一次(避免布局切换后仍用 localStorage 旧值) |
|
|
321
|
+
| 消费 | 业务页通过 `useApp().headerHeight` 读 `$storage.configure.headerHeight`;`lay-content` 的 `padding-top` 仍用 `--vts-layout-header-offset*`(勿与 storage 双向绑定,避免重测循环) |
|
|
322
|
+
|
|
323
|
+
### 内容区高度与滚动
|
|
324
|
+
|
|
325
|
+
| 场景 | 卡片 / 高度 | 滚动落点 |
|
|
326
|
+
|------|-------------|----------|
|
|
327
|
+
| 查询列表 | `el-card.vts-page-card` + 固定 `calc(100vh - 2 * var(--vts-margin) - ${headerHeight}px)`;表格绑 `useTableSearch().tableHeight` | 仅 `el-table` 体内;分页在表格下方 |
|
|
328
|
+
| 树 + 表分栏 | 同上定高卡;左右并排,高度走 Hook 几何实测 | 同查询列表 |
|
|
329
|
+
| 长表单 / 详情 / 说明 | 同公式可用 `minHeight`;不绑 `tableHeight` | `.app-main` 内 `el-scrollbar` |
|
|
330
|
+
| Card 内边距 | `--vts-card-padding` → `--card-padding` | 换规范只改令牌;列表高度由 Hook 实测跟随 |
|
|
331
|
+
|
|
332
|
+
`.vts-page-card`:`overflow: hidden`,`.el-card__body` 高度 100%。样式在 `element-plus.scss`。
|
|
333
|
+
|
|
334
|
+
### 混合布局路由结构
|
|
335
|
+
|
|
336
|
+
混合模式(mix)左侧栏只展示**一级**菜单,页面组件须挂在 **`children`** 下:
|
|
337
|
+
|
|
338
|
+
```typescript
|
|
339
|
+
// ✅ 正确:父级 redirect + children(参考 attachment.ts / websocket.ts)
|
|
340
|
+
export default {
|
|
341
|
+
path: '/demo',
|
|
342
|
+
redirect: '/demo/list',
|
|
343
|
+
meta: { title: '示例模块', icon: '...', rank: ROUTER_RANK_NAME.DEMO },
|
|
344
|
+
children: [
|
|
345
|
+
{
|
|
346
|
+
path: '/demo/list',
|
|
347
|
+
name: 'DemoList',
|
|
348
|
+
component: () => import('@/views/demo/list.vue'),
|
|
349
|
+
meta: { title: '列表示例', showLink: true },
|
|
350
|
+
},
|
|
351
|
+
],
|
|
352
|
+
} satisfies RouteConfigsTable
|
|
353
|
+
|
|
354
|
+
// ❌ 错误:单层路由直接挂 component(mix 模式下左侧子菜单为空)
|
|
355
|
+
export default {
|
|
356
|
+
path: '/demo',
|
|
357
|
+
component: () => import('@/views/demo/list.vue'),
|
|
358
|
+
meta: { title: '示例', showLink: true },
|
|
359
|
+
} satisfies RouteConfigsTable
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
**禁止**在 horizontal 模式下修改 `.el-menu--horizontal` 的 flex 溢出规则(会导致所有菜单项被收进「更多」)。
|
|
363
|
+
|
|
303
364
|
---
|
|
304
365
|
|
|
305
366
|
## 六、UnoCSS 桥接配置
|
|
@@ -378,177 +439,39 @@ src/styles/
|
|
|
378
439
|
|
|
379
440
|
---
|
|
380
441
|
|
|
381
|
-
##
|
|
382
|
-
|
|
383
|
-
### 背景
|
|
384
|
-
|
|
385
|
-
ui-ux-pro-max 是一个设计系统 Skill,通过 CSV 驱动的风格匹配引擎生成 UI 风格方案。生成的输出通常包含颜色方案、字体搭配、间距规则、组件样式建议等。
|
|
386
|
-
|
|
387
|
-
### 衔接规则
|
|
388
|
-
|
|
389
|
-
当用户使用 ui-ux-pro-max 生成设计方案后,需要将设计输出映射到本项目的代码体系中:
|
|
390
|
-
|
|
391
|
-
**1. 颜色映射**
|
|
392
|
-
|
|
393
|
-
ui-ux-pro-max 输出的颜色方案需要映射到项目的 CSS 变量体系:
|
|
394
|
-
|
|
395
|
-
```
|
|
396
|
-
设计输出中的主色 → --el-color-primary(由 chroma-js 自动生成色阶)
|
|
397
|
-
设计输出中的背景色 → --el-bg-color 或 --vts-dialog-bg
|
|
398
|
-
设计输出中的边框色 → --vts-border-color
|
|
399
|
-
设计输出中的文字色 → --el-text-color-primary / --el-text-color-regular
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
**禁止**直接将设计稿的硬编码颜色写入组件样式,必须转换为对应的 CSS 变量。
|
|
442
|
+
## 八、上游设计产出衔接
|
|
403
443
|
|
|
404
|
-
|
|
444
|
+
颜色 / 间距 / 组件几何映射与落地顺序 → **`design-handoff`** + **`design-system`**(只认产出物,不点名上游技能)。
|
|
405
445
|
|
|
406
|
-
|
|
407
|
-
- 检查每个硬编码颜色是否在 `dark.scss` 中有对应覆盖
|
|
408
|
-
- 背景色不能直接使用白色/浅色硬编码,必须使用 CSS 变量
|
|
409
|
-
- 图表配色需要在 ECharts 的 `setOption` 中根据 `dataTheme` 值切换配色方案
|
|
446
|
+
落地后自检:
|
|
410
447
|
|
|
411
|
-
|
|
448
|
+
- [ ] 颜色均经 CSS 变量 / 令牌
|
|
449
|
+
- [ ] `html.dark` 与至少 `light`/`default` 侧栏主题正常
|
|
450
|
+
- [ ] 间距遵循 UnoCSS 4px 基数;字号用项目 token
|
|
412
451
|
|
|
413
|
-
|
|
414
|
-
- 间距使用 UnoCSS 的 `p-*` / `m-*` 类(baseFontSize: 4,所以 p-4 = 4px)
|
|
415
|
-
- 字号使用 `text-xs`~`text-9xl`(已定义为 px 值)
|
|
416
|
-
- 不要引入设计稿中的 rem/em 值,统一使用 px 或 UnoCSS 类
|
|
452
|
+
## 九、PC / 移动双端
|
|
417
453
|
|
|
418
|
-
|
|
454
|
+
组件对照与 Vant 写法 → **`mobile-h5`**。本处只记策略:
|
|
419
455
|
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
456
|
+
| 策略 | 约定 |
|
|
457
|
+
|------|------|
|
|
458
|
+
| 判断 | `useApp().isMobile`(< 768px) |
|
|
459
|
+
| 列表 | PC:`el-table`;移动:卡片 + `van-list` 触底 |
|
|
460
|
+
| 弹窗/选择器 | 移动用 `van-popup` 包裹 |
|
|
461
|
+
| 导航 | 移动底部 TabBar,不用侧栏 |
|
|
424
462
|
|
|
425
|
-
|
|
463
|
+
## 十、数据大屏
|
|
426
464
|
|
|
427
|
-
|
|
428
|
-
- [ ] 所有颜色是否通过 CSS 变量引用?
|
|
429
|
-
- [ ] 暗黑模式下是否显示正常?(切换 `html.dark` 验证)
|
|
430
|
-
- [ ] 侧边栏 8 套配色下是否协调?(至少检查 `light` 和 `default`)
|
|
431
|
-
- [ ] 字号是否使用了项目定义的 token?
|
|
432
|
-
- [ ] 间距是否遵循 4px 基数?
|
|
465
|
+
完整约定 → **`data-screen`**。摘要:1920×1080 + `scale`;独立布局无菜单页头;图表用 ECharts。
|
|
433
466
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
## 九、PC 端与移动端双端适配
|
|
437
|
-
|
|
438
|
-
### 组件映射关系
|
|
439
|
-
|
|
440
|
-
项目同时集成 Element Plus(PC)和 Vant(移动端),同一业务逻辑使用不同 UI 组件:
|
|
441
|
-
|
|
442
|
-
| 功能 | PC 端 (Element Plus) | 移动端 (Vant) |
|
|
443
|
-
|------|---------------------|---------------|
|
|
444
|
-
| 弹窗 | `el-dialog` | `van-popup` + `van-dialog` |
|
|
445
|
-
| 表格 | `ReGrid` / `el-table` | `van-list` + 卡片布局 |
|
|
446
|
-
| 表单 | `el-form` | `van-form` + `van-field` |
|
|
447
|
-
| 下拉选择 | `el-select` | `van-picker` + `van-popup` |
|
|
448
|
-
| 级联选择 | `el-cascader` | `van-cascader` |
|
|
449
|
-
| 日期选择 | `el-date-picker` | `van-date-picker` + `van-popup` |
|
|
450
|
-
| 上传 | `el-upload` | `van-uploader` |
|
|
451
|
-
| 分页 | `RePagination` | `van-pagination` 或触底加载 |
|
|
452
|
-
| 搜索 | `el-input` + 搜索按钮 | `van-search` |
|
|
453
|
-
| 消息提示 | `ElMessage` / `ElMessageBox` | `van-toast` / `van-dialog` |
|
|
454
|
-
| 导航 | 侧边栏菜单 | 底部 TabBar |
|
|
455
|
-
| 下拉刷新 | 无 | `van-pull-refresh` |
|
|
456
|
-
|
|
457
|
-
### 双端适配策略
|
|
458
|
-
|
|
459
|
-
```vue
|
|
460
|
-
<!-- PC 端表格 -->
|
|
461
|
-
<template v-if="!isMobile">
|
|
462
|
-
<ReGrid :data="list" :pagination="pagination">
|
|
463
|
-
<el-table-column prop="name" label="名称" />
|
|
464
|
-
</ReGrid>
|
|
465
|
-
</template>
|
|
466
|
-
|
|
467
|
-
<!-- 移动端卡片列表 -->
|
|
468
|
-
<template v-else>
|
|
469
|
-
<van-list v-model:loading="loading" :finished="finished" @load="onLoad">
|
|
470
|
-
<div v-for="item in list" :key="item.id" class="card-base mb-3">
|
|
471
|
-
<!-- 卡片内容 -->
|
|
472
|
-
</div>
|
|
473
|
-
</van-list>
|
|
474
|
-
</template>
|
|
475
|
-
```
|
|
476
|
-
|
|
477
|
-
### 响应式判断
|
|
478
|
-
|
|
479
|
-
```typescript
|
|
480
|
-
import { useApp } from "@/hooks/useApp";
|
|
481
|
-
const { isMobile } = useApp();
|
|
482
|
-
// isMobile 基于断点判断:< 768px 为移动端
|
|
483
|
-
```
|
|
484
|
-
|
|
485
|
-
### 双端适配约定
|
|
486
|
-
|
|
487
|
-
1. 新页面必须同时考虑 PC 和移动端展示,使用 `isMobile` 条件渲染。
|
|
488
|
-
2. 移动端表格数据改用卡片列表 + 触底加载,不要直接复用 PC 端表格。
|
|
489
|
-
3. 移动端弹窗使用 `van-popup` 包裹选择器组件。
|
|
490
|
-
4. 移动端导航使用底部 TabBar,不使用侧边栏。
|
|
491
|
-
5. 搜索框在移动端使用 `van-search`,支持展开/收起。
|
|
492
|
-
|
|
493
|
-
---
|
|
494
|
-
|
|
495
|
-
## 十、数据大屏布局
|
|
496
|
-
|
|
497
|
-
### 标准尺寸
|
|
498
|
-
|
|
499
|
-
数据大屏基于 1920x1080 设计稿,使用 `scale` 方案适配不同分辨率:
|
|
500
|
-
|
|
501
|
-
```vue
|
|
502
|
-
<script setup lang="ts">
|
|
503
|
-
const scaleRef = ref({ x: 1, y: 1 });
|
|
504
|
-
const screenRef = ref<HTMLDivElement>();
|
|
505
|
-
|
|
506
|
-
function updateScale() {
|
|
507
|
-
const width = window.innerWidth / 1920;
|
|
508
|
-
const height = window.innerHeight / 1080;
|
|
509
|
-
scaleRef.value = { x: width, y: height };
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
onMounted(() => {
|
|
513
|
-
updateScale();
|
|
514
|
-
window.addEventListener("resize", updateScale);
|
|
515
|
-
});
|
|
516
|
-
onUnmounted(() => {
|
|
517
|
-
window.removeEventListener("resize", updateScale);
|
|
518
|
-
});
|
|
519
|
-
</script>
|
|
520
|
-
|
|
521
|
-
<template>
|
|
522
|
-
<div ref="screenRef" :style="{
|
|
523
|
-
transform: `scale(${scaleRef.x}, ${scaleRef.y})`,
|
|
524
|
-
transformOrigin: 'left top',
|
|
525
|
-
width: '1920px', height: '1080px',
|
|
526
|
-
}">
|
|
527
|
-
<!-- 大屏内容 -->
|
|
528
|
-
</div>
|
|
529
|
-
</template>
|
|
530
|
-
```
|
|
531
|
-
|
|
532
|
-
### 大屏约定
|
|
533
|
-
|
|
534
|
-
1. 设计稿固定 1920x1080,使用 `scale` 等比缩放。
|
|
535
|
-
2. 图表使用 ECharts,配合 `ReFlicker` 实现数据闪烁效果。
|
|
536
|
-
3. 布局使用绝对定位 + 百分比,不使用 flex/grid 流式布局。
|
|
537
|
-
4. 字体使用 `rem` 或 `vw/vh` 单位,确保缩放后比例正确。
|
|
538
|
-
5. 大屏使用独立布局,不显示菜单/页头。
|
|
539
|
-
|
|
540
|
-
---
|
|
467
|
+
## 十一、反例(短)
|
|
541
468
|
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
- 使用 `chroma-js` 以外的库处理颜色(如 `color`、`polished`)。
|
|
552
|
-
- 直接修改 `--el-color-primary` 而不通过 `setEpThemeColor()`(导致色阶不更新)。
|
|
553
|
-
- 在组件 scoped 样式中写 `:root` 或 `html.dark` 选择器(无效)。
|
|
554
|
-
- 新增侧边栏样式不检查 3 种布局模式的兼容性。
|
|
469
|
+
| 错误 | 正确 |
|
|
470
|
+
|------|------|
|
|
471
|
+
| 硬编码颜色 | CSS 变量 / 令牌 |
|
|
472
|
+
| 只写亮色 | 同步 `dark.scss` |
|
|
473
|
+
| 移动直接复用 PC 表格 | `mobile-h5` 卡片列表 |
|
|
474
|
+
| 大屏用流式 flex 替代 scale | 见 `data-screen` |
|
|
475
|
+
| 直接改 `--el-color-primary` | `setEpThemeColor()` |
|
|
476
|
+
| scoped 内写 `:root` / `html.dark` | 放全局样式文件 |
|
|
477
|
+
| 侧栏样式不测 3 种布局 | 改后回归验证 |
|
package/references/mobile-h5.md
CHANGED
|
@@ -90,28 +90,28 @@ export default {
|
|
|
90
90
|
|
|
91
91
|
### 列表页(触底加载)
|
|
92
92
|
|
|
93
|
+
分页 / 响应字段见 `http-api`(`pageNo`/`pageSize` → `content`/`totalCount`)。本处只示范 Vant 壳。
|
|
94
|
+
|
|
93
95
|
```vue
|
|
94
96
|
<script setup lang="ts">
|
|
95
|
-
import {
|
|
96
|
-
import { getCustomerListApi } from "@/api/customer";
|
|
97
|
+
import { getCustomerList } from "@/api/customer";
|
|
97
98
|
|
|
98
99
|
defineOptions({ name: "MobileCustomer" });
|
|
99
100
|
|
|
100
|
-
const list = ref<
|
|
101
|
+
const list = ref<Customer[]>([]);
|
|
101
102
|
const loading = ref(false);
|
|
102
103
|
const finished = ref(false);
|
|
103
|
-
const
|
|
104
|
+
const pageNo = ref(1);
|
|
104
105
|
const pageSize = 10;
|
|
105
106
|
|
|
106
107
|
async function onLoad() {
|
|
107
108
|
loading.value = true;
|
|
108
109
|
try {
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
page.value++;
|
|
110
|
+
const res = await getCustomerList({ pageNo: pageNo.value, pageSize });
|
|
111
|
+
const rows = res.data?.content ?? [];
|
|
112
|
+
if (rows.length < pageSize) finished.value = true;
|
|
113
|
+
list.value.push(...rows);
|
|
114
|
+
pageNo.value++;
|
|
115
115
|
} finally {
|
|
116
116
|
loading.value = false;
|
|
117
117
|
}
|
|
@@ -119,7 +119,7 @@ async function onLoad() {
|
|
|
119
119
|
|
|
120
120
|
function onRefresh() {
|
|
121
121
|
list.value = [];
|
|
122
|
-
|
|
122
|
+
pageNo.value = 1;
|
|
123
123
|
finished.value = false;
|
|
124
124
|
onLoad();
|
|
125
125
|
}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
# 项目资产清单(Project Inventory)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
> - 禁止擅自升降级;禁止用 `latest` / 不带版本号安装选型表内的库
|
|
3
|
+
## 何时读本文件
|
|
4
|
+
|
|
5
|
+
按需加载(非始终):查 Re* / Hook 名、确认库版本、命中 addon、缺依赖需安装时。硬约束与壳摘要见 `core-kernel`。
|
|
6
|
+
|
|
7
|
+
- 已有封装须复用;选型表指定库勿擅自替换;新依赖须待确认
|
|
8
|
+
- 版本对齐模板 `package.json`(2026-08 冻结);先查业务项目 `package.json`
|
|
9
|
+
- 缺失 →「九、专项能力依赖安装表」精确版本 `pnpm` 命令,确认后再装;禁止 `@latest` / 无版本号
|
|
11
10
|
|
|
12
11
|
---
|
|
13
12
|
|
|
@@ -219,9 +218,9 @@
|
|
|
219
218
|
| Hook | 用途 | 关键 API |
|
|
220
219
|
|---|---|---|
|
|
221
220
|
| **useApp** | 全局应用状态(布局、字典、登出等) | `baseCodeGet(codeType)`、`filterValue()`、`headerHeight`、`svgLoading` |
|
|
222
|
-
| **useDetail** |
|
|
221
|
+
| **useDetail** | 列表→详情:写顶部 tag 并跳转 | `toDetail(name, params, title?, 'query'\|'params')`、`initToDetail(name)`、`getParameter`;路由配 `showLink:false`(不进侧栏)+`activePath`(见 `detail-page`) |
|
|
223
222
|
| **useFormCheck** | 多表单校验聚合 | 追踪各字段校验状态,emit `form-validate` 事件 |
|
|
224
|
-
| **useTableSearch** | 列表页搜索/分页/Loading/动态表高 | `content`(须绑 `el-card`)、`
|
|
223
|
+
| **useTableSearch** | 列表页搜索/分页/Loading/动态表高 | `content`(须绑 `el-card.vts-page-card`)、`multipleTableRef`(建议绑 `el-table`)、`otherRef`(表上方额外模块)、`tableHeight`(卡片底边 − 表格顶边 − 分页;空数据仍有占位高)、`paginationRef`、`tableData`、`pagination`、`loading`、`onSearch()`、`reset()`、`formRef`、`gridRef`、`collapsed` / `showCollapse` / `collapsedToggle` |
|
|
225
224
|
| **useTags** | 多标签页管理 | 右键菜单(刷新/关闭/关闭其他/全屏) |
|
|
226
225
|
| **useTheme** | 主题切换(暗色/亮色) | 主题色生成、布局预设、缓存重置 |
|
|
227
226
|
| **useWebSocket** | WebSocket 通信 | `subscribe()`、`send()`、`sendRaw()`、`isConnected` |
|
package/references/table-vxe.md
CHANGED
|
@@ -25,14 +25,15 @@ pnpm add vxe-table@4.19.21 vxe-pc-ui@4.15.19
|
|
|
25
25
|
|
|
26
26
|
## 必须复用
|
|
27
27
|
|
|
28
|
-
-
|
|
28
|
+
- 请求与分页字段见 `http-api`(`Result<T>`、`pageNo`/`pageSize`/`content`/`totalCount`)
|
|
29
|
+
- API 函数放 `src/api/`,组件内调用业务 API(勿在页面直接 `http.request`)
|
|
29
30
|
|
|
30
31
|
## 完整示例
|
|
31
32
|
|
|
32
33
|
```vue
|
|
33
34
|
<script setup lang="ts">
|
|
34
35
|
import type { VxeGridInstance, VxeGridProps } from "vxe-table";
|
|
35
|
-
import {
|
|
36
|
+
import { getOrderList } from "@/api/order";
|
|
36
37
|
|
|
37
38
|
defineOptions({ name: "OrderVxeList" });
|
|
38
39
|
|
|
@@ -43,7 +44,6 @@ interface RowVO {
|
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
const gridRef = ref<VxeGridInstance>();
|
|
46
|
-
const loading = ref(false);
|
|
47
47
|
|
|
48
48
|
const gridOptions = reactive<VxeGridProps<RowVO>>({
|
|
49
49
|
border: true,
|
|
@@ -71,24 +71,18 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({
|
|
|
71
71
|
});
|
|
72
72
|
|
|
73
73
|
async function loadData() {
|
|
74
|
-
loading.value = true;
|
|
75
74
|
gridOptions.loading = true;
|
|
76
75
|
try {
|
|
77
76
|
const pager = gridOptions.pagerConfig!;
|
|
78
|
-
const res = await
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
data: {
|
|
82
|
-
pageNo: pager.currentPage,
|
|
83
|
-
pageSize: pager.pageSize,
|
|
84
|
-
},
|
|
77
|
+
const res = await getOrderList({
|
|
78
|
+
pageNo: pager.currentPage,
|
|
79
|
+
pageSize: pager.pageSize,
|
|
85
80
|
});
|
|
86
81
|
if (res.status === 200) {
|
|
87
82
|
gridOptions.data = res.data?.content || [];
|
|
88
83
|
pager.total = res.data?.totalCount || 0;
|
|
89
84
|
}
|
|
90
85
|
} finally {
|
|
91
|
-
loading.value = false;
|
|
92
86
|
gridOptions.loading = false;
|
|
93
87
|
}
|
|
94
88
|
}
|
|
@@ -111,4 +105,4 @@ onMounted(() => loadData());
|
|
|
111
105
|
|
|
112
106
|
- [ ] 未对普通小列表强行上 VXE
|
|
113
107
|
- [ ] 未引入其它表格库
|
|
114
|
-
- [ ]
|
|
108
|
+
- [ ] 分页字段与 `http-api` 一致
|
package/references/tree-table.md
CHANGED
|
@@ -108,5 +108,5 @@ import { ReTreeLine } from '@/components/ReTreeLine'
|
|
|
108
108
|
|
|
109
109
|
## 关联文件
|
|
110
110
|
|
|
111
|
-
-
|
|
112
|
-
-
|
|
111
|
+
- `src/utils/tree.ts`
|
|
112
|
+
- `src/components/ReTreeLine/index.ts`
|
|
@@ -172,6 +172,6 @@ VITE_WS_URL=wss://api.example.com/ws
|
|
|
172
172
|
|
|
173
173
|
## 关联文件
|
|
174
174
|
|
|
175
|
-
-
|
|
176
|
-
-
|
|
177
|
-
-
|
|
175
|
+
- `src/hooks/useWebSocket.ts`
|
|
176
|
+
- `src/utils/websocket/index.ts`
|
|
177
|
+
- `src/utils/websocket/core.ts`
|