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

一、项目概述

运行效果图

image-20260407225606809

image-20260407225615925

image-20260407225620170

image-20260407225625081

image-20260407225629363

1.1 应用简介

人生角色卡是一款创新的生活体验应用,旨在通过每日随机分配角色的方式,帮助用户跳出日常生活的固有模式,以全新的视角和身份体验生活。应用每天清晨为用户分配一个独特的角色身份,并提供该角色的行为指南、心态建议和专属任务,让用户在一天中完全沉浸在这个角色中,体验不同的人生可能性。

应用以温暖的橙黄色为主色调,营造轻松愉悦的探索氛围。内置12种精心设计的角色类型,涵盖艺术、科学、哲学、冒险等多个领域,每种角色都有独特的性格特征、行为准则和日常任务。通过角色扮演的方式,帮助用户打破思维定式,培养多元视角,丰富人生体验。

1.2 核心理念

人生如戏,每个人都在扮演着不同的角色。然而,我们往往被固有的身份和习惯所束缚,难以跳出舒适区去体验不同的生活方式。人生角色卡的设计理念基于以下心理学原则:

设计原则 理论基础 应用体现
角色扮演 心理学角色理论 通过角色扮演拓展自我认知
随机探索 创造力理论 随机性激发创新思维
沉浸体验 心流理论 全身心投入角色获得心流
行为改变 习惯养成理论 通过角色任务改变行为模式

1.3 核心功能

人生角色卡

核心功能

角色分配

每日随机分配

角色卡片展示

角色详情查看

角色扮演

行为指南

心态建议

专属任务

进度追踪

任务完成度

角色体验记录

成就解锁

辅助功能

角色图鉴

体验日记

分享功能

提醒通知

1.4 角色类型

应用内置12种精心设计的角色类型,每种角色都有独特的世界观和行为方式:

序号 角色名称 图标 主题色 核心特质 代表任务
1 艺术家 🎨 #E91E63 创意、敏感、表达 创作、观察、感受美
2 哲学家 🤔 #673AB7 思考、质疑、智慧 思考、对话、阅读
3 冒险家 🗺️ #FF9800 勇敢、好奇、探索 探索、尝试、冒险
4 科学家 🔬 #2196F3 理性、严谨、发现 实验、观察、记录
5 诗人 📝 #9C27B0 浪漫、感性、文字 写诗、观察、感悟
6 厨师 👨‍🍳 #4CAF50 创造、分享、味觉 烹饪、品尝、创新
7 摄影师 📷 #00BCD4 观察、记录、美感 拍摄、构图、发现
8 音乐家 🎵 #FF5722 节奏、情感、表达 演奏、聆听、创作
9 园丁 🌱 #8BC34A 耐心、培育、生命 种植、照料、观察
10 侦探 🕵️ #607D8B 观察、推理、真相 观察、分析、推理
11 梦想家 💭 #FFC107 想象、愿景、创造 梦想、规划、想象
12 慈善家 💝 #E91E63 关爱、分享、奉献 帮助、分享、关爱

1.5 技术栈

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

1.6 项目结构

lib/
└── main_role_card.dart
    ├── RoleCardApp              # 应用入口
    ├── RoleType                 # 角色类型枚举
    ├── Role                     # 角色数据模型
    ├── DailyRole                # 每日角色模型
    ├── RoleTask                 # 角色任务模型
    ├── RoleCardHomePage         # 主页面(底部导航)
    ├── _buildTodayPage          # 今日角色页面
    ├── _buildGalleryPage        # 角色图鉴页面
    ├── _buildDiaryPage          # 体验日记页面
    └── _buildSettingsPage       # 设置页面

二、系统架构

2.1 整体架构图

Data Layer

Presentation Layer

主页面
RoleCardHomePage

今日角色页

角色图鉴页

体验日记页

设置页面

角色卡片

行为指南

专属任务

进度追踪

角色列表

角色详情

日记列表

写日记

Role
角色模型

DailyRole
每日角色模型

RoleTask
任务模型

DiaryEntry
日记模型

RoleType
角色类型枚举

2.2 类图设计

manages

manages

has

has

has many

RoleCardApp

+Widget build()

«enumeration»

RoleType

+String label

+String icon

+Color color

+String description

+List<String> traits

+List<String> guidelines

+artist()

+philosopher()

+adventurer()

+scientist()

+poet()

+chef()

+photographer()

+musician()

+gardener()

+detective()

+dreamer()

+philanthropist()

Role

+RoleType type

+String name

+String description

+List<String> traits

+List<String> guidelines

+List<String> mindset

+List<RoleTask> tasks

+String dailyQuote

DailyRole

+String id

+Role role

+DateTime assignedDate

+List<RoleTask> completedTasks

+double completionRate

+String? diaryContent

+bool isCompleted

RoleTask

+String id

+String title

+String description

+bool completed

+DateTime? completedAt

+int difficulty

+int expReward

DiaryEntry

+String id

+RoleType roleType

+DateTime date

+String content

+List<String> photos

+int mood

RoleCardHomePage

-int _selectedIndex

-DailyRole _todayRole

-List<DiaryEntry> _diaries

-Map<RoleType, int> _roleStats

+Widget build()

-_assignDailyRole()

-_completeTask()

-_saveDiary()

2.3 页面导航流程

今日

图鉴

日记

设置

应用启动

今日是否已分配角色?

随机分配角色

今日角色页

底部导航

角色卡片

角色图鉴

体验日记

设置页面

查看行为指南

完成专属任务

写体验日记

浏览所有角色

查看角色详情

查看历史日记

写新日记

2.4 角色分配流程

任务系统 角色系统 随机算法 应用 用户 任务系统 角色系统 随机算法 应用 用户 alt [今日未分配] [今日已分配] 打开应用 检查今日角色 请求随机角色 获取角色池 返回12种角色 加权随机选择 返回选中角色 生成专属任务 返回任务列表 展示角色卡片 展示当前角色

三、核心模块设计

3.1 数据模型设计

3.1.1 角色类型枚举 (RoleType)
enum RoleType {
  artist('艺术家', '🎨', Color(0xFFE91E63), 
    '用色彩和线条诠释世界', 
    ['创意', '敏感', '表达']),
  philosopher('哲学家', '🤔', Color(0xFF673AB7), 
    '在思考中寻找生命的意义', 
    ['思考', '质疑', '智慧']),
  adventurer('冒险家', '🗺️', Color(0xFFFF9800), 
    '勇敢探索未知的领域', 
    ['勇敢', '好奇', '探索']),
  scientist('科学家', '🔬', Color(0xFF2196F3), 
    '用理性揭示世界的规律', 
    ['理性', '严谨', '发现']),
  poet('诗人', '📝', Color(0xFF9C27B0), 
    '用文字捕捉瞬间的永恒', 
    ['浪漫', '感性', '文字']),
  chef('厨师', '👨‍🍳', Color(0xFF4CAF50), 
    '用美食传递温暖与爱', 
    ['创造', '分享', '味觉']);

  final String label;
  final String icon;
  final Color color;
  final String description;
  final List<String> traits;
}
3.1.2 角色模型 (Role)
class Role {
  final RoleType type;              // 角色类型
  final String name;                // 角色名称
  final String description;         // 角色描述
  final List<String> traits;        // 性格特质
  final List<String> guidelines;    // 行为指南
  final List<String> mindset;       // 心态建议
  final List<RoleTask> tasks;       // 专属任务
  final String dailyQuote;          // 每日格言
}
3.1.3 每日角色模型 (DailyRole)
class DailyRole {
  final String id;                  // 唯一标识
  final Role role;                  // 角色信息
  final DateTime assignedDate;      // 分配日期
  final List<RoleTask> completedTasks; // 已完成任务
  final double completionRate;      // 完成率
  final String? diaryContent;       // 体验日记
  final bool isCompleted;           // 是否完成
  
  int get totalTasks => role.tasks.length;
  int get completedCount => completedTasks.length;
}
3.1.4 角色任务模型 (RoleTask)
class RoleTask {
  final String id;                  // 唯一标识
  final String title;               // 任务标题
  final String description;         // 任务描述
  final bool completed;             // 是否完成
  final DateTime? completedAt;      // 完成时间
  final int difficulty;             // 难度等级(1-5)
  final int expReward;              // 经验奖励
}
3.1.5 角色分布统计
8% 8% 8% 8% 8% 8% 8% 8% 8% 8% 8% 8% 角色类型分布 艺术家 哲学家 冒险家 科学家 诗人 厨师 摄影师 音乐家 园丁 侦探 梦想家 慈善家

3.2 页面结构设计

3.2.1 主页面布局

RoleCardHomePage

IndexedStack

今日角色页

角色图鉴页

体验日记页

设置页面

NavigationBar

今日 Tab

图鉴 Tab

日记 Tab

设置 Tab

3.2.2 今日角色页面结构

今日角色页

角色卡片

行为指南

专属任务

体验日记

角色图标

角色名称

角色描述

性格特质

每日格言

行为准则

心态建议

任务列表

完成进度

打卡按钮

日记输入

心情选择

保存按钮

3.2.3 角色图鉴页面结构

角色图鉴页

SliverAppBar

角色网格

渐变背景

标题

已解锁统计

角色卡片

角色图标

角色名称

体验次数

解锁状态

3.3 角色分配算法

已分配

未分配

开始分配

获取当前日期

检查今日是否已分配

返回现有角色

获取角色池

计算权重

是否首次分配?

均匀随机

加权随机

降低已体验角色权重

提高未体验角色权重

生成随机数

选择角色

生成专属任务

保存分配记录

返回新角色

3.4 任务完成流程

查看任务列表

选择任务

阅读任务详情

执行任务

任务完成?

点击完成按钮

更新任务状态

计算完成率

所有任务完成?

解锁成就

提示写日记

继续下一个任务

保存体验日记


四、UI设计规范

4.1 配色方案

应用采用温暖的橙黄色为主色调,营造轻松愉悦的探索氛围:

颜色类型 色值 用途
主色 #FF9800 (Orange) 导航、强调元素
渐变起始 #FF9800 角色卡片渐变
渐变结束 #FFB74D 角色卡片渐变
艺术家 #E91E63 粉红色
哲学家 #673AB7 深紫色
冒险家 #FF9800 橙色
科学家 #2196F3 蓝色
诗人 #9C27B0 紫色
厨师 #4CAF50 绿色

4.2 字体规范

元素 字号 字重 颜色
角色名称 28px Bold #FFFFFF
角色描述 14px Regular #FFFFFF
任务标题 16px SemiBold #000000
任务描述 13px Regular #757575
行为指南 14px Regular #424242
每日格言 15px Italic #616161

4.3 组件规范

4.3.1 角色卡片
┌─────────────────────────────────────────────────┐
│                                                 │
│              ┌─────────┐                        │
│              │   🎨    │                        │
│              └─────────┘                        │
│                                                 │
│                艺术家                           │
│                                                 │
│         用色彩和线条诠释世界                     │
│                                                 │
│      ┌────┐ ┌────┐ ┌────┐                     │
│      │创意│ │敏感│ │表达│                     │
│      └────┘ └────┘ └────┘                     │
│                                                 │
│    "每一笔都是灵魂的舞蹈"                        │
│                                                 │
└─────────────────────────────────────────────────┘
4.3.2 任务卡片
┌─────────────────────────────────────────────────┐
│ ┌────┐  观察一朵花10分钟              ✓        │
│ │ 1  │  仔细观察花的颜色、形状、纹理            │
│ └────┘  难度: ★★  经验: +20                  │
└─────────────────────────────────────────────────┘
4.3.3 行为指南卡片
┌─────────────────────────────────────────────────┐
│  📋 行为指南                                    │
│                                                 │
│  • 用艺术家的眼光观察世界                        │
│  • 关注色彩、形状、光影的变化                    │
│  • 尝试用不同方式表达感受                        │
│  • 保持对美的敏感和追求                          │
│                                                 │
└─────────────────────────────────────────────────┘
4.3.4 体验日记卡片
┌─────────────────────────────────────────────────┐
│  📝 今日体验                                    │
│                                                 │
│  ┌─────────────────────────────────────────┐   │
│  │                                         │   │
│  │  记录你作为艺术家的体验...               │   │
│  │                                         │   │
│  └─────────────────────────────────────────┘   │
│                                                 │
│  心情: 😊 😐 😔 😤 😢                          │
│                                                 │
│              [保存日记]                          │
│                                                 │
└─────────────────────────────────────────────────┘

五、核心功能实现

5.1 角色分配算法

Role _assignDailyRole() {
  final today = DateTime.now();
  final dateKey = '${today.year}-${today.month}-${today.day}';
  
  if (_assignedDates.containsKey(dateKey)) {
    return _getRoleByType(_assignedDates[dateKey]!);
  }
  
  final random = Random();
  final availableRoles = RoleType.values.toList();
  
  Map<RoleType, double> weights = {};
  for (var role in availableRoles) {
    int experienceCount = _roleStats[role] ?? 0;
    weights[role] = 1.0 / (1.0 + experienceCount * 0.5);
  }
  
  double totalWeight = weights.values.reduce((a, b) => a + b);
  double randomValue = random.nextDouble() * totalWeight;
  
  double cumulative = 0;
  RoleType selectedRole = availableRoles.first;
  
  for (var entry in weights.entries) {
    cumulative += entry.value;
    if (randomValue <= cumulative) {
      selectedRole = entry.key;
      break;
    }
  }
  
  _assignedDates[dateKey] = selectedRole;
  _roleStats[selectedRole] = (_roleStats[selectedRole] ?? 0) + 1;
  
  return _getRoleByType(selectedRole);
}

5.2 角色数据生成

Role _getRoleByType(RoleType type) {
  switch (type) {
    case RoleType.artist:
      return Role(
        type: type,
        name: '艺术家',
        description: '用色彩和线条诠释世界',
        traits: ['创意', '敏感', '表达'],
        guidelines: [
          '用艺术家的眼光观察世界',
          '关注色彩、形状、光影的变化',
          '尝试用不同方式表达感受',
          '保持对美的敏感和追求',
        ],
        mindset: [
          '每个人都是艺术家',
          '美无处不在,需要用心发现',
          '创作是灵魂的对话',
        ],
        tasks: _generateArtistTasks(),
        dailyQuote: '每一笔都是灵魂的舞蹈',
      );
    case RoleType.philosopher:
      return Role(
        type: type,
        name: '哲学家',
        description: '在思考中寻找生命的意义',
        traits: ['思考', '质疑', '智慧'],
        guidelines: [
          '保持好奇心和求知欲',
          '对一切保持质疑和思考',
          '寻找事物背后的本质',
          '与他人进行深度对话',
        ],
        mindset: [
          '思考是灵魂的体操',
          '问题比答案更重要',
          '智慧源于不断的追问',
        ],
        tasks: _generatePhilosopherTasks(),
        dailyQuote: '未经审视的人生不值得过',
      );
    default:
      return _getDefaultRole(type);
  }
}

5.3 任务生成系统

List<RoleTask> _generateArtistTasks() {
  final random = Random();
  final allTasks = [
    RoleTask(
      id: 'artist_1',
      title: '观察一朵花10分钟',
      description: '仔细观察花的颜色、形状、纹理',
      difficulty: 2,
      expReward: 20,
    ),
    RoleTask(
      id: 'artist_2',
      title: '画一幅简笔画',
      description: '用简单的线条记录眼前的景象',
      difficulty: 3,
      expReward: 30,
    ),
    RoleTask(
      id: 'artist_3',
      title: '拍一张有艺术感的照片',
      description: '寻找独特的角度和光影',
      difficulty: 2,
      expReward: 25,
    ),
    RoleTask(
      id: 'artist_4',
      title: '用文字描述一种颜色',
      description: '不用颜色名称,描述一种颜色的感觉',
      difficulty: 4,
      expReward: 40,
    ),
    RoleTask(
      id: 'artist_5',
      title: '创作一首小诗',
      description: '用诗意的语言表达此刻的感受',
      difficulty: 3,
      expReward: 35,
    ),
  ];
  
  allTasks.shuffle(random);
  return allTasks.take(3).toList();
}

5.4 任务完成处理

void _completeTask(RoleTask task) {
  setState(() {
    final updatedTask = task.copyWith(
      completed: true,
      completedAt: DateTime.now(),
    );
    
    _todayRole!.completedTasks.add(updatedTask);
    
    final completionRate = _todayRole!.completedTasks.length / 
                          _todayRole!.role.tasks.length;
    
    if (completionRate >= 1.0) {
      _showCompletionDialog();
    }
  });
  
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(
      content: Text('任务完成! +${task.expReward} 经验'),
      backgroundColor: Colors.green,
      behavior: SnackBarBehavior.floating,
    ),
  );
}

5.5 体验日记保存

void _saveDiary(String content, int mood) {
  if (_todayRole == null) return;
  
  final diary = DiaryEntry(
    id: DateTime.now().millisecondsSinceEpoch.toString(),
    roleType: _todayRole!.role.type,
    date: DateTime.now(),
    content: content,
    mood: mood,
  );
  
  setState(() {
    _diaries.insert(0, diary);
    _todayRole = _todayRole!.copyWith(
      diaryContent: content,
      isCompleted: true,
    );
  });
  
  ScaffoldMessenger.of(context).showSnackBar(
    const SnackBar(
      content: Text('日记已保存'),
      backgroundColor: Colors.green,
    ),
  );
}

六、交互设计

6.1 角色分配交互

任务系统 角色系统 应用 用户 任务系统 角色系统 应用 用户 alt [今日未分配] [今日已分配] 打开应用 检查今日角色 请求随机角色 加权随机选择 返回角色 生成专属任务 返回任务列表 展示角色卡片(动画) 展示当前角色

6.2 任务完成流程

查看任务列表

选择任务

阅读任务详情

执行任务

任务完成?

点击完成按钮

更新任务状态

计算完成率

所有任务完成?

解锁成就

提示写日记

继续下一个任务

保存体验日记

6.3 页面切换状态

点击图鉴Tab

点击日记Tab

点击设置Tab

点击今日Tab

点击日记Tab

点击设置Tab

点击今日Tab

点击图鉴Tab

点击设置Tab

点击今日Tab

点击图鉴Tab

点击日记Tab

今日角色页

角色图鉴页

体验日记页

设置页面


七、角色设计详解

7.1 艺术家角色

角色定位: 用艺术的眼光重新审视世界,发现生活中的美

核心特质:

  • 创意: 打破常规思维,用新颖的方式看待事物
  • 敏感: 对色彩、形状、光影保持高度敏感
  • 表达: 通过各种方式表达内心的感受

行为指南:

  1. 用艺术家的眼光观察世界
  2. 关注色彩、形状、光影的变化
  3. 尝试用不同方式表达感受
  4. 保持对美的敏感和追求

专属任务示例:

任务 描述 难度 经验
观察一朵花10分钟 仔细观察花的颜色、形状、纹理 ★★ 20
画一幅简笔画 用简单的线条记录眼前的景象 ★★★ 30
拍一张有艺术感的照片 寻找独特的角度和光影 ★★ 25
用文字描述一种颜色 不用颜色名称,描述一种颜色的感觉 ★★★★ 40
创作一首小诗 用诗意的语言表达此刻的感受 ★★★ 35

每日格言: “每一笔都是灵魂的舞蹈”

7.2 哲学家角色

角色定位: 在思考中寻找生命的意义,培养深度思考能力

核心特质:

  • 思考: 对一切保持好奇心和思考
  • 质疑: 不轻易接受表面现象
  • 智慧: 通过思考获得洞察和理解

行为指南:

  1. 保持好奇心和求知欲
  2. 对一切保持质疑和思考
  3. 寻找事物背后的本质
  4. 与他人进行深度对话

专属任务示例:

任务 描述 难度 经验
思考一个哲学问题 选择一个哲学问题深入思考30分钟 ★★★ 35
与他人深度对话 就一个话题进行15分钟的深度交流 ★★★ 30
阅读一篇哲学文章 阅读并思考一篇哲学相关的文章 ★★ 25
写下三个疑问 记录今天遇到的三个值得思考的问题 ★★ 20
反思一个日常现象 分析一个日常现象背后的原因 ★★★★ 40

每日格言: “未经审视的人生不值得过”

7.3 冒险家角色

角色定位: 勇敢探索未知领域,突破舒适区

核心特质:

  • 勇敢: 敢于尝试新事物和挑战
  • 好奇: 对未知保持强烈的好奇心
  • 探索: 主动寻找和发现新的可能性

行为指南:

  1. 勇敢尝试从未做过的事
  2. 保持对未知的好奇心
  3. 主动探索新的地方和领域
  4. 记录每一次冒险的经历

专属任务示例:

任务 描述 难度 经验
走一条从未走过的路 选择一条陌生的路线回家或上班 ★★ 25
尝试一种新食物 品尝从未吃过的食物 ★★ 20
与陌生人交谈 主动与一个陌生人开始对话 ★★★ 35
学习一项新技能 花30分钟学习一项全新的技能 ★★★★ 40
探索一个新地方 去一个从未去过的地方 ★★★ 30

每日格言: “生命不息,冒险不止”


八、扩展功能规划

8.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 角色分配系统 任务系统 体验日记 成就系统 数据统计 分享功能 社交功能 角色定制 云端同步 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 人生角色卡应用开发计划

8.2 功能扩展建议

8.2.1 成就系统

成就解锁机制:

  • 角色大师: 体验所有12种角色
  • 任务达人: 累计完成100个任务
  • 日记作家: 撰写30篇体验日记
  • 连续打卡: 连续7天完成所有任务
8.2.2 社交功能

社交互动机制:

  • 分享角色卡片到社交媒体
  • 查看朋友的今日角色
  • 角色匹配和互动
  • 角色体验交流社区
8.2.3 角色定制

个性化定制:

  • 创建自定义角色
  • 设计专属任务
  • 分享角色模板
  • 角色皮肤和主题

九、注意事项

9.1 开发注意事项

  1. 角色分配: 使用加权随机算法,确保角色分配的公平性

  2. 任务生成: 每天生成3-5个任务,难度适中

  3. 数据持久化: 使用SharedPreferences存储用户数据

  4. 日期判断: 准确判断今日是否已分配角色

9.2 常见问题

问题 原因 解决方案
角色重复分配 日期判断错误 检查日期格式
任务不显示 任务列表为空 检查任务生成逻辑
日记保存失败 数据未持久化 检查SharedPreferences
完成率计算错误 任务数量错误 检查任务列表长度

9.3 使用建议

🎭 人生角色卡使用小贴士 🎭

全身心投入角色,不要有顾虑
完成任务时享受过程,不追求完美
记录真实的体验和感受
保持开放心态,接纳不同的角色


十、运行说明

10.1 环境要求

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

10.2 运行命令

# 查看可用设备
flutter devices

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

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

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

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

十一、总结

人生角色卡应用通过每日随机分配角色的创新方式,帮助用户跳出日常生活的固有模式,以全新的视角和身份体验生活。应用内置12种精心设计的角色类型,涵盖艺术、科学、哲学、冒险等多个领域,每种角色都有独特的性格特征、行为准则和专属任务。

核心功能涵盖角色分配、任务系统、体验日记三大模块。角色分配采用加权随机算法,确保公平性和多样性;任务系统为每种角色生成专属任务,引导用户深入体验角色;体验日记帮助用户记录和反思角色扮演的过程。

应用采用Material Design 3设计规范,以温暖的橙黄色为主色调,界面轻松愉悦。通过本应用,希望能够帮助用户打破思维定式,培养多元视角,丰富人生体验,让每一天都成为一次全新的冒险。

每一天,都是一次全新的角色扮演


Logo

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

更多推荐