Browse Source

修改后台用户名成功

newdev_shunjiawei
lxm 2 years ago
parent
commit
80de23be41
  1. 9
      lib/data/services/network/api.dart
  2. 135
      lib/modules/profile/controllers/profile_controller.dart
  3. 14
      lib/modules/profile/views/profile_view.dart

9
lib/data/services/network/api.dart

@ -38,4 +38,13 @@ class Api {
params: params, params: params,
); );
} }
//更新用户设置
static updateUserSetting([params]) {
return DioManager().request(
NWMethod.post,
'/api/home/user_setting',
params: params,
);
}
} }

135
lib/modules/profile/controllers/profile_controller.dart

@ -1,7 +1,7 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart'; import 'package:get_storage/get_storage.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; //import 'package:http/http.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:logger/logger.dart'; import 'package:logger/logger.dart';
import '../../../data/models/user_Info.dart'; import '../../../data/models/user_Info.dart';
@ -9,6 +9,9 @@ import '../../settings/controllers/settings_controller.dart';
import 'dart:io'; import 'dart:io';
import 'dart:convert'; import 'dart:convert';
import 'package:flutter_image_compress/flutter_image_compress.dart'; import 'package:flutter_image_compress/flutter_image_compress.dart';
import 'package:path_provider/path_provider.dart';
import '../../../data/services/network/api.dart';
import 'package:dio/dio.dart';
class ProfileController extends GetxController { class ProfileController extends GetxController {
static ProfileController get to => Get.find(); static ProfileController get to => Get.find();
@ -19,11 +22,11 @@ class ProfileController extends GetxController {
// final _isEditing = false.obs; // final _isEditing = false.obs;
// final _storage = GetStorage(); // final _storage = GetStorage();
//用户信息 //用户信息
static const String userKey = 'user_info'; static const String userKey = 'user_info'; //用户信息存储键
final _storage = GetStorage(); final _storage = GetStorage(); //本地存储
final ImagePicker _picker = ImagePicker(); final ImagePicker _picker = ImagePicker(); //图片选择器
final Rx<User> userInfo = User.instance.obs; final Rx<User> userInfo = User.instance.obs; // 响应式用户信息对象,使用单例模式确保全局唯一性
//final RxString localAvatar = ''.obs; final RxString localAvatar = ''.obs; // 本地头像路径,便于响应式更新UI
// 使用响应式变量 // 使用响应式变量
final currentLanguage = 'zh'.obs; final currentLanguage = 'zh'.obs;
@ -119,35 +122,60 @@ class ProfileController extends GetxController {
try { try {
// 准备数据 // 准备数据
Map<String, dynamic> data = { Map<String, dynamic> data = {
"image": "", // 默认空字符串 "image": "", // 默认空字符串
"name": userInfo.value.name,
"language": currentLanguage.value, "language": currentLanguage.value,
"name": userInfo.value.name,
}; };
// 如果有头像,转换为base64 // // 如果有头像,转换为base64
if (userInfo.value.avatar.isNotEmpty) { // if (localAvatar.value.isNotEmpty) {
File imageFile = File(userInfo.value.avatar); // try{
List<int> imageBytes = await imageFile.readAsBytes(); // File imageFile = File(localAvatar.value);
String base64Image = base64Encode(imageBytes); // if(await imageFile.exists()){
data["image"] = base64Image; // List<int> imageBytes = await imageFile.readAsBytes();
} // String base64Image = base64Encode(imageBytes);
// data["image"] = base64Image;
// }else{
// Logger().e('头像文件不存在');
// }
// }catch(e){
// Logger().e('读取头像文件失败: $e');
// }
// 调用API // }
final response = await GetConnect().post(
'https://www.deapsound.com:443/api/home/user_setting', final dio = Dio(BaseOptions(
baseUrl: 'https://www.deapsound.com:443',
headers: { headers: {
'accept': 'application/json', 'accept': 'application/json',
'Authorization': _storage.read<String>("logintoken"),
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
data, ));
// 调用API前打印token
Logger().d('当前用户token: ${userInfo.value.token}');
Logger().d('请求数据: ${{"user": data}}');
final response = await dio.post(
'/api/home/user_setting',
data: data,
); );
// 调用API
//final response = await Api.updateUserSetting(data);
if (response.statusCode != 200) { if (response.statusCode == 200) {
throw '更新失败:${response.body}'; if (response.data['code'] == 0) {
Logger().d('更新成功: ${response.data}');
Get.snackbar('成功', '同步到服务器成功');
} else {
throw '更新失败:${response.data['msg'] ?? '未知错误'}';
}
} else {
throw '服务器响应错误: ${response.statusCode}';
} }
} catch (e) { } catch (e) {
Logger().e('同步到后端失败: $e'); Logger().e('同步到后端失败: $e');
Get.snackbar('错误','同步到服务器失败,请重试'); Get.snackbar('错误', '同步到服务器失败,请重试');
throw e; throw e;
} }
} }
@ -156,6 +184,37 @@ class ProfileController extends GetxController {
final userJson = _storage.read(userKey); final userJson = _storage.read(userKey);
if (userJson != null) { if (userJson != null) {
userInfo.value = User.instance; userInfo.value = User.instance;
// 如果有远程头像地址,下载并保存到本地
if (userInfo.value.avatar.isNotEmpty) {
_downloadAndSaveAvatar(userInfo.value.avatar);
}
}
}
// 下载并保存远程头像
Future<void> _downloadAndSaveAvatar(String url) async {
try {
final response = await GetConnect().get(url);
if (response.status.isOk && response.body != null) {
// 保存到应用文档目录
final appDir = await getApplicationDocumentsDirectory();
final fileName = 'avatar_${DateTime.now().millisecondsSinceEpoch}.jpg';
final localPath = '${appDir.path}/$fileName';
// 写入文件
final file = File(localPath);
final List<int> bytes = response.body.runtimeType == String
? base64Decode(response.body.toString())
: response.body;
await file.writeAsBytes(bytes);
// 更新本地头像路径
localAvatar.value = localPath;
await _storage.write('local_avatar', localPath);
Logger().d('头像已下载到本地: $localPath');
}
} catch (e) {
Logger().e('下载头像失败: $e');
} }
} }
@ -163,6 +222,7 @@ class ProfileController extends GetxController {
await _storage.write(userKey, userInfo.value.toJson()); await _storage.write(userKey, userInfo.value.toJson());
} }
// 更新用户头像
Future<void> updateUserAvatar() async { Future<void> updateUserAvatar() async {
final XFile? image = await _picker.pickImage( final XFile? image = await _picker.pickImage(
source: ImageSource.gallery, source: ImageSource.gallery,
@ -203,19 +263,24 @@ class ProfileController extends GetxController {
user.avatar = image.path; user.avatar = image.path;
} }
}); });
await saveUserInfo();//保存到本地
await _syncWithBackend();//同步到后端 // 更新本地头像路径
localAvatar.value = image.path;
await _storage.write('local_avatar', image.path);
// await saveUserInfo(); //保存到本地
await _syncWithBackend(); //同步到后端
// 通知 SettingsController 更新 // 通知 SettingsController 更新
if (Get.isRegistered<SettingsController>()) { // if (Get.isRegistered<SettingsController>()) {
Get.find<SettingsController>().loadUserInfo(); // Get.find<SettingsController>().loadUserInfo();
} // }
} }
} }
// 更新用户名
Future<void> updateUserName(String name) async { Future<void> updateUserName(String name) async {
if (name.trim().isEmpty) { if (name.trim().isEmpty) {
Logger().e('Invalid name: $name'); Logger().e('无效名称: $name');
return; return;
} }
@ -223,21 +288,21 @@ class ProfileController extends GetxController {
userInfo.update((user) { userInfo.update((user) {
if (user != null) { if (user != null) {
user.name = name.trim(); user.name = name.trim();
Logger().d('Name updated to: ${user.name}'); Logger().d('名称更新为: ${user.name}');
} }
}); });
await saveUserInfo();//保存到本地 //await saveUserInfo(); //保存到本地
await _syncWithBackend();//同步到后端 await _syncWithBackend(); //同步到后端
// 同步更新 SettingsController //同步更新 SettingsController
if (Get.isRegistered<SettingsController>()) { if (Get.isRegistered<SettingsController>()) {
final settingsController = Get.find<SettingsController>(); final settingsController = Get.find<SettingsController>();
settingsController.loadUserInfo(); settingsController.loadUserInfo();
} }
} catch (e) { } catch (e) {
Logger().e('Error updating name: $e'); Logger().e('更新名称错误: $e');
Get.snackbar('错误', 'Failed to update user name'); Get.snackbar('错误', '更新用户名失败');
} }
} }
} }

14
lib/modules/profile/views/profile_view.dart

@ -169,10 +169,12 @@ class EditProfileView extends GetView<ProfileController> {
children: [ children: [
Obx(() => CircleAvatar( Obx(() => CircleAvatar(
radius: 50.r, radius: 50.r,
backgroundImage: controller backgroundImage: controller.localAvatar.value.isNotEmpty
.userInfo.value.avatar.isNotEmpty ? FileImage(File(controller.localAvatar.value))
? NetworkImage(controller.userInfo.value.avatar) : (controller.userInfo.value.avatar.isNotEmpty
: null, ? NetworkImage(
controller.userInfo.value.avatar)
: null) as ImageProvider<Object>?,
child: controller.userInfo.value.avatar.isEmpty child: controller.userInfo.value.avatar.isEmpty
? Icon(Icons.person, size: 50.r) ? Icon(Icons.person, size: 50.r)
: null, : null,
@ -205,10 +207,10 @@ class EditProfileView extends GetView<ProfileController> {
controller: nameController, controller: nameController,
decoration: InputDecoration( decoration: InputDecoration(
labelText: 'nickname'.tr, labelText: 'nickname'.tr,
border: OutlineInputBorder(), border: const OutlineInputBorder(),
suffixIcon: nameController.text.isNotEmpty suffixIcon: nameController.text.isNotEmpty
? IconButton( ? IconButton(
icon: Icon(Icons.clear), icon: const Icon(Icons.clear),
onPressed: () { onPressed: () {
nameController.clear(); nameController.clear();
}, },

Loading…
Cancel
Save