欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
一、项目概述
运行效果图




1.1 应用简介
关系测试是一款探索人际关系脆弱性的创新应用。通过精心设计的测试场景和问题,帮助用户了解自己与朋友、家人、伴侣之间关系的真实强度。应用不追求简单的"好"或"坏"结论,而是引导用户深入思考关系的本质,发现那些被忽视的裂痕和隐患。
每个测试都模拟真实生活中可能遇到的情况,从金钱、信任、时间、价值观等多个维度考验关系的韧性。测试结果不是简单的分数,而是一份关系诊断报告,帮助用户更清醒地认识自己的人际关系。
1.2 核心理念
真正的友谊需要经得起考验,而了解脆弱才能更好地守护。关系测试的设计理念基于以下原则:
| 设计原则 | 理论基础 | 应用体现 |
|---|---|---|
| 压力测试 | 关系韧性理论 | 模拟压力场景测试关系 |
| 多维评估 | 社会支持理论 | 从多个维度评估关系 |
| 诚实面对 | 自我认知理论 | 引导用户诚实回答 |
| 理性分析 | 关系投资模型 | 分析关系的投入与回报 |
1.3 核心功能
关系测试
核心功能
测试系统
场景模拟
问题设计
选择判定
结果分析
关系管理
添加关系
关系分类
测试记录
历史对比
诊断报告
脆弱指数
风险提示
改善建议
趋势分析
辅助功能
匿名分享
数据统计
提醒功能
导出报告
1.4 关系类型分类
应用支持多种关系类型测试:
| 类型 | 图标 | 颜色 | 描述 | 测试重点 |
|---|---|---|---|---|
| 友谊 | 👫 | #2196F3 | 普通朋友关系 | 信任、支持、理解 |
| 挚友 | 💝 | #E91E63 | 亲密朋友关系 | 忠诚、包容、牺牲 |
| 恋人 | 💕 | #F44336 | 恋爱关系 | 信任、未来、沟通 |
| 家人 | 👨👩👧👦 | #4CAF50 | 家庭关系 | 责任、包容、支持 |
| 同事 | 💼 | #FF9800 | 工作关系 | 利益、竞争、合作 |
| 熟人 | 👋 | #607D8B | 泛泛之交 | 边界、礼貌、距离 |
1.5 测试维度系统
| 维度 | 图标 | 描述 | 典型问题 |
|---|---|---|---|
| 信任 | 🤝 | 信任程度 | 会借钱给TA吗? |
| 金钱 | 💰 | 金钱关系 | AA制还是请客? |
| 时间 | ⏰ | 时间投入 | 愿意花多少时间? |
| 危机 | 🆘 | 危机应对 | 遇到困难会帮忙吗? |
| 秘密 | 🔐 | 秘密分享 | 会告诉TA秘密吗? |
| 价值观 | 💭 | 价值认同 | 能接受TA的选择吗? |
| 边界 | 🚧 | 个人边界 | 能拒绝TA吗? |
| 未来 | 🔮 | 未来预期 | 关系会持续多久? |
1.6 技术栈
| 技术领域 | 技术选型 | 版本要求 |
|---|---|---|
| 开发框架 | Flutter | >= 3.0.0 |
| 编程语言 | Dart | >= 2.17.0 |
| 设计规范 | Material Design 3 | - |
| 动画控制 | AnimationController | - |
| 状态管理 | setState | - |
| 目标平台 | 鸿蒙OS / Web | API 21+ |
1.7 项目结构
lib/
└── main_relationship_test.dart
├── RelationshipTestApp # 应用入口
├── RelationType # 关系类型枚举
├── TestDimension # 测试维度枚举
├── Relationship # 关系模型
├── TestQuestion # 测试问题模型
├── TestResult # 测试结果模型
├── RelationshipTestPage # 主页面(底部导航)
├── _buildTestPage # 测试页面
├── _buildRelationshipsPage # 关系列表
└── _buildHistoryPage # 历史记录
二、系统架构
2.1 整体架构图
Data Layer
Business Logic Layer
Presentation Layer
主页面
RelationshipTestPage
测试页
关系列表
历史记录
问题展示
选择回答
进度显示
结果展示
添加关系
关系卡片
开始测试
测试记录
趋势图表
测试引擎
评分系统
报告生成器
关系分析器
RelationType
关系类型枚举
TestDimension
测试维度枚举
Relationship
关系模型
TestQuestion
问题模型
TestResult
结果模型
2.2 类图设计
manages
uses
has
belongs
contains
belongs
RelationshipTestApp
+Widget build()
<<enumeration>>
RelationType
+String label
+String icon
+Color color
+String description
+friend()
+bestFriend()
+lover()
+family()
+colleague()
+acquaintance()
<<enumeration>>
TestDimension
+String label
+String icon
+String description
+trust()
+money()
+time()
+crisis()
+secret()
+value()
+boundary()
+future()
Relationship
+String id
+String name
+RelationType type
+DateTime createdAt
+List<TestResult> testHistory
+double? latestScore
+String? notes
TestQuestion
+String id
+String scenario
+String question
+TestDimension dimension
+List<TestOption> options
+int difficulty
TestOption
+String text
+int score
+String analysis
TestResult
+String id
+String relationshipId
+DateTime testDate
+int totalScore
+Map<String,int> dimensionScores
+String fragilityLevel
+List<String> riskFactors
+List<String> suggestions
RelationshipTestPage
-int _selectedIndex
-List<Relationship> _relationships
-List<TestQuestion> _questions
+Widget build()
-_startTest()
-_submitAnswer()
-_generateResult()
2.3 测试流程
报告生成器 评分系统 测试引擎 测试页 用户 报告生成器 评分系统 测试引擎 测试页 用户 loop [每个问题] 选择关系开始测试 获取测试问题 返回问题列表 展示场景和问题 选择答案 提交答案 计算分数 请求生成报告 获取分数 返回各维度分数 生成诊断报告 展示结果
2.4 评分算法流程
收集所有答案
按维度分组
计算各维度得分
信任维度
金钱维度
时间维度
危机维度
秘密维度
价值观维度
边界维度
未来维度
加权平均
计算脆弱指数
判断脆弱等级
生成风险提示
生成改善建议
输出诊断报告
三、核心模块设计
3.1 数据模型设计
3.1.1 关系类型枚举 (RelationType)
dart
enum RelationType {
friend('友谊', '👫', Color(0xFF2196F3), '普通朋友关系'),
bestFriend('挚友', '💝', Color(0xFFE91E63), '亲密朋友关系'),
lover('恋人', '💕', Color(0xFFF44336), '恋爱关系'),
family('家人', '👨👩👧👦', Color(0xFF4CAF50), '家庭关系'),
colleague('同事', '💼', Color(0xFFFF9800), '工作关系'),
acquaintance('熟人', '👋', Color(0xFF607D8B), '泛泛之交');
final String label;
final String icon;
final Color color;
final String description;
}
3.1.2 测试维度枚举 (TestDimension)
dart
enum TestDimension {
trust('信任', '🤝', '信任程度与可靠性'),
money('金钱', '💰', '金钱关系与利益冲突'),
time('时间', '⏰', '时间投入与陪伴'),
crisis('危机', '🆘', '危机应对与支持'),
secret('秘密', '🔐', '秘密分享与保密'),
value('价值观', '💭', '价值认同与分歧'),
boundary('边界', '🚧', '个人边界与尊重'),
future('未来', '🔮', '未来预期与规划');
final String label;
final String icon;
final String description;
}
3.1.3 关系模型 (Relationship)
dart
class Relationship {
final String id; // 唯一标识
final String name; // 关系名称
final RelationType type; // 关系类型
final DateTime createdAt; // 创建时间
final List<TestResult> testHistory; // 测试历史
final double? latestScore; // 最新分数
final String? notes; // 备注
}
3.1.4 测试问题模型 (TestQuestion)
dart
class TestQuestion {
final String id; // 唯一标识
final String scenario; // 场景描述
final String question; // 问题内容
final TestDimension dimension;// 测试维度
final List<TestOption> options;// 选项列表
final int difficulty; // 难度等级(1-5)
}
3.1.5 测试结果模型 (TestResult)
dart
class TestResult {
final String id; // 唯一标识
final String relationshipId; // 关系ID
final DateTime testDate; // 测试日期
final int totalScore; // 总分
final Map<String, int> dimensionScores; // 各维度分数
final String fragilityLevel; // 脆弱等级
final List<String> riskFactors; // 风险因素
final List<String> suggestions; // 改善建议
}
3.1.6 脆弱等级分布
30% 25% 20% 15% 10% 脆弱等级分布 坚固 稳定 一般 脆弱 危险
3.2 页面结构设计
3.2.1 主页面布局
RelationshipTestPage
IndexedStack
测试页
关系列表
历史记录
NavigationBar
测试 Tab
关系 Tab
历史 Tab
3.2.2 测试页面结构
测试页面
选择关系
问题展示
进度指示
选项列表
结果展示
关系类型
关系名称
场景描述
问题内容
维度标签
当前进度
进度条
脆弱指数
维度分析
风险提示
改善建议
3.2.3 关系列表页面结构
关系列表
添加按钮
关系卡片列表
关系卡片
关系图标
关系名称
最新分数
测试次数
开始测试按钮
3.3 评分算法
80-100
60-79
40-59
20-39
0-19
获取答案列表
按维度分组
计算维度平均分
应用难度权重
计算加权总分
总分范围
坚固
稳定
一般
脆弱
危险
生成报告
3.4 问题生成逻辑
dart
List<TestQuestion> _generateQuestions(RelationType type) {
final questions = <TestQuestion>[];
// 根据关系类型选择重点维度
final priorityDimensions = _getPriorityDimensions(type);
// 为每个维度生成问题
for (final dimension in TestDimension.values) {
final weight = priorityDimensions.contains(dimension) ? 3 : 1;
for (int i = 0; i < weight; i++) {
questions.add(_createQuestion(dimension, type));
}
}
return questions..shuffle();
}
四、UI设计规范
4.1 配色方案
应用采用警示红为主色调,突出"脆弱性"主题:
| 颜色类型 | 色值 | 用途 |
|---|---|---|
| 主背景 | #0F1419 | 深色背景 |
| 卡片背景 | #1C2733 | 稍浅深色 |
| 主色 | #F44336 | 警示红 |
| 友谊 | #2196F3 | 蓝色 |
| 挚友 | #E91E63 | 粉红色 |
| 恋人 | #F44336 | 红色 |
| 家人 | #4CAF50 | 绿色 |
| 同事 | #FF9800 | 橙色 |
| 熟人 | #607D8B | 灰色 |
4.2 字体规范
| 元素 | 字号 | 字重 | 颜色 |
|---|---|---|---|
| 页面标题 | 28px | Bold | #FFFFFF |
| 场景描述 | 16px | Regular | #B0BEC5 |
| 问题内容 | 18px | Medium | #FFFFFF |
| 选项文字 | 14px | Regular | #FFFFFF |
| 分数显示 | 48px | Bold | 等级颜色 |
| 维度标签 | 12px | Medium | 维度颜色 |
4.3 组件规范
4.3.1 测试界面
┌─────────────────────────────────────────────────┐
│ 关系测试 3/15 │
├─────────────────────────────────────────────────┤
│ │
│ ━━━━━━━━━━━━━━━━━━━━━●━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ 💰 金钱维度 │
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ │ │
│ │ 场景: │ │
│ │ TA突然向你借一笔较大的钱, │ │
│ │ 说有急用但没有说明具体原因... │ │
│ │ │ │
│ │ 问题: │ │
│ │ 你会借给TA吗? │ │
│ │ │ │
│ └─────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ A. 毫不犹豫,借给TA │ │
│ └─────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────┐ │
│ │ B. 会借,但会问清楚原因 │ │
│ └─────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────┐ │
│ │ C. 犹豫,需要考虑一下 │ │
│ └─────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────┐ │
│ │ D. 不会借,关系没到那一步 │ │
│ └─────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────┘
4.3.2 结果展示
┌─────────────────────────────────────────────────┐
│ │
│ 测试结果 │
│ │
│ ┌─────────────────┐ │
│ │ │ │
│ │ 62 │ │
│ │ │ │
│ │ 稳定关系 │ │
│ └─────────────────┘ │
│ │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ 维度分析 │
│ ┌─────────────────────────────────────────┐ │
│ │ 🤝 信任 ████████████████░░░░ 78 │ │
│ │ 💰 金钱 ████████████░░░░░░░░ 58 │ │
│ │ ⏰ 时间 ██████████████░░░░░░ 65 │ │
│ │ 🆘 危机 ████████████░░░░░░░░ 55 │ │
│ │ 🔐 秘密 ████████████████░░░░ 72 │ │
│ └─────────────────────────────────────────┘ │
│ │
│ ⚠️ 风险提示 │
│ • 金钱关系存在隐患 │
│ • 危机应对能力不足 │
│ │
│ 💡 改善建议 │
│ • 建立更清晰的金钱边界 │
│ • 增加危机情况下的沟通 │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 重新测试 │ │ 保存结果 │ │
│ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────┘
4.3.3 关系卡片
┌─────────────────────────────────────────────────┐
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ 💝 小明 │ │
│ │ │ │
│ │ 挚友 · 测试3次 │ │
│ │ │ │
│ │ 最新分数: 72 │ │
│ │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ │
│ │ │ │
│ │ 等级: 稳定 │ │
│ │ │ │
│ │ ┌─────────────────┐ │ │
│ │ │ 开始测试 │ │ │
│ │ └─────────────────┘ │ │
│ └─────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ 👫 小红 │ │
│ │ │ │
│ │ 友谊 · 测试1次 │ │
│ │ │ │
│ │ 最新分数: 45 │ │
│ │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ │
│ │ │ │
│ │ 等级: 一般 │ │
│ │ │ │
│ │ ┌─────────────────┐ │ │
│ │ │ 开始测试 │ │ │
│ │ └─────────────────┘ │ │
│ └─────────────────────────────────────────┘ │
│ │
│ + 添加关系 │
│ │
└─────────────────────────────────────────────────┘
4.3.4 历史记录
┌─────────────────────────────────────────────────┐
│ 测试历史 │
├─────────────────────────────────────────────────┤
│ │
│ 📊 趋势图表 │
│ ┌─────────────────────────────────────────┐ │
│ │ │ │
│ │ 80 ─ │ │
│ │ ╭───╮ │ │
│ │ 60 ─ ╰───╮ ╭─── │ │
│ │ ╰──────╯ │ │
│ │ 40 ─ │ │
│ │ │ │
│ │ 1月 2月 3月 4月 │ │
│ └─────────────────────────────────────────┘ │
│ │
│ 最近测试 │
│ ┌─────────────────────────────────────────┐ │
│ │ 💝 小明 · 72分 · 稳定 │ │
│ │ 2024-01-15 │ │
│ └─────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────┐ │
│ │ 👫 小红 · 45分 · 一般 │ │
│ │ 2024-01-10 │ │
│ └─────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────┘
五、核心功能实现
5.1 测试问题生成
dart
List<TestQuestion> _generateQuestions(RelationType type) {
final questions = <TestQuestion>[];
final baseQuestions = _getBaseQuestions();
final typeQuestions = _getTypeSpecificQuestions(type);
questions.addAll(baseQuestions);
questions.addAll(typeQuestions);
questions.shuffle();
return questions.take(15).toList();
}
5.2 评分计算
dart
TestResult _calculateResult(
Relationship relationship,
List<TestQuestion> questions,
List<int> answers,
) {
final dimensionScores = <String, int>{};
for (final dimension in TestDimension.values) {
final dimensionQuestions = questions
.where((q) => q.dimension == dimension)
.toList();
if (dimensionQuestions.isEmpty) continue;
var totalScore = 0;
for (int i = 0; i < questions.length; i++) {
if (questions[i].dimension == dimension) {
totalScore += questions[i].options[answers[i]].score;
}
}
dimensionScores[dimension.name] =
(totalScore / dimensionQuestions.length).round();
}
final totalScore = dimensionScores.values.reduce((a, b) => a + b) ~/
dimensionScores.length;
return TestResult(
id: DateTime.now().millisecondsSinceEpoch.toString(),
relationshipId: relationship.id,
testDate: DateTime.now(),
totalScore: totalScore,
dimensionScores: dimensionScores,
fragilityLevel: _getFragilityLevel(totalScore),
riskFactors: _analyzeRiskFactors(dimensionScores),
suggestions: _generateSuggestions(dimensionScores),
);
}
5.3 脆弱等级判断
dart
String _getFragilityLevel(int score) {
if (score >= 80) return '坚固';
if (score >= 60) return '稳定';
if (score >= 40) return '一般';
if (score >= 20) return '脆弱';
return '危险';
}
5.4 风险因素分析
dart
List<String> _analyzeRiskFactors(Map<String, int> scores) {
final risks = <String>[];
if (scores['trust'] != null && scores['trust']! < 50) {
risks.add('信任基础薄弱');
}
if (scores['money'] != null && scores['money']! < 50) {
risks.add('金钱关系存在隐患');
}
if (scores['crisis'] != null && scores['crisis']! < 50) {
risks.add('危机应对能力不足');
}
if (scores['boundary'] != null && scores['boundary']! < 50) {
risks.add('个人边界模糊');
}
return risks;
}
5.5 改善建议生成
dart
List<String> _generateSuggestions(Map<String, int> scores) {
final suggestions = <String>[];
final lowDimensions = scores.entries
.where((e) => e.value < 60)
.map((e) => e.key)
.toList();
for (final dim in lowDimensions) {
switch (dim) {
case 'trust':
suggestions.add('增加真诚沟通,建立互信基础');
break;
case 'money':
suggestions.add('建立更清晰的金钱边界');
break;
case 'crisis':
suggestions.add('增加危机情况下的沟通');
break;
case 'boundary':
suggestions.add('学会适当表达自己的边界');
break;
}
}
return suggestions;
}
六、交互设计
6.1 测试流程
结果页 测试页 关系列表 用户 结果页 测试页 关系列表 用户 loop [15个问题] 选择关系 开始测试 展示问题 选择答案 记录答案 计算结果 展示诊断报告 保存结果 更新关系数据
6.2 添加关系流程
是
否
点击添加关系
显示添加表单
输入关系名称
选择关系类型
添加备注
确认添加?
创建关系对象
添加到列表
显示成功提示
取消操作
七、运行说明
7.1 环境要求
| 环境 | 版本要求 |
|---|---|
| Flutter SDK | >= 3.0.0 |
| Dart SDK | >= 2.17.0 |
| 鸿蒙OS | API 21+ |
7.2 运行命令
bash
# 查看可用设备
flutter devices
# 运行到Web服务器
flutter run -d web-server -t lib/main_relationship_test.dart --web-port 8138
# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_relationship_test.dart
# 运行到Windows
flutter run -d windows -t lib/main_relationship_test.dart
# 代码分析
flutter analyze lib/main_relationship_test.dart
八、总结
关系测试应用通过精心设计的测试场景和问题,帮助用户深入了解人际关系的脆弱程度。应用支持6种关系类型,8个测试维度,通过信任、金钱、时间、危机、秘密、价值观、边界、未来等多个角度全面评估关系的健康程度。
核心功能涵盖测试系统、关系管理、诊断报告三大模块。测试系统提供沉浸式的场景模拟体验;关系管理让用户可以追踪多段关系的变化;诊断报告提供专业的脆弱性分析和改善建议。
应用采用Material Design 3设计规范,以警示红为主色调,突出"脆弱性"主题。通过本应用,希望能够帮助用户更清醒地认识自己的人际关系,发现问题并及时改善,让关系更加坚固持久。