日期: 2026-08-08
状态: 设计已确认(方案 A)
选定方案: A — 单页上下分区、各自保存;菜单迁入「系统管理」;软隐藏 CRM 旧菜单
相关页面: 新 /#/system/approver-setting;旧 CRM 路由侧栏不可见
sys_menu、不强制清理旧 sys_role_menu。| 项 | 结论 |
|---|---|
| 保存方式 | 分区各自「重置 / 保存」 |
| 菜单位置 | 「系统管理」下 |
| 菜单名称 | 报价、合同审批人设置 |
| 旧菜单 | visible='0' 软隐藏;前端路由 isHide: true |
| 实现路径 | 方案 A — 新页面拼装两套现有表单逻辑 |
web-admin/src/views/system/approver-setting/index.vue # 新建:上下两 panel
web-admin/src/router/modules/sqxp.ts # 系统管理子路由 + 旧 CRM 路由隐藏
docs/sql/migrations/2026-08-08-merge-approver-setting-menu.sql
docs/web-admin-ui-pattern-index.md # 对照行更新(可选)
backend/app/api/crm_quote_routes.py # save 权限改为 system:approverSetting
backend/app/api/crm_contract_routes.py # 同上
| 项 | 约定 |
|---|---|
| 路由 | path approver-setting,component /system/approver-setting/index |
| 菜单 perms / menuCode | system:approverSetting |
| 布局 | page-container 内两个 section.panel,纵向排列,间距与现有多 panel 页一致 |
| 上 panel 标题 | 报价单审批人设置 |
| 下 panel 标题 | 合同审批人设置 |
| 用户下拉 | fetchUserOptions 只加载一次,两区共用 |
| API | 仍调用现有 quote/contract approver-setting get/save |
| UI | Fresh Mint;label-position="top";按钮带图标(RefreshLeft / Check) |
旧页 crm/quote/approver-setting、crm/contract/approver-setting 源码可保留(直链仍可用),侧栏不展示。
现网 save 接口守卫为:
crm:quote:approverSettingcrm:contract:approverSetting菜单合并后,若角色仅有新菜单 system:approverSetting,保存会 403。因此:
require_menu_code(...) 改为 system:approverSetting。require_admin_or_super_admin(不变)。sys_role_menu(幂等)。super_admin 仍放行,不依赖角色菜单。| 项 | 值 |
|---|---|
| 新菜单 id | SYS_APPROVER_SETTING(与 SYS_OPERLOG 风格一致) |
| parent_id | SYSM000000000000000000000000000001 |
| path | approver-setting |
| component | /system/approver-setting/index |
| perms | system:approverSetting |
| order_num | 9(操作日志之后) |
| 旧菜单 id | CRM3000000000000000000000000015、CRM3000000000000000000000000026 → visible='0' |
开发环境 VITE_ACCESS_MODE=frontend 时侧栏以 sqxp.ts 为准,须前后端一并生效。