尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
小程序版「死了么」:人生进度可视化工具开发全复盘
第一次看到“微信小程序版「死了么APP」它来了”这句话的人多半会愣一下这名字也太直白了吧但稍微了解过互联网老梗的读者应该知道“死了么”并不是真的在做死亡直播而是网友对“寿命倒计时、人生剩余时间计算器”这类应用的调侃叫法。我这次就是因为看到网上那张“人生格子图”——把一整张 A4 纸画满格子每格代表一个月填色部分代表已经过完的人生——突然动了念头不如把它做成一个小程序让大家在微信里就能直观看到属于自己的“人生进度条”。结果这一做还真踩了不少坑。这篇文章我会完整复盘这个小程序的定位思路、寿命估算模型、前端展示逻辑、后端数据设计以及最折磨人的审核和合规问题。适合正在做工具类小程序、对“时间可视化”或“数据化人生”这个话题感兴趣的开发者阅读。哪怕你完全没接触过小程序开发也可以把它当成一个“如何把一个容易引发争议的点子落地成合规产品”的完整案例来看。1. 这个“吓人”的名字背后其实是个时间可视化产品1.1 “死了么”最早到底是个什么东西差不多十年前PC 互联网上就流行过一批“寿命计算器”网页。你输入出生日期、性别、吸烟史、运动频率页面等一下会弹出一个数字你大约还能活多少年。当时网友就给这类工具起了个外号——死了么。后来这个概念被搬到了移动端各种 APP 用了“死亡时钟”“倒数人生”之类的名字核心逻辑大同小异。我并不是想做一个猎奇、博眼球的工具。恰恰相反我在看到大量用户晒“人生格子图”的时候发现这种形式特别容易触动人心一张纸上几千个格子填色的部分是已经流逝的岁月空白部分是理论上的余生。人们围观它不是因为想死而是因为想活得更明白。所以“死了么”这个网络俗称在我看来就是一个流量入口它背后的需求其实是“时间感知”和“人生规划”。1.2 小程序版要怎么定位微信小程序相比独立 APP最大的优势就是不用下载、容易传播。一个用户测完寿命后生成一张海报发到群里其他人点开就能测。这种裂变路径天然适合“死了么”这类话题产品。但这里有一个关键取舍小程序的正式名称不能用“死了么”这三个字。一方面微信公众平台的命名规则不允许带有明显诅咒、恐吓意味的词汇另一方面即使用户会通过文章、海报知道它是“死了么”的小程序版正式上架也必须有一个中性、正向的介绍名称。我最终把小程序命名为主打“人生进度”方向的名字在功能页里也弱化“死亡”字眼重点展示“你的人生已经完成了 43%”“剩余天数”这类信息并且用温暖色调来平衡话题本身的冷感。定位上我从一开始就把它定义为“时间可视化工具”而不是算命软件。算命强调不确定性和宿命感而我想强调确定性和行动感过去的日子已经定格未来的时间可以规划。这个定位差异会在后面的估算模型和 UI 设计上处处体现。2. 核心功能拆解把人生剩余时间做成看得见的进度2.1 第一个功能寿命估算与剩余天数所有用户进入小程序后第一个页面是一份简易问卷。我没有做成那种动辄一二十道题的专业医疗问卷因为用户进来是带着娱乐和反思心态的不是来体检的。所以我只保留 6 个核心输入项出生年月、性别、是否吸烟、每周运动频率、平均睡眠时长、自我感知的压力水平。提交之后页面会跳转到结果页展示三组数字今天已经是你人生中的第 11348 天。基于统计模型估算你的参考寿命区间为 8291 岁。按中位数估算剩余天数约为 19800 天。注意展示顺序我把“已经度过的天数”放在最前面把“剩余天数”放在最后并且给“剩余天数”加了一个语义转换——在页面上它不叫“死亡倒计时”而是叫“未来额度”。这个小 trick 在后面审核和用户心理接受度上都很关键。你直接告诉用户“你只剩 19800 天”会引发焦虑但你告诉他“你还有 19800 天的额度可以规划”就变成了一种提醒。2.2 第二个功能人生进度条与生命格子数值展示对部分用户来说还不够有冲击力。所以结果页下方就是经典的“人生进度条”用一条横向的渐变进度条显示“已度过时间 / 预估寿命”的百分比例如 43%并配上文案“如果人生是一场通关游戏你现在已经打到了第 43% 的关卡。”再往下就是那张让无数人破防的“生命格子”图。我用 canvas 画出网格矩阵一个格子代表一个月。横向按 12 个月组成一年总共画到预设寿命对应的总格数。已经过完的月份用暖色填充未来的空格用浅灰色描边。用户手指划到任何一个空格都会提示“这是 2035 年 3 月你会是 43 岁距离预估终点还有 287 个月”。把抽象的数字变成可视化的格子以后冲击力会比单纯的数字大很多。这里有一个很隐蔽的产品细节格子图的“终点”我没有画一条终结线而是用渐变色把最后一部分网格慢慢变淡。因为如果愣愣地画一堵墙在那里用户会被吓到而渐变会传达“自然而然走到那边”的心理暗示。很多用户截图分享时都不觉得这是一个恐怖工具而是一个温柔提醒。2.3 第三个功能每日提醒与分享海报一个工具如果用户看完就关掉那就失去了长期价值。为了让用户再次打开我做了微信订阅消息提醒。用户在结果页可以点击“订阅每日提醒”授权成功后系统会每天上午推送一条模板消息内容类似“早上好。今天是你人生中的第 11349 天未来额度还剩 19799 天。要不要先完成一件小事”这条推送不是吓人用的而是建立“每日打卡”心智。分享海报是传播闭环的最后一环。我用 canvas 把用户的关键数据绘制成一张竖版海报上面包含三部分底部是渐变色背景中间是大号数字“19800”和“未来额度天”顶部是一行自定义文案用户生成前可以自己编辑默认是“愿你今天没有浪费额度”。海报底部放小程序码其他用户扫码后直接进入问卷页。从实际传播效果看这张海报比结果页本身的传播力高出一个量级。很多用户并不熟悉“死了么”这个概念但在朋友圈看到“19800 天额度”这种说法好奇心会被勾起来。3. 寿命估算模型数据从哪里来公式怎么设计3.1 平均寿命基准与区别计算“到底能活多少岁”这个问题没有标准答案。我采用的方案不是医学预测而是“人口统计 生活习惯校正”的娱乐化模型。首先确定一个基准寿命然后根据用户输入的各项指标做加减分修正最后输出一个合理区间。基准寿命来自公开发布的人口预期寿命数据。男女不同所以在问卷里专门采集性别信息男性基准设为 75 岁女性基准设为 81 岁。为什么不用一个统一数字因为男女预期寿命差异是统计事实用不同基准会让结果更接近直觉用户反馈也会更可信。这一块我必须强调这不是医疗建议。页面底部有一行永远置灰的小字“本结果基于人口统计与生活行为建模仅用于自我反思与时间规划不构成任何健康或医学判断。”这行字对用户可能不太起眼但对审核安全、被恶意举报后的申诉、以及用户心理健康保护都至关重要。3.2 生活习惯加减分模型在基准寿命基础上我设置了下面的校正规则吸烟每天吸烟超过 10 支减 5 岁偶尔吸烟减 2 岁。运动每周 3 次以上中等强度运动加 3 岁每周 12 次加 1 岁几乎不运动减 1 岁。睡眠平均每晚 78 小时加 2 岁67 小时不加不减不足 6 小时减 2 岁。压力自评压力水平“长期高压”减 2 岁“偶尔压力”不加不减“自我调节较好”加 1 岁。这些数值不是我拍脑袋定的而是参考了大量健康行为与预期寿命相关性研究的大致区间后做的简化映射。真正的医学模型要考虑遗传、疾病史、环境因素但在一个娱乐型小程序里堆砌复杂模型反而会降低可信度。简化以后用户反而更容易理解“哦因为我抽烟模型把寿命往下调了。”年龄因素也需要校正假如用户今年已经 70 岁就不能再从 75 岁基准开始简单扣减因为 70 岁之后本来就没有多少可扣空间。所以我会在代码里做一个保护校正只作用于 50 岁以下的用户超过 50 岁后增减幅度减半最低估算年龄不会低于 65 岁。这个保护不是为了数据准确而是为了避免给高龄用户造成无谓的心理冲击。3.3 误差区间与结果表达任何估算都有误差。如果只给一个“你还能活 78 年”的整数那就是在制造伪科学。我在结果页展示的是“参考寿命区间”中位数加减 5 岁。比如模型算出中位数 85 岁就显示“区间 8090 岁”。对于模型算出来中位数低于 70 岁的情况页面不会直接说“你大概率活不过 70”而是提示“你的生活模式中有一些可能影响长期健康的风险因素建议关注相关指标并把它当作一次调整生活节奏的机会。”措辞一定要把风险提示变成建议而不是宣判。这些模型逻辑全部放在云函数里运行前端只负责展示结果。这样做的原因有两个一是防止用户通过篡改前端代码刷出极端数据四处传播二是以后想调整系数时不需要发布新版小程序云函数直接更新就好。4. 小程序端技术实现细节4.1 页面结构与核心代码整个小程序一共四个主要页面问卷页收集用户输入作为首页。结果页展示寿命区间、进度条、生命格子。日历页全屏展示可滑动的生命格子宫格视图。设置页修改个人参数、查看隐私协议、申请注销数据。问卷页的表单校验比较常规唯一要注意的是出生年月组件。我不允许用户选择未来日期也不允许选择太早的日期超过 100 岁前置灰色不可选这样能过滤掉一部分乱填数据减少“活到了 130 岁”这种离谱结果被人截图传播。核心的剩余天数计算逻辑非常简单function calcRemainingDays(birthday, benchmark, correctedAge) { const now new Date(); const birth new Date(birthday); const livedMs now.getTime() - birth.getTime(); const livedDays Math.floor(livedMs / (1000 * 60 * 60 * 24)); const totalDays Math.round(correctedAge * 365.25); const remainingDays totalDays - livedDays; return { livedDays, totalDays, remainingDays, percent: Math.min(100, Math.round((livedDays / totalDays) * 100)) }; }把年龄换算成天数时用 365.25 而不是 365是为了近似处理闰年。如果直接用 365长期积累下来会出现“生日当天计算出的剩余天数不对”的问题。4.2 云开发数据库与用户数据隔离我用的是微信云开发。数据库里建了一个集合命名为 life_progress每条记录的字段包括openid、birthday、gender、smoke、sport、sleep、stress、resultAge、remainingDays、updatedAt。核心原则是“最小化采集”。我只需要 openid 来识别用户身份不需要昵称、头像、手机号。openid 本身是匿名标识就算数据库泄露也无法反查到具体手机号或微信号。这样隐私风险会小非常多审核时也容易解释。云函数 addRecord 接收前端传来的参数先校验格式再调用计算函数最后把结果写入数据库。这里有一个细节禁止前端直接写入数据库。因为前端代码可以被反编译如果前端直接调用数据库接口就有人能篡改数据伪装成其他用户。所有写入、读取都走云函数才能统一做权限校验。数据删除方面设置页提供“彻底注销并删除全部数据”按钮。用户点击后调用云函数 deleteUserData删除该 openid 下的所有记录同时返回一个“删除成功”的状态。这个功能在合规审核里是加分项因为越来越多平台要求给用户提供完整的删除权。4.3 订阅消息与定时提醒的实现订阅消息是小程序触达用户的主要手段但这里的坑比想象中大。微信订阅消息分为“一次性订阅”和“长期订阅”普通人能用的只有一次性订阅。也就是说用户授权一次你只能给他发一条消息发完之后想再发必须再授权一次。所以“每天提醒”这件事理论上做不到真正的长期推送。我实际的做法是在结果页引导用户点击“开启明日提醒”每次授权只负责明天一条。等到明天推送送达时推送文案里带了一个“继续订阅明天”的小程序链接用户点一下就可以再次完成授权。为了降低用户拒绝率订阅按钮不能做得太强硬。我没有用那种“不授权就不能看结果”的强制做法而是把订阅作为可选项放在结果展示完成之后。实测下来虽然订阅率只有 20% 左右但订阅过的用户次日打开率能达到 60%说明这批用户确实是有感而发的不是顺手乱点的。定时推送本身由云函数定时触发器实现每天上午 8 点执行一次exports.main async () { const users await getUserSubscriptions(); for (const user of users) { await sendSubscribeMessage(user.openid, { day: user.livedDays 1, remain: user.remainingDays - 1 }); } };注意云函数定时触发器正式发布后不支持手动调试只能等它到点跑。我在开发阶段把触发器时间临时改成了每分钟一次观察日志确认逻辑稳定后才改回每天 8 点这样可以缩短调试周期。5. 审核与合规这类小程序最容易踩的坑5.1 服务类目怎么选决定你能不能过审小程序类目选错基本就是死路。寿命预测、健康评估如果选“医疗健康”类目个人开发者根本没有资质企业开发者也要提供二类医疗器械或互联网医院相关的证照。所以我在服务类目上选择了“生活服务 工具 信息查询”并在提审描述里删掉了所有“寿命预测、死亡计算”这类字眼换成“人生进度统计、时间规划工具”。审核员对工具类目的小程序审核逻辑是你的功能确实是一个工具而不是诱导用户产生恐慌或迷信的内容。所以我把所有“你会死”的表述都改成了“参考寿命区间”“未来额度”。页面里绝对不能出现“死亡倒计时”“看看你什么时候死”这种文案。提审的截图也是关键。审核员会进入审核页面截图如果第一眼看到的是满屏“剩余天数”和深色骷髅头风格很可能直接拒审。我最初设计了一版暗黑风格 UI后来临时改成暖色渐变。审核页第一屏刻意展示的是“人生进度条”和“生命格子图”而不是剩余天数大字。提交后一次通过这证明“表达方式”比“功能本身”更能决定生死。5.2 用户生成内容与平台规则冲突在功能层面最容易被举报的是“用户自行生成分享海报”因为海报上包含“剩余额度”数字。如果用户自己编辑海报文案时写了“距离死亡还剩 XX 天”再发到朋友圈被其他用户看到后举报小程序就可能被判定为“制造焦虑、传播迷信”。为了解决这个问题我在分享编辑页做了两个限制。预设文案只能从系统给定的五条里选择不能自定义输入。“剩余额度”数字在海报上展示为“未来额度”底部固定加一行小字“统计模型仅供参考”。同时后台增加了关键词过滤一旦识别到海报文案里出现“死亡、去世、寿命、剩余天数”等词就会自动替换为默认文案。这个功能表面上是限制用户表达实际上保护了小程序不被举报封禁。5.3 隐私保护与注销机制小程序后台的“用户隐私保护指引”需要在提审前更新。因为收集了出生日期和性别这两项在部分平台的定义里属于个人信息所以必须明确声明收集目的用于生成个人时间统计报告。我还在用户首次进入问卷页时弹窗展示《隐私保护说明》点击同意后才能继续输入这个细节很多工具类小程序都会忽略。出于保险起见我没有采集用户的健康疾病史也没有接入任何体检报告读取能力。哪怕是用户主动填写在反馈里我都会建议客服只回复通用提示不要在系统里落地存储。这类敏感信息一旦进入数据库合规成本会变得不可控。6. 上线后的真实体验bug、用户反馈与迭代方向6.1 首周踩过的 bug 与排查思路上线第一周最典型的 bug 是“结果页剩余天数比预期少了一天”。最初我以为算法写错了排查才发现是时区问题。用户在 8 月 1 日早上 7 点测试服务器时间还是 7 月 31 日导致计算逻辑里 nbsp;new Date() 拿到的时间比当地时间晚了 8 小时天数就少算了一天。解决方法不是改算法而是在计算前先做时区归一化function getTodayInChina() { const now new Date(); const chinaTime new Date(now.getTime() 8 * 60 * 60 * 1000); return chinaTime.toISOString().slice(0, 10); }第二个高频问题是“分享海报生成失败”。排查后发现是低端安卓机的 canvas 宽度设置和 iPhone 不一致导致绘制内容超出画布边界。解决方式是先用 wx.getSystemInfoSync() 获取实际屏幕宽度再按宽度比例动态设置画布尺寸不能写死固定数值。第三个问题比较隐蔽部分 iOS 设备从分享卡片进入小程序时所有页面样式正常但 canvas 的生命格子图渲染不出来。原因是分享卡片进入触发了页面懒加载canvas 所在的组件在隐藏状态被初始化拿到的是 0 宽高。修复办法是在 onReady 生命周期里用 wx.nextTick 延迟绘制并加一个“重试绘制”按钮兜底。6.2 用户反馈中那些没想到的事上线两周后后台收到的反馈关键词不是“吓人”而是“感触”。很多人留言说看到填满的格子和剩余的空格之间那条线突然意识到自己已经过了大半段人生想做点真正有意义的事。这个反馈让我确认了产品方向它不是靠恐惧驱动而是靠稀缺感驱动。还有一些反馈完全超出预期。有用户把海报当成“人生进度更新”来发定期截图对比有用户把生命格子图打印出来贴在工位上还有人建议加入“十个目标倒计时”板块在剩余额度下面再展示几个具体目标比如“去南极看到极光”“出一本书”“陪孩子参加毕业典礼”每个目标对应一个时间节点这样“剩余时间”就从抽象数字变成具体日程了。也有用户明确表示不喜欢“百分比”这种表达认为看到 53% 的时候会产生生理性紧张。这就促使我思考下一版将进度条改成“环形图”弱化数字比例强化“还有多少空格”的直觉感受。毕竟这类产品用户体验的重点从来不是数值精度而是心理冲击。6.3 后续规划从“时间感知”走向“时间规划”上线稳定后我进行了一次更长期的产品思考如果只是让人看见“人生过去了多少”这个工具三个月后就会被删除。真正有价值的是帮人把“剩余额度”变成“行动清单”。后续迭代方向有三个。第一加入“人生目标清单”用户可以设定最多 5 个目标每个目标关联一个预计完成年份在格子图上用不同颜色的标记点标出来让用户直观看到目标分散在人生的哪些节点上。第二把数据维度从“寿命”扩展到“里程碑”比如“距离 60 岁退休还有 6314 天”“距离孩子 18 岁还有 2601 天”“距离 2029 年还有 2000 天”。这比单纯倒计时死亡更能触发行动愿望。第三增加“周回顾”数据报告每周一推送给用户本周已经完成的小目标数量让用户从小处获得正向反馈而不是每天早上被“剩余日额度”吓到。技术层面小程序会慢慢从云开发迁移到独立的服务端核心原因不是成本而是可控性。云开发虽然省事但在订阅消息、定时任务、自定义数据库索引上有很多限制。后续用户量增大之后独立后端才能保证批量推送和控制台统计的灵活性。最后再分享一个我在做这个项目时最重要的心得这类直接触碰“生命尽头”概念的产品设计的重点不是技术实现而是如何把“终点感”转译为“刻度感”。我在做第一版的时候也以为用户想看的是“我还能活多少岁”这个数字。后来观察真实用户行为发现大家真正记住的并不是 85 岁还是 88 岁而是那串被填满的格子里到底还有多少空白可以涂抹。所以如果你也想做类似方向的工具不用纠结估算模型能不能达到医学精度用心设计“直观可感受的剩余刻度”就对了。愿你在有限额度里做的就是那个最想做的事。
RELATED

相关推荐

Spring Profile 详解:多环境配置隔离与 Spring Boot 实践

Spring Profile 详解:多环境配置隔离与 Spring Boot 实践

Spring Profile 这词儿,在 Spring 家族里其实不算新了,但凡是做过几个正儿八经项目的 Java 开发者,几乎都得跟它打交道。我之前带过几个刚入行的新人,一上来就问“为什么我本地跑得好好的,打包发到服务器上就连不上数据…

📅 2026/10/11 5:10:41
本地模型持续进化:Sidecar架构与后训练实战指南

本地模型持续进化:Sidecar架构与后训练实战指南

1. 为什么"本地持续进化"是个真问题,而不是伪需求先把场景摆出来。你手头有一台配置还不错的机器,显卡显存够跑一个7B到14B量级的开源模型,日常拿它做代码补全、文档摘要、知识问答。用了一段时间你会发现一个很尴尬的事实&#xf…

📅 2026/10/11 5:05:41
AI Agent长期记忆难题:用mem0外挂记忆系统打造跨会话用户画像

AI Agent长期记忆难题:用mem0外挂记忆系统打造跨会话用户画像

做AI Agent开发的人,十个里有九个会被同一个问题卡住:对话一结束,Agent就把你忘得一干二净。你上午刚告诉它你偏好简洁回复、住在南方、正在做一个电商分析项目,下午再开一个新会话,它又变成第一次见面的陌生人。这就是…

📅 2026/10/11 5:05:41
MORE NEWS

更多资讯

📰

SpringBoot+Vue+MyBatis+MySQL协同过滤推荐系统实战:体育商品电商全栈

做毕设或练手全栈项目时,“体育商品推荐系统”这类题目很常见,但网上一抓一大把的源码,真正能跑通、能讲清楚原理的并不多。这篇博文围绕“基于SpringBootVueMyBatisMySQL的协同过滤推荐系统”这套技术栈,把协同过滤怎么落到体育电…

📰

SharpMap开源GIS:在.NET应用中轻量级地图渲染与空间查询实践

简介:SharpMap 开源GIS资源包面向.NET开发者与地理信息系统初学者,提供一套轻量级地图显示与地理数据操作方案,帮助在Web或桌面应用中快速集成地图功能,无需深厚GIS背景即可上手。包内共10个文件,以4个dll动态库、4个p…

📰

COMSOL与MATLAB联合仿真实战:从活接口配置到GUI自动化设计

前一阵子连续做了几个涉及多物理场耦合的项目,把COMSOL和MATLAB联合仿真这套流程彻底跑通了。从最开始的版本匹配问题、活接口调用报错,到后来参数扫描脚本化、GUI一键自动化操作,中间踩了不少坑,也积累了一些比较顺手的做法。这篇…

📰

Python字符串操作全指南:从基础方法到性能优化与数据清洗实战

刚开始学Python的时候,我总觉得字符串操作不过是print里面那几个引号的事。直到后来接手了一个数据清洗的脚本,几千行日志里全是乱七八糟的时间格式、混着中文和特殊符号的用户输入、还有动不动就报UnicodeDecodeError的编码坑,我才意识到字符…

📰

GEO生成式引擎优化实战:让DeepSeek、Kimi等大模型主动引用你的内容

你问 DeepSeek 一个问题,它给你拼出一段答案;这段答案的材料,可能就来自你某个产品页里的一句话。你再切到 Kimi,同样是这个问题,它给出的是一篇带序号、带出处的长文——又用了你那句话。这种感觉挺微妙的&#xff1a…

📰

AnyPS5项目实战:HID协议转换实现主机外设自由

玩主机的朋友应该都有过这种经历:主力机放在客厅,想在书房或者卧室继续打,但手柄、方向盘、摇杆这些外设基本都被主机官方生态“绑死”,换一台设备就得重新买一套外设,钱包实在遭不住。我之前折腾过一个叫 AnyPS5 的项…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬