我用 uni-app 开发了一款戒烟微信小程序「不抽就是赢」:从烟盒管理到健康恢复,全链路科学戒烟

11 阅读5分钟

一款完全离线、基于科学算法的微信小程序,帮你见证身体每一天的积极变化。


为什么要做这个?

戒烟这件事,说难不难,说容易也不容易。市面上的戒烟 App 要么广告满天飞,要么把数据上传到云端让你心里不踏实。我就想做一个纯粹的工具——不需要注册、不需要联网,所有数据都在你自己的手机里,删了小程序就什么都没了。

于是有了微信小程序 「不抽就是赢」


🏠 首页:一屏掌控核心操作

打开小程序就是四个核心按钮,设计思路是 "行为即记录"

操作功能触发效果
🚬 点一根从当前烟盒扣支数,记录吸烟烟雾粒子动画(负面视觉强化)
🛡️ 忍住想抽但忍住了,记录克制赛博庆祝粒子动画(正向激励)
🤝 吸别人的记录吸烟但不扣自己烟盒无特效(中性记录)
🎁 递烟从自己烟盒扣支数但不记录吸烟烟盒库存减少

首页顶部展示戒烟天数、省下金额、未吸烟支数这三个核心指标。烟盒剩余支数一旦用完,会自动归档并提示开新盒。

这里有个有趣的设计:烟雾动画是负反馈——它让你直观地看到每吸一根烟带来的污染感;而忍住时的庆祝动画是正反馈——颜色从蓝色渐变到金橙色,粒子从中心炸开,像烟花一样。

首页-核心操作


📊 记录页:数据驱动的自省

使用柱状图 + Canvas 折线图双重视图展示近 7 天的吸烟趋势:

  • 柱状图:每天吸烟支数,今天高亮为橙色渐变
  • Canvas 折线:数据点连线,趋势一目了然
  • 日历组件:打卡视图,有记录的日期标绿/橙圆点

月度统计更是一针见血:零吸烟天数、吸烟天数、总吸烟量、最大连续戒烟天数——四个数字,你的月度表现一目了然。

记录页-数据趋势


❤️ 健康页:科学的身体恢复模型

这是整个小程序的灵魂模块

健康页-身体恢复模型

综合健康评分

纯 CSS 实现的环形进度图,按权重综合 7 大系统恢复百分比计算:

身体系统恢复标准权重
一氧化碳清除8小时15%
心率血压24小时20%
肺功能90天20%
味觉嗅觉48小时5%
循环系统14天15%
免疫系统180天10%
心血管疾病风险365天15%

每个系统都有进度条和科学说明。比如一氧化碳清除:使用 Sigmoid 函数100 / (1 + e^(-k*(ratio - 0.5))))模拟非线性恢复曲线,而非简单线性——生理恢复本来就是先快后慢的过程。

恢复系数 & 吸烟等级

算法会根据包年史(pack-year)动态调整恢复时间:

吸烟等级包年恢复系数影响
轻度< 51.0×标准恢复
中度5-151.3×恢复延后 30%
重度15-301.6×恢复延后 60%
极重度> 302.0×恢复延后 100%

而且恢复系数不是一成不变的——戒烟时间越长,系数越趋近于 1.0。超过 5 年后,系数影响仅保留 20%。

12 个恢复里程碑

从"20 分钟心率恢复正常"到"10 年肺癌风险减半",12 个阶梯式里程碑——每个里程碑的时间都根据你的吸烟等级动态调整。重度吸烟者的"肺功能提升"不再是标准 30 天,而是 48 天。


⚙️ 设置页:一切由你掌控

  • 烟盒管理:拍照记录烟盒,支持细支/中支/正常三种规格,自动统计总花费
  • 戒烟设置:戒烟日期、每日吸烟数、吸烟年限、模拟燃烧时长
  • 数据管理:一键重置所有数据
  • 隐私声明:明文标注"完全离线,数据仅存储在您的设备中"

🎨 UI 设计:iOS 26 Liquid Glass

整个界面采用 iOS 26 的 Liquid Glass(液态玻璃) 设计语言:

  • 磨砂玻璃卡片:background: rgba(255,255,255,0.45) + 微弱边框
  • 渐变背景:页面背景从蓝紫渐变到暖橙,与 Day 1 的康复感呼应
  • 微交互:条目点击有 hover-class 缩放反馈,柱状图有弹性动画
  • 字体排印:SF Pro 风格的数字化排版,数据用大号粗体,描述用小号灰色

🔒 隐私:真正的本地优先

这句话我写在了小程序设置页的底部:

本应用为完全离线的本地应用,所有数据仅存储在您的设备中,不会进行任何网络数据交互、上传或同步。

没有服务器、没有数据库、没有分析 SDK。你可以用抓包工具验证——这个小程序根本不发网络请求。


🛠 技术栈

前端框架:Vue 3 + Composition API
跨平台:uni-app(微信小程序 + H5)
动画:Canvas 2D API(烟雾粒子 / 庆祝粒子)
进度图:纯 CSS clip-path 环形图
存储:uni.storage(localStorage)
UI 风格:iOS Liquid Glass
  • 微信小程序不支持 roundRect / ellipse,自己写了 Canvas 2D Polyfill
  • requestAnimationFrame 在部分小程序环境不可用,改用 setInterval 动画循环
  • 环形进度图不用 Canvas、不用 SVG(微信小程序不支持),纯 CSS 的 clip-path + rotate + overflow:hidden 方案

🚀 使用方式

代码完全开源,你可以:

  1. 克隆项目,用 HBuilderX 导入
  2. npm install 安装依赖
  3. 运行到微信小程序或 H5

项目结构清晰,4 个 Tab 页面 + store 状态管理,适合学习 Vue3 + uni-app 实战开发。


最后

戒烟这件事,数据不会骗人。当你能看到"今天忍住 3 次"、"省下 ¥128"、"肺功能恢复 42%"这些数字时,自控力就不再是一个模糊的概念,而是看得见的进步。

如果你也在戒烟,或者身边有人在戒烟,希望这个小工具能帮上忙。


不抽就是赢 — 科学戒烟,健康相伴 🚭