From 67a7276d059daf29bfe03054d6e3d825e215ca4b Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 24 Mar 2025 10:06:20 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=B8=BAdebug=E6=89=93=E5=8C=85=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0release=E7=9B=B8=E5=90=8C=E7=AD=BE=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle.kts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index aeb0fa019..bd1fef2f5 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -57,6 +57,15 @@ android { enableV1Signing = true enableV2Signing = true } + getByName("debug") { + // debug 使用与 release 相同的签名配置 + keyAlias = keystoreProperties.getProperty("keyAlias") + keyPassword = keystoreProperties.getProperty("keyPassword") + storeFile = file(keystoreProperties.getProperty("storeFile")) + storePassword = keystoreProperties.getProperty("storePassword") + enableV1Signing = true + enableV2Signing = true + } } buildTypes { @@ -68,6 +77,9 @@ android { signingConfig = signingConfigs.getByName("release") // signingConfig = signingConfigs.getByName("debug") } + debug { + signingConfig = signingConfigs.getByName("debug") + } } } From 86d037ddd67c0c9f90772bbdc7fd2fc0de2d2c72 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 24 Mar 2025 20:07:07 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E9=81=BF=E5=85=8D=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/login_service.dart | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/lib/data/services/login_service.dart b/lib/data/services/login_service.dart index 705a37353..d09ce9672 100644 --- a/lib/data/services/login_service.dart +++ b/lib/data/services/login_service.dart @@ -12,14 +12,25 @@ class LoginService { return ''; })); - if (Firebase.apps.isEmpty) { - Firebase.initializeApp( - name: 'DeepSound', - options: DefaultFirebaseOptions.currentPlatform, - //demoProjectId:'1:907754492821:android:2deffc5aa1037ae2145c9c' - ).then((value) { - print('Firebase Initialized:${value.options}'); - }); + _initializeFirebase(); + } + + Future _initializeFirebase() async { + try { + // 尝试获取已存在的实例 + Firebase.app('DeepSound'); + print('已存在的 Firebase 实例被重用'); + } catch (e) { + try { + // 如果不存在则初始化新实例 + await Firebase.initializeApp( + name: 'DeepSound', + options: DefaultFirebaseOptions.currentPlatform, + ); + print('Firebase 初始化成功'); + } catch (e) { + print('Firebase 初始化失败: $e'); + } } } } From 94eff03b4412f1c21e25584ab91de25bbc92e387 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 24 Mar 2025 21:03:37 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=90=8D=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/network/api.dart | 9 ++ .../controllers/profile_controller.dart | 135 +++++++++++++----- lib/modules/profile/views/profile_view.dart | 14 +- 3 files changed, 117 insertions(+), 41 deletions(-) diff --git a/lib/data/services/network/api.dart b/lib/data/services/network/api.dart index 48e3758c1..70c577999 100644 --- a/lib/data/services/network/api.dart +++ b/lib/data/services/network/api.dart @@ -38,4 +38,13 @@ class Api { params: params, ); } + + //更新用户设置 + static updateUserSetting([params]) { + return DioManager().request( + NWMethod.post, + '/api/home/user_setting', + params: params, + ); + } } diff --git a/lib/modules/profile/controllers/profile_controller.dart b/lib/modules/profile/controllers/profile_controller.dart index 5f6e09933..d2cb75f27 100644 --- a/lib/modules/profile/controllers/profile_controller.dart +++ b/lib/modules/profile/controllers/profile_controller.dart @@ -1,7 +1,7 @@ import 'package:get/get.dart'; import 'package:get_storage/get_storage.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:logger/logger.dart'; import '../../../data/models/user_Info.dart'; @@ -9,6 +9,9 @@ import '../../settings/controllers/settings_controller.dart'; import 'dart:io'; import 'dart:convert'; 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 { static ProfileController get to => Get.find(); @@ -19,11 +22,11 @@ class ProfileController extends GetxController { // final _isEditing = false.obs; // final _storage = GetStorage(); //用户信息 - static const String userKey = 'user_info'; - final _storage = GetStorage(); - final ImagePicker _picker = ImagePicker(); - final Rx userInfo = User.instance.obs; - //final RxString localAvatar = ''.obs; + static const String userKey = 'user_info'; //用户信息存储键 + final _storage = GetStorage(); //本地存储 + final ImagePicker _picker = ImagePicker(); //图片选择器 + final Rx userInfo = User.instance.obs; // 响应式用户信息对象,使用单例模式确保全局唯一性 + final RxString localAvatar = ''.obs; // 本地头像路径,便于响应式更新UI // 使用响应式变量 final currentLanguage = 'zh'.obs; @@ -119,35 +122,60 @@ class ProfileController extends GetxController { try { // 准备数据 Map data = { - "image": "", // 默认空字符串 - "name": userInfo.value.name, + "image": "", // 默认空字符串 "language": currentLanguage.value, + "name": userInfo.value.name, }; - // 如果有头像,转换为base64 - if (userInfo.value.avatar.isNotEmpty) { - File imageFile = File(userInfo.value.avatar); - List imageBytes = await imageFile.readAsBytes(); - String base64Image = base64Encode(imageBytes); - data["image"] = base64Image; - } + // // 如果有头像,转换为base64 + // 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; + // }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: { 'accept': 'application/json', + 'Authorization': _storage.read("logintoken"), '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) { - throw '更新失败:${response.body}'; + if (response.statusCode == 200) { + if (response.data['code'] == 0) { + Logger().d('更新成功: ${response.data}'); + Get.snackbar('成功', '同步到服务器成功'); + } else { + throw '更新失败:${response.data['msg'] ?? '未知错误'}'; + } + } else { + throw '服务器响应错误: ${response.statusCode}'; } } catch (e) { Logger().e('同步到后端失败: $e'); - Get.snackbar('错误','同步到服务器失败,请重试'); + Get.snackbar('错误', '同步到服务器失败,请重试'); throw e; } } @@ -156,6 +184,37 @@ class ProfileController extends GetxController { final userJson = _storage.read(userKey); if (userJson != null) { userInfo.value = User.instance; + // 如果有远程头像地址,下载并保存到本地 + if (userInfo.value.avatar.isNotEmpty) { + _downloadAndSaveAvatar(userInfo.value.avatar); + } + } + } + + // 下载并保存远程头像 + Future _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 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()); } + // 更新用户头像 Future updateUserAvatar() async { final XFile? image = await _picker.pickImage( source: ImageSource.gallery, @@ -203,19 +263,24 @@ class ProfileController extends GetxController { user.avatar = image.path; } }); - await saveUserInfo();//保存到本地 - await _syncWithBackend();//同步到后端 + + // 更新本地头像路径 + localAvatar.value = image.path; + await _storage.write('local_avatar', image.path); + // await saveUserInfo(); //保存到本地 + await _syncWithBackend(); //同步到后端 // 通知 SettingsController 更新 - if (Get.isRegistered()) { - Get.find().loadUserInfo(); - } + // if (Get.isRegistered()) { + // Get.find().loadUserInfo(); + // } } } + // 更新用户名 Future updateUserName(String name) async { if (name.trim().isEmpty) { - Logger().e('Invalid name: $name'); + Logger().e('无效名称: $name'); return; } @@ -223,21 +288,21 @@ class ProfileController extends GetxController { userInfo.update((user) { if (user != null) { user.name = name.trim(); - Logger().d('Name updated to: ${user.name}'); + Logger().d('名称更新为: ${user.name}'); } }); - await saveUserInfo();//保存到本地 - await _syncWithBackend();//同步到后端 + //await saveUserInfo(); //保存到本地 + await _syncWithBackend(); //同步到后端 - // 同步更新 SettingsController + //同步更新 SettingsController if (Get.isRegistered()) { - final settingsController = Get.find(); + final settingsController = Get.find(); settingsController.loadUserInfo(); } } catch (e) { - Logger().e('Error updating name: $e'); - Get.snackbar('错误', 'Failed to update user name'); + Logger().e('更新名称错误: $e'); + Get.snackbar('错误', '更新用户名失败'); } } } diff --git a/lib/modules/profile/views/profile_view.dart b/lib/modules/profile/views/profile_view.dart index e66e0bdcf..a74e8ae21 100644 --- a/lib/modules/profile/views/profile_view.dart +++ b/lib/modules/profile/views/profile_view.dart @@ -169,10 +169,12 @@ class EditProfileView extends GetView { children: [ Obx(() => CircleAvatar( radius: 50.r, - backgroundImage: controller - .userInfo.value.avatar.isNotEmpty - ? NetworkImage(controller.userInfo.value.avatar) - : null, + backgroundImage: controller.localAvatar.value.isNotEmpty + ? FileImage(File(controller.localAvatar.value)) + : (controller.userInfo.value.avatar.isNotEmpty + ? NetworkImage( + controller.userInfo.value.avatar) + : null) as ImageProvider?, child: controller.userInfo.value.avatar.isEmpty ? Icon(Icons.person, size: 50.r) : null, @@ -205,10 +207,10 @@ class EditProfileView extends GetView { controller: nameController, decoration: InputDecoration( labelText: 'nickname'.tr, - border: OutlineInputBorder(), + border: const OutlineInputBorder(), suffixIcon: nameController.text.isNotEmpty ? IconButton( - icon: Icon(Icons.clear), + icon: const Icon(Icons.clear), onPressed: () { nameController.clear(); },