feat(app): 添加多模板关于我们页面及相关路由和404页面

- 新增404页面,优化未找到页面体验,避免被搜索引擎索引
- 增加文件代理接口,隐藏真实文件服务器地址,支持文件请求代理
- 实现/article、/case、/product及/page动态路由兼容列表与详情展示
- 添加动态CMS页面兼容入口处理旧式路径,统一路由与SEO设置
- 新增模板1、模板7、模板2、模板3关于我们页面,实现多模板支持
- 模板增强支持CMS单页内容加载及SEO信息动态设置
- 配置环境变量及Git忽略文件规则辅助开发和构建环境管理
This commit is contained in:
2026-09-08 12:13:44 +08:00
commit 2b69686795
381 changed files with 59891 additions and 0 deletions
@@ -0,0 +1,141 @@
-- =====================================================================
-- 模板主键与模板目录错位订正脚本
-- 事故:https://gxhrtc.shoplnk.cn/ 渲染成 template-09 墨绿出版风,
-- 实际应为 template-08 金棕企业风(广西恒瑞天诚,tenantId=10140
-- 日期:2026-08-03
--
-- 【根因】
-- 前端模板目录名曾按 app_template 自增主键补零推导(9 → template-09)。
-- 但后台 app_template 主键跳号(id=8 缺失),从第 8 套模板起主键与前端目录整体错位一位,
-- 且 code 字段当初也是跟着主键生成的,同样错位:
--
-- app_template 现状 前端 app/templates/ 实际内容
-- id=9 code=template-09 恒瑞天诚 ← 内容是金棕企业风,对应 template-08
-- id=10 code=template-10 墨绿出版模板 ← 对应 template-09
-- id=11 code=template-11 哈哈333 ← 测试脏数据,前端无此目录
--
-- 【配套代码改动(已完成,见 website-template 仓库)】
-- 前端解析改为「code 优先、主键兜底」:
-- - app/utils/index.ts 新增 resolveTemplateKey(code, id)
-- - server/utils/template-map.ts SSR 侧按 templateId 反查 app_template 拿权威 code
-- - server/middleware/tenant.ts 回填 siteInfo.templateCode
-- 因此只要本脚本把 code 修正到位,前端无需重新部署数据即可正确解析。
--
-- 【库分布】同一 MySQL 实例
-- db_websopy.app_template 模板库
-- modules.cms_website 站点表(template_id 指向 app_template.id
--
-- 【执行建议】
-- Step 1 必做、低风险,执行完 gxhrtc 即恢复正常(无需清 Redis)。
-- Step 2 可选、需停机窗口,执行后【必须清除 Redis 缓存】,否则会二次错位。
-- =====================================================================
-- ---------------------------------------------------------------------
-- Step 0. 备份(必做)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS db_websopy.app_template_bak_20260803
AS SELECT * FROM db_websopy.app_template;
CREATE TABLE IF NOT EXISTS modules.cms_website_tplid_bak_20260803
AS SELECT website_id, tenant_id, website_name, template_id
FROM modules.cms_website
WHERE template_id IS NOT NULL;
-- 执行前先看一眼现状
SELECT id, code, name, comments FROM db_websopy.app_template ORDER BY id;
SELECT template_id, COUNT(*) AS site_count
FROM modules.cms_website
WHERE template_id IS NOT NULL
GROUP BY template_id ORDER BY template_id;
-- ---------------------------------------------------------------------
-- Step 1. 【必做】修正 code,使其与前端模板目录一一对应
--
-- ⚠️ 执行顺序不可颠倒:若 code 上有唯一索引,先腾空 template-09 再占用,
-- 否则 id=10 改为 template-09 时会与 id=9 的旧值冲突。
-- ---------------------------------------------------------------------
START TRANSACTION;
-- 1.1 id=9「恒瑞天诚」实为金棕企业模板 → 让出 template-09,改挂 template-08
-- 顺带把客户名改回模板语义名(模板库不应以单个客户命名;如需保留客户名可删掉 name/comments 两行)
UPDATE db_websopy.app_template
SET code = 'template-08',
name = '金棕企业模板',
comments = '金棕企业风,适合招标公告、工程建设、咨询服务类企业官网'
WHERE id = 9;
-- 1.2 id=10「墨绿出版模板」→ 接手已腾空的 template-09
UPDATE db_websopy.app_template
SET code = 'template-09',
comments = '墨绿文化出版风,适合出版社、文化传媒、图书发行、教育机构类官网'
WHERE id = 10;
-- 1.3 清理测试脏数据(逻辑删除,保留可恢复性;确认无用后再物理删除)
UPDATE db_websopy.app_template SET deleted = 1 WHERE id = 11 AND name = '哈哈333';
COMMIT;
-- 校验:code 应与前端 app/templates/ 目录一一对应(template-01 ~ template-09,无重复、无缺号)
SELECT id, code, name FROM db_websopy.app_template WHERE deleted = 0 ORDER BY code;
-- 到此为止,gxhrtccms_website.template_id = 9)经前端反查得到 code = 'template-08'
-- 渲染恢复为金棕企业风。SiteInfo Redis 缓存存的是 template_id 主键(未变),故无需清缓存;
-- 前端 SSR 侧模板映射有 10 分钟内存缓存,等待 10 分钟或重启 Node 进程即可生效。
-- ---------------------------------------------------------------------
-- Step 2.【可选】重排主键,使 id 数字 == code 数字(彻底消除歧义)
--
-- ⚠️⚠️ 高风险操作,务必在停机窗口执行,且严格按顺序:
-- 先改 cms_website 引用,再改 app_template 主键,否则中间态会指向错误模板。
-- ⚠️⚠️ 执行完必须清除 Redis 缓存 SiteInfo:*,否则站点仍返回旧 template_id
-- 反查新表会得到错误的 code(旧 9 → 新 9 = 墨绿),造成二次错位。
-- ---------------------------------------------------------------------
-- START TRANSACTION;
--
-- -- 2.1 先迁移站点引用(顺序:9→8 腾空 9,再 10→9)
-- UPDATE modules.cms_website SET template_id = 8 WHERE template_id = 9;
-- UPDATE modules.cms_website SET template_id = 9 WHERE template_id = 10;
-- UPDATE modules.cms_website SET template_id = NULL WHERE template_id = 11; -- 脏模板引用清空,回退默认模板
--
-- -- 2.2 再重排模板主键(同样先 9→8 腾空,再 10→9)
-- UPDATE db_websopy.app_template SET id = 8 WHERE id = 9;
-- UPDATE db_websopy.app_template SET id = 9 WHERE id = 10;
-- DELETE FROM db_websopy.app_template WHERE id = 11 AND name = '哈哈333';
--
-- -- 2.3 复位自增起点,避免后续新增再次跳号
-- ALTER TABLE db_websopy.app_template AUTO_INCREMENT = 10;
--
-- COMMIT;
--
-- -- 2.4 清除站点信息缓存(在服务器上执行,Redis 键前缀见 CmsWebsiteServiceImpl.SITE_INFO_KEY_PREFIX
-- -- redis-cli --scan --pattern 'SiteInfo:*' | xargs -r redis-cli del
--
-- -- 2.5 校验:id 数字必须等于 code 数字
-- SELECT id, code, name,
-- CASE WHEN id = CAST(SUBSTRING(code, 10) AS UNSIGNED) THEN 'OK' ELSE 'MISMATCH' END AS aligned
-- FROM db_websopy.app_template WHERE deleted = 0 ORDER BY id;
-- ---------------------------------------------------------------------
-- 回滚
-- ---------------------------------------------------------------------
-- Step 1 回滚:
-- UPDATE db_websopy.app_template t
-- JOIN db_websopy.app_template_bak_20260803 b ON b.id = t.id
-- SET t.code = b.code, t.name = b.name, t.comments = b.comments, t.deleted = b.deleted;
--
-- Step 2 回滚:先从 app_template_bak_20260803 整表还原 app_template
-- 再按 cms_website_tplid_bak_20260803 还原各站点的 template_id,最后清 Redis SiteInfo:*。
-- ---------------------------------------------------------------------
-- 【后续防复发】
-- 1. 新增模板时手工指定主键,强制 id 数字 == code 数字,禁止依赖自增跳号。
-- 2. 上游 getSiteInfo 建议增返 templateCode 字段(关联 app_template.code),
-- 前端 server/utils/template-map.ts 的反查会自动跳过,少一次上游请求。
-- 3. website-admin 的模板管理页「预览」按 code 解析、「选用」却提交 id,
-- 两者口径不一致是本次事故的放大器;建议选用也改为提交 code。
-- =====================================================================