碎碎念
← 返回时间线

黑匣子:给话剧队留下一份可以继续生长的档案

这是我个人博客的第一篇,献给我爱的黑匣子。

这是一个面向大学话剧队的作品与队员档案网站: 把作品、不同年份的演出版本、演员和幕后分工,以及剧照、剧本和音频放在一起。访问者可以顺着一部作品认识参与其中的人,也可以从队员档案回到他们参与过的演出。

我的灵感来源请看本站的另外一篇文章:

核心内容

黑匣子资料站解决的问题:

  • 话剧队的队员们一代一代更迭,没有一个属于我们队的档案
  • 话剧队的作品资料散在聊天记录、网盘和各自的设备里,想拿出来看看也不方便

如果有一个网站,把它们全存好。 这样随时想看某个戏的剧照或者人员的时候,就可以随时打开这个网站找到想要的。

为此,我把网站内容整理成两条关联的线索:

  • 一条是作品:每部戏一张卡片,展开后是不同年份的演出版本。 每个版本再关联当次的演员、后台分工和资料,剧照、剧本和音频都归在对应的演出下面。访问者可以顺着一部作品认识参与其中的人。

  • 另一条是队员:每位队员有自己的档案,记录参与过的作品。

从档案能回到演出,从演出也能找到人。

技术路线与优化历程

2026 年 9 月6日,项目启动。

第一版是python Flask 项目: 几天里按阶段接入 MySQL、定义队员模型,做出增删改查、登录注册与权限,再补上搜索分页、公告和资源库。

第一版在本地基本实现了“给话剧队留一份档案”。

但是想让大家看到整个网站需要线上部署,这里遇到了问题:

Flask 部署要有一台自己维护的服务器,大陆节点还得处理备案;账号密码、审核状态和本地文件也都要跟着搬。这套本地方案越往后越难直接上线。

所以项目没有继续补部署,而是准备换个部署策略:

  • 一个方向是租大陆或香港的服务器,页面、数据库和对象存储都自己写

  • 另一个方向是整体搬到 Cloudflare,用无服务器方式的部署

前者的成本会随下载量增长,也要长期自己维护系统;后者把页面、数据库和文件放到同一个平台上。最后选定后者。

选择后者就意味着要重建后端系统:

Flask 能在 Cloudflare的Workers 上运行,不代表Flask-SQLAlchemy、PyMySQL 和本地文件存储也能原样搬过去。数据库访问层和文件服务都得换掉。既然要动这些,就干脆在独立目录里用 TypeScript 与 Hono 重写,旧的 Flask 站保持可运行,作为对照和退路。最后的技术选型:

  • Cloudflare:一个 Worker 负责页面和接口,
  • D1 存数据
  • R2 存文件
  • Static Assets 提供静态资源,不再需要自己维护服务器。 迁移完成后,原来的 Python 站和 MySQL 导入工具链也从仓库里移除了。

之后的优化分几轮推进:

V1(2026-09-12)

  • 先让新站能替代旧站——补齐账号体系、内容管理与资料审核,把旧站数据迁过来;
  • 同时清理首页重复文字、放大海报、给作品独立配色,并加上服务端分页和静态资源指纹。

V2

  • 功能跑通后补齐真实排演需要的东西——作品支持多年份版本和 AB 角,认证、上传和审核都按版本处理;
  • 管理拆到独立后台方便日常操作,注册与匿名建议接入人机验证;
  • 视觉按剧场节目单整站改版,性能上做了延迟优化、公共图片和只读配置的边缘缓存。

V3(2026-09-19)

  • 功能基本齐了,重心转到体验和舞台感——演出时间轴、剧照沉浸浏览、作品幕后补充信息、图片悬停聚焦,以及用真实字节进度驱动、可跳过的红绒启幕;
  • 同时按反馈删掉重复入口、多余分隔线和空卡片。

V3 之后

  • 继续收尾——公告页改成木板告示牌;给幕布加头部启动脚本,避免脚本到达前先画出页面背景;
  • 再补上作品隐藏,让未公开的作品连同关联资料一起对普通用户不可见。

现在的技术架构与功能

全站是 TypeScript 与 Hono,运行在单个 Cloudflare Worker 中,页面由服务端生成,CSS 和浏览器脚本负责交互,同时适配电脑和手机。数据与文件分开存放:

  • D1:保存账号、作品、演出版本、演职员、资料、上传任务和审核记录,靠编号迁移逐版升级。
  • R2:保存图片和文件,桶是私有的,读取前先由网站校验权限;大文件走分片上传。
  • Static Assets:提供样式、浏览器脚本和静态图片。

生产环境绑定了主站和独立后台两个域名,启用了 Smart Placement、每小时一次的文件清理任务,以及 Cloudflare Turnstile 人机验证。

到目前这一步,网站能做的事大致有这些:

  • 看作品:每部戏一张卡片,进去后按年份列出不同演出版本,每个版本关联当次的演员、后台分工、剧情补充和资料;另有一条按年份排列的演出时间轴。
  • 翻资料:剧照、剧本和音频可以搜索、预览和下载;剧照在作品内沉浸浏览,关闭后回到原来的位置。
  • 认识队员:浏览队员档案和参与过的作品,给喜欢的队员送花并看到累计数量,另有鸣谢和贡献者名单。
  • 了解剧团:公告、招新和联系方式都在站内。
  • 管理网站:独立后台负责审核申请与资料、整理作品和演职员、管理账号与档案,也能编辑页面文案、背景、海报和主题色;未公开的作品可以整体隐藏,连同它的资料一起对普通用户不可见。

游客可以浏览公开内容,上传和下载需要登录;认证队员的低风险资料自动入库,普通账号提交后由管理员审核。分片上传已经可用,视频上传和邮箱自助找回密码在测试阶段暂不开放。

项目地址

仓库是公开的,欢迎提 issue:功能建议、访问问题、文档里的错别字,或者你也在做类似的话剧队档案,欢迎一起交流!

作者的话

  • 这个项目的需求是我想的,实现落地也是我做的,相当于利用 ai 工具做了一个全栈的项目。我既要想我到底要干嘛,还要考虑看怎么实现,确实有时候会脑力耗竭,希望未来这个项目能有更多人共创,分工明确,减少无效的工作

几张截图

下面几张取自本地验收记录,对应文中提到的几次优化。

演出时间轴页面,按年份列出作品与版本

演出时间轴:沿着年份重访每一次登台。

作品详情首屏,宽幅剧照在上、剧目信息在下

作品详情:宽幅剧照在上、剧目信息在下,剧照可在作品内沉浸浏览。

作品详情等待页上的红绒幕布

红绒启幕:等真实封面加载完再开幕,也可以直接查看或跳过。

公告页的木板告示牌设计

公告页改成木板上钉着的纸张。