Files
AI-Health/health_app/lib/services/health_service.dart
MingNian 01cd132476 feat: 医生端完整实现 + 双角色登录 + 健康日历 + 饮食记录重做 + 配色系统重构
后端:
- User表加Role字段 + DoctorProfile表 + 废弃旧Doctor数据
- JWT加Role claim + 注册/登录拆分(/api/auth/register + /api/auth/login)
- 医生端点全量加JWT鉴权+Role校验(15个端点)
- 日历端点改造(用药/运动/随访按日期+星期匹配)
- 饮食记录PUT端点 + 健康记录DELETE端点
- 用户Profile端点返回Role

前端:
- 登录页重做(角色选择卡片 用户紫/医生蓝 + 审核码6666 + 注册返登录)
- App路由分流(userRole→患者端/医生端)
- 医生端: 工作台Dashboard + 患者管理(搜索分页) + 问诊/报告/随访CRUD
- 报告审核: AI预分析+指标表格+严重程度4级+模板多选+评语
- 随访编辑: 患者选择器+日期时间+打通患者端
- 健康日历: 可点击日历+当日安排列表+用药/运动/随访颜色标记
- 饮食记录: 热量趋势7/30天+日历(一周)+当日胶囊详情+侧滑编辑删除
- 健康档案: 日期选择器+手术可添加多条+白底渐变保存按钮
- 配色系统: 清理25个未使用色+新增doctorBlue/drawerGradient/pageGrey
- 患者端侧边栏: 新渐变+白底按钮+紫色汉堡图标
- AI对话: 用户气泡白底黑字+药管家改蓝色
- App启动闪屏: 防登录页闪烁

文档: color_design_system.md(20页面完整配色设计+图标底色对照表)
2026-06-14 23:28:14 +08:00

220 lines
6.7 KiB
Dart

import '../core/api_client.dart';
/// 健康数据服务
class HealthService {
final ApiClient _api;
HealthService(this._api);
/// 获取各指标最新值
Future<Map<String, dynamic>> getLatest() async {
final res = await _api.get('/api/health-records/latest');
return res.data['data'] ?? {};
}
/// 获取趋势数据
Future<List<Map<String, dynamic>>> getTrend(String type, {int period = 7}) async {
final res = await _api.get('/api/health-records/trend', queryParameters: {'type': type, 'period': period});
final list = res.data['data'] as List? ?? [];
return list.cast<Map<String, dynamic>>();
}
/// 获取记录列表
Future<List<Map<String, dynamic>>> getRecords({String? type, int? days}) async {
final params = <String, dynamic>{};
if (type != null) params['type'] = type;
if (days != null) params['days'] = days;
final res = await _api.get('/api/health-records', queryParameters: params);
final list = res.data['data'] as List? ?? [];
return list.cast<Map<String, dynamic>>();
}
/// 删除记录
Future<void> deleteRecord(String id) async {
await _api.delete('/api/health-records/$id');
}
}
/// 用户服务
class UserService {
final ApiClient _api;
UserService(this._api);
Future<Map<String, dynamic>?> getProfile() async {
final res = await _api.get('/api/user/profile');
return res.data['data'];
}
Future<void> updateProfile({String? name, String? gender, String? birthDate}) async {
await _api.put('/api/user/profile', data: {'name': name, 'gender': gender, 'birthDate': birthDate});
}
Future<Map<String, dynamic>?> getHealthArchive() async {
final res = await _api.get('/api/user/health-archive');
return res.data['data'];
}
Future<void> updateHealthArchive(Map<String, dynamic> data) async {
await _api.put('/api/user/health-archive', data: data);
}
Future<void> deleteAccount() async {
await _api.delete('/api/user/account');
}
}
/// 用药服务
class MedicationService {
final ApiClient _api;
MedicationService(this._api);
Future<List<Map<String, dynamic>>> getList() async {
final res = await _api.get('/api/medications');
final list = res.data['data'] as List? ?? [];
return list.cast<Map<String, dynamic>>();
}
Future<void> create(Map<String, dynamic> data) async {
await _api.post('/api/medications', data: data);
}
Future<void> update(String id, Map<String, dynamic> data) async {
await _api.put('/api/medications/$id', data: data);
}
Future<void> delete(String id) async {
await _api.delete('/api/medications/$id');
}
Future<List<Map<String, dynamic>>> getMedications(String filter) async {
final params = <String, dynamic>{};
if (filter.isNotEmpty) params['filter'] = filter;
final res = await _api.get('/api/medications', queryParameters: params.isNotEmpty ? params : null);
final list = res.data['data'] as List? ?? [];
return list.cast<Map<String, dynamic>>();
}
Future<void> deleteMedication(String id) async {
await _api.delete('/api/medications/$id');
}
Future<void> confirm(String id) async {
await _api.post('/api/medications/$id/confirm');
}
Future<List<Map<String, dynamic>>> getReminders() async {
final res = await _api.get('/api/medications/reminders');
final list = res.data['data'] as List? ?? [];
return list.cast<Map<String, dynamic>>();
}
}
/// 饮食服务
class DietService {
final ApiClient _api;
DietService(this._api);
Future<List<Map<String, dynamic>>> getRecords({String? date, String? mealType}) async {
final params = <String, dynamic>{};
if (date != null) params['date'] = date;
if (mealType != null) params['mealType'] = mealType;
final res = await _api.get('/api/diet-records', queryParameters: params);
final list = res.data['data'] as List? ?? [];
return list.cast<Map<String, dynamic>>();
}
Future<void> create(Map<String, dynamic> data) async {
await _api.post('/api/diet-records', data: data);
}
Future<void> deleteRecord(String id) async {
await _api.delete('/api/diet-records/$id');
}
Future<void> updateRecord(String id, Map<String, dynamic> data) async {
await _api.put('/api/diet-records/$id', data: data);
}
}
/// 问诊服务
class ConsultationService {
final ApiClient _api;
ConsultationService(this._api);
Future<List<Map<String, dynamic>>> getDoctors() async {
final res = await _api.get('/api/doctors');
final list = res.data['data'] as List? ?? [];
return list.cast<Map<String, dynamic>>();
}
Future<Map<String, dynamic>> getQuota() async {
final res = await _api.get('/api/user/consultation-quota');
return res.data['data'] ?? {};
}
Future<Map<String, dynamic>> createConsultation(String doctorId) async {
final res = await _api.post('/api/consultations', data: {'doctorId': doctorId});
return res.data['data'];
}
Future<List<Map<String, dynamic>>> getMessages(String consultationId, {String? after}) async {
final params = <String, dynamic>{};
if (after != null) params['after'] = after;
final res = await _api.get('/api/consultations/$consultationId/messages', queryParameters: params);
final list = res.data['data'] as List? ?? [];
return list.cast<Map<String, dynamic>>();
}
Future<void> sendMessage(String consultationId, String content) async {
await _api.post('/api/consultations/$consultationId/messages', data: {'content': content});
}
}
/// 随访服务
class FollowUpService {
final ApiClient _api;
FollowUpService(this._api);
Future<List<Map<String, dynamic>>> getList() async {
final res = await _api.get('/api/follow-ups');
final list = res.data['data'] as List? ?? [];
return list.cast<Map<String, dynamic>>();
}
}
/// 运动服务
class ExerciseService {
final ApiClient _api;
ExerciseService(this._api);
Future<Map<String, dynamic>?> getCurrentPlan() async {
final res = await _api.get('/api/exercise-plans/current');
return res.data['data'];
}
Future<void> createPlan(Map<String, dynamic> data) async {
await _api.post('/api/exercise-plans', data: data);
}
Future<void> createPlanSimple(Map<String, dynamic> data) async {
await _api.post('/api/exercise-plans', data: data);
}
Future<void> deletePlan(String id) async {
await _api.delete('/api/exercise-plans/$id');
}
Future<void> checkIn(String itemId) async {
await _api.post('/api/exercise-plans/items/$itemId/checkin');
}
Future<List<Map<String, dynamic>>> getPlans() async {
final res = await _api.get('/api/exercise-plans');
return (res.data['data'] as List?)?.cast<Map<String, dynamic>>() ?? [];
}
Future<Map<String, dynamic>?> getPlanDetail(String id) async {
final res = await _api.get('/api/exercise-plans/$id');
return res.data['data'];
}
}