From 9fec737f7e42baffc78bfd149ab53fd34d8206ca Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Thu, 15 May 2025 15:09:35 +0800 Subject: [PATCH] =?UTF-8?q?refactor(profile):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF=E6=97=B6=E4=BD=BF=E7=94=A8?= =?UTF-8?q?FormData=E4=B8=8A=E4=BC=A0=E5=A4=B4=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将用户信息更新接口的参数类型从Map改为Object,以支持FormData上传头像文件。同时,优化了头像上传的逻辑,使用MultipartFile处理文件上传,避免base64编码的性能开销。 --- lib/data/services/network/api.dart | 10 ++- lib/data/services/network/dio_manager.dart | 2 +- lib/modules/agent/views/message_bubble.dart | 76 ++++++++++++++----- .../controllers/profile_controller.dart | 43 ++++++----- 4 files changed, 91 insertions(+), 40 deletions(-) diff --git a/lib/data/services/network/api.dart b/lib/data/services/network/api.dart index 98daae281..e67639842 100644 --- a/lib/data/services/network/api.dart +++ b/lib/data/services/network/api.dart @@ -39,12 +39,20 @@ class Api { } //更新用户设置 - static updateUserSetting([params]) { + static updateUserSetting([dynamic params]) { return DioManager().request( NWMethod.post, '/api/home/user_setting', params: params, ); + // options: params is dio.FormData + // ? Options( + // headers: { + // 'Content-Type': 'multipart/form-data', + // }, + // ) + // : null, + // ); } //注销账号 diff --git a/lib/data/services/network/dio_manager.dart b/lib/data/services/network/dio_manager.dart index 0872436ec..ff1306b5c 100644 --- a/lib/data/services/network/dio_manager.dart +++ b/lib/data/services/network/dio_manager.dart @@ -31,7 +31,7 @@ class DioManager { Future request( NWMethod method, String path, { - Map? params, + Object? params, Map? queryParameters, }) async { Response response = await dio.request( diff --git a/lib/modules/agent/views/message_bubble.dart b/lib/modules/agent/views/message_bubble.dart index 8eeb04681..c432b0e65 100644 --- a/lib/modules/agent/views/message_bubble.dart +++ b/lib/modules/agent/views/message_bubble.dart @@ -2,6 +2,7 @@ import 'package:common_utils/common_utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; +import 'package:get_storage/get_storage.dart'; import 'dart:io'; import '../controllers/agent_controller.dart'; @@ -105,26 +106,61 @@ class MessageBubble extends GetView { /// 构建头像 Widget _buildAvatar(bool isUser, BuildContext context) { - return Container( - width: 36, - height: 36, - decoration: BoxDecoration( - color: isUser ? Colors.grey[300] : Theme.of(context).primaryColor, - borderRadius: BorderRadius.circular(18), - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.05), - blurRadius: 2, - offset: const Offset(0, 1), - ), - ], - ), - child: Icon( - isUser ? Icons.person : Icons.smart_toy_outlined, - color: isUser ? Colors.grey[700] : Colors.white, - size: 20, - ), - ); + if (isUser) { + final storage = GetStorage(); + final localAvatarPath = storage.read('local_avatar') ?? ''; + + return Container( + width: 36, + height: 36, + decoration: BoxDecoration( + color: localAvatarPath.isEmpty ? Colors.grey[300] : null, + borderRadius: BorderRadius.circular(18), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 2, + offset: const Offset(0, 1), + ), + ], + ), + child: localAvatarPath.isNotEmpty + ? ClipRRect( + borderRadius: BorderRadius.circular(18), + child: Image.file( + File(localAvatarPath), + fit: BoxFit.cover, + ), + ) + : Icon( + Icons.person, + color: Colors.grey[700], + size: 20, + ), + ); + } else { + // AI头像保持不变 + return Container( + width: 36, + height: 36, + decoration: BoxDecoration( + color: Theme.of(context).primaryColor, + borderRadius: BorderRadius.circular(18), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 2, + offset: const Offset(0, 1), + ), + ], + ), + child: Icon( + Icons.smart_toy_outlined, + color: Colors.white, + size: 20, + ), + ); + } } /// 构建消息内容 diff --git a/lib/modules/profile/controllers/profile_controller.dart b/lib/modules/profile/controllers/profile_controller.dart index 5bee74c6d..011ff285e 100644 --- a/lib/modules/profile/controllers/profile_controller.dart +++ b/lib/modules/profile/controllers/profile_controller.dart @@ -1,3 +1,4 @@ +import 'package:dio/dio.dart' as dio; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:flutter/material.dart'; @@ -14,6 +15,7 @@ import 'package:dio/dio.dart'; import '../../../routes/app_routes.dart'; import '../../../modules/login/controllers/googleLogin.dart'; import '../../../modules/login/controllers/facebookLogin.dart'; +//import 'package:http_parser/http_parser.dart'; // 新增此导入 class ProfileController extends GetxController { static ProfileController get to => Get.find(); @@ -150,25 +152,29 @@ class ProfileController extends GetxController { // 更新用户信息到后端 Future _syncWithBackend() async { try { - // 准备数据 - Map data = { - "image": "", // 默认空字符串 - "language": currentLanguage.value, //当前用户语言 - "name": userInfo.value.name, //当前用户名 - }; - - // 如果有头像,转换为base64 + // 创建FormData对象用于上传 + dio.FormData formData = dio.FormData(); + + // 添加基本用户信息 + formData.fields.add(MapEntry('language', currentLanguage.value)); + formData.fields.add(MapEntry('name', userInfo.value.name)); + + // 如果有头像,添加到FormData if (localAvatar.value.isNotEmpty) { - //如果本地头像路径不为空,即代表有头像 try { File imageFile = File(localAvatar.value); if (await imageFile.exists()) { - List imageBytes = await imageFile.readAsBytes(); - String base64Image = base64Encode(imageBytes); - data["image"] = base64Image; - - // // 验证base64数据 - 将base64转回图片并保存到本地 - // await _verifyBase64Image(base64Image); + // 添加文件到FormData + formData.files.add( + MapEntry( + 'file', + await dio.MultipartFile.fromFile( + imageFile.path, + filename: 'avatar.jpg', + ), + ), + ); + Logger().d('已添加头像文件到请求'); } else { Logger().e('头像文件不存在'); } @@ -177,9 +183,10 @@ class ProfileController extends GetxController { } } - Logger().d('准备更新用户信息: $data'); - // 调用API - final response = await Api.updateUserSetting(data); + Logger().d('准备更新用户信息: ${formData.fields}'); + + // 调用API,使用FormData + final response = await Api.updateUserSetting(formData); Logger().d('--更新用户信息响应: $response'); if (response != null) { Logger().d('更新成功: $response');