@@ -0,0 +1,86 @@
|
||||
// 「平台菜单 → 内部路由」解析验收脚本(独立预览,不参与业务构建)
|
||||
//
|
||||
// 背景:基础平台 GetUserMod 返回的模块 path 是历史路径(/leave/shenhe、
|
||||
// /leave/liucheng…),modId 又是环境相关的自增 id(本环境 97–105,与路由
|
||||
// meta 里的历史编号并不一致)。只要有模块解析不出内部路由,侧栏点击就会弹
|
||||
// 「菜单「x」未配置有效页面路径」。本脚本把平台真实返回原样喂给解析器,
|
||||
// 逐项核对解析结果 + 路由是否可 resolve,结果写入 document.title 供无头
|
||||
// 浏览器 --dump-dom 读取(DOM 渲染中文在无头环境不稳定,标题更可靠)。
|
||||
//
|
||||
// 用法:
|
||||
// npx vite --config preview.vite.config.ts --port 8099
|
||||
// 打开 http://localhost:8099/preview-menu.html(人眼)或加 --dump-dom(断言)
|
||||
import { createRouter, createMemoryHistory } from "vue-router";
|
||||
import routes from "@/router/routes";
|
||||
import { resolveMenuPage } from "@/utils/menuRoute";
|
||||
|
||||
/** 平台 GetUserMod 原样返回(2026-10 环境) */
|
||||
const MODS: any[] = [
|
||||
{ id: 97, modId: 97, name: "我要请假", page: "/leave/" },
|
||||
{ id: 98, modId: 98, name: "我的请假", page: "/leave/myleave" },
|
||||
{ id: 99, modId: 99, name: "审批列表", page: "/leave/shenhe" },
|
||||
{ id: 100, modId: 100, name: "抄送列表", page: "/leave/leave_send" },
|
||||
{ id: 101, modId: 101, name: "全部请假", page: "/leave/totallist" },
|
||||
{ id: 102, modId: 102, name: "流程管理", page: "/leave/liucheng" },
|
||||
{ id: 103, modId: 103, name: "请假设置", page: "/leave/leave_timeSetting" },
|
||||
{ id: 104, modId: 104, name: "时长日志", page: "/leave/leave_amendant" },
|
||||
{ id: 105, modId: 105, name: "统计分析", page: "/leave/tongji" },
|
||||
];
|
||||
|
||||
const router = createRouter({ history: createMemoryHistory(), routes });
|
||||
|
||||
const rows = MODS.map((m) => {
|
||||
const r = resolveMenuPage(m.page, m.modId ?? m.id, m.name);
|
||||
// 路由层能否 resolve(含重定向穿透),用于区分「解析器不认」与「路由表没有」
|
||||
const rv = router.resolve(m.page || "/");
|
||||
return {
|
||||
name: m.name,
|
||||
modId: m.modId,
|
||||
page: m.page,
|
||||
resolved: r.path,
|
||||
external: r.external,
|
||||
routerPath: rv.path,
|
||||
matched: rv.matched.length,
|
||||
};
|
||||
});
|
||||
|
||||
const bad = rows.filter((r) => !r.resolved);
|
||||
document.title =
|
||||
`MENU|bad=${bad.length}|` +
|
||||
rows.map((r) => `${r.name}=${r.resolved || "ERR"}${r.external ? "(ext)" : ""}`).join(" | ");
|
||||
|
||||
// 人眼核对用的表格
|
||||
const app = document.getElementById("app")!;
|
||||
app.innerHTML = `
|
||||
<div style="font:13px/1.6 -apple-system,'Microsoft YaHei',sans-serif;padding:18px 22px">
|
||||
<h3 style="margin:0 0 10px">平台菜单 → 内部路由 解析结果
|
||||
<span style="font-weight:400;color:${bad.length ? "#f5222d" : "#19be6b"}">
|
||||
未解析 ${bad.length} 项
|
||||
</span>
|
||||
</h3>
|
||||
<table style="border-collapse:collapse;width:100%">
|
||||
<thead><tr style="background:#f5f7fa">
|
||||
${["平台模块名", "modId", "平台配置 page", "解析结果 path", "外链", "router.resolve", "matched"]
|
||||
.map((h) => `<th style="border:1px solid #e8eaec;padding:6px 10px;text-align:left">${h}</th>`)
|
||||
.join("")}
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
${rows
|
||||
.map(
|
||||
(r) => `<tr>
|
||||
<td style="border:1px solid #e8eaec;padding:6px 10px">${r.name}</td>
|
||||
<td style="border:1px solid #e8eaec;padding:6px 10px">${r.modId}</td>
|
||||
<td style="border:1px solid #e8eaec;padding:6px 10px;color:#808695">${r.page}</td>
|
||||
<td style="border:1px solid #e8eaec;padding:6px 10px;font-weight:600;color:${r.resolved ? "#2d8cf0" : "#f5222d"}">${r.resolved || "解析失败"}</td>
|
||||
<td style="border:1px solid #e8eaec;padding:6px 10px">${r.external ? "是" : "-"}</td>
|
||||
<td style="border:1px solid #e8eaec;padding:6px 10px">${r.routerPath}${r.matched ? "" : "(无匹配)"}</td>
|
||||
<td style="border:1px solid #e8eaec;padding:6px 10px">${r.matched}</td>
|
||||
</tr>`
|
||||
)
|
||||
.join("")}
|
||||
</tbody>
|
||||
</table>
|
||||
<p style="margin:12px 0 0;color:#808695">
|
||||
期望:9 项全部解析到注册路由;「流程管理」应落在 /flow(打开请假设置页的流程管理 tab)。
|
||||
</p>
|
||||
</div>`;
|
||||
Reference in New Issue
Block a user