Day 12-19:功能爆发
这一周,PanPanMao 从一个"有意思的原型"变成了真正的平台。多条产品线、一套跑得起来的积分经济,还有一个让人看了觉得靠谱的视觉风格,都是这几天里堆出来的。
盘盘猫抛接多个功能模块:手相识别、邀请码、积分币
积分经济,看着简单做起来全是坑
邀请返利
每个用户有一个唯一的邀请码,邀请人有奖励,被邀请人有欢迎礼。听着简单,一个码背后其实有三层实现:落地页捕获 URL 参数 ?ref=PPM-XXXX-XXXX;localStorage 做兜底,用户可能先逛一圈再注册,邀请码得在整个注册流程里持久化;最后是服务端校验,Supabase RPC claim_referral_bonus() 带最大邀请限制、竞态条件防护和反作弊检测。
比这三层实现更有意思的,是返利金额怎么定。一开始金额不对称,邀请人 10 积分,被邀请人 3 积分,结果用户反馈觉得这是在"薅朋友":"是在利用朋友赚积分。"改成对称的各 5 积分之后,邀请量反而上去了。多给邀请人奖励不一定能促进传播,让双方都觉得公平,效果更好,这跟我原来的直觉正好相反。
PR #59 后来修了一个 bug:link_referral() 会拒绝有效的新用户,因为它在用户还没有任何使用记录之前就去检查 usage_log。等于在防一件还不可能发生的事,典型的过度防御。
用户资料和引导流程
PR #41 是一次大改版。用户资料字段(姓名、性别、生日、出生时辰、出生地、语言偏好)全部可编辑,认证后有全局引导弹窗强制完善资料,还加了"一键带入出生资料"按钮,自动填充八字、占星和 K 线的输入表单。
语言优先级设计得比较细。已登录用户的 localePreference 覆盖浏览器语言,匿名用户走浏览器检测,语言切换器改完还要同步回资料,全是状态同步的细节。
手相面相,整个项目技术最硬的功能
整个功能在 PR #1 里一次落地。56 个文件变更,新增 6,881 行代码,15 次 commit。
浏览器里跑机器学习
计算机视觉全在客户端跑,不需要服务端往返。五个 hook 各管一段:
useMediaPipeLoader:WASM 懒加载(约 3MB 二进制),模块级缓存,第一次慢,之后秒开useFaceDetector:BlazeFace 模型,在摄像头预览里以 60fps 跑,给用户"摄像头能识别到脸"的实时反馈useFaceLandmarker:478 点面部网格,拍照时跑一次,提取三停、五官、十二宫位的测量数据useHandLandmarker:21 点手部骨架,识别三大主线、辅助线和掌丘位置useCameraCapture:封装getUserMedia调用,8 秒超时兼容移动端浏览器
实时效果是掌纹上有绿色标记点、面部有特征网格。实现上是在视频画面上叠一层 Canvas,移动端用隔帧渲染保持可用帧率。
PR #35 后来给掌纹检测加了 GPU→CPU 回退,有些设备 WebGL 报告可用,推理时实际会挂,回退机制检测到失败后自动切到纯 CPU 模式重试。PR #50 把所有 WASM 和模型文件本地化到应用静态资源目录,因为中国用户访问 cdn.jsdelivr.net 根本不稳。做中国市场的产品,CDN 这关永远在那等着。
多模态 AI 解读
拍下来的图片通过多模态 prompt 发给 Claude 或 Gemini。光说一句"看看这个掌纹"只会得到泛泛的结果,所以 prompt 设计分了四层:先定角色,一位有 30 年经验的中国相术大师;再注入知识,五官、三停、十二宫位、脸型、掌纹含义、掌丘解读规则;然后要求用多个相术体系交叉验证分析;最后指定结构化输出,包括段落结构、置信度和可操作建议。
知识包的正确性靠 30 个领域测试来验证。prompt 模板还会根据性别注入特定知识,女性用户会得到额外的旺夫/克夫分析、柳庄四件解读和女性特有的掌纹特征分析。
从零到上线只用了四天。浏览器端 ML、多模态大模型、结构化 AI 输出,每一项单拿出来都是近几年才出现的新技术,组合在一起确实有种魔法的感觉。自己试用的时候都忍不住想:"这玩意儿怎么还挺像回事?"
落地页推倒重来
原来的暖棕金色主题不好使了。产品越来越正经,用户是带着事业、感情、健康这些真实问题来找答案的,"温馨"反而削弱了庄重感。
于是推倒重来,做成暗黑奢华风:深邃的黑底,金色点缀,猫从可爱吉祥物变成了神秘预言者。用户反馈里开始出现"值得信赖"和"专业"这样的词。同一个产品,换个色调,用户给出的信任就不一样。
第 19 天的成绩单
7 条产品线、跑起来的积分经济、邀请返利系统、暗黑奢华风落地页,还有浏览器端的掌纹和面相识别,背后是大约 700 次 commit。这一周结束的时候我意识到,瓶颈已经不在工程了,工程能力跟得上任何决定。现在卡住我的是产品决策本身:下一步做什么、怎么定位、收多少钱。这三个问题,写这篇日记的时候还没想清楚。