# smt 双模式改造方案
> 创建时间:2026-03-17
> 状态:待开发
> 相关文档:[[戒烟产品分析-smt-vs-quit-checkin]]
---
## 📁 现有项目结构
```
smt/
├── api/ # 接口封装
│ ├── auth.js # 登录认证
│ ├── smoke.js # 抽烟记录 API
│ ├── profile.js # 用户资料 API
│ ├── request.js # 请求封装
│ └── index.js # 统一导出
├── components/ # 业务组件
│ └── smoke-record-dialog/ # 记录弹框组件
├── config/ # 环境配置
│ └── index.js # BASE_URL 配置
├── hooks/ # 组合式逻辑
│ └── useLogin.js # 登录相关 hook
├── pages/ # 页面
│ ├── index/ # 首页 ⭐ 需要改造
│ ├── stats/ # 统计页
│ ├── logs/ # 历史记录页
│ ├── ai/ # AI 建议
│ ├── ai_summary/ # AI 总结
│ ├── share/ # 分享页
│ ├── profile/ # 个人中心
│ ├── quit-plan/ # 戒烟计划
│ └── onboarding/ # 新用户引导 ⭐ 需要改造
├── stores/ # Pinia 状态管理
│ ├── user.js # 用户状态 ⭐ 需要扩展
│ ├── profile.js # 用户资料 ⭐ 需要扩展
│ ├── logs.js # 记录状态
│ ├── dashboard.js # 首页数据
│ └── index.js # 统一导出
├── utils/ # 工具函数
│ ├── storage.js # 本地存储 ⭐ 需要扩展
│ ├── time.js # 时间处理
│ └── format.js # 格式化
├── static/ # 静态资源
├── App.vue # 应用入口
├── main.js # 主入口
├── pages.json # 页面配置 ⭐ 需要修改
└── manifest.json # 小程序配置
```
---
## 🔧 需要修改/新增的文件
### 新增文件
| 文件路径 | 说明 |
|----------|------|
| `pages/mode-select/index.vue` | **新增** - 模式选择引导页 |
| `pages/quit-home/index.vue` | **新增** - 戒烟打卡模式首页 |
| `pages/record-home/index.vue` | **新增** - 记录抽烟模式首页 |
| `components/quit-checkin-btn/index.vue` | **新增** - 打卡按钮组件 |
| `components/simple-counter/index.vue` | **新增** - 简易计数器组件 |
### 需要修改的文件
| 文件路径 | 修改内容 |
|----------|----------|
| `stores/user.js` | 添加 `mode` 字段存储用户模式 |
| `stores/profile.js` | 添加 `quitDays` 戒烟天数计算 |
| `utils/storage.js` | 添加 `USER_MODE_KEY` 常量 |
| `pages.json` | 添加新页面路由,修改首页逻辑 |
| `pages/onboarding/index.vue` | 完成引导后跳转到模式选择页 |
| `pages/profile/index.vue` | 添加模式切换入口 |
| `pages/index/index.vue` | 根据模式渲染不同首页(可选方案) |
---
## 📝 详细代码修改
### 1. `utils/storage.js` - 新增常量
```javascript
export const USER_MODE_KEY = 'user_mode' // 新增
```
---
### 2. `stores/user.js` - 扩展用户模式
```javascript
import { defineStore } from 'pinia'
import { storage, USER_KEY, SESSION_KEY, USER_MODE_KEY } from '@/utils/storage'
export const useUserStore = defineStore('user', {
state: () => ({
user: storage.get(USER_KEY),
sessionKey: storage.get(SESSION_KEY),
isLoggedIn: !!storage.get(SESSION_KEY),
mode: storage.get(USER_MODE_KEY) || null // 'quit' | 'record' | null
}),
actions: {
setUser(user, sessionKey) {
this.user = user
this.sessionKey = sessionKey
this.isLoggedIn = true
storage.set(USER_KEY, user)
storage.set(SESSION_KEY, sessionKey)
},
setMode(mode) {
this.mode = mode
storage.set(USER_MODE_KEY, mode)
},
logout() {
this.user = null
this.sessionKey = null
this.isLoggedIn = false
storage.remove(USER_KEY)
storage.remove(SESSION_KEY)
}
}
})
```
---
### 3. `pages.json` - 添加新页面
```json
{
"pages": [
{
"path": "pages/mode-select/index",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/quit-home/index",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "pages/record-home/index",
"style": {
"navigationBarTitleText": "记录抽烟"
}
},
{
"path": "pages/index/index",
"style": {
"navigationStyle": "custom"
}
}
]
}
```
---
### 4. `pages/mode-select/index.vue` - 模式选择页
```vue
你想怎么戒烟?
选择适合你的方式
🌟
我要戒烟打卡
记录坚持的天数,获得成就感
📊
我要记录抽烟
跟踪抽烟频率,分析戒烟进度
```
---
### 5. `pages/quit-home/index.vue` - 戒烟打卡首页
**界面设计:**
```
┌─────────────────────────┐
│ 🔥 已坚持 23 天 │
│ │
│ ┌─────────┐ │
│ │ 打卡 │ │
│ │ 今天没抽│ │
│ └─────────┘ │
│ │
│ 💰 已省下 184 元 │
│ 🫁 肺部正在恢复中... │
│ │
│ ───────────────────── │
│ 今日打卡 ✓ 08:30 │
└─────────────────────────┘
```
**核心代码:**
```vue
{{ todayChecked ? '✓' : '🔥' }}
{{ todayChecked ? '今日已打卡' : '打卡' }}
¥{{ savedMoney }}
已省下
{{ healthProgress }}%
健康恢复
🫁
{{ healthTip }}
```
---
### 6. `pages/record-home/index.vue` - 记录抽烟首页
**界面设计:**
```
┌─────────────────────────┐
│ 今天抽了 3 根 │
│ │
│ ┌─────────┐ │
│ │ +1 根 │ │
│ │ 点击记录│ │
│ └─────────┘ │
│ │
│ 昨日:4 根 │
│ 本周:18 根 │
│ │
│ ───────────────────── │
│ 历史记录 > │
└─────────────────────────┘
```
**核心代码:**
```vue
今天抽了
{{ todayCount }}
根
+
记录一根
昨日
{{ yesterdayCount }} 根
本周
{{ weekCount }} 根
```
---
### 7. `pages/profile/index.vue` - 添加模式切换
在个人中心添加:
```vue
```
---
## 📋 开发顺序
| 阶段 | 任务 | 预估时间 | 状态 |
|------|------|----------|------|
| **第一阶段** | 1. 修改 `utils/storage.js`
2. 修改 `stores/user.js`
3. 创建 `pages/mode-select/index.vue`
4. 修改 `pages.json` | 1-2h | ⬜ 待开始 |
| **第二阶段** | 1. 创建 `pages/quit-home/index.vue`
2. 打卡 API 对接
3. 省钱金额计算 | 2-3h | ⬜ 待开始 |
| **第三阶段** | 1. 创建 `pages/record-home/index.vue`
2. 一键记录 API 对接 | 1-2h | ⬜ 待开始 |
| **第四阶段** | 1. 修改 `pages/profile/index.vue` 模式切换
2. 修改引导流程跳转逻辑 | 1h | ⬜ 待开始 |
**总预估:5-8 小时**
---
## ⚠️ 注意事项
### 1. TabBar 问题
如果要让两种模式共用 TabBar,首页需要根据 mode 动态渲染:
```vue
```
### 2. 数据兼容
老用户没有 mode 字段,需要引导选择模式:
```javascript
// App.vue 或首页
if (!userStore.mode) {
uni.redirectTo({ url: '/pages/mode-select/index' })
}
```
### 3. API 对接
打卡功能需要后端新增接口:
```
POST /api/checkin
{
"date": "2026-03-17",
"quit_days": 23
}
```
或复用现有 resisted 接口。
---
## 🔗 相关文档
- [[戒烟产品分析-smt-vs-quit-checkin]]
- [[smt - 技术文档]]
- [[quit-checkin - 技术文档]]
---
#技术开发 #smt #戒烟 #小程序 #双模式