@qilitt-mickey/vue3-temp-skill 1.0.8

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.
Files changed (37) hide show
  1. package/README.md +229 -0
  2. package/SKILL.md +621 -0
  3. package/bin/cli.js +579 -0
  4. package/package.json +46 -0
  5. package/references/advanced-ui.md +302 -0
  6. package/references/api-check.md +272 -0
  7. package/references/base-code-dict.md +48 -0
  8. package/references/build-optim.md +282 -0
  9. package/references/code-quality.md +235 -0
  10. package/references/crud-pages.md +316 -0
  11. package/references/data-compare.md +501 -0
  12. package/references/data-mapping.md +213 -0
  13. package/references/data-screen.md +79 -0
  14. package/references/data-writeback.md +104 -0
  15. package/references/detail-page.md +99 -0
  16. package/references/directives-advanced.md +93 -0
  17. package/references/download-export.md +68 -0
  18. package/references/feedback-loading.md +60 -0
  19. package/references/feedback-ui.md +111 -0
  20. package/references/file-management.md +132 -0
  21. package/references/flowchart-g6.md +244 -0
  22. package/references/form-advanced.md +137 -0
  23. package/references/graph-relation.md +253 -0
  24. package/references/http-api.md +188 -0
  25. package/references/layout-theme.md +540 -0
  26. package/references/mobile-h5.md +271 -0
  27. package/references/permission-auth.md +235 -0
  28. package/references/project-inventory.md +326 -0
  29. package/references/qrcode-barcode.md +92 -0
  30. package/references/rich-text.md +73 -0
  31. package/references/seamless-scroll.md +38 -0
  32. package/references/tree-table.md +111 -0
  33. package/references/ui-components.md +161 -0
  34. package/references/verify-captcha.md +96 -0
  35. package/references/vue-core.md +209 -0
  36. package/references/websocket-realtime.md +176 -0
  37. package/references/workflow-bpmn.md +206 -0
@@ -0,0 +1,79 @@
1
+ # 数据大屏
2
+
3
+ 规范数据大屏/可视化大屏的等比缩放、响应式适配与布局结构。在开发大屏展示页面时参照。
4
+
5
+ ## 布局结构
6
+
7
+ 大屏页面使用固定设计稿尺寸(默认 `1920x1080`),通过 CSS `transform: scale()` 实现等比缩放。
8
+
9
+ ```vue
10
+ <script setup lang="ts">
11
+ defineOptions({ name: 'DataScreen' })
12
+
13
+ const dataScreenRef = ref<HTMLElement | null>(null)
14
+
15
+ onMounted(() => {
16
+ resize()
17
+ window.addEventListener('resize', resize)
18
+ })
19
+
20
+ onBeforeUnmount(() => {
21
+ window.removeEventListener('resize', resize)
22
+ })
23
+
24
+ function resize() {
25
+ if (!dataScreenRef.value) return
26
+ dataScreenRef.value.style.transform = `scale(${getScale()}) translate(-50%, -50%)`
27
+ }
28
+
29
+ function getScale(width = 1920, height = 1080) {
30
+ const ww = window.innerWidth / width
31
+ const wh = window.innerHeight / height
32
+ return ww < wh ? ww : wh
33
+ }
34
+ </script>
35
+
36
+ <template>
37
+ <div class="s-container">
38
+ <div ref="dataScreenRef" class="s-content">
39
+ <!-- 头部 -->
40
+ <div class="s-header">...</div>
41
+ <!-- 主体:左/中/右三栏 -->
42
+ <div class="s-main">
43
+ <div class="main-lf">...</div>
44
+ <div class="main-ct">...</div>
45
+ <div class="main-ri">...</div>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ </template>
50
+ ```
51
+
52
+ ## 样式约定
53
+
54
+ ```scss
55
+ .s-container {
56
+ position: relative;
57
+ width: 100vw;
58
+ height: 100vh;
59
+ overflow: hidden;
60
+ background: #000;
61
+ }
62
+
63
+ .s-content {
64
+ position: absolute;
65
+ top: 50%;
66
+ left: 50%;
67
+ width: 1920px;
68
+ height: 1080px;
69
+ transform-origin: 0 0;
70
+ }
71
+ ```
72
+
73
+ ## 关键约定
74
+
75
+ 1. 设计稿宽度、高度与 `getScale` 参数保持一致。
76
+ 2. 内部元素全部按设计稿像素开发,不要写响应式单位。
77
+ 3. 图表组件在 `resize` 时调用 `chart.resize()` 重新自适应(如使用 ECharts)。
78
+ 4. 定时器在 `onBeforeUnmount` 中清理。
79
+ 5. 大屏通常不需要展示菜单/页头,使用独立布局或全屏路由。
@@ -0,0 +1,104 @@
1
+ # 数据回写与编辑
2
+
3
+ ## 表单回显
4
+
5
+ ### 新增/编辑页
6
+
7
+ ```typescript
8
+ async function getDetail() {
9
+ const { id } = getParameter.value
10
+ if (!id) return
11
+ const res = await getDetailApi({ id })
12
+ Object.assign(formData, res.data)
13
+ }
14
+ ```
15
+
16
+ ### 选择类组件回填
17
+
18
+ | 组件 | 回填方式 |
19
+ |------|---------|
20
+ | `ReSelectQuery` | 传 `edit-data` 属性 |
21
+ | `el-tree-select` | 传 `:cache-data` 属性 |
22
+ | `ReCascader` | 直接传 `v-model` 数组 |
23
+
24
+ ### 表单重置
25
+
26
+ ```typescript
27
+ function reset() {
28
+ formRef.value.resetFields()
29
+ }
30
+ ```
31
+
32
+ ## 表格行编辑
33
+
34
+ 表格内编辑时维护行状态,支持备份/恢复:
35
+
36
+ ```typescript
37
+ const tableData = ref([])
38
+
39
+ function startEdit(row) {
40
+ row._edit = true
41
+ row._backup = { ...row } // 备份原始数据
42
+ }
43
+
44
+ function cancelEdit(row) {
45
+ Object.assign(row, row._backup) // 恢复
46
+ row._edit = false
47
+ }
48
+
49
+ function saveEdit(row) {
50
+ // 调用保存接口
51
+ saveRowApi(row).then(() => {
52
+ row._edit = false
53
+ delete row._backup
54
+ })
55
+ }
56
+ ```
57
+
58
+ ## 多表单联合校验
59
+
60
+ 页面包含多个表单时,使用 `validateForms` 统一校验:
61
+
62
+ ```typescript
63
+ import { validateForms } from '@/utils/utils'
64
+
65
+ const formModulesRef = ref([])
66
+ const formModules = [
67
+ { refName: 'formA' },
68
+ { refName: 'formB' },
69
+ ]
70
+
71
+ async function handleSubmit() {
72
+ const valid = await validateForms(formModulesRef.value, formModules)
73
+ if (!valid) return
74
+ // 所有表单校验通过,提交数据
75
+ }
76
+ ```
77
+
78
+ ## useFormCheck Hook
79
+
80
+ 表单校验聚合,适用于需要监听多个字段校验状态的场景:
81
+
82
+ ```typescript
83
+ import { useFormCheck } from '@/hooks/useFormCheck'
84
+
85
+ const { validateStatus, onValidate } = useFormCheck(['field1', 'field2'])
86
+
87
+ // 在 el-form 的 @validate 事件中收集
88
+ // validateStatus 响应式记录各字段的校验结果
89
+ ```
90
+
91
+ ## 关键约定
92
+
93
+ 1. 回显时只覆盖表单字段,不破坏响应式结构(使用 `Object.assign` 而非重新赋值)。
94
+ 2. 编辑前备份数据(`_backup`),取消时恢复。
95
+ 3. 选择类组件回填需同时维护 code 与 name 两个字段。
96
+ 4. 多表单校验使用 `validateForms`,不要手动逐个调用 `validate()`。
97
+ 5. 提交按钮必须有 `loading` 状态防重复提交。
98
+
99
+ ## 关联文件
100
+
101
+ - [src/utils/utils.ts](file:///e:/work/vue3-web-temp/src/utils/utils.ts)
102
+ - [src/hooks/useFormCheck.ts](file:///e:/work/vue3-web-temp/src/hooks/useFormCheck.ts)
103
+ - [src/views/form/moreForm/index.vue](file:///e:/work/vue3-web-temp/src/views/form/moreForm/index.vue)
104
+ - [src/views/form/selectTree/index.vue](file:///e:/work/vue3-web-temp/src/views/form/selectTree/index.vue)
@@ -0,0 +1,99 @@
1
+ # 详情页开发
2
+
3
+ ## useDetail Hook
4
+
5
+ 用于列表→详情/新增/编辑页的跳转和参数传递。
6
+
7
+ ```typescript
8
+ import { useDetail } from '@/hooks/useDetail'
9
+
10
+ const { toDetail, initToDetail, getParameter } = useDetail()
11
+ ```
12
+
13
+ ## 跳转
14
+
15
+ ```typescript
16
+ // 从列表跳详情/编辑/新增
17
+ toDetail('QueryDetail', { id: row.id, mark: 'view', text: row.name })
18
+ toDetail('QueryDetail', { id: row.id, mark: 'edit', text: row.name })
19
+ toDetail('QueryDetail', { mark: 'create', text: '新增数据' })
20
+ ```
21
+
22
+ ### 参数说明
23
+
24
+ | 参数 | 说明 |
25
+ |------|------|
26
+ | `routeName` | 目标路由 `name`(必须与路由配置一致) |
27
+ | `params.id` | 数据唯一标识 |
28
+ | `params.mark` | 状态标识:`edit` / `view` / `create` 或自定义 |
29
+ | `params.text` | 用于拼接标签页标题的文本 |
30
+
31
+ > 数字类型参数跳转前需 `toString()`,因为 `vue-router` 解析后全为字符串。
32
+
33
+ ## 详情页初始化
34
+
35
+ ```vue
36
+ <script setup lang="ts">
37
+ import { useDetail } from '@/hooks/useDetail'
38
+
39
+ defineOptions({ name: 'QueryDetail' }) // 必须与路由 name 一致
40
+
41
+ const { initToDetail, getParameter } = useDetail()
42
+ initToDetail('QueryDetail')
43
+
44
+ // 获取参数
45
+ const { id, mark, text } = getParameter.value
46
+ </script>
47
+ ```
48
+
49
+ ### 标签页标题自动生成
50
+
51
+ `initToDetail` 会根据参数自动生成多标签页标题:
52
+
53
+ | 条件 | 标题 |
54
+ |------|------|
55
+ | 无 `id` | `新增` |
56
+ | `mark === 'edit'` | `编辑【xxx】` |
57
+ | `mark === 'view'` | `查看【xxx】` |
58
+
59
+ ## 数据回显
60
+
61
+ ```typescript
62
+ async function getDetail() {
63
+ const { id } = getParameter.value
64
+ if (!id) return
65
+ const res = await getDetailApi({ id })
66
+ Object.assign(formData, res.data)
67
+ }
68
+
69
+ onMounted(() => {
70
+ getDetail()
71
+ })
72
+ ```
73
+
74
+ ## 非多标签页场景
75
+
76
+ 普通详情页直接使用 `getParameter` 获取路由参数:
77
+
78
+ ```vue
79
+ <script setup lang="ts">
80
+ import { useDetail } from '@/hooks/useDetail'
81
+
82
+ const { getParameter } = useDetail()
83
+ const route = useRoute()
84
+ const id = route.query.id
85
+ </script>
86
+ ```
87
+
88
+ ## 关键约定
89
+
90
+ 1. 详情页组件 `name` 必须与路由 `name` 一致,否则标签页标题功能异常。
91
+ 2. 通过 `getParameter` 获取 `query` 或 `params` 参数,不要直接用 `useRoute()`。
92
+ 3. 表单详情页回显:进入页面后调详情接口,用 `Object.assign(formData, data)` 赋值。
93
+ 4. `mark` 字段控制页面编辑态:`view` 禁用表单,`edit` 可编辑,`create` 新增。
94
+ 5. 选择类组件回填需同时维护 code 与 name(详见 data-writeback 模块)。
95
+
96
+ ## 关联文件
97
+
98
+ - [src/hooks/useDetail.ts](file:///e:/work/vue3-web-temp/src/hooks/useDetail.ts)
99
+ - [src/views/component/detail/detail.vue](file:///e:/work/vue3-web-temp/src/views/component/detail/detail.vue)
@@ -0,0 +1,93 @@
1
+ # 高级自定义指令
2
+
3
+ 除 `v-auth` 权限指令(见 permission-auth 模块)外,项目还提供复制与字体自适应指令。
4
+
5
+ > **数据变更对比(`v-compare` 整套)** 内容多、控件用法各异,已独立为 **data-compare** 模块。
6
+ > 涉及编辑页对比 / 变更汇总 / 表格行增删改对比时,**必须加载** `references/data-compare.md`,不要使用本节旧示例。
7
+
8
+ ## v-copy 复制指令
9
+
10
+ 双击或单击复制文本到剪贴板。
11
+
12
+ ```vue
13
+ <!-- 双击复制(默认) -->
14
+ <el-tag v-copy="modelValue">{{ modelValue }}</el-tag>
15
+
16
+ <!-- 单击复制 -->
17
+ <el-button v-copy:click="modelValue">复制</el-button>
18
+
19
+ <!-- 单击复制 + 阻止冒泡 -->
20
+ <el-tag v-copy:click.stop="modelValue">复制</el-tag>
21
+ ```
22
+
23
+ ### 修饰符
24
+
25
+ | 修饰符 | 说明 |
26
+ |--------|------|
27
+ | `:click` | 改为单击触发(默认双击) |
28
+ | `.stop` | 阻止事件冒泡 |
29
+
30
+ - 复制成功/失败自动调用 `message` 提示。
31
+ - 值更新后通过 `updated` 钩子自动同步,无需重新挂载。
32
+
33
+ ## v-auto-font 自适应字体
34
+
35
+ 根据容器宽度和文本长度自动调整字号,适用于文本长度不确定的场景。
36
+
37
+ ```vue
38
+ <!-- 基本用法:传入文本密度比例 -->
39
+ <p v-auto-font="0.5" class="w-full">{{ longText }}</p>
40
+
41
+ <!-- 对象参数:精细控制 -->
42
+ <p v-auto-font="{ scale: 0.6, min: 12, max: 14 }">{{ longText }}</p>
43
+ ```
44
+
45
+ ### 参数
46
+
47
+ | 类型 | 说明 |
48
+ |------|------|
49
+ | `number` | 文本密度比例(越小越不容易缩小字体) |
50
+ | `object` | `{ scale: 0.6, min: 12, max: 14 }` |
51
+
52
+ - `scale`:密度系数,值越小字体越不容易缩小
53
+ - `min`:最小字号(默认 12)
54
+ - `max`:最大字号(默认 14)
55
+ - 文本为空或无法测量时使用最大字号。
56
+
57
+ ## v-compare(入口指引)
58
+
59
+ 完整规范见 **[data-compare](data-compare.md)**。速查:
60
+
61
+ ```vue
62
+ <el-input
63
+ v-model="form.name"
64
+ v-compare:name="{
65
+ oldValue: oldForm?.name,
66
+ title: '基本信息',
67
+ label: '名称',
68
+ enabled: compareEnabled,
69
+ }"
70
+ />
71
+ ```
72
+
73
+ - 绑定字段:`oldValue` / `title` / `label` / `enabled`(**没有** `newValue`)
74
+ - 修饰符:`.map`、`.mapArr`、`.table`
75
+ - Store:`useCompareStore`;汇总:`ChangeSummaryService` + `ChangeSummaryDialog`
76
+
77
+ ## 指令注册
78
+
79
+ ```
80
+ src/directives/
81
+ ├── auth/index.ts # v-auth
82
+ ├── copy/index.ts # v-copy
83
+ ├── autoFont/index.ts # v-auto-font
84
+ └── compare/index.ts # v-compare(详见 data-compare)
85
+ ```
86
+
87
+ ## 关键约定
88
+
89
+ 1. 权限指令优先使用 `v-auth`;列表行操作优先使用 `ReTableOperate` 的 `auth` 字段。
90
+ 2. `v-copy` 的值更新后自动同步,不需要手动重新绑定。
91
+ 3. `v-auto-font` 依赖 `ResizeObserver` 监听容器宽度变化。
92
+ 4. `v-compare` 全套能力按 **data-compare** 模块生成,禁止编造数值比较数组语法。
93
+ 5. 自定义指令命名使用 kebab-case(`v-auto-font`,不是 `v-autoFont`)。
@@ -0,0 +1,68 @@
1
+ # 下载与导出
2
+
3
+ 规范文件下载、模板下载、文件流导出与附件预览。在需要下载文件、导出表格或预览附件时参照。
4
+
5
+ ## 常用工具
6
+
7
+ 项目集成了 `@pureadmin/utils` 与自定义工具:
8
+
9
+ ```typescript
10
+ import {
11
+ downloadByBase64,
12
+ downloadByData,
13
+ downloadByOnlineUrl,
14
+ downloadByUrl,
15
+ } from "@pureadmin/utils";
16
+
17
+ import { download, blobDown, downloadAttachment } from "@/utils/utils";
18
+ ```
19
+
20
+ ## 文件流下载
21
+
22
+ 接口返回 Blob 时:
23
+
24
+ ```typescript
25
+ import { blobDown } from "@/utils/utils";
26
+
27
+ const res = await exportExcel(params);
28
+ blobDown(res.data, "导出.xlsx", res);
29
+ ```
30
+
31
+ 若后端在 `content-disposition` 中返回文件名,可自动解析。
32
+
33
+ ## 模板下载
34
+
35
+ ```typescript
36
+ import { download } from "@/utils/utils";
37
+
38
+ await download("user-template");
39
+ ```
40
+
41
+ 后端返回 Blob,前端自动下载为 `user-template.xlsx`。
42
+
43
+ ## 在线地址/图片下载
44
+
45
+ ```typescript
46
+ // 在线图片
47
+ downloadByOnlineUrl("https://xxx.com/a.png", "a.png");
48
+
49
+ // 普通文件
50
+ downloadByUrl("https://xxx.com/file.zip", "file.zip");
51
+
52
+ // base64 图片
53
+ downloadByBase64(base64String, "a.png");
54
+ ```
55
+
56
+ ## 附件下载
57
+
58
+ ```typescript
59
+ import { downloadAttachment } from "@/utils/utils";
60
+
61
+ downloadAttachment("https://xxx.com/file.pdf", "file.pdf");
62
+ ```
63
+
64
+ ## 关键约定
65
+
66
+ 1. 导出文件名优先从响应头解析,其次前端指定。
67
+ 2. 大文件导出需显示 loading。
68
+ 3. 下载失败时给用户明确提示。
@@ -0,0 +1,60 @@
1
+ # 反馈与 Loading
2
+
3
+ 规范系统 Loading、Message、MessageBox、NoticeBar 等反馈组件的使用。在需要提示用户或阻塞操作时参照。
4
+
5
+ ## Loading
6
+
7
+ ### 局部 Loading
8
+
9
+ ```vue
10
+ <el-card v-loading.lock="loading" :element-loading-spinner="svgLoading">
11
+ <!-- 内容 -->
12
+ </el-card>
13
+ ```
14
+
15
+ ### 全屏 Loading
16
+
17
+ ```vue
18
+ <el-button v-loading.lock.fullscreen="fullLoading" @click="submit">
19
+ 保存
20
+ </el-button>
21
+ ```
22
+
23
+ ### 获取系统统一 Loading SVG
24
+
25
+ ```typescript
26
+ import { useApp } from "@/hooks/useApp";
27
+
28
+ const { svgLoading } = useApp();
29
+ ```
30
+
31
+ ## Message
32
+
33
+ 使用 `src/utils/message.ts` 封装函数:
34
+
35
+ ```typescript
36
+ import { message, closeAllMessage } from "@/utils/message";
37
+
38
+ message("操作成功", { type: "success" });
39
+ message("警告信息", { type: "warning", duration: 3000 });
40
+ ```
41
+
42
+ 默认 `duration: 5000`、`grouping: true`、`plain: true`。
43
+
44
+ ## MessageBox
45
+
46
+ ```typescript
47
+ import { ElMessageBox } from "element-plus";
48
+
49
+ ElMessageBox.confirm($t("确定删除吗?"), $t("温馨提醒"), {
50
+ confirmButtonText: $t("确定"),
51
+ cancelButtonText: $t("取消"),
52
+ type: "warning",
53
+ });
54
+ ```
55
+
56
+ ## 关键约定
57
+
58
+ 1. 所有提示文案使用 `$t()`。
59
+ 2. 长耗时操作显示 loading,避免用户重复点击。
60
+ 3. 表单提交失败调用 `checkReeorPosition()` 定位错误项。
@@ -0,0 +1,111 @@
1
+ # 展示类反馈组件
2
+
3
+ 规范通知栏、水印、时间轴、闪烁点、打字机动画等展示类反馈组件的使用。在需要信息展示、氛围效果时参照。
4
+
5
+ ## ReNoticeBar 通知栏
6
+
7
+ ```vue
8
+ <script setup lang="ts">
9
+ const NoticeBar = defineAsyncComponent(
10
+ () => import("@/components/ReNoticeBar"),
11
+ );
12
+ </script>
13
+
14
+ <template>
15
+ <NoticeBar text="系统将于今晚 22:00 进行维护" />
16
+
17
+ <NoticeBar
18
+ text="系统将于今晚 22:00 进行维护"
19
+ left-icon="notice"
20
+ right-icon="arrowRight"
21
+ background="#ecf5ff"
22
+ color="#409eff"
23
+ />
24
+ </template>
25
+ ```
26
+
27
+ ## Watermark 水印
28
+
29
+ 使用 `@pureadmin/utils` 的 `useWatermark`。
30
+
31
+ ```vue
32
+ <script setup lang="ts">
33
+ import { useWatermark } from "@pureadmin/utils";
34
+
35
+ const { setWatermark, clear } = useWatermark();
36
+ const appMain: Ref = inject("appMain");
37
+ const { setWatermark: setLocalWatermark, clear: clearLocal } =
38
+ useWatermark(appMain);
39
+ </script>
40
+
41
+ <template>
42
+ <el-button
43
+ @click="setWatermark('水印测试、多行测试', { rotate: -20, lineHeight: 20 })"
44
+ >
45
+ 整页水印
46
+ </el-button>
47
+ <el-button @click="clear">清除整页水印</el-button>
48
+ <el-button @click="setLocalWatermark('局部水印')">局部水印</el-button>
49
+ </template>
50
+ ```
51
+
52
+ - 不传容器则铺满整个页面。
53
+ - 传入容器 DOM 则只在该容器内绘制水印。
54
+
55
+ ## ReTimeLine 时间轴
56
+
57
+ ```vue
58
+ <script setup lang="ts">
59
+ import { ReTimeLine } from "@/components/ReTimeLine";
60
+
61
+ const items = ref([
62
+ { title: "立项", date: "2024-01-01", imgUrl: "/test.png" },
63
+ { title: "开发", date: "2024-03-01", imgUrl: "/test.png" },
64
+ ]);
65
+ </script>
66
+
67
+ <template>
68
+ <ReTimeLine :items="items" />
69
+ </template>
70
+ ```
71
+
72
+ ## ReFlicker 闪烁点
73
+
74
+ ```vue
75
+ <script setup lang="ts">
76
+ import { useRenderFlicker } from "@/components/ReFlicker";
77
+
78
+ const Flicker = useRenderFlicker({
79
+ width: "12px",
80
+ height: "12px",
81
+ background: "var(--el-color-success)",
82
+ borderRadius: "50%",
83
+ scale: 2,
84
+ });
85
+ </script>
86
+
87
+ <template>
88
+ <Flicker />
89
+ </template>
90
+ ```
91
+
92
+ ## ReTypeit 打字机动画
93
+
94
+ ```vue
95
+ <script setup lang="ts">
96
+ import TypeIt from "@/components/ReTypeit";
97
+ </script>
98
+
99
+ <template>
100
+ <TypeIt :options="{ speed: 100, loop: true }">
101
+ <span class="type-it">Hello World</span>
102
+ </TypeIt>
103
+ </template>
104
+ ```
105
+
106
+ ## 关键约定
107
+
108
+ 1. 通知栏长文本自动滚动;搭配 `el-carousel` 可实现垂直轮播。
109
+ 2. 水印在页面切换或登录态变化时应重新设置,避免被移除。
110
+ 3. `ReTimeLine` 数据项至少包含 `title` 与 `date`。
111
+ 4. `ReFlicker` 通过 `useRenderFlicker` 返回组件,适合状态指示。