fix: 管理员系统 + 注册流程重构 + UI改版 + 全链路修复

- 新增管理员角色(手机号12345678910),管理员可增删医生、查看患者
- 注册页重构:去掉角色选择+审核码,改为选医生+填姓名
- 医生端点按DoctorId过滤患者,Patient↔Doctor关系建立
- Doctor/DoctorProfile/User实体新增关联字段
- JSON循环引用修复(IgnoreCycles)
- /api/doctors改为公开接口
- 登录闪屏修复+原生Android启动页
- 输入框全局白底+灰框
- 蓝牙重连同步修复
- Web端(doctor_web+health_app/web)全部删除
- 全局UI改版:白底企业风,新配色和组件系统
- 新品牌图标和启动图
This commit is contained in:
MingNian
2026-06-16 15:16:44 +08:00
parent b635e9d25f
commit c70d5d4be6
103 changed files with 12284 additions and 13049 deletions

View File

@@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
import 'core/app_colors.dart';
import 'core/app_router.dart';
import 'core/app_theme.dart';
import 'core/navigation_provider.dart';
@@ -23,17 +22,12 @@ class HealthApp extends ConsumerWidget {
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [
Locale('zh', 'CN'),
Locale('zh'),
],
supportedLocales: const [Locale('zh', 'CN'), Locale('zh')],
locale: const Locale('zh'),
home: const _RootNavigator(),
// 注入 ShadTheme让所有页面都能用 shadcn 组件
builder: (context, child) => ShadTheme(
data: AppTheme.shadTheme,
child: child!,
),
builder: (context, child) =>
ShadTheme(data: AppTheme.shadTheme, child: child!),
);
}
}
@@ -48,24 +42,17 @@ class _RootNavigator extends ConsumerWidget {
final current = stack.last;
final authState = ref.watch(authProvider);
// 启动时正在检查登录状态 → 显示闪屏
if (authState.isLoading && current.name == 'login') {
return Scaffold(
backgroundColor: Colors.white,
body: Center(
child: Column(mainAxisSize: MainAxisSize.min, children: [
Icon(Icons.favorite, size: 48, color: AppColors.primary),
const SizedBox(height: 16),
Text('健康管家', style: TextStyle(fontSize: 22, fontWeight: FontWeight.w700, color: AppColors.textPrimary)),
]),
),
);
}
// 登录后根据角色分流
// 登录后自动跳转(在下一帧完成,无闪烁)
if (authState.isLoggedIn && current.name == 'login') {
WidgetsBinding.instance.addPostFrameCallback((_) {
goRoute(ref, authState.user?.role == 'Doctor' ? 'doctorHome' : 'home');
final role = authState.user?.role ?? 'User';
if (role == 'Admin') {
goRoute(ref, 'adminHome');
} else if (role == 'Doctor') {
goRoute(ref, 'doctorHome');
} else {
goRoute(ref, 'home');
}
});
}