Browse Source

refactor : 优化框架逻辑

dev
徐振升 2 weeks ago
parent
commit
1dfc578217
  1. 4
      lib/app/bindings/initial_binding.dart
  2. 2
      lib/data/providers/http_provider.dart
  3. 82
      lib/data/providers/local_database.dart
  4. 29
      lib/data/repositories/auth_repository.dart
  5. 26
      lib/data/repositories/my_repository.dart
  6. 16
      lib/modules/auth/bindings/auth_binding.dart
  7. 10
      lib/modules/home/bindings/home_binding.dart
  8. 2
      lib/modules/my/bingdings/change_password_binding.dart
  9. 2
      lib/modules/my/bingdings/my_binding.dart
  10. 8
      lib/modules/my/controllers/my_controller.dart
  11. 2
      lib/modules/problem/bindings/problem_binding.dart
  12. 36
      lib/modules/problem/controllers/problem_controller.dart

4
lib/app/bindings/initial_binding.dart

@ -1,14 +1,14 @@
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:problem_check_system/data/providers/connectivity_provider.dart';
import 'package:problem_check_system/data/providers/dio_provider.dart';
import 'package:problem_check_system/data/providers/http_provider.dart';
import 'package:problem_check_system/data/providers/local_database.dart';
class InitialBinding implements Bindings {
@override
void dependencies() {
Get.put<GetStorage>(GetStorage(), permanent: true);
Get.put<DioProvider>(DioProvider(), permanent: true);
Get.put<HttpProvider>(HttpProvider(), permanent: true);
Get.put<LocalDatabase>(LocalDatabase(), permanent: true);
Get.put<ConnectivityProvider>(ConnectivityProvider(), permanent: true);
}

2
lib/data/providers/dio_provider.dart → lib/data/providers/http_provider.dart

@ -7,7 +7,7 @@ import 'package:problem_check_system/modules/auth/controllers/auth_controller.da
// DioProvider GetxService
// Dio
class DioProvider extends GetxService {
class HttpProvider extends GetxService {
static const String _baseUrl = 'https://xh.anxincloud.cn';
late final Dio _dio;

82
lib/data/providers/local_database.dart

@ -1,27 +1,35 @@
import 'package:get/get.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
import 'package:uuid/uuid.dart';
import '../models/problem_model.dart';
class LocalDatabase {
static final LocalDatabase _instance = LocalDatabase._internal();
factory LocalDatabase() => _instance;
static Database? _database;
/// LocalDatabase GetxService SQLite
/// GetxService
class LocalDatabase extends GetxService {
static const String _dbName = 'problems.db';
static const String _tableName = 'problems';
LocalDatabase._internal();
/// LocalDatabase 访
late Database _database;
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDatabase();
return _database!;
/// onInit GetxService
/// 使
@override
void onInit() {
super.onInit();
_initDatabase();
}
Future<Database> _initDatabase() async {
String path = join(await getDatabasesPath(), 'problems.db');
return await openDatabase(path, version: 1, onCreate: _onCreate);
///
Future<void> _initDatabase() async {
final databasePath = await getDatabasesPath();
final path = join(databasePath, _dbName);
_database = await openDatabase(path, version: 1, onCreate: _onCreate);
}
///
Future<void> _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE $_tableName(
@ -37,15 +45,17 @@ class LocalDatabase {
''');
}
/// UUID
///
Future<int> insertProblem(Problem problem) async {
final db = await database;
problem.id = const Uuid().v4();
return await db.insert(_tableName, problem.toMap());
return await _database.insert(_tableName, problem.toMap());
}
///
///
Future<int> updateProblem(Problem problem) async {
final db = await database;
return await db.update(
return await _database.update(
_tableName,
problem.toMap(),
where: 'id = ?',
@ -53,48 +63,41 @@ class LocalDatabase {
);
}
/// ID
///
Future<int> deleteProblem(String id) async {
final db = await database;
return await db.delete(_tableName, where: 'id = ?', whereArgs: [id]);
return await _database.delete(_tableName, where: 'id = ?', whereArgs: [id]);
}
///
///
///
///
///
///
/// - `startDate`/`endDate`
/// - `uploadStatus`'已上传', '未上传', '全部'
/// - `bindStatus`'已绑定', '未绑定', '全部'
Future<List<Problem>> getProblems({
DateTime? startDate,
DateTime? endDate,
String? uploadStatus, // '已上传', '未上传', '全部'
String? bindStatus, // '已绑定', '未绑定', '全部'
String uploadStatus = '全部',
String bindStatus = '全部',
}) async {
final db = await database;
// 使
final List<String> whereClauses = [];
final List<dynamic> whereArgs = [];
// startDate
if (startDate != null) {
whereClauses.add('createdAt >= ?');
whereArgs.add(startDate.millisecondsSinceEpoch);
}
// endDate
if (endDate != null) {
whereClauses.add('createdAt <= ?');
whereArgs.add(endDate.millisecondsSinceEpoch);
}
// uploadStatus
if (uploadStatus != null && uploadStatus != '全部') {
if (uploadStatus != '全部') {
whereClauses.add('isUploaded = ?');
whereArgs.add(uploadStatus == '已上传' ? 1 : 0);
}
// bindStatus
if (bindStatus != null && bindStatus != '全部') {
if (bindStatus != '全部') {
if (bindStatus == '已绑定') {
whereClauses.add('censorTaskId IS NOT NULL');
} else {
@ -102,10 +105,9 @@ class LocalDatabase {
}
}
// ' AND '
final String whereString = whereClauses.join(' AND ');
final List<Map<String, dynamic>> maps = await db.query(
final List<Map<String, dynamic>> maps = await _database.query(
_tableName,
where: whereString.isEmpty ? null : whereString,
whereArgs: whereArgs.isEmpty ? null : whereArgs,
@ -116,4 +118,12 @@ class LocalDatabase {
return Problem.fromMap(maps[i]);
});
}
/// onClose GetxService
/// GetxService
@override
void onClose() {
_database.close();
super.onClose();
}
}

29
lib/data/repositories/auth_repository.dart

@ -5,15 +5,15 @@ import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:problem_check_system/data/models/auth_model.dart';
import 'package:problem_check_system/data/providers/connectivity_provider.dart';
import 'package:problem_check_system/data/providers/dio_provider.dart';
import 'package:problem_check_system/data/providers/http_provider.dart';
class AuthRepository extends GetxService {
final DioProvider dioProvider;
final HttpProvider httpProvider;
final GetStorage storage;
final ConnectivityProvider connectivityProvider;
AuthRepository({
required this.dioProvider,
required this.httpProvider,
required this.storage,
required this.connectivityProvider,
});
@ -88,7 +88,7 @@ class AuthRepository extends GetxService {
/// Handles the user login process by calling the API and saving the response.
Future<LoginResponse> login(LoginRequest request) async {
try {
final response = await dioProvider.post(
final response = await httpProvider.post(
'/api/Accounts/SignIn',
data: request.toJson(),
);
@ -100,6 +100,23 @@ class AuthRepository extends GetxService {
}
}
/// API
Future<Profile> getUserProfile() async {
try {
final response = await httpProvider.get('/api/Accounts/Profile');
// JSON Profile
return Profile.fromJson(response.data);
} on DioException catch (e) {
//
// DioException
throw Exception('Network error: ${e.message}');
} catch (e) {
//
rethrow; //
}
}
/// Refreshes the authentication token using the refresh token.
Future<LoginResponse> refreshToken() async {
final refreshToken = getRefreshToken();
@ -108,7 +125,7 @@ class AuthRepository extends GetxService {
}
try {
final response = await dioProvider.post(
final response = await httpProvider.post(
'/auth/refresh',
data: {'refresh_token': refreshToken},
);
@ -127,7 +144,7 @@ class AuthRepository extends GetxService {
Future<void> logout() async {
try {
// Attempt to call the API, but even if it fails, continue to clear local data.
await dioProvider.post('/auth/logout');
await httpProvider.post('/auth/logout');
} on DioException catch (e) {
log('退出登录API调用失败: ${e.message}');
} finally {

26
lib/data/repositories/my_repository.dart

@ -1,26 +0,0 @@
import 'package:dio/dio.dart';
import 'package:problem_check_system/data/models/auth_model.dart';
import 'package:problem_check_system/data/providers/dio_provider.dart';
class MyRepository {
final DioProvider dioProvider;
MyRepository({required this.dioProvider});
/// API
Future<Profile> getUserProfile() async {
try {
final response = await dioProvider.get('/api/Accounts/Profile');
// JSON Profile
return Profile.fromJson(response.data);
} on DioException catch (e) {
//
// DioException
throw Exception('Network error: ${e.message}');
} catch (e) {
//
rethrow; //
}
}
}

16
lib/modules/auth/bindings/auth_binding.dart

@ -1,25 +1,18 @@
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:problem_check_system/data/providers/connectivity_provider.dart';
import 'package:problem_check_system/data/providers/dio_provider.dart';
import 'package:problem_check_system/data/providers/http_provider.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
import 'package:problem_check_system/modules/auth/controllers/auth_controller.dart';
class AuthBinding implements Bindings {
@override
void dependencies() {
// 1. (AuthProvider) Dio
// 使
final DioProvider dioProvider = Get.find<DioProvider>();
final GetStorage storage = Get.find<GetStorage>();
final ConnectivityProvider connectivityProvider =
Get.find<ConnectivityProvider>();
Get.lazyPut<AuthRepository>(
() => AuthRepository(
dioProvider: dioProvider,
storage: storage,
connectivityProvider: connectivityProvider,
httpProvider: Get.find<HttpProvider>(),
storage: Get.find<GetStorage>(),
connectivityProvider: Get.find<ConnectivityProvider>(),
),
);
@ -27,7 +20,6 @@ class AuthBinding implements Bindings {
// Get.find()
Get.lazyPut<AuthController>(
() => AuthController(authRepository: Get.find<AuthRepository>()),
fenix: true,
);
}
}

10
lib/modules/home/bindings/home_binding.dart

@ -2,7 +2,6 @@ import 'package:get/get.dart';
import 'package:problem_check_system/data/providers/connectivity_provider.dart';
import 'package:problem_check_system/data/providers/local_database.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
import 'package:problem_check_system/data/repositories/my_repository.dart';
import 'package:problem_check_system/modules/auth/controllers/auth_controller.dart';
import 'package:problem_check_system/modules/home/controllers/home_controller.dart';
import 'package:problem_check_system/modules/my/controllers/my_controller.dart';
@ -21,22 +20,21 @@ class HomeBinding implements Bindings {
localDatabase: database,
connectivityProvider: connectivityProvider,
dioProvider: Get.find(),
httpProvider: Get.find(),
),
fenix: true,
);
Get.lazyPut<MyRepository>(() => MyRepository(dioProvider: Get.find()));
Get.lazyPut<MyController>(() => MyController(myRepository: Get.find()));
Get.lazyPut<AuthRepository>(
() => AuthRepository(
dioProvider: Get.find(),
httpProvider: Get.find(),
storage: Get.find(),
connectivityProvider: connectivityProvider,
),
);
Get.lazyPut<AuthController>(
() => AuthController(authRepository: Get.find()),
fenix: true,
);
Get.lazyPut<MyController>(() => MyController(authRepository: Get.find()));
}
}

2
lib/modules/my/bingdings/change_password_binding.dart

@ -7,7 +7,7 @@ class ChangePasswordBinding implements Bindings {
void dependencies() {
Get.lazyPut<AuthRepository>(
() => AuthRepository(
dioProvider: Get.find(),
httpProvider: Get.find(),
storage: Get.find(),
connectivityProvider: Get.find(),
),

2
lib/modules/my/bingdings/my_binding.dart

@ -1,6 +1,4 @@
import 'package:get/get.dart';
import 'package:problem_check_system/data/repositories/my_repository.dart';
import 'package:problem_check_system/modules/my/controllers/my_controller.dart';
class MyBinding implements Bindings {
@override

8
lib/modules/my/controllers/my_controller.dart

@ -1,10 +1,10 @@
import 'package:get/get.dart';
import 'package:problem_check_system/data/repositories/my_repository.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
class MyController extends GetxController {
final MyRepository myRepository;
final AuthRepository authRepository;
MyController({required this.myRepository});
MyController({required this.authRepository});
//
var userName = '张兰雪'.obs;
@ -19,7 +19,7 @@ class MyController extends GetxController {
// API加载用户信息
Future<void> _loadUserInfo() async {
var userProfile = await myRepository.getUserProfile();
var userProfile = await authRepository.getUserProfile();
userName.value = userProfile.name;
userPhone.value = userProfile.email ?? '138****8547';
userImage.value = userProfile.signatureImage.toString();

2
lib/modules/problem/bindings/problem_binding.dart

@ -12,7 +12,7 @@ class ProblemBinding implements Bindings {
Get.lazyPut<ProblemController>(
() => ProblemController(
localDatabase: Get.find<LocalDatabase>(),
dioProvider: Get.find(),
httpProvider: Get.find(),
connectivityProvider: Get.find<ConnectivityProvider>(),
),
);

36
lib/modules/problem/controllers/problem_controller.dart

@ -5,7 +5,7 @@ import 'package:get/get.dart' hide MultipartFile, FormData;
import 'package:flutter/material.dart';
import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:problem_check_system/data/providers/dio_provider.dart';
import 'package:problem_check_system/data/providers/http_provider.dart';
import 'package:problem_check_system/modules/problem/views/widgets/custom_data_range_dropdown.dart';
import 'package:problem_check_system/data/models/problem_model.dart';
import 'package:problem_check_system/data/providers/local_database.dart';
@ -13,8 +13,10 @@ import 'package:problem_check_system/data/providers/connectivity_provider.dart';
class ProblemController extends GetxController
with GetSingleTickerProviderStateMixin {
///
final LocalDatabase _localDatabase;
///
final LocalDatabase localDatabase;
final HttpProvider httpProvider;
final ConnectivityProvider connectivityProvider;
///
final RxList<Problem> problems = <Problem>[].obs;
@ -35,8 +37,6 @@ class ProblemController extends GetxController
///
final RxBool isLoading = false.obs;
final DioProvider _dioProvider;
final ConnectivityProvider _connectivityProvider;
late TabController tabController;
@ -47,15 +47,13 @@ class ProblemController extends GetxController
final fabUploadPosition = Offset(337.0, 703.7).obs;
/// get
RxBool get isOnline => _connectivityProvider.isOnline;
RxBool get isOnline => connectivityProvider.isOnline;
ProblemController({
required LocalDatabase localDatabase,
required DioProvider dioProvider,
required ConnectivityProvider connectivityProvider,
}) : _localDatabase = localDatabase,
_dioProvider = dioProvider,
_connectivityProvider = connectivityProvider;
required this.localDatabase,
required this.httpProvider,
required this.connectivityProvider,
});
@override
void onInit() {
@ -190,7 +188,7 @@ class ProblemController extends GetxController
: '全部';
//
final loadedProblems = await _localDatabase.getProblems(
final loadedProblems = await localDatabase.getProblems(
startDate: startDate,
endDate: endDate,
uploadStatus: uploadStatus,
@ -235,7 +233,7 @@ class ProblemController extends GetxController
isLoading.value = true;
try {
// _localDatabase.getProblems '未上传'
unUploadedProblems.value = await _localDatabase.getProblems(
unUploadedProblems.value = await localDatabase.getProblems(
uploadStatus: '未上传',
);
} catch (e) {
@ -247,7 +245,7 @@ class ProblemController extends GetxController
Future<void> addProblem(Problem problem) async {
try {
await _localDatabase.insertProblem(problem);
await localDatabase.insertProblem(problem);
loadProblems();
} catch (e) {
Get.snackbar('错误', '保存问题失败: $e');
@ -257,7 +255,7 @@ class ProblemController extends GetxController
Future<void> updateProblem(Problem problem) async {
try {
await _localDatabase.updateProblem(problem);
await localDatabase.updateProblem(problem);
loadProblems();
} catch (e) {
Get.snackbar('错误', '更新问题失败: $e');
@ -268,7 +266,7 @@ class ProblemController extends GetxController
Future<void> deleteProblem(Problem problem) async {
try {
if (problem.id != null) {
await _localDatabase.deleteProblem(problem.id!);
await localDatabase.deleteProblem(problem.id!);
await _deleteProblemImages(problem);
loadProblems();
}
@ -287,7 +285,7 @@ class ProblemController extends GetxController
try {
for (var problem in problemsToDelete) {
if (problem.id != null) {
await _localDatabase.deleteProblem(problem.id!);
await localDatabase.deleteProblem(problem.id!);
await _deleteProblemImages(problem);
}
}
@ -335,7 +333,7 @@ class ProblemController extends GetxController
}
}
final response = await _dioProvider.post(
final response = await httpProvider.post(
'https://your-server.com/api/problems',
data: formData,
options: Options(

Loading…
Cancel
Save