完善平台角色菜单树与授权登录导航

This commit is contained in:
czl231
2026-08-17 21:56:22 +08:00
parent c7449cb38d
commit d6bb3bd43e
22 changed files with 739 additions and 17 deletions

View File

@@ -0,0 +1,127 @@
/**
* 功能:校验非 root 账号登录落点、历史地址恢复与零菜单降级行为。
* 版本v1.0.0
*/
import assert from 'node:assert/strict';
import fs from 'node:fs';
import path from 'node:path';
import process from 'node:process';
import { fileURLToPath } from 'node:url';
import ts from 'typescript';
const currentDirectory = path.dirname(fileURLToPath(import.meta.url));
const root = path.resolve(currentDirectory, '..');
const source = fs.readFileSync(
path.join(root, 'src/router/authorized-landing.ts'),
'utf8',
);
const compiled = ts.transpileModule(source, {
compilerOptions: {
module: ts.ModuleKind.ESNext,
target: ts.ScriptTarget.ES2020,
},
}).outputText;
const landing = await import(
`data:text/javascript;base64,${Buffer.from(compiled).toString('base64')}`
);
const menuTree = [
{
name: 'finance',
meta: { menuCode: 'finance' },
children: [
{
name: 'finance-hidden',
meta: { menuCode: 'finance', hideInMenu: true },
},
{
name: 'finance-payments',
meta: { menuCode: 'fin_payment' },
},
],
},
];
assert.deepEqual(landing.findFirstAuthorizedMenuRoute(menuTree), {
name: 'finance-payments',
});
assert.equal(landing.findFirstAuthorizedMenuRoute([]), null);
function fakeRouter(routeByTarget) {
return {
resolve(target) {
return routeByTarget(String(target.name ?? target.path ?? ''));
},
};
}
const router = fakeRouter((target) => {
if (target === 'finance') {
return {
name: 'finance',
meta: { menuCode: 'finance' },
matched: [{ redirect: '/finance/payments', children: [{}] }],
};
}
return {
name: target,
meta: {
menuCode:
target === 'finance-payments' ? 'fin_payment' : 'dashboard_overview',
},
matched: [{ children: [] }],
};
});
assert.deepEqual(
landing.resolveAuthorizedLanding(
router,
menuTree,
'finance_operator',
['finance', 'fin_payment'],
{ name: 'finance-payments' },
),
{ name: 'finance-payments' },
);
assert.deepEqual(
landing.resolveAuthorizedLanding(
router,
menuTree,
'finance_operator',
['finance', 'fin_payment'],
{ name: 'dashboard-overview' },
),
{ name: 'finance-payments' },
);
assert.deepEqual(
landing.resolveAuthorizedLanding(
router,
menuTree,
'finance_operator',
['finance', 'fin_payment'],
{ name: 'finance' },
),
{ name: 'finance-payments' },
);
assert.deepEqual(
landing.resolveAuthorizedLanding(router, [], 'empty_role', [], undefined),
{ name: 'noPermission' },
);
for (const [relativePath, expected] of [
['src/router/constants.ts', "{ name: 'noPermission', children: [] }"],
['src/router/routes/base.ts', "path: '/no-permission'"],
[
'src/views/login/components/login-form.vue',
'resolveAuthorizedLanding(',
],
[
'src/views/no-permission/index.vue',
'尚未分配菜单权限',
],
]) {
const content = fs.readFileSync(path.join(root, relativePath), 'utf8');
assert.ok(content.includes(expected), `${relativePath} 缺少契约:${expected}`);
}
process.stdout.write('平台账号授权登录落点检查通过\n');