Browse Source

Merge branch 'lxm'

newdev_shunjiawei
lxm 2 years ago
parent
commit
dab7ce5109
  1. 4
      lib/data/models/user_Info.dart
  2. 39
      lib/data/models/user_model.dart
  3. 2
      lib/main.dart
  4. 2
      lib/modules/profile/bindings/profile_binding.dart
  5. 57
      lib/modules/profile/controllers/profile_controller.dart
  6. 9
      lib/modules/profile/views/profile_view.dart
  7. 8
      lib/modules/settings/controllers/settings_controller.dart
  8. 882
      lib/modules/settings/views/settings_view.dart

4
lib/data/models/user_Info.dart

@ -24,6 +24,7 @@ class User {
String phone;
String phonemac;
String password;
int membershipLevel=0;//添加会员等级字段,0表示普通用户
// final Int64 lastbettime;
// final Int64 createtime;
// final String wxopenid;
@ -42,6 +43,7 @@ class User {
required this.phone,
required this.phonemac,
required this.password,
this.membershipLevel = 0, // 添加默认值
// required this.lastbettime,
// required this.createtime,
// required this.wxopenid,
@ -66,6 +68,7 @@ class User {
phone: (userData?['phone'] as String?) ?? '',
phonemac: (userData?['phonemac'] as String?) ?? '',
password: (userData?['password'] as String?) ?? '',
membershipLevel: (userData?['membershipLevel'] as int?) ?? 0, // 提供默认值
// lastbettime: _parseTimestamp(userData['lastbettime']),
// createtime: _parseTimestamp(userData['createtime']),
// wxopenid: (userData?['wxopenid'] as String?) ?? '',
@ -111,6 +114,7 @@ class User {
'phone': phone,
'phonemac': phonemac,
'password': password,
'membershipLevel': membershipLevel,
// 'lastbettime': lastbettime,
// 'createtime': createtime,
// 'wxopenid': wxopenid,

39
lib/data/models/user_model.dart

@ -1,39 +0,0 @@
class UserModel {
String name; // 用户名
String avatar; // 头像
String id;
//final String deviceName;
String membershipLevel; // 会员等级
UserModel({
required this.name,
required this.avatar,
required this.id,
//required this.deviceName,
required this.membershipLevel,
});
Map<String, dynamic> toJson() => {
'name': name,
'avatar': avatar,
'id': id,
//'deviceName': deviceName,
'membershipLevel': membershipLevel,
};
factory UserModel.fromJson(Map<String, dynamic> json) => UserModel(
name: json['name'] ?? '未设置昵称',
avatar: json['avatar'] ?? '',
id: json['id'] ?? '',
//deviceName: json['deviceName'] ?? '',
membershipLevel: json['membershipLevel'] ?? '普通会员',
);
factory UserModel.defaultUser() => UserModel(
name: '未设置昵称',
avatar: '',
id: 'DeepSound_${DateTime.now().millisecondsSinceEpoch.toString()}',
//deviceName: '',
membershipLevel: '普通会员',
);
}

2
lib/main.dart

@ -65,7 +65,7 @@ class MainApp extends StatelessWidget {
splitScreenMode: true,
builder: (_, child) {
return GetMaterialApp(
title: 'Deep Voice',
title: 'DeepSound',
theme: AppTheme.lightTheme,
darkTheme: AppTheme.darkTheme,
themeMode: themeMode, // 使用提前获取的主题模式

2
lib/modules/profile/bindings/profile_binding.dart

@ -6,4 +6,4 @@ class ProfileBinding extends Bindings {
void dependencies() {
Get.lazyPut<ProfileController>(() => ProfileController());
}
}
}

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

@ -1,11 +1,13 @@
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'package:image_picker/image_picker.dart';
import 'package:logger/logger.dart';
import '../../../data/models/user_model.dart';
import '../../../data/models/user_Info.dart';
import '../../settings/controllers/settings_controller.dart';
import 'dart:io';
import 'dart:convert';
import 'package:flutter_image_compress/flutter_image_compress.dart';
class ProfileController extends GetxController {
@ -20,7 +22,8 @@ class ProfileController extends GetxController {
static const String userKey = 'user_info';
final _storage = GetStorage();
final ImagePicker _picker = ImagePicker();
final Rx<UserModel> userInfo = UserModel.defaultUser().obs;
final Rx<User> userInfo = User.instance.obs;
//final RxString localAvatar = ''.obs;
// 使用响应式变量
final currentLanguage = 'zh'.obs;
@ -111,10 +114,48 @@ class ProfileController extends GetxController {
// _isEditing.value = !_isEditing.value;
// }
// 更新用户信息到后端
Future<void> _syncWithBackend() async {
try {
// 准备数据
Map<String, dynamic> data = {
"image": "", // 默认空字符串
"name": userInfo.value.name,
"language": currentLanguage.value,
};
// 如果有头像,转换为base64
if (userInfo.value.avatar.isNotEmpty) {
File imageFile = File(userInfo.value.avatar);
List<int> imageBytes = await imageFile.readAsBytes();
String base64Image = base64Encode(imageBytes);
data["image"] = base64Image;
}
// 调用API
final response = await GetConnect().post(
'https://www.deapsound.com:443/api/home/user_setting',
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
},
data,
);
if (response.statusCode != 200) {
throw '更新失败:${response.body}';
}
} catch (e) {
Logger().e('同步到后端失败: $e');
Get.snackbar('错误','同步到服务器失败,请重试');
throw e;
}
}
void loadUserInfo() {
final userJson = _storage.read(userKey);
if (userJson != null) {
userInfo.value = UserModel.fromJson(userJson);
userInfo.value = User.instance;
}
}
@ -162,7 +203,8 @@ class ProfileController extends GetxController {
user.avatar = image.path;
}
});
await saveUserInfo();
await saveUserInfo();//保存到本地
await _syncWithBackend();//同步到后端
// 通知 SettingsController 更新
if (Get.isRegistered<SettingsController>()) {
@ -185,16 +227,17 @@ class ProfileController extends GetxController {
}
});
await saveUserInfo();
await saveUserInfo();//保存到本地
await _syncWithBackend();//同步到后端
// 同步更新 SettingsController
if (Get.isRegistered<SettingsController>()) {
final settingsController = Get.find<SettingsController>();
final settingsController = Get.find<SettingsController>();
settingsController.loadUserInfo();
}
} catch (e) {
Logger().e('Error updating name: $e');
Get.snackbar('Error', 'Failed to update user name');
Get.snackbar('错误', 'Failed to update user name');
}
}
}

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

@ -169,11 +169,10 @@ class EditProfileView extends GetView<ProfileController> {
children: [
Obx(() => CircleAvatar(
radius: 50.r,
backgroundImage:
controller.userInfo.value.avatar.isNotEmpty
? FileImage(
File(controller.userInfo.value.avatar))
: null,
backgroundImage: controller
.userInfo.value.avatar.isNotEmpty
? NetworkImage(controller.userInfo.value.avatar)
: null,
child: controller.userInfo.value.avatar.isEmpty
? Icon(Icons.person, size: 50.r)
: null,

8
lib/modules/settings/controllers/settings_controller.dart

@ -1,3 +1,4 @@
import 'package:firebase_auth/firebase_auth.dart' as firebase;
import 'package:get/get.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
@ -5,7 +6,8 @@ import 'package:get_storage/get_storage.dart';
import '../../../core/themes/theme_service.dart';
import '../../../data/services/speech_factory.dart';
import '../models/language_model.dart';
import '../../../data/models/user_model.dart';
//import '../../../data/models/user_model.dart';
import '../../../data/models/user_Info.dart';
class SettingsController extends GetxController {
// 语言设置
@ -61,7 +63,7 @@ class SettingsController extends GetxController {
static const String userKey='user_info';
//final _storage=GetStorage();
final ImagePicker _picker=ImagePicker();
final Rx<UserModel> userInfo=UserModel.defaultUser().obs;
final Rx<User> userInfo=User.instance.obs;//使用单例实例
@override
void onInit() {
@ -86,7 +88,7 @@ class SettingsController extends GetxController {
void loadUserInfo() {
final userJson = _storage.read(userKey);
if (userJson != null) {
userInfo.value = UserModel.fromJson(userJson);
userInfo.value = User.instance;
}
}

882
lib/modules/settings/views/settings_view.dart

File diff suppressed because it is too large
Loading…
Cancel
Save