fix(menu): modId 契约全量对齐后端 /base/GetUserMod,解 /approval 与 /list/detail 撞车
build / build (push) Successful in 2m41s

- routes.ts:已收到1000/已发送2000/全部通知3000/通知统计4000/应用设置5000;
  深层页按 UserBase 范式编码 20001/20002/30001;/approval 独立 2100
  (原与通知详情同为 23,ROUTE_BY_MODID 取先注册者 → 待审核会被误解析到通知详情)。
- config/menu.ts、mock GetUserMod:id/modId 同步对齐。
- 不动 NoticeApproval.vue 主题改动;/cc 维持 25(与平台一致,未纳入本次对齐)。
This commit is contained in:
chenxing
2026-09-24 14:22:11 +08:00
parent 21a0bd36b6
commit 693aba9968
3 changed files with 30 additions and 26 deletions
+6 -5
View File
@@ -6,11 +6,12 @@ import type { IModule } from "@/store";
*/ */
export function getMenuList(): Promise<IModule[]> { export function getMenuList(): Promise<IModule[]> {
const menu: IModule[] = [ const menu: IModule[] = [
{ id: 1, modId: 1, name: "已收到", page: "/" }, { id: 1000, modId: 1000, name: "已收到", page: "/" },
{ id: 2, modId: 2, name: "已发送", page: "/list" }, { id: 2000, modId: 2000, name: "已发送", page: "/list" },
{ id: 3, modId: 3, name: "全部通知", page: "/noticelist" }, { id: 3000, modId: 3000, name: "全部通知", page: "/noticelist" },
{ id: 4, modId: 4, name: "通知统计", page: "/stats" }, { id: 2100, modId: 2100, name: "待审核", page: "/approval" },
{ id: 21, modId: 21, name: "应用设置", page: "/setting" }, { id: 4000, modId: 4000, name: "通知统计", page: "/stats" },
{ id: 5000, modId: 5000, name: "应用设置", page: "/setting" },
]; ];
return Promise.resolve(menu); return Promise.resolve(menu);
} }
+8 -7
View File
@@ -298,13 +298,14 @@ export default [
method: "get", method: "get",
response: () => response: () =>
ok([ ok([
// icon:用户中心模块管理配置的 YschIcons 图标名,layout 渲染为 iconfont icon-<名称> // id/modId 对齐平台模块管理的「配置 ID」(对照 /base/GetUserMod 现行数据);
{ id: 1, modId: 1, name: "已收到", parentId: 0, page: "/", icon: "sjx", orderNumber: 1, usable: true, children: [] }, // icon:YschIcons 图标名,layout 渲染为 iconfont icon-<名称>
{ id: 2, modId: 2, name: "已发送", parentId: 0, page: "/list", icon: "fasong", orderNumber: 2, usable: true, children: [] }, { id: 1000, modId: 1000, name: "已收到", parentId: 0, page: "/", icon: "sjx", orderNumber: 1, usable: true, children: [] },
{ id: 3, modId: 3, name: "全部通知", parentId: 0, page: "/noticelist", icon: "liebiao", orderNumber: 3, usable: true, children: [] }, { id: 2000, modId: 2000, name: "已发送", parentId: 0, page: "/list", icon: "fasong", orderNumber: 2, usable: true, children: [] },
{ id: 4, modId: 4, name: "通知统计", parentId: 0, page: "/stats", icon: "tongji", orderNumber: 4, usable: true, children: [] }, { id: 3000, modId: 3000, name: "全部通知", parentId: 0, page: "/noticelist", icon: "liebiao", orderNumber: 3, usable: true, children: [] },
{ id: 23, modId: 23, name: "待审核", parentId: 0, page: "/approval", icon: "shenpi", orderNumber: 5, usable: true, children: [] }, { id: 2100, modId: 2100, name: "待审核", parentId: 0, page: "/approval", icon: "shenpi", orderNumber: 4, usable: true, children: [] },
{ id: 21, modId: 21, name: "应用设置", parentId: 0, page: "/setting", icon: "shezhi", orderNumber: 6, usable: true, children: [] }, { id: 4000, modId: 4000, name: "通知统计", parentId: 0, page: "/stats", icon: "tongji", orderNumber: 5, usable: true, children: [] },
{ id: 5000, modId: 5000, name: "应用设置", parentId: 0, page: "/setting", icon: "shezhi", orderNumber: 6, usable: true, children: [] },
]), ]),
}, },
{ {
+16 -14
View File
@@ -9,10 +9,12 @@ import type { RouteRecordRaw } from "vue-router";
* - /list/detail?serid=&type=、/noticelist/detail?serid=&type= * - /list/detail?serid=&type=、/noticelist/detail?serid=&type=
* type: 0=编辑视角(不标读) 1=普通查看(标读) * type: 0=编辑视角(不标读) 1=普通查看(标读)
* *
* modId 是菜单 ↔ 路由的稳定契约(对照后端 GetUserMod 现行数据): * modId 是菜单 ↔ 路由的稳定契约(对照后端 /base/GetUserMod 现行数据,即用户中心
* 1=已收到 2=已发送 3=全部通知 4=通知统计 21=应用设置 * 模块管理里的配置 ID):
* 发通知为「已发送」的深层子页(modId 22 不在菜单树,meta.parentId=2 关联高亮), * 1000=已收到 2000=已发送 3000=全部通知 2100=待审核 4000=通知统计 5000=应用设置
* 与 UserBase「应用管理>应用类型管理」范式一致。 * 深层子页不在菜单树,编码沿用 UserBase 范式「父模块 ×10 + 序号」并靠 meta.parentId
* 关联高亮:/list/new=20001、/list/detail=20002(父 2000),/noticelist/detail=30001(父 3000)。
* 深层页编码不得与任何平台一级模块 ID 重复。
*/ */
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
// 已收通知(收件箱):后端菜单 page 配置为 "/",即应用入口页 // 已收通知(收件箱):后端菜单 page 配置为 "/",即应用入口页
@@ -20,14 +22,14 @@ const routes: RouteRecordRaw[] = [
path: "/", path: "/",
name: "notice_accept", name: "notice_accept",
component: () => import("@/views/notice/NoticeAccept.vue"), component: () => import("@/views/notice/NoticeAccept.vue"),
meta: { title: "已收到", modId: 1 }, meta: { title: "已收到", modId: 1000 },
}, },
// 已发送 // 已发送
{ {
path: "/list", path: "/list",
name: "notice_list", name: "notice_list",
component: () => import("@/views/notice/NoticeList.vue"), component: () => import("@/views/notice/NoticeList.vue"),
meta: { title: "已发送", modId: 2 }, meta: { title: "已发送", modId: 2000 },
}, },
// 发通知(新建/编辑/转发/模板):已发送的深层子页,不在菜单里, // 发通知(新建/编辑/转发/模板):已发送的深层子页,不在菜单里,
// layout.vue 按.meta.parentId 推导面包屑「已发送>发通知」并高亮父菜单 // layout.vue 按.meta.parentId 推导面包屑「已发送>发通知」并高亮父菜单
@@ -35,14 +37,14 @@ const routes: RouteRecordRaw[] = [
path: "/list/new", path: "/list/new",
name: "new_notice", name: "new_notice",
component: () => import("@/views/notice/NewNotice.vue"), component: () => import("@/views/notice/NewNotice.vue"),
meta: { title: "发通知", modId: 22, parentId: 2 }, meta: { title: "发通知", modId: 20001, parentId: 2000 },
}, },
// 全部通知(管理端) // 全部通知(管理端)
{ {
path: "/noticelist", path: "/noticelist",
name: "notice_manage", name: "notice_manage",
component: () => import("@/views/notice/NoticeList.vue"), component: () => import("@/views/notice/NoticeList.vue"),
meta: { title: "全部通知", modId: 3 }, meta: { title: "全部通知", modId: 3000 },
}, },
// 通知详情(同一组件挂两个路由,面包屑/菜单高亮由 meta.parentId 确定父节点: // 通知详情(同一组件挂两个路由,面包屑/菜单高亮由 meta.parentId 确定父节点:
// 已发送下 /list/detail,全部通知下 /noticelist/detail;type 区分是否标读) // 已发送下 /list/detail,全部通知下 /noticelist/detail;type 区分是否标读)
@@ -50,34 +52,34 @@ const routes: RouteRecordRaw[] = [
path: "/list/detail", path: "/list/detail",
name: "notice_list_detail", name: "notice_list_detail",
component: () => import("@/views/notice/NoticeDetails.vue"), component: () => import("@/views/notice/NoticeDetails.vue"),
meta: { title: "通知详情", modId: 23, parentId: 2 }, meta: { title: "通知详情", modId: 20002, parentId: 2000 },
}, },
{ {
path: "/noticelist/detail", path: "/noticelist/detail",
name: "notice_manage_detail", name: "notice_manage_detail",
component: () => import("@/views/notice/NoticeDetails.vue"), component: () => import("@/views/notice/NoticeDetails.vue"),
meta: { title: "通知详情", modId: 24, parentId: 3 }, meta: { title: "通知详情", modId: 30001, parentId: 3000 },
}, },
// 通知统计(旧版行为:整页跳转外部统计系统) // 通知统计(旧版行为:整页跳转外部统计系统)
{ {
path: "/stats", path: "/stats",
name: "notice_stats", name: "notice_stats",
component: () => import("@/views/notice/NoticeStats.vue"), component: () => import("@/views/notice/NoticeStats.vue"),
meta: { title: "通知统计", modId: 4 }, meta: { title: "通知统计", modId: 4000 },
}, },
// 应用设置(发文部门 + 自定义组) // 应用设置(发文部门 + 自定义组)
{ {
path: "/setting", path: "/setting",
name: "notice_setting", name: "notice_setting",
component: () => import("@/views/notice/NoticeSetting.vue"), component: () => import("@/views/notice/NoticeSetting.vue"),
meta: { title: "应用设置", modId: 21 }, meta: { title: "应用设置", modId: 5000 },
}, },
// 我的待审核(应用内审批;modId 23 深层页不在菜单树,菜单挂载待后端 GetUserMod 配置) // 待审核(应用内审批;平台模块管理已挂一级菜单,配置 ID = 2100,path = /approval)
{ {
path: "/approval", path: "/approval",
name: "notice_approval", name: "notice_approval",
component: () => import("@/views/notice/NoticeApproval.vue"), component: () => import("@/views/notice/NoticeApproval.vue"),
meta: { title: "我的待审核", modId: 23, parentId: 2 }, meta: { title: "我的待审核", modId: 2100 },
}, },
// 抄送给我的(流程 NOTIFY 知会;modId 25 深层页不在菜单树,菜单挂载待后端 GetUserMod 配置; // 抄送给我的(流程 NOTIFY 知会;modId 25 深层页不在菜单树,菜单挂载待后端 GetUserMod 配置;