新增文件 (10): - data/models/user.dart — 用户+角色模型 (匹配后端 UserResp/RoleResp) - data/models/auth_token.dart — 认证令牌模型 (匹配后端 LoginResp) - data/repositories/auth_repository.dart — 认证仓库 (JWT 安全持久化 + PIPL 合规) - features/auth/bloc/auth_bloc.dart — 认证 BLoC (8 种事件, 6 种状态) - features/auth/bloc/auth_event.dart — 认证事件 (sealed class 穷尽匹配) - features/auth/bloc/auth_state.dart — 认证状态 (Authenticated 含角色/班级码流程) - features/auth/views/login_page.dart — 登录/注册页面 (重写占位页面) - features/auth/views/role_selection_page.dart — 角色选择页 (4 种角色卡片) - features/auth/views/class_code_join_page.dart — 班级码加入页 (6 位输入) 修改文件 (5): - pubspec.yaml — 添加 flutter_secure_storage 依赖 - app.dart — 注入 AuthBloc + RepositoryProvider - main.dart — 简化入口 (认证恢复在 BLoC 中处理) - core/routing/app_router.dart — 添加认证路由守卫 + 2 新路由 - erp-diary/service/class_service.rs — 移除未使用的 PaginatorTrait import 验证: flutter analyze (0 error) + cargo check 通过
69 lines
1.5 KiB
Dart
69 lines
1.5 KiB
Dart
// 认证事件 — AuthBloc 接收的用户操作和系统事件
|
|
|
|
part of 'auth_bloc.dart';
|
|
|
|
/// 认证事件基类 — 使用 sealed class 实现穷尽匹配
|
|
sealed class AuthEvent {
|
|
const AuthEvent();
|
|
}
|
|
|
|
/// App 启动 — 检查本地存储的认证状态
|
|
final class AppStarted extends AuthEvent {
|
|
const AppStarted();
|
|
}
|
|
|
|
/// 用户请求登录
|
|
final class LoginRequested extends AuthEvent {
|
|
final String username;
|
|
final String password;
|
|
|
|
const LoginRequested({
|
|
required this.username,
|
|
required this.password,
|
|
});
|
|
}
|
|
|
|
/// 用户请求注册
|
|
final class RegisterRequested extends AuthEvent {
|
|
final String username;
|
|
final String password;
|
|
final String? displayName;
|
|
|
|
const RegisterRequested({
|
|
required this.username,
|
|
required this.password,
|
|
this.displayName,
|
|
});
|
|
}
|
|
|
|
/// 用户选择角色(注册后的角色选择步骤)
|
|
final class RoleSelected extends AuthEvent {
|
|
final UserRoleType role;
|
|
|
|
const RoleSelected(this.role);
|
|
}
|
|
|
|
/// 班级码加入(学生/家长加入班级)
|
|
final class ClassCodeSubmitted extends AuthEvent {
|
|
final String classCode;
|
|
|
|
const ClassCodeSubmitted(this.classCode);
|
|
}
|
|
|
|
/// 用户请求登出
|
|
final class LogoutRequested extends AuthEvent {
|
|
const LogoutRequested();
|
|
}
|
|
|
|
/// 令牌刷新成功(由拦截器触发)
|
|
final class TokenRefreshed extends AuthEvent {
|
|
final AuthToken token;
|
|
|
|
const TokenRefreshed(this.token);
|
|
}
|
|
|
|
/// 认证失败(由 401 拦截器触发)
|
|
final class AuthExpired extends AuthEvent {
|
|
const AuthExpired();
|
|
}
|