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

一、项目概述

运行效果图

image-20260408221117081

image-20260408221125295

image-20260408221130068

image-20260408221136370

image-20260408221143012

1.1 应用简介

人生总结是一款人生分析类应用,通过收集用户的基本信息、人生维度评分和时间分配数据,自动生成个性化的人生报告。帮助用户全面了解自己的人生状态,发现优势和不足,获得人生建议。

应用核心理念:回顾过去,把握现在,规划未来。

人生是一场漫长的旅程,我们常常忙于赶路而忘记了审视自己的方向。人生总结应用为用户提供了一个停下来思考的机会,通过数据化的方式呈现人生全貌,让每个人都能更清晰地认识自己。

1.2 核心功能

功能模块功能描述实现方式
信息输入收集用户基本信息表单输入
维度评分评估人生各维度状态滑块评分
时间分配记录每日时间使用滑块调节
报告生成自动生成人生报告数据分析
时间线展示展示人生重要事件时间轴UI
目标管理展示人生目标列表列表展示

1.3 人生阶段

序号阶段Emoji年龄范围特点描述
1童年👶0-12岁无忧无虑的成长时光
2少年🧒13-18岁探索自我的青春岁月
3青年🧑19-35岁奋斗拼搏的黄金时期
4中年👨36-55岁成熟稳重的责任担当
5老年👴56-100岁智慧沉淀的人生收获

1.4 人生维度

序号维度Emoji描述
1事业💼职业发展与成就
2家庭👨‍👩‍👧‍👦家庭关系与幸福
3健康💪身体健康与运动
4财富💰经济状况与理财
5成长📚学习进步与提升
6社交🤝人际关系与社交
7爱好🎨兴趣爱好与娱乐
8心灵🧘精神世界与信仰

1.5 时间分类

分类Emoji颜色描述
工作💼蓝色职业工作相关
睡眠😴紫色休息睡眠时间
家庭👨‍👩‍👧‍👦绿色家庭陪伴时间
社交🤝橙色社交活动时间
爱好🎨红色兴趣爱好时间
学习📚青色学习提升时间
运动🏃粉色运动锻炼时间
其他灰色其他活动时间

1.6 技术栈

技术领域技术选型版本要求
开发框架Flutter>= 3.0.0
编程语言Dart>= 2.17.0
设计规范Material Design 3-
状态管理setState-
导航控制TabController-
图表绘制CustomPainter-
目标平台鸿蒙OS / WebAPI 21+

二、项目结构

lib/
├── main_life_summary.dart    # 应用主入口(~1100行)
│   ├── LifeSummaryApp        # 根应用组件
│   ├── LifeStage             # 人生阶段枚举
│   ├── LifeDimension         # 人生维度枚举
│   ├── TimeCategory          # 时间分类枚举
│   ├── LifeData              # 人生数据模型
│   ├── LifeEvent             # 人生事件模型
│   ├── LifeGoal              # 人生目标模型
│   ├── LifeReport            # 人生报告模型
│   └── LifeSummaryHomePage   # 主页面

三、数据模型

3.1 人生阶段枚举 (LifeStage)

enum LifeStage {
  childhood('童年', '👶', 0, 12, '无忧无虑的成长时光'),
  teenage('少年', '🧒', 13, 18, '探索自我的青春岁月'),
  youth('青年', '🧑', 19, 35, '奋斗拼搏的黄金时期'),
  middle('中年', '👨', 36, 55, '成熟稳重的责任担当'),
  senior('老年', '👴', 56, 100, '智慧沉淀的人生收获');

  final String label;       // 阶段名称
  final String icon;        // 代表图标
  final int startAge;       // 起始年龄
  final int endAge;         // 结束年龄
  final String description; // 阶段描述
}

3.2 人生维度枚举 (LifeDimension)

enum LifeDimension {
  career('事业', '💼', '职业发展与成就'),
  family('家庭', '👨‍👩‍👧‍👦', '家庭关系与幸福'),
  health('健康', '💪', '身体健康与运动'),
  wealth('财富', '💰', '经济状况与理财'),
  growth('成长', '📚', '学习进步与提升'),
  social('社交', '🤝', '人际关系与社交'),
  hobby('爱好', '🎨', '兴趣爱好与娱乐'),
  spirit('心灵', '🧘', '精神世界与信仰');

  final String label;       // 维度名称
  final String icon;        // 代表图标
  final String description; // 维度描述
}

3.3 人生数据模型 (LifeData)

class LifeData {
  final String name;                        // 姓名
  final int age;                            // 年龄
  final String gender;                      // 性别
  final String occupation;                  // 职业
  final String education;                   // 学历
  final String relationship;                // 感情状态
  final Map<LifeDimension, int> dimensionScores;  // 维度评分
  final Map<TimeCategory, double> timeDistribution; // 时间分配
  final List<LifeEvent> events;             // 人生事件
  final List<LifeGoal> goals;               // 人生目标
  final String motto;                       // 人生格言
}

3.4 人生报告模型 (LifeReport)

class LifeReport {
  final LifeStage currentStage;             // 当前阶段
  final double lifeProgress;                // 人生进度
  final int daysLived;                      // 已度过天数
  final int daysRemaining;                  // 剩余天数
  final String lifeQuote;                   // 人生语录
  final Map<LifeDimension, String> analysis; // 维度分析
  final List<String> suggestions;           // 人生建议
  final double happinessIndex;              // 幸福指数
  final double balanceScore;                // 平衡指数
}

3.5 数据流转图

输入基本信息

维度评分

时间分配

生成报告

计算指标

生成分析

展示报告

时间线展示

目标展示


四、核心功能实现

4.1 报告生成

void _generateReport() {
  int age = int.tryParse(_ageController.text) ?? 28;

  // 确定人生阶段
  LifeStage stage = LifeStage.values.firstWhere(
    (s) => age >= s.startAge && age <= s.endAge,
    orElse: () => LifeStage.youth,
  );

  // 计算人生进度
  int daysLived = age * 365;
  int expectedLifespan = 80;
  int daysRemaining = (expectedLifespan - age) * 365;
  double lifeProgress = age / expectedLifespan;

  // 计算幸福指数和平衡指数
  double happinessIndex = _dimensionScores.values.reduce((a, b) => a + b) / _dimensionScores.length;
  double balanceScore = _calculateBalanceScore();

  // 生成分析和建议
  Map<LifeDimension, String> analysis = _generateAnalysis();
  List<String> suggestions = _generateSuggestions();
  String lifeQuote = _getLifeQuote(stage);

  setState(() {
    _lifeReport = LifeReport(
      currentStage: stage,
      lifeProgress: lifeProgress,
      daysLived: daysLived,
      daysRemaining: daysRemaining,
      lifeQuote: lifeQuote,
      analysis: analysis,
      suggestions: suggestions,
      happinessIndex: happinessIndex,
      balanceScore: balanceScore,
    );
  });
}

4.2 平衡指数计算

double _calculateBalanceScore() {
  double total = _timeDistribution.values.reduce((a, b) => a + b);
  Map<TimeCategory, double> percentages = {};
  _timeDistribution.forEach((key, value) {
    percentages[key] = value / total;
  });

  // 理想时间分配比例
  double idealWork = 0.33;     // 工作 33%
  double idealSleep = 0.29;    // 睡眠 29%
  double idealFamily = 0.08;   // 家庭 8%
  double idealExercise = 0.04; // 运动 4%

  double score = 100;
  score -= (percentages[TimeCategory.work]! - idealWork).abs() * 50;
  score -= (percentages[TimeCategory.sleep]! - idealSleep).abs() * 30;
  score -= (percentages[TimeCategory.family]! - idealFamily).abs() * 20;
  score -= (percentages[TimeCategory.exercise]! - idealExercise).abs() * 20;

  return score.clamp(0, 100);
}

4.3 维度分析生成

Map<LifeDimension, String> _generateAnalysis() {
  Map<LifeDimension, String> analysis = {};

  _dimensionScores.forEach((dimension, score) {
    if (score >= 80) {
      analysis[dimension] = '表现优秀,继续保持!这是你人生的一大亮点。';
    } else if (score >= 60) {
      analysis[dimension] = '状态良好,还有提升空间,可以适当投入更多精力。';
    } else if (score >= 40) {
      analysis[dimension] = '需要关注,建议制定改善计划,逐步提升。';
    } else {
      analysis[dimension] = '需要重视,建议寻求专业帮助或制定详细改善方案。';
    }
  });

  return analysis;
}

4.4 人生建议生成

List<String> _generateSuggestions() {
  List<String> suggestions = [];

  // 找出得分最低的三个维度
  var sortedDimensions = _dimensionScores.entries.toList()
    ..sort((a, b) => a.value.compareTo(b.value));

  for (var entry in sortedDimensions.take(3)) {
    switch (entry.key) {
      case LifeDimension.career:
        suggestions.add('💼 事业建议:设定清晰的职业目标,持续学习新技能');
        break;
      case LifeDimension.health:
        suggestions.add('💪 健康建议:坚持规律运动,注意饮食和作息');
        break;
      // ... 其他维度
    }
  }

  return suggestions;
}

五、图表可视化

5.1 雷达图 (RadarChartPainter)

用于展示人生维度评分:

class RadarChartPainter extends CustomPainter {
  final Map<LifeDimension, int> scores;

  
  void paint(Canvas canvas, Size size) {
    final center = Offset(size.width / 2, size.height / 2);
    final radius = min(size.width, size.height) / 2 - 20;
    final dimensions = LifeDimension.values;

    // 绘制背景网格
    for (int i = 1; i <= 5; i++) {
      final r = radius * i / 5;
      final path = Path();
      for (int j = 0; j <= dimensions.length; j++) {
        final angle = (j * 2 * pi / dimensions.length) - pi / 2;
        final x = center.dx + r * cos(angle);
        final y = center.dy + r * sin(angle);
        if (j == 0) path.moveTo(x, y);
        else path.lineTo(x, y);
      }
      canvas.drawPath(path, bgPaint);
    }

    // 绘制数据区域
    final dataPath = Path();
    for (int i = 0; i <= dimensions.length; i++) {
      final index = i % dimensions.length;
      final score = scores[dimensions[index]] ?? 0;
      final r = radius * score / 100;
      final angle = (index * 2 * pi / dimensions.length) - pi / 2;
      final x = center.dx + r * cos(angle);
      final y = center.dy + r * sin(angle);
      if (i == 0) dataPath.moveTo(x, y);
      else dataPath.lineTo(x, y);
    }
    canvas.drawPath(dataPath, dataPaint);
  }
}

5.2 饼图 (PieChartPainter)

用于展示时间分配:

class PieChartPainter extends CustomPainter {
  final Map<TimeCategory, double> distribution;

  
  void paint(Canvas canvas, Size size) {
    final center = Offset(size.width / 2, size.height / 2);
    final radius = min(size.width, size.height) / 2 - 10;

    double total = distribution.values.fold(0, (a, b) => a + b);
    double startAngle = -pi / 2;

    distribution.forEach((category, hours) {
      if (hours > 0) {
        final sweepAngle = (hours / total) * 2 * pi;
        final paint = Paint()
          ..color = category.color
          ..style = PaintingStyle.fill;

        canvas.drawArc(
          Rect.fromCircle(center: center, radius: radius),
          startAngle,
          sweepAngle,
          true,
          paint,
        );
        startAngle += sweepAngle;
      }
    });

    // 绘制中心圆(环形图效果)
    canvas.drawCircle(center, radius * 0.5, innerPaint);
  }
}

5.3 雷达图数学原理

雷达图基于极坐标系统:

x i = r i ⋅ cos ⁡ ( θ i ) x_i = r_i \cdot \cos(\theta_i) xi=ricos(θi)
y i = r i ⋅ sin ⁡ ( θ i ) y_i = r_i \cdot \sin(\theta_i) yi=risin(θi)

其中:

  • r i = s c o r e i 100 × R r_i = \frac{score_i}{100} \times R ri=100scorei×R R R R为最大半径
  • θ i = 2 π i n − π 2 \theta_i = \frac{2\pi i}{n} - \frac{\pi}{2} θi=n2πi2π n n n为维度数量

5.4 饼图数学原理

饼图扇形角度计算:

θ c a t e g o r y = h o u r s c a t e g o r y ∑ h o u r s × 2 π \theta_{category} = \frac{hours_{category}}{\sum hours} \times 2\pi θcategory=hourshourscategory×2π


六、UI设计

6.1 色彩系统

应用以靛蓝色为主色调,象征智慧与深度:

颜色类型色值用途
背景渐变1#283593深靛蓝
背景渐变2#3949AB中靛蓝
背景渐变3#5C6BC0浅靛蓝
主色调#5C6BC0靛蓝
强调色#7986CB浅靛蓝
文字主色#FFFFFF白色

6.2 页面结构

┌─────────────────────────────────────┐
│  📖 人生总结                    🧑  │  ← 标题栏
│  自动生成你的人生报告               │
├─────────────────────────────────────┤
│  [输入] [报告] [时间线] [目标]     │  ← Tab栏
├─────────────────────────────────────┤
│  👤 基本信息                        │
│  [姓名____] [年龄____]             │
│  性别: [男▼] 职业: [程序员▼]       │  ← 输入表单
├─────────────────────────────────────┤
│  ⭐ 人生维度评分                    │
│  💼 事业  70分  ═════════░░░       │
│  👨‍👩‍👧‍👦 家庭  65分  ═══════░░░░░       │  ← 维度评分
│  ...                               │
├─────────────────────────────────────┤
│  📅 每日时间分配                    │
│  💼 工作  8.0h  ═════════░░░       │  ← 时间分配
│  😴 睡眠  7.0h  ═══════░░░░░       │
├─────────────────────────────────────┤
│      [ ✨ 生成人生报告 ]            │  ← 生成按钮
└─────────────────────────────────────┘

6.3 报告页面结构

┌─────────────────────────────────────┐
│              🧑                      │
│         小明的人生报告              │
│      [青年 · 28岁 · 程序员]        │
│  "青年是人生的黄金时代..."         │
├─────────────────────────────────────┤
│  已度过: 10220天  │  剩余约: 18980天│
│  ████████████░░░░░░░░░░░░░░░░░░░  │
│  人生进度 35.0%                     │
│  💖幸福指数: 61.3  ⚖️平衡指数: 72.5 │
├─────────────────────────────────────┤
│  📊 维度分析                        │
│  ┌─────────────────────────────┐  │
│  │      雷达图展示              │  │  ← 雷达图
│  └─────────────────────────────┘  │
│  💼 事业 70分 ███████░░░ 表现良好  │
│  👨‍👩‍👧‍👦 家庭 65分 ██████░░░░ 需要关注  │
├─────────────────────────────────────┤
│  💡 人生建议                        │
│  💼 事业建议:设定清晰的职业目标...│  ← 建议列表
└─────────────────────────────────────┘

6.4 交互设计

交互元素触发方式响应行为
维度滑块拖动调整维度评分
时间滑块拖动调整时间分配
生成按钮点击生成人生报告
Tab切换点击切换页面

七、状态管理

7.1 状态分类

状态类型状态名称说明
人生数据_lifeData用户人生数据
人生报告_lifeReport生成的报告
维度评分_dimensionScores各维度评分
时间分配_timeDistribution时间分配数据
输入控制器_nameController姓名输入
输入控制器_ageController年龄输入

7.2 状态流转

初始化

调整评分/时间

点击生成

显示报告

切换Tab

切换Tab

返回修改

输入中

报告生成

查看报告

查看时间线

查看目标

7.3 报告生成流程图

计算模块 应用 用户 计算模块 应用 用户 输入基本信息 调整维度评分 调整时间分配 点击生成报告 计算人生阶段 计算人生进度 计算幸福指数 计算平衡指数 生成维度分析 生成人生建议 返回报告数据 展示人生报告

八、人生指标计算

8.1 幸福指数

幸福指数为各维度评分的平均值:

H a p p i n e s s I n d e x = ∑ i = 1 n S c o r e i n HappinessIndex = \frac{\sum_{i=1}^{n} Score_i}{n} HappinessIndex=ni=1nScorei

其中:

  • S c o r e i Score_i Scorei 为第 i i i个维度的评分
  • n n n 为维度总数(8个)

8.2 平衡指数

平衡指数衡量时间分配的均衡程度:

B a l a n c e S c o r e = 100 − ∑ i = 1 m w i × ∣ p i − p i i d e a l ∣ BalanceScore = 100 - \sum_{i=1}^{m} w_i \times |p_i - p_i^{ideal}| BalanceScore=100i=1mwi×pipiideal

其中:

  • p i p_i pi 为第 i i i类时间的实际占比
  • p i i d e a l p_i^{ideal} piideal 为理想占比
  • w i w_i wi 为权重系数

8.3 人生进度

人生进度基于预期寿命计算:

L i f e P r o g r e s s = A g e L i f e E x p e c t a n c y LifeProgress = \frac{Age}{LifeExpectancy} LifeProgress=LifeExpectancyAge

默认预期寿命为80岁。

8.4 指标解读

指标范围解读
幸福指数0-100>70优秀,50-70良好,<50需关注
平衡指数0-100>80均衡,60-80基本均衡,<60需调整
人生进度0-1百分比显示人生已过比例

九、性能优化

9.1 渲染优化

优化点实现方式效果
图表绘制CustomPainter高效绘制
Tab切换TabController平滑切换
状态更新setState局部减少重绘
列表渲染ListView.builder按需渲染

9.2 内存管理


void dispose() {
  _tabController.dispose();
  _nameController.dispose();
  _ageController.dispose();
  super.dispose();
}

9.3 性能指标

指标目标值实测值
图表绘制60fps60fps
内存占用< 50MB待测试
启动时间< 2s待测试
CPU占用< 15%待测试

十、常见问题

10.1 问题排查

问题原因解决方案
报告不显示未生成报告点击生成按钮
图表不显示数据为空检查数据输入
进度计算错误年龄格式错误检查年龄输入
建议为空评分全为0调整维度评分

10.2 调试技巧

// 打印人生数据
debugPrint('Age: ${_lifeData?.age}');
debugPrint('Happiness: ${_lifeReport?.happinessIndex}');
debugPrint('Balance: ${_lifeReport?.balanceScore}');
debugPrint('Dimension scores: ${_lifeData?.dimensionScores}');

十一、运行说明

11.1 环境要求

环境版本要求
Flutter SDK>= 3.0.0
Dart SDK>= 2.17.0
鸿蒙OSAPI 21+

11.2 运行命令

# 查看可用设备
flutter devices

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

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

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

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

十二、扩展建议

12.1 功能扩展

功能优先级实现思路
数据持久化本地存储人生数据
历史对比对比不同时期报告
分享功能分享人生报告
AI建议接入AI生成建议
社交功能与他人对比

12.2 设计扩展

方向描述
主题切换多种配色主题
动画效果报告生成动画
音效反馈操作音效
导出PDF导出报告为PDF

12.3 技术扩展

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 信息输入 报告生成 图表展示 数据持久化 历史对比 分享功能 AI建议 社交功能 导出PDF V1.0 基础版本 V1.1 增强版本 V1.2 智能版本 人生总结应用开发计划

十三、总结

人生总结应用通过数据化的方式帮助用户全面了解自己的人生状态。应用核心亮点包括:

13.1 核心特色

  1. 8个人生维度:全面评估人生各领域状态
  2. 时间分配分析:可视化展示时间使用情况
  3. 自动报告生成:智能分析生成人生报告
  4. 雷达图展示:直观展示维度评分
  5. 人生时间线:记录重要人生事件
  6. 目标管理:规划未来人生目标

13.2 技术亮点

  • 枚举类型设计:阶段、维度、时间分类使用枚举
  • CustomPainter:高效绘制雷达图和饼图
  • 智能分析:基于评分生成个性化建议
  • 指标计算:幸福指数、平衡指数等科学计算
  • Tab导航:四个页面平滑切换

13.3 应用价值

人生总结不仅是一个数据分析工具,更是一个帮助用户审视人生的平台。通过量化的方式呈现人生全貌,让用户更清晰地认识自己,发现优势和不足,获得改进方向。

回顾过去,把握现在,规划未来!


愿每个人都能书写精彩的人生篇章 📖

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐