import type { RouteRecordRaw } from "vue-router"; /** * 表单中心路由骨架(T5)——一个 SPA 承载全部形态(执行手册 §2.1): * 管理端 /admin/*、填报页 /f/:code、快应用上下文 /app/:appCode/*、我的填写 /my。 * 同仓同构建同一条静态路由,不建公开站、不拆第二个 front。 * * 两处对齐约束: * ① path 必须与 UserBase app_module.path 逐字一致(手册 §2.2 表;layout 优先按 path * 匹配菜单高亮与面包屑); * ② 本表刻意不写 meta.modId——规范 §4「modId 全量对齐后端 /base/GetUserMod,禁臆造」。 * 手册 §2.2 v1.5 起中心五行的 customId 是显式数字(200~204),但把号段抄进路由就等于和 * UserBase 侧的配置耦死(改号即失配),而 layout 的高亮与面包屑本来就按 path 匹配 * (utils/menuRoute.ts 的 ROUTE_PATHS)。详情页需要父级高亮时用 meta.parentPath。 * * 页面本体分任务落地:管理面/设计器 T6、填报页 T7、数据与统计与快应用 T8; * 本轮 T5 只交付壳与四形态占位页,占位页不含领域逻辑。 */ const routes: RouteRecordRaw[] = [ { // 应用入口:拿到授权模块树后由 App.vue 跳第一个可用模块;无模块时留在此页给引导 path: "/", name: "fc_entry", component: () => import("@/views/Entry.vue"), meta: { title: "表单中心" }, }, /* ---------------- 管理端(/admin/*,菜单行 path 与之逐字一致) ---------------- */ { path: "/admin/forms", name: "fc_admin_forms", component: () => import("@/views/admin/Forms.vue"), meta: { title: "表单设计" }, }, { // 设计器子页面:UserBase 侧没有这条模块行(手册 §2.2 v1.5 只有五行:表单设计/数据管理/统计/应用设置/我的填写), // 所以它不进左导航;高亮与面包屑由 layout 按 meta.parentPath 挂到「表单设计」行下。 // uuid 走 query 而非 path 参数,menuRoute 的 ROUTE_PATHS 才能把它当静态 path 收进去。 path: "/admin/forms/designer", name: "fc_admin_form_designer", component: () => import("@/views/admin/FormDesigner.vue"), meta: { title: "表单设计器", parentPath: "/admin/forms" }, }, { path: "/admin/data", name: "fc_admin_data", component: () => import("@/views/admin/Data.vue"), meta: { title: "数据管理" }, }, { // 答卷详情:数据面身份只用 uuid(V5),所以 answerId 走 query 而非 path 参数 // (同设计器先例——带参 path 不被 menuRoute 的 ROUTE_PATHS 收,且 uuid 形态固定 32 位, // 放 path 里除了暴露在地址段没有任何好处)。不进左导航,面包屑挂「数据管理」行下。 path: "/admin/data/detail", name: "fc_admin_data_detail", component: () => import("@/views/admin/AnswerDetail.vue"), meta: { title: "答卷详情", parentPath: "/admin/data" }, }, { path: "/admin/stats", name: "fc_admin_stats", component: () => import("@/views/admin/Stats.vue"), meta: { title: "统计" }, }, { // 应用设置(手册 §2.2 v1.5 的行;页内两 tab:角色设置 / 字典管理,?tab= 深链)。 // tab 不占模块行、不进导航(同设计器子页的口径),高亮与面包屑就挂本行。 path: "/admin/app", name: "fc_admin_app", component: () => import("@/views/admin/AppSettings.vue"), meta: { title: "应用设置" }, }, { // 旧字典管理地址(六行版模块行时代的 path):只保留重定向,不再单独成页(T10 方案 §6.1)。 // 外部残留链接落到这里=进应用设置的字典 tab,避免出现"两条都能进、只有一条有守卫"的口径。 path: "/admin/dicts", redirect: "/admin/app?tab=dicts", }, /* ---------------- 填报页(分享/门户/快应用直落,code 寻址) ---------------- */ { path: "/f/:code", name: "fc_fill", component: () => import("@/views/Fill.vue"), meta: { title: "填报" }, }, /* ---------------- 快应用上下文(目标应用的模块树 + 范围矩阵,T8 落地) ---------------- */ { path: "/app/:appCode", name: "fc_app", component: () => import("@/views/AppContext.vue"), meta: { title: "应用表单" }, }, { path: "/app/:appCode/:view", name: "fc_app_view", component: () => import("@/views/AppContext.vue"), meta: { title: "应用表单" }, }, { // P77:快应用上下文内的答卷详情走应用自己的路径段,不把用户弹出应用壳 // (T8 现状是恒推 /admin/data/detail——中心管理端那条路径)。 // 形态二选一的取舍见 docs/T9-report.md:选子路由而非内嵌 Modal——地址里保留 uuid 可深链/刷新, // 且详情页(钉版渲染 + 三态空值 + 已删字段降级)只有一份实现。 // 带参 path 不进 menuRoute 的 ROUTE_PATHS(该表按"无 : 的静态 path"收集),故不写 parentPath。 path: "/app/:appCode/data/detail", name: "fc_app_data_detail", component: () => import("@/views/admin/AnswerDetail.vue"), meta: { title: "答卷详情" }, }, /* ---------------- 我的填写(全员授权行) ---------------- */ // 两视图=两个独立入口,不做 query 参数分支(方案 §6.3「鉴权分支容易写漏」、V18): // /my/submit = 我提交的(submitter=会话用户);/my/about = 关于我的(subject=会话用户)。 // /my 为兼容模块行 path(手册 §2.2 只登记了 /my 一行)保留,落在同一容器上, // 由容器内的 Tab 在两个入口间切换(Tab 是 UI 导航,不是接口参数分支)。 { path: "/my", name: "fc_my", component: () => import("@/views/My.vue"), meta: { title: "我的填写" }, }, { path: "/my/submit", name: "fc_my_submit", component: () => import("@/views/My.vue"), meta: { title: "我提交的", parentPath: "/my" }, }, { path: "/my/about", name: "fc_my_about", component: () => import("@/views/My.vue"), meta: { title: "关于我的", parentPath: "/my" }, }, // 兜底:外部深链/残留配置落到未登记路由时不白屏,回入口由壳决定首个可用页 { path: "/:pathMatch(.*)*", redirect: "/" }, ]; export default routes;