更新登录
This commit is contained in:
BIN
assets/images/default_avatar.png
Normal file
BIN
assets/images/default_avatar.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
13
assets/images/icon/add.svg
Normal file
13
assets/images/icon/add.svg
Normal 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 |
@@ -37,7 +37,24 @@
|
||||
"注:首次登录会自动创建账号":"注:首次登录会自动创建账号",
|
||||
"请输入新密码":"请输入新密码",
|
||||
"确认新密码":"确认新密码",
|
||||
"秒":"秒"
|
||||
"秒":"秒",
|
||||
"添加一台新设备":"添加一台新设备",
|
||||
"添加新设备":"添加新设备",
|
||||
"网络未连接,请开启设备网络后重试":"网络未连接,请开启设备网络后重试",
|
||||
"提交":"提交",
|
||||
"发送验证码成功":"发送验证码成功",
|
||||
"注册成功":"注册成功",
|
||||
"再按一次退出程序":"注再按一次退出程序册成功",
|
||||
"用户拒绝授权":"用户拒绝授权",
|
||||
"用户取消授权":"用户取消授权",
|
||||
"未命名":"未命名",
|
||||
"编辑资料":"编辑资料",
|
||||
"保存":"保存",
|
||||
"点击更换头像":"点击更换头像",
|
||||
"保存失败":"保存失败",
|
||||
"昵称为空":"昵称为空",
|
||||
"保存成功":"保存成功"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
6
lib/common/color/AppGlobal.dart
Normal file
6
lib/common/color/AppGlobal.dart
Normal file
@@ -0,0 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class AppGlobal {
|
||||
static final GlobalKey<NavigatorState> navigatorKey =
|
||||
GlobalKey<NavigatorState>();
|
||||
}
|
||||
@@ -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";//用户注册
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 = {}; //之前控制的设备
|
||||
|
||||
@@ -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!;
|
||||
|
||||
// 设置省市区街道名称
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
// }
|
||||
}
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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 = "";
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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);
|
||||
|
||||
@@ -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 数据
|
||||
|
||||
@@ -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()),
|
||||
]));
|
||||
}
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
@@ -253,6 +253,7 @@ class _MinePageState extends State<MinePage> {
|
||||
letterSpacing: 0.0,
|
||||
),
|
||||
),
|
||||
|
||||
].divide(SizedBox(height: 20.rpx)),
|
||||
),
|
||||
].divide(SizedBox(width: 35.rpx)),
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
888
lib/pages/mh_page/homepage/new_Home_page.dart
Normal file
888
lib/pages/mh_page/homepage/new_Home_page.dart
Normal 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,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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)),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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 '';
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
369
lib/pages/mh_page/user/page/edit_userinfo_page.dart
Normal file
369
lib/pages/mh_page/user/page/edit_userinfo_page.dart
Normal 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();
|
||||
}
|
||||
}
|
||||
@@ -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; // 允许退出程序
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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!;
|
||||
|
||||
// 检查用户是否已登录,如果未登录且路由不是登录相关页面,跳转到登录页面
|
||||
|
||||
@@ -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/
|
||||
|
||||
Reference in New Issue
Block a user