[aru_58]
昨天朋友圈被一个叫 SBTI 的赛博人格测试刷屏,朋友发我的时候点进去一看——站已经挂了。
在线体验: https://sbti.x4v.cn
开源仓库: https://github.com/zcjunblog/sbti-cloudbase
做了什么
简单说就是一个完整的人格测试网站:
30 道标准题 + 2 道隐藏支线**,答完会根据 15 个维度匹配 27 种赛博人格
每种人格都有专属插画、代号和毒舌描述**,比如「拿捏者 CTRL」「多情者 LOVE-R」「尤物 SEXY」
还有两个隐藏人格——命中饮酒支线会变成「酒鬼 DRUNK」,匹配度太低会被归为「HHHH」
测试完会生成一张 **1080×1600 的海报**(Canvas 绘制 + 二维码),可以直接发朋友圈。
技术栈
| 分类 | 选型 |
|------|------|
| 前端框架 | Next.js 16 + React 19 + TypeScript |
| 样式 | Tailwind CSS v4 |
| 部署 | 腾讯云 CloudBase(静态托管 + 云函数 + 云数据库) |
| 海报生成 | Canvas API + qrcode |
整体架构是 纯静态前端 + Serverless 后端:
用户浏览器
├── 静态页面(CDN)
└── 排行榜数据 → 云函数 → 云数据库
Next.js 配置了 output: "export" 静态导出,构建后生成纯 HTML 文件,部署到 CloudBase 静态托管走 CDN。排行榜相关的读写通过两个云函数完成,数据存在 CloudBase 的文档型数据库里。
所有测试判定逻辑都在浏览器本地完成,不需要请求服务端。服务端只负责排行榜的统计。
几个有意思的实现细节
答题切换动画
一个三阶段过渡:
1. 选中的选项变绿色高亮 + ✓,其他选项淡出
2. 整个题目区域向下滑动渐隐
3. 新题目自然出现
配合 `navigator.vibrate()` 的触感反馈,在手机上体验还不错。
海报生成
用 Canvas API 在客户端绘制 1080×1600 的 PNG 海报,包含人格信息、插画和二维码。有几个坑:
人格插画的宽高比不统一,用 object-contain 模式 + 底部对齐,避免拉伸
海报预览弹窗在小屏幕上会超出视口,改成了限制最大高度 + 图片自适应缩放
二维码用 qrcode 库生成 DataURL,直接画到 Canvas 上
排行榜去重
用 submissionId(UUID)直接作为云数据库文档的 _id。插入重复 _id 时数据库会报错,利用这个唯一约束天然防重,不需要先查再写的两步操作。
计数用 _.inc(1) 原子递增,天然支持并发,不需要锁。
Toast 提示
参考微信小程序的风格——屏幕正中、黑色半透明圆角卡片、3.5 秒自动消失。比顶部横幅或底部 Snackbar 更适合移动端的操作反馈。
从本地 JSON 到云数据库的迁移
最开始排行榜数据就是一个本地 JSON 文件,用 Node.js `fs` 读写。简单是简单,但有几个问题:
1. 不能部署到静态托管——没有 Node.js 运行时
2. 多实例会互相覆盖——每个进程有独立的写入队列
3. submissions 记录无限增长——10 万次提交 ≈ 15MB 的 JSON
迁移到 CloudBase 后:
排行榜数据存在云数据库的 sbti-rankings 集合(27 条文档)
去重记录存在 sbti-submissions 集合
rank 和 share 不存数据库,由云函数实时计算
前端改成客户端组件 useEffect 调用云函数获取数据
整个迁移的核心改动:删掉 `rankings-store.ts`(176 行本地文件读写)和 `api/` 目录(Next.js API 路由),新增 `cloudbase-api.ts`(48 行客户端 API)和两个云函数(各约 60 行)。
项目结构一览
sbti-cloudbase/
├── functions/ # CloudBase 云函数
│ ├── sbti-rankings-get/ # 查询排行榜
│ └── sbti-rankings-submit/ # 提交结果
├── src/
│ ├── app/ # 页面(首页、测试、结果、图鉴、榜单、说明、法律)
│ ├── components/ # 组件(答题流程、结果面板、海报、排行榜)
│ ├── lib/ # 业务逻辑(测试引擎、CloudBase API)
│ └── data/ # 静态数据(题库、人格定义)
├── cloudbaserc.json # CloudBase 部署配置
└── next.config.ts # 静态导出配置
最后
两个小时从零到上线,Vibe Coding 的效率确实惊人。核心判定逻辑、15 维折算、Canvas 海报这些比较复杂的部分,AI 基本都能一次性写对,省了大量时间。
去测测你是什么赛博人格 → https://sbti.x4v.cn
🎨 原创不易,支持请点赞、转载请注明本文作者为除夕
