学生做完一个 H5 作品后,接下来需要的往往不是更复杂的编辑器,而是能发布、能打开、能分享的入口。AI 训练营作品平台围绕这个场景,把作品展示与虚拟积分拍卖放在一起,让学生、家长和访客参与活动。
这里的 AI 首先指训练营和作品场景。源码中的作品检查采用确定性规则,界面上的“AI 审核”不能直接理解为大模型内容审核,更不代表内容安全认证。
少依赖,但不省略业务边界
服务使用 Node.js 原生 HTTP,浏览器端为 HTML、CSS 和 JavaScript,运行依赖清单仅列出 PostgreSQL 驱动 pg。server.js 组织请求与业务流程,数据库事务、会话签名、报告和备份则拆到独立模块。
存储既支持 PostgreSQL 关系表,也保留本地开发和测试用的 JSON 文件模式。两者不能混为一谈:后文的行锁与事务竞价属于 PostgreSQL 路径,文件模式没有同等的并发保障。
作品如何进入展示页
入口接受单个 HTML、完整文件夹或外部网站链接。文件夹上传会检查路径、入口和资源引用,再保存文件与元数据,记录入口文件、资源数量及体积,随后用于公开展示和沙箱播放。外部链接走单独流程,不执行上传文件的 HTML 检查。
静态资源使用内容哈希文件名,通过清单映射到页面,并提供检查脚本识别缺失或陈旧产物。上传资源可以在应用校验后交给 Nginx 发送,动态 HTML 处理仍留在 Node 侧。这是职责分工,不是已经测得吞吐提升的结论。
一次出价需要同时改变什么
拍卖使用虚拟积分,不是现金支付。关系型数据库路径先锁定拍品,再锁定参与者账户,检查活动状态、出价与累计待结算额度,然后在同一事务里写入竞价、更新最高价并记录事件。
请求携带幂等键时,重复提交可以识别已有结果,避免一次操作形成多次出价。这里不能省略前提:幂等键必须参与请求,机制才有稳定识别依据。
活动状态也不只靠用户刷新页面推动。独立 worker 周期性同步状态,复用数据库仓储逻辑,并防止自身任务重叠执行。默认调度间隔只是配置,不应被宣传成固定结算时延。
会话与备份的实际保障
会话使用 HMAC 签名,并支持多把密钥平滑轮换。备份将数据库导出与文件快照组合,生成校验清单,比较复制前后的文件内容,帮助发现复制过程中出现的变化。
但数据库和文件系统没有共同事务。校验清单不能凭空创造跨存储一致性,完整一致备份仍需要暂停业务写入;备份代码存在,也不等于已经完成恢复演练。
接下来值得改哪里
当前 server.js 仍较集中,上传、拍卖和页面交付可以逐步明确边界。关系状态加载还包含多表全量读取,后续应依据真实负载按页面和业务范围查询,而不是先引入更重的架构。
跨域页面的加载信号也不代表内容一定可见,因此需要保留打开原链接的回退。这个项目的取舍是用较少依赖完成明确流程,同时坦诚保留规则检查、文件模式和运维一致性的限制。
实现线索
竞价事务见 db/relational-repository.js,文件规则见 rule-review.js,备份见 lib/runtime-backup.js。本文依据实现整理,未运行活动负载测试、部署验证或恢复演练。