# 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 ``` --- ### 6. `pages/record-home/index.vue` - 记录抽烟首页 **界面设计:** ``` ┌─────────────────────────┐ │ 今天抽了 3 根 │ │ │ │ ┌─────────┐ │ │ │ +1 根 │ │ │ │ 点击记录│ │ │ └─────────┘ │ │ │ │ 昨日:4 根 │ │ 本周:18 根 │ │ │ │ ───────────────────── │ │ 历史记录 > │ └─────────────────────────┘ ``` **核心代码:** ```vue ``` --- ### 7. `pages/profile/index.vue` - 添加模式切换 在个人中心添加: ```vue ⚙️ 模式切换 {{ modeText }} ``` --- ## 📋 开发顺序 | 阶段 | 任务 | 预估时间 | 状态 | |------|------|----------|------| | **第一阶段** | 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 #戒烟 #小程序 #双模式