基于 Cloudflare 全家桶(Pages + D1 + R2)构建的轻量级私人论坛。采用原生 HTML/JS/CSS 开发,无前端框架,单页应用(SPA)架构。
定位是私人小站,供自己和好友使用,功能以实用为主:发帖、评论、个人主页、媒体上传,后台有完整的管理面板。
- 前端:原生 JavaScript (ES6+)、HTML5、CSS3(CSS Variables、Flexbox/Grid、动画)
- 前端库:Marked.js(Markdown 渲染)、DOMPurify(XSS 防护)、Cloudflare Turnstile(人机验证)
- 后端:Cloudflare Pages Functions(Edge 运行时)
- 数据库:Cloudflare D1(SQLite)
- 对象存储:Cloudflare R2(图片/视频)
- 缓存/限流:Cloudflare KV
- 鉴权:自研 Cookie Session + PBKDF2 密码哈希
/
├── login.html # 登录 / 注册入口(含 Turnstile 动态开关)
├── index.html # SPA 主容器(导航、所有视图模板)
├── style.css # 全局样式(主题变量、评论楼中楼、响应式适配)
├── script.js # 前端核心逻辑(路由、API 封装、渲染、交互)
└── functions/api/ # 后端 API(Cloudflare Pages Functions)
├── _middleware.js # 全局限流(KV,180次/分钟)
├── admin.js # 站点控制台接口(统计、反爬状态、公告、会话维护)
├── comments.js # 评论 CRUD(楼中楼、置顶、级联删除)
├── config.js # 公开系统配置(Turnstile 开关)
├── heartbeat.js # 在线心跳上报
├── like.js # 点赞 / 取消点赞
├── posts.js # 帖子 CRUD(分类、搜索、排序、置顶)
├── profile.js # 个人资料修改(昵称、签名、头像)
├── random_avatar.js # 随机像素头像生成
├── upload.js # R2 文件上传(白名单校验,最大 50MB)
├── user.js # Session 校验 + 过期 Session 自动清理
├── user-public.js # 公开用户信息查询
└── auth/
├── login.js # 登录(PBKDF2 校验、失败锁定、旧密码自动升级)
├── logout.js # 登出(清除 Session)
└── register.js # 注册(字符白名单、PBKDF2 哈希)
帖子系统
- 发帖支持 Markdown(含实时预览)、图片/视频上传
- 分类:灌水 / 技术 / 生活 / 提问 / 公告
- 心情标签:发帖时可选择心情(😊开心 / 😤吐槽 / 🤔思考 / 😴摸鱼 / 🔥热血 / 😢难过),显示在列表卡片和详情页标题旁
- 阅读时间估算:根据内容字数自动计算,显示在卡片和详情页(中文按300字/分钟)
- 列表视图:最新 / 热度 / 热议三种排序,支持分类筛选和全文搜索
- 列表 / 网格双布局切换,返回列表自动恢复滚动位置
评论系统
- 楼中楼:子评论缩进显示,紧跟父评论排列
- 楼层号:根评论显示 #1 #2 #3 编号
- 回复提示条:点击回复后顶部常驻显示"正在回复 @xxx"
- 字数限制:前后端双重校验,最多 500 字
- 代码块一键复制:hover 代码块时右上角出现复制按钮,复制成功后变绿显示"已复制 ✓"
- 点赞、置顶、编辑、删除(删除父评论级联清除子评论)
用户系统
- 注册:用户名字符白名单(中文/英文/数字/下划线/连字符)
- 登录:失败5次锁定15分钟,旧 SHA-256 密码自动升级为 PBKDF2
- 个人主页:头像、昵称、签名、帖子列表
站点控制台(仅管理员)
- 实时统计:在线用户、今日活跃、注册总数、帖子/评论数、有效会话
- 反爬状态:Turnstile 开关、登录失败计数、锁定账号列表
- 内容维护:最近帖子、最近评论、在线用户、公告发布
- 会话维护:清理 7 天前的过期 session
安全
- 全局限流:KV 实现,180次/分钟/IP,TTL 自动过期
- XSS 防护:DOMPurify 过滤所有 Markdown 输出
- 文件上传:MIME 类型 + 扩展名双重白名单
- Session 清理:每次用户请求时异步清理 7 天前的过期记录
| 表名 | 用途 |
|---|---|
| users | 用户信息、状态、封禁记录 |
| sessions | 登录会话(7天过期自动清理) |
| posts | 帖子内容、分类、置顶状态 |
| comments | 评论、楼中楼关系(parent_id) |
| likes | 点赞记录(帖子/评论) |
| system_settings | 系统开关(如 Turnstile) |
- 命名:JS 变量 camelCase,数据库字段 snake_case
- SQL:全部使用参数化查询(
.bind()),禁止字符串拼接 - 事务:涉及多表写操作使用
db.batch()或顺序 await - 异步:不阻塞响应的后台任务使用
context.waitUntil() - API 返回:统一格式
{ success: true, ... }或{ success: false, error: "..." } - 前端交互:所有异步操作必须有
showToast反馈 - 移动端:新增复杂界面必须在 style.css 底部添加
@media (max-width: 768px)块
- v2.6.1(2026-07-26)安全加固与性能优化:CSRF 修复、统一会话鉴权与过期校验、上传移除 SVG、安全响应头;帖子列表瘦身、点赞原子化、新增 D1 索引
- v2.6.0(2026-06-02)账号找回清理:登录页、设置页、后端接口和注册返回中移除旧找回凭据相关功能
- v2.5.9(2026-06-02)首页更新公告改为每个用户只展示一次:首次进入首页提醒,之后仅在关于页查看完整更新日志
- v2.5.8(2026-06-01)首页新增可见更新公告条:最新版本摘要直接展示,并链接到关于页完整更新日志
- v2.5.7(2026-06-01)移动端修复:网格视图恢复双列、评论区支持粘贴图片上传、搜索/评论输入框避免 iOS 聚焦放大,并补强元信息渲染转义
- v2.5.6(2026-05-31)管理面板升级为轻量站点控制台:反爬状态、登录异常、会话维护、最近评论和内容入口
- v2.5.5(2026-05-31)更新日志重做为版本时间线:当前版本突出展示、近期版本卡片化、历史版本折叠收纳
- v2.5.4(2026-05-31)移动端体验优化:首页筛选栏更紧凑、发帖页编辑/上传/发布区重排、评论输入与移动菜单交互优化、登录页小屏适配增强
- v2.5.3(2026-05-31)发帖体验继续打磨:拖拽上传、上传失败自动重试、置顶评论分组展示、发布元数据检查脚本
- v2.5.2(2026-05-31)编辑器体验优化:Markdown 占位文字自动选中、多图批量插入、发帖粘贴图片上传、评论多条置顶
- v2.4.x(2026-05-11~12)创意功能:阅读时间估算、代码块一键复制、帖子心情标签、TOC目录、无障碍优化、视觉打磨
- v2.3.x(2026-05-11)安全加固 + 交互体验优化 + 基础设施改进
- v2.2.x(2026-05-11)Markdown 渲染、图片灯箱、管理面板完善
- v2.1(2026-05-11)文件上传、灯箱、移动端适配
- v2.0(2026-05-09)全面精简重构,去除赛博朋克风格,PBKDF2 密码哈希
- v1.x(2024-2025)初始版本,含商城/背包/游戏等完整功能