feat(theme): 新增三套高校官网风皮肤 poly-blue/agri-forest/jade-normal
build / build-push (push) Successful in 51s

以 default 为基座(文件最全:含事项库 service/guide 两模板),设计语言与配色取自
真实高校官网 CSS(浙理工 #0558A5+橙、信阳农林 #1C6E19+麦穗金、信阳师大 #008D3F+暖橙)。
三包均自带九段 home-blocks、:root 契约变量别名、中文防塌列三件套、真实实拍截图
(1920 无头截图缩样)。

- UniversitySkinContractTest(7 用例):九段 fragment/homeStyle 分发/防塌列/变量别名/
  层序/自有截图/主色色域(蓝或绿通道主导,粉紫禁入)
- ThemeRegistryTest +哨兵:三包注册成功且主色与 default/scholar-blue 及彼此互异
- jade-normal 修复:news_grid 全宽封面变体把正文列压成 0 宽致 390px 溢出 47px,
  增 .jn-feat-a--stack 纵向变体,复测 overflowX=0
- 门禁:ThemeContractIT 14 主题×7 路由全绿;全量 mvn test 393/393 绿
This commit is contained in:
chenxing
2026-09-20 02:31:53 +08:00
parent d2df12b91e
commit 82d6ff4602
50 changed files with 9289 additions and 0 deletions
@@ -135,6 +135,30 @@ class ThemeRegistryTest {
}
}
@Test
@DisplayName("高校官网风第二批: poly-blue/agri-forest/jade-normal 注册成功,主色与存量全部互异")
void universitySkinsRegisteredWithDistinctPrimary() {
String defaultPrimary = registry.get(ThemeRegistry.DEFAULT_THEME).param("primary").getDefaultValue();
String scholarPrimary = registry.get("scholar-blue").param("primary").getDefaultValue();
java.util.Map<String, String> seen = new java.util.LinkedHashMap<>();
for (String name : new String[] {"poly-blue", "agri-forest", "jade-normal"}) {
ThemeInfo info = registry.get(name);
assertThat(info).as("%s 皮肤包必须注册(清单+必备模板+截图齐全)", name).isNotNull();
assertThat(info.getTitle()).isNotBlank();
ThemeParam primary = info.param("primary");
assertThat(primary).as("%s 应声明 primary 参数", name).isNotNull();
assertThat(primary.getDefaultValue())
.as("%s 的 primary 不得与 default 相同", name).isNotEqualTo(defaultPrimary);
assertThat(primary.getDefaultValue())
.as("%s 的 primary 不得与 scholar-blue 相同(拷贝忘改哨兵)", name)
.isNotEqualTo(scholarPrimary);
seen.put(name, primary.getDefaultValue());
}
assertThat(seen.get("poly-blue")).isNotEqualTo(seen.get("agri-forest"));
assertThat(seen.get("poly-blue")).isNotEqualTo(seen.get("jade-normal"));
assertThat(seen.get("agri-forest")).isNotEqualTo(seen.get("jade-normal"));
}
@Test
@DisplayName("default 包缺失时 fail-fast(方案 §5.1,启动失败防线)")
void defaultMissingFailsFast() {