diff --git a/star_lock/images/lan/lan_en.json b/star_lock/images/lan/lan_en.json index c47d5b02..13795fa1 100644 --- a/star_lock/images/lan/lan_en.json +++ b/star_lock/images/lan/lan_en.json @@ -305,6 +305,7 @@ "email":"Email", "countryAndRegion":"Country And Region", "selet":"Selet", + "getVerificationCode":"Get Verification Code", "businessCooperation":"Business Cooperation", "officialWebsite":"Official Website", diff --git a/star_lock/images/lan/lan_keys.json b/star_lock/images/lan/lan_keys.json index fc103269..21014f91 100644 --- a/star_lock/images/lan/lan_keys.json +++ b/star_lock/images/lan/lan_keys.json @@ -305,6 +305,7 @@ "email":"email", "countryAndRegion":"countryAndRegion", "selet":"selet", + "getVerificationCode":"getVerificationCode", "businessCooperation":"businessCooperation", "officialWebsite":"officialWebsite", diff --git a/star_lock/images/lan/lan_zh.json b/star_lock/images/lan/lan_zh.json index 6b050357..745798ec 100644 --- a/star_lock/images/lan/lan_zh.json +++ b/star_lock/images/lan/lan_zh.json @@ -305,6 +305,7 @@ "email":"邮箱", "countryAndRegion":"国家/地区", "selet":"选择", + "getVerificationCode":"获取验证码", "businessCooperation":"商务合作", "officialWebsite":"官网", diff --git a/star_lock/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/star_lock/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index f3d88ace..c87d15a3 100644 --- a/star_lock/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/star_lock/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -40,7 +40,7 @@ const StarLockLoginPage(), ), GetPage( - name: Routers.starLockRegisterPage, - page: () => const StarLockRegisterPage(), - binding: StarLockRegisterBinding()), + name: Routers.starLockRegisterPage, + page: () => const StarLockRegisterPage(), binding:StarLockRegisterBinding() + ), GetPage( name: Routers.starLockForgetPasswordPage, page: () => const StarLockForgetPasswordPage(), @@ -669,36 +665,49 @@ abstract class AppRouters { ), GetPage( name: Routers.authorizedAdministratorListPage, - page: () => const AuthorizedAdministratorListPage()), + page: () => const AuthorizedAdministratorListPage() + ), GetPage( name: Routers.lockUserManageLisPage, - page: () => const LockUserManageListListPage()), + page: () => const LockUserManageListListPage() + ), GetPage( - name: Routers.lockGroupListPage, page: () => const LockGroupListPage()), + name: Routers.lockGroupListPage, page: () => const LockGroupListPage() + ), GetPage( - name: Routers.lockItemListPage, page: () => const LockItemListPage()), + name: Routers.lockItemListPage, page: () => const LockItemListPage() + ), GetPage( name: Routers.transferSmartLockPage, - page: () => const TransferSmartLockPage()), + page: () => const TransferSmartLockPage() + ), GetPage( name: Routers.recipientInformationPage, - page: () => const RecipientInformationPage()), + page: () => const RecipientInformationPage() + ), GetPage( - name: Routers.selectBranchPage, page: () => const SelectBranchPage()), + name: Routers.selectBranchPage, page: () => const SelectBranchPage() + ), GetPage( name: Routers.selectGetewayListPage, - page: () => const SelectGetewayListPage()), + page: () => const SelectGetewayListPage() + ), GetPage( name: Routers.minePersonInfoEditEmailPage, - page: () => const MinePersonInfoEditEmailPage()), + page: () => const MinePersonInfoEditEmailPage() + ), GetPage( name: Routers.addAuthorizedAdministratorPage, - page: () => const AddAuthorizedAdministratorPage()), + page: () => const AddAuthorizedAdministratorPage() + ), GetPage( name: Routers.safetyVerificationPage, - page: () => const SafetyVerificationPage()), + page: () => const SafetyVerificationPage(), + binding: SafetyVerificationBinding(), + ), GetPage( - name: Routers.ownedKeyListPage, page: () => const OwnedKeyListPage()), + name: Routers.ownedKeyListPage, page: () => const OwnedKeyListPage() + ), GetPage( name: Routers.keyOperationRecordPage, page: () => const KeyOperationRecordPage()) diff --git a/star_lock/lib/common/safetyVerification/entity/CheckSafetyVerificationEntity.dart b/star_lock/lib/common/safetyVerification/entity/CheckSafetyVerificationEntity.dart new file mode 100644 index 00000000..3a38d830 --- /dev/null +++ b/star_lock/lib/common/safetyVerification/entity/CheckSafetyVerificationEntity.dart @@ -0,0 +1,26 @@ +import 'Data.dart'; + +class CheckSafetyVerificationEntity { + CheckSafetyVerificationEntity({ + this.description, + this.errorCode, + this.errorMsg,}); + + CheckSafetyVerificationEntity.fromJson(dynamic json) { + description = json['description']; + errorCode = json['errorCode']; + errorMsg = json['errorMsg']; + } + String? description; + int? errorCode; + String? errorMsg; + + Map toJson() { + final map = {}; + map['description'] = description; + map['errorCode'] = errorCode; + map['errorMsg'] = errorMsg; + return map; + } + +} \ No newline at end of file diff --git a/star_lock/lib/common/safetyVerification/entity/Data.dart b/star_lock/lib/common/safetyVerification/entity/Data.dart new file mode 100644 index 00000000..20188df1 --- /dev/null +++ b/star_lock/lib/common/safetyVerification/entity/Data.dart @@ -0,0 +1,25 @@ +class Data { + Data({ + this.bigImg, + this.smallImg, + this.yHeight,}); + + Data.fromJson(dynamic json) { + bigImg = json['bigImg']; + smallImg = json['smallImg']; + yHeight = json['yHeight']; + + } + String? bigImg; + String? smallImg; + int? yHeight; + + Map toJson() { + final map = {}; + map['bigImg'] = bigImg; + map['smallImg'] = smallImg; + map['yHeight'] = yHeight; + return map; + } + +} \ No newline at end of file diff --git a/star_lock/lib/common/safetyVerification/entity/SafetyVerificationEntity.dart b/star_lock/lib/common/safetyVerification/entity/SafetyVerificationEntity.dart new file mode 100644 index 00000000..69e367e9 --- /dev/null +++ b/star_lock/lib/common/safetyVerification/entity/SafetyVerificationEntity.dart @@ -0,0 +1,32 @@ +import 'Data.dart'; + +class SafetyVerificationEntity { + SafetyVerificationEntity({ + this.description, + this.errorCode, + this.data, + this.errorMsg,}); + + SafetyVerificationEntity.fromJson(dynamic json) { + description = json['description']; + errorCode = json['errorCode']; + data = json['data'] != null ? Data.fromJson(json['data']) : null; + errorMsg = json['errorMsg']; + } + String? description; + int? errorCode; + Data? data; + String? errorMsg; + + Map toJson() { + final map = {}; + map['description'] = description; + map['errorCode'] = errorCode; + if (data != null) { + map['data'] = data!.toJson(); + } + map['errorMsg'] = errorMsg; + return map; + } + +} \ No newline at end of file diff --git a/star_lock/lib/common/safetyVerification/safetyVerification_binding.dart b/star_lock/lib/common/safetyVerification/safetyVerification_binding.dart new file mode 100644 index 00000000..b4681fcf --- /dev/null +++ b/star_lock/lib/common/safetyVerification/safetyVerification_binding.dart @@ -0,0 +1,10 @@ + +import 'package:get/get.dart'; +import 'safetyVerification_logic.dart'; + +class SafetyVerificationBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => SafetyVerificationLogic()); + } +} diff --git a/star_lock/lib/common/safetyVerification/safetyVerification_logic.dart b/star_lock/lib/common/safetyVerification/safetyVerification_logic.dart new file mode 100644 index 00000000..b20d06dc --- /dev/null +++ b/star_lock/lib/common/safetyVerification/safetyVerification_logic.dart @@ -0,0 +1,12 @@ + + +import 'package:star_lock/common/safetyVerification/safetyVerification_state.dart'; + +import '../../network/api_repository.dart'; +import '../../tools/baseGetXController.dart'; +import 'entity/SafetyVerificationEntity.dart'; + +class SafetyVerificationLogic extends BaseGetXController{ + final SafetyVerificationState state = SafetyVerificationState(); + +} \ No newline at end of file diff --git a/star_lock/lib/common/safetyVerification/safetyVerification_page.dart b/star_lock/lib/common/safetyVerification/safetyVerification_page.dart new file mode 100644 index 00000000..7971d6f8 --- /dev/null +++ b/star_lock/lib/common/safetyVerification/safetyVerification_page.dart @@ -0,0 +1,409 @@ +import 'package:flustars/flustars.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/common/safetyVerification/safetyVerification_logic.dart'; +import 'dart:convert'; +import 'dart:math'; + +import '../../app_settings/app_colors.dart'; +import '../../network/api_repository.dart'; +import '../../tools/titleAppBar.dart'; +import '../../translations/trans_lib.dart'; +import 'entity/SafetyVerificationEntity.dart'; + +class SafetyVerificationPage extends StatefulWidget { + const SafetyVerificationPage({Key? key}) : super(key: key); + + @override + State createState() => _SafetyVerificationPageState(); +} + +class _SafetyVerificationPageState extends State with TickerProviderStateMixin { + + final logic = Get.find(); + final state = Get.find().state; + + String baseImageBase64 = ""; + String slideImageBase64 = ""; + + Size baseSize = Size.zero; //底部基类图片 + Size slideSize = Size.zero; //滑块图片 + + double sliderStartX = 0; //滑块未拖前的X坐标 + bool sliderMoveFinish = false; //滑块拖动结束 + bool checkResultAfterDrag = false; //拖动后的校验结果 + + //-------------动画------------ + int _checkMilliseconds = 0; //滑动时间 + bool _showTimeLine = false; //是否显示动画部件 + bool _checkSuccess = false; //校验是否成功 + AnimationController? controller; + + //高度动画 + Animation? offsetAnimation; + final double _bottomSliderSize = 60; + + //加载验证码 + Future loadCaptcha() async { + setState(() { + _showTimeLine = false; + sliderMoveFinish = false; + checkResultAfterDrag = false; + }); + print("countryCode:${state.getData["countryCode"]} getAccount:${state.getData["getAccount"]}"); + + var entity = await ApiRepository.to.getSliderVerifyImg(state.getData["countryCode"], state.getData["account"]); + if(entity.errorCode! == 0){ + state.sliderXMoved.value = 0; + sliderStartX = 0; + checkResultAfterDrag = false; + + baseImageBase64 = entity.data!.bigImg!; + slideImageBase64 = entity.data!.smallImg!; + + var baseR = await WidgetUtil.getImageWH( + image: Image.memory(const Base64Decoder().convert(baseImageBase64))); + baseSize = baseR.size; + + var silderR = await WidgetUtil.getImageWH( + image: Image.memory(const Base64Decoder().convert(slideImageBase64))); + slideSize = silderR.size; + + setState(() {}); + } else { + + } + } + + //校验验证码 + Future checkCaptcha(sliderMovedX, {BuildContext? myContext}) async { + setState(() { + sliderMoveFinish = true; + }); + + var entity = await ApiRepository.to.checkSliderVerifyImg(state.getData["countryCode"], state.getData["account"], sliderMovedX.toString()); + if(entity.errorCode! == 0){ + checkSuccess("captchaVerification"); + }else{ + state.sliderXMoved.value = 0; + sliderStartX = 0; + checkResultAfterDrag = false; + setState(() {}); + } + } + + @override + void initState() { + super.initState(); + initAnimation(); + loadCaptcha(); + } + + // 初始化动画 + void initAnimation() { + controller = + AnimationController(duration: const Duration(milliseconds: 500), vsync: this); + + offsetAnimation = Tween(begin: 0.5, end: 0) + .animate(CurvedAnimation(parent: controller!, curve: Curves.ease)) + ..addListener(() { + setState(() {}); + }); + } + + @override + void didUpdateWidget(SafetyVerificationPage oldWidget) { + // TODO: implement didUpdateWidget + super.didUpdateWidget(oldWidget); + } + + @override + Widget build(BuildContext context) { + + return MaxScaleTextWidget( + child: buildContent(context), + ); + } + + Widget buildContent(BuildContext context) { + var mediaQuery = MediaQuery.of(context); + var dialogWidth = 0.9 * mediaQuery.size.width; + if (dialogWidth < 330) { + dialogWidth = mediaQuery.size.width; + } + + return Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + barTitle: TranslationLoader.lanKeys!.about!.tr, + haveBack: true, + backgroundColor: AppColors.mainColor), + body: Container( + // key: _containerKey, + width: 1.sw, + // height: 340, + color: Colors.white, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _topContainer(), + _middleContainer(), + _bottomContainer(), + ], + ), + ), + ); + } + + //校验通过 + void checkSuccess(String content) { + setState(() { + checkResultAfterDrag = true; + _checkSuccess = true; + _showTimeLine = true; + }); + _forwardAnimation(); + + //刷新验证码 + Future.delayed(const Duration(milliseconds: 1000)).then((v) { + _reverseAnimation().then((v) { + setState(() { + _showTimeLine = false; + }); + //关闭验证码 + Navigator.pop(context); + }); + }); + } + + //校验失败 + void checkFail() { + setState(() { + _showTimeLine = true; + _checkSuccess = false; + checkResultAfterDrag = false; + }); + _forwardAnimation(); + + //刷新验证码 + Future.delayed(Duration(milliseconds: 1000)).then((v) { + _reverseAnimation().then((v) { + setState(() { + _showTimeLine = false; + }); + loadCaptcha(); + //回调 + // if (widget.onFail != null) { + // widget.onFail!(); + // } + }); + }); + } + + // 反向执行动画 + _reverseAnimation() async { + await controller!.reverse(); + } + + // 正向执行动画 + _forwardAnimation() async { + await controller!.forward(); + } + + ///顶部,提示+关闭 + _topContainer() { + return Container( + height: 70.h, + padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), + decoration: const BoxDecoration( + border: Border(bottom: BorderSide(width: 1, color: Color(0xffe5e5e5))), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('拖动下方滑块完成拼图', style: TextStyle(fontSize: 26.sp),), + IconButton( + icon: const Icon(Icons.refresh), + iconSize: 30, + color: Colors.black54, + onPressed: () { + //刷新 + loadCaptcha(); + }), + ], + ), + ); + } + + _middleContainer() { + ////显示验证码 + return Container( + margin: const EdgeInsets.symmetric(vertical: 10), + child: Stack( + children: [ + ///底图 310*155 + baseImageBase64.isNotEmpty ? + Image.memory( + const Base64Decoder().convert(baseImageBase64), + fit: BoxFit.fitWidth, + // key: _baseImageKey, + gaplessPlayback: true, + ): + Container( + width: 310, + height: 155, + alignment: Alignment.center, + child: const CircularProgressIndicator(), + ), + + ///滑块图 + slideImageBase64.isNotEmpty ? + Obx(() => Container( + margin: EdgeInsets.fromLTRB(state.sliderXMoved.value, 0, 0, 0), + child: Image.memory(const Base64Decoder().convert(slideImageBase64), + fit: BoxFit.fitHeight, + // key: _slideImageKey, + gaplessPlayback: true, + ), + )) : Container(), + Positioned( + bottom: 0, + left: -10, + right: -10, + child: Offstage( + offstage: !_showTimeLine, + child: FractionalTranslation( + translation: Offset(0, offsetAnimation!.value), + child: Container( + margin: const EdgeInsets.only(left: 10, right: 10), + height: 40, + color: _checkSuccess ? const Color(0x7F66BB6A) : const Color.fromRGBO(200, 100, 100, 0.4), + alignment: Alignment.centerLeft, + child: Text( + _checkSuccess + ? "${(_checkMilliseconds / (60.0 * 12)).toStringAsFixed(2)}s验证成功" + : "验证失败", + style: const TextStyle(color: Colors.white), + ), + ), + ), + )), + Positioned( + bottom: -20, + left: 0, + right: 0, + child: Offstage( + offstage: !_showTimeLine, + child: Container( + margin: const EdgeInsets.only(left: 10, right: 10), + height: 20, + color: Colors.white, + ), + )) + ], + ), + ); + } + + ///底部,滑动区域 + _bottomContainer() { + return baseSize.width >0 ? + Container( + height: 70, + width: baseSize.width, + child: Stack( + alignment: AlignmentDirectional.centerStart, + children: [ + Container( + height: _bottomSliderSize, + decoration: BoxDecoration( + border: Border.all( + width: 1, + color: const Color(0xffe5e5e5), + ), + color: const Color(0xfff8f9fb), + ), + ), + Container( + alignment: Alignment.center, + child: Text('向右拖动滑块填充拼图', style: TextStyle(fontSize: 16),), + ), + Obx(() => Container( + width: state.sliderXMoved.value, + height: _bottomSliderSize-2, + color: const Color(0xfff3fef1), + )), + GestureDetector( + onPanStart: (startDetails) { + ///开始 + _checkMilliseconds = DateTime.now().millisecondsSinceEpoch; + print(startDetails.localPosition); + sliderStartX = startDetails.localPosition.dx; + }, + onPanUpdate: (updateDetails) { + ///更新 + print(updateDetails.localPosition); + double offset = updateDetails.localPosition.dx - sliderStartX; + if(offset < 0){ + offset = 0; + } + print("offset ------ $offset"); + setState(() { + state.sliderXMoved.value = offset; + }); + }, + onPanEnd: (endDetails) { //结束 + print("endDetails sliderXMoved:${state.sliderXMoved.value}"); + checkCaptcha(state.sliderXMoved.value); + int nowTime = DateTime.now().millisecondsSinceEpoch; + _checkMilliseconds = nowTime - _checkMilliseconds; + }, + child: Obx(() { + return Container( + width: _bottomSliderSize, + height: _bottomSliderSize, + margin: EdgeInsets.only(left: state.sliderXMoved.value > 0 ? state.sliderXMoved.value : 1), + decoration: const BoxDecoration( + border: Border( + top: BorderSide(width: 1, color: Color(0xffe5e5e5)), + right: BorderSide(width: 1, color: Color(0xffe5e5e5)), + bottom: BorderSide(width: 1, color: Color(0xffe5e5e5)), + ), + color: Colors.white, + ), + child: IconButton( + icon: const Icon(Icons.arrow_forward), + iconSize: 30, + color: Colors.black54, onPressed: () {}, + ), + ); + }), + ) + ], + )) + : Container(); + } + + @override + void dispose() { + controller!.dispose(); + super.dispose(); + } +} + + +class MaxScaleTextWidget extends StatelessWidget { + final double max; + final Widget child; + + const MaxScaleTextWidget({Key? key, this.max = 1.0, required this.child}) : super(key: key); + + @override + Widget build(BuildContext context) { + var data = MediaQuery.of(context); + var textScaleFactor = min(max, data.textScaleFactor); + return MediaQuery(data: data.copyWith(textScaleFactor: textScaleFactor), child: child); + } +} diff --git a/star_lock/lib/common/safetyVerification/safetyVerification_state.dart b/star_lock/lib/common/safetyVerification/safetyVerification_state.dart new file mode 100644 index 00000000..d553bf65 --- /dev/null +++ b/star_lock/lib/common/safetyVerification/safetyVerification_state.dart @@ -0,0 +1,19 @@ + + +import 'package:get/get.dart'; +import 'entity/SafetyVerificationEntity.dart'; + +class SafetyVerificationState{ + + // Rx safetyVerificationEntity = SafetyVerificationEntity().obs; + var sliderXMoved = 0.0.obs; + var getData = {}.obs; + + SafetyVerificationState() { + getData.value = Get.arguments as Map; + } + + void onClose() { + + } +} \ No newline at end of file diff --git a/star_lock/lib/common/safetyVerification_page.dart b/star_lock/lib/common/safetyVerification_page.dart deleted file mode 100644 index 89292669..00000000 --- a/star_lock/lib/common/safetyVerification_page.dart +++ /dev/null @@ -1,529 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'dart:convert'; -import 'dart:math'; - -import '../app_settings/app_colors.dart'; -import '../tools/titleAppBar.dart'; -import '../translations/trans_lib.dart'; - -class SafetyVerificationPage extends StatefulWidget { - const SafetyVerificationPage({Key? key}) : super(key: key); - - @override - State createState() => _SafetyVerificationPageState(); -} - -class _SafetyVerificationPageState extends State with TickerProviderStateMixin { -// String baseImageBase64 = -// "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"; - String baseImageBase64 = ""; - String slideImageBase64 = ""; - String captchaToken = ""; - String secretKey = "";//加密key - - Size baseSize = Size.zero; //底部基类图片 - Size slideSize = Size.zero; //滑块图片 - - - var sliderColor = Colors.white; //滑块的背景色 - var sliderIcon = Icons.arrow_forward; //滑块的图标 - var movedXBorderColor = Colors.white; //滑块拖动时,左边已滑的区域边框颜色 - double sliderStartX = 0; //滑块未拖前的X坐标 - double sliderXMoved = 0; - bool sliderMoveFinish = false; //滑块拖动结束 - bool checkResultAfterDrag = false; //拖动后的校验结果 - - //-------------动画------------ - int _checkMilliseconds = 0; //滑动时间 - bool _showTimeLine = false; //是否显示动画部件 - bool _checkSuccess = false; //校验是否成功 - AnimationController? controller; - - //高度动画 - Animation? offsetAnimation; - - //底部部件key - GlobalKey _containerKey = new GlobalKey(); - //背景图key - GlobalKey _baseImageKey = new GlobalKey(); - //滑块 - GlobalKey _slideImageKey = new GlobalKey(); - double _bottomSliderSize = 60; - - - //------------动画------------ - - //校验通过 - void checkSuccess(String content) { - setState(() { - checkResultAfterDrag = true; - _checkSuccess = true; - _showTimeLine = true; - }); - _forwardAnimation(); - updateSliderColorIcon(); - - //刷新验证码 - Future.delayed(Duration(milliseconds: 1000)).then((v) { - _reverseAnimation().then((v) { - setState(() { - _showTimeLine = false; - }); - //回调 - // if (widget.onSuccess != null) { - // widget.onSuccess!(content); - // } - //关闭验证码 - print(content); - Navigator.pop(context); - }); - }); - } - - //校验失败 - void checkFail() { - setState(() { - _showTimeLine = true; - _checkSuccess = false; - checkResultAfterDrag = false; - }); - _forwardAnimation(); - updateSliderColorIcon(); - - //刷新验证码 - Future.delayed(Duration(milliseconds: 1000)).then((v) { - _reverseAnimation().then((v) { - setState(() { - _showTimeLine = false; - }); - loadCaptcha(); - //回调 - // if (widget.onFail != null) { - // widget.onFail!(); - // } - }); - }); - } - - //重设滑动颜色与图标 - void updateSliderColorIcon() { - var _sliderColor; //滑块的背景色 - var _sliderIcon; //滑块的图标 - var _movedXBorderColor; //滑块拖动时,左边已滑的区域边框颜色 - - //滑块的背景色 - if (sliderMoveFinish) { - //拖动结束 - _sliderColor = checkResultAfterDrag ? Colors.green : Colors.red; - _sliderIcon = checkResultAfterDrag ? Icons.check : Icons.close; - _movedXBorderColor = checkResultAfterDrag ? Colors.green : Colors.red; - } else { - //拖动未开始或正在拖动中 - _sliderColor = sliderXMoved > 0 ? Color(0xff447ab2) : Colors.white; - _sliderIcon = Icons.arrow_forward; - _movedXBorderColor = Color(0xff447ab2); - } - - sliderColor = _sliderColor; - sliderIcon = _sliderIcon; - movedXBorderColor = _movedXBorderColor; - setState(() {}); - } - - //加载验证码 - void loadCaptcha() { - setState(() { - _showTimeLine = false; - sliderMoveFinish = false; - checkResultAfterDrag = false; - sliderColor = Colors.white; //滑块的背景色 - sliderIcon = Icons.arrow_forward; //滑块的图标 - movedXBorderColor = Colors.white; //滑块拖动时,左边已滑的区域边框颜色 - }); - // HttpManager.requestData('/captcha/get', {"captchaType": "blockPuzzle"}, {}).then((res) async { - // if (res['repCode'] != '0000' || res['repData'] == null) { - // setState(() { - // secretKey = ""; - // }); - // return; - // } - // - // Map repData = res['repData']; - // sliderXMoved = 0; - // sliderStartX = 0; - // captchaToken = ''; - // checkResultAfterDrag = false; - // - // baseImageBase64 = repData["originalImageBase64"]; - // baseImageBase64 = repData["originalImageBase64"]; - // secretKey = repData["secretKey"] ?? ""; - // baseImageBase64 = baseImageBase64.replaceAll('\n', ''); - // slideImageBase64 = repData["jigsawImageBase64"]; - // slideImageBase64 = slideImageBase64.replaceAll('\n', ''); - // captchaToken = repData["token"]; - // - // var baseR = await WidgetUtil.getImageWH( - // image: Image.memory(Base64Decoder().convert(baseImageBase64))); - // baseSize = baseR.size; - // - // var silderR = await WidgetUtil.getImageWH( - // image: Image.memory(Base64Decoder().convert(slideImageBase64))); - // slideSize = silderR.size; - // - // setState(() {}); - // }).catchError((error) { - // print(error); - // }); - } - - //校验验证码 - void checkCaptcha(sliderXMoved, captchaToken, {BuildContext? myContext}) { - setState(() { - sliderMoveFinish = true; - }); - //滑动结束,改变滑块的图标及颜色 -// updateSliderColorIcon(); - - //pointJson参数需要aes加密 - -// MediaQueryData mediaQuery = MediaQuery.of(myContext); - var pointMap = {"x": sliderXMoved, "y": 5}; - // var pointStr = json.encode(pointMap); - // var cryptedStr = pointStr; - - // secretKey 不为空 进行as加密 - // if(!ObjectUtils.isEmpty(secretKey)){ - // var aesEncrypter = AesCrypt(key: secretKey, padding: 'ecb');// 'ecb', 'pkcs7', - // cryptedStr = aesEncrypter.encrypt(pointStr); - // var dcrypt = aesEncrypter.decrypt(cryptedStr); - // Map _map = json.decode(dcrypt); - - // } - - - // HttpManager.requestData('/captcha/check', {"pointJson": cryptedStr, "captchaType": "blockPuzzle", "token": captchaToken}, {}).then((res) { - // if (res['repCode'] != '0000' || res['repData'] == null) { - // checkFail(); - // return; - // } - // - // Map repData = res['repData']; - // if (repData["result"] != null && repData["result"] == true) { - // //如果不加密 将 token 和 坐标序列化 通过 --- 链接成字符串 - // var captchaVerification = "$captchaToken---$pointStr"; - // if(!ObjectUtils.isEmpty(secretKey)){ - // //如果加密 将 token 和 坐标序列化 通过 --- 链接成字符串 进行加密 加密密钥为 _clickWordCaptchaModel.secretKey - // captchaVerification = EncryptUtil.aesEncode(key: secretKey, content: captchaVerification); - // } - // checkSuccess(captchaVerification); - // } else { - // checkFail(); - // } - // }).catchError((error) { - // loadCaptcha(); - // print(error); - // }); - } - - @override - void initState() { - super.initState(); - initAnimation(); - loadCaptcha(); - } - - @override - void dispose() { - controller!.dispose(); - super.dispose(); - } - - // 初始化动画 - void initAnimation() { - controller = - AnimationController(duration: const Duration(milliseconds: 500), vsync: this); - - offsetAnimation = Tween(begin: 0.5, end: 0) - .animate(CurvedAnimation(parent: controller!, curve: Curves.ease)) - ..addListener(() { - this.setState(() {}); - }); - } - - // 反向执行动画 - _reverseAnimation() async { - await controller!.reverse(); - } - - // 正向执行动画 - _forwardAnimation() async { - await controller!.forward(); - } - - @override - void didUpdateWidget(SafetyVerificationPage oldWidget) { - // TODO: implement didUpdateWidget - super.didUpdateWidget(oldWidget); - } - - @override - Widget build(BuildContext context) { - return MaxScaleTextWidget( - child: buildContent(context), - ); - } - - Widget buildContent(BuildContext context) { - var mediaQuery = MediaQuery.of(context); - var dialogWidth = 0.9 * mediaQuery.size.width; - if (dialogWidth < 330) { - dialogWidth = mediaQuery.size.width; - } - - return Scaffold( - backgroundColor: Colors.white, - appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.about!.tr, - haveBack: true, - backgroundColor: AppColors.mainColor), - body: Container( - key: _containerKey, - width: 1.sw, - height: 340, - color: Colors.white, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - _topContainer(), - _middleContainer(), - _bottomContainer(), - // IconButton( - // icon: Icon(Icons.refresh), - // iconSize: 30, - // color: Colors.black54, - // onPressed: () { - // //刷新 - // loadCaptcha(); - // }), - ], - ), - ), - ); - } - - ///顶部,提示+关闭 - _topContainer() { - return Container( - height: 70.h, - padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), - decoration: const BoxDecoration( - border: Border(bottom: BorderSide(width: 1, color: Color(0xffe5e5e5))), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text('拖动下方滑块完成拼图', style: TextStyle(fontSize: 26.sp),), - // IconButton( - // icon: Icon(Icons.highlight_off), - // iconSize: 30, - // color: Colors.black38, - // onPressed: () { - // //退出 - // Navigator.pop(context); - // }), - ], - ), - ); - } - - _middleContainer() { - ////显示验证码 - return Container( - margin: const EdgeInsets.symmetric(vertical: 10), - child: Stack( - children: [ - ///底图 310*155 - baseImageBase64.isNotEmpty ? - Image.memory( - const Base64Decoder().convert(baseImageBase64), - fit: BoxFit.fitWidth, - key: _baseImageKey, - gaplessPlayback: true, - ): - Container( - width: 310, - height: 155, - alignment: Alignment.center, - child: const CircularProgressIndicator(), - ), - - ///滑块图 - slideImageBase64.isNotEmpty ? - Container( - margin: EdgeInsets.fromLTRB(sliderXMoved, 0, 0, 0), - child: Image.memory(Base64Decoder().convert(slideImageBase64), - fit: BoxFit.fitHeight, - key: _slideImageKey, - gaplessPlayback: true, - ), - ) : Container(), - - //刷新按钮 - // Positioned( - // top: 0, - // right: 0, - // child: IconButton( - // icon: Icon(Icons.refresh), - // iconSize: 30, - // color: Colors.black54, - // onPressed: () { - // //刷新 - // loadCaptcha(); - // }), - // ), - Positioned( - bottom: 0, - left: -10, - right: -10, - child: Offstage( - offstage: !_showTimeLine, - child: FractionalTranslation( - translation: Offset(0, offsetAnimation!.value), - child: Container( - margin: const EdgeInsets.only(left: 10, right: 10), - height: 40, - color: _checkSuccess ? const Color(0x7F66BB6A) : const Color.fromRGBO(200, 100, 100, 0.4), - alignment: Alignment.centerLeft, - child: Text( - _checkSuccess - ? "${(_checkMilliseconds / (60.0 * 12)).toStringAsFixed(2)}s验证成功" - : "验证失败", - style: TextStyle(color: Colors.white), - ), - ), - ), - )), - Positioned( - bottom: -20, - left: 0, - right: 0, - child: Offstage( - offstage: !_showTimeLine, - child: Container( - margin: const EdgeInsets.only(left: 10, right: 10), - height: 20, - color: Colors.white, - ), - )) - ], - ), - ); - } - ///底部,滑动区域 - _bottomContainer() { - return baseSize.width >0 ? - Container( - height: 70, - width: baseSize.width, -// color: Colors.cyanAccent, - child: Stack( - alignment: AlignmentDirectional.centerStart, - children: [ - Container( - height: _bottomSliderSize, - decoration: BoxDecoration( - border: Border.all( - width: 1, - color: const Color(0xffe5e5e5), - ), - color: const Color(0xfff8f9fb), - ), - ), - Container( - alignment: Alignment.center, - child: Text('向右拖动滑块填充拼图', style: TextStyle(fontSize: 16),), - ), - Container( - width: sliderXMoved, - height: _bottomSliderSize-2, - decoration: BoxDecoration( - border: Border.all( - width: sliderXMoved > 0 ? 1 : 0, - color: movedXBorderColor, - ), - color: const Color(0xfff3fef1), - ), - ), - GestureDetector( - onPanStart: (startDetails) { - ///开始 - _checkMilliseconds = DateTime.now().millisecondsSinceEpoch; - print(startDetails.localPosition); - sliderStartX = startDetails.localPosition.dx; - }, - onPanUpdate: (updateDetails) { - ///更新 - print(updateDetails.localPosition); - double w1 = _baseImageKey.currentContext!.size!.width - _slideImageKey.currentContext!.size!.width; - double offset = updateDetails.localPosition.dx - sliderStartX; - if(offset < 0){ - offset = 0; - } - if(offset > w1){ - offset = w1; - } - print("offset ------ $offset"); - setState(() { - sliderXMoved = offset; - }); - //滑动过程,改变滑块左边框颜色 - updateSliderColorIcon(); - }, - onPanEnd: (endDetails) { //结束 - print("endDetails"); - checkCaptcha(sliderXMoved, captchaToken); - int nowTime = DateTime.now().millisecondsSinceEpoch; - _checkMilliseconds = nowTime - _checkMilliseconds; - }, - child: Container( - width: _bottomSliderSize, - height: _bottomSliderSize, - margin: EdgeInsets.only(left: sliderXMoved > 0 ? sliderXMoved : 1), - decoration: BoxDecoration( - border: const Border( - top: BorderSide(width: 1, color: Color(0xffe5e5e5)), - right: BorderSide(width: 1, color: Color(0xffe5e5e5)), - bottom: BorderSide(width: 1, color: Color(0xffe5e5e5)), - ), - color: sliderColor, - ), - child: IconButton( - icon: Icon(sliderIcon), - iconSize: 30, - color: Colors.black54, onPressed: () { }, - ), - ), - ) - ], - )) - : Container(); - } -} - - -class MaxScaleTextWidget extends StatelessWidget { - final double max; - final Widget child; - - MaxScaleTextWidget({Key? key, this.max = 1.0, required this.child}) : super(key: key); - - @override - Widget build(BuildContext context) { - var data = MediaQuery.of(context); - var textScaleFactor = min(max, data.textScaleFactor); - return MediaQuery(data: data.copyWith(textScaleFactor: textScaleFactor), child: child); - } -} diff --git a/star_lock/lib/login/login/entity/LoginEntity.dart b/star_lock/lib/login/login/entity/LoginEntity.dart index a441a31f..5f886d0e 100644 --- a/star_lock/lib/login/login/entity/LoginEntity.dart +++ b/star_lock/lib/login/login/entity/LoginEntity.dart @@ -2,30 +2,30 @@ import 'Data.dart'; class LoginEntity { LoginEntity({ - this.msg, - this.msgCode, - this.data, - this.code,}); + this.description, + this.errorCode, + this.content, + this.errorMsg,}); LoginEntity.fromJson(dynamic json) { - msg = json['msg']; - msgCode = json['msgCode']; - data = json['data'] != null ? Data.fromJson(json['data']) : null; - code = json['code']; + description = json['description']; + errorCode = json['errorCode']; + content = json['content'] != null ? Data.fromJson(json['content']) : null; + errorMsg = json['errorMsg']; } - String? msg; - int? msgCode; - Data? data; - int? code; + String? description; + int? errorCode; + Data? content; + int? errorMsg; Map toJson() { final map = {}; - map['msg'] = msg; - map['msgCode'] = msgCode; - if (data != null) { - map['data'] = data!.toJson(); + map['description'] = description; + map['errorCode'] = errorCode; + if (content != null) { + map['data'] = content!.toJson(); } - map['code'] = code; + map['errorMsg'] = errorMsg; return map; } diff --git a/star_lock/lib/login/register/starLock_register_logic.dart b/star_lock/lib/login/register/starLock_register_logic.dart index 6af9dc8a..c1b47786 100644 --- a/star_lock/lib/login/register/starLock_register_logic.dart +++ b/star_lock/lib/login/register/starLock_register_logic.dart @@ -11,13 +11,13 @@ class StarLockRegisterLogic extends BaseGetXController{ void register() async{ var entity = await ApiRepository.to.register( state.countryCode.value, - state.countryCode.value, + state.countryId.value, state.phoneOrEmailStr.value, state.pwd.value, "gdasdfasdfasdf", state.verificationCode.value ); - if(entity.code!.codeIsSuccessful){ + if(entity.errorCode!.codeIsSuccessful){ await loginSuccess(loginEntity: entity); } else { diff --git a/star_lock/lib/login/register/starLock_register_page.dart b/star_lock/lib/login/register/starLock_register_page.dart index ecccf893..ab1efe44 100644 --- a/star_lock/lib/login/register/starLock_register_page.dart +++ b/star_lock/lib/login/register/starLock_register_page.dart @@ -203,14 +203,11 @@ class _StarLockRegisterPageState extends State { print("3333333:${v}"); logic.checkNext(state.phoneOrEmailController); }, - leftWidget: Padding( - padding: EdgeInsets.only( - top: 30.w, bottom: 20.w, right: 20.w, left: 5.w), - child: Image.asset( - 'images/icon_login_account.png', - width: 40.w, - height: 40.w, - ), + leftWidget: + // Image.asset('images/icon_login_account.png', width: 30.w, height: 30.w,), + Padding( + padding: EdgeInsets.only(right: 10.w, left: 5.w), + child: Image.asset('images/icon_login_account.png', width: 30.w, height: 30.w,), ), hintText: TranslationLoader.lanKeys!.pleaseEnterNumberOrEmail!.tr, keyboardType: TextInputType.number, @@ -226,13 +223,8 @@ class _StarLockRegisterPageState extends State { }, isPwd: true, leftWidget: Padding( - padding: EdgeInsets.only( - top: 30.w, bottom: 20.w, right: 20.w, left: 5.w), - child: Image.asset( - 'images/icon_login_password.png', - width: 40.w, - height: 40.w, - ), + padding: EdgeInsets.only(right: 10.w, left: 5.w), + child: Image.asset('images/icon_login_password.png', width: 30.w, height: 30.w,), ), hintText: "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.password!.tr}", @@ -253,13 +245,8 @@ class _StarLockRegisterPageState extends State { }, isPwd: true, leftWidget: Padding( - padding: EdgeInsets.only( - top: 30.w, bottom: 20.w, right: 20.w, left: 5.w), - child: Image.asset( - 'images/icon_login_password.png', - width: 40.w, - height: 40.w, - ), + padding: EdgeInsets.only(right: 10.w, left: 5.w), + child: Image.asset('images/icon_login_password.png', width: 30.w, height: 30.w,), ), hintText: "${TranslationLoader.lanKeys!.sure!.tr}${TranslationLoader.lanKeys!.password!.tr}", @@ -277,11 +264,10 @@ class _StarLockRegisterPageState extends State { logic.checkNext(state.codeController); }, leftWidget: Padding( - padding: EdgeInsets.only( - top: 30.w, bottom: 20.w, right: 20.w, left: 5.w), + padding: EdgeInsets.only(right: 10.w, left: 5.w), child: SizedBox( - width: 36.w, - height: 36.w, + width: 30.w, + height: 30.w, ), // Image.asset( // 'images/main/icon_main_search.png', @@ -289,8 +275,7 @@ class _StarLockRegisterPageState extends State { // height: 40.w, // ), ), - hintText: - "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.verificationCode!.tr}", + hintText: "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.verificationCode!.tr}", inputFormatters: [ LengthLimitingTextInputFormatter(20), ]), @@ -309,7 +294,7 @@ class _StarLockRegisterPageState extends State { child: Center( child: Text( _seconds == 60 - ? '${TranslationLoader.lanKeys!.getTip!.tr}${TranslationLoader.lanKeys!.verificationCode!.tr}' + ? TranslationLoader.lanKeys!.getVerificationCode!.tr : (_seconds < 10) ? '0$_seconds s' : '$_seconds s', @@ -321,7 +306,7 @@ class _StarLockRegisterPageState extends State { ), ), onTap: () { - Navigator.pushNamed(context, Routers.safetyVerificationPage); + Navigator.pushNamed(context, Routers.safetyVerificationPage, arguments: {"countryCode":"+86", "account":"15080825640"}); if (_seconds == 60) { // _setVerify(); } else { diff --git a/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_page.dart b/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_page.dart index e269a1af..28690fb9 100644 --- a/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_page.dart +++ b/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_page.dart @@ -78,7 +78,7 @@ class _ElectronicKeyDetailPageState extends State { rightTitle: "", isHaveDirection: true, action: () { - Navigator.pushNamed(context, Routers.keyOperationRecordPage); + Navigator.pushNamed(context, Routers.keyOperationRecordPage, arguments: {}); }), Container(height: 40.h), SubmitBtn( diff --git a/star_lock/lib/network/api.dart b/star_lock/lib/network/api.dart index da12763c..f4cf50ad 100644 --- a/star_lock/lib/network/api.dart +++ b/star_lock/lib/network/api.dart @@ -6,6 +6,8 @@ abstract class Api { final String getVerificationCodeUrl = '/api/v1/vcode/email'; final String registerUrl = '/user/register'; + final String getSliderVerifyImgUrl = '/user/getSliderVerifyImg'; + final String checkImgUrl = '/user/isSliderValid'; final String loginUrl = '/api/v1/vcode/email'; } diff --git a/star_lock/lib/network/api_provider.dart b/star_lock/lib/network/api_provider.dart index 8a6c17b2..ed7992b6 100644 --- a/star_lock/lib/network/api_provider.dart +++ b/star_lock/lib/network/api_provider.dart @@ -18,6 +18,17 @@ class ApiProvider extends BaseProvider { 'verificationCode':verificationCode, }); + Future getSliderVerifyImg(String countryCode, String account) => post(getSliderVerifyImgUrl.toUrl, null,query: { + 'countryCode':countryCode, + 'account':account, + }); + + Future checkSliderVerifyImg(String countryCode, String account, String xWidth) => post(checkImgUrl.toUrl, null,query: { + 'countryCode':countryCode, + 'account':account, + 'xWidth':xWidth, + }); + Future login(String email,String password) => post(loginUrl.toUrl, null,query: {'email':email,'password':password}); } diff --git a/star_lock/lib/network/api_repository.dart b/star_lock/lib/network/api_repository.dart index 9cdef1a2..d1a34502 100644 --- a/star_lock/lib/network/api_repository.dart +++ b/star_lock/lib/network/api_repository.dart @@ -1,6 +1,8 @@ import 'package:get/get.dart'; +import '../common/safetyVerification/entity/CheckSafetyVerificationEntity.dart'; +import '../common/safetyVerification/entity/SafetyVerificationEntity.dart'; import '../login/login/entity/LoginEntity.dart'; import 'api_provider.dart'; @@ -20,6 +22,16 @@ class ApiRepository { return LoginEntity.fromJson(res.body); } + Future getSliderVerifyImg(String countryCode, String account) async { + final res = await apiProvider.getSliderVerifyImg(countryCode, account); + return SafetyVerificationEntity.fromJson(res.body); + } + + Future checkSliderVerifyImg(String countryCode, String account, String xWidth) async { + final res = await apiProvider.checkSliderVerifyImg(countryCode, account, xWidth); + return CheckSafetyVerificationEntity.fromJson(res.body); + } + // Future login({String? email,String? password}) async { // final res = await apiProvider.login(email,SecrecyUtils.md5EncodeUpperCase(input: password)); // return LoginEntity.fromJson(res.body); diff --git a/star_lock/lib/tools/baseGetXController.dart b/star_lock/lib/tools/baseGetXController.dart index efb0e414..3a5a6c0a 100644 --- a/star_lock/lib/tools/baseGetXController.dart +++ b/star_lock/lib/tools/baseGetXController.dart @@ -89,6 +89,6 @@ class BaseGetXController extends GetxController{ ///Extension_Int extension Extension_Int on int { - bool get codeIsSuccessful => this == 1; + bool get codeIsSuccessful => this == 0; bool get msgCodeIsSuccessful => this == 1; } \ No newline at end of file diff --git a/star_lock/lib/tools/store_service.dart b/star_lock/lib/tools/store_service.dart index d5490d15..849e126f 100644 --- a/star_lock/lib/tools/store_service.dart +++ b/star_lock/lib/tools/store_service.dart @@ -37,8 +37,8 @@ class StoreService extends GetxService { Future saveLogInInfo(LoginEntity entity) async { _loginEntity = LoginEntity.fromJson(entity.toJson()); save(_loginUserInfoKey, entity.toJson()); - if(_loginEntity != null && _loginEntity!.data != null && _loginEntity!.data!.email != null && _loginEntity!.data!.email!.isNotEmpty) { - save(_userAccount, _loginEntity?.data?.email); + if(_loginEntity != null && _loginEntity!.content != null && _loginEntity!.content!.email != null && _loginEntity!.content!.email!.isNotEmpty) { + save(_userAccount, _loginEntity?.content?.email); } } @@ -48,8 +48,8 @@ class StoreService extends GetxService { // String getLanguageCode() => hasData(_languageCode) ? read(_languageCode): ""; Future saveLanguageCode(String code) => save(_languageCode, code); - bool get hadToken => _loginEntity !=null && _loginEntity!.data!.token!.isNotEmpty; - String? get userToken => hadToken ? _loginEntity!.data!.token : ""; + bool get hadToken => _loginEntity !=null && _loginEntity!.content!.token!.isNotEmpty; + String? get userToken => hadToken ? _loginEntity!.content!.token : ""; // String getLastUserAccount() => hasData(_userAccount) ? read(_userAccount): ""; void removeLastUserAccount() => remove(_userAccount); diff --git a/star_lock/lib/translations/lanKeyEntity.dart b/star_lock/lib/translations/lanKeyEntity.dart index db33e557..a1dcb741 100644 --- a/star_lock/lib/translations/lanKeyEntity.dart +++ b/star_lock/lib/translations/lanKeyEntity.dart @@ -367,6 +367,7 @@ class LanKeyEntity { this.hideInvalidUnlockPermissionsTip, this.appUnlockRequiresMobilePhoneAccessToTheLockTip, this.checkAll, + this.getVerificationCode }); LanKeyEntity.fromJson(dynamic json) { @@ -764,6 +765,7 @@ class LanKeyEntity { appUnlockRequiresMobilePhoneAccessToTheLockTip = json['appUnlockRequiresMobilePhoneAccessToTheLockTip']; checkAll = json['checkAll']; + getVerificationCode = json['getVerificationCode']; } String? starLock; String? clickUnlockAndHoldDownClose; @@ -1148,6 +1150,7 @@ class LanKeyEntity { String? hideInvalidUnlockPermissionsTip; String? appUnlockRequiresMobilePhoneAccessToTheLockTip; String? checkAll; + String? getVerificationCode; Map toJson() { final map = {}; @@ -1543,7 +1546,7 @@ class LanKeyEntity { map['appUnlockRequiresMobilePhoneAccessToTheLockTip'] = appUnlockRequiresMobilePhoneAccessToTheLockTip; map['checkAll'] = checkAll; - + map['getVerificationCode'] = getVerificationCode; return map; } }