新增
- PostgreSQL 版本可选:安装器新增
PG_MAJOR 环境变量,可指定本机自动安装的 PostgreSQL 主版本。
- 站点图标自动生成整套 PNG 与 PWA manifest:后台上传 Favicon 时,除原有的多尺寸
.ico 外,另按各客户端约定生成 favicon-16x16、favicon-32x32、apple-touch-icon(iOS 添加到主屏)、android-chrome-192x192、android-chrome-512x512,全部由同一张原图渲染,一次上传全部更新。同时提供 /site.webmanifest(亦响应 /manifest.json),站点名、描述、主题色随后台设置变化,图标列表只列磁盘上真实存在的文件。
- 评论通知邮件支持一键审核:新评论通知里新增「通过」「标记垃圾」两个按钮,点开是确认页,确认后才生效。链接带签名,评论 ID、动作、有效期一并签入,改任一参数即失效,有效期 7 天。之所以不做成点开即生效:邮件网关会自动预取链接做安全扫描,那样垃圾评论会在站长看到邮件前就被扫描器自动通过。
- 评论标注友链好友:评论者填的网址命中友链库时,昵称后显示一枚方形标记,悬停显示对方站名。域名比对忽略协议、
www、端口和路径,友链填子域、评论填主域也认得出;github.io、vercel.app 这类托管平台下的不同子域不会互相误认。
- 从历史评论匹配友链邮箱:友链页新增「从评论匹配邮箱」,按域名把评论者留下的邮箱聚合到对应友链,列出出处与条数供逐条确认后保存,不自动写入。同一域名出现多个邮箱时会标出以便人工判断。
- 友链站点图标本地缓存:「刷新 ico」由刷新浏览器缓存改为真正抓取——解析对方页面的图标声明,回退到
/favicon.ico,转成 64 像素 WebP 存在本站。友链与订阅页的头像依次取手填图标、邮箱对应的 Gravatar、本地缓存图标,都没有时才回落到外部 favicon 服务。
- 顶部导航进度条:点击站内链接后,视口最上沿显示一条跟随主题色的细进度条,走满后淡出,补上此前站内切换毫无反馈的空档。150 毫秒内完成的导航不显示,避免一闪而过;五个主题共用同一实现,不需要各自改导航栏。
优化
- 默认数据库升级到 PostgreSQL 19:一行安装、
scripts/deploy.sh 与 CI 默认改装 PostgreSQL 19 + pgvector;19 的服务端包只在 PGDG 的 -pgdg-testing 套件里,脚本会按需自动启用并按主版本号限定组件,不影响其它 PGDG 包。19 目前仍是 beta,官方不建议用于生产,装机时用 PG_MAJOR=18 即可退回上一个正式版。
- 依赖瘦身:移除 4 个未被引用的依赖,并删除若干无引用的静态资源与一次性维护脚本。
- 全站浏览量统一口径:后台概览与 Telegram
/stats 改用同一个统计函数,不再一处按访问日志、另一处按文章阅读量求和,同名指标在两处显示同一个数字。
- 全站浏览量改为按页面加载计数:页脚的总浏览量改由服务端在渲染公开页时累加,与文章阅读量同一口径——打开算一次、刷新算一次,不再做时间窗口去重与频率限制,也不再依赖浏览器脚本,此前关闭脚本或被拦截插件挡下的访问会整个漏计。独立访客数仍按浏览器标识去重,访客明细的去重与限流保持不变。
- 首屏体积减小三分之一:页面数据不再重复携带整份站点上下文。此前根路由与页面路由各返回一份,菜单、分类、标签、归档统计(含整年热力图)、站点设置会被完整序列化两遍;文章页由此从 101.6 KB 降到 65.9 KB,其中内嵌数据脚本从 79.3 KB 降到 42.6 KB。压缩后传输差异有限,省下的主要是浏览器解析和建对象的开销。
修复
- 评论接口向匿名访客返回了邮箱与 IP(建议尽快升级):公开的评论列表接口把评论表整行下发,其中包含每条评论的邮箱、IP、客户端标识,无需登录即可读取。现按登录状态分流,匿名访客拿不到这些字段;头像仍正常显示,因为 Gravatar 地址由服务端算好后下发,不需要暴露邮箱。友链的邮箱字段同样收口,只对后台可见。
- 订阅页显示的文章数与实际不符:页面统计的是订阅库里的全部条目,而不少站点的 RSS 输出的是全站历史文章,导致显示上千篇、实际近期更新只有一百来篇。现在时间线与计数统一只看最近 30 天内发布的文章,并按发布时间而非抓取时间过滤。
- 文章阅读量口径统一为页面加载量:阅读量在文章详情页读取时同步 +1,页面上的数字就是这次访问之后的值;点进来算一次、刷新一次算一次,不再做时间窗口去重(只挡爬虫 UA)。累计数与按天明细由同一次判定写入,两个数字必然对得上;浏览器
/track 不再碰任何文章维度统计,只负责访客明细和全站访问量。
- 文章详情页被公共缓存冻结:文章页不再下发共享缓存头,是否属于文章详情按站点当前的固定链接结构判断,不再写死
/archives/ 前缀;分类、标签、归档等页面的缓存保持不变。
- 后台首屏体积下降:侧边栏 33 个动效图标改用 CSS 动画,移除了整个动画库依赖,布局代码块从 194 KB 降到 68 KB。此前该库随侧边栏进入首屏必经路径,连登录页也会一并下载。其中 7 个图标的描边生长效果受 CSS 能力限制,降级为缩放或旋转。
- 后台页面切换更快:侧边栏链接改为悬停即预取目标页面的代码与数据,此前要等点击后才开始下载。单个页面的代码只有几 KB,但一次网络往返在跨境访问时要半秒以上,这半秒原本每次切换都要等。预取结果缓存 30 秒,来回切换不重复请求。
- 后台表格操作按钮统一:列表行里的编辑、删除、通过、精选等操作收敛为同一个组件,按语义分五档配色(中性 / 危险 / 成功 / 警示 / 次要),平时保持中性、悬停时才显示语义色,避免整行按钮各自彩色喧宾夺主;已激活的状态(如已精选、已隐藏)常驻显色。此前 60 余处按钮各自手写颜色,同一种操作在不同页面深浅不一。
- 后台浮层阴影减轻:对话框、下拉菜单、通知面板等浮层此前使用框架默认的重阴影(最大 20 像素扩散),现统一收敛为两档规范阴影。
- 后台卡片去掉阴影:卡片此前边框与阴影同时存在,现只保留 1 像素描边。后台整体维持直角视觉,头像、开关、状态圆点、侧边栏折叠按钮等正圆元素不受影响。
- 第三方服务凭据支持一键测试:Mapbox、GitHub、Google 地图、高德、腾讯地图、TinyPNG 六项凭据各自新增「测试连接」按钮,会真实调用对方的官方接口校验,而非只检查格式——密钥被吊销、配额用尽、限制来源等情况只有实际请求才能发现。失败时给出可直接排查的原因(如未启用对应 API、被限流、网络不通),成功时附带额度信息。输入框留空则测试已保存的配置。GitHub 与 TinyPNG 会在打开页面时自动显示剩余额度——这两家把用量放在响应头里;其余几家的配额只在各自控制台,接口不返回。同时移除了 Mapbox API 地址设置项,四处消费点均已内置默认地址。
- 后台图标按钮尺寸统一:方形图标按钮新增 32 像素与 28 像素两档,表格行与密集列表不必再各自覆盖默认的 40 像素;站内 66 处手写覆盖已收进组件。同时移除仅做名称映射、不提供额外能力的按钮兼容层,全站只保留一个按钮实现。
- 后台设置页标签栏没有选中态:设置页与 AI 设置页的标签栏,当前所在的标签与其它标签看起来完全一样。原因是选中态样式挂在
data-selected 上,而组件库实际输出的是 aria-selected,样式一直没有生效。现在选中标签为主色文字加下边框,标签栏在窄屏改为横向滚动,不再换行挤压表单。
- 老库缺列导致统计整体停摆:补上
access_logs 的访客标识等字段迁移,并把文章日维度统计拆成独立事务,单张统计表出问题不再连带访客明细和全站访问量一起回滚。
- 首屏封面图闪一下模糊:图片效果的相关属性改为随首屏 HTML 一起下发,不再等前端脚本补写。此前
html[data-img-effect] 由客户端脚本在 hydration 后才写入,淡入规则晚一步生效,慢网络下首屏封面会出现「图已显示 → 突然模糊 → 再清晰」。
- 部分主题的封面图没有淡入:Renascent 的文章封面、Utterlog 的上/下篇缩略图与相关文章卡片,主题样式里各自声明的
transition: transform 特异性高于全局淡入规则,简写又把 filter、opacity 的过渡一并覆盖,导致模糊到清晰是瞬间跳变。这几处的悬停缩放统一交给全局 .cover-zoom。
- 封面图不再显示加载圆圈:文章卡片封面、上/下篇缩略图和相关文章缩略图去掉了转圈指示器,只保留淡入。转圈表达的是「还没加载好」,而封面几乎总是命中缓存,圆圈在那种情况下只是噪音;且它的隐藏依赖前端脚本改写加载标记,页面脚本稍慢,圆圈就会盖在已经画好的图上,调延迟也堵不住。图片未就绪时由容器的浅灰底色占位。
- 相关文章缩略图无视动画时长设置:三处组件的行内过渡时长由硬编码 0.5s 改为读取
--img-effect-duration,后台「图片处理 → 动画时长」对这些图同样生效。
- 评论回复通知的文案分行:原本「你好 XX,YY 回复了你在《文章标题》的评论」挤成一句,标题一长就折成三行,要读到最后才知道发生了什么。现在称呼与主句合并为一行,文章标题降为下方的附属信息单独成行。
- 通知邮件恢复排版模板:验证码、密码重置、评论回复、新评论通知、测试邮件此前都退化成没有样式的纯文本片段,现已恢复统一外壳——站点标识、卡片式排版、操作按钮、页脚,评论回复邮件保留退订入口。评论相关的通知补上了头像、评论时间与状态标记,站点 Logo 填相对路径时会自动补成绝对地址(邮件客户端无法解析相对路径)。用户填写的内容一律转义,评论正文无法注入 HTML。
移除
- 下线安全中心(不可逆,升级前请先备份):后台「安全」页及其全部功能移除——IP 封禁、安全事件时间线、CC 防护、GeoIP 地域封锁、全站 API 速率限制与
require_login 全站登录墙。请求链上的安全中间件一并摘除,/api/v1/security/* 接口不再存在。
升级会删除 ul_ip_bans、ul_security_events、ul_ip_reputation 三张表(第三张自上线以来就无代码引用)。应用一启动即执行,无法回滚,需要留档请在升级前导出:
```bash
set -a && . ./.env && set +a
PGPASSWORD="$DB_PASSWORD" pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" \
-t "${DB_PREFIX}ip_bans" -t "${DB_PREFIX}security_events" -t "${DB_PREFIX}ip_reputation" \
> security-tables-backup.sql
```
受影响的防护能力请在反向代理层补齐,Nginx 用 limit_req、Caddy 用 rate_limit,登录接口尤其需要——原先 /auth/login 有 10 次/分钟的暴力破解限制。GeoIP 数据源选择(访客统计、评论归属地、足迹等仍在使用)已迁到「设置 → 第三方服务」,原有取值不变。