feat: AI 对话附件上下文解析 + 历史会话归档 + 多页面 UI 重构
- 后端: 新增 AttachmentContextBuilder 解析图片/PDF 摘要并拼入 LLM 上下文; ai_chat_endpoints 扩展附件接口; 新增 ReportAnalysisService - 前端: 新增历史会话页与 conversation_history_provider; chat 链路支持附件展示与回放 - UI: 重构 medication_checkin / notification_center / profile / health_drawer 等多页面 - 配置: api_client baseUrl 适配当前 WiFi IP
This commit is contained in:
@@ -6,7 +6,7 @@ import 'local_database.dart';
|
||||
/// API 基础地址。可通过 --dart-define=API_BASE_URL=http://host:5000 覆盖。
|
||||
const String baseUrl = String.fromEnvironment(
|
||||
'API_BASE_URL',
|
||||
defaultValue: 'http://10.4.232.251:5000',
|
||||
defaultValue: 'http://192.168.10.139:5000',
|
||||
);
|
||||
|
||||
class ApiException implements Exception {
|
||||
|
||||
@@ -13,6 +13,7 @@ import '../pages/consultation/consultation_pages.dart';
|
||||
import '../pages/settings/settings_pages.dart';
|
||||
import '../pages/settings/notification_prefs_page.dart';
|
||||
import '../pages/notifications/notification_center_page.dart';
|
||||
import '../pages/history/conversation_history_page.dart';
|
||||
import '../pages/profile/profile_page.dart';
|
||||
import '../pages/diet/diet_capture_page.dart';
|
||||
import '../pages/device/device_scan_page.dart';
|
||||
@@ -67,7 +68,7 @@ Widget buildPage(RouteInfo route, WidgetRef ref) {
|
||||
case 'exercisePlan':
|
||||
return const ExercisePlanPage();
|
||||
case 'exercisePlanDetail':
|
||||
return ExercisePlanDetailPage(id: params['id'] ?? '');
|
||||
return const ExercisePlanPage();
|
||||
case 'exerciseCreate':
|
||||
return const ExercisePlanCreatePage();
|
||||
case 'dietRecords':
|
||||
@@ -102,6 +103,8 @@ Widget buildPage(RouteInfo route, WidgetRef ref) {
|
||||
return const NotificationPrefsPage();
|
||||
case 'notifications':
|
||||
return const NotificationCenterPage();
|
||||
case 'conversationHistory':
|
||||
return const ConversationHistoryPage();
|
||||
case 'staticText':
|
||||
return StaticTextPage(type: params['type']!);
|
||||
case 'dietDetail':
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
/// 路由信息
|
||||
@@ -39,17 +40,25 @@ final currentRouteProvider = Provider<RouteInfo>((ref) {
|
||||
return stack.last;
|
||||
});
|
||||
|
||||
/// 路由切换前清理键盘焦点,避免返回页面时键盘自动弹起
|
||||
void _dismissKeyboard() {
|
||||
FocusManager.instance.primaryFocus?.unfocus();
|
||||
}
|
||||
|
||||
/// 跳转(替换整个栈)
|
||||
void goRoute(WidgetRef ref, String name, {Map<String, String> params = const {}}) {
|
||||
_dismissKeyboard();
|
||||
ref.read(routeStackProvider.notifier).replace(name, params: params);
|
||||
}
|
||||
|
||||
/// 推入新页面
|
||||
void pushRoute(WidgetRef ref, String name, {Map<String, String> params = const {}}) {
|
||||
_dismissKeyboard();
|
||||
ref.read(routeStackProvider.notifier).push(name, params: params);
|
||||
}
|
||||
|
||||
/// 返回上一页
|
||||
void popRoute(WidgetRef ref) {
|
||||
_dismissKeyboard();
|
||||
ref.read(routeStackProvider.notifier).pop();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user