Repository navigation
v0.6.0
[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版本,拉取 GitHubSeanDictionary/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 同步:活跃主题切换或themeSettingsprop 变化(如就地更新后服务端返回新值)时重建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"))导致这些路径运行时PrismaClientValidationError500 的问题。此前因站点文章均经导入而非后台新建/编辑产生,该 bug 未被触发。 - 修复 ZIP 导入不保留
article.json的updatedAt的问题:此前导入虽在create时传入了updatedAt,但随后的contentPathupdate 被 Prisma@updatedAt自动覆盖为当前时间,导致导入的文章更新时间全部变成导入时刻。现在该 update 中显式回写updatedAt,导入的文章保留原更新时间。 - 修复维护性回填会踩文章更新时间的问题:
backfillArticleSearchContent原用prisma.article.update写contentHtml/searchText,被@updatedAt自动覆盖updatedAt为当前时刻,会毁掉导入时保留的 WP 修改时间。现改用 raw SQLUPDATE "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 升级到本版本需要手动执行以下步骤:
-
数据库迁移:容器启动时自动执行
prisma migrate deploy,新增contentHtml和searchText列。 -
搜索索引:无需手动操作。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。
-
更新 cardinal 主题:后台「主题」页使用「更新」按钮上传新主题包(见 Added 第一条)。
-
缓存失效: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