From c40a95641aa2656bdb69264f1ece8d65d72ba455 Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Mon, 29 Apr 2024 17:24:58 +0800 Subject: [PATCH 01/12] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=20ota=20=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E9=94=99=E8=AF=AF=E6=96=87=E4=BB=B6=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lockEscalation/lockEscalation_logic.dart | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/star_lock/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_logic.dart b/star_lock/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_logic.dart index 249c884c..6203045a 100644 --- a/star_lock/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_logic.dart +++ b/star_lock/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_logic.dart @@ -161,24 +161,52 @@ class LockEscalationLogic extends BaseGetXController { // 检查文件头 Future getHeadFile(Uint8List data) async { + if (data.length <= 16) { + showToast('错误D固件,请选择正确的文件'); + return null; + } // 检查文件头 - String header = utf8.decode(data.sublist(0, 12)); + String header; + try { + header = utf8.decode(data.sublist(0, 12)); + } catch (e) { + showToast('非SYD固件,请选择正确的文件'); + return null; + } if (header != 'SYD-BIN-DATA') { showToast('非SYD固件,请选择正确的文件'); return null; } // 解析元数据长度 - Uint8List metaLenList = data.sublist(12, 16); - int metaLen = ByteData.sublistView(metaLenList).getUint32(0); + Uint8List metaLenList; + int metaLen; + try { + metaLenList = data.sublist(12, 16); + metaLen = ByteData.sublistView(metaLenList).getUint32(0); + } catch (e) { + showToast('文件校验失败 0x01'); + return null; + } if (metaLen < 2 || metaLen > 10240) { showToast('文件校验失败 0x01'); return null; } // 读取和解析元数据 - Uint8List metaStrList = data.sublist(16, 16 + metaLen); - String metaStr = utf8.decode(metaStrList); + Uint8List metaStrList; + String metaStr; + try { + metaStrList = data.sublist(16, 16 + metaLen); + metaStr = utf8.decode(metaStrList); + } catch (e) { + showToast('解析元数据失败,请选择正确的文件'); + return null; + } AppLog.log(metaStr); var meta = jsonDecode(metaStr); + if (meta is! Map) { + showToast('解析元数据失败,请选择正确的文件'); + return null; + } return meta..['metaLen'] = metaLen; } From 6f97b6812e28da711745420db2550c1401821467 Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Mon, 29 Apr 2024 18:05:05 +0800 Subject: [PATCH 02/12] =?UTF-8?q?feat:=E4=BF=AE=E6=94=B9=E5=BC=80=E9=94=81?= =?UTF-8?q?=E6=8C=89=E9=92=AE=20ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/images/icon_circle_dotted.png | Bin 0 -> 7454 bytes star_lock/images/icon_lock_err.png | Bin 0 -> 8473 bytes star_lock/images/icon_lock_fill.png | Bin 0 -> 3841 bytes .../lockDetail/lockDetail_page.dart | 163 ++++++++++-------- 4 files changed, 92 insertions(+), 71 deletions(-) create mode 100644 star_lock/images/icon_circle_dotted.png create mode 100644 star_lock/images/icon_lock_err.png create mode 100644 star_lock/images/icon_lock_fill.png diff --git a/star_lock/images/icon_circle_dotted.png b/star_lock/images/icon_circle_dotted.png new file mode 100644 index 0000000000000000000000000000000000000000..4a8a7cf95f856eb3299a48dfd00423689ede390f GIT binary patch literal 7454 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 literal 0 HcmV?d00001 diff --git a/star_lock/images/icon_lock_fill.png b/star_lock/images/icon_lock_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..5945f09d9fc2ff6fd4a0461110b1a0925e28a7b7 GIT binary patch literal 3841 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 Storage.setStringList(saveBlueSignKey, saveSignKeyList); bool ifHaveKey = await Storage.ifHaveKey(saveBlueToken); - if(!ifHaveKey){ + if (!ifHaveKey) { var saveTokenList = changeIntListToStringList([0, 0, 0, 0]); Storage.setStringList(saveBlueToken, saveTokenList); } @@ -232,79 +232,78 @@ class _LockDetailPageState extends State crossAxisAlignment: CrossAxisAlignment.start, children: [ const Spacer(), - Obx(() { - return GestureDetector( - onTap: state.openDoorBtnisUneable.value == true - ? () { - setState(() { - startOpenLock(); - }); - } - : null, - onLongPressStart: state.openDoorBtnisUneable.value == true - ? (details) { - setState(() { - startUnLock(); - }); - } - : null, - child: Container( - decoration: BoxDecoration( - color: Colors.white.withOpacity(0.9), - borderRadius: BorderRadius.circular(100.w), - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.3), - offset: Offset(0, 0), - blurRadius: 10.r, - spreadRadius: 0, - ), - ]), - margin: EdgeInsets.only(left: 35.w, bottom: 15.h), - child: Stack( - children: [ - FlavorsImg( - child: Image.asset( - state.openDoorBtnisUneable.value == false - ? 'images/main/icon_main_openLockBtn_grey.png' - : (state.isOpenPassageMode.value == 1 - ? 'images/main/icon_main_normallyOpenMode_center.png' - : 'images/main/icon_main_openLockBtn_center.png'), - width: 96.r, - height: 96.r, - // color: AppColors.primaryTopColor, - ), + GestureDetector( + onTap: state.openDoorBtnisUneable.value == true + ? () { + setState(() { + startOpenLock(); + }); + } + : null, + onLongPressStart: state.openDoorBtnisUneable.value == true + ? (details) { + setState(() { + startUnLock(); + }); + } + : null, + child: Container( + width: 100.r, + height: 100.r, + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.9), + borderRadius: BorderRadius.circular(100.w), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + offset: Offset(0, 0), + blurRadius: 10.r, + spreadRadius: 0, ), - state.openDoorBtnisUneable.value == false - ? Positioned( - child: FlavorsImg( + ]), + margin: EdgeInsets.only(left: 35.w, bottom: 15.h), + child: Stack( + alignment: AlignmentDirectional.center, + children: [ + state.openDoorBtnisUneable.value == false + ? Icon( + Icons.bluetooth_searching, + size: 48.r, + color: AppColors.mainColor, + ) + : Image.asset( + state.isOpenPassageMode.value == 1 + ? 'images/icon_lock_err.png' + : 'images/icon_lock_fill.png', + width: 38.r, + height: 38.r, + color: AppColors.mainColor, + ), + state.openDoorBtnisUneable.value == false + ? Positioned( + child: Icon( + Icons.bluetooth_searching, + size: 96.r, + ), + ) + : state.openLockBtnState.value == 1 + ? xhjBuildRotationTransition( + width: 88.r, + height: 88.r, + ) + : Positioned( child: Image.asset( - 'images/main/icon_main_openLockBtn_grey.png', - width: 96.r, - height: 96.r, - ), - ), - ) - : state.openLockBtnState.value == 1 - ? buildRotationTransition( - width: 96.r, - height: 96.r, - ) - : Positioned( - child: FlavorsImg( - child: Image.asset( - state.isOpenPassageMode.value == 1 - ? 'images/main/icon_main_normallyOpenMode_circle.png' - : 'images/main/icon_main_openLockBtn_circle.png', - width: 96.r, - height: 96.r, - ), - )), - ], - ), + 'images/icon_circle_dotted.png', + width: 88.r, + height: 88.r, + color: state.isOpenPassageMode.value == 1 + ? Colors.red + : AppColors.mainColor, + )), + ], ), - ); - }), + ), + ), Padding( padding: EdgeInsets.only(left: 15.w, right: 00.w, bottom: 15.h), child: Row( @@ -735,6 +734,28 @@ class _LockDetailPageState extends State ); } + //旋转动画 + Widget xhjBuildRotationTransition( + {required double width, required double height}) { + return Positioned( + child: RotationTransition( + //设置动画的旋转中心 + alignment: Alignment.center, + //动画控制器 + turns: state.animationController!, + //将要执行动画的子view + child: Image.asset( + 'images/icon_circle_dotted.png', + width: width, + height: height, + color: state.isOpenPassageMode.value == 1 + ? Colors.red + : AppColors.mainColor, + ), + ), + ); + } + //旋转动画 Widget buildRotationTransition( {required double width, required double height}) { From d2dfef0b72c270cdd849edf223f98b27ad6e4a05 Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Mon, 29 Apr 2024 18:14:35 +0800 Subject: [PATCH 03/12] =?UTF-8?q?feat:=E4=BC=98=E5=8C=96=20android=20?= =?UTF-8?q?=E5=BA=95=E9=83=A8=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart | 2 +- .../lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart index 467d4063..9307e4b6 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -172,7 +172,7 @@ class _LockDetailPageState extends State onTap: onTap, child: Container( margin: EdgeInsets.symmetric(horizontal: 0.05.sw, vertical: 15.h), - padding: EdgeInsets.symmetric(horizontal: 0.05.sw, vertical: 20.h), + padding: EdgeInsets.symmetric(horizontal: 0.05.sw, vertical: 30.h), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16.r), diff --git a/star_lock/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart b/star_lock/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart index 191de81c..8f604e46 100644 --- a/star_lock/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart +++ b/star_lock/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart @@ -86,7 +86,8 @@ class _StarLockMainXHJPageState extends State ], ), bottomNavigationBar: Container( - padding: EdgeInsets.only(top: 20.h), + padding: EdgeInsets.only( + top: 20.h, bottom: GetPlatform.isAndroid ? 20.h : 0), decoration: const BoxDecoration( color: Colors.transparent, border: Border( From 294ee590eb568eb22071c7b1db0a09deea6c45c2 Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Mon, 29 Apr 2024 18:25:48 +0800 Subject: [PATCH 04/12] =?UTF-8?q?feat:=E8=A1=A5=E5=85=85=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/images/lan/lan_en.json | 1062 ++++++++--------- star_lock/images/lan/lan_keys.json | 10 +- star_lock/images/lan/lan_zh.json | 10 +- .../lockEscalation/lockEscalation_logic.dart | 22 +- 4 files changed, 550 insertions(+), 554 deletions(-) diff --git a/star_lock/images/lan/lan_en.json b/star_lock/images/lan/lan_en.json index e5f2ae84..62e119d0 100644 --- a/star_lock/images/lan/lan_en.json +++ b/star_lock/images/lan/lan_en.json @@ -1,273 +1,267 @@ { - "starLock":"Star Lock", - "lockThrough":"Lock Through", - "clickUnlockAndHoldDownClose":"Click To Unlock And Hold Down to Close", - "checkingIn":"Checking In", - "electronicKey":"Electronic Key", - "password":"Password", - "card":"Card", - "fingerprint":"Fingerprint", - "remoteControl":"RemoteControl", - "face":"face", - "operatingRecord":"Operating Record", - "doorLockLog":"Door lock log", - "number":"Number", - "additive":"Additive", - "addTime":"Add Time", - - "reset":"Reset", - "sendKey":"SendKey", - "timeLimit":"TimeLimit", - "permanent":"Permanent", - "once":"Once", - "circulation":"Circulation", - "receiver":"Receiver", - "pleaseEnterNumberOrEmail":"Please enter the number or email", - "name":"Name", - "enterYourName":"Please Enter Your Name", - "effectiveTime":"Effective Time", - "failureTime":"Failure Time", - "effectiveDate":"Effective Date", - "failureDate":"Failure Date", - "monday":"Monday", - "tuesday":"Tuesday", - "wednesday":"Wednesday", - "thursday":"Thursday", - "friday":"Friday", - "saturday":"Saturday", - "sunday":"Sunday", - "mondayShort":"M", - "tuesdayShort":"T", - "wednesdayShort":"W", - "thursdayShort":"T", - "fridayShort":"F", - "saturdayShort":"S", - "sundayShort":"S", - - "realNameAuthentication":"RealNameAuthentication", - "sendKeyBottomTip":"The recipient can use it unlimited times during the validity period", - "send":"Send", - "periodValidity":"PeriodValidity", - "sendGroupKey":"Send Group Key", - "lock":"Lock", - "pleaseAdd":"Please Add", - "pleaseSelect":"Please Select", - "remoteUnlockingAllowed":"Remote Unlocking Allowed", - "pleaseEnter":"Please Enter", - "getPassword":"Get Password", - "custom":"Custom", - "clearAll":"ClearAll", - "recursiveDevice":"Recursive Device", - "pleaseNameYourPassword":"Please Name Your Password", - "pleaseEnterDigitsNumber":"pleaseEnter6", - "getPasswordTip1":"The password must be used at least once in the last 24 hours, otherwise it is invalid\n", - "getPasswordTip2":"The password can be used for an unlimited number of times in the next period. The password must be used at least once within 24 hours after it takes effect, otherwise it will be invalid\n", - "getPasswordTip3":"The password is valid for 6 hours and can only be used once\n", - "getPasswordTip4":"It can be added next to the lock via Bluetooth on the phone or remotely via the gateway\n", - "getPasswordTip5":"The password must be used at least once within the first 24 hours, otherwise it will be invalid\n", - "getPasswordTip6":"The password is valid for 24 hours. Entering it on the lock invalidates all previously used passwords\n", - "getTip":"Get", - "addTip":"Add", - "sender":"Sender", - "senderTime":"Sender Time", - "keyDetail":"Key Detail", - "detail":"Detail", - "delete":"Delete", - "passwordDetail":"Password Detail", - "share":"Share", - "amend":"Amend", - "sure":"Sure", - "cancel":"Cancel", - "add":"Add", - "accountNumber":"AccountNumber", - "volumeAuthorizationLock":"Volume Authorization Lock", - "authorizedAdminTip":"The authorized administrator has important access to this lock, so make sure you only send it to people you trust", - "lockOperatingRecordTip":"The historical records can be retained only for a certain period of time. If you want to retain historical records, export them in the upper right corner", - "rankingList":"Ranking List", - "earlyArrivalList":"Early Arrival List", - "lateList":"Late List", - "hardWorkingList":"Hard Working List", - "company":"Company", - "staff":"Staff", - "work":"Work", - "workday":"Workday", - "holidays":"Holidays", - "punchingMode":"Punching Mode", - "whetherTheEmployeeHasAKey":"If The Employee Has A Key", - "selectKey":"Select Key", - "officeHours":"Office Hours", - "closingTime":"Closing Time", - "thisWeek":"This Week", - "singleDayWeekend":"Single Day Weekend", - "twoDaysOff":"Two Days Off", - "oddOrEvenDaysOff":"Odd Or Even Days Off", - "year":"Year", - "month":"Month", - "libertyDay":"Liberty Day", - "coverDate":"Cover Date", - "addedHoliday":"Added Holiday", - "startDate":"Start Date", - "accessDate":"Access Date", - "mustFillIn":"Must Fill In", - "endDate":"End Date", - "dailyCharts":"Daily Charts", - "monthlyLeaderboard":"Monthly Leader board", - "noAttendanceRecord":"No Attendance Record", - "attendanceRecord":"Attendance Record", - "everyoneIsVeryMotivated":"Everyone Is Very Motivated", - "workingHoursWereNotReleased":"Working Hours Were Not Released", - "beLate":"Be Late", - "leaveEarly":"Leave Early", - "noCardPunched":"No Card Punched", - "holidayInfo":"Holiday Info", - - "basicInformation":"Basic Information", - "wirelessKeyboard":"Wireless Keyboard", - "doorMagnetic":"Door Magnetic", - "remoteUnlocking":"Remote Unlocking", - "automaticBlocking":"Automatic Blocking", - "normallyOpenMode":"Normally Open Mode", - "automaticUnLock":"Automatic UnLock", - "automaticUnLockTip":"After opening, the lock will open automatically at the beginning of the normally open mode", - "lockSound":"Lock Sound", - "burglarAlarm":"Burglar Alarm", - "resetButton":"Reset Button", - "lockTime":"Lock Time", - "diagnose":"Diagnose", - "uploadData":"Upload Data", - "importOtherLockData":"Import Other Lock Data", - "lockEscalation":"Lock Escalation", - "markedHouseState":"Marked House State", - "unlockReminder":"Unlock Reminder", - "unlockQRCode":"Unlock QR Code", - "lockNumber":"Lock Number", - "electricQuantity":"Electric Quantity", - "lockName":"Lock Name", - "lockGrouping":"Lock Grouping", - "selectGroup":"Selective grouping", - "createNewGroup":"Create a new group", - "adminOpenLockPassword":"Admin Open Lock Password", - "update":"Update", - "updateElectricQuantityTip":"The battery information can be updated remotely via the gateway or next to the lock via Bluetooth on the phone\n", - "adminOpenLockPasswordTip":"If you have changed the password on the lock, the actual valid password inside the lock may be different from the one shown here\n", - "updateLockAdminPassword":"Upload the lock administrator password", - "whenScreenFlashesClickNext":"When the screen flashes, click Next", - "theScreenNeverFlickered":"The screen never flickered", - "enterNumberOrPressSet":"Enter *529# or press the Settings key", - "theLocationOfTheSetKeyWillBeDifferent":"The location of the set key will be different", - "pressAndHoldTheResetButtonTwoSeconds":"Press And Hold The Reset Button 2 Seconds", - "nearbyEquipment":"Nearby Equipment", - "noData":"No Data", - "doorMagneticListTopTip":"You can query the open and close status of a door by using the door status sensor. Add a door magnet to each lock", - "remoteUnlockingPageTip":"When enabled, you will be able to open the lock remotely through the gateway. This function can only be turned on and off near the lock via Bluetooth on the phone.", - "currentMode":"Current Mode", - "delayTime":"Delay Time", - "automaticBlockingTip":"After the time set above, the lock will automatically close. After you enable or modify the Settings, open the lock once for the time to take effect", - "time":"Time", - "normallyOpen":"Normally Open", - "date":"Date", - "begin":"Begin", - "end":"End", - "allDay":"All Day", - "save":"Save", - "normallyOpenModeTip":"During the set normal opening time, the lock will remain open after opening until it is manually closed During the set normal opening time, the lock will remain open after opening until it is manually closed", - "pleaseSelectLockVolume":"Please Select Lock Volume", - "lockSoundTip":"When the function is enabled, you can hear the prompt tone of the smart lock. Including low battery, incorrect password and so on.", - "low":"Low", - "lower":"Lower", - "medium":"Medium", - "high":"High", - "higher":"Higher", - "burglarAlarmTip":"After opening, an alarm sound will be issued when the lock is picked", - "resetButtonTip1":"After opening, you can re-add with APP by long pressing the reset key on the lock.", - "resetButtonTip2":"After closing, the reset key is invalid, and the lock can be re-added only after being deleted by app", - "calibrationTime":"Calibration Time", - "setTheDSTMode":"Set The DST Mode", - "diagnoseTip":"Diagnosis is to read the configuration information inside the lock and upload it so that the staff can analyze the cause of the failure", - "uploading":"Uploading", - "uploadDataTip":"This operation will upload the locked data to the server, which may take several minutes", - "importOtherLockDataTip":"Please select which lock you want to import from", - "haveNewVersion":"Have New Version", - "currentVersion":"Current Version", - "newVersion":"New Version", - "upgrade":"Upgrade", - "leisure":"Leisure", - "checkedIn":"Checked In", - - "lanEnglish":"English", - "lanChinese":"Chinese", - "multilingual":"Multilingual", - "addLock":"Add Lock", - "lockAddress":"Lock Address", - "selectLockType":"Select lock type", - "videoIntercomDoorLock":"Video intercom door lock", - "NFCPassiveLock":"NFC Passive Lock", - "addDevice":"Add device", - "gateway":"Gateway", - "message":"Message", - "supportStaff":"Support Staff", - "set":"Setting", - "moreServices":"More Services", - - "moreSet":"More Set", - "prompTone":"Promp Tone", - "touchUnlock":"Touch Unlock", - "pushNotification":"Push Notification", - "lockUserManagement":"Lock User Management", - "ownedKey":"Owned key", - "authorityManagement":"Authority management", - "associatedDevice":"Associated device", - "associatedName":"Associated name", - "device":"Device", - "aboutToExpire":"About to expire", - "deAuthorize":"de-authorize", - "changeName":"Change name", - "authorizedAdmin":"Authorized Admin", - "addAuthorizedAdmin":"Adding an Authorized Administrator", - "lockGroup":"Lock Group", - "transferSmartLock":"Transfer Smart Lock", - "selectiveLock":"Selective lock", - "recipientInformation":"recipientInformation", - "transferGateway":"Transfer Gateway", - "multiLanguage":"Multi Language", - "lockScreen":"Lock Screen", - "closed":"Closed", - "opened":"Opened", - "close":"Close", - "open":"Open", - "hideInvalidUnlockPermissions":"Hide Invalid Unlock Permissions", - "appUnlockRequiresMobilePhoneAccessToTheLock":"APP Unlock Requires Phone Access To Lock", - "valueAddedServices":"Value Added Services", - "about":"About", - "userAgreement":"User Agreement", - "privacyPolicy":"Privacy Policy", - "personalInformationCollectionList":"Personal Information Collection List", - "applicationPermissionDescription":"Application Permission Description", - "thirdPartyInformationSharingList":"Third party information sharing list", - "logout":"Logout", - "deleteAccount":"Delete Account", - "personalInformation":"Personal Information", - "avatar":"Avatar", - "nickName":"NickName", - "changeNickName":"Change NickName", - "modifyAccount":"Modify Account", - "resetPasswords":"Reset Passwords", - "safetyProblem":"Safety Problem", - "modifyAccountTip":"For the security of your account, please use the account password verification before modifying the account", - "pleaseEnterAccountNumber":"Please enter your account number", - "pleaseEnterNewAccountNumber":"Please enter your new account number", - "changeIphoneTip":"When you retrieve your password and log in to a new device, you can verify it with the attached phone", - "changeEmailTip":"When you retrieve your password and log in to a new device, you can verify it with the attached Email", - "goBind":"Go Bind", - "originalPassword":"Original Password", - "newPassword":"New Password", - "surePassword":"Sure Password", - "safetyProblemTip":"When you lose your phone, you can log in to the new device by answering the security questions you set", - "problemOne":"Problem One", - "problemTwo":"Problem Two", - "problemThree":"Problem Three", - "pleaseEnterYourAnswer":"Please Enter Your Answer", - + "starLock": "Star Lock", + "lockThrough": "Lock Through", + "clickUnlockAndHoldDownClose": "Click To Unlock And Hold Down to Close", + "checkingIn": "Checking In", + "electronicKey": "Electronic Key", + "password": "Password", + "card": "Card", + "fingerprint": "Fingerprint", + "remoteControl": "RemoteControl", + "face": "face", + "operatingRecord": "Operating Record", + "doorLockLog": "Door lock log", + "number": "Number", + "additive": "Additive", + "addTime": "Add Time", + "reset": "Reset", + "sendKey": "SendKey", + "timeLimit": "TimeLimit", + "permanent": "Permanent", + "once": "Once", + "circulation": "Circulation", + "receiver": "Receiver", + "pleaseEnterNumberOrEmail": "Please enter the number or email", + "name": "Name", + "enterYourName": "Please Enter Your Name", + "effectiveTime": "Effective Time", + "failureTime": "Failure Time", + "effectiveDate": "Effective Date", + "failureDate": "Failure Date", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "mondayShort": "M", + "tuesdayShort": "T", + "wednesdayShort": "W", + "thursdayShort": "T", + "fridayShort": "F", + "saturdayShort": "S", + "sundayShort": "S", + "realNameAuthentication": "RealNameAuthentication", + "sendKeyBottomTip": "The recipient can use it unlimited times during the validity period", + "send": "Send", + "periodValidity": "PeriodValidity", + "sendGroupKey": "Send Group Key", + "lock": "Lock", + "pleaseAdd": "Please Add", + "pleaseSelect": "Please Select", + "remoteUnlockingAllowed": "Remote Unlocking Allowed", + "pleaseEnter": "Please Enter", + "getPassword": "Get Password", + "custom": "Custom", + "clearAll": "ClearAll", + "recursiveDevice": "Recursive Device", + "pleaseNameYourPassword": "Please Name Your Password", + "pleaseEnterDigitsNumber": "pleaseEnter6", + "getPasswordTip1": "The password must be used at least once in the last 24 hours, otherwise it is invalid\n", + "getPasswordTip2": "The password can be used for an unlimited number of times in the next period. The password must be used at least once within 24 hours after it takes effect, otherwise it will be invalid\n", + "getPasswordTip3": "The password is valid for 6 hours and can only be used once\n", + "getPasswordTip4": "It can be added next to the lock via Bluetooth on the phone or remotely via the gateway\n", + "getPasswordTip5": "The password must be used at least once within the first 24 hours, otherwise it will be invalid\n", + "getPasswordTip6": "The password is valid for 24 hours. Entering it on the lock invalidates all previously used passwords\n", + "getTip": "Get", + "addTip": "Add", + "sender": "Sender", + "senderTime": "Sender Time", + "keyDetail": "Key Detail", + "detail": "Detail", + "delete": "Delete", + "passwordDetail": "Password Detail", + "share": "Share", + "amend": "Amend", + "sure": "Sure", + "cancel": "Cancel", + "add": "Add", + "accountNumber": "AccountNumber", + "volumeAuthorizationLock": "Volume Authorization Lock", + "authorizedAdminTip": "The authorized administrator has important access to this lock, so make sure you only send it to people you trust", + "lockOperatingRecordTip": "The historical records can be retained only for a certain period of time. If you want to retain historical records, export them in the upper right corner", + "rankingList": "Ranking List", + "earlyArrivalList": "Early Arrival List", + "lateList": "Late List", + "hardWorkingList": "Hard Working List", + "company": "Company", + "staff": "Staff", + "work": "Work", + "workday": "Workday", + "holidays": "Holidays", + "punchingMode": "Punching Mode", + "whetherTheEmployeeHasAKey": "If The Employee Has A Key", + "selectKey": "Select Key", + "officeHours": "Office Hours", + "closingTime": "Closing Time", + "thisWeek": "This Week", + "singleDayWeekend": "Single Day Weekend", + "twoDaysOff": "Two Days Off", + "oddOrEvenDaysOff": "Odd Or Even Days Off", + "year": "Year", + "month": "Month", + "libertyDay": "Liberty Day", + "coverDate": "Cover Date", + "addedHoliday": "Added Holiday", + "startDate": "Start Date", + "accessDate": "Access Date", + "mustFillIn": "Must Fill In", + "endDate": "End Date", + "dailyCharts": "Daily Charts", + "monthlyLeaderboard": "Monthly Leader board", + "noAttendanceRecord": "No Attendance Record", + "attendanceRecord": "Attendance Record", + "everyoneIsVeryMotivated": "Everyone Is Very Motivated", + "workingHoursWereNotReleased": "Working Hours Were Not Released", + "beLate": "Be Late", + "leaveEarly": "Leave Early", + "noCardPunched": "No Card Punched", + "holidayInfo": "Holiday Info", + "basicInformation": "Basic Information", + "wirelessKeyboard": "Wireless Keyboard", + "doorMagnetic": "Door Magnetic", + "remoteUnlocking": "Remote Unlocking", + "automaticBlocking": "Automatic Blocking", + "normallyOpenMode": "Normally Open Mode", + "automaticUnLock": "Automatic UnLock", + "automaticUnLockTip": "After opening, the lock will open automatically at the beginning of the normally open mode", + "lockSound": "Lock Sound", + "burglarAlarm": "Burglar Alarm", + "resetButton": "Reset Button", + "lockTime": "Lock Time", + "diagnose": "Diagnose", + "uploadData": "Upload Data", + "importOtherLockData": "Import Other Lock Data", + "lockEscalation": "Lock Escalation", + "markedHouseState": "Marked House State", + "unlockReminder": "Unlock Reminder", + "unlockQRCode": "Unlock QR Code", + "lockNumber": "Lock Number", + "electricQuantity": "Electric Quantity", + "lockName": "Lock Name", + "lockGrouping": "Lock Grouping", + "selectGroup": "Selective grouping", + "createNewGroup": "Create a new group", + "adminOpenLockPassword": "Admin Open Lock Password", + "update": "Update", + "updateElectricQuantityTip": "The battery information can be updated remotely via the gateway or next to the lock via Bluetooth on the phone\n", + "adminOpenLockPasswordTip": "If you have changed the password on the lock, the actual valid password inside the lock may be different from the one shown here\n", + "updateLockAdminPassword": "Upload the lock administrator password", + "whenScreenFlashesClickNext": "When the screen flashes, click Next", + "theScreenNeverFlickered": "The screen never flickered", + "enterNumberOrPressSet": "Enter *529# or press the Settings key", + "theLocationOfTheSetKeyWillBeDifferent": "The location of the set key will be different", + "pressAndHoldTheResetButtonTwoSeconds": "Press And Hold The Reset Button 2 Seconds", + "nearbyEquipment": "Nearby Equipment", + "noData": "No Data", + "doorMagneticListTopTip": "You can query the open and close status of a door by using the door status sensor. Add a door magnet to each lock", + "remoteUnlockingPageTip": "When enabled, you will be able to open the lock remotely through the gateway. This function can only be turned on and off near the lock via Bluetooth on the phone.", + "currentMode": "Current Mode", + "delayTime": "Delay Time", + "automaticBlockingTip": "After the time set above, the lock will automatically close. After you enable or modify the Settings, open the lock once for the time to take effect", + "time": "Time", + "normallyOpen": "Normally Open", + "date": "Date", + "begin": "Begin", + "end": "End", + "allDay": "All Day", + "save": "Save", + "normallyOpenModeTip": "During the set normal opening time, the lock will remain open after opening until it is manually closed During the set normal opening time, the lock will remain open after opening until it is manually closed", + "pleaseSelectLockVolume": "Please Select Lock Volume", + "lockSoundTip": "When the function is enabled, you can hear the prompt tone of the smart lock. Including low battery, incorrect password and so on.", + "low": "Low", + "lower": "Lower", + "medium": "Medium", + "high": "High", + "higher": "Higher", + "burglarAlarmTip": "After opening, an alarm sound will be issued when the lock is picked", + "resetButtonTip1": "After opening, you can re-add with APP by long pressing the reset key on the lock.", + "resetButtonTip2": "After closing, the reset key is invalid, and the lock can be re-added only after being deleted by app", + "calibrationTime": "Calibration Time", + "setTheDSTMode": "Set The DST Mode", + "diagnoseTip": "Diagnosis is to read the configuration information inside the lock and upload it so that the staff can analyze the cause of the failure", + "uploading": "Uploading", + "uploadDataTip": "This operation will upload the locked data to the server, which may take several minutes", + "importOtherLockDataTip": "Please select which lock you want to import from", + "haveNewVersion": "Have New Version", + "currentVersion": "Current Version", + "newVersion": "New Version", + "upgrade": "Upgrade", + "leisure": "Leisure", + "checkedIn": "Checked In", + "lanEnglish": "English", + "lanChinese": "Chinese", + "multilingual": "Multilingual", + "addLock": "Add Lock", + "lockAddress": "Lock Address", + "selectLockType": "Select lock type", + "videoIntercomDoorLock": "Video intercom door lock", + "NFCPassiveLock": "NFC Passive Lock", + "addDevice": "Add device", + "gateway": "Gateway", + "message": "Message", + "supportStaff": "Support Staff", + "set": "Setting", + "moreServices": "More Services", + "moreSet": "More Set", + "prompTone": "Promp Tone", + "touchUnlock": "Touch Unlock", + "pushNotification": "Push Notification", + "lockUserManagement": "Lock User Management", + "ownedKey": "Owned key", + "authorityManagement": "Authority management", + "associatedDevice": "Associated device", + "associatedName": "Associated name", + "device": "Device", + "aboutToExpire": "About to expire", + "deAuthorize": "de-authorize", + "changeName": "Change name", + "authorizedAdmin": "Authorized Admin", + "addAuthorizedAdmin": "Adding an Authorized Administrator", + "lockGroup": "Lock Group", + "transferSmartLock": "Transfer Smart Lock", + "selectiveLock": "Selective lock", + "recipientInformation": "recipientInformation", + "transferGateway": "Transfer Gateway", + "multiLanguage": "Multi Language", + "lockScreen": "Lock Screen", + "closed": "Closed", + "opened": "Opened", + "close": "Close", + "open": "Open", + "hideInvalidUnlockPermissions": "Hide Invalid Unlock Permissions", + "appUnlockRequiresMobilePhoneAccessToTheLock": "APP Unlock Requires Phone Access To Lock", + "valueAddedServices": "Value Added Services", + "about": "About", + "userAgreement": "User Agreement", + "privacyPolicy": "Privacy Policy", + "personalInformationCollectionList": "Personal Information Collection List", + "applicationPermissionDescription": "Application Permission Description", + "thirdPartyInformationSharingList": "Third party information sharing list", + "logout": "Logout", + "deleteAccount": "Delete Account", + "personalInformation": "Personal Information", + "avatar": "Avatar", + "nickName": "NickName", + "changeNickName": "Change NickName", + "modifyAccount": "Modify Account", + "resetPasswords": "Reset Passwords", + "safetyProblem": "Safety Problem", + "modifyAccountTip": "For the security of your account, please use the account password verification before modifying the account", + "pleaseEnterAccountNumber": "Please enter your account number", + "pleaseEnterNewAccountNumber": "Please enter your new account number", + "changeIphoneTip": "When you retrieve your password and log in to a new device, you can verify it with the attached phone", + "changeEmailTip": "When you retrieve your password and log in to a new device, you can verify it with the attached Email", + "goBind": "Go Bind", + "originalPassword": "Original Password", + "newPassword": "New Password", + "surePassword": "Sure Password", + "safetyProblemTip": "When you lose your phone, you can log in to the new device by answering the security questions you set", + "problemOne": "Problem One", + "problemTwo": "Problem Two", + "problemThree": "Problem Three", + "pleaseEnterYourAnswer": "Please Enter Your Answer", "designation": "designation", "state": "State", "wifiName": "Wifi Name", @@ -297,160 +291,146 @@ "preferredDNS": "Preferred DNS", "alternativeDNS": "Alternative DNS", "noStaticIPIsUsed": "No Static IP Is Used", - - "allLock":"All Lock", - "searchAllLockType":"Search All Lock Type", - "doorLock":"Door Lock", - "padlock":"Pad lock", - "safeLock":"Safe Lock", - "intelligentLockCore":"Intelligent Lock Core", - "itelligentAccessControl":"Intelligent access control", - "parkingLock":"Parking Lock", - "bicycleLock":"Bicycle Lock", - "longRangeControl":"LongRange Control", - "lightTouchScreen":"Light Touch Screen", - "lightTouchScreenTip":"Light Touch Screen Tip", - "next":"Next", - "nearbyLock":"Nearby Lock", - "addSuccessfullyPleaseRename":"If you want to change the name, please rename, click OK to add lock", - "whenAddingLockThePhoneMustBeNextToTheLock":"When adding a lock, the phone must be next to the lock", - - "login":"Login", - "register":"Register", - "forgetPassword":"Forget Password", - "readAndAgree":"I Have Read And Agree", - "verificationCode":"VerificationCode", - "registerPasswordTip":"The password must be 8-20 characters, including at least 2 of the numbers/letters/symbols", - "iphone":"Iphone", - "email":"Email", - "mobileNumber":"Mobile phone number", - "countryAndRegion":"Country And Region", - "select":"Select", - "getVerificationCode":"Get Verification Code", - - "businessCooperation":"Business Cooperation", - "officialWebsite":"Official Website", - "computerWebVersion":"Computer Web Version", - "hotelSystem":"Hotel System", - "manualWebVersion":"Manual Web Version", - "introduce":"Introduce", - - "note":"Note", - "mail":"Mail", - "advancedFunction":"Advanced Function", - "pushMessage":"Push Message", - "recordsRetention":"Records Retention", - - "smsBuyTip":"You can send the password and electronic key information to the recipient via SMS.", - "emailBuyTip":"You can send the password and electronic key information to the recipient by email.", - "currentRemainingQuantity":"Current Remaining Quantity", - "buy":"Buy", - "customSMSTemplate":"Custom SMS Template", - "customMailTemplate":"Custom Mail Template", - "record":"Record", - "buyRealNameTip":"When an electronic key is sent to the user, the user can be required to authenticate with his real name before unlocking to ensure that he is operating. The real-name authentication calls the interface of the national Public security system. For the payment function, please purchase the number of times before using it.", - "buyRealNameSelectYouWantBuyTip":"Please select the frequency of real name authentication you want", - "forTheFirstTime":"For the first time", - "onceDay":"once a day", - "weekOnce":"once a week", - "monthOnce":"once every month", - "currentState":"Current State", - "onTrial":"On Trial", - "haveNotOpened":"Have Not Opened", - "advancedFeaturesAndBenefitsContent":"Advanced Features And Benefits Content", - "smsTemplate":"SMS Template", - "emailTemplate":"Email Template", - "cardIssuingtool":"Card Issuing tool", - "titleForBuyingAdvancedFeatures":"Tips for buying advanced features", - "tipsForBuyingAdvancedFeatures":"More advanced features are under development, and if you need them, you are welcome to open the service based on the number of locks. Advanced features are only available for your own locks. If you are an authorized administrator, please contact the top administrator of the lock to open the service", - "freeTrial":"Free Trial", - "openNow":"Open Now", - - "buySMS":"Buy SMS", - "buyMail":"Buy Mail", - "buyRealNameAuthenticationTimes":"Purchase Real Name Authentication Times", - "enablingAdvancedFeatures":"Enabling Advanced Features", - "chooseAPackage":"Choose A Package", - "modeOfPayment":"Mode Of Payment", - "alipay":"Alipay", - "goToPay":"Go To Pay", - - "customTemplatesTip":"You can define the content of your own template for sending passwords or electronic key information to others", - "haveOpened":"Have Opened", - "unHaveOpenedTip1":"This function is an advanced function, please open it before using", - "unHaveOpenedTip2":"Advanced features are only available for your own locks", - "freeTrialKeywords":"Free Trial", - "goToTheOpen":"Go to the open", - "creatingANewTemplate":"Creating a new template", - "type":"Type", - "templateContent":"Template Content", - "preview":"Preview", - "hello":"Hello", - "yourRoomIs":"Your room is", - "roomName":"Room Name", - "theCodeToOpenTheDoorIs":"The code to open the door is", - "templateTip1":"After entering the password, please press the # key or other unlocking key to end. The password must be used at least once within 24 hours of being valid, otherwise it will be invalid", - "templateTip2":"You have received an electronic key, please use the applet to open the door.", - "templateTip3":"Or install an App to open the door。", - "expectedNotoCount":"The number of short creeds is expected to be generated", + "allLock": "All Lock", + "searchAllLockType": "Search All Lock Type", + "doorLock": "Door Lock", + "padlock": "Pad lock", + "safeLock": "Safe Lock", + "intelligentLockCore": "Intelligent Lock Core", + "itelligentAccessControl": "Intelligent access control", + "parkingLock": "Parking Lock", + "bicycleLock": "Bicycle Lock", + "longRangeControl": "LongRange Control", + "lightTouchScreen": "Light Touch Screen", + "lightTouchScreenTip": "Light Touch Screen Tip", + "next": "Next", + "nearbyLock": "Nearby Lock", + "addSuccessfullyPleaseRename": "If you want to change the name, please rename, click OK to add lock", + "whenAddingLockThePhoneMustBeNextToTheLock": "When adding a lock, the phone must be next to the lock", + "login": "Login", + "register": "Register", + "forgetPassword": "Forget Password", + "readAndAgree": "I Have Read And Agree", + "verificationCode": "VerificationCode", + "registerPasswordTip": "The password must be 8-20 characters, including at least 2 of the numbers/letters/symbols", + "iphone": "Iphone", + "email": "Email", + "mobileNumber": "Mobile phone number", + "countryAndRegion": "Country And Region", + "select": "Select", + "getVerificationCode": "Get Verification Code", + "businessCooperation": "Business Cooperation", + "officialWebsite": "Official Website", + "computerWebVersion": "Computer Web Version", + "hotelSystem": "Hotel System", + "manualWebVersion": "Manual Web Version", + "introduce": "Introduce", + "note": "Note", + "mail": "Mail", + "advancedFunction": "Advanced Function", + "pushMessage": "Push Message", + "recordsRetention": "Records Retention", + "smsBuyTip": "You can send the password and electronic key information to the recipient via SMS.", + "emailBuyTip": "You can send the password and electronic key information to the recipient by email.", + "currentRemainingQuantity": "Current Remaining Quantity", + "buy": "Buy", + "customSMSTemplate": "Custom SMS Template", + "customMailTemplate": "Custom Mail Template", + "record": "Record", + "buyRealNameTip": "When an electronic key is sent to the user, the user can be required to authenticate with his real name before unlocking to ensure that he is operating. The real-name authentication calls the interface of the national Public security system. For the payment function, please purchase the number of times before using it.", + "buyRealNameSelectYouWantBuyTip": "Please select the frequency of real name authentication you want", + "forTheFirstTime": "For the first time", + "onceDay": "once a day", + "weekOnce": "once a week", + "monthOnce": "once every month", + "currentState": "Current State", + "onTrial": "On Trial", + "haveNotOpened": "Have Not Opened", + "advancedFeaturesAndBenefitsContent": "Advanced Features And Benefits Content", + "smsTemplate": "SMS Template", + "emailTemplate": "Email Template", + "cardIssuingtool": "Card Issuing tool", + "titleForBuyingAdvancedFeatures": "Tips for buying advanced features", + "tipsForBuyingAdvancedFeatures": "More advanced features are under development, and if you need them, you are welcome to open the service based on the number of locks. Advanced features are only available for your own locks. If you are an authorized administrator, please contact the top administrator of the lock to open the service", + "freeTrial": "Free Trial", + "openNow": "Open Now", + "buySMS": "Buy SMS", + "buyMail": "Buy Mail", + "buyRealNameAuthenticationTimes": "Purchase Real Name Authentication Times", + "enablingAdvancedFeatures": "Enabling Advanced Features", + "chooseAPackage": "Choose A Package", + "modeOfPayment": "Mode Of Payment", + "alipay": "Alipay", + "goToPay": "Go To Pay", + "customTemplatesTip": "You can define the content of your own template for sending passwords or electronic key information to others", + "haveOpened": "Have Opened", + "unHaveOpenedTip1": "This function is an advanced function, please open it before using", + "unHaveOpenedTip2": "Advanced features are only available for your own locks", + "freeTrialKeywords": "Free Trial", + "goToTheOpen": "Go to the open", + "creatingANewTemplate": "Creating a new template", + "type": "Type", + "templateContent": "Template Content", + "preview": "Preview", + "hello": "Hello", + "yourRoomIs": "Your room is", + "roomName": "Room Name", + "theCodeToOpenTheDoorIs": "The code to open the door is", + "templateTip1": "After entering the password, please press the # key or other unlocking key to end. The password must be used at least once within 24 hours of being valid, otherwise it will be invalid", + "templateTip2": "You have received an electronic key, please use the applet to open the door.", + "templateTip3": "Or install an App to open the door。", + "expectedNotoCount": "The number of short creeds is expected to be generated", "templateTip4": "Tip: When sending messages to other people, be critical", - "and":"And", - "willBeReplacedWithTheActualValue":"Will be replaced with the actual value", - "downloadLink":"Download Link", - - "lockScreenTip":"After the function is enabled, you need to use your fingerprint, face or account password to open the APP. There is no need to verify again for 3 minutes", - "hideInvalidUnlockPermissionsTip":"After the function is enabled, the password, electronic key, card, fingerprint and other unlocking permissions that have been invalid for a long time will be hidden and not displayed in the list.", - "appUnlockRequiresMobilePhoneAccessToTheLockTip":"For the selected locks, when the user uses the APP to unlock the lock, his phone needs to be connected to the Internet, otherwise the lock cannot be unlocked", - "checkAll":"Check All", - - "wifiDistributionNetwork":"WiFi Distribution Network", - "configuringWiFi":"Configuring WiFi", - "pleaseEnterWifiName":"Please Enter Wifi Name", - "wifiPwd":"WiFi password", - "pleaseEnterWifiPwd":"Please Enter WiFi Password", - "edit":"Edit", - "stressFingerprint":"Stress Fingerprint", - "effectiveDay":"Effective Day", - "stressCard":"Stress Card", - "stressPassword":"Stress Password", - - "whetherTheEmployeeHasPassword":"If The Employee Has A Password", - "whetherTheEmployeeHasCard":"If The Employee Has A Card", - "whetherTheEmployeeHasFingerprint":"If The Employee Has A Fingerprint", - "selectPassword":"Select Password", - "selectCard":"Select Card", - "selectFingerprint":"Select Fingerprint", - "getKey":"Get Key", - "getCard":"Get Card", - "getFingerprint":"Get Fingerprint", - "safeVerify":"Security verification", + "and": "And", + "willBeReplacedWithTheActualValue": "Will be replaced with the actual value", + "downloadLink": "Download Link", + "lockScreenTip": "After the function is enabled, you need to use your fingerprint, face or account password to open the APP. There is no need to verify again for 3 minutes", + "hideInvalidUnlockPermissionsTip": "After the function is enabled, the password, electronic key, card, fingerprint and other unlocking permissions that have been invalid for a long time will be hidden and not displayed in the list.", + "appUnlockRequiresMobilePhoneAccessToTheLockTip": "For the selected locks, when the user uses the APP to unlock the lock, his phone needs to be connected to the Internet, otherwise the lock cannot be unlocked", + "checkAll": "Check All", + "wifiDistributionNetwork": "WiFi Distribution Network", + "configuringWiFi": "Configuring WiFi", + "pleaseEnterWifiName": "Please Enter Wifi Name", + "wifiPwd": "WiFi password", + "pleaseEnterWifiPwd": "Please Enter WiFi Password", + "edit": "Edit", + "stressFingerprint": "Stress Fingerprint", + "effectiveDay": "Effective Day", + "stressCard": "Stress Card", + "stressPassword": "Stress Password", + "whetherTheEmployeeHasPassword": "If The Employee Has A Password", + "whetherTheEmployeeHasCard": "If The Employee Has A Card", + "whetherTheEmployeeHasFingerprint": "If The Employee Has A Fingerprint", + "selectPassword": "Select Password", + "selectCard": "Select Card", + "selectFingerprint": "Select Fingerprint", + "getKey": "Get Key", + "getCard": "Get Card", + "getFingerprint": "Get Fingerprint", + "safeVerify": "Security verification", "deleteAccountTips": "After deleting the account, all your information and related records will be completely deleted from the platform, and can not be recovered, delete or not", - - "humanFace":"Human Face", - "monitoring":"Monitoring", - "videoLog":"Video Log", - "messageReminding":"Message Reminding", - "superAdmin":"Super Admin", - "normalUser":"Normal User", - "gatewayDevice":"Gateway Device", - - "illumination":"Illumination", - "doorOpener":"Door Opener", - "faceUnlocks":"Face Unlocks", - "catEyeSet":"Cat Eye Set", - "openingDirectionSet":"Opening Direction Set", - "motorPowerSetting":"MotorPower Setting", - "bluetoothBroadcast":"Bluetooth Broadcast", - "whetherInternetRequiredWhenUnlocking":"If Internet Is Required When Unlocking", - - "selectTheLockToJoinTheGroup":"Select the lock to join the group", - "lockTrCount":"Lock Count", - "xiaomiIOTPlatform":"Xiaomi IOT Platform", - "connectBlueErrorTip":"Not connected to the device, make sure that in the vicinity of the device, the device is not connected and the device is turned on", + "humanFace": "Human Face", + "monitoring": "Monitoring", + "videoLog": "Video Log", + "messageReminding": "Message Reminding", + "superAdmin": "Super Admin", + "normalUser": "Normal User", + "gatewayDevice": "Gateway Device", + "illumination": "Illumination", + "doorOpener": "Door Opener", + "faceUnlocks": "Face Unlocks", + "catEyeSet": "Cat Eye Set", + "openingDirectionSet": "Opening Direction Set", + "motorPowerSetting": "MotorPower Setting", + "bluetoothBroadcast": "Bluetooth Broadcast", + "whetherInternetRequiredWhenUnlocking": "If Internet Is Required When Unlocking", + "selectTheLockToJoinTheGroup": "Select the lock to join the group", + "lockTrCount": "Lock Count", + "xiaomiIOTPlatform": "Xiaomi IOT Platform", + "connectBlueErrorTip": "Not connected to the device, make sure that in the vicinity of the device, the device is not connected and the device is turned on", "pleaseEnterAGroupName": "Please enter a group name", "hint": "Hint", "areYouSureYouWantToDeleteIt": "Are you sure you want to delete it?", - "faceUnlocksSet": "Face Unlocks Set", "automaticBrighteningScreen": "Automatic brightening screen", "sensingDistance": "Sensing distance", @@ -461,61 +441,57 @@ "closeRange": "Close Range", "addAndUseFaceWhenUnlocking": "Add and use face when unlocking", "addAndUseFaceWhenUnlockingTip": "\n1, please try to keep a single person in front of the door operation; \n2, please stand in front of the door lock about 0.5~0.8 meters, facing the door lock; \n3. Please keep your face unobstructed and expose your facial features; \n4. When face recognition is abnormal, you can touch any key on the digital keyboard to restart face recognition manually.", - "second": "S", "motorPowerSettingTip": "Please choose the motor power carefully according to the actual situation of the door lock:", "miniwatt": "miniwatt:", "miniwattTip": "Less power consumption", "highPower": "high-power:", "highPowerTip": "If the lock tongue can not be retracted normally when unlocking, or need to be driven \nHeaven and earth hook, it is recommended to choose high power. At this point, the power consumption will be \nIncrease.", - "openingDirectionSetTip": "Please carefully choose the direction to open the door of your home (if you choose the wrong direction, you will not be able to open and close the door properly) :", "openLeft": "Open Left", "openRight": "Open Right", "judgmentMethod": "Judgment Method:\n", "judgmentMethodContent": "The man stood outside the house, facing the entrance door. \nIf the hinge or shaft of the door is on the left, the door is left open; \nA door is right-open if its hinge or shaft is on the right. \nIf the setting is wrong, it will not open and close the door properly. \nRecommended to be operated by installation or maintenance personnel.", - "customMode": "Custom mode", "videoSlot": "Video slot", - - "密码":"Password", - "卡":"Card", - "指纹":"Fingerprint", - "人脸":"Face", - "配件商城":"Lock Mall", - "公司名称":"Company Name", - "修改公司名字":"Change company name", - "请输入公司名字":"Please nter the company name", - "提示":"Hint", - "是否删除?":"Whether to delete?", - "员工信息":"Staff's Information", - "员工":"Staff", - "打卡方式无效":"The clocking method is invalid", - "中国":"China", - "选择钥匙":"Select the key", - "编辑":"Edit", - "无":"Unhave", - "有":"have", + "密码": "Password", + "卡": "Card", + "指纹": "Fingerprint", + "人脸": "Face", + "配件商城": "Lock Mall", + "公司名称": "Company Name", + "修改公司名字": "Change company name", + "请输入公司名字": "Please nter the company name", + "提示": "Hint", + "是否删除?": "Whether to delete?", + "员工信息": "Staff's Information", + "员工": "Staff", + "打卡方式无效": "The clocking method is invalid", + "中国": "China", + "选择钥匙": "Select the key", + "编辑": "Edit", + "无": "Unhave", + "有": "have", "请输入姓名": "Please enter name", - "获取人脸":"Getting faces", - "选择密码":"Choosing a password", - "选择卡":"Select card", - "选择指纹":"Select fingerprint", - "选择人脸":"Select face", - "员工是否有人脸":"Whether the employee has a face", - "同时删除员工钥匙":"Also delete the employee key", - "删除":"Delet", - "确定要删除员工吗?":"Are you sure you want to delete the employee?", - "月统计":"Monthly statistics", - "迟到":"Be late", - "早退":"Leave early", - "未打卡":"No card punched", - "钥匙将在":"The key will be in", - "天后失效":"Days later invalid", - "锁电量更新时间:":"Lock power update time:", - "新增配件":"Add accessories", - "请在锁旁边完成第一次开锁":"Please complete the first unlock next to the lock", - "正在开锁中...":"Unlocking...", + "获取人脸": "Getting faces", + "选择密码": "Choosing a password", + "选择卡": "Select card", + "选择指纹": "Select fingerprint", + "选择人脸": "Select face", + "员工是否有人脸": "Whether the employee has a face", + "同时删除员工钥匙": "Also delete the employee key", + "删除": "Delet", + "确定要删除员工吗?": "Are you sure you want to delete the employee?", + "月统计": "Monthly statistics", + "迟到": "Be late", + "早退": "Leave early", + "未打卡": "No card punched", + "钥匙将在": "The key will be in", + "天后失效": "Days later invalid", + "锁电量更新时间:": "Lock power update time:", + "新增配件": "Add accessories", + "请在锁旁边完成第一次开锁": "Please complete the first unlock next to the lock", + "正在开锁中...": "Unlocking...", "你的钥匙": "Your key", "常开模式启动!长按闭锁": "Open mode started! Long press to lock", "演示模式": "Demo mode", @@ -614,7 +590,6 @@ "跳过": "Skip", "还未获取到位置信息哦,请耐心等待一下!": "The location information has not been obtained yet, please wait patiently!", "请填写信息": "Please fill in the information", - "有效期": "Validity period", "生效时间": "Effective time", "失效时间": "Expiration time", @@ -704,8 +679,7 @@ "厂商": "Manufacturer", "型号": "Model", "密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。": "After the password is generated, please use it once for activation before 23:59 on the same day, otherwise it will be invalid after 0 o'clock. After the password is activated, it can be used unlimited times within the validity period.", - "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。":"After the password is generated, please use it before 23:59 on the same day, otherwise it will be invalid after 0 o'clock. The clear code is used to clear all the passwords generated before 0 o'clock today.", - + "密码生成后,请在当日23:59前使用,否则过0点后失效。清空码用于清空今天0点之前生成的所有密码。": "After the password is generated, please use it before 23:59 on the same day, otherwise it will be invalid after 0 o'clock. The clear code is used to clear all the passwords generated before 0 o'clock today.", "相机": "camera", "相册": "photos", "读写": "storage", @@ -725,87 +699,93 @@ "当前网络": "Current network", "位置信息": "Location information", "请输入wifi名称": "Please enter the wifi name", - - "虹膜":"iris", - "手掌":"palm", - - "商城":"mall", - "我的":"my", - "微信公众号推送":"Wechat public account", - "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置":"To open wechat to receive alarm messages, you need to pay attention to Skye Smart Lock wechat public account first, please save the QR code and use wechat to scan the Settings", - "蓝牙":"Bluetooth", - "需要访问蓝牙权限才能使用添加钥匙功能的位置信息":"Access to Bluetooth permissions is required to use the location information of the add key function", - "请输入Email":"Please enter Email", - "请输入手机号":"Please enter mobile phone number", - "家人到家":"Family gets home", - "添加家人":"Add family", - "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择":"If the lock is not connected to the Internet, in addition to the electronic key, the password, card, fingerprint and other door reminders can not be sent in time, please choose according to your actual situation", - "消息提醒":"Message reminder", - "开门通知":"Opening notice", - "N天未开门":"N days without opening the door", - "门未关好":"The door is not closed", - "防拆报警":"Tamper alarm", - "低电量提醒":"Low power reminder", - "胁迫开门":"Forced door opening", - "有人按门铃":"Someone rings the doorbell", - "有人出现在门口":"Someone appears at the door", - "提醒方式":"Reminder mode", - "开门方式":"Opening mode", - "请选择":"Please select", - "家人":"Family", - "保存":"Save", - "APP推送":"APP push", - "管理员":"Administrator", - "未启用":"Not enabled", - "已启用":"Enabled", - "省电模式":"Power saving mode", - "逗留抓拍模式":"Stay capture mode", - "实时监控模式":"Real-time monitoring mode", - "自定义模式":"Custom mode", - "秒":"second", - "猫眼设置":"Cat eye setting", - "猫眼工作模式":"Cat eye working mode", - "自动亮屏":"Automatic bright screen", - "亮屏持续时间":"Screen on time", - "逗留警告":"Stay warning", - "异常警告":"Abnormal warning", - "短信提醒":"SMS reminder", - "邮件提醒":"Email reminder", - "N天未开门提醒":"N days did not open the door reminder", - "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网":"When forced to open the lock, the use of coercive fingerprint will trigger the alarm, the alarm message will be pushed to the administrator, the function requires the lock network", - "胁迫指纹":"Stress fingerprint", - "指纹列表":"Fingerprint list", - "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网":"After the above set time, the lock is not opened, the system will send a reminder message to the specified object, this function requires the lock network", - "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。":"After the reminder is enabled, when the lock power is below 20%, 10%, and 5%, the system will send a reminder message to the specified object. Power reading mode: gateway reading or APP reading.", - "门未开时间":"Door not open time", - "添加和使用面容开锁时:":"Add and use Face when unlocking:", - "关锁":"close lock", - "功能":"function", - "配件":"parts", - "云存":"Cloud storage", - "本地":"This locality", - "3天滚动储存":"3 days rolling storage", - "去升级":"Upgrade Now", - "下载列表":"Download list", - "已下载":"Downloaded", - "全部视频":"All videos", - "已为本设备免费提供3大滚动视频储存服务":"Three scrolling video storage services have been provided for this device free of charge", - "视频播放":"Video playback", - "全选":"Select all", - "请选择要删除的视频":"Please select the video you want to delete", - "请选择要下载的视频":"Please select the video you want to download", - "欢迎使用":"Welcome to use", + "虹膜": "iris", + "手掌": "palm", + "商城": "mall", + "我的": "my", + "微信公众号推送": "Wechat public account", + "开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置": "To open wechat to receive alarm messages, you need to pay attention to Skye Smart Lock wechat public account first, please save the QR code and use wechat to scan the Settings", + "蓝牙": "Bluetooth", + "需要访问蓝牙权限才能使用添加钥匙功能的位置信息": "Access to Bluetooth permissions is required to use the location information of the add key function", + "请输入Email": "Please enter Email", + "请输入手机号": "Please enter mobile phone number", + "家人到家": "Family gets home", + "添加家人": "Add family", + "若锁没有联网,除电子钥匙外,密码、卡、指纹等开门提醒无法及时发送,请根据你的实际情况选择": "If the lock is not connected to the Internet, in addition to the electronic key, the password, card, fingerprint and other door reminders can not be sent in time, please choose according to your actual situation", + "消息提醒": "Message reminder", + "开门通知": "Opening notice", + "N天未开门": "N days without opening the door", + "门未关好": "The door is not closed", + "防拆报警": "Tamper alarm", + "低电量提醒": "Low power reminder", + "胁迫开门": "Forced door opening", + "有人按门铃": "Someone rings the doorbell", + "有人出现在门口": "Someone appears at the door", + "提醒方式": "Reminder mode", + "开门方式": "Opening mode", + "请选择": "Please select", + "家人": "Family", + "保存": "Save", + "APP推送": "APP push", + "管理员": "Administrator", + "未启用": "Not enabled", + "已启用": "Enabled", + "省电模式": "Power saving mode", + "逗留抓拍模式": "Stay capture mode", + "实时监控模式": "Real-time monitoring mode", + "自定义模式": "Custom mode", + "秒": "second", + "猫眼设置": "Cat eye setting", + "猫眼工作模式": "Cat eye working mode", + "自动亮屏": "Automatic bright screen", + "亮屏持续时间": "Screen on time", + "逗留警告": "Stay warning", + "异常警告": "Abnormal warning", + "短信提醒": "SMS reminder", + "邮件提醒": "Email reminder", + "N天未开门提醒": "N days did not open the door reminder", + "当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警消息会推送给管理员,该功能需要锁联网": "When forced to open the lock, the use of coercive fingerprint will trigger the alarm, the alarm message will be pushed to the administrator, the function requires the lock network", + "胁迫指纹": "Stress fingerprint", + "指纹列表": "Fingerprint list", + "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网": "After the above set time, the lock is not opened, the system will send a reminder message to the specified object, this function requires the lock network", + "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。": "After the reminder is enabled, when the lock power is below 20%, 10%, and 5%, the system will send a reminder message to the specified object. Power reading mode: gateway reading or APP reading.", + "门未开时间": "Door not open time", + "添加和使用面容开锁时:": "Add and use Face when unlocking:", + "关锁": "close lock", + "功能": "function", + "配件": "parts", + "云存": "Cloud storage", + "本地": "This locality", + "3天滚动储存": "3 days rolling storage", + "去升级": "Upgrade Now", + "下载列表": "Download list", + "已下载": "Downloaded", + "全部视频": "All videos", + "已为本设备免费提供3大滚动视频储存服务": "Three scrolling video storage services have been provided for this device free of charge", + "视频播放": "Video playback", + "全选": "Select all", + "请选择要删除的视频": "Please select the video you want to delete", + "请选择要下载的视频": "Please select the video you want to download", + "欢迎使用": "Welcome to use", "用户协议和隐私政策概要": "Summary of User Agreement and Privacy Policy", "协议概要": "Protocol Summary", - "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读":"Thank you for using this application. We attach great importance to your personal information and privacy protection. Before using this product, please read it carefully", - "《用户协议》":"《User Agreement》", - "和":"and", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读": "Thank you for using this application. We attach great importance to your personal information and privacy protection. Before using this product, please read it carefully", + "《用户协议》": "《User Agreement》", + "和": "and", "《隐私政策》": "《Privacy Policy》", "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "The entire content of. By clicking \"Agree\", you agree and accept all terms. If you choose not to agree, you will not be able to use our products and services and will exit the application.", - "不同意":"Disagree", - "同意":"agree", - "已开通":"Have opened", - "该功能是高级功能,请开通后再使用":"This function is an advanced function. Please enable it before using it", - "常用程序":"Common Programs", - "该锁已被重置":"The lock has been reset" + "不同意": "Disagree", + "同意": "agree", + "已开通": "Have opened", + "该功能是高级功能,请开通后再使用": "This function is an advanced function. Please enable it before using it", + "常用程序": "Common Programs", + "该锁已被重置": "The lock has been reset", + "需要访问读写权限才能使用手动升级固件": "Access to read and write permissions is required to manually upgrade firmware", + "错误D固件,请选择正确的文件": "Wrong firmware, please select the correct file", + "非SYD固件,请选择正确的文件": "Non SYD firmware, please select the correct file", + "文件校验失败 0x01": "File verification failed 0x01", + "解析元数据失败,请选择正确的文件": "Failed to parse metadata, please select the correct file", + "文件校验失败 0x02": "File verification failed 0x02", + "文件校验失败 0x03": "File verification failed 0x03", + "固件升级完成": "Firmware upgrade completed" } diff --git a/star_lock/images/lan/lan_keys.json b/star_lock/images/lan/lan_keys.json index 1d277fc9..b7e541ba 100644 --- a/star_lock/images/lan/lan_keys.json +++ b/star_lock/images/lan/lan_keys.json @@ -806,5 +806,13 @@ "已开通":"已开通", "该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用", "常用程序":"常用程序", - "该锁已被重置":"该锁已被重置" + "该锁已被重置":"该锁已被重置", + "需要访问读写权限才能使用手动升级固件":"需要访问读写权限才能使用手动升级固件", + "错误D固件,请选择正确的文件":"错误固件,请选择正确的文件", + "非SYD固件,请选择正确的文件":"非SYD固件,请选择正确的文件", + "文件校验失败 0x01":"文件校验失败 0x01", + "解析元数据失败,请选择正确的文件":"解析元数据失败,请选择正确的文件", + "文件校验失败 0x02":"文件校验失败 0x02", + "文件校验失败 0x03":"文件校验失败 0x03", + "固件升级完成":"固件升级完成" } diff --git a/star_lock/images/lan/lan_zh.json b/star_lock/images/lan/lan_zh.json index 978de8f5..7b9755f7 100644 --- a/star_lock/images/lan/lan_zh.json +++ b/star_lock/images/lan/lan_zh.json @@ -809,5 +809,13 @@ "已开通":"已开通", "该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用", "常用程序":"常用程序", - "该锁已被重置":"该锁已被重置" + "需要访问读写权限才能使用手动升级固件":"需要访问读写权限才能使用手动升级固件", + "错误D固件,请选择正确的文件":"错误固件,请选择正确的文件", + "非SYD固件,请选择正确的文件":"非SYD固件,请选择正确的文件", + "文件校验失败 0x01":"文件校验失败 0x01", + "解析元数据失败,请选择正确的文件":"解析元数据失败,请选择正确的文件", + "文件校验失败 0x02":"文件校验失败 0x02", + "文件校验失败 0x03":"文件校验失败 0x03", + "固件升级完成":"固件升级完成" + } diff --git a/star_lock/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_logic.dart b/star_lock/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_logic.dart index 6203045a..960a11e1 100644 --- a/star_lock/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_logic.dart +++ b/star_lock/lib/main/lockDetail/lockSet/lockEscalation/lockEscalation_logic.dart @@ -47,7 +47,7 @@ class LockEscalationLogic extends BaseGetXController { //手动升级 Future otaUpdate() async { var status = await PermissionDialog.request( - Permission.storage, '需要访问读写权限才能使用手动升级固件'); + Permission.storage, '需要访问读写权限才能使用手动升级固件'.tr); if (status != true) { return; } @@ -162,7 +162,7 @@ class LockEscalationLogic extends BaseGetXController { // 检查文件头 Future getHeadFile(Uint8List data) async { if (data.length <= 16) { - showToast('错误D固件,请选择正确的文件'); + showToast('错误固件,请选择正确的文件'.tr); return null; } // 检查文件头 @@ -170,11 +170,11 @@ class LockEscalationLogic extends BaseGetXController { try { header = utf8.decode(data.sublist(0, 12)); } catch (e) { - showToast('非SYD固件,请选择正确的文件'); + showToast('非SYD固件,请选择正确的文件'.tr); return null; } if (header != 'SYD-BIN-DATA') { - showToast('非SYD固件,请选择正确的文件'); + showToast('非SYD固件,请选择正确的文件'.tr); return null; } // 解析元数据长度 @@ -184,11 +184,11 @@ class LockEscalationLogic extends BaseGetXController { metaLenList = data.sublist(12, 16); metaLen = ByteData.sublistView(metaLenList).getUint32(0); } catch (e) { - showToast('文件校验失败 0x01'); + showToast('文件校验失败 0x01'.tr); return null; } if (metaLen < 2 || metaLen > 10240) { - showToast('文件校验失败 0x01'); + showToast('文件校验失败 0x01'.tr); return null; } // 读取和解析元数据 @@ -198,13 +198,13 @@ class LockEscalationLogic extends BaseGetXController { metaStrList = data.sublist(16, 16 + metaLen); metaStr = utf8.decode(metaStrList); } catch (e) { - showToast('解析元数据失败,请选择正确的文件'); + showToast('解析元数据失败,请选择正确的文件'.tr); return null; } AppLog.log(metaStr); var meta = jsonDecode(metaStr); if (meta is! Map) { - showToast('解析元数据失败,请选择正确的文件'); + showToast('解析元数据失败,请选择正确的文件'.tr); return null; } return meta..['metaLen'] = metaLen; @@ -219,11 +219,11 @@ class LockEscalationLogic extends BaseGetXController { String md5Str = md5.convert(bin).toString().toUpperCase(); AppLog.log('---> $md5Str ${meta['fwMd5']}'); if (md5Str != meta['fwMd5']) { - showToast('文件校验失败 0x02'); + showToast('文件校验失败 0x02'.tr); return null; } if (bin.length != meta['fwSize']) { - showToast('文件校验失败 0x03'); + showToast('文件校验失败 0x03'.tr); return null; } return bin; @@ -253,7 +253,7 @@ class LockEscalationLogic extends BaseGetXController { processOtaUpgrade(); } else if (reply is ConfirmationOTAUpgradeReply && reply.status == 0x00) { closeOTADAta(); - showToast('固件升级完成'); + showToast('固件升级完成'.tr); } }); } From 026b439549bff9d5c96a203c53920fee3352ce3c Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Tue, 30 Apr 2024 09:32:06 +0800 Subject: [PATCH 05/12] =?UTF-8?q?feat:=E4=BF=AE=E6=94=B9=E9=91=AB=E6=B3=93?= =?UTF-8?q?=E4=BD=B3=E5=85=B3=E4=BA=8E=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lockDetail/lockDetail_page.dart | 2 +- star_lock/lib/mine/about/about_page.dart | 309 ++++++++++-------- 2 files changed, 171 insertions(+), 140 deletions(-) diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart index 9307e4b6..da7878bd 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -251,7 +251,7 @@ class _LockDetailPageState extends State width: 100.r, height: 100.r, decoration: BoxDecoration( - color: Colors.white.withOpacity(0.9), + color: Colors.white, borderRadius: BorderRadius.circular(100.w), boxShadow: [ BoxShadow( diff --git a/star_lock/lib/mine/about/about_page.dart b/star_lock/lib/mine/about/about_page.dart index 17ae37cd..4d1f9a2c 100644 --- a/star_lock/lib/mine/about/about_page.dart +++ b/star_lock/lib/mine/about/about_page.dart @@ -56,148 +56,179 @@ class _AboutPageState extends State { body: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Align( - alignment: Alignment.topRight, - child: GestureDetector( - onTap: logic.handleTap, - child: Container( - color: Colors.transparent, - width: 80.w, - height: 80.h, - ), - ), - ), - SizedBox(height: 70.h), - Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - Image.asset( - F.sw( - defaultCall: () => "images/icon_main_1024.png", - xhjCall: () => "images/icon_main_xhj_1024.png"), - width: 160.w, - height: 160.w), - ]), - SizedBox(height: 20.h), - Text( - "${F.title} $version+$buildNumber", - style: - TextStyle(fontSize: 24.sp, color: AppColors.blackColor), - ), - SizedBox(height: 20.h), - Text( - F.apiPrefix, - style: - TextStyle(fontSize: 24.sp, color: AppColors.blackColor), - ), - SizedBox( - height: 60.h, - ), - CommonItem( - leftTitel: TranslationLoader.lanKeys!.introduce!.tr, - rightTitle: "", - isHaveLine: false, - isHaveDirection: true, - action: () { - Navigator.pushNamed(context, Routers.webviewShowPage, - arguments: { - "url": XSConstantMacro.introduceURL, - "title": '介绍'.tr - }); - }), - Divider( - height: 1, - color: AppColors.greyLineColor, - indent: 20.w, - endIndent: 20.w, - ), - CommonItem( - leftTitel: TranslationLoader.lanKeys!.userAgreement!.tr, - rightTitle: "", - isHaveLine: false, - isHaveDirection: true, - action: () { - Get.toNamed(Routers.webviewShowPage, arguments: { - "url": XSConstantMacro.userAgreementURL, - "title": '用户协议'.tr - }); - }), - Divider( - height: 1, - color: AppColors.greyLineColor, - indent: 20.w, - endIndent: 20.w, - ), - CommonItem( - leftTitel: TranslationLoader.lanKeys!.privacyPolicy!.tr, - rightTitle: "", - isHaveLine: false, - isHaveDirection: true, - action: () { - Navigator.pushNamed(context, Routers.webviewShowPage, - arguments: { - "url": XSConstantMacro.privacyPolicyURL, - "title": '隐私政策'.tr - }); - }), - Divider( - height: 1, - color: AppColors.greyLineColor, - indent: 20.w, - endIndent: 20.w, - ), - CommonItem( - leftTitel: TranslationLoader - .lanKeys!.personalInformationCollectionList!.tr, - rightTitle: "", - isHaveLine: false, - isHaveDirection: true, - action: () { - Navigator.pushNamed(context, Routers.webviewShowPage, - arguments: { - "url": XSConstantMacro.collectionListURL, - "title": '个人信息收集清单'.tr - }); - }), - Divider( - height: 1, - color: AppColors.greyLineColor, - indent: 20.w, - endIndent: 20.w, - ), - CommonItem( - leftTitel: TranslationLoader - .lanKeys!.applicationPermissionDescription!.tr, - rightTitle: "", - isHaveLine: false, - isHaveDirection: true, - action: () { - Navigator.pushNamed(context, Routers.webviewShowPage, - arguments: { - "url": XSConstantMacro.appPermissionDescURL, - "title": '应用权限说明'.tr - }); - }), - Divider( - height: 1, - color: AppColors.greyLineColor, - indent: 20.w, - endIndent: 20.w, - ), - CommonItem( - leftTitel: TranslationLoader - .lanKeys!.thirdPartyInformationSharingList!.tr, - rightTitle: "", - isHaveLine: false, - isHaveDirection: true, - action: () { - Navigator.pushNamed(context, Routers.webviewShowPage, - arguments: { - "url": XSConstantMacro.thirdPartyInfShareListURL, - "title": '第三方信息共享清单'.tr - }); - }), + F.sw( + defaultCall: () => logoView(), + xhjCall: () => const SizedBox()), + listView(), + F.sw( + defaultCall: () => const SizedBox(), + xhjCall: () => logoView()), ], ), ); }); } + + //列表 + Widget listView() { + Widget view = Column( + children: [ + CommonItem( + leftTitel: TranslationLoader.lanKeys!.introduce!.tr, + rightTitle: "", + isHaveLine: false, + isHaveDirection: true, + action: () { + Navigator.pushNamed(context, Routers.webviewShowPage, arguments: { + "url": XSConstantMacro.introduceURL, + "title": '介绍'.tr + }); + }), + Divider( + height: 1, + color: AppColors.greyLineColor, + indent: 20.w, + endIndent: 20.w, + ), + CommonItem( + leftTitel: TranslationLoader.lanKeys!.userAgreement!.tr, + rightTitle: "", + isHaveLine: false, + isHaveDirection: true, + action: () { + Get.toNamed(Routers.webviewShowPage, arguments: { + "url": XSConstantMacro.userAgreementURL, + "title": '用户协议'.tr + }); + }), + Divider( + height: 1, + color: AppColors.greyLineColor, + indent: 20.w, + endIndent: 20.w, + ), + CommonItem( + leftTitel: TranslationLoader.lanKeys!.privacyPolicy!.tr, + rightTitle: "", + isHaveLine: false, + isHaveDirection: true, + action: () { + Navigator.pushNamed(context, Routers.webviewShowPage, arguments: { + "url": XSConstantMacro.privacyPolicyURL, + "title": '隐私政策'.tr + }); + }), + Divider( + height: 1, + color: AppColors.greyLineColor, + indent: 20.w, + endIndent: 20.w, + ), + CommonItem( + leftTitel: TranslationLoader + .lanKeys!.personalInformationCollectionList!.tr, + rightTitle: "", + isHaveLine: false, + isHaveDirection: true, + action: () { + Navigator.pushNamed(context, Routers.webviewShowPage, arguments: { + "url": XSConstantMacro.collectionListURL, + "title": '个人信息收集清单'.tr + }); + }), + Divider( + height: 1, + color: AppColors.greyLineColor, + indent: 20.w, + endIndent: 20.w, + ), + CommonItem( + leftTitel: + TranslationLoader.lanKeys!.applicationPermissionDescription!.tr, + rightTitle: "", + isHaveLine: false, + isHaveDirection: true, + action: () { + Navigator.pushNamed(context, Routers.webviewShowPage, arguments: { + "url": XSConstantMacro.appPermissionDescURL, + "title": '应用权限说明'.tr + }); + }), + Divider( + height: 1, + color: AppColors.greyLineColor, + indent: 20.w, + endIndent: 20.w, + ), + CommonItem( + leftTitel: + TranslationLoader.lanKeys!.thirdPartyInformationSharingList!.tr, + rightTitle: "", + isHaveLine: false, + isHaveDirection: true, + action: () { + Navigator.pushNamed(context, Routers.webviewShowPage, arguments: { + "url": XSConstantMacro.thirdPartyInfShareListURL, + "title": '第三方信息共享清单'.tr + }); + }), + ], + ); + view = F.sw( + defaultCall: () => view, + xhjCall: () => Container( + margin: EdgeInsets.only(top: 20.h, left: 20.w, right: 20.w), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(20.r))), + child: ClipRRect( + borderRadius: BorderRadius.circular(20.r), + child: view, + ), + )); + return view; + } + + //图标 + Widget logoView() { + return GetBuilder(builder: (AboutConsole logic) { + return Padding( + padding: EdgeInsets.only(top: 70.h, bottom: 60.h), + child: Column( + children: [ + Align( + alignment: Alignment.topRight, + child: GestureDetector( + onTap: logic.handleTap, + child: Container( + color: Colors.transparent, + width: 80.w, + height: 80.h, + ), + ), + ), + ClipRRect( + borderRadius: BorderRadius.circular(20.r), + child: Image.asset( + F.sw( + defaultCall: () => "images/icon_main_1024.png", + xhjCall: () => "images/icon_main_xhj_1024.png"), + width: 160.w, + height: 160.w), + ), + SizedBox(height: 20.h), + Text( + "${F.title} $version+$buildNumber", + style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor), + ), + SizedBox(height: 20.h), + Text( + F.apiPrefix, + style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor), + ), + ], + ), + ); + }); + } } From 7db613f5d719bd3cee810887cf83d135dda26d60 Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Tue, 30 Apr 2024 09:51:12 +0800 Subject: [PATCH 06/12] =?UTF-8?q?feat:=E4=BF=AE=E6=94=B9=E9=91=AB=E6=B3=93?= =?UTF-8?q?=E4=BD=B3=E6=9B=B4=E5=A4=9A=E8=AE=BE=E7=BD=AE=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/lib/mine/about/about_page.dart | 14 ++++++- .../mine/mineSet/mineSet/mineSet_page.dart | 39 ++++++++++++++++--- star_lock/lib/tools/submitBtn.dart | 4 +- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/star_lock/lib/mine/about/about_page.dart b/star_lock/lib/mine/about/about_page.dart index 4d1f9a2c..221a6c09 100644 --- a/star_lock/lib/mine/about/about_page.dart +++ b/star_lock/lib/mine/about/about_page.dart @@ -49,10 +49,20 @@ class _AboutPageState extends State { builder: (AboutConsole logic) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, - appBar: TitleAppBar( + appBar: F.sw( + defaultCall: () => TitleAppBar( barTitle: TranslationLoader.lanKeys!.about!.tr, haveBack: true, - backgroundColor: AppColors.mainColor), + backgroundColor: AppColors.mainColor, + ), + xhjCall: () => TitleAppBar( + barTitle: TranslationLoader.lanKeys!.about!.tr, + haveBack: true, + backgroundColor: Colors.white, + iconColor: AppColors.blackColor, + titleColor: AppColors.blackColor, + ), + ), body: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ diff --git a/star_lock/lib/mine/mineSet/mineSet/mineSet_page.dart b/star_lock/lib/mine/mineSet/mineSet/mineSet_page.dart index eaad3dc3..01181525 100644 --- a/star_lock/lib/mine/mineSet/mineSet/mineSet_page.dart +++ b/star_lock/lib/mine/mineSet/mineSet/mineSet_page.dart @@ -53,16 +53,44 @@ class _MineSetPageState extends State with WidgetsBindingObserver { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, - appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.moreSet!.tr, - haveBack: true, - backgroundColor: AppColors.mainColor), + appBar: F.sw( + defaultCall: () => TitleAppBar( + barTitle: TranslationLoader.lanKeys!.moreSet!.tr, + haveBack: true, + backgroundColor: AppColors.mainColor, + ), + xhjCall: () => TitleAppBar( + barTitle: TranslationLoader.lanKeys!.moreSet!.tr, + haveBack: true, + backgroundColor: Colors.white, + iconColor: AppColors.blackColor, + titleColor: AppColors.blackColor, + )), body: SingleChildScrollView( - child: getListDataView(), + child: styleHierarchy(), ), ); } + //样式层级 + Widget styleHierarchy() { + Widget view = getListDataView(); + view = F.sw( + defaultCall: () => view, + xhjCall: () => Container( + margin: EdgeInsets.only( + top: 20.h, left: 20.w, right: 20.w, bottom: 40.h), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(20.r))), + child: ClipRRect( + borderRadius: BorderRadius.circular(20.r), + child: view, + ), + )); + return view; + } + Widget getListDataView() { return Column( children: [ @@ -283,6 +311,7 @@ class _MineSetPageState extends State with WidgetsBindingObserver { SubmitBtn( btnName: TranslationLoader.lanKeys!.logout!.tr, isDelete: true, + padding: EdgeInsets.symmetric(horizontal: 15.w), onClick: () { //退出登录 ShowTipView().showIosTipWithContentDialog("确定要退出吗?".tr, () { diff --git a/star_lock/lib/tools/submitBtn.dart b/star_lock/lib/tools/submitBtn.dart index d126817c..3aac511b 100644 --- a/star_lock/lib/tools/submitBtn.dart +++ b/star_lock/lib/tools/submitBtn.dart @@ -31,6 +31,7 @@ class SubmitBtn extends StatelessWidget { bool? isDelete; bool? isDisabled; + SubmitBtn({ Key? key, required this.btnName, @@ -48,9 +49,10 @@ class SubmitBtn extends StatelessWidget { @override Widget build(BuildContext context) { - return SizedBox( + return Container( width: ScreenUtil().screenWidth - 40.w, height: 60.h, + padding: padding, child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: isDisabled == false From aa4e7416743754e51413c430eaf6a63bae40cc1b Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Tue, 30 Apr 2024 10:55:48 +0800 Subject: [PATCH 07/12] =?UTF-8?q?feat:=E4=BF=AE=E6=94=B9=E9=91=AB=E6=B3=93?= =?UTF-8?q?=E4=BD=B3=E4=BF=AE=E6=94=B9=E6=98=B5=E7=A7=B0/=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=89=8B=E6=9C=BA=E5=8F=B7/=E9=82=AE=E7=AE=B1/?= =?UTF-8?q?=E9=87=8D=E7=BD=AE=E5=AF=86=E7=A0=81/=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E9=97=AE=E9=A2=98/=E8=AE=BE=E7=BD=AE/=E5=85=B3=E4=BA=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mineUnbindPhoneOrEmail_page.dart | 15 +- .../minePersonInfoEditAccountNext_page.dart | 15 +- .../minePersonInfoEditName_page.dart | 115 ++++++++++----- .../mineBindPhoneOrEmail_page.dart | 27 +++- .../minePersonInfoResetPassword_page.dart | 139 +++++++++++------- .../minePersonInfoSetSafetyProblem_page.dart | 30 +++- star_lock/lib/tools/submitBtn.dart | 1 - 7 files changed, 240 insertions(+), 102 deletions(-) diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_page.dart index 20ba8973..25bbe8ae 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_logic.dart'; import 'package:star_lock/tools/tf_input_haveBorder.dart'; @@ -26,10 +27,20 @@ class _MineUnbindPhoneOrEmailState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, - appBar: TitleAppBar( + appBar: F.sw( + defaultCall: () => TitleAppBar( barTitle: TranslationLoader.lanKeys!.modifyAccount!.tr, haveBack: true, - backgroundColor: AppColors.mainColor), + backgroundColor: AppColors.mainColor, + ), + xhjCall: () => TitleAppBar( + barTitle: TranslationLoader.lanKeys!.modifyAccount!.tr, + haveBack: true, + backgroundColor: Colors.white, + iconColor: AppColors.blackColor, + titleColor: AppColors.blackColor, + ), + ), body: Column( children: [ Container( diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart index fc75d1fd..b3362b9a 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_logic.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/submitBtn.dart'; @@ -25,10 +26,20 @@ class _MinePersonInfoEditAccountNextPageState Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, - appBar: TitleAppBar( + appBar: F.sw( + defaultCall: () => TitleAppBar( barTitle: TranslationLoader.lanKeys!.modifyAccount!.tr, haveBack: true, - backgroundColor: AppColors.mainColor), + backgroundColor: AppColors.mainColor, + ), + xhjCall: () => TitleAppBar( + barTitle: TranslationLoader.lanKeys!.modifyAccount!.tr, + haveBack: true, + backgroundColor: Colors.white, + iconColor: AppColors.blackColor, + titleColor: AppColors.blackColor, + ), + ), body: Column( children: [ Container( diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_page.dart index b843c979..f60d3493 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditName/MinePersonInfoEditName_logic.dart'; import '../../../app_settings/app_colors.dart'; @@ -25,45 +26,89 @@ class _MinePersonInfoEditNamePageState @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Colors.white, - appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.changeNickName!.tr, - haveBack: true, - backgroundColor: AppColors.mainColor, - actionsList: [ - TextButton( - child: Text( - TranslationLoader.lanKeys!.save!.tr, - style: TextStyle(color: Colors.white, fontSize: 24.sp), + backgroundColor: AppColors.greyBackgroundColor, + appBar: F.sw( + defaultCall: () => TitleAppBar( + barTitle: TranslationLoader.lanKeys!.changeNickName!.tr, + haveBack: true, + backgroundColor: AppColors.mainColor, + actionsList: [ + TextButton( + child: Text( + TranslationLoader.lanKeys!.save!.tr, + style: TextStyle(color: Colors.white, fontSize: 24.sp), + ), + onPressed: () { + if (state.nickNameIsOK == false) { + logic.showToast("请输入昵称"); + } else { + logic.updateUserInfoRequest(); + } + }, ), - onPressed: () { - if (state.nickNameIsOK == false) { - logic.showToast("请输入昵称"); - } else { - logic.updateUserInfoRequest(); - } - }, - ), - ], + ], + ), + xhjCall: () => TitleAppBar( + barTitle: TranslationLoader.lanKeys!.changeNickName!.tr, + haveBack: true, + backgroundColor: Colors.white, + iconColor: AppColors.blackColor, + titleColor: AppColors.blackColor, + actionsList: [ + TextButton( + child: Text( + TranslationLoader.lanKeys!.save!.tr, + style: + TextStyle(color: AppColors.blackColor, fontSize: 24.sp), + ), + onPressed: () { + if (state.nickNameIsOK == false) { + logic.showToast("请输入昵称"); + } else { + logic.updateUserInfoRequest(); + } + }, + ), + ], + ), ), body: Container( padding: EdgeInsets.all(15.w), - child: Column( - children: [ - LoginInput( - controller: state.nickNameController, - onchangeAction: (textStr) { - logic.checkNext(state.nickNameController); - }, - isPwd: false, - leftWidget: SizedBox(width: 15.w), - hintText: - "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.nickName!.tr}", - inputFormatters: [ - LengthLimitingTextInputFormatter(20), - ]), - ], - ), + child: listView(), )); } + + Widget listView() { + Widget view = Column( + mainAxisSize: MainAxisSize.min, + children: [ + LoginInput( + controller: state.nickNameController, + onchangeAction: (textStr) { + logic.checkNext(state.nickNameController); + }, + isPwd: false, + leftWidget: SizedBox(width: 15.w), + hintText: + "${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.nickName!.tr}", + inputFormatters: [ + LengthLimitingTextInputFormatter(20), + ]), + ], + ); + view = F.sw( + defaultCall: () => view, + xhjCall: () => Container( + margin: EdgeInsets.only(top: 20.h, left: 16.w, right: 16.w), + padding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 16.w), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(20.r))), + child: ClipRRect( + borderRadius: BorderRadius.circular(20.r), + child: view, + ), + )); + return view; + } } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart index af0a0c97..b1b89894 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/mineBindPhoneOrEmail_logic.dart'; import '../../../appRouters.dart'; @@ -28,12 +29,24 @@ class _MineBindPhoneOrEmailPageState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, - appBar: TitleAppBar( + appBar: F.sw( + defaultCall: () => TitleAppBar( barTitle: state.channel.value == "1" ? TranslationLoader.lanKeys!.mobileNumber!.tr : TranslationLoader.lanKeys!.email!.tr, haveBack: true, - backgroundColor: AppColors.mainColor), + backgroundColor: AppColors.mainColor, + ), + xhjCall: () => TitleAppBar( + barTitle: state.channel.value == "1" + ? TranslationLoader.lanKeys!.mobileNumber!.tr + : TranslationLoader.lanKeys!.email!.tr, + haveBack: true, + backgroundColor: Colors.white, + iconColor: AppColors.blackColor, + titleColor: AppColors.blackColor, + ), + ), body: Container( color: Colors.white, padding: EdgeInsets.only(top: 10.h, left: 30.w, right: 30.w), @@ -58,11 +71,12 @@ class _MineBindPhoneOrEmailPageState extends State { rightWidget: Text( '${state.countryName.value} +${state.countryCode.value}', textAlign: TextAlign.end, - style: - TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor), + style: TextStyle( + fontSize: 22.sp, color: AppColors.darkGrayTextColor), ), action: () async { - var result = await Get.toNamed(Routers.selectCountryRegionPage); + var result = + await Get.toNamed(Routers.selectCountryRegionPage); if (result != null) { result as Map; state.countryCode.value = result['code']; @@ -105,7 +119,8 @@ class _MineBindPhoneOrEmailPageState extends State { ), Obx(() => GestureDetector( onTap: () { - if (state.accountIsOK.value && state.canResend.value) { + if (state.accountIsOK.value && + state.canResend.value) { logic.sendValidationCode(); } }, diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart index 83fb131a..15fe701b 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart @@ -1,8 +1,8 @@ - import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_logic.dart'; import '../../../appRouters.dart'; @@ -29,64 +29,25 @@ class _MinePersonInfoResetPasswordPageState Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, - appBar: TitleAppBar( + appBar: F.sw( + defaultCall: () => TitleAppBar( barTitle: TranslationLoader.lanKeys!.resetPasswords!.tr, haveBack: true, - backgroundColor: AppColors.mainColor), + backgroundColor: AppColors.mainColor, + ), + xhjCall: () => TitleAppBar( + barTitle: TranslationLoader.lanKeys!.resetPasswords!.tr, + haveBack: true, + backgroundColor: Colors.white, + iconColor: AppColors.blackColor, + titleColor: AppColors.blackColor, + ), + ), body: Container( margin: EdgeInsets.only(left: 30.w, right: 30.w), child: Column( children: [ - LoginInput( - controller: state.oldPwdController, - onchangeAction: (textStr) { - logic.changeInput(state.oldPwdController); - }, - isPwd: true, - leftWidget: Text( - "${TranslationLoader.lanKeys!.originalPassword!.tr} ", - style: TextStyle(fontSize: 22.sp), - ), - hintText: "", - inputFormatters: [ - LengthLimitingTextInputFormatter(20), - ]), - LoginInput( - controller: state.newPwdController, - onchangeAction: (textStr) { - logic.changeInput(state.newPwdController); - }, - isPwd: true, - leftWidget: Text( - "${TranslationLoader.lanKeys!.newPassword!.tr} ", - style: TextStyle(fontSize: 22.sp), - ), - hintText: "", - inputFormatters: [ - LengthLimitingTextInputFormatter(20), - ]), - LoginInput( - controller: state.surePwdController, - onchangeAction: (textStr) { - logic.changeInput(state.surePwdController); - }, - isPwd: true, - // isHaveLeftWidget: false, - leftWidget: Text( - "${TranslationLoader.lanKeys!.surePassword!.tr} ", - style: TextStyle(fontSize: 22.sp), - ), - hintText: "", - inputFormatters: [ - LengthLimitingTextInputFormatter(20), - ]), - Container( - width: 1.sw, - padding: EdgeInsets.only(top: 15.h, bottom: 10.h), - child: Text( - TranslationLoader.lanKeys!.registerPasswordTip!.tr, - style: TextStyle( - fontSize: 18.w, color: AppColors.darkGrayTextColor))), + loginView(), SizedBox(height: 50.w), Obx(() => SubmitBtn( btnName: TranslationLoader.lanKeys!.save!.tr, @@ -123,4 +84,76 @@ class _MinePersonInfoResetPasswordPageState ), )); } + + Widget loginView() { + Widget view = Column( + children: [ + LoginInput( + controller: state.oldPwdController, + onchangeAction: (textStr) { + logic.changeInput(state.oldPwdController); + }, + isPwd: true, + leftWidget: Text( + "${TranslationLoader.lanKeys!.originalPassword!.tr} ", + style: TextStyle(fontSize: 22.sp), + ), + hintText: "", + inputFormatters: [ + LengthLimitingTextInputFormatter(20), + ]), + LoginInput( + controller: state.newPwdController, + onchangeAction: (textStr) { + logic.changeInput(state.newPwdController); + }, + isPwd: true, + leftWidget: Text( + "${TranslationLoader.lanKeys!.newPassword!.tr} ", + style: TextStyle(fontSize: 22.sp), + ), + hintText: "", + inputFormatters: [ + LengthLimitingTextInputFormatter(20), + ]), + LoginInput( + controller: state.surePwdController, + onchangeAction: (textStr) { + logic.changeInput(state.surePwdController); + }, + isPwd: true, + // isHaveLeftWidget: false, + leftWidget: Text( + "${TranslationLoader.lanKeys!.surePassword!.tr} ", + style: TextStyle(fontSize: 22.sp), + ), + hintText: "", + inputFormatters: [ + LengthLimitingTextInputFormatter(20), + ]), + Container( + width: 1.sw, + padding: EdgeInsets.only(top: 15.h, bottom: 10.h), + child: Text(TranslationLoader.lanKeys!.registerPasswordTip!.tr, + style: TextStyle( + fontSize: 18.w, color: AppColors.darkGrayTextColor))), + ], + ); + view = F.sw( + defaultCall: () => view, + xhjCall: () => Container( + margin: EdgeInsets.only( + top: 20.h, + ), + padding: EdgeInsets.all(16.r), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(20.r))), + child: ClipRRect( + borderRadius: BorderRadius.circular(20.r), + child: view, + ), + )); + return view; + } } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart index 1f539807..6ff6bdb0 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_entity.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_logic.dart'; import 'package:star_lock/tools/custom_bottom_sheet.dart'; @@ -35,10 +36,20 @@ class _MinePersonInfoSetSafetyProblemPageState Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, - appBar: TitleAppBar( + appBar: F.sw( + defaultCall: () => TitleAppBar( barTitle: TranslationLoader.lanKeys!.safetyProblem!.tr, haveBack: true, - backgroundColor: AppColors.mainColor), + backgroundColor: AppColors.mainColor, + ), + xhjCall: () => TitleAppBar( + barTitle: TranslationLoader.lanKeys!.safetyProblem!.tr, + haveBack: true, + backgroundColor: Colors.white, + iconColor: AppColors.blackColor, + titleColor: AppColors.blackColor, + ), + ), body: ListView( children: [ Container( @@ -93,7 +104,7 @@ class _MinePersonInfoSetSafetyProblemPageState Widget _safityProblemItem(String problemTitle, String answerTitle, TextEditingController controller, Function() action) { - return Column( + Widget view = Column( children: [ CommonItem( leftTitel: problemTitle, @@ -125,6 +136,19 @@ class _MinePersonInfoSetSafetyProblemPageState ) ], ); + view = F.sw( + defaultCall: () => view, + xhjCall: () => Container( + margin: EdgeInsets.only(top: 20.h, left: 20.w, right: 20.w), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(20.r))), + child: ClipRRect( + borderRadius: BorderRadius.circular(20.r), + child: view, + ), + )); + return view; } Future _selectProblemBottomSheet(List dataList, int problemIndex) async { diff --git a/star_lock/lib/tools/submitBtn.dart b/star_lock/lib/tools/submitBtn.dart index 3aac511b..2fea82d7 100644 --- a/star_lock/lib/tools/submitBtn.dart +++ b/star_lock/lib/tools/submitBtn.dart @@ -52,7 +52,6 @@ class SubmitBtn extends StatelessWidget { return Container( width: ScreenUtil().screenWidth - 40.w, height: 60.h, - padding: padding, child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: isDisabled == false From 9873536b6e059f4d031fb30db7876a63968a86b4 Mon Sep 17 00:00:00 2001 From: Daisy <> Date: Tue, 30 Apr 2024 11:24:47 +0800 Subject: [PATCH 08/12] =?UTF-8?q?1=EF=BC=8C=E6=B6=88=E6=81=AF=E6=8F=90?= =?UTF-8?q?=E9=86=92=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E=E9=9C=80=E8=81=94?= =?UTF-8?q?=E7=BD=91=E6=8F=90=E7=A4=BA=E8=AF=AD=202=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E9=AB=98=E7=BA=A7=E5=8A=9F=E8=83=BD=E8=B4=AD=E4=B9=B0?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=8E=A5=E5=8F=A3=E5=AF=B9=E6=8E=A5=203?= =?UTF-8?q?=EF=BC=8C=E5=B7=B2=E5=BC=80=E9=80=9A=E9=AB=98=E7=BA=A7=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=86=E4=B8=8E=E4=BC=98?= =?UTF-8?q?=E5=8C=96=204=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=B7=B2=E5=BC=80?= =?UTF-8?q?=E9=80=9A=E9=AB=98=E7=BA=A7=E5=8A=9F=E8=83=BD=E7=9A=84=E8=B4=AD?= =?UTF-8?q?=E4=B9=B0=E8=AE=B0=E5=BD=95=E6=8E=A5=E5=8F=A3=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E4=B8=8E=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/images/lan/lan_en.json | 3 +- star_lock/images/lan/lan_keys.json | 3 +- star_lock/images/lan/lan_zh.json | 3 +- star_lock/lib/appRouters.dart | 8 +- .../msgNotification/msgNotification_page.dart | 4 + .../advancedFunctionRecord_entity.dart | 128 ++++++++++++++++++ .../advancedFunctionRecord_logic.dart | 20 +++ .../advancedFunctionRecord_page.dart | 97 +++++++++++++ .../advancedFunctionRecord_state.dart | 6 + ...valueAddedServicesHighFunction_entity.dart | 64 +++++++++ .../valueAddedServicesHighFunction_logic.dart | 5 +- .../valueAddedServicesHighFunction_page.dart | 91 +++++++------ .../valueAddedServicesHighFunction_state.dart | 6 +- star_lock/lib/network/api_provider.dart | 19 ++- star_lock/lib/network/api_repository.dart | 18 ++- 15 files changed, 424 insertions(+), 51 deletions(-) create mode 100644 star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_entity.dart create mode 100644 star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_logic.dart create mode 100644 star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_page.dart create mode 100644 star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_state.dart create mode 100644 star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_entity.dart diff --git a/star_lock/images/lan/lan_en.json b/star_lock/images/lan/lan_en.json index e5f2ae84..18bdceba 100644 --- a/star_lock/images/lan/lan_en.json +++ b/star_lock/images/lan/lan_en.json @@ -807,5 +807,6 @@ "已开通":"Have opened", "该功能是高级功能,请开通后再使用":"This function is an advanced function. Please enable it before using it", "常用程序":"Common Programs", - "该锁已被重置":"The lock has been reset" + "该锁已被重置":"The lock has been reset", + "记录":"Record" } diff --git a/star_lock/images/lan/lan_keys.json b/star_lock/images/lan/lan_keys.json index 1d277fc9..fb86f8c0 100644 --- a/star_lock/images/lan/lan_keys.json +++ b/star_lock/images/lan/lan_keys.json @@ -806,5 +806,6 @@ "已开通":"已开通", "该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用", "常用程序":"常用程序", - "该锁已被重置":"该锁已被重置" + "该锁已被重置":"该锁已被重置", + "记录":"记录" } diff --git a/star_lock/images/lan/lan_zh.json b/star_lock/images/lan/lan_zh.json index 978de8f5..a220789a 100644 --- a/star_lock/images/lan/lan_zh.json +++ b/star_lock/images/lan/lan_zh.json @@ -809,5 +809,6 @@ "已开通":"已开通", "该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用", "常用程序":"常用程序", - "该锁已被重置":"该锁已被重置" + "该锁已被重置":"该锁已被重置", + "记录":"记录" } diff --git a/star_lock/lib/appRouters.dart b/star_lock/lib/appRouters.dart index e4a5c9f0..09da688d 100644 --- a/star_lock/lib/appRouters.dart +++ b/star_lock/lib/appRouters.dart @@ -53,6 +53,7 @@ import 'package:star_lock/mine/mineSet/transferSmartLock/recipientInformation/re import 'package:star_lock/mine/mineSet/transferSmartLock/selectBranch/selectBranch_page.dart'; import 'package:star_lock/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_page.dart'; import 'package:star_lock/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_page.dart'; +import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_page.dart'; import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRecord/value_added_services_record_page.dart'; import 'common/safetyVerification/safetyVerification_page.dart'; @@ -447,6 +448,8 @@ abstract class Routers { static const seletKeyCyclicDatePage = '/SeletKeyCyclicDatePage'; // 电子钥匙、授权管理员、卡、指纹、遥控等添加添加循环日期公共界面 static const advancedFeaturesWebPage = '/advancedFeaturesWebPage'; // 高级功能 + static const advancedFunctionRecordPage = + '/advancedFunctionRecordPage'; //高级功能购买记录 } abstract class AppRouters { @@ -1068,6 +1071,9 @@ abstract class AppRouters { GetPage(name: Routers.addPalmPage, page: (() => const AddPalmPage())), GetPage( name: Routers.advancedFeaturesWebPage, - page: (() => AdvancedFeaturesWebPage())) + page: (() => AdvancedFeaturesWebPage())), + GetPage( + name: Routers.advancedFunctionRecordPage, + page: (() => const AdvancedFunctionRecordPage())), ]; } diff --git a/star_lock/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_page.dart b/star_lock/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_page.dart index 50d4156d..30959240 100644 --- a/star_lock/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_page.dart +++ b/star_lock/lib/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_page.dart @@ -152,6 +152,10 @@ class _MsgNotificationPageState extends State { SizedBox(width: 60.w, height: 50.h, child: _switch(4)))), SizedBox( height: 60.h, + ), + Text( + '此模块功能需要锁联网后设置方可生效', + style: TextStyle(fontSize: 20.sp), ) ], ); diff --git a/star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_entity.dart b/star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_entity.dart new file mode 100644 index 00000000..22c82b0e --- /dev/null +++ b/star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_entity.dart @@ -0,0 +1,128 @@ +class AdvancedFunctionRecordEntity { + int? errorCode; + String? description; + String? errorMsg; + Data? data; + + AdvancedFunctionRecordEntity( + {this.errorCode, this.description, this.errorMsg, this.data}); + + AdvancedFunctionRecordEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + data = json['data'] != null ? Data.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class Data { + int? pageNo; + int? pageSize; + int? total; + List? recordList; + + Data({this.pageNo, this.pageSize, this.total, this.recordList}); + + Data.fromJson(Map json) { + pageNo = json['pageNo']; + pageSize = json['pageSize']; + total = json['total']; + if (json['list'] != null) { + recordList = []; + json['list'].forEach((v) { + recordList!.add(RecordItem.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = {}; + data['pageNo'] = pageNo; + data['pageSize'] = pageSize; + data['total'] = total; + if (recordList != null) { + data['list'] = recordList!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class RecordItem { + int? id; + int? userId; + String? orderNumber; + String? type; + int? recordType; + int? smsCount; + int? emailCount; + int? cloudauthCount; + int? vipLockCount; + int? vipYear; + int? isApply; + String? money; + String? createdAt; + String? updatedAt; + + RecordItem( + {this.id, + this.userId, + this.orderNumber, + this.type, + this.recordType, + this.smsCount, + this.emailCount, + this.cloudauthCount, + this.vipLockCount, + this.vipYear, + this.isApply, + this.money, + this.createdAt, + this.updatedAt}); + + RecordItem.fromJson(Map json) { + id = json['id']; + userId = json['user_id']; + orderNumber = json['order_number']; + type = json['type']; + recordType = json['record_type']; + smsCount = json['sms_count']; + emailCount = json['email_count']; + cloudauthCount = json['cloudauth_count']; + vipLockCount = json['vip_lock_count']; + vipYear = json['vip_year']; + isApply = json['is_apply']; + money = json['money']; + createdAt = json['created_at']; + updatedAt = json['updated_at']; + } + + Map toJson() { + final Map data = {}; + data['id'] = id; + data['user_id'] = userId; + data['order_number'] = orderNumber; + data['type'] = type; + data['record_type'] = recordType; + data['sms_count'] = smsCount; + data['email_count'] = emailCount; + data['cloudauth_count'] = cloudauthCount; + data['vip_lock_count'] = vipLockCount; + data['vip_year'] = vipYear; + data['is_apply'] = isApply; + data['money'] = money; + data['created_at'] = createdAt; + data['updated_at'] = updatedAt; + return data; + } +} diff --git a/star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_logic.dart b/star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_logic.dart new file mode 100644 index 00000000..c4157d2a --- /dev/null +++ b/star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_logic.dart @@ -0,0 +1,20 @@ +import 'dart:async'; + +import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_state.dart'; + +import '../../../../network/api_repository.dart'; +import '../../../../tools/baseGetXController.dart'; + +class AdvancedFunctionRecordLogic extends BaseGetXController { + AdvancedFunctionRecordState state = AdvancedFunctionRecordState(); + + //获取购买记录列表 + Future getBuyRecordList() async { + var entity = await ApiRepository.to.advancedFunctionBuyRecordList( + type: 'vip', pageNo: 1, recordType: 10, pageSize: 10); + if (entity.errorCode!.codeIsSuccessful) { + state.buyRecordList.value = entity.data!.recordList!; + state.buyRecordList.refresh(); + } + } +} diff --git a/star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_page.dart b/star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_page.dart new file mode 100644 index 00000000..75c6a89f --- /dev/null +++ b/star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_page.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/app_settings/app_colors.dart'; +import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_entity.dart'; +import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_logic.dart'; +import 'package:star_lock/tools/noData.dart'; + +import '../../../tools/titleAppBar.dart'; + +class AdvancedFunctionRecordPage extends StatefulWidget { + const AdvancedFunctionRecordPage({Key? key}) : super(key: key); + + @override + State createState() => + _AdvancedFunctionRecordPageState(); +} + +class _AdvancedFunctionRecordPageState + extends State { + final logic = Get.put(AdvancedFunctionRecordLogic()); + final state = Get.find().state; + + @override + initState() { + super.initState(); + + logic.getBuyRecordList(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + barTitle: "记录".tr, + haveBack: true, + iconColor: Colors.black, + titleColor: Colors.black, + backgroundColor: Colors.white), + body: Container( + color: AppColors.mainBackgroundColor, + child: Obx(() => state.buyRecordList.isEmpty + ? NoData() + : ListView.builder( + itemCount: state.buyRecordList.length, + itemBuilder: (context, index) { + return _recordKeyItem(state.buyRecordList[index]); + }, + )), + )); + } + + Widget _recordKeyItem(RecordItem itemData) { + return Container( + color: Colors.white, + margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 10.h), + padding: + EdgeInsets.only(left: 20.w, right: 20.w, top: 16.h, bottom: 16.h), + child: Column( + children: [ + Row( + children: [ + Text( + itemData.createdAt!.length > 10 + ? itemData.createdAt!.substring(0, 10) + : itemData.createdAt!, + style: TextStyle( + fontSize: 24.sp, + color: AppColors.blackColor, + fontWeight: FontWeight.bold), + ), + Expanded(child: Container()), + Text('¥${itemData.money}', + style: TextStyle( + fontSize: 24.sp, + color: AppColors.blackColor, + fontWeight: FontWeight.bold)), + ], + ), + SizedBox( + height: 8.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('${itemData.vipLockCount}把锁/${itemData.vipYear}年', + textAlign: TextAlign.left, + style: TextStyle( + fontSize: 22.sp, color: AppColors.darkGrayTextColor)) + ], + ), + ], + ), + ); + } +} diff --git a/star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_state.dart b/star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_state.dart new file mode 100644 index 00000000..99e52e5b --- /dev/null +++ b/star_lock/lib/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_state.dart @@ -0,0 +1,6 @@ +import 'package:get/get.dart'; +import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_entity.dart'; + +class AdvancedFunctionRecordState { + var buyRecordList = [].obs; +} diff --git a/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_entity.dart b/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_entity.dart new file mode 100644 index 00000000..5d5cbc08 --- /dev/null +++ b/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_entity.dart @@ -0,0 +1,64 @@ +class ValueAddedServicesHighFunctionEntity { + int? errorCode; + String? description; + String? errorMsg; + Data? data; + + ValueAddedServicesHighFunctionEntity( + {this.errorCode, this.description, this.errorMsg, this.data}); + + ValueAddedServicesHighFunctionEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + data = json['data'] != null ? Data.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class Data { + int? emailCount; + int? smsCount; + int? cloudauthCount; + int? vipStatus; + int? vipLockCount; + String? vipExpireAt; + + Data( + {this.emailCount, + this.smsCount, + this.cloudauthCount, + this.vipStatus, + this.vipLockCount, + this.vipExpireAt}); + + Data.fromJson(Map json) { + emailCount = json['email_count']; + smsCount = json['sms_count']; + cloudauthCount = json['cloudauth_count']; + vipStatus = json['vip_status']; + vipLockCount = json['vip_lock_count']; + vipExpireAt = json['vip_expire_at']; + } + + Map toJson() { + final Map data = {}; + data['email_count'] = emailCount; + data['sms_count'] = smsCount; + data['cloudauth_count'] = cloudauthCount; + data['vip_status'] = vipStatus; + data['vip_lock_count'] = vipLockCount; + data['vip_expire_at'] = vipExpireAt; + return data; + } +} diff --git a/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_logic.dart b/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_logic.dart index deb2c20d..44642afc 100644 --- a/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_logic.dart +++ b/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_logic.dart @@ -12,6 +12,9 @@ class ValueAddedServicesHighFunctionLogic extends BaseGetXController { //获取增值服务用户余量包 Future getServiceUserPackage() async { var entity = await ApiRepository.to.getServiceUserPackage(); - if (entity.errorCode!.codeIsSuccessful) {} + if (entity.errorCode!.codeIsSuccessful) { + state.vipExpireDate.value = entity.data!.vipExpireAt!; + state.vipExpireDate.refresh(); + } } } diff --git a/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_page.dart b/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_page.dart index 7028c33f..dbefc653 100644 --- a/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_page.dart +++ b/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_logic.dart'; import '../../../appRouters.dart'; @@ -33,7 +34,7 @@ class _ValueAddedServicesHighFunctionPageState return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.advancedFunction!.tr, + barTitle: "高级功能".tr, haveBack: true, iconColor: Colors.black, titleColor: Colors.black, @@ -67,52 +68,60 @@ class _ValueAddedServicesHighFunctionPageState topRight: Radius.circular(30.h), ), ), - child: Stack( - alignment: AlignmentDirectional.centerStart, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - // crossAxisAlignment: CrossAxisAlignment.center, + child: GestureDetector( + onTap: () { + Get.toNamed(Routers.advancedFunctionRecordPage); + }, + child: Container( + color: Colors.transparent, + child: Stack( + alignment: AlignmentDirectional.centerStart, children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, + Row( + mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text( - "已开通".tr, - style: - TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "已开通".tr, + style: TextStyle( + fontSize: 24.sp, fontWeight: FontWeight.w600), + ), + SizedBox(height: 5.h), + Obx(() => Text( + "${TranslationLoader.lanKeys!.periodValidity!.tr}:${state.vipExpireDate.value}", + style: TextStyle( + fontSize: 20.sp, fontWeight: FontWeight.w600), + )), + ], // ), - SizedBox(height: 5.h), - Text( - "${TranslationLoader.lanKeys!.periodValidity!.tr}:2023-07-29", - style: - TextStyle(fontSize: 20.sp, fontWeight: FontWeight.w600), - ), - ], // + ], ), + Positioned( + bottom: 0.h, + right: 0.w, + child: Container( + width: 90.w, + height: 50.h, + decoration: BoxDecoration( + color: const Color(0xFFBDCDDF), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30.h), + bottomLeft: Radius.circular(30.h), + ), + ), + child: Center( + child: Text( + TranslationLoader.lanKeys!.record!.tr, + style: TextStyle(fontSize: 22.sp), + )), + )), ], ), - Positioned( - bottom: 0.h, - right: 0.w, - child: Container( - width: 90.w, - height: 50.h, - decoration: BoxDecoration( - color: const Color(0xFFBDCDDF), - borderRadius: BorderRadius.only( - topLeft: Radius.circular(30.h), - bottomLeft: Radius.circular(30.h), - ), - ), - child: Center( - child: Text( - TranslationLoader.lanKeys!.record!.tr, - style: TextStyle(fontSize: 22.sp), - )), - )), - ], + ), ), ); } diff --git a/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_state.dart b/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_state.dart index 53e39692..5e4ba946 100644 --- a/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_state.dart +++ b/star_lock/lib/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_state.dart @@ -1 +1,5 @@ -class ValueAddedServicesHighFunctionState {} +import 'package:get/get.dart'; + +class ValueAddedServicesHighFunctionState { + var vipExpireDate = ''.obs; +} diff --git a/star_lock/lib/network/api_provider.dart b/star_lock/lib/network/api_provider.dart index 897754eb..bd95bf1e 100644 --- a/star_lock/lib/network/api_provider.dart +++ b/star_lock/lib/network/api_provider.dart @@ -785,8 +785,7 @@ class ApiProvider extends BaseProvider { jsonEncode({ 'lockId': lockId, }), - isUnShowLoading: true - ); + isUnShowLoading: true); // 锁诊断 Future setLockDiagnoseData( @@ -1999,6 +1998,22 @@ class ApiProvider extends BaseProvider { // 获取增值服务用户余量包 Future getServiceUserPackage() => post(getServiceUserPackageURL.toUrl, jsonEncode({})); + + // 高级功能购买记录 + Future advancedFunctionBuyRecordList( + String type, + int pageNo, + int recordType, + int pageSize, + ) => + post( + getBuyRecordListURL.toUrl, + jsonEncode({ + 'type': type, + 'pageNo': pageNo, + 'pageSize': pageSize, + 'record_type': recordType, + })); } extension ExtensionString on String { diff --git a/star_lock/lib/network/api_repository.dart b/star_lock/lib/network/api_repository.dart index b6473b10..dff1d189 100644 --- a/star_lock/lib/network/api_repository.dart +++ b/star_lock/lib/network/api_repository.dart @@ -27,6 +27,8 @@ import 'package:star_lock/mine/mineSet/lockUserManage/lockUserManageList/keyList import 'package:star_lock/mine/mineSet/mineSet/userSettingInfoEntity.dart'; import 'package:star_lock/mine/mineSet/mineSet/weChatQRCodeEntity.dart'; import 'package:star_lock/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_entity.dart'; +import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_entity.dart'; +import 'package:star_lock/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_entity.dart'; import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRealName/face_authentication_entity.dart'; import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRecord/buy_record_list_entity.dart'; import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRecord/use_record_list_entity.dart'; @@ -2024,8 +2026,20 @@ class ApiRepository { } // 获取增值服务用户余量包 - Future getServiceUserPackage() async { + Future getServiceUserPackage() async { final res = await apiProvider.getServiceUserPackage(); - return AdvancedFeaturesWebEntity.fromJson(res.body); + return ValueAddedServicesHighFunctionEntity.fromJson(res.body); + } + + // 高级功能购买记录 + Future advancedFunctionBuyRecordList({ + required String type, + required int pageNo, + required int recordType, + required int pageSize, + }) async { + final res = await apiProvider.advancedFunctionBuyRecordList( + type, pageNo, recordType, pageSize); + return AdvancedFunctionRecordEntity.fromJson(res.body); } } From 17bea0f9fa2a30c1dd9bd1f39d67f779caeb86aa Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Tue, 30 Apr 2024 11:33:44 +0800 Subject: [PATCH 09/12] =?UTF-8?q?feat:=E4=BF=AE=E6=94=B9=E9=91=AB=E6=B3=93?= =?UTF-8?q?=E4=BD=B3=E8=AE=BE=E5=A4=87=E5=8C=B9=E9=85=8D=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mine/addLock/addLock/addLock_page.dart | 15 +- .../addLock/nearbyLock/nearbyLock_page.dart | 67 +++-- .../selectLockType/selectLockType_page.dart | 256 +++++++++++------- 3 files changed, 217 insertions(+), 121 deletions(-) diff --git a/star_lock/lib/mine/addLock/addLock/addLock_page.dart b/star_lock/lib/mine/addLock/addLock/addLock_page.dart index d346f578..55dd9fc4 100644 --- a/star_lock/lib/mine/addLock/addLock/addLock_page.dart +++ b/star_lock/lib/mine/addLock/addLock/addLock_page.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; +import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/addLock/addLock/addLock_logic.dart'; import 'package:star_lock/tools/appFirstEnterHandle.dart'; import 'package:star_lock/tools/storage.dart'; @@ -30,10 +31,20 @@ class _AddLockPageState extends State with BaseWidget { builder: (AddLockLogic logic) { return Scaffold( backgroundColor: Colors.white, - appBar: TitleAppBar( + appBar: F.sw( + defaultCall: () => TitleAppBar( barTitle: TranslationLoader.lanKeys!.addLock!.tr, haveBack: true, - backgroundColor: AppColors.mainColor), + backgroundColor: AppColors.mainColor, + ), + xhjCall: () => TitleAppBar( + barTitle: TranslationLoader.lanKeys!.addLock!.tr, + haveBack: true, + backgroundColor: Colors.white, + iconColor: AppColors.blackColor, + titleColor: AppColors.blackColor, + ), + ), body: ListView( // mainAxisAlignment: MainAxisAlignment.center, // crossAxisAlignment: CrossAxisAlignment.center, diff --git a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_page.dart b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_page.dart index bc750610..a474bc92 100644 --- a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_page.dart +++ b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_page.dart @@ -1,10 +1,10 @@ - import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/flavors.dart'; import '../../../app_settings/app_colors.dart'; import '../../../blue/blue_manage.dart'; import '../../../tools/appRouteObserver.dart'; @@ -27,30 +27,48 @@ class _NearbyLockPageState extends State with RouteAware { void initState() { // TODO: implement initState super.initState(); - } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, - appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.nearbyLock!.tr, - haveBack: true, - backgroundColor: AppColors.mainColor, - actionsList: [ - CupertinoActivityIndicator(radius: 18.w, color: Colors.white,), - SizedBox(width: 30.w) - ], + appBar: F.sw( + defaultCall: () => TitleAppBar( + barTitle: TranslationLoader.lanKeys!.nearbyLock!.tr, + haveBack: true, + backgroundColor: AppColors.mainColor, + actionsList: [ + CupertinoActivityIndicator( + radius: 18.w, + color: Colors.white, + ), + SizedBox(width: 30.w) + ]), + xhjCall: () => TitleAppBar( + barTitle: TranslationLoader.lanKeys!.nearbyLock!.tr, + haveBack: true, + backgroundColor: Colors.white, + iconColor: AppColors.blackColor, + titleColor: AppColors.blackColor, + actionsList: [ + CupertinoActivityIndicator( + radius: 18.w, + color: AppColors.blackColor, + ), + SizedBox(width: 30.w) + ]), ), body: Obx(() { return ListView.separated( itemCount: state.devices.length, itemBuilder: (c, index) { - return nearbyLockItem('images/icon_lockGroup_item.png', state.devices[index], () { + return nearbyLockItem( + 'images/icon_lockGroup_item.png', state.devices[index], () { // Navigator.pushNamed(context, Routers.lockAddressPage); // logic.getPublicKey(state.devices[index].serviceUuids[0].toString()); - state.selectLockName.value = state.devices[index].advertisementData.advName; + state.selectLockName.value = + state.devices[index].advertisementData.advName; logic.connect(state.devices[index].advertisementData.advName); // Get.toNamed(Routers.lockAddressGaoDePage); }); @@ -68,9 +86,16 @@ class _NearbyLockPageState extends State with RouteAware { ); } - Widget nearbyLockItem(String lockTypeIcon, ScanResult scanResult, Function() action ) { + Widget nearbyLockItem( + String lockTypeIcon, ScanResult scanResult, Function() action) { return GestureDetector( - onTap: ((scanResult.advertisementData.serviceUuids.isNotEmpty ? scanResult.advertisementData.serviceUuids[0] : "").toString()[33] == "1") ? action : null, + onTap: ((scanResult.advertisementData.serviceUuids.isNotEmpty + ? scanResult.advertisementData.serviceUuids[0] + : "") + .toString()[33] == + "1") + ? action + : null, child: Column( // mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -92,7 +117,18 @@ class _NearbyLockPageState extends State with RouteAware { crossAxisAlignment: CrossAxisAlignment.start, children: [ // 第32、33两位00 表示休眠, 01表示唤醒 - Text(scanResult.advertisementData.advName, style: TextStyle(fontSize: 20.sp, color: ((scanResult.advertisementData.serviceUuids.isNotEmpty ? scanResult.advertisementData.serviceUuids[0] : "").toString()[33] == "1") ? AppColors.blackColor : Colors.grey)), + Text(scanResult.advertisementData.advName, + style: TextStyle( + fontSize: 20.sp, + color: ((scanResult.advertisementData.serviceUuids + .isNotEmpty + ? scanResult.advertisementData + .serviceUuids[0] + : "") + .toString()[33] == + "1") + ? AppColors.blackColor + : Colors.grey)), ], ), SizedBox( @@ -173,5 +209,4 @@ class _NearbyLockPageState extends State with RouteAware { logic.stopScanBlueList(); BlueManage().disconnect(); } - } diff --git a/star_lock/lib/mine/addLock/selectLockType/selectLockType_page.dart b/star_lock/lib/mine/addLock/selectLockType/selectLockType_page.dart index eac43537..56e8b862 100644 --- a/star_lock/lib/mine/addLock/selectLockType/selectLockType_page.dart +++ b/star_lock/lib/mine/addLock/selectLockType/selectLockType_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -18,7 +17,8 @@ class SelectLockTypePage extends StatefulWidget { State createState() => _SelectLockTypePageState(); } -class _SelectLockTypePageState extends State with BaseWidget { +class _SelectLockTypePageState extends State + with BaseWidget { final logic = Get.put(SelectLockTypeLogic()); final state = Get.find().state; @@ -26,121 +26,165 @@ class _SelectLockTypePageState extends State with BaseWidget Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.mainBackgroundColor, - appBar: TitleAppBar( + appBar: F.sw( + defaultCall: () => TitleAppBar( barTitle: TranslationLoader.lanKeys!.selectLockType!.tr, haveBack: true, - backgroundColor: AppColors.mainColor), + backgroundColor: AppColors.mainColor, + ), + xhjCall: () => TitleAppBar( + barTitle: TranslationLoader.lanKeys!.selectLockType!.tr, + haveBack: true, + backgroundColor: Colors.white, + iconColor: AppColors.blackColor, + titleColor: AppColors.blackColor, + ), + ), body: Column( children: [ allLock(), - Expanded( - child: Container( - padding: const EdgeInsets.only(left: 10, right: 10, bottom: 10), - child: GridView.count( - crossAxisCount: 2, - childAspectRatio: 2.83, - crossAxisSpacing: 10, - mainAxisSpacing: 10, - children: [ - lockTypeItem('images/lockType/lockType_doorLock.png', - TranslationLoader.lanKeys!.doorLock!.tr, () { - Navigator.pushNamed(context, Routers.addLockPage, - arguments: {'getLockType': 1}); - }), - if (!F.isLite) - lockTypeItem('images/lockType/lockType_NFCLock.png', - TranslationLoader.lanKeys!.NFCPassiveLock!.tr, () { - // Navigator.pushNamed(context, Routers.addLockPage); - }), - if (!F.isLite) - lockTypeItem('images/lockType/lockType_padlock.png', - TranslationLoader.lanKeys!.padlock!.tr, () { - // Navigator.pushNamed(context, Routers.addLockPage); - }), - lockTypeItem('images/lockType/lockType_safeLock.png', - TranslationLoader.lanKeys!.safeLock!.tr, () { - Navigator.pushNamed(context, Routers.addLockPage, - arguments: {'getLockType': 4}); - }), - lockTypeItem('images/lockType/lockType_parkingLock.png', - TranslationLoader.lanKeys!.parkingLock!.tr, () { - Navigator.pushNamed(context, Routers.addLockPage, - arguments: {'getLockType': 5}); - }), - lockTypeItem('images/lockType/lockType_entranceGuardLock.png', - TranslationLoader.lanKeys!.itelligentAccessControl!.tr, - () { - Navigator.pushNamed(context, Routers.addLockPage, - arguments: {'getLockType': 6}); - }), - - // lockTypeItem('images/lockType/lockType_bicycleLock.png', - // TranslationLoader.lanKeys!.bicycleLock!.tr, () { - // Navigator.pushNamed(context, Routers.addLockPage); - // }), - if (!F.isLite) - lockTypeItem('images/lockType/lockType_gatewayLock.png', - TranslationLoader.lanKeys!.gateway!.tr, () { - // Navigator.pushNamed(context, Routers.gatewayListPage); - }), - if (!F.isLite) - lockTypeItem('images/lockType/lockType_camera.png', '网络摄像头'.tr, - () { - // Navigator.pushNamed(context, Routers.gatewayListPage); - }), - ], - ), - ), - ) + lockTypeList(), ], ), ); } + //锁列表控件 + Widget lockTypeList() { + Widget view = F.sw( + defaultCall: () => GridView.count( + crossAxisCount: 2, + childAspectRatio: 2.83, + crossAxisSpacing: 10, + mainAxisSpacing: 10, + children: getLockTypeList(), + ), + xhjCall: () => GridView.count( + crossAxisCount: 1, + childAspectRatio: 6, + crossAxisSpacing: 10, + mainAxisSpacing: 10, + children: getLockTypeList(), + )); + return Expanded( + child: Container( + padding: const EdgeInsets.only(left: 10, right: 10, bottom: 10), + child: view, + ), + ); + } + + //所有的锁类型匹配 + List getLockTypeList() { + return [ + lockTypeItem('images/lockType/lockType_doorLock.png', + TranslationLoader.lanKeys!.doorLock!.tr, () { + Navigator.pushNamed(context, Routers.addLockPage, + arguments: {'getLockType': 1}); + }), + if (!F.isLite) + lockTypeItem('images/lockType/lockType_NFCLock.png', + TranslationLoader.lanKeys!.NFCPassiveLock!.tr, () { + // Navigator.pushNamed(context, Routers.addLockPage); + }), + if (!F.isLite) + lockTypeItem('images/lockType/lockType_padlock.png', + TranslationLoader.lanKeys!.padlock!.tr, () { + // Navigator.pushNamed(context, Routers.addLockPage); + }), + lockTypeItem('images/lockType/lockType_safeLock.png', + TranslationLoader.lanKeys!.safeLock!.tr, () { + Navigator.pushNamed(context, Routers.addLockPage, + arguments: {'getLockType': 4}); + }), + lockTypeItem('images/lockType/lockType_parkingLock.png', + TranslationLoader.lanKeys!.parkingLock!.tr, () { + Navigator.pushNamed(context, Routers.addLockPage, + arguments: {'getLockType': 5}); + }), + lockTypeItem('images/lockType/lockType_entranceGuardLock.png', + TranslationLoader.lanKeys!.itelligentAccessControl!.tr, () { + Navigator.pushNamed(context, Routers.addLockPage, + arguments: {'getLockType': 6}); + }), + + // lockTypeItem('images/lockType/lockType_bicycleLock.png', + // TranslationLoader.lanKeys!.bicycleLock!.tr, () { + // Navigator.pushNamed(context, Routers.addLockPage); + // }), + if (!F.isLite) + lockTypeItem('images/lockType/lockType_gatewayLock.png', + TranslationLoader.lanKeys!.gateway!.tr, () { + // Navigator.pushNamed(context, Routers.gatewayListPage); + }), + if (!F.isLite) + lockTypeItem('images/lockType/lockType_camera.png', '网络摄像头'.tr, () { + // Navigator.pushNamed(context, Routers.gatewayListPage); + }), + ]; + } + + //搜索全部的按钮 Widget allLock() { + Widget view = Row( + children: [ + SizedBox(width: 30.w), + Image.asset( + 'images/lockType/lockType_allLocks.png', + width: 88.w, + height: 80.w, + ), + SizedBox(width: 40.w), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(TranslationLoader.lanKeys!.allLock!.tr, + style: TextStyle( + fontSize: 24.sp, + )), + Text(TranslationLoader.lanKeys!.searchAllLockType!.tr, + style: TextStyle( + fontSize: 20.sp, color: AppColors.darkGrayTextColor)), + ], + ), + ), + SizedBox(width: 40.w), + Image.asset( + 'images/icon_right_grey.png', + width: 12.w, + height: 21.w, + ), + SizedBox(width: 40.w), + ], + ); + + //风格区分 + view = F.sw( + defaultCall: () => Container( + height: 150.h, + color: Colors.white, + margin: const EdgeInsets.all(10), + child: view, + ), + xhjCall: () => Container( + height: 150.h, + margin: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: AppColors.mainColor, width: 1), + borderRadius: BorderRadius.circular(20.r), + ), + child: view, + )); + return GestureDetector( onTap: () { Navigator.pushNamed(context, Routers.addLockPage, arguments: {'getLockType': 0}); }, - child: Container( - height: 150.h, - color: Colors.white, - margin: const EdgeInsets.all(10), - child: Row( - children: [ - SizedBox(width: 30.w), - Image.asset( - 'images/lockType/lockType_allLocks.png', - width: 88.w, - height: 80.w, - ), - SizedBox(width: 40.w), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(TranslationLoader.lanKeys!.allLock!.tr, - style: TextStyle( - fontSize: 24.sp, - )), - Text(TranslationLoader.lanKeys!.searchAllLockType!.tr, - style: TextStyle( - fontSize: 20.sp, color: AppColors.darkGrayTextColor)), - ], - ), - ), - SizedBox(width: 40.w), - Image.asset( - 'images/icon_right_grey.png', - width: 12.w, - height: 21.w, - ), - SizedBox(width: 40.w), - ], - ), - ), + child: view, ); } @@ -150,8 +194,14 @@ class _SelectLockTypePageState extends State with BaseWidget onTap: action, child: Container( height: 120.h, - color: Colors.white, - // margin: EdgeInsets.all(10), + decoration: F.sw( + defaultCall: () => const BoxDecoration( + color: Colors.white, + ), + xhjCall: () => BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20.r), + )), child: Row( children: [ SizedBox(width: 30.w), From d038fd05a57685a06e32647ce588074ebd1fc77f Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Tue, 30 Apr 2024 11:44:42 +0800 Subject: [PATCH 10/12] =?UTF-8?q?feat:=E4=BC=98=E5=8C=96=E9=91=AB=E6=B3=93?= =?UTF-8?q?=E4=BD=B3=20ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/lib/main/lockMian/lockMain/lockMain_page.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart b/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart index 4e6fd7e8..ada75f11 100644 --- a/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart +++ b/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart @@ -163,6 +163,11 @@ class _StarLockMainPageState extends State with BaseWidget { return returnWidget; } + //鑫泓佳背景 + Widget XHJBg({required Widget child}) { + return Container(); + } + Widget unHaveData() { return ListView( children: [ From 91327ab39590003fa7d452e48510d42bf8646feb Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Tue, 30 Apr 2024 13:41:34 +0800 Subject: [PATCH 11/12] =?UTF-8?q?feat:=E4=BC=98=E5=8C=96=E9=91=AB=E6=B3=93?= =?UTF-8?q?=E4=BD=B3=20ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../messageDetail/messageDetail_page.dart | 73 +++++++++++++------ .../messageList/messageList_xhj_page.dart | 3 + .../lib/mine/mine/starLockMine_page.dart | 9 ++- .../minePersonInfo_page.dart | 7 +- star_lock/lib/tools/appFirstEnterHandle.dart | 3 +- star_lock/lib/tools/customNetworkImage.dart | 63 +++++++++------- 6 files changed, 102 insertions(+), 56 deletions(-) diff --git a/star_lock/lib/mine/message/messageDetail/messageDetail_page.dart b/star_lock/lib/mine/message/messageDetail/messageDetail_page.dart index 2db5581e..07fd571a 100644 --- a/star_lock/lib/mine/message/messageDetail/messageDetail_page.dart +++ b/star_lock/lib/mine/message/messageDetail/messageDetail_page.dart @@ -1,7 +1,7 @@ - import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/flavors.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/dateTool.dart'; @@ -22,28 +22,55 @@ class _MessageDetailPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: AppColors.mainBackgroundColor, - appBar: TitleAppBar( - barTitle: "消息详情".tr, - haveBack: true, - backgroundColor: AppColors.mainColor), - body: Container( - margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 20.h), - child: Obx(() => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "${"创建时间".tr}:${DateTool().dateToYMDHNString(state.itemData.value.createdAt!.toString())}", - style: TextStyle(fontSize: 22.sp, color: AppColors.placeholderTextColor), - ), - SizedBox(height: 20.h), - Text( - state.itemData.value.data!, - style: TextStyle(fontSize: 22.sp, color: AppColors.placeholderTextColor), - ), - ], - )), - ) + backgroundColor: AppColors.mainBackgroundColor, + appBar: F.sw( + defaultCall: () => TitleAppBar( + barTitle: "消息详情".tr, + haveBack: true, + backgroundColor: AppColors.mainColor, + ), + xhjCall: () => TitleAppBar( + barTitle: "消息详情".tr, + haveBack: true, + backgroundColor: Colors.white, + iconColor: AppColors.blackColor, + titleColor: AppColors.blackColor, + ), + ), + body: Container( + margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 20.h), + child: Obx(() => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "${"创建时间".tr}:${DateTool().dateToYMDHNString(state.itemData.value.createdAt!.toString())}", + style: TextStyle( + fontSize: 22.sp, color: AppColors.placeholderTextColor), + ), + SizedBox(height: 20.h), + textView(), + ], + )), + )); + } + + Widget textView() { + Widget view = Text( + state.itemData.value.data!, + style: TextStyle(fontSize: 22.sp, color: AppColors.placeholderTextColor), ); + return F.sw( + defaultCall: () => view, + xhjCall: () => Container( + padding: EdgeInsets.only( + top: 20.h, bottom: 20.h, left: 20.w, right: 20.w), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(20.r))), + child: ClipRRect( + borderRadius: BorderRadius.circular(20.r), + child: view, + ), + )); } } diff --git a/star_lock/lib/mine/message/messageList/messageList_xhj_page.dart b/star_lock/lib/mine/message/messageList/messageList_xhj_page.dart index 9d89898a..abde4798 100644 --- a/star_lock/lib/mine/message/messageList/messageList_xhj_page.dart +++ b/star_lock/lib/mine/message/messageList/messageList_xhj_page.dart @@ -72,6 +72,9 @@ class _MessageListXHJPageState extends State : null, body: Column( children: [ + SizedBox( + height: 15.h, + ), Container( width: 1.sw, height: 0.2.sw, diff --git a/star_lock/lib/mine/mine/starLockMine_page.dart b/star_lock/lib/mine/mine/starLockMine_page.dart index e285fa4a..b105c14a 100644 --- a/star_lock/lib/mine/mine/starLockMine_page.dart +++ b/star_lock/lib/mine/mine/starLockMine_page.dart @@ -77,10 +77,11 @@ class StarLockMinePageState extends State with BaseWidget { child: ClipRRect( borderRadius: BorderRadius.circular(52.5.w), child: CustomNetworkImage( - url: state.userHeadUrl.value ?? "", - defaultUrl: 'images/controls_user.png', - width: 105.w, - height: 105.h), + url: state.userHeadUrl.value ?? "", + defaultUrl: 'images/controls_user.png', + width: 105.w, + height: 105.h, + ), ), )), ), diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart index e47dba72..31fa127c 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart @@ -30,7 +30,9 @@ class _MinePersonInfoPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: AppColors.mainBackgroundColor, + backgroundColor: F.sw( + defaultCall: () => AppColors.mainBackgroundColor, + xhjCall: () => AppColors.mainBackgroundColor), appBar: widget.showAppBar ? TitleAppBar( barTitle: TranslationLoader.lanKeys!.personalInformation!.tr, @@ -44,7 +46,8 @@ class _MinePersonInfoPageState extends State { xhjCall: () => Container( width: 1.sw, height: 0.2.sw, - margin: EdgeInsets.symmetric(horizontal: 15.w), + margin: + EdgeInsets.only(top: 15.h, left: 20.w, right: 20.w), padding: EdgeInsets.symmetric(horizontal: 25.w), decoration: BoxDecoration( image: const DecorationImage( diff --git a/star_lock/lib/tools/appFirstEnterHandle.dart b/star_lock/lib/tools/appFirstEnterHandle.dart index c48a8b2d..815df5c6 100644 --- a/star_lock/lib/tools/appFirstEnterHandle.dart +++ b/star_lock/lib/tools/appFirstEnterHandle.dart @@ -19,8 +19,9 @@ class AppFirstEnterHandle { switch (flagStr) { case isAgreePrivacy: // 隐私协议 { - if (getFlag != isAgreePrivacy) + if (getFlag != isAgreePrivacy) { showPrivacyAgreementAlert(widgetContext); + } } break; case isAgreePosition: // 位置权限 diff --git a/star_lock/lib/tools/customNetworkImage.dart b/star_lock/lib/tools/customNetworkImage.dart index 6b14818b..2456059f 100644 --- a/star_lock/lib/tools/customNetworkImage.dart +++ b/star_lock/lib/tools/customNetworkImage.dart @@ -12,34 +12,45 @@ class CustomNetworkImage extends StatelessWidget { final double width; final double height; final BoxFit boxFit; - const CustomNetworkImage({Key? key, required this.url, required this.defaultUrl, required this.width, required this.height, this.boxFit=BoxFit.cover}) : super(key: key); + + const CustomNetworkImage( + {Key? key, + required this.url, + required this.defaultUrl, + required this.width, + required this.height, + this.boxFit = BoxFit.cover}) + : super(key: key); @override Widget build(BuildContext context) { - return url.isNotEmpty ? CachedNetworkImage( - width: width, - height: height, - fit: boxFit, - imageUrl: url, - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - image: DecorationImage( - image: imageProvider, - fit: boxFit, - colorFilter: const ColorFilter.mode(Colors.transparent, BlendMode.colorBurn)), - ), - ), - errorWidget: (context, url, error) => Image.asset( - defaultUrl, - width: width, - height: height, - fit: BoxFit.fill, - ), - ) :Image.asset( - defaultUrl, - width: width, - height: height, - fit: BoxFit.fill, - ); + return url.isNotEmpty + ? CachedNetworkImage( + width: width, + height: height, + fit: boxFit, + imageUrl: url, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + image: DecorationImage( + image: imageProvider, + fit: boxFit, + colorFilter: const ColorFilter.mode( + Colors.transparent, BlendMode.colorBurn)), + ), + ), + errorWidget: (context, url, error) => Image.asset( + defaultUrl, + width: width, + height: height, + fit: BoxFit.fill, + ), + ) + : Image.asset( + defaultUrl, + width: width, + height: height, + fit: BoxFit.fill, + ); } } From ae916cda5583af3f645ef534c37ee00a5dadfdcf Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Tue, 30 Apr 2024 13:43:13 +0800 Subject: [PATCH 12/12] =?UTF-8?q?feat:=E6=89=93=E5=8C=85=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/pubspec.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/star_lock/pubspec.yaml b/star_lock/pubspec.yaml index 18c1b4ec..8616ddd8 100644 --- a/star_lock/pubspec.yaml +++ b/star_lock/pubspec.yaml @@ -37,8 +37,9 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # 1.0.27+2024042204 打包鑫锁提审ios与 android # 1.0.28+2024042601 打包鑫锁提审华为 # 1.0.29+2024042901 打包给欧阳测试 +# 1.0.30+2024043001 打包鑫锁提审ios -version: 1.0.29+2024042901 +version: 1.0.30+2024043001 environment: sdk: '>=2.12.0 <3.0.0'