From 7172ed2cbd605ef14f28c8626b88c4be7dd0908a Mon Sep 17 00:00:00 2001 From: 15945162479 <15945162479@qq.com> Date: Sat, 13 Dec 2025 14:46:19 +0800 Subject: [PATCH] Add File --- src/family/pages/MoodHistory.tsx | 231 +++++++++++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 src/family/pages/MoodHistory.tsx diff --git a/src/family/pages/MoodHistory.tsx b/src/family/pages/MoodHistory.tsx new file mode 100644 index 0000000..54483ce --- /dev/null +++ b/src/family/pages/MoodHistory.tsx @@ -0,0 +1,231 @@ +import React, { useState, useEffect } from 'react'; +import { + Calendar, + TrendingUp, + ChevronDown, + RefreshCw, +} from 'lucide-react'; +import * as moodService from '../services/moodService'; + +/** + * 情绪记录历史页面 + * 展示老人的情绪记录和统计数据 + */ +export const MoodHistory: React.FC = () => { + const [records, setRecords] = useState([]); + const [stats, setStats] = useState(null); + const [loading, setLoading] = useState(true); + const [selectedDays, setSelectedDays] = useState(7); + const [showDaysDropdown, setShowDaysDropdown] = useState(false); + const familyId = 'family_001'; + + // 加载数据 + const loadData = async () => { + setLoading(true); + try { + const [recordsData, statsData] = await Promise.all([ + moodService.getFamilyMoods(familyId, { limit: 50 }), + moodService.getMoodStats(familyId, { days: selectedDays }), + ]); + setRecords(recordsData.records); + setStats(statsData); + } catch (error) { + console.error('加载情绪数据失败:', error); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + loadData(); + }, [selectedDays]); + + const daysOptions = [ + { value: 7, label: '最近7天' }, + { value: 14, label: '最近14天' }, + { value: 30, label: '最近30天' }, + ]; + + return ( +
+ {/* 页面标题和刷新 */} +
+

情绪记录

+
+ {/* 时间范围选择 */} +
+ + {showDaysDropdown && ( +
+ {daysOptions.map(option => ( + + ))} +
+ )} +
+ +
+
+ + {loading ? ( +
+ +
+ ) : ( + <> + {/* 统计卡片 */} + {stats && ( +
+ {/* 整体统计 */} +
+
+ + 平均情绪 +
+
+ + {stats.overall.avg_score} + + / 10 +
+

+ {moodService.formatMoodScore(stats.overall.avg_score)} +

+
+ + {/* 今日记录 */} +
+
+ + 今日记录 +
+
+ + {stats.today_count} + + +
+

+ 共 {stats.overall.total_records} 条记录 +

+
+
+ )} + + {/* 情绪类型分布 */} + {stats && stats.mood_type_stats.length > 0 && ( +
+

情绪分布

+
+ {stats.mood_type_stats.map(stat => ( +
+ + {moodService.moodEmojiMap[stat.mood_type]} + + + {moodService.moodLabelMap[stat.mood_type]} + +
+
+
+ + {stat.count}次 + +
+ ))} +
+
+ )} + + {/* 历史记录列表 */} +
+
+

历史记录

+
+ {records.length === 0 ? ( +
+

暂无情绪记录

+
+ ) : ( +
+ {records.map(record => ( +
+ + {moodService.moodEmojiMap[record.mood_type]} + +
+
+ + {moodService.moodLabelMap[record.mood_type]} + + + {record.mood_score}分 + +
+ {record.note && ( +

+ {record.note} +

+ )} + {record.trigger_event && ( +

+ 触发: {record.trigger_event} +

+ )} +
+
+

+ {record.recorded_at && moodService.formatRecordTime(record.recorded_at)} +

+

+ {record.source === 'manual' ? '手动' : record.source === 'ai_detect' ? 'AI' : '语音'} +

+
+
+ ))} +
+ )} +
+ + )} +
+ ); +};