Files
dsh_ai1net_server/dsh-server-docs/04-调整方案/137-品牌标识改造-去DeepSeek图形.md
T
admin 971ccc3703 feat(auth): 注册页人机验证 + 邮箱验证码;品牌标识去 DeepSeek(附域名迁移线 序㊿ 补提交)
三条线合并入库 —— 均已完成并上线(源码与生产一致,此前只部署未入仓)。
⚠️ 其中域名迁移线为**另一会话**产出,本会话只做入库、**未复验其正确性**(它自报零回归)。

【档案 134 · 注册页人机验证 + 邮箱验证码】
- DB 迁移 v10:users.email(唯一索引 LOWER(email))+ email_codes 事件表(2 索引)
- 新增模块 src/web/{register-guard,mail,turnstile,email-code}.ts
- routes/auth.ts:新增 GET /api/auth/register/config、POST /api/auth/register/email-code;
  注册接口加人机验证与验证码校验;config.ts 新增 12 项配置(默认空 ⇒ 不配 = 老行为)
- 邮件走**可插拔驱动**(brevo/http/log),发件人 [email protected](Brevo 域名已认证 + DKIM + SPF)
- 防爆破:三层配额(邮箱 6/h、8/天;IP 20/h;全局 200/h)+ 递增冷却阶梯
  (60→60→180→300→900→1800s)+ 试错 5 次作废 + 码只存哈希 + 单次使用 + 与用户名绑定
- Turnstile 服务端校 **success + action + hostname 三项**:sitekey 是公开的,
  只校 success 时"拿我们的 sitekey 在自己站点替真人取合法 token 再打我们接口"这条路是通的
- 新增 test/register-guard.test.mjs(19 用例)

【档案 137 · 品牌标识改造 — 去 DeepSeek 图形】
- login/register/admin 页头:删 DeepSeek 鲸鱼图标 + 「DeepSeek」文字图形
  → 平台标识(中文「能力枢纽」/英语及其他语言「CapabilityNet」,走 i18n 词条 brand.name)
- portal 顶栏换图标(页面名「管理门户」保留)
- 新建 web/favicon.svg(平台自有 hub 图标,避开 DeepSeek 蓝)+ 四页 favicon 指向它
- 新增 test/i18n-brand.test.mjs(node:vm 跑真实 i18n.js,六条语言路径断言渲染结果)
- scripts/verify-static.mjs 新增 SVG 段:XML 注释不得含 ASCII 双连字符(否则整份 SVG
  解析失败、图标静默不显示 —— 实际踩到过)
- 🔴 会话页面(实例内官方 dsh 界面)的标识**按用户要求未动**(也受 R2 约束)

【档案 135/136 · 域名迁移线(另一会话产出)】
- 域名收敛为 ai1net.com;旧域 alotbuy.com 降级为 301 过渡装置
- src/net/relay/{addr-override,directory,rendezvous,switcher}.ts 种子与候选链更新;
  src/web/server.ts、src/worker/relay-tunnel.ts、scripts/verify-cluster-domain.mjs
- 档案 136 = 控制面按两台中继取并集(**已立项、未落地**)

验证(本会话两条线):新增单测 21 条全通过|全量 221 pass / 0 fail / 1 skipped|
verify-static 全合格|其余 10 个 verify 脚本全 OK|线上实测:Turnstile 假 token 403、
发码 delivered、四页 deepseek 命中 0、favicon 200。
2026-09-19 09:11:24 +08:00

10 KiB
Raw Blame History

137-品牌标识改造(去 DeepSeek 图形 → 平台自有标识)

一句话:把我们自己的页面上所有 DeepSeek 品牌标识(鲸鱼图标 / 「DeepSeek」文字图形 / favicon) 换成平台自有标识 —— 中文「能力枢纽」,英语及其他语言「CapabilityNet」。 触发:用户 2026-09-19 原话三句 —— ① 「登录和注册页面上的 deepseek的图标去掉,改为中文: 能力枢纽 小写 CapabilityNet ,英语和其他语言:CapabilityNet」 ② 「一并替换」(= 其余页面也一并办) ③ 「会话页面左上角的 deepseek 先不替换」(= 实例内官方 dsh 界面那处不动) 执行:会话 登录注册页品牌标识改造 → 品牌标识一并替换-admin portal favicon · 状态 ✅ 已上线


0. 替换范围(先划边界,这是本档案最重要的一节)

位置 处置 依据
login.html / register.html 页头品牌区 ✅ 替换 用户①
admin.html(管理台登录卡片) ✅ 替换 用户②「一并替换」
portal.html(管理门户顶栏) ✅ 换图标 用户②;文字「管理门户」保留(见 §1 注)
四页的 favicon ✅ 换新图标 用户②;logo.svg 就是 DeepSeek 图标
🔴 会话页面左上角(用户实例内的 dsh 会话窗口) ⛔ 不替换 用户③明示「先不替换」。技术上它属官方 dsh 的 client bundle,不在本仓 web/ 目录 ⇒ 也不受红线 R2(不改官方 dsh 主程序)允许
index.html / wake.html — 无品牌标识 前者是纯跳转页、后者是启动过渡页,二者均无 logo/wordmark,且本来就没有 favicon link(未加,见 §4)

⚠️ "会话页面"不在本次能力范围内:本仓 web/*.html 是平台自有的门户/管理页; 用户在实例里看到的会话界面由官方 @deepseek-ai/dsh 渲染 ⇒ 那处的标识要么属于官方、要么需走 profile 层官方插件机制(R2 的合规路径),不是"改个静态文件"能解决的。

1. 改了什么

文件 改动
web/login.html .auth-brand 内:删 <img class="logo" src="/logo.svg">(DeepSeek 鲸鱼,2109 B 的 #4D6BFE 图形)+ 删 内联 <svg><title>DeepSeek</title>…</svg>(131×24 文字图形)→ 换 <span class="wordmark" data-i18n="brand.name">CapabilityNet</span>。10758 → 6799 字节
web/register.html 同上。20002 → 16919 字节
web/admin.html 同构处理(它复用 .auth-brand):删图标 + 删内联 DeepSeek SVG → <span class="wordmark">能力枢纽</span>(该页是纯中文页、未接 i18n ⇒ 直接写中文)。11913 → 7928 字节
web/portal.html 顶栏 .brand 只换图标:src="/logo.svg" → src="/favicon.svg";⭐ 文字「管理门户」保留 —— 它是页面定位名、不是 DeepSeek 痕迹,删掉属越界
web/favicon.svg 新建(1008 B):平台自有图标,取「枢纽 / hub」意象 —— 圆角深底 + 中心节点 + 三条辐条 + 三个外环节点;配色用平台自己的 token(ink #0f1c33 底 / accent-2 #38d6d0 节点),刻意避开原 DeepSeek 的 #4D6BFE。同时兼作 favicon 与 portal 顶栏图标
四页 head <link rel="icon" href="/logo.svg"> → href="/favicon.svg"
web/i18n.js 新增词条 brand.name:en → CapabilityNet、zh → 能力枢纽
web/design.css .auth-brand .wordmark 由「定高 22px(给 SVG 用)」改为文字排版(height:auto + 19px/600/行高 1.2)
test/i18n-brand.test.mjs 新增:node:vm + 最小 DOM 桩跑仓库里那份真实的 i18n.js,断言六条语言路径的实际渲染结果
scripts/verify-static.mjs 新增 SVG 段:见 §3-1(踩坑后的防护)

两个刻意的选择

  1. 登录/注册页走 i18n 词条,⛔ 不写死在 HTML:① verify-static.mjs 的 I18N_PAGES 已把这两页列入「不得出现裸中文文案」,硬写「能力枢纽」会被拦;② 「英语和其他语言」 要的正是回退语义 —— lookup() 缺 key 时回退 en,只写 en 一条即覆盖所有其他语言。 ⚠️ admin.html / portal.html 未接 i18n(既有的纯中文页)⇒ 那两处直接写中文, 不引入 i18n 运行时(引它会连带处理它们大量既有裸中文,属扩大范围)。
  2. 发子域名 favicon.svg 而不是复用 logo.svg:favicon 缓存按 URL 生效 ⇒ 换文件名 天然绕过浏览器里那份旧的 DeepSeek 图标缓存,不需要加 ?v= 版本串。

2. 验证证据

项 实测
i18n 渲染自证(跑真实 i18n.js) 六条全绿:浏览器 en-US → CapabilityNet|zh-CN → 能力枢纽|?lang=zh → 能力枢纽|?lang=en(覆盖中文浏览器)→ CapabilityNet|cookie dsh_lang=zh → 能力枢纽|ja-JP → 回退 CapabilityNet
裸 key / 空文案 四种语言下均非 brand.name、非空
SVG 合法性(真 XML 解析器) favicon.svg 解析通过;children=[title, rect, g, circle×4]、paths 三条齐备;另两个既有 SVG 也一并验过
反向自证(坏样本必须被拦) 故意往注释里注入 --accent ⇒ 真解析器报 not well-formed + 校验脚本报红;清理后复跑全绿
残留检查(本地 + 线上) `web/*.html
静态页不变量 verify-static.mjs 全部合格(6 页 + 7 段内联脚本语法 + 3 个 css/js + 3 个 svg)
全量单测 221 pass / 0 fail / 1 skipped(# tests 222,Node 22.22.2)
线上(https://ai1net.com) favicon.svg = 200 + image/svg+xml;四页均 favicon=1 / logo.svg=0;admin.html 显示 <span class="wordmark">能力枢纽</span>;portal.html 显示新图标 + 「管理门户」
部署 md5 对账 5 个 web 文件两端逐一一致(admin 8736bcc7… / portal 164075c8… / login 2467bd50… / register dfbf996f… / favicon fe37ebbf…)
行尾 逐字节核对:admin.html / portal.html 仍 CRLF、login.html / register.html / favicon.svg 仍 LF —— 与该目录既有风格逐一对应,无偏差
回滚点 ① /opt/dsh/backups/rebrand-20260919-084220/pre.tar(第一批 4 文件)② /opt/dsh/backups/rebrand2-20260919-090205/pre.tar(本批)

部署方式:静态文件 scp 即生效(不需要重启);未动任何服务或 env。

3. 踩坑记录

  1. 🔴 SVG 里的 XML 注释不能含 ASCII 双连字符 --(本次实际踩到)。 我在 favicon.svg 的注释里写了 CSS 变量名 --ink / --accent-2 ⇒ XML 语法不允许 ⇒ 整份 SVG 解析失败 ⇒ 浏览器静默不显示图标,页面与接口都不报任何错。
    • 抓到它的方式:用真解析器验一遍(ET.parse 报 not well-formed (invalid token)), 而不是只看标签配对或肉眼看 —— 肉眼 100% 看不出这处问题。
    • ⚠️ 中文破折号 ——(U+2014×2)是合法的,只有 ASCII --(U+002D×2)非法 —— 所以"注释里有破折号"不是判据,"注释里有两个连续半角减号"才是。
    • 已固化为判据:scripts/verify-static.mjs 新增 SVG 段(开头/结尾/viewBox/去痕迹/注释双连字符), 并做了反向自证(注入坏样本 ⇒ 必须报红)。
  2. logo.svg 同时兼作 favicon 与页面图标 ⇒ 换品牌时"页面上的图标"和"浏览器标签图标" 是同一份资产,改一处必须想到另一处(第一批只改了页面内,favicon 就漏了)。

4. 未做 / 已发现(只报告,未动手)

  1. 🟡 index.html / wake.html 没有 favicon link ⇒ 这两个页面的标签图标是浏览器默认。 本轮未加(用户没要求,且属功能增量)。若要统一,改动 = 各加一行 <link rel="icon" href="/favicon.svg">。
  2. 🟡 三个 DeepSeek 资产现已全部无引用:web/logo.svg、web/deepseek-text.svg、web/deepseek.webp (grep 全仓已无任何 HTML/CSS/JS 引用)。未删 —— 属"额外发现即先报告", 删除是不可逆动作、需你点头(git 里可恢复,风险低)。
  3. ⚪ .topbar .wordmark 那条 CSS 保留未改 —— admin.html 用的是 .auth-brand、 portal.html 用的是 .brand,当前没有任何页面用 .topbar .wordmark; 保留是为防样式回归(改它不影响现状,属无收益改动)。

5. 一条待澄清的表述(未阻塞交付)

用户原话里的「小写 CapabilityNet」有两种读法,本轮按读法一实现:

  • 读法一(已实现):中文界面 = 「能力枢纽」;英语及其他语言 = 「CapabilityNet」。
  • 读法二:中文界面 = 「能力枢纽」+ 其下一行小号 CapabilityNet(双语锁定); 或要求英文写成全小写 capabilitynet。

⇒ 若是读法二,改动量 = i18n.js 一处词条 + design.css 一行(无需碰 HTML)。

6. 回滚

对象 方式
第一批(login/register/design.css/i18n.js) /opt/dsh/backups/rebrand-20260919-084220/pre.tar → /opt/dshs/
本批(admin/portal/login/register/favicon/verify-static) /opt/dsh/backups/rebrand2-20260919-090205/pre.tar → /opt/dshs/
生效方式 tar 覆盖即生效,无需重启(纯静态资源)
⚠️ 注意 回滚后页面会重新引用 /logo.svg(DeepSeek 图标仍在服务器上、文件没删)⇒ 回滚是完整的

7. 关联

  • 同一会话的相邻改动:Cloudflare Turnstile 密钥配置并启用(见档案 134 §实现 E)。
  • 旧域移除见 135;控制面并集立项见 136(并行线产物,本档案不重复)。