From 2d2f9d2d5c46b5b55f3b68b46b2b85051d2f31e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=8C=AF=E5=8D=87?= <359059686@qq.com> Date: Tue, 9 Sep 2025 09:31:34 +0800 Subject: [PATCH] =?UTF-8?q?feat=20:=20=E6=9C=AC=E5=9C=B0=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=88=B0=E6=9C=8D=E5=8A=A1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/repositories/file_repository.dart | 3 +-- lib/data/repositories/problem_repository.dart | 5 ++-- .../controllers/problem_controller.dart | 23 ++++++++++++++----- .../controllers/problem_form_controller.dart | 9 ++++---- lib/modules/problem/views/problem_page.dart | 4 +++- .../problem/views/problem_upload_page.dart | 4 ++-- .../problem/views/widgets/problem_card.dart | 5 ++-- 7 files changed, 33 insertions(+), 20 deletions(-) diff --git a/lib/data/repositories/file_repository.dart b/lib/data/repositories/file_repository.dart index 13d7569..d17813e 100644 --- a/lib/data/repositories/file_repository.dart +++ b/lib/data/repositories/file_repository.dart @@ -9,8 +9,7 @@ import 'package:problem_check_system/data/providers/http_provider.dart'; class FileRepository { final HttpProvider _httpProvider = Get.find(); - /// TODO 上传图片文件到服务器。目前上传成功,需要区分重复上传相同的问题 - /// @param imageFile 要上传的本地图片文件。 + /// @param imageFilePath 要上传的本地图片文件。 /// @param cancelToken 用于取消上传任务的令牌。 /// @param onSendProgress 上传进度回调,提供已发送和总大小。 /// @return 上传成功后服务器返回的图片 URL。 diff --git a/lib/data/repositories/problem_repository.dart b/lib/data/repositories/problem_repository.dart index 630eda8..e99c76a 100644 --- a/lib/data/repositories/problem_repository.dart +++ b/lib/data/repositories/problem_repository.dart @@ -74,12 +74,13 @@ class ProblemRepository extends GetxService { /// put Future put( + String id, Map apiPayload, CancelToken cancelToken, ) async { // 3. 发送给服务器 - final response = await httpProvider.post( - ApiEndpoints.postProblem, + final response = await httpProvider.put( + ApiEndpoints.putProblemById(id), data: apiPayload, cancelToken: cancelToken, ); diff --git a/lib/modules/problem/controllers/problem_controller.dart b/lib/modules/problem/controllers/problem_controller.dart index de95db1..a5f6350 100644 --- a/lib/modules/problem/controllers/problem_controller.dart +++ b/lib/modules/problem/controllers/problem_controller.dart @@ -175,6 +175,8 @@ class ProblemController extends GetxController clearSelection(); // 重新加载未上传的问题列表 loadUnUploadedProblems(); + // 重新加载problems + loadProblems(); } on DioException catch (e) { Get.back(); if (CancelToken.isCancel(e)) { @@ -269,8 +271,11 @@ class ProblemController extends GetxController }, ); - problemRepository.updateProblem(updatedProblem); - // updatedProblems.add(updatedProblem); + if (updatedProblem.syncStatus == ProblemSyncStatus.untracked) { + problemRepository.deleteProblem(updatedProblem.id!); + } else { + problemRepository.updateProblem(updatedProblem); + } } // return updatedProblems; } on DioException { @@ -348,7 +353,11 @@ class ProblemController extends GetxController response = await problemRepository.post(apiPayload!, cancelToken); break; case ProblemSyncStatus.pendingUpdate: - response = await problemRepository.put(apiPayload!, cancelToken); + response = await problemRepository.put( + problem.id!, + apiPayload!, + cancelToken, + ); break; case ProblemSyncStatus.pendingDelete: response = await problemRepository.delete(problem.id!, cancelToken); @@ -365,7 +374,9 @@ class ProblemController extends GetxController // 返回同步完成的对象,操作类型重置为none return problem.copyWith( - syncStatus: ProblemSyncStatus.synced, // 同步完成,重置为none + syncStatus: problem.syncStatus != ProblemSyncStatus.pendingDelete + ? ProblemSyncStatus.synced + : ProblemSyncStatus.untracked, // 同步完成,重置为none imageUrls: updatedImageMetadata, ); } else { @@ -642,8 +653,8 @@ class ProblemController extends GetxController } } - Future toProblemFormPageAndRefresh() async { - await Get.toNamed(AppRoutes.problemForm); + Future toProblemFormPageAndRefresh({Problem? problem}) async { + await Get.toNamed(AppRoutes.problemForm, arguments: problem); loadProblems(); } } diff --git a/lib/modules/problem/controllers/problem_form_controller.dart b/lib/modules/problem/controllers/problem_form_controller.dart index 3a4b671..c790f84 100644 --- a/lib/modules/problem/controllers/problem_form_controller.dart +++ b/lib/modules/problem/controllers/problem_form_controller.dart @@ -142,6 +142,7 @@ class ProblemFormController extends GetxController { final List imagePaths = await _saveImagesToLocal(); if (problem != null) { + // 修改问题 final updatedProblem = problem!.copyWith( description: descriptionController.text, location: locationController.text, @@ -151,10 +152,8 @@ class ProblemFormController extends GetxController { final modifyProblem = ProblemStateManager.modifyProblem(updatedProblem); await problemRepository.updateProblem(modifyProblem); - Get.back(result: true); // 返回成功结果 - Get.snackbar('成功', '问题已更新'); } else { - // 新增模式:创建新问题 + // 创建新问题 final newProblem = ProblemStateManager.createNewProblem( description: descriptionController.text, location: locationController.text, @@ -162,9 +161,9 @@ class ProblemFormController extends GetxController { ); await problemRepository.insertProblem(newProblem); - Get.back(result: true); // 返回成功结果 - Get.snackbar('成功', '问题已保存'); } + Get.back(result: true); // 返回成功结果 + Get.snackbar('成功', '问题已更新'); } catch (e) { Get.snackbar('错误', '保存问题失败: $e'); } finally { diff --git a/lib/modules/problem/views/problem_page.dart b/lib/modules/problem/views/problem_page.dart index fc16c9b..175118d 100644 --- a/lib/modules/problem/views/problem_page.dart +++ b/lib/modules/problem/views/problem_page.dart @@ -112,7 +112,9 @@ class ProblemPage extends GetView { padding: EdgeInsets.only(bottom: 24.h), // 底部间距 child: FloatingActionButton( heroTag: "btn_add", - onPressed: controller.toProblemFormPageAndRefresh, + onPressed: () { + controller.toProblemFormPageAndRefresh(); + }, shape: const CircleBorder(), backgroundColor: Colors.blue[300], foregroundColor: Colors.white, diff --git a/lib/modules/problem/views/problem_upload_page.dart b/lib/modules/problem/views/problem_upload_page.dart index eb68087..bfa6e82 100644 --- a/lib/modules/problem/views/problem_upload_page.dart +++ b/lib/modules/problem/views/problem_upload_page.dart @@ -27,8 +27,8 @@ class ProblemUploadPage extends GetView { // leading: IconButton( // icon: Icon(Icons.close), // onPressed: () { - // Get.back();// TODO 返回之后需要刷新卡片列表 - // controller.clearSelection(); + // Get.back(); + // controller.loadProblems(); // }, // ), actions: [ diff --git a/lib/modules/problem/views/widgets/problem_card.dart b/lib/modules/problem/views/widgets/problem_card.dart index 0c61a6e..a0ebd07 100644 --- a/lib/modules/problem/views/widgets/problem_card.dart +++ b/lib/modules/problem/views/widgets/problem_card.dart @@ -5,6 +5,7 @@ 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/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'; import 'dart:io'; // 添加文件操作支持 @@ -12,7 +13,7 @@ import 'dart:io'; // 添加文件操作支持 // 定义枚举类型 enum ProblemCardViewType { buttons, checkbox } -class ProblemCard extends StatelessWidget { +class ProblemCard extends GetView { final Problem problem; final ProblemCardViewType viewType; final Function(Problem, bool)? onChanged; @@ -212,7 +213,7 @@ class ProblemCard extends StatelessWidget { CustomButton( text: '修改', onTap: () { - Get.toNamed(AppRoutes.problemForm, arguments: problem); + controller.toProblemFormPageAndRefresh(problem: problem); }, ), if (!isDeleted) SizedBox(width: 8.w),