更新登录

This commit is contained in:
wyf
2025-06-09 15:31:18 +08:00
parent 71a4504f78
commit 8dfc522a69
31 changed files with 1737 additions and 1662 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,13 @@
<svg width="60.000000" height="60.000000" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<desc>
Created with Pixso.
</desc>
<defs/>
<g style="mix-blend-mode:normal"/>
<g style="mix-blend-mode:normal">
<line id="直线 218" x1="10.522461" y1="30.000000" x2="49.478516" y2="30.000000" stroke="#85F5FF" stroke-opacity="1.000000" stroke-width="2.000000"/>
</g>
<g style="mix-blend-mode:normal">
<line id="直线 219" x1="30.000000" y1="10.521484" x2="30.000000" y2="49.477539" stroke="#85F5FF" stroke-opacity="1.000000" stroke-width="2.000000"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 633 B

View File

@@ -37,7 +37,24 @@
"注:首次登录会自动创建账号":"注:首次登录会自动创建账号",
"请输入新密码":"请输入新密码",
"确认新密码":"确认新密码",
"秒":"秒"
"秒":"秒",
"添加一台新设备":"添加一台新设备",
"添加新设备":"添加新设备",
"网络未连接,请开启设备网络后重试":"网络未连接,请开启设备网络后重试",
"提交":"提交",
"发送验证码成功":"发送验证码成功",
"注册成功":"注册成功",
"再按一次退出程序":"注再按一次退出程序册成功",
"用户拒绝授权":"用户拒绝授权",
"用户取消授权":"用户取消授权",
"未命名":"未命名",
"编辑资料":"编辑资料",
"保存":"保存",
"点击更换头像":"点击更换头像",
"保存失败":"保存失败",
"昵称为空":"昵称为空",
"保存成功":"保存成功"

View File

@@ -0,0 +1,6 @@
import 'package:flutter/material.dart';
class AppGlobal {
static final GlobalKey<NavigatorState> navigatorKey =
GlobalKey<NavigatorState>();
}

View File

@@ -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";//用户注册
}

View File

@@ -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<TopSlideNotification>
_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();
});
}
}

View File

@@ -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 = {}; //之前控制的设备

View File

@@ -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<AddressModel> {
addAddress(AddressModel model) async {
try {
final MUserInfoController userInfoController =
Get.find<MUserInfoController>();
final UserInfoController userInfoController =
Get.find<UserInfoController>();
UserModel user = userInfoController.model.user!;
// 设置省市区街道名称

View File

@@ -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()

View File

@@ -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<String, dynamic> json) =>
_$MUserInfoModelFromJson(json);
Map<String, dynamic> toJson() => _$MUserInfoModelToJson(this);
}
class MUserInfoController extends GetControllerEx<MUserInfoModel> {
// 初始化实例
final Fluwx fluwx = Fluwx();
MUserInfoController() {
attr = GetModel(MUserInfoModel()).obs;
}
List device_bind_status = [];
int device_bind_flag = 0; //0。未初始化 1.已初始化
Future<ApiResponse> uploadImg() async {
EasyDartModule.logger.info("请求上传图片");
DailyLogUtils.writeLog("请求上传图片");
final ImagePicker picker = ImagePicker();
final XFile? image = await picker.pickImage(source: ImageSource.gallery);
try {
ApiResponse apiResponse = ApiResponse(code: -1, msg: "我的.头像上传失败".tr);
if (image != null) {
int fileSize = await image.length(); // 获取图片大小,单位为字节
if (fileSize > 1048576 * 5) {
apiResponse.msg = "我的.头像限制".tr;
return apiResponse;
}
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.upload_file;
String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
String? language = "";
if (languageController.selectLanguage != null) {
language = languageController.selectLanguage.value!.language_code;
}
if (language != null && language.isNotEmpty) {
if (queryUrl.contains("?")) {
queryUrl += "&lang=$language";
} else {
queryUrl += "?lang=$language";
}
}
var formData = dio.FormData.fromMap({
"type": 1,
"file": await dio.MultipartFile.fromFile(
image.path, // 确保 image 是 File 类型
filename: image.path.split('/').last,
),
});
var response = await EasyDartModule.dio.post(queryUrl, data: formData);
if (response != null) {
var responseData = response.data is String
? jsonDecode(response.data)
: response.data;
ApiResponse res =
ApiResponse.fromJson(responseData, (object) => object);
MyUtils.formatResponse(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<ApiResponse> 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<ApiResponse> getUserInfo() async {
EasyDartModule.logger.info("查询用户资料");
DailyLogUtils.writeLog("查询用户资料");
try {
ApiResponse apiResponse = ApiResponse(code: -1, msg: "我的.查询失败".tr);
String serviceAddress = ServiceConstant.service_address;
String serviceName = ServiceConstant.server_service;
String serviceApi = ServiceConstant.user_info;
String queryUrl = "${serviceAddress}${serviceName}${serviceApi}";
String? language = "";
if (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;
// }
}

View File

@@ -1,36 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'muser_info_controller.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
MUserInfoModel _$MUserInfoModelFromJson(Map<String, dynamic> json) =>
MUserInfoModel()
..message = (json['message'] as num?)?.toInt()
..user = json['user'] == null
? null
: UserModel.fromJson(json['user'] as Map<String, dynamic>)
..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<String, dynamic> _$MUserInfoModelToJson(MUserInfoModel instance) =>
<String, dynamic>{
'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,
};

View File

@@ -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<RegisterModel> {
attr = GetModel(RegisterModel()).obs;
}
// Future<String> registerUser(BuildContext context) async {
// String message = "";
// final MyDialogController myDialogController =
// Get.find<MyDialogController>();
// 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<String> 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<String> getCode(BuildContext context) async {
// String message = "";

View File

@@ -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<String, dynamic> json) =>
_$UserModelFromJson(json);
Map<String, dynamic> toJson() => _$UserModelToJson(this);
}

View File

@@ -1,32 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'user_data.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
UserModel _$UserModelFromJson(Map<String, dynamic> 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<String, dynamic> _$UserModelToJson(UserModel instance) => <String, dynamic>{
'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,
};

View File

@@ -126,10 +126,10 @@ class UserInfoController extends GetControllerEx<UserInfoModel> {
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<UserInfoModel> {
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);

View File

@@ -48,11 +48,22 @@ class AppLanguage extends Translations {
// }
// }
Future<void> loadLanguage(String languageCode) async {
Future<void> 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<String, dynamic> jsonMap = json.decode(jsonString);
// 扁平化 JSON 数据

View File

@@ -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<void> 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()),
]));
}

View File

@@ -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';

View File

@@ -253,6 +253,7 @@ class _MinePageState extends State<MinePage> {
letterSpacing: 0.0,
),
),
].divide(SizedBox(height: 20.rpx)),
),
].divide(SizedBox(width: 35.rpx)),

View File

@@ -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<MUserInfoController> {
final scaffoldKey = GlobalKey<ScaffoldState>();
@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();
}
}

View File

@@ -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<NewHomePage> createState() => _NewHomePageState();
}
class _NewHomePageState extends State<NewHomePage> {
UserInfoController userInfoController = Get.find();
BodyDeviceController deviceController = Get.find();
double borderRadius = 16.rpx;
var formFieldController = FormFieldController<String>(null);
GlobalController gloablController = Get.find();
WeatherModelController weatherModelController = Get.find();
// get userInfoController => Get.find<UserInfoController>();
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<String>((d) =>
"${d["mac"]}")
.toList(),
optionLabels:
gloablController.model
.JunheDevices
.map<String>((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<ScoreItem> scoreList;
final ValueChanged<String?>? 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<String>(
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,
),
),
],
),
);
},
),
)
],
),
);
}
}

View File

@@ -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<NewHomePage> createState() => _NewHomePageState();
}
class _NewHomePageState extends State<NewHomePage> {
MUserInfoController userInfoController = Get.find();
BodyDeviceController deviceController = Get.find();
double borderRadius = 16.rpx;
var formFieldController = FormFieldController<String>(null);
get gloablController => Get.find<GlobalController>();
// get userInfoController => Get.find<UserInfoController>();
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<String>((d) =>
"${d["mac"]}")
.toList(),
optionLabels:
gloablController
.model.JunheDevices
.map<String>((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<ScoreItem> scoreList;
final ValueChanged<String?>? 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<String>(
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,
),
),
],
),
);
},
),
)
],
),
);
}
}

View File

@@ -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<NewMinePage> {
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<NewMinePage> {
@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<NewMinePage> {
);
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<NewMinePage> {
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<NewMinePage> {
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<NewMinePage> {
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<NewMinePage> {
),
)),
),
],
),
),
@@ -412,4 +419,45 @@ class _MinePageState extends State<NewMinePage> {
),
);
}
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)),
);
}
}

View File

@@ -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<SettingPage> {
MHLanguageController languageController = Get.find();
UserInfoController userInfoController = Get.find();
@override
void initState() {
languageController.initLanuageList();
@@ -454,21 +458,20 @@ class _SettingPageState extends State<SettingPage> {
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),

View File

@@ -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<LoginModel> {
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<LoginModel> {
message = '请输入正确的手机号'.tr;
showToast(message);
return message;
}
}
return '';
}

View File

@@ -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<RegisterModel> {
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<String> getCode(BuildContext context) async {
@@ -125,7 +144,32 @@ class MHTRegisterController extends GetControllerEx<RegisterModel> {
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;
}
}

View File

@@ -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<EditUserPage> createState() => _UpdateUserPageState();
}
class _UpdateUserPageState extends State<EditUserPage> {
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();
}
}

View File

@@ -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<MHTLoginController> {
//首次未注册的用户引导去手机号填写页面
//已注册的用户直接跳转首页
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<MHTLoginController> {
// 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<MHTLoginController> {
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<MHTLoginController> {
.value ==
0
? '获取验证码'
: '${countdownController.countdown.value}' + ''.tr,
: '${countdownController.countdown.value}' +
''.tr,
style: TextStyle(
fontFamily:
'Readex Pro',
@@ -1191,8 +1205,15 @@ class MHTLoginPage extends GetView<MHTLoginController> {
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<MHTLoginController> {
.value ==
0
? '获取验证码'
: '${countdownController.countdown.value}' + ''.tr,
: '${countdownController.countdown.value}' +
''.tr,
style: TextStyle(
fontFamily:
'Readex Pro',
@@ -1254,7 +1276,10 @@ class MHTLoginPage extends GetView<MHTLoginController> {
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<MHTLoginController> {
Get.offAndToNamed(
"/mianPageBottomChange");
} else {
showToast(msg);
}
},
colors: [
@@ -2142,7 +2165,10 @@ class MHTLoginPage extends GetView<MHTLoginController> {
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; // 允许退出程序

View File

@@ -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<RegisterController> {
class RegisterPage extends GetView<MHTRegisterController> {
final scaffoldKey = GlobalKey<ScaffoldState>();
BoxConstraints? bodysize;
@@ -16,7 +19,6 @@ class RegisterPage extends GetView<RegisterController> {
RegisterPage() {
controller.model.pdshow = true;
controller.model.cpdshow = true;
Get.put(RegisterController());
}
@override
@@ -442,33 +444,34 @@ class RegisterPage extends GetView<RegisterController> {
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<RegisterController> {
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<RegisterController> {
BorderRadius.circular(16.rpx),
),
child: Text(
"提交",
"提交".tr,
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(

View File

@@ -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!;
// 检查用户是否已登录,如果未登录且路由不是登录相关页面,跳转到登录页面

View File

@@ -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/