Cloudflare Pages + Functions + D1,静态前端 index.html,接口在 functions/api/*。
- 建 D1 数据库:Cloudflare 后台 -> Workers & Pages -> D1 -> Create database,随便起个名字(比如
editorial-desk-db)。 - 建好表:进这个数据库的 Console 标签页,把
schema.sql的全部内容粘进去执行一次。 - 建 Pages 项目:Workers & Pages -> Create -> Pages -> Connect to Git,选这个仓库,Build 设置全部留空(没有构建步骤,Framework preset 选 "None",Build output directory 填
/)。 - 绑定数据库:Pages 项目建好后 -> Settings -> Functions -> D1 database bindings -> Add binding,Variable name 填
DB,选第 1 步建的数据库。 - 保存后 Cloudflare 会自动重新部署一次,之后打开 Pages 给的
*.pages.dev网址就能用了。
以后要改内容展示逻辑或加新功能,直接把新代码 push 到这个仓库的默认分支,Cloudflare 会自动重新构建部署,不需要重复上面 1-4 步。除非新版加了新的数据表(比如任务接力/投票功能),那还要额外做一步:
- 去 Cloudflare 后台 -> D1 -> 这个数据库 -> Console,把最新的
schema.sql全部内容再粘贴执行一次。因为每个建表语句都写了IF NOT EXISTS,已有的表和数据完全不受影响,只会把缺的新表建出来。
v0.4.0 给 topics 表加了三个新字段(access_mode、join_password_salt、join_password_hash),这种"给已有表加字段"的操作 SQLite 不支持写成"如果不存在才加",没法放进能反复安全重跑的 schema.sql 里。所以对已经在跑的数据库,只需要单独跑一次下面这三行(跟平时重跑整份 schema.sql是两件事,schema.sql 该跑还是跑,这三行额外跑一次就行):
ALTER TABLE topics ADD COLUMN access_mode TEXT NOT NULL DEFAULT 'public';
ALTER TABLE topics ADD COLUMN join_password_salt TEXT;
ALTER TABLE topics ADD COLUMN join_password_hash TEXT;去 D1 Console 粘贴执行。如果提示类似 "duplicate column name" 的错误,说明这三行之前已经跑过了,忽略就行,不影响数据。跑完之后,再把完整的 schema.sql 跑一遍(建 join_requests 表,用的是 IF NOT EXISTS,可以放心重跑)。
新建一个全新的数据库不用管这一节——直接跑完整的 schema.sql 一次就够了,新版的表结构已经包含在 CREATE TABLE 语句里了。
页脚的版本号在 index.html 里手动维护(搜索 VERSION 变量),每次改完功能就顺手改一下,方便以后知道线上是哪个版本、出问题了要回滚到哪个版本。
真正能回滚的地方是 Cloudflare Pages 项目的 Deployments 列表:每次 push 到 GitHub 都会生成一条新的部署记录,出问题了可以直接在那里点某条旧记录 "Rollback to this deployment",不需要改代码。页脚版本号只是方便肉眼对应"现在线上是哪次改动"。
- v0.1.0(首个可用版本):账户注册 / 登录(用户名 + 邮箱 + 密码,密码服务器端加盐 PBKDF2 哈希存储)、多主题("俱乐部")+ 主题内昵称、留言板(主题创建者可删除任何人的留言,举报后的应急处理)。
- v0.2.0:新增任务接力清单、投票、活跃度排行三个标签页;页脚加上版本号/日期标记。
- v0.3.0:主题创建者现在可以给主题改名(点标题旁边的"改名"按钮),不用再删了重建。
- v0.3.1:修复"改昵称"对话框自己关掉的问题——原因是每 4 秒一次的自动刷新会把编辑框整个重画掉,改的内容还没保存就没了;现在编辑期间会跳过那次自动刷新,同时给改名框加了"取消"按钮。
- v0.4.0(当前版本):主题访问控制——创建主题时可以选"公开 / 需要密码 / 需要审核",创建后也能在"设置"里改;不满足条件的人进主题看到的是一个密码框或"申请加入"按钮,看不到留言、清单、投票等任何内容(前后端都做了限制,不是只在界面上藏起来);审核制主题的创建者会多一个"入群申请"标签页,可以逐条通过/拒绝。这次改了数据库表结构,需要按下面"一次性升级"那节手动跑一下 SQL。
- 账户注册 / 登录
- 多主题("俱乐部"),主题内昵称
- 留言板,主题创建者可删除任何人的留言
- 任务接力清单:按顺序排好任务,前一项完成前,后一项不能被认领(前后端都做了校验);认领后可以标记完成或放弃;主题创建者可以删除任何一项(用于纠错)。
- 投票:发起问题 + 若干选项,成员可以投票,再点一次同一个选项会取消投票;发起人或主题创建者可以结束/重新开放投票;票数和百分比实时可见。
- 活跃度排行:按主题统计每个人的留言数、完成的接力任务数、投票数,加权算出一个总分排序(完成任务权重更高)。
- 主题改名/设置:主题创建者能改主题名称、加入方式、密码(点标题旁的"设置"按钮),其他人看不到这个按钮。
- 主题访问控制:主题可以设为「公开」「需要密码」「需要审核」三选一;不满足条件的人看不到主题里的任何内容(留言、清单、投票、活跃度全部拦截,服务器端强制),只能看到一个密码框或"申请加入"入口;审核制的主题,创建者能在"入群申请"标签页里逐条通过或拒绝。
- 绑定你自己的域名(1728.one)到这个 Pages 项目