落地(依据《事项库与办事大厅详细设计 v1》§7)
- 路由:办事事项 modId=21 / 服务字典 modId=22 + 子站镜像(/sch/{code}/site/{siteCode}/svc/*)
+ 3 条 legacyRedirect 旧链兼容;SchoolLayout 菜单图标兜底
- ServiceItemList:三维筛选/关键字/分页/发布下架删除/跳转编辑
- ServiceItemEdit:三段富文本 + 封面 + 指南附件上传回显(attList)+「我要办理外链」提示
+ 部门选择器不可达时提示"可留空保存"
- ServiceDictManage:object/category 双 Tab,被引用键编辑锁定 + 删除引用守护提示
- api/类型:SvcItemApi/SvcDictApi 与 types/cms.ts 契约补齐;站点设置补 svc_hall_base 键
审计修复(docs/18)
- D3 接线:列表页新增 ServiceItemSortModal 拖拽排序(顺序源 selList,保存按下标重排 sort_no)
与「同步部门名」按钮,此前后端 sort/syncDeptName 已备但前端无入口
- 附件场景拆分:封面与三个富文本编辑器改传 scene=svc_item_asset,指南附件保持 svc_item
(内容资产由后端按内容派生归属,不再依赖前端收集上传 id——删除只写不读的 uploadedIds 记账)
- 部门组树:SvcDeptVo 增 children,前端 flattenDepts 缩进扁平化(后端改嵌套下发,交互不变)
- RichTextEditor 补 articleId/slateMinHeight prop 并去掉死状态 editorLoading;
ArticleEdit 改为复用该组件(正文区最小高度按原口径传入,观感不变),消除双份 wangEditor 实现
测试与 mock
- mock 补 /api/svc/** 全量桩(事项分页/字典/部门树/排序/同步部门名/附件回显 + 站点 1、2 示例数据),
dev:mock 下三页可用(实测 curl 各项响应正确)
- cms.spec 补 save/syncDeptName/selList/dict save+delete 契约;siteRouter.spec 补事项三条路由
modId 与子站镜像 resolve 断言;新增 RichTextEditor.spec 5 例(上传参数三键/成功 emit/失败不 emit/工具栏排除项)
- vitest 127 用例全绿 + vite build 通过
This commit is contained in:
@@ -106,6 +106,32 @@ const cmsChildren: RouteRecordRaw[] = [
|
||||
component: () => import("@/views/cms/PortalPreview.vue"),
|
||||
meta: { title: "门户预览", modId: 99 },
|
||||
},
|
||||
{
|
||||
// 事项库(事项库详细设计 §7.2):办事事项列表 + 编辑(modId=21 对应 UserBase app_module cms_svc_item)
|
||||
path: "svc/item",
|
||||
name: "SvcItemList",
|
||||
component: () => import("@/views/cms/ServiceItemList.vue"),
|
||||
meta: { title: "办事事项", modId: 21 },
|
||||
},
|
||||
{
|
||||
path: "svc/item/edit",
|
||||
name: "SvcItemEditNew",
|
||||
component: () => import("@/views/cms/ServiceItemEdit.vue"),
|
||||
meta: { title: "新建事项", modId: 21, subOf: "/svc/item" },
|
||||
},
|
||||
{
|
||||
path: "svc/item/edit/:id",
|
||||
name: "SvcItemEdit",
|
||||
component: () => import("@/views/cms/ServiceItemEdit.vue"),
|
||||
meta: { title: "编辑事项", modId: 21, subOf: "/svc/item" },
|
||||
},
|
||||
{
|
||||
// 服务字典(modId=22 对应 UserBase app_module cms_svc_dict)
|
||||
path: "svc/dict",
|
||||
name: "SvcDictManage",
|
||||
component: () => import("@/views/cms/ServiceDictManage.vue"),
|
||||
meta: { title: "服务字典", modId: 22 },
|
||||
},
|
||||
];
|
||||
|
||||
/** 子站形态:同一批页面,去掉 name(防重复注册告警;子站导航一律走 path 拼装) */
|
||||
@@ -160,6 +186,9 @@ export const routes: RouteRecordRaw[] = [
|
||||
{ path: "/site/setting/:id", redirect: legacyRedirect("site/setting") },
|
||||
{ path: "/theme", redirect: "/theme-manage" },
|
||||
{ path: "/portal-preview", redirect: legacyRedirect("portal-preview") },
|
||||
{ path: "/svc/item", redirect: legacyRedirect("svc/item") },
|
||||
{ path: "/svc/item/edit/:id?", redirect: legacyRedirect("svc/item/edit") },
|
||||
{ path: "/svc/dict", redirect: legacyRedirect("svc/dict") },
|
||||
{
|
||||
path: "/:pathMatch(.*)*",
|
||||
redirect: "/workbench",
|
||||
|
||||
Reference in New Issue
Block a user