From 06688c6a9392ca0fe027a1d37b3029e9c72e4441 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=8C=AF=E5=8D=87?= <359059686@qq.com> Date: Sat, 11 Oct 2025 17:31:11 +0800 Subject: [PATCH] =?UTF-8?q?refactor=20:=20=E4=BD=BF=E7=94=A8=E6=B8=85?= =?UTF-8?q?=E6=99=B0=E6=9E=B6=E6=9E=84=E5=A2=9E=E5=8A=A0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=9A=84=E5=8F=AF=E7=BB=B4=E6=8A=A4=E6=80=A7=E4=B8=8E=E7=81=B5?= =?UTF-8?q?=E6=B4=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/app/bindings/initial_binding.dart | 22 +- .../core}/data/models/auth_model.dart | 0 .../data/models/image_metadata_model.dart | 2 +- .../core}/data/models/image_status.dart | 0 .../core}/data/models/problem_model.dart | 4 +- .../data/models/problem_sync_status.dart | 6 +- .../core}/data/models/server_problem.dart | 0 .../data/models/server_problem.freezed.dart | 0 .../core}/data/models/server_problem.g.dart | 0 .../core}/data/models/user/organization.dart | 0 lib/{ => app/core}/data/models/user/page.dart | 0 lib/{ => app/core}/data/models/user/role.dart | 0 lib/{ => app/core}/data/models/user/user.dart | 0 .../data/repositories/auth_repository.dart | 10 +- .../data/repositories/file_repository.dart | 6 +- .../data/repositories/image_repository.dart | 0 .../repositories/image_repository_impl.dart | 4 +- .../data/repositories/problem_repository.dart | 28 +- .../core/data/services}/http_provider.dart | 4 +- .../services}/network_status_service.dart | 0 .../core/data/services/sqlite_service.dart} | 26 +- .../core/data/services}/upgrader_service.dart | 0 .../extensions/http_response_extension.dart | 0 .../core/utils/constants/api_endpoints.dart | 0 .../data}/model/enterprise_model.dart | 2 + .../bindings/enterprise_form_binding.dart | 21 ++ .../enterprise_form_controller.dart | 74 +++++ .../enterprise_list_controller.dart | 36 ++- .../views/enterprise_form_page.dart | 267 +++++++++++++++++ .../views/enterprise_list_page.dart | 121 ++++++++ .../widgets/enterprise_card.dart | 34 ++- lib/app/routes/app_pages.dart | 7 + lib/app/routes/app_routes.dart | 6 + lib/main.dart | 4 +- lib/modules/auth/bindings/login_binding.dart | 2 +- .../auth/controllers/login_controller.dart | 4 +- .../enterprise_list/enterprise_list_page.dart | 280 ------------------ lib/modules/home/bindings/home_binding.dart | 8 +- .../home/controllers/home_controller.dart | 2 +- lib/modules/home/views/home_page.dart | 9 +- .../my/bindings/change_password_binding.dart | 2 +- .../change_password_controller.dart | 2 +- lib/modules/my/controllers/my_controller.dart | 2 +- .../bindings/problem_form_binding.dart | 4 +- .../controllers/problem_controller.dart | 18 +- .../controllers/problem_form_controller.dart | 10 +- .../problem/views/problem_list_page.dart | 4 +- .../problem/views/widgets/problem_card.dart | 4 +- 48 files changed, 632 insertions(+), 403 deletions(-) rename lib/{ => app/core}/data/models/auth_model.dart (100%) rename lib/{ => app/core}/data/models/image_metadata_model.dart (93%) rename lib/{ => app/core}/data/models/image_status.dart (100%) rename lib/{ => app/core}/data/models/problem_model.dart (95%) rename lib/{ => app/core}/data/models/problem_sync_status.dart (92%) rename lib/{ => app/core}/data/models/server_problem.dart (100%) rename lib/{ => app/core}/data/models/server_problem.freezed.dart (100%) rename lib/{ => app/core}/data/models/server_problem.g.dart (100%) rename lib/{ => app/core}/data/models/user/organization.dart (100%) rename lib/{ => app/core}/data/models/user/page.dart (100%) rename lib/{ => app/core}/data/models/user/role.dart (100%) rename lib/{ => app/core}/data/models/user/user.dart (100%) rename lib/{ => app/core}/data/repositories/auth_repository.dart (88%) rename lib/{ => app/core}/data/repositories/file_repository.dart (90%) rename lib/{ => app/core}/data/repositories/image_repository.dart (100%) rename lib/{ => app/core}/data/repositories/image_repository_impl.dart (97%) rename lib/{ => app/core}/data/repositories/problem_repository.dart (79%) rename lib/{data/providers => app/core/data/services}/http_provider.dart (97%) rename lib/{data/providers => app/core/data/services}/network_status_service.dart (100%) rename lib/{data/providers/sqlite_provider.dart => app/core/data/services/sqlite_service.dart} (88%) rename lib/{data/providers => app/core/data/services}/upgrader_service.dart (100%) rename lib/{ => app}/core/extensions/http_response_extension.dart (100%) rename lib/{ => app}/core/utils/constants/api_endpoints.dart (100%) rename lib/{modules/enterprise_list => app/features/enterprise/data}/model/enterprise_model.dart (84%) create mode 100644 lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart create mode 100644 lib/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart rename lib/{modules/enterprise_list => app/features/enterprise/presentation/controllers}/enterprise_list_controller.dart (75%) create mode 100644 lib/app/features/enterprise/presentation/views/enterprise_form_page.dart create mode 100644 lib/app/features/enterprise/presentation/views/enterprise_list_page.dart rename lib/{modules/enterprise_list => app/features/enterprise/presentation}/widgets/enterprise_card.dart (91%) delete mode 100644 lib/modules/enterprise_list/enterprise_list_page.dart diff --git a/lib/app/bindings/initial_binding.dart b/lib/app/bindings/initial_binding.dart index 4b91d26..c063bc4 100644 --- a/lib/app/bindings/initial_binding.dart +++ b/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/network_status_service.dart'; -import 'package:problem_check_system/data/providers/http_provider.dart'; -import 'package:problem_check_system/data/providers/sqlite_provider.dart'; -import 'package:problem_check_system/data/repositories/auth_repository.dart'; -import 'package:problem_check_system/data/repositories/file_repository.dart'; -import 'package:problem_check_system/data/repositories/image_repository.dart'; -import 'package:problem_check_system/data/repositories/image_repository_impl.dart'; -import 'package:problem_check_system/data/repositories/problem_repository.dart'; -import 'package:problem_check_system/data/providers/upgrader_service.dart'; +import 'package:problem_check_system/app/core/data/services/network_status_service.dart'; +import 'package:problem_check_system/app/core/data/services/http_provider.dart'; +import 'package:problem_check_system/app/core/data/services/sqlite_service.dart'; +import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart'; +import 'package:problem_check_system/app/core/data/repositories/file_repository.dart'; +import 'package:problem_check_system/app/core/data/repositories/image_repository.dart'; +import 'package:problem_check_system/app/core/data/repositories/image_repository_impl.dart'; +import 'package:problem_check_system/app/core/data/repositories/problem_repository.dart'; +import 'package:problem_check_system/app/core/data/services/upgrader_service.dart'; import 'package:uuid/uuid.dart'; class InitialBinding implements Bindings { @@ -23,7 +23,7 @@ class InitialBinding implements Bindings { Get.put(GetStorage(), permanent: true); Get.put(Uuid(), permanent: true); Get.put(HttpProvider()); - Get.put(SQLiteProvider()); + Get.put(SQLiteService()); Get.put(NetworkStatusService()); Get.put(UpgraderService()); } @@ -44,7 +44,7 @@ class InitialBinding implements Bindings { ); Get.lazyPut( () => ProblemRepository( - sqliteProvider: Get.find(), + sqliteService: Get.find(), httpProvider: Get.find(), networkStatusService: Get.find(), authRepository: Get.find(), diff --git a/lib/data/models/auth_model.dart b/lib/app/core/data/models/auth_model.dart similarity index 100% rename from lib/data/models/auth_model.dart rename to lib/app/core/data/models/auth_model.dart diff --git a/lib/data/models/image_metadata_model.dart b/lib/app/core/data/models/image_metadata_model.dart similarity index 93% rename from lib/data/models/image_metadata_model.dart rename to lib/app/core/data/models/image_metadata_model.dart index 813be33..1f54151 100644 --- a/lib/data/models/image_metadata_model.dart +++ b/lib/app/core/data/models/image_metadata_model.dart @@ -1,5 +1,5 @@ // image_metadata_model.dart -import 'package:problem_check_system/data/models/image_status.dart'; +import 'package:problem_check_system/app/core/data/models/image_status.dart'; class ImageMetadata { final String localPath; diff --git a/lib/data/models/image_status.dart b/lib/app/core/data/models/image_status.dart similarity index 100% rename from lib/data/models/image_status.dart rename to lib/app/core/data/models/image_status.dart diff --git a/lib/data/models/problem_model.dart b/lib/app/core/data/models/problem_model.dart similarity index 95% rename from lib/data/models/problem_model.dart rename to lib/app/core/data/models/problem_model.dart index 7feee47..507cac4 100644 --- a/lib/data/models/problem_model.dart +++ b/lib/app/core/data/models/problem_model.dart @@ -1,7 +1,7 @@ import 'dart:convert'; -import 'package:problem_check_system/data/models/image_metadata_model.dart'; -import 'package:problem_check_system/data/models/problem_sync_status.dart'; +import 'package:problem_check_system/app/core/data/models/image_metadata_model.dart'; +import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart'; /// 问题的数据模型。 /// 用于表示系统中的一个具体问题,包含了问题的描述、位置、图片等信息。 diff --git a/lib/data/models/problem_sync_status.dart b/lib/app/core/data/models/problem_sync_status.dart similarity index 92% rename from lib/data/models/problem_sync_status.dart rename to lib/app/core/data/models/problem_sync_status.dart index 5c57560..a686fdc 100644 --- a/lib/data/models/problem_sync_status.dart +++ b/lib/app/core/data/models/problem_sync_status.dart @@ -1,7 +1,7 @@ import 'package:get/get.dart'; -import 'package:problem_check_system/data/models/image_metadata_model.dart'; -import 'package:problem_check_system/data/models/problem_model.dart'; -import 'package:problem_check_system/data/repositories/auth_repository.dart'; +import 'package:problem_check_system/app/core/data/models/image_metadata_model.dart'; +import 'package:problem_check_system/app/core/data/models/problem_model.dart'; +import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart'; import 'package:uuid/uuid.dart'; enum ProblemSyncStatus { diff --git a/lib/data/models/server_problem.dart b/lib/app/core/data/models/server_problem.dart similarity index 100% rename from lib/data/models/server_problem.dart rename to lib/app/core/data/models/server_problem.dart diff --git a/lib/data/models/server_problem.freezed.dart b/lib/app/core/data/models/server_problem.freezed.dart similarity index 100% rename from lib/data/models/server_problem.freezed.dart rename to lib/app/core/data/models/server_problem.freezed.dart diff --git a/lib/data/models/server_problem.g.dart b/lib/app/core/data/models/server_problem.g.dart similarity index 100% rename from lib/data/models/server_problem.g.dart rename to lib/app/core/data/models/server_problem.g.dart diff --git a/lib/data/models/user/organization.dart b/lib/app/core/data/models/user/organization.dart similarity index 100% rename from lib/data/models/user/organization.dart rename to lib/app/core/data/models/user/organization.dart diff --git a/lib/data/models/user/page.dart b/lib/app/core/data/models/user/page.dart similarity index 100% rename from lib/data/models/user/page.dart rename to lib/app/core/data/models/user/page.dart diff --git a/lib/data/models/user/role.dart b/lib/app/core/data/models/user/role.dart similarity index 100% rename from lib/data/models/user/role.dart rename to lib/app/core/data/models/user/role.dart diff --git a/lib/data/models/user/user.dart b/lib/app/core/data/models/user/user.dart similarity index 100% rename from lib/data/models/user/user.dart rename to lib/app/core/data/models/user/user.dart diff --git a/lib/data/repositories/auth_repository.dart b/lib/app/core/data/repositories/auth_repository.dart similarity index 88% rename from lib/data/repositories/auth_repository.dart rename to lib/app/core/data/repositories/auth_repository.dart index 58a478b..3efb4f3 100644 --- a/lib/data/repositories/auth_repository.dart +++ b/lib/app/core/data/repositories/auth_repository.dart @@ -1,10 +1,10 @@ import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; -import 'package:problem_check_system/core/utils/constants/api_endpoints.dart'; -import 'package:problem_check_system/data/models/auth_model.dart'; -import 'package:problem_check_system/data/models/user/user.dart'; -import 'package:problem_check_system/data/providers/network_status_service.dart'; -import 'package:problem_check_system/data/providers/http_provider.dart'; +import 'package:problem_check_system/app/core/utils/constants/api_endpoints.dart'; +import 'package:problem_check_system/app/core/data/models/auth_model.dart'; +import 'package:problem_check_system/app/core/data/models/user/user.dart'; +import 'package:problem_check_system/app/core/data/services/network_status_service.dart'; +import 'package:problem_check_system/app/core/data/services/http_provider.dart'; class AuthRepository extends GetxService { final HttpProvider httpProvider; diff --git a/lib/data/repositories/file_repository.dart b/lib/app/core/data/repositories/file_repository.dart similarity index 90% rename from lib/data/repositories/file_repository.dart rename to lib/app/core/data/repositories/file_repository.dart index a55f4af..65e0bfb 100644 --- a/lib/data/repositories/file_repository.dart +++ b/lib/app/core/data/repositories/file_repository.dart @@ -2,9 +2,9 @@ import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; // 引入 kDebugMode 和 debugPrint import 'package:get/get.dart' hide FormData, MultipartFile; import 'package:path/path.dart' as p; -import 'package:problem_check_system/core/extensions/http_response_extension.dart'; -import 'package:problem_check_system/core/utils/constants/api_endpoints.dart'; -import 'package:problem_check_system/data/providers/http_provider.dart'; +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/data/services/http_provider.dart'; class FileRepository extends GetxService { final HttpProvider _httpProvider = Get.find(); diff --git a/lib/data/repositories/image_repository.dart b/lib/app/core/data/repositories/image_repository.dart similarity index 100% rename from lib/data/repositories/image_repository.dart rename to lib/app/core/data/repositories/image_repository.dart diff --git a/lib/data/repositories/image_repository_impl.dart b/lib/app/core/data/repositories/image_repository_impl.dart similarity index 97% rename from lib/data/repositories/image_repository_impl.dart rename to lib/app/core/data/repositories/image_repository_impl.dart index 64e6896..f42576d 100644 --- a/lib/data/repositories/image_repository_impl.dart +++ b/lib/app/core/data/repositories/image_repository_impl.dart @@ -4,8 +4,8 @@ import 'package:dio/dio.dart'; import 'package:get/get.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as path; -import 'package:problem_check_system/data/providers/http_provider.dart'; -import 'package:problem_check_system/data/repositories/image_repository.dart'; +import 'package:problem_check_system/app/core/data/services/http_provider.dart'; +import 'package:problem_check_system/app/core/data/repositories/image_repository.dart'; class ImageRepositoryImpl extends GetxService implements ImageRepository { final HttpProvider httpProvider; diff --git a/lib/data/repositories/problem_repository.dart b/lib/app/core/data/repositories/problem_repository.dart similarity index 79% rename from lib/data/repositories/problem_repository.dart rename to lib/app/core/data/repositories/problem_repository.dart index 5a2aefc..427367c 100644 --- a/lib/data/repositories/problem_repository.dart +++ b/lib/app/core/data/repositories/problem_repository.dart @@ -1,18 +1,18 @@ import 'package:dio/dio.dart'; import 'package:get/get.dart' hide MultipartFile, FormData, Response; -import 'package:problem_check_system/core/extensions/http_response_extension.dart'; -import 'package:problem_check_system/core/utils/constants/api_endpoints.dart'; -import 'package:problem_check_system/data/models/problem_model.dart'; -import 'package:problem_check_system/data/models/server_problem.dart'; -import 'package:problem_check_system/data/providers/network_status_service.dart'; -import 'package:problem_check_system/data/providers/http_provider.dart'; -import 'package:problem_check_system/data/providers/sqlite_provider.dart'; -import 'package:problem_check_system/data/repositories/auth_repository.dart'; +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/data/models/problem_model.dart'; +import 'package:problem_check_system/app/core/data/models/server_problem.dart'; +import 'package:problem_check_system/app/core/data/services/network_status_service.dart'; +import 'package:problem_check_system/app/core/data/services/http_provider.dart'; +import 'package:problem_check_system/app/core/data/services/sqlite_service.dart'; +import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart'; /// 问题仓库,负责处理问题数据的本地持久化。 /// 它封装了底层数据库操作,为业务逻辑层提供一个简洁的接口。 class ProblemRepository extends GetxService { - final SQLiteProvider sqliteProvider; + final SQLiteService sqliteService; 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.sqliteProvider, + required this.sqliteService, required this.httpProvider, required this.networkStatusService, required this.authRepository, @@ -28,7 +28,7 @@ class ProblemRepository extends GetxService { /// 更新本地数据库中的一个问题。 Future updateProblem(Problem problem) async { - await sqliteProvider.updateProblem(problem); + await sqliteService.updateProblem(problem); } /// 通用查询方法,根据可选的筛选条件获取问题列表。 @@ -41,7 +41,7 @@ class ProblemRepository extends GetxService { String? syncStatus, String? bindStatus, }) async { - return await sqliteProvider.getProblems( + return await sqliteService.getProblems( startDate: startDate, endDate: endDate, syncStatus: syncStatus, @@ -50,11 +50,11 @@ class ProblemRepository extends GetxService { } Future insertProblem(Problem problem) async { - await sqliteProvider.insertProblem(problem); + await sqliteService.insertProblem(problem); } Future deleteProblem(String problemId) async { - await sqliteProvider.deleteProblem(problemId); + await sqliteService.deleteProblem(problemId); } // 在ProblemRepository中添加 diff --git a/lib/data/providers/http_provider.dart b/lib/app/core/data/services/http_provider.dart similarity index 97% rename from lib/data/providers/http_provider.dart rename to lib/app/core/data/services/http_provider.dart index f8d0771..584d15e 100644 --- a/lib/data/providers/http_provider.dart +++ b/lib/app/core/data/services/http_provider.dart @@ -4,8 +4,8 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart' hide Response; import 'package:pretty_dio_logger/pretty_dio_logger.dart'; import 'package:problem_check_system/app/routes/app_routes.dart'; -import 'package:problem_check_system/core/utils/constants/api_endpoints.dart'; -import 'package:problem_check_system/data/repositories/auth_repository.dart'; +import 'package:problem_check_system/app/core/utils/constants/api_endpoints.dart'; +import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart'; // DioProvider 是一个 GetxService,确保它在应用生命周期内是单例的。 // 它负责初始化和配置 Dio 实例,并添加所有拦截器。 diff --git a/lib/data/providers/network_status_service.dart b/lib/app/core/data/services/network_status_service.dart similarity index 100% rename from lib/data/providers/network_status_service.dart rename to lib/app/core/data/services/network_status_service.dart diff --git a/lib/data/providers/sqlite_provider.dart b/lib/app/core/data/services/sqlite_service.dart similarity index 88% rename from lib/data/providers/sqlite_provider.dart rename to lib/app/core/data/services/sqlite_service.dart index 7f3d7b0..157dc1e 100644 --- a/lib/data/providers/sqlite_provider.dart +++ b/lib/app/core/data/services/sqlite_service.dart @@ -1,14 +1,14 @@ // sqlite_provider.dart import 'package:get/get.dart'; -import 'package:problem_check_system/data/models/problem_sync_status.dart'; -import 'package:problem_check_system/data/models/problem_model.dart'; +import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart'; +import 'package:problem_check_system/app/core/data/models/problem_model.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; -/// `SQLiteProvider` 是一个 GetxService,负责管理本地 SQLite 数据库。 +/// `SQLiteService` 是一个 GetxService,负责管理本地 SQLite 数据库。 /// 作为一个单例服务,它在整个应用生命周期中只会被创建一次。 -class SQLiteProvider extends GetxService { +class SQLiteService extends GetxService { static const String _dbName = 'problems.db'; static const String _tableName = 'problems'; static const int _dbVersion = 1; @@ -147,24 +147,6 @@ class SQLiteProvider extends GetxService { } } - // /// 获取需要同步的问题记录(所有同步状态为未同步的记录) - // Future> getProblemsForSync() async { - // try { - // final results = await _database.query( - // _tableName, - // where: 'syncStatus = ?', - // whereArgs: [SyncStatus.notSynced.index], - // orderBy: 'creationTime ASC', - // ); - - // Get.log('找到 ${results.length} 条需要同步的记录'); - // return results.map((json) => Problem.fromMap(json)).toList(); - // } catch (e) { - // Get.log('获取待同步问题失败:$e', isError: true); - // return []; - // } - // } - /// 标记问题为已同步(在同步成功后调用) Future markAsSynced(String id) async { try { diff --git a/lib/data/providers/upgrader_service.dart b/lib/app/core/data/services/upgrader_service.dart similarity index 100% rename from lib/data/providers/upgrader_service.dart rename to lib/app/core/data/services/upgrader_service.dart diff --git a/lib/core/extensions/http_response_extension.dart b/lib/app/core/extensions/http_response_extension.dart similarity index 100% rename from lib/core/extensions/http_response_extension.dart rename to lib/app/core/extensions/http_response_extension.dart diff --git a/lib/core/utils/constants/api_endpoints.dart b/lib/app/core/utils/constants/api_endpoints.dart similarity index 100% rename from lib/core/utils/constants/api_endpoints.dart rename to lib/app/core/utils/constants/api_endpoints.dart diff --git a/lib/modules/enterprise_list/model/enterprise_model.dart b/lib/app/features/enterprise/data/model/enterprise_model.dart similarity index 84% rename from lib/modules/enterprise_list/model/enterprise_model.dart rename to lib/app/features/enterprise/data/model/enterprise_model.dart index 7802e33..fd5bf66 100644 --- a/lib/modules/enterprise_list/model/enterprise_model.dart +++ b/lib/app/features/enterprise/data/model/enterprise_model.dart @@ -1,6 +1,7 @@ // lib/app/modules/enterprise_list/models/enterprise_model.dart class Enterprise { + final int? id; // 可选的 ID 字段,用于区分新增和修改 final String companyName; final String companyType; final int totalIssues; @@ -9,6 +10,7 @@ class Enterprise { final int notUploaded; Enterprise({ + this.id, required this.companyName, required this.companyType, required this.totalIssues, diff --git a/lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart b/lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart new file mode 100644 index 0000000..1d5868a --- /dev/null +++ b/lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart @@ -0,0 +1,21 @@ +// lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart + +import 'package:get/get.dart'; +import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_model.dart'; +import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart'; // 确保导入您的模型 + +class EnterpriseFormBinding extends Bindings { + @override + void dependencies() { + // 1. 尝试从路由参数中获取 Enterprise 对象。 + // - 如果是修改模式,Get.arguments 会是您传入的 Enterprise 对象。 + // - 如果是新增模式,Get.arguments 会是 null。 + // - 使用 as Enterprise? 进行安全的类型转换。 + final Enterprise? enterpriseToEdit = Get.arguments as Enterprise?; + + // 2. 将获取到的参数(可能为 null)传递给 Controller 的构造函数。 + Get.lazyPut( + () => EnterpriseFormController(initialData: enterpriseToEdit), + ); + } +} diff --git a/lib/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart b/lib/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart new file mode 100644 index 0000000..2a80ffa --- /dev/null +++ b/lib/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_model.dart'; + +class EnterpriseFormController extends GetxController { + // 通过构造函数接收可能存在的初始数据 + final Enterprise? initialData; + EnterpriseFormController({this.initialData}); + + // --- 状态管理 --- + var isEditMode = false.obs; + var pageTitle = '新增企业'.obs; + + // --- 表单控制器 --- + final enterpriseNameController = TextEditingController(); + final enterpriseAddressController = TextEditingController(); + final contactPersonController = TextEditingController(); + final contactPhoneController = TextEditingController(); + final hazardSourceController = TextEditingController(); + + // 用于存储下拉选择框的值 + final Rx selectedEnterpriseType = Rx(null); + final Rx selectedEnterpriseScale = Rx(null); + + @override + void onInit() { + super.onInit(); + // 判断是新增还是修改模式 + if (initialData != null) { + isEditMode.value = true; + pageTitle.value = '修改信息'; + // 用初始数据填充表单 + enterpriseNameController.text = initialData!.companyName; + // ... 初始化其他控制器 + } else { + isEditMode.value = false; + pageTitle.value = '新增企业'; + // 新增模式,表单为空 (或有默认值) + } + } + + // 提交表单的逻辑 + void submitForm() { + if (isEditMode.value) { + _updateEnterprise(); + } else { + _createEnterprise(); + } + } + + void _createEnterprise() { + print('执行新增逻辑...'); + // 调用新增 API + // Get.find().createEnterprise(...); + Get.back(result: true); // 返回并通知列表刷新 + } + + void _updateEnterprise() { + print('执行修改逻辑, ID: ${initialData!.id}'); + // 调用修改 API + // Get.find().updateEnterprise(initialData!.id, ...); + Get.back(result: true); // 返回并通知列表刷新 + } + + @override + void onClose() { + enterpriseNameController.dispose(); + enterpriseAddressController.dispose(); + contactPersonController.dispose(); + contactPhoneController.dispose(); + hazardSourceController.dispose(); + super.onClose(); + } +} diff --git a/lib/modules/enterprise_list/enterprise_list_controller.dart b/lib/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart similarity index 75% rename from lib/modules/enterprise_list/enterprise_list_controller.dart rename to lib/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart index a3c3d8e..6fa2d98 100644 --- a/lib/modules/enterprise_list/enterprise_list_controller.dart +++ b/lib/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart @@ -1,7 +1,8 @@ // lib/app/modules/enterprise_list/enterprise_list_controller.dart import 'package:get/get.dart'; -import 'package:problem_check_system/modules/enterprise_list/model/enterprise_model.dart'; +import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_model.dart'; +import 'package:problem_check_system/app/routes/app_routes.dart'; class EnterpriseListController extends GetxController { // 使用 .obs 使列表变为响应式,当数据变化时,UI会自动更新 @@ -13,6 +14,10 @@ class EnterpriseListController extends GetxController { fetchEnterprises(); // 页面初始化时加载数据 } + void refreshList() { + fetchEnterprises(); // 重新获取数据 + } + // 模拟从API获取数据的过程 void fetchEnterprises() { // 模拟网络延迟 @@ -101,13 +106,30 @@ class EnterpriseListController extends GetxController { // 处理搜索逻辑 } - void onAddNew() { - // 处理添加新条目的逻辑 - Get.snackbar('提示', '添加功能待实现'); + /// 导航到编辑表单页面 + Future navigateToEditForm(Enterprise enterprise) async { + final result = await Get.toNamed( + AppRoutes.enterpriseForm, + arguments: enterprise, // 将要编辑的数据作为参数传递 + ); + if (result == true) { + refreshList(); // 调用控制器的方法刷新 + } + } + + /// 导航到新增表单页面 + Future navigateToAddForm() async { + final result = await Get.toNamed(AppRoutes.enterpriseForm); + if (result == true) { + refreshList(); // 调用控制器的方法刷新 + } } - void onUpload() { - // 处理上传逻辑 - Get.snackbar('提示', '上传功能待实现'); + /// 导航到上传页面 + Future navigateToUploadPage() async { + final result = await Get.toNamed(AppRoutes.test); + if (result == true) { + refreshList(); // 调用控制器的方法刷新 + } } } diff --git a/lib/app/features/enterprise/presentation/views/enterprise_form_page.dart b/lib/app/features/enterprise/presentation/views/enterprise_form_page.dart new file mode 100644 index 0000000..7805d92 --- /dev/null +++ b/lib/app/features/enterprise/presentation/views/enterprise_form_page.dart @@ -0,0 +1,267 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart'; + +// ------------------- 页面视图 (View) ------------------- +// 使用 GetView 可以方便地访问控制器 +class EnterpriseFormPage extends GetView { + const EnterpriseFormPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color(0xFFF5F5F5), + appBar: _buildAppBar(), + body: SafeArea( + child: Column( + children: [ + Expanded( + child: SingleChildScrollView( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h), + child: Column( + children: [ + _buildInfoSection( + title: '必填信息', + children: [ + _buildTextField( + label: '企业名称', + hint: '达拉特旗', + controller: controller.enterpriseNameController, + isRequired: true, + ), + _buildDropdownField( + label: '企业类型', + hint: '请选择企业类型', + isRequired: true, + ), + ], + ), + SizedBox(height: 12.h), + _buildInfoSection( + title: '选填信息', + children: [ + _buildTextField( + label: '企业地址', + hint: '请输入企业地址', + controller: controller.enterpriseAddressController, + ), + _buildDropdownField(label: '企业规模', hint: '请选择企业规模'), + _buildTextField( + label: '联系人', + hint: '请输入联系人姓名', + controller: controller.contactPersonController, + ), + _buildTextField( + label: '联系电话', + hint: '请输入联系电话', + controller: controller.contactPhoneController, + ), + _buildTextField( + label: '有无重大危险源;重大危险源情况', + hint: '请输入有无重大危险源;重大危险源情况', + controller: controller.hazardSourceController, + hasDivider: false, + ), + ], + ), + ], + ), + ), + ), + _buildBottomButtons(), + ], + ), + ), + ); + } + + // 将 controller 传进来以获取动态标题 + PreferredSizeWidget _buildAppBar() { + return PreferredSize( + preferredSize: Size.fromHeight(56.h), + child: Container( + decoration: const BoxDecoration( + // ... 渐变色 + ), + child: AppBar( + // ... 其他 AppBar 属性 + // 使用 Obx 来监听 pageTitle 的变化 + title: Obx( + () => Text( + controller.pageTitle.value, + style: TextStyle( + fontSize: 18.sp, + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + centerTitle: true, + ), + ), + ); + } + + // 构建信息区块 (例如 "必填信息") + Widget _buildInfoSection({ + required String title, + required List children, + }) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.r), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container(width: 4.w, height: 16.h, color: Colors.blue), + SizedBox(width: 8.w), + Text( + title, + style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.bold), + ), + ], + ), + SizedBox(height: 10.h), + ...children, + ], + ), + ); + } + + // 构建带标签的文本输入框 + Widget _buildTextField({ + required String label, + required String hint, + required TextEditingController controller, + bool isRequired = false, + bool hasDivider = true, + }) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 10.h), + child: _buildLabel(label, isRequired), + ), + TextFormField( + controller: controller, + decoration: InputDecoration( + hintText: hint, + hintStyle: TextStyle(color: Colors.grey[400], fontSize: 14.sp), + border: InputBorder.none, + isDense: true, + contentPadding: EdgeInsets.zero, + ), + style: TextStyle(fontSize: 14.sp, color: Colors.black87), + ), + if (hasDivider) const Divider(height: 1, color: Color(0xFFF0F0F0)), + ], + ); + } + + // 构建下拉选择框样式 + Widget _buildDropdownField({ + required String label, + required String hint, + bool isRequired = false, + }) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 10.h), + child: _buildLabel(label, isRequired), + ), + GestureDetector( + onTap: () { + // 在此处理下拉框点击事件,例如弹出一个选择列表 + Get.snackbar('提示', '这是一个下拉选择框'); + }, + child: Container( + color: Colors.transparent, // 使整个区域可点击 + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + hint, + style: TextStyle(color: Colors.grey[400], fontSize: 14.sp), + ), + const Icon(Icons.arrow_drop_down, color: Colors.grey), + ], + ), + ), + ), + const Divider(height: 1, color: Color(0xFFF0F0F0)), + ], + ); + } + + // 构建字段标签 (带红色星号) + Widget _buildLabel(String label, bool isRequired) { + return RichText( + text: TextSpan( + style: TextStyle(fontSize: 14.sp, color: Colors.black87), + children: [ + if (isRequired) + const TextSpan( + text: '* ', + style: TextStyle(color: Colors.red), + ), + TextSpan(text: label), + ], + ), + ); + } + + // 构建底部的取消和确定按钮 + Widget _buildBottomButtons() { + return Container( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h), + color: Colors.white, + child: Row( + children: [ + Expanded( + child: OutlinedButton( + onPressed: () => Get.back(), + style: OutlinedButton.styleFrom( + padding: EdgeInsets.symmetric(vertical: 12.h), + side: BorderSide(color: Colors.grey[300]!), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.r), + ), + ), + child: Text( + '取消', + style: TextStyle(fontSize: 16.sp, color: Colors.black54), + ), + ), + ), + SizedBox(width: 16.w), + Expanded( + child: ElevatedButton( + onPressed: controller.submitForm, + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF2B8CFF), + padding: EdgeInsets.symmetric(vertical: 12.h), + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.r), + ), + ), + child: Text( + '确定', + style: TextStyle(fontSize: 16.sp, color: Colors.white), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/app/features/enterprise/presentation/views/enterprise_list_page.dart b/lib/app/features/enterprise/presentation/views/enterprise_list_page.dart new file mode 100644 index 0000000..6cd819f --- /dev/null +++ b/lib/app/features/enterprise/presentation/views/enterprise_list_page.dart @@ -0,0 +1,121 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:problem_check_system/app/features/enterprise/presentation/widgets/enterprise_card.dart'; +import '../controllers/enterprise_list_controller.dart'; + +class EnterpriseListPage extends GetView { + const EnterpriseListPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text( + '企业列表', + style: TextStyle( + fontWeight: FontWeight.bold, + fontFamily: 'MyFont', + fontSize: 18.sp, + color: Colors.white, + ), + ), + backgroundColor: const Color(0xFF3B82F6), + elevation: 0, + centerTitle: true, + actions: [ + IconButton( + icon: Icon(Icons.add, color: Colors.white), // 使用 .sp + onPressed: () { + controller.navigateToAddForm(); + }, + ), + IconButton( + icon: Icon(Icons.upload, color: Colors.pink[300]), // 使用 .sp + onPressed: () { + controller.navigateToUploadPage(); + }, + ), + ], + ), + body: Stack( + children: [ + Column( + children: [ + _buildFilterBar(), + // 使用 Obx 包裹需要响应式更新的 Widget + Expanded( + child: Obx(() { + if (controller.enterpriseList.isEmpty) { + return const Center(child: CircularProgressIndicator()); + } + return ListView.builder( + padding: EdgeInsets.symmetric( + horizontal: 16.w, // 使用 .w + vertical: 8.h, // 使用 .h + ), + itemCount: controller.enterpriseList.length, + itemBuilder: (context, index) { + final enterprise = controller.enterpriseList[index]; + return Padding( + padding: EdgeInsets.only(bottom: 12.h), // 使用 .h + // child: _EnterpriseCard(enterprise: enterprise), + child: EnterpriseCard( + enterprise: enterprise, + onEdit: () { + controller.navigateToEditForm(enterprise); + }, + onViewProblems: () {}, + ), + ); + }, + ); + }), + ), + ], + ), + ], + ), + ); + } + + Widget _buildFilterBar() { + return Container( + padding: EdgeInsets.fromLTRB(16.w, 12.h, 16.w, 12.h), // 使用 .w 和 .h + color: Colors.white, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Row( + children: [ + const Text('企业名称', style: TextStyle(color: Colors.black54)), + SizedBox(width: 4.w), // 使用 .w + Icon( + Icons.search, + size: 20.sp, + color: Colors.black54, + ), // 使用 .sp + ], + ), + ), + _buildDropdown('选择日期'), + _buildDropdown('近一周'), + _buildDropdown('类型'), + ], + ), + ); + } + + Widget _buildDropdown(String text) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 8.w), // 使用 .w + child: Row( + children: [ + Text(text, style: const TextStyle(color: Colors.black54)), + const Icon(Icons.arrow_drop_down, color: Colors.black54), + ], + ), + ); + } +} diff --git a/lib/modules/enterprise_list/widgets/enterprise_card.dart b/lib/app/features/enterprise/presentation/widgets/enterprise_card.dart similarity index 91% rename from lib/modules/enterprise_list/widgets/enterprise_card.dart rename to lib/app/features/enterprise/presentation/widgets/enterprise_card.dart index 03a8537..1c3835a 100644 --- a/lib/modules/enterprise_list/widgets/enterprise_card.dart +++ b/lib/app/features/enterprise/presentation/widgets/enterprise_card.dart @@ -1,9 +1,21 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_model.dart'; +import 'package:problem_check_system/app/routes/app_routes.dart'; // 主卡片组件 class EnterpriseCard extends StatelessWidget { - const EnterpriseCard({super.key}); + final Enterprise enterprise; + final VoidCallback onEdit; + final VoidCallback onViewProblems; + + const EnterpriseCard({ + super.key, + required this.enterprise, + required this.onEdit, + required this.onViewProblems, + }); @override Widget build(BuildContext context) { @@ -54,9 +66,7 @@ class EnterpriseCard extends StatelessWidget { children: [ // --- “修改信息” 按钮 --- TextButton.icon( - onPressed: () { - print('修改信息按钮被点击'); - }, + onPressed: onEdit, icon: Icon(Icons.edit_outlined, size: 16.sp), label: Text('修改信息', style: TextStyle(fontSize: 9.5.sp)), style: TextButton.styleFrom( @@ -71,9 +81,7 @@ class EnterpriseCard extends StatelessWidget { ), // --- “查看问题” 按钮 --- ElevatedButton( - onPressed: () { - print('查看问题按钮被点击'); - }, + onPressed: onViewProblems, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF42A5F5), foregroundColor: Colors.white, @@ -127,7 +135,7 @@ class EnterpriseCard extends StatelessWidget { ), SizedBox(height: 4.h), // .h 适配垂直间距 Text( - '山东汇丰石化集团有限公司', + enterprise.companyName, style: TextStyle( fontSize: 12.5.sp, fontWeight: FontWeight.w500, @@ -146,7 +154,7 @@ class EnterpriseCard extends StatelessWidget { ), SizedBox(height: 4.h), Text( - '危险化学品生产', + enterprise.companyType, style: TextStyle( fontSize: 12.5.sp, fontWeight: FontWeight.w500, @@ -187,7 +195,7 @@ class EnterpriseCard extends StatelessWidget { style: TextStyle(fontSize: 12.sp, color: Colors.grey), ), Text( - '29', + enterprise.totalIssues.toString(), style: TextStyle( fontSize: 12.5.sp, color: Colors.black87, @@ -201,7 +209,7 @@ class EnterpriseCard extends StatelessWidget { children: [ Icon(Icons.access_time, color: Colors.grey, size: 16.sp), Text( - '创建时间: 2025-07-31 15:30:29', + '创建时间: ${enterprise.creationTime}', style: TextStyle(fontSize: 12.sp, color: Colors.grey), ), ], @@ -215,13 +223,13 @@ class EnterpriseCard extends StatelessWidget { return Row( children: [ _buildTag( - text: '已上传 15', + text: '已上传 ${enterprise.uploaded}', textColor: Colors.blue.shade700, backgroundColor: Colors.blue.shade50, ), SizedBox(width: 8.w), _buildTag( - text: '未上传 14', + text: '未上传 ${enterprise.notUploaded}', textColor: Colors.red.shade600, backgroundColor: Colors.red.shade50, ), diff --git a/lib/app/routes/app_pages.dart b/lib/app/routes/app_pages.dart index 2fc5472..32a235a 100644 --- a/lib/app/routes/app_pages.dart +++ b/lib/app/routes/app_pages.dart @@ -1,4 +1,6 @@ import 'package:get/get.dart'; +import 'package:problem_check_system/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart'; +import 'package:problem_check_system/app/features/enterprise/presentation/views/enterprise_form_page.dart'; import 'package:problem_check_system/modules/home/bindings/home_binding.dart'; import 'package:problem_check_system/modules/home/views/home_page.dart'; import 'package:problem_check_system/modules/auth/bindings/login_binding.dart'; @@ -41,5 +43,10 @@ abstract class AppPages { binding: ProblemFormBinding(), ), GetPage(name: AppRoutes.test, page: () => const HealthApp()), + GetPage( + name: AppRoutes.enterpriseForm, + page: () => const EnterpriseFormPage(), + binding: EnterpriseFormBinding(), + ), ]; } diff --git a/lib/app/routes/app_routes.dart b/lib/app/routes/app_routes.dart index 74164cc..f59aa77 100644 --- a/lib/app/routes/app_routes.dart +++ b/lib/app/routes/app_routes.dart @@ -12,5 +12,11 @@ abstract class AppRoutes { static const problemForm = '/problemForm'; // #endregion + // #region + static const enterprise = '/enterprise'; + static const enterpriseList = '/enterpriseList'; + static const enterpriseForm = '/enterpriseForm'; + // #endregion + static const test = '/test'; } diff --git a/lib/main.dart b/lib/main.dart index fff08da..37d8311 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -76,7 +76,7 @@ class MainApp extends StatelessWidget { NavigationDestinationLabelBehavior.onlyShowSelected, // backgroundColor: Colors.white, // 指示器的颜色 - indicatorColor: const Color.fromARGB(88, 19, 214, 12), + indicatorColor: Colors.deepOrange.shade200, // 【核心】使用 indicatorShape 属性并传入我们的自定义类 // indicatorShape: const CustomIndicatorShape( // // 在这里调整你想要的宽度 @@ -89,7 +89,7 @@ class MainApp extends StatelessWidget { TextStyle( fontSize: 12.sp, fontWeight: FontWeight.w500, - color: Colors.blue, + color: Colors.deepOrange, ), ), ), diff --git a/lib/modules/auth/bindings/login_binding.dart b/lib/modules/auth/bindings/login_binding.dart index 11ebd89..bac30bc 100644 --- a/lib/modules/auth/bindings/login_binding.dart +++ b/lib/modules/auth/bindings/login_binding.dart @@ -1,5 +1,5 @@ import 'package:get/get.dart'; -import 'package:problem_check_system/data/repositories/auth_repository.dart'; +import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart'; import 'package:problem_check_system/modules/auth/controllers/login_controller.dart'; class LoginBinding implements Bindings { diff --git a/lib/modules/auth/controllers/login_controller.dart b/lib/modules/auth/controllers/login_controller.dart index e82b27a..87f7e9e 100644 --- a/lib/modules/auth/controllers/login_controller.dart +++ b/lib/modules/auth/controllers/login_controller.dart @@ -1,9 +1,9 @@ import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:problem_check_system/data/models/auth_model.dart'; +import 'package:problem_check_system/app/core/data/models/auth_model.dart'; import 'package:problem_check_system/app/routes/app_routes.dart'; -import 'package:problem_check_system/data/repositories/auth_repository.dart'; +import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart'; class LoginController extends GetxController { final AuthRepository _authRepository; diff --git a/lib/modules/enterprise_list/enterprise_list_page.dart b/lib/modules/enterprise_list/enterprise_list_page.dart deleted file mode 100644 index 3a2ff5e..0000000 --- a/lib/modules/enterprise_list/enterprise_list_page.dart +++ /dev/null @@ -1,280 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'package:problem_check_system/modules/enterprise_list/model/enterprise_model.dart'; -import 'package:problem_check_system/modules/enterprise_list/widgets/enterprise_card.dart'; -import 'enterprise_list_controller.dart'; - -class EnterpriseListPage extends GetView { - const EnterpriseListPage({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text( - '企业列表', - style: TextStyle( - fontWeight: FontWeight.bold, - fontFamily: 'MyFont', - fontSize: 18.sp, - color: Colors.white, - ), - ), - backgroundColor: const Color(0xFF3B82F6), - elevation: 0, - centerTitle: true, - actions: [ - IconButton( - icon: Icon(Icons.add, color: Colors.white), // 使用 .sp - onPressed: () { - // 处理筛选按钮点击事件 - }, - ), - IconButton( - icon: Icon(Icons.upload, color: Colors.pink[300]), // 使用 .sp - onPressed: () { - // 处理筛选按钮点击事件 - }, - ), - ], - ), - body: Stack( - children: [ - Column( - children: [ - _buildFilterBar(), - // 使用 Obx 包裹需要响应式更新的 Widget - Expanded( - child: Obx(() { - if (controller.enterpriseList.isEmpty) { - return const Center(child: CircularProgressIndicator()); - } - return ListView.builder( - padding: EdgeInsets.symmetric( - horizontal: 16.w, // 使用 .w - vertical: 8.h, // 使用 .h - ), - itemCount: controller.enterpriseList.length, - itemBuilder: (context, index) { - final enterprise = controller.enterpriseList[index]; - return Padding( - padding: EdgeInsets.only(bottom: 12.h), // 使用 .h - // child: _EnterpriseCard(enterprise: enterprise), - child: EnterpriseCard(), - ); - }, - ); - }), - ), - ], - ), - ], - ), - ); - } - - Widget _buildFilterBar() { - return Container( - padding: EdgeInsets.fromLTRB(16.w, 12.h, 16.w, 12.h), // 使用 .w 和 .h - color: Colors.white, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Row( - children: [ - const Text('企业名称', style: TextStyle(color: Colors.black54)), - SizedBox(width: 4.w), // 使用 .w - Icon( - Icons.search, - size: 20.sp, - color: Colors.black54, - ), // 使用 .sp - ], - ), - ), - _buildDropdown('选择日期'), - _buildDropdown('近一周'), - _buildDropdown('类型'), - ], - ), - ); - } - - Widget _buildDropdown(String text) { - return Padding( - padding: EdgeInsets.symmetric(horizontal: 8.w), // 使用 .w - child: Row( - children: [ - Text(text, style: const TextStyle(color: Colors.black54)), - const Icon(Icons.arrow_drop_down, color: Colors.black54), - ], - ), - ); - } -} - -class _EnterpriseCard extends StatelessWidget { - final Enterprise enterprise; - const _EnterpriseCard({required this.enterprise}); - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.all(16.r), // 使用 .r 保证四边 padding 比例一致 - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8.r), // 使用 .r - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - '企业名称', - style: TextStyle(fontSize: 9.sp, color: Colors.grey), - ), - SizedBox(height: 4.h), // 使用 .h - Text( - enterprise.companyName, - style: TextStyle( - fontSize: 12.5.sp, - fontWeight: FontWeight.w500, - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ], - ), - - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - '企业类型', - style: TextStyle(fontSize: 9.sp, color: Colors.grey), - ), - SizedBox(height: 4.h), // 使用 .h - Text( - enterprise.companyType, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 12.5.sp, - fontWeight: FontWeight.w500, - ), - ), - ], - ), - - Container( - padding: EdgeInsets.symmetric( - horizontal: 5.w, - vertical: 2.h, - ), // 使用 .w 和 .h - decoration: BoxDecoration( - // color: Colors.orange[100], - borderRadius: BorderRadius.circular(10.r), // 使用 .r - border: Border.all(color: Colors.red), - ), - child: Text( - '信息未上传', - maxLines: 1, - style: TextStyle(fontSize: 9.sp, color: Colors.red), // 使用 .sp - ), - ), - ], - ), - SizedBox(height: 16.h), // 使用 .h - Row( - children: [ - Icon( - Icons.description, - size: 16.sp, - color: Colors.grey, - ), // 使用 .sp - SizedBox(width: 4.w), // 使用 .w - Text( - '问题总数: ${enterprise.totalIssues}', - style: TextStyle(fontSize: 12.sp, color: Colors.grey), // 使用 .sp - ), - SizedBox(width: 16.w), // 使用 .w - Icon( - Icons.access_time, - size: 16.sp, - color: Colors.grey, - ), // 使用 .sp - SizedBox(width: 4.w), // 使用 .w - Text( - '创建时间: ${enterprise.creationTime}', - style: TextStyle(fontSize: 12.sp, color: Colors.grey), // 使用 .sp - ), - ], - ), - // SizedBox(height: 16.h), // 使用 .h - Row( - children: [ - _buildTag('已上传 ${enterprise.uploaded}', Colors.blue), - SizedBox(width: 8.w), // 使用 .w - _buildTag('未上传 ${enterprise.notUploaded}', Colors.red), - const Spacer(), - Icon(Icons.edit, size: 16.sp, color: Colors.grey), // 使用 .sp - SizedBox(width: 4.w), // 使用 .w - Text( - '修改信息', - style: TextStyle( - fontSize: 9.5.sp, - color: Colors.grey, - ), // 使用 .sp - ), - SizedBox(width: 16.w), // 使用 .w - ElevatedButton( - onPressed: () {}, - style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xFF3B82F6), - - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(4.r), // 使用 .r - ), - // padding: EdgeInsets.symmetric( - // horizontal: 16.w, // 使用 .w - // vertical: 8.h, // 使用 .h - // ), - // tapTargetSize: MaterialTapTargetSize.shrinkWrap, - ), - child: const Text( - '查看问题', - style: TextStyle(color: Colors.white), - ), - ), - ], - ), - ], - ), - ); - } - - Widget _buildTag(String text, Color color) { - return Container( - padding: EdgeInsets.symmetric( - horizontal: 6.w, - vertical: 2.h, - ), // 使用 .w 和 .h - decoration: BoxDecoration( - color: color.withOpacity(0.1), - borderRadius: BorderRadius.circular(4.r), // 使用 .r - ), - child: Text( - text, - style: TextStyle(color: color, fontSize: 8.5.sp), - ), // 使用 .sp - ); - } -} diff --git a/lib/modules/home/bindings/home_binding.dart b/lib/modules/home/bindings/home_binding.dart index 80d7e13..e0b5f3e 100644 --- a/lib/modules/home/bindings/home_binding.dart +++ b/lib/modules/home/bindings/home_binding.dart @@ -1,8 +1,8 @@ import 'package:get/get.dart'; -import 'package:problem_check_system/data/models/problem_sync_status.dart'; -import 'package:problem_check_system/data/repositories/auth_repository.dart'; -import 'package:problem_check_system/data/repositories/problem_repository.dart'; -import 'package:problem_check_system/modules/enterprise_list/enterprise_list_controller.dart'; +import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart'; +import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart'; +import 'package:problem_check_system/app/core/data/repositories/problem_repository.dart'; +import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart'; import 'package:problem_check_system/modules/home/controllers/home_controller.dart'; import 'package:problem_check_system/modules/my/controllers/my_controller.dart'; import 'package:problem_check_system/modules/problem/controllers/problem_controller.dart'; diff --git a/lib/modules/home/controllers/home_controller.dart b/lib/modules/home/controllers/home_controller.dart index 37e8831..6acb4dd 100644 --- a/lib/modules/home/controllers/home_controller.dart +++ b/lib/modules/home/controllers/home_controller.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:problem_check_system/modules/enterprise_list/enterprise_list_page.dart'; +import 'package:problem_check_system/app/features/enterprise/presentation/views/enterprise_list_page.dart'; import 'package:problem_check_system/modules/my/views/my_page.dart'; import 'package:problem_check_system/modules/problem/views/problem_page.dart'; diff --git a/lib/modules/home/views/home_page.dart b/lib/modules/home/views/home_page.dart index d28ac11..307a4ce 100644 --- a/lib/modules/home/views/home_page.dart +++ b/lib/modules/home/views/home_page.dart @@ -20,7 +20,6 @@ class HomePage extends GetView { // 3. 将 'onTap' 属性重命名为 'onDestinationSelected' onDestinationSelected: controller.changeIndex, - // M3 风格调整 (可选, 但推荐) // 动画时长 animationDuration: const Duration(milliseconds: 800), @@ -34,13 +33,13 @@ class HomePage extends GetView { label: '企业', ), NavigationDestination( - icon: Icon(Icons.now_widgets_outlined, color: Colors.orange), - selectedIcon: Icon(Icons.now_widgets, color: Colors.orange), + icon: Icon(Icons.now_widgets_outlined, color: Colors.blue), + selectedIcon: Icon(Icons.now_widgets, color: Colors.blue), label: '全部问题', ), NavigationDestination( - icon: Icon(Icons.person_outline, color: Colors.cyan), - selectedIcon: Icon(Icons.person, color: Colors.cyan), + icon: Icon(Icons.person_outline, color: Colors.blue), + selectedIcon: Icon(Icons.person, color: Colors.blue), label: '我的', ), ], diff --git a/lib/modules/my/bindings/change_password_binding.dart b/lib/modules/my/bindings/change_password_binding.dart index 659709b..58ec80f 100644 --- a/lib/modules/my/bindings/change_password_binding.dart +++ b/lib/modules/my/bindings/change_password_binding.dart @@ -1,5 +1,5 @@ import 'package:get/get.dart'; -import 'package:problem_check_system/data/repositories/auth_repository.dart'; +import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart'; import 'package:problem_check_system/modules/my/controllers/change_password_controller.dart'; class ChangePasswordBinding implements Bindings { diff --git a/lib/modules/my/controllers/change_password_controller.dart b/lib/modules/my/controllers/change_password_controller.dart index bdff19e..209573f 100644 --- a/lib/modules/my/controllers/change_password_controller.dart +++ b/lib/modules/my/controllers/change_password_controller.dart @@ -1,5 +1,5 @@ import 'package:get/get.dart'; -import 'package:problem_check_system/data/repositories/auth_repository.dart'; +import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart'; class ChangePasswordController extends GetxController { // 响应式变量,用于存储新密码和确认密码 diff --git a/lib/modules/my/controllers/my_controller.dart b/lib/modules/my/controllers/my_controller.dart index 99ec602..664f4f3 100644 --- a/lib/modules/my/controllers/my_controller.dart +++ b/lib/modules/my/controllers/my_controller.dart @@ -1,7 +1,7 @@ import 'package:dio/dio.dart'; import 'package:get/get.dart'; import 'package:problem_check_system/app/routes/app_routes.dart'; -import 'package:problem_check_system/data/repositories/auth_repository.dart'; +import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart'; class MyController extends GetxController { final AuthRepository authRepository; diff --git a/lib/modules/problem/bindings/problem_form_binding.dart b/lib/modules/problem/bindings/problem_form_binding.dart index 2dd892c..cf4e98d 100644 --- a/lib/modules/problem/bindings/problem_form_binding.dart +++ b/lib/modules/problem/bindings/problem_form_binding.dart @@ -1,6 +1,6 @@ import 'package:get/get.dart'; -import 'package:problem_check_system/data/models/problem_model.dart'; -import 'package:problem_check_system/data/models/problem_sync_status.dart'; +import 'package:problem_check_system/app/core/data/models/problem_model.dart'; +import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart'; import 'package:problem_check_system/modules/problem/controllers/problem_form_controller.dart'; class ProblemFormBinding extends Bindings { diff --git a/lib/modules/problem/controllers/problem_controller.dart b/lib/modules/problem/controllers/problem_controller.dart index 3b3c4d8..919bcef 100644 --- a/lib/modules/problem/controllers/problem_controller.dart +++ b/lib/modules/problem/controllers/problem_controller.dart @@ -7,15 +7,15 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart' hide MultipartFile, FormData, Response; import 'package:flutter/material.dart'; import 'package:problem_check_system/app/routes/app_routes.dart'; -import 'package:problem_check_system/core/extensions/http_response_extension.dart'; -import 'package:problem_check_system/data/models/image_metadata_model.dart'; -import 'package:problem_check_system/data/models/image_status.dart'; -import 'package:problem_check_system/data/models/problem_sync_status.dart'; -import 'package:problem_check_system/data/models/server_problem.dart'; -import 'package:problem_check_system/data/repositories/file_repository.dart'; -import 'package:problem_check_system/data/repositories/image_repository.dart'; -import 'package:problem_check_system/data/repositories/problem_repository.dart'; -import 'package:problem_check_system/data/models/problem_model.dart'; +import 'package:problem_check_system/app/core/extensions/http_response_extension.dart'; +import 'package:problem_check_system/app/core/data/models/image_metadata_model.dart'; +import 'package:problem_check_system/app/core/data/models/image_status.dart'; +import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart'; +import 'package:problem_check_system/app/core/data/models/server_problem.dart'; +import 'package:problem_check_system/app/core/data/repositories/file_repository.dart'; +import 'package:problem_check_system/app/core/data/repositories/image_repository.dart'; +import 'package:problem_check_system/app/core/data/repositories/problem_repository.dart'; +import 'package:problem_check_system/app/core/data/models/problem_model.dart'; import 'package:problem_check_system/modules/problem/controllers/sync_progress_state.dart'; import 'package:problem_check_system/modules/problem/views/widgets/models/date_range_enum.dart'; import 'package:problem_check_system/modules/problem/views/widgets/models/dropdown_option.dart'; diff --git a/lib/modules/problem/controllers/problem_form_controller.dart b/lib/modules/problem/controllers/problem_form_controller.dart index 06d9269..590fa35 100644 --- a/lib/modules/problem/controllers/problem_form_controller.dart +++ b/lib/modules/problem/controllers/problem_form_controller.dart @@ -6,12 +6,12 @@ import 'package:image_picker/image_picker.dart'; import 'package:path/path.dart' as path; import 'package:permission_handler/permission_handler.dart'; import 'package:path_provider/path_provider.dart'; -import 'package:problem_check_system/data/models/image_status.dart'; -import 'package:problem_check_system/data/models/image_metadata_model.dart'; +import 'package:problem_check_system/app/core/data/models/image_status.dart'; +import 'package:problem_check_system/app/core/data/models/image_metadata_model.dart'; import 'dart:io'; -import 'package:problem_check_system/data/models/problem_model.dart'; -import 'package:problem_check_system/data/models/problem_sync_status.dart'; -import 'package:problem_check_system/data/repositories/problem_repository.dart'; +import 'package:problem_check_system/app/core/data/models/problem_model.dart'; +import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart'; +import 'package:problem_check_system/app/core/data/repositories/problem_repository.dart'; import 'package:uuid/uuid.dart'; class ProblemFormController extends GetxController { diff --git a/lib/modules/problem/views/problem_list_page.dart b/lib/modules/problem/views/problem_list_page.dart index 0c3bc09..a12fcbb 100644 --- a/lib/modules/problem/views/problem_list_page.dart +++ b/lib/modules/problem/views/problem_list_page.dart @@ -2,9 +2,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:easy_refresh/easy_refresh.dart'; -import 'package:problem_check_system/data/models/problem_sync_status.dart'; +import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart'; import 'package:problem_check_system/modules/problem/controllers/problem_controller.dart'; -import 'package:problem_check_system/data/models/problem_model.dart'; +import 'package:problem_check_system/app/core/data/models/problem_model.dart'; import 'package:problem_check_system/modules/problem/views/widgets/problem_card.dart'; class ProblemListPage extends GetView { diff --git a/lib/modules/problem/views/widgets/problem_card.dart b/lib/modules/problem/views/widgets/problem_card.dart index a0ebd07..881d429 100644 --- a/lib/modules/problem/views/widgets/problem_card.dart +++ b/lib/modules/problem/views/widgets/problem_card.dart @@ -3,8 +3,8 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:problem_check_system/app/routes/app_routes.dart'; -import 'package:problem_check_system/data/models/problem_sync_status.dart'; -import 'package:problem_check_system/data/models/problem_model.dart'; +import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart'; +import 'package:problem_check_system/app/core/data/models/problem_model.dart'; import 'package:problem_check_system/modules/problem/controllers/problem_controller.dart'; import 'package:problem_check_system/modules/problem/views/widgets/custom_button.dart'; import 'package:tdesign_flutter/tdesign_flutter.dart';