feat: 饮食记录逻辑重构 + 通知管理分隔线修复 + 多页面 UI 调整

- 饮食: 新增 DietCommentaryPolicy + diet_record_logic, 饮食记录逻辑抽取复用
- 通知管理: 分隔线改为仿通知中心样式, 跳过图标区域只留文字下方
- 侧边栏: 对话记录操作栏浮层修复 + 常用功能间距收紧
- 智能体: 欢迎卡片去 400ms 延迟 + 胶囊去阴影
- 后端: AI 会话仓库新增方法 + 饮食评论策略 + 健康记录规则调整
- 其他: api_client IP 适配 + 多页面 UI 微调 + 新增测试
This commit is contained in:
MingNian
2026-07-12 22:49:38 +08:00
parent d82e006cf4
commit 335a3e6440
33 changed files with 2056 additions and 1283 deletions

View File

@@ -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.221.78:5000',
defaultValue: 'http://10.4.251.10:5000',
);
class ApiException implements Exception {

View File

@@ -20,30 +20,30 @@ class AppColors {
static const Color meadowAccent = Color(0xFFBAE6FD);
static const Color sageAccent = Color(0xFFE9D5FF);
static const Color health = Color(0xFF3B82F6);
static const Color healthLight = Color(0xFFEFF6FF);
static const Color healthBorder = Color(0xFFBFDBFE);
static const Color medication = Color(0xFF8B5CF6);
static const Color medicationLight = Color(0xFFF5F3FF);
static const Color medicationBorder = Color(0xFFDDD6FE);
static const Color exercise = Color(0xFF10B981);
static const Color exerciseLight = Color(0xFFECFDF5);
static const Color exerciseBorder = Color(0xFFA7F3D0);
static const Color report = Color(0xFF2563EB);
static const Color reportLight = Color(0xFFEEF2FF);
static const Color reportBorder = Color(0xFFC7D2FE);
static const Color diet = Color(0xFFF97316);
static const Color dietLight = Color(0xFFFFF7ED);
static const Color dietBorder = Color(0xFFFED7AA);
static const Color device = Color(0xFF06B6D4);
static const Color deviceLight = Color(0xFFECFEFF);
static const Color deviceBorder = Color(0xFFA5F3FC);
static const Color health = Color(0xFF34D399);
static const Color healthLight = Color(0xFFF0FDF7);
static const Color healthBorder = Color(0xFFC8F7E1);
static const Color medication = Color(0xFF00B8D9);
static const Color medicationLight = Color(0xFFEAFBFF);
static const Color medicationBorder = Color(0xFFB8F0FA);
static const Color exercise = Color(0xFF8EC5FC);
static const Color exerciseLight = Color(0xFFF5F0FF);
static const Color exerciseBorder = Color(0xFFDCCBFE);
static const Color report = Color(0xFF6366F1);
static const Color reportLight = Color(0xFFEFFBFF);
static const Color reportBorder = Color(0xFFBAE6FD);
static const Color diet = Color(0xFFF7971E);
static const Color dietLight = Color(0xFFFFF8DB);
static const Color dietBorder = Color(0xFFFFE58A);
static const Color device = Color(0xFF2563EB);
static const Color deviceLight = Color(0xFFEFF6FF);
static const Color deviceBorder = Color(0xFFBFDBFE);
static const Color notification = Color(0xFF7C5CFF);
static const Color notificationLight = Color(0xFFF5F3FF);
static const Color notificationBorder = Color(0xFFDDD6FE);
static const Color doctor = Color(0xFF0F766E);
static const Color doctorLight = Color(0xFFF0FDFA);
static const Color doctorBorder = Color(0xFF99F6E4);
static const Color doctor = Color(0xFFFFAFBD);
static const Color doctorLight = Color(0xFFFFF3EF);
static const Color doctorBorder = Color(0xFFFFD7CB);
static const Color calendar = Color(0xFF6366F1);
static const Color calendarLight = Color(0xFFEEF2FF);
static const Color calendarBorder = Color(0xFFC7D2FE);
@@ -157,45 +157,45 @@ class AppColors {
);
static const LinearGradient doctorGradient = LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Color(0xFF60A5FA), Color(0xFF8B5CF6)],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [Color(0xFFFFC3A0), Color(0xFFFFAFBD)],
);
static const LinearGradient healthGradient = LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Color(0xFF60A5FA), Color(0xFF2563EB)],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [Color(0xFF6EE7B7), Color(0xFF67E8F9)],
);
static const LinearGradient medicationGradient = LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Color(0xFFA78BFA), Color(0xFF7C3AED)],
colors: [Color(0xFF4FACFE), Color(0xFF00F2FE)],
);
static const LinearGradient exerciseGradient = LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Color(0xFF34D399), Color(0xFF059669)],
colors: [Color(0xFFE0C3FC), Color(0xFF8EC5FC)],
);
static const LinearGradient reportGradient = LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Color(0xFF60A5FA), Color(0xFF2563EB)],
colors: [Color(0xFF38BDF8), Color(0xFF818CF8)],
);
static const LinearGradient dietGradient = LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Color(0xFFFB923C), Color(0xFFF97316)],
colors: [Color(0xFFF7971E), Color(0xFFFFD200)],
);
static const LinearGradient deviceGradient = LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Color(0xFF22D3EE), Color(0xFF0891B2)],
colors: [Color(0xFF60A5FA), Color(0xFF2563EB)],
);
static const LinearGradient notificationGradient = LinearGradient(

View File

@@ -32,7 +32,9 @@ class RouteStackNotifier extends Notifier<List<RouteInfo>> {
/// 路由栈 Provider
final routeStackProvider =
NotifierProvider<RouteStackNotifier, List<RouteInfo>>(RouteStackNotifier.new);
NotifierProvider<RouteStackNotifier, List<RouteInfo>>(
RouteStackNotifier.new,
);
/// 当前路由
final currentRouteProvider = Provider<RouteInfo>((ref) {
@@ -46,13 +48,21 @@ void _dismissKeyboard() {
}
/// 跳转(替换整个栈)
void goRoute(WidgetRef ref, String name, {Map<String, String> params = const {}}) {
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 {}}) {
void pushRoute(
WidgetRef ref,
String name, {
Map<String, String> params = const {},
}) {
_dismissKeyboard();
ref.read(routeStackProvider.notifier).push(name, params: params);
}