@agile-team/wl-skills-ui 1.6.2
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/CHANGELOG.md +207 -0
- package/README.md +623 -0
- package/SKILL.md +632 -0
- package/bin/wl-ui.js +794 -0
- package/design/spec/color.md +41 -0
- package/design/spec/spacing.md +28 -0
- package/design/spec/typography.md +29 -0
- package/design/tokens/base.css +144 -0
- package/design/tokens/index.css +8 -0
- package/dist/ag-grid-override.scss +1 -0
- package/dist/element.scss +1 -0
- package/dist/index.scss +1 -0
- package/dist/portal.scss +1 -0
- package/dist/style-override.scss +1 -0
- package/dist/tokens.css +144 -0
- package/es/chunk-GBB7LDKQ.js +261 -0
- package/es/chunk-MDI2SCUP.js +281 -0
- package/es/chunk-QDTNMM7W.js +286 -0
- package/es/chunk-YLNAFAWE.js +233 -0
- package/es/common-preset.d.ts +38 -0
- package/es/common-preset.js +157 -0
- package/es/index.d.ts +32 -0
- package/es/index.js +1 -0
- package/es/presets/security.d.ts +16 -0
- package/es/presets/security.js +99 -0
- package/es/renderers-BFRSp2BH.d.ts +51 -0
- package/es/renderers-DMZbi_Gs.d.ts +51 -0
- package/es/renderers-DWhUlI2y.d.ts +47 -0
- package/es/types-04qLKHMt.d.ts +62 -0
- package/es/types-BrCPjAH6.d.ts +62 -0
- package/es/types-QZ1gy9KX.d.ts +63 -0
- package/examples/migration-operations-to-renderOps.md +107 -0
- package/examples/wk-exempt.example.json +30 -0
- package/mcp/server.js +394 -0
- package/package.json +130 -0
- package/reference/SelectPopupCom.vue +634 -0
- package/reference/ag-cell-renders.ts +644 -0
- package/reference/define-columns.ts +185 -0
- package/reference/jhlc.d.ts +1 -0
- package/scanner/coverage.mjs +287 -0
- package/scanner/exempt.mjs +127 -0
- package/scanner/fix.mjs +216 -0
- package/scanner/index.mjs +403 -0
- package/scanner/integration.mjs +155 -0
- package/scanner/report.mjs +459 -0
- package/scanner/rules/_shared.mjs +134 -0
- package/scanner/rules/button.mjs +97 -0
- package/scanner/rules/color.mjs +118 -0
- package/scanner/rules/componentFamily.mjs +184 -0
- package/scanner/rules/dialog.mjs +42 -0
- package/scanner/rules/form.mjs +86 -0
- package/scanner/rules/index.mjs +58 -0
- package/scanner/rules/table.mjs +170 -0
- package/scanner/rules/tag.mjs +245 -0
- package/scanner/snapshot.mjs +198 -0
- package/skills/_flows/full-audit.md +65 -0
- package/skills/_flows/legacy-skin-align.md +71 -0
- package/skills/_flows/new-project-init.md +80 -0
- package/skills/_flows/progressive-migrate.md +49 -0
- package/skills/_meta/_compat/README.md +47 -0
- package/skills/_meta/_compat/editors.json +76 -0
- package/skills/_meta/_compat/headers/agents.txt +7 -0
- package/skills/_meta/_compat/headers/claude-code.txt +7 -0
- package/skills/_meta/_compat/headers/cline.txt +7 -0
- package/skills/_meta/_compat/headers/cursor-mdc.txt +5 -0
- package/skills/_meta/_compat/headers/github-copilot.txt +5 -0
- package/skills/_meta/_compat/headers/kiro.txt +4 -0
- package/skills/_meta/_compat/headers/qoder.txt +4 -0
- package/skills/_meta/_compat/headers/trae.txt +3 -0
- package/skills/_meta/_compat/headers/windsurf.txt +5 -0
- package/skills/_meta/_detection.md +81 -0
- package/skills/_meta/_registry.md +96 -0
- package/skills/element/component-family/SKILL.md +71 -0
- package/skills/element/el-dialog/SKILL.md +124 -0
- package/skills/element/el-form/SKILL.md +84 -0
- package/skills/element/el-table/SKILL.md +86 -0
- package/skills/element/el-tag/SKILL.md +127 -0
- package/skills/layouts/detail-page/SKILL.md +99 -0
- package/skills/layouts/form-dialog/SKILL.md +128 -0
- package/skills/layouts/list-page/SKILL.md +111 -0
- package/skills/layouts/tree-list/SKILL.md +108 -0
- package/skills/ops/audit/SKILL.md +109 -0
- package/skills/ops/fix/SKILL.md +52 -0
- package/skills/ops/fix/USAGE.md +24 -0
- package/skills/ops/migrate/SKILL.md +157 -0
- package/skills/ops/scan/SKILL.md +71 -0
- package/skills/ops/scan/USAGE.md +16 -0
- package/skills/runtime/design-tokens/SKILL.md +88 -0
- package/skills/runtime/design-tokens/USAGE.md +19 -0
- package/skills/runtime/migration/SKILL.md +106 -0
- package/skills/runtime/migration/USAGE.md +34 -0
- package/skills/runtime/style-align/SKILL.md +124 -0
- package/skills/runtime/style-align/USAGE.md +52 -0
- package/skills/vendors/ag-grid/SKILL.md +94 -0
- package/skills/vendors/base-table/SKILL.md +57 -0
- package/skills/vendors/c-components/SKILL.md +36 -0
- package/skills/vendors/custom-wrappers/SKILL.md +45 -0
- package/skills/vendors/jh-components/SKILL.md +42 -0
- package/skills/vendors/unknown-wrapper/SKILL.md +44 -0
- package/standards/engineering/01-import-order.md +46 -0
- package/standards/engineering/02-naming.md +54 -0
- package/standards/engineering/03-scss-structure.md +59 -0
- package/standards/ui/01-table.md +111 -0
- package/standards/ui/02-button.md +83 -0
- package/standards/ui/03-form.md +118 -0
- package/standards/ui/04-tag-status.md +110 -0
- package/standards/ui/05-dialog-pagination.md +118 -0
- package/styles/element/_card.scss +26 -0
- package/styles/element/_descriptions.scss +22 -0
- package/styles/element/_dialog.scss +43 -0
- package/styles/element/_drawer.scss +22 -0
- package/styles/element/_feedback.scss +52 -0
- package/styles/element/_form.scss +22 -0
- package/styles/element/_navigation.scss +36 -0
- package/styles/element/_overlay.scss +32 -0
- package/styles/element/_pagination.scss +16 -0
- package/styles/element/_steps.scss +32 -0
- package/styles/element/_table.scss +13 -0
- package/styles/element/_tabs.scss +40 -0
- package/styles/element/_tree.scss +27 -0
- package/styles/element/_upload.scss +34 -0
- package/styles/element/index.scss +17 -0
- package/styles/index.scss +21 -0
- package/styles/layouts/_detail-page.scss +27 -0
- package/styles/layouts/_form-dialog.scss +19 -0
- package/styles/layouts/_list-page.scss +47 -0
- package/styles/layouts/_tree-list.scss +33 -0
- package/styles/layouts/index.scss +6 -0
- package/styles/presets/element-only.scss +6 -0
- package/styles/presets/full.scss +12 -0
- package/styles/presets/security.scss +37 -0
- package/styles/presets/skin.scss +14 -0
- package/styles/presets/tokens-only.scss +7 -0
- package/styles/tokens/index.scss +79 -0
- package/styles/vendors/_ag-grid.scss +273 -0
- package/styles/vendors/_base-components.scss +480 -0
- package/styles/vendors/_base-query-toolbar.scss +253 -0
- package/styles/vendors/_base-table.scss +41 -0
- package/styles/vendors/_c-components.scss +34 -0
- package/styles/vendors/_custom-wrappers.scss +30 -0
- package/styles/vendors/_jh-drag-col.scss +63 -0
- package/styles/vendors/_jh-pagination.scss +81 -0
- package/styles/vendors/_jh-tree.scss +196 -0
- package/styles/vendors/_portal.scss +114 -0
- package/styles/vendors/index.scss +17 -0
- package/templates/ag-grid-page/TPL-AG-GRID.md +76 -0
- package/templates/form-dialog/TPL-FORM-DIALOG.md +165 -0
- package/templates/list-page/TPL-LIST.md +139 -0
- package/templates/tree-list/TPL-TREE-LIST.md +176 -0
- package/templates/ui-optimization-report/TPL-UI-OPTIM-REPORT.md +343 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# TPL-LIST — 标准列表页模板
|
|
2
|
+
|
|
3
|
+
> 适用:带搜索区 + 工具栏 + 表格 + 分页的标准后台管理列表页。
|
|
4
|
+
|
|
5
|
+
> 与 `wl-skills-kit` 协同说明:本模板是 `wk-skills-ui` 面向通用项目的 UI 示例,保留对纯 Element Plus、老旧封装和非 kit 项目的参考价值。若项目选择使用 `wl-skills-kit` 生成或规范化重构页面,则页面结构以 kit 的 `page-codegen/templates/universal/TPL-LIST.md` 为准;`wk-skills-ui` 继续负责 tokens/styles、化妆层、`defineColumns()`、`renderOps()` 等 UI 能力。
|
|
6
|
+
|
|
7
|
+
## 文件结构
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
src/views/[模块]/
|
|
11
|
+
[Module]List.vue # 页面主组件
|
|
12
|
+
components/
|
|
13
|
+
[Module]Modal.vue # 新增/编辑弹窗(见 form-dialog 模板)
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## 模板代码
|
|
17
|
+
|
|
18
|
+
```vue
|
|
19
|
+
<template>
|
|
20
|
+
<div class="page-container">
|
|
21
|
+
<!-- 搜索区 -->
|
|
22
|
+
<div class="search-bar">
|
|
23
|
+
<el-form :model="searchForm" inline>
|
|
24
|
+
<el-form-item label="名称">
|
|
25
|
+
<el-input
|
|
26
|
+
size="small"
|
|
27
|
+
v-model="searchForm.name"
|
|
28
|
+
placeholder="请输入"
|
|
29
|
+
clearable
|
|
30
|
+
/>
|
|
31
|
+
</el-form-item>
|
|
32
|
+
<el-form-item label="状态">
|
|
33
|
+
<el-select
|
|
34
|
+
size="small"
|
|
35
|
+
v-model="searchForm.status"
|
|
36
|
+
placeholder="请选择"
|
|
37
|
+
clearable
|
|
38
|
+
>
|
|
39
|
+
<el-option label="启用" :value="1" />
|
|
40
|
+
<el-option label="停用" :value="0" />
|
|
41
|
+
</el-select>
|
|
42
|
+
</el-form-item>
|
|
43
|
+
<el-form-item>
|
|
44
|
+
<el-button type="primary" icon="Search" @click="handleSearch"
|
|
45
|
+
>搜索</el-button
|
|
46
|
+
>
|
|
47
|
+
<el-button icon="Refresh" @click="handleReset">重置</el-button>
|
|
48
|
+
</el-form-item>
|
|
49
|
+
</el-form>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<!-- 工具栏 -->
|
|
53
|
+
<div class="toolbar">
|
|
54
|
+
<el-button type="primary" icon="Plus" @click="modal.add()"
|
|
55
|
+
>新增</el-button
|
|
56
|
+
>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<!-- 表格 -->
|
|
60
|
+
<BaseTable :hook="page" empty-text="暂无数据" :columns="columnsDef()" />
|
|
61
|
+
|
|
62
|
+
<!-- 分页 -->
|
|
63
|
+
<el-pagination
|
|
64
|
+
v-model:current-page="page.current"
|
|
65
|
+
v-model:page-size="page.size"
|
|
66
|
+
:total="page.total"
|
|
67
|
+
:page-sizes="[20, 50, 100]"
|
|
68
|
+
layout="total, sizes, prev, pager, next, jumper"
|
|
69
|
+
@current-change="page.load"
|
|
70
|
+
@size-change="page.load"
|
|
71
|
+
/>
|
|
72
|
+
|
|
73
|
+
<!-- 弹窗 -->
|
|
74
|
+
<ModuleModal ref="modal" @success="page.load" />
|
|
75
|
+
</div>
|
|
76
|
+
</template>
|
|
77
|
+
|
|
78
|
+
<script setup lang="ts">
|
|
79
|
+
import { ref, reactive } from "vue";
|
|
80
|
+
import { defineColumns, renderOps } from "@agile-team/wk-skills-ui/runtime";
|
|
81
|
+
import { usePageHook } from "@/composables/usePageHook";
|
|
82
|
+
import ModuleModal from "./components/ModuleModal.vue";
|
|
83
|
+
import { getModuleList } from "@/api/module";
|
|
84
|
+
|
|
85
|
+
// ── 搜索表单 ─────────────────────────────────────────────────────────────────
|
|
86
|
+
const searchForm = reactive({ name: "", status: undefined });
|
|
87
|
+
|
|
88
|
+
// ── 分页 Hook ─────────────────────────────────────────────────────────────────
|
|
89
|
+
const page = usePageHook({
|
|
90
|
+
apiFn: getModuleList,
|
|
91
|
+
params: () => ({ ...searchForm }),
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
const handleSearch = () => page.load(1);
|
|
95
|
+
const handleReset = () => {
|
|
96
|
+
Object.assign(searchForm, { name: "", status: undefined });
|
|
97
|
+
page.load(1);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
// ── 弹窗引用 ──────────────────────────────────────────────────────────────────
|
|
101
|
+
const modal = ref();
|
|
102
|
+
|
|
103
|
+
// ── 列定义 ────────────────────────────────────────────────────────────────────
|
|
104
|
+
function columnsDef() {
|
|
105
|
+
return defineColumns([
|
|
106
|
+
{ type: "index", label: "序号", width: 60, align: "center" },
|
|
107
|
+
{ name: "name", label: "名称", minWidth: 120 },
|
|
108
|
+
{ name: "status", label: "状态", width: 80 }, // enableStatus 已自动映射
|
|
109
|
+
{ name: "remark", label: "备注", minWidth: 160 },
|
|
110
|
+
{
|
|
111
|
+
label: "操作",
|
|
112
|
+
width: 120,
|
|
113
|
+
fixed: "right",
|
|
114
|
+
align: "center",
|
|
115
|
+
defaultSlot: ({ row }) =>
|
|
116
|
+
renderOps([
|
|
117
|
+
{ type: "view", onClick: () => modal.value.view(row.id) },
|
|
118
|
+
{ type: "edit", onClick: () => modal.value.edit(row.id) },
|
|
119
|
+
{ type: "del", onClick: () => handleDel(row.id) },
|
|
120
|
+
]),
|
|
121
|
+
},
|
|
122
|
+
]);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// ── 删除 ──────────────────────────────────────────────────────────────────────
|
|
126
|
+
async function handleDel(id: string) {
|
|
127
|
+
await ElMessageBox.confirm("确定删除该记录?", "提示", { type: "warning" });
|
|
128
|
+
// await deleteModule(id);
|
|
129
|
+
page.load();
|
|
130
|
+
}
|
|
131
|
+
</script>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## 注意事项
|
|
135
|
+
|
|
136
|
+
1. `BaseTable` 需替换为项目实际使用的表格组件
|
|
137
|
+
2. `usePageHook` 需替换为项目实际的分页 Hook
|
|
138
|
+
3. `enableStatus` 字段在 `installCommonPreset()` 后自动渲染为彩色 Tag,无需手写 defaultNode
|
|
139
|
+
4. 工具栏按钮必须带 `icon`(R005 规则)
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# TPL-TREE-LIST — 左树右表布局模板
|
|
2
|
+
|
|
3
|
+
> 适用:左侧组织树 + 右侧数据列表的经典后台管理布局。
|
|
4
|
+
|
|
5
|
+
> 与 `wl-skills-kit` 协同说明:本模板是 `wk-skills-ui` 面向通用项目的 UI 示例,保留对纯 Element Plus、老旧封装和非 kit 项目的参考价值。若项目选择使用 `wl-skills-kit` 生成或规范化重构页面,则页面结构以 kit 的 `page-codegen/templates/universal/TPL-TREE-LIST.md` 为准;`wk-skills-ui` 继续负责 tokens/styles、化妆层、`defineColumns()`、`renderOps()` 等 UI 能力。
|
|
6
|
+
|
|
7
|
+
## 布局结构
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
.tree-list-container
|
|
11
|
+
├── .tree-panel 左侧树(固定宽度 240px)
|
|
12
|
+
└── .list-panel 右侧列表(自适应)
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 模板代码
|
|
16
|
+
|
|
17
|
+
```vue
|
|
18
|
+
<template>
|
|
19
|
+
<div class="tree-list-container">
|
|
20
|
+
<!-- 左侧树 -->
|
|
21
|
+
<div class="tree-panel">
|
|
22
|
+
<div class="tree-search">
|
|
23
|
+
<el-input
|
|
24
|
+
size="small"
|
|
25
|
+
v-model="treeKeyword"
|
|
26
|
+
placeholder="搜索"
|
|
27
|
+
prefix-icon="Search"
|
|
28
|
+
clearable
|
|
29
|
+
/>
|
|
30
|
+
</div>
|
|
31
|
+
<el-scrollbar height="calc(100vh - 160px)">
|
|
32
|
+
<el-tree
|
|
33
|
+
ref="treeRef"
|
|
34
|
+
:data="treeData"
|
|
35
|
+
:props="{ label: 'name', children: 'children' }"
|
|
36
|
+
:filter-node-method="filterNode"
|
|
37
|
+
node-key="id"
|
|
38
|
+
highlight-current
|
|
39
|
+
@node-click="handleNodeClick"
|
|
40
|
+
/>
|
|
41
|
+
</el-scrollbar>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<!-- 右侧列表 -->
|
|
45
|
+
<div class="list-panel">
|
|
46
|
+
<!-- 搜索区 -->
|
|
47
|
+
<div class="search-bar">
|
|
48
|
+
<el-form :model="searchForm" inline>
|
|
49
|
+
<el-form-item label="名称">
|
|
50
|
+
<el-input
|
|
51
|
+
size="small"
|
|
52
|
+
v-model="searchForm.name"
|
|
53
|
+
placeholder="请输入"
|
|
54
|
+
clearable
|
|
55
|
+
/>
|
|
56
|
+
</el-form-item>
|
|
57
|
+
<el-form-item>
|
|
58
|
+
<el-button type="primary" icon="Search" @click="handleSearch"
|
|
59
|
+
>搜索</el-button
|
|
60
|
+
>
|
|
61
|
+
<el-button icon="Refresh" @click="handleReset">重置</el-button>
|
|
62
|
+
</el-form-item>
|
|
63
|
+
</el-form>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<!-- 工具栏 -->
|
|
67
|
+
<div class="toolbar">
|
|
68
|
+
<el-button
|
|
69
|
+
type="primary"
|
|
70
|
+
icon="Plus"
|
|
71
|
+
:disabled="!selectedNodeId"
|
|
72
|
+
@click="modal.add()"
|
|
73
|
+
>
|
|
74
|
+
新增
|
|
75
|
+
</el-button>
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
<!-- 表格 -->
|
|
79
|
+
<BaseTable :hook="page" empty-text="暂无数据" :columns="columnsDef()" />
|
|
80
|
+
|
|
81
|
+
<!-- 分页 -->
|
|
82
|
+
<el-pagination
|
|
83
|
+
v-model:current-page="page.current"
|
|
84
|
+
v-model:page-size="page.size"
|
|
85
|
+
:total="page.total"
|
|
86
|
+
layout="total, sizes, prev, pager, next"
|
|
87
|
+
@current-change="page.load"
|
|
88
|
+
@size-change="page.load"
|
|
89
|
+
/>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
<ModuleModal ref="modal" @success="page.load" />
|
|
94
|
+
</template>
|
|
95
|
+
|
|
96
|
+
<script setup lang="ts">
|
|
97
|
+
import { ref, reactive, watch } from "vue";
|
|
98
|
+
import { defineColumns, renderOps } from "@agile-team/wk-skills-ui/runtime";
|
|
99
|
+
|
|
100
|
+
const treeRef = ref();
|
|
101
|
+
const treeKeyword = ref("");
|
|
102
|
+
const selectedNodeId = ref<string>("");
|
|
103
|
+
const treeData = ref([]);
|
|
104
|
+
|
|
105
|
+
// 树节点过滤
|
|
106
|
+
watch(treeKeyword, (val) => treeRef.value?.filter(val));
|
|
107
|
+
function filterNode(value: string, data: any) {
|
|
108
|
+
if (!value) return true;
|
|
109
|
+
return data.name?.includes(value);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function handleNodeClick(node: any) {
|
|
113
|
+
selectedNodeId.value = node.id;
|
|
114
|
+
page.load(1);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// 列表逻辑...
|
|
118
|
+
const searchForm = reactive({ name: "" });
|
|
119
|
+
const page = usePageHook({
|
|
120
|
+
apiFn: getList,
|
|
121
|
+
params: () => ({ ...searchForm, nodeId: selectedNodeId.value }),
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
function handleSearch() {
|
|
125
|
+
page.load(1);
|
|
126
|
+
}
|
|
127
|
+
function handleReset() {
|
|
128
|
+
searchForm.name = "";
|
|
129
|
+
page.load(1);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const modal = ref();
|
|
133
|
+
|
|
134
|
+
function columnsDef() {
|
|
135
|
+
return defineColumns([
|
|
136
|
+
{ type: "index", label: "序号", width: 60, align: "center" },
|
|
137
|
+
{ name: "name", label: "名称", minWidth: 150 },
|
|
138
|
+
{
|
|
139
|
+
label: "操作",
|
|
140
|
+
width: 100,
|
|
141
|
+
fixed: "right",
|
|
142
|
+
align: "center",
|
|
143
|
+
defaultSlot: ({ row }) =>
|
|
144
|
+
renderOps([
|
|
145
|
+
{ type: "edit", onClick: () => modal.value.edit(row.id) },
|
|
146
|
+
{ type: "del", onClick: () => handleDel(row.id) },
|
|
147
|
+
]),
|
|
148
|
+
},
|
|
149
|
+
]);
|
|
150
|
+
}
|
|
151
|
+
</script>
|
|
152
|
+
|
|
153
|
+
<style lang="scss" scoped>
|
|
154
|
+
// 注意:.tree-list-container 的 flex 布局已由 wk-skills-ui/styles/shared/_layout.scss 提供
|
|
155
|
+
// 只需保证 class 名一致,样式自动生效
|
|
156
|
+
.tree-list-container {
|
|
157
|
+
display: flex;
|
|
158
|
+
height: 100%;
|
|
159
|
+
gap: 12px;
|
|
160
|
+
}
|
|
161
|
+
.tree-panel {
|
|
162
|
+
width: 240px;
|
|
163
|
+
flex-shrink: 0;
|
|
164
|
+
}
|
|
165
|
+
.list-panel {
|
|
166
|
+
flex: 1;
|
|
167
|
+
overflow: hidden;
|
|
168
|
+
}
|
|
169
|
+
</style>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## 注意事项
|
|
173
|
+
|
|
174
|
+
1. `_layout.scss` 提供了 `.tree-list-container` 等基础 flex 布局,无需重复定义
|
|
175
|
+
2. 左侧树点击时重置分页到第 1 页
|
|
176
|
+
3. 工具栏新增按钮在未选中树节点时禁用(防止无效数据关联)
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
# [项目名称] UI 风格优化记录报告
|
|
2
|
+
|
|
3
|
+
**项目**:[项目名称]([业务描述]子应用)
|
|
4
|
+
**技术栈**:Vue 3 + Vite + TypeScript + Element Plus + AG Grid + jh-ui 定制库
|
|
5
|
+
**关联仓库**:[关联仓库名称]
|
|
6
|
+
**报告周期**:[时间范围]
|
|
7
|
+
**整理时间**:[完成日期]
|
|
8
|
+
**报告对象**:项目经理、技术负责人、部门负责人
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 一、总体说明
|
|
13
|
+
|
|
14
|
+
> 说明本次优化的背景、触发原因、整体目标和原则。
|
|
15
|
+
|
|
16
|
+
本次 UI 风格优化的背景是:[项目] 系统历史页面由多名开发人员分批次迭代完成,各模块在控件规格、表格渲染、操作按钮形式、颜色使用等方面存在明显不一致,导致用户使用时体感割裂、视觉混乱。
|
|
17
|
+
|
|
18
|
+
本次优化以**"不改业务逻辑、只统一视觉与交互规范"**为原则,基于 `wk-skills-ui` 规范工具库,在 [项目] 全量落地。
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 二、UI 设计架构
|
|
23
|
+
|
|
24
|
+
### 2.1 设计定位
|
|
25
|
+
|
|
26
|
+
本项目采用 **Stripe 精致 × Linear 密度** 融合风格:高密度(`size=small`、`margin-bottom:8px`)、精致感(圆角 6–12px、微阴影、hover/focus 过渡)、一致性(所有颜色来自 CSS Token,主题色只需改一处全局生效)。
|
|
27
|
+
|
|
28
|
+
### 2.2 Token 体系(单一来源)
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
Token 入口:[Token 文件路径]
|
|
32
|
+
主色: var(--el-color-primary) = [颜色值]
|
|
33
|
+
成功: var(--el-color-success) = [颜色值]
|
|
34
|
+
警告: var(--el-color-warning) = [颜色值]
|
|
35
|
+
危险: var(--el-color-danger) = [颜色值]
|
|
36
|
+
文字一级: var(--el-text-color-primary)
|
|
37
|
+
文字二级: var(--el-text-color-regular)
|
|
38
|
+
文字三级: var(--el-text-color-secondary)
|
|
39
|
+
边框: var(--el-border-color)
|
|
40
|
+
背景浅: var(--el-fill-color-lighter)
|
|
41
|
+
背景卡: var(--el-bg-color)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
> ⚠️ 禁止在业务文件中硬编码任何 HEX/RGB 颜色
|
|
45
|
+
|
|
46
|
+
### 2.3 样式分层策略
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
wk-skills-ui presets/[preset].scss ← 第1层:Token 变量 + L1 element + L2 vendors(自动覆盖)
|
|
50
|
+
src/assets/style/element.scss ← 第2层:EP 控件局部补丁
|
|
51
|
+
src/assets/style/main.scss ← 第3层:全局共享组件样式
|
|
52
|
+
views/[module]/style/index.scss ← 第4层:模块级布局补丁(仅限布局,禁止硬编码颜色)
|
|
53
|
+
业务组件 <style scoped> ← 第5层:组件内布局,禁止硬编码颜色
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 2.4 覆盖优先级规则
|
|
57
|
+
|
|
58
|
+
| 场景 | 写法 |
|
|
59
|
+
|------|------|
|
|
60
|
+
| jh-ui 组件(用了 `html` 选择器) | `html .el-xxx { ... !important }` |
|
|
61
|
+
| Element Plus scoped 样式 | 全局文件用非 scoped 选择器 + `!important` |
|
|
62
|
+
| 业务组件内需穿透子组件 | `:deep(.el-xxx)` |
|
|
63
|
+
| 远程 Module Federation 组件 | CSS 变量注入(`--el-color-primary` 等) |
|
|
64
|
+
| jh-dialog footer 按钮 | `.el-dialog__footer .el-button`(无 wrapper class) |
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 三、总览数据
|
|
69
|
+
|
|
70
|
+
| 指标 | 数值 |
|
|
71
|
+
|------|------|
|
|
72
|
+
| 涉及业务模块数 | **[N] 个**([模块列表]) |
|
|
73
|
+
| 扫描 Vue 文件数 | **[N] 个** |
|
|
74
|
+
| 改造前发现风格问题 | **[N] 项** |
|
|
75
|
+
| 改造后剩余问题 | **[N] 项**(均为复杂嵌套组件,需人工处理) |
|
|
76
|
+
| **问题消除率** | **≈ [N]%** |
|
|
77
|
+
| 新增统一渲染函数 | **[N]+ 个**(状态/分类/编号/数值/警示五类) |
|
|
78
|
+
| 全量覆盖操作列渲染 | **[N] 处** `renderOps` 统一图标按钮 |
|
|
79
|
+
| 全量覆盖空状态文案 | **[N] 处** `empty-text="暂无数据"` |
|
|
80
|
+
| 编号列 renderBadge 覆盖 | **[N] 处** `renderBadge` 徽标渲染 |
|
|
81
|
+
| 统一表单标签宽度 | **[N] 个**表单组件 `labelWidth="[N]px"` |
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 四、已完成优化全量清单
|
|
86
|
+
|
|
87
|
+
### 4.1 全局 Token 基础
|
|
88
|
+
|
|
89
|
+
| # | 项目 | 文件 | 说明 |
|
|
90
|
+
|---|------|------|------|
|
|
91
|
+
| ✅ 0-1 | Token CSS 最先加载 | `index.html` | Token CSS 在所有样式之前加载 |
|
|
92
|
+
| ✅ 0-2 | 移除全局硬编码覆盖 | `views/[module]/style/index.scss` | 清除旧版颜色覆盖,内容已被新架构取代 |
|
|
93
|
+
| ✅ 0-3 | 接入 wk-skills-ui 预设 | `src/assets/style/main.scss` | `@use 'wk-skills-ui/styles/presets/[preset]'` |
|
|
94
|
+
| ✅ 0-4 | 运行时预设注入 | `src/main-core.ts` | `installCommonPreset() + install[Project]Preset()` |
|
|
95
|
+
|
|
96
|
+
### 4.2 全局样式层(wk-skills-ui 自动覆盖)
|
|
97
|
+
|
|
98
|
+
| # | 文件/层级 | 内容 |
|
|
99
|
+
|---|-----------|------|
|
|
100
|
+
| ✅ S-1 | `vendors/_ag-grid` | 表头样式、空数据占位、滚动条细化 |
|
|
101
|
+
| ✅ S-2 | `vendors/_base-components` | renderOps 图标按钮组;弹窗底部按钮 28px/6px圆角;MessageBox 按钮统一 |
|
|
102
|
+
| ✅ S-3 | `vendors/_jh-pagination` | 分页器精致化 |
|
|
103
|
+
| ✅ S-4 | `element/_dialog` | 弹窗全屏图标定位(right:44px)、headerbtn 对齐 |
|
|
104
|
+
| ✅ S-5 | `element/_form` | 表单间距 8px、输入框圆角 6px |
|
|
105
|
+
| ✅ S-6 | `element/_pagination` | 分页激活边框 Token 化 |
|
|
106
|
+
|
|
107
|
+
### 4.3 共享组件修改
|
|
108
|
+
|
|
109
|
+
| # | 组件 | 修改内容 |
|
|
110
|
+
|---|------|----------|
|
|
111
|
+
| ✅ C-1 | `FullScreenDialog/index.vue` | 全屏图标定位/尺寸对齐;底部按钮右对齐 |
|
|
112
|
+
| ✅ C-2 | `c_fullscreenDialog/index.vue` | jh-dialog 全屏按钮封装标准化 |
|
|
113
|
+
|
|
114
|
+
### 4.4 [业务模块1]([module-dir])
|
|
115
|
+
|
|
116
|
+
| # | 文件 | 修改内容 |
|
|
117
|
+
|---|------|----------|
|
|
118
|
+
| ✅ M1-1 | `xxx/index.vue` | [描述] |
|
|
119
|
+
|
|
120
|
+
> 按实际模块补充,每个业务模块一节,格式同上
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 五、分类优化明细
|
|
125
|
+
|
|
126
|
+
### 5.1 表格列对齐 — 视觉整齐度
|
|
127
|
+
|
|
128
|
+
> 对应规范:R001 / R014
|
|
129
|
+
|
|
130
|
+
| 优化项 | 改造前 | 改造后 | 涉及文件 |
|
|
131
|
+
|--------|--------|--------|----------|
|
|
132
|
+
| 普通数据列居中 | 缺少 `align="center"` | 所有列统一 `align="center"` | 全部 index/modal 页 |
|
|
133
|
+
| selection 多选框列 | 表头/数据行错位 | `width="55"` + `align="center"` + `header-align="center"` | [N] 处 |
|
|
134
|
+
| index 序号列宽度 | 40~50px | 统一 `width="60"` | 全部列表页 |
|
|
135
|
+
|
|
136
|
+
### 5.2 操作列按钮系统 — 统一图标化
|
|
137
|
+
|
|
138
|
+
> 对应规范:R004 / R013
|
|
139
|
+
|
|
140
|
+
| 优化项 | 改造前 | 改造后 |
|
|
141
|
+
|--------|--------|--------|
|
|
142
|
+
| 操作按钮形式 | 文字按钮,占 120~200px 列宽 | 26×26px 纯图标按钮,hover 变语义色 |
|
|
143
|
+
| 按钮间距 | 不统一 | `renderOps` 自动控制 gap:4px |
|
|
144
|
+
| 点击冒泡 | 部分触发全行选中 | 内部自动 `stopPropagation()` |
|
|
145
|
+
| 条件显示 | `disabled` 置灰仍占位 | `show:false` → `visibility:hidden` 对齐占位 |
|
|
146
|
+
| 胶囊按钮 | 无标准 | `type:'chip'`(短文字操作) |
|
|
147
|
+
| 文字链接 | 无标准 | `type:'link'`(业务专属长名称) |
|
|
148
|
+
|
|
149
|
+
### 5.3 编号列徽标 — 识别度提升
|
|
150
|
+
|
|
151
|
+
> 对应规范:R016(编号/Code/No 字段必须使用 `renderBadge`)
|
|
152
|
+
|
|
153
|
+
| 优化项 | 改造前 | 改造后 |
|
|
154
|
+
|--------|--------|--------|
|
|
155
|
+
| 编号字段展示 | 纯黑文字,与普通字段无视觉区分 | 蓝色圆角徽标(`.jh-riskno-badge`),等宽字体 |
|
|
156
|
+
| 覆盖字段 | [字段列表] | 全部补加 `defaultSlot: ({row}) => renderBadge(row.xxx)` |
|
|
157
|
+
|
|
158
|
+
**防漏规则**:字段名含 `Code / No / no / code` 或 label 含"编号"的列,必须在 `columnsDef` 中显式调用 `renderBadge`;`queryDef`(搜索表单)中不需要。
|
|
159
|
+
|
|
160
|
+
### 5.4 表格空状态文案 — 信息完整性
|
|
161
|
+
|
|
162
|
+
> 对应规范:R002 / R003
|
|
163
|
+
|
|
164
|
+
| 优化项 | 改造前 | 改造后 |
|
|
165
|
+
|--------|--------|--------|
|
|
166
|
+
| 空状态 | 英文"No Data"或空白 | 统一"暂无数据" |
|
|
167
|
+
|
|
168
|
+
**覆盖范围**:[N] 处。
|
|
169
|
+
|
|
170
|
+
### 5.5 表单控件规格统一 — 视觉密度一致
|
|
171
|
+
|
|
172
|
+
> 对应规范:R006 / R007 / R008
|
|
173
|
+
|
|
174
|
+
| 优化项 | 改造前 | 改造后 |
|
|
175
|
+
|--------|--------|--------|
|
|
176
|
+
| 输入框/下拉框尺寸 | 大小混用(32px + 28px) | 全部 `size="small"` (28px) |
|
|
177
|
+
| 日期选择器宽度 | 不撑满 | 统一 `style="width:100%"` |
|
|
178
|
+
| 表单标签宽度 | 80~130px 不等 | 统一 `labelWidth="[N]px"` |
|
|
179
|
+
|
|
180
|
+
### 5.6 枚举/状态列视觉化 — 信息层次感
|
|
181
|
+
|
|
182
|
+
> 对应规范:R009 / R010
|
|
183
|
+
|
|
184
|
+
#### 状态类(实心彩色 Tag)
|
|
185
|
+
| 字段 | 颜色含义 | 示例 |
|
|
186
|
+
|------|----------|------|
|
|
187
|
+
| [字段名] | 绿=启用 / 红=停用 | [页面] |
|
|
188
|
+
|
|
189
|
+
#### 分类/级别类(镂空 outline Tag,降低视觉权重)
|
|
190
|
+
| 字段 | 颜色含义 | 示例 |
|
|
191
|
+
|------|----------|------|
|
|
192
|
+
| [字段名] | [描述] | [页面] |
|
|
193
|
+
|
|
194
|
+
#### 编号类(`.jh-riskno-badge`)
|
|
195
|
+
适用于档案编号、设备编号、证件编号等,等宽字体 + 蓝色边框。
|
|
196
|
+
|
|
197
|
+
#### 数值类(`.jh-count-badge`)
|
|
198
|
+
适用于考核基数、评分、权重等数量型字段。
|
|
199
|
+
|
|
200
|
+
#### 警示文本类(`renderDangerText`)
|
|
201
|
+
适用于扣分依据、违规项等需醒目提示的文字列。
|
|
202
|
+
|
|
203
|
+
### 5.7 弹窗规范化
|
|
204
|
+
|
|
205
|
+
| 优化项 | 改造前 | 改造后 |
|
|
206
|
+
|--------|--------|--------|
|
|
207
|
+
| 全屏图标位置 | 偏位,与关闭按钮间距过大 | `position:absolute; right:44px; top:16px` |
|
|
208
|
+
| 全屏图标大小 | 过大,与关闭按钮不匹配 | `font-size:12px`,视觉对齐 |
|
|
209
|
+
| 底部按钮对齐 | 居中或混乱 | 统一 `justify-content: flex-end` |
|
|
210
|
+
| 底部按钮尺寸 | EP 默认 32px,偏胖 | **28px**,精致感与内容密度一致 |
|
|
211
|
+
| 底部按钮选择器 | `.dialog-footer .el-button`(漏掉 jh-dialog) | `.el-dialog__footer .el-button`(全面覆盖) |
|
|
212
|
+
| 分页位置 | 部分放在 `#footer` | 统一移至内容区 |
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 六、设计规范对照关系
|
|
217
|
+
|
|
218
|
+
| 优化项 | 对应设计规范条目 |
|
|
219
|
+
|--------|-----------------|
|
|
220
|
+
| 列居中 + selection 对齐 | R001 / R014 |
|
|
221
|
+
| 操作列图标按钮系统 | R004 / R013 |
|
|
222
|
+
| 空状态文案 | R002 / R003 |
|
|
223
|
+
| 控件 size=small | R006 |
|
|
224
|
+
| 日期选择器宽度 | R007 |
|
|
225
|
+
| 表单 labelWidth | R008 |
|
|
226
|
+
| 状态列彩色 Tag | R009 |
|
|
227
|
+
| 分类列 outline Tag | R010 |
|
|
228
|
+
| 分页布局 | R011 |
|
|
229
|
+
| 弹窗嵌套表格操作列 | R015 |
|
|
230
|
+
| **编号列 renderBadge** | **R016(编号徽标,本项目首次建立)** |
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## 七、改造前后对比说明
|
|
235
|
+
|
|
236
|
+
### 7.1 操作列
|
|
237
|
+
|
|
238
|
+
| | 改造前 | 改造后 |
|
|
239
|
+
|---|--------|--------|
|
|
240
|
+
| **外观** | 文字按钮,占 120~200px | 图标按钮,占 80~100px |
|
|
241
|
+
| **颜色** | 全蓝色链接 | 查看=蓝 hover,编辑=绿 hover,删除=红 hover |
|
|
242
|
+
| **条件显示** | 置灰仍占位 | `visibility:hidden` 对齐占位 |
|
|
243
|
+
| **一致性** | 各页面标签混用 | 全局统一图标语义 |
|
|
244
|
+
|
|
245
|
+
### 7.2 编号列
|
|
246
|
+
|
|
247
|
+
| | 改造前 | 改造后 |
|
|
248
|
+
|---|--------|--------|
|
|
249
|
+
| **外观** | 黑色纯文字 | 蓝色圆角徽标,等宽字体 |
|
|
250
|
+
| **识别度** | 与普通字段无区分 | 视觉即传达"这是一个标识码" |
|
|
251
|
+
|
|
252
|
+
### 7.3 状态字段
|
|
253
|
+
|
|
254
|
+
| | 改造前 | 改造后 |
|
|
255
|
+
|---|--------|--------|
|
|
256
|
+
| **外观** | 黑色纯文字 | 彩色实心 Tag |
|
|
257
|
+
| **感知速度** | 需逐字阅读 | 300ms 内颜色编码感知 |
|
|
258
|
+
| **风险项** | "已过期""已驳回"与正常无视觉区分 | 红色 Tag 醒目提示 |
|
|
259
|
+
|
|
260
|
+
### 7.4 表单弹窗
|
|
261
|
+
|
|
262
|
+
| | 改造前 | 改造后 |
|
|
263
|
+
|---|--------|--------|
|
|
264
|
+
| **控件高度** | 大小混用 | 全部 28px,视觉整洁 |
|
|
265
|
+
| **标签对齐** | 宽度不等,对齐紊乱 | 统一 [N]px,右对齐 |
|
|
266
|
+
| **底部按钮** | 默认 32px,偏胖 | 28px,精致匹配内容密度 |
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## 八、代码全量扫描 — 真实遗留问题清单([扫描日期])
|
|
271
|
+
|
|
272
|
+
> 以下为全量代码扫描后仍然存在的风格问题。原危险品牌色已全部消除。
|
|
273
|
+
|
|
274
|
+
### R-1 ⚠️ [问题描述]([N] 文件 / [N] 处)
|
|
275
|
+
|
|
276
|
+
| 文件 | 行号 | 说明 |
|
|
277
|
+
|------|------|------|
|
|
278
|
+
| `[path]` | [N] | [描述] |
|
|
279
|
+
|
|
280
|
+
**建议**:[修复方案],工作量约 [N] 分钟。
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
**P1 级残留汇总**:[R-N(时间), ...]。
|
|
285
|
+
**总额外工作量**:约 [N] 个工作日。
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## 九、尚未完成的项目及原因
|
|
290
|
+
|
|
291
|
+
| 未完成项 | 所在模块 | 原因 | 建议处理方式 |
|
|
292
|
+
|----------|----------|------|-------------|
|
|
293
|
+
| [描述] | [模块] | [原因] | 下一迭代处理,预计工作量 [N] |
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## 十、技术约束备忘
|
|
298
|
+
|
|
299
|
+
| 约束 | 说明 |
|
|
300
|
+
|------|------|
|
|
301
|
+
| `!important` | jh-ui 用 `html` 选择器(特异性极高),覆盖必须加 |
|
|
302
|
+
| scoped 无效 | 全局覆盖写全局文件,业务组件不写全局 CSS |
|
|
303
|
+
| Module Federation | 远程组件只能通过 CSS 变量影响,不能直接改源码 |
|
|
304
|
+
| jh-dialog footer 按钮 | 按钮直接在 `#footer` slot,无 `.dialog-footer` wrapper,需用 `.el-dialog__footer .el-button` |
|
|
305
|
+
| renderBadge 规则 | 字段名含 Code/No/编号 → 必须在 `columnsDef` 中显式调用 `renderBadge(row.xxx)` |
|
|
306
|
+
| queryDef 中不适用 | `queryDef` 是搜索表单,不是表格列,不需要 `defaultSlot` |
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## 十一、后续可继续深化的方向
|
|
311
|
+
|
|
312
|
+
### 11.1 修复已知残留色值(P1)
|
|
313
|
+
按第八节清单,集中修复剩余硬编码颜色。
|
|
314
|
+
|
|
315
|
+
### 11.2 扫描器 CI 集成(推荐)
|
|
316
|
+
将 `wk-skills-ui` 扫描器集成到 CI/CD 流水线,每次 PR 合并前自动扫描,有 error 级别问题则阻断合并。
|
|
317
|
+
|
|
318
|
+
### 11.3 其他业务系统推广
|
|
319
|
+
1. 复制 `reference/ag-cell-renders.ts` → 目标项目 `src/util/`
|
|
320
|
+
2. 运行扫描器获取问题清单
|
|
321
|
+
3. 按 SKILL.md 规范执行批量修复
|
|
322
|
+
|
|
323
|
+
预计其他项目扫描 + 批量修复工作量:**0.5~1 天**。
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## 十二、总结
|
|
328
|
+
|
|
329
|
+
| 维度 | 结论 |
|
|
330
|
+
|------|------|
|
|
331
|
+
| 问题消除率 | ≈[N]% |
|
|
332
|
+
| 视觉一致性 | 操作列、编号列、状态列、表单规格、空状态文案、弹窗按钮已全面统一 |
|
|
333
|
+
| 可维护性 | 建立 `ag-cell-renders.ts` + `wk-skills-ui` 工具链,新页面开箱即用 |
|
|
334
|
+
| 可推广性 | 规范文档(SKILL.md)已覆盖所有规则,其他项目可直接复用 |
|
|
335
|
+
| 剩余风险 | P1 级:[描述];P2–P3 级不影响主流程 |
|
|
336
|
+
|
|
337
|
+
> 本次改造遵循**"不改业务,只统一外观"**原则,所有修改均为视觉层和交互规范层,不涉及接口、数据处理、权限逻辑变更,改造风险极低。
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
_报告生成时间:[日期]_
|
|
342
|
+
_扫描工具:wk-skills-ui scanner + AI 代码全量扫描_
|
|
343
|
+
_执行人:[姓名]_
|