更新日志
面向「博客号 BlogHao」部署用户的版本说明,每次官方发布(bloghao/bloghao 打 tag)时回填。格式遵循 Keep a Changelog,版本号语义见 docs/RELEASING.md「版本号」一节。
升级方式:同步本仓库最新代码后重新部署即可,D1 结构自动增量迁移;个别需要手动动作的条目以「⚠️ 升级注意」标出。开发线的完整迭代细节见各仓库 git log——这里是给部署用户的要点。
Unreleased
新增
- 管理员在前台直接删评论(2026-10-14):文章评论区 / 留言板 / 微博评论区每条留言旁边都有「删除」键(登录管理员可见,访客 HTML 里不存在;与「回复」并排),点一下二次确认后连这条下面的回复一起删掉(评论没有回收站,不可恢复)——顺手把评论计数就地更新,删完当页立即消失,不用再回后台。写操作复用后台同一个端点(会话鉴权)
- 微博视频(B19):微博(随手记)现在能带 1 个视频(mp4 / webm,≤25MB)——前台发布器、前台卡片编辑、后台「微博」页三处都有「视频」按钮,点选 / 粘贴 / 拖拽都行,上传带实时百分比;发布端自动抽视频第一帧当封面帧(抓不到就退化成无封面卡,播放不受影响),卡片按原始宽高占位、竖屏自动居中限高,无封面时叠 ▶ 角标(开播即收)。媒体区顺序为 正文 → 视频 → 配图;分享卡用封面帧作图,广场与开放接口取封面帧当缩略图(视频文件不出站,也不进 RSS)。API 契约见 docs/API.md(
video字段缺键即保留,旧调用点不会把视频清掉) - 站长 SEO 自定义(B20):后台「设置 → 站点 → SEO 与统计」新增三项——站点验证标签(一行一个
<meta>,支持 Google / Bing / 百度 / 搜狗 / 360 / Yandex 等验证字段)、统计脚本(provider 给的<script src="…">片段或脚本地址,仅 https;Umami / Plausible / CF Web Analytics / 51la 这类「地址 + data-* 配置」的都能用,需要内联配置代码的 GA4 / GTM 不支持)、robots.txt 追加段(额外 Sitemap、屏蔽目录等,附在内置规则之后)。服务端只做「解析 → 结构化重放」,不开裸 HTML 注入口;统计脚本域自动同步进 CSP - 分类描述 + 面包屑结构化数据(B23):分类可填一行描述(后台「文章 → 分类标签 → 编辑」),显示在分类归档页页头并作为该页的搜索引擎摘要;文章页与分类页输出
BreadcrumbList结构化数据(与既有 BlogPosting 并列),搜索结果里能出路径层级 - 链接预取 Speculation Rules(B24):前台自动声明同源链接预渲染(conservative 档——鼠标按下链接才触发,排除后台 / 开放 API / 外链中间页 / 订阅端点),点进去几乎瞬开;Chrome / Safari 新版生效、老浏览器静默忽略。配套保证统计诚实:预取与预渲染请求不计文章阅读量,访客打点在预渲染期间不报、页面被真正打开时补报
修复
- 上传大文件一律失败(超 2MB 全部 413):入站体积预检的上传豁免路径少了
/api前缀(真实路径是/api/admin/upload),于是上传端点一直按 2MB 的普通限额预检——视频、大图、开放接口配图只要超过 2MB 就地被拒,页面上只显示「上传失败」(前台图片因为上传前会压缩到几百 KB,所以一直没暴露)。现已修正,冒烟新增「上传体积预检链路」守着(3MB 必须放行 / 31MB 必须 413) - 视频偶尔被判「只支持 MP4 / WebM」:macOS 常把
.mp4报成video/quicktime,而客户端此前把「容器品牌无需改写」误当成「不认识的格式」直接拒掉。现在改为只认文件头:有ftyp就是 ISO-BMFF,品牌是qt的(iPhone 的 .mov)改写成 mp4,其余品牌原样按 mp4 上传;WebM 认 EBML 魔数,其它容器才提示换格式。另外,上传失败时会把服务端原话(如「请求体过大」「文件超过 25MB 限制」)显示出来,不再只有一句笼统的「上传失败」 - 视频入口合并(站长拍板):不再单设「视频」按钮,图片与视频共用同一个「加图」选择器,只保留「一条微博最多 1 个视频」的约束(多选时视频取第一个、其余当图片;拖拽 / 粘贴同样分流)
- iPhone(iOS Safari)选不到图库里的视频:视频按钮的选择器以前只列
video/mp4/video/webm,而 iOS 的「照片图库」是按它过滤的——iPhone 拍的视频是.mov,于是图库里一个视频都不显示(2026-10-13 站长手机实测)。现在选择器写video/*,选中后站点自动把.mov的容器改写成 MP4(只改文件头几字节的品牌位,不重编码、不损质量),H.264 的 iPhone 视频改完即全平台可放;HEVC(iPhone 默认的高效格式)上传时会提示一句「iPhone / Mac 正常,部分 Windows 浏览器放不出来」,想更稳可先导出 MP4。服务端「只收 MP4 / WebM」的白名单不变
2.5.1 - 2026-10-12
新增
- 文档中心站内搜索:官网文档中心全页面顶部新增搜索框,按标题与正文关键词即时过滤,结果直达具体小节锚点;搜索索引独立文件按需加载,不拖慢首屏。同时修掉「文档页丢样式」——资源引用一律改根绝对路径,
/docs(无斜杠)地址访问不再解析错资源;首页补文档中心入口
修复
- 分享卡片单图完整展示:微博只有一张配图时,卡片按图片真实比例完整绘制(与前台
.wb-imgs-1同口径:不裁切、不放大,高度上限 420px,过长的图自动缩成完整缩略图,比例变窄时水平居中);旧版写死 4:3 格子居中裁切,方形图上下共被裁掉约四分之一,图内文字常被切掉。多图九宫格与图加载失败的占位格维持原样
2.5.0 - 2026-10-12
本版本把「安全」升级为常态化机制:发布次日即完成第二轮全量审计(七类攻击面并行猎捕 + 独立复核,27 项发现 21 项修复,报告见 docs/),并顺手补上两块能力版图——AI 助手接入(MCP)与注册人机验证(Turnstile);后台概览新增「系统」状态卡与版本号展示,运维状态从此一眼可见。
新增
- MCP 服务器(B10):
POST /mcpStreamable HTTP 无状态模式(JSON-RPC 2.0 手写零依赖,不开 SSE),AI 助手(Claude / Cursor 等)凭一枚令牌即可发文 / 发微博 / 查文章 / 查评论——鉴权复用开放 API 同一枚令牌(空 = 接口关闭),演示站与一键闭站自动关闭;业务校验失败回工具错误不透内部堆栈。用法见 GUIDE §8.3、协议契约见 docs/API.md - 注册人机验证(Turnstile):后台「设置 → 会员」成对填入 Cloudflare Turnstile 的 Site Key / Secret Key 即启用——注册需先通过人机验证,批量小号刷积分的路子基本断掉;两键成对校验(只填一个整体拒绝),Secret 全链路打码,默认关闭、不开行为与从前完全一致。站点verify 校验 fail-closed:验证服务不可用时宁可暂挡注册,不留无验证窗口
- 后台系统状态卡(B12):概览页新增「系统」面板——微博 / 评论 / 会员体量、最近备份时间与体积、当前系统版本号,未开启备份有明确提示;
/admin/stats同步扩展出参 - JSON Feed(C12):
/feed.json输出 JSON Feed 1.1,与 RSS 共用同一份防泄漏口径(密码文只出作者自填摘要、会员锁文只出试读段、rssFullText 开关同效);日期走北京时间口径 - 评论区表情选择器:文章 / 留言板 / 微博评论三处输入框旁新增「😊 表情」入口,微信文本码表情一键插入,与编辑器同一套码表
- 后台版本号展示:概览「系统」卡显示当前系统版本号(
src/version.ts镜像 package.json,守卫测试防漂移),升级核对不用再猜 - 自托管控制面站点投稿:官网「他们也在写博客号」目录表单的投稿接收端点与投稿卡进控制面板(Origin 白名单 + 同 IP 每小时 5 条限流 + 同 URL 去重,落盘待人工上架)
- 官网新增两页:2026-10 全量安全审计报告大众版(
/docs/security-audit.html,普通用户也能看懂)与 Cloudflare 基础使用教程
变更
- wechat 主题导航与页脚重排:顶栏去掉「微博」独立入口(首页微博流头部自带「全部 →」,纯微博模式「首页」即微博),「留言板」「友情链接」进顶栏(挂在「关于我」后);页脚不再重复微博/留言板/友情链接/关于我,只留 排行榜/随机/RSS/管理 等次级入口;移动端顶栏单行横滑断点从 480px 抬到 560px(多两项后一行装得下了)
安全
- 第二轮全量安全审计(2026-10-12),27 项发现 21 项修复,全部带回归测试。要点:
- 积分日上限并发竞态:记账预查与写入不在同一事务,并发可刷穿「每日 20 分」刷排行榜——改为 batch 内条件写(条件 UPDATE + 超额条件 DELETE 谓词互斥),新增竞态回归用例
- 公开写端点入站体积预检:非 GET 请求先看 Content-Length(常规 2MB / 上传与外部微博 multipart 30MB),超限 413——此前 ~99MB JSON 可整读进内存打爆 isolate
- 密码文摘要泄漏:发布后补设访问密码时残留的自动摘要继续经 RSS / meta / 列表公开——现在设锁即与旧正文摘要比对清空,存量泄漏行下次保存自愈
- 广场锁文生命周期闭环:RSS 加
<bloghao:locked>机器可读标志、hub 拉取跳过锁文;加锁 / 升档 / 转草稿 / 删除即时广播deleted下架(firePlazaRetract)——「加密文不上广场」契约不再被订阅路绕过 - 出网与代理加固:书影音封面代理改走统一 SSRF 防线(重定向逐跳白名单复查 + 流式限长,新增
opts.hostOk钩子);自配 Webhook / 广场端点落配置即过公网校验 - 滥用面收口:会员评论限流叠加 IP 桶、统计打点限流收紧至 1/4、封禁会员过审不计分、关闭会员体系后存量会话按游客、恢复微博不再挤占置顶名额、TG webhook 按消息 ID 短窗幂等(超时重投不再重复发博)、演示站敏感面(备份 / 导出 / 粘贴转存 / 友链抓图)全部短路、
commentWebhookUrl进敏感键全链路打码 - 加固位:
/go中间页补frame-ancestors 'none'、编辑器预览补noopener、外观查表与导出包条目名防原型链 / 路径注入、卡片链接生成时协议白名单
- 回归测试 518 → 553,冒烟 189 项同步全绿;完整报告与逐条终态见 docs/SECURITY-AUDIT-REPORT-2026-10-12.md
修复
- wechat 移动端两处:真 390px 下评论头的作者/会员徽标与回复按钮被挤到框内拆字换行(「作者」拆成两行)——评论头放开 flex 换行、整字不拆;顶栏转横向滚动后「分类话题」下拉被滚动容器剪掉——菜单打开时放开导航裁剪并转导航锚定定位(site.js 切
snav-open,:has兜底无 JS) - 英文测试版随 v2.4.0 代码补齐:feed 频道标题走词典、分享卡与配图删除按钮文案收尾
- 自托管(docker-poc):控制面镜像构建补齐 scheme.ts(新增兄弟模块未进 COPY 清单导致构建必炸);广场 hub 的 Node 运行器源码入库(此前文档引用而源码漏提交)
2.4.0 - 2026-10-11
本版本是一次发布前全面安全审计的加固批次(五路并行审计:安全核心 / API 与会员 / 数据层 / 前端 / 渲染与基础设施),加上广场微博补漏自愈——微博上广场从此不怕推送失败,广场页信息流升级三段式布局。
新增
- 广场微博补漏自愈:微博此前只靠「发布瞬间推送」上广场,推送失败即永久缺席且没有自愈路——新增公开微博接口(
GET /api/public/weibo,只读、仅已发布内容、无敏感字段),广场 hub 定时拉取对齐(推送优先、拉取只补漏不覆盖,超 30 天的旧内容不补);hub 管理端新增「手动触发补漏」。协议见 docs/PLAZA.md「微博补漏」 - 广场卡三段式信息流:广场页卡片升级为「左身份位 / 中内容 / 右内容缩略图」三段式布局,长卡短卡节奏更清晰
安全
- 出网统一入口收口:公众号采集抓取与友链图标抓取改走统一 SSRF 防线(私网拒绝 + 重定向逐跳复查 + 响应体流式限长)——此前重定向落点不复查、响应体不设上限
- 演示站出网短路补齐:链接卡抓取、书影音搜索与封面代理三个端点此前在演示站可达(演示凭据公示),现一律 404,与「订阅与备份」外呼同口径
- 冷启动与恢复自愈:独立页面建表语句补齐软删列(特定冷启动路径曾造成整站 500 窗口,并新增「建表必须自带全部补列」的不变量测试);恢复备份后全文索引自动重建(此前记账位随备份回灌,恢复后关键词搜索会静默失效)
- 杂项加固:链接卡抓取对畸形实体解码的 500 防护;书影音中转响应体流式限长;外部发布落库改「魔数优先」(声明 Content-Type 不可信);会员锁文的社交卡图只出封面(OG 标记可能位于试读段之后);采集草稿响应统一过口令剥离出口
- 回归测试 487 → 518:会话 token 全模块(哈希落库 / 查询比对 / 限流)、style 白名单净化、出网重定向逐跳复查、上传魔数与原型链穿透、Markdown 协议拒绝列表、schema 同步不变量——安全核心里此前没有守卫的面全部补齐
修复
- 广场微博卡在「摘要与标题同文截断」时不再重复渲染(兼容截断省略号);广场 hub 管理端手动拉取的参数修正(此前触发即 500)
- 备份文件名与上传年月目录统一按北京时间取日期(此前走 UTC,北京每月 1 日 0-8 点会归错档);文章页 canonical / og:url / JSON-LD 的中文 slug 百分号编码,与 RSS / sitemap 同口径
- 后台友链 / 页面排序请求期间防连击(此前连点会挪两格);公众号采集插件补中文输入法回车判定
2.3.0 - 2026-10-11
本版本带来 英文测试版(后台一键把前台整体切英文,异常自动回退中文)、主题外观变量(颜色 / 正文字体 / 字号不动代码即可调,内测)与一整批阅读体验升级——阅读进度条与吸顶导航、目录滚动高亮、创作热力图、上一篇 / 下一篇与标题锚点、返回顶部与代码块一键复制、评论楼层号与楼主徽标;页脚升级为站点名片、顶部导航新增 RSS 订阅入口(常用订阅路径全兼容),新站有「三步开张」引导卡,后台设置页重组为四页签、侧栏按职能重排。
新增
- 英文测试版(内部代号 English 0.1):后台「设置 → 语言版本」可把前台界面整体切到英文(文章与微博正文保持原文),页面顶部公示测试版横幅、测试期搜索引擎不收录(noindex);英文版渲染出现异常时自动回退中文版并在后台顶部红色提醒(含错误摘要与时间),重新开启即重置。机制与词典集中在
src/i18n.ts(站长自填内容原样透传,中文版输出与历史版本完全一致);前台 JS 文案随<html data-edition="en">切换 - 页脚站点名片:全站页脚升级为名片式——左侧头像、站名与简介,右侧「共 N 篇 · 约 X 万字 · YYYY 年写起」站点足迹;统计由每晚备份任务刷新、冷启动自动播种,不给页面渲染增加任何查询
- 导航 RSS 图标:所有主题的顶部导航末尾新增 RSS 订阅入口(图标随主题配色),博客圈的老朋友一眼就能找到订阅地址;wechat 主题移动端导航同步改单行横滑——会员开启时药丸不再被挤成孤儿行,「分类话题」下拉菜单转 fixed 定位逃出滚动容器裁剪
- RSS 订阅别名:常用订阅路径盲猜兜底——
/feed、/rss、/atom.xml、/index.xml、/feeds/posts/default等惯用地址与 WordPress 风格的?feed=rss2全部指向规范订阅地址/rss.xml(同内容同缓存,阅读器按内容识别格式),访客或 AI 助手按习惯猜路径也能订上;前端展示、rel=alternate与 sitemap 只出规范地址,不产生重复入口,闭站时别名同样拦截 - 新站引导卡:一篇文章和一条微博都没有的新站,首页出现「三步开张」卡——写第一篇文章 / 挑一套皮肤 / 补上站名头像简介,每步直达后台对应页;发布第一篇内容后自动消失
- 阅读小件三则:归档页往下滚时当前年份钉在页首(长列表有了坐标系);点赞成功时爱心心跳一下(取消不弹);外链确认页标题带上站名(「即将离开『你的站名』」),跳转前的最后一眼也是品牌
- 阅读工具条 + 评论楼层:文章页顶部新增主色阅读进度条(七主题各自着色),wechat 主题导航全站吸顶——下滚收起让位正文、上滑即回,收起后左上角浮现当前章节胶囊接力报方位;wechat 桌面端目录卡随滚动高亮当前小节,滚动到哪跟到哪;文章与微博评论区带楼层号(#N 从 1 起编,楼中楼不占号,孤儿回复按顶层层级占号),作者徽标在文章与微博语境叫「楼主」、留言板沿用「作者」(双端渲染同构,镜像测试守着)。顺手新增 site.js 全文件语法守卫测试——一处解析错误即全站交互瘫痪,切片镜像测试拦不住顶层语法错误(本次实抓一例三元缺 else)
- 创作热力图:归档页头部新增 GitHub 风年历——过去一年每天的发帖密度一目了然(列 = 周、行 = 星期,色阶 = 当前主题主色的透明度四档,空格 = 主题分隔线色,七主题各自长出自己的颜色),悬浮任意格子显示日期与当天篇数,底部一行「过去一年写了 N 篇」与少→多图例;窄屏打开默认滚到最右——最新的周直接怼在眼前,往左滑回看更早;色阶整体加深(0.30/0.55/0.78/满档),近况一目了然。数据按北京时间日聚合,未配置/无数据时不渲染
- 上一篇/下一篇 + 标题锚点:文章页尾新增「上一篇 / 下一篇」导航(上一篇 = 更早一篇、下一篇 = 更新一篇,缺一侧出占位空位保持两端对齐,草稿预览不出;结构七主题共享、配色各主题自调);正文里所有 h2/h3 标题获得稳定锚点(wechat 主题桌面端目录卡与锚点同源),桌面端悬停标题浮现 ¶ 按钮、点击复制带锚点的文章链接直达该节(触屏设备不显示防误触)。标题锚点由渲染层在净化之后统一注入,不影响正文净化防线
- 阅读与运营体验六件套:前台长文滚动过一屏后右下角浮现「返回顶部」(平滑滚动、尊重 reduced-motion、底部贴 safe-area);代码块右上角一键复制(剪贴板 API 不可用时回落 execCommand,复制结果按钮闪现反馈,中英双语);Telegram 评论通知在待审时附「去审核」深链(手机上点开直达后台待审列表);后台回收站每条内容显示「N 天后自动彻底清除」倒计时(到期当晚清理);404 页新增「🎲 随机一篇」入口;归档页头部新增「今年已写 N 篇 · 约 X 万字」年度统计(七主题同步,字数为正文字符量的约数,英文版语序重组)
- 主题外观变量(内测):后台「皮肤」页新增「外观变量」面板(带内测标),7 个语义颜色角色(主色 / 正文文字 / 次要文字 / 页面背景 / 卡片底色 / 分隔线 / 正文链接)+ 正文字体(衬线宋体 / 黑体预设,或自定义字体栈)+ 正文字号(14-22px)不动代码即可调整,保存后全站即时生效、可随时一键恢复默认;面板只列出当前皮肤支持的项目(黑白极简的 minimal 无主色卡项),bitcoin / rednote 主色改色时深浅衍生色自动按 color-mix 推导。未配置时站点输出与历史版本完全一致。机制在
src/appearance.ts,颜色与字体栈全白名单校验防 CSS 注入 - 新主题「小红书」:首页改双列瀑布流笔记卡——封面裁切、粗标题两行截断、♥ 赞数与日期底栏,发现页原型,多图内容排成一册生活指南;未设头像时以品牌红「记」方块作站点门面,文章页尾带「相关笔记」推荐位,页脚带「标记我的生活」签名句。后台「皮肤」页一键启用
- 后台导航整改:设置页 11 个面板收进「站点 / 互动 / 进阶 / 数据」四页签——页内切换不丢未保存输入,「保存全部」跨页签生效,进阶页签集中闭站 / 灰度 / 外部服务等低频配置并提示「不确定的先别动」;侧栏按「数据 / 内容 / 互动 / 系统」四组重排,「分类」页并入文章页第二页签「分类标签」(原
#/categories地址自动重定向)
2.2.0 - 2026-10-10
本版本带来 会员体系(访客注册登录、积分与排行榜、会员专属文章分级)与 文章访问密码,搜索升级 FTS5 全文索引(中文友好、微博一并纳入),编辑器补齐写作五件套(表格 / 查找替换 / 本地备份 / 点图改 / 专注模式)与链接卡片;外链跳转提醒、微信表情、评论 QQ 头像、新主题「比特币」、上传图片自动剥离 EXIF/GPS 隐私元数据一并上车;官网新增内容聚合流「广场」,Docker 自托管补齐多租户控制面。
新增
- 链接卡片与插入站内文章:编辑器「插入链接」升级三页签——「网址卡片」自动抓取目标页标题 / 摘要 / 配图生成引用卡(编辑器内实时预览、抓不到自动退化域名占位卡),「普通链接」保留原有超链接行为,新增「站内文章」页签——搜索标题或翻页浏览已发布文章,选中后可选「卡片 / 超链接」两种样式(卡片带封面与摘要,加密文带 🔒)。卡片在六套主题下各有贴合主题配色的样式,Markdown 模式退化为纯链接插入。服务端新增
POST /api/admin/tools/linkmeta(SSRF 防护:仅 http(s) 公网地址、限长限时限频)与GET /api/admin/posts/lookup(轻出参选择器,注册在/:id之前);机制见src/linkmeta.ts - 广场:官网新增内容聚合流 bloghao.com/plaza——所有开通同步的博客号,其公开文章与微博按「权重 + 新文推荐 + 随机展示」混排成一条河。后台「设置 → 服务端插件」填入广场站点 Token(向官方登记站点后发放)并开启「广场同步」插件即接入,发布文章 / 微博自动同步(加密文与会员专属文不上广场);不想同步关掉插件即可。广场 hub 为独立 Worker(源码在
plaza/目录),协议与自建指南见 docs/PLAZA.md - 编辑器写作体验五件套:① 表格——工具栏插入、光标进表格浮现行列操作条(插删行列 / 表头互换 / 删表),Markdown 模式支持管道表格语法往返不丢;② 查找替换——顶栏按钮或
⌘/Ctrl + F,逐个 / 全部替换、区分大小写,富文本与 Markdown 模式都可用;③ 本地备份兜底——未保存的输入每 2 秒留一份浏览器本地备份,断网 / 崩溃 / 误关后重进会问是否恢复;④ 点击图片即可改——alt 描述与显示宽度(微信排版规范 data-w 口径)随时可调;⑤ 专注模式——底栏一键隐藏全部界面只留写作区,Esc退出 - 插图弹窗接媒体库:编辑器插图新增「媒体库」标签页,直接复用图床里已有的图片 / 视频,不必重复上传(分页浏览、自动探测原始宽度补 data-w)
- 会员体系与积分(默认关闭,后台「设置 → 会员功能」开启):访客可注册登录(独立于站长账号),评论自动带会员昵称与档位徽标、免填昵称;发表留言 / 评论 +2 分(先审后展模式下过审才计、同一条只计一次、单日上限 10 条)、每日登录 +1 分;后台新增「会员」管理页:列表 / 搜索 / 改档位 / 封禁(即刻踢下线,历史评论保留)
- 微信表情:文章编辑器与微博发布器(后台 + 前台)新增「😊 表情」面板,微信默认表情整套 117 个文本码([微笑] ~ [转圈]);正文、微博、评论区把文本码渲染成行内小图,手打的文本码同样生效,存库保持纯文本(RSS / 导出 / 搜索不受影响)。图源开源 Twemoji(CC-BY 4.0,归属见 public/emoji/README.md)
- 会员个人资料:会员中心(
/member)登录后出身份卡(昵称 / 档位 / 积分 / 注册时间)与两张修改卡——昵称注册时选填(中英文均可),每 30 天可修改一次(冷却中显示下次可改日期);密码修改需验证当前密码,成功后其他设备全部退出登录。本站不提供密码找回,注册与改密表单旁固定提醒「请务必记好密码」 - 积分排行榜:
/rank榜单页(展示条数 1-50 可调),按积分倒序、自己的名次高亮;只展示正常状态且积分大于 0 的会员 - 会员专属文章:编辑器「谁能看」四档(公开 / 仅登录会员 / 咖啡会员 / 顶级会员),非目标读者只见到服务端截断的试读段与升级遮挡卡——正文在服务端即被截断,浏览器拿不到全文;RSS 全文、公开接口、卡片摘要同步收敛为摘要口径,锁定文章评论区照常开放
- 文章访问密码:编辑器「信息」抽屉可为单篇文章开启「加密访问」并设置密码(服务端 PBKDF2 单向哈希,不回显)——访客打开只看到密码表单,输对后 30 天内免重复输入(HttpOnly 解锁 Cookie,改密即全端失效)。锁定期间正文 / 评论区 / 自动摘要 / RSS 全文一概不外泄,关键词搜索不命中加密文章;管理员登录照常可读。机制见
src/protect.ts,使用说明见 docs/GUIDE.md「写一篇文章」。与会员「谁能看」档位可叠加:密码墙优先,解锁后再按档位判定 - 外链跳转提醒:文章 / 页面 / 微博里指向第三方网站的链接,访客点击先经过「即将离开本站」确认页(目标域名 + 完整链接 + 免责声明,无 JS 不自动跳转);主流官方大站与本站自身域名白名单直跳(清单见
src/outlink.ts)。存库与 RSS / 导出保持原始 URL,提醒只在浏览器渲染层生效 - FTS5 全文搜索:
/search页从 LIKE 全表扫描升级为 SQLite FTS5 全文索引(trigram 分词适配中文,D1 原生支持),结果按相关度排序(bm25);站内微博正文一并纳入搜索(此前搜不到,命中展示前 20 条)。不足 3 个字的短词自动走原匹配逻辑,加密文章依旧整体退出关键词搜索。索引随文章 / 微博的增删改自动增量同步,老站升级后首次访问自动重建一次索引(D1 结构自动迁移,无需手动动作);机制见src/fts.ts - 微博正文链接自动超链:随手记里贴的 http(s) 链接自动渲染成可点击超链(URL 不吞中文与全角标点,句尾标点留在链接外);白名单外域直接跳转,其余经过外链提醒页
- 新主题「比特币」:比特币橙 × 暖白纸面的品牌素材库风——描边分层(无投影无渐变)、衬线大标题、等宽眉题,橙底按钮一律配近黑字保证对比度;未设头像时以 ₿ 标志作站点门面,页脚带「Don't trust, verify.」签名句,归档页为圆点时间线。后台「皮肤」页一键启用
- 上传图片自动剥离 EXIF / GPS 元数据:所有进入图床的图片(手动上传、编辑器粘贴、公众号采集与外部 API 转存)在落库前自动剥掉 EXIF / GPS / XMP / IPTC 等元数据——手机照片的拍摄坐标与设备信息不再随图公开。纯字节摘除、零画质损失、颜色配置(ICC)保留;带旋转标记(orientation ≠ 1)的照片为防显示颠倒整体保留,属小概率例外;历史已上传图片不回溯
- QQ 评论头像:会员中心可绑定 QQ 号(选填、不公开展示),文章 / 留言板 / 微博评论区与排行榜显示会员头像(服务端抓取腾讯头像后转存站内图床,国内直连);游客评论也可选填 QQ 号亮头像——不填不影响留言,填错格式只提示不拦截,同一 QQ 只抓一次头像,QQ 号本体任何页面不出现;未填 QQ 的用户显示昵称首字图标,作者(管理员)自己的评论与回复改用站点头像
- 微博同步 Buffer(X 等):服务端插件新增「微博同步 Buffer」——发微博后自动同步到 X 等社交平台,Buffer 排程平台免费档替用户承担 X API 按量计费(3 渠道);API Key 与渠道 ID 在「设置 → 服务端插件」一键拉取,超 280 字符自动截断、
#话题#转 X 话题格式、站内配图走公链直传。同步建立在新增的onWeiboPublished钩子上(后台新建即发 / 草稿转发布 / 开放 API / TG 机器人四条路都触发,编辑已发布微博不重推),插件开发见 docs/PLUGINS.md - Docker 多租户控制面:
docker-poc新增网页控制台(control.ts)——开站 / 停用 / 删除 / 重置密码免重启热加载;配套「开台脚本add-tenant.sh」一条命令开一个新博客站(--demo开演示种子站、--remove下线保留数据,兼容 jq / node 双后端),并附 1GB 内存小机部署清单 DEPLOY-MICRO.md(跑 30~50 个博客站的完整路径与容量账)
变更
- 自动 Slug 更有标准:新建文章 / 页面不填 Slug 时,英文标题仍转短横线格式;中文标题从「p-随机串」改为「发布日期 + 4 位随机位」(如
20261007-k3fx,按北京时间取日期),可读、可按日排序,重名自动加序号不会发布失败;已有文章的链接保持不变 - 会员排行挂件下线首页:首页不再渲染会员积分排行卡片,榜单收敛到
/rank页(导航「排行榜」入口不变);排行榜条数设置仍控制/rank展示人数 - 会员评论表单全站贯通:登录会员打开文章 / 留言板 / 微博评论,三处表单都显示「以会员 xxx 的身份发言」并免填昵称(此前仅服务端识别会员身份,表单仍按游客渲染昵称输入框)
- 上传压缩更省、全端统一:压缩触发阈值 300KB → 150KB(并补上「小文件但尺寸超大」也会触发缩图的口径),WebP 编码质量 0.82 → 0.75(业内通行的视觉无损甜点,比同画质 JPEG 约再省三成,透明不丢;回退 JPEG/PNG 口径仍 0.82);后台发布器 / 媒体库 / 头像 /favicon / OG 卡图此前各抄了一份只压 JPEG 不转 WebP 的旧实现,现统一改为与编辑器共用同一份 compressImage,全站上传行为一致
- 演示站正式域名 demo.bloghao.com:官网(bloghao.com)导航 / 首屏 / 快速开始 / 页脚的演示入口统一从 workers.dev 临时地址切到 demo.bloghao.com,并在快速开始与 README 里提醒「部署前可先去演示站转一圈」(账号 demo / demo1234,数据每 2 小时重置);
wrangler.demo.jsonc以routes声明该自定义域名,npm run deploy:demo部署时自动完成绑定与证书签发 - 默认主题排版优化:wechat 主题顶栏改 compact 布局(主条收窄五项、会员入口药丸右置),页脚改两段式链接组(排行榜等入口随对应功能开关显隐),移动端边距内收
修复
- 手机上传图片静默失败:iOS Safari 上,前台微博发布器「加图」/卡片编辑、后台编辑器插图 / 视频 / 封面、后台媒体库 / 头像 /favicon / OG 卡图等动态创建的文件选择器,能打开选图、也能选中照片,但文件永远回不到页面——上传从未开始、全程无任何提示,点发布就变成纯文字微博。根因是动态 file input 未挂到页面 DOM(iOS 对游离节点不回填 change),已统一改为先隐藏挂载再打开选图器;同时前台发布 / 保存新增「图片还在上传中」守卫,图片没传完不再允许提交
- 后台会员接口鉴权与出参加固:
GET/PUT /api/admin/members曾注册在鉴权中间件之前,未登录可直接读取全部会员(含口令哈希字段)或修改任意会员档位 / 封禁状态——已收回到鉴权之后,列表出参不再包含口令与盐字段 - 前台编辑微博保存假报错:管理员在前台微博卡片上编辑含链接或话题的正文并保存时,实际已保存成功但界面提示失败(客户端重渲染代码的捕获组错位);话题链接此前也会渲染成页内锚点而非话题筛选链接,均已修复
- 文章页点「回复」不再报错:管理员在文章页点击评论的回复按钮时,后台会产生一个无害的脚本错误并中断页面其他点击处理,已修复
- 定时发布兜底校验:通过 API 直接创建 / 切换「定时发布」状态但不填发布时间时,此前会静默落库并永远停在定时态不发布,现在明确拒绝并提示填写时间(后台编辑器不受影响,其本身已有校验)
- 「历史上的今天」跨年边界:北京时间 0-8 点发布内容的年份标签在跨年日期可能显示错一天,已与名次计算的时区口径统一
2.1.0 - 2026-10-06
本版本带来 Docker 自托管:同一套业务代码零改动跑进普通 Node 容器,不想把代码跑在 Cloudflare 上、手头有 VPS 的用户多了一条路(Cloudflare 版的部署方式不变)。
新增
- Docker 自托管(
docker-poc/):文章存内置 SQLite(WAL),图片存本地磁盘目录或 Cloudflare R2 桶(S3 兼容接口直连、SigV4 零依赖实现,启动自检 +--copy-local-to-r2幂等迁移存量图片);单进程按域名托管多个完全独立的博客站(库与上传物物理隔离),定时发布与北京时间 00:30 备份 / 回收站清理随容器运行;XWLBLOG_PORT换端口、XWLBLOG_BIND绑回环交给面板反代;数据卷属主由容器入口自动修复后降权运行;已在真实服务器全链路排练通过(验收 45 项,4核8G 舒适跑 100 站)。部署指引见 README「部署 → 方式三」与 docker-poc/DEPLOY.md
修复
- 回收站上线后首批加固:彻底删除的级联改守卫式子查询并前置于主行删除(主行 0 匹配不再误删存活文章的评论);恢复端点补
deleted_at守卫,过期定时文恢复自动转草稿并清掉publish_at(防恢复即撞发);媒体体检的清理 / 合并改分批提交(大批量不再整体失败);上传指纹回填独立限频桶(60/分钟);纯博客模式的页脚剥掉/weibo死链
2.0.0 - 2026-10-06
首个按「开发 / 发布双仓」流程打 tag 的基线版本。2.0 在「写文章」的基础上,整合了作者实例沉淀的一整套日常记录与互动能力:
- 短内容「微博 / 随手记」:图文时间线、话题归类、置顶、点赞与楼中楼评论,登录后前台可直接发布
- 公众号风写作后台:富文本 + Markdown 双模式、行首快捷排版、定时发布、粘贴图片自动压缩上云
- 评论互动:文章与微博楼中楼、作者回复徽标、先审后展、站点级开关
- 数据主权:一键导出(Markdown + 图片打包 / WordPress WXR),内容随时带走
- 独立页面系统与导航自定义、JSON-LD 结构化数据、站点模式(博客 / 微博自由组合与排序)
- 扩展体系:编辑器插件、服务端插件钩子(TG 频道同步 / 评论 Webhook / 页脚代码)、皮肤与插件市场
- 运维省心:媒体库体检(未引用 / 重复文件扫描清理)、回收站(删除 30 天可找回)、一键灰度 / 闭站、定时备份与告警
- 五套主题全部适配移动端;官方演示站每 2 小时自动重置体验