@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.
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  skill: layout-theme
3
- description: 规范设计系统(CSS 变量体系、主题色、暗黑模式、侧边栏配色、Design Tokens)、布局系统、UnoCSS 桥接、响应式适配和 PC/移动端双端 UI 适配方案。在修改布局、主题、颜色、暗黑模式、样式或使用 ui-ux-pro-max 设计输出时调用。
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, ui-ux-pro-max]
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` | 亮白色 | `#fff` | `#4091f7` | 默认蓝 |
66
- | `default` | 道奇蓝 | `#001529` | `#4091f7` | `#1b2a47` |
67
- | `saucePurple` | 深紫罗兰 | `#130824` | `#693ac9` | `#722ed1` |
68
- | `pink` | 深粉色 | `#28081a` | `#d84493` | `#eb2f96` |
69
- | `dusk` | 猩红色 | `#2a0608` | `#e13c39` | `#f5222d` |
70
- | `volcano` | 橙红色 | `#2b0e05` | `#e85f33` | `#fa541c` |
71
- | `mingQing` | 绿宝石 | `#032121` | `#59bfc1` | `#13c2c2` |
72
- | `auroraGreen` | 酸橙绿 | `#0b1e15` | `#60ac80` | `#52c41a` |
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']` 的 8 个 `--vts-theme-*` 变量
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, .sidebar-container,
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
- ## 八、ui-ux-pro-max 设计输出衔接
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
- **2. 暗黑模式适配**
444
+ 颜色 / 间距 / 组件几何映射与落地顺序 → **`design-handoff`** + **`design-system`**(只认产出物,不点名上游技能)。
405
445
 
406
- ui-ux-pro-max 生成的风格如果是"亮色模式专用",必须同步考虑暗黑模式下的表现:
407
- - 检查每个硬编码颜色是否在 `dark.scss` 中有对应覆盖
408
- - 背景色不能直接使用白色/浅色硬编码,必须使用 CSS 变量
409
- - 图表配色需要在 ECharts 的 `setOption` 中根据 `dataTheme` 值切换配色方案
446
+ 落地后自检:
410
447
 
411
- **3. 间距与字号**
448
+ - [ ] 颜色均经 CSS 变量 / 令牌
449
+ - [ ] `html.dark` 与至少 `light`/`default` 侧栏主题正常
450
+ - [ ] 间距遵循 UnoCSS 4px 基数;字号用项目 token
412
451
 
413
- ui-ux-pro-max 输出的间距/字号建议需要适配项目的 token 体系:
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
- **4. 组件样式**
454
+ 组件对照与 Vant 写法 → **`mobile-h5`**。本处只记策略:
419
455
 
420
- ui-ux-pro-max 建议的组件样式(如卡片阴影、按钮圆角等)需要通过以下方式实现:
421
- - 优先使用 UnoCSS 原子类(`shadow-sm`、`rounded-lg` 等)
422
- - 复杂样式写在 `<style scoped>` 中,使用 CSS 变量引用主题色
423
- - 需要覆盖 Element Plus 组件样式的,放在 `src/styles/element-plus.scss` 中
456
+ | 策略 | 约定 |
457
+ |------|------|
458
+ | 判断 | `useApp().isMobile`(< 768px) |
459
+ | 列表 | PC:`el-table`;移动:卡片 + `van-list` 触底 |
460
+ | 弹窗/选择器 | 移动用 `van-popup` 包裹 |
461
+ | 导航 | 移动底部 TabBar,不用侧栏 |
424
462
 
425
- **5. 风格一致性检查**
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
- - 硬编码颜色值而不使用 CSS 变量(暗色模式不生效)。
545
- - 只写了亮色样式,没有在 `dark.scss` 中添加暗色覆盖。
546
- - 在 `element-plus.scss` 中新增硬编码颜色但不做暗黑适配。
547
- - 移动端直接复用 PC 端表格(体验差、性能差)。
548
- - 大屏使用 `vw/vh` 百分比布局而不是 `scale` 方案。
549
- - 不通过 `isMobile` 判断而使用 CSS `@media` 做逻辑分支。
550
- - UnoCSS 快捷方式命名不语义化(如 `f-c` 而非 `flex-center`)。
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 种布局 | 改后回归验证 |
@@ -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 { ref } from "vue";
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<CustomerItem[]>([]);
101
+ const list = ref<Customer[]>([]);
101
102
  const loading = ref(false);
102
103
  const finished = ref(false);
103
- const page = ref(1);
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 { data } = await getCustomerListApi({ page: page.value, pageSize });
110
- if (data.list.length < pageSize) {
111
- finished.value = true;
112
- }
113
- list.value.push(...data.list);
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
- page.value = 1;
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
- > **本模块是 AI 代码生成的前置必读文件。**
4
- > 在生成任何功能代码之前,AI 必须先查阅本清单,确认项目中是否已有对应的库、组件、Hook 或工具函数。
5
- > **已有封装须复用,勿另起一套同能力实现;选型表已指定的三方库勿擅自换成同类其他库(新依赖须待确认)。**
6
- >
7
- > **版本真相源**:下表版本对齐模板仓库 `package.json`(2026-08 冻结)。生成前先查业务项目 `package.json`:
8
- > - 已存在且版本一致 → 直接写代码,勿重复安装
9
- > - 缺失或被裁剪 → 按「九、专项能力依赖安装表」给出 **精确版本** 的 `pnpm` 命令,**征得用户确认后再执行**
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** | 详情页跳转与参数传递 | `toDetail({ id, mark, text })`、`initToDetail()`、`getParameter()` |
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`)、`otherRef`(查询条件外模块的统一根元素,高度自动从 `tableHeight` 扣除)、`tableHeight`、`paginationRef`、`tableData`、`pagination`、`loading`、`onSearch()`、`reset()`、`formRef`、`gridRef`、`collapsed` / `showCollapse` / `collapsedToggle` |
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` |
@@ -25,14 +25,15 @@ pnpm add vxe-table@4.19.21 vxe-pc-ui@4.15.19
25
25
 
26
26
  ## 必须复用
27
27
 
28
- - HTTP / 分页约定仍走 `@/utils/http` + `Result<T>`
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 { http } from "@/utils/http";
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 http.request<
79
- Result<{ content?: RowVO[]; totalCount?: number }>
80
- >("post", `${import.meta.env.VITE_API_BASE_URL}/console/order/list`, {
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
- - [ ] 分页字段与项目一致(`pageNo`/`pageSize`/`content`/`totalCount`)
108
+ - [ ] 分页字段与 `http-api` 一致
@@ -108,5 +108,5 @@ import { ReTreeLine } from '@/components/ReTreeLine'
108
108
 
109
109
  ## 关联文件
110
110
 
111
- - [src/utils/tree.ts](file:///e:/work/vue3-web-temp/src/utils/tree.ts)
112
- - [src/components/ReTreeLine/index.ts](file:///e:/work/vue3-web-temp/src/components/ReTreeLine/index.ts)
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
- - [src/hooks/useWebSocket.ts](file:///e:/work/vue3-web-temp/src/hooks/useWebSocket.ts)
176
- - [src/utils/websocket/index.ts](file:///e:/work/vue3-web-temp/src/utils/websocket/index.ts)
177
- - [src/utils/websocket/core.ts](file:///e:/work/vue3-web-temp/src/utils/websocket/core.ts)
175
+ - `src/hooks/useWebSocket.ts`
176
+ - `src/utils/websocket/index.ts`
177
+ - `src/utils/websocket/core.ts`