From a9e4240bb3f45b620f7afed1a26dd61e181e7d10 Mon Sep 17 00:00:00 2001 From: chenxing Date: Mon, 28 Sep 2026 14:58:31 +0800 Subject: [PATCH] =?UTF-8?q?[CMS-VISUAL]=20E=20=E6=BF=80=E8=BF=9B=E6=B8=85?= =?UTF-8?q?=E5=9C=BA:=20=E4=B8=8B=E6=9E=B6=2010=20=E5=A5=97=E4=BC=AA?= =?UTF-8?q?=E4=B8=BB=E9=A2=98=EF=BC=88tag=20themes-before-cleanup-2026-09?= =?UTF-8?q?=20+=20docs/=E4=B8=BB=E9=A2=98=E5=A4=87=E4=BB=BD/=20=E5=8F=8C?= =?UTF-8?q?=E5=A4=87=E4=BB=BD=EF=BC=89=E2=86=92=20=E4=BF=9D=E7=95=99=20def?= =?UTF-8?q?ault/scholar-blue/campus-glow=20=E4=B8=89=E5=A5=97=EF=BC=9B?= =?UTF-8?q?=E8=89=B2=E7=9A=AE=E6=A1=A3=E5=B9=B6=E5=85=A5=20default.colorSc?= =?UTF-8?q?heme=E3=80=81=E5=85=8B=E9=9A=86=E6=A1=A3=E5=B9=B6=E5=85=A5=20sc?= =?UTF-8?q?holar-blue.colorScheme=EF=BC=88ThemeParam.presets=20+=20ThemeVa?= =?UTF-8?q?rsCss=20=E5=8F=98=E9=87=8F=E7=BB=84=E6=B3=A8=E5=85=A5=EF=BC=89?= =?UTF-8?q?=EF=BC=9B=E5=88=AB=E5=90=8D=E8=A1=A8=20R-46=20=E6=98=A0?= =?UTF-8?q?=E5=B0=84=EF=BC=88=E6=B8=B2=E6=9F=93=E7=AB=AF=E4=B8=8D=E6=96=AD?= =?UTF-8?q?=E6=B8=B2=E6=9F=93=20+=20=E4=BF=9D=E5=AD=98=E5=BD=92=E4=B8=80?= =?UTF-8?q?=E5=8C=96=20+=20=E7=AB=99=E7=82=B9=E7=BA=A7=20theme=5Fparams.co?= =?UTF-8?q?lorScheme=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cms/service/impl/PortalQueryService.java | 42 +- .../yunhai/cms/service/impl/SiteService.java | 40 +- .../java/com/yunhai/cms/theme/ThemeParam.java | 8 + .../com/yunhai/cms/theme/ThemeRegistry.java | 38 + .../com/yunhai/cms/theme/ThemeVarsCss.java | 18 +- .../templates/themes/academic-navy/README.md | 33 - .../themes/academic-navy/assets/css/main.css | 1497 ------------- .../themes/academic-navy/assets/favicon.png | Bin 721 -> 0 bytes .../themes/academic-navy/assets/favicon.svg | 4 - .../themes/academic-navy/assets/js/main.js | 190 -- .../academic-navy/assets/screenshot.png | Bin 132654 -> 0 bytes .../themes/academic-navy/detail.html | 76 - .../academic-navy/fragments/footer.html | 59 - .../themes/academic-navy/fragments/head.html | 21 - .../academic-navy/fragments/header.html | 86 - .../academic-navy/fragments/home-blocks.html | 205 -- .../templates/themes/academic-navy/home.html | 149 -- .../templates/themes/academic-navy/list.html | 105 - .../themes/academic-navy/single.html | 50 - .../templates/themes/academic-navy/theme.json | 23 - .../templates/themes/agri-forest/README.md | 58 - .../themes/agri-forest/assets/css/main.css | 1555 ------------- .../themes/agri-forest/assets/favicon.png | Bin 2585 -> 0 bytes .../themes/agri-forest/assets/js/main.js | 87 - .../themes/agri-forest/assets/screenshot.png | Bin 124946 -> 0 bytes .../templates/themes/agri-forest/detail.html | 76 - .../themes/agri-forest/fragments/footer.html | 92 - .../themes/agri-forest/fragments/head.html | 24 - .../themes/agri-forest/fragments/header.html | 66 - .../agri-forest/fragments/home-blocks.html | 257 --- .../templates/themes/agri-forest/guide.html | 133 -- .../templates/themes/agri-forest/home.html | 169 -- .../templates/themes/agri-forest/list.html | 111 - .../templates/themes/agri-forest/service.html | 111 - .../templates/themes/agri-forest/single.html | 50 - .../templates/themes/agri-forest/theme.json | 30 - .../templates/themes/blue-white/README.md | 23 - .../themes/blue-white/assets/css/main.css | 370 ---- .../themes/blue-white/assets/favicon.png | Bin 2617 -> 0 bytes .../themes/blue-white/assets/favicon.svg | 8 - .../themes/blue-white/assets/js/main.js | 40 - .../themes/blue-white/assets/screenshot.png | Bin 86616 -> 0 bytes .../templates/themes/blue-white/detail.html | 58 - .../themes/blue-white/fragments/footer.html | 21 - .../themes/blue-white/fragments/head.html | 24 - .../themes/blue-white/fragments/header.html | 54 - .../templates/themes/blue-white/home.html | 68 - .../templates/themes/blue-white/list.html | 68 - .../templates/themes/blue-white/single.html | 41 - .../templates/themes/blue-white/theme.json | 16 - .../templates/themes/campus-azure/README.md | 33 - .../themes/campus-azure/assets/css/main.css | 1535 ------------- .../themes/campus-azure/assets/favicon.png | Bin 721 -> 0 bytes .../themes/campus-azure/assets/favicon.svg | 4 - .../themes/campus-azure/assets/js/main.js | 190 -- .../themes/campus-azure/assets/screenshot.png | Bin 129152 -> 0 bytes .../templates/themes/campus-azure/detail.html | 76 - .../themes/campus-azure/fragments/footer.html | 59 - .../themes/campus-azure/fragments/head.html | 21 - .../themes/campus-azure/fragments/header.html | 86 - .../campus-azure/fragments/home-blocks.html | 209 -- .../templates/themes/campus-azure/home.html | 149 -- .../templates/themes/campus-azure/list.html | 105 - .../templates/themes/campus-azure/single.html | 50 - .../templates/themes/campus-azure/theme.json | 23 - .../templates/themes/classic-red/README.md | 23 - .../themes/classic-red/assets/css/main.css | 372 ---- .../themes/classic-red/assets/favicon.png | Bin 2612 -> 0 bytes .../themes/classic-red/assets/favicon.svg | 8 - .../themes/classic-red/assets/js/main.js | 40 - .../themes/classic-red/assets/screenshot.png | Bin 85564 -> 0 bytes .../templates/themes/classic-red/detail.html | 58 - .../themes/classic-red/fragments/footer.html | 21 - .../themes/classic-red/fragments/head.html | 24 - .../themes/classic-red/fragments/header.html | 55 - .../templates/themes/classic-red/home.html | 68 - .../templates/themes/classic-red/list.html | 68 - .../templates/themes/classic-red/single.html | 41 - .../templates/themes/classic-red/theme.json | 17 - .../templates/themes/default/theme.json | 56 +- .../templates/themes/fresh-mint/README.md | 36 - .../themes/fresh-mint/assets/css/main.css | 650 ------ .../themes/fresh-mint/assets/favicon.png | Bin 2617 -> 0 bytes .../themes/fresh-mint/assets/favicon.svg | 8 - .../themes/fresh-mint/assets/js/main.js | 40 - .../themes/fresh-mint/assets/screenshot.png | Bin 25678 -> 0 bytes .../templates/themes/fresh-mint/detail.html | 58 - .../themes/fresh-mint/fragments/footer.html | 23 - .../themes/fresh-mint/fragments/head.html | 25 - .../themes/fresh-mint/fragments/header.html | 62 - .../templates/themes/fresh-mint/home.html | 68 - .../templates/themes/fresh-mint/list.html | 76 - .../templates/themes/fresh-mint/single.html | 41 - .../templates/themes/fresh-mint/theme.json | 21 - .../templates/themes/jade-normal/README.md | 54 - .../themes/jade-normal/assets/css/main.css | 1949 ----------------- .../themes/jade-normal/assets/favicon.png | Bin 2585 -> 0 bytes .../themes/jade-normal/assets/js/main.js | 88 - .../themes/jade-normal/assets/screenshot.png | Bin 133847 -> 0 bytes .../templates/themes/jade-normal/detail.html | 76 - .../themes/jade-normal/fragments/footer.html | 105 - .../themes/jade-normal/fragments/head.html | 26 - .../themes/jade-normal/fragments/header.html | 89 - .../jade-normal/fragments/home-blocks.html | 316 --- .../templates/themes/jade-normal/guide.html | 133 -- .../templates/themes/jade-normal/home.html | 147 -- .../templates/themes/jade-normal/list.html | 114 - .../templates/themes/jade-normal/service.html | 111 - .../templates/themes/jade-normal/single.html | 50 - .../templates/themes/jade-normal/theme.json | 30 - .../templates/themes/mint-breeze/README.md | 36 - .../themes/mint-breeze/assets/css/main.css | 1123 ---------- .../themes/mint-breeze/assets/favicon.png | Bin 2617 -> 0 bytes .../themes/mint-breeze/assets/favicon.svg | 8 - .../themes/mint-breeze/assets/js/main.js | 40 - .../themes/mint-breeze/assets/screenshot.png | Bin 86616 -> 0 bytes .../templates/themes/mint-breeze/detail.html | 58 - .../themes/mint-breeze/fragments/footer.html | 21 - .../themes/mint-breeze/fragments/head.html | 24 - .../themes/mint-breeze/fragments/header.html | 58 - .../mint-breeze/fragments/home-blocks.html | 238 -- .../templates/themes/mint-breeze/guide.html | 132 -- .../templates/themes/mint-breeze/home.html | 88 - .../templates/themes/mint-breeze/list.html | 69 - .../templates/themes/mint-breeze/service.html | 112 - .../templates/themes/mint-breeze/single.html | 41 - .../templates/themes/mint-breeze/theme.json | 27 - .../templates/themes/poly-blue/README.md | 56 - .../themes/poly-blue/assets/css/main.css | 1593 -------------- .../themes/poly-blue/assets/favicon.png | Bin 2585 -> 0 bytes .../themes/poly-blue/assets/js/main.js | 192 -- .../themes/poly-blue/assets/screenshot.png | Bin 142167 -> 0 bytes .../templates/themes/poly-blue/detail.html | 76 - .../themes/poly-blue/fragments/footer.html | 101 - .../themes/poly-blue/fragments/head.html | 24 - .../themes/poly-blue/fragments/header.html | 109 - .../poly-blue/fragments/home-blocks.html | 229 -- .../templates/themes/poly-blue/guide.html | 134 -- .../templates/themes/poly-blue/home.html | 148 -- .../templates/themes/poly-blue/list.html | 106 - .../templates/themes/poly-blue/service.html | 111 - .../templates/themes/poly-blue/single.html | 50 - .../templates/themes/poly-blue/theme.json | 29 - .../templates/themes/scholar-blue/theme.json | 116 +- .../templates/themes/warm-kinder/README.md | 23 - .../themes/warm-kinder/assets/css/main.css | 370 ---- .../themes/warm-kinder/assets/favicon.png | Bin 2584 -> 0 bytes .../themes/warm-kinder/assets/favicon.svg | 8 - .../themes/warm-kinder/assets/js/main.js | 40 - .../themes/warm-kinder/assets/screenshot.png | Bin 93430 -> 0 bytes .../templates/themes/warm-kinder/detail.html | 58 - .../themes/warm-kinder/fragments/footer.html | 22 - .../themes/warm-kinder/fragments/head.html | 24 - .../themes/warm-kinder/fragments/header.html | 54 - .../templates/themes/warm-kinder/home.html | 68 - .../templates/themes/warm-kinder/list.html | 68 - .../templates/themes/warm-kinder/single.html | 41 - .../templates/themes/warm-kinder/theme.json | 17 - .../yunhai/cms/portal/PortalHomeLayoutIT.java | 57 +- .../com/yunhai/cms/portal/PortalSsrIT.java | 27 +- .../cms/theme/AcademicSkinContractTest.java | 194 -- .../java/com/yunhai/cms/theme/ThemeApiIT.java | 9 +- .../yunhai/cms/theme/ThemeRegistryTest.java | 119 +- .../yunhai/cms/theme/ThemeVarsCssTest.java | 38 + .../cms/theme/UniversitySkinContractTest.java | 200 -- .../yunhai/cms/utils/PortalUrlHelperTest.java | 8 +- 166 files changed, 435 insertions(+), 20200 deletions(-) delete mode 100644 src/main/resources/templates/themes/academic-navy/README.md delete mode 100644 src/main/resources/templates/themes/academic-navy/assets/css/main.css delete mode 100644 src/main/resources/templates/themes/academic-navy/assets/favicon.png delete mode 100644 src/main/resources/templates/themes/academic-navy/assets/favicon.svg delete mode 100644 src/main/resources/templates/themes/academic-navy/assets/js/main.js delete mode 100644 src/main/resources/templates/themes/academic-navy/assets/screenshot.png delete mode 100644 src/main/resources/templates/themes/academic-navy/detail.html delete mode 100644 src/main/resources/templates/themes/academic-navy/fragments/footer.html delete mode 100644 src/main/resources/templates/themes/academic-navy/fragments/head.html delete mode 100644 src/main/resources/templates/themes/academic-navy/fragments/header.html delete mode 100644 src/main/resources/templates/themes/academic-navy/fragments/home-blocks.html delete mode 100644 src/main/resources/templates/themes/academic-navy/home.html delete mode 100644 src/main/resources/templates/themes/academic-navy/list.html delete mode 100644 src/main/resources/templates/themes/academic-navy/single.html delete mode 100644 src/main/resources/templates/themes/academic-navy/theme.json delete mode 100644 src/main/resources/templates/themes/agri-forest/README.md delete mode 100644 src/main/resources/templates/themes/agri-forest/assets/css/main.css delete mode 100644 src/main/resources/templates/themes/agri-forest/assets/favicon.png delete mode 100644 src/main/resources/templates/themes/agri-forest/assets/js/main.js delete mode 100644 src/main/resources/templates/themes/agri-forest/assets/screenshot.png delete mode 100644 src/main/resources/templates/themes/agri-forest/detail.html delete mode 100644 src/main/resources/templates/themes/agri-forest/fragments/footer.html delete mode 100644 src/main/resources/templates/themes/agri-forest/fragments/head.html delete mode 100644 src/main/resources/templates/themes/agri-forest/fragments/header.html delete mode 100644 src/main/resources/templates/themes/agri-forest/fragments/home-blocks.html delete mode 100644 src/main/resources/templates/themes/agri-forest/guide.html delete mode 100644 src/main/resources/templates/themes/agri-forest/home.html delete mode 100644 src/main/resources/templates/themes/agri-forest/list.html delete mode 100644 src/main/resources/templates/themes/agri-forest/service.html delete mode 100644 src/main/resources/templates/themes/agri-forest/single.html delete mode 100644 src/main/resources/templates/themes/agri-forest/theme.json delete mode 100644 src/main/resources/templates/themes/blue-white/README.md delete mode 100644 src/main/resources/templates/themes/blue-white/assets/css/main.css delete mode 100644 src/main/resources/templates/themes/blue-white/assets/favicon.png delete mode 100644 src/main/resources/templates/themes/blue-white/assets/favicon.svg delete mode 100644 src/main/resources/templates/themes/blue-white/assets/js/main.js delete mode 100644 src/main/resources/templates/themes/blue-white/assets/screenshot.png delete mode 100644 src/main/resources/templates/themes/blue-white/detail.html delete mode 100644 src/main/resources/templates/themes/blue-white/fragments/footer.html delete mode 100644 src/main/resources/templates/themes/blue-white/fragments/head.html delete mode 100644 src/main/resources/templates/themes/blue-white/fragments/header.html delete mode 100644 src/main/resources/templates/themes/blue-white/home.html delete mode 100644 src/main/resources/templates/themes/blue-white/list.html delete mode 100644 src/main/resources/templates/themes/blue-white/single.html delete mode 100644 src/main/resources/templates/themes/blue-white/theme.json delete mode 100644 src/main/resources/templates/themes/campus-azure/README.md delete mode 100644 src/main/resources/templates/themes/campus-azure/assets/css/main.css delete mode 100644 src/main/resources/templates/themes/campus-azure/assets/favicon.png delete mode 100644 src/main/resources/templates/themes/campus-azure/assets/favicon.svg delete mode 100644 src/main/resources/templates/themes/campus-azure/assets/js/main.js delete mode 100644 src/main/resources/templates/themes/campus-azure/assets/screenshot.png delete mode 100644 src/main/resources/templates/themes/campus-azure/detail.html delete mode 100644 src/main/resources/templates/themes/campus-azure/fragments/footer.html delete mode 100644 src/main/resources/templates/themes/campus-azure/fragments/head.html delete mode 100644 src/main/resources/templates/themes/campus-azure/fragments/header.html delete mode 100644 src/main/resources/templates/themes/campus-azure/fragments/home-blocks.html delete mode 100644 src/main/resources/templates/themes/campus-azure/home.html delete mode 100644 src/main/resources/templates/themes/campus-azure/list.html delete mode 100644 src/main/resources/templates/themes/campus-azure/single.html delete mode 100644 src/main/resources/templates/themes/campus-azure/theme.json delete mode 100644 src/main/resources/templates/themes/classic-red/README.md delete mode 100644 src/main/resources/templates/themes/classic-red/assets/css/main.css delete mode 100644 src/main/resources/templates/themes/classic-red/assets/favicon.png delete mode 100644 src/main/resources/templates/themes/classic-red/assets/favicon.svg delete mode 100644 src/main/resources/templates/themes/classic-red/assets/js/main.js delete mode 100644 src/main/resources/templates/themes/classic-red/assets/screenshot.png delete mode 100644 src/main/resources/templates/themes/classic-red/detail.html delete mode 100644 src/main/resources/templates/themes/classic-red/fragments/footer.html delete mode 100644 src/main/resources/templates/themes/classic-red/fragments/head.html delete mode 100644 src/main/resources/templates/themes/classic-red/fragments/header.html delete mode 100644 src/main/resources/templates/themes/classic-red/home.html delete mode 100644 src/main/resources/templates/themes/classic-red/list.html delete mode 100644 src/main/resources/templates/themes/classic-red/single.html delete mode 100644 src/main/resources/templates/themes/classic-red/theme.json delete mode 100644 src/main/resources/templates/themes/fresh-mint/README.md delete mode 100644 src/main/resources/templates/themes/fresh-mint/assets/css/main.css delete mode 100644 src/main/resources/templates/themes/fresh-mint/assets/favicon.png delete mode 100644 src/main/resources/templates/themes/fresh-mint/assets/favicon.svg delete mode 100644 src/main/resources/templates/themes/fresh-mint/assets/js/main.js delete mode 100644 src/main/resources/templates/themes/fresh-mint/assets/screenshot.png delete mode 100644 src/main/resources/templates/themes/fresh-mint/detail.html delete mode 100644 src/main/resources/templates/themes/fresh-mint/fragments/footer.html delete mode 100644 src/main/resources/templates/themes/fresh-mint/fragments/head.html delete mode 100644 src/main/resources/templates/themes/fresh-mint/fragments/header.html delete mode 100644 src/main/resources/templates/themes/fresh-mint/home.html delete mode 100644 src/main/resources/templates/themes/fresh-mint/list.html delete mode 100644 src/main/resources/templates/themes/fresh-mint/single.html delete mode 100644 src/main/resources/templates/themes/fresh-mint/theme.json delete mode 100644 src/main/resources/templates/themes/jade-normal/README.md delete mode 100644 src/main/resources/templates/themes/jade-normal/assets/css/main.css delete mode 100644 src/main/resources/templates/themes/jade-normal/assets/favicon.png delete mode 100644 src/main/resources/templates/themes/jade-normal/assets/js/main.js delete mode 100644 src/main/resources/templates/themes/jade-normal/assets/screenshot.png delete mode 100644 src/main/resources/templates/themes/jade-normal/detail.html delete mode 100644 src/main/resources/templates/themes/jade-normal/fragments/footer.html delete mode 100644 src/main/resources/templates/themes/jade-normal/fragments/head.html delete mode 100644 src/main/resources/templates/themes/jade-normal/fragments/header.html delete mode 100644 src/main/resources/templates/themes/jade-normal/fragments/home-blocks.html delete mode 100644 src/main/resources/templates/themes/jade-normal/guide.html delete mode 100644 src/main/resources/templates/themes/jade-normal/home.html delete mode 100644 src/main/resources/templates/themes/jade-normal/list.html delete mode 100644 src/main/resources/templates/themes/jade-normal/service.html delete mode 100644 src/main/resources/templates/themes/jade-normal/single.html delete mode 100644 src/main/resources/templates/themes/jade-normal/theme.json delete mode 100644 src/main/resources/templates/themes/mint-breeze/README.md delete mode 100644 src/main/resources/templates/themes/mint-breeze/assets/css/main.css delete mode 100644 src/main/resources/templates/themes/mint-breeze/assets/favicon.png delete mode 100644 src/main/resources/templates/themes/mint-breeze/assets/favicon.svg delete mode 100644 src/main/resources/templates/themes/mint-breeze/assets/js/main.js delete mode 100644 src/main/resources/templates/themes/mint-breeze/assets/screenshot.png delete mode 100644 src/main/resources/templates/themes/mint-breeze/detail.html delete mode 100644 src/main/resources/templates/themes/mint-breeze/fragments/footer.html delete mode 100644 src/main/resources/templates/themes/mint-breeze/fragments/head.html delete mode 100644 src/main/resources/templates/themes/mint-breeze/fragments/header.html delete mode 100644 src/main/resources/templates/themes/mint-breeze/fragments/home-blocks.html delete mode 100644 src/main/resources/templates/themes/mint-breeze/guide.html delete mode 100644 src/main/resources/templates/themes/mint-breeze/home.html delete mode 100644 src/main/resources/templates/themes/mint-breeze/list.html delete mode 100644 src/main/resources/templates/themes/mint-breeze/service.html delete mode 100644 src/main/resources/templates/themes/mint-breeze/single.html delete mode 100644 src/main/resources/templates/themes/mint-breeze/theme.json delete mode 100644 src/main/resources/templates/themes/poly-blue/README.md delete mode 100644 src/main/resources/templates/themes/poly-blue/assets/css/main.css delete mode 100644 src/main/resources/templates/themes/poly-blue/assets/favicon.png delete mode 100644 src/main/resources/templates/themes/poly-blue/assets/js/main.js delete mode 100644 src/main/resources/templates/themes/poly-blue/assets/screenshot.png delete mode 100644 src/main/resources/templates/themes/poly-blue/detail.html delete mode 100644 src/main/resources/templates/themes/poly-blue/fragments/footer.html delete mode 100644 src/main/resources/templates/themes/poly-blue/fragments/head.html delete mode 100644 src/main/resources/templates/themes/poly-blue/fragments/header.html delete mode 100644 src/main/resources/templates/themes/poly-blue/fragments/home-blocks.html delete mode 100644 src/main/resources/templates/themes/poly-blue/guide.html delete mode 100644 src/main/resources/templates/themes/poly-blue/home.html delete mode 100644 src/main/resources/templates/themes/poly-blue/list.html delete mode 100644 src/main/resources/templates/themes/poly-blue/service.html delete mode 100644 src/main/resources/templates/themes/poly-blue/single.html delete mode 100644 src/main/resources/templates/themes/poly-blue/theme.json delete mode 100644 src/main/resources/templates/themes/warm-kinder/README.md delete mode 100644 src/main/resources/templates/themes/warm-kinder/assets/css/main.css delete mode 100644 src/main/resources/templates/themes/warm-kinder/assets/favicon.png delete mode 100644 src/main/resources/templates/themes/warm-kinder/assets/favicon.svg delete mode 100644 src/main/resources/templates/themes/warm-kinder/assets/js/main.js delete mode 100644 src/main/resources/templates/themes/warm-kinder/assets/screenshot.png delete mode 100644 src/main/resources/templates/themes/warm-kinder/detail.html delete mode 100644 src/main/resources/templates/themes/warm-kinder/fragments/footer.html delete mode 100644 src/main/resources/templates/themes/warm-kinder/fragments/head.html delete mode 100644 src/main/resources/templates/themes/warm-kinder/fragments/header.html delete mode 100644 src/main/resources/templates/themes/warm-kinder/home.html delete mode 100644 src/main/resources/templates/themes/warm-kinder/list.html delete mode 100644 src/main/resources/templates/themes/warm-kinder/single.html delete mode 100644 src/main/resources/templates/themes/warm-kinder/theme.json delete mode 100644 src/test/java/com/yunhai/cms/theme/AcademicSkinContractTest.java delete mode 100644 src/test/java/com/yunhai/cms/theme/UniversitySkinContractTest.java diff --git a/src/main/java/com/yunhai/cms/service/impl/PortalQueryService.java b/src/main/java/com/yunhai/cms/service/impl/PortalQueryService.java index e4a29d9..eea9106 100644 --- a/src/main/java/com/yunhai/cms/service/impl/PortalQueryService.java +++ b/src/main/java/com/yunhai/cms/service/impl/PortalQueryService.java @@ -75,12 +75,24 @@ public class PortalQueryService { return null; } PortalSiteSnapshot snapshot = PortalSiteSnapshot.of(site); - snapshot.setTheme(resolveTheme(snapshot.getTheme(), snapshot.getCode())); + String originalTheme = snapshot.getTheme(); + snapshot.setTheme(resolveTheme(originalTheme, snapshot.getCode())); derivePublicBaseUrl(site, snapshot); // 微调参数注入(方案 §5.3):按已解析主题 schema 过滤,回退主题与参数过滤天然一致 com.yunhai.cms.theme.ThemeInfo themeInfo = themeRegistry.get(snapshot.getTheme()); java.util.Map themeParams = themeInfo.filterValidValues(rawParamsMap(snapshot)); + // docs/20 E(R-46):站点用下架主题 → 强制对应 colorScheme 预设(保持原视觉近似); + // 站点保存归一化后 theme 已是保留主题,改由 config.theme_params.colorScheme 站点级驱动 + com.yunhai.cms.theme.ThemeRegistry.AliasInfo alias = + com.yunhai.cms.theme.ThemeRegistry.aliasOf(originalTheme); + String siteScheme = siteColorScheme(snapshot.getConfig()); + if (alias != null && alias.colorScheme != null) { + themeParams.put("colorScheme", alias.colorScheme); + } else if (siteScheme != null && themeInfo.param("colorScheme") != null + && themeInfo.param("colorScheme").isValidValue(siteScheme)) { + themeParams.put("colorScheme", siteScheme); + } snapshot.setThemeParams(themeParams); snapshot.setThemeVarsCss(com.yunhai.cms.theme.ThemeVarsCss.build(themeInfo, themeParams)); @@ -280,15 +292,41 @@ public class PortalQueryService { } } - /** 皮肤包存在性检查:委托 ThemeRegistry(theme.json + 4 模板齐全校验,方案 §5.1 重构,缺省回退 default) */ + /** + * 皮肤包存在性检查:委托 ThemeRegistry;docs/20 E 后下架主题按别名表映射到保留主题 + * (R-46:门户不断渲染),未知主题回退 default。 + */ private String resolveTheme(String theme, String siteCode) { if (themeRegistry.contains(theme)) { return theme; } + com.yunhai.cms.theme.ThemeRegistry.AliasInfo alias = + com.yunhai.cms.theme.ThemeRegistry.aliasOf(theme); + if (alias != null) { + log.warn("皮肤包 {} 已下架(docs/20 E 清场),映射到 {}(colorScheme={})site={}", + theme, alias.target, alias.colorScheme, siteCode); + return alias.target; + } log.warn("皮肤包 {} 未注册(site={}),回退 default", theme, siteCode); return com.yunhai.cms.theme.ThemeRegistry.DEFAULT_THEME; } + /** 站点级 colorScheme(config_json.theme_params.colorScheme,仅归一化保存后的别名站点使用) */ + private static String siteColorScheme(java.util.Map config) { + if (config == null) { + return null; + } + Object tp = config.get("theme_params"); + if (tp instanceof Map) { + Object v = ((Map) tp).get("colorScheme"); + if (v != null) { + String s = String.valueOf(v); + return s.isEmpty() ? null : s; + } + } + return null; + } + /** * 参数原始值(工作项 T:参数微调上移为皮肤包级):取当前主题的包级 {@code paramValues} * ({@code themes/.meta/{name}.json} 覆盖层)。站点 {@code config_json.theme_params} 已退役、不再读取 diff --git a/src/main/java/com/yunhai/cms/service/impl/SiteService.java b/src/main/java/com/yunhai/cms/service/impl/SiteService.java index 36d3255..abd07a2 100644 --- a/src/main/java/com/yunhai/cms/service/impl/SiteService.java +++ b/src/main/java/com/yunhai/cms/service/impl/SiteService.java @@ -191,13 +191,27 @@ public class SiteService { site.setSchId(req.getSchId()); site.setSchName(req.getSchName()); site.setName(req.getName()); - String resolvedTheme = StringUtils.hasText(req.getTheme()) + String requestedTheme = StringUtils.hasText(req.getTheme()) ? req.getTheme() : com.yunhai.cms.theme.ThemeRegistry.DEFAULT_THEME; + // docs/20 E:下架主题名按别名表归一化为保留主题(保存后 theme 字段收敛到 3 套注册包) + com.yunhai.cms.theme.ThemeRegistry.AliasInfo alias = + com.yunhai.cms.theme.ThemeRegistry.aliasOf(requestedTheme); + String resolvedTheme = requestedTheme; if (!themeRegistry.contains(resolvedTheme)) { - throw new BizException(ErrorCode.PARAM_ERROR, "皮肤包未注册:" + resolvedTheme); + if (alias != null) { + resolvedTheme = alias.target; + } else { + throw new BizException(ErrorCode.PARAM_ERROR, "皮肤包未注册:" + resolvedTheme); + } } site.setTheme(resolvedTheme); - validateConfigJson(req.getConfigJson(), site.getId()); + String configJson = req.getConfigJson(); + if (alias != null && alias.colorScheme != null) { + // 原配色写入站点级 theme_params.colorScheme(渲染端据此套用预设,保留原视觉近似) + configJson = withSiteColorScheme(configJson, alias.colorScheme); + req.setConfigJson(configJson); + } + validateConfigJson(configJson, site.getId()); // 工作项 T:参数微调上移为皮肤包级,站点不再持有参数值——themeParams 入参直接忽略 // (config_json 原样入库;theme_params 仍是 RESERVED 键以容忍存量/老前端提交,不报错) site.setConfigJson(req.getConfigJson()); @@ -209,6 +223,26 @@ public class SiteService { return SiteVo.of(site); } + /** + * docs/20 E:站点级 colorScheme 写入 config_json.theme_params(仅 colorScheme 键, + * 其余 theme_params 内容原样保留;theme_params 为 RESERVED 键不参与常规校验)。 + */ + private String withSiteColorScheme(String configJson, String colorScheme) { + java.util.Map config = ExtJsonUtils.parse(configJson); + Object tp = config.get("theme_params"); + java.util.Map themeParams = new java.util.LinkedHashMap<>(); + if (tp instanceof java.util.Map) { + ((java.util.Map) tp).forEach((k, v) -> themeParams.put(String.valueOf(k), v)); + } + themeParams.put("colorScheme", colorScheme); + config.put("theme_params", themeParams); + try { + return CONFIG_MAPPER.writeValueAsString(config); + } catch (Exception e) { + throw new BizException(ErrorCode.PARAM_ERROR, "站点配置序列化失败"); + } + } + /** * W4 门户 path 计算(唯一入口,前后端各一份纯函数语义:front/src/utils/sitePath.ts 同构): * 顶层(parentSiteId≤0)=code;子站=父站 path + '/' + code。 diff --git a/src/main/java/com/yunhai/cms/theme/ThemeParam.java b/src/main/java/com/yunhai/cms/theme/ThemeParam.java index dfa013e..6af6416 100644 --- a/src/main/java/com/yunhai/cms/theme/ThemeParam.java +++ b/src/main/java/com/yunhai/cms/theme/ThemeParam.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.util.List; +import java.util.Map; import java.util.regex.Pattern; /** @@ -47,6 +48,13 @@ public class ThemeParam { private List