diff --git a/star_lock/images/lan/lan_en.json b/star_lock/images/lan/lan_en.json index c2e3d8e6..5bf5d871 100644 --- a/star_lock/images/lan/lan_en.json +++ b/star_lock/images/lan/lan_en.json @@ -7,6 +7,7 @@ "card":"Card", "fingerprint":"Fingerprint", "remoteControl":"RemoteControl", + "face":"face", "operatingRecord":"Operating Record", "number":"Number", "additive":"Additive", diff --git a/star_lock/images/lan/lan_keys.json b/star_lock/images/lan/lan_keys.json index 945a186f..f85db14a 100644 --- a/star_lock/images/lan/lan_keys.json +++ b/star_lock/images/lan/lan_keys.json @@ -7,6 +7,7 @@ "card":"card", "fingerprint":"fingerprint", "remoteControl":"remoteControl", + "face":"face", "operatingRecord":"operatingRecord", "number":"number", "additive":"additive", diff --git a/star_lock/images/lan/lan_zh.json b/star_lock/images/lan/lan_zh.json index 567fc529..8a2b635f 100644 --- a/star_lock/images/lan/lan_zh.json +++ b/star_lock/images/lan/lan_zh.json @@ -7,6 +7,7 @@ "card":"卡", "fingerprint":"指纹", "remoteControl":"遥控", + "face":"人脸", "operatingRecord":"操作记录", "number":"号", "additive":"添加者", diff --git a/star_lock/images/main/icon_main_addFace.png b/star_lock/images/main/icon_main_addFace.png new file mode 100644 index 00000000..a2b7a96b Binary files /dev/null and b/star_lock/images/main/icon_main_addFace.png differ diff --git a/star_lock/images/mine/icon_mine_blueSelect.png b/star_lock/images/mine/icon_mine_blueSelect.png new file mode 100644 index 00000000..b4cf4a23 Binary files /dev/null and b/star_lock/images/mine/icon_mine_blueSelect.png differ diff --git a/star_lock/images/mine/icon_mine_openDoorDir.png b/star_lock/images/mine/icon_mine_openDoorDir.png new file mode 100644 index 00000000..3b9ae2f0 Binary files /dev/null and b/star_lock/images/mine/icon_mine_openDoorDir.png differ diff --git a/star_lock/ios/Runner/AppDelegate.m b/star_lock/ios/Runner/AppDelegate.m index 75342698..ccb74648 100644 --- a/star_lock/ios/Runner/AppDelegate.m +++ b/star_lock/ios/Runner/AppDelegate.m @@ -36,6 +36,7 @@ self.window.rootViewController = VC; [self.window makeKeyAndVisible]; + //关闭可视对讲功能 需打开时再解注释 [self initSound]; _udp = [[UdpHelper alloc] init]; [_udp Open]; diff --git a/star_lock/ios/Runner/img/bg.jpg b/star_lock/ios/Runner/img/bg.jpg new file mode 100755 index 00000000..dd644378 Binary files /dev/null and b/star_lock/ios/Runner/img/bg.jpg differ diff --git a/star_lock/ios/Runner/img/logo.png b/star_lock/ios/Runner/img/logo.png new file mode 100755 index 00000000..dd8a97f8 Binary files /dev/null and b/star_lock/ios/Runner/img/logo.png differ diff --git a/star_lock/ios/Runner/img/logo2.png b/star_lock/ios/Runner/img/logo2.png new file mode 100755 index 00000000..4d2453e0 Binary files /dev/null and b/star_lock/ios/Runner/img/logo2.png differ diff --git a/star_lock/ios/Runner/img/logo3.png b/star_lock/ios/Runner/img/logo3.png new file mode 100755 index 00000000..75ff860d Binary files /dev/null and b/star_lock/ios/Runner/img/logo3.png differ diff --git a/star_lock/ios/Runner/img/swicth_add_off.png b/star_lock/ios/Runner/img/swicth_add_off.png new file mode 100755 index 00000000..e0614006 Binary files /dev/null and b/star_lock/ios/Runner/img/swicth_add_off.png differ diff --git a/star_lock/ios/Runner/img/swicth_add_on.png b/star_lock/ios/Runner/img/swicth_add_on.png new file mode 100755 index 00000000..5de6a839 Binary files /dev/null and b/star_lock/ios/Runner/img/swicth_add_on.png differ diff --git a/star_lock/ios/Runner/img/swicth_minus_off.png b/star_lock/ios/Runner/img/swicth_minus_off.png new file mode 100755 index 00000000..9819021a Binary files /dev/null and b/star_lock/ios/Runner/img/swicth_minus_off.png differ diff --git a/star_lock/ios/Runner/img/swicth_minus_on.png b/star_lock/ios/Runner/img/swicth_minus_on.png new file mode 100755 index 00000000..14f53d0f Binary files /dev/null and b/star_lock/ios/Runner/img/swicth_minus_on.png differ diff --git a/star_lock/ios/Runner/img/swicth_off.png b/star_lock/ios/Runner/img/swicth_off.png new file mode 100755 index 00000000..54d80d52 Binary files /dev/null and b/star_lock/ios/Runner/img/swicth_off.png differ diff --git a/star_lock/ios/Runner/img/swicth_on.png b/star_lock/ios/Runner/img/swicth_on.png new file mode 100755 index 00000000..e0fe807f Binary files /dev/null and b/star_lock/ios/Runner/img/swicth_on.png differ diff --git a/star_lock/ios/Runner/img/test.jpg b/star_lock/ios/Runner/img/test.jpg new file mode 100755 index 00000000..5fb48593 Binary files /dev/null and b/star_lock/ios/Runner/img/test.jpg differ diff --git a/star_lock/ios/Runner/img/thumb_on.png b/star_lock/ios/Runner/img/thumb_on.png new file mode 100755 index 00000000..20407b1f Binary files /dev/null and b/star_lock/ios/Runner/img/thumb_on.png differ diff --git a/star_lock/lib/appRouters.dart b/star_lock/lib/appRouters.dart index 69f09cb5..54aa67f8 100644 --- a/star_lock/lib/appRouters.dart +++ b/star_lock/lib/appRouters.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/common/safetyVerification/safetyVerification_binding.dart'; import 'package:star_lock/login/register/starLock_register_binding.dart'; @@ -5,7 +6,13 @@ import 'package:star_lock/login/register/starLock_register_binding.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/lockUserList/lockUserList_page.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupList_page.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart'; +import 'package:star_lock/main/lockDetail/lcokSet/catEyeWorkMode/catEyeWorkMode_page.dart'; +import 'package:star_lock/main/lockDetail/lcokSet/faceUnlock/faceUnlock_page.dart'; +import 'package:star_lock/main/lockDetail/lcokSet/motorPower/motorPower_page.dart'; +import 'package:star_lock/main/lockDetail/lcokSet/msgNotification/msgNotification_page.dart'; +import 'package:star_lock/main/lockDetail/lcokSet/openDoorDirection/openDoorDirection_page.dart'; import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_main_page.dart'; +import 'package:star_lock/main/lockDetail/otherTypeKey/addFace/addFace_page.dart'; import 'package:star_lock/mine/about/webviewShow_page.dart'; import 'package:star_lock/mine/mine/safeVerify/safeVerify_page.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart'; @@ -335,6 +342,12 @@ abstract class Routers { static const demoModeLockDetailPage = '/DemoModeLockDetailPage'; // 演示模式锁详情页 static const demoModeLockSetPage = '/DemoModeLockSetPage'; // 演示模式锁设置页 static const addLockSeletCountryPage = '/AddLockSeletCountryPage'; // 演示模式锁设置页 + static const faceUnlockPage = '/faceUnlockPage'; //面容开锁设置 + static const motorPowerPage = '/motorPowerPage'; //电机功率设置 + static const openDoorDirectionPage = '/openDoorDirectionPage'; //开门方向设置 + static const catEyeWorkModePage = '/catEyeWorkModePage'; //猫眼工作模式 + static const msgNotificationPage = '/msgNotificationPage'; //消息通知 + static const addFaceTipPage = '/addFaceTipPage'; //添加人脸 } abstract class AppRouters { @@ -828,8 +841,26 @@ abstract class AppRouters { name: Routers.minePersonInfoViewSafetyProblemPage, page: () => const MinePersonInfoViewSafetyProblemPage()), GetPage(name: Routers.webviewShowPage, page: () => const WebviewShowPage()), - GetPage(name: Routers.demoModeLockSetPage, page: () => const DemoModeLockSetPage()), - GetPage(name: Routers.demoModeLockDetailPage, page: () => const DemoModeLockDetailPage()), - GetPage(name: Routers.addLockSeletCountryPage, page: () => const AddLockSeletCountryPage()), + GetPage( + name: Routers.demoModeLockSetPage, + page: () => const DemoModeLockSetPage()), + GetPage( + name: Routers.demoModeLockDetailPage, + page: () => const DemoModeLockDetailPage()), + GetPage( + name: Routers.addLockSeletCountryPage, + page: () => const AddLockSeletCountryPage()), + GetPage(name: Routers.faceUnlockPage, page: () => const FaceUnlockPage()), + GetPage(name: Routers.motorPowerPage, page: () => const MotorPowerPage()), + GetPage( + name: Routers.openDoorDirectionPage, + page: () => const OpenDoorDirectionPage()), + GetPage( + name: Routers.catEyeWorkModePage, + page: () => const CatEyeWorkModePage()), + GetPage( + name: Routers.msgNotificationPage, + page: () => const MsgNotificationPage()), + GetPage(name: Routers.addFaceTipPage, page: () => const AddFaceTipPage()) ]; } diff --git a/star_lock/lib/app_settings/app_colors.dart b/star_lock/lib/app_settings/app_colors.dart index ce8ce31e..eb871936 100644 --- a/star_lock/lib/app_settings/app_colors.dart +++ b/star_lock/lib/app_settings/app_colors.dart @@ -122,4 +122,8 @@ class AppColors { static const btnDisableColor = Color.fromRGBO(178, 178, 178, 1); //按钮不可用灰色 static const toBeReceiveBgColor = Color.fromRGBO(246, 203, 203, 1); //待接收红色背景 static const expireTextBgColor = Color.fromRGBO(253, 166, 8, 1); //即将到期时间字体背景色 + static const blueTextTipsColor = Color.fromRGBO(0, 113, 255, 1); //蓝色字体tips + static const blueViewBgColor = + Color.fromRGBO(223, 237, 254, 1); //蓝色背景板 139 148 176 + static const msgNoticeTextColor = Color.fromRGBO(139, 148, 176, 1); //消息通知字体颜色 } diff --git a/star_lock/lib/main/lockDetail/lcokSet/catEyeWorkMode/catEyeWorkMode_page.dart b/star_lock/lib/main/lockDetail/lcokSet/catEyeWorkMode/catEyeWorkMode_page.dart new file mode 100644 index 00000000..b69ac372 --- /dev/null +++ b/star_lock/lib/main/lockDetail/lcokSet/catEyeWorkMode/catEyeWorkMode_page.dart @@ -0,0 +1,125 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/titleAppBar.dart'; + +class CatEyeWorkModePage extends StatefulWidget { + const CatEyeWorkModePage({Key? key}) : super(key: key); + + @override + State createState() => _CatEyeWorkModePageState(); +} + +class _CatEyeWorkModePageState extends State { + bool isCheck = false; + List boolList = [true, false, false, false]; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + barTitle: '猫眼工作模式', + haveBack: true, + backgroundColor: AppColors.mainColor), + body: Column( + children: [ + SizedBox( + height: 30.h, + ), + _buildTipsView( + '省电模式:\n', + '适合门口较为安全的环境。\n仅发生特定事件才录像,并可查看实时画面。\n一般情况下,满电可使用7-8个月', + 0, + boolList[0]), + SizedBox( + height: 30.h, + ), + _buildTipsView( + '逗留抓拍模式:\n', + '有人逗留或发生特定事件才录像,可随时查看\n实时画面。\n一般情况下,满电可使用5~6个月。', + 1, + boolList[1]), + SizedBox( + height: 30.h, + ), + _buildTipsView( + '实时监控模式:\n', + '适合门口人员复杂、较不安全的环境。\n有人出现就录像,可随时查看实时画面。\n一般情况下,满电可使用2~4个月。', + 2, + boolList[2]), + SizedBox( + height: 30.h, + ), + _buildTipsView('自定义模式:\n', '根据您家门口实际情况设置录像和实时画面功能。\n可使用时长由具体设置决定。', + 3, boolList[3]) + ], + )); + } + + Widget _buildTipsView( + String titleStr, String subTitle, int clickIndex, bool isClick) { + return GestureDetector( + child: Container( + width: ScreenUtil().screenWidth - 40.w, + margin: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 10.h), + decoration: BoxDecoration( + color: isClick + ? AppColors.blueViewBgColor + : AppColors.greyBackgroundColor, + borderRadius: BorderRadius.circular(10.0), + ), + child: Padding( + padding: EdgeInsets.only(left: 20.w, top: 30.h, bottom: 30.h), + child: Row( + children: [ + isClick + ? Image.asset( + 'images/mine/icon_mine_blueSelect.png', + width: 20.w, + height: 14.w, + ) + : SizedBox( + width: 20.w, + height: 14.w, + ), + SizedBox(width: 20.w), + _buildRichText(titleStr, subTitle, isClick), + ], + )), + ), + onTap: () { + setState(() { + for (int i = 0; i < boolList.length; i++) { + if (clickIndex == i) { + boolList[clickIndex] = true; + } else { + boolList[i] = false; + } + } + }); + }, + ); + } + + Widget _buildRichText(String titleStr, String subTitle, bool isClick) { + //高亮样式 + final TextStyle titleStyle = TextStyle( + color: isClick ? AppColors.blueTextTipsColor : Colors.black, + fontSize: 24.sp, + fontWeight: FontWeight.w500); + //默认样式 + final TextStyle subTipsStyle = TextStyle( + color: isClick + ? AppColors.blueTextTipsColor + : AppColors.placeholderTextColor, + fontSize: 20.sp); + + late InlineSpan tipsPreviewSpan = TextSpan(children: [ + TextSpan(text: titleStr, style: titleStyle), + TextSpan(text: subTitle, style: subTipsStyle), + ]); + return RichText(text: tipsPreviewSpan); + } +} diff --git a/star_lock/lib/main/lockDetail/lcokSet/faceUnlock/faceUnlock_page.dart b/star_lock/lib/main/lockDetail/lcokSet/faceUnlock/faceUnlock_page.dart new file mode 100644 index 00000000..46aa772d --- /dev/null +++ b/star_lock/lib/main/lockDetail/lcokSet/faceUnlock/faceUnlock_page.dart @@ -0,0 +1,204 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:star_lock/tools/custom_bottom_sheet.dart'; + +import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/commonItem.dart'; +import '../../../../tools/titleAppBar.dart'; + +class FaceUnlockPage extends StatefulWidget { + const FaceUnlockPage({Key? key}) : super(key: key); + + @override + State createState() => _FaceUnlockPageState(); +} + +class _FaceUnlockPageState extends State { + bool faceOn = false; //面容开锁 + bool autoBright = false; //自动亮屏 + String senseDistance = '远距离'; //感应距离 + String antiMisoperation = '关闭'; //防误开 + List senseDistanceList = ['远距离', '近距离']; + List antiMisoperationList = ['关闭', '5秒', '10秒', '15秒', '30秒', '60秒']; + + //高亮样式 + final TextStyle titleStyle = TextStyle( + color: Colors.black, fontSize: 24.sp, fontWeight: FontWeight.w500); + //默认样式 + final TextStyle subTipsStyle = + TextStyle(color: AppColors.placeholderTextColor, fontSize: 22.sp); + + late InlineSpan tipsPreviewSpan = TextSpan(children: [ + TextSpan(text: '添加和使用面容开锁时:\n', style: titleStyle), + TextSpan( + text: + '\n1、请尽量保持单人在门前操作;\n2、请站立在门锁正前方约0.5~0.8米,面向门锁;\n3、请保持脸部无遮挡,露出五官;\n4、面容识别异常时,可触摸数字键盘任意按键,手动重启人脸识别。', + style: subTipsStyle), + ]); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + barTitle: '面容开锁设置', + haveBack: true, + backgroundColor: AppColors.mainColor), + body: Column( + children: [ + CommonItem( + leftTitel: '面容开锁', + rightTitle: "", + isHaveLine: true, + isHaveRightWidget: true, + rightWidget: + SizedBox(width: 60.w, height: 50.h, child: _switch(1))), + CommonItem( + leftTitel: '自动亮屏', + rightTitle: "", + isHaveLine: true, + isHaveRightWidget: true, + rightWidget: + SizedBox(width: 60.w, height: 50.h, child: _switch(2))), + _buildSubTitleItem( + '感应距离', '感应到门前约1.5米有人时,将自动启动面部识别开锁。', senseDistance, () { + _openBottomItemSheet(senseDistanceList, 0); + }), + SizedBox( + height: 30.h, + ), + _buildSubTitleItem('防误开', '防误开已关闭,关门后仍可使用面容开锁', antiMisoperation, + () { + _openBottomItemSheet(antiMisoperationList, 1); + }), + Expanded( + child: SizedBox( + height: 30.h, + )), + _buildTipsView(), + SizedBox( + height: 60.h, + ) + ], + )); + } + + Widget _buildSubTitleItem( + String leftStr, String subTitle, String rightStr, Function()? action) { + return GestureDetector( + onTap: action, + child: Container( + margin: EdgeInsets.only(left: 20.sp, right: 20.sp, top: 20.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + width: 20.w, + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + alignment: Alignment.centerLeft, + child: Text( + leftStr, + style: TextStyle(fontSize: 24.sp, color: Colors.black), + ), + ), + SizedBox( + height: 10.h, + ), + Container( + alignment: Alignment.centerLeft, + child: Text( + subTitle, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 20.sp, color: AppColors.btnDisableColor), + ), + ) + ], + )), + SizedBox( + width: 20.w, + ), + Text( + rightStr, + style: TextStyle( + fontSize: 22.sp, color: AppColors.darkGrayTextColor), + ), + SizedBox( + width: 10.w, + ), + Image.asset( + 'images/icon_right_grey.png', + width: 12.w, + height: 21.w, + ) + ], + ), + ), + ); + } + + Widget _buildTipsView() { + return Container( + width: ScreenUtil().screenWidth - 40.w, + margin: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 10.h), + decoration: BoxDecoration( + color: AppColors.mainBackgroundColor, + borderRadius: BorderRadius.circular(10.0), + ), + child: Padding( + padding: + EdgeInsets.only(left: 20.w, top: 30.h, bottom: 40.h, right: 15.w), + child: RichText(text: tipsPreviewSpan)), + ); + } + + CupertinoSwitch _switch(int getIndex) { + return CupertinoSwitch( + activeColor: CupertinoColors.activeBlue, + trackColor: CupertinoColors.systemGrey5, + thumbColor: CupertinoColors.white, + value: getIndex == 1 ? faceOn : autoBright, + onChanged: (value) { + setState(() { + if (getIndex == 1) { + faceOn = value; + } else { + autoBright = value; + } + }); + }, + ); + } + + Future _openBottomItemSheet( + List bottomItemList, int clickIndex) async { + showModalBottomSheet( + context: context, + shape: RoundedRectangleBorder( + borderRadius: BorderRadiusDirectional.circular(10)), + builder: (BuildContext context) { + return AlertBottomWidget( + topTitle: '', + items: bottomItemList, + chooseCallback: (value) { + if (clickIndex == 0) { + //感应距离 + senseDistance = senseDistanceList[value]; + } else if (clickIndex == 1) { + //防误开 + antiMisoperation = antiMisoperationList[value]; + } + + setState(() {}); + }, + ); + }); + } +} diff --git a/star_lock/lib/main/lockDetail/lcokSet/faceUnlock/faceUnlock_state.dart b/star_lock/lib/main/lockDetail/lcokSet/faceUnlock/faceUnlock_state.dart new file mode 100644 index 00000000..e69de29b diff --git a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart index ec1b4f3d..eafca6ec 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart @@ -27,6 +27,8 @@ class LockSetPage extends StatefulWidget { class _LockSetPageState extends State with RouteAware { final logic = Get.put(LockSetLogic()); final state = Get.find().state; + bool isClick1 = false; + bool isClick2 = false; @override void initState() { @@ -53,7 +55,8 @@ class _LockSetPageState extends State with RouteAware { children: [ // 基本信息 CommonItem( - leftTitel: TranslationLoader.lanKeys!.basicInformation!.tr, + leftTitel: + TranslationLoader.lanKeys!.basicInformation!.tr, rightTitle: "", isHaveLine: false, isHaveDirection: true, @@ -65,10 +68,12 @@ class _LockSetPageState extends State with RouteAware { SizedBox(height: 10.h), // 门磁 Obx(() => Visibility( - visible: state.lockFeature.value.doorStatus == 1 ? true : false, + visible: state.lockFeature.value.doorStatus == 1 + ? true + : false, child: CommonItem( leftTitel: - TranslationLoader.lanKeys!.doorMagnetic!.tr, + TranslationLoader.lanKeys!.doorMagnetic!.tr, rightTitle: "", isHaveLine: true, isHaveDirection: true, @@ -78,10 +83,12 @@ class _LockSetPageState extends State with RouteAware { }))), // 无线键盘 Obx(() => Visibility( - visible: state.lockFeature.value.wirelessKeyboard == 1 ? true : false, + visible: state.lockFeature.value.wirelessKeyboard == 1 + ? true + : false, child: CommonItem( leftTitel: - TranslationLoader.lanKeys!.wirelessKeyboard!.tr, + TranslationLoader.lanKeys!.wirelessKeyboard!.tr, rightTitle: "", isHaveLine: true, isHaveDirection: true, @@ -91,7 +98,9 @@ class _LockSetPageState extends State with RouteAware { }))), // 照明 Obx(() => Visibility( - visible: state.lockFeature.value.lightingTime == 1 ? true : false, + visible: state.lockFeature.value.lightingTime == 1 + ? true + : false, child: CommonItem( leftTitel: '照明', rightTitle: "", @@ -114,10 +123,14 @@ class _LockSetPageState extends State with RouteAware { SizedBox(height: 10.h), // 自动闭锁 Obx(() => Visibility( - visible: state.lockFeature.value.autoLock == 1 ? true : false, + visible: + state.lockFeature.value.autoLock == 1 ? true : false, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.automaticBlocking!.tr, - rightTitle: (state.lockSettingInfo.value.autoLock ?? 0) > 0 + leftTitel: + TranslationLoader.lanKeys!.automaticBlocking!.tr, + rightTitle: (state.lockSettingInfo.value.autoLock ?? + 0) > + 0 ? "${state.lockSetInfoData.value.lockSettingInfo!.autoLockSecond ?? 0}s" : TranslationLoader.lanKeys!.closed!.tr, isHaveLine: true, @@ -127,15 +140,17 @@ class _LockSetPageState extends State with RouteAware { // ? "${state.lockSetInfoData.value.lockSetting!.autoLockSecond ?? 0}s" // : TranslationLoader.lanKeys!.closed!.tr), action: () { - Get.toNamed(Routers.automaticBlockingPage, arguments: { - 'lockSetInfoData': state.lockSetInfoData.value - }); + Get.toNamed(Routers.automaticBlockingPage, + arguments: { + 'lockSetInfoData': state.lockSetInfoData.value + }); }))), // 锁声音 Obx(() { var titleStr = ""; if ((state.lockSettingInfo.value.lockSound ?? 0) == 1) { - switch (state.lockSettingInfo.value.lockSoundVolume ?? 0) { + switch ( + state.lockSettingInfo.value.lockSoundVolume ?? 0) { case 1: titleStr = TranslationLoader.lanKeys!.low!.tr; break; @@ -156,7 +171,9 @@ class _LockSetPageState extends State with RouteAware { titleStr = TranslationLoader.lanKeys!.closed!.tr; } return Visibility( - visible: state.lockFeature.value.lockSound == 1 ? true : false, + visible: state.lockFeature.value.lockSound == 1 + ? true + : false, child: CommonItem( leftTitel: TranslationLoader.lanKeys!.lockSound!.tr, rightTitle: titleStr, @@ -170,12 +187,16 @@ class _LockSetPageState extends State with RouteAware { }), // 防撬报警 Obx(() => Visibility( - visible: state.lockFeature.value.antiPrySwitch == 1 ? true : false, + visible: state.lockFeature.value.antiPrySwitch == 1 + ? true + : false, child: CommonItem( leftTitel: TranslationLoader.lanKeys!.burglarAlarm!.tr, rightTitle: - (state.lockSettingInfo.value.antiPrySwitch ?? 0) == 1 + (state.lockSettingInfo.value.antiPrySwitch ?? + 0) == + 1 ? TranslationLoader.lanKeys!.opened!.tr : TranslationLoader.lanKeys!.closed!.tr, isHaveLine: true, @@ -191,38 +212,52 @@ class _LockSetPageState extends State with RouteAware { visible: state.lockFeature.value.passageMode == 1 ? true : false, // visible:true, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.normallyOpenMode!.tr, - rightTitle: (state.lockSettingInfo.value.passageMode ?? 0) == 1 + leftTitel: + TranslationLoader.lanKeys!.normallyOpenMode!.tr, + rightTitle: + (state.lockSettingInfo.value.passageMode ?? 0) == + 1 ? TranslationLoader.lanKeys!.opened!.tr : TranslationLoader.lanKeys!.closed!.tr, isHaveLine: true, isHaveDirection: true, action: () { - Get.toNamed(Routers.normallyOpenModePage, arguments: { - 'lockSetInfoData': state.lockSetInfoData.value - }); + Get.toNamed(Routers.normallyOpenModePage, + arguments: { + 'lockSetInfoData': state.lockSetInfoData.value + }); }))), // 远程开锁 Obx(() => Visibility( - visible: state.lockFeature.value.remoteUnlock == 1 ? true : false, - child: CommonItem(leftTitel: - TranslationLoader.lanKeys!.remoteUnlocking!.tr, - rightTitle: (state.lockSettingInfo.value.remoteUnlock ?? 0) == 1 + visible: state.lockFeature.value.remoteUnlock == 1 + ? true + : false, + child: CommonItem( + leftTitel: + TranslationLoader.lanKeys!.remoteUnlocking!.tr, + rightTitle: + (state.lockSettingInfo.value.remoteUnlock ?? 0) == + 1 ? TranslationLoader.lanKeys!.opened!.tr : TranslationLoader.lanKeys!.closed!.tr, isHaveLine: true, isHaveDirection: true, action: () { - Get.toNamed(Routers.remoteUnlockingPage, arguments: { - 'lockSetInfoData': state.lockSetInfoData.value - }); + Get.toNamed(Routers.remoteUnlockingPage, + arguments: { + 'lockSetInfoData': state.lockSetInfoData.value + }); }))), // 重置键 Obx(() => Visibility( - visible: state.lockFeature.value.resetSwitch == 1 ? true : false, + visible: state.lockFeature.value.resetSwitch == 1 + ? true + : false, child: CommonItem( leftTitel: TranslationLoader.lanKeys!.resetButton!.tr, - rightTitle: (state.lockSettingInfo.value.resetSwitch ?? 0) == 1 + rightTitle: + (state.lockSettingInfo.value.resetSwitch ?? 0) == + 1 ? TranslationLoader.lanKeys!.opened!.tr : TranslationLoader.lanKeys!.closed!.tr, isHaveLine: true, @@ -241,55 +276,55 @@ class _LockSetPageState extends State with RouteAware { leftTitel: '面容开锁', rightTitle: "", isHaveLine: true, - isHaveRightWidget: true, - rightWidget: SizedBox( - width: 60.w, child: _otherUnHaveDoneSwitch()))), + isHaveDirection: true, + action: () { + Get.toNamed(Routers.faceUnlockPage); + })), // ), - - // Obx(() => Visibility( visible: true, child: CommonItem( - leftTitel: '自动亮屏', - rightTitle: "", - isHaveLine: true, - isHaveRightWidget: true, - rightWidget: SizedBox( - width: 60.w, child: _otherUnHaveDoneSwitch()))), - // ), - // Obx(() => - Visibility( - visible: true, - child: CommonItem( - leftTitel: '逗留警告', - rightTitle: "", - isHaveLine: true, - isHaveRightWidget: true, - rightWidget: SizedBox( - width: 60.w, child: _otherUnHaveDoneSwitch()))), - // ), - // Obx(() => - Visibility( - visible: true, - child: CommonItem( - leftTitel: '异常警告', - rightTitle: "", - isHaveLine: true, - isHaveRightWidget: true, - rightWidget: SizedBox( - width: 60.w, child: _otherUnHaveDoneSwitch()))), - // ), - // Obx(() => - Visibility( - visible: true, - child: CommonItem( - leftTitel: '感应距离', + leftTitel: '消息通知', rightTitle: "", isHaveLine: true, isHaveDirection: true, action: () { - Toast.show(msg: "功能暂未开放"); + Get.toNamed(Routers.msgNotificationPage); })), + Visibility( + visible: true, + child: CommonItem( + leftTitel: '猫眼工作模式', + rightTitle: "", + isHaveLine: true, + isHaveDirection: true, + action: () { + Get.toNamed(Routers.catEyeWorkModePage); + })), + // Obx(() => + //自动亮屏已包括至面容开锁模块 + // Visibility( + // visible: true, + // child: CommonItem( + // leftTitel: '自动亮屏', + // rightTitle: "", + // isHaveLine: true, + // isHaveDirection: true, + // action: () {})), + // ), + + // Obx(() => + //感应距离已包括至面容开锁模块 + // Visibility( + // visible: true, + // child: CommonItem( + // leftTitel: '感应距离', + // rightTitle: "", + // isHaveLine: true, + // isHaveDirection: true, + // action: () { + // Toast.show(msg: "功能暂未开放"); + // })), // ), // Obx(() => Visibility( @@ -300,7 +335,8 @@ class _LockSetPageState extends State with RouteAware { isHaveDirection: true, isHaveLine: true, action: () { - Toast.show(msg: "功能暂未开放"); + // Toast.show(msg: "功能暂未开放"); + Get.toNamed(Routers.openDoorDirectionPage); })), // ), // Obx(() => @@ -312,9 +348,31 @@ class _LockSetPageState extends State with RouteAware { isHaveLine: true, isHaveDirection: true, action: () { - Toast.show(msg: "功能暂未开放"); + // Toast.show(msg: "功能暂未开放"); + Get.toNamed(Routers.motorPowerPage); })), // ), + // Obx(() => + Visibility( + visible: true, + child: CommonItem( + leftTitel: '逗留警告', + rightTitle: "", + isHaveLine: true, + isHaveRightWidget: true, + rightWidget: _otherToDoSwitch(0), + )), + // ), + // Obx(() => + Visibility( + visible: true, + child: CommonItem( + leftTitel: '异常警告', + rightTitle: "", + isHaveLine: true, + isHaveRightWidget: true, + rightWidget: _otherToDoSwitch(1))), + // ), SizedBox(height: 10.h), //-----新增至此 // 标记房态 @@ -327,9 +385,9 @@ class _LockSetPageState extends State with RouteAware { } return Visibility( visible: state.lockStatus.value.roomStatus == 1 ? true : false, - // visible: true, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.markedHouseState!.tr, + leftTitel: + TranslationLoader.lanKeys!.markedHouseState!.tr, rightTitle: title, isHaveLine: true, isHaveDirection: true, @@ -340,11 +398,14 @@ class _LockSetPageState extends State with RouteAware { })); }), // 考勤 - Obx(() => - Visibility( - visible: state.lockFeature.value.attendance == 1 ? true : false, + Obx( + () => Visibility( + visible: state.lockFeature.value.attendance == 1 + ? true + : false, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.checkingIn!.tr, + leftTitel: + TranslationLoader.lanKeys!.checkingIn!.tr, rightTitle: "", isHaveLine: true, isHaveRightWidget: true, @@ -352,11 +413,14 @@ class _LockSetPageState extends State with RouteAware { width: 60.w, child: _openCheckInSwitch()))), ), // 开锁提醒 - Obx(() => - Visibility( - visible: state.lockFeature.value.unlockReminder == 1 ? true : false, + Obx( + () => Visibility( + visible: state.lockFeature.value.unlockReminder == 1 + ? true + : false, child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.unlockReminder!.tr, + leftTitel: + TranslationLoader.lanKeys!.unlockReminder!.tr, rightTitle: "", isHaveLine: false, isHaveRightWidget: true, @@ -365,10 +429,13 @@ class _LockSetPageState extends State with RouteAware { ), SizedBox(height: 10.h), // wifi配网 - Obx(() => - Visibility( - visible: state.lockFeature.value.wifi == 1 ? true : false, - child: CommonItem(leftTitel: TranslationLoader.lanKeys!.wifiDistributionNetwork!.tr, + Obx( + () => Visibility( + visible: + state.lockFeature.value.wifi == 1 ? true : false, + child: CommonItem( + leftTitel: TranslationLoader + .lanKeys!.wifiDistributionNetwork!.tr, rightTitle: "", isHaveLine: true, isHaveDirection: true, @@ -378,46 +445,46 @@ class _LockSetPageState extends State with RouteAware { ), // Obx(() => // 锁时间 - Visibility( - visible: true, - child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.lockTime!.tr, - rightTitle: "", - isHaveLine: true, - isHaveDirection: true, - action: () { - Get.toNamed(Routers.lockTimePage, arguments: { - 'lockSetInfoData': state.lockSetInfoData.value - }); - })), + Visibility( + visible: true, + child: CommonItem( + leftTitel: TranslationLoader.lanKeys!.lockTime!.tr, + rightTitle: "", + isHaveLine: true, + isHaveDirection: true, + action: () { + Get.toNamed(Routers.lockTimePage, arguments: { + 'lockSetInfoData': state.lockSetInfoData.value + }); + })), // ), // Obx(() => // 诊断 - Visibility( - visible: true, - child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.diagnose!.tr, - rightTitle: "", - isHaveLine: true, - isHaveDirection: true, - action: () { - Get.toNamed(Routers.diagnosePage, arguments: { - 'lockSetInfoData': state.lockSetInfoData.value - }); - })), + Visibility( + visible: true, + child: CommonItem( + leftTitel: TranslationLoader.lanKeys!.diagnose!.tr, + rightTitle: "", + isHaveLine: true, + isHaveDirection: true, + action: () { + Get.toNamed(Routers.diagnosePage, arguments: { + 'lockSetInfoData': state.lockSetInfoData.value + }); + })), // ), // Obx(() => // 上传数据 - Visibility( - visible: true, - child: CommonItem( - leftTitel: TranslationLoader.lanKeys!.uploadData!.tr, - rightTitle: "", - isHaveLine: true, - isHaveDirection: true, - action: () { - Get.toNamed(Routers.uploadDataPage); - })), + Visibility( + visible: true, + child: CommonItem( + leftTitel: TranslationLoader.lanKeys!.uploadData!.tr, + rightTitle: "", + isHaveLine: true, + isHaveDirection: true, + action: () { + Get.toNamed(Routers.uploadDataPage); + })), // ), // Obx(() => // Visibility( @@ -434,17 +501,17 @@ class _LockSetPageState extends State with RouteAware { // ), // Obx(() => // 锁升级 - Visibility( - visible: true, - child: CommonItem( - leftTitel: - TranslationLoader.lanKeys!.lockEscalation!.tr, - rightTitle: "", - isHaveLine: false, - isHaveDirection: true, - action: () { - Get.toNamed(Routers.lockEscalationPage); - })), + Visibility( + visible: true, + child: CommonItem( + leftTitel: + TranslationLoader.lanKeys!.lockEscalation!.tr, + rightTitle: "", + isHaveLine: false, + isHaveDirection: true, + action: () { + Get.toNamed(Routers.lockEscalationPage); + })), // ), SizedBox(height: 30.h), Container( @@ -468,8 +535,10 @@ class _LockSetPageState extends State with RouteAware { )); } - Widget rightText(String rightTitle){ - return Text(rightTitle ?? "", textAlign: TextAlign.end, style: TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor)); + Widget rightText(String rightTitle) { + return Text(rightTitle ?? "", + textAlign: TextAlign.end, + style: TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor)); } CupertinoSwitch _openCheckInSwitch() { @@ -517,6 +586,24 @@ class _LockSetPageState extends State with RouteAware { ); } + CupertinoSwitch _otherToDoSwitch(int clickIndex) { + return CupertinoSwitch( + activeColor: CupertinoColors.activeBlue, + trackColor: CupertinoColors.systemGrey5, + thumbColor: CupertinoColors.white, + value: clickIndex == 0 ? isClick1 : isClick2, + onChanged: (value) { + setState(() { + if (clickIndex == 0) { + isClick1 = value; + } else { + isClick2 = value; + } + }); + }, + ); + } + //确认弹窗 void showCupertinoAlertDialog(widgetContext) { showCupertinoDialog( @@ -547,10 +634,9 @@ class _LockSetPageState extends State with RouteAware { ); } - void showDeletAlertDialog( - BuildContext context, - ) { + BuildContext context, + ) { // showDialog( // context: context, // builder: (BuildContext context) { @@ -632,7 +718,7 @@ class _LockSetPageState extends State with RouteAware { Toast.show(msg: "请输入登录密码"); return; } - logic.checkLoginPassword((){ + logic.checkLoginPassword(() { Navigator.pop(context); }); }, diff --git a/star_lock/lib/main/lockDetail/lcokSet/motorPower/motorPower_page.dart b/star_lock/lib/main/lockDetail/lcokSet/motorPower/motorPower_page.dart new file mode 100644 index 00000000..9981753a --- /dev/null +++ b/star_lock/lib/main/lockDetail/lcokSet/motorPower/motorPower_page.dart @@ -0,0 +1,112 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/titleAppBar.dart'; + +class MotorPowerPage extends StatefulWidget { + const MotorPowerPage({Key? key}) : super(key: key); + + @override + State createState() => _MotorPowerPageState(); +} + +class _MotorPowerPageState extends State { + bool isCheck = false; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + barTitle: '电机功率设置', + haveBack: true, + backgroundColor: AppColors.mainColor), + body: Column( + children: [ + SizedBox( + height: 40.h, + ), + Container( + margin: EdgeInsets.only(left: 40.w), + alignment: Alignment.centerLeft, + child: Text( + '请根据门锁实际情况,请谨慎选择电机功率:', + style: TextStyle( + fontSize: 24.sp, + color: Colors.black, + fontWeight: FontWeight.w500), + ), + ), + SizedBox( + height: 40.h, + ), + _buildTipsView('小功率:\n', '耗电少', isCheck), + SizedBox( + height: 20.h, + ), + _buildTipsView('大功率:\n', + '如果开锁时锁舌不能正常收回,或需要带动\n天地钩,建议选择大功率。此时耗电将会\n增加。', !isCheck) + ], + )); + } + + Widget _buildTipsView(String titleStr, String subTitle, bool isClick) { + return GestureDetector( + child: Container( + width: ScreenUtil().screenWidth - 40.w, + margin: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 10.h), + decoration: BoxDecoration( + color: isClick + ? AppColors.blueViewBgColor + : AppColors.greyBackgroundColor, + borderRadius: BorderRadius.circular(10.0), + ), + child: Padding( + padding: EdgeInsets.only( + left: 20.w, top: 30.h, bottom: 30.h, right: 15.w), + child: Row( + children: [ + isClick + ? Image.asset( + 'images/mine/icon_mine_blueSelect.png', + width: 20.w, + height: 14.w, + ) + : SizedBox( + width: 20.w, + height: 14.w, + ), + SizedBox(width: 20.w), + _buildRichText(titleStr, subTitle, isClick), + ], + )), + ), + onTap: () { + setState(() { + isCheck = !isCheck; + }); + }, + ); + } + + Widget _buildRichText(String titleStr, String subTitle, bool isClick) { + //高亮样式 + final TextStyle titleStyle = TextStyle( + color: isClick ? AppColors.blueTextTipsColor : Colors.black, + fontSize: 24.sp, + fontWeight: FontWeight.w500); + //默认样式 + final TextStyle subTipsStyle = TextStyle( + color: isClick + ? AppColors.blueTextTipsColor + : AppColors.placeholderTextColor, + fontSize: 20.sp); + + late InlineSpan tipsPreviewSpan = TextSpan(children: [ + TextSpan(text: titleStr, style: titleStyle), + TextSpan(text: subTitle, style: subTipsStyle), + ]); + return RichText(text: tipsPreviewSpan); + } +} diff --git a/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_page.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_page.dart new file mode 100644 index 00000000..5ba9d195 --- /dev/null +++ b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_page.dart @@ -0,0 +1,253 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:star_lock/tools/custom_bottom_sheet.dart'; + +import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/commonItem.dart'; +import '../../../../tools/titleAppBar.dart'; + +class MsgNotificationPage extends StatefulWidget { + const MsgNotificationPage({Key? key}) : super(key: key); + + @override + State createState() => _MsgNotificationPageState(); +} + +class _MsgNotificationPageState extends State { + bool faceOn = false; //面容开锁 + bool autoBright = false; //自动亮屏 + String senseDistance = '远距离'; //感应距离 + String antiMisoperation = '关闭'; //防误开 + List senseDistanceList = ['远距离', '近距离']; + List antiMisoperationList = ['关闭', '5秒', '10秒', '15秒', '30秒', '60秒']; + + //高亮样式 + final TextStyle titleStyle = TextStyle( + color: Colors.black, fontSize: 24.sp, fontWeight: FontWeight.w500); + //默认样式 + final TextStyle subTipsStyle = + TextStyle(color: AppColors.placeholderTextColor, fontSize: 22.sp); + + late InlineSpan tipsPreviewSpan = TextSpan(children: [ + TextSpan(text: '添加和使用面容开锁时:\n', style: titleStyle), + TextSpan( + text: + '\n1、请尽量保持单人在门前操作;\n2、请站立在门锁正前方约0.5~0.8米,面向门锁;\n3、请保持脸部无遮挡,露出五官;\n4、面容识别异常时,可触摸数字键盘任意按键,手动重启人脸识别。', + style: subTipsStyle), + ]); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + barTitle: '消息通知', + haveBack: true, + backgroundColor: AppColors.mainColor), + body: Column( + children: [ + Container( + alignment: Alignment.centerLeft, + margin: EdgeInsets.only(left: 40.w, top: 40.h, bottom: 30.h), + child: Text( + '门锁通知', + style: TextStyle( + color: AppColors.msgNoticeTextColor, fontSize: 24.sp), + ), + ), + CommonItem( + leftTitel: '回家开门', + rightTitle: "已启用", + isHaveLine: false, + isHaveDirection: true, + ), + SizedBox( + height: 20.h, + ), + CommonItem( + leftTitel: '离家开门', + rightTitle: "", + isHaveLine: false, + isHaveRightWidget: true, + rightWidget: + SizedBox(width: 60.w, height: 50.h, child: _switch(2))), + SizedBox( + height: 20.h, + ), + CommonItem( + leftTitel: '关门', + rightTitle: "", + isHaveLine: false, + isHaveRightWidget: true, + rightWidget: + SizedBox(width: 60.w, height: 50.h, child: _switch(2))), + SizedBox( + height: 20.h, + ), + CommonItem( + leftTitel: '异常', + rightTitle: "已启用", + isHaveLine: true, + isHaveDirection: true, + ), + SizedBox( + height: 30.h, + ), + Container( + alignment: Alignment.centerLeft, + margin: EdgeInsets.only(left: 40.w, top: 40.h, bottom: 30.h), + child: Text( + '门铃通知', + style: TextStyle( + color: AppColors.msgNoticeTextColor, fontSize: 24.sp), + ), + ), + CommonItem( + leftTitel: '有人按门铃', + rightTitle: "", + isHaveLine: false, + isHaveRightWidget: true, + rightWidget: + SizedBox(width: 60.w, height: 50.h, child: _switch(2))), + SizedBox( + height: 30.h, + ), + Container( + alignment: Alignment.centerLeft, + margin: EdgeInsets.only(left: 40.w, top: 40.h, bottom: 30.h), + child: Text( + '猫眼通知', + style: TextStyle( + color: AppColors.msgNoticeTextColor, fontSize: 24.sp), + ), + ), + CommonItem( + leftTitel: '有人出现在门口', + rightTitle: "", + isHaveLine: false, + isHaveRightWidget: true, + rightWidget: + SizedBox(width: 60.w, height: 50.h, child: _switch(2))), + ], + )); + } + + Widget _buildSubTitleItem( + String leftStr, String subTitle, String rightStr, Function()? action) { + return GestureDetector( + onTap: action, + child: Container( + margin: EdgeInsets.only(left: 20.sp, right: 20.sp, top: 20.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + width: 20.w, + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + alignment: Alignment.centerLeft, + child: Text( + leftStr, + style: TextStyle(fontSize: 24.sp, color: Colors.black), + ), + ), + SizedBox( + height: 10.h, + ), + Container( + alignment: Alignment.centerLeft, + child: Text( + subTitle, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 20.sp, color: AppColors.btnDisableColor), + ), + ) + ], + )), + SizedBox( + width: 20.w, + ), + Text( + rightStr, + style: TextStyle( + fontSize: 22.sp, color: AppColors.darkGrayTextColor), + ), + SizedBox( + width: 10.w, + ), + Image.asset( + 'images/icon_right_grey.png', + width: 12.w, + height: 21.w, + ) + ], + ), + ), + ); + } + + Widget _buildTipsView() { + return Container( + width: ScreenUtil().screenWidth - 40.w, + margin: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 10.h), + decoration: BoxDecoration( + color: AppColors.mainBackgroundColor, + borderRadius: BorderRadius.circular(10.0), + ), + child: Padding( + padding: + EdgeInsets.only(left: 20.w, top: 30.h, bottom: 40.h, right: 15.w), + child: RichText(text: tipsPreviewSpan)), + ); + } + + CupertinoSwitch _switch(int getIndex) { + return CupertinoSwitch( + activeColor: CupertinoColors.activeBlue, + trackColor: CupertinoColors.systemGrey5, + thumbColor: CupertinoColors.white, + value: getIndex == 1 ? faceOn : autoBright, + onChanged: (value) { + setState(() { + if (getIndex == 1) { + faceOn = value; + } else { + autoBright = value; + } + }); + }, + ); + } + + Future _openBottomItemSheet( + List bottomItemList, int clickIndex) async { + showModalBottomSheet( + context: context, + shape: RoundedRectangleBorder( + borderRadius: BorderRadiusDirectional.circular(10)), + builder: (BuildContext context) { + return AlertBottomWidget( + topTitle: '', + items: bottomItemList, + chooseCallback: (value) { + if (clickIndex == 0) { + //感应距离 + senseDistance = senseDistanceList[value]; + } else if (clickIndex == 1) { + //防误开 + antiMisoperation = antiMisoperationList[value]; + } + + setState(() {}); + }, + ); + }); + } +} diff --git a/star_lock/lib/main/lockDetail/lcokSet/openDoorDirection/openDoorDirection_page.dart b/star_lock/lib/main/lockDetail/lcokSet/openDoorDirection/openDoorDirection_page.dart new file mode 100644 index 00000000..c42899c9 --- /dev/null +++ b/star_lock/lib/main/lockDetail/lcokSet/openDoorDirection/openDoorDirection_page.dart @@ -0,0 +1,125 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/titleAppBar.dart'; + +class OpenDoorDirectionPage extends StatefulWidget { + const OpenDoorDirectionPage({Key? key}) : super(key: key); + + @override + State createState() => _OpenDoorDirectionPageState(); +} + +class _OpenDoorDirectionPageState extends State { + bool isCheck = false; + int selectIndex = 0; + int _selectGroupValue = 1; //默认选中的单选框的值 + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + barTitle: '开门方向设置', + haveBack: true, + backgroundColor: AppColors.mainColor), + body: Column( + children: [ + SizedBox( + height: 60.h, + ), + Container( + margin: EdgeInsets.only(left: 40.w), + alignment: Alignment.centerLeft, + child: Text( + '请谨慎选择您家的开门方向(如果选择错误,将无法正常开关门):', + style: TextStyle( + fontSize: 24.sp, + color: Colors.black, + fontWeight: FontWeight.w500), + ), + ), + Image.asset( + 'images/mine/icon_mine_openDoorDir.png', + width: 500.w, + height: 300, + ), + _buildRadioGroupRowWidget(), + SizedBox( + height: 60.h, + ), + _buildTipsView( + '判断方法:\n', + '人站在屋外,面向入户门。\n如果门的合页或门轴在左边,则门是左开;\n如果门的合页或门轴在右边,则门是右开。\n如果设置错误,将无法正常开关门。\n建议由安装或维修人员操作。', + false) + ], + )); + } + + //单选框选择 + Row _buildRadioGroupRowWidget() { + return Row( + children: [ + SizedBox( + width: 60.w, + ), + _colorfulCheckBox(1), + Text( + "左开", + style: TextStyle(fontSize: 24.sp), + ), + SizedBox( + width: 200.w, + ), + _colorfulCheckBox(2), + Text( + '右开', + style: TextStyle(fontSize: 24.sp), + ), + ], + ); + } + + Radio _colorfulCheckBox(int selectIndex) { + return Radio( + value: selectIndex, + onChanged: (value) { + // print(value); + _selectGroupValue = value; + + setState(() {}); + }, + groupValue: _selectGroupValue, + activeColor: AppColors.mainColor, + ); + } + + Widget _buildTipsView(String titleStr, String subTitle, bool isClick) { + return Container( + margin: EdgeInsets.only(left: 40.w), + alignment: Alignment.centerLeft, + child: _buildRichText(titleStr, subTitle, false), + ); + } + + Widget _buildRichText(String titleStr, String subTitle, bool isClick) { + //高亮样式 + final TextStyle titleStyle = TextStyle( + color: isClick ? AppColors.blueTextTipsColor : Colors.black, + fontSize: 24.sp, + fontWeight: FontWeight.w500); + //默认样式 + final TextStyle subTipsStyle = TextStyle( + color: isClick + ? AppColors.blueTextTipsColor + : AppColors.placeholderTextColor, + fontSize: 22.sp); + + late InlineSpan tipsPreviewSpan = TextSpan(children: [ + TextSpan(text: titleStr, style: titleStyle), + TextSpan(text: subTitle, style: subTipsStyle), + ]); + return RichText(text: tipsPreviewSpan); + } +} diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart index 13c53602..bda8dd6e 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -364,13 +364,15 @@ class _LockDetailPageState extends State if (state.keyInfos.value.lockFeature!.d3Face == 1) { showWidgetArr.add( bottomItem('images/main/icon_face.png', '人脸', () { - // Navigator.pushNamed(context, Routers.otherTypeKeyListPage, - // arguments: 1); - // Toast.show(msg: "功能暂未开放"); - tokNative('flutter_videoTalk_to_ios', - arguments: {'videoTalk': 'videoTalk'}).then((result) { - print('$result'); - }); + Get.toNamed(Routers.otherTypeKeyListPage, arguments: { + "lockId": widget.lockListInfoItemEntity.lockId, + "fromType": 3 + }); // Toast.show(msg: "功能暂未开放"); + + // tokNative('flutter_videoTalk_to_ios', + // arguments: {'videoTalk': 'videoTalk'}).then((result) { + // print('$result'); + // }); }), ); } diff --git a/star_lock/lib/main/lockDetail/otherTypeKey/addFace/addFace_page.dart b/star_lock/lib/main/lockDetail/otherTypeKey/addFace/addFace_page.dart new file mode 100644 index 00000000..4bee1fa4 --- /dev/null +++ b/star_lock/lib/main/lockDetail/otherTypeKey/addFace/addFace_page.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../../../../appRouters.dart'; +import '../../../../../app_settings/app_colors.dart'; +import '../../../../../tools/submitBtn.dart'; +import '../../../../../tools/titleAppBar.dart'; +import '../../../../../translations/trans_lib.dart'; + +class AddFaceTipPage extends StatefulWidget { + const AddFaceTipPage({Key? key}) : super(key: key); + + @override + State createState() => _AddFaceTipPageState(); +} + +class _AddFaceTipPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + barTitle: TranslationLoader.lanKeys!.addLock!.tr, + haveBack: true, + backgroundColor: AppColors.mainColor), + body: ListView( + // mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + height: 50.h, + ), + Image.asset( + 'images/main/icon_main_addFace.png', + width: 100.w, + height: 457.h, + fit: BoxFit.fitHeight, + ), + SizedBox( + height: 60.h, + ), + Container( + padding: EdgeInsets.only(left: 20.w, right: 20.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: Text( + "请单人正对门锁,距离一个成年人手臂长度(约0.6米).\n保持脸部无遮挡,露出五官", + // TranslationLoader.lanKeys!.lightTouchScreenTip!.tr, + textAlign: TextAlign.center, + maxLines: null, + style: + TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600), + ), + ), + ], + ), + ), + SizedBox( + height: 120.h, + ), + Container( + padding: EdgeInsets.only(left: 20.w, right: 20.w), + child: SubmitBtn( + btnName: "开始添加", //TranslationLoader.lanKeys!.next!.tr, + borderRadius: 20.w, + onClick: () {}), + ), + ], + ), + ); + } +} diff --git a/star_lock/lib/main/lockDetail/otherTypeKey/otherTypeAddKey/otherTypeAddKey_logic.dart b/star_lock/lib/main/lockDetail/otherTypeKey/otherTypeAddKey/otherTypeAddKey_logic.dart index 2371827b..6550e17e 100644 --- a/star_lock/lib/main/lockDetail/otherTypeKey/otherTypeAddKey/otherTypeAddKey_logic.dart +++ b/star_lock/lib/main/lockDetail/otherTypeKey/otherTypeAddKey/otherTypeAddKey_logic.dart @@ -157,6 +157,12 @@ class OtherTypeAddKeyLogic extends BaseGetXController { case 2: // 遥控 + break; + + case 3: + // 人脸 + Get.toNamed(Routers.addFaceTipPage); + break; default: break; diff --git a/star_lock/lib/main/lockDetail/otherTypeKey/otherTypeKeyList/otherTypeKeyList_page.dart b/star_lock/lib/main/lockDetail/otherTypeKey/otherTypeKeyList/otherTypeKeyList_page.dart index 024a9b2c..690ab991 100644 --- a/star_lock/lib/main/lockDetail/otherTypeKey/otherTypeKeyList/otherTypeKeyList_page.dart +++ b/star_lock/lib/main/lockDetail/otherTypeKey/otherTypeKeyList/otherTypeKeyList_page.dart @@ -43,10 +43,10 @@ class _OtherTypeKeyListPageState extends State { style: TextStyle(color: Colors.white, fontSize: 24.sp), ), onPressed: () async { - var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); - if(isDemoMode == false){ + var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + if (isDemoMode == false) { showDeletAlertDialog(context); - }else{ + } else { // Get.toNamed(Routers.seletLockTypePage); Toast.show(msg: "演示模式"); } @@ -62,14 +62,16 @@ class _OtherTypeKeyListPageState extends State { ), Expanded(child: _buildMainUI(state.fromType.value)), AddBottomWhiteBtn( - btnName: '${TranslationLoader.lanKeys!.add!.tr}${getAppBarTitle(state.fromType.value)}', + btnName: + '${TranslationLoader.lanKeys!.add!.tr}${getAppBarTitle(state.fromType.value)}', onClick: () async { - var data = await Get.toNamed(Routers.otherTypeKeyManagePage, arguments: { + var data = + await Get.toNamed(Routers.otherTypeKeyManagePage, arguments: { "lockId": state.lockId.value, "keyType": state.fromType.value, "fromType": 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入 }); - if(data != null) { + if (data != null) { switch (state.fromType.value) { case 0: // 卡 @@ -80,7 +82,11 @@ class _OtherTypeKeyListPageState extends State { logic.getFingerprintsListData(); break; case 2: - // 遥控 + // 遥控 + + break; + case 3: + // 人脸 break; default: @@ -109,6 +115,9 @@ class _OtherTypeKeyListPageState extends State { case 2: title = TranslationLoader.lanKeys!.remoteControl!.tr; break; + case 3: + title = TranslationLoader.lanKeys!.face!.tr; + break; default: break; } @@ -126,13 +135,13 @@ class _OtherTypeKeyListPageState extends State { maxLines: 1, controller: state.searchController, autofocus: false, - onChanged: (value){ + onChanged: (value) { print("onChanged:$value"); }, - onEditingComplete: (){ + onEditingComplete: () { print("onEditingComplete:"); }, - onSubmitted: (value){ + onSubmitted: (value) { switch (state.fromType.value) { case 0: // 卡 @@ -143,17 +152,21 @@ class _OtherTypeKeyListPageState extends State { logic.getFingerprintsListData(); break; case 2: - // 遥控 + // 遥控 + + break; + case 3: + // 人脸 break; default: break; } - }, decoration: InputDecoration( //输入里面输入文字内边距设置 - contentPadding: const EdgeInsets.only(top: 12.0, left: -19.0, right: -15.0, bottom: 8.0), + contentPadding: const EdgeInsets.only( + top: 12.0, left: -19.0, right: -15.0, bottom: 8.0), hintText: TranslationLoader.lanKeys!.pleaseEnter!.tr, hintStyle: TextStyle(fontSize: 22.sp, height: 3.0), //不需要输入框下划线 @@ -186,96 +199,130 @@ class _OtherTypeKeyListPageState extends State { // typeImgName = 'images/icon_card.png'; // } - return Obx(() => state.fingerprintItemListData.value.isNotEmpty ? ListView.separated( - itemCount: state.fingerprintItemListData.value.length, - itemBuilder: (c, index) { - FingerprintItemData fingerprintItemData = state.fingerprintItemListData.value[index]; - switch (state.fromType.value) { - case 0: - // 卡 - if (index < state.fingerprintItemListData.value.length) { - return LeftSlideActions( - key: Key(fingerprintItemData.cardName!), - actionsWidth: 60, - actions: [ - _buildDeleteBtn(fingerprintItemData.cardId.toString()), - ], - decoration: const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(1)), - ), - child: _keyItem('images/icon_card.png', fingerprintItemData.cardName!, fingerprintItemData.cardType! == 1 ? "永久" : "${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())}", () async { - var data = await Get.toNamed(Routers.otherTypeKeyDetailPage, arguments: { - "fingerprintItemData": fingerprintItemData, - "type": type, - }); - if(data != null) { - logic.getICCardListData(); + return Obx(() => state.fingerprintItemListData.value.isNotEmpty + ? ListView.separated( + itemCount: state.fingerprintItemListData.value.length, + itemBuilder: (c, index) { + FingerprintItemData fingerprintItemData = + state.fingerprintItemListData.value[index]; + switch (state.fromType.value) { + case 0: + // 卡 + if (index < state.fingerprintItemListData.value.length) { + return LeftSlideActions( + key: Key(fingerprintItemData.cardName!), + actionsWidth: 60, + actions: [ + _buildDeleteBtn(fingerprintItemData.cardId.toString()), + ], + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(1)), + ), + child: _keyItem( + 'images/icon_card.png', + fingerprintItemData.cardName!, + fingerprintItemData.cardType! == 1 + ? "永久" + : "${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())}", + () async { + var data = await Get.toNamed( + Routers.otherTypeKeyDetailPage, + arguments: { + "fingerprintItemData": fingerprintItemData, + "type": type, + }); + if (data != null) { + logic.getICCardListData(); + } + }), + ); } - }), - ); - } - return const SizedBox.shrink(); + return const SizedBox.shrink(); - return _keyItem('images/icon_card.png', fingerprintItemData.cardName!, fingerprintItemData.cardType! == 1 ? "永久" : "${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())}", () async { - var data = await Get.toNamed(Routers.otherTypeKeyDetailPage, arguments: { - "fingerprintItemData": fingerprintItemData, - "type": type, - }); - if(data != null) { - logic.getICCardListData(); - } - }); - break; - case 1: - // 指纹 - if (index < state.fingerprintItemListData.value.length) { - return LeftSlideActions( - key: Key(fingerprintItemData.fingerprintName!), - actionsWidth: 60, - actions: [ - _buildDeleteBtn(fingerprintItemData.fingerprintId.toString()), - ], - decoration: const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(1)), - ), - child: _keyItem('images/icon_fingerprint.png', fingerprintItemData.fingerprintName!, fingerprintItemData.fingerprintType! == 1 ? "永久" : "${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())}", () async { - var data = await Get.toNamed(Routers.otherTypeKeyDetailPage, arguments: { - "fingerprintItemData": fingerprintItemData, - "type": type, + return _keyItem( + 'images/icon_card.png', + fingerprintItemData.cardName!, + fingerprintItemData.cardType! == 1 + ? "永久" + : "${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())}", + () async { + var data = await Get.toNamed(Routers.otherTypeKeyDetailPage, + arguments: { + "fingerprintItemData": fingerprintItemData, + "type": type, + }); + if (data != null) { + logic.getICCardListData(); + } }); - if(data != null) { - logic.getFingerprintsListData(); + break; + case 1: + // 指纹 + if (index < state.fingerprintItemListData.value.length) { + return LeftSlideActions( + key: Key(fingerprintItemData.fingerprintName!), + actionsWidth: 60, + actions: [ + _buildDeleteBtn( + fingerprintItemData.fingerprintId.toString()), + ], + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(1)), + ), + child: _keyItem( + 'images/icon_fingerprint.png', + fingerprintItemData.fingerprintName!, + fingerprintItemData.fingerprintType! == 1 + ? "永久" + : "${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())}", + () async { + var data = await Get.toNamed( + Routers.otherTypeKeyDetailPage, + arguments: { + "fingerprintItemData": fingerprintItemData, + "type": type, + }); + if (data != null) { + logic.getFingerprintsListData(); + } + }), + ); } - }), - ); - } - return const SizedBox.shrink(); + return const SizedBox.shrink(); - return _keyItem('images/icon_fingerprint.png', fingerprintItemData.fingerprintName!, fingerprintItemData.fingerprintType! == 1 ? "永久" : "${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())}", () async { - var data = await Get.toNamed(Routers.otherTypeKeyDetailPage, arguments: { - "fingerprintItemData": fingerprintItemData, - "type": type, - }); - if(data != null) { - logic.getFingerprintsListData(); + return _keyItem( + 'images/icon_fingerprint.png', + fingerprintItemData.fingerprintName!, + fingerprintItemData.fingerprintType! == 1 + ? "永久" + : "${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())}", + () async { + var data = await Get.toNamed(Routers.otherTypeKeyDetailPage, + arguments: { + "fingerprintItemData": fingerprintItemData, + "type": type, + }); + if (data != null) { + logic.getFingerprintsListData(); + } + }); + break; + case 2: + // 遥控 + + break; + default: + break; } - }); - break; - case 2: - // 遥控 - - break; - default: - break; - } - }, - separatorBuilder: (BuildContext context, int index) { - return const Divider( - height: 1, - color: AppColors.greyLineColor, - ); - }, - ) :const NoData()); + }, + separatorBuilder: (BuildContext context, int index) { + return const Divider( + height: 1, + color: AppColors.greyLineColor, + ); + }, + ) + : const NoData()); } Widget _buildDeleteBtn(String idStr) { @@ -338,7 +385,8 @@ class _OtherTypeKeyListPageState extends State { ); } - Widget _keyItem(String lockTypeIcon, String lockTypeTitle, String showTime, Function() action) { + Widget _keyItem(String lockTypeIcon, String lockTypeTitle, String showTime, + Function() action) { return GestureDetector( onTap: action, child: Container( @@ -361,7 +409,9 @@ class _OtherTypeKeyListPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - Text(lockTypeTitle, style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor)), + Text(lockTypeTitle, + style: TextStyle( + fontSize: 24.sp, color: AppColors.blackColor)), ], ), SizedBox(height: 5.h), @@ -369,7 +419,10 @@ class _OtherTypeKeyListPageState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - Text(showTime, style: TextStyle(fontSize: 18.sp, color: AppColors.placeholderTextColor)), + Text(showTime, + style: TextStyle( + fontSize: 18.sp, + color: AppColors.placeholderTextColor)), ], ), ), @@ -385,8 +438,8 @@ class _OtherTypeKeyListPageState extends State { } void showDeletAlertDialog( - BuildContext context, - ) { + BuildContext context, + ) { showCupertinoDialog( context: context, builder: (context) { @@ -406,18 +459,18 @@ class _OtherTypeKeyListPageState extends State { Navigator.pop(context); switch (state.fromType.value) { case 0: - // 卡 + // 卡 state.isDeletICCardData = true; logic.senderAddICCard("1", "DeleteAll!@#", 255); break; case 1: - // 指纹 - // logic.deletAllFingerprintsData(); + // 指纹 + // logic.deletAllFingerprintsData(); state.isDeletFingerprintData = true; logic.senderAddFingerprint("1", "DeleteAll!@#", 255); break; case 2: - // 遥控 + // 遥控 break; default: diff --git a/star_lock/lib/tools/commonItem.dart b/star_lock/lib/tools/commonItem.dart index 78f6cc18..c35d83ea 100644 --- a/star_lock/lib/tools/commonItem.dart +++ b/star_lock/lib/tools/commonItem.dart @@ -36,7 +36,8 @@ class CommonItem extends StatelessWidget { Container( height: allHeight ?? 60.h, color: Colors.white, - padding: EdgeInsets.only(left: 20.w, right: 10.w), // , top: 20.w, bottom: 20.w + padding: EdgeInsets.only( + left: 20.w, right: 10.w), // , top: 20.w, bottom: 20.w child: Row( children: [ SizedBox(width: 20.w), diff --git a/star_lock/lib/translations/lanKeyEntity.dart b/star_lock/lib/translations/lanKeyEntity.dart index dc8b3478..a3431236 100644 --- a/star_lock/lib/translations/lanKeyEntity.dart +++ b/star_lock/lib/translations/lanKeyEntity.dart @@ -8,6 +8,7 @@ class LanKeyEntity { this.card, this.fingerprint, this.remoteControl, + this.face, this.operatingRecord, this.number, this.additive, @@ -415,6 +416,7 @@ class LanKeyEntity { card = json['card']; fingerprint = json['fingerprint']; remoteControl = json['remoteControl']; + face = json['face']; operatingRecord = json['operatingRecord']; number = json['number']; additive = json['additive']; @@ -850,6 +852,7 @@ class LanKeyEntity { String? card; String? fingerprint; String? remoteControl; + String? face; String? operatingRecord; String? number; String? additive; @@ -1275,6 +1278,7 @@ class LanKeyEntity { map['card'] = card; map['fingerprint'] = fingerprint; map['remoteControl'] = remoteControl; + map['face'] = face; map['operatingRecord'] = operatingRecord; map['number'] = number; map['additive'] = additive;