@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.
- package/README.md +229 -0
- package/SKILL.md +621 -0
- package/bin/cli.js +579 -0
- package/package.json +46 -0
- package/references/advanced-ui.md +302 -0
- package/references/api-check.md +272 -0
- package/references/base-code-dict.md +48 -0
- package/references/build-optim.md +282 -0
- package/references/code-quality.md +235 -0
- package/references/crud-pages.md +316 -0
- package/references/data-compare.md +501 -0
- package/references/data-mapping.md +213 -0
- package/references/data-screen.md +79 -0
- package/references/data-writeback.md +104 -0
- package/references/detail-page.md +99 -0
- package/references/directives-advanced.md +93 -0
- package/references/download-export.md +68 -0
- package/references/feedback-loading.md +60 -0
- package/references/feedback-ui.md +111 -0
- package/references/file-management.md +132 -0
- package/references/flowchart-g6.md +244 -0
- package/references/form-advanced.md +137 -0
- package/references/graph-relation.md +253 -0
- package/references/http-api.md +188 -0
- package/references/layout-theme.md +540 -0
- package/references/mobile-h5.md +271 -0
- package/references/permission-auth.md +235 -0
- package/references/project-inventory.md +326 -0
- package/references/qrcode-barcode.md +92 -0
- package/references/rich-text.md +73 -0
- package/references/seamless-scroll.md +38 -0
- package/references/tree-table.md +111 -0
- package/references/ui-components.md +161 -0
- package/references/verify-captcha.md +96 -0
- package/references/vue-core.md +209 -0
- package/references/websocket-realtime.md +176 -0
- 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` 返回组件,适合状态指示。
|