Skip to content

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 09 Sep 08:53
· 14 commits to main since this release

[0.6.0] - 2026-09-09

Added

  • 主题包支持「就地更新」:上传安装时新增 mode 字段(install 默认 / update)。update 模式下 slug 已存在时先备份旧目录再覆盖写入,写入失败回滚到备份,不删除 ThemeCustomization 数据库行,用户自定义设置自然保留;可直接更新当前活跃主题(无需先切走)。若新版本号低于旧版本号,响应携带降级提示警告。后台「主题」页每张已安装主题卡新增「更新」按钮,复用导入确认弹窗并按 mode=update 提交。
  • 新增站点设置 siteIcon(站点图标 URL / favicon):后台「设置 → 站点信息」新增字段,保存后注入到前台主题渲染 <head> 的 <link rel="icon">(经 enrichCtx 追加到 seo_head,主题无需改动)与后台 root layout head;ctx.site.icon 供主题模板消费。
  • 新增 GET /api/admin/version 接口:读取当前 package.json 版本,拉取 GitHub SeanDictionary/SeanBlog-Frame 的 latest release tag 做 semver 比较,带 5 分钟内存缓存。
  • 后台侧边栏「SeanBlog Admin」下方新增小字版本行(当前版本号),点击触发版本检查;存在新版本时以绿色跟随显示新版本号,检查失败显示提示。
  • GET /api/health 响应新增 version(来自打包进镜像的 package.json.version):供 install.sh 在部署/升级时读取当前运行版本,无需鉴权。install.sh 据此在完成横幅打印「已升级 v旧 → v新 / 首次安装 v新 / 已运行 v新(未变化)」;应用未就绪或旧版 health 无 version 字段时省略版本行(向后兼容)。
  • 搜索索引自愈:searchArticles 现在搜索前先检测是否有 searchText 为 NULL 的已发布文章,有则现算(buildSearchText,纯 regex 无 Shiki)并用 raw SQL 写库补齐,然后走正常列查询。搜索结果不再依赖索引是否已预热——索引只是缓存,缓存冷时在搜索路径上即时补齐(只发生一次,之后纯快路径)。0.5.0 升级后无需任何手动回填步骤即可搜索。
  • 新增 POST /api/admin/articles/backfill-search 接口(仅 admin,记操作日志):可选的「预热」操作,原地回填存量文章的 contentHtml / searchText(幂等,?force=1 全量重渲染、?limit=N 限量)。用 raw SQL 只写这两列、不触发 @updatedAt,故不改动文章更新时间。非必须——搜索现已自愈。

Changed

  • 文章渲染管线新增 wrapFriendLinkGrid 后处理步骤:将连续的 <figure class="friend-link-card"> 自动包裹在 <div class="friend-link-grid"> 容器中,供主题侧以 CSS Grid 实现自适应多列布局。
  • 后台「主题」页设置读取统一走 getThemeSettings(与公开渲染同一条缓存路径),不再直接拼 dbRow + schema 默认值,消除 settingsVersion 未迁移前后台与前台显示不一致的窗口。
  • ThemesManager 客户端 state 同步:活跃主题切换或 themeSettings prop 变化(如就地更新后服务端返回新值)时重建 liveValues / themeSettingsState,避免表单与 Callout CSS 显示旧主题/旧值。
  • 保存主题设置时对「合并后的整体」跑一次 validateThemeSettingsValues,schema 收紧(如删除某 select 选项)时能及时发现库里残留旧值。
  • 主题包导出显式排除磁盘上可能残留的 theme-settings.json,避免陈旧快照被打进发布包;includeSettings=true 时改用新鲜快照。
  • 导入失败回滚区分 install/update:install 模式设置应用失败仍删整包回滚;update 模式不删已更新的文件(避免丢掉旧版)。

Fixed

  • 修复 ZIP 导入不回填 contentHtml / searchText 的问题:导入路径 createArticleInTransaction 此前创建后只写 contentPath,导致导入的文章 searchText 为 NULL(基于该列 ILIKE 的搜索失效,搜不到)、contentHtml 为 NULL(文章页每请求实时 Shiki 渲染 ~800ms)。现与 createArticle / updateArticle 一致,导入即预渲染 HTML 并生成搜索文本。
  • 修复 createArticle / updateArticle / 导入路径写 contentHtml 列时用错字段名(写成 contentHtml,实际模型字段为 legacyContentHtml,@map("contentHtml"))导致这些路径运行时 PrismaClientValidationError 500 的问题。此前因站点文章均经导入而非后台新建/编辑产生,该 bug 未被触发。
  • 修复 ZIP 导入不保留 article.json 的 updatedAt 的问题:此前导入虽在 create 时传入了 updatedAt,但随后的 contentPath update 被 Prisma @updatedAt 自动覆盖为当前时间,导致导入的文章更新时间全部变成导入时刻。现在该 update 中显式回写 updatedAt,导入的文章保留原更新时间。
  • 修复维护性回填会踩文章更新时间的问题:backfillArticleSearchContent 原用 prisma.article.update 写 contentHtml / searchText,被 @updatedAt 自动覆盖 updatedAt 为当前时刻,会毁掉导入时保留的 WP 修改时间。现改用 raw SQL UPDATE "Article" SET "contentHtml"=..., "search_text"=... WHERE "id"=...,只动这两列、不碰 updated_at。搜索路径的懒回填同样用 raw SQL。
  • 修复更新主题需「先卸载再上传」、卸载又禁止删除活跃主题导致的 4 步流程与设置丢失问题。
  • 修复前台分类/标签页 404 误报 500:publicErrorResponse 现识别 ApiError.status,404 统一走主题 404.hbs(回退内置静态 404),其他业务错误码透传其 status。此前 /tags/<不存在>、/categories/<不存在> 因 classifyError 仅判数据库错误、忽略 ApiError.status 而返回 500;文章详情路由靠手写兜底才正确,现已清理该重复兜底。
  • 修复 GitHub 风格提示框 [!IMPORTANT] / [!CAUTION] 拿不到对应配色的问题:remark-github-admonitions-to-directives 默认把 IMPORTANT 映射成 info、CAUTION 映射成 danger(为对齐 Docusaurus 词汇表),而主题 callout.css 配的是 .callout--important / .callout--caution,导致这两种写法命不中配色、回退灰。现给插件传自定义 mapping,让 IMPORTANT→important、CAUTION→caution,与指令写法 :::important / :::caution 同名同样式(对齐 GitHub 5 种词汇表)。同时把 CALLOUT_TYPES 收敛为这 5 种(note/tip/important/warning/caution),移除 info / success / danger::::info 等不再渲染成提示框(已确认无存量内容使用)。:::callout{type=...} 显式形式不受影响,仍可作自定义逃生口。

Removed

  • 移除主题「主页预览 / 文章预览」功能(/theme-preview 路由、后台卡片上的两个预览入口、docs 预览小节及相关说明)。预览页本是平台内置的简化 React 骨架,无法真实反映主题 Handlebars 模板与模板级自定义设置(如 cardinal 的 showTopBar、heroWidth、sidebarPosition 等),易误导上线判断;直接移除该功能,主题效果以真实前台为准。后台「主题」页每张主题卡按钮随之重排为单行:启用 / 更新 / 导出 / 卸载(默认主题仅启用)。

Upgrade Notes

从 0.5.0 升级到本版本需要手动执行以下步骤:

  1. 数据库迁移:容器启动时自动执行 prisma migrate deploy,新增 contentHtml 和 searchText 列。

  2. 搜索索引:无需手动操作。0.5.0 之前导入的文章 searchText / contentHtml 为 NULL,升级后首次搜索会自动现算并用 raw SQL 补齐 searchText(不改动文章更新时间),之后纯快路径——搜索结果不依赖索引是否预热。

    • searchText:搜索硬依赖,但懒回填已保证 NULL 行也能搜到并即时补齐,无需任何手动步骤。
    • contentHtml:仅文章页渲染性能优化。NULL 时文章页回退实时 Shiki 渲染(功能正确,~800ms,ISR 5 分钟兜底),不影响搜索。
    • (可选)想避免首次搜索的一次性现算成本、或预热 contentHtml 省掉文章页首次渲染,可在后台已登录态调一次 POST /api/admin/articles/backfill-search(幂等、raw SQL 不踩 updatedAt),返回 { processed, skipped, errored, total }。非必须。
    • 0.5.0 之后新建 / 编辑 / 导入的文章已在各自写入路径自动生成这两列,不会再产生 NULL。
  3. 更新 cardinal 主题:后台「主题」页使用「更新」按钮上传新主题包(见 Added 第一条)。

  4. 缓存失效:ISR 缓存 5 分钟,发布后最多等 5 分钟所有页面自动刷新。或手动触发:

    curl http://localhost:3000/

镜像

docker pull ghcr.io/seandictionary/seanblog-frame:0.6.0

部署见 docker-compose.yml。


Full Changelog: v0.5.0...v0.6.0