Browse Source

update : 问题使用新的数据库访问类

dev
徐振升 1 week ago
parent
commit
5d7fd1f8ca
  1. 11
      lib/app/core/bindings/initial_binding.dart
  2. 2
      lib/app/core/models/problem_sync_status.dart
  3. 254
      lib/app/core/services/sqlite_service.dart
  4. 7
      lib/app/features/navigation/presentation/controllers/navigation_controller.dart
  5. 39
      lib/app/features/problem/data/datasources/problem_local_datasource.dart
  6. 8
      lib/app/features/problem/data/model/problem_model.dart
  7. 16
      lib/app/features/problem/data/repositories/problem_repository.dart
  8. 2
      lib/app/features/problem/domain/repositoies/problem_repository.dart
  9. 17
      lib/app/features/problem/presentation/bindings/problem_binding.dart
  10. 2
      lib/app/features/problem/presentation/bindings/problem_form_binding.dart
  11. 3
      lib/app/features/problem/presentation/controllers/problem_controller.dart
  12. 2
      lib/app/features/problem/presentation/controllers/problem_form_controller.dart
  13. 2
      lib/app/features/problem/presentation/views/widgets/problem_card.dart
  14. 2
      lib/app/features/problem/presentation/views/widgets/problem_list_page.dart

11
lib/app/core/bindings/initial_binding.dart

@ -4,12 +4,10 @@ import 'package:problem_check_system/app/core/controllers/app_controller.dart';
import 'package:problem_check_system/app/core/services/database_service.dart';
import 'package:problem_check_system/app/core/services/network_status_service.dart';
import 'package:problem_check_system/app/core/services/http_provider.dart';
import 'package:problem_check_system/app/core/services/sqlite_service.dart';
import 'package:problem_check_system/app/core/repositories/auth_repository.dart';
import 'package:problem_check_system/app/core/repositories/file_repository.dart';
import 'package:problem_check_system/app/core/repositories/image_repository.dart';
import 'package:problem_check_system/app/core/repositories/image_repository_impl.dart';
import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository.dart';
import 'package:problem_check_system/app/core/services/upgrader_service.dart';
import 'package:uuid/uuid.dart';
@ -25,7 +23,6 @@ class InitialBinding implements Bindings {
Get.put<GetStorage>(GetStorage(), permanent: true);
Get.put<Uuid>(Uuid(), permanent: true);
Get.put<HttpProvider>(HttpProvider());
Get.put<SQLiteService>(SQLiteService());
Get.put<DatabaseService>(DatabaseService());
Get.put<NetworkStatusService>(NetworkStatusService());
Get.put(UpgraderService());
@ -45,14 +42,6 @@ class InitialBinding implements Bindings {
networkStatusService: Get.find<NetworkStatusService>(),
),
);
Get.lazyPut<ProblemRepository>(
() => ProblemRepository(
sqliteService: Get.find<SQLiteService>(),
httpProvider: Get.find<HttpProvider>(),
networkStatusService: Get.find<NetworkStatusService>(),
authRepository: Get.find(),
),
);
}
void _registerControllers() {

2
lib/app/core/models/problem_sync_status.dart

@ -1,6 +1,6 @@
import 'package:get/get.dart';
import 'package:problem_check_system/app/core/models/image_metadata_model.dart';
import 'package:problem_check_system/app/core/models/problem_model.dart';
import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart';
import 'package:problem_check_system/app/core/repositories/auth_repository.dart';
import 'package:uuid/uuid.dart';

254
lib/app/core/services/sqlite_service.dart

@ -1,254 +0,0 @@
// sqlite_provider.dart
import 'package:get/get.dart';
import 'package:problem_check_system/app/core/models/problem_sync_status.dart';
import 'package:problem_check_system/app/core/models/problem_model.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
/// `SQLiteService` GetxService SQLite
///
class SQLiteService extends GetxService {
static const String _dbName = 'problems.db';
static const String _tableName = 'problems';
static const int _dbVersion = 1;
late Database _database;
@override
void onInit() {
super.onInit();
_initDatabase();
}
///
Future<void> _initDatabase() async {
try {
final databasePath = await getDatabasesPath();
final path = join(databasePath, _dbName);
_database = await openDatabase(
path,
version: _dbVersion,
onCreate: _onCreate,
onUpgrade: _onUpgrade,
);
Get.log('数据库初始化成功');
} catch (e) {
Get.log('数据库初始化失败:$e', isError: true);
rethrow;
}
}
///
Future<void> _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE $_tableName(
id TEXT PRIMARY KEY,
description TEXT NOT NULL,
location TEXT NOT NULL,
imageUrls TEXT NOT NULL,
creationTime INTEGER NOT NULL,
creatorId TEXT NOT NULL,
lastModifiedTime INTEGER NOT NULL,
syncStatus INTEGER NOT NULL,
censorTaskId TEXT,
bindData TEXT,
isChecked INTEGER NOT NULL
)
''');
Get.log('数据库表创建成功');
}
///
Future<void> _onUpgrade(Database db, int oldVersion, int newVersion) async {
Get.log('正在将数据库从版本 $oldVersion 升级到 $newVersion...');
//
for (int version = oldVersion + 1; version <= newVersion; version++) {
await _runMigration(db, version);
}
Get.log('数据库升级完成');
}
///
Future<void> _runMigration(Database db, int version) async {
switch (version) {
case 2:
// 2
// await db.execute('ALTER TABLE $_tableName ADD COLUMN newColumn TEXT;');
break;
//
default:
Get.log('没有找到版本 $version 的迁移脚本');
}
}
///
Future<int> insertProblem(Problem problem) async {
try {
final result = await _database.insert(
_tableName,
problem.toMap(),
conflictAlgorithm: ConflictAlgorithm.replace,
);
Get.log('问题记录插入成功,ID: ${problem.id}');
return result;
} catch (e) {
Get.log('插入问题失败(ID: ${problem.id}):$e', isError: true);
throw Exception('');
}
}
///
Future<int> deleteProblem(String problemId) async {
try {
final result = await _database.delete(
_tableName,
where: 'id = ?',
whereArgs: [problemId],
);
if (result > 0) {
Get.log('问题删除成功,ID: $problemId');
} else {
Get.log('未找到要删除的问题,ID: $problemId');
}
return result;
} catch (e) {
Get.log('删除问题失败(ID: $problemId):$e', isError: true);
return 0;
}
}
///
Future<int> updateProblem(Problem problem) async {
try {
final result = await _database.update(
_tableName,
problem.toMap(),
where: 'id = ?',
whereArgs: [problem.id],
);
if (result > 0) {
Get.log('问题更新成功,ID: ${problem.id}');
}
return result;
} catch (e) {
Get.log('更新问题失败(ID: ${problem.id}):$e', isError: true);
return 0;
}
}
///
Future<int> markAsSynced(String id) async {
try {
final result = await _database.update(
_tableName,
{'syncStatus': ProblemSyncStatus.synced.index},
where: 'id = ?',
whereArgs: [id],
);
if (result > 0) {
Get.log('问题标记为已同步,ID: $id');
}
return result;
} catch (e) {
Get.log('标记同步状态失败(ID: $id):$e', isError: true);
return 0;
}
}
/// ID获取问题记录
Future<Problem?> getProblemById(String id) async {
try {
final results = await _database.query(
_tableName,
where: 'id = ?',
whereArgs: [id],
limit: 1,
);
return results.isNotEmpty ? Problem.fromMap(results.first) : null;
} catch (e) {
Get.log('获取问题失败(ID: $id):$e', isError: true);
return null;
}
}
///
Future<List<Problem>> getProblems({
DateTime? startDate,
DateTime? endDate,
String? syncStatus,
String? bindStatus,
}) async {
try {
final whereClauses = <String>[];
final whereArgs = <dynamic>[];
//
if (startDate != null) {
whereClauses.add('creationTime >= ?');
whereArgs.add(startDate.millisecondsSinceEpoch);
}
if (endDate != null) {
whereClauses.add('creationTime <= ?');
whereArgs.add(endDate.millisecondsSinceEpoch);
}
//
if (syncStatus != null && syncStatus != '全部') {
if (syncStatus == '未上传') {
whereClauses.add('syncStatus IN (?, ?, ?)');
whereArgs.addAll([
ProblemSyncStatus.pendingCreate.index,
ProblemSyncStatus.pendingUpdate.index,
ProblemSyncStatus.pendingDelete.index,
]);
} else {
whereClauses.add('syncStatus = ?');
whereArgs.add(ProblemSyncStatus.synced.index);
}
}
//
if (bindStatus != null && bindStatus != '全部') {
if (bindStatus == '已绑定') {
whereClauses.add('bindData IS NOT NULL AND bindData != ""');
} else {
whereClauses.add('(bindData IS NULL OR bindData = "")');
}
}
final results = await _database.query(
_tableName,
where: whereClauses.isNotEmpty ? whereClauses.join(' AND ') : null,
whereArgs: whereArgs.isEmpty ? null : whereArgs,
orderBy: 'creationTime DESC',
);
return results.map((json) => Problem.fromMap(json)).toList();
} catch (e) {
Get.log('获取问题列表失败:$e', isError: true);
return [];
}
}
@override
void onClose() {
_database.close();
Get.log('数据库连接已关闭');
super.onClose();
}
}

7
lib/app/features/navigation/presentation/controllers/navigation_controller.dart

@ -106,15 +106,16 @@ class NavigationController extends GetxController {
if (result == true) {
enterpriseListController.search();
}
break;
case 2: //
Get.log("当前在问题页面,准备跳转到问题上传页...");
Get.toNamed(AppRoutes.problemUpload);
break;
default:
//
Get.snackbar("提示", "当前页面没有可上传的内容", snackPosition: SnackPosition.BOTTOM);
final result = await Get.toNamed(AppRoutes.enterpriseUpload);
if (result == true) {
enterpriseListController.search();
}
break;
}
}

39
lib/app/features/problem/data/datasources/problem_local_datasource.dart

@ -1,4 +1,4 @@
import 'package:problem_check_system/app/core/models/problem_model.dart';
import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart';
import 'package:problem_check_system/app/core/models/problem_sync_status.dart';
import 'package:problem_check_system/app/core/services/database_service.dart';
import 'package:sqflite/sqflite.dart';
@ -14,8 +14,8 @@ abstract class ProblemLocalDataSource {
Future<List<Problem>> getProblems({
DateTime? startDate,
DateTime? endDate,
List<ProblemSyncStatus>? syncStatuses,
bool? hasBindData,
String? syncStatus,
String? bindStatus,
});
}
@ -69,30 +69,42 @@ class ProblemLocalDataSourceImpl implements ProblemLocalDataSource {
Future<List<Problem>> getProblems({
DateTime? startDate,
DateTime? endDate,
List<ProblemSyncStatus>? syncStatuses,
bool? hasBindData,
String? syncStatus,
String? bindStatus,
}) async {
final db = await _databaseService.database;
final whereClauses = <String>[];
final whereArgs = <dynamic>[];
//
if (startDate != null) {
whereClauses.add('creationTime >= ?');
whereArgs.add(startDate.millisecondsSinceEpoch);
}
if (endDate != null) {
whereClauses.add('creationTime <= ?');
whereArgs.add(endDate.millisecondsSinceEpoch);
}
if (syncStatuses != null && syncStatuses.isNotEmpty) {
final statuses = syncStatuses.map((s) => s.index).toList();
whereClauses.add(
'syncStatus IN (${List.filled(statuses.length, '?').join(',')})',
);
whereArgs.addAll(statuses);
//
if (syncStatus != null && syncStatus != '全部') {
if (syncStatus == '未上传') {
whereClauses.add('syncStatus IN (?, ?, ?)');
whereArgs.addAll([
ProblemSyncStatus.pendingCreate.index,
ProblemSyncStatus.pendingUpdate.index,
ProblemSyncStatus.pendingDelete.index,
]);
} else {
whereClauses.add('syncStatus = ?');
whereArgs.add(ProblemSyncStatus.synced.index);
}
if (hasBindData != null) {
if (hasBindData) {
}
//
if (bindStatus != null && bindStatus != '全部') {
if (bindStatus == '已绑定') {
whereClauses.add('bindData IS NOT NULL AND bindData != ""');
} else {
whereClauses.add('(bindData IS NULL OR bindData = "")');
@ -105,6 +117,7 @@ class ProblemLocalDataSourceImpl implements ProblemLocalDataSource {
whereArgs: whereArgs.isEmpty ? null : whereArgs,
orderBy: 'creationTime DESC',
);
return results.map((json) => Problem.fromMap(json)).toList();
}
}

8
lib/app/core/models/problem_model.dart → lib/app/features/problem/data/model/problem_model.dart

@ -9,6 +9,9 @@ class Problem {
///
final String id;
/// id
final String? companyId;
///
final String description;
@ -51,11 +54,13 @@ class Problem {
this.censorTaskId,
this.bindData,
this.isChecked = false,
this.companyId,
});
/// copyWith
Problem copyWith({
String? id,
String? companyId,
String? description,
String? location,
List<ImageMetadata>? imageUrls,
@ -70,6 +75,7 @@ class Problem {
}) {
return Problem(
id: id ?? this.id,
companyId: companyId ?? this.companyId,
description: description ?? this.description,
location: location ?? this.location,
imageUrls: imageUrls ?? this.imageUrls,
@ -87,6 +93,7 @@ class Problem {
Map<String, dynamic> toMap() {
return {
'id': id,
'companyId': companyId,
'description': description,
'location': location,
'imageUrls': json.encode(imageUrls.map((e) => e.toMap()).toList()),
@ -116,6 +123,7 @@ class Problem {
return Problem(
id: map['id'],
companyId: map['companyId'],
description: map['description'],
location: map['location'],
imageUrls: imageUrlsList,

16
lib/app/features/problem/data/repositories/problem_repository.dart

@ -2,17 +2,17 @@ import 'package:dio/dio.dart';
import 'package:get/get.dart' hide MultipartFile, FormData, Response;
import 'package:problem_check_system/app/core/extensions/http_response_extension.dart';
import 'package:problem_check_system/app/core/utils/constants/api_endpoints.dart';
import 'package:problem_check_system/app/core/models/problem_model.dart';
import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart';
import 'package:problem_check_system/app/core/models/server_problem.dart';
import 'package:problem_check_system/app/core/services/network_status_service.dart';
import 'package:problem_check_system/app/core/services/http_provider.dart';
import 'package:problem_check_system/app/core/services/sqlite_service.dart';
import 'package:problem_check_system/app/core/repositories/auth_repository.dart';
import 'package:problem_check_system/app/features/problem/data/datasources/problem_local_datasource.dart';
///
///
class ProblemRepository extends GetxService {
final SQLiteService sqliteService;
final ProblemLocalDataSource problemLocalDataSource;
final HttpProvider httpProvider;
final NetworkStatusService networkStatusService;
final AuthRepository authRepository;
@ -20,7 +20,7 @@ class ProblemRepository extends GetxService {
RxBool get isOnline => networkStatusService.isOnline;
ProblemRepository({
required this.sqliteService,
required this.problemLocalDataSource,
required this.httpProvider,
required this.networkStatusService,
required this.authRepository,
@ -28,7 +28,7 @@ class ProblemRepository extends GetxService {
///
Future<void> updateProblem(Problem problem) async {
await sqliteService.updateProblem(problem);
await problemLocalDataSource.updateProblem(problem);
}
///
@ -41,7 +41,7 @@ class ProblemRepository extends GetxService {
String? syncStatus,
String? bindStatus,
}) async {
return await sqliteService.getProblems(
return await problemLocalDataSource.getProblems(
startDate: startDate,
endDate: endDate,
syncStatus: syncStatus,
@ -50,11 +50,11 @@ class ProblemRepository extends GetxService {
}
Future<void> insertProblem(Problem problem) async {
await sqliteService.insertProblem(problem);
await problemLocalDataSource.insertProblem(problem);
}
Future<void> deleteProblem(String problemId) async {
await sqliteService.deleteProblem(problemId);
await problemLocalDataSource.deleteProblem(problemId);
}
// ProblemRepository中添加

2
lib/app/features/problem/domain/repositoies/problem_repository.dart

@ -1,4 +1,4 @@
import 'package:problem_check_system/app/core/models/problem_model.dart';
import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart';
/// Problem
///

17
lib/app/features/problem/presentation/bindings/problem_binding.dart

@ -1,11 +1,28 @@
import 'package:get/get.dart';
import 'package:problem_check_system/app/core/models/problem_sync_status.dart';
import 'package:problem_check_system/app/core/services/database_service.dart';
import 'package:problem_check_system/app/core/services/http_provider.dart';
import 'package:problem_check_system/app/core/services/network_status_service.dart';
import 'package:problem_check_system/app/features/problem/data/datasources/problem_local_datasource.dart';
import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository.dart';
import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_controller.dart';
class ProblemBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut<ProblemLocalDataSource>(
() => ProblemLocalDataSourceImpl(
databaseService: Get.find<DatabaseService>(),
),
);
Get.lazyPut<ProblemRepository>(
() => ProblemRepository(
problemLocalDataSource: Get.find<ProblemLocalDataSource>(),
httpProvider: Get.find<HttpProvider>(),
networkStatusService: Get.find<NetworkStatusService>(),
authRepository: Get.find(),
),
);
Get.put(ProblemStateManager(uuid: Get.find(), authRepository: Get.find()));
///

2
lib/app/features/problem/presentation/bindings/problem_form_binding.dart

@ -1,5 +1,5 @@
import 'package:get/get.dart';
import 'package:problem_check_system/app/core/models/problem_model.dart';
import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart';
import 'package:problem_check_system/app/core/models/problem_sync_status.dart';
import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_form_controller.dart';

3
lib/app/features/problem/presentation/controllers/problem_controller.dart

@ -15,7 +15,7 @@ import 'package:problem_check_system/app/core/models/server_problem.dart';
import 'package:problem_check_system/app/core/repositories/file_repository.dart';
import 'package:problem_check_system/app/core/repositories/image_repository.dart';
import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository.dart';
import 'package:problem_check_system/app/core/models/problem_model.dart';
import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart';
import 'package:problem_check_system/app/features/problem/presentation/controllers/sync_progress_state.dart';
import 'package:problem_check_system/app/features/problem/presentation/views/widgets/models/date_range_enum.dart';
import 'package:problem_check_system/app/features/problem/presentation/views/widgets/models/dropdown_option.dart';
@ -499,6 +499,7 @@ class ProblemController extends GetxController
//
Get.back(closeOverlays: true);
Get.log('错误: $e');
Get.snackbar('同步失败', '错误: $e', snackPosition: SnackPosition.TOP);
} finally {
isLoading.value = false;

2
lib/app/features/problem/presentation/controllers/problem_form_controller.dart

@ -9,7 +9,7 @@ import 'package:path_provider/path_provider.dart';
import 'package:problem_check_system/app/core/models/image_status.dart';
import 'package:problem_check_system/app/core/models/image_metadata_model.dart';
import 'dart:io';
import 'package:problem_check_system/app/core/models/problem_model.dart';
import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart';
import 'package:problem_check_system/app/core/models/problem_sync_status.dart';
import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository.dart';
import 'package:uuid/uuid.dart';

2
lib/app/features/problem/presentation/views/widgets/problem_card.dart

@ -4,7 +4,7 @@ import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:problem_check_system/app/core/routes/app_routes.dart';
import 'package:problem_check_system/app/core/models/problem_sync_status.dart';
import 'package:problem_check_system/app/core/models/problem_model.dart';
import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart';
import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_controller.dart';
import 'package:problem_check_system/app/features/problem/presentation/views/widgets/custom_button.dart';
import 'package:tdesign_flutter/tdesign_flutter.dart';

2
lib/app/features/problem/presentation/views/widgets/problem_list_page.dart

@ -4,7 +4,7 @@ import 'package:get/get.dart';
import 'package:easy_refresh/easy_refresh.dart';
import 'package:problem_check_system/app/core/models/problem_sync_status.dart';
import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_controller.dart';
import 'package:problem_check_system/app/core/models/problem_model.dart';
import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart';
import 'package:problem_check_system/app/features/problem/presentation/views/widgets/problem_card.dart';
class ProblemListPage extends GetView<ProblemController> {

Loading…
Cancel
Save