11 KiB
shanxia2.0 Fresh Mint UI 对齐 — 总改造计划
基准:zkxw/web-admin(中科兴皖)
目标:shanxia2.0/web-admin(山峡化工)
日期:2026-06-29
客户要求:只改 UI,不影响功能;Portal 顶栏一级 + 左侧二三级菜单结构不变
一、背景与目标
两项目同源(Fresh Mint + Art Design Pro),shanxia 使用 Portal 布局(MenuTypeEnum.PORTAL),zkxw 使用 TOP_LEFT + ArtMixedMenu。交互与视觉应对齐 zkxw,壳层组件不同但 Token、内容区骨架一致。
视觉权威:docs/web-admin-ui-spec-fresh-mint.md
模式选型:docs/web-admin-ui-pattern-index.md(P01–P27)
二、改造边界(硬约束)
| 允许 | 禁止 |
|---|---|
全局 SCSS(assets/styles/core/*.scss) |
修改业务 <script> 逻辑 |
| Vue template 的 class / 属性 / 结构骨架 | 改 API、路由、权限、校验 |
| Portal 壳层样式微调(高度、颜色、WorkTab) | 替换 Portal 布局架构 |
| 从 zkxw 拷贝 Demo 模板页 | 整文件覆盖 app.scss |
| 文档与验收清单 | 跨端混色(web 勿用 #0a9f6d) |
shanxia 保留项(优于 zkxw,勿回退):
SystemViewDialog四列ViewKvGrid- Portal 顶栏 + 侧栏交互结构
三、进度总览
Step 0 基线文档与对照页 ✅ 已完成
Step 1 全局 SCSS + Portal 壳层 ✅ 已完成
Step 1b WorkTab 最多 10 个标签 ✅ 已完成
Step 2 分模块 class 补齐 ✅ 已完成
Step 3 bx/db 模块样式收敛 ✅ 2026-06-29
Step 4 Demo 模板页 + 路由 ✅ 已完成
Step 5 CRM 旧布局整页改造 ✅ 已完成
Step 6 详情/统计/看板页查漏 ✅ 2026-06-29
Step 7 全量回归与收尾 ✅ 2026-06-29
关联文档:
| 文档 | 用途 |
|---|---|
2026-06-29-fresh-mint-content-ui-step0-1.md |
Step 0/1 改动明细与回归清单 |
2026-06-29-fresh-mint-step2-module-plan.md |
Step 2 逐页勾选表(执行中更新) |
四、各 Step 详细说明
Step 0 — 基线文档 ✅
产出:对照页、功能回归清单、改造边界
对照页(每模块抽 1 页视觉 + 功能基准):
| 模块 | 路径 |
|---|---|
| 系统 | views/system/user/index.vue |
| CRM | views/crm/customer/index.vue |
| PL | views/pl/plan/index.vue |
| 报销 | views/bx/reimburse/apply/index.vue |
| 地磅 | views/db/weighing/index.vue |
Step 1 — 全局 SCSS + Portal 壳层 ✅
已改文件:
| 文件 | 要点 |
|---|---|
fresh-mint-tokens.scss |
--primary 别名、--mint-success-* |
el-light.scss / el-ui.scss |
success #059669、表头 muted、primary 色阶 |
app.scss |
筛选 label 11px、弹窗顶对齐、Portal 兜底 |
style.portal.scss |
顶栏 56px |
art-portal-header / art-portal-top-nav |
一级模块卡片样式 |
art-sidebar-menu/theme.scss |
选中绿底白字 |
art-work-tab/index.vue |
padding 对齐 |
未改:main.ts 的 ElTable border: true(与 zkxw 一致)
Step 1b — WorkTab 上限 ✅
文件:store/modules/worktab.ts
规则:MAX_OPEN_TABS = 10;新开前淘汰最早未固定 tab;全固定且满 10 则拒绝新开。
Step 2 — 分模块 class 补齐 ✅(基本完成)
原则:只改 template;不改 script。
单页检查清单(每改一页勾选):
h2.title-bar-heading(列表主标题竖条)- 筛选搜索/重置
:loading="loading" - 工具栏「已选 N 项」置前;批量操作带
<el-icon> - 状态/类型列
<el-tag size="small"> - 弹窗
dialog-form-layout+label-position="top" - 操作列
fixed="right",min-width ≥ 260px - 表格列用
min-width而非width
模块完成情况:
| 模块 | 页面数 | 状态 | 备注 |
|---|---|---|---|
| system | 14 | ✅ | tenant~workflow 全部完成 |
| CRM 列表 | 10 | ✅ | 见 Step 5 遗留 3 页 |
| bx | 12 | ✅ | 此前已对齐 |
| db | 4 | ✅ | plans/inventory/weighing/dashboard |
| PL | 17+ | ✅ | 含 freight 子 Panel |
Step 2 遗留(转入 Step 5/6):
| 路径 | 原因 |
|---|---|
crm/contract/template/index.vue |
旧 RuoYi app-container + el-card |
crm/contract/change/index.vue |
同上 |
crm/contract/approval/index.vue |
同上 |
crm/opportunity/kanban.vue |
旧布局 |
crm/opportunity/funnel.vue |
旧布局 |
crm/opportunity/statistics.vue |
旧布局 |
crm/contract/detail.vue / form.vue |
详情/表单页待抽查 |
Step 3 — bx / db 模块样式收敛 ✅(2026-06-29)
目标:减少页面私有 SCSS,统一走全局 Token + 模块入口。
| 序号 | 任务 | 文件 | 状态 |
|---|---|---|---|
| 3.1 | bx 样式审计 | src/styles/bx/index.scss |
✅ 删除 :root/独立 layout/与 app 重复规则,1936→955 行 |
| 3.2 | bx 附件样式 | src/styles/bx/attachment.scss |
✅ 硬编码色值改 --primary/--text 等 Token |
| 3.3 | db 样式审计 | src/styles/db-module.scss |
✅ 统一 --border/--text/--surface |
| 3.4 | 页面 scoped 清理 | views/bx/**/*.vue |
✅ reimburse/apply、payment、reimburse/approve |
| 3.5 | 页面 scoped 清理 | views/db/**/*.vue |
✅ 无 scoped/硬编码色(已确认) |
附带:fresh-mint-tokens.scss 补充 --text/--border/--danger 等 bx/db 语义别名,修复 bx 原 --text-muted: #1e293b 错误。
Step 4 — Demo 模板页 + 路由 ✅(2026-06-29)
| 序号 | 项 | 状态 |
|---|---|---|
| 4.1 | 工作台 /#/demo/console |
✅ |
| 4.2 | 标准列表 views/demo/unit/index.vue |
✅ |
| 4.3 | 复杂列表 views/demo/order/index.vue |
✅ |
| 4.4 | 商品 views/demo/product/index.vue |
✅ |
| 4.5 | 树形分类 views/demo/category/index.vue |
✅ |
| 4.6 | 用户 CRUD → /demo/user(复用 system/user) |
✅ |
| 4.7 | product-view-dialog 组件 |
✅ |
| 4.8 | 路由 router/modules/demo.ts |
✅ |
| 4.9 | Mock API api/demo/*(无后端) |
✅ |
说明:Demo 数据走 src/api/demo/mock-api.ts 内存 Mock;侧栏「Demo」菜单在 VITE_ACCESS_MODE=frontend 下自动可见。
Step 5 — CRM 旧布局整页改造 ✅(2026-06-29)
| 页面 | 路径 | 状态 |
|---|---|---|
| 合同模板 | views/crm/contract/template/index.vue |
✅ |
| 合同审批记录 | views/crm/contract/approval/index.vue |
✅ |
| 合同变更 | views/crm/contract/change/index.vue |
✅ |
改造要点:page-container 骨架、Fresh Mint 筛选/工具栏/表格/分页、弹窗 dialog-form-layout、状态 el-tag、按钮带图标与 loading;业务逻辑与权限保持不变。
Step 6 — 详情 / 统计 / 看板页查漏 ✅(2026-06-29)
| 类型 | 页面 | 状态 |
|---|---|---|
| 看板 | crm/opportunity/kanban.vue |
✅ Fresh Mint 筛选 + 看板 Token |
| 漏斗 | crm/opportunity/funnel.vue |
✅ stat-grid + chart-panel + 薄荷色 ECharts |
| 统计 | crm/opportunity/statistics.vue |
✅ 对齐 clue/statistics 骨架 |
| 详情 | crm/contract/detail.vue |
✅ panel-top + detail-toolbar 外壳 |
| 表单 | crm/contract/form.vue |
✅ panel-top 外壳 |
| 报价 | crm/quote/detail.vue、form.vue |
✅ 已是 Mint(Step 2 前已改造) |
| PL | pl/plan/detail.vue、form.vue |
✅ 已是 Mint(无需改动) |
Step 7 — 全量回归与收尾 ✅(2026-06-29)
| 序号 | 任务 | 状态 |
|---|---|---|
| 7.1 | 功能回归清单(见第六节) | ✅ 代码审查 + 模块抽测路径已列 |
| 7.2 | 浏览器抽测 1366 / 1920 / 窄屏 | ⬜ 需人工在浏览器完成(见下表) |
| 7.3 | pnpm build |
✅ 通过(修复 category-path-display → @/api/demo 导入) |
| 7.4 | step2-module-plan.md |
✅ 各模块均已 ✅ |
| 7.5 | ./scripts/update-graph.sh all |
✅ |
| 7.6 | OpenSpec 归档 | ⬜ 可选,未执行 |
构建修复:utils/category-path-display.ts 原从 @/api/admin 导入 Demo 专用 fetchCategoryList(Step 4 已迁至 api/demo),导致 Vite build 失败;已改为 @/api/demo。
ESLint:pnpm lint 仍有大量历史 Prettier/未使用变量告警(非本次 Fresh Mint 引入);pnpm build 为发布门禁,已通过。
建议浏览器抽测路径(每模块 1 页):
| 模块 | Hash 路由 | 验证点 |
|---|---|---|
| Demo | /#/demo/unit |
列表 CRUD、弹窗两列、分页 |
| system | /#/demo/user |
多选、批量删除、权限按钮 |
| CRM | /#/crm/customer |
筛选 loading、Tag 状态 |
| CRM 看板 | /#/crm/opportunity/kanban |
看板滚动、卡片操作 |
| bx | /#/bx/expense-item |
stats + 列表 + 弹窗 |
| db | /#/db/weighing |
日期快捷、表格 |
| PL | /#/pl/plan |
工具栏、操作列 fixed |
| WorkTab | 任意模块连开 11 页 | 最早未固定 tab 自动关闭 |
五、推荐执行顺序(给后续会话)
按风险低 → 价值高排列,每次会话完成 1~2 个 Step 或一个批次:
已完成 Step 0 → Step 1 → Step 1b → Step 2(列表页)
下一步 Step 4(Demo 模板,利于后续新页开发)
然后 Step 5.1 → 5.2 → 5.3(CRM 三页)
并行 Step 3(bx/db SCSS,可与 Step 5 交错)
随后 Step 6(看板/统计/详情)
最后 Step 7(全量回归)
单次会话建议粒度:
- 小:1 个 index.vue 的 Step 2 清单项
- 中:Step 5 中 1 个整页改造 + 回归
- 大:Step 4 全部 Demo 页(建议拆 2 次)
六、功能回归清单(每模块至少 1 页)
改造后必测(Step 7 代码审查已覆盖结构;浏览器勾选由人工完成):
- 列表:查询、重置、分页、排序、多选(各模块模板页已对齐)
- 新增/编辑:弹窗
dialog-form-layout、按钮图标(Step 2/5/6) - 删除/批量:确认框 + 创建人限制工具(
creator-delete已接入) - 查看详情:Tag 语义色(OpenSpec ui-conventions)
- 权限:
hasPermi/hasContractPerm等业务守卫保留 - WorkTab:
MAX_OPEN_TABS = 10(store/modules/worktab.ts) - 浏览器实机:1366 / 1920 / 窄屏弹窗单列降级
七、风险与注意事项
- 勿整文件覆盖
app.scss:shanxia 含 bx/db/Portal 专用段落,仅 cherry-pick。 - creator-delete 合并:批量删除注意
handleDelete函数体{勿漏(曾出现语法错误)。 - 双 loading 变量:bx 部分页用
searchLoading/pendingLoading,保持一致即可。 - CRM 合同子页:改造时保留
hasContractPerm权限判断。 - graphify:改 Vue/SCSS 后执行
./scripts/update-graph.sh frontend。
八、快速命令
# 前端开发
cd web-admin && pnpm dev
# 构建验证
cd web-admin && pnpm build
# 更新知识图谱
cd /Users/zlwu/work/00code/shanxia2.0 && ./scripts/update-graph.sh frontend
# 对照 zkxw 同路径文件
diff web-admin/src/views/pl/plan/index.vue ../zkxw/web-admin/src/views/pl/plan/index.vue
九、变更记录
| 日期 | 内容 |
|---|---|
| 2026-06-29 | Step 7:pnpm build 通过;graphify all;修复 category-path-display 导入 |
| 2026-06-29 | Step 2 system/CRM/bx/db/PL 列表页 class 补齐 |