Files
wanghu 2e36d7a9c8
build / build (push) Successful in 9m55s
commit
2026-10-10 15:58:02 +08:00

87 lines
4.2 KiB
TypeScript

// 「平台菜单 → 内部路由」解析验收脚本(独立预览,不参与业务构建)
//
// 背景:基础平台 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>`;