Files
app/lib/presentation/providers/admin_provider.dart
T
2026-05-15 09:03:09 +08:00

221 lines
5.9 KiB
Dart

import 'package:flutter/foundation.dart';
import '../../data/models/admin_model.dart';
import '../../services/admin_service.dart';
import '../../core/utils/app_logger.dart';
enum AdminState { idle, loading, error }
/// 管理员数据 Provider
class AdminProvider extends ChangeNotifier {
AdminState _state = AdminState.idle;
List<AdminGroupModel> _groups = [];
List<AdminUserModel> _users = [];
PaginationModel? _groupsPagination;
PaginationModel? _usersPagination;
String? _errorMessage;
// 用户多选状态
final Set<int> _selectedUserIds = {};
bool _isSelectingUsers = false;
AdminState get state => _state;
List<AdminGroupModel> get groups => _groups;
List<AdminUserModel> get users => _users;
PaginationModel? get groupsPagination => _groupsPagination;
PaginationModel? get usersPagination => _usersPagination;
String? get errorMessage => _errorMessage;
bool get isLoading => _state == AdminState.loading;
Set<int> get selectedUserIds => _selectedUserIds;
bool get isSelectingUsers => _isSelectingUsers;
bool get hasSelectedUsers => _selectedUserIds.isNotEmpty;
final AdminService _service = AdminService.instance;
/// 加载用户组列表
Future<void> loadGroups({int page = 1}) async {
try {
final response = await _service.getGroups(page: page);
_groups = response.groups;
_groupsPagination = response.pagination;
notifyListeners();
} catch (e) {
AppLogger.d('加载用户组失败: $e');
_errorMessage = e.toString();
notifyListeners();
}
}
/// 加载用户列表
Future<void> loadUsers({int page = 1}) async {
try {
final response = await _service.getUsers(page: page);
_users = response.users;
_usersPagination = response.pagination;
notifyListeners();
} catch (e) {
AppLogger.d('加载用户列表失败: $e');
_errorMessage = e.toString();
notifyListeners();
}
}
/// 加载全部管理员数据
Future<void> loadAll() async {
_setState(AdminState.loading);
try {
await Future.wait([
loadGroups(),
loadUsers(),
]);
_setState(AdminState.idle);
} catch (e) {
_errorMessage = e.toString();
_setState(AdminState.error);
}
}
/// 创建用户组
Future<bool> createGroup(String name) async {
try {
final group = await _service.createGroup(name);
_groups.insert(0, group);
if (_groupsPagination != null) {
_groupsPagination = PaginationModel(
page: _groupsPagination!.page,
pageSize: _groupsPagination!.pageSize,
totalItems: _groupsPagination!.totalItems + 1,
);
}
notifyListeners();
return true;
} catch (e) {
AppLogger.d('创建用户组失败: $e');
_errorMessage = e.toString();
notifyListeners();
return false;
}
}
/// 删除用户组(会先检查组下是否有用户)
Future<String?> deleteGroup(int groupId) async {
try {
final detail = await _service.getGroupDetail(groupId);
if ((detail.totalUsers ?? 0) > 0) {
return '该组下有 ${detail.totalUsers} 个用户,请先删除或迁移用户';
}
await _service.deleteGroup(groupId);
_groups.removeWhere((g) => g.id == groupId);
if (_groupsPagination != null) {
_groupsPagination = PaginationModel(
page: _groupsPagination!.page,
pageSize: _groupsPagination!.pageSize,
totalItems: _groupsPagination!.totalItems - 1,
);
}
notifyListeners();
return null;
} catch (e) {
AppLogger.d('删除用户组失败: $e');
return e.toString();
}
}
/// 创建用户
Future<bool> createUser({
required String email,
required String nick,
required String password,
required int groupId,
}) async {
try {
final user = await _service.createUser(
email: email,
nick: nick,
password: password,
groupId: groupId,
);
_users.insert(0, user);
if (_usersPagination != null) {
_usersPagination = PaginationModel(
page: _usersPagination!.page,
pageSize: _usersPagination!.pageSize,
totalItems: _usersPagination!.totalItems + 1,
);
}
notifyListeners();
return true;
} catch (e) {
AppLogger.d('创建用户失败: $e');
_errorMessage = e.toString();
notifyListeners();
return false;
}
}
/// 批量删除用户
Future<bool> batchDeleteUsers(List<int> ids) async {
try {
await _service.batchDeleteUsers(ids);
_users.removeWhere((u) => ids.contains(u.id));
if (_usersPagination != null) {
_usersPagination = PaginationModel(
page: _usersPagination!.page,
pageSize: _usersPagination!.pageSize,
totalItems: _usersPagination!.totalItems - ids.length,
);
}
exitSelectMode();
notifyListeners();
return true;
} catch (e) {
AppLogger.d('批量删除用户失败: $e');
_errorMessage = e.toString();
notifyListeners();
return false;
}
}
// --- 多选模式 ---
void toggleSelectMode() {
_isSelectingUsers = !_isSelectingUsers;
if (!_isSelectingUsers) {
_selectedUserIds.clear();
}
notifyListeners();
}
void exitSelectMode() {
_isSelectingUsers = false;
_selectedUserIds.clear();
notifyListeners();
}
void toggleUserSelection(int userId) {
if (_selectedUserIds.contains(userId)) {
_selectedUserIds.remove(userId);
} else {
_selectedUserIds.add(userId);
}
notifyListeners();
}
void selectAllUsers() {
_selectedUserIds.clear();
_selectedUserIds.addAll(_users.map((u) => u.id));
notifyListeners();
}
void clearUserSelection() {
_selectedUserIds.clear();
notifyListeners();
}
bool isUserSelected(int userId) => _selectedUserIds.contains(userId);
void _setState(AdminState state) {
_state = state;
notifyListeners();
}
}