feat(site-layer): 学校站点分层方案C落地(docs/13)+栏目管理增强+管理端三修复+首页视觉升级管理端+审计复检T1~T5(docs/15)整合批次-URL站点段/site/{siteCode}无component镜像层(去name防重名,router-view跳过推进渲染)+身份条SiteSwitcher自绘(徽章#577afb/#ff9900+分组下拉✓+path次级列+Esc/外点收起)+URL唯一事实源syncSiteFromRoute(非法/跨校/主站码当子站段告警打回同页主站,localStorage降级刷新首帧兜底)+菜单剥段高亮stripSiteSeg/withSiteSeg补段+menuRoute镜像层防重影+跳转收敛adminPathOf(工作台进入/全部站点总览/站点管理行进入管理纯URL切站);栏目管理-上级栏目可选可改(禁选自身及后代防成环)+批量添加BatchAddCategory(行序写排序号单行失败不中断)+单页wangEditor富文本预览字数分区+categoryIds契约前端/types/mock三处统一+SchoolLayout高度链.layout-wrap修复+ArticleListPanel fixed模式;管理端三修复-皮肤预览Modal全屏(ThemePreviewFrame可选fill prop)+SiteManage补themeUnregistered声明+长图文编辑器随内容增高;管理端视觉升级配套-SiteConfigForm 12新键+BannerManage gallery展示位切换+栏目homeStyle下拉+PortalPreview侧栏同步;审计复检-新增siteRouter.spec真实路由集成7用例(镜像层matched3层/守卫子站码定向主站前缀/越权回工作台/旧链带id重定向)+sitePath空白容错+siteLayer持久化round-trip与身份条次级入口(docs/15);vitest 99/99+build通过+S1~S10 GUI走查全过
build / build (push) Successful in 2m43s
build / build (push) Successful in 2m43s
This commit is contained in:
@@ -110,11 +110,38 @@ describe("siteConfigForm", () => {
|
||||
it("已知键清单与 docs/09 §0 键盘点表一致(防漂移)", () => {
|
||||
expect(SITE_CONFIG_FIELD_DEFS.map(d => d.key)).toEqual([
|
||||
"logo", "favicon", "slogan", "colleges_label",
|
||||
"contact", "copyright", "beian",
|
||||
"news_bg_image", "gallery_title", "gallery_subtitle",
|
||||
"contact", "footer_addresses", "qr_wechat", "qr_weibo",
|
||||
"social_wechat", "social_weibo", "social_douyin", "social_bilibili",
|
||||
"copyright", "beian",
|
||||
"seo_description",
|
||||
"domain", "public_base_url",
|
||||
]);
|
||||
});
|
||||
it("docs/12:页脚增强与首页视觉新键 parse/serialize/校验(qr_* asset、social_* url)", () => {
|
||||
const json = JSON.stringify({
|
||||
footer_addresses: "潭山校区:南湖路 237 号 邮编:464000\n淮河校区:大学路 1 号 邮编:464300",
|
||||
qr_wechat: "/cms/upload/qr-wechat.png",
|
||||
social_weibo: "https://weibo.com/xxx",
|
||||
social_douyin: "not-a-url",
|
||||
gallery_title: "线上展厅",
|
||||
});
|
||||
const m = parseSiteConfig(json);
|
||||
expect(m.fields.footer_addresses).toContain("淮河校区");
|
||||
expect(m.fields.qr_wechat).toBe("/cms/upload/qr-wechat.png");
|
||||
expect(m.fields.social_weibo).toBe("https://weibo.com/xxx");
|
||||
expect(m.extras).toEqual([]); // 新键均为已知键,不落扩展行
|
||||
const qrDef = SITE_CONFIG_FIELD_DEFS.find(d => d.key === "qr_weibo")!;
|
||||
const socialDef = SITE_CONFIG_FIELD_DEFS.find(d => d.key === "social_douyin")!;
|
||||
expect(validateFieldValue(qrDef, "javascript:alert(1)")).toContain("路径");
|
||||
expect(validateFieldValue(socialDef, "not-a-url")).toContain("http");
|
||||
// 空值统一剔除:不污染 config_json
|
||||
m.fields.social_bilibili = " ";
|
||||
const out = JSON.parse(serializeSiteConfig(m));
|
||||
expect(out.footer_addresses).toContain("邮编:464300");
|
||||
expect(out).not.toHaveProperty("social_bilibili");
|
||||
expect(out.gallery_title).toBe("线上展厅");
|
||||
});
|
||||
it("B3:custom_css 为保留键,不入扩展行,parse/serialize 无损往返", () => {
|
||||
const json = JSON.stringify({ custom_css: ".site-header{padding:16px 0}", my_ext: "v" });
|
||||
const m = parseSiteConfig(json);
|
||||
|
||||
Reference in New Issue
Block a user