Files
tuiche/lib/controller/user_info_controller.dart
2026-01-12 15:16:36 +08:00

431 lines
16 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:EasyDartModule/EasyDartModule.dart';
import 'package:dio/dio.dart' as dio;
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart';
import 'package:fluwx/fluwx.dart';
import 'package:get_storage/get_storage.dart';
import 'package:img_picker/img_picker.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:vbvs_app/common/color/ServiceConstant.dart';
import 'package:vbvs_app/common/color/appConstants.dart';
import 'package:vbvs_app/common/color/app_uri_status.dart';
import 'package:vbvs_app/common/util/DailyLogUtils.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/common/util/requestWithLog.dart';
import 'package:vbvs_app/component/tool/NewTopSlideNotification.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/controller/device/body_device_controller.dart';
import 'package:vbvs_app/controller/home/home_controller.dart';
import 'package:vbvs_app/controller/login/login_controller.dart';
import 'package:vbvs_app/controller/message/message_controller.dart';
import 'package:vbvs_app/controller/time/countdown_controller.dart';
import 'package:vbvs_app/enum/APPPackageType.dart';
import 'package:vbvs_app/model/api_response.dart';
import 'package:vbvs_app/model/user_data.dart';
import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart';
import 'package:vbvs_app/pages/mh_page/user/controller/mht_login_controller.dart';
part 'user_info_controller.g.dart';
@JsonSerializable()
class UserInfoModel {
int? message = 0; //消息数量
UserModel? user; //用户信息
String? token; //token值
String? runSystem; //运行系统
String? phoneVersion; //手机版本
String? deviceId; //手机唯一
String? deviceModel; //设备可见型号(如 "iPhone""iPad"
String? appVersion; //app版本信息
@JsonKey(ignore: true)
// Session? superbase_session;
@JsonKey(ignore: true)
// User? superbase_user;
String? img_bucket = 'user';
int? login = 0; //0未登录 1 登录
int? deviceBindNum = 0; //绑定设备数量
int? loginPhone = 0; //0 本机号码 1其他手机号
// String? nickname; //修改昵称
// String? avatar; //修改头像地址
bool isProgrammaticPop = false; // 标记变量
UserInfoModel();
static UserInfoModel fromJson(Map<String, dynamic> json) =>
_$UserInfoModelFromJson(json);
Map<String, dynamic> toJson() => _$UserInfoModelToJson(this);
}
class UserInfoController extends GetControllerEx<UserInfoModel> {
// 初始化实例
UserInfoController() {
attr = GetModel(UserInfoModel()).obs;
}
RxDouble textHalfWidth = 0.0.obs;
List device_bind_status = [];
int device_bind_flag = 0; //0。未初始化 1.已初始化
int initLocationpermission = 0; //未初始化
FluwxCancelable? fluwxCancelable;
final Fluwx fluwx = Fluwx();
// RxInt login = 0.obs; //0未登录 1 登录
List<Map<String, String>> country_code = [
{
"name": "中国",
"id": "+86",
},
{
"name": "香港",
"id": "+852",
},
];
RxString select_country_code = "+86".obs;
RxInt select_login_method = 1.obs; //1手机 2邮箱
Future<ApiResponse> uploadImg() async {
EasyDartModule.logger.info("请求上传图片");
DailyLogUtils.writeLog("请求上传图片");
final ImagePicker picker = ImagePicker();
final XFile? image = await picker.pickImage(source: ImageSource.gallery);
try {
ApiResponse apiResponse = ApiResponse(code: -1, msg: "头像上传失败".tr);
if (image != null) {
int fileSize = await image.length(); // 获取图片大小,单位为字节
if (fileSize > 1048576 * 5) {
apiResponse.msg = "头像限制".tr;
return apiResponse;
}
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.upload_file;
String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
String? language = "";
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
}
if (language != null && language.isNotEmpty) {
if (queryUrl.contains("?")) {
queryUrl += "&lang=$language";
} else {
queryUrl += "?lang=$language";
}
}
var formData = dio.FormData.fromMap({
"type": 1,
"file": await dio.MultipartFile.fromFile(
image.path, // 确保 image 是 File 类型
filename: image.path.split('/').last,
),
});
var response = await EasyDartModule.dio.post(queryUrl, data: formData);
if (response != null) {
var responseData = response.data is String
? jsonDecode(response.data)
: response.data;
ApiResponse res =
ApiResponse.fromJson(responseData, (object) => object);
MyUtils.formatResponse(res, "上传成功".tr, "头像上传失败".tr);
model.user!.tmpHead = res.data['path'];
updateAll();
return res;
} else {
return ApiResponse(code: -1, msg: "服务器失败".tr);
}
} else {
apiResponse.msg = "未选择图片".tr;
return apiResponse;
}
} catch (e) {
EasyDartModule.logger.error("上传图片失败->$e");
DailyLogUtils.writeError("上传图片失败->$e");
return ApiResponse(code: -1, msg: "服务器失败".tr);
}
}
//更新用户信息
Future<ApiResponse> updateData({
String? phone,
String? email,
String? code,
}) async {
EasyDartModule.logger.info("更新用户资料");
DailyLogUtils.writeLog("更新用户资料");
try {
LoginController loginController = Get.find();
ApiResponse apiResponse = ApiResponse(code: -1, msg: "保存失败".tr);
UserModel user = model.user!;
final bool hasContactUpdate = (phone != null && phone.isNotEmpty) ||
(email != null && email.isNotEmpty);
/// 只有在【没有更新 phone/email】时才要求昵称不为空
if (!hasContactUpdate &&
(user.tmpNickName == null || user.tmpNickName!.isEmpty)) {
apiResponse.msg = "昵称为空".tr;
return apiResponse;
}
if ((phone != null && phone.isNotEmpty) ||
(email != null && email.isNotEmpty)) {
if (loginController.model.updateCode == null ||
loginController.model.updateCode!.isEmpty) {
apiResponse.msg = "请输验证码".tr;
return apiResponse;
}
}
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.user_info;
String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
String? language = "";
if (AppConstants().ent_type == APPPackageType.MHT.code) {
if (mhLanguageController.selectLanguage != null) {
language = mhLanguageController.selectLanguage.value!.language_code;
}
} else {
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
}
}
if (language != null && language.isNotEmpty) {
if (queryUrl.contains("?")) {
queryUrl += "&lang=$language";
} else {
queryUrl += "?lang=$language";
}
}
final data = {
"nickName": user.tmpNickName,
if (user.tmpHead != null && user.tmpHead!.isNotEmpty)
"avatar": user.tmpHead,
if (phone != null && phone.isNotEmpty) "phone": phone,
if (email != null && email.isNotEmpty) "email": email,
if (loginController.model.updateCode != null &&
loginController.model.updateCode!.isNotEmpty)
"verify": loginController.model.updateCode,
if (code != null && code.isNotEmpty) "wxCode": code,
if (code != null && code.isNotEmpty) "khCode": "theh",
"merge": true,
};
var response =
await EasyDartModule.dio.put(queryUrl, data: jsonEncode(data));
if (apiResponse != null) {
var responseData =
response.data is String ? jsonDecode(response.data) : response.data;
ApiResponse res =
ApiResponse.fromJson(responseData, (object) => object);
MyUtils.formatResponse(res, "保存成功".tr, "保存失败".tr);
await getUserInfo();
model.user!.tmpNickName = model.user!.nick_name;
model.user!.tmpHead = model.user!.avatar;
updateAll();
return res;
} else {
return ApiResponse(code: -1, msg: "服务器失败".tr);
}
} catch (e) {
EasyDartModule.logger.info("更新用户资料失败->$e");
DailyLogUtils.writeLog("更新用户资料失败->$e");
return ApiResponse(code: -1, msg: "服务器失败".tr);
}
}
//查询用户信息
Future<ApiResponse> getUserInfo() async {
EasyDartModule.logger.info("查询用户资料");
DailyLogUtils.writeLog("查询用户资料");
try {
ApiResponse apiResponse = ApiResponse(code: -1, msg: "查询失败".tr);
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.user_info;
String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
String? language = "";
if (AppConstants().ent_type == APPPackageType.MHT.code) {
if (mhLanguageController.selectLanguage != null) {
language = mhLanguageController.selectLanguage.value!.language_code;
}
} else {
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
}
}
if (language != null && language.isNotEmpty) {
if (queryUrl.contains("?")) {
queryUrl += "&lang=$language";
} else {
queryUrl += "?lang=$language";
}
}
var response = await EasyDartModule.dio.get(queryUrl);
if (response != null) {
var responseData =
response.data is String ? jsonDecode(response.data) : response.data;
ApiResponse res =
ApiResponse.fromJson(responseData, (object) => object);
MyUtils.formatResponse(apiResponse, "保存成功".tr, "保存失败".tr);
if (res.code == HttpStatusCodes.ok) {
UserInfoController userInfoController = Get.find();
if (res.data['test'] != null && res.data['test'] == true) {
AppConstants.is_test_account = true;
} else {
AppConstants.is_test_account = false;
}
userInfoController.model.user = UserModel.fromJson(res.data);
final box = GetStorage();
box.write('user', userInfoController.model.user!.toJson()); // 存储用户信息
userInfoController.updateAll();
}
return res;
} else {
return ApiResponse(code: -1, msg: "失败".tr);
}
} catch (e) {
EasyDartModule.logger.info("更新用户资料失败->$e");
DailyLogUtils.writeLog("更新用户资料失败->$e");
return ApiResponse(code: -1, msg: "服务器失败".tr);
}
}
ApiResponse logOut() {
updateAppSystemNotify(false);
int code = AppConstants().ent_type;
if (APPPackageType.MHT.code == code) {
MHTHomeController mhtHomeController = Get.find();
mhtHomeController.personnelList.value = [];
}
ApiResponse apiResponse = ApiResponse(code: 1, msg: "退出成功".tr);
EasyDartModule.logger.info("退出登录");
DailyLogUtils.writeLog("退出登录");
model.login = 0;
EasyDartModule.dio.token = null;
final box = GetStorage();
box.remove("user");
box.remove("token");
BodyDeviceController bodyDeviceController = Get.find();
bodyDeviceController.bindDeviceNum.value = 0;
HomeController homeController = Get.find();
homeController.sleepNum.value = 0;
LoginController loginController = Get.find();
loginController.model.register_agree = null;
bodyDeviceController.sleepReportData.value = {};
MessageController messageController = Get.find();
messageController.model.body_message_read = 0;
messageController.model.system_message_read = 0;
CountdownController countdownController = Get.find();
countdownController.countdown.value = 0;
return apiResponse;
}
ApiResponse deleteAccount() {
MHTHomeController mhtHomeController = Get.find();
ApiResponse apiResponse = ApiResponse(code: 1, msg: "注销成功".tr);
EasyDartModule.logger.info("注销账号");
DailyLogUtils.writeLog("注销账号");
model.login = 0;
EasyDartModule.dio.token = null;
final box = GetStorage();
box.remove("user");
box.remove("token");
BodyDeviceController bodyDeviceController = Get.find();
bodyDeviceController.bindDeviceNum.value = 0;
HomeController homeController = Get.find();
homeController.sleepNum.value = 0;
LoginController loginController = Get.find();
loginController.model.register_agree = null;
bodyDeviceController.sleepReportData.value = {};
MessageController messageController = Get.find();
messageController.model.body_message_read = 0;
messageController.model.system_message_read = 0;
CountdownController countdownController = Get.find();
countdownController.countdown.value = 0;
mhtHomeController.personnelList.value = [];
return apiResponse;
}
//解除微信绑定
unBindWx(BuildContext context) async {
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.user_info;
String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
try {
final data = {
"wxCode": "",
"khCode": "",
"merge": true,
};
final res = await requestWithLog(
logTitle: "解除微信绑定",
method: MyHttpMethod.put,
queryUrl: queryUrl,
data: data,
onSuccess: (res) {
TopSlideNotification.show(
context,
text: res.msg!,
);
},
onFailure: (res) {
TopSlideNotification.show(
context,
text: res.msg!,
textColor: themeController.currentColor.sc9,
);
},
);
} catch (e) {
ef.log("微信解绑失败-》$e");
}
}
// 查询是否需要更新APP
checkAPPUpdate(String currentVersion) async {
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.checkAPPVersion;
// 拼接 query 参数 ver
String queryUrl =
"${serviceAddress}${serviceName}${serviceApi}?ver=${AppConstants.theh_app_version}";
var data = null;
try {
final res = await requestWithLog(
logTitle: "检测APP更新",
method: MyHttpMethod.get,
queryUrl: queryUrl,
onSuccess: (res) {
data = res.data;
},
onFailure: (res) {
NewTopSlideNotification.show(
text: res.msg!,
textColor: themeController.currentColor.sc9,
);
},
);
} catch (e) {
ef.log("检测APP更新-》$e");
NewTopSlideNotification.show(
text: "检测异常".tr,
textColor: themeController.currentColor.sc9,
);
}
return data;
}
}