feat(W4): 站点path全链路-portalUrlOf/previewPortalUrl纯函数,站点列/向导地址预览/预览frame sitePath,store携带path,mock嵌套路由,T-W4-16..18 绿51/51

This commit is contained in:
chenxing
2026-09-08 15:14:10 +08:00
parent 7b99ec398d
commit dedd4a6a3a
16 changed files with 297 additions and 37 deletions
+29
View File
@@ -0,0 +1,29 @@
/**
* W4 嵌套路径:站点门户 URL 拼接纯函数(方案 §8.3 T-W4-16)。
* portalUrlOf:站点对象 → 门户地址(path 优先,尾斜杠;path 缺失回退 code 兼容历史数据);
* previewPortalUrl:上级 path + 编码 → 子站门户地址(parentPath 空 → 单段)。
*/
import { describe, expect, it } from "vitest";
import { portalUrlOf, previewPortalUrl } from "@/utils/sitePath";
describe("portalUrlOf(T-W4-16)", () => {
it("path 优先:嵌套 path 拼单段门户地址 + 尾斜杠", () => {
expect(portalUrlOf({ path: "sch-3/jdxy", code: "jdxy" })).toBe("/portal/sch-3/jdxy/");
});
it("path 缺失回退 code(历史数据兼容)", () => {
expect(portalUrlOf({ code: "demo" })).toBe("/portal/demo/");
expect(portalUrlOf({ path: "", code: "demo" })).toBe("/portal/demo/");
});
});
describe("previewPortalUrl(T-W4-16)", () => {
it("上级 path 非空 → 两段嵌套 + 尾斜杠", () => {
expect(previewPortalUrl("sch-3", "jdxy")).toBe("/portal/sch-3/jdxy/");
});
it("上级 path 空 → 单段(顶层站)", () => {
expect(previewPortalUrl("", "sch-9")).toBe("/portal/sch-9/");
expect(previewPortalUrl(undefined, "sch-9")).toBe("/portal/sch-9/");
});
});
+17
View File
@@ -0,0 +1,17 @@
/**
* W4 嵌套路径:站点门户 URL 拼接纯函数(前后端各一份同构语义,后端 SiteService.buildPath)。
* 规范:门户地址 = /portal/{path}/(尾斜杠);path 缺失回退 code(历史数据兼容);
* 子站预览地址 = /portal/{parentPath}/{code}/(parentPath 空 → 单段顶层)。
*/
/** 站点对象 → 门户地址(尾斜杠;path 优先,缺失回退 code) */
export function portalUrlOf(site: { path?: string; code: string }): string {
const seg = site.path && site.path.trim() ? site.path.trim() : site.code;
return `/portal/${seg}/`;
}
/** 上级 path + 编码 → 子站门户地址预览(parentPath 空 → 单段顶层站) */
export function previewPortalUrl(parentPath: string | undefined | null, code: string): string {
const parent = parentPath && parentPath.trim() ? parentPath.trim() : "";
return parent ? `/portal/${parent}/${code}/` : `/portal/${code}/`;
}