写在前面
v1.0.1 上线一个月以来,博客运行基本稳定,但也积累了不少问题:主题切换形同虚设、API 没有任何安全防护、首页语言不统一……这次 v2.0 把能改的都改了。
后端升级
sql.js → better-sqlite3
v1 用的 sql.js 是纯内存数据库,每次写入都要全量序列化到磁盘,高并发时可能数据丢失或文件损坏。
v2 换成了 better-sqlite3,原生 C++ SQLite 绑定:
- WAL 模式:读写并发,不再互相阻塞
- busy_timeout:写冲突时自动重试,不会直接报错
- 优雅退出:进程收到 SIGINT/SIGTERM 时自动关闭数据库连接
const db = new Database(DB_PATH);
db.pragma("journal_mode = WAL");
db.pragma("busy_timeout = 5000");
IP 频率限制
以前任何人都可以无限刷评论和点赞。现在加了内存级频率限制:
- 评论:5 次/分钟
- 点赞:10 次/10 秒
超限返回 429 Too Many Requests,配合定期清理过期记录,内存占用可控。
CORS 白名单 + SQL 注入防护
API 的 Access-Control-Allow-Origin 从 * 改为白名单,只允许 playerz.fun 和 localhost。
数据库表名和列名改为白名单映射,杜绝模板字符串拼接带来的注入风险。
管理员评论系统
新增两个管理员接口(需密钥):
POST /api/admin/comment:以博主身份发评论,前端显示「博主」徽章DELETE /api/admin/comment:删除指定评论及其点赞
评论表新增 is_admin 字段,自动兼容旧数据。
前端修复
亮色/暗色主题
v1 的 light 和 dark 主题颜色完全一样(都是深色背景),主题切换按钮做了但没有任何效果。
v2 给亮色模式配了真正的浅色方案:
html[data-theme="light"] {
--background: #f8f9fa;
--foreground: #1a1a2e;
--accent: #4f46e5;
--muted: #e9ecef;
--border: #dee2e6;
}
theme-color meta 也按 prefers-color-scheme 分别设置了两个颜色。
首页中文化
首页 hero 区域从英文改为中文,和全站保持一致:
编码、系统与设计的思考。 记录技术实践中的点滴。
结构化数据修复
首页 JSON-LD 的 @type 从固定的 BlogPosting 改为动态判断:有 pubDatetime 的页面用 BlogPosting,首页等无日期页面用 WebSite。不会再出现 datePublished: "undefined"。
评论组件主题化
评论区的硬编码颜色(bg-[#1a1c2a]、border-[#2a2a3a])全部替换为主题变量(bg-muted、border-border),亮色/暗色模式下都能正确显示。
新功能
阅读时间估算
文章详情页现在显示「约 X 分钟阅读」,支持中英文混合计算:
- 中文:400 字/分钟
- 英文:220 词/分钟
const chineseChars = (cleanText.match(/[\u4e00-\u9fff]/g) || []).length;
const englishWords = englishText.split(/\s+/).filter(Boolean).length;
const minutes = chineseChars / 400 + englishWords / 220;
博主评论标识
通过管理员接口发的评论会带一个「博主」徽章,和普通用户评论区分开。
其他优化
| 项目 | 改动 |
|---|---|
| OG 图模板 | 白底→深色风格,和网站一致 |
| robots.txt | 屏蔽 /api/、/search、GPTBot |
| favicon.ico | 新增,不再 404 |
| 静态资源缓存 | /_astro/* 设为 immutable, max-age=1年 |
| GitHub 链接 | 指向正确的仓库地址 |
| Pagefind 构建 | 去掉冗余的 cp 回 public 步骤 |
| about.md | 部署描述修正为 Cloudflare Tunnel |
技术债务
还有一些已知待办:
- 标签大小写不一致(
AIvsai) - 分享链接未启用(
SHARE_LINKS为空) - OG 图字体和网站字体不统一(IBM Plex Mono vs Inter)
- 评论无 honeypot 防机器人
留到下个版本处理。
这次改动涉及后端重写和前端多处调整,如果你发现了什么问题,欢迎在评论区告诉我。
加载中...