feat: UI清爽紫蓝风全面改造 + 对话卡片重构 + 配色体系升级

- 新增 AppColors 统一配色方案(清爽紫蓝,参考蚂蚁阿福风格)
- 新增 common_widgets(GradientBorderButton / CardActionButton / IconBox)
- AgentWelcomeCard 美化:渐变 header + AI标签 + 核心功能区 + 快捷操作区
- DataConfirmCard 统一:三合一(健康/药品/运动),可编辑字段列表
- 删除死代码:medicationConfirm/dietAnalysis/reportAnalysis/quickOptions 卡片
- 删除死路由:doctors/profileEdit/editProfile
- AI 对话去除 Markdown 符号(_stripMd),统一行间距 1.5
- 逐字淡入动画修复:key 改用 stableId 避免重复触发
- 健康概览时间修复:前端发送 UTC 避免时区歧义
- PG 数据目录迁入项目 backend/pgdata/,加入 .gitignore
- 新增欧姆龙血压计实施方案文档
This commit is contained in:
MingNian
2026-06-09 17:04:11 +08:00
parent 5f8964e03f
commit f01fc9268d
14 changed files with 1228 additions and 866 deletions

View File

@@ -33,6 +33,7 @@ class _HomePageState extends ConsumerState<HomePage> {
final imagePath = _pickedImagePath;
if (text.isEmpty && imagePath == null) return;
_textCtrl.clear();
_focusNode.unfocus(); // 收起键盘
setState(() => _pickedImagePath = null);
if (imagePath != null) {
ref.read(chatProvider.notifier).sendImage(imagePath, text);
@@ -132,32 +133,22 @@ class _HomePageState extends ConsumerState<HomePage> {
separatorBuilder: (_, i) => const SizedBox(width: 6),
itemBuilder: (_, i) {
final (agent, label, icon) = _agentDefs[i];
final isActive = selected == agent;
return GestureDetector(
onTap: () {
final notifier = ref.read(selectedAgentProvider.notifier);
if (isActive) {
notifier.select(null);
} else {
notifier.select(agent);
ref.read(chatProvider.notifier).setAgent(agent);
if (_welcomedAgents.add(agent)) {
ref.read(chatProvider.notifier).insertAgentWelcome(agent);
}
}
// 用户标签 → 欢迎卡片,不发 AI 后端
ref.read(chatProvider.notifier).triggerAgent(agent, label);
},
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
decoration: BoxDecoration(
color: isActive ? AppTheme.primary : theme.colorScheme.card,
color: theme.colorScheme.card,
borderRadius: BorderRadius.circular(AppTheme.rPill),
boxShadow: isActive ? [AppTheme.shadowLight] : null,
border: Border.all(color: theme.colorScheme.border),
),
child: Row(mainAxisSize: MainAxisSize.min, children: [
Icon(icon, size: 17, color: isActive ? Colors.white : theme.colorScheme.mutedForeground),
Icon(icon, size: 17, color: theme.colorScheme.mutedForeground),
const SizedBox(width: 4),
Text(label, style: TextStyle(fontSize: 15, fontWeight: isActive ? FontWeight.w600 : FontWeight.w500, color: isActive ? Colors.white : theme.colorScheme.mutedForeground)),
Text(label, style: TextStyle(fontSize: 15, fontWeight: FontWeight.w500, color: theme.colorScheme.mutedForeground)),
]),
),
);