新增
后台升级日志改成模态框
之前内联在升级面板中部,体验像"在页面里塞了一段终端"。改成全屏 <Modal size="xl"> 弹出:
- 顶部状态条:spinner / ✓ / ✗ + "正在拉取镜像 / 重建容器…" + 启动时间
- 60vh 高度可滚动正文,每行带语义高亮(时间戳 /
[START] / 容器名 / 成功 / WARN / ERROR)
- 底部蓝色扫光进度条(
upgradeLogProgressBar 关键帧 1.5s 一周)
- 新行自动滚动到末尾哨兵(
scrollIntoView 平滑),最新一行始终在视口
- 每行飘入动画(
upgradeLogLineIn:opacity 0→1 + 左滑 4px → 0,0.28s ease-out)
- 模态框关闭后页面留"查看升级日志"按钮,状态还在的话能随时重开
prefers-reduced-motion: reduce 用户偏好下自动关掉动画
Nebula 菜单声明 footer → category(中部分类导航)
admin 在「主题 → 菜单 → 分类导航」配的菜单项现在驱动首页中间的分类筛选条;不配时仍回退到自动列出所有分类(向后兼容)。
优化
Coding 页面热力图 rolling 365 天
之前按"自然年 1/1 ~ 12/31"排版,5 月落在中间不符合 GitHub 风格。改成今天落在最右、往前数 365 天。
Nebula 文章 <strong> 加粗看不出 → 真正加粗
font-weight: 600 → 700(系统字体 / Google Sans Display / Noto Sans SC 都加载了 700 weight),<b> 标签也加进选择器。之前 600 + 颜色跟正文同色 --nebula-white,加粗几乎看不出。
评论提交后页面无感更新(WordPress 风格)
CommentList 的 fetchComments 加 mode 参数(initial / switch / silent),提交回复后走 silent —— 列表保持显示、新数据无缝替换、不显示 loading 骨架、不强制 smooth-scroll 到顶部。原地多一条卡片,其它结构不动。
Nebula footer 没备案号时高度偏低
.nebula-footer 加 min-height: 96px + flex 垂直居中,.nebula-footer-row 上下 padding 18/14。无备案号站点 footer 不再像被压扁了。
后台版本号 / 铃铛红点 实时事件总线同步 ⭐ 关键改进
之前版本号 pill 用模块级 in-memory cache TTL 10 分钟,升级后左上角仍显旧版本要等 10 分钟或刷新页面。铃铛 60s 轮询,审批评论后红点不消失要等下一轮。
新增两条事件:
| 事件 |
触发场景 |
监听者 |
admin:version-changed |
升级成功(version / commit / built_at 任一变化) |
VersionBadge 立即清缓存重拉 |
admin:notifications-changed |
评论审批 / 拒绝 / 删除 / 移到垃圾箱 / 恢复(一处 fetchCounts 全场景覆盖) |
NotificationBell 立即重拉 |
服务端本来就实时,问题在前端缓存策略,现在不再要强制刷新 F5。
后台路由切换不再全屏闪
Suspense fallback 从 <Spinner overlay />(全屏遮罩)改成 <RouteFallback />(仅顶部 2px 蓝色不定进度条 + 透明主区域)。1.7MB 的 Analytics chunk 加载中也只有顶部一道扫光,侧栏 / 头部保持可见,体感顺滑。
Nebula 说说工具栏初始灰色 bug
CSS 写的 [style*="color:#7a7670"](无空格)跟 React 实际序列化的 color: #7a7670(带空格)匹配不上 → 图标保持原色 #7a7670 灰,强制刷新才白。修复:每条 inline-style 选择器都补带空格的版本 + 加 i 大小写不敏感标志。
Nebula 说说标签 / 月份弹出卡片配色
之前用 inline-style 字符串匹配(不可靠),改用类钩子 .moments-tag-chip / .moments-month-chip / .moments-year-btn(含 .is-active),CSS 用类选择器强覆盖。默认半透白底 + 半透白字、选中态用 sky 蓝底 + navy 深字。
Changelog 渲染支持 GFM 表格 + 分隔线
admin 后台和 utterlog.io/changelog 同步修复,renderChangelog() 加 GFM table parser → 输出 <table class="changelog-table">(紧凑边框 + 表头浅灰底 + zebra 行);--- 分隔线 → <hr/>。
后台"更新内容"标题只显示版本号
{info.latest.name || info.latest.version} → {info.latest.version}。GitHub release name 经常带长描述,标题里啰嗦。配套:把 GitHub releases 上的 v2.3.1 / v2.3.2 / v2.3.3 / v2.3.4 标题改成纯版本号,v2.0.2 补 v 前缀。
utterlog.io 静态版本代理
utterlog-landing 站构建期生成 public/api/version.json + public/api/releases.json,所有用户的 utterlog 后台改成查 https://utterlog.io/api/version.json,不再直接打 GitHub API。N 个用户共享同一份 CDN 缓存,配额从 60/h(匿名共享 IP)→ 实质无限。GitHub API 仍是 fallback。新增 version_source_url admin 选项给私有部署 / 企业 fork 指向自己的 mirror。
修复
管理员评论 / 回复邮件诊断日志
之前修复了管理员评论早返回不发邮件,但用户报告偶尔仍发。在 sendCommentNotifications 增加诊断日志:命中 admin 跳过时输出 [comment-notify] skipped — sender is admin (commentID=X, role=admin, user_id=1),没跳过时输出 role / user_id / senderIsAdmin 完整字段。下次出现可以直接看日志定位是 DB JOIN 没拿到 role 还是别的代码路径。