feat: 新增诊断报告全流程功能,适配登录后报告跳转逻辑

实现了入门测/出门测报告的完整链路:
1. 新增UserInfo模型的出门测报告标记字段与相关接口
2. 新增全局报告路由拦截器,自动在登录后/应用回前台时检查报告状态
3. 新增报告相关API、页面与路由配置,包含欢迎页、H5壳子、AI计算页
4. 适配登录成功后的报告跳转逻辑,更新用户状态管理方法
This commit is contained in:
崔宝新
2026-09-09 16:49:51 +08:00
parent c0c673e2d2
commit 5e4cfe9ac6
13 changed files with 1441 additions and 18 deletions
+44
View File
@@ -1,5 +1,6 @@
import 'package:flutter/foundation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:new_learn/core/api/auth/api.dart';
import 'package:new_learn/core/models/user_model.dart';
import 'package:new_learn/core/storage/user_storage.dart';
@@ -86,6 +87,49 @@ class CurrentUserNotifier extends AsyncNotifier<CurrentUserExtension?> {
// 也还是最新头像。
await UserStorage.instance.saveUserInfo(updated);
}
/// 强制从服务器拉最新用户信息(对齐 Vue App.vue 的 fetchCurrentUserExtension(true))
///
/// 使用场景:
/// 1. App 回前台(WidgetsBindingObserver resumed):拿最新 isShowReport / isShowAfterReport;
/// 2. 报告页调完 ChangeShowReport / ChangeShowAfterReport 后:刷新全局状态;
/// 3. 登录成功后:确保后端最新数据。
Future<CurrentUserExtension?> refresh() async {
try {
final ext = await UserApi.getCurrentUserExtension();
state = AsyncData(ext);
await UserStorage.instance.saveUserInfo(ext);
return ext;
} catch (_) {
// 网络失败:保持现有状态,不要清空(可能本来就是 AsyncData)
return state.value;
}
}
/// 只改本地报告标记为 false(studentInfo subjectReports 为空时降级处理)
///
/// 对应 Vue studentInfo.vue 的:
/// userInfo.isShowReport = false; uni.setStorageSync('userInfo', userInfo);
/// app.setUserInfo(Object.assign({}, app.globalData.userInfo, { isShowReport: false }));
///
/// 注意:不走后端接口!因为 subjectReports 为空意味着后端可能也没报告数据,
/// 直接本地置 false 避免拦截器下次又打回来。
Future<void> markShowReportFalse() async {
final current = state.value;
if (current == null) return;
final updated = current.copyWith(isShowReport: false);
state = AsyncData(updated);
await UserStorage.instance.saveUserInfo(updated);
}
/// 只改本地出门测试报告标记为 false(降级场景用)
Future<void> markShowAfterReportFalse() async {
final current = state.value;
if (current == null) return;
final updated = current.copyWith(isShowAfterReport: false);
state = AsyncData(updated);
await UserStorage.instance.saveUserInfo(updated);
}
}
/// 登录态变化信号(给 go_router 的 refreshListenable 用)