欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

一、项目概述

运行效果图

image-20260410201928198

image-20260410201933935

image-20260410201939359

image-20260410201944026

1.1 应用简介

戒烟助手是一款专注于帮助用户戒烟的健康管理应用,通过记录戒烟天数、计算节省金额、追踪健康改善、提供戒烟知识等功能,帮助用户成功戒烟。应用以清新的绿色为主色调,象征健康与新生。

应用涵盖首页、进度、知识、设置四大模块。用户可以设置戒烟开始日期和吸烟频率,应用会自动计算戒烟天数、节省金额、未吸烟支数等数据;通过健康里程碑追踪身体恢复状况;学习戒烟知识和技巧;在烟瘾发作时获得即时帮助。

1.2 核心功能

功能模块 功能描述 实现方式
戒烟记录 记录戒烟天数和历程 日期计算
节省计算 计算节省的金钱 价格计算
健康追踪 追踪身体恢复状况 里程碑系统
知识库 提供戒烟知识和技巧 内容展示
紧急帮助 烟瘾发作时的应对方法 对话框提示
成就分享 分享戒烟成就 分享功能

1.3 吸烟频率定义

序号 频率名称 Emoji 每日支数 描述
1 轻度吸烟 🚬 5 每天少于5支
2 中度吸烟 🚬🚬 10 每天5-15支
3 重度吸烟 🚬🚬🚬 20 每天15-25支
4 严重吸烟 🚬🚬🚬🚬 30 每天超过25支

1.4 健康里程碑定义

序号 里程碑 Emoji 时间 描述
1 20分钟 ⏱️ 20分钟 心率和血压开始下降
2 12小时 🕐 12小时 血液中的一氧化碳水平恢复正常
3 2天 📅 2天 味觉和嗅觉开始恢复
4 2周 📆 2周 血液循环改善,肺功能提高
5 1个月 🗓️ 1个月 咳嗽和气短明显减少
6 3个月 📅 3个月 肺功能显著改善
7 6个月 📆 6个月 呼吸困难大幅减少
8 1年 🎂 1年 心脏病风险降低一半
9 5年 🎊 5年 中风风险降至非吸烟者水平
10 10年 🎉 10年 肺癌风险降低一半

1.5 技术栈

技术领域 技术选型 版本要求
开发框架 Flutter >= 3.0.0
编程语言 Dart >= 2.17.0
设计规范 Material Design 3 -
计时器 Timer -
状态管理 setState -
目标平台 鸿蒙OS / Web API 21+

1.6 项目结构

lib/
└── main_quit_smoking.dart
    ├── QuitSmokingApp              # 应用入口
    ├── SmokingFrequency            # 吸烟频率枚举
    ├── HealthMilestone             # 健康里程碑枚举
    ├── QuitRecord                  # 戒烟记录模型
    ├── QuitSmokingHomePage         # 主页面(底部导航)
    ├── _buildHomePage              # 首页
    ├── _buildProgressPage          # 进度页
    ├── _buildKnowledgePage         # 知识页
    ├── _buildSettingsPage          # 设置页
    ├── _updateQuitDate             # 更新戒烟日期
    ├── _updateFrequency            # 更新吸烟频率
    └── _updatePrice                # 更新香烟价格

二、系统架构

2.1 整体架构图

Data Layer

Business Layer

Presentation Layer

主页面
QuitSmokingHomePage

首页

进度页

知识页

设置页

激励语录

统计卡片

健康改善

快速操作

进度概览

里程碑时间线

详细统计

戒烟好处

戒烟技巧

应对烟瘾

戒烟误区

日期选择

频率选择

价格设置

戒烟计算器
QuitCalculator

里程碑管理器
MilestoneManager

激励管理器
MotivationManager

QuitRecord
戒烟记录

SmokingFrequency
吸烟频率

HealthMilestone
健康里程碑

2.2 类图设计

uses

uses

manages

QuitSmokingApp

+Widget build()

«enumeration»

SmokingFrequency

+String label

+String emoji

+int cigarettesPerDay

+String description

+light()

+moderate()

+heavy()

+severe()

«enumeration»

HealthMilestone

+String label

+String emoji

+String description

+twentyMinutes()

+twelveHours()

+twoDays()

+twoWeeks()

+oneMonth()

+threeMonths()

+sixMonths()

+oneYear()

+fiveYears()

+tenYears()

QuitRecord

+String id

+DateTime quitDate

+SmokingFrequency frequency

+double pricePerPack

+int cigarettesPerPack

+int daysSinceQuit

+int cigarettesNotSmoked

+double moneySaved

+int lifeDaysSaved

QuitSmokingHomePage

-int _currentIndex

-DateTime _quitDate

-SmokingFrequency _frequency

-double _pricePerPack

-Timer _updateTimer

-List<String> _motivationalQuotes

+void _updateQuitDate()

+void _updateFrequency()

+void _updatePrice()

+void _showEmergencyHelp()

+void _shareAchievement()

2.3 页面导航流程

首页

进度

知识

设置

应用启动

首页

底部导航

查看戒烟数据

查看详细进度

学习戒烟知识

调整个人设置

查看激励语录

查看健康改善

快速操作

紧急帮助

分享成就

查看里程碑

查看详细统计

戒烟好处

戒烟技巧

应对烟瘾

戒烟误区

设置戒烟日期

设置吸烟频率

设置香烟价格

2.4 戒烟计算流程

首页 计算器 设置页 用户 首页 计算器 设置页 用户 设置戒烟日期 更新日期 重新计算数据 设置吸烟频率 更新频率 重新计算数据 设置香烟价格 更新价格 重新计算数据 获取戒烟天数 返回天数 获取节省金额 返回金额 获取健康改善 返回里程碑列表

三、核心模块设计

3.1 数据模型设计

3.1.1 吸烟频率枚举 (SmokingFrequency)
enum SmokingFrequency {
  light(label: '轻度吸烟', emoji: '🚬', cigarettesPerDay: 5, description: '每天少于5支'),
  moderate(label: '中度吸烟', emoji: '🚬🚬', cigarettesPerDay: 10, description: '每天5-15支'),
  heavy(label: '重度吸烟', emoji: '🚬🚬🚬', cigarettesPerDay: 20, description: '每天15-25支'),
  severe(label: '严重吸烟', emoji: '🚬🚬🚬🚬', cigarettesPerDay: 30, description: '每天超过25支');

  final String label;
  final String emoji;
  final int cigarettesPerDay;
  final String description;

  const SmokingFrequency({
    required this.label,
    required this.emoji,
    required this.cigarettesPerDay,
    required this.description,
  });
}
3.1.2 健康里程碑枚举 (HealthMilestone)
enum HealthMilestone {
  twentyMinutes(label: '20分钟', emoji: '⏱️', description: '心率和血压开始下降'),
  twelveHours(label: '12小时', emoji: '🕐', description: '血液中的一氧化碳水平恢复正常'),
  twoDays(label: '2天', emoji: '📅', description: '味觉和嗅觉开始恢复'),
  twoWeeks(label: '2周', emoji: '📆', description: '血液循环改善,肺功能提高'),
  oneMonth(label: '1个月', emoji: '🗓️', description: '咳嗽和气短明显减少'),
  threeMonths(label: '3个月', emoji: '📅', description: '肺功能显著改善'),
  sixMonths(label: '6个月', emoji: '📆', description: '呼吸困难大幅减少'),
  oneYear(label: '1年', emoji: '🎂', description: '心脏病风险降低一半'),
  fiveYears(label: '5年', emoji: '🎊', description: '中风风险降至非吸烟者水平'),
  tenYears(label: '10年', emoji: '🎉', description: '肺癌风险降低一半');

  final String label;
  final String emoji;
  final String description;

  const HealthMilestone({
    required this.label,
    required this.emoji,
    required this.description,
  });
}
3.1.3 戒烟记录模型 (QuitRecord)
class QuitRecord {
  final String id;              // 记录ID
  final DateTime quitDate;      // 戒烟日期
  final SmokingFrequency frequency; // 吸烟频率
  final double pricePerPack;    // 每包价格
  final int cigarettesPerPack;  // 每包支数

  QuitRecord({
    required this.id,
    required this.quitDate,
    required this.frequency,
    required this.pricePerPack,
    required this.cigarettesPerPack,
  });

  // 戒烟天数
  int get daysSinceQuit => DateTime.now().difference(quitDate).inDays;

  // 未吸烟支数
  int get cigarettesNotSmoked => daysSinceQuit * frequency.cigarettesPerDay;

  // 节省金额
  double get moneySaved => (cigarettesNotSmoked / cigarettesPerPack) * pricePerPack;

  // 延长生命(每支烟减少11分钟生命)
  int get lifeDaysSaved => (cigarettesNotSmoked * 11) ~/ 60;
}
3.1.4 吸烟频率分布
40% 30% 20% 10% 吸烟频率分布示例 轻度吸烟 中度吸烟 重度吸烟 严重吸烟
3.1.5 戒烟时长分布
25% 25% 20% 15% 15% 戒烟时长分布示例 1周内 1个月内 3个月内 6个月内 1年以上

3.2 页面结构设计

3.2.1 主页面布局

QuitSmokingHomePage

IndexedStack

首页

进度页

知识页

设置页

NavigationBar

首页 Tab

进度 Tab

知识 Tab

设置 Tab

3.2.2 首页结构

首页

SliverAppBar

激励语录

统计卡片

健康改善

快速操作

节省金额

未吸烟支数

延长生命

已达成里程碑

紧急帮助

分享成就

3.2.3 进度页结构

进度页

SliverAppBar

进度概览

里程碑时间线

详细统计

戒烟天数

坚持周数

坚持月数

里程碑列表

达成状态

未吸烟支数

节省金额

延长生命

避免焦油

避免尼古丁

3.2.4 知识页结构

知识页

SliverAppBar

戒烟的好处

戒烟技巧

应对烟瘾

戒烟误区

时间线说明

健康改善

准备阶段

执行阶段

维持阶段

深呼吸

喝水

延迟

分散注意力

3.3 戒烟计算逻辑

获取戒烟日期

计算戒烟天数

获取吸烟频率

计算未吸烟支数

获取香烟价格

计算节省金额

计算延长生命

每支烟减少11分钟

更新UI显示

检查里程碑

遍历所有里程碑

是否达成?

标记为已达成

保持未达成状态

更新显示

3.4 激励语录轮播逻辑

加载激励语录

存储到列表

设置当前索引

启动定时器

每30秒触发

索引+1

索引越界?

重置为0

更新语录


四、UI设计规范

4.1 配色方案

应用以清新的绿色为主色调,象征健康与新生:

颜色类型 色值 用途
主色 #4CAF50 (Green) 导航、主题元素
辅助色 #66BB6A 进度页面
第三色 #81C784 知识页面
强调色 #A5D6A7 设置页面
背景色 #FAFAFA 页面背景
卡片背景 #FFFFFF 功能卡片

4.2 功能模块颜色

模块 色值 视觉效果
戒烟天数 #4CAF50 绿色
节省金额 #4CAF50 绿色
未吸烟 #FF9800 橙色
延长生命 #F44336 红色

4.3 字体规范

元素 字号 字重 颜色
页面标题 24px Bold 主色
戒烟天数 32px Bold 白色
统计数字 24px Bold 模块颜色
激励语录 18px Medium 白色
知识内容 14px Regular #000000

4.4 组件规范

4.4.1 激励语录卡片
┌─────────────────────────────────────┐
│              ❝                      │
│                                     │
│   每一次拒绝香烟,都是对自己健康的   │
│   投资!                            │
│                                     │
└─────────────────────────────────────┘
4.4.2 统计卡片
┌─────────────────────────────────────┐
│  💰        🚭        ❤️             │
│  ¥600     300支     5天             │
│  已省金额  未吸烟支数 延长生命(天)   │
└─────────────────────────────────────┘
4.4.3 健康改善列表
┌─────────────────────────────────────┐
│  ❤️ 健康改善                        │
│                                     │
│  ⏱️ 20分钟  心率和血压开始下降   ✓  │
│  🕐 12小时  血液中一氧化碳恢复正常 ✓  │
│  📅 2天     味觉和嗅觉开始恢复    ✓  │
└─────────────────────────────────────┘
4.4.4 快速操作按钮
┌─────────────────────────────────────┐
│  快速操作                            │
│                                     │
│  ┌──────────┐  ┌──────────┐        │
│  │   🆘     │  │   🎉     │        │
│  │ 想吸烟时  │  │ 分享成就  │        │
│  └──────────┘  └──────────┘        │
└─────────────────────────────────────┘
4.4.5 里程碑时间线
┌─────────────────────────────────────┐
│  健康里程碑                          │
│                                     │
│  ⏱️──● 20分钟                       │
│        心率和血压开始下降            │
│                                     │
│  🕐──○ 12小时                       │
│        血液中一氧化碳恢复正常        │
└─────────────────────────────────────┘

五、核心功能实现

5.1 戒烟记录计算

class QuitRecord {
  final DateTime quitDate;
  final SmokingFrequency frequency;
  final double pricePerPack;
  final int cigarettesPerPack;

  // 戒烟天数
  int get daysSinceQuit => DateTime.now().difference(quitDate).inDays;

  // 未吸烟支数
  int get cigarettesNotSmoked => daysSinceQuit * frequency.cigarettesPerDay;

  // 节省金额
  double get moneySaved => (cigarettesNotSmoked / cigarettesPerPack) * pricePerPack;

  // 延长生命(每支烟减少11分钟生命)
  int get lifeDaysSaved => (cigarettesNotSmoked * 11) ~/ 60;
}

5.2 健康里程碑判断

bool _isMilestoneAchieved(int days, HealthMilestone milestone) {
  switch (milestone) {
    case HealthMilestone.twentyMinutes:
      return days >= 0;
    case HealthMilestone.twelveHours:
      return days >= 1;
    case HealthMilestone.twoDays:
      return days >= 2;
    case HealthMilestone.twoWeeks:
      return days >= 14;
    case HealthMilestone.oneMonth:
      return days >= 30;
    case HealthMilestone.threeMonths:
      return days >= 90;
    case HealthMilestone.sixMonths:
      return days >= 180;
    case HealthMilestone.oneYear:
      return days >= 365;
    case HealthMilestone.fiveYears:
      return days >= 1825;
    case HealthMilestone.tenYears:
      return days >= 3650;
  }
}

5.3 激励语录轮播

void _startUpdateTimer() {
  _updateTimer = Timer.periodic(const Duration(seconds: 30), (timer) {
    setState(() {
      _currentQuoteIndex = (_currentQuoteIndex + 1) % _motivationalQuotes.length;
    });
  });
}

Widget _buildMotivationalQuote() {
  return Card(
    elevation: 4,
    color: Theme.of(context).colorScheme.primaryContainer,
    child: Padding(
      padding: const EdgeInsets.all(20),
      child: Column(
        children: [
          const Icon(Icons.format_quote, size: 32, color: Colors.white),
          const SizedBox(height: 12),
          Text(
            _motivationalQuotes[_currentQuoteIndex],
            textAlign: TextAlign.center,
            style: const TextStyle(
              fontSize: 18,
              fontWeight: FontWeight.w500,
              color: Colors.white,
            ),
          ),
        ],
      ),
    ),
  );
}

5.4 紧急帮助对话框

void _showEmergencyHelp() {
  showDialog(
    context: context,
    builder: (context) {
      return AlertDialog(
        title: const Text('想吸烟时'),
        content: const Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('试试这些方法:'),
            SizedBox(height: 16),
            Text('1. 深呼吸10次'),
            Text('2. 喝一杯冷水'),
            Text('3. 嚼口香糖'),
            Text('4. 散步5分钟'),
            Text('5. 给朋友打电话'),
            SizedBox(height: 16),
            Text('记住:烟瘾通常只持续几分钟!'),
          ],
        ),
        actions: [
          TextButton(
            onPressed: () => Navigator.pop(context),
            child: const Text('我知道了'),
          ),
        ],
      );
    },
  );
}

5.5 成就分享

void _shareAchievement() {
  final record = _quitRecord;
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(
      content: Text(
        '我已成功戒烟${record.daysSinceQuit}天!节省了¥${record.moneySaved.toStringAsFixed(0)},少吸了${record.cigarettesNotSmoked}支烟!',
      ),
      action: SnackBarAction(
        label: '分享',
        onPressed: () {
          // 实现分享功能
        },
      ),
    ),
  );
}

六、交互设计

6.1 戒烟记录流程

首页 计算器 设置页 用户 首页 计算器 设置页 用户 设置戒烟日期 更新日期 重新计算 设置吸烟频率 更新频率 重新计算 设置香烟价格 更新价格 重新计算 显示更新后的数据

6.2 紧急帮助流程

我知道了

尝试方法

用户点击想吸烟时

显示紧急帮助对话框

列出应对方法

用户选择

关闭对话框

用户执行方法

烟瘾缓解?

继续戒烟

再次尝试其他方法

6.3 知识学习流程

查看健康改善

学习戒烟方法

学习应对策略

了解常见误区

返回

知识页

戒烟的好处

戒烟技巧

应对烟瘾

戒烟误区


七、扩展功能规划

7.1 后续版本规划

2024-01-07 2024-01-14 2024-01-21 2024-01-28 2024-02-04 2024-02-11 2024-02-18 2024-02-25 2024-03-03 2024-03-10 2024-03-17 2024-03-24 2024-03-31 基础UI框架 戒烟记录功能 知识库功能 本地数据存储 社交分享 成就系统 社区功能 专业咨询 AI智能助手 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 戒烟助手应用开发计划

7.2 功能扩展建议

7.2.1 本地数据存储

存储功能:

  • SharedPreferences存储设置
  • SQLite存储戒烟记录
  • 数据导入导出
  • 数据备份恢复
7.2.2 社交分享

分享功能:

  • 分享戒烟成就到社交平台
  • 生成成就海报
  • 邀请好友一起戒烟
  • 戒烟打卡分享
7.2.3 成就系统

成就功能:

  • 戒烟里程碑徽章
  • 连续戒烟奖励
  • 健康改善成就
  • 金钱节省成就
7.2.4 社区功能

社区功能:

  • 戒烟社区交流
  • 经验分享
  • 互相鼓励
  • 专家答疑

八、注意事项

8.1 开发注意事项

  1. 数据计算:确保戒烟天数、节省金额等计算准确

  2. 日期处理:正确处理日期计算和时区问题

  3. 定时器管理:正确创建和销毁定时器

  4. 用户体验:激励语录需定期更新,保持新鲜感

  5. 数据持久化:确保用户数据安全存储

8.2 常见问题

问题 原因 解决方案
天数计算错误 时区问题 使用本地时区
金额不准确 价格设置错误 验证输入值
里程碑不更新 判断逻辑错误 检查判断条件
语录不轮播 定时器未启动 检查定时器
数据丢失 未持久化存储 添加本地存储

8.3 使用技巧

🚭 戒烟成功技巧 🚭

心理准备

  • 明确戒烟原因,坚定决心
  • 告诉家人朋友,寻求支持
  • 设定戒烟日期,做好准备
  • 识别触发情境,提前准备

应对烟瘾

  • 深呼吸:缓慢深呼吸10次
  • 喝水:喝一杯冷水,慢慢品尝
  • 延迟:等待10分钟,烟瘾通常会过去
  • 分散注意力:做其他事情转移注意力

保持动力

  • 每天查看戒烟天数
  • 关注健康改善
  • 计算节省金额
  • 分享戒烟成就

九、运行说明

9.1 环境要求

环境 版本要求
Flutter SDK >= 3.0.0
Dart SDK >= 2.17.0
鸿蒙OS API 21+
Web浏览器 Chrome 90+

9.2 运行命令

# 查看可用设备
flutter devices

# 运行到Web服务器
flutter run -d web-server -t lib/main_quit_smoking.dart --web-port 8139

# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_quit_smoking.dart

# 代码分析
flutter analyze lib/main_quit_smoking.dart

十、总结

戒烟助手应用通过首页、进度、知识、设置四大模块,为用户提供了一个全面的戒烟辅助平台。应用支持戒烟天数记录、节省金额计算、健康改善追踪、戒烟知识学习等功能,帮助用户成功戒烟。

核心功能涵盖戒烟记录、金钱计算、健康追踪、知识库四大模块。戒烟记录自动计算戒烟天数、未吸烟支数;金钱计算根据吸烟频率和香烟价格计算节省金额;健康追踪通过里程碑系统展示身体恢复状况;知识库提供戒烟好处、技巧、应对烟瘾方法等内容。

应用采用 Material Design 3 设计规范,以清新的绿色为主色调,象征健康与新生。通过本应用,希望能够帮助用户成功戒烟,重获健康生活。

戒烟助手——助你成功戒烟,重获健康


项目链接

  • 应用代码:f:\Flutter\flutter_harmonyos\lib\main_quit_smoking.dart
  • 开发文档:f:\Flutter\flutter_harmonyos\docs\戒烟助手应用开发文档.md

运行效果图

(图片将在此处添加)


© 2024 戒烟助手应用开发团队

欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐