diff --git a/assets/images/default_avatar.png b/assets/images/default_avatar.png new file mode 100644 index 0000000..fec833a Binary files /dev/null and b/assets/images/default_avatar.png differ diff --git a/assets/images/icon/add.svg b/assets/images/icon/add.svg new file mode 100644 index 0000000..d952718 --- /dev/null +++ b/assets/images/icon/add.svg @@ -0,0 +1,13 @@ + + + Created with Pixso. + + + + + + + + + + diff --git a/assets/mhlangs/zh_CN.json b/assets/mhlangs/zh_CN.json index ff867e5..3ebb81c 100644 --- a/assets/mhlangs/zh_CN.json +++ b/assets/mhlangs/zh_CN.json @@ -37,7 +37,24 @@ "注:首次登录会自动创建账号":"注:首次登录会自动创建账号", "请输入新密码":"请输入新密码", "确认新密码":"确认新密码", - "秒":"秒" + "秒":"秒", + "添加一台新设备":"添加一台新设备", + "添加新设备":"添加新设备", + "网络未连接,请开启设备网络后重试":"网络未连接,请开启设备网络后重试", + "提交":"提交", + "发送验证码成功":"发送验证码成功", + "注册成功":"注册成功", + "再按一次退出程序":"注再按一次退出程序册成功", + "用户拒绝授权":"用户拒绝授权", + "用户取消授权":"用户取消授权", + "未命名":"未命名", + "编辑资料":"编辑资料", + "保存":"保存", + "点击更换头像":"点击更换头像", + "保存失败":"保存失败", + "昵称为空":"昵称为空", + "保存成功":"保存成功" + diff --git a/lib/common/color/AppGlobal.dart b/lib/common/color/AppGlobal.dart new file mode 100644 index 0000000..1718c1c --- /dev/null +++ b/lib/common/color/AppGlobal.dart @@ -0,0 +1,6 @@ +import 'package:flutter/material.dart'; + +class AppGlobal { + static final GlobalKey navigatorKey = + GlobalKey(); +} diff --git a/lib/common/color/ServiceConstant.dart b/lib/common/color/ServiceConstant.dart index 946d3b8..d105b9c 100644 --- a/lib/common/color/ServiceConstant.dart +++ b/lib/common/color/ServiceConstant.dart @@ -1,6 +1,6 @@ class ServiceConstant { - // static const String baseHost = "vsbs-test.he-info.cn";//服务地址 - static const String baseHost = "vsbst-api.he-info.cn";//服务地址 + static const String baseHost = "vsbs-test.he-info.cn";//服务地址 + // static const String baseHost = "vsbst-api.he-info.cn";//服务地址 static const String service_address = "http://$baseHost"; static String server_service = "/vsbs_app_server";//服务名称 @@ -35,4 +35,9 @@ class ServiceConstant { static const String sleep_token = "HdAMjzqiYQKsmHRyEFKhfRGQ"; static const String sleep_report_url = "https://alltoone.he-info.cn/h5/#/mattress/sleep/sleep"; + + static const String user_register = "/api/user/register";//用户注册 + + + } diff --git a/lib/component/tool/TopSlideNotification.dart b/lib/component/tool/TopSlideNotification.dart index a74b6ea..a46c162 100644 --- a/lib/component/tool/TopSlideNotification.dart +++ b/lib/component/tool/TopSlideNotification.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:get/get.dart'; +import 'package:vbvs_app/common/color/AppGlobal.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; @@ -31,11 +32,42 @@ class TopSlideNotification extends StatefulWidget { Color? textColor, double slideOffset = 300.0, Duration duration = const Duration(seconds: 2), + }) { + _showInternal( + context: context, + text: text, + fontSize: fontSize, + textColor: textColor, + slideOffset: slideOffset, + duration: duration, + ); + } + + // Internal implementation used by both methods + static void _showInternal({ + BuildContext? context, + required String text, + required double fontSize, + Color? textColor, + required double slideOffset, + required Duration duration, }) { // 如果已有弹窗,先移除 _removeCurrentEntry(); - final overlay = Overlay.of(context); + // 获取有效的context,优先使用传入的context,没有则使用navigatorKey的context + final effectiveContext = context ?? AppGlobal.navigatorKey.currentContext; + if (effectiveContext == null) { + debugPrint('TopSlideNotification: No valid context available'); + return; + } + + final overlay = Overlay.of(effectiveContext); + if (overlay == null) { + debugPrint('TopSlideNotification: Could not find Overlay'); + return; + } + final entry = OverlayEntry( builder: (_) => TopSlideNotification( text: text, @@ -164,30 +196,4 @@ class _TopSlideNotificationState extends State _isAnimating = false; // 动画完成后,标记动画结束 } } - - // 工具方法:调用时直接加进 Overlay 上 - static void show( - BuildContext context, { - String text = '操作成功!', - double fontSize = 16, - Color? textColor, - double slideOffset = 300.0, - Duration duration = const Duration(seconds: 2), - }) { - final overlay = Overlay.of(context); - final entry = OverlayEntry( - builder: (_) => TopSlideNotification( - text: text, - fontSize: fontSize, - textColor: textColor, - slideOffset: slideOffset, - duration: duration, - ), - ); - overlay.insert(entry); - - Future.delayed(duration + const Duration(milliseconds: 500), () { - entry.remove(); - }); - } } diff --git a/lib/controller/main_bottom/global_controller.dart b/lib/controller/main_bottom/global_controller.dart index 08ad35b..b9920b2 100644 --- a/lib/controller/main_bottom/global_controller.dart +++ b/lib/controller/main_bottom/global_controller.dart @@ -7,7 +7,7 @@ import 'package:vbvs_app/controller/user_info_controller.dart'; import 'package:vbvs_app/pages/common/selectDialog.dart'; class GlobalModel { - List deviceList = []; + List deviceList = [];//用户绑定设备数量 Map deviceMain = {}; Map useBedController = {}; //之前控制的设备 diff --git a/lib/controller/mh_controller/address_controller.dart b/lib/controller/mh_controller/address_controller.dart index 48c1e74..b85206b 100644 --- a/lib/controller/mh_controller/address_controller.dart +++ b/lib/controller/mh_controller/address_controller.dart @@ -2,8 +2,8 @@ import 'package:ef/ef.dart'; import 'package:flutter_city_picker/model/address.dart'; import 'package:flutterflow_ui/flutterflow_ui.dart'; import 'package:json_annotation/json_annotation.dart'; -import 'package:vbvs_app/controller/mh_controller/user_data.dart'; -import 'package:vbvs_app/controller/mh_controller/muser_info_controller.dart'; +import 'package:vbvs_app/controller/user_info_controller.dart'; +import 'package:vbvs_app/model/user_data.dart'; part 'address_controller.g.dart'; @@ -80,8 +80,8 @@ class AddressController extends GetControllerEx { addAddress(AddressModel model) async { try { - final MUserInfoController userInfoController = - Get.find(); + final UserInfoController userInfoController = + Get.find(); UserModel user = userInfoController.model.user!; // 设置省市区街道名称 diff --git a/lib/controller/mh_controller/apply_repair_controller.dart b/lib/controller/mh_controller/apply_repair_controller.dart index f3e2acc..47640a2 100644 --- a/lib/controller/mh_controller/apply_repair_controller.dart +++ b/lib/controller/mh_controller/apply_repair_controller.dart @@ -1,17 +1,6 @@ -import 'dart:io'; - import 'package:ef/ef.dart'; -import 'package:flutter/src/widgets/framework.dart'; -import 'package:flutterflow_ui/flutterflow_ui.dart'; -import 'package:img_picker/img_picker.dart'; import 'package:json_annotation/json_annotation.dart'; -import 'package:path/path.dart' as p; -import 'package:uuid/uuid.dart'; -import 'package:vbvs_app/common/util/MyUtils.dart'; - -import 'muser_info_controller.dart'; - part 'apply_repair_controller.g.dart'; @JsonSerializable() diff --git a/lib/controller/mh_controller/muser_info_controller.dart b/lib/controller/mh_controller/muser_info_controller.dart deleted file mode 100644 index d5d3f48..0000000 --- a/lib/controller/mh_controller/muser_info_controller.dart +++ /dev/null @@ -1,234 +0,0 @@ -import 'dart:convert'; -import 'package:EasyDartModule/EasyDartModule.dart'; -import 'package:ef/ef.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:dio/dio.dart' as dio; -import 'package:vbvs_app/common/color/ServiceConstant.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/controller/mh_controller/user_data.dart'; -import 'package:vbvs_app/model/api_response.dart'; -part 'muser_info_controller.g.dart'; - -@JsonSerializable() -class MUserInfoModel { - 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:已登录 - - MUserInfoModel(); - static MUserInfoModel fromJson(Map json) => - _$MUserInfoModelFromJson(json); - Map toJson() => _$MUserInfoModelToJson(this); -} - -class MUserInfoController extends GetControllerEx { - // 初始化实例 - final Fluwx fluwx = Fluwx(); - - MUserInfoController() { - attr = GetModel(MUserInfoModel()).obs; - } - - List device_bind_status = []; - int device_bind_flag = 0; //0。未初始化 1.已初始化 - - Future 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(apiResponse, "我的.上传成功".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 updateData() async { - EasyDartModule.logger.info("更新用户资料"); - DailyLogUtils.writeLog("更新用户资料"); - try { - ApiResponse apiResponse = ApiResponse(code: -1, msg: "我的.保存失败".tr); - UserModel user = model.user!; - if (user.tmpNickName == null || user.tmpNickName!.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 (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, - }; - - 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); - 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 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 (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) { - MUserInfoController userInfoController = Get.find(); - userInfoController.model.user = UserModel.fromJson(res.data); - final box = GetStorage(); - box.write('user', userInfoController.model.user!.toJson()); // 存储用户信息 - userInfoController.updateAll(); - } - return apiResponse; - } else { - return ApiResponse(code: -1, msg: "服务器.失败".tr); - } - } catch (e) { - EasyDartModule.logger.info("更新用户资料失败->$e"); - DailyLogUtils.writeLog("更新用户资料失败->$e"); - return ApiResponse(code: -1, msg: "服务器.失败".tr); - } - } - - // ApiResponse logOut() { - // 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; - // } -} diff --git a/lib/controller/mh_controller/muser_info_controller.g.dart b/lib/controller/mh_controller/muser_info_controller.g.dart deleted file mode 100644 index 1dc29be..0000000 --- a/lib/controller/mh_controller/muser_info_controller.g.dart +++ /dev/null @@ -1,36 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'muser_info_controller.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -MUserInfoModel _$MUserInfoModelFromJson(Map json) => - MUserInfoModel() - ..message = (json['message'] as num?)?.toInt() - ..user = json['user'] == null - ? null - : UserModel.fromJson(json['user'] as Map) - ..token = json['token'] as String? - ..runSystem = json['runSystem'] as String? - ..phoneVersion = json['phoneVersion'] as String? - ..deviceId = json['deviceId'] as String? - ..deviceModel = json['deviceModel'] as String? - ..appVersion = json['appVersion'] as String? - ..img_bucket = json['img_bucket'] as String? - ..login = (json['login'] as num?)?.toInt(); - -Map _$MUserInfoModelToJson(MUserInfoModel instance) => - { - 'message': instance.message, - 'user': instance.user, - 'token': instance.token, - 'runSystem': instance.runSystem, - 'phoneVersion': instance.phoneVersion, - 'deviceId': instance.deviceId, - 'deviceModel': instance.deviceModel, - 'appVersion': instance.appVersion, - 'img_bucket': instance.img_bucket, - 'login': instance.login, - }; diff --git a/lib/controller/mh_controller/register_controller.dart b/lib/controller/mh_controller/register_controller.dart index 759848c..5fea58e 100644 --- a/lib/controller/mh_controller/register_controller.dart +++ b/lib/controller/mh_controller/register_controller.dart @@ -1,6 +1,7 @@ import 'package:ef/ef.dart'; import 'package:flutter/src/widgets/framework.dart'; import 'package:json_annotation/json_annotation.dart'; +import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; part 'register_controller.g.dart'; @@ -28,79 +29,77 @@ class RegisterController extends GetControllerEx { attr = GetModel(RegisterModel()).obs; } - // Future registerUser(BuildContext context) async { - // String message = ""; - // final MyDialogController myDialogController = - // Get.find(); - // if (model.register_phone == null || model.register_phone!.isEmpty) { - // message = "请输入手机号"; - // showToast(message); - // return message; - // } - // if (!MyUtils.isValidPhoneNumber(model.register_phone!)) { - // message = '请输入正确的手机号'; - // showToast(message); - // return message; - // } - // if (model.register_pd == null || model.register_pd!.isEmpty) { - // message = "请输入密码"; - // showToast(message); - // return message; - // } - // String passwordMsg = "1.密码长度必须至少8位\n2.密码需要字母加数字\n3.特殊字符和大写字母至少包含一个"; - // bool hasUppercase = model.register_pd!.contains(RegExp(r'[A-Z]')); - // bool hasDigit = model.register_pd!.contains(RegExp(r'[0-9]')); - // bool hasSpecialCharacters = - // model.register_pd!.contains(RegExp(r'[!@#$%^&*(),.?":{}|<>]')); - // bool hasLetter = model.register_pd!.contains(RegExp(r'[a-zA-Z]')); + Future registerUser(BuildContext context) async { + String message = ""; + // if (model.register_phone == null || model.register_phone!.isEmpty) { + // message = "请输入手机号".tr; + // TopSlideNotification.show(context,message); + // return message; + // } + // if (!MyUtils.isValidPhoneNumber(model.register_phone!)) { + // message = '请输入正确的手机号'; + // showToast(message); + // return message; + // } + // if (model.register_pd == null || model.register_pd!.isEmpty) { + // message = "请输入密码"; + // showToast(message); + // return message; + // } + // String passwordMsg = "1.密码长度必须至少8位\n2.密码需要字母加数字\n3.特殊字符和大写字母至少包含一个"; + // bool hasUppercase = model.register_pd!.contains(RegExp(r'[A-Z]')); + // bool hasDigit = model.register_pd!.contains(RegExp(r'[0-9]')); + // bool hasSpecialCharacters = + // model.register_pd!.contains(RegExp(r'[!@#$%^&*(),.?":{}|<>]')); + // bool hasLetter = model.register_pd!.contains(RegExp(r'[a-zA-Z]')); - // if (model.register_pd!.length < 8) { - // message = passwordMsg; - // showToast(message); - // return message; - // } + // if (model.register_pd!.length < 8) { + // message = passwordMsg; + // showToast(message); + // return message; + // } - // if (!hasLetter || !hasDigit) { - // message = passwordMsg; - // showToast(message); - // return message; - // } + // if (!hasLetter || !hasDigit) { + // message = passwordMsg; + // showToast(message); + // return message; + // } - // if (!(hasSpecialCharacters || hasUppercase)) { - // message = passwordMsg; - // showToast(message); - // return message; - // } - // if (model.register_confirm_pd == null || - // model.register_confirm_pd!.isEmpty) { - // message = "请输入确认密码"; - // showToast(message); - // return message; - // } - // if (model.register_pd != model.register_confirm_pd) { - // message = "两次密码不一致"; - // showToast(message); - // return message; - // } - // if (model.register_code == null || model.register_code!.isEmpty) { - // message = "请输入验证码"; - // showToast(message); - // return message; - // } - // if (model.register_agree == null || model.register_agree != true) { - // message = "需要同意协议"; - // showToast(message); - // return message; - // } - // message = await repository.createUser( - // model.register_pd!, model.register_phone!, model.register_code!); - // if (message.isNotEmpty) { - // showToast(message); - // return message; - // } + // if (!(hasSpecialCharacters || hasUppercase)) { + // message = passwordMsg; + // showToast(message); + // return message; + // } + // if (model.register_confirm_pd == null || + // model.register_confirm_pd!.isEmpty) { + // message = "请输入确认密码"; + // showToast(message); + // return message; + // } + // if (model.register_pd != model.register_confirm_pd) { + // message = "两次密码不一致"; + // showToast(message); + // return message; + // } + // if (model.register_code == null || model.register_code!.isEmpty) { + // message = "请输入验证码"; + // showToast(message); + // return message; + // } + // if (model.register_agree == null || model.register_agree != true) { + // message = "需要同意协议"; + // showToast(message); + // return message; + // } + // message = await repository.createUser( + // model.register_pd!, model.register_phone!, model.register_code!); + // if (message.isNotEmpty) { + // showToast(message); + // return message; + // } - // return ""; - // } + return ""; + } // Future getCode(BuildContext context) async { // String message = ""; diff --git a/lib/controller/mh_controller/user_data.dart b/lib/controller/mh_controller/user_data.dart deleted file mode 100644 index ea76499..0000000 --- a/lib/controller/mh_controller/user_data.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'user_data.g.dart'; - -@JsonSerializable() -class UserModel { - String? uid; - String? userName; - String? nickName; - String? tel; - String? avatar; - String? exp1; - String? exp2; - String? head; - String? tmpHead; - String? tmpNickName; - - UserModel(); - static UserModel fromJson(Map json) => - _$UserModelFromJson(json); - Map toJson() => _$UserModelToJson(this); -} diff --git a/lib/controller/mh_controller/user_data.g.dart b/lib/controller/mh_controller/user_data.g.dart deleted file mode 100644 index 89d1e4c..0000000 --- a/lib/controller/mh_controller/user_data.g.dart +++ /dev/null @@ -1,32 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user_data.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -UserModel _$UserModelFromJson(Map json) => UserModel() - ..uid = json['uid'] as String? - ..userName = json['userName'] as String? - ..nickName = json['nickName'] as String? - ..tel = json['tel'] as String? - ..avatar = json['avatar'] as String? - ..exp1 = json['exp1'] as String? - ..exp2 = json['exp2'] as String? - ..head = json['head'] as String? - ..tmpHead = json['tmpHead'] as String? - ..tmpNickName = json['tmpNickName'] as String?; - -Map _$UserModelToJson(UserModel instance) => { - 'uid': instance.uid, - 'userName': instance.userName, - 'nickName': instance.nickName, - 'tel': instance.tel, - 'avatar': instance.avatar, - 'exp1': instance.exp1, - 'exp2': instance.exp2, - 'head': instance.head, - 'tmpHead': instance.tmpHead, - 'tmpNickName': instance.tmpNickName, - }; diff --git a/lib/controller/user_info_controller.dart b/lib/controller/user_info_controller.dart index f7e2d90..1b001e1 100644 --- a/lib/controller/user_info_controller.dart +++ b/lib/controller/user_info_controller.dart @@ -126,10 +126,10 @@ class UserInfoController extends GetControllerEx { EasyDartModule.logger.info("更新用户资料"); DailyLogUtils.writeLog("更新用户资料"); try { - ApiResponse apiResponse = ApiResponse(code: -1, msg: "我的.保存失败".tr); + ApiResponse apiResponse = ApiResponse(code: -1, msg: "保存失败".tr); UserModel user = model.user!; if (user.tmpNickName == null || user.tmpNickName!.isEmpty) { - apiResponse.msg = "我的.昵称为空".tr; + apiResponse.msg = "昵称为空".tr; return apiResponse; } String serviceAddress = ServiceConstant.service_address; @@ -160,7 +160,7 @@ class UserInfoController extends GetControllerEx { response.data is String ? jsonDecode(response.data) : response.data; ApiResponse res = ApiResponse.fromJson(responseData, (object) => object); - MyUtils.formatResponse(res, "我的.保存成功".tr, "我的.保存失败".tr); + MyUtils.formatResponse(res, "保存成功".tr, "保存失败".tr); return res; } else { return ApiResponse(code: -1, msg: "服务器.失败".tr); diff --git a/lib/language/AppLanguage.dart b/lib/language/AppLanguage.dart index bcbefb2..a270f6b 100644 --- a/lib/language/AppLanguage.dart +++ b/lib/language/AppLanguage.dart @@ -48,11 +48,22 @@ class AppLanguage extends Translations { // } // } - Future loadLanguage(String languageCode) async { + Future loadLanguage(String languageCode, + {String project = 'th'}) async { try { + final jsonString; // 加载 JSON 文件 - final jsonString = - await rootBundle.loadString('assets/langs/$languageCode.json'); + if (project == 'th') { + jsonString = + await rootBundle.loadString('assets/langs/$languageCode.json'); + } else if (project == 'mht') { + jsonString = + await rootBundle.loadString('assets/mhlangs/$languageCode.json'); + } else { + jsonString = + await rootBundle.loadString('assets/langs/$languageCode.json'); + } + final Map jsonMap = json.decode(jsonString); // 扁平化 JSON 数据 diff --git a/lib/main.dart b/lib/main.dart index 1dae682..d9dd201 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -12,6 +12,7 @@ import 'package:fluwx/fluwx.dart'; import 'package:get_storage/get_storage.dart'; import 'package:localstorage/localstorage.dart'; import 'package:syncfusion_localizations/syncfusion_localizations.dart'; +import 'package:vbvs_app/common/color/AppGlobal.dart'; import 'package:vbvs_app/common/color/ServiceConstant.dart'; import 'package:vbvs_app/common/util/CheckNetwork.dart'; import 'package:vbvs_app/common/util/CommonVariables.dart'; @@ -41,7 +42,6 @@ import 'package:vbvs_app/controller/mh_controller/issue_controller.dart'; import 'package:vbvs_app/controller/mh_controller/issue_preview_controller.dart'; import 'package:vbvs_app/controller/mh_controller/message_controller.dart'; import 'package:vbvs_app/controller/mh_controller/mh_language_controller.dart'; -import 'package:vbvs_app/controller/mh_controller/muser_info_controller.dart'; import 'package:vbvs_app/controller/mh_controller/my_experience_list_controller.dart'; import 'package:vbvs_app/controller/mh_controller/people_info_controller.dart'; import 'package:vbvs_app/controller/mh_controller/register_controller.dart'; @@ -61,7 +61,6 @@ import 'package:vbvs_app/controller/weather/weather_controller.dart'; import 'package:vbvs_app/language/AppLanguage.dart'; import 'package:vbvs_app/model/CustomThemeColor.dart'; import 'package:vbvs_app/model/user_data.dart'; -import 'package:vbvs_app/pages/main_bottom/component/main_page_b_bottom_change.dart'; import 'package:vbvs_app/pages/mh_page/MattressControl.dart'; import 'package:vbvs_app/pages/mh_page/user/controller/mht_login_controller.dart'; import 'package:vbvs_app/pages/mh_page/user/controller/mht_register_controller.dart'; @@ -76,8 +75,10 @@ Future main() async { final Locale? deviceLocale = Get.deviceLocale; print('系统语言: ${deviceLocale?.languageCode}'); + // final selectapp = "th"; + final selectapp = "mht"; // await AppLanguage().loadLanguage("en_US"); - await AppLanguage().loadLanguage("zh_CN"); + await AppLanguage().loadLanguage("zh_CN",project: selectapp); await initLanguageSetting(); WidgetsFlutterBinding.ensureInitialized(); @@ -277,12 +278,14 @@ class MyApp extends StatelessWidget { Widget buildmht(BuildContext context, BoxConstraints cons) { return GetMaterialApp( + navigatorKey: AppGlobal.navigatorKey, // ✅ 注入 navigatorKey translations: AppLanguage(), debugShowCheckedModeBanner: false, title: '', theme: themeController.currentTheme, // home: MainPageBBottomChange(), initialRoute: "/loginPage", + // initialRoute: "/mianPageBottomChange", onGenerateRoute: mhonGenerateRoute, initialBinding: BindingsBuilder(() => [ // Get.lazyPut(() => UserInfoController()), @@ -290,7 +293,7 @@ class MyApp extends StatelessWidget { Get.lazyPut(() => ControlCardController()), Get.lazyPut(() => RepairListController()), Get.lazyPut(() => RepairInfoController()), - Get.lazyPut(() => MUserInfoController()), + Get.lazyPut(() => UserInfoController()), Get.lazyPut(() => MhMessageController()), Get.lazyPut(() => ScoreController()), Get.lazyPut(() => ExperienceStoreListController()), @@ -321,6 +324,8 @@ class MyApp extends StatelessWidget { Get.lazyPut(() => RepairController()), Get.lazyPut(() => MHTLoginController()), Get.lazyPut(() => MHTRegisterController()), + Get.lazyPut(() => WeatherModelController()), + Get.lazyPut(() => RegisterController()), ])); } diff --git a/lib/pages/main_bottom/component/main_page_b_bottom_change.dart b/lib/pages/main_bottom/component/main_page_b_bottom_change.dart index bec2ebd..8d9596d 100644 --- a/lib/pages/main_bottom/component/main_page_b_bottom_change.dart +++ b/lib/pages/main_bottom/component/main_page_b_bottom_change.dart @@ -154,7 +154,7 @@ import 'package:flutter/material.dart'; import 'package:vbvs_app/pages/common/bezier_bottom_navigation_bar.dart'; import 'package:vbvs_app/pages/mh_page/MattressControl.dart'; -import 'package:vbvs_app/pages/mh_page/new_Home_page.dart'; +import 'package:vbvs_app/pages/mh_page/homepage/new_Home_page.dart'; import 'package:vbvs_app/pages/mh_page/new_mine_page.dart'; import 'package:vbvs_app/pages/mh_page/user/page/register_page.dart'; diff --git a/lib/pages/main_bottom/mine_page.dart b/lib/pages/main_bottom/mine_page.dart index 144f13c..949169e 100644 --- a/lib/pages/main_bottom/mine_page.dart +++ b/lib/pages/main_bottom/mine_page.dart @@ -253,6 +253,7 @@ class _MinePageState extends State { letterSpacing: 0.0, ), ), + ].divide(SizedBox(height: 20.rpx)), ), ].divide(SizedBox(width: 35.rpx)), diff --git a/lib/pages/mh_page/edit_userinfo_page.dart b/lib/pages/mh_page/edit_userinfo_page.dart deleted file mode 100644 index 7820460..0000000 --- a/lib/pages/mh_page/edit_userinfo_page.dart +++ /dev/null @@ -1,227 +0,0 @@ -import 'package:ef/base/widget/flutterflow/FlutterFlowTheme.dart'; -import 'package:ef/ef.dart'; -import 'package:flutter/material.dart'; -import 'package:EasyDartModule/EasyDartModule.dart' as edm; -import 'package:get/get.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/FitTool.dart'; -import 'package:vbvs_app/common/util/MyUtils.dart'; -import 'package:vbvs_app/component/tool/ClickableContainer.dart'; -import 'package:vbvs_app/component/tool/CustomCard.dart'; -import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; -import 'package:vbvs_app/model/api_response.dart'; - -import '../../controller/mh_controller/muser_info_controller.dart'; - -class EditUserInfoPage extends GetView { - final scaffoldKey = GlobalKey(); - - @override - Widget build(BuildContext context) { - // UserInfoController controller = Get.find(); - MUserInfoController userInfoController = Get.find(); - return GestureDetector( - onTap: () => FocusScope.of(context).unfocus(), - child: Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage('assets/images/new_background.png'), // 本地图片 - fit: BoxFit.fill, // 填满整个 Container - ), - ), - child: Scaffold( - backgroundColor: Colors.transparent, - key: scaffoldKey, - appBar: AppBar( - backgroundColor: Colors.transparent, - automaticallyImplyLeading: false, - iconTheme: IconThemeData(color: Colors.white), - titleSpacing: 0, - title: Container( - width: double.infinity, - height: 70.rpx, - child: Stack( - alignment: Alignment.center, - children: [ - // 中间居中的标题 - Text( - '编辑资料', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white, - fontSize: 30.rpx, - ), - ), - // 左侧图标 - Positioned( - left: 20.rpx, - child: returnIconButtomNew, - ), - Positioned( - right: 30.rpx, - child: CustomCard( - borderRadius: 16.rpx, - gradientDirection: GradientDirection.vertical, - onTap: () {}, - colors: const [ - Color(0xFFFCFCFC), - Color(0xFFF8FAF9), - Color(0XFFECF6F3), - Color(0XFFD9F0E9), - Color(0xFFCEECE3) - ], - child: Container( - width: 120.rpx, - height: 60.rpx, - alignment: Alignment.center, - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(5), - // color: stringToColor("#182B7C"), - // ), - child: Text( - "保存", - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: 'Readex Pro', - color: stringToColor("#9EA4B7"), - letterSpacing: 0, - fontSize: 30.rpx, - ), - ), - ), - )) - ], - ), - ), - centerTitle: false, - ), - body: Container( - width: double.infinity, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.only(top: 108.rpx), - child: Container( - width: 160.rpx, - height: 160.rpx, - clipBehavior: Clip.antiAlias, - decoration: const BoxDecoration( - shape: BoxShape.circle, - ), - child: Image.asset( - "assets/images/people_avatar.png", - fit: BoxFit.cover, - ), - ), - ), - ClickableContainer( - backgroundColor: Colors.transparent, - highlightColor: Colors.transparent, - padding: EdgeInsets.only(top: 44.rpx, bottom: 44.rpx), - onTap: () async { - edm.EasyDartModule.logger - .info("${userInfoController.model.user!}点击上传头像"); - DailyLogUtils.writeLog( - "${userInfoController.model.user!}点击上传头像"); - ApiResponse apiResponse = - await userInfoController.uploadImg(); - TopSlideNotification.show( - context, - text: apiResponse.msg!, - textColor: apiResponse.code == HttpStatusCodes.ok - ? themeController.currentColor.sc2 - : themeController.currentColor.sc9, - ); - }, - child: Text( - '点击更换头像', - style: - TextStyle(color: Color(0XFF85F5FF), fontSize: 26.rpx), - ), - ), - Padding( - padding: EdgeInsets.fromLTRB(60.rpx, 78.rpx, 60.rpx, 0.rpx), - child: Container( - width: double.infinity, - height: 88.rpx, - decoration: BoxDecoration( - border: Border( - top: BorderSide( - color: Color(0xFFD3D3D3), width: 2.rpx), // 上边线 - bottom: BorderSide( - color: Color(0xFFD3D3D3), width: 2.rpx), // 下边线 - ), - ), - alignment: Alignment(0, 0), - child: TextField( - obscureText: false, - keyboardType: TextInputType.text, - textInputAction: TextInputAction.done, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 30.rpx, color: Colors.white), - decoration: InputDecoration( - fillColor: Colors.transparent, - filled: true, - hintText: "请输入昵称", - hintStyle: TextStyle(color: Colors.white), - border: InputBorder.none, - contentPadding: EdgeInsets.only(bottom: 10.rpx)), - onChanged: (value) { - controller.model.user?.nickName = value; - controller.updateAll(); - }, - controller: controller.onReDraw( - TextEditingController( - text: controller.model.user?.nickName ?? ""), - (textEditingController) { - textEditingController.text = - controller.model.user?.nickName ?? ""; - }), - ), - // Text( - // '玛利亚', - // style: TextStyle( - // color: Color(0XFFFFFFFF), fontSize: 26.rpx), - // ), - ), - ), - ], - ), - ), - ), - )); - } - - Widget getImageWidget(BuildContext context) { - try { - MUserInfoController controller = Get.find(); - var head = controller.model.user!.tmpHead; - return Container( - width: 200.rpx, - height: 200.rpx, - child: Container( - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration( - shape: BoxShape.circle, - ), - child: head == null || head.isEmpty - ? Image.asset( - 'assets/img/avatar.png', - fit: BoxFit.cover, - ) - : Image.network( - head, - fit: BoxFit.cover, - ), - ), - ); - } catch (e) { - print(e); - } - return Container(); - } -} diff --git a/lib/pages/mh_page/homepage/new_Home_page.dart b/lib/pages/mh_page/homepage/new_Home_page.dart new file mode 100644 index 0000000..4de9b8b --- /dev/null +++ b/lib/pages/mh_page/homepage/new_Home_page.dart @@ -0,0 +1,888 @@ +import 'package:ef/ef.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:flutterflow_ui/flutterflow_ui.dart'; +import 'package:vbvs_app/common/color/appConstants.dart'; +import 'package:vbvs_app/common/util/FitTool.dart'; +import 'package:vbvs_app/common/util/MyUtils.dart'; +import 'package:vbvs_app/controller/device/body_device_controller.dart'; +import 'package:vbvs_app/controller/main_bottom/global_controller.dart'; +import 'package:vbvs_app/controller/user_info_controller.dart'; +import 'package:vbvs_app/controller/weather/weather_controller.dart'; +import 'package:vbvs_app/pages/mh_page/FloatingSvgIcon.dart'; + +class NewHomePage extends StatefulWidget { + const NewHomePage({super.key}); + @override + State createState() => _NewHomePageState(); +} + +class _NewHomePageState extends State { + UserInfoController userInfoController = Get.find(); + BodyDeviceController deviceController = Get.find(); + double borderRadius = 16.rpx; + + var formFieldController = FormFieldController(null); + + GlobalController gloablController = Get.find(); + WeatherModelController weatherModelController = Get.find(); + + // get userInfoController => Get.find(); + + var sleepDays = [].obs; + + var sleep_mac = "".obs; + + Map scoreColor = { + "-1": "#d3d3d3", + "1": "#4e8408", + "2": "#7bbb33", + "3": "#e15b8d", + "4": "#ff0000", + }; + + Map scoreName = { + "-1": "暂无", + "1": "优秀", + "2": "良好", + "3": "合格", + "4": "注意", + }; + + @override + void initState() { + super.initState(); + } + + getWeekName(int i) { + String v = ""; + switch (i) { + case 1: + v = "周一"; + break; + case 2: + v = "周二"; + break; + case 3: + v = "周三"; + break; + case 4: + v = "周四"; + break; + case 5: + v = "周五"; + break; + case 6: + v = "周六"; + break; + case 7: + v = "周日"; + break; + } + return v; + } + + @override + Widget build(BuildContext context) { + int login = userInfoController.model.login!; + return GestureDetector( + onTap: () => FocusScope.of(context).unfocus(), + child: Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/images/new_background.png'), // 本地图片 + fit: BoxFit.fill, // 填满整个 Container + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: AppBar( + iconTheme: + IconThemeData(color: themeController.currentColor.sc3), + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + titleSpacing: 0, + title: Container( + height: 180.rpx, + child: Row( + children: [ + // 左侧头像 + Obx(() { + return userInfo(userInfoController.model.login); + }), + const Spacer(), // 左右分隔 + FloatingSvgIcon( + assetPath: 'assets/img/icon/xiaoe.svg', + width: 60.rpx, + height: 60.rpx, + onTap: () { + print("点击了小鹅图标"); + }, + ), + SizedBox(width: 40.rpx), + ], + ), + )), + body: SafeArea( + child: Container( + width: MediaQuery.sizeOf(context).width, + height: MediaQuery.sizeOf(context).height * 1.123, + // decoration: BoxDecoration( + // color: AppColors.bg_color, + // image: DecorationImage( + // image: AssetImage("assets/images/background.png"), + // fit: BoxFit.cover, + // ), + // ), + decoration: BoxDecoration(), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Container( + padding: + EdgeInsets.fromLTRB(26.rpx, 10.rpx, 26.rpx, 40.rpx), + width: double.infinity, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 0.rpx), + child: Column( + children: [ + Padding( + padding: + EdgeInsets.fromLTRB(17.rpx, 30.rpx, 0, 0), + child: Row( + children: [ + // Text('上海 22° 多云', + // style: TextStyle( + // fontSize: 26.rpx, + // color: Colors.white)), + // Icon(Icons.cloud, + // size: 30.rpx, color: Colors.white), + Obx(() { + return Row( + children: [ + Text( + "${weatherModelController.model.cityName ?? '未知数据'.tr}", + style: TextStyle( + color: Colors.white, + fontSize: AppConstants() + .normal_text_fontSize, + ), + ), + Text( + "${(weatherModelController.model.current_temperature != null && weatherModelController.model.current_temperature! > 0) ? weatherModelController.model.current_temperature : '未知数据'.tr}" + + "°C", + style: TextStyle( + color: Colors.white, + fontSize: AppConstants() + .normal_text_fontSize, + ), + ), + Text( + "${(weatherModelController.model.weather_info?.isNotEmpty ?? false) ? weatherModelController.model.weather_info : '未知数据'.tr}", + style: TextStyle( + color: Colors.white, + fontSize: AppConstants() + .normal_text_fontSize, + ), + ), + if (weatherModelController + .model.weatherIconurl != + null && + weatherModelController.model + .weatherIconurl!.isNotEmpty) + Container( + width: 35.rpx, + height: 26.rpx, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + shape: BoxShape.circle), + child: Image.network( + weatherModelController + .model.weatherIconurl!, + fit: BoxFit.cover, + ), + ), + ].divide(SizedBox( + width: 20.rpx, + )), + ); + }), + ], + ), + ), + ], + ), + ), + ), + Obx(() { + return Container( + padding: EdgeInsets.only(left: 30.rpx, right: 30.rpx), + child: Column( + children: [ + if (gloablController.model.deviceList.length > 0) + Container( + child: Column( + children: [ + Container( + width: MediaQuery.sizeOf(context).width, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: + BorderRadius.circular(borderRadius), + ), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: + EdgeInsetsDirectional.fromSTEB( + 30.rpx, + 16.rpx, + 16.rpx, + 8.rpx), + child: Container( + width: MediaQuery.sizeOf(context) + .width, + height: MediaQuery.sizeOf(context) + .height * + 0.065, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context) + .secondaryBackground, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + ValueListenableBuilder( + valueListenable: + formFieldController, + builder: (c, a, s) => + FlutterFlowDropDown< + String>( + controller: + formFieldController, + options: gloablController + .model.JunheDevices + .map((d) => + "${d["mac"]}") + .toList(), + optionLabels: + gloablController.model + .JunheDevices + .map((d) { + var s = d["name"] ?? + d["mac"]; + if (s == null) { + return ""; + } else { + return "$s"; + } + }).toList(), + onChanged: (val) { + // print("$val"); + // if (val == null) { + // sleepDays.value = []; + // } else { + // getSleeps( + // formFieldController + // .value); + // } + // // sleep_mac.value = val!; + }, + width: 360.rpx, + height: 72.rpx, + maxHeight: 200.rpx, + textStyle: TextStyle( + fontSize: 28.rpx, + overflow: TextOverflow + .ellipsis), + hintText: '', + icon: Icon( + Icons + .keyboard_arrow_down_rounded, + color: + FlutterFlowTheme.of( + context) + .secondaryText, + size: 48.rpx, + ), + fillColor: stringToColor( + "#F3F5F6"), + elevation: 2, + borderColor: + stringToColor( + "#F3F5F6"), + borderWidth: 2, + borderRadius: 18, + margin: + EdgeInsetsDirectional + .fromSTEB( + 32.rpx, + 8.rpx, + 32.rpx, + 8.rpx), + hidesUnderline: true, + isOverButton: false, + isSearchable: false, + isMultiSelect: false, + ), + ), + InkWell( + onTap: () { + // if (formFieldController + // .value != + // null) { + // Get.toNamed( + // "/sleepWebview", + // arguments: [ + // formFieldController + // .value + // ]); + // } + }, + child: Row( + mainAxisSize: + MainAxisSize.max, + children: [ + Text( + '睡眠报告', + style: FlutterFlowTheme + .of(context) + .bodyMedium + .override( + fontFamily: + 'Readex Pro', + letterSpacing: + 0, + fontSize: + 30.rpx), + ), + SizedBox( + width: 12.rpx, + ), + SvgPicture.asset( + "assets/images/table.svg", + width: 28.rpx, + height: 28.rpx), + SizedBox( + width: 20.rpx, + ), + ], + ), + ), + ], + ), + ), + ), + Container( + padding: EdgeInsets.only( + top: 0.rpx, + bottom: 20.rpx, + left: 16.rpx, + right: 16.rpx), + width: double.infinity, + decoration: BoxDecoration(), + child: Row( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + ...List.generate( + sleepDays.value.length, + (index) { + var day = sleepDays[index]; + return Expanded( + child: Container( + padding: EdgeInsets.only( + top: 10.rpx, + bottom: 20.rpx), + width: 100, + // decoration: BoxDecoration( + // color: index == 2 + // ? stringToColor("#F3F5F6") + // : Colors.white, + // borderRadius: + // BorderRadius.circular( + // borderRadius), + // ), + child: Column( + mainAxisSize: + MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment + .start, + crossAxisAlignment: + CrossAxisAlignment + .center, + children: [ + Text( + day['week'], + style: FlutterFlowTheme + .of(context) + .bodyMedium + .override( + fontFamily: + 'Readex Pro', + fontSize: + 30.rpx, + letterSpacing: + 0, + ), + ), + Text( + day['date'], + style: FlutterFlowTheme + .of(context) + .bodyMedium + .override( + fontFamily: + 'Readex Pro', + letterSpacing: + 0, + fontSize: + 24.rpx, + ), + ), + SizedBox( + height: 6.rpx, + ), + Column( + children: [ + Row( + mainAxisSize: + MainAxisSize + .max, + mainAxisAlignment: + MainAxisAlignment + .center, + children: [ + Text( + '${day['score'] ?? "-"}', + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + 'Readex Pro', + fontSize: + 48.rpx, + letterSpacing: + 0, + ), + ), + if (day['score'] != + null) + SizedBox( + width: + 2.rpx, + ), + if (day['score'] != + null) + Text( + '分', + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + 'Readex Pro', + letterSpacing: + 0, + fontSize: + 26.rpx, + ), + ), + ], + ), + Container( + width: 120.rpx, + height: 52.rpx, + decoration: + BoxDecoration( + color: stringToColor( + day['scoreColor'] ?? + "#f3f5f6"), + borderRadius: + BorderRadius + .circular( + 26.rpx), + shape: BoxShape + .rectangle, + ), + alignment: + Alignment + .center, + child: Text( + '${day['scoreType'] ?? "暂无"}', + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + 'Readex Pro', + color: day['scoreType'] != + null + ? Colors.white + : stringToColor("#ced1d7"), + letterSpacing: + 0, + fontSize: + 28.rpx, + ), + ), + ) + ], + ) + ], + ), + ), + ); + }) + ], + ), + ), + ], + ), + ), + ...List.generate( + gloablController + .model.deviceList.length, (index) { + var device = gloablController + .model.deviceList[index]; + String rname = device['roomName']; + if (index != 0) { + String lrname = gloablController.model + .deviceList[index - 1]["roomName"]; + if (lrname == rname) { + rname = ""; + } + } + return Column(children: [ + Padding( + padding: + EdgeInsetsDirectional.fromSTEB( + 20.rpx, 20.rpx, 0, 0), + child: Container( + decoration: BoxDecoration(), + alignment: + AlignmentDirectional(-1, 0), + child: rname.isNotEmpty + ? Text( + "$rname", + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + 'Readex Pro', + color: Colors.white, + fontSize: 32.rpx, + letterSpacing: 0, + ), + ) + : SizedBox( + height: 10.rpx, + ), + ), + ), + // getDeviceList(context, device) + ]); + }), + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0, 40.rpx, 0, 100.rpx), + child: Container( + width: MediaQuery.sizeOf(context).width, + height: 84.rpx, + decoration: BoxDecoration(), + child: FFButtonWidget( + onPressed: () { + // print('Button pressed ...'); + // Get.toNamed("/homeDeviceType"); + }, + text: '添加新设备'.tr, + icon: Icon( + Icons.add, + size: 60.rpx, + ), + options: FFButtonOptions( + height: 80.rpx, + padding: + EdgeInsetsDirectional.fromSTEB( + 48.rpx, 0, 48.rpx, 0), + iconPadding: + EdgeInsetsDirectional.fromSTEB( + 0, 0, 0, 0), + color: stringToColor("#182B7C"), + textStyle: + FlutterFlowTheme.of(context) + .titleSmall + .override( + fontFamily: + 'Readex Pro', + color: Colors.white, + letterSpacing: 0, + fontSize: 30.rpx), + elevation: 3, + borderSide: BorderSide( + color: Colors.transparent, + width: 1, + ), + borderRadius: BorderRadius.circular( + borderRadius), + ), + ), + ), + ), + ], + ), + ), + if (gloablController.model.deviceList.length == 0) + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0, 0, 0, 80.rpx), + child: Container( + width: MediaQuery.sizeOf(context).width, + height: 302.rpx, + padding: EdgeInsets.only( + top: 90.rpx, bottom: 80.rpx), + decoration: BoxDecoration( + // color: Colors.white, + borderRadius: + BorderRadius.circular(borderRadius), + border: Border.all( + color: stringToColor("#85F5FF"), // 边框颜色 + width: 1.rpx, // 边框宽度 + ), + ), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + 'assets/images/icon/add.svg', + width: 42.rpx, + height: 42.rpx, + ), + SizedBox( + height: 32.rpx, + ), + Text( + '添加一台新设备'.tr, + style: TextStyle( + color: stringToColor("#85F5FF"), + fontSize: AppConstants() + .normal_text_fontSize, + letterSpacing: 0, + ), + ), + ], + ), + ), + ), + ], + ), + ); + }) + ], + ), + ), + ) + + // Padding( + // padding: EdgeInsets.symmetric(horizontal: 30.rpx), + // child: Column( + // children: [ + // Padding( + // padding: EdgeInsets.fromLTRB(17.rpx, 30.rpx, 0, 0), + // child: Row( + // children: [ + // Text('上海 22° 多云', + // style: TextStyle( + // fontSize: 26.rpx, color: Colors.white)), + // Icon(Icons.cloud, + // size: 30.rpx, color: Colors.white), + // ], + // ), + // ), + // ], + // )) + ), + ), + )); + } + + //1 :登录 0:未登录 + Widget userInfo(int? login) { + return Row( + children: (login == 1) + ? [ + SizedBox(width: 40.rpx), + CircleAvatar( + radius: 27.rpx, // 可根据需求调整 + backgroundImage: login == 1 + ? (userInfoController.model.user!.avatar == null || + userInfoController.model.user!.avatar!.isEmpty + ? const AssetImage( + "assets/images/default_avatar.png", + ) + : NetworkImage( + userInfoController.model.user!.avatar!, + )) + : const AssetImage( + "assets/images/default_avatar.png", + ), + ), + SizedBox(width: 23.rpx), // 左侧头像和文本之间的间距 + Text( + '${userInfoController.model.user?.nick_name?.isNotEmpty == true ? userInfoController.model.user!.nick_name : '未命名'.tr}', + style: TextStyle(fontSize: 30.rpx, color: Colors.white), + ) + ] + : [ + SizedBox(width: 40.rpx), + CircleAvatar( + radius: 27.rpx, // 可根据需求调整 + backgroundImage: login == 1 + ? (userInfoController.model.user!.avatar == null || + userInfoController.model.user!.avatar!.isEmpty + ? const AssetImage( + "assets/images/default_avatar.png", + ) + : NetworkImage( + userInfoController.model.user!.avatar!, + )) + : const AssetImage( + "assets/images/default_avatar.png", + ), + ), + SizedBox(width: 23.rpx), // 左侧头像和文本之间的间距 + Text( + '未命名'.tr, + style: TextStyle(fontSize: 30.rpx, color: Colors.white), + ) + ], + ); + } +} + +class ScoreItem { + final String weekday; // 如“周四” + final String dateStr; // 如“07/03” + final int score; + final bool isToday; + + ScoreItem({ + required this.weekday, + required this.dateStr, + required this.score, + this.isToday = false, + }); +} + +class ScoreCard extends StatelessWidget { + final String selectedUser; + final List scoreList; + final ValueChanged? onUserChanged; + final VoidCallback? onChartPressed; + + const ScoreCard({ + super.key, + required this.selectedUser, + required this.scoreList, + this.onUserChanged, + this.onChartPressed, + }); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: const Color(0xff0F2B44), + borderRadius: BorderRadius.circular(16), + ), + padding: const EdgeInsets.all(12), + child: Column( + children: [ + // 顶部用户选择 + 图标按钮 + Row( + children: [ + DropdownButtonHideUnderline( + child: DropdownButton( + value: selectedUser, + borderRadius: BorderRadius.circular(12), + dropdownColor: const Color(0xff0F2B44), + iconEnabledColor: Colors.white, + style: const TextStyle(color: Colors.white), + items: ['Eason Chan', 'Jay Chou', 'G.E.M.'] + .map((user) => DropdownMenuItem( + value: user, + child: Text(user), + )) + .toList(), + onChanged: onUserChanged, + ), + ), + const Spacer(), + IconButton( + onPressed: onChartPressed, + icon: const Icon(Icons.bar_chart, color: Colors.white), + ), + ], + ), + const SizedBox(height: 12), + // 日期+分数 横向滚动展示 + SizedBox( + height: 70, + child: ListView.separated( + scrollDirection: Axis.horizontal, + itemCount: scoreList.length, + separatorBuilder: (_, __) => const SizedBox(width: 12), + itemBuilder: (context, index) { + final item = scoreList[index]; + final isToday = item.isToday; + + return Container( + padding: + const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: isToday + ? Colors.white.withOpacity(0.1) + : Colors.transparent, + borderRadius: BorderRadius.circular(12), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(item.weekday, + style: const TextStyle( + color: Colors.white70, fontSize: 12)), + Text(item.dateStr, + style: const TextStyle( + color: Colors.white54, fontSize: 10)), + const SizedBox(height: 4), + Text( + item.score.toString(), + style: TextStyle( + color: Colors.white, + fontWeight: + isToday ? FontWeight.bold : FontWeight.normal, + fontSize: 16, + ), + ), + ], + ), + ); + }, + ), + ) + ], + ), + ); + } +} diff --git a/lib/pages/mh_page/new_Home_page.dart b/lib/pages/mh_page/new_Home_page.dart deleted file mode 100644 index 4ac2df3..0000000 --- a/lib/pages/mh_page/new_Home_page.dart +++ /dev/null @@ -1,852 +0,0 @@ -import 'package:ef/ef.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:flutterflow_ui/flutterflow_ui.dart'; -import 'package:vbvs_app/common/util/FitTool.dart'; -import 'package:vbvs_app/common/util/MyUtils.dart'; - -import 'package:vbvs_app/component/tool/ClickableContainer.dart'; -import 'package:vbvs_app/controller/device/body_device_controller.dart'; -import 'package:vbvs_app/controller/main_bottom/global_controller.dart'; -import 'package:vbvs_app/controller/mh_controller/muser_info_controller.dart'; -import 'package:vbvs_app/pages/mh_page/FloatingSvgIcon.dart'; - -class NewHomePage extends StatefulWidget { - const NewHomePage({super.key}); - @override - State createState() => _NewHomePageState(); -} - -class _NewHomePageState extends State { - MUserInfoController userInfoController = Get.find(); - BodyDeviceController deviceController = Get.find(); - double borderRadius = 16.rpx; - - var formFieldController = FormFieldController(null); - - get gloablController => Get.find(); - - // get userInfoController => Get.find(); - - var sleepDays = [].obs; - - var sleep_mac = "".obs; - - Map scoreColor = { - "-1": "#d3d3d3", - "1": "#4e8408", - "2": "#7bbb33", - "3": "#e15b8d", - "4": "#ff0000", - }; - - Map scoreName = { - "-1": "暂无", - "1": "优秀", - "2": "良好", - "3": "合格", - "4": "注意", - }; - - @override - void initState() { - super.initState(); - } - - getWeekName(int i) { - String v = ""; - switch (i) { - case 1: - v = "周一"; - break; - case 2: - v = "周二"; - break; - case 3: - v = "周三"; - break; - case 4: - v = "周四"; - break; - case 5: - v = "周五"; - break; - case 6: - v = "周六"; - break; - case 7: - v = "周日"; - break; - } - return v; - } - - @override - Widget build(BuildContext context) { - int login = userInfoController.model.login!; - return GestureDetector( - onTap: () => FocusScope.of(context).unfocus(), - child: Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage('assets/images/new_background.png'), // 本地图片 - fit: BoxFit.fill, // 填满整个 Container - ), - ), - child: Scaffold( - backgroundColor: Colors.transparent, - appBar: AppBar( - iconTheme: - IconThemeData(color: themeController.currentColor.sc3), - backgroundColor: Colors.transparent, - automaticallyImplyLeading: false, - titleSpacing: 0, - title: Container( - height: 180.rpx, - child: Row( - children: [ - // 左侧头像 - SizedBox(width: 40.rpx), - CircleAvatar( - radius: 27.rpx, // 可根据需求调整 - backgroundImage: login == 1 - ? (userInfoController.model.user!.avatar == null || - userInfoController - .model.user!.avatar!.isEmpty - ? const AssetImage( - "assets/images/people_avatar.png", - ) - : NetworkImage( - userInfoController.model.user!.avatar!, - )) - : const AssetImage( - "assets/images/people_avatar.png", - ), - ), - SizedBox(width: 23.rpx), // 左侧头像和文本之间的间距 - Text( - 'Eason Chan', - style: TextStyle(fontSize: 30.rpx, color: Colors.white), - ), - - const Spacer(), // 左右分隔 - // Container( - // width: 61.rpx, - // height: 78.rpx, - // alignment: const Alignment(0, 0), - // child: Image.asset( - // "assets/images/xiaoe.png", - // fit: BoxFit.cover, - // ), - // ), - // SizedBox(width: 46.rpx), // icon 之间的间距 - - FloatingSvgIcon( - assetPath: 'assets/img/icon/xiaoe.svg', - width: 60.rpx, - height: 60.rpx, - onTap: () { - print("点击了小鹅图标"); - }, - ), - - SizedBox(width: 40.rpx), - ], - ), - )), - body: SafeArea( - child: Container( - width: MediaQuery.sizeOf(context).width, - height: MediaQuery.sizeOf(context).height * 1.123, - // decoration: BoxDecoration( - // color: AppColors.bg_color, - // image: DecorationImage( - // image: AssetImage("assets/images/background.png"), - // fit: BoxFit.cover, - // ), - // ), - decoration: BoxDecoration(), - child: SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Container( - padding: - EdgeInsets.fromLTRB(26.rpx, 10.rpx, 26.rpx, 40.rpx), - width: double.infinity, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 30.rpx), - child: Column( - children: [ - Padding( - padding: - EdgeInsets.fromLTRB(17.rpx, 30.rpx, 0, 0), - child: Row( - children: [ - Text('上海 22° 多云', - style: TextStyle( - fontSize: 26.rpx, - color: Colors.white)), - Icon(Icons.cloud, - size: 30.rpx, color: Colors.white), - ], - ), - ), - ], - ))), - Container( - padding: EdgeInsets.only(left: 30.rpx, right: 30.rpx), - child: Column( - children: [ - if (gloablController.model.deviceList.length > 0) - Container( - child: Column( - children: [ - Container( - width: MediaQuery.sizeOf(context).width, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: - BorderRadius.circular(borderRadius), - ), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: - EdgeInsetsDirectional.fromSTEB( - 30.rpx, - 16.rpx, - 16.rpx, - 8.rpx), - child: Container( - width: MediaQuery.sizeOf(context) - .width, - height: MediaQuery.sizeOf(context) - .height * - 0.065, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context) - .secondaryBackground, - ), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - ValueListenableBuilder( - valueListenable: - formFieldController, - builder: (c, a, s) => - FlutterFlowDropDown< - String>( - controller: - formFieldController, - options: gloablController - .model.JunheDevices - .map((d) => - "${d["mac"]}") - .toList(), - optionLabels: - gloablController - .model.JunheDevices - .map((d) { - var s = - d["name"] ?? d["mac"]; - if (s == null) { - return ""; - } else { - return "$s"; - } - }).toList(), - onChanged: (val) { - // print("$val"); - // if (val == null) { - // sleepDays.value = []; - // } else { - // getSleeps( - // formFieldController - // .value); - // } - // // sleep_mac.value = val!; - }, - width: 360.rpx, - height: 72.rpx, - maxHeight: 200.rpx, - textStyle: TextStyle( - fontSize: 28.rpx, - overflow: TextOverflow - .ellipsis), - hintText: '', - icon: Icon( - Icons - .keyboard_arrow_down_rounded, - color: - FlutterFlowTheme.of( - context) - .secondaryText, - size: 48.rpx, - ), - fillColor: stringToColor( - "#F3F5F6"), - elevation: 2, - borderColor: stringToColor( - "#F3F5F6"), - borderWidth: 2, - borderRadius: 18, - margin: - EdgeInsetsDirectional - .fromSTEB( - 32.rpx, - 8.rpx, - 32.rpx, - 8.rpx), - hidesUnderline: true, - isOverButton: false, - isSearchable: false, - isMultiSelect: false, - ), - ), - InkWell( - onTap: () { - // if (formFieldController - // .value != - // null) { - // Get.toNamed( - // "/sleepWebview", - // arguments: [ - // formFieldController - // .value - // ]); - // } - }, - child: Row( - mainAxisSize: - MainAxisSize.max, - children: [ - Text( - '睡眠报告', - style: FlutterFlowTheme - .of(context) - .bodyMedium - .override( - fontFamily: - 'Readex Pro', - letterSpacing: - 0, - fontSize: - 30.rpx), - ), - SizedBox( - width: 12.rpx, - ), - SvgPicture.asset( - "assets/images/table.svg", - width: 28.rpx, - height: 28.rpx), - SizedBox( - width: 20.rpx, - ), - ], - ), - ), - ], - ), - ), - ), - Container( - padding: EdgeInsets.only( - top: 0.rpx, - bottom: 20.rpx, - left: 16.rpx, - right: 16.rpx), - width: double.infinity, - decoration: BoxDecoration(), - child: Row( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - ...List.generate( - sleepDays.value.length, - (index) { - var day = sleepDays[index]; - return Expanded( - child: Container( - padding: EdgeInsets.only( - top: 10.rpx, - bottom: 20.rpx), - width: 100, - // decoration: BoxDecoration( - // color: index == 2 - // ? stringToColor("#F3F5F6") - // : Colors.white, - // borderRadius: - // BorderRadius.circular( - // borderRadius), - // ), - child: Column( - mainAxisSize: - MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment - .start, - crossAxisAlignment: - CrossAxisAlignment - .center, - children: [ - Text( - day['week'], - style: FlutterFlowTheme - .of(context) - .bodyMedium - .override( - fontFamily: - 'Readex Pro', - fontSize: - 30.rpx, - letterSpacing: - 0, - ), - ), - Text( - day['date'], - style: FlutterFlowTheme - .of(context) - .bodyMedium - .override( - fontFamily: - 'Readex Pro', - letterSpacing: - 0, - fontSize: - 24.rpx, - ), - ), - SizedBox( - height: 6.rpx, - ), - Column( - children: [ - Row( - mainAxisSize: - MainAxisSize - .max, - mainAxisAlignment: - MainAxisAlignment - .center, - children: [ - Text( - '${day['score'] ?? "-"}', - style: FlutterFlowTheme.of( - context) - .bodyMedium - .override( - fontFamily: - 'Readex Pro', - fontSize: - 48.rpx, - letterSpacing: - 0, - ), - ), - if (day['score'] != - null) - SizedBox( - width: - 2.rpx, - ), - if (day['score'] != - null) - Text( - '分', - style: FlutterFlowTheme.of( - context) - .bodyMedium - .override( - fontFamily: - 'Readex Pro', - letterSpacing: - 0, - fontSize: - 26.rpx, - ), - ), - ], - ), - Container( - width: 120.rpx, - height: 52.rpx, - decoration: - BoxDecoration( - color: stringToColor( - day['scoreColor'] ?? - "#f3f5f6"), - borderRadius: - BorderRadius - .circular( - 26.rpx), - shape: BoxShape - .rectangle, - ), - alignment: - Alignment - .center, - child: Text( - '${day['scoreType'] ?? "暂无"}', - style: FlutterFlowTheme.of( - context) - .bodyMedium - .override( - fontFamily: - 'Readex Pro', - color: day['scoreType'] != - null - ? Colors - .white - : stringToColor( - "#ced1d7"), - letterSpacing: - 0, - fontSize: - 28.rpx, - ), - ), - ) - ], - ) - ], - ), - ), - ); - }) - ], - ), - ), - ], - ), - ), - ...List.generate( - gloablController.model.deviceList.length, - (index) { - var device = gloablController - .model.deviceList[index]; - String rname = device['roomName']; - if (index != 0) { - String lrname = gloablController.model - .deviceList[index - 1]["roomName"]; - if (lrname == rname) { - rname = ""; - } - } - return Column(children: [ - Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 20.rpx, 20.rpx, 0, 0), - child: Container( - decoration: BoxDecoration(), - alignment: - AlignmentDirectional(-1, 0), - child: rname.isNotEmpty - ? Text( - "$rname", - style: FlutterFlowTheme.of( - context) - .bodyMedium - .override( - fontFamily: - 'Readex Pro', - color: Colors.white, - fontSize: 32.rpx, - letterSpacing: 0, - ), - ) - : SizedBox( - height: 10.rpx, - ), - ), - ), - // getDeviceList(context, device) - ]); - }), - Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 0, 40.rpx, 0, 100.rpx), - child: Container( - width: MediaQuery.sizeOf(context).width, - height: 84.rpx, - decoration: BoxDecoration(), - child: FFButtonWidget( - onPressed: () { - // print('Button pressed ...'); - // Get.toNamed("/homeDeviceType"); - }, - text: '添加新设备', - icon: Icon( - Icons.add, - size: 60.rpx, - ), - options: FFButtonOptions( - height: 80.rpx, - padding: - EdgeInsetsDirectional.fromSTEB( - 48.rpx, 0, 48.rpx, 0), - iconPadding: - EdgeInsetsDirectional.fromSTEB( - 0, 0, 0, 0), - color: stringToColor("#182B7C"), - textStyle: - FlutterFlowTheme.of(context) - .titleSmall - .override( - fontFamily: 'Readex Pro', - color: Colors.white, - letterSpacing: 0, - fontSize: 30.rpx), - elevation: 3, - borderSide: BorderSide( - color: Colors.transparent, - width: 1, - ), - borderRadius: BorderRadius.circular( - borderRadius), - ), - ), - ), - ), - ], - ), - ), - if (gloablController.model.deviceList.length == 0) - Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 0, 0, 0, 80.rpx), - child: Container( - width: MediaQuery.sizeOf(context).width, - padding: EdgeInsets.only( - top: 90.rpx, bottom: 80.rpx), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: - BorderRadius.circular(borderRadius), - ), - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - '检测到您当前暂无设备!', - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: 'Readex Pro', - color: Color(0xFF9EA4B7), - fontSize: 32.rpx, - letterSpacing: 0, - ), - ), - SizedBox( - height: - MediaQuery.sizeOf(context).height * - 0.037, - ), - Container( - width: MediaQuery.sizeOf(context).width * - 0.54, - height: 90.rpx, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context) - .secondaryBackground, - borderRadius: BorderRadius.circular(0), - ), - child: FFButtonWidget( - onPressed: () { - // print('Button pressed ...'); - Get.toNamed("/homeDeviceType"); - }, - text: '立即添加一台', - icon: Icon( - Icons.add, - color: FlutterFlowTheme.of(context) - .primaryText, - size: 60.rpx, - ), - options: FFButtonOptions( - iconPadding: - EdgeInsetsDirectional.fromSTEB( - 0, 0, 0, 0), - color: Colors.white, - textStyle: - FlutterFlowTheme.of(context) - .titleSmall - .override( - fontFamily: 'Readex Pro', - color: - FlutterFlowTheme.of( - context) - .primaryText, - letterSpacing: 0, - fontSize: 30.rpx), - elevation: 3, - borderSide: BorderSide( - color: Color(0xFFABB0C0), - width: 1, - ), - borderRadius: - BorderRadius.circular(45.rpx), - ), - ), - ), - ], - ), - ), - ), - ], - ), - ) - ], - ), - ), - ) - - // Padding( - // padding: EdgeInsets.symmetric(horizontal: 30.rpx), - // child: Column( - // children: [ - // Padding( - // padding: EdgeInsets.fromLTRB(17.rpx, 30.rpx, 0, 0), - // child: Row( - // children: [ - // Text('上海 22° 多云', - // style: TextStyle( - // fontSize: 26.rpx, color: Colors.white)), - // Icon(Icons.cloud, - // size: 30.rpx, color: Colors.white), - // ], - // ), - // ), - // ], - // )) - ), - ), - )); - } -} - -class ScoreItem { - final String weekday; // 如“周四” - final String dateStr; // 如“07/03” - final int score; - final bool isToday; - - ScoreItem({ - required this.weekday, - required this.dateStr, - required this.score, - this.isToday = false, - }); -} - -class ScoreCard extends StatelessWidget { - final String selectedUser; - final List scoreList; - final ValueChanged? onUserChanged; - final VoidCallback? onChartPressed; - - const ScoreCard({ - super.key, - required this.selectedUser, - required this.scoreList, - this.onUserChanged, - this.onChartPressed, - }); - - @override - Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - color: const Color(0xff0F2B44), - borderRadius: BorderRadius.circular(16), - ), - padding: const EdgeInsets.all(12), - child: Column( - children: [ - // 顶部用户选择 + 图标按钮 - Row( - children: [ - DropdownButtonHideUnderline( - child: DropdownButton( - value: selectedUser, - borderRadius: BorderRadius.circular(12), - dropdownColor: const Color(0xff0F2B44), - iconEnabledColor: Colors.white, - style: const TextStyle(color: Colors.white), - items: ['Eason Chan', 'Jay Chou', 'G.E.M.'] - .map((user) => DropdownMenuItem( - value: user, - child: Text(user), - )) - .toList(), - onChanged: onUserChanged, - ), - ), - const Spacer(), - IconButton( - onPressed: onChartPressed, - icon: const Icon(Icons.bar_chart, color: Colors.white), - ), - ], - ), - const SizedBox(height: 12), - // 日期+分数 横向滚动展示 - SizedBox( - height: 70, - child: ListView.separated( - scrollDirection: Axis.horizontal, - itemCount: scoreList.length, - separatorBuilder: (_, __) => const SizedBox(width: 12), - itemBuilder: (context, index) { - final item = scoreList[index]; - final isToday = item.isToday; - - return Container( - padding: - const EdgeInsets.symmetric(horizontal: 12, vertical: 6), - decoration: BoxDecoration( - color: isToday - ? Colors.white.withOpacity(0.1) - : Colors.transparent, - borderRadius: BorderRadius.circular(12), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text(item.weekday, - style: const TextStyle( - color: Colors.white70, fontSize: 12)), - Text(item.dateStr, - style: const TextStyle( - color: Colors.white54, fontSize: 10)), - const SizedBox(height: 4), - Text( - item.score.toString(), - style: TextStyle( - color: Colors.white, - fontWeight: - isToday ? FontWeight.bold : FontWeight.normal, - fontSize: 16, - ), - ), - ], - ), - ); - }, - ), - ) - ], - ), - ); - } -} diff --git a/lib/pages/mh_page/new_mine_page.dart b/lib/pages/mh_page/new_mine_page.dart index f7c5980..0e6f89f 100644 --- a/lib/pages/mh_page/new_mine_page.dart +++ b/lib/pages/mh_page/new_mine_page.dart @@ -2,13 +2,15 @@ import 'package:ef/ef.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:flutterflow_ui/flutterflow_ui.dart'; +import 'package:vbvs_app/common/color/appConstants.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; +import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/component/tool/ClickableContainer.dart'; import 'package:vbvs_app/controller/main_bottom/global_controller.dart'; -import 'package:vbvs_app/controller/mh_controller/muser_info_controller.dart'; import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; - -import 'package:vbvs_app/enum/LoginStatus.dart'; +import 'package:vbvs_app/controller/user_info_controller.dart'; +import 'dart:ui' as ui; class NewMinePage extends StatefulWidget { const NewMinePage({super.key}); @@ -19,7 +21,7 @@ class NewMinePage extends StatefulWidget { class _MinePageState extends State { GlobalController globalController = Get.find(); - MUserInfoController userInfoController = Get.find(); + UserInfoController userInfoController = Get.find(); ThemeController themeController = Get.find(); final GlobalKey _textKey = GlobalKey(); @@ -27,7 +29,18 @@ class _MinePageState extends State { @override void initState() { super.initState(); - _calculateTextHalfWidth('Eason Chan'); + + final login = userInfoController.model.login; + String text; + + if (login == 0) { + text = '未命名'.tr; + } else { + final nickname = userInfoController.model.user?.nick_name; + text = (nickname != null && nickname.isNotEmpty) ? nickname : '未命名'.tr; + } + + // _calculateTextHalfWidth(text); } void _calculateTextHalfWidth(String text) { @@ -40,14 +53,13 @@ class _MinePageState extends State { ); final textPainter = TextPainter( text: textSpan, - textDirection: TextDirection.ltr, + textDirection: ui.TextDirection.ltr, ); textPainter.layout(); // 计算文本宽度 setState(() { _textHalfWidth = textPainter.width / 2; }); } - @override Widget build(BuildContext context) { SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( @@ -102,20 +114,20 @@ class _MinePageState extends State { color: Colors.white, // color: Colors.white, ))), - ClickableContainer( - backgroundColor: Colors.transparent, - highlightColor: Colors.transparent, - padding: EdgeInsets.only(right: 11.rpx), - onTap: () { + // ClickableContainer( + // backgroundColor: Colors.transparent, + // highlightColor: Colors.transparent, + // padding: EdgeInsets.only(right: 11.rpx), + // onTap: () { - }, - child: Container( - height: 42.rpx, - width: 42.rpx, - child: SvgPicture.asset( - 'assets/img/icon/people_info.svg', - color: Colors.white, - ))), + // }, + // child: Container( + // height: 42.rpx, + // width: 42.rpx, + // child: SvgPicture.asset( + // 'assets/img/icon/people_info.svg', + // color: Colors.white, + // ))), ], ), body: SafeArea( @@ -160,32 +172,9 @@ class _MinePageState extends State { child: Stack( alignment: Alignment.center, // 使子组件在Stack中居中 children: [ - Container( - // width: 194.rpx, - height: 63.rpx, - child: Column( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - crossAxisAlignment: - CrossAxisAlignment.center, // 文字水平居中 - children: [ - Text( - 'Eason Chan', - style: TextStyle( - fontSize: 30.rpx, - color: Colors.white, - height: 1), - ), - Text( - '135****2598', - style: TextStyle( - fontSize: 26.rpx, - color: const Color(0XFF929699), - height: 1), - ), - ], - ), - ), + Obx(() { + return getUserInfo(userInfoController); + }), Positioned( left: MediaQuery.of(context).size.width / 2 + _textHalfWidth + @@ -195,8 +184,25 @@ class _MinePageState extends State { backgroundColor: Colors.transparent, highlightColor: const Color(0xFF055466), padding: EdgeInsets.zero, - onTap: () { - Get.toNamed("/editUserInfoPage"); + onTap: () async { + await Get.toNamed("/editUserInfoPage"); + await userInfoController.getUserInfo(); + userInfoController.updateAll(); + final login = + userInfoController.model.login; + String text; + + if (login == 0) { + text = '未命名'.tr; + } else { + final nickname = userInfoController + .model.user?.nick_name; + text = (nickname != null && + nickname.isNotEmpty) + ? nickname + : '未命名'.tr; + } + _calculateTextHalfWidth(text); }, child: Container( width: 42.rpx, @@ -210,6 +216,7 @@ class _MinePageState extends State { ), )), ), + ], ), ), @@ -412,4 +419,45 @@ class _MinePageState extends State { ), ); } + + Widget getUserInfo(UserInfoController userInfoController) { + int login = userInfoController.model.login!; + return Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + login == 1 + ? (userInfoController.model.user!.nick_name ?? '未命名'.tr) + : "未命名".tr, + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Inter', + color: themeController.currentColor.sc3, + fontSize: AppConstants().title_text_fontSize, + letterSpacing: 0.0, + ), + ), + Text( + login == 1 + ? (() { + final user = userInfoController.model.user!; + if (user.email != null && user.email!.isNotEmpty) { + return user.email!; + } else if (user.phone != null && user.phone!.isNotEmpty) { + return MyUtils.hidePhoneNumber(user.phone!); + } else { + return "微信用户".tr; + } + })() + : "未知数据".tr, + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Inter', + color: themeController.currentColor.sc4, + fontSize: AppConstants().normal_text_fontSize, + letterSpacing: 0.0, + ), + ), + ].divide(SizedBox(height: 20.rpx)), + ); + } } diff --git a/lib/pages/mh_page/new_settingPage.dart b/lib/pages/mh_page/new_settingPage.dart index 6cc770d..fc72277 100644 --- a/lib/pages/mh_page/new_settingPage.dart +++ b/lib/pages/mh_page/new_settingPage.dart @@ -3,12 +3,15 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:flutterflow_ui/flutterflow_ui.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/FitTool.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/component/tool/ClickableContainer.dart'; import 'package:vbvs_app/component/tool/CustomCard.dart'; import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; import 'package:vbvs_app/controller/mh_controller/mh_language_controller.dart'; +import 'package:vbvs_app/controller/user_info_controller.dart'; +import 'package:vbvs_app/model/api_response.dart'; class SettingPage extends StatefulWidget { @override @@ -17,6 +20,7 @@ class SettingPage extends StatefulWidget { class _SettingPageState extends State { MHLanguageController languageController = Get.find(); + UserInfoController userInfoController = Get.find(); @override void initState() { languageController.initLanuageList(); @@ -454,21 +458,20 @@ class _SettingPageState extends State { child: CustomCard( borderRadius: 16.rpx, - // 圆角半径 onTap: () { - // ApiResponse apiResponse = - // userInfoController.logOut(); - // TopSlideNotification.show( - // context, - // text: apiResponse.msg!, - // textColor: - // apiResponse.code == HttpStatusCodes.ok - // ? themeController.currentColor.sc2 - // : themeController.currentColor.sc9, - // ); - // if (apiResponse.code == HttpStatusCodes.ok) { - // Get.offAllNamed("/mianPageBottomChange"); - // } + ApiResponse apiResponse = + userInfoController.logOut(); + TopSlideNotification.show( + context, + text: apiResponse.msg!, + textColor: + apiResponse.code == HttpStatusCodes.ok + ? themeController.currentColor.sc2 + : themeController.currentColor.sc9, + ); + if (apiResponse.code == HttpStatusCodes.ok) { + Get.offAllNamed("/mianPageBottomChange"); + } }, colors: [ Color(0XFF84F5FF), diff --git a/lib/pages/mh_page/user/controller/mht_login_controller.dart b/lib/pages/mh_page/user/controller/mht_login_controller.dart index 5d06e25..ca98b11 100644 --- a/lib/pages/mh_page/user/controller/mht_login_controller.dart +++ b/lib/pages/mh_page/user/controller/mht_login_controller.dart @@ -1,10 +1,17 @@ +import 'package:EasyDartModule/EasyDartModule.dart'; 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:json_annotation/json_annotation.dart'; +import 'package:vbvs_app/common/color/ServiceConstant.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; +import 'package:vbvs_app/common/util/requestWithLog.dart'; import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; +import 'package:vbvs_app/controller/time/countdown_controller.dart'; +import 'package:vbvs_app/controller/user_info_controller.dart'; +import 'package:vbvs_app/model/user_data.dart'; import 'package:vbvs_app/pages/mh_page/user/controller/mht_register_controller.dart'; part 'mht_login_controller.g.dart'; @@ -16,7 +23,7 @@ class LoginModel { String? account = '17649984946'; //账户 // String? account = '13953240733'; //账户 - String? password = 'wyf123,.'; //密码 + String? password = 'wyf123..'; //密码 // String? account = '15255134931'; //账户 // String? password = 'mht123,.'; //密码 @@ -120,6 +127,39 @@ class MHTLoginController extends GetControllerEx { showToast(message); return message; } + var data = { + "type": model.loginStyle == 1 ? 3 : 2, + "userName": model.account, + "password": model.password, + }; + String serviceAddress = ServiceConstant.service_address; + String serviceName = ServiceConstant.server_service; + String serviceApi = ServiceConstant.login; + String queryUrl = "${serviceAddress}${serviceName}${serviceApi}"; + await requestWithLog( + logTitle: "用户登录", + method: MyHttpMethod.post, + queryUrl: queryUrl, + data: data, + onSuccess: (res) { + res.rawResponse; + CountdownController countdownController = Get.find(); + countdownController.countdown.value = 0; + UserInfoController userInfoController = Get.find(); + userInfoController.model.login = 1; + userInfoController.model.user = UserModel.fromJson(res.data); + String token = res.rawResponse.headers['token']!.first; + EasyDartModule.dio.token = token; + final box = GetStorage(); + box.write('token', token); // 存储 token + box.write('user', userInfoController.model.user!.toJson()); // 存储用户信息 + }, + onFailure: (res) { + message = res.msg!; + TopSlideNotification.show(context, + text: message, textColor: themeController.currentColor.sc9); + }, + ); model.forceLogin = 0; return message; } @@ -141,7 +181,7 @@ class MHTLoginController extends GetControllerEx { message = '请输入正确的手机号'.tr; showToast(message); return message; - } + } return ''; } diff --git a/lib/pages/mh_page/user/controller/mht_register_controller.dart b/lib/pages/mh_page/user/controller/mht_register_controller.dart index 80afc23..811c5a8 100644 --- a/lib/pages/mh_page/user/controller/mht_register_controller.dart +++ b/lib/pages/mh_page/user/controller/mht_register_controller.dart @@ -1,7 +1,9 @@ import 'package:ef/ef.dart'; import 'package:flutter/src/widgets/framework.dart'; import 'package:json_annotation/json_annotation.dart'; +import 'package:vbvs_app/common/color/ServiceConstant.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; +import 'package:vbvs_app/common/util/requestWithLog.dart'; import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; part 'mht_register_controller.g.dart'; @@ -102,14 +104,31 @@ class MHTRegisterController extends GetControllerEx { text: message, textColor: stringToColor("#FF7159")); return message; } - // message = await repository.createUser( - // model.register_pd!, model.register_phone!, model.register_code!); - // if (message.isNotEmpty) { - // showToast(message); - // return message; - // } - - return ""; + String serviceAddress = ServiceConstant.service_address; + String serviceName = ServiceConstant.server_service; + String serviceApi = ServiceConstant.user_register; + String queryUrl = "${serviceAddress}${serviceName}${serviceApi}"; + var data = { + "type": 1, + "userName": model.register_phone!, + "password": model.register_pd!, + "verify": model.register_code! + }; + await requestWithLog( + logTitle: "用户注册", + method: MyHttpMethod.post, + queryUrl: queryUrl, + data: data, + onSuccess: (res) { + TopSlideNotification.show(context, text: "注册成功".tr); + }, + onFailure: (res) { + message = res.msg!; + TopSlideNotification.show(context, + text: message, textColor: themeController.currentColor.sc9); + }, + ); + return message; } Future getCode(BuildContext context) async { @@ -125,7 +144,32 @@ class MHTRegisterController extends GetControllerEx { TopSlideNotification.show(context, text: message, textColor: stringToColor("#FF7159")); return message; - } - return ''; + } + String serviceAddress = ServiceConstant.service_address; + String serviceName = ServiceConstant.server_service; + String serviceApi = ServiceConstant.send_code; + String queryUrl = "${serviceAddress}${serviceName}${serviceApi}"; + var data = { + "userName": model.register_phone!, + 'type':4, + }; + await requestWithLog( + logTitle: "获取验证码", + method: MyHttpMethod.post, + queryUrl: queryUrl, + data: data, + onSuccess: (res) { + TopSlideNotification.show(context, text: '发送验证码成功'.tr); + }, + onFailure: (res) { + message = res.msg!; + TopSlideNotification.show( + context, + text: message.tr, + textColor: themeController.currentColor.sc9, + ); + }, + ); + return message; } } diff --git a/lib/pages/mh_page/user/page/edit_userinfo_page.dart b/lib/pages/mh_page/user/page/edit_userinfo_page.dart new file mode 100644 index 0000000..c416515 --- /dev/null +++ b/lib/pages/mh_page/user/page/edit_userinfo_page.dart @@ -0,0 +1,369 @@ +import 'dart:io'; + +import 'package:EasyDartModule/EasyDartModule.dart' as edm; +import 'package:ef/ef.dart'; +import 'package:flutter/material.dart'; +import 'package:flutterflow_ui/flutterflow_ui.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/FitTool.dart'; +import 'package:vbvs_app/common/util/MyUtils.dart'; +import 'package:vbvs_app/component/tool/ClickableContainer.dart'; +import 'package:vbvs_app/component/tool/CustomCard.dart'; +import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; +import 'package:vbvs_app/controller/device/blueteeth_bind_controller.dart'; +import 'package:vbvs_app/controller/main_bottom/global_controller.dart'; +import 'package:vbvs_app/controller/person/person_controller.dart'; +import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; +import 'package:vbvs_app/controller/user_info_controller.dart'; +import 'package:vbvs_app/model/api_response.dart'; + +class EditUserPage extends StatefulWidget { + EditUserPage({super.key}); + + @override + State createState() => _UpdateUserPageState(); +} + +class _UpdateUserPageState extends State { + GlobalController globalController = Get.find(); + UserInfoController userInfoController = Get.find(); + BlueteethBindController blueteethBindController = Get.find(); + PersonController personController = Get.find(); + ThemeController themeController = Get.find(); + + @override + void initState() { + super.initState(); + userInfoController.model.user!.tmpHead = null; + userInfoController.model.user!.tmpNickName = null; + userInfoController.model.user!.tmpHead = + userInfoController.model.user!.avatar; + userInfoController.model.user!.tmpNickName = + userInfoController.model.user!.nick_name; + } + + @override + Widget build(BuildContext context) { + int login = userInfoController.model.login!; + return LayoutBuilder( + builder: (context, bodySize) => GestureDetector( + onTap: () => FocusScope.of(context).unfocus(), + child: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/images/new_background.png'), + fit: BoxFit.fill, + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: AppBar( + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + iconTheme: IconThemeData( + color: themeController.currentColor.sc3, + ), + titleSpacing: 0, + title: Container( + width: double.infinity, + height: 180.rpx, + child: Stack( + alignment: Alignment.center, + children: [ + Text( + '编辑资料'.tr, + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Readex Pro', + color: themeController.currentColor.sc3, + letterSpacing: 0, + fontSize: 30.rpx, + ), + ), + Positioned( + left: 0, + child: returnIconButtom, + ), + Positioned( + right: 20.rpx, + child: CustomCard( + borderRadius: 10.rpx, + onTap: () async { + ApiResponse apiResponse = + await userInfoController.updateData(); + TopSlideNotification.show( + context, + text: apiResponse.msg!, + textColor: apiResponse.code == HttpStatusCodes.ok + ? themeController.currentColor.sc2 + : themeController.currentColor.sc9, + ); + if (apiResponse.code == HttpStatusCodes.ok) { + userInfoController.model.user!.tmpHead = null; + userInfoController.model.user!.tmpNickName = null; + await userInfoController.getUserInfo(); + userInfoController.updateAll(); + Get.back(); + } + }, + colors: [ + stringToColor("FCFCFC"), + stringToColor("CEECE3"), + ], + gradientDirection: GradientDirection.vertical, + child: Container( + width: 100.rpx, + height: 60.rpx, + alignment: Alignment.center, + padding: EdgeInsetsDirectional.fromSTEB( + 16.rpx, 0.rpx, 16.rpx, 0.rpx), + child: Text( + '保存'.tr, + style: TextStyle( + fontFamily: 'Inter Tight', + color: stringToColor("#011D33"), + letterSpacing: 0.0, + fontSize: AppConstants().normal_text_fontSize), + ), + ), + ), + ), + ], + ), + ), + actions: [], + centerTitle: false, + ), + body: SafeArea( + top: true, + child: Container( + width: double.infinity, + height: double.infinity, + decoration: BoxDecoration(), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 60.rpx, 0.rpx, 60.rpx, 0.rpx), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.rpx, 76.rpx, 0.rpx, 0.rpx), + child: Container( + width: MediaQuery.sizeOf(context).width * 0.213, + height: MediaQuery.sizeOf(context).height * 0.098, + constraints: BoxConstraints( + minWidth: 160.rpx, + minHeight: 160.rpx, + ), + decoration: BoxDecoration(), + child: Obx(() { + return getImageWidget(context); + })), + ), + ClickableContainer( + backgroundColor: Colors.transparent, + highlightColor: themeController.currentColor.sc2, + padding: EdgeInsetsDirectional.fromSTEB( + 0.rpx, 44.rpx, 0.rpx, 44.rpx), + borderRadius: 0, + onTap: () async { + edm.EasyDartModule.logger + .info("${userInfoController.model.user!}点击上传头像"); + DailyLogUtils.writeLog( + "${userInfoController.model.user!}点击上传头像"); + ApiResponse apiResponse = + await userInfoController.uploadImg(); + TopSlideNotification.show( + context, + text: apiResponse.msg!, + textColor: apiResponse.code == HttpStatusCodes.ok + ? themeController.currentColor.sc2 + : themeController.currentColor.sc9, + ); + }, + child: Center( + child: Text( + '点击更换头像'.tr, + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: 'Inter', + fontSize: 26.rpx, + letterSpacing: 0.0, + color: stringToColor("#85F5FF"), + ), + ), + ), + ), + Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.rpx, 79.rpx, 0.rpx, 0.rpx), + child: Container( + width: double.infinity, + decoration: BoxDecoration( + border: Border( + top: BorderSide( + color: themeController.currentColor.sc4 + .withOpacity(0.5), + width: AppConstants().border_width, + ), + bottom: BorderSide( + color: themeController.currentColor.sc4 + .withOpacity(0.5), + width: AppConstants().border_width, + ), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: Container( + width: 100.rpx, + height: 100.rpx, + decoration: BoxDecoration(), + child: Align( + alignment: AlignmentDirectional(0, 0), + child: TextFormField( + initialValue: userInfoController + .model.user!.nick_name, + onChanged: (value) { + userInfoController.model.user! + .tmpNickName = value; + }, + autofocus: false, + obscureText: false, + decoration: InputDecoration( + isDense: true, + labelStyle: + FlutterFlowTheme.of(context) + .labelMedium + .override( + fontFamily: 'Inter', + fontSize: 26.rpx, + letterSpacing: 0.0, + ), + hintText: '未命名'.tr, + hintStyle: + FlutterFlowTheme.of(context) + .labelMedium + .override( + fontFamily: 'Inter', + fontSize: 26.rpx, + letterSpacing: 0.0, + color: themeController + .currentColor.sc4, + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: Color(0x00000000), + width: 1.rpx, + ), + borderRadius: + BorderRadius.circular( + 8.rpx), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: Color(0x00000000), + width: 1.rpx, + ), + borderRadius: + BorderRadius.circular( + 8.rpx), + ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 1.rpx, + ), + borderRadius: + BorderRadius.circular( + 8.rpx), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 1.rpx, + ), + borderRadius: + BorderRadius.circular( + 8.rpx), + ), + filled: false, + ), + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: 'Inter', + fontSize: 26.rpx, + letterSpacing: 0.0, + color: themeController + .currentColor.sc3, + ), + textAlign: TextAlign.center, + cursorColor: themeController + .currentColor.sc3, + ), + ), + ), + ), + ].divide(SizedBox(width: 27.rpx)), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + ), + ), + ), + ); + } + + Widget getImageWidget(BuildContext context) { + try { + UserInfoController controller = Get.find(); + var head = controller.model.user!.tmpHead; + return Container( + width: 200.rpx, + height: 200.rpx, + child: Container( + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + shape: BoxShape.circle, + ), + child: head == null || head.isEmpty + ? Image.asset( + 'assets/img/avatar.png', + fit: BoxFit.cover, + ) + : Image.network( + head, + fit: BoxFit.cover, + ), + ), + ); + } catch (e) { + print(e); + } + return Container(); + } +} diff --git a/lib/pages/mh_page/user/page/mht_login_page.dart b/lib/pages/mh_page/user/page/mht_login_page.dart index 75dbcec..973583f 100644 --- a/lib/pages/mh_page/user/page/mht_login_page.dart +++ b/lib/pages/mh_page/user/page/mht_login_page.dart @@ -6,6 +6,7 @@ import 'package:flutter/services.dart'; import 'package:flutterflow_ui/flutterflow_ui.dart'; import 'package:fluwx/fluwx.dart'; import 'package:get_storage/get_storage.dart'; +import 'package:path/path.dart'; import 'package:vbvs_app/common/color/appConstants.dart'; import 'package:vbvs_app/common/color/appFontsize.dart'; import 'package:vbvs_app/common/util/CheckNetwork.dart'; @@ -13,6 +14,7 @@ import 'package:vbvs_app/common/util/CommonVariables.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/component/tool/CustomCard.dart'; +import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; import 'package:vbvs_app/controller/time/countdown_controller.dart'; import 'package:vbvs_app/pages/mh_page/user/controller/mht_login_controller.dart'; import 'package:vbvs_app/pages/mh_page/user/controller/mht_register_controller.dart'; @@ -84,7 +86,9 @@ class MHTLoginPage extends GetView { //首次未注册的用户引导去手机号填写页面 //已注册的用户直接跳转首页 if (CommonVariables.isNetWorkOn == false) { - showToast("网络未连接,请开启设备网络后重试"); + TopSlideNotification.show(Get.context!, + text: "网络未连接,请开启设备网络后重试".tr, + textColor: themeController.currentColor.sc9); return; } String msg = await controller.loginByWechatCode(code); @@ -98,9 +102,11 @@ class MHTLoginPage extends GetView { // TODO 操作全部跳转页面前成功以后移除监听,防止重复监听,其他方式登录成功也需要移出监听 // fluwxCancelable?.cancel(); } else if (errCode == -4) { - showToast("用户拒绝授权"); + TopSlideNotification.show(Get.context!, + text: "用户拒绝授权".tr, textColor: themeController.currentColor.sc9); } else if (errCode == -2) { - showToast("用户取消授权"); + TopSlideNotification.show(Get.context!, + text: "用户取消授权".tr, textColor: themeController.currentColor.sc9); } } }); @@ -907,8 +913,15 @@ class MHTLoginPage extends GetView { if (CommonVariables .isNetWorkOn == false) { - showToast( - "网络未连接,请开启设备网络后重试"); + TopSlideNotification.show( + context, + text: + "网络未连接,请开启设备网络后重试" + .tr, + textColor: + themeController + .currentColor + .sc9); return; } String msg = @@ -935,7 +948,8 @@ class MHTLoginPage extends GetView { .value == 0 ? '获取验证码' - : '${countdownController.countdown.value}' + '秒'.tr, + : '${countdownController.countdown.value}' + + '秒'.tr, style: TextStyle( fontFamily: 'Readex Pro', @@ -1191,8 +1205,15 @@ class MHTLoginPage extends GetView { if (CommonVariables .isNetWorkOn == false) { - showToast( - "网络未连接,请开启设备网络后重试"); + TopSlideNotification.show( + context, + text: + "网络未连接,请开启设备网络后重试" + .tr, + textColor: + themeController + .currentColor + .sc9); return; } String msg = @@ -1218,7 +1239,8 @@ class MHTLoginPage extends GetView { .value == 0 ? '获取验证码' - : '${countdownController.countdown.value}' + '秒'.tr, + : '${countdownController.countdown.value}' + + '秒'.tr, style: TextStyle( fontFamily: 'Readex Pro', @@ -1254,7 +1276,10 @@ class MHTLoginPage extends GetView { onTap: () async { if (CommonVariables.isNetWorkOn == false) { - showToast("网络未连接,请开启设备网络后重试"); + TopSlideNotification.show(context, + text: "网络未连接,请开启设备网络后重试".tr, + textColor: themeController + .currentColor.sc9); return; } String msg = @@ -1286,8 +1311,6 @@ class MHTLoginPage extends GetView { Get.offAndToNamed( "/mianPageBottomChange"); - } else { - showToast(msg); } }, colors: [ @@ -2142,7 +2165,10 @@ class MHTLoginPage extends GetView { if (_lastBackPressedTime == null || currentTime.difference(_lastBackPressedTime!) > Duration(seconds: 2)) { _lastBackPressedTime = currentTime; - showToast("再按一次退出程序", color: color_warning, closeTime: 2); + TopSlideNotification.show( + context, + text: "再按一次退出程序".tr, + ); return false; // 阻止退出程序 } else { return true; // 允许退出程序 diff --git a/lib/pages/mh_page/user/page/register_page.dart b/lib/pages/mh_page/user/page/register_page.dart index 5e753d0..cacb32a 100644 --- a/lib/pages/mh_page/user/page/register_page.dart +++ b/lib/pages/mh_page/user/page/register_page.dart @@ -1,13 +1,16 @@ import 'package:ef/ef.dart'; import 'package:flutter/material.dart'; +import 'package:vbvs_app/common/color/appConstants.dart'; +import 'package:vbvs_app/common/util/CommonVariables.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/component/tool/CustomCard.dart'; -import 'package:vbvs_app/controller/mh_controller/register_controller.dart'; +import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; import 'package:vbvs_app/controller/time/countdown_controller.dart'; import 'package:vbvs_app/pages/common/selectDialog.dart'; +import 'package:vbvs_app/pages/mh_page/user/controller/mht_register_controller.dart'; -class RegisterPage extends GetView { +class RegisterPage extends GetView { final scaffoldKey = GlobalKey(); BoxConstraints? bodysize; @@ -16,7 +19,6 @@ class RegisterPage extends GetView { RegisterPage() { controller.model.pdshow = true; controller.model.cpdshow = true; - Get.put(RegisterController()); } @override @@ -442,33 +444,34 @@ class RegisterPage extends GetView { CountdownController>(); return InkWell( onTap: () async { - // if (countdownController - // .countdown.value != - // 0) { - // return; - // } - // if (CommonVariables - // .isNetWorkOn == - // false) { - // showToast( - // "网络未连接,请开启设备网络后重试"); - // return; - // } - // String msg = - // await controller - // .getCode(context); - // if (msg.isNotEmpty) { - // return; - // } - // countdownController - // .countdown - // .value == - // 0 - // ? countdownController - // .startCountdown( - // AppConstants - // .code_time) - // : null; + if (countdownController + .countdown.value != + 0) { + return; + } + if (CommonVariables + .isNetWorkOn == + false) { + showToast( + "网络未连接,请开启设备网络后重试" + .tr); + return; + } + String msg = + await controller + .getCode(context); + if (msg.isNotEmpty) { + return; + } + countdownController + .countdown + .value == + 0 + ? countdownController + .startCountdown( + AppConstants + .code_time) + : null; }, child: Text( countdownController @@ -741,17 +744,20 @@ class RegisterPage extends GetView { borderRadius: 16.rpx, gradientDirection: GradientDirection.vertical, - onTap: () { - // if (CommonVariables.isNetWorkOn == - // false) { - // showToast("网络未连接,请开启设备网络后重试"); - // return; - // } - // String msg = await controller - // .registerUser(context); - // if (msg == null || msg.isEmpty) { - // Get.toNamed("/loginPage"); - // } + onTap: () async { + if (CommonVariables.isNetWorkOn == + false) { + TopSlideNotification.show(context, + text: "网络未连接,请开启设备网络后重试".tr, + textColor: themeController + .currentColor.sc9); + return; + } + String msg = await controller + .registerUser(context); + if (msg == null || msg.isEmpty) { + Get.toNamed("/loginPage"); + } }, colors: const [ Color(0xFFFCFCFC), @@ -769,7 +775,7 @@ class RegisterPage extends GetView { BorderRadius.circular(16.rpx), ), child: Text( - "提交", + "提交".tr, style: FlutterFlowTheme.of(context) .bodyMedium .override( diff --git a/lib/routers/mh_routers.dart b/lib/routers/mh_routers.dart index 70f7f3d..f8d4db9 100644 --- a/lib/routers/mh_routers.dart +++ b/lib/routers/mh_routers.dart @@ -1,7 +1,7 @@ import 'package:ef/ef.dart'; import 'package:flutter/cupertino.dart'; -import 'package:vbvs_app/controller/mh_controller/muser_info_controller.dart'; import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; +import 'package:vbvs_app/controller/user_info_controller.dart'; import 'package:vbvs_app/pages/main_bottom/component/main_page_b_bottom_change.dart'; import 'package:vbvs_app/pages/mh_page/HomeDeviceType.dart'; import 'package:vbvs_app/pages/mh_page/LanguagePage.dart'; @@ -11,7 +11,7 @@ import 'package:vbvs_app/pages/mh_page/book_info_page.dart'; import 'package:vbvs_app/pages/mh_page/book_success_page.dart'; import 'package:vbvs_app/pages/mh_page/device_people_info.dart'; import 'package:vbvs_app/pages/mh_page/edit_bed.dart'; -import 'package:vbvs_app/pages/mh_page/edit_userinfo_page.dart'; +import 'package:vbvs_app/pages/mh_page/user/page/edit_userinfo_page.dart'; import 'package:vbvs_app/pages/mh_page/experience_store_page.dart'; import 'package:vbvs_app/pages/mh_page/issue_list_page.dart'; import 'package:vbvs_app/pages/mh_page/my_experience_page.dart'; @@ -35,7 +35,7 @@ ThemeController themeController = Get.find(); var mhroutes = { "/mianPageBottomChange": (contxt) => MainPageBBottomChange(), "/homeDeviceType": (contxt) => HomeDeviceType(), - "/editUserInfoPage": (contxt) => EditUserInfoPage(), + "/editUserInfoPage": (contxt) => EditUserPage(), "/peopleInfoPage": (contxt) => PeopleInfoPage(), "/repairHistoryListPage": (contxt) => RepairHistoryListPage(), "/deviceRepairPage": (contxt) => DeviceRepairPage(), @@ -66,7 +66,7 @@ var mhonGenerateRoute = (RouteSettings settings) { final Function? pageContentBuilder = mhroutes[name]; // 根据路由名称获取对应的页面构建器 if (pageContentBuilder != null) { - MUserInfoController userInfoController = Get.find(); + UserInfoController userInfoController = Get.find(); int loginStatus = userInfoController.model.login!; // 检查用户是否已登录,如果未登录且路由不是登录相关页面,跳转到登录页面 diff --git a/pubspec.yaml b/pubspec.yaml index f88e2cb..3b3b543 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -81,8 +81,10 @@ flutter: uses-material-design: true assets: - assets/langs/ + - assets/mhlangs/ - assets/images/ - assets/images/toast/ + - assets/images/icon/ - assets/img/ - assets/img/menu/ - assets/img/icon/