From 809096a11b7c5e4fba77b7af359a57d1d53880e4 Mon Sep 17 00:00:00 2001 From: Daisy <> Date: Mon, 9 Oct 2023 18:45:10 +0800 Subject: [PATCH 1/3] =?UTF-8?q?1=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E8=B4=A6=E5=8F=B7=E9=A1=B5=E9=9D=A2=E5=8F=8A=E7=9B=B8?= =?UTF-8?q?=E5=BA=94=E6=8E=A5=E5=8F=A3=E5=92=8C=E9=80=BB=E8=BE=91=202?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=85=8D=E6=BB=91=E5=8A=A8=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=E7=9A=84=E9=AA=8C=E8=AF=81=E7=A0=81=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E6=8E=A5=E5=8F=A3=203=EF=BC=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=AA=E4=BA=BA=E4=BF=A1=E6=81=AF-?= =?UTF-8?q?=E6=98=B5=E7=A7=B0=E6=8E=A5=E5=8F=A3=204=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E4=BF=AE=E6=94=B9=E8=B4=A6=E5=8F=B7=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=8F=8A=E9=80=BB=E8=BE=91=205=EF=BC=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E9=82=AE=E7=AE=B1=E6=8E=A5=E5=8F=A3=E5=8F=8A?= =?UTF-8?q?=E9=80=BB=E8=BE=91=206=EF=BC=8C=E6=96=B0=E5=A2=9E=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=AF=86=E7=A0=81=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/images/lan/lan_en.json | 1 + star_lock/images/lan/lan_keys.json | 1 + star_lock/images/lan/lan_zh.json | 1 + .../mine/safeVerify/safeVerify_logic.dart | 7 +- .../mine/mine/safeVerify/safeVerify_page.dart | 24 ++-- .../mine/safeVerify/safeVerify_state.dart | 2 +- .../minePersonInfo/minePersonInfo_entity.dart | 77 ++++++++++++ .../minePersonInfo/minePersonInfo_logic.dart | 19 +++ .../minePersonInfo/minePersonInfo_page.dart | 78 +++++++++--- .../minePersonInfo/minePersonInfo_state.dart | 11 ++ .../minePersonInfoEditAccount_logic.dart | 88 +++++++++++++ .../minePersonInfoEditAccount_page.dart | 118 +++++------------- .../minePersonInfoEditAccount_state.dart | 65 ++++++++++ .../minePersonInfoEditAccountNext_logic.dart | 89 +++++++++++++ .../minePersonInfoEditAccountNext_page.dart | 31 ++--- .../minePersonInfoEditAccountNext_state.dart | 68 ++++++++++ .../MinePersonInfoEditNamePage_state.dart | 15 +++ .../MinePersonInfoEditName_logic.dart | 43 +++++++ .../minePersonInfoEditName_page.dart | 26 ++-- .../minePersonInfoEmail_logic.dart | 102 +++++++++++++++ .../minePersonInfoEmail_page.dart | 109 ++++++++-------- .../minePersonInfoEmail_state.dart | 54 ++++++++ .../minePersonInfoResetPassword_logic.dart | 46 +++++++ .../minePersonInfoResetPassword_page.dart | 23 ++-- .../minePersonInfoResetPassword_state.dart | 26 ++++ .../minePersonInfoSetSafetyProblem_logic.dart | 0 .../minePersonInfoSetSafetyProblem_page.dart | 1 - .../minePersonInfoSetSafetyProblem_state.dart | 0 star_lock/lib/network/api.dart | 6 + star_lock/lib/network/api_provider.dart | 81 +++++++++--- star_lock/lib/network/api_repository.dart | 70 ++++++++--- star_lock/lib/tools/tf_input_haveBorder.dart | 45 +++++-- star_lock/lib/translations/lanKeyEntity.dart | 4 + 33 files changed, 1076 insertions(+), 255 deletions(-) create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_entity.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_logic.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_state.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_logic.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_state.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_logic.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditNamePage_state.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditName_logic.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_logic.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_state.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_logic.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_state.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_logic.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_state.dart diff --git a/star_lock/images/lan/lan_en.json b/star_lock/images/lan/lan_en.json index b00628fc..62345b97 100644 --- a/star_lock/images/lan/lan_en.json +++ b/star_lock/images/lan/lan_en.json @@ -319,6 +319,7 @@ "registerPasswordTip":"The password must be 8-20 characters, including at least 2 of the numbers/letters/symbols", "iphone":"Iphone", "email":"Email", + "mobileNumber":"Mobile phone number", "countryAndRegion":"Country And Region", "selet":"Selet", "getVerificationCode":"Get Verification Code", diff --git a/star_lock/images/lan/lan_keys.json b/star_lock/images/lan/lan_keys.json index 1d4fc313..8a551768 100644 --- a/star_lock/images/lan/lan_keys.json +++ b/star_lock/images/lan/lan_keys.json @@ -319,6 +319,7 @@ "registerPasswordTip":"registerPasswordTip", "iphone":"iphone", "email":"email", + "mobileNumber":"mobileNumber", "countryAndRegion":"countryAndRegion", "selet":"selet", "getVerificationCode":"getVerificationCode", diff --git a/star_lock/images/lan/lan_zh.json b/star_lock/images/lan/lan_zh.json index b4692a38..4bd4b51c 100644 --- a/star_lock/images/lan/lan_zh.json +++ b/star_lock/images/lan/lan_zh.json @@ -319,6 +319,7 @@ "registerPasswordTip":"密码必须是8-20位,至少包括数字/字母/符号中的2种", "iphone":"手机", "email":"邮箱", + "mobileNumber":"手机号", "countryAndRegion":"国家/地区", "selet":"选择", "getVerificationCode":"获取验证码", diff --git a/star_lock/lib/mine/mine/safeVerify/safeVerify_logic.dart b/star_lock/lib/mine/mine/safeVerify/safeVerify_logic.dart index f8f09eb7..c5f6c724 100644 --- a/star_lock/lib/mine/mine/safeVerify/safeVerify_logic.dart +++ b/star_lock/lib/mine/mine/safeVerify/safeVerify_logic.dart @@ -33,7 +33,7 @@ class SafeVerifyLogic extends BaseGetXController { //获取验证码请求 void sendValidationCode() async { - var entity = await ApiRepository.to.sendValidationCode( + var entity = await ApiRepository.to.getValidationCodeAuth( "+86", state.loginData.value.mobile!, '1', @@ -46,8 +46,9 @@ class SafeVerifyLogic extends BaseGetXController { } //删除账号请求 - Future userLogoutRequest() async { - LoginEntity entity = await ApiRepository.to.userLogout(); + Future deleteAccountRequest() async { + LoginEntity entity = await ApiRepository.to + .deleteAccount("", "", state.verificationCode.value); if (entity.errorCode!.codeIsSuccessful) { Toast.show(msg: '验证成功,账号已删除'); //删除账号成功, diff --git a/star_lock/lib/mine/mine/safeVerify/safeVerify_page.dart b/star_lock/lib/mine/mine/safeVerify/safeVerify_page.dart index 9910063b..a13ea601 100644 --- a/star_lock/lib/mine/mine/safeVerify/safeVerify_page.dart +++ b/star_lock/lib/mine/mine/safeVerify/safeVerify_page.dart @@ -17,7 +17,6 @@ class SafeVerifyPage extends StatefulWidget { class _SafeVerifyPageState extends State { final logic = Get.put(SafeVerifyLogic()); final state = Get.find().state; - String mobilePhone = ''; @override void initState() { @@ -51,6 +50,9 @@ class _SafeVerifyPageState extends State { //输入框一行 maxLines: 1, controller: state.codeController, + onChanged: (value) { + logic.checkNext(state.codeController); + }, autofocus: false, decoration: InputDecoration( contentPadding: @@ -65,15 +67,15 @@ class _SafeVerifyPageState extends State { SizedBox( height: 30.h, ), - SizedBox( - width: 200.w, - child: SubmitBtn( - btnName: TranslationLoader.lanKeys!.getVerificationCode!.tr, - onClick: () { - logic.sendValidationCode(); - }, - ), - ), + Obx(() => SizedBox( + width: 200.w, + child: SubmitBtn( + btnName: state.btnText.value, + onClick: () { + logic.sendValidationCode(); + }, + ), + )), SizedBox( height: 60.h, ), @@ -92,7 +94,7 @@ class _SafeVerifyPageState extends State { btnName: '验证', isDisabled: state.canSub.value, onClick: () { - logic.userLogoutRequest(); + logic.deleteAccountRequest(); }, )) ], diff --git a/star_lock/lib/mine/mine/safeVerify/safeVerify_state.dart b/star_lock/lib/mine/mine/safeVerify/safeVerify_state.dart index 8b0e129a..4913a8fc 100644 --- a/star_lock/lib/mine/mine/safeVerify/safeVerify_state.dart +++ b/star_lock/lib/mine/mine/safeVerify/safeVerify_state.dart @@ -14,7 +14,7 @@ class SafeVerifyState { var countryCode = '+86'.obs; var countryId = '9'.obs; - var codeType = '5'.obs; + var codeType = '5'.obs; //5删除账号 var verificationCode = ''.obs; var xWidth = ''.obs; // 滑动验证码滑动位置 var canSub = false.obs; diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_entity.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_entity.dart new file mode 100644 index 00000000..6d031ea4 --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_entity.dart @@ -0,0 +1,77 @@ +class MinePersonInfoEntity { + int? errorCode; + String? description; + String? errorMsg; + MinePersonInfoData? data; + + MinePersonInfoEntity( + {this.errorCode, this.description, this.errorMsg, this.data}); + + MinePersonInfoEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + data = + json['data'] != null ? MinePersonInfoData.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class MinePersonInfoData { + String? mobile; + String? uid; + bool? isSecurityQuestionSetted; + String? nickname; + String? headUrl; + String? accountName; + int? countryId; + String? email; + String? countryName; + + MinePersonInfoData( + {this.mobile, + this.uid, + this.isSecurityQuestionSetted, + this.nickname, + this.headUrl, + this.accountName, + this.countryId, + this.email, + this.countryName}); + + MinePersonInfoData.fromJson(Map json) { + mobile = json['mobile']; + uid = json['uid']; + isSecurityQuestionSetted = json['isSecurityQuestionSetted']; + nickname = json['nickname']; + headUrl = json['headUrl']; + accountName = json['accountName']; + countryId = json['countryId']; + email = json['email']; + countryName = json['countryName']; + } + + Map toJson() { + final Map data = {}; + data['mobile'] = mobile; + data['uid'] = uid; + data['isSecurityQuestionSetted'] = isSecurityQuestionSetted; + data['nickname'] = nickname; + data['headUrl'] = headUrl; + data['accountName'] = accountName; + data['countryId'] = countryId; + data['email'] = email; + data['countryName'] = countryName; + return data; + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_logic.dart new file mode 100644 index 00000000..f23969af --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_logic.dart @@ -0,0 +1,19 @@ +import 'dart:async'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfo/minePersonInfo_state.dart'; +import '../../../../network/api_repository.dart'; +import '../../../../tools/baseGetXController.dart'; + +class MinePersonInfoLogic extends BaseGetXController { + final MinePersonInfoState state = MinePersonInfoState(); + //用户信息 + Future getUserInfoRequest() async { + var entity = await ApiRepository.to.getUserInfo(""); + if (entity.errorCode!.codeIsSuccessful) { + state.mineInfoData.value = entity.data!; + state.nickname.value = entity.data!.nickname!; + state.mobileStr.value = entity.data!.mobile!; + state.emailStr.value = entity.data!.email!; + state.countryStr.value = entity.data!.countryName!; + } + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_page.dart index b4de92ba..37d19378 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_page.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import 'package:image_picker/image_picker.dart'; import 'package:star_lock/app_settings/app_colors.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfo/minePersonInfo_logic.dart'; import 'package:star_lock/tools/seletImgTool.dart'; import '../../../appRouters.dart'; @@ -18,6 +18,16 @@ class MinePersonInfoPage extends StatefulWidget { } class _MinePersonInfoPageState extends State { + final logic = Get.put(MinePersonInfoLogic()); + final state = Get.find().state; + + @override + void initState() { + super.initState(); + + logic.getUserInfoRequest(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -47,33 +57,63 @@ class _MinePersonInfoPageState extends State { _openModalBottomSheet(); }, ), - CommonItem( + Obx(() => CommonItem( leftTitel: TranslationLoader.lanKeys!.nickName!.tr, - rightTitle: "你好", + rightTitle: state.nickname.value, isHaveLine: true, isHaveDirection: true, action: () { Navigator.pushNamed( - context, Routers.minePersonInfoEditNamePage); - }), - CommonItem( - leftTitel: TranslationLoader.lanKeys!.accountNumber!.tr, - rightTitle: "786612630@qq.com", + context, Routers.minePersonInfoEditNamePage, + arguments: {'nickName': state.nickname.value}) + .then((value) => logic.getUserInfoRequest()); + })), + Obx(() => CommonItem( + leftTitel: TranslationLoader.lanKeys!.mobileNumber!.tr, + rightTitle: state.mobileStr.value, isHaveLine: true, isHaveDirection: true, action: () { - Navigator.pushNamed( - context, Routers.minePersonInfoEditAccountPage); - }), - CommonItem( + //有手机号 则去修改手机号 否则去绑定新的手机号 isFrom:1 短信,2 邮箱 + if (state.mobileStr.value.isNotEmpty) { + Navigator.pushNamed( + context, Routers.minePersonInfoEditAccountPage, + arguments: { + 'mobile': state.mobileStr.value, + 'isFrom': '1' + }); + } else { + Navigator.pushNamed( + context, Routers.minePersonInfoEditEmailPage, + arguments: { + 'mobile': state.mobileStr.value, + 'isFrom': '1' + }); + } + })), + Obx(() => CommonItem( leftTitel: TranslationLoader.lanKeys!.email!.tr, - rightTitle: "", + rightTitle: state.emailStr.value, isHaveLine: true, isHaveDirection: true, action: () { - Navigator.pushNamed( - context, Routers.minePersonInfoEditEmailPage); - }), + //有邮箱 则去修改邮箱 否则去绑定新的邮箱 isFrom:1 短信,2 邮箱 + if (state.emailStr.value.isNotEmpty) { + Navigator.pushNamed( + context, Routers.minePersonInfoEditAccountPage, + arguments: { + 'isFrom': '2', + 'email': state.emailStr.value + }); + } else { + Navigator.pushNamed( + context, Routers.minePersonInfoEditEmailPage, + arguments: { + 'isFrom': '2', + 'email': state.emailStr.value + }); + } + })), CommonItem( leftTitel: TranslationLoader.lanKeys!.resetPasswords!.tr, rightTitle: "", @@ -92,11 +132,11 @@ class _MinePersonInfoPageState extends State { Navigator.pushNamed( context, Routers.minePersonInfoSetSafetyProblemPage); }), - CommonItem( + Obx(() => CommonItem( leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr, - rightTitle: "中国", + rightTitle: state.countryStr.value, isHaveLine: false, - isHaveDirection: false), + isHaveDirection: false)), ], )); } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_state.dart new file mode 100644 index 00000000..d124c4eb --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_state.dart @@ -0,0 +1,11 @@ +import 'package:get/get.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfo/minePersonInfo_entity.dart'; + +class MinePersonInfoState { + final mineInfoData = MinePersonInfoData().obs; + + var nickname = ''.obs; //昵称 + var mobileStr = ''.obs; //手机号 + var emailStr = ''.obs; //邮箱 + var countryStr = ''.obs; //国家/地区 +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_logic.dart new file mode 100644 index 00000000..9e5e0e65 --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_logic.dart @@ -0,0 +1,88 @@ +import 'dart:async'; +import 'package:flutter/cupertino.dart'; +import 'package:get/get_core/src/get_main.dart'; +import 'package:get/get_navigation/src/extension_navigation.dart'; +import 'package:get/get_utils/get_utils.dart'; +import 'package:star_lock/appRouters.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_state.dart'; +import 'package:star_lock/network/api_repository.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/tools/toast.dart'; + +class MineInfoEditAccountLogic extends BaseGetXController { + final MineInfoEditAccountState state = MineInfoEditAccountState(); + + late Timer _timer; + void _startTimer() { + _timer = Timer.periodic(1.seconds, (timer) { + if (state.currentSecond > 1) { + state.currentSecond--; + } else { + _cancelTimer(); + state.currentSecond = state.totalSeconds; + } + state.resetResend(); + }); + } + + void _cancelTimer() { + _timer.cancel(); + } + + //获取验证码请求 + void sendValidationCode() async { + var entity = await ApiRepository.to.getValidationCodeAuth( + state.countryCode.value, + state.loginData.value.mobile!, + state.channel.value, + state.codeType.value, + state.uniqueid.value, + state.xWidth.value.toString()); + if (entity.errorCode!.codeIsSuccessful) { + _startTimer(); + } else {} + } + + //删除账号请求 + Future deleteAccountRequest() async { + LoginEntity entity = await ApiRepository.to + .deleteAccount("", "", state.verificationCode.value); + if (entity.errorCode!.codeIsSuccessful) { + Toast.show(msg: '验证成功,账号已删除'); + //删除账号成功, + Get.offNamedUntil(Routers.starLockLoginPage, (route) => false); + } + } + + void checkNext(TextEditingController controller) { + changeInput(controller); + } + + void changeInput(TextEditingController controller) { + if (controller == state.codeController) { + state.verificationCode.value = controller.text; + } + _resetCanSub(); + } + + void _resetCanSub() { + state.canSub.value = state.codeIsOK; + } + + @override + void onReady() { + super.onReady(); + } + + @override + void onInit() { + super.onInit(); + state.initLoginData(); + } + + @override + void onClose() { + super.onClose(); + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_page.dart index da48fab7..2d73ea6c 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_page.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_logic.dart'; +import 'package:star_lock/tools/tf_input_haveBorder.dart'; import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; @@ -18,7 +20,8 @@ class MinePersonInfoEditAccountPage extends StatefulWidget { class _MinePersonInfoEditAccountPageState extends State { - final TextEditingController _editAccountController = TextEditingController(); + final logic = Get.put(MineInfoEditAccountLogic()); + final state = Get.find().state; @override Widget build(BuildContext context) { @@ -38,96 +41,39 @@ class _MinePersonInfoEditAccountPageState TranslationLoader.lanKeys!.modifyAccountTip!.tr, style: TextStyle(fontSize: 20.sp), )), - Container( - padding: EdgeInsets.all(20.h), - height: 110.h, - child: TextField( - // maxLines: 1, - keyboardType: TextInputType.text, - // inputFormatters: inputFormatterstters??[], - controller: _editAccountController, - autofocus: false, - textAlign: TextAlign.start, - style: TextStyle( - height: 3.2, - fontSize: 22.sp, - fontWeight: FontWeight.w400, - color: const Color(0xFF333333)), - decoration: InputDecoration( - hintText: TranslationLoader.lanKeys!.pleaseEnter!.tr, - hintStyle: TextStyle( - // height: 3.0, - fontSize: 22.sp, - color: const Color(0xFF999999)), - // labelText:"label", - labelStyle: const TextStyle(color: Color(0xFF999999)), - border: const OutlineInputBorder( - ///设置边框四个角的弧度 - borderRadius: BorderRadius.all(Radius.circular(10)), - - ///用来配置边框的样式 - borderSide: BorderSide( - ///设置边框的颜色 - color: Color(0xffD3D3D3), - - ///设置边框的粗细 - width: 1, - ), - ), - - ///设置输入框可编辑时的边框样式 - enabledBorder: const OutlineInputBorder( - ///设置边框四个角的弧度 - borderRadius: BorderRadius.all(Radius.circular(10)), - - ///用来配置边框的样式 - borderSide: BorderSide( - ///设置边框的颜色 - color: Color(0xffD3D3D3), - - ///设置边框的粗细 - width: 1, - ), - ), - disabledBorder: const OutlineInputBorder( - ///设置边框四个角的弧度 - borderRadius: BorderRadius.all(Radius.circular(10)), - - ///用来配置边框的样式 - borderSide: BorderSide( - ///设置边框的颜色 - color: Color(0xffD3D3D3), - - ///设置边框的粗细 - width: 1, - ), - ), - - ///用来配置输入框获取焦点时的颜色 - focusedBorder: const OutlineInputBorder( - ///设置边框四个角的弧度 - borderRadius: BorderRadius.all(Radius.circular(10)), - - ///用来配置边框的样式 - borderSide: BorderSide( - ///设置边框的颜色 - color: Color(0xffD3D3D3), - - ///设置边框的粗细 - width: 1, - ), - ), - ), - obscureText: false, - onChanged: (String value) {}, - ), - ), + Obx(() => Container( + padding: EdgeInsets.only( + left: 30.w, right: 30.w, top: 20.h, bottom: 10.h), + child: TFInputHaveBorder( + controller: state.codeController, + label: + "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.verificationCode!.tr}", + rightSlot: GestureDetector( + child: Container( + width: 180.w, + height: 90.h, + padding: EdgeInsets.all(5.h), + margin: EdgeInsets.only(right: 10.w), + child: Center( + child: Text(state.btnText.value, + textAlign: TextAlign.center, + style: TextStyle( + color: AppColors.mainColor, + fontSize: 26.sp, + )), + ), + ), + onTap: () { + logic.sendValidationCode(); + }, + )))), SizedBox(height: 50.w), SubmitBtn( btnName: TranslationLoader.lanKeys!.next!.tr, onClick: () { Navigator.pushNamed( - context, Routers.minePersonInfoEditAccountNextPage); + context, Routers.minePersonInfoEditAccountNextPage, + arguments: {'isFrom': '1'}); }), SizedBox(height: 50.w), Row( diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_state.dart new file mode 100644 index 00000000..f8710490 --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_state.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginData.dart'; +import 'package:star_lock/login/seletCountryRegion/common/index.dart'; +import 'package:star_lock/tools/storage.dart'; +import 'package:star_lock/translations/trans_lib.dart'; + +class MineInfoEditAccountState { + final TextEditingController codeController = TextEditingController(); + + static int currentTimeMillis() { + return DateTime.now().millisecondsSinceEpoch; + } + + var countryCode = '+86'.obs; + var countryId = '9'.obs; + var codeType = '4'.obs; //1注册,2找回密码,3绑定手机号,4解绑(换绑),5删除账号,6 绑定邮箱 + var channel = '1'.obs; //短信通道 1 短信,2 邮箱 + var uniqueid = 'B748F838-94EE-4BDB-A0E6-7B2D16849792'.obs; + var verificationCode = ''.obs; + var xWidth = ''.obs; // 滑动验证码滑动位置 + var canSub = false.obs; + var date = currentTimeMillis().toString().obs; + + bool get codeIsOK => verificationCode.value.isNotEmpty; + + var canResend = false.obs; + var btnText = ''.obs; + var totalSeconds = 120; + var currentSecond = 120; + + final loginData = LoginData().obs; + + ///本地存储 登录信息 + void saveLoginData(LoginData? data) async { + print("saveLoginData:${data!.mobile}"); + await Storage.setString('userLoginData', jsonEncode(data)); + loginData.value = data; + } + + ///初始化本地数据 + void initLoginData() async { + final data = await Storage.getString('userLoginData'); + print("getLoginData:$data"); + if (data != null && data.isNotEmpty) { + loginData.value = LoginData.fromJson(jsonDecode(data)); + } + } + + MineInfoEditAccountState() { + Map map = Get.arguments; + channel.value = map["isFrom"]; + + resetResend(); + } + + void resetResend() { + canResend.value = totalSeconds == currentSecond; + btnText.value = !canResend.value + ? '$currentSecond s' + : btnText.value = TranslationLoader.lanKeys!.getVerificationCode!.tr; + } + + void onClose() {} +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_logic.dart new file mode 100644 index 00000000..2d45cf7f --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_logic.dart @@ -0,0 +1,89 @@ +import 'dart:async'; + +import 'package:flutter/cupertino.dart'; +import 'package:get/get_core/src/get_main.dart'; +import 'package:get/get_navigation/src/extension_navigation.dart'; +import 'package:get/get_utils/get_utils.dart'; +import 'package:star_lock/appRouters.dart'; +import 'package:star_lock/login/login/entity/LoginEntity.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart'; +import 'package:star_lock/network/api_repository.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/tools/toast.dart'; + +class PersonInfoEditAccountLogic extends BaseGetXController { + final PersonInfoEditAccountState state = PersonInfoEditAccountState(); + + late Timer _timer; + void _startTimer() { + _timer = Timer.periodic(1.seconds, (timer) { + if (state.currentSecond > 1) { + state.currentSecond--; + } else { + _cancelTimer(); + state.currentSecond = state.totalSeconds; + } + state.resetResend(); + }); + } + + void _cancelTimer() { + _timer.cancel(); + } + + //获取验证码请求 + void sendValidationCode() async { + var entity = await ApiRepository.to.getValidationCodeAuth( + state.countryCode.value, + state.loginData.value.mobile!, + state.channel.value, + state.codeType.value, + state.uniqueid.value, + state.xWidth.value.toString()); + if (entity.errorCode!.codeIsSuccessful) { + _startTimer(); + } else {} + } + + //删除账号请求 + Future deleteAccountRequest() async { + LoginEntity entity = await ApiRepository.to + .deleteAccount("", "", state.verificationCode.value); + if (entity.errorCode!.codeIsSuccessful) { + Toast.show(msg: '验证成功,账号已删除'); + //删除账号成功, + Get.offNamedUntil(Routers.starLockLoginPage, (route) => false); + } + } + + void checkNext(TextEditingController controller) { + changeInput(controller); + } + + void changeInput(TextEditingController controller) { + if (controller == state.codeController) { + state.verificationCode.value = controller.text; + } + _resetCanSub(); + } + + void _resetCanSub() { + state.canSub.value = state.codeIsOK; + } + + @override + void onReady() { + super.onReady(); + } + + @override + void onInit() { + super.onInit(); + state.initLoginData(); + } + + @override + void onClose() { + super.onClose(); + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart index 4bf98f57..fc75d1fd 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart @@ -1,10 +1,7 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; - -import '../../../../appRouters.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_logic.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/tf_input_haveBorder.dart'; @@ -21,9 +18,8 @@ class MinePersonInfoEditAccountNextPage extends StatefulWidget { class _MinePersonInfoEditAccountNextPageState extends State { - final TextEditingController _editAccountController = TextEditingController(); - late Timer _timer; - int _seconds = 60; + final logic = Get.put(PersonInfoEditAccountLogic()); + final state = Get.find().state; @override Widget build(BuildContext context) { @@ -45,10 +41,11 @@ class _MinePersonInfoEditAccountNextPageState TextStyle(fontWeight: FontWeight.w600, fontSize: 24.sp), )), Container( + height: 100.h, padding: EdgeInsets.only( left: 30.w, right: 30.w, top: 10.h, bottom: 10.h), child: TFInputHaveBorder( - controller: _editAccountController, + controller: state.accountController, label: TranslationLoader.lanKeys!.pleaseEnterNumberOrEmail!.tr, ), ), @@ -56,9 +53,9 @@ class _MinePersonInfoEditAccountNextPageState padding: EdgeInsets.only( left: 30.w, right: 30.w, top: 20.h, bottom: 10.h), child: TFInputHaveBorder( - controller: _editAccountController, + controller: state.codeController, label: - "${TranslationLoader.lanKeys!.pleaseEnter!.tr} ${TranslationLoader.lanKeys!.verificationCode!.tr}", + "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.verificationCode!.tr}", rightSlot: GestureDetector( child: Container( width: 180.w, @@ -71,11 +68,7 @@ class _MinePersonInfoEditAccountNextPageState // ), child: Center( child: Text( - _seconds == 60 - ? '${TranslationLoader.lanKeys!.getTip!.tr}${TranslationLoader.lanKeys!.verificationCode!.tr}' - : (_seconds < 10) - ? '0$_seconds s' - : '$_seconds s', + '${TranslationLoader.lanKeys!.getTip!.tr}${TranslationLoader.lanKeys!.verificationCode!.tr}', textAlign: TextAlign.center, style: TextStyle( color: Colors.grey, @@ -83,13 +76,7 @@ class _MinePersonInfoEditAccountNextPageState )), ), ), - onTap: () { - if (_seconds == 60) { - // _setVerify(); - } else { - // Toast.show(msg: '正在获取验证码'); - } - }, + onTap: () {}, )), ), SizedBox(height: 50.w), diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart new file mode 100644 index 00000000..72d5164c --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/login/login/entity/LoginData.dart'; +import 'package:star_lock/login/seletCountryRegion/common/index.dart'; +import 'package:star_lock/tools/storage.dart'; +import 'package:star_lock/translations/trans_lib.dart'; + +class PersonInfoEditAccountState { + final TextEditingController accountController = TextEditingController(); + final TextEditingController codeController = TextEditingController(); + + static int currentTimeMillis() { + return DateTime.now().millisecondsSinceEpoch; + } + + var countryCode = '+86'.obs; + var countryId = '9'.obs; + var codeType = '3'.obs; //1注册,2找回密码,3绑定手机号,4解绑(换绑),5删除账号,6 绑定邮箱 + var channel = '1'.obs; //短信通道 1 短信,2 邮箱 + var uniqueid = 'B748F838-94EE-4BDB-A0E6-7B2D16849792'.obs; + var newAccountStr = ''.obs; + var verificationCode = ''.obs; + var xWidth = ''.obs; // 滑动验证码滑动位置 + var canSub = false.obs; + var date = currentTimeMillis().toString().obs; + + bool get accountIsOK => newAccountStr.value.isNotEmpty; + bool get codeIsOK => verificationCode.value.isNotEmpty; + + var canResend = false.obs; + var btnText = ''.obs; + var totalSeconds = 120; + var currentSecond = 120; + + final loginData = LoginData().obs; + + ///本地存储 登录信息 + void saveLoginData(LoginData? data) async { + print("saveLoginData:${data!.mobile}"); + await Storage.setString('userLoginData', jsonEncode(data)); + loginData.value = data; + } + + ///初始化本地数据 + void initLoginData() async { + final data = await Storage.getString('userLoginData'); + print("getLoginData:$data"); + if (data != null && data.isNotEmpty) { + loginData.value = LoginData.fromJson(jsonDecode(data)); + } + } + + PersonInfoEditAccountState() { + Map map = Get.arguments; + channel.value = map["isFrom"]; + + resetResend(); + } + + void resetResend() { + canResend.value = totalSeconds == currentSecond; + btnText.value = !canResend.value + ? '$currentSecond s' + : btnText.value = TranslationLoader.lanKeys!.getVerificationCode!.tr; + } + + void onClose() {} +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditNamePage_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditNamePage_state.dart new file mode 100644 index 00000000..6b219c12 --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditNamePage_state.dart @@ -0,0 +1,15 @@ +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; + +class MinePersonInfoEditNamePageState { + final TextEditingController nickNameController = TextEditingController(); + + final inputNickName = ''.obs; + var canSub = false.obs; + bool get nickNameIsOK => inputNickName.value.isNotEmpty; + + MinePersonInfoEditNamePageState() { + Map map = Get.arguments; + inputNickName.value = map["nickName"]; + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditName_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditName_logic.dart new file mode 100644 index 00000000..1e7a11d3 --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditName_logic.dart @@ -0,0 +1,43 @@ +import 'dart:async'; +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditNamePage_state.dart'; +import 'package:star_lock/tools/toast.dart'; +import '../../../../network/api_repository.dart'; +import '../../../../tools/baseGetXController.dart'; + +class MinePersonInfoEditNameLogic extends BaseGetXController { + final MinePersonInfoEditNamePageState state = + MinePersonInfoEditNamePageState(); + //更新个人信息-昵称 + Future updateUserInfoRequest() async { + var entity = + await ApiRepository.to.updateUserInfo(state.inputNickName.value); + if (entity.errorCode!.codeIsSuccessful) { + Toast.show(msg: '操作成功'); + Get.back(); + } + } + + void checkNext(TextEditingController controller) { + changeInput(controller); + } + + void changeInput(TextEditingController controller) { + if (controller == state.nickNameController) { + state.inputNickName.value = controller.text; + } + _resetCanSub(); + } + + void _resetCanSub() { + state.canSub.value = state.nickNameIsOK; + } + + @override + void onInit() { + super.onInit(); + + state.nickNameController.text = state.inputNickName.value; + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_page.dart index c6d791e5..d5a13575 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_page.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditName_logic.dart'; +import 'package:star_lock/tools/toast.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/tf_loginInput.dart'; @@ -17,8 +20,8 @@ class MinePersonInfoEditNamePage extends StatefulWidget { class _MinePersonInfoEditNamePageState extends State { - final TextEditingController _changeNickNameController = - TextEditingController(); + final logic = Get.put(MinePersonInfoEditNameLogic()); + final state = Get.find().state; @override Widget build(BuildContext context) { @@ -34,7 +37,13 @@ class _MinePersonInfoEditNamePageState TranslationLoader.lanKeys!.save!.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), - onPressed: () {}, + onPressed: () { + if (state.nickNameIsOK == false) { + Toast.show(msg: '请输入昵称'); + } else { + logic.updateUserInfoRequest(); + } + }, ), ], ), @@ -43,13 +52,16 @@ class _MinePersonInfoEditNamePageState child: Column( children: [ LoginInput( - controller: _changeNickNameController, - isPwd: true, + controller: state.nickNameController, + onchangeAction: (textStr) { + logic.checkNext(state.nickNameController); + }, + isPwd: false, leftWidget: SizedBox(width: 15.w), hintText: - "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.accountNumber!.tr}", + "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.nickName!.tr}", inputFormatters: [ - // LengthLimitingTextInputFormatter(20), + LengthLimitingTextInputFormatter(20), ]), ], ), diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_logic.dart new file mode 100644 index 00000000..7023c995 --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_logic.dart @@ -0,0 +1,102 @@ +import 'dart:async'; + +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_state.dart'; +import 'package:star_lock/network/api_repository.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/tools/toast.dart'; + +class MinePersonInfoEmailLogic extends BaseGetXController { + final MinePersonInfoEmailState state = MinePersonInfoEmailState(); + + late Timer _timer; + void _startTimer() { + _timer = Timer.periodic(1.seconds, (timer) { + if (state.currentSecond > 1) { + state.currentSecond--; + } else { + _cancelTimer(); + state.currentSecond = state.totalSeconds; + } + state.resetResend(); + }); + } + + void _cancelTimer() { + _timer.cancel(); + } + + //获取验证码请求 + void sendValidationCode() async { + var entity = await ApiRepository.to.getValidationCodeAuth( + state.countryCode.value, + state.inputAccount.value, + state.channel.value, + state.codeType.value, + state.uniqueid.value, + state.xWidth.value.toString()); + if (entity.errorCode!.codeIsSuccessful) { + _startTimer(); + } + } + + //绑定邮箱请求 + Future bindEmailRequest() async { + PasswordKeyListEntity entity = await ApiRepository.to.bindEmail( + state.inputAccount.value, '', state.verificationCode.value, ''); + if (entity.errorCode!.codeIsSuccessful) { + Toast.show(msg: '邮箱绑定成功'); + Get.back(); + } + } + + //绑定手机请求 + Future bindMobileRequest() async { + PasswordKeyListEntity entity = await ApiRepository.to.changeAccount( + state.countryCode.value, + state.inputAccount.value, + state.uniqueid.value, + state.verificationCode.value); + if (entity.errorCode!.codeIsSuccessful) { + Toast.show(msg: '手机绑定成功'); + Get.back(); + } + } + + void checkNext(TextEditingController controller) { + changeInput(controller); + } + + void changeInput(TextEditingController controller) { + if (controller == state.accountController) { + state.inputAccount.value = controller.text; + state.accountIsOK.value = state.inputAccount.value.isNotEmpty; + } + if (controller == state.codeController) { + state.verificationCode.value = controller.text; + } + + _resetCanSub(); + } + + void _resetCanSub() { + state.canSub.value = state.codeIsOK; + } + + @override + void onReady() { + super.onReady(); + } + + @override + void onInit() { + super.onInit(); + } + + @override + void onClose() { + super.onClose(); + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_page.dart index 8615a9a3..8caa6eed 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_page.dart @@ -1,10 +1,9 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_logic.dart'; -import '../../../appRouters.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/submitBtn.dart'; import '../../../tools/tf_loginInput.dart'; @@ -21,10 +20,8 @@ class MinePersonInfoEditEmailPage extends StatefulWidget { class _MinePersonInfoEditEmailPageState extends State { - final TextEditingController _phoneController = TextEditingController(); - final TextEditingController _codeController = TextEditingController(); - late Timer _timer; - int _seconds = 60; + final logic = Get.put(MinePersonInfoEmailLogic()); + final state = Get.find().state; @override Widget build(BuildContext context) { @@ -46,70 +43,84 @@ class _MinePersonInfoEditEmailPageState style: TextStyle(fontSize: 20.sp), )), LoginInput( - controller: _phoneController, - isPwd: true, + controller: state.accountController, + isPwd: false, + onchangeAction: (textStr) { + logic.checkNext(state.accountController); + }, leftWidget: const SizedBox(), hintText: "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.email!.tr}", inputFormatters: [ - // LengthLimitingTextInputFormatter(20), + LengthLimitingTextInputFormatter(20), ]), SizedBox(height: 10.w), Row( children: [ Expanded( child: LoginInput( - controller: _codeController, - isPwd: true, + controller: state.codeController, + isPwd: false, leftWidget: const SizedBox(), + onchangeAction: (textStr) { + logic.checkNext(state.codeController); + }, hintText: "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.verificationCode!.tr}", inputFormatters: [ - // LengthLimitingTextInputFormatter(20), + LengthLimitingTextInputFormatter(20), ]), ), SizedBox( width: 20.w, ), - GestureDetector( - child: Container( - width: 140.w, - // height: 60.h, - padding: EdgeInsets.all(8.h), - decoration: BoxDecoration( - color: AppColors.mainColor, - borderRadius: BorderRadius.circular(5)), - child: Center( - child: Text( - _seconds == 60 - ? '${TranslationLoader.lanKeys!.getTip!.tr}${TranslationLoader.lanKeys!.verificationCode!.tr}' - : (_seconds < 10) - ? '0$_seconds s' - : '$_seconds s', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.white, - fontSize: 22.sp, - )), - ), - ), - onTap: () { - if (_seconds == 60) { - // _setVerify(); - } else { - // Toast.show(msg: '正在获取验证码'); - } - }, - ) + Obx(() => GestureDetector( + child: Container( + width: 180.w, + height: 60.h, + padding: EdgeInsets.all(5.h), + decoration: BoxDecoration( + color: state.accountIsOK.value + ? AppColors.mainColor + : AppColors.btnDisableColor, + borderRadius: BorderRadius.circular(5)), + child: Center( + child: Text(state.btnText.value, + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white, + fontSize: 24.sp, + )), + ), + ), + onTap: () { + if (state.accountIsOK.value) { + logic.sendValidationCode(); + } + }, + )) ], ), SizedBox(height: 50.w), - SubmitBtn( - btnName: TranslationLoader.lanKeys!.sure!.tr, - fontSize: 28.sp, - borderRadius: 20.w, - padding: EdgeInsets.only(top: 25.w, bottom: 25.w), - onClick: () {}), + Obx(() { + return SubmitBtn( + btnName: TranslationLoader.lanKeys!.sure!.tr, + fontSize: 30.sp, + borderRadius: 20.w, + padding: EdgeInsets.only(top: 25.w, bottom: 25.w), + isDisabled: state.canSub.value, + onClick: state.canSub.value + ? () { + if (state.accountIsOK.value && state.codeIsOK) { + if (state.channel.value == "1") { + logic.bindMobileRequest(); + } else { + logic.bindEmailRequest(); + } + } + } + : null); + }), ], ), )); diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_state.dart new file mode 100644 index 00000000..f5f9f202 --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_state.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/translations/trans_lib.dart'; + +class MinePersonInfoEmailState { + final TextEditingController accountController = TextEditingController(); + final TextEditingController codeController = TextEditingController(); + + static int currentTimeMillis() { + return DateTime.now().millisecondsSinceEpoch; + } + + var countryCode = '+86'.obs; + var countryId = '9'.obs; + var codeType = '4'.obs; //1注册,2找回密码,3绑定手机号,4解绑(换绑),5删除账号,6 绑定邮箱 + var channel = '1'.obs; //短信通道 1 短信,2 邮箱 + var uniqueid = 'B748F838-94EE-4BDB-A0E6-7B2D16849792'.obs; + var verificationCode = ''.obs; + var xWidth = ''.obs; // 滑动验证码滑动位置 + var canSub = false.obs; + var date = currentTimeMillis().toString().obs; + var inputAccount = ''.obs; //新账号 + + var accountIsOK = false.obs; + bool get codeIsOK => verificationCode.value.isNotEmpty; + + var canResend = false.obs; + var btnText = ''.obs; + var totalSeconds = 120; + var currentSecond = 120; + + MinePersonInfoEmailState() { + Map map = Get.arguments; + channel.value = map["isFrom"]; + //短信通道 1 短信,2 邮箱 + //短信类型 1注册,2找回密码,3绑定手机号,4解绑(换绑),5删除账号,6 绑定邮箱 + if (channel.value == "1") { + codeType.value = "3"; + } else { + codeType.value = "6"; + } + + resetResend(); + } + + void resetResend() { + canResend.value = totalSeconds == currentSecond; + btnText.value = !canResend.value + ? '$currentSecond s' + : btnText.value = TranslationLoader.lanKeys!.getVerificationCode!.tr; + } + + void onClose() {} +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_logic.dart new file mode 100644 index 00000000..11be7803 --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_logic.dart @@ -0,0 +1,46 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_state.dart'; +import 'package:star_lock/network/api_repository.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/tools/toast.dart'; + +class MinePersonInfoResetPasswordLogic extends BaseGetXController { + final MinePersonInfoResetPasswordState state = + MinePersonInfoResetPasswordState(); + + void changePasswordRequest() async { + var entity = await ApiRepository.to.changePassword( + state.date.value, state.surePwd.value, state.oldPwd.value, ""); + if (entity.errorCode!.codeIsSuccessful) { + Toast.show(msg: '重置成功'); + Get.back(); + } else { + print('Error'); + } + } + + void checkNext(TextEditingController controller) { + changeInput(controller); + } + + void changeInput(TextEditingController controller) { + if (controller == state.oldPwdController) { + state.oldPwd.value = controller.text; + } + if (controller == state.newPwdController) { + state.newPwd.value = controller.text; + } + if (controller == state.surePwdController) { + state.surePwd.value = controller.text; + } + _resetCanSub(); + } + + void _resetCanSub() { + state.canSub.value = state.oldPwdIsOK && state.newPwdIsOK; + print("22222:${state.canSub.value}"); + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart index 915c6def..7598fafc 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_logic.dart'; import '../../../appRouters.dart'; import '../../../app_settings/app_colors.dart'; @@ -19,9 +21,8 @@ class MinePersonInfoResetPasswordPage extends StatefulWidget { class _MinePersonInfoResetPasswordPageState extends State { - final TextEditingController _oldPwdController = TextEditingController(); - final TextEditingController _newPwdController = TextEditingController(); - final TextEditingController _surePwdController = TextEditingController(); + final logic = Get.put(MinePersonInfoResetPasswordLogic()); + final state = Get.find().state; @override Widget build(BuildContext context) { @@ -36,7 +37,7 @@ class _MinePersonInfoResetPasswordPageState child: Column( children: [ LoginInput( - controller: _oldPwdController, + controller: state.oldPwdController, isPwd: true, leftWidget: Text( "${TranslationLoader.lanKeys!.originalPassword!.tr} ", @@ -44,10 +45,10 @@ class _MinePersonInfoResetPasswordPageState ), hintText: "", inputFormatters: [ - // LengthLimitingTextInputFormatter(20), + LengthLimitingTextInputFormatter(20), ]), LoginInput( - controller: _newPwdController, + controller: state.newPwdController, isPwd: true, leftWidget: Text( "${TranslationLoader.lanKeys!.newPassword!.tr} ", @@ -55,10 +56,10 @@ class _MinePersonInfoResetPasswordPageState ), hintText: "", inputFormatters: [ - // LengthLimitingTextInputFormatter(20), + LengthLimitingTextInputFormatter(20), ]), LoginInput( - controller: _surePwdController, + controller: state.surePwdController, isPwd: true, // isHaveLeftWidget: false, leftWidget: Text( @@ -67,7 +68,7 @@ class _MinePersonInfoResetPasswordPageState ), hintText: "", inputFormatters: [ - // LengthLimitingTextInputFormatter(20), + LengthLimitingTextInputFormatter(20), ]), Container( width: 1.sw, @@ -77,12 +78,12 @@ class _MinePersonInfoResetPasswordPageState style: TextStyle( fontSize: 18.w, color: AppColors.darkGrayTextColor))), SizedBox(height: 50.w), - SubmitBtn( + Obx(() => SubmitBtn( btnName: TranslationLoader.lanKeys!.save!.tr, fontSize: 30.sp, borderRadius: 20.w, padding: EdgeInsets.only(top: 25.w, bottom: 25.w), - onClick: () {}), + onClick: () {})), SizedBox(height: 40.w), Row( mainAxisAlignment: MainAxisAlignment.center, diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_state.dart new file mode 100644 index 00000000..bfb97b83 --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_state.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class MinePersonInfoResetPasswordState { + final TextEditingController oldPwdController = TextEditingController(); + final TextEditingController newPwdController = TextEditingController(); + final TextEditingController surePwdController = TextEditingController(); + + static int currentTimeMillis() { + return DateTime.now().millisecondsSinceEpoch; + } + + var oldPwd = ''.obs; + var newPwd = ''.obs; + var surePwd = ''.obs; + var canSub = false.obs; + var date = currentTimeMillis().toString().obs; + + bool get oldPwdIsOK => oldPwd.value.isNotEmpty; + bool get newPwdIsOK => + newPwd.value.isNotEmpty && (newPwd.value == surePwd.value); + + var canResend = false.obs; + + void onClose() {} +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_logic.dart new file mode 100644 index 00000000..e69de29b diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart index f8a23dd4..0c00e267 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart @@ -5,7 +5,6 @@ import 'package:get/get.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/commonItem.dart'; import '../../../tools/submitBtn.dart'; -import '../../../tools/tf_loginInput.dart'; import '../../../tools/titleAppBar.dart'; import '../../../translations/trans_lib.dart'; diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_state.dart new file mode 100644 index 00000000..e69de29b diff --git a/star_lock/lib/network/api.dart b/star_lock/lib/network/api.dart index d3acbcf6..bc2f2729 100644 --- a/star_lock/lib/network/api.dart +++ b/star_lock/lib/network/api.dart @@ -123,4 +123,10 @@ abstract class Api { final String userLogoutURL = '/user/logout'; //退出登录 final String deleteAccountURL = '/user/delete'; //删除账号 final String getUserInfoURL = '/user/getUserInfo'; //获取个人信息 + final String getValidationCodeAuthURL = + '/user/sendValidationCodeAuth'; //登录后使用,免图片滑动验证 + final String updateUserInfoURL = '/user/updateUserInfo'; //更新个人信息-昵称/头像 + final String changeAccountURL = '/user/changeAccount'; //修改账号 + final String bindEmailURL = '/user/bindEmail'; //绑定邮箱 + final String changePasswordURL = '/user/changePassword'; //修改密码 } diff --git a/star_lock/lib/network/api_provider.dart b/star_lock/lib/network/api_provider.dart index 963c5bdf..11f28c35 100644 --- a/star_lock/lib/network/api_provider.dart +++ b/star_lock/lib/network/api_provider.dart @@ -255,24 +255,19 @@ class ApiProvider extends BaseProvider { })); // 锁记录上传 - Future lockRecordUploadData( - String lockId, - List records) => - post( - lockRecordUploadURL.toUrl, - jsonEncode({ - 'lockId': lockId, - 'records': records, - })); + Future lockRecordUploadData(String lockId, List records) => post( + lockRecordUploadURL.toUrl, + jsonEncode({ + 'lockId': lockId, + 'records': records, + })); // 查询锁记录最后时间 - Future getLockRecordLastUploadDataTime( - String lockId) => - post( - getLockRecordLastUploadDataTimeURL.toUrl, - jsonEncode({ - 'lockId': lockId, - })); + Future getLockRecordLastUploadDataTime(String lockId) => post( + getLockRecordLastUploadDataTimeURL.toUrl, + jsonEncode({ + 'lockId': lockId, + })); // 绑定蓝牙管理员 Future bindingBlueAdmin( @@ -1157,6 +1152,60 @@ class ApiProvider extends BaseProvider { // 重置密码钥匙 Future keyboardPwdReset(String lockId) => post(keyboardPwdResetURL.toUrl, jsonEncode({'lockId': lockId})); + +//登陆后可使用获取验证码,免图片滑动验证 + Future getValidationCodeAuth(String countryCode, String account, + String channel, String codeType, String uniqueid, String xWidth) => + post( + getValidationCodeAuthURL.toUrl, + jsonEncode({ + 'countryCode': countryCode, + 'account': account, + "channel": channel, + 'codeType': codeType, + "uniqueid": uniqueid, + 'xWidth': xWidth, + })); + + //更新个人信息-头像/昵称 + Future updateUserInfo(String nickname) => + post(updateUserInfoURL.toUrl, jsonEncode({'nickname': nickname})); + + //修改账号 + Future changeAccount(String countryCode, String newAccount, + String uniqueid, String verificationCode) => + post( + changeAccountURL.toUrl, + jsonEncode({ + 'countryCode': countryCode, + 'newAccount': newAccount, + 'uniqueid': uniqueid, + 'verificationCode': verificationCode + })); + + //绑定邮箱 + Future bindEmail(String email, String uniqueid, + String verificationCode, String operatorUid) => + post( + bindEmailURL.toUrl, + jsonEncode({ + 'email': email, + 'uniqueid': uniqueid, + 'verificationCode': verificationCode, + 'operatorUid': operatorUid + })); + +//修改密码 + Future changePassword(String date, String newPassword, + String oldPassword, String operatorUid) => + post( + changePasswordURL.toUrl, + jsonEncode({ + "date": date, + 'newPassword': newPassword, + "oldPassword": oldPassword, + 'operatorUid': operatorUid + })); } extension ExtensionString on String { diff --git a/star_lock/lib/network/api_repository.dart b/star_lock/lib/network/api_repository.dart index 69c4f077..0cc09316 100644 --- a/star_lock/lib/network/api_repository.dart +++ b/star_lock/lib/network/api_repository.dart @@ -7,6 +7,7 @@ import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/ma import 'package:star_lock/main/lockDetail/lcokSet/basicInformation/basicInformation/KeyDetailEntity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKeyEntity.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfo/minePersonInfo_entity.dart'; import 'package:star_lock/mine/mineSet/appUnlockNeedMobileNetworkingLock/selectLockListEntity.dart'; import 'package:star_lock/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetailEntity.dart'; import 'package:star_lock/mine/mineSet/authorizedAdministrator/authorizedAdminListEntity.dart'; @@ -211,23 +212,15 @@ class ApiRepository { //操作记录上传 Future lockRecordUploadData( - { - required String lockId, - required List records - }) async { - final res = await apiProvider.lockRecordUploadData( - lockId, - records); + {required String lockId, required List records}) async { + final res = await apiProvider.lockRecordUploadData(lockId, records); return KeyOperationRecordEntity.fromJson(res.body); } // 查询锁记录最后时间 - Future getLockRecordLastUploadDataTime( - { - required String lockId - }) async { - final res = await apiProvider.getLockRecordLastUploadDataTime( - lockId); + Future + getLockRecordLastUploadDataTime({required String lockId}) async { + final res = await apiProvider.getLockRecordLastUploadDataTime(lockId); return LockOperatingRecordGetLastRecordTimeEntity.fromJson(res.body); } @@ -1134,17 +1127,17 @@ class ApiRepository { } //删除账号 - Future deleteAccount( + Future deleteAccount( String operatorUid, String uniqueid, String verificationCode) async { final res = await apiProvider.deleteAccount( operatorUid, uniqueid, verificationCode); - return AuthorizedAdminListEntity.fromJson(res.body); + return LoginEntity.fromJson(res.body); } //获取个人信息 - Future getUserInfo(String operatorUid) async { + Future getUserInfo(String operatorUid) async { final res = await apiProvider.getUserInfo(operatorUid); - return AuthorizedAdminListEntity.fromJson(res.body); + return MinePersonInfoEntity.fromJson(res.body); } //重置密码钥匙 @@ -1152,4 +1145,47 @@ class ApiRepository { final res = await apiProvider.keyboardPwdReset(lockId); return PasswordKeyListEntity.fromJson(res.body); } + + // 发送验证码 2、登陆后可使用 sendValidationCodeAuth 接口,免图片滑动验证 5删除账号 + Future getValidationCodeAuth( + String countryCode, + String account, + String channel, + String codeType, + String uniqueid, + String xWidth) async { + final res = await apiProvider.getValidationCodeAuth( + countryCode, account, channel, codeType, uniqueid, xWidth); + return SendValidationCodeEntity.fromJson(res.body); + } + + //更新个人信息-头像/昵称 + Future updateUserInfo(String nickname) async { + final res = await apiProvider.updateUserInfo(nickname); + return PasswordKeyListEntity.fromJson(res.body); + } + + //修改账号 + Future changeAccount(String countryCode, + String newAccount, String uniqueid, String verificationCode) async { + final res = await apiProvider.changeAccount( + countryCode, newAccount, uniqueid, verificationCode); + return PasswordKeyListEntity.fromJson(res.body); + } + + //绑定邮箱 + Future bindEmail(String email, String uniqueid, + String verificationCode, String operatorUid) async { + final res = await apiProvider.bindEmail( + email, uniqueid, verificationCode, operatorUid); + return PasswordKeyListEntity.fromJson(res.body); + } + + //重置密码 + Future changePassword(String date, String newPassword, + String oldPassword, String operatorUid) async { + final res = await apiProvider.changePassword( + date, newPassword, oldPassword, operatorUid); + return LoginEntity.fromJson(res.body); + } } diff --git a/star_lock/lib/tools/tf_input_haveBorder.dart b/star_lock/lib/tools/tf_input_haveBorder.dart index 96e7b3a3..ae88d61b 100644 --- a/star_lock/lib/tools/tf_input_haveBorder.dart +++ b/star_lock/lib/tools/tf_input_haveBorder.dart @@ -8,7 +8,6 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; * */ class TFInputHaveBorder extends StatelessWidget { - TextEditingController? controller; List? inputFormatters; TextInputType? keyboardType; @@ -18,7 +17,18 @@ class TFInputHaveBorder extends StatelessWidget { String? label; bool? isPwd; Widget? rightSlot; - TFInputHaveBorder({Key? key, required this.controller,this.rightSlot,this.label,this.isPwd,this.inputFormatters,this.keyboardType,this.background,this.hintText, this.leftImg}) : super(key: key); + TFInputHaveBorder( + {Key? key, + required this.controller, + this.rightSlot, + this.label, + this.isPwd, + this.inputFormatters, + this.keyboardType, + this.background, + this.hintText, + this.leftImg}) + : super(key: key); @override Widget build(BuildContext context) { @@ -29,39 +39,47 @@ class TFInputHaveBorder extends StatelessWidget { maxLines: 1, keyboardType: TextInputType.text, // inputFormatters: inputFormatterstters??[], - controller:controller, + controller: controller, autofocus: false, textAlign: TextAlign.start, - style:TextStyle(height: 1.1, fontSize: 30.sp, fontWeight: FontWeight.w400, color: const Color(0xFF333333)), + style: TextStyle( + height: 1.1, + fontSize: 24.sp, + fontWeight: FontWeight.w400, + color: const Color(0xFF333333)), decoration: InputDecoration( hintText: label, hintStyle: TextStyle( height: 1.1, - fontSize: 30.sp, + fontSize: 24.sp, fontWeight: FontWeight.w400, - color: const Color(0xFF999999) - ), + color: const Color(0xFF999999)), // labelText:"label", labelStyle: const TextStyle(color: Color(0xFF999999)), border: const OutlineInputBorder( ///设置边框四个角的弧度 borderRadius: BorderRadius.all(Radius.circular(10)), + ///用来配置边框的样式 borderSide: BorderSide( ///设置边框的颜色 color: Color(0xffD3D3D3), + ///设置边框的粗细 width: 1, ), ), + ///设置输入框可编辑时的边框样式 enabledBorder: const OutlineInputBorder( ///设置边框四个角的弧度 borderRadius: BorderRadius.all(Radius.circular(10)), + ///用来配置边框的样式 borderSide: BorderSide( ///设置边框的颜色 color: Color(0xffD3D3D3), + ///设置边框的粗细 width: 1, ), @@ -69,33 +87,36 @@ class TFInputHaveBorder extends StatelessWidget { disabledBorder: const OutlineInputBorder( ///设置边框四个角的弧度 borderRadius: BorderRadius.all(Radius.circular(10)), + ///用来配置边框的样式 borderSide: BorderSide( ///设置边框的颜色 color: Color(0xffD3D3D3), + ///设置边框的粗细 width: 1, ), ), + ///用来配置输入框获取焦点时的颜色 focusedBorder: const OutlineInputBorder( ///设置边框四个角的弧度 borderRadius: BorderRadius.all(Radius.circular(10)), + ///用来配置边框的样式 borderSide: BorderSide( ///设置边框的颜色 color: Color(0xffD3D3D3), + ///设置边框的粗细 width: 1, ), ), ), - obscureText:false, - onChanged: (String value){ - - }, + obscureText: false, + onChanged: (String value) {}, ), - rightSlot??const SizedBox(width: 0,height: 0) + rightSlot ?? const SizedBox(width: 0, height: 0) ], ); } diff --git a/star_lock/lib/translations/lanKeyEntity.dart b/star_lock/lib/translations/lanKeyEntity.dart index b2c895fc..057043f5 100644 --- a/star_lock/lib/translations/lanKeyEntity.dart +++ b/star_lock/lib/translations/lanKeyEntity.dart @@ -311,6 +311,7 @@ class LanKeyEntity { this.registerPasswordTip, this.iphone, this.email, + this.mobileNumber, this.countryAndRegion, this.selet, this.businessCooperation, @@ -734,6 +735,7 @@ class LanKeyEntity { registerPasswordTip = json['registerPasswordTip']; iphone = json['iphone']; email = json['email']; + mobileNumber = json['mobileNumber']; countryAndRegion = json['countryAndRegion']; selet = json['selet']; @@ -1158,6 +1160,7 @@ class LanKeyEntity { String? registerPasswordTip; String? iphone; String? email; + String? mobileNumber; String? countryAndRegion; String? selet; @@ -1587,6 +1590,7 @@ class LanKeyEntity { map['registerPasswordTip'] = registerPasswordTip; map['iphone'] = iphone; map['email'] = email; + map['mobileNumber'] = mobileNumber; map['countryAndRegion'] = countryAndRegion; map['selet'] = selet; From 4f598ac5a3604327787adc23edffbf510c330373 Mon Sep 17 00:00:00 2001 From: Daisy <> Date: Mon, 9 Oct 2023 18:52:42 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8E=BB=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E4=B8=AD=E8=8B=B1=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/images/lan/lan_en.json | 1 + star_lock/images/lan/lan_keys.json | 1 + star_lock/images/lan/lan_zh.json | 1 + .../minePersonInfo/minePersonInfo_page.dart | 8 ++++++-- star_lock/lib/translations/lanKeyEntity.dart | 4 ++++ 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/star_lock/images/lan/lan_en.json b/star_lock/images/lan/lan_en.json index 62345b97..c2e3d8e6 100644 --- a/star_lock/images/lan/lan_en.json +++ b/star_lock/images/lan/lan_en.json @@ -255,6 +255,7 @@ "pleaseEnterNewAccountNumber":"Please enter your new account number", "changeIphoneTip":"When you retrieve your password and log in to a new device, you can verify it with the attached phone", "changeEmailTip":"When you retrieve your password and log in to a new device, you can verify it with the attached Email", + "goBind":"Go Bind", "originalPassword":"Original Password", "newPassword":"New Password", "surePassword":"Sure Password", diff --git a/star_lock/images/lan/lan_keys.json b/star_lock/images/lan/lan_keys.json index 8a551768..945a186f 100644 --- a/star_lock/images/lan/lan_keys.json +++ b/star_lock/images/lan/lan_keys.json @@ -252,6 +252,7 @@ "pleaseEnterNewAccountNumber":"pleaseEnterNewAccountNumber", "changeIphoneTip":"changeIphoneTip", "changeEmailTip":"changeEmailTip", + "goBind":"goBind", "originalPassword":"originalPassword", "newPassword":"newPassword", "surePassword":"surePassword", diff --git a/star_lock/images/lan/lan_zh.json b/star_lock/images/lan/lan_zh.json index 4bd4b51c..883b8253 100644 --- a/star_lock/images/lan/lan_zh.json +++ b/star_lock/images/lan/lan_zh.json @@ -252,6 +252,7 @@ "pleaseEnterNewAccountNumber":"请输入新账号", "changeIphoneTip":"找回密码和登录新设备时,可通过绑定的手机验证", "changeEmailTip":"找回密码和登录新设备时,可通过绑定的邮箱验证", + "goBind":"去绑定", "originalPassword":"原密码", "newPassword":"新密码", "surePassword":"确认密码", diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_page.dart index 37d19378..3bf46f28 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_page.dart @@ -70,7 +70,9 @@ class _MinePersonInfoPageState extends State { })), Obx(() => CommonItem( leftTitel: TranslationLoader.lanKeys!.mobileNumber!.tr, - rightTitle: state.mobileStr.value, + rightTitle: state.mobileStr.value.isNotEmpty + ? state.mobileStr.value + : TranslationLoader.lanKeys!.goBind!.tr, isHaveLine: true, isHaveDirection: true, action: () { @@ -93,7 +95,9 @@ class _MinePersonInfoPageState extends State { })), Obx(() => CommonItem( leftTitel: TranslationLoader.lanKeys!.email!.tr, - rightTitle: state.emailStr.value, + rightTitle: state.emailStr.value.isNotEmpty + ? state.emailStr.value + : TranslationLoader.lanKeys!.goBind!.tr, isHaveLine: true, isHaveDirection: true, action: () { diff --git a/star_lock/lib/translations/lanKeyEntity.dart b/star_lock/lib/translations/lanKeyEntity.dart index 057043f5..dc8b3478 100644 --- a/star_lock/lib/translations/lanKeyEntity.dart +++ b/star_lock/lib/translations/lanKeyEntity.dart @@ -247,6 +247,7 @@ class LanKeyEntity { this.pleaseEnterNewAccountNumber, this.changeIphoneTip, this.changeEmailTip, + this.goBind, this.originalPassword, this.newPassword, this.surePassword, @@ -664,6 +665,7 @@ class LanKeyEntity { pleaseEnterNewAccountNumber = json['pleaseEnterNewAccountNumber']; changeIphoneTip = json['changeIphoneTip']; changeEmailTip = json['changeEmailTip']; + goBind = json['goBind']; originalPassword = json['originalPassword']; newPassword = json['newPassword']; surePassword = json['surePassword']; @@ -1093,6 +1095,7 @@ class LanKeyEntity { String? pleaseEnterNewAccountNumber; String? changeIphoneTip; String? changeEmailTip; + String? goBind; String? originalPassword; String? newPassword; String? surePassword; @@ -1521,6 +1524,7 @@ class LanKeyEntity { map['pleaseEnterNewAccountNumber'] = pleaseEnterNewAccountNumber; map['changeIphoneTip'] = changeIphoneTip; map['changeEmailTip'] = changeEmailTip; + map['goBind'] = goBind; map['originalPassword'] = originalPassword; map['newPassword'] = newPassword; map['surePassword'] = surePassword; From 12ecefa5d838d949e61f12714b3e7ef055d2f563 Mon Sep 17 00:00:00 2001 From: Daisy <> Date: Wed, 11 Oct 2023 18:24:52 +0800 Subject: [PATCH 3/3] =?UTF-8?q?1=EF=BC=8C=E4=BF=AE=E6=94=B9=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E5=8F=B7=E3=80=81=E9=82=AE=E7=AE=B1=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=8F=8A=E8=AF=B7=E6=B1=82=E5=A4=84=E7=90=86?= =?UTF-8?q?=202=EF=BC=8C=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E6=89=8B=E6=9C=BA=E5=8F=B7/=E9=82=AE=E7=AE=B1=203?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3=204?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96=E5=B7=B2=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E7=9A=84=E5=AE=89=E5=85=A8=E4=BF=A1=E6=81=AF=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=205=EF=BC=8C=E6=96=B0=E5=A2=9E=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=AE=89=E5=85=A8=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3=206?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96=E8=A7=A3=E7=BB=91?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=B7Token=207=EF=BC=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=A7=A3=E7=BB=91=E9=82=AE=E7=AE=B1Token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/images/lan/lan_zh.json | 2 +- star_lock/ios/Podfile.lock | 6 + star_lock/ios/Runner/Info.plist | 2 +- star_lock/lib/appRouters.dart | 29 +-- .../minePersonInfo/minePersonInfo_state.dart | 11 -- .../minePersonInfoAvatar/cropImageRoute.dart | 1 + .../mineUnbindPhoneOrEmail_entity.dart | 43 +++++ ...dart => mineUnbindPhoneOrEmail_logic.dart} | 43 +++-- ....dart => mineUnbindPhoneOrEmail_page.dart} | 33 ++-- ...dart => mineUnbindPhoneOrEmail_state.dart} | 39 ++-- .../minePersonInfoEditAccountNext_state.dart | 7 +- ...c.dart => mineBindPhoneOrEmail_logic.dart} | 24 +-- ...ge.dart => mineBindPhoneOrEmail_page.dart} | 30 ++-- ...e.dart => mineBindPhoneOrEmail_state.dart} | 8 +- .../minePersonInfo_entity.dart | 8 +- .../minePersonInfo_logic.dart | 3 +- .../minePersonInfo_page.dart | 120 +++++++------ .../minePersonInfo_state.dart | 19 ++ .../minePersonInfoResetPassword_logic.dart | 1 - .../minePersonInfoResetPassword_page.dart | 14 +- .../minePersonInfoResetPassword_state.dart | 2 - ...minePersonInfoSetSafetyProblem_entity.dart | 133 ++++++++++++++ .../minePersonInfoSetSafetyProblem_logic.dart | 69 +++++++ .../minePersonInfoSetSafetyProblem_page.dart | 170 ++++++++++-------- .../minePersonInfoSetSafetyProblem_state.dart | 47 +++++ ...inePersonInfoViewSafetyProblem_entity.dart | 57 ++++++ ...minePersonInfoViewSafetyProblem_logic.dart | 34 ++++ .../minePersonInfoViewSafetyProblem_page.dart | 114 ++++++++++++ ...minePersonInfoViewSafetyProblem_state.dart | 16 ++ star_lock/lib/network/api.dart | 13 +- star_lock/lib/network/api_provider.dart | 55 ++++-- star_lock/lib/network/api_provider_base.dart | 2 +- star_lock/lib/network/api_repository.dart | 64 +++++-- star_lock/lib/tools/custom_bottom_sheet.dart | 117 ++++++++++++ star_lock/lib/tools/tf_input_haveBorder.dart | 8 +- star_lock/pubspec.yaml | 7 +- 36 files changed, 1077 insertions(+), 274 deletions(-) delete mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_state.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoAvatar/cropImageRoute.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart rename star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/{minePersonInfoEditAccount_logic.dart => mineUnbindPhoneOrEmail_logic.dart} (57%) rename star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/{minePersonInfoEditAccount_page.dart => mineUnbindPhoneOrEmail_page.dart} (79%) rename star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/{minePersonInfoEditAccount_state.dart => mineUnbindPhoneOrEmail_state.dart} (56%) rename star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/{minePersonInfoEmail_logic.dart => mineBindPhoneOrEmail_logic.dart} (74%) rename star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/{minePersonInfoEmail_page.dart => mineBindPhoneOrEmail_page.dart} (80%) rename star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/{minePersonInfoEmail_state.dart => mineBindPhoneOrEmail_state.dart} (86%) rename star_lock/lib/mine/minePersonInfo/{minePersonInfo => minePersonInfoPage}/minePersonInfo_entity.dart (90%) rename star_lock/lib/mine/minePersonInfo/{minePersonInfo => minePersonInfoPage}/minePersonInfo_logic.dart (81%) rename star_lock/lib/mine/minePersonInfo/{minePersonInfo => minePersonInfoPage}/minePersonInfo_page.dart (66%) create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_state.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_entity.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_entity.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_logic.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_page.dart create mode 100644 star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_state.dart create mode 100644 star_lock/lib/tools/custom_bottom_sheet.dart diff --git a/star_lock/images/lan/lan_zh.json b/star_lock/images/lan/lan_zh.json index 883b8253..6ba9b604 100644 --- a/star_lock/images/lan/lan_zh.json +++ b/star_lock/images/lan/lan_zh.json @@ -247,7 +247,7 @@ "modifyAccount":"修改账号", "resetPasswords":"重置密码", "safetyProblem":"安全问题", - "modifyAccountTip":"为了你的账号安全,修改账号前请先使用账号密码验证", + "modifyAccountTip":"为了你的账号安全,修改账号前请先使用验证码验证", "pleaseEnterAccountNumber":"请输入账号", "pleaseEnterNewAccountNumber":"请输入新账号", "changeIphoneTip":"找回密码和登录新设备时,可通过绑定的手机验证", diff --git a/star_lock/ios/Podfile.lock b/star_lock/ios/Podfile.lock index 0c27c598..fe983598 100644 --- a/star_lock/ios/Podfile.lock +++ b/star_lock/ios/Podfile.lock @@ -12,6 +12,8 @@ PODS: - AMapFoundation (1.8.2) - AMapLocation (2.10.0): - AMapFoundation (>= 1.8.0) + - camera_avfoundation (0.0.1): + - Flutter - device_info_plus (0.0.1): - Flutter - Flutter (1.0.0) @@ -62,6 +64,7 @@ DEPENDENCIES: - aj_captcha_flutter (from `.symlinks/plugins/aj_captcha_flutter/ios`) - amap_flutter_location (from `.symlinks/plugins/amap_flutter_location/ios`) - amap_flutter_map (from `.symlinks/plugins/amap_flutter_map/ios`) + - camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - Flutter (from `Flutter`) - flutter_native_contact_picker (from `.symlinks/plugins/flutter_native_contact_picker/ios`) @@ -95,6 +98,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/amap_flutter_location/ios" amap_flutter_map: :path: ".symlinks/plugins/amap_flutter_map/ios" + camera_avfoundation: + :path: ".symlinks/plugins/camera_avfoundation/ios" device_info_plus: :path: ".symlinks/plugins/device_info_plus/ios" Flutter: @@ -131,6 +136,7 @@ SPEC CHECKSUMS: amap_flutter_map: 979e54d227cedac6c7504a2151bfbf3bcf96760a AMapFoundation: 9885c48fc3a78fdfb84a0299a2293e56ea3c9fec AMapLocation: 5248aec2455ebb5d104b367813c946430a2ee033 + camera_avfoundation: 3125e8cd1a4387f6f31c6c63abb8a55892a9eeeb device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 flutter_native_contact_picker: bd430ba0fbf82768bb50c2c52a69a65759a8f907 diff --git a/star_lock/ios/Runner/Info.plist b/star_lock/ios/Runner/Info.plist index 9300b494..af4195e3 100644 --- a/star_lock/ios/Runner/Info.plist +++ b/star_lock/ios/Runner/Info.plist @@ -36,7 +36,7 @@ NSBluetoothPeripheralUsageDescription The app uses bluetooth to find, connect and transfer data between different devices NSCameraUsageDescription - 这是你的自拍照 + 照片 NSContactsUsageDescription Reason we need access to the contact list NSLocationAlwaysAndWhenInUseUsageDescription diff --git a/star_lock/lib/appRouters.dart b/star_lock/lib/appRouters.dart index d68f1e09..02a8a7ba 100644 --- a/star_lock/lib/appRouters.dart +++ b/star_lock/lib/appRouters.dart @@ -9,7 +9,8 @@ import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/ma import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart'; import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_main_page.dart'; import 'package:star_lock/mine/mine/safeVerify/safeVerify_page.dart'; -import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_page.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_page.dart'; import 'package:star_lock/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator_page.dart'; import 'package:star_lock/mine/mineSet/authorizedAdministrator/administratorDetails/adminDetailChangeDate_page.dart'; import 'package:star_lock/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetails_page.dart'; @@ -109,8 +110,8 @@ import 'mine/gateway/gatewayList/gatewayList_page.dart'; import 'mine/message/messageList_page.dart'; import 'mine/mine/starLockMine_page.dart'; import 'mine/mineMultiLanguage/mineMultiLanguage_page.dart'; -import 'mine/minePersonInfo/minePersonInfo/minePersonInfo_page.dart'; -import 'mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_page.dart'; +import 'mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart'; +import 'mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_page.dart'; import 'mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart'; import 'mine/minePersonInfo/minePersonInfoEditIphone/minePersonInfoEditIphone_page.dart'; import 'mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_page.dart'; @@ -237,8 +238,8 @@ abstract class Routers { static const minePersonInfoPage = '/MinePersonInfoPage'; // 我的信息 static const minePersonInfoEditNamePage = '/MinePersonInfoEditNamePage'; // 我的信息编辑昵称 - static const minePersonInfoEditAccountPage = - '/MinePersonInfoEditAccountPage'; // 我的信息修改账号 + static const mineUnbindPhoneOrEmailPage = + '/MineUnbindPhoneOrEmailPage'; // 我的信息修改账号-解绑 static const minePersonInfoEditAccountNextPage = '/MinePersonInfoEditAccountNextPage'; // 我的信息修改账号下一页 static const minePersonInfoEditIphonePage = @@ -247,8 +248,9 @@ abstract class Routers { '/MinePersonInfoResetPasswordPage'; // 我的信息重置密码 static const minePersonInfoSetSafetyProblemPage = '/MinePersonInfoSetSafetyProblemPage'; // 我的信息设置安全问题 - static const minePersonInfoEditEmailPage = - '/MinePersonInfoEditEmailPage'; //我的信息-邮箱 + static const minePersonInfoViewSafetyProblemPage = + '/MinePersonInfoViewSafetyProblemPage'; // 查看我的安全问题 + static const mineBindPhoneOrEmailPage = '/MineBindPhoneOrEmailPage'; //我的信息-邮箱 static const gatewayListPage = '/GatewayListPage'; // 我的-网关 static const gatewayDetailPage = '/GatewayDetailPage'; // 我的-网关详情 @@ -616,8 +618,8 @@ abstract class AppRouters { page: () => const MinePersonInfoEditNamePage(), ), GetPage( - name: Routers.minePersonInfoEditAccountPage, - page: () => const MinePersonInfoEditAccountPage(), + name: Routers.mineUnbindPhoneOrEmailPage, + page: () => const MineUnbindPhoneOrEmailPage(), ), GetPage( name: Routers.minePersonInfoEditIphonePage, @@ -749,8 +751,8 @@ abstract class AppRouters { name: Routers.selectGetewayListPage, page: () => const SelectGetewayListPage()), GetPage( - name: Routers.minePersonInfoEditEmailPage, - page: () => const MinePersonInfoEditEmailPage()), + name: Routers.mineBindPhoneOrEmailPage, + page: () => const MineBindPhoneOrEmailPage()), GetPage( name: Routers.addAuthorizedAdministratorPage, page: () => const AddAuthorizedAdministratorPage()), @@ -815,6 +817,9 @@ abstract class AppRouters { GetPage( name: Routers.expireLockChangeDatePage, page: () => const ExpireLockChangeDatePage()), - GetPage(name: Routers.safeVerifyPage, page: () => const SafeVerifyPage()) + GetPage(name: Routers.safeVerifyPage, page: () => const SafeVerifyPage()), + GetPage( + name: Routers.minePersonInfoViewSafetyProblemPage, + page: () => const MinePersonInfoViewSafetyProblemPage()) ]; } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_state.dart deleted file mode 100644 index d124c4eb..00000000 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_state.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:get/get.dart'; -import 'package:star_lock/mine/minePersonInfo/minePersonInfo/minePersonInfo_entity.dart'; - -class MinePersonInfoState { - final mineInfoData = MinePersonInfoData().obs; - - var nickname = ''.obs; //昵称 - var mobileStr = ''.obs; //手机号 - var emailStr = ''.obs; //邮箱 - var countryStr = ''.obs; //国家/地区 -} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoAvatar/cropImageRoute.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoAvatar/cropImageRoute.dart new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoAvatar/cropImageRoute.dart @@ -0,0 +1 @@ + diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart new file mode 100644 index 00000000..0f3134be --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart @@ -0,0 +1,43 @@ +class MineUnbindPhoneOrEmailEntity { + int? errorCode; + String? description; + String? errorMsg; + Data? data; + + MineUnbindPhoneOrEmailEntity( + {this.errorCode, this.description, this.errorMsg, this.data}); + + MineUnbindPhoneOrEmailEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + data = json['data'] != null ? Data.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class Data { + String? token; + + Data({this.token}); + + Data.fromJson(Map json) { + token = json['token']; + } + + Map toJson() { + final Map data = {}; + data['token'] = token; + return data; + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_logic.dart similarity index 57% rename from star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_logic.dart rename to star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_logic.dart index 9e5e0e65..4a2ad98a 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_logic.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_logic.dart @@ -4,14 +4,13 @@ import 'package:get/get_core/src/get_main.dart'; import 'package:get/get_navigation/src/extension_navigation.dart'; import 'package:get/get_utils/get_utils.dart'; import 'package:star_lock/appRouters.dart'; -import 'package:star_lock/login/login/entity/LoginEntity.dart'; -import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_state.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_state.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; -import 'package:star_lock/tools/toast.dart'; -class MineInfoEditAccountLogic extends BaseGetXController { - final MineInfoEditAccountState state = MineInfoEditAccountState(); +class MineUnbindPhoneOrEmailLogic extends BaseGetXController { + final MineUnbindPhoneOrEmailState state = MineUnbindPhoneOrEmailState(); late Timer _timer; void _startTimer() { @@ -33,8 +32,8 @@ class MineInfoEditAccountLogic extends BaseGetXController { //获取验证码请求 void sendValidationCode() async { var entity = await ApiRepository.to.getValidationCodeAuth( - state.countryCode.value, - state.loginData.value.mobile!, + '', + '', state.channel.value, state.codeType.value, state.uniqueid.value, @@ -44,14 +43,29 @@ class MineInfoEditAccountLogic extends BaseGetXController { } else {} } - //删除账号请求 - Future deleteAccountRequest() async { - LoginEntity entity = await ApiRepository.to - .deleteAccount("", "", state.verificationCode.value); + //获取解绑手机号Token + Future unbindPhoneTokenRequest() async { + MineUnbindPhoneOrEmailEntity entity = + await ApiRepository.to.unbindPhoneToken(state.verificationCode.value); if (entity.errorCode!.codeIsSuccessful) { - Toast.show(msg: '验证成功,账号已删除'); - //删除账号成功, - Get.offNamedUntil(Routers.starLockLoginPage, (route) => false); + state.unbindToken.value = entity.data!.token!; + Get.toNamed(Routers.mineBindPhoneOrEmailPage, arguments: { + "isFrom": state.channel.value, + "unbindToken": state.unbindToken.value + }); + } + } + + //获取解绑邮箱Token + Future unbindEmailTokenRequest() async { + MineUnbindPhoneOrEmailEntity entity = + await ApiRepository.to.unbindEmailToken(state.verificationCode.value); + if (entity.errorCode!.codeIsSuccessful) { + state.unbindToken.value = entity.data!.token!; + Get.toNamed(Routers.mineBindPhoneOrEmailPage, arguments: { + "isFrom": state.channel.value, + "unbindToken": state.unbindToken.value + }); } } @@ -78,7 +92,6 @@ class MineInfoEditAccountLogic extends BaseGetXController { @override void onInit() { super.onInit(); - state.initLoginData(); } @override diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_page.dart similarity index 79% rename from star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_page.dart rename to star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_page.dart index 2d73ea6c..c9d0c9d5 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_page.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_logic.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_logic.dart'; import 'package:star_lock/tools/tf_input_haveBorder.dart'; import '../../../../appRouters.dart'; @@ -10,18 +10,17 @@ import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; import '../../../../translations/trans_lib.dart'; -class MinePersonInfoEditAccountPage extends StatefulWidget { - const MinePersonInfoEditAccountPage({Key? key}) : super(key: key); +class MineUnbindPhoneOrEmailPage extends StatefulWidget { + const MineUnbindPhoneOrEmailPage({Key? key}) : super(key: key); @override - State createState() => - _MinePersonInfoEditAccountPageState(); + State createState() => + _MineUnbindPhoneOrEmailState(); } -class _MinePersonInfoEditAccountPageState - extends State { - final logic = Get.put(MineInfoEditAccountLogic()); - final state = Get.find().state; +class _MineUnbindPhoneOrEmailState extends State { + final logic = Get.put(MineUnbindPhoneOrEmailLogic()); + final state = Get.find().state; @override Widget build(BuildContext context) { @@ -46,6 +45,9 @@ class _MinePersonInfoEditAccountPageState left: 30.w, right: 30.w, top: 20.h, bottom: 10.h), child: TFInputHaveBorder( controller: state.codeController, + onChangeAction: () { + logic.checkNext(state.codeController); + }, label: "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.verificationCode!.tr}", rightSlot: GestureDetector( @@ -68,13 +70,16 @@ class _MinePersonInfoEditAccountPageState }, )))), SizedBox(height: 50.w), - SubmitBtn( + Obx(() => SubmitBtn( btnName: TranslationLoader.lanKeys!.next!.tr, + isDisabled: state.canSub.value, onClick: () { - Navigator.pushNamed( - context, Routers.minePersonInfoEditAccountNextPage, - arguments: {'isFrom': '1'}); - }), + if (state.channel.value == '1') { + logic.unbindPhoneTokenRequest(); + } else { + logic.unbindEmailTokenRequest(); + } + })), SizedBox(height: 50.w), Row( mainAxisAlignment: MainAxisAlignment.end, diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_state.dart similarity index 56% rename from star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_state.dart rename to star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_state.dart index f8710490..2a03136b 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/minePersonInfoEditAccount_state.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_state.dart @@ -1,22 +1,20 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:star_lock/login/login/entity/LoginData.dart'; -import 'package:star_lock/login/seletCountryRegion/common/index.dart'; -import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/translations/trans_lib.dart'; -class MineInfoEditAccountState { +class MineUnbindPhoneOrEmailState { final TextEditingController codeController = TextEditingController(); static int currentTimeMillis() { return DateTime.now().millisecondsSinceEpoch; } - var countryCode = '+86'.obs; - var countryId = '9'.obs; - var codeType = '4'.obs; //1注册,2找回密码,3绑定手机号,4解绑(换绑),5删除账号,6 绑定邮箱 + var countryCode = ''.obs; + var codeType = '4'.obs; //1注册,2找回密码,3绑定手机号,4解绑手机(换绑),5删除账号,6 绑定邮箱,7解绑邮箱(换绑) var channel = '1'.obs; //短信通道 1 短信,2 邮箱 + var unbindToken = ''.obs; //解绑Token var uniqueid = 'B748F838-94EE-4BDB-A0E6-7B2D16849792'.obs; + var mobileOrEmailStr = ''.obs; var verificationCode = ''.obs; var xWidth = ''.obs; // 滑动验证码滑动位置 var canSub = false.obs; @@ -29,27 +27,16 @@ class MineInfoEditAccountState { var totalSeconds = 120; var currentSecond = 120; - final loginData = LoginData().obs; - - ///本地存储 登录信息 - void saveLoginData(LoginData? data) async { - print("saveLoginData:${data!.mobile}"); - await Storage.setString('userLoginData', jsonEncode(data)); - loginData.value = data; - } - - ///初始化本地数据 - void initLoginData() async { - final data = await Storage.getString('userLoginData'); - print("getLoginData:$data"); - if (data != null && data.isNotEmpty) { - loginData.value = LoginData.fromJson(jsonDecode(data)); - } - } - - MineInfoEditAccountState() { + MineUnbindPhoneOrEmailState() { Map map = Get.arguments; channel.value = map["isFrom"]; + if (channel.value == "1") { + mobileOrEmailStr.value = map['mobile']; + codeType.value = '4'; + } else { + mobileOrEmailStr.value = map['email']; + codeType.value = '7'; + } resetResend(); } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart index 72d5164c..de66eb55 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_state.dart @@ -15,7 +15,7 @@ class PersonInfoEditAccountState { var countryCode = '+86'.obs; var countryId = '9'.obs; - var codeType = '3'.obs; //1注册,2找回密码,3绑定手机号,4解绑(换绑),5删除账号,6 绑定邮箱 + var codeType = '3'.obs; ////1注册,2找回密码,3绑定手机号,4解绑手机(换绑),5删除账号,6 绑定邮箱,7解绑邮箱(换绑) var channel = '1'.obs; //短信通道 1 短信,2 邮箱 var uniqueid = 'B748F838-94EE-4BDB-A0E6-7B2D16849792'.obs; var newAccountStr = ''.obs; @@ -53,6 +53,11 @@ class PersonInfoEditAccountState { PersonInfoEditAccountState() { Map map = Get.arguments; channel.value = map["isFrom"]; + if (channel.value == "1") { + codeType.value = '3'; + } else { + codeType.value = '6'; + } resetResend(); } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_logic.dart similarity index 74% rename from star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_logic.dart rename to star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_logic.dart index 7023c995..801061ff 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_logic.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_logic.dart @@ -2,14 +2,16 @@ import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; +import 'package:star_lock/appRouters.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart'; -import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_state.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_state.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/toast.dart'; -class MinePersonInfoEmailLogic extends BaseGetXController { - final MinePersonInfoEmailState state = MinePersonInfoEmailState(); +class MineBindPhoneOrEmailLogic extends BaseGetXController { + final MineBindPhoneOrEmailState state = MineBindPhoneOrEmailState(); late Timer _timer; void _startTimer() { @@ -31,7 +33,7 @@ class MinePersonInfoEmailLogic extends BaseGetXController { //获取验证码请求 void sendValidationCode() async { var entity = await ApiRepository.to.getValidationCodeAuth( - state.countryCode.value, + state.channel.value == '1' ? state.countryCode.value : '', state.inputAccount.value, state.channel.value, state.codeType.value, @@ -45,23 +47,25 @@ class MinePersonInfoEmailLogic extends BaseGetXController { //绑定邮箱请求 Future bindEmailRequest() async { PasswordKeyListEntity entity = await ApiRepository.to.bindEmail( - state.inputAccount.value, '', state.verificationCode.value, ''); + state.inputAccount.value, + state.verificationCode.value, + state.unbindToken.value); if (entity.errorCode!.codeIsSuccessful) { Toast.show(msg: '邮箱绑定成功'); - Get.back(); + Get.until((route) => route.settings.name == Routers.minePersonInfoPage); } } //绑定手机请求 Future bindMobileRequest() async { - PasswordKeyListEntity entity = await ApiRepository.to.changeAccount( + PasswordKeyListEntity entity = await ApiRepository.to.bindPhone( state.countryCode.value, state.inputAccount.value, - state.uniqueid.value, - state.verificationCode.value); + state.verificationCode.value, + state.unbindToken.value); if (entity.errorCode!.codeIsSuccessful) { Toast.show(msg: '手机绑定成功'); - Get.back(); + Get.until((route) => route.settings.name == Routers.minePersonInfoPage); } } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart similarity index 80% rename from star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_page.dart rename to star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart index 8caa6eed..169bc5c0 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_logic.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_logic.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/submitBtn.dart'; @@ -10,25 +10,26 @@ import '../../../tools/tf_loginInput.dart'; import '../../../tools/titleAppBar.dart'; import '../../../translations/trans_lib.dart'; -class MinePersonInfoEditEmailPage extends StatefulWidget { - const MinePersonInfoEditEmailPage({Key? key}) : super(key: key); +class MineBindPhoneOrEmailPage extends StatefulWidget { + const MineBindPhoneOrEmailPage({Key? key}) : super(key: key); @override - State createState() => - _MinePersonInfoEditEmailPageState(); + State createState() => + _MineBindPhoneOrEmailPageState(); } -class _MinePersonInfoEditEmailPageState - extends State { - final logic = Get.put(MinePersonInfoEmailLogic()); - final state = Get.find().state; +class _MineBindPhoneOrEmailPageState extends State { + final logic = Get.put(MineBindPhoneOrEmailLogic()); + final state = Get.find().state; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.email!.tr, + barTitle: state.channel.value == "1" + ? TranslationLoader.lanKeys!.mobileNumber!.tr + : TranslationLoader.lanKeys!.email!.tr, haveBack: true, backgroundColor: AppColors.mainColor), body: Container( @@ -39,7 +40,9 @@ class _MinePersonInfoEditEmailPageState width: 1.sw, padding: EdgeInsets.only(top: 5.h, bottom: 5.h), child: Text( - TranslationLoader.lanKeys!.changeEmailTip!.tr, + state.channel.value == '1' + ? TranslationLoader.lanKeys!.changeIphoneTip!.tr + : TranslationLoader.lanKeys!.changeEmailTip!.tr, style: TextStyle(fontSize: 20.sp), )), LoginInput( @@ -49,8 +52,9 @@ class _MinePersonInfoEditEmailPageState logic.checkNext(state.accountController); }, leftWidget: const SizedBox(), - hintText: - "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.email!.tr}", + hintText: state.channel.value == '1' + ? "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.mobileNumber!.tr}" + : "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.email!.tr}", inputFormatters: [ LengthLimitingTextInputFormatter(20), ]), diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_state.dart similarity index 86% rename from star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_state.dart rename to star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_state.dart index f5f9f202..ba522c32 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_state.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_state.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/translations/trans_lib.dart'; -class MinePersonInfoEmailState { +class MineBindPhoneOrEmailState { final TextEditingController accountController = TextEditingController(); final TextEditingController codeController = TextEditingController(); @@ -12,7 +12,7 @@ class MinePersonInfoEmailState { var countryCode = '+86'.obs; var countryId = '9'.obs; - var codeType = '4'.obs; //1注册,2找回密码,3绑定手机号,4解绑(换绑),5删除账号,6 绑定邮箱 + var codeType = '4'.obs; //1注册,2找回密码,3绑定手机号,4解绑手机(换绑),5删除账号,6 绑定邮箱,7解绑邮箱(换绑) var channel = '1'.obs; //短信通道 1 短信,2 邮箱 var uniqueid = 'B748F838-94EE-4BDB-A0E6-7B2D16849792'.obs; var verificationCode = ''.obs; @@ -20,6 +20,7 @@ class MinePersonInfoEmailState { var canSub = false.obs; var date = currentTimeMillis().toString().obs; var inputAccount = ''.obs; //新账号 + var unbindToken = ''.obs; //解绑的Token var accountIsOK = false.obs; bool get codeIsOK => verificationCode.value.isNotEmpty; @@ -29,8 +30,9 @@ class MinePersonInfoEmailState { var totalSeconds = 120; var currentSecond = 120; - MinePersonInfoEmailState() { + MineBindPhoneOrEmailState() { Map map = Get.arguments; + unbindToken.value = map["unbindToken"]; channel.value = map["isFrom"]; //短信通道 1 短信,2 邮箱 //短信类型 1注册,2找回密码,3绑定手机号,4解绑(换绑),5删除账号,6 绑定邮箱 diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_entity.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart similarity index 90% rename from star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_entity.dart rename to star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart index 6d031ea4..6064eb8f 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_entity.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart @@ -30,7 +30,7 @@ class MinePersonInfoEntity { class MinePersonInfoData { String? mobile; String? uid; - bool? isSecurityQuestionSetted; + int? haveSafeAnswer; String? nickname; String? headUrl; String? accountName; @@ -41,7 +41,7 @@ class MinePersonInfoData { MinePersonInfoData( {this.mobile, this.uid, - this.isSecurityQuestionSetted, + this.haveSafeAnswer, this.nickname, this.headUrl, this.accountName, @@ -52,7 +52,7 @@ class MinePersonInfoData { MinePersonInfoData.fromJson(Map json) { mobile = json['mobile']; uid = json['uid']; - isSecurityQuestionSetted = json['isSecurityQuestionSetted']; + haveSafeAnswer = json['haveSafeAnswer']; nickname = json['nickname']; headUrl = json['headUrl']; accountName = json['accountName']; @@ -65,7 +65,7 @@ class MinePersonInfoData { final Map data = {}; data['mobile'] = mobile; data['uid'] = uid; - data['isSecurityQuestionSetted'] = isSecurityQuestionSetted; + data['haveSafeAnswer'] = haveSafeAnswer; data['nickname'] = nickname; data['headUrl'] = headUrl; data['accountName'] = accountName; diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart similarity index 81% rename from star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_logic.dart rename to star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart index f23969af..e837241e 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_logic.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart @@ -1,5 +1,5 @@ import 'dart:async'; -import 'package:star_lock/mine/minePersonInfo/minePersonInfo/minePersonInfo_state.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_state.dart'; import '../../../../network/api_repository.dart'; import '../../../../tools/baseGetXController.dart'; @@ -14,6 +14,7 @@ class MinePersonInfoLogic extends BaseGetXController { state.mobileStr.value = entity.data!.mobile!; state.emailStr.value = entity.data!.email!; state.countryStr.value = entity.data!.countryName!; + state.haveSafeAnswer.value = entity.data!.haveSafeAnswer!; } } } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart similarity index 66% rename from star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_page.dart rename to star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart index 3bf46f28..f83cb65f 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfo/minePersonInfo_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart @@ -1,10 +1,12 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:image_picker/image_picker.dart'; import 'package:star_lock/app_settings/app_colors.dart'; -import 'package:star_lock/mine/minePersonInfo/minePersonInfo/minePersonInfo_logic.dart'; -import 'package:star_lock/tools/seletImgTool.dart'; - +import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_logic.dart'; +import 'package:star_lock/tools/custom_bottom_sheet.dart'; import '../../../appRouters.dart'; import '../../../tools/commonItem.dart'; import '../../../tools/titleAppBar.dart'; @@ -45,14 +47,13 @@ class _MinePersonInfoPageState extends State { isHaveLine: true, isHaveDirection: true, isHaveRightWidget: true, - rightWidget: Container(), - /* - Container( - width: 75.w, - height: 75.h, - child: Image.asset( - 'images/mine/icon_mine_main_defaultAvatar.png')), - */ + rightWidget: SizedBox( + width: 75.w, + height: 75.h, + child: state.image != null + ? Image.file(state.image as File) + : Image.asset('images/controls_user.png'), + ), action: () { _openModalBottomSheet(); }, @@ -79,18 +80,17 @@ class _MinePersonInfoPageState extends State { //有手机号 则去修改手机号 否则去绑定新的手机号 isFrom:1 短信,2 邮箱 if (state.mobileStr.value.isNotEmpty) { Navigator.pushNamed( - context, Routers.minePersonInfoEditAccountPage, + context, Routers.mineUnbindPhoneOrEmailPage, arguments: { 'mobile': state.mobileStr.value, 'isFrom': '1' }); } else { Navigator.pushNamed( - context, Routers.minePersonInfoEditEmailPage, - arguments: { - 'mobile': state.mobileStr.value, - 'isFrom': '1' - }); + context, Routers.mineBindPhoneOrEmailPage, arguments: { + 'mobile': state.mobileStr.value, + 'isFrom': '1' + }); } })), Obx(() => CommonItem( @@ -104,18 +104,17 @@ class _MinePersonInfoPageState extends State { //有邮箱 则去修改邮箱 否则去绑定新的邮箱 isFrom:1 短信,2 邮箱 if (state.emailStr.value.isNotEmpty) { Navigator.pushNamed( - context, Routers.minePersonInfoEditAccountPage, + context, Routers.mineUnbindPhoneOrEmailPage, arguments: { 'isFrom': '2', 'email': state.emailStr.value }); } else { Navigator.pushNamed( - context, Routers.minePersonInfoEditEmailPage, - arguments: { - 'isFrom': '2', - 'email': state.emailStr.value - }); + context, Routers.mineBindPhoneOrEmailPage, arguments: { + 'isFrom': '2', + 'email': state.emailStr.value + }); } })), CommonItem( @@ -133,8 +132,14 @@ class _MinePersonInfoPageState extends State { isHaveLine: true, isHaveDirection: true, action: () { - Navigator.pushNamed( - context, Routers.minePersonInfoSetSafetyProblemPage); + if (state.haveSafeAnswer.value == 0) { + Navigator.pushNamed( + context, Routers.minePersonInfoSetSafetyProblemPage) + .then((value) => logic.getUserInfoRequest()); + } else { + Navigator.pushNamed( + context, Routers.minePersonInfoViewSafetyProblemPage); + } }), Obx(() => CommonItem( leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr, @@ -146,38 +151,45 @@ class _MinePersonInfoPageState extends State { } Future _openModalBottomSheet() async { - final option = await showModalBottomSheet( + showModalBottomSheet( context: context, + shape: RoundedRectangleBorder( + borderRadius: BorderRadiusDirectional.circular(10)), builder: (BuildContext context) { - return Container( - height: 200.0, - child: Column( - children: [ - ListTile( - title: Text('拍照', textAlign: TextAlign.center), - onTap: () { - SeletImageTool().getCameraImage((imgStr) { - print("111111$imgStr"); - }); - }, - ), - ListTile( - title: Text('从相册选择', textAlign: TextAlign.center), - onTap: () { - SeletImageTool().getImage((imgStr) { - print("111111$imgStr"); - }); - }, - ), - ListTile( - title: Text('取消', textAlign: TextAlign.center), - onTap: () { - Navigator.pop(context, '取消'); - }, - ), - ], - ), + return AlertBottomWidget( + topTitle: '', + items: const ['拍照', '从相册选择'], + chooseCallback: (value) { + int getSelectIndex = value; + if (getSelectIndex == 0) { + //拍照选项 + selectCamera(); + } else if (getSelectIndex == 1) { + selectImage(); + } + }, ); }); } + + ///拍摄照片 + selectCamera() async { + XFile? photo = await state.imagePicker.pickImage( + source: ImageSource.camera, preferredCameraDevice: CameraDevice.rear); + if (photo != null) { + state.image = photo; + setState(() {}); + } + } + + ///从相册选取 + selectImage() async { + XFile? image = await state.imagePicker.pickImage( + source: ImageSource.gallery, + maxHeight: 250, + maxWidth: 250, + ); + if (image != null) state.image = image; + setState(() {}); + } } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_state.dart new file mode 100644 index 00000000..6d5661a2 --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_state.dart @@ -0,0 +1,19 @@ +import 'package:get/get.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart'; + +class MinePersonInfoState { + final mineInfoData = MinePersonInfoData().obs; + + var nickname = ''.obs; //昵称 + var mobileStr = ''.obs; //手机号 + var emailStr = ''.obs; //邮箱 + var countryStr = ''.obs; //国家/地区 + var haveSafeAnswer = 0.obs; //是否已设置安全问题 + + // ImagePicker获取内容后返回的对象是XFile + XFile? image; + List? imageList; +// 使用ImagePicker前必须先实例化 + final ImagePicker imagePicker = ImagePicker(); +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_logic.dart index 11be7803..75082d5a 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_logic.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_logic.dart @@ -41,6 +41,5 @@ class MinePersonInfoResetPasswordLogic extends BaseGetXController { void _resetCanSub() { state.canSub.value = state.oldPwdIsOK && state.newPwdIsOK; - print("22222:${state.canSub.value}"); } } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart index 7598fafc..2d450d8a 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart @@ -38,6 +38,9 @@ class _MinePersonInfoResetPasswordPageState children: [ LoginInput( controller: state.oldPwdController, + onchangeAction: (textStr) { + logic.changeInput(state.oldPwdController); + }, isPwd: true, leftWidget: Text( "${TranslationLoader.lanKeys!.originalPassword!.tr} ", @@ -49,6 +52,9 @@ class _MinePersonInfoResetPasswordPageState ]), LoginInput( controller: state.newPwdController, + onchangeAction: (textStr) { + logic.changeInput(state.newPwdController); + }, isPwd: true, leftWidget: Text( "${TranslationLoader.lanKeys!.newPassword!.tr} ", @@ -60,6 +66,9 @@ class _MinePersonInfoResetPasswordPageState ]), LoginInput( controller: state.surePwdController, + onchangeAction: (textStr) { + logic.changeInput(state.surePwdController); + }, isPwd: true, // isHaveLeftWidget: false, leftWidget: Text( @@ -82,8 +91,11 @@ class _MinePersonInfoResetPasswordPageState btnName: TranslationLoader.lanKeys!.save!.tr, fontSize: 30.sp, borderRadius: 20.w, + isDisabled: state.canSub.value, padding: EdgeInsets.only(top: 25.w, bottom: 25.w), - onClick: () {})), + onClick: () { + logic.changePasswordRequest(); + })), SizedBox(height: 40.w), Row( mainAxisAlignment: MainAxisAlignment.center, diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_state.dart index bfb97b83..ab2a419b 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_state.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_state.dart @@ -20,7 +20,5 @@ class MinePersonInfoResetPasswordState { bool get newPwdIsOK => newPwd.value.isNotEmpty && (newPwd.value == surePwd.value); - var canResend = false.obs; - void onClose() {} } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_entity.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_entity.dart new file mode 100644 index 00000000..6473aa87 --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_entity.dart @@ -0,0 +1,133 @@ +class MineSetSafetyProblemEntity { + int? errorCode; + String? description; + String? errorMsg; + Data? data; + + MineSetSafetyProblemEntity( + {this.errorCode, this.description, this.errorMsg, this.data}); + + MineSetSafetyProblemEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + data = json['data'] != null ? Data.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class Data { + List? firstList; + List? secondList; + List? thirdList; + + Data({this.firstList, this.secondList, this.thirdList}); + + Data.fromJson(Map json) { + if (json['firstList'] != null) { + firstList = []; + json['firstList'].forEach((v) { + firstList!.add(SafetyProblemData.fromJson(v)); + }); + } + if (json['secondList'] != null) { + secondList = []; + json['secondList'].forEach((v) { + secondList!.add(SafetyProblemData.fromJson(v)); + }); + } + if (json['thirdList'] != null) { + thirdList = []; + json['thirdList'].forEach((v) { + thirdList!.add(SafetyProblemData.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = {}; + if (firstList != null) { + data['firstList'] = firstList!.map((v) => v.toJson()).toList(); + } + if (secondList != null) { + data['secondList'] = secondList!.map((v) => v.toJson()).toList(); + } + if (thirdList != null) { + data['thirdList'] = thirdList!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class SafetyProblemData { + int? questionId; + String? question; + String? answer; + + SafetyProblemData({this.questionId, this.question}); + + SafetyProblemData.fromJson(Map json) { + questionId = json['questionId']; + question = json['question']; + answer = json['answer']; + } + + Map toJson() { + final Map data = {}; + data['questionId'] = questionId; + data['question'] = question; + data['answer'] = answer; + + return data; + } +} + +class SafetyProblemData2 { + int? questionId; + String? question; + String? answer; + + SafetyProblemData2({this.questionId, this.question}); + + SafetyProblemData2.fromJson(Map json) { + questionId = json['questionId']; + question = json['question']; + } + + Map toJson() { + final Map data = {}; + data['questionId'] = questionId; + data['question'] = question; + return data; + } +} + +class SafetyProblemData3 { + int? questionId; + String? question; + String? answer; + + SafetyProblemData3({this.questionId, this.question}); + + SafetyProblemData3.fromJson(Map json) { + questionId = json['questionId']; + question = json['question']; + } + + Map toJson() { + final Map data = {}; + data['questionId'] = questionId; + data['question'] = question; + return data; + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_logic.dart index e69de29b..69bfaa75 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_logic.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_logic.dart @@ -0,0 +1,69 @@ +import 'dart:async'; +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; +import 'package:get/get_utils/get_utils.dart'; +import 'package:star_lock/appRouters.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_state.dart'; +import 'package:star_lock/tools/toast.dart'; +import 'package:star_lock/translations/trans_lib.dart'; +import '../../../../network/api_repository.dart'; +import '../../../../tools/baseGetXController.dart'; + +class MineSetSafetyProblemLogic extends BaseGetXController { + final MineSetSafetyProblemState state = MineSetSafetyProblemState(); + //用户信息 + Future getQuestionListRequest() async { + var entity = + await ApiRepository.to.getQuestionList("", state.countryCode.value); + if (entity.errorCode!.codeIsSuccessful) { + state.firstProblemList.value = entity.data!.firstList!; + state.secondProblemList.value = entity.data!.secondList!; + state.thirdProblemList.value = entity.data!.thirdList!; + } + } + + //设置安全信息 + Future setSafeAnswerRequest() async { + var entity = + await ApiRepository.to.setSafeAnswer(state.questionAndAnswerList); + if (entity.errorCode!.codeIsSuccessful) { + Toast.show(msg: '操作成功'); + Get.until((route) => route.settings.name == Routers.minePersonInfoPage); + } + } + + void checkNext(TextEditingController controller) { + changeInput(controller); + } + + void changeInput(TextEditingController controller) { + if (controller == state.fristAnswerController) { + state.firstAnswerStr.value = controller.text; + } + if (controller == state.secondAnswerController) { + state.secondAnswerStr.value = controller.text; + } + if (controller == state.thirdAnswerController) { + state.thirdAnswerStr.value = controller.text; + } + _resetCanSub(); + } + + void _resetCanSub() { + state.canSub.value = state.answerIsOK && + state.firstProblemStr.value != + TranslationLoader.lanKeys!.problemOne!.tr && + state.secondProblemStr.value != + TranslationLoader.lanKeys!.problemTwo!.tr && + state.thirdProblemStr.value != + TranslationLoader.lanKeys!.problemThree!.tr; + } + + @override + void onInit() { + super.onInit(); + state.fristAnswerController.text = state.firstAnswerStr.value; + state.secondAnswerController.text = state.secondAnswerStr.value; + state.thirdAnswerController.text = state.thirdAnswerStr.value; + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart index 0c00e267..36257526 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_entity.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_logic.dart'; +import 'package:star_lock/tools/custom_bottom_sheet.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/commonItem.dart'; @@ -18,9 +21,15 @@ class MinePersonInfoSetSafetyProblemPage extends StatefulWidget { class _MinePersonInfoSetSafetyProblemPageState extends State { - final _fristEditingController = TextEditingController(); - final _secondEditingController = TextEditingController(); - final _thirdEditingController = TextEditingController(); + final logic = Get.put(MineSetSafetyProblemLogic()); + final state = Get.find().state; + + @override + void initState() { + super.initState(); + + logic.getQuestionListRequest(); + } @override Widget build(BuildContext context) { @@ -40,33 +49,61 @@ class _MinePersonInfoSetSafetyProblemPageState TranslationLoader.lanKeys!.safetyProblemTip!.tr, style: TextStyle(fontSize: 18.sp), )), - _safityProblemItem(TranslationLoader.lanKeys!.problemOne!.tr, "", - _fristEditingController, () { - _seletProblemBottomSheet(); - }), + Obx(() => _safityProblemItem( + state.firstProblemStr.value, + state.firstAnswerStr.value, + state.fristAnswerController, () { + _selectProblemBottomSheet(state.firstProblemList, 1); + })), SizedBox(height: 10.h), - _safityProblemItem(TranslationLoader.lanKeys!.problemTwo!.tr, "", - _secondEditingController, () { - _seletProblemBottomSheet(); - }), + Obx(() => _safityProblemItem( + state.secondProblemStr.value, + state.secondAnswerStr.value, + state.secondAnswerController, () { + _selectProblemBottomSheet(state.secondProblemList, 2); + })), SizedBox(height: 10.h), - _safityProblemItem(TranslationLoader.lanKeys!.problemThree!.tr, "", - _thirdEditingController, () { - _seletProblemBottomSheet(); - }), + Obx(() => _safityProblemItem( + state.thirdProblemStr.value, + state.thirdAnswerStr.value, + state.thirdAnswerController, () { + _selectProblemBottomSheet(state.thirdProblemList, 3); + })), SizedBox( height: 50.h, ), - Container( - padding: EdgeInsets.only(left: 20.w, right: 20.w), - child: SubmitBtn( - btnName: TranslationLoader.lanKeys!.sure!.tr, - // borderRadius: 20.w, - // fontSize: 32.sp, - // margin: EdgeInsets.only(left: 30.w, right: 30.w, top: 20.w), - // padding: EdgeInsets.only(top: 20.w, bottom: 20.w), - onClick: () {}), - ), + Obx(() => Container( + padding: EdgeInsets.only(left: 20.w, right: 20.w), + child: SubmitBtn( + btnName: TranslationLoader.lanKeys!.sure!.tr, + isDisabled: state.canSub.value, + onClick: () { + //state.questionAndAnswerList + for (int i = 0; i < 3; i++) { + if (i == 0) { + SafetyProblemData data = SafetyProblemData(); + data.question = state.firstProblemStr.value; + data.answer = state.firstAnswerStr.value; + data.questionId = state.firstQuestionId.value; + state.questionAndAnswerList.add(data); + } else if (i == 1) { + SafetyProblemData data = SafetyProblemData(); + data.question = state.secondProblemStr.value; + data.answer = state.secondAnswerStr.value; + data.questionId = state.secondQuestionId.value; + state.questionAndAnswerList.add(data); + } else if (i == 2) { + SafetyProblemData data = SafetyProblemData(); + data.question = state.thirdProblemStr.value; + data.answer = state.thirdAnswerStr.value; + data.questionId = state.thirdQuestionId.value; + state.questionAndAnswerList.add(data); + } + } + //设置安全信息接口 + logic.setSafeAnswerRequest(); + }), + )), ], )); } @@ -88,6 +125,9 @@ class _MinePersonInfoSetSafetyProblemPageState //输入框一行 maxLines: 1, controller: controller, + onChanged: (value) { + logic.checkNext(controller); + }, autofocus: false, decoration: InputDecoration( //输入里面输入文字内边距设置 @@ -104,58 +144,38 @@ class _MinePersonInfoSetSafetyProblemPageState ); } - Future _seletProblemBottomSheet() async { - final option = await showModalBottomSheet( + Future _selectProblemBottomSheet(List dataList, int problemIndex) async { + List getProblemList = []; + for (int i = 0; i < dataList.length; i++) { + SafetyProblemData data = dataList[i]; + getProblemList.add(data.question!); + } + showModalBottomSheet( context: context, + shape: RoundedRectangleBorder( + borderRadius: BorderRadiusDirectional.circular(10)), builder: (BuildContext context) { - return Container( - height: 400.0.h, - child: ListView( - children: [ - ListTile( - title: Text( - '你第一次乘坐飞机取得是哪个城市?', - textAlign: TextAlign.center, - style: TextStyle(fontSize: 22.sp), - ), - onTap: () { - Navigator.of(context).pop(true); - }, - ), - const Divider( - color: AppColors.greyLineColor, - height: 1, - ), - ListTile( - title: Text( - '你的QQ号码是多少', - textAlign: TextAlign.center, - style: TextStyle(fontSize: 22.sp), - ), - onTap: () { - Navigator.of(context).pop(true); - }, - ), - const Divider( - color: AppColors.greyLineColor, - height: 1, - ), - ListTile( - title: Text( - '你的第一个宠物叫什么名字', - textAlign: TextAlign.center, - style: TextStyle(fontSize: 22.sp), - ), - onTap: () { - Navigator.of(context).pop(true); - }, - ), - const Divider( - color: AppColors.greyLineColor, - height: 1, - ), - ], - ), + return AlertBottomWidget( + topTitle: '选择问题', + items: getProblemList, + chooseCallback: (value) { + int getSelectIndex = value; + String getSelectProblem = getProblemList[getSelectIndex]; + SafetyProblemData data = dataList[getSelectIndex]; + if (problemIndex == 1) { + // SafetyProblemData data = dataList[getSelectIndex]; + state.firstProblemStr.value = getSelectProblem; + state.firstQuestionId.value = data.questionId!; + } else if (problemIndex == 2) { + // SafetyProblemData data = dataList[getSelectIndex]; + state.secondProblemStr.value = getSelectProblem; + state.secondQuestionId.value = data.questionId!; + } else if (problemIndex == 3) { + // SafetyProblemData data = dataList[getSelectIndex]; + state.thirdProblemStr.value = getSelectProblem; + state.thirdQuestionId.value = data.questionId!; + } + }, ); }); } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_state.dart index e69de29b..31c64336 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_state.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_state.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/translations/trans_lib.dart'; + +class MineSetSafetyProblemState { + final TextEditingController fristAnswerController = TextEditingController(); + final TextEditingController secondAnswerController = TextEditingController(); + final TextEditingController thirdAnswerController = TextEditingController(); + + var firstProblemList = [].obs; + var secondProblemList = [].obs; + var thirdProblemList = [].obs; + + var firstProblemStr = TranslationLoader.lanKeys!.problemOne!.tr.obs; + var secondProblemStr = TranslationLoader.lanKeys!.problemTwo!.tr.obs; + var thirdProblemStr = TranslationLoader.lanKeys!.problemThree!.tr.obs; + + var firstQuestionId = 0.obs; + var secondQuestionId = 0.obs; + var thirdQuestionId = 0.obs; + + var firstAnswerStr = ''.obs; + var secondAnswerStr = ''.obs; + var thirdAnswerStr = ''.obs; + var countryCode = ''.obs; + + var questionAndAnswerList = [].obs; + + bool get answerIsOK => + firstAnswerStr.value.isNotEmpty && + secondAnswerStr.value.isNotEmpty && + thirdAnswerStr.value.isNotEmpty; + var canSub = false.obs; + + MineSetSafetyProblemState() { + Map map = Get.arguments; + firstProblemStr.value = map["firstProblemStr"]; + secondProblemStr.value = map["secondProblemStr"]; + thirdProblemStr.value = map["thirdProblemStr"]; + firstAnswerStr.value = map["firstAnswerStr"]; + secondAnswerStr.value = map["secondAnswerStr"]; + thirdAnswerStr.value = map["thirdAnswerStr"]; + firstQuestionId.value = map["firstQuestionId"]; + secondQuestionId.value = map["secondQuestionId"]; + thirdQuestionId.value = map["thirdQuestionId"]; + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_entity.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_entity.dart new file mode 100644 index 00000000..cdef8da2 --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_entity.dart @@ -0,0 +1,57 @@ +class MineViewSafetyProblemEntity { + int? errorCode; + String? description; + String? errorMsg; + List? dataList; + + MineViewSafetyProblemEntity( + {this.errorCode, this.description, this.errorMsg, this.dataList}); + + MineViewSafetyProblemEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + if (json['data'] != null) { + dataList = []; + json['data'].forEach((v) { + dataList!.add(SafetyProblemData.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (dataList != null) { + data['data'] = dataList!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class SafetyProblemData { + int? questionId; + String? answer; + int? uid; + String? question; + + SafetyProblemData({this.questionId, this.answer, this.uid, this.question}); + + SafetyProblemData.fromJson(Map json) { + questionId = json['questionId']; + answer = json['answer']; + uid = json['uid']; + question = json['question']; + } + + Map toJson() { + final Map data = {}; + data['questionId'] = questionId; + data['answer'] = answer; + data['uid'] = uid; + data['question'] = question; + return data; + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_logic.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_logic.dart new file mode 100644 index 00000000..315681ee --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_logic.dart @@ -0,0 +1,34 @@ +import 'dart:async'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_entity.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_state.dart'; + +import '../../../../network/api_repository.dart'; +import '../../../../tools/baseGetXController.dart'; + +class MineViewSafetyProblemLogic extends BaseGetXController { + final MineViewSafetyProblemState state = MineViewSafetyProblemState(); + + //获取已设置的安全信息 + Future getOwnQuestionListRequest() async { + MineViewSafetyProblemEntity entity = + await ApiRepository.to.getOwnQuestionList(); + if (entity.errorCode!.codeIsSuccessful) { + if (entity.dataList != null) { + SafetyProblemData safeData1 = entity.dataList![0]; + state.firstProblemStr.value = safeData1.question!; + state.firstAnswerStr.value = safeData1.answer!; + state.firstQuestionId.value = safeData1.questionId!; + + SafetyProblemData safeData2 = entity.dataList![1]; + state.secondProblemStr.value = safeData2.question!; + state.secondAnswerStr.value = safeData2.answer!; + state.secondQuestionId.value = safeData2.questionId!; + + SafetyProblemData safeData3 = entity.dataList![2]; + state.thirdProblemStr.value = safeData3.question!; + state.thirdAnswerStr.value = safeData3.answer!; + state.thirdQuestionId.value = safeData3.questionId!; + } + } + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_page.dart new file mode 100644 index 00000000..84206a8d --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_page.dart @@ -0,0 +1,114 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/appRouters.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_logic.dart'; + +import '../../../app_settings/app_colors.dart'; +import '../../../tools/commonItem.dart'; +import '../../../tools/titleAppBar.dart'; +import '../../../translations/trans_lib.dart'; + +class MinePersonInfoViewSafetyProblemPage extends StatefulWidget { + const MinePersonInfoViewSafetyProblemPage({Key? key}) : super(key: key); + + @override + State createState() => + _MinePersonInfoViewSafetyProblemPageState(); +} + +class _MinePersonInfoViewSafetyProblemPageState + extends State { + final logic = Get.put(MineViewSafetyProblemLogic()); + final state = Get.find().state; + + @override + void initState() { + super.initState(); + + logic.getOwnQuestionListRequest(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.mainBackgroundColor, + appBar: TitleAppBar( + barTitle: TranslationLoader.lanKeys!.safetyProblem!.tr, + haveBack: true, + actionsList: [ + TextButton( + onPressed: () { + Navigator.pushNamed( + context, Routers.minePersonInfoSetSafetyProblemPage, + arguments: { + 'firstProblemStr': state.firstProblemStr.value, + 'secondProblemStr': state.secondProblemStr.value, + 'thirdProblemStr': state.thirdProblemStr.value, + 'firstAnswerStr': state.firstAnswerStr.value, + 'secondAnswerStr': state.secondAnswerStr.value, + 'thirdAnswerStr': state.thirdAnswerStr.value, + 'firstQuestionId': state.firstQuestionId.value, + 'secondQuestionId': state.secondQuestionId.value, + 'thirdQuestionId': state.thirdQuestionId.value, + }); + }, + child: Text( + TranslationLoader.lanKeys!.amend!.tr, + style: TextStyle(color: Colors.white, fontSize: 24.sp), + )) + ], + backgroundColor: AppColors.mainColor), + body: ListView( + children: [ + Container( + width: 1.sw, + color: AppColors.greyBackgroundColor, + padding: EdgeInsets.all(20.h), + child: Text( + TranslationLoader.lanKeys!.safetyProblemTip!.tr, + style: TextStyle(fontSize: 18.sp), + )), + Obx(() => _safityProblemItem( + state.firstProblemStr.value, state.firstAnswerStr.value)), + SizedBox(height: 10.h), + Obx(() => _safityProblemItem( + state.secondProblemStr.value, state.secondAnswerStr.value)), + SizedBox(height: 10.h), + Obx(() => _safityProblemItem( + state.thirdProblemStr.value, state.thirdAnswerStr.value)) + ], + )); + } + + Widget _safityProblemItem(String problemTitle, String answerTitle) { + return Column( + children: [ + CommonItem( + leftTitel: problemTitle, + rightTitle: "", + isHaveLine: true, + isHaveDirection: true), + Container( + color: Colors.white, + padding: EdgeInsets.only(left: 35.w), + child: TextField( + //输入框一行 + maxLines: 1, + enabled: false, + autofocus: false, + decoration: InputDecoration( + //输入里面输入文字内边距设置 + // contentPadding: const EdgeInsets.only(top: 8.0, left: -19.0, right: -15.0, bottom: 8.0), + // labelText: label, + hintText: answerTitle, + //不需要输入框下划线 + border: InputBorder.none, + hintStyle: TextStyle(fontSize: 22.sp)), + obscureText: false, + ), + ) + ], + ); + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_state.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_state.dart new file mode 100644 index 00000000..e9018b15 --- /dev/null +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_state.dart @@ -0,0 +1,16 @@ +import 'package:get/get.dart'; +import 'package:star_lock/translations/trans_lib.dart'; + +class MineViewSafetyProblemState { + var firstProblemStr = TranslationLoader.lanKeys!.problemOne!.tr.obs; + var secondProblemStr = TranslationLoader.lanKeys!.problemTwo!.tr.obs; + var thirdProblemStr = TranslationLoader.lanKeys!.problemThree!.tr.obs; + + var firstAnswerStr = ''.obs; + var secondAnswerStr = ''.obs; + var thirdAnswerStr = ''.obs; + + var firstQuestionId = 0.obs; + var secondQuestionId = 0.obs; + var thirdQuestionId = 0.obs; +} diff --git a/star_lock/lib/network/api.dart b/star_lock/lib/network/api.dart index bc2f2729..22ae9020 100644 --- a/star_lock/lib/network/api.dart +++ b/star_lock/lib/network/api.dart @@ -126,7 +126,16 @@ abstract class Api { final String getValidationCodeAuthURL = '/user/sendValidationCodeAuth'; //登录后使用,免图片滑动验证 final String updateUserInfoURL = '/user/updateUserInfo'; //更新个人信息-昵称/头像 - final String changeAccountURL = '/user/changeAccount'; //修改账号 - final String bindEmailURL = '/user/bindEmail'; //绑定邮箱 + // final String changeAccountURL = '/user/changeAccount'; //修改账号 + final String bindEmailURL = '/user/bindEmail'; //修改绑定邮箱 + final String bindPhoneURL = '/user/bindPhone'; //修改绑定手机号 final String changePasswordURL = '/user/changePassword'; //修改密码 + final String getQuestionListURL = '/safeAnswer/getQuestionList'; //获取安全信息列表 + final String getOwnQuestionListURL = + '/safeAnswer/getOwnQuestionList'; //获取已设置的安全信息 + final String setSafeAnswerURL = '/safeAnswer/set'; //设置安全信息 + final String getUpTokenURL = + '/user/getUpToken'; //上传头像 先获取upToken 再调用updateUserInfo + final String unbindPhoneTokenURL = '/user/unbindPhoneToken'; //获取解绑手机号Token + final String unbindEmailTokenURL = '/user/unbindEmailToken'; //获取解绑邮箱Token } diff --git a/star_lock/lib/network/api_provider.dart b/star_lock/lib/network/api_provider.dart index 11f28c35..1c1f61e0 100644 --- a/star_lock/lib/network/api_provider.dart +++ b/star_lock/lib/network/api_provider.dart @@ -1171,28 +1171,27 @@ class ApiProvider extends BaseProvider { Future updateUserInfo(String nickname) => post(updateUserInfoURL.toUrl, jsonEncode({'nickname': nickname})); - //修改账号 - Future changeAccount(String countryCode, String newAccount, - String uniqueid, String verificationCode) => + //修改绑定手机号 + Future bindPhone(String countryCode, String account, + String verificationCode, String unbindToken) => post( - changeAccountURL.toUrl, + bindPhoneURL.toUrl, jsonEncode({ 'countryCode': countryCode, - 'newAccount': newAccount, - 'uniqueid': uniqueid, - 'verificationCode': verificationCode + 'account': account, + 'verificationCode': verificationCode, + 'unbindToken': unbindToken })); - //绑定邮箱 - Future bindEmail(String email, String uniqueid, - String verificationCode, String operatorUid) => + //修改绑定邮箱 + Future bindEmail( + String email, String verificationCode, String unbindToken) => post( bindEmailURL.toUrl, jsonEncode({ 'email': email, - 'uniqueid': uniqueid, 'verificationCode': verificationCode, - 'operatorUid': operatorUid + 'unbindToken': unbindToken })); //修改密码 @@ -1206,6 +1205,38 @@ class ApiProvider extends BaseProvider { "oldPassword": oldPassword, 'operatorUid': operatorUid })); + + //获取安全信息列表 + Future getQuestionList(String operatorUid, String countryCode) => + post( + getQuestionListURL.toUrl, + jsonEncode({ + "operatorUid": operatorUid, + 'countryCode': countryCode, + })); + + //获取已设置的安全信息 + Future getOwnQuestionList() => + post(getOwnQuestionListURL.toUrl, jsonEncode({})); + + //设置安全信息 + Future setSafeAnswer(List questionAndAnswerList) => post( + setSafeAnswerURL.toUrl, + jsonEncode({"questionAndAnswerList": questionAndAnswerList})); + + //上传头像 先获取upToken 再调用updateUserInfo + Future getUpToken(String type) => + post(setSafeAnswerURL.toUrl, jsonEncode({"type": type})); + + //获取解绑手机号Token + Future unbindPhoneToken(String verificationCode) => post( + unbindPhoneTokenURL.toUrl, + jsonEncode({"verificationCode": verificationCode})); + + //获取解绑邮箱Token + Future unbindEmailToken(String verificationCode) => post( + unbindEmailTokenURL.toUrl, + jsonEncode({"verificationCode": verificationCode})); } extension ExtensionString on String { diff --git a/star_lock/lib/network/api_provider_base.dart b/star_lock/lib/network/api_provider_base.dart index 9dfe773f..648e868d 100644 --- a/star_lock/lib/network/api_provider_base.dart +++ b/star_lock/lib/network/api_provider_base.dart @@ -71,7 +71,7 @@ class BaseProvider extends GetConnect with Api { break; case 421: case 422: - case 430: + case 430: //与葛工约定弹出ErrorMsg Toast.show(msg: T["errorMsg"]); break; case 425: diff --git a/star_lock/lib/network/api_repository.dart b/star_lock/lib/network/api_repository.dart index 0cc09316..e04bd44f 100644 --- a/star_lock/lib/network/api_repository.dart +++ b/star_lock/lib/network/api_repository.dart @@ -7,7 +7,10 @@ import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/ma import 'package:star_lock/main/lockDetail/lcokSet/basicInformation/basicInformation/KeyDetailEntity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKeyEntity.dart'; -import 'package:star_lock/mine/minePersonInfo/minePersonInfo/minePersonInfo_entity.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_entity.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoViewSafetyProblem/minePersonInfoViewSafetyProblem_entity.dart'; import 'package:star_lock/mine/mineSet/appUnlockNeedMobileNetworkingLock/selectLockListEntity.dart'; import 'package:star_lock/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetailEntity.dart'; import 'package:star_lock/mine/mineSet/authorizedAdministrator/authorizedAdminListEntity.dart'; @@ -1165,19 +1168,19 @@ class ApiRepository { return PasswordKeyListEntity.fromJson(res.body); } - //修改账号 - Future changeAccount(String countryCode, - String newAccount, String uniqueid, String verificationCode) async { - final res = await apiProvider.changeAccount( - countryCode, newAccount, uniqueid, verificationCode); + //修改绑定手机号 + Future bindPhone(String countryCode, String account, + String verificationCode, String unbindToken) async { + final res = await apiProvider.bindPhone( + countryCode, account, verificationCode, unbindToken); return PasswordKeyListEntity.fromJson(res.body); } - //绑定邮箱 - Future bindEmail(String email, String uniqueid, - String verificationCode, String operatorUid) async { - final res = await apiProvider.bindEmail( - email, uniqueid, verificationCode, operatorUid); + //修改绑定邮箱 + Future bindEmail( + String email, String verificationCode, String unbindToken) async { + final res = + await apiProvider.bindEmail(email, verificationCode, unbindToken); return PasswordKeyListEntity.fromJson(res.body); } @@ -1188,4 +1191,43 @@ class ApiRepository { date, newPassword, oldPassword, operatorUid); return LoginEntity.fromJson(res.body); } + + //获取安全信息列表 + Future getQuestionList( + String operatorUid, String countryCode) async { + final res = await apiProvider.getQuestionList(operatorUid, countryCode); + return MineSetSafetyProblemEntity.fromJson(res.body); + } + + //获取已设置的安全信息 + Future getOwnQuestionList() async { + final res = await apiProvider.getOwnQuestionList(); + return MineViewSafetyProblemEntity.fromJson(res.body); + } + + //设置安全信息 + Future setSafeAnswer(List questionAndAnswerList) async { + final res = await apiProvider.setSafeAnswer(questionAndAnswerList); + return LoginEntity.fromJson(res.body); + } + + //上传头像 先获取upToken 再调用updateUserInfo + Future getUpToken(String type) async { + final res = await apiProvider.getUpToken(type); + return LoginEntity.fromJson(res.body); + } + + //获取解绑手机号Token + Future unbindPhoneToken( + String verificationCode) async { + final res = await apiProvider.unbindPhoneToken(verificationCode); + return MineUnbindPhoneOrEmailEntity.fromJson(res.body); + } + + //获取解绑邮箱Token + Future unbindEmailToken( + String verificationCode) async { + final res = await apiProvider.unbindEmailToken(verificationCode); + return MineUnbindPhoneOrEmailEntity.fromJson(res.body); + } } diff --git a/star_lock/lib/tools/custom_bottom_sheet.dart b/star_lock/lib/tools/custom_bottom_sheet.dart new file mode 100644 index 00000000..ea76d2f9 --- /dev/null +++ b/star_lock/lib/tools/custom_bottom_sheet.dart @@ -0,0 +1,117 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:star_lock/app_settings/app_colors.dart'; + +class AlertBottomWidget extends StatelessWidget { + List items; + ValueChanged chooseCallback; + String topTitle; + + AlertBottomWidget( + {Key? key, + required this.items, + required this.chooseCallback, + required this.topTitle}) + : super(key: key); + + List itemsWidget(context) { + List list = []; + + if (topTitle.isNotEmpty) { + list.add(Container( + padding: const EdgeInsets.only(top: 18, bottom: 18), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + topTitle, + style: TextStyle( + color: Colors.black, + fontWeight: FontWeight.w500, + fontSize: ScreenUtil().setSp(24)), + ), + // const SizedBox( + // height: 4, + // ), + // Text( + // subTitle, + // style: TextStyle( + // color: AppColors.darkGrayTextColor, + // fontSize: ScreenUtil().setSp(24)), + // ) + ], + ), + )); + + list.add( + Container( + color: AppColors.greyBackgroundColor, + height: 8, + ), + ); + } + + for (int i = 0; i < items.length; i++) { + list.add( + SizedBox( + width: ScreenUtil().screenWidth, + child: TextButton( + style: ButtonStyle( + overlayColor: MaterialStateProperty.all(Colors.white)), + child: Text( + items[i], + style: TextStyle( + color: Colors.black, fontSize: ScreenUtil().setSp(22)), + ), + onPressed: () { + Navigator.pop(context); + chooseCallback(i); + }, + ), + ), + ); + list.add(const Divider( + height: 1, + )); + } + + list.add( + Container( + color: AppColors.greyBackgroundColor, + height: 8, + ), + ); + + list.add(SizedBox( + width: ScreenUtil().screenWidth, + child: TextButton( + style: ButtonStyle( + overlayColor: MaterialStateProperty.all(Colors.white)), + child: Text( + '取消', + style: + TextStyle(color: Colors.black, fontSize: ScreenUtil().setSp(24)), + ), + onPressed: () { + Navigator.pop(context); + }, + ), + )); + return list; + } + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: itemsWidget(context), + ), + ); + } +} diff --git a/star_lock/lib/tools/tf_input_haveBorder.dart b/star_lock/lib/tools/tf_input_haveBorder.dart index ae88d61b..cdb6fad4 100644 --- a/star_lock/lib/tools/tf_input_haveBorder.dart +++ b/star_lock/lib/tools/tf_input_haveBorder.dart @@ -17,6 +17,7 @@ class TFInputHaveBorder extends StatelessWidget { String? label; bool? isPwd; Widget? rightSlot; + Function()? onChangeAction; TFInputHaveBorder( {Key? key, required this.controller, @@ -27,6 +28,7 @@ class TFInputHaveBorder extends StatelessWidget { this.keyboardType, this.background, this.hintText, + this.onChangeAction, this.leftImg}) : super(key: key); @@ -114,7 +116,11 @@ class TFInputHaveBorder extends StatelessWidget { ), ), obscureText: false, - onChanged: (String value) {}, + onChanged: (String value) { + if (onChangeAction != null) { + onChangeAction!(); + } + }, ), rightSlot ?? const SizedBox(width: 0, height: 0) ], diff --git a/star_lock/pubspec.yaml b/star_lock/pubspec.yaml index 39a98c4a..197db058 100644 --- a/star_lock/pubspec.yaml +++ b/star_lock/pubspec.yaml @@ -67,8 +67,11 @@ dependencies: flutter_pickers: ^2.1.9 #万年历 syncfusion_flutter_datepicker: ^22.1.38 - #图片选择 - image_picker: ^1.0.1 + #使用相机及相册 + image_picker: ^1.0.4 + crop_your_image: ^0.7.5 + camera: ^0.10.5+5 + path_provider: ^2.1.0 #跳转到外部 url_launcher: ^6.1.12 #蓝牙