小宝不用一猫饰四角了:StrayPaw 从 Mock 到提审的四天

小宝不用一猫饰四角了:StrayPaw 从 Mock 到提审的四天

接上回:小宝教会我的事:520 夜,一个流浪动物小程序的诞生。

那篇结尾我写了一句:"下一步,对接真实的救助团队数据。到时候小宝就不用一猫饰四角了。"

四天后,这件事做完了。

cloud1 不是 cloud1

接入云开发的第一步就踩了坑。

微信云开发的环境有两个名字:一个是你自己起的显示名称,比如 cloud1;一个是系统分配的环境 ID,长这样:cloud1-d2gtyemv5242263c3。初始化的时候我很自然地写了 cloud1——毕竟控制台上就是这么显示的。

结果所有云函数调用全部静默失败。没报错,没提示,就是不工作。

花了几分钟才反应过来:env 要填那个带 hash 的完整 ID。改完一行代码,整个世界亮了。

这是云开发文档里说了但很容易忽略的东西。记下来,省得下次再踩。

给救助团队一个真正能用的后台

MVP 有前端没后端,用户能看不能管。Phase 2 的核心是让救助团队的工作人员能直接在手机上操作。

管理后台藏在一个彩蛋里——「关于我们」页面长按那个 🐾 emoji,验证 OpenID 白名单后进入。不需要额外的登录系统,微信生态自带身份。

后台做成了双 tab 布局:

动物管理:增删改查,每只动物一张完整的档案卡。除了基础的名字品种性别,还参考了首都爱护动物协会的信息卡,加了身高、颈围、胸围三个体型数据,以及一个特殊情况字段——有些被救助的动物可能有残疾或慢性病,领养人有权提前知道。

领养审核:用户提交申请后,管理员能看到完整信息(姓名、电话、居住情况、宠物经验、家人态度、领养理由),一键通过或拒绝。

照片上传加了一层容错:单张上传失败会自动重试一次,第二次再失败就跳过,不会因为一张图卡住整个流程。救助团队的志愿者不一定在网络好的地方操作,这个细节很重要。

小龙虾砍了十刀,两刀见血

代码写完,交给小龙虾 Review。第一轮 8.5 分,比 520 那次的 8 分又高了半分。但该挑的刺一个没少——十个问题,从分页缺失到空值防御全覆盖。

其中两个让我印象深刻。

第一刀:一只猫被两个人领养了怎么办?

这是一个经典的竞态问题。同一只动物如果有多个 pending 申请,管理员 approve 了第一个,动物状态变成 adopted——但其他申请还挂着 pending。申请人不知道自己已经没戏了。

修复方案:approve 时自动把同一只动物的其他 pending 申请 batch reject,附上理由"该动物已被其他申请人领养"。一个数据库操作,解决一个用户体验问题。

第二刀:通知时间差了八小时。

云函数运行在服务端,new Date() 拿到的是 UTC 时间。管理员收到的订阅消息上写着"申请时间:03:15",实际上用户是北京时间 11:15 提交的。

修复就一行:new Date(Date.now() + 8 * 3600 * 1000),然后用 getUTC* 系列方法格式化。不优雅——你可能会问为什么不用 toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai'}),因为微信云函数的 Node.js 环境 ICU 支持不完整,toLocaleString 表现不稳定。手动加偏移量是最稳的做法。

这两个问题有个共同点——功能看起来是好的,数据看起来也对,但用户感知到的是错的。这正是 Review 的价值所在:你自己测永远测不出"两个人同时申请一只猫"的场景。

订阅消息:打通最后一环

功能闭环差最后一环:用户提交申请后,管理员怎么知道?

微信的订阅消息机制有点反直觉——管理员需要主动授权,每次授权只允许发一条。所以每次进入后台时顺带请求一次订阅授权,用户提交申请后异步推送给所有管理员。.catch() 兜底——通知发不出去不应该影响用户的申请体验。

至此,完整的闭环跑通了:

用户浏览 → 提交申请 → 管理员收到通知 → 审核通过/拒绝 → 动物状态更新

上线三件套

小龙虾最后提了一个不是代码的问题:微信审核需要隐私协议和用户协议。

于是加了两个页面——隐私保护指引写清楚收集哪些信息、怎么用、怎么删;用户服务协议写清楚领养规范和免责条款。领养申请表单底部加了勾选框,不勾不让提交。

这三件事加起来大概二十分钟。但没有它们,审核直接打回。

改完再审。小龙虾给了 9 分:

🦞 "齐活了!隐私协议 + 用户协议 + 领养表单强制勾选,微信审核三件套到位 ✅ 可以提审了。祝一次过审 🚀"

从“能看”到“能用”

代码量翻了一倍,但更重要的是性质变了。Mock 数据变成了云数据库,页面预览变成了真实的管理工具,单机 demo 变成了可以部署给救助团队的产品。

备案已经提交,在等平台审核。通过之后就能上传代码、提交审核、正式发布。

小宝的照片还留在代码仓库里,作为 placeholder 和测试数据。但很快,那个位置会被真正等待领养的猫和狗替代。

到那时候,小宝就可以安心回到沙发上打呼噜了。

她的任务完成了 🐾

Comments