- 全站由浅色暖金升级为「雅致绿金」:墨绿
#133429为品牌主色(主按钮/激活态/链接/侧栏/登录场景),暖白#f6f5f0/#fefdfa为底,香槟金#c89848降级为精品与重点资产专用(≤2% 面积)。tokens.css全量重写并移除暗色prefers-color-scheme媒体块(按要求固定单一浅色)。 - 前台:搜索按钮/分页当前页/视图切换器改墨绿实心白字;「访问域名」由金字金边改为绿字绿边次按钮;精品卡身份改由金细边 + 顶部 44×2px 短金线 + 浅金底「★精选」徽章表达(正文保持深色);到期状态改三级(≤30 天警告、≤7 天与已过期危险,文案「已过期」);速览弹窗白面板 + 深绿遮罩,QR/价值维度低饱和底保留。
- 精品详情页:大标题由亮金改深色,访问按钮改实心墨绿,kicker 改中文「★ 精品域名」金棕字;Worker SSR 模板同步删掉遗留的 FEATURED DOMAIN ASSET / DISCOVER MORE 英文 kicker(上一轮只删了客户端侧)。
- 后台:登录页重做为深墨绿场景 + 左右分栏白卡(左品牌介绍区深绿 + 金点缀、右白表单,手机自动单栏);侧栏深墨绿渐变(从
--brandcolor-mix 派生,accent 覆盖时整体跟随),active 为白 10% 底 + 左侧 3px 香槟金短条 + 金图标;概览统计卡白卡 + 顶部语义细线(总数墨绿/展示绿/隐藏灰/精品金)+ 语义数值色;表头米白--background-soft、行悬停--surface-hover。admin.css 的黑金基础层与浅色覆盖层合并为单层。 - 概览 PV/UV 图修复既有 bug:UV 线原用
var(--ink)(浅色主题下=白色,白卡上不可见),改香槟金--gold-deep作第二数据线。 - accent_color 机制重做:新增
src/client/lib/accent-color.ts,历史默认色(含黑金#d8b638、暖金#c4a242等 5 个)视为「未定制」清除覆盖;真自定义色整套派生 brand/strong/hover/bg/bg-strong/border/ring,配 5 项单测。新增迁移0022_elegant_green_accent.sql把历史默认值归一为#133429(沿 0014 惯例,不动真自定义色)。远程执行该迁移会把生产 accent_color 从#c4a242更新为#133429,属主题配套变更。 - 品牌资产同步:附件已生成
unusedomain-logo.png、多尺寸 PNG、favicon.ico、Apple Touch Icon 与 PWA 图标;manifest.webmanifesttheme_color#133429;index.htmltheme-color#f6f5f0;精品 OG 图使用 UnUseDomain 品牌文字。 - CSS 清理:删除 hero-*、header-discover、premium-corner、copy-button、group-tabs、section-kicker、mobile-stats、domain-featured-dot、keyword-pill/domain-keywords、copy-filter-link、contact-modal/contact-list/qr-code、domain-list-head、catalogue-intro、row-details、integration-details、bulk-keywords、status-list、highlighted 等确认死类(TSX 全量交叉验证,含动态拼接
density-${…}/badge-…检查后保留活类);棕色系历史阴影(rgba(64,42,20) 等 6 处)与纯黑阴影全部换绿倾向令牌;--cream-*、--glow-gold、--gold-muted、--premium-fg、--ink、--foreground等死令牌删除;--fg-3补定义(原引用 8 处但从未定义)。app.css 2110→1936 行,前台 CSS 产物 100.63→90.00KB(gzip 17.68→15.85)。 - 已知限制:管理员在站点设置输入过浅的自定义强调色仍可能破坏主按钮白字对比度(schema 仅校验 hex 格式);
--gold-bg/--gold-soft/--brand-secondary等主题 API 令牌暂无 CSS 引用,保留作设计系统接口。 - 生产品牌已由
0026_unusedomain_rebrand.sql统一为UnUseDomain,并将 Logo、Favicon 与版权指向仓库内的附件衍生静态资源;旧品牌迁移只作为兼容历史保留。 - 部署前备份:本地 wrangler OAuth 过期无法跑
pnpm db:backup,改经 Cloudflare MCP 完成增量逻辑备份backups/wanmi-20260720-mcp-pre-green-gold.sql——以 7-17 全量备份为基线,全表updated_at核验后仅 3 行变更(mx.ooo、site_settings、notification_settings),两份文件合并即完整现状;敏感表(sessions/密码哈希/渠道密文)本次部署零触碰,由 D1 Time Travel 30 天兜底。
- 根因一(主因):
index.html仍有 Google Fonts 的 Noto Sans SC<link rel="stylesheet">外链。渲染阻塞资源在大陆不可达时要等 TCP 超时才放行渲染,国内用户白屏可达 20 秒以上。已彻底移除(含两个 preconnect),中文走系统字体栈;CSP 同步收紧不再放行fonts.googleapis.com/fonts.gstatic.com(集成测试断言已反转)。 - 根因二:公开 API 零边缘缓存(
max-age=0),跨境每请求完整回源 Worker+D1(实测 TLS 后仍需 300-400ms)。新增src/worker/middleware/edge-cache.ts:Cache API 边缘缓存,挂在/api/public/*与首页/SSR;响应声明s-maxage=60才入缓存(random 排序 no-store 不受影响)。 - 缓存键携带
public_data_version(?__pv=版本):domains 触发器原有,新增0022_settings_public_version_trigger.sql让 site_settings 更新也自增同一版本。后台任何改动下一请求即换键直读新库——s-maxage 只管同版本条目存活,不构成数据陈旧上限;E2E「隐藏域名→前台立即消失」正是靠这个通过的。浏览器层保持max-age=0, must-revalidate。 - 命中实测:TLS 后处理 300-400ms → 约 40ms。前台 bundle 251KB → 238KB(gzip 77KB)。
- tsconfig 同时服务 DOM 与 Worker,DOM 的
CacheStorage没有default,中间件里caches as unknown as { default: Cache }收窄,勿改回。
- tokens.css 整体重写为单一深色主题(删除 prefers-color-scheme 分支与浅色值):深墨绿黑背景
#0a1211、实色深墨绿 surface 三层(弹窗/下拉不透底)、新增 teal 青绿主色系(--teal等 7 个令牌)与--glass-highlight玻璃高光。cream 系令牌名保留但值已深色化。 - app.css 映射层:
--brand/--brand-strong/--brand-soft/--brand-ring/侧栏 active/--glow全部由金改 teal;金色仅保留精品语义(--premium系)。浅色残留(白 inset 高光、精品卡混白渐变、6 处暖棕阴影)全部清理。生产与本地site_settings.accent_color已同步为#2fbf9a(--brand 会被它动态覆盖,改主题色必须连 DB 一起改)。 - DomainCard 重构(设计稿卡片形态):顶部金色渐变 TLD 徽章 + 分类描边徽章(精品带 ⭐ 与「· 精品」)+ 右侧弱化复制/速览图标;中部衬线大域名(Cormorant Garamond,覆盖辨识度专项时期的 Manrope 声明——设计稿要求 serif);底部精品星标 + 到期行(30 天内红色「(紧急)」、已过期红色「(已过期)」、无数据「长期持有」)。「访问域名」独立按钮删除,域名本体即外链。单测已按新结构重写(注意
localDatehelper:组件按本地时区格式化,勿用 toISOString 断言)。 - 前台筛选改胶囊组(设计稿筛选形态):新增「状态」组(全部/7 天内到期/30 天内到期/已过期/精品,精品复用 group=featured 单选互斥)与「分类」组(原分类下拉改胶囊,数据同 facets);后缀/位数/排序仍为下拉。公开 API 新增
expiry=7d|30d|expired参数(schema + SQL date 比较)。选中态 teal 渐变、精品选中金渐变。 - 后台概览重排(设计稿仪表盘):四张青绿渐变统计卡(域名总数/即将到期/精品[金调]/已隐藏)→ 快捷操作行(添加域名/批量 CSV 导入/导出 CSV/到期提醒设置,前两个跳域名管理)→ 到期趋势(新
expiringTrend:未来 6 个月按月聚合)+ 分类分布(新categorySpread)双栏 → 原 PV/UV(第二条线 stroke 由不可见的 --ink 改 --premium)/Top10/地区/后缀分布/日志/通知健康保留。dashboard API 新增 expiringSoonCount/expiringTrend/categorySpread 三字段。 - 后台域名表:新增「到期日期」(默认开启,30 天内红/90 天内黄、已过期红注明,可排序 expires_at)与「注册商」两个可选列;E2E 概览断言由「前台展示」卡改为「域名总数」卡 + 快捷操作可见。
- 本地 D1 曾无自动分类数据(前台分类胶囊为空、后台分类分布为空):跑一次后台「重新自动分类」,或参照本轮 scratchpad 脚本直接以
classifyDomainName生成 INSERT 灌入domain_auto_categories。 - 验证:
pnpm check全绿(103 测试);8 个 E2E 用例单独跑全过;22 张视觉基线按新视觉重建。生产版本8384df00-aaa6-4f9b-b43d-b9797938bc7f,verify:production通过,部署前备份backups/wanmi-20260717T162537Z.sql。远程已执行 0022 迁移。
- 用户反馈「后台的图标没有更新」:后台站点设置一直支持上传 Logo 与 Favicon 到 R2,
logo_url/favicon_url也会随公开设置 API 下发,但前端与 SSR 从未消费这两个字段——前台 header 硬编码/favicon.svg,后台与 SSR 详情页 brand 硬编码「玩」字块,favicon 永远是默认菱形。上传后全站任何位置都不会变。 - 修复(仍全部回退到默认):前台 header 改用
settings.logo_url || "/favicon.svg",且favicon_url存在时运行时替换link[rel=icon];Worker 首页与/d/:domain详情页在 HTMLRewriter 中按favicon_url注入 favicon,首页og:image/twitter:image改用logo_url(新增absoluteAsset把/uploads/...相对路径转绝对 URL);后台侧栏 brand 与 SSR 详情页/客户端详情页 brand 在有logo_url时显示图片,否则保留「玩」字块。 FeaturedDomainDetail.site类型同步增加logo_url/favicon_url;详情页查询同时取两列。- 本地用
/favicon.svg作测试值验证了 SSR brand img、favicon 注入与 og:image 绝对化,测试值已还原;生产logo_url/favicon_url仍为 NULL,行为与之前完全一致,用户在后台上传后立即生效。
- 功能 E2E:登录链路、后台七模块、公开链路全部正常;
管理员真实登录用例在本地仍命中 HANDOFF 已记载的 admin→公开页 goto 卡死(main基线一致,CI 上通过),与本轮改动无关。 - 新坑已踩并记录:本机另一目录(
~/Documents/kimi/workspace/wanmi)残留的 dev server 占着 5173,playwright.config.ts的reuseExistingServer: true会把整套 E2E 静默打到旧目录的代码与本地 D1 上(表现为登录 401/429 与基线全挂)。跑 E2E 前先lsof -nP -iTCP:5173确认进程工作目录是本仓库。 - 后台概览基线高度漂移根因:
admin-overview用 fullPage 截图,.activity-listmask 只遮内容不遮高度,活动日志在达到 10 条上限前每次登录都会把页面撑高。本地日志超过 10 条后高度封顶即稳定;重建基线需在日志 ≥10 条后进行。 - 视觉基线 22 张按辨识度专项后的视觉在本机(darwin/arm64)重建,连跑三轮全部稳定;原 win32 基线已是旧视觉,继续保留必然失败,已删除——Windows 本地首次跑会自动重建(Playwright 无基线时写入 actual,二次通过)。CI 依旧整 spec 跳过,不受影响。
- 用户反馈:网页内容辨识度不高、看着不清晰。实测确认根因是浅底上大量使用亮金
#d4b252作文字色(对比度仅约 1.9:1):详情页大标题、「访问域名/访问该域名」按钮、速览价值维度卡大字、关键词 pill、精品卡域名、分页激活态等全部中招。 - tokens.css 新增
--gold-text(浅色#7d641c,实测约 5.3:1;暗色#e9cd7d)作为浅底金色文字/文字级边框的唯一合法色;--gold/--gold-bright仅留作渐变与装饰。design.md Theme 章节已写入该规则。 - app.css 令牌映射
--brand-strong/--premium-fg由--gold-bright改指--gold-text,全站文字级金色一处修复;精品徽章改--gold-text实底 +--text-inverse字(暗色自动变深字亮金底);--gold-text同步到关键词 pill、domain-visit、featured-detail-visit、copy-filter-link、空态推荐标题。 - 详情页 h1 由亮金改
--text-primary深色并去掉金色 text-shadow;featured-detail-visit的 translateY hover 补回(hover:hover) and (pointer:fine)门控(项目 Motion 规范)。 - 卡片域名(card-view)从 Cormorant Garamond 衬线改为 Manrope 700:
.domain-name strong/.domain-tld移除自写font-family后继承容器——.public-shell .domain-list.card-view .domain-name早已声明font-ui700 却被 strong 自写字体挡住;compact 视图与 related 卡保持衬线。数字域名(00/008007 等)辨识度提升最明显。 - 三级文字
--text-tertiary浅色#86868b→#6e6e73(3.4→4.7:1)、暗色#6e6e73→#8e8e93;--border0.08→0.10、--border-strong0.14→0.18、--border-subtle0.04→0.05,卡片轮廓与元数据更清晰。 - 修复真实 bug:
--fg-3被 7 处引用(前台详情/后台 admin.css)但从未定义,var(--fg-3)全部无效回退;已在 :root 补--fg-3: var(--text-tertiary)。 - SSR 详情页模板两处全大写英文 kicker(FEATURED DOMAIN ASSET / DISCOVER MORE)仍在产出,与上轮「三处 kicker 删除」决策不一致;已删除模板节点与
.featured-detail-kicker/.detail-kicker/.featured-related-heading span死 CSS。 - 品牌声明句修正:
862 个精选域名改为N 个域名,覆盖 M 个后缀,其中 K 个精选(862 是全部,87 才是精选)。 - 生产
site_settings.accent_color已是#c4a242与--gold一致,无需变更;pnpm check全绿;桌面/手机/暗色/速览/详情页截图人工复核通过。
- 依用户提供的最终优化方案执行,先逐项核实再实施;两项方案内容已过时(列表页 ItemList JSON-LD 与卡片 hover 位移均已存在),一项明确拒绝:LXGW WenKai(楷体风格与目录信息密度矛盾,3MB + font-display:optional 意味着慢网用户白下载还看不到;保持系统中文字体回退)。
- 字体替换:display 字体 Instrument Serif → Cormorant Garamond(tokens/--font-display、fonts.css 由 fetch-fonts 重新生成、og.ts 的 TTF 与 font-family、api.test.ts 同步、旧文件删除、OFL 补齐)。fetch-fonts.ts 新增 EXTRA_TTF:用旧版 UA 请求 css2 拿 gstatic 静态 Regular TTF(290KB,google/fonts 仓库只有 1.1MB 变量字体,resvg 吃静态更稳)。
- 三处全大写英文 kicker 删除(FEATURED DOMAIN ASSET / DISCOVER MORE / DOMAIN QUICK VIEW)。
- DomainCard 7 个手写 SVG 与底栏 Unicode 字符(⌂/≡)替换为 lucide-react;组件不传尺寸 props,沿用 CSS 对各处 svg 的既有约束;顺手移除「点击速览生成」过时文案。
- 新增品牌声明区(h1「精选域名资产」+ 动态统计句)——上轮删 Hero 后页面没有 h1,此块兼顾 SEO 与新访客认知,克制不做大区块。
- 金色微调:#b89530 → #c4a242(bright #d4b252),生产 site_settings.accent_color 需同步(部署时更新)。
- 暗色模式:tokens.css 末尾按系统 prefers-color-scheme 自动切换(无手动开关),仅颜色令牌分主题;app.css 原
color-scheme: light会盖掉媒体查询,已移到 tokens 分主题声明;view-switch 激活态 white → var(--text-inverse)(暗色下浅底白字不可读)。 - 页首布局修复:header 原为 brand/统计/操作三列 grid,统计删除后「后台」掉进中列,两处 grid-template-columns 收敛为
1fr auto。 - 其余:搜索 placeholder 更新、移动端筛选下拉两列 grid、页首「后台」视觉弱化(opacity .62 hover 恢复)、速览 QR 卡片化与价值维度四卡低饱和语义底色、精品详情标题/元数据层级 CSS。
- 方案中跳过项及理由:CSS 拆 6 文件(层叠风险大于收益,admin.css 拆分已用 DOM 探测法完成)、wouter 路由(3 条路由不需要)、类型集中与 testing-library 单测(边际收益低)、公开 API 限流(60/min 会误伤 NAT 出口与正常翻页用户,Workers 无状态内存限流多实例下无效)。SSR JSON 注入与 SPA fallback 经检查本就安全(safeJsonLd 转义
<;not_found_handling: single-page-application)。 - 22 张基线按新视觉重建三轮稳定;5 个关键 E2E 通过;
pnpm check全绿。
- 页首中心的域名总数(header-stats)删除;页脚「管理」移至页首右侧并改名「后台」(复用既有 .admin-link 样式与
show_admin_link_in_footer开关,字段名未改)。 - Hero 区整体移除(CatalogueHero.tsx 删除):页首之下直接是搜索与域名列表。
- 高级筛选整体移除(AdvancedSearchPanel.tsx 删除):AdvancedFilterValue/EMPTY_ADVANCED_FILTERS 内联进 PublicPage,位数下拉继续驱动 minLength/maxLength;contains/excludes/kind 无 UI 入口但保留 URL 直传兼容。移动底栏「筛选」改为滚动到工具栏。
- 后台 AI 简介功能整体移除:AI 配置模块(AiConfigsPanel/Modal/删除弹窗)、nav 项、域名编辑的「AI 生成简介」按钮、
/api/admin/ai-configs*与/:id/suggest-description路由、domain-description-ai service、shared/ai-config.ts 全部删除;简介字段保留纯手动编辑。后台回到七个模块。 - 新增
0021_drop_ai_configs.sql:DROP ai_configs(0018 建、0019/0020 调整过),不影响 domains.description 已有数据。远程已执行。 - 测试同步:domain-description-ai.test.ts 删除;api.test.ts 移除 AI 集成用例(108→101);E2E 删除「AI 配置独立导航」「批量关键词」(后者依赖远程改版已删的关键词功能,属遗留死用例)两个用例,「关键词、简介与精品状态」重写为「手动简介与精品状态」,「前台高级筛选」改为「前台位数筛选」,管理员登录用例断言 nav 不含 AI 配置。
- CSS 清理 114 条死规则(hero/header-stats/advanced/footer-admin-link/ai-* 等)。
- 22 张基线按新布局重建三轮稳定;5 个受影响 E2E 用例通过;
pnpm check全绿(15 文件 101 测试)。
- 依 Emil Kowalski 的设计工程 skills(github.com/emilkowalski/skills)审计并修复交互层,本轮改动叠加在另一会话的浅色改版(3dfa368…5fde067,黑金 → 米白纸感 + 深金 #b89530)之上。
- 审计结论:easing/时长令牌本已达标(强 ease-out cubic-bezier(.22,1,.36,1)、全部 ≤250ms、无 ease-in 误用),修复集中在四类:
- 消灭 4 处
transition: all,全部改为指定具体属性; - 按压反馈补齐至 14 处
:active(卡片图标 scale .92、搜索/访问按钮 .97、分页/视图切换/联系图标等),搜索按钮原来的translateY(0)按压改为 scale; - 位移类 hover(translateY 悬浮)全部收进
@media (hover: hover) and (pointer: fine),并删除门控外与门控内重复定义的.domain-card:hover(触屏误触发源); - 速览 dialog 补
@starting-style进入动画:scale(.96)+opacity、200ms、backdrop 同步淡入;modal 保持居中 origin。
- 消灭 4 处
- design.md 已同步浅色现实(原文写黑金,与代码脱节):Theme 章节改为 Warm Light 并新增 Motion 规范章节(禁 transition:all、禁 ease-in、按压反馈必备、hover 位移门控、modal @starting-style 进入等),后续改动以此为准。
- 远程浅色改版删了收藏与「复制链接」、精品标记 dot 改 badge,但 E2E 未同步,本轮修复三处:卡片按钮 3→2、
.domain-featured-dot→.domain-featured-badge、删除复制链接断言;「前台高级筛选、搜索历史与域名速览」用例去掉收藏段落并更名。 - 22 张视觉基线按浅色主题全部重建,三轮复跑稳定;三个前台 E2E 单独跑通过。
- 用户要求继续压缩首页:Hero 高度从 700px+ 压至约 366px(1440 宽实测),min-height 移除、padding/gap/字号/统计卡内边距整体收紧,1440×900 首屏可直接看到域名列表。
- 移除 Hero 下的快捷分类链接行(全部/纯字母/纯数字/拼音/精品)与
QUICK_LINKS常量。 - 移除「全部资产」标题行与分类 pills 行(category-rail)及「更多分类」抽屉(categoryOpen 状态、ESC 处理一并清理);
domain-section改用aria-label命名。 - 新增「分类」下拉到筛选工具栏(最前):复用既有
categories数据与selectCategory,选项含全部/精品/全部分类及计数(本地 21 项),精品对应category=精品URL 序列化不变。 - 「复制链接」按钮从标题行移入工具栏右侧汇总区(视图切换旁)。
CATEGORY_ICONS与 categories 的 icon 字段成为死代码一并删除;CSS 用 postcss 移除 72 条死规则(hero-quick-links、asset-section-heading、category-rail/item/drawer 等),copy-filter-link样式保留。- 22 张基线按新首页重建三轮稳定;三个前台 E2E 单独跑通过。
- 用户反馈三项问题并已全部修复上线:筛选下拉白底不可读、位数筛选只有 2/3 位、首页仍有精选资产区。
- 下拉白底根因:Chromium 在
select自身背景为透明时会把原生弹层退化为白底,而 option 文字继承暗色主题浅色,白底浅字不可读。:root的color-scheme: dark无法阻止该退化(生产已验证存在仍复现)。修复是给select option显式深色背景与文字色(app.css 基础层)。 - 位数筛选从 group=two/three(仅 2/3 位)改为直接驱动既有的
minLength/maxLengthAPI 参数:全部、1–9 位(等值区间)、10 位以上(仅下限)。与高级筛选共用同一状态,高级面板填入自定义区间时下拉显示禁用的「自定义区间」项。旧 URL?group=two/three在解析时转换为等值区间,不再写回 group;GroupKey收窄为all | featured。 - 移除首页「精选资产」独立区块与
FeaturedDomainCard.tsx(方案文档 §1.3 B.5-6):Hero 之后直接是全部资产列表,精品域名靠主列表卡片的精品标记区分(.domain-card.featured样式保留 14 处)。CSS 用 postcss 移除 22 条整规则、6 条混合规则仅去掉精选选择器。facets.featured_domains仍被空结果推荐使用,API 不动。 - 真实浏览器验证:option 计算样式为
#1a1a1a/#f5f5f7;5 位/10 位以上/旧 group=two 三种过滤均返回正确长度的数据;三个前台 E2E 用例单独跑通过。 - 22 张视觉基线按新首页重建,三轮复跑稳定。
- Manrope 与 IBM Plex Mono 改为自托管 latin/latin-ext 子集(
public/fonts/*.woff2),index.html移除这两族的 Google Fonts 外链、改preloadManrope,fonts.css在app.css前由main.tsx引入。根因:Google Fonts 在中国大陆不可达,此前国内用户完全拿不到 Manrope(域名展示主字体),只能回退系统字体。 - 只自托管英文子集:Manrope 变量字体单文件覆盖 400-800,中文站点实际只触发 latin(约 55KB)。中文 Noto Sans SC 体积过大仍走 Google Fonts + 系统回退,未改 design.md 字体规范。
- 已在模拟国内网络(阻断 Google Fonts)下验证
document.fonts.check("700 16px Manrope")为真、域名元素 computed 字体为 Manrope,且实际只下载命中子集。 - 字体许可证按项目既有惯例(Instrument Serif 已有)补齐:
Manrope-OFL.txt、IBMPlexMono-OFL.txt。抓取逻辑固化为scripts/fetch-fonts.ts(pnpm fonts:fetch),Node fetch 不读代理故用 curl。 - 顺带修复域名管理基线的既有隐患:该页是虚拟滚动 + 滚动到底累积加载,fullPage 截图会不断触发加载把页面撑高(900/7531/13736px 乱跳),改为只截视口,五轮复跑稳定。
- 前台 CSS 108.66 → 111.19KB(+2.5KB 为 @font-face 声明);
pnpm check通过,22 张基线已按新字体重建。
- 新增 22 张 Playwright 视觉基线:前台 8 断点 × 首页/精品详情页共 16 张,后台概览/域名管理 × 390/1024/1440 共 6 张。项目此前没有任何视觉回归保障,而后续配色、响应式、交互方案改的全是 CSS。
- 基线稳定性依赖三处处理,改任何一处产品代码前都要留意:首页精选区用
Math.random洗牌(PublicPage.tsx:156),测试注入固定种子 PRNG;Hero 数字用 rAF 计数(CatalogueHero.tsx:29),animations:"disabled"管不了 rAF,改用emulateMedia({reducedMotion:"reduce"})走组件自身退化分支;卡片用content-visibility,fullPage 截图前先整页滚一遍再回顶部,否则总高抖动。 - 后台概览页有三处真实动态数据已 mask:
.stats-overview(今日 PV/UV)、.admin-two-columns(访客地区与域名点击计数)、.activity-list(相对时间,且每次登录都新增日志)。mask 只遮内容、仍检测布局,已验证未削弱报警能力。 - 拆出
admin.css:前台 CSS 135.93KB → 108.66KB(gzip 23.54 → 19.19KB),后台样式 29.07KB 独立 chunk 按需加载。 - 拆分方法是 DOM 探测归类,不是按命名前缀:939 个选择器在真实页面逐个探测,只搬「仅后台匹配」的 252 个。前后台共享选择器实测仅 19 个,留在
app.css。因两文件选择器不重叠,admin.css加载顺序不影响前台层叠,无需引入@layer。 - 19 条前后台混用一个声明的规则按选择器拆开分流,典型如
.domain-name, .stat-card strong, .hero-stats strong, .related-grid a, .kpi-list b, .admin-table td strong { font-family }。 - 已知未尽事项:约 14 条后台规则(
.admin-main textarea、.stat-card small、.admin-table th .sort-arrow等)因需要特定交互状态才出现、探测未覆盖,保守留在app.css,功能正确但少减约 1KB。改进方向是按选择器的根来判定归属,而非扩大状态探测。 - 生产版本
a35072f2-5ca1-46bb-9c10-c9ccfc70d319,verify:production通过;发布前完整备份backups/wanmi-20260717T014305Z.sql(862 域名 + 1992 条分类关联,Git 忽略)。
- 后台域名列表改为每页 100 条累积 + 桌面虚拟滚动:
useVirtualRows跟随页面滚动,只渲染视口附近的行,上下用占位行撑高;行高由首个真实行实测,列显示切换后重新测量。 - 虚拟化要求行等高,因此虚拟化状态下关键词强制单行(
.domains-table.is-virtualized);720px 以下表格是卡片式布局、行高不定,此时关闭虚拟化直接整段渲染。 - 批量精品/上架/隐藏/删除统一走确认弹窗并显示选中数量;批量分类从
window.prompt改为弹窗选择;选中超过 500 个 id(bulkDomainSchema上限)时前端按 500 自动分批,后端与 schema 未放宽。 - CSV dry-run 主体此前已存在,本轮补齐字段级差异:
diffImportRecord与ON CONFLICT子句同源,只列出 update 模式真正会改写的字段(日期/注册商走 COALESCE,简介/关键词走 CASE WHEN != ''),category、is_featured、is_listed受保护故不参与比较。 - 操作日志新增
/api/admin/logs/trend,按天补齐 7 个点(空白天补 0),前端复用概览页已有的 recharts 折线图;domains.bulk.delete归入"批量"而非"删除"。 - 本轮修复两个真实问题:后台搜索缺少去抖(逐字符触发整页重取,叠加无限滚动后拖垮 dev server);切换筛选条件不清空选择(批量操作会作用到当前看不见的域名)。
pnpm check通过:16 个测试文件、108 项测试成功(新增虚拟化区间、分批、导入差异与日志聚合共 30 项)。- E2E 每个用例单独跑均通过,新增用例覆盖虚拟化生效(渲染行数远少于已加载数)、无限滚动累积、两个批量弹窗、日志趋势图与 768/390px 无横向溢出。
- 已知本地环境问题:整套 E2E 连跑时,
管理员真实登录与关键词、简介与精品状态会在 admin 页之后goto公开页卡死;该现象在main上完全一致,与本轮改动无关,CI 上main为通过状态。
- 87 个
is_featured=true的域名已恢复独立详情页/d/:domain,由 Worker 查询 D1 并完成 SSR;普通域名仍以 301 跳转到/domains?q=域名。 - 详情页已包含 Instrument Serif 大标题、关键词、可选完整简介、后缀/字符数/类型/注册商/更新时间、访问按钮,以及同后缀 3 个和同长度 3 个推荐。
- SEO 已包含详情页 canonical、Open Graph、Twitter Card 和 Product JSON-LD;动态 OG 接口
/api/public/og/:domain返回 1200×630 PNG,并缓存 1 小时。 sitemap.xml当前包含首页与 87 个精品详情页,共 88 条 URL;速览弹窗仅为精品域名显示“查看详情页”链接。- 桌面与 390px 手机视口已核验;长域名会换行且没有横向溢出,页脚内容保持居中。
pnpm check通过:13 个 Vitest 文件、78 项测试全部成功;新增公开链路 Playwright E2E 在本地和https://unusedomain.com均通过。- GitHub
main功能提交为a82418e;本次功能验收时的 Cloudflare 生产版本为ca31cbfb-9be2-471a-b921-f9ed8d6bf6e7,生产验收脚本已通过。
用户反馈昨天已经移除的求购、线索和 DNS 又出现在生产,同时首页搜索按钮过宽、卡片操作文字拥挤且页面卡顿。根因不是需求反复,而是上次从落后的 codex/ui-notify-stats-contacts 分支发布,覆盖了 main 中的正确删除提交;该分支还曾发生一次 UTF-8 源码损坏。
处理方式:先在原分支上恢复 UTF-8,再合并最新 main,保留当前前台设计与后台七模块,实现本轮 UI/性能修改,并新增兼容历史生产 schema 的清理迁移。合并过程中未覆盖 .codex/ 或其他用户未跟踪文件。
- 删除注册商账户路由、凭据、外部服务商适配器和后台模块。
- 删除 DNS 路由、缓存、管理界面和写入能力。
- 删除求购表单、线索 API/后台模块、Turnstile 求购组件和相关统计。
/api/admin/registrars、/api/admin/leads、域名 DNS、/api/public/offers、RDAP 和旧公开详情端点均为 404。- 注册商名称仅保留为
domains.registrar_name普通文字资料。
- 搜索栏为 20px 图标、弹性输入、可选清空按钮、72px 搜索按钮;搜索按钮右边缘与搜索框完全对齐。
- 域名卡片只保留收藏、复制、速览三枚图标,所有按钮可见文字为空,使用
aria-label/title提供无障碍名称。 - 删除“我想要”和联系购买入口;域名名称直接访问外部域名,速览保留复制、收藏、访问和相似域名。
- 桌面和手机操作图标统一靠右;手机保持至少 44px 的触控高度。
- 公开页默认从 60 条降为 36 条,不再预取下一页。
- 数据版本检查从 8 秒改为 60 秒,并且只在页面可见时执行。
- 卡片使用
React.memo、content-visibility和布局隔离。 - 移除卡片逐项入场动画、重阴影、位移悬停、页头和移动底栏模糊。
- 请求缓存最多保留 20 项,失败自动失效。
0015_restore_domain_management_schema.sql被收敛为纯兼容桥,不再创建任何被删除的业务表。- 新增
0016_remove_registrar_dns_leads.sql:- 同时兼容全新安装的
registrar_name历史和生产库的registrar历史; - 合并为最终
registrar_name; - 重建导入暂存表,清除旧
registrar/registrar_label; - 删除
registrar_accounts、dns_records_cache、domain_leads; - 在重建
domains前备份并恢复domain_auto_categories和notification_deliveries; - 重建索引与公开数据版本触发器。
- 同时兼容全新安装的
- 新增历史生产兼容集成测试,覆盖旧列名、分类、通知历史、删表和暂存表规范化。
- D1:862 个域名、862 个公开、87 个精品、1992 条分类关联。
- 待删除历史数据:2 个注册商账户、1 条求购线索、0 条 DNS 缓存。
- 通知发送历史:0 条。
- 859 个权威 CSV 域名有
registrar_label;namesale.cn的“易名”仅在旧registrar列,迁移测试已覆盖并保留这种回退。 - 迁移前完整备份:
backups/wanmi-20260715T043546Z.sql(Git 忽略,禁止提交或分享)。
pnpm check:通过。- Vitest:13 个测试文件、78 项通过。
- Playwright:新增精品详情页、OG、sitemap、普通域名重定向和速览入口的完整公开链路 E2E,本地与生产均通过;原有管理员、搜索、卡片、数据刷新与响应式用例继续保留。
- 真实内置浏览器:
- 1440×900:
mx.ooo详情页标题、五项元数据、访问按钮和六个推荐均完整显示; - 390×844:长域名
donghuacheng.com自动换行且无横向溢出; - 收藏、复制、速览均可用,精品速览显示详情页入口,普通域名不显示;
- 控制台无应用警告或错误。
- 1440×900:
- 本次功能验收时的 Worker 版本为
ca31cbfb-9be2-471a-b921-f9ed8d6bf6e7;后续每次main部署都会生成新版本,以最新部署日志为准。 - 远程迁移:
0016_remove_registrar_dns_leads.sql已成功执行;远程迁移列表为空。 - 数据核验:域名/公开/精品为 862/862/87,分类关联为 1992,通知发送历史为 0,外键检查为空。
- 兼容核验:三个被删表均不存在,
namesale.cn.registrar_name保留为“易名”。 - 接口核验:健康检查正常;精品详情页返回 SSR、OG Meta 与 Product JSON-LD;普通域名详情链接跳转到目录搜索;OG 为 1200×630 PNG;sitemap 为 88 条 URL;已移除的 RDAP 与求购端点继续为 404。
- 浏览器核验:生产桌面和手机精品详情页、速览入口及长域名换行均通过;生产管理员登录成功,后台只显示七个保留模块,控制台无应用错误。
如果迁移或发布异常:
- 立即停止后续写操作;
- 使用 Cloudflare D1 Time Travel 或
backups/wanmi-20260715T043546Z.sql恢复; - 回滚 Worker 到发布前版本;
- 重新核对 862/862/87 和 1992 条分类关联后再开放后台写操作。
-
Playwright 截图基线按 平台+浏览器 命名(
*-chromium-win32.png);本地 Windows 生成的基线在 Linux CI 上永远找不到对应文件而必然失败,且字体渲染逐像素不同也无法跨平台比对。视觉基线 spec 顶部已test.skip(!!process.env.CI),新增视觉基线 spec 必须沿用;CI 全红时优先检查是不是又有人提交了带截图断言的用例。CI 的 verify 挂掉会连带 deploy job 不触发 —— main push 自动部署是本仓库的原有设计。 -
不要从落后功能分支直接发布;先比较
origin/main、当前分支和共同祖先。 -
不要用 GitHub 内容 API重写中文源码;发布前必须执行 UTF-8、类型、测试和构建检查。
-
D1 远程曾执行过仓库当前不存在的历史迁移,不能只按本地文件推断列名。
-
DROP TABLE domains会触发外键级联;重建前必须保护所有仍需保留的子表数据。 -
页面性能策略不再承诺 8–10 秒自动刷新;后台修改后手动刷新立即生效,自动检查为可见状态下每 60 秒一次。
-
Token 和后台密码曾出现在聊天中;本轮完成后应在 Cloudflare、GitHub 和后台轮换。