From 0f23a8a667dacd83015ced5da633bdc60ba66588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=8F=E5=B0=91=E9=98=B3?= <786612630@qq.com> Date: Sat, 29 Jul 2023 09:25:21 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E8=AF=95=E6=B3=A8=E5=86=8C=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/ios/Podfile.lock | 13 + star_lock/lib/appRouters.dart | 58 +- .../lib/common/safetyVerification_page.dart | 529 ++++++++++++++++++ .../lib/login/login/starLock_login_logic.dart | 6 + .../lib/login/login/starLock_login_state.dart | 5 + .../register/starLock_register_binding.dart | 9 + .../register/starLock_register_logic.dart | 53 ++ .../register/starLock_register_page.dart | 60 +- .../register/starLock_register_state.dart | 32 ++ .../seletCountryRegion_page.dart | 19 +- star_lock/lib/main.dart | 4 + .../lib/main/lockMian/lockMain_page.dart | 47 +- star_lock/lib/network/api.dart | 7 +- star_lock/lib/network/api_provider.dart | 14 +- star_lock/lib/network/api_repository.dart | 11 +- .../lib/network/request_interceptor.dart | 5 +- star_lock/lib/tools/baseGetXController.dart | 94 ++++ star_lock/lib/tools/bindings/app_binding.dart | 14 + star_lock/lib/tools/submitBtn.dart | 8 +- star_lock/lib/tools/tf_loginInput.dart | 6 +- .../flutter/generated_plugin_registrant.cc | 4 + .../linux/flutter/generated_plugins.cmake | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 4 + star_lock/pubspec.yaml | 9 +- .../flutter/generated_plugin_registrant.cc | 3 + .../windows/flutter/generated_plugins.cmake | 1 + 26 files changed, 935 insertions(+), 81 deletions(-) create mode 100644 star_lock/lib/common/safetyVerification_page.dart create mode 100644 star_lock/lib/login/login/starLock_login_logic.dart create mode 100644 star_lock/lib/login/login/starLock_login_state.dart create mode 100644 star_lock/lib/login/register/starLock_register_binding.dart create mode 100644 star_lock/lib/login/register/starLock_register_logic.dart create mode 100644 star_lock/lib/login/register/starLock_register_state.dart create mode 100644 star_lock/lib/tools/baseGetXController.dart create mode 100644 star_lock/lib/tools/bindings/app_binding.dart diff --git a/star_lock/ios/Podfile.lock b/star_lock/ios/Podfile.lock index 1d52340e..c6ba6adc 100644 --- a/star_lock/ios/Podfile.lock +++ b/star_lock/ios/Podfile.lock @@ -1,4 +1,6 @@ PODS: + - aj_captcha_flutter (0.0.1): + - Flutter - device_info_plus (0.0.1): - Flutter - Flutter (1.0.0) @@ -16,11 +18,15 @@ PODS: - Flutter - Protobuf (~> 3.5) - SwiftProtobuf (~> 1.0) + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS - SwiftProtobuf (1.22.0) - url_launcher_ios (0.0.1): - Flutter DEPENDENCIES: + - aj_captcha_flutter (from `.symlinks/plugins/aj_captcha_flutter/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`) @@ -28,6 +34,7 @@ DEPENDENCIES: - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - reactive_ble_mobile (from `.symlinks/plugins/reactive_ble_mobile/ios`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) SPEC REPOS: @@ -36,6 +43,8 @@ SPEC REPOS: - SwiftProtobuf EXTERNAL SOURCES: + aj_captcha_flutter: + :path: ".symlinks/plugins/aj_captcha_flutter/ios" device_info_plus: :path: ".symlinks/plugins/device_info_plus/ios" Flutter: @@ -50,10 +59,13 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/path_provider_foundation/darwin" reactive_ble_mobile: :path: ".symlinks/plugins/reactive_ble_mobile/ios" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" url_launcher_ios: :path: ".symlinks/plugins/url_launcher_ios/ios" SPEC CHECKSUMS: + aj_captcha_flutter: dd7af1aa064bdd621ae335b819bab07309c3c023 device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 flutter_native_contact_picker: bd430ba0fbf82768bb50c2c52a69a65759a8f907 @@ -62,6 +74,7 @@ SPEC CHECKSUMS: path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 Protobuf: c6bc59bbab3d38a71c67f62d7cb7ca8f8ea4eca1 reactive_ble_mobile: 9ce6723d37ccf701dbffd202d487f23f5de03b4c + shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 SwiftProtobuf: 40bd808372cb8706108f22d28f8ab4a6b9bc6989 url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 diff --git a/star_lock/lib/appRouters.dart b/star_lock/lib/appRouters.dart index 8494412b..adfee570 100644 --- a/star_lock/lib/appRouters.dart +++ b/star_lock/lib/appRouters.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:star_lock/login/register/starLock_register_binding.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_page.dart'; import 'package:star_lock/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator_page.dart'; import 'package:star_lock/mine/mineSet/lockGroup/lockGroupList_page.dart'; @@ -10,6 +11,7 @@ import 'package:star_lock/mine/mineSet/transferSmartLock/recipientInformation_pa import 'package:star_lock/mine/mineSet/transferSmartLock/selectBranch_page.dart'; import 'package:star_lock/mine/mineSet/transferSmartLock/transferSmartLock_page.dart'; +import 'common/safetyVerification_page.dart'; import 'login/forgetPassword/starLock_forgetPassword_page.dart'; import 'login/login/starLock_login_page.dart'; import 'login/register/starLock_register_page.dart'; @@ -239,32 +241,27 @@ abstract class Routers { '/ValueAddedServicesListEmailTemplatePage'; // 增值服务-邮箱模版列表 static const valueAddedServicesAddEmailTemplatePage = '/ValueAddedServicesAddEmailTemplatePage'; // 增值服务-自定义邮箱模版 - static const valueAddedServicesBuyAndUseRecordManagePage = - '/ValueAddedServicesBuyAndUseRecordManagePage'; // 增值服务-购买使用记录 + static const valueAddedServicesBuyAndUseRecordManagePage = '/ValueAddedServicesBuyAndUseRecordManagePage'; // 增值服务-购买使用记录 static const lockScreenPage = '/LockScreenPage'; // 我的设置-锁屏 - static const aPPUnlockNeedMobileNetworkingLockPage = - '/APPUnlockNeedMobileNetworkingLockPage'; // 我的设置-app开锁时需手机连网的锁 - static const hideInvalidUnlockPermissionsPage = - '/HideInvalidUnlockPermissionsPage'; // 我的设置-隐藏无效开锁权限 + static const aPPUnlockNeedMobileNetworkingLockPage = '/APPUnlockNeedMobileNetworkingLockPage'; // 我的设置-app开锁时需手机连网的锁 + static const hideInvalidUnlockPermissionsPage = '/HideInvalidUnlockPermissionsPage'; // 我的设置-隐藏无效开锁权限 static const lockUserManageLisPage = '/LockUserManageLisPage'; //我的设置-锁用户管理 - static const authorizedAdministratorListPage = - '/AuthorizedAdministratorListPage'; //我的设置-授权管理员 + static const authorizedAdministratorListPage = '/AuthorizedAdministratorListPage'; //我的设置-授权管理员 static const lockGroupListPage = '/LockGroupListPage'; //我的设置-锁分组 static const lockItemListPage = '/LockItemListPage'; //锁分组-锁列表 static const transferSmartLockPage = '/transferSmartLockPage'; //转移智能锁 static const recipientInformationPage = '/recipientInformationPage'; //接受人信息 static const selectBranchPage = '/SelectBranchPage'; //选择分店 static const selectGetewayListPage = '/selectGetewayListPage'; //选择网关 - static const addAuthorizedAdministratorPage = - '/addAuthorizedAdministratorPage'; //添加授权管理员 + static const addAuthorizedAdministratorPage = '/addAuthorizedAdministratorPage'; //添加授权管理员 static const starLockLoginPage = '/StarLockLoginPage'; // 登录 static const starLockRegisterPage = '/StarLockRegisterPage'; // 注册 - static const starLockForgetPasswordPage = - '/StarLockForgetPasswordPage'; // 忘记密码 + static const starLockForgetPasswordPage = '/StarLockForgetPasswordPage'; // 忘记密码 static const seletCountryRegionPage = '/SeletCountryRegionPage'; // 选择国家和地区 + static const safetyVerificationPage = '/SafetyVerificationPage'; // 安全验证 } abstract class AppRouters { @@ -384,10 +381,11 @@ abstract class AppRouters { GetPage( name: Routers.starLockLoginPage, page: () => const StarLockLoginPage(), + ), GetPage( name: Routers.starLockRegisterPage, - page: () => const StarLockRegisterPage(), + page: () => const StarLockRegisterPage(), binding:StarLockRegisterBinding() ), GetPage( name: Routers.starLockForgetPasswordPage, @@ -663,30 +661,44 @@ 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() + ) ]; } diff --git a/star_lock/lib/common/safetyVerification_page.dart b/star_lock/lib/common/safetyVerification_page.dart new file mode 100644 index 00000000..89292669 --- /dev/null +++ b/star_lock/lib/common/safetyVerification_page.dart @@ -0,0 +1,529 @@ +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/starLock_login_logic.dart b/star_lock/lib/login/login/starLock_login_logic.dart new file mode 100644 index 00000000..ea8f6137 --- /dev/null +++ b/star_lock/lib/login/login/starLock_login_logic.dart @@ -0,0 +1,6 @@ + +import 'package:get/get.dart'; + +class StarLockLoginLogic extends GetxController{ + +} \ No newline at end of file diff --git a/star_lock/lib/login/login/starLock_login_state.dart b/star_lock/lib/login/login/starLock_login_state.dart new file mode 100644 index 00000000..b083b79b --- /dev/null +++ b/star_lock/lib/login/login/starLock_login_state.dart @@ -0,0 +1,5 @@ + +class StarLockLoginState{ + + +} \ No newline at end of file diff --git a/star_lock/lib/login/register/starLock_register_binding.dart b/star_lock/lib/login/register/starLock_register_binding.dart new file mode 100644 index 00000000..481f5ad8 --- /dev/null +++ b/star_lock/lib/login/register/starLock_register_binding.dart @@ -0,0 +1,9 @@ +import 'package:get/get.dart'; +import 'starLock_register_logic.dart'; + +class StarLockRegisterBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => StarLockRegisterLogic()); + } +} \ No newline at end of file diff --git a/star_lock/lib/login/register/starLock_register_logic.dart b/star_lock/lib/login/register/starLock_register_logic.dart new file mode 100644 index 00000000..6af9dc8a --- /dev/null +++ b/star_lock/lib/login/register/starLock_register_logic.dart @@ -0,0 +1,53 @@ + +import 'package:flutter/material.dart'; + +import '../../network/api_repository.dart'; +import '../../tools/baseGetXController.dart'; +import 'starLock_register_state.dart'; + +class StarLockRegisterLogic extends BaseGetXController{ + final StarLockRegisterState state = StarLockRegisterState(); + + void register() async{ + var entity = await ApiRepository.to.register( + state.countryCode.value, + state.countryCode.value, + state.phoneOrEmailStr.value, + state.pwd.value, + "gdasdfasdfasdf", + state.verificationCode.value + ); + if(entity.code!.codeIsSuccessful){ + await loginSuccess(loginEntity: entity); + + } else { + + } + } + + void checkNext(TextEditingController controller) { + changeInput(controller); + } + + void changeInput(TextEditingController controller) { + if(controller == state.phoneOrEmailController){ + state.phoneOrEmailStr.value = controller.text; + } + if(controller == state.pwdController) { + state.pwd.value = controller.text; + } + if(controller == state.sureController) { + state.surePwd.value = controller.text; + } + if(controller == state.codeController) { + state.verificationCode.value = controller.text; + } + _resetCanSub(); + } + + void _resetCanSub(){ + state.canSub.value = state.pwdIsOK && state.codeIsOK && (state.isIphoneType.value ? state.isIphone : state.isEmail); + print("22222:${state.canSub.value}"); + } + +} \ No newline at end of file diff --git a/star_lock/lib/login/register/starLock_register_page.dart b/star_lock/lib/login/register/starLock_register_page.dart index d2cc9082..0b162c41 100644 --- a/star_lock/lib/login/register/starLock_register_page.dart +++ b/star_lock/lib/login/register/starLock_register_page.dart @@ -12,6 +12,7 @@ import '../../tools/tf_loginInput.dart'; import '../../tools/submitBtn.dart'; import '../../tools/titleAppBar.dart'; import '../../translations/trans_lib.dart'; +import 'starLock_register_logic.dart'; class StarLockRegisterPage extends StatefulWidget { const StarLockRegisterPage({Key? key}) : super(key: key); @@ -21,12 +22,12 @@ class StarLockRegisterPage extends StatefulWidget { } class _StarLockRegisterPageState extends State { - final TextEditingController _phoneController = TextEditingController(); - final TextEditingController _pwdController = TextEditingController(); - final TextEditingController _codeController = TextEditingController(); + + final logic = Get.find(); + final state = Get.find().state; late Timer _timer; - int _seconds = 60; + final int _seconds = 60; @override Widget build(BuildContext context) { @@ -41,10 +42,21 @@ class _StarLockRegisterPageState extends State { right: 40.w ), children: [ - topSeletCountryAndRegionWidget (), - middleTFWidget (), - SubmitBtn(btnName: "${TranslationLoader.lanKeys!.reset!.tr} ${TranslationLoader.lanKeys!.password!.tr}", fontSize: 30.sp, borderRadius: 20.w, padding: EdgeInsets.only(top: 25.w, bottom: 25.w), onClick: (){ - + topSeletCountryAndRegionWidget(), + middleTFWidget(), + Obx(() { + print("11111:${state.canSub.value}"); + return SubmitBtn( + btnName: TranslationLoader.lanKeys!.register!.tr, + // backgroundColorList: state.canSub.value ? [AppColors.mainColor] :[Colors.grey], + fontSize: 30.sp, + borderRadius: 20.w, + padding: EdgeInsets.only(top: 25.w, bottom: 25.w), + isDisabled: state.canSub.value, + onClick: state.canSub.value ? (){ + logic.register(); + }:null + ); }), ], ) @@ -123,8 +135,12 @@ class _StarLockRegisterPageState extends State { ), SizedBox(height:60.h), GestureDetector( - onTap: (){ + onTap: () async { Navigator.pushNamed(context, Routers.seletCountryRegionPage); + var result = await Navigator.pushNamed(context, Routers.seletCountryRegionPage); + logic.state.countryCode.value = (result as Map)['code']; + logic.state.countryId.value = result["countryId"]; + // print("路由返回值: ${result}, countryCode:${logic.state.countryCode} ,countryId:${logic.state.countryId}"); }, child: Container( height: 70.h, @@ -133,12 +149,12 @@ class _StarLockRegisterPageState extends State { child: Row( children: [ SizedBox(width:5.w), - Expanded(child: Text(TranslationLoader.lanKeys!.countryAndRegion!.tr, style: TextStyle(fontSize: 30.sp, fontWeight: FontWeight.w500))), + Expanded(child: Text(TranslationLoader.lanKeys!.countryAndRegion!.tr, style: TextStyle(fontSize: 26.sp))), SizedBox(width:20.w), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - Text("中国+86", textAlign: TextAlign.end, style: TextStyle(fontSize: 30.sp, fontWeight: FontWeight.w500),) + Text("中国+86", textAlign: TextAlign.end, style: TextStyle(fontSize: 26.sp),) ], ), SizedBox(width:5.w), @@ -156,7 +172,11 @@ class _StarLockRegisterPageState extends State { return Column( children: [ LoginInput( - controller: _phoneController, + controller: state.phoneOrEmailController, + onchangeAction: (v) { + 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/main/icon_main_search.png', width: 40.w, height: 40.w,), @@ -170,7 +190,10 @@ class _StarLockRegisterPageState extends State { ), SizedBox(height: 10.w), LoginInput( - controller: _pwdController, + controller: state.pwdController, + onchangeAction: (v) { + logic.checkNext(state.pwdController); + }, isPwd: true, leftWidget:Padding( padding: EdgeInsets.only(top:30.w, bottom: 20.w, right: 20.w, left: 5.w), @@ -185,7 +208,10 @@ class _StarLockRegisterPageState extends State { Text(TranslationLoader.lanKeys!.registerPasswordTip!.tr, style: TextStyle(color: const Color(0xFF999999), fontSize: 26.sp),), SizedBox(height: 10.w), LoginInput( - controller: _pwdController, + controller: state.sureController, + onchangeAction: (v) { + logic.checkNext(state.sureController); + }, isPwd: true, leftWidget:Padding( padding: EdgeInsets.only(top:30.w, bottom: 20.w, right: 20.w, left: 5.w), @@ -201,8 +227,11 @@ class _StarLockRegisterPageState extends State { children: [ Expanded( child: LoginInput( - controller: _codeController, + controller: state.codeController, isPwd: true, + onchangeAction: (v) { + logic.checkNext(state.codeController); + }, leftWidget:Padding( padding: EdgeInsets.only(top:30.w, bottom: 20.w, right: 20.w, left: 5.w), child: Image.asset('images/main/icon_main_search.png', width: 40.w, height: 40.w,), @@ -231,6 +260,7 @@ class _StarLockRegisterPageState extends State { ), ), onTap: (){ + Navigator.pushNamed(context, Routers.safetyVerificationPage); if(_seconds==60){ // _setVerify(); }else{ diff --git a/star_lock/lib/login/register/starLock_register_state.dart b/star_lock/lib/login/register/starLock_register_state.dart new file mode 100644 index 00000000..5837883f --- /dev/null +++ b/star_lock/lib/login/register/starLock_register_state.dart @@ -0,0 +1,32 @@ + +import 'package:flustars/flustars.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class StarLockRegisterState{ + + final TextEditingController phoneOrEmailController = TextEditingController(); + final TextEditingController pwdController = TextEditingController(); + final TextEditingController sureController = TextEditingController(); + final TextEditingController codeController = TextEditingController(); + + var countryCode = ''.obs; + var countryId = ''.obs; + var phoneOrEmailStr = ''.obs; + var pwd = ''.obs; + var surePwd = ''.obs; + var verificationCode = ''.obs; + var isIphoneType = true.obs; + var canSub = false.obs; + bool get isEmail => RegexUtil.isEmail(phoneOrEmailStr.value); + bool get isIphone => RegexUtil.isMobileSimple(phoneOrEmailStr.value); + bool get pwdIsOK => pwd.value.isNotEmpty && (pwd.value == surePwd.value); + bool get codeIsOK => verificationCode.value.isNotEmpty; + + void onClose() { + phoneOrEmailController.dispose(); + pwdController.dispose(); + sureController.dispose(); + codeController.dispose(); + } +} \ No newline at end of file diff --git a/star_lock/lib/login/seletCountryRegion/seletCountryRegion_page.dart b/star_lock/lib/login/seletCountryRegion/seletCountryRegion_page.dart index fe26f120..b4e811a5 100644 --- a/star_lock/lib/login/seletCountryRegion/seletCountryRegion_page.dart +++ b/star_lock/lib/login/seletCountryRegion/seletCountryRegion_page.dart @@ -14,12 +14,24 @@ class SeletCountryRegionPage extends StatefulWidget { } class _SeletCountryRegionPageState extends State { + @override Widget build(BuildContext context) { + return Scaffold( resizeToAvoidBottomInset: false, backgroundColor: const Color(0xFFFFFFFF), - appBar: TitleAppBar(barTitle: "${TranslationLoader.lanKeys!.selet!.tr} ${TranslationLoader.lanKeys!.countryAndRegion!.tr}", haveBack:true, backgroundColor: AppColors.mainColor), + appBar: TitleAppBar(barTitle: "${TranslationLoader.lanKeys!.selet!.tr} ${TranslationLoader.lanKeys!.countryAndRegion!.tr}", haveBack:true, backgroundColor: AppColors.mainColor, actionsList: [ + TextButton( + child: Text( + TranslationLoader.lanKeys!.reset!.tr, + style: const TextStyle(color: Colors.white), + ), + onPressed: () { + Navigator.pop(context, {'code': "+86", "countryId": "9"}); + }, + ), + ],), body:ListView( padding: EdgeInsets.only(top: 40.h, left: 40.w, right: 40.w), children: [ @@ -28,4 +40,9 @@ class _SeletCountryRegionPageState extends State { ) ); } + + _backBtnAction(){ + + } + } diff --git a/star_lock/lib/main.dart b/star_lock/lib/main.dart index 4a489821..58f93fb6 100644 --- a/star_lock/lib/main.dart +++ b/star_lock/lib/main.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/tools/app_manager.dart'; +import 'package:star_lock/tools/bindings/app_binding.dart'; import 'package:star_lock/tools/device_info_service.dart'; import 'package:star_lock/tools/platform_info_services.dart'; import 'package:star_lock/tools/reactiveBlueTool/getx_ble.dart'; @@ -94,6 +96,8 @@ class _MyAppState extends State with WidgetsBindingObserver, BaseWidget { ), debugShowCheckedModeBanner: false, getPages: AppRouters.routePages, + builder: EasyLoading.init(), + initialBinding: AppBindings(), initialRoute: '/'); @override diff --git a/star_lock/lib/main/lockMian/lockMain_page.dart b/star_lock/lib/main/lockMian/lockMain_page.dart index b944a478..8581d1f8 100644 --- a/star_lock/lib/main/lockMian/lockMain_page.dart +++ b/star_lock/lib/main/lockMian/lockMain_page.dart @@ -32,29 +32,38 @@ class _StarLockMainState extends State with BaseWidget { @override Widget build(BuildContext context) { - // final logic = Get.put(GetxBle()); - // // Get.lazyPut(()=>GetxBle()); - // logic.scanner.startScan([]); + final logic = Get.put(GetxBle()); + // Get.lazyPut(()=>GetxBle()); + logic.scanner.startScan([]); return Scaffold( backgroundColor: const Color(0xFFF5F5F5), appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.starLock!.tr, - haveBack: false, - haveOtherLeftWidget: true, - leftWidget: Builder( - builder: (context) => IconButton( - icon: Image.asset( - "images/main/mainLeft_menu_icon.png", - color: Colors.white, - width: 44.w, - height: 44.w, - ), - onPressed: () { - Scaffold.of(context).openDrawer(); - }, - )), - backgroundColor: AppColors.mainColor), + barTitle: TranslationLoader.lanKeys!.starLock!.tr, + haveBack: false, + haveOtherLeftWidget: true, + leftWidget: Builder( + builder: (context) => IconButton( + icon: Image.asset( + "images/main/mainLeft_menu_icon.png", + color: Colors.white, + width: 44.w, + height: 44.w, + ), + onPressed: () { + Scaffold.of(context).openDrawer(); + }, + )), + backgroundColor: AppColors.mainColor, + actionsList: [ + TextButton( + child: Text("", style: const TextStyle(color: Colors.white)), + onPressed: () { + Navigator.pushNamed(context, Routers.starLockLoginPage); + }, + ), + ], + ), drawer: Drawer( width: 1.sw / 3 * 2, child: StarLockMinePage(), diff --git a/star_lock/lib/network/api.dart b/star_lock/lib/network/api.dart index f88e9b23..da12763c 100644 --- a/star_lock/lib/network/api.dart +++ b/star_lock/lib/network/api.dart @@ -1,12 +1,11 @@ abstract class Api { - final String baseUrl = ""; + // final String baseUrl = "http://test.lock.star-lock.cn/api"; // 葛工 + final String baseUrl = "https://lock.star-lock.cn/api";// 测试环境 final String getVerificationCodeUrl = '/api/v1/vcode/email'; - - final String registerUrl = '/api/v1/vcode/email'; - + final String registerUrl = '/user/register'; 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 445237b7..8a6c17b2 100644 --- a/star_lock/lib/network/api_provider.dart +++ b/star_lock/lib/network/api_provider.dart @@ -8,10 +8,14 @@ class ApiProvider extends BaseProvider { 'email':email, }); - Future register(String email, String vCode,String password) => post(registerUrl.toUrl, null,query: { - 'email':email, - 'vCode':vCode, - "password":password + Future register(String countryCode, String countryId, String mobile, String password, String uniqueid, String verificationCode) => post(registerUrl.toUrl, null,query: { + 'countryCode':countryCode, + 'countryId':countryId, + "mobile":mobile, + 'password':password, + 'platId':"2", + "uniqueid":uniqueid, + 'verificationCode':verificationCode, }); Future login(String email,String password) => post(loginUrl.toUrl, null,query: {'email':email,'password':password}); @@ -19,5 +23,5 @@ class ApiProvider extends BaseProvider { } extension ExtensionString on String { - String get toUrl => '/$this'; + String get toUrl => '$this'; } \ No newline at end of file diff --git a/star_lock/lib/network/api_repository.dart b/star_lock/lib/network/api_repository.dart index 1ff0cae3..9cdef1a2 100644 --- a/star_lock/lib/network/api_repository.dart +++ b/star_lock/lib/network/api_repository.dart @@ -1,6 +1,7 @@ import 'package:get/get.dart'; +import '../login/login/entity/LoginEntity.dart'; import 'api_provider.dart'; class ApiRepository { @@ -14,11 +15,11 @@ class ApiRepository { // return VerficationCodeEntity.fromJson(res.body); // } // - // Future register(String email, String vCode,String password) async { - // final res = await apiProvider.register(email,vCode,SecrecyUtils.md5EncodeUpperCase(input: password)); - // return LoginEntity.fromJson(res.body); - // } - // + Future register(String countryCode, String countryId, String mobile, String password, String uniqueid, String verificationCode) async { + final res = await apiProvider.register(countryCode, countryId, mobile, password, uniqueid, verificationCode); + return LoginEntity.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/network/request_interceptor.dart b/star_lock/lib/network/request_interceptor.dart index a5d2de01..2ab663bc 100644 --- a/star_lock/lib/network/request_interceptor.dart +++ b/star_lock/lib/network/request_interceptor.dart @@ -8,8 +8,9 @@ import '../tools/platform_info_services.dart'; import '../tools/store_service.dart'; FutureOr requestInterceptor(Request request) async { - request.headers['User-Agent'] = 'Mower/CANDELA_18E/${PlatformInfoService.to.info.version}/${PlatformInfoService.to.info.buildNumber}/${GetPlatform.isAndroid ? 'Android' : 'iOS'}'; + request.headers['User-Agent'] = 'StarLock/${PlatformInfoService.to.info.version}/${PlatformInfoService.to.info.buildNumber}/${GetPlatform.isAndroid ? 'Android' : 'iOS'}'; request.headers['Accept-Language'] = 'zh_CN'; - request.headers['token'] = StoreService.to.userToken!; + // request.headers['token'] = StoreService.to.userToken!; + request.headers['Authorization'] = "Bearer ${StoreService.to.userToken!}"; return request; } \ No newline at end of file diff --git a/star_lock/lib/tools/baseGetXController.dart b/star_lock/lib/tools/baseGetXController.dart new file mode 100644 index 00000000..efb0e414 --- /dev/null +++ b/star_lock/lib/tools/baseGetXController.dart @@ -0,0 +1,94 @@ + +import 'dart:async'; + +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/appRouters.dart'; + +import '../login/login/entity/LoginEntity.dart'; +import '../translations/trans_lib.dart'; +import 'manager/client_manager.dart'; + +class BaseGetXController extends GetxController{ + int currentTimeSeconds = 0; + + bool currentPage = true; + + @override + void onReady() { + super.onReady(); + Get.log('$runtimeType onReady'); + currentPage = true; + } + + @override + // TODO: implement onDelete + InternalFinalCallback get onDelete => super.onDelete; + + @override + // TODO: implement onStart + InternalFinalCallback get onStart => super.onStart; + + @override + void onInit() { + // TODO: implement onInit + Get.log('$runtimeType onInit '); + super.onInit(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + currentPage = false; + Get.log('onClose -----> $runtimeType'); + } + + operationFailedCallBack(e){ + showOperationFailed(); + } + + Future delay({Duration? duration,Function? something}) => Future.delayed(duration ?? 500. milliseconds,something as FutureOr Function()?); + + void showEasyLoading() => EasyLoading.show(); + + void dismissEasyLoading() => EasyLoading.dismiss(); + + void showToast(String status,{Function? something}) { + EasyLoading.showToast(status,duration: 2000.milliseconds); + if(something != null) { + delay(duration: 2100.milliseconds,something: something); + } + } + + void showError(String status,{Function? something}) { + EasyLoading.showError(status,duration: 2000.milliseconds); + if(something != null) { + delay(duration: 2100.milliseconds,something: something); + } + } + + void showSuccess(String status,{Function? something}) { + EasyLoading.showSuccess(status,duration: 1500.milliseconds); + if(something != null) { + delay(duration: 2000.milliseconds,something: something); + } + } + + void showOperationSuccessful({String? status,Function? something}) => showSuccess( status ?? "成功",something: something); + void showOperationFailed({String? status, Function? something}) => showError( status ?? "失败",something: something); + + void logOff() async { + await ClientManager().logOff(); + Get.offAllNamed(Routers.starLockLoginPage); + } + + Future loginSuccess({LoginEntity? loginEntity, bool byToken = false}) async => ClientManager().loginSuccess(loginEntity: loginEntity,byToken: byToken); +} + + +///Extension_Int +extension Extension_Int on int { + bool get codeIsSuccessful => this == 1; + bool get msgCodeIsSuccessful => this == 1; +} \ No newline at end of file diff --git a/star_lock/lib/tools/bindings/app_binding.dart b/star_lock/lib/tools/bindings/app_binding.dart new file mode 100644 index 00000000..0872cd18 --- /dev/null +++ b/star_lock/lib/tools/bindings/app_binding.dart @@ -0,0 +1,14 @@ + +import 'package:get/get.dart'; + +import '../../network/api_provider.dart'; +import '../../network/api_repository.dart'; + +class AppBindings extends Bindings { + @override + void dependencies() { + Get.put(ApiProvider()); + Get.put(ApiRepository(Get.find())); + } + +} \ No newline at end of file diff --git a/star_lock/lib/tools/submitBtn.dart b/star_lock/lib/tools/submitBtn.dart index f13751d4..201505ab 100644 --- a/star_lock/lib/tools/submitBtn.dart +++ b/star_lock/lib/tools/submitBtn.dart @@ -30,6 +30,7 @@ class SubmitBtn extends StatelessWidget { bool? isDelete; + bool? isDisabled; SubmitBtn( {Key? key, required this.btnName, @@ -41,7 +42,9 @@ class SubmitBtn extends StatelessWidget { this.width, this.backgroundColorList, this.isDelete, - this.fontSize}) + this.fontSize, + this.isDisabled, + }) : super(key: key); @override @@ -51,8 +54,7 @@ class SubmitBtn extends StatelessWidget { height: 60.h, child: ElevatedButton( style: ElevatedButton.styleFrom( - backgroundColor: - isDelete == true ? Colors.red : AppColors.mainColor, + backgroundColor: isDisabled == false ? Colors.grey : (isDelete == true ? Colors.red : AppColors.mainColor), ), onPressed: () { if (onClick != null) { diff --git a/star_lock/lib/tools/tf_loginInput.dart b/star_lock/lib/tools/tf_loginInput.dart index 53637088..06a9294b 100644 --- a/star_lock/lib/tools/tf_loginInput.dart +++ b/star_lock/lib/tools/tf_loginInput.dart @@ -7,6 +7,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; * 登录注册页面 input * */ +typedef BlockStrCallback = void Function(dynamic textStr); class LoginInput extends StatelessWidget { TextEditingController? controller; List? inputFormatters; @@ -18,6 +19,7 @@ class LoginInput extends StatelessWidget { String? label; bool? isPwd; Widget? rightSlot; + BlockStrCallback? onchangeAction; LoginInput( {Key? key, required this.controller, @@ -29,7 +31,8 @@ class LoginInput extends StatelessWidget { this.background, this.hintText, this.isHaveLeftWidget = true, - this.leftWidget}) + this.leftWidget, + this.onchangeAction}) : super(key: key); @override @@ -44,6 +47,7 @@ class LoginInput extends StatelessWidget { //输入框一行 maxLines: 1, controller: controller, + onChanged: onchangeAction, autofocus: false, decoration: InputDecoration( //输入里面输入文字内边距设置 diff --git a/star_lock/linux/flutter/generated_plugin_registrant.cc b/star_lock/linux/flutter/generated_plugin_registrant.cc index 7299b5cf..7111d06f 100644 --- a/star_lock/linux/flutter/generated_plugin_registrant.cc +++ b/star_lock/linux/flutter/generated_plugin_registrant.cc @@ -6,10 +6,14 @@ #include "generated_plugin_registrant.h" +#include #include #include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) aj_captcha_flutter_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "AjCaptchaFlutterPlugin"); + aj_captcha_flutter_plugin_register_with_registrar(aj_captcha_flutter_registrar); g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); file_selector_plugin_register_with_registrar(file_selector_linux_registrar); diff --git a/star_lock/linux/flutter/generated_plugins.cmake b/star_lock/linux/flutter/generated_plugins.cmake index 786ff5c2..7fbf0d0d 100644 --- a/star_lock/linux/flutter/generated_plugins.cmake +++ b/star_lock/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + aj_captcha_flutter file_selector_linux url_launcher_linux ) diff --git a/star_lock/macos/Flutter/GeneratedPluginRegistrant.swift b/star_lock/macos/Flutter/GeneratedPluginRegistrant.swift index 8a0390bd..8a945aa6 100644 --- a/star_lock/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/star_lock/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,16 +5,20 @@ import FlutterMacOS import Foundation +import aj_captcha_flutter import device_info_plus import file_selector_macos import package_info_plus import path_provider_foundation +import shared_preferences_foundation import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AjCaptchaFlutterPlugin.register(with: registry.registrar(forPlugin: "AjCaptchaFlutterPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } diff --git a/star_lock/pubspec.yaml b/star_lock/pubspec.yaml index d1e98a3e..d28c2d77 100644 --- a/star_lock/pubspec.yaml +++ b/star_lock/pubspec.yaml @@ -38,6 +38,8 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 + # 常用工具类 + flustars: ^2.0.1 # 状态管理 get: ^4.6.5 # 获取设备信息 @@ -69,11 +71,12 @@ dependencies: #蓝牙 flutter_reactive_ble: ^5.1.1 # flutter_blue_plus: ^1.10.5 - + # event_bus: ^2.0.0 - + #菊花 flutter_easyloading: ^3.0.5 - + #图形验证码 + aj_captcha_flutter: ^0.0.1 dev_dependencies: flutter_test: sdk: flutter diff --git a/star_lock/windows/flutter/generated_plugin_registrant.cc b/star_lock/windows/flutter/generated_plugin_registrant.cc index 043a96f0..c0814364 100644 --- a/star_lock/windows/flutter/generated_plugin_registrant.cc +++ b/star_lock/windows/flutter/generated_plugin_registrant.cc @@ -6,10 +6,13 @@ #include "generated_plugin_registrant.h" +#include #include #include void RegisterPlugins(flutter::PluginRegistry* registry) { + AjCaptchaFlutterPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("AjCaptchaFlutterPluginCApi")); FileSelectorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("FileSelectorWindows")); UrlLauncherWindowsRegisterWithRegistrar( diff --git a/star_lock/windows/flutter/generated_plugins.cmake b/star_lock/windows/flutter/generated_plugins.cmake index a95e2673..5f570cfc 100644 --- a/star_lock/windows/flutter/generated_plugins.cmake +++ b/star_lock/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + aj_captcha_flutter file_selector_windows url_launcher_windows )