19 KiB
19 KiB
情绪博物馆完整功能需求与数据库设计
文档版本: v2.0
创建时间: 2025-07-12
项目状态: 基础框架已完成,功能完善中
开发框架: SwiftUI + iOS 18.5
📋 目录
1. 项目现状分析
✅ 已完成功能
- 基础TabView导航框架(记录、治愈、探索、个人)
- 主题系统(深色模式支持)
- 加载状态和骨架屏系统
- 动画过渡效果
- RecordView聊天化改造
- AI对话基础框架
- 情绪日历基础版
- 完整的数据模型定义(DataModels.swift)
- 模拟数据管理系统(MockDataManager.swift)
- 导航管理系统(NavigationManager.swift)
- 主题管理系统(ThemeManager)
❌ 待完善功能
- 完整的AI对话系统
- 治愈页面(成长课题系统)
- 探索页面(地图+社区)
- 个人页面(用户信息+成就)
- 页面间跳转逻辑
- 所有弹窗页面的关闭按钮
- 真实数据存储(Core Data集成)
- AI服务集成
- 地图服务集成
- 语音识别功能
2. 完整功能需求清单
2.1 记录页面(RecordView)
核心功能
-
智能对话系统
- 基础聊天界面
- 语音转文字功能
- 多模态输入(文字、语音、图片)
- AI情绪分析和智能回复
- 全屏对话模式
- 对话历史记录
-
情绪日历
- 单行日历视图
- 日历展开/收起功能
- 日期情绪状态标记
- 情绪回顾和趋势查看
- 情绪数据可视化
-
对话记录管理
- 聊天记录入口页面(ChatHistoryView)
- 对话内容自动保存
- 智能分类和标签
- 搜索和筛选功能
- 对话摘要生成
-
设置功能
- 主题切换基础功能
- 完整设置页面(SettingsView)
- 音效设置
- 隐私设置
- 关于页面
2.2 治愈页面(GrowthView)
核心功能
-
个人成长档案
- 成长概览卡片
- 五维雷达图(自我感知、情绪韧性、行动力、共情力、生活热度)
- 成长轨迹可视化
- 个性化成长建议
-
成长课题系统
- 课题数据模型
- 课题分类标签界面
- 课题详情页面(TopicDetailView)
- 课题互动页面(TopicInteractionView)
- 进度追踪和等级系统
- 课题解锁机制
-
互动内容
- AI对话互动(TopicChatView)
- 知识文章阅读(TopicArticleView)
- 练习活动(TopicExerciseView)
- 反思日记(TopicReflectionView)
- 冥想练习
- 小测验
-
奖励系统
- 奖励数据模型
- 积分系统
- 徽章和称号
- 皮肤和道具
- 成就展示
2.3 探索页面(ExploreView)
核心功能
-
智能地图系统
- 地图SDK集成(高德地图)
- 地点标记和分类
- AI推荐地点
- 个人收藏地点
- 地点详情页面(LocationDetailView)
-
社区分享系统
- 社区动态页面(CommunityFeedView)
- 图文分享功能
- 点赞、评论、转发
- 内容审核机制
- 添加地点页面(AddLocationView)
-
位置服务
- 地理位置获取
- 周边推荐
- 导航服务
- 隐私保护
-
视图切换
- 地图模式/社区模式切换
- 筛选和排序功能
- 搜索功能
2.4 个人页面(InsightView/UniverseView)
核心功能
-
用户信息管理
- 用户资料页面(UserProfileView)
- 基础信息编辑
- 头像上传
- 会员中心
-
数据统计展示
- 本周数据统计
- 累计成就展示
- 趋势分析图表
- 社交数据统计
-
成就系统
- 成就数据模型
- 成就页面(AchievementsView)
- 成就分类展示
- 进度追踪
-
快捷功能
- 邀请好友
- 数据导出
- 反馈建议
- 帮助中心
3. 数据库设计
3.1 核心实体关系图
erDiagram
User ||--o{ Conversation : has
User ||--o{ EmotionRecord : records
User ||--o{ GrowthTopic : participates
User ||--o{ Achievement : earns
User ||--o{ LocationPin : creates
User ||--o{ CommunityPost : posts
Conversation ||--o{ Message : contains
Conversation ||--o| EmotionAnalysis : analyzed_by
GrowthTopic ||--o{ TopicInteraction : has
GrowthTopic ||--o{ Reward : offers
GrowthTopic ||--o| TopicContent : contains
LocationPin ||--o{ CommunityPost : located_at
CommunityPost ||--o{ Comment : has
TopicContent ||--o{ Article : includes
TopicContent ||--o{ ActionSuggestion : includes
3.2 主要数据表结构
用户表 (User)
| 字段 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | UUID | 主键 | PRIMARY KEY |
| username | String | 用户名 | UNIQUE, NOT NULL |
| String | 邮箱 | UNIQUE, NOT NULL | |
| avatar | String? | 头像URL | NULLABLE |
| profile | UserProfile | 用户档案 | NOT NULL |
| createdAt | Date | 创建时间 | NOT NULL |
| lastActiveAt | Date | 最后活跃时间 | NOT NULL |
对话表 (Conversation)
| 字段 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | UUID | 主键 | PRIMARY KEY |
| userId | UUID | 用户ID | FOREIGN KEY |
| title | String | 对话标题 | NOT NULL |
| startTime | Date | 开始时间 | NOT NULL |
| endTime | Date? | 结束时间 | NULLABLE |
| summary | String? | 对话摘要 | NULLABLE |
| tags | [String] | 标签数组 | NOT NULL |
消息表 (Message)
| 字段 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | UUID | 主键 | PRIMARY KEY |
| conversationId | UUID | 对话ID | FOREIGN KEY |
| content | String | 消息内容 | NOT NULL |
| type | MessageType | 消息类型 | NOT NULL |
| sender | MessageSender | 发送者 | NOT NULL |
| timestamp | Date | 时间戳 | NOT NULL |
| emotionScore | Float? | 情绪分数 | NULLABLE |
| isRead | Bool | 是否已读 | NOT NULL |
情绪记录表 (EmotionRecord)
| 字段 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | UUID | 主键 | PRIMARY KEY |
| userId | UUID | 用户ID | FOREIGN KEY |
| date | Date | 记录日期 | NOT NULL |
| emotionType | EmotionType | 情绪类型 | NOT NULL |
| intensity | Float | 情绪强度 | NOT NULL |
| context | String | 情绪背景 | NOT NULL |
| triggers | [String] | 触发因素 | NOT NULL |
| location | String? | 地点 | NULLABLE |
| weather | String? | 天气 | NULLABLE |
| notes | String? | 备注 | NULLABLE |
成长课题表 (GrowthTopic)
| 字段 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | UUID | 主键 | PRIMARY KEY |
| title | String | 课题标题 | NOT NULL |
| description | String | 课题描述 | NOT NULL |
| category | TopicCategory | 课题分类 | NOT NULL |
| difficulty | Difficulty | 难度等级 | NOT NULL |
| progress | Float | 完成进度 | NOT NULL |
| level | Int | 当前等级 | NOT NULL |
| totalLevels | Int | 总等级数 | NOT NULL |
| isUnlocked | Bool | 是否解锁 | NOT NULL |
| completedAt | Date? | 完成时间 | NULLABLE |
| estimatedDuration | TimeInterval | 预估时长 | NOT NULL |
| prerequisites | [UUID] | 前置课题 | NOT NULL |
地点标记表 (LocationPin)
| 字段 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | UUID | 主键 | PRIMARY KEY |
| coordinate | Coordinate | 坐标 | NOT NULL |
| title | String | 地点名称 | NOT NULL |
| description | String | 地点描述 | NOT NULL |
| type | LocationType | 地点类型 | NOT NULL |
| emotionTags | [EmotionType] | 情绪标签 | NOT NULL |
| photos | [String] | 图片URLs | NOT NULL |
| createdBy | UUID? | 创建者ID | NULLABLE |
| createdAt | Date | 创建时间 | NOT NULL |
| likes | Int | 点赞数 | NOT NULL |
| visits | Int | 访问数 | NOT NULL |
| address | String? | 详细地址 | NULLABLE |
| category | LocationCategory | 地点分类 | NOT NULL |
| isBookmarked | Bool | 是否收藏 | NOT NULL |
社区帖子表 (CommunityPost)
| 字段 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | UUID | 主键 | PRIMARY KEY |
| userId | UUID | 用户ID | FOREIGN KEY |
| locationId | UUID? | 地点ID | NULLABLE |
| content | String | 帖子内容 | NOT NULL |
| photos | [String] | 图片URLs | NOT NULL |
| tags | [String] | 标签 | NOT NULL |
| likes | Int | 点赞数 | NOT NULL |
| createdAt | Date | 创建时间 | NOT NULL |
| isPrivate | Bool | 是否私密 | NOT NULL |
| viewCount | Int | 浏览数 | NOT NULL |
| type | PostType | 帖子类型 | NOT NULL |
| authorName | String | 作者名称 | NOT NULL |
成就表 (Achievement)
| 字段 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | UUID | 主键 | PRIMARY KEY |
| title | String | 成就标题 | NOT NULL |
| description | String | 成就描述 | NOT NULL |
| category | AchievementCategory | 成就分类 | NOT NULL |
| icon | String | 图标名称 | NOT NULL |
| rarity | RewardRarity | 稀有度 | NOT NULL |
| requirement | AchievementRequirement | 解锁条件 | NOT NULL |
| progress | Int | 当前进度 | NOT NULL |
| targetValue | Int | 目标值 | NOT NULL |
| unlockedAt | Date? | 解锁时间 | NULLABLE |
| isHidden | Bool | 是否隐藏 | NOT NULL |
3.3 索引设计
主要索引
- User表:username, email, lastActiveAt
- Conversation表:userId, startTime
- Message表:conversationId, timestamp
- EmotionRecord表:userId, date, emotionType
- GrowthTopic表:category, difficulty, isUnlocked
- LocationPin表:coordinate, type, category, createdAt
- CommunityPost表:userId, locationId, createdAt, type
- Achievement表:category, rarity, unlockedAt
复合索引
- EmotionRecord:(userId, date)
- Message:(conversationId, timestamp)
- CommunityPost:(userId, createdAt)
- LocationPin:(type, category)
4. 技术架构建议
4.1 当前架构优势
- ✅ 清晰的MVVM架构
- ✅ 完整的数据模型定义
- ✅ 良好的状态管理(ObservableObject)
- ✅ 模块化的服务层设计
- ✅ 主题系统支持
4.2 需要完善的部分
数据持久化
// 建议集成Core Data
class CoreDataManager: ObservableObject {
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "EmotionMuseum")
container.loadPersistentStores { _, error in
if let error = error {
fatalError("Core Data error: \(error)")
}
}
return container
}()
var context: NSManagedObjectContext {
persistentContainer.viewContext
}
func save() {
if context.hasChanges {
try? context.save()
}
}
}
AI服务集成
// 真实AI服务实现
class OpenAIService: AIServiceProtocol {
private let apiKey: String
private let session = URLSession.shared
func sendMessage(_ message: String) async throws -> AIResponse {
// 实现GPT-4 API调用
}
func analyzeEmotion(_ text: String) async throws -> EmotionAnalysis {
// 实现情绪分析
}
}
地图服务集成
// 高德地图集成
import AMapFoundationKit
import AMapLocationKit
class LocationService: ObservableObject {
private let locationManager = AMapLocationManager()
func getCurrentLocation() async throws -> CLLocationCoordinate2D {
// 实现位置获取
}
func searchNearbyPlaces(coordinate: CLLocationCoordinate2D) async throws -> [LocationPin] {
// 实现周边搜索
}
}
4.3 性能优化建议
-
图片加载优化
- 集成Kingfisher进行图片缓存
- 实现图片懒加载
-
数据分页
- 对话记录分页加载
- 社区帖子分页显示
-
内存管理
- 及时释放不需要的数据
- 使用weak引用避免循环引用
5. 实施优先级
Phase 1: 核心功能完善 (2-3周)
- 完善RecordView的所有子页面
- 实现AI对话系统
- 完善情绪日历功能
- 集成Core Data
Phase 2: 成长系统开发 (2-3周)
- 实现GrowthView完整功能
- 开发课题系统
- 实现五维雷达图
- 完善奖励系统
Phase 3: 地图和社区 (3-4周)
- 集成地图SDK
- 实现ExploreView功能
- 开发社区分享系统
- 实现位置服务
Phase 4: 个人中心和优化 (1-2周)
- 完善InsightView功能
- 实现成就系统
- 性能优化
- 用户体验改进
6. 详细数据库实现方案
6.1 Core Data实体定义
User实体
@objc(UserEntity)
public class UserEntity: NSManagedObject {
@NSManaged public var id: UUID
@NSManaged public var username: String
@NSManaged public var email: String
@NSManaged public var avatar: String?
@NSManaged public var nickname: String
@NSManaged public var birthDate: Date?
@NSManaged public var location: String?
@NSManaged public var bio: String?
@NSManaged public var memberLevel: String
@NSManaged public var totalDays: Int32
@NSManaged public var createdAt: Date
@NSManaged public var lastActiveAt: Date
// 成长数据
@NSManaged public var selfAwareness: Float
@NSManaged public var emotionalResilience: Float
@NSManaged public var actionPower: Float
@NSManaged public var empathy: Float
@NSManaged public var lifeEnthusiasm: Float
// 关系
@NSManaged public var conversations: NSSet?
@NSManaged public var emotionRecords: NSSet?
@NSManaged public var growthTopics: NSSet?
@NSManaged public var achievements: NSSet?
@NSManaged public var locationPins: NSSet?
@NSManaged public var communityPosts: NSSet?
}
Conversation实体
@objc(ConversationEntity)
public class ConversationEntity: NSManagedObject {
@NSManaged public var id: UUID
@NSManaged public var title: String
@NSManaged public var startTime: Date
@NSManaged public var endTime: Date?
@NSManaged public var summary: String?
@NSManaged public var tags: String // JSON字符串存储数组
// 情绪分析
@NSManaged public var primaryEmotion: String?
@NSManaged public var emotionIntensity: Float
@NSManaged public var emotionTrend: String?
@NSManaged public var keywords: String? // JSON字符串
@NSManaged public var aiInsights: String?
// 关系
@NSManaged public var user: UserEntity?
@NSManaged public var messages: NSSet?
}
6.2 数据迁移策略
版本控制
class CoreDataMigrationManager {
static func performMigration() {
// 检查数据模型版本
// 执行必要的数据迁移
// 更新数据结构
}
static func migrateFromV1ToV2() {
// 具体的迁移逻辑
}
}
6.3 数据同步方案
本地优先策略
class DataSyncManager: ObservableObject {
@Published var syncStatus: SyncStatus = .idle
func syncToCloud() async {
// 上传本地变更到云端
}
func syncFromCloud() async {
// 从云端下载更新
}
func resolveConflicts() {
// 处理数据冲突
}
}
enum SyncStatus {
case idle
case syncing
case success
case failed(Error)
}
7. API设计规范
7.1 RESTful API端点
用户相关
GET /api/v1/users/profile # 获取用户资料
PUT /api/v1/users/profile # 更新用户资料
POST /api/v1/users/avatar # 上传头像
对话相关
GET /api/v1/conversations # 获取对话列表
POST /api/v1/conversations # 创建新对话
GET /api/v1/conversations/{id} # 获取对话详情
POST /api/v1/conversations/{id}/messages # 发送消息
AI服务
POST /api/v1/ai/chat # AI对话
POST /api/v1/ai/emotion-analysis # 情绪分析
POST /api/v1/ai/recommendations # 获取推荐
成长课题
GET /api/v1/growth/topics # 获取课题列表
GET /api/v1/growth/topics/{id} # 获取课题详情
POST /api/v1/growth/interactions # 记录互动
PUT /api/v1/growth/progress # 更新进度
地图和社区
GET /api/v1/locations # 获取地点列表
POST /api/v1/locations # 创建地点
GET /api/v1/posts # 获取帖子列表
POST /api/v1/posts # 发布帖子
POST /api/v1/posts/{id}/like # 点赞帖子
POST /api/v1/posts/{id}/comments # 评论帖子
7.2 数据传输格式
标准响应格式
{
"success": true,
"data": {},
"message": "操作成功",
"timestamp": "2025-07-12T10:30:00Z",
"requestId": "uuid"
}
错误响应格式
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "输入数据验证失败",
"details": {}
},
"timestamp": "2025-07-12T10:30:00Z",
"requestId": "uuid"
}
8. 安全和隐私设计
8.1 数据加密
- 敏感数据本地加密存储
- 网络传输使用HTTPS
- API密钥安全管理
8.2 隐私保护
- 用户数据匿名化处理
- 位置信息脱敏
- 可选的数据分享设置
8.3 权限管理
enum PermissionType {
case location
case microphone
case camera
case notifications
}
class PermissionManager {
func requestPermission(_ type: PermissionType) async -> Bool {
// 请求系统权限
}
func checkPermissionStatus(_ type: PermissionType) -> PermissionStatus {
// 检查权限状态
}
}
9. 测试策略
9.1 单元测试
- 数据模型测试
- 业务逻辑测试
- 工具类测试
9.2 集成测试
- API集成测试
- 数据库操作测试
- 第三方服务集成测试
9.3 UI测试
- 页面导航测试
- 用户交互测试
- 响应式布局测试
9.4 性能测试
- 内存使用测试
- 网络请求性能测试
- 数据库查询性能测试
10. 部署和运维
10.1 CI/CD流程
# GitHub Actions示例
name: iOS Build and Test
on: [push, pull_request]
jobs:
test:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- name: Build and Test
run: |
xcodebuild test -scheme EmotionMuseum -destination 'platform=iOS Simulator,name=iPhone 14'
10.2 监控和分析
- 崩溃报告收集
- 用户行为分析
- 性能监控
- 错误日志收集
本文档将根据开发进度持续更新和完善