消费DNA应用


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

一、项目概述

运行效果图

image-20260408193452934

image-20260408193503898

image-20260408193508090

1.1 应用简介

消费DNA是一款独特的消费记录可视化应用,核心理念是"消费习惯像DNA双螺旋一样展示"。正如DNA承载着生命的遗传密码,我们的消费行为同样蕴含着独特的生活密码——每一次支出都是生活方式的基因表达,每一类消费都是个人价值观的显性特征。

传统的记账软件往往以列表、图表等线性方式呈现消费数据,用户难以从中洞察消费模式的深层规律。消费DNA另辟蹊径,借鉴生物学中DNA双螺旋的经典结构,将消费记录转化为旋转的螺旋节点,让用户在视觉上直观感受消费行为的"基因序列"。

1.2 核心功能

功能模块 功能描述 实现方式
DNA可视化 双螺旋动态展示消费记录 CustomPainter + AnimationController
消费记录 添加、查看、管理消费明细 StatefulWidget + ModalBottomSheet
分类统计 按类别统计消费占比 Map数据结构 + 百分比计算
月份筛选 按月份查看历史消费 水平滚动列表 + 状态切换
日期格式化 智能显示日期格式 时间差计算 + 条件判断

1.3 消费分类体系

序号 类别 Emoji 主题色 典型场景
1 餐饮 🍔 #6B6B6B 三餐、零食、饮品
2 交通 🚗 #4CAF50 地铁、公交、打车
3 购物 🛍 #E91E63 服饰、日用品、数码
4 娱乐 🎮 #9C27B0 游戏、电影、演出
5 居住 🏠 #795548 房租、水电、物业
6 通讯 📱 #00BCD4 话费、网络、会员
7 教育 📚 #3F51B5 书籍、课程、培训
8 医疗 💊 #F44336 就诊、药品、保健
9 投资 💰 #FF9800 理财、股票、基金
10 其他 📦 #607D8B 杂项支出

1.4 技术栈

技术领域 技术选型 版本要求
开发框架 Flutter >= 3.0.0
编程语言 Dart >= 2.17.0
设计规范 Material Design 3 -
状态管理 setState -
动画控制 AnimationController -
自定义绘制 CustomPainter -
目标平台 鸿蒙OS / Web API 21+

二、项目结构

lib/
├── main_consumption_dna.dart      # 应用主入口
│   ├── ConsumptionDNAApp          # 根应用组件
│   ├── ConsumptionCategory        # 消费类别枚举
│   ├── ConsumptionRecord          # 消费记录模型
│   ├── DNADoubleHelixPainter      # DNA双螺旋绘制器
│   └── ConsumptionDNAHomePage     # 主页面

三、数据模型

3.1 ConsumptionCategory 枚举

enum ConsumptionCategory {
  food('餐饮', '🍔', Color(0xFF6B6B6B)),
  transport('交通', '🚗', Color(0xFF4CAF50)),
  shopping('购物', '🛍', Color(0xFFE91E63)),
  entertainment('娱乐', '🎮', Color(0xFF9C27B0)),
  housing('居住', '🏠', Color(0xFF795548)),
  communication('通讯', '📱', Color(0xFF00BCD4)),
  education('教育', '📚', Color(0xFF3F51B5)),
  healthcare('医疗', '💊', Color(0xFFF44336)),
  investment('投资', '💰', Color(0xFFFF9800)),
  other('其他', '📦', Color(0xFF607D8B));

  final String label;
  final String emoji;
  final Color color;
}

3.2 ConsumptionRecord 模型

class ConsumptionRecord {
  final String id;                    // 记录唯一标识
  final ConsumptionCategory category; // 消费类别
  final double amount;                // 消费金额
  final String description;           // 消费描述
  final DateTime date;                // 消费日期
  final String? notes;                // 备注信息
}

四、核心功能实现

4.1 DNA双螺旋绘制原理

开始绘制

计算画布中心点

绘制左侧螺旋

绘制右侧螺旋

遍历360度

计算坐标点

连接路径

绘制消费节点

完成绘制

4.2 螺旋曲线绘制

螺旋曲线基于三角函数参数方程实现:

{x=r⋅cos⁡(θ)y=r⋅sin⁡(θ) \begin{cases} x = r \cdot \cos(\theta) \\ y = r \cdot \sin(\theta) \end{cases} {x=rcos(θ)y=rsin(θ)

void _drawHelix(Canvas canvas, Offset center, double radius, double rotation, bool isLeft) {
  final path = Path();
  final direction = isLeft ? -1 : 1;

  for (var i = 0; i < 360; i++) {
    final angle = (i * 2 + rotation * direction) * pi / 180;
    final x = center.dx + radius * cos(angle);
    final y = center.dy + radius * sin(angle);

    if (i == 0) {
      path.moveTo(x, y);
    } else {
      path.lineTo(x, y);
    }
  }

  final paint = Paint()
    ..color = isLeft ? Colors.blue.shade200 : Colors.red.shade200
    ..strokeWidth = 3
    ..style = PaintingStyle.stroke;

  canvas.drawPath(path, paint);
}

4.3 消费节点绘制

void _drawNodes(Canvas canvas, Offset center, double radius, double rotation) {
  for (var i = 0; i < records.length; i++) {
    final record = records[i];
    final angle = (i * 30 + rotation) * pi / 180;
    final x = center.dx + radius * 0.8 * cos(angle);
    final y = center.dy + radius * 0.8 * sin(angle);

    canvas.drawCircle(Offset(x, y), 10, Paint()..color = record.category.color);

    final textPainter = TextPainter(
      text: TextSpan(
        text: record.category.emoji,
        style: const TextStyle(color: Colors.white, fontSize: 12),
      ),
      textAlign: TextAlign.center,
    );
    textPainter.layout();
    textPainter.paint(canvas, Offset(x - 6, y - 6));
  }
}

4.4 统计计算逻辑

Widget _buildStatistics() {
  final totalAmount = _records.fold(0.0, (sum, r) => sum + r.amount);
  final categoryStats = <ConsumptionCategory, double>{};
  
  for (final record in _records) {
    categoryStats[record.category] = 
        (categoryStats[record.category] ?? 0) + record.amount;
  }

  final percentage = totalAmount > 0 
      ? (amount / totalAmount * 100) 
      : 0;
}

4.5 日期格式化

String _formatDate(DateTime date) {
  final now = DateTime.now();
  final diff = now.difference(date);

  if (diff.inDays == 0) {
    return '今天';
  } else if (diff.inDays == 1) {
    return '昨天';
  } else if (diff.inDays < 7) {
    return '${diff.inDays}天前';
  } else {
    return '${date.month}${date.day}日';
  }
}

4.6 添加消费记录流程

界面 应用 用户 界面 应用 用户 点击记录消费按钮 弹出底部表单 选择消费类型 输入消费金额 输入消费描述 点击记录按钮 创建消费记录 更新DNA显示 显示成功提示

五、界面设计

5.1 主页面布局

┌─────────────────────────────────────┐
│  🧬 消费DNA                          │
│     消费习惯像DNA双螺旋一样展示       │
├─────────────────────────────────────┤
│  [1月][2月][3月]...[12月]            │
├─────────────────────────────────────┤
│                                     │
│           DNA双螺旋可视化            │
│            (动态旋转)              │
│                                     │
├─────────────────────────────────────┤
│  本月统计              总计: ¥180.00 │
│  ┌─────┐┌─────┐┌─────┐┌─────┐      │
│  │ 🍔  ││ 🚗  ││ 🛍  ││ 🎮  │      │
│  │13.9%││ 2.8%││83.3%││ 0.0%│      │
│  └─────┘└─────┘└─────┘└─────┘      │
├─────────────────────────────────────┤
│  消费记录                     3条记录│
│  ┌─────────────────────────────┐    │
│  │ 🍔 午餐              ¥25.00 │    │
│  │    餐饮                      │    │
│  │                        昨天  │    │
│  └─────────────────────────────┘    │
│  ┌─────────────────────────────┐    │
│  │ 🚗 地铁               ¥5.00 │    │
│  │    交通                      │    │
│  │                      2天前   │    │
│  └─────────────────────────────┘    │
│  ┌─────────────────────────────┐    │
│  │ 🛍 购物             ¥150.00 │    │
│  │    购物                      │    │
│  │                      3天前   │    │
│  └─────────────────────────────┘    │
│                                     │
│         [记录消费]                   │
└─────────────────────────────────────┘

5.2 添加消费记录弹窗

┌─────────────────────────────────────┐
│              ────                   │
│                                     │
│  ➕ 记录消费                         │
│                                     │
│  消费类型                            │
│  [🍔餐饮] [🚗交通] [🛍购物]         │
│  [🎮娱乐] [🏠居住] [📱通讯]         │
│  [📚教育] [💊医疗] [💰投资]         │
│  [📦其他]                           │
│                                     │
│  消费金额                            │
│  ┌─────────────────────────────┐   │
│  │ ¥ 0.00                      │   │
│  └─────────────────────────────┘   │
│                                     │
│  消费描述                            │
│  ┌─────────────────────────────┐   │
│  │ 例如:午餐、地铁、购物       │   │
│  └─────────────────────────────┘   │
│                                     │
│  ┌─────────────────────────────┐   │
│  │         记录消费             │   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘

5.3 月份选择器

┌─────────────────────────────────────┐
│  [1月] [2月] [3月] [4月] [5月] [6月] │
│  [7月] [8月] [9月] [10月][11月][12月]│
└─────────────────────────────────────┘
         ↑选中月份高亮显示

六、动画效果

6.1 DNA旋转动画

_rotationController = AnimationController(
  vsync: this,
  duration: const Duration(seconds: 10),
)..repeat();

AnimatedBuilder(
  animation: _rotationController,
  builder: (context, child) {
    return CustomPaint(
      painter: DNADoubleHelixPainter(
        records: _records,
        rotation: _rotationController.value * 2 * pi,
      ),
    );
  },
)

6.2 图标脉冲动画

_pulseController = AnimationController(
  vsync: this,
  duration: const Duration(milliseconds: 1500),
)..repeat(reverse: true);

AnimatedBuilder(
  animation: _pulseController,
  builder: (context, child) {
    return Container(
      decoration: BoxDecoration(
        boxShadow: [
          BoxShadow(
            color: Colors.cyan.withValues(
              alpha: 0.3 + (_pulseController.value * 0.2)
            ),
            blurRadius: 10 + (_pulseController.value * 5),
          ),
        ],
      ),
    );
  },
)

七、运行与调试

7.1 运行命令

# 运行到鸿蒙设备
flutter run -d harmony lib/main_consumption_dna.dart

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

# 运行到Windows
flutter run -d windows -t lib/main_consumption_dna.dart

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

7.2 功能测试清单

测试项 测试内容 预期结果
DNA可视化 查看DNA双螺旋动画 动画流畅旋转
添加记录 添加新的消费记录 记录成功保存
分类选择 选择不同消费类型 类型正确显示
月份切换 切换不同月份 数据正确筛选
统计展示 查看消费统计 百分比计算正确
日期格式 查看日期显示 格式化正确

八、扩展方向

8.1 后端集成

┌─────────────┐     HTTPS      ┌─────────────┐
│   客户端    │ ←─────────────→ │   服务器    │
└─────────────┘                 └─────────────┘
       │                               │
       │  消费数据同步                 │
       │  用户认证                     │
       │  数据分析                     │
       │  云端备份                     │
       ↓                               ↓
┌─────────────┐                 ┌─────────────┐
│  本地存储   │                 │  云端数据库 │
└─────────────┘                 └─────────────┘

8.2 功能扩展计划

版本 功能 描述
v1.1 数据持久化 本地数据库存储
v1.2 消费趋势 周/月/年趋势分析
v1.3 预算管理 设置消费上限提醒
v1.4 智能分类 自动识别消费类型
v1.5 社区分享 分享消费DNA图谱

8.3 高级功能

消费DNA

数据分析

智能服务

社交功能

消费趋势

预算管理

年度报告

智能分类

消费建议

异常提醒

分享图谱

好友对比

消费挑战


九、使用场景

9.1 典型使用场景

🧬 消费DNA使用场景 🧬

场景 描述 使用频率
日常记账 记录每日消费支出 每日多次
月度回顾 查看本月消费情况 每月一次
分类分析 分析各类消费占比 每周一次
消费洞察 观察消费习惯模式 不定期
预算规划 规划下月消费预算 每月一次

9.2 记账建议

┌─────────────────────────────────────────────────────────┐
│                   记账建议                              │
├─────────────────────────────────────────────────────────┤
│                                                          │
│  📝 记录习惯                                             │
│     • 消费后立即记录,避免遗忘                           │
│     • 准确填写金额和描述                                 │
│     • 选择正确的消费类型                                 │
│     • 定期回顾消费记录                                   │
│                                                          │
│  💡 分析技巧                                             │
│     • 观察DNA螺旋的颜色分布                              │
│     • 关注高频消费类型                                   │
│     • 对比不同月份的变化                                 │
│     • 发现消费规律和问题                                 │
│                                                          │
│  🎯 改善方向                                             │
│     • 设定合理的消费预算                                 │
│     • 控制非必要支出                                     │
│     • 优化消费结构                                       │
│     • 培养良好消费习惯                                   │
│                                                          │
└─────────────────────────────────────────────────────────┘

十、可视化原理

10.1 DNA双螺旋结构

元素 含义 视觉表现
双螺旋 消费行为的双重性 蓝红双色曲线
节点 单笔消费记录 彩色圆点+emoji
颜色 消费类型 类别对应颜色
旋转 时间流动 持续旋转动画
密度 消费频次 节点分布密度

10.2 可视化设计理念

🧬 DNA可视化设计理念 🧬

螺旋密度

  • 节点越密集,说明消费越频繁
  • 节点稀疏,说明消费较少

颜色分布

  • 不同颜色代表不同消费领域
  • 颜色占比反映消费偏好

旋转动态

  • 象征消费行为的流动性
  • 体现时间维度的变化

节点大小

  • 可扩展为反映消费金额
  • 金额越大节点越大

十一、消费心理学

11.1 消费行为分析

消费类型 心理动机 典型特征
餐饮 生理需求、社交 高频、刚需
交通 出行需求 固定、规律
购物 物质需求、情感补偿 冲动、波动
娱乐 精神需求、压力释放 周期性
居住 安全需求 大额、固定
教育 自我提升 投资性

11.2 消费习惯洞察

💡 消费习惯洞察 💡

通过DNA可视化,用户可以:

  • 识别消费模式 - 发现自己的消费规律
  • 发现消费问题 - 找出不合理的消费行为
  • 优化消费结构 - 调整消费类型占比
  • 培养良好习惯 - 建立健康的消费观念

十二、总结

消费DNA应用通过"消费习惯像DNA双螺旋一样展示"的核心理念,为用户提供了一种全新的消费记录和可视化方式。应用涵盖DNA可视化、消费记录、分类统计、月份筛选、日期格式化五大核心功能,让用户能够直观地了解自己的消费习惯。

应用采用青色主题,象征清新、专业。主页面清晰展示DNA双螺旋动画,月份选择器支持切换不同月份,统计区域展示各类消费占比,消费记录列表展示所有消费明细。

DNA双螺旋采用CustomPainter绘制,通过三角函数参数方程计算螺旋曲线坐标,消费记录以彩色节点的形式分布在螺旋上。旋转动画持续进行,象征消费行为的时间流动。

应用采用Material Design 3设计规范,遵循Flutter最佳实践,代码结构清晰,易于维护和扩展。后续版本计划增加数据持久化、消费趋势分析、预算管理、智能分类、社区分享等功能,为用户提供更完整的消费管理体验。

通过消费DNA应用,用户可以直观地了解自己的消费习惯,发现消费规律,优化消费结构,培养良好的消费习惯。

记录消费,解码生活 🧬


Logo

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

更多推荐