fix: 完成修复国际化界面显示bug
This commit is contained in:
parent
8256557327
commit
789a3142df
BIN
images/main/icon_lockDetail_openLock_succeed.png
Normal file
BIN
images/main/icon_lockDetail_openLock_succeed.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
BIN
images/main/icon_main_remoteUnlocking_xhj.png
Normal file
BIN
images/main/icon_main_remoteUnlocking_xhj.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.2 KiB |
@ -10,12 +10,12 @@ PODS:
|
||||
- EMASRest
|
||||
- AlicloudUT (5.2.0.16):
|
||||
- AlicloudUTDID
|
||||
- AlicloudUTDID (1.5.0.94)
|
||||
- AlicloudUtils (1.4.1):
|
||||
- AlicloudUTDID (1.6.0)
|
||||
- AlicloudUtils (2.0.0):
|
||||
- AlicloudUTDID
|
||||
- aliyun_face_plugin (0.0.1):
|
||||
- Flutter
|
||||
- AMap3DMap (10.0.600):
|
||||
- AMap3DMap (10.0.700):
|
||||
- AMapFoundation (>= 1.8.0)
|
||||
- amap_flutter_location (0.0.1):
|
||||
- AMapLocation
|
||||
@ -42,35 +42,35 @@ PODS:
|
||||
- ReachabilitySwift
|
||||
- device_info_plus (0.0.1):
|
||||
- Flutter
|
||||
- DKImagePickerController/Core (4.3.7):
|
||||
- DKImagePickerController/Core (4.3.9):
|
||||
- DKImagePickerController/ImageDataManager
|
||||
- DKImagePickerController/Resource
|
||||
- DKImagePickerController/ImageDataManager (4.3.7)
|
||||
- DKImagePickerController/PhotoGallery (4.3.7):
|
||||
- DKImagePickerController/ImageDataManager (4.3.9)
|
||||
- DKImagePickerController/PhotoGallery (4.3.9):
|
||||
- DKImagePickerController/Core
|
||||
- DKPhotoGallery
|
||||
- DKImagePickerController/Resource (4.3.7)
|
||||
- DKPhotoGallery (0.0.17):
|
||||
- DKPhotoGallery/Core (= 0.0.17)
|
||||
- DKPhotoGallery/Model (= 0.0.17)
|
||||
- DKPhotoGallery/Preview (= 0.0.17)
|
||||
- DKPhotoGallery/Resource (= 0.0.17)
|
||||
- DKImagePickerController/Resource (4.3.9)
|
||||
- DKPhotoGallery (0.0.19):
|
||||
- DKPhotoGallery/Core (= 0.0.19)
|
||||
- DKPhotoGallery/Model (= 0.0.19)
|
||||
- DKPhotoGallery/Preview (= 0.0.19)
|
||||
- DKPhotoGallery/Resource (= 0.0.19)
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Core (0.0.17):
|
||||
- DKPhotoGallery/Core (0.0.19):
|
||||
- DKPhotoGallery/Model
|
||||
- DKPhotoGallery/Preview
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Model (0.0.17):
|
||||
- DKPhotoGallery/Model (0.0.19):
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Preview (0.0.17):
|
||||
- DKPhotoGallery/Preview (0.0.19):
|
||||
- DKPhotoGallery/Model
|
||||
- DKPhotoGallery/Resource
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Resource (0.0.17):
|
||||
- DKPhotoGallery/Resource (0.0.19):
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- EMASRest (11.1.1.2)
|
||||
@ -135,9 +135,9 @@ PODS:
|
||||
- permission_handler_apple (9.3.0):
|
||||
- Flutter
|
||||
- ReachabilitySwift (5.2.2)
|
||||
- SDWebImage (5.19.1):
|
||||
- SDWebImage/Core (= 5.19.1)
|
||||
- SDWebImage/Core (5.19.1)
|
||||
- SDWebImage (5.19.2):
|
||||
- SDWebImage/Core (= 5.19.2)
|
||||
- SDWebImage/Core (5.19.2)
|
||||
- shared_preferences_foundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
@ -304,10 +304,10 @@ SPEC CHECKSUMS:
|
||||
AlicloudPush: 88529c9b796e4ece0601de0867b30359f55b61f7
|
||||
AlicloudSender: 1f468b6bd962a099ffc19d45e3608b0fe98f259d
|
||||
AlicloudUT: 6d1cf30d57d096b7e9bb4b069dd0ba6ad59a3338
|
||||
AlicloudUTDID: 7323c443dcdf9a73e2224dc6ce51703671d7a765
|
||||
AlicloudUtils: 873a76615bebcee8b1996f20820d366e433c3eab
|
||||
AlicloudUTDID: 4e9d44c2fd704b3508069c38eaec9d6a759e702c
|
||||
AlicloudUtils: 2a78de434a8b2dc99e408c4d6220e654076d9ef0
|
||||
aliyun_face_plugin: 7a90b6526c5acea616062e809699294c782c3eb8
|
||||
AMap3DMap: d104a679c2bad573c908e0ddadf26bc399678b24
|
||||
AMap3DMap: 6ee456d7ba946ebbad580a343b74ffa8e9936175
|
||||
amap_flutter_location: 44ff5beb64f42e0bf5feb402fe299dac0013af6f
|
||||
amap_flutter_map: 979e54d227cedac6c7504a2151bfbf3bcf96760a
|
||||
AMapFoundation: 9885c48fc3a78fdfb84a0299a2293e56ea3c9fec
|
||||
@ -320,8 +320,8 @@ SPEC CHECKSUMS:
|
||||
camera_avfoundation: dd002b0330f4981e1bbcb46ae9b62829237459a4
|
||||
connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d
|
||||
device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed
|
||||
DKImagePickerController: 0a24ebfe7b48beeb74c27531540aaa2cc1dac6cf
|
||||
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
|
||||
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
|
||||
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
|
||||
EMASRest: 8df6f87836767a9415ad5cc4af739bc9d215b475
|
||||
file_picker: ce3938a0df3cc1ef404671531facef740d03f920
|
||||
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
||||
@ -348,7 +348,7 @@ SPEC CHECKSUMS:
|
||||
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
|
||||
ReachabilitySwift: 2128f3a8c9107e1ad33574c6e58e8285d460b149
|
||||
SDWebImage: 40b0b4053e36c660a764958bff99eed16610acbb
|
||||
SDWebImage: dfe95b2466a9823cf9f0c6d01217c06550d7b29a
|
||||
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
|
||||
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
|
||||
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
04F5ED852CFEB50A004C02C3 /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 04F5ED842CFEB50A004C02C3 /* InfoPlist.xcstrings */; };
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||
25B2A1422F9A2CCCBBCBBB97 /* skyRelease.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 35F02D170492750B437D6AB6 /* skyRelease.xcconfig */; };
|
||||
370C09E26790814FD1F6465F /* xhjLaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6A6F5C86239927252C06A16A /* xhjLaunchScreen.storyboard */; };
|
||||
@ -95,6 +96,7 @@
|
||||
/* Begin PBXFileReference section */
|
||||
0420903B2C0EEAA50073E654 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = "<group>"; };
|
||||
04BFC4482BCFE05100688FCA /* RunnerRelease-xhj.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerRelease-xhj.entitlements"; sourceTree = "<group>"; };
|
||||
04F5ED842CFEB50A004C02C3 /* InfoPlist.xcstrings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json.xcstrings; path = InfoPlist.xcstrings; sourceTree = "<group>"; };
|
||||
0BEB3ADCCEC961E2916B9004 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
0D02C18E16914A687A4A1AC2 /* devDebug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = devDebug.xcconfig; path = Flutter/devDebug.xcconfig; sourceTree = "<group>"; };
|
||||
126D1370182AB44291C67A10 /* Pods-Runner.dev-release-sky.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.dev-release-sky.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.dev-release-sky.xcconfig"; sourceTree = "<group>"; };
|
||||
@ -333,6 +335,7 @@
|
||||
97C146F01CF9000F007C117D /* Runner */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
04F5ED842CFEB50A004C02C3 /* InfoPlist.xcstrings */,
|
||||
82B657682C919DA60079121C /* launchImage_sky.png */,
|
||||
82B657662C919BDF0079121C /* launchImage_xhj.png */,
|
||||
82B657642C917F950079121C /* Info_pre.plist */,
|
||||
@ -486,6 +489,7 @@
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
|
||||
E0A496CB2CA30C7400E376BB /* xhjPreviewRelease.xcconfig in Resources */,
|
||||
04F5ED852CFEB50A004C02C3 /* InfoPlist.xcstrings in Resources */,
|
||||
E0A496C52CA3092500E376BB /* localDebug.xcconfig in Resources */,
|
||||
805C745A7C79091E65665B96 /* devDebug.xcconfig in Resources */,
|
||||
D415555B0C61C5422202D037 /* devProfile.xcconfig in Resources */,
|
||||
@ -615,13 +619,13 @@
|
||||
baseConfigurationReference = 16A83D21DFB231D8453DC681 /* Pods-Runner.release-sky.xcconfig */;
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
DEVELOPMENT_TEAM = NAQ5PL2DYC;
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
|
||||
INFOPLIST_FILE = Runner/Info_sky.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
PRODUCT_NAME = Runner;
|
||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Appstore_com.skychip.lock.mobileprovision;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
@ -634,14 +638,14 @@
|
||||
baseConfigurationReference = CDC2B8ED804B514A774F187D /* Pods-Runner.release-xhj.xcconfig */;
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
DEVELOPMENT_TEAM = P8997RW3V8;
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = P8997RW3V8;
|
||||
INFOPLIST_FILE = Runner/Info_xhj.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock;
|
||||
PRODUCT_NAME = Runner;
|
||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Appstore_com.xhjcn.lock.mobileprovision;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
@ -870,16 +874,13 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerDebug-dev.entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
DEVELOPMENT_TEAM = NAQ5PL2DYC;
|
||||
INFOPLIST_FILE = Runner/Info_dev.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local;
|
||||
PRODUCT_NAME = Runner;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Debug_com.starlock.lock.local.mobileprovision;
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
@ -962,16 +963,14 @@
|
||||
baseConfigurationReference = D697F91E8405773AB9A5881E /* Pods-Runner.pre-release-sky.xcconfig */;
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
DEVELOPMENT_TEAM = NAQ5PL2DYC;
|
||||
INFOPLIST_FILE = Runner/Info_pre.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.pre;
|
||||
PRODUCT_NAME = Runner;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Adhoc_com.skychip.lock.pre.mobileprovision;
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
@ -1054,16 +1053,14 @@
|
||||
baseConfigurationReference = 126D1370182AB44291C67A10 /* Pods-Runner.dev-release-sky.xcconfig */;
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
DEVELOPMENT_TEAM = NAQ5PL2DYC;
|
||||
INFOPLIST_FILE = Runner/Info_dev.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.dev;
|
||||
PRODUCT_NAME = Runner;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Adhoc_com.skychip.lock.dev.mobileprovision;
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
@ -1146,16 +1143,14 @@
|
||||
baseConfigurationReference = 789004F1B475B44713E199BC /* Pods-Runner.pre-release-xhj.xcconfig */;
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = P8997RW3V8;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
DEVELOPMENT_TEAM = P8997RW3V8;
|
||||
INFOPLIST_FILE = Runner/Info_pre.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.pre;
|
||||
PRODUCT_NAME = Runner;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Adhoc_com.xhjcn.lock.pre.mobileprovision;
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
@ -1238,16 +1233,14 @@
|
||||
baseConfigurationReference = ED3A443EA1439FD0FB4BCF80 /* Pods-Runner.dev-release-xhj.xcconfig */;
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = P8997RW3V8;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
DEVELOPMENT_TEAM = P8997RW3V8;
|
||||
INFOPLIST_FILE = Runner/Info_dev.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.dev;
|
||||
PRODUCT_NAME = Runner;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Adhoc_com.xhjcn.lock.dev.mobileprovision;
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "بعد إعادة الضبط ، سيتم حذف الأوردة المشطية للقفل. هل أنت متأكد أنك تريد إعادة الضبط ؟",
|
||||
"在线": "الإنترنت",
|
||||
"离线": "غير متصل"
|
||||
"离线": "غير متصل",
|
||||
"购买记录": "سجل الشراء",
|
||||
"使用记录": "سجل المستخدم",
|
||||
"失效时间要大于当前时间": "يجب أن يكون وقت انتهاء الصلاحية أطول من الوقت الحالي",
|
||||
"修改名字": "تعديل الاسم",
|
||||
"时": "ساعة",
|
||||
"分": "دقيقة",
|
||||
"Amazon Alexa": "أمازون اليكما",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "يمكنك استخدام اليكرا لفتح ، قفل والتحقق من حالة القفل",
|
||||
"支持的国家": "البلدان المدعومة",
|
||||
"支持的国家值": "الولايات المتحدة الأمريكية, كندا, المملكة المتحدة, أستراليا, الهند, ألمانيا, فرنسا, إيطاليا, إسبانيا, اليابان",
|
||||
"操作流程": "عملية التشغيل",
|
||||
"操作流程值": "1 إضافة قفل وبوابة مع تطبيق القفل الذكي\n\n2 تمكين وظيفة فتح القفل عن بعد للقفل في التطبيق (يتم إيقاف تشغيل هذه الوظيفة افتراضيًا). إذا لم يكن لديك هذا الخيار ، فإن القفل لا يدعم اليكسا\n\n3 أضف مهارات إلى اليكسز وقم بتخويلها باستخدام حساب تطبيق القفل الذكي وكلمة المرور. بعد نجاح التفويض ، يمكنك اكتشاف أجهزة ضمن الحساب\n\n4 حدد موقع القفل في تطبيق اليكسا ، وقم بتشغيل وظيفة إلغاء القفل الصوتي ، وقم بتعيين كلمة مرور اللغة\n\n5 يمكن تشغيل القفل من خلال اليكزا",
|
||||
"Google Home": "منزل جوجل",
|
||||
"Action name": "اسم العمل",
|
||||
"ScienerSmart": "سنيرذكي",
|
||||
"支持的语言": "اللغات المدعومة",
|
||||
"英语": "الانجليزية",
|
||||
"Google Home操作流程的值": "1. استخدم تطبيق القفل الذكي لإضافة أقفال وبوابات\n\n2. تمكين وظيفة فتح القفل عن بعد للقفل في التطبيق (يتم إيقاف تشغيل هذه الوظيفة افتراضيًا). بدون هذا الخيار ، لا يدعم القفل منزل جوجل\n\n3. قم بتثبيت تطبيق Google المنزلي وانقر على زر \"\" في الزاوية العلوية اليسرى\n\n4. في صفحة الإعدادات ، حدد \"العمل مع Google\"\n\n5. البحث عن \"scienerذكي\" واستخدام حساب تطبيق القفل الذكي وكلمة المرور للتفويض",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "يجب أن تحتوي كلمة المرور على الأقل على 2 مما يلي: الأرقام والحروف والأحرف الخاصة",
|
||||
"已开锁": "غير مقفل",
|
||||
"已闭锁": "مقفل",
|
||||
"两次密码不一致哦": "كلمات المرور غير متسقة"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "След нулиране, метакарпалните вени на ключалката ще бъдат изтрити. Сигурен ли сте, че искате да се възстанови?",
|
||||
"在线": "Онлайн",
|
||||
"离线": "Офлайн"
|
||||
"离线": "Офлайн",
|
||||
"购买记录": "Запис за покупка",
|
||||
"使用记录": "Потребителски запис",
|
||||
"失效时间要大于当前时间": "Срокът на изтичане трябва да бъде по-дълъг от текущото време",
|
||||
"修改名字": "Редактиране на името",
|
||||
"时": "Час",
|
||||
"分": "Минута",
|
||||
"Amazon Alexa": "Амазонка алекса",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Можете да използвате alexa за отключване, заключване и проверка на състоянието на заключване",
|
||||
"支持的国家": "Подкрепени страни",
|
||||
"支持的国家值": "Сащ, канада, великобритания, австралия, индия, германия, франция, италия, испания, япония",
|
||||
"操作流程": "Процес на операция",
|
||||
"操作流程值": "1 добавете заключване и шлюз с приложението smart lock\n\n2 активирайте дистанционното отключване на функцията за заключване в приложението (тази функция е изключена по подразбиране). Ако не разполагате с тази опция, заключването не поддържа alexa\n\n3 добавете умения към alexa и ги разрешавайте с акаунта и паролата на приложението smart lock. След като разрешението е успешно, можете да откриете устройства под акаунта\n\n4 намерете заключването в приложението alexa, включете функцията за отключване на гласа и задайте паролата за езика\n\n5 ключалката може да се управлява чрез alexa",
|
||||
"Google Home": "Google home",
|
||||
"Action name": "Име на действие",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "Поддържани езици",
|
||||
"英语": "Английски",
|
||||
"Google Home操作流程的值": "1. използвайте приложението smart lock, за да добавите брави и шлюзове\n\n2. активирайте дистанционното отключване на функцията за заключване в приложението (тази функция е изключена по подразбиране). Без тази опция, заключването не поддържа google home\n\n3. инсталирайте приложението google home и кликнете върху бутона \"\" в горния ляв ъгъл\n\n4. на страницата с настройките изберете \"работа с google\"\n\n5. търсете \"scienersmart\" и използвайте акаунта и паролата на app smart lock, за да разрешите",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Паролата трябва да съдържа поне 2 от следните: числа, букви и специални символи",
|
||||
"已开锁": "Отключена",
|
||||
"已闭锁": "Заключен",
|
||||
"两次密码不一致哦": "Паролите са непоследователни"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "ব্যান্ডোটারআইসেট, হাসিপাল রিরিইনস্ফথেলকবইল্ডজেডড।?",
|
||||
"在线": "কনলাইন",
|
||||
"离线": "দেউন্টলাইনCity in Ontario Canada"
|
||||
"离线": "দেউন্টলাইনCity in Ontario Canada",
|
||||
"购买记录": "পুরস্কার্ড",
|
||||
"使用记录": "ব্যবহারকারীর কর্তৃক",
|
||||
"失效时间要大于当前时间": "দীর্ঘকালীন",
|
||||
"修改名字": "নেম",
|
||||
"时": "Hour",
|
||||
"分": "নিউট",
|
||||
"Amazon Alexa": "Ammogonalexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "/অনুপন্থির",
|
||||
"支持的国家": "আদিবাস্য",
|
||||
"支持的国家值": "ইউসা, চা, uk, ঊর্ধ্ব, ডাইডিয়া, germany, ডিফায়েন্স, লি, ইম্পোসি, ইজেড",
|
||||
"操作流程": "ক্যামেশনprocesscess",
|
||||
"操作流程值": "1 বিরোধীদ্যালক্যান্ডgatkorethrouthhescartchlockParp\n\n2 দশমিক... ...সম্পোকলকিং... লকটিংয়ের (সংখ্যা ইংলিপিস অফবি-রফ-এফল্ট)। ফিফডোনট্যানস্ট্রিওপশন, থেলক ক্যান্টোনট\n\n3 বিদ্রোহী স্কুই ls টু-এক্সাআন্ড ঊর্ধ্বতন পোস্টার্থে\n\n৪লক্যাটথলকের দিন ইক্সাপপ্প, টেসিতে ইসোলাকক fun\n\n5thelockcanbe equavaedunderroughalexaxa",
|
||||
"Google Home": "শ্রোগল",
|
||||
"Action name": "কর্মসূচী",
|
||||
"ScienerSmart": "ইসিসিভার্ট",
|
||||
"支持的语言": "আদিবাস্য",
|
||||
"英语": "সেনডেনলিশ",
|
||||
"Google Home操作流程的值": "1. .এইচস্টার্টলকপ্পটো অ্যাক্টোক্যাকস্যান্ড ডিগ্রি\n\n2. দ্বিধাবিহীন হাউটস্টার্ডিউপিসোভিশন, thelock CantonesnotlendipportoogleAnhome\n\n3 .এনস্টলথে\n\n৪..অনুপিজিংসপেজ, \"কর্মবৃন্দে\" নির্বাচন করুন\"\n\n৫..পেরার্ফোর \"সাইকিয়ারস্কার্টার্ট\" এবং ব্যবহারকারী ছর্টলাকপ্প-এরকন্টন্ড pas-স্কওয়ার্ডটু",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "ইসওয়ার্ডমস্টস্টেটলিয়াস্ট 2ofthefক্লোভিং:",
|
||||
"已开锁": "কনুকলচকেড",
|
||||
"已闭锁": "লোকচকেড",
|
||||
"两次密码不一致哦": "Thepasswordsare pencay"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po resetování budou metakarpální žíly zámku odstraněny. Jste si jistý, že chcete resetovat?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Zápis nákupu",
|
||||
"使用记录": "Záznam uživatele",
|
||||
"失效时间要大于当前时间": "Doba platnosti musí být delší než současný čas",
|
||||
"修改名字": "Upravit název",
|
||||
"时": "Hodina",
|
||||
"分": "Minuta",
|
||||
"Amazon Alexa": "Amazon alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Můžete použít alexa na odemčení, zamčení a kontrolu stavu zámku",
|
||||
"支持的国家": "Podporované země",
|
||||
"支持的国家值": "Usa, kanada, velká británie, austrálie, indie, německo, francie, itálie, španělsko, japonsko",
|
||||
"操作流程": "Proces operace",
|
||||
"操作流程值": "1 přidat zámek a bránu s aplikací smart lock\n\n2 zapněte funkci vzdáleného odblokování zámku v aplikaci (tato funkce je ve výchozím nastavení vypnuta). Pokud nemáte tuto možnost, zámek nepodporuje alexa.\n\n3 přidat dovednosti k alexa a povolit je pomocí účtu a hesla aplikace smart lock. Poté, co je oprávnění úspěšné, můžete objevit zařízení v rámci účtu\n\n4 vyhledejte zámek v aplikaci alexa, zapněte funkci odemčení hlasu a nastavte heslo jazyka\n\n5 zámek lze ovládat prostřednictvím alexa",
|
||||
"Google Home": "Google home",
|
||||
"Action name": "Název akce",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "Podporované jazyky",
|
||||
"英语": "English",
|
||||
"Google Home操作流程的值": "1. použijte aplikaci smart lock pro přidání zámků a brán\n\n2. enable the remote unlocking function of the lock in the app (this function is off by default). Bez této možnosti nepodporuje zámek google home\n\n3. nainstalujte aplikaci google home a klepněte na tlačítko \"\" v levé horní části\n\n4. na stránce nastavení vyberte \"práce s google\"\n\n5. search for \"scienersmart\" and use the smart lock app account and password to authorize",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Heslo musí obsahovat alespoň 2 z těchto údajů: čísla, písmena a zvláštní znaky",
|
||||
"已开锁": "Odemčeno",
|
||||
"已闭锁": "Zamčeno",
|
||||
"两次密码不一致哦": "Hesla jsou nekonzistentní"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Efter nulstilling, de metacarpal vener i låsen vil blive slettet. Er du sikker på at du vil nulstille?",
|
||||
"在线": "OnlineComment",
|
||||
"离线": "OfflineComment"
|
||||
"离线": "OfflineComment",
|
||||
"购买记录": "Købsregistre",
|
||||
"使用记录": "Brugerrekord",
|
||||
"失效时间要大于当前时间": "Udløbstiden skal være længere end nuværende tidspunkt.",
|
||||
"修改名字": "Redigér navn",
|
||||
"时": "Time",
|
||||
"分": "Minutt",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Du kan bruge Alexa til at låse op, låse og kontrollere låsen status.",
|
||||
"支持的国家": "Støttede lande",
|
||||
"支持的国家值": "USA, Canada, Storbritannien, Australien, Indien, Tyskland, Frankrig, Italien, Spanien, Japan.",
|
||||
"操作流程": "Driftsprocesser",
|
||||
"操作流程值": "1 Tilføj en lås og gateway med Smart lås APP\n\n2 Aktiver den fjernlåsefunktion af låsen i APP (denne funktion er slukket som standard). Hvis du ikke har denne indstilling, understøtter låsen ikke Alexa\n\n3 Tilføj færdigheder til Alexa og autorisere dem med Smart lås APP konto og adgangskode. Når godkendelsen er vellykket, kan du opdage enheder under kontoen\n\n4 Find låsen i Alexa-appen, tænd stemme oplåsfunktionen og indstille adgangskoden for sproget.\n\n5 Låsen kan betjenes gennem Alexa",
|
||||
"Google Home": "Google-hjemName",
|
||||
"Action name": "Handlingsnavn",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Understøttede sprog",
|
||||
"英语": "Engelsk",
|
||||
"Google Home操作流程的值": "1. Brug Smart lås APP til at tilføje låse og gateways\n\n2. Aktiver den fjernlåsefunktion af låsen i APP (denne funktion er slukket som standard). Uden denne indstilling understøtter låsen ikke Google Home.\n\n3. Installer Google Home APP og klik på \" \" knappen i øverste venstre hjørne\n\n4. På siden Indstillinger skal du vælge \"Arbejd med Google\"\n\n5. Søg efter \"ScienerSmart\" og brug den smart lås APP-konto og adgangskode til at autorisere",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Adgangskoden skal indeholde mindst 2 af følgende: tal, bogstaver og særlige tegn",
|
||||
"已开锁": "Ulåset",
|
||||
"已闭锁": "Låset",
|
||||
"两次密码不一致哦": "Adgangskoderne er inkonsekvente"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Nach dem Zurücksetzen werden die Mittelhand adern des Schlosses gelöscht. Sind Sie sicher, dass Sie zurücksetzen wollen?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Kauf rekord",
|
||||
"使用记录": "Benutzer aufzeichnung",
|
||||
"失效时间要大于当前时间": "Die Ablauf zeit muss länger sein als die aktuelle Zeit",
|
||||
"修改名字": "Name bearbeiten",
|
||||
"时": "Stunde",
|
||||
"分": "Minute",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Sie können Alexa verwenden, um den Sperr status zu entsperren, zu sperren und zu überprüfen",
|
||||
"支持的国家": "Unterstützte Länder",
|
||||
"支持的国家值": "USA, Kanada, Großbritannien, Australien, Indien, Deutschland, Frankreich, Italien, Spanien, Japan",
|
||||
"操作流程": "Betriebs prozess",
|
||||
"操作流程值": "1 Fügen Sie ein Schloss und ein Gateway mit der Smart Lock APP hinzu\n\n2 Aktivieren Sie die Remote-Entriegelung funktion der Sperre in der APP (diese Funktion ist standard mäßig deaktiviert). Wenn Sie diese Option nicht haben, unterstützt die Sperre Alexa nicht\n\n3 Fügen Sie Alexa Fähigkeiten hinzu und autorisieren Sie sie mit dem Konto und Passwort der Smart Lock APP. Nachdem die Autor isierung erfolgreich ist, können Sie Geräte unter dem Konto entdecken\n\n4 Suchen Sie die Sperre in der Alexa-App, schalten Sie die Funktion zum Ent sperren der Stimme ein und legen Sie das Sprach kennwort fest\n\n5 Das Schloss kann durch Alexa betrieben werden",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Name der Aktion",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Unterstützte Sprachen",
|
||||
"英语": "Englisch",
|
||||
"Google Home操作流程的值": "1. Verwenden Sie die Smart Lock APP, um Schlösser und Gateways hinzuzufügen\n\n2. Aktivieren Sie die Remote-Entriegelung funktion der Sperre in der APP (diese Funktion ist standard mäßig deaktiviert). Ohne diese Option unterstützt die Sperre Google Home nicht\n\n3. Installieren Sie die Google Home APP und klicken Sie auf die Schaltfläche \"\" in der oberen linken Ecke\n\n4. Wählen Sie auf der Seite Einstellungen \"Mit Google arbeiten\"\n\n5. Suchen Sie nach \"ScienerS mart\" und verwenden Sie das Smart Lock APP-Konto und das Passwort, um es zu autorisieren",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Das Passwort muss mindestens 2 der folgenden Zahlen enthalten: Zahlen, Buchstaben und Sonder zeichen",
|
||||
"已开锁": "Entsperrt",
|
||||
"已闭锁": "Gesperrt",
|
||||
"两次密码不一致哦": "Die Passwörter sind inkonsistent"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Μετά την επαναφορά, οι μετακάρπιες φλέβες της κλειδαριάς θα διαγραφούν. Είστε σίγουροι ότι θέλετε να επαναφέρετε;",
|
||||
"在线": "Σε απευθείας σύνδεση",
|
||||
"离线": "Εκτός σύνδεσης:"
|
||||
"离线": "Εκτός σύνδεσης:",
|
||||
"购买记录": "Αρχείο αγοράς",
|
||||
"使用记录": "Καταγραφή χρήστη",
|
||||
"失效时间要大于当前时间": "Ο χρόνος λήξης πρέπει να είναι μεγαλύτερος από την τρέχουσα ώρα.",
|
||||
"修改名字": "Επεξεργασία όνομας",
|
||||
"时": "Ώρα",
|
||||
"分": "Λεπτό",
|
||||
"Amazon Alexa": "Αμαζόνιο Αλέξα",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Μπορείτε να χρησιμοποιήσετε Alexa για να ξεκλειδώσετε, να κλειδώσετε και να ελέγξετε την κατάσταση κλειδαριάς",
|
||||
"支持的国家": "Υποστηριζόμενες χώρες",
|
||||
"支持的国家值": "ΗΠΑ, Καναδάς, Ηνωμένο Βασίλειο, Αυστραλία, Ινδία, Γερμανία, Γαλλία, Ιταλία, Ισπανία, Ιαπωνία",
|
||||
"操作流程": "Διαδικασία λειτουργίας",
|
||||
"操作流程值": "1 Προσθέστε μια κλειδαριά και πύλη με την Smart κλειδαριά APP\n\n2 Ενεργοποιήστε τη λειτουργία απομακρυσμένου ξεκλειδώματος της κλειδαριάς στο APP (αυτή η συνάρτηση είναι απενεργοποιημένη από προεπιλογή). Αν δεν έχετε αυτή την επιλογή, η κλειδαριά δεν υποστηρίζει Alexa\n\n3 Προσθέστε τις δεξιότητες στην Alexa και να τις εξουσιοδοτήσετε με το λογαριασμό και τον κωδικό πρόσβασης Smart. Μετά την επιτυχία της εξουσιοδότησης, μπορείτε να ανακαλύψετε συσκευές κάτω από τον λογαριασμό\n\n4 Εντοπίστε την κλειδαριά στην εφαρμογή Alexa, ενεργοποιήστε τη λειτουργία φωνής ξεκλειδώματος, και να ορίσετε τον κωδικό πρόσβασης γλώσσας\n\n5 Η κλειδαριά μπορεί να λειτουργήσει μέσω Alexa",
|
||||
"Google Home": "Σπίτι του GoogleName",
|
||||
"Action name": "Όνομα ενέργειας",
|
||||
"ScienerSmart": "ΕπιστήμοναςSmart",
|
||||
"支持的语言": "Υποστηριζόμενες γλώσσες",
|
||||
"英语": "Αγγλική",
|
||||
"Google Home操作流程的值": "1. Χρησιμοποιήστε το Smart Lock APP για να προσθέσετε κλειδαριές και πύλες\n\n2. Ενεργοποιήστε τη λειτουργία απομακρυσμένου ξεκλειδώματος της κλειδαριάς στο APP (αυτή η λειτουργία είναι απενεργοποιημένη από προεπιλογή). Χωρίς αυτή την επιλογή, η κλειδαριά δεν υποστηρίζει το Google HomeName\n\n3. Εγκαταστήστε το Google Home APP και κάντε κλικ στο \" \" πλήκτρο στην επάνω αριστερή γωνία\n\n4. Στη σελίδα Ρυθμίσεις, επιλέξτε \"Εργασία με Google\"\n\n5. Αναζητήστε το \"ScienerSmart\" και να χρησιμοποιήσετε τον έξυπνο λογαριασμό και τον κωδικό πρόσβασης για να εξουσιοδοτήσει",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Ο κωδικός πρόσβασης πρέπει να περιέχει τουλάχιστον 2 από τα ακόλουθα: αριθμούς, γράμματα και ειδικούς χαρακτήρες.",
|
||||
"已开锁": "Ξεκλείδωμα",
|
||||
"已闭锁": "Κλειδωμένο",
|
||||
"两次密码不一致哦": "Οι κωδικοί πρόσβασης δεν είναι συνεπείς."
|
||||
}
|
||||
@ -1087,7 +1087,27 @@
|
||||
"离线": "Offline",
|
||||
"购买记录": "Purchase record",
|
||||
"使用记录": "User Record",
|
||||
|
||||
"失效时间要大于当前时间": "The expiration time must be longer than the current time",
|
||||
"修改名字": "Edit name"
|
||||
"修改名字": "Edit name",
|
||||
"时": "hour",
|
||||
"分": "minute",
|
||||
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "You can use Alexa to unlock, lock and check the lock status",
|
||||
"支持的国家": "Supported countries",
|
||||
"支持的国家值": "USA, Canada, UK, Australia, India, Germany, France, Italy, Spain, Japan",
|
||||
"操作流程": "Operation process",
|
||||
"操作流程值":"1 Add a lock and gateway with the Smart lock APP \n\n2 Enable the remote unlocking function of the lock in the APP (this function is turned off by default). If you do not have this option, the lock does not support Alexa \n\n3 Add skills to Alexa and authorize them with the Smart lock APP's account and password. After the authorization is successful, you can discover devices under the account \n\n4 Locate the lock in the Alexa app, turn on the voice unlock function, and set the language password \n\n5 The lock can be operated through Alexa",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Action name",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Supported languages",
|
||||
"英语": "English",
|
||||
"Google Home操作流程的值": "1. Use the Smart lock APP to add locks and gateways \n\n2. Enable the remote unlocking function of the lock in the APP (this function is turned off by default). Without this option, the lock does not support Google Home \n\n3. Install the Google Home APP and click the \"+\" button in the top left corner \n\n4. On the Settings page, select \"Work with Google\" \n\n5. Search for \"ScienerSmart\" and use the smart lock APP account and password to authorize",
|
||||
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "The password must contain at least 2 of the following: numbers, letters, and special characters",
|
||||
"已开锁": "Unlocked",
|
||||
"已闭锁": "Locked",
|
||||
"两次密码不一致哦": "The passwords are inconsistent"
|
||||
|
||||
}
|
||||
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Después del reinicio, se eliminarán las venas metacarpiales de la cerradura. ¿Está seguro de que desea restablecer?",
|
||||
"在线": "En línea",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Registro de compra",
|
||||
"使用记录": "Registro de usuario",
|
||||
"失效时间要大于当前时间": "El tiempo de expiración debe ser más largo que el tiempo actual",
|
||||
"修改名字": "Editar nombre",
|
||||
"时": "Hora",
|
||||
"分": "Minuto",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Puede usar Alexa para desbloquear, bloquear y verificar el estado del bloqueo",
|
||||
"支持的国家": "Países apoyados",
|
||||
"支持的国家值": "Estados Unidos, Canadá, Reino Unido, Australia, India, Alemania, Francia, Italia, España, Japón",
|
||||
"操作流程": "Proceso de operación",
|
||||
"操作流程值": "1 Añadir una cerradura y puerta de enlace con la aplicación de bloqueo inteligente\n\n2 Habilite la función de desbloqueo remoto de la cerradura en la APP (esta función está desactivada por defecto). Si no tiene esta opción, el bloqueo no es compatible con Alexa\n\n3 Agregue habilidades a Alexa y autorícelas con la cuenta y contraseña de la aplicación de bloqueo inteligente. Después de que la autorización sea exitosa, puede descubrir dispositivos bajo la cuenta\n\n4 Localice el bloqueo en la aplicación Alexa, encienda la función de desbloqueo de voz y configure la contraseña del idioma\n\n5 La cerradura puede ser operada a través de Alexa",
|
||||
"Google Home": "Inicio de Google",
|
||||
"Action name": "Nombre de acción",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Idiomas soportados",
|
||||
"英语": "Inglés",
|
||||
"Google Home操作流程的值": "1. use la aplicación de bloqueo inteligente para agregar cerraduras y pasarelas\n\n2. habilitar la función de desbloqueo remoto de la cerradura en la aplicación (esta función está desactivada por defecto). Sin esta opción, el bloqueo no es compatible con Google Home\n\n3. instale la aplicación Google Home y haga clic en el botón \"\" en la esquina superior izquierda\n\n4. En la página Configuración, seleccione \"Trabajar con Google\"\n\n5. busque \"ScienerSmart\" y use la cuenta y la contraseña de la aplicación de bloqueo inteligente para autorizar",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "La contraseña debe contener al menos 2 de los siguientes: números, letras y caracteres especiales",
|
||||
"已开锁": "Desbloqueado",
|
||||
"已闭锁": "Bloqueado",
|
||||
"两次密码不一致哦": "Las contraseñas son inconsistentes"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Pärast lähtestamist kustutatakse luku metakarpaalveenid. Kas tõesti soovid lähtestada?",
|
||||
"在线": "Võrgus",
|
||||
"离线": "Mitte ühendust"
|
||||
"离线": "Mitte ühendust",
|
||||
"购买记录": "Ostu kirjed",
|
||||
"使用记录": "Kasutaja kirje",
|
||||
"失效时间要大于当前时间": "Kehtivusaeg peab olema pikem kui praegune aeg",
|
||||
"修改名字": "Muuda nime",
|
||||
"时": "Tund",
|
||||
"分": "Minut",
|
||||
"Amazon Alexa": "Amazoni Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Võite kasutada Alexa, et avada, lukustada ja kontrollida oleku lukus",
|
||||
"支持的国家": "Toetatud riigid",
|
||||
"支持的国家值": "USA, Kanada, Ühendkuningriik, Austraalia, India, Saksamaa, Prantsusmaa, Itaalia, Hispaania, Jaapan",
|
||||
"操作流程": "Käitamisprotsess",
|
||||
"操作流程值": "1 Lisa lukk ja värava Smart lock APP-ga\n\n2 Lubage luku kauglukustumise funktsiooni APP (see funktsioon on vaikimisi välja lülitatud). Kui sul seda valikut pole, ei toeta lukk Alexa\n\n3 Lisa oskusi Alexa ja lubada neid Smart lukk APP konto ja parool. Kui luba on edukas, võite avastada seadmeid konto alla\n\n4 Leia lukk Alexa rakendus, lülitada hääl ava funktsiooni ja määrata keele parooli\n\n5 Lukk saab töötada läbi Alexa",
|
||||
"Google Home": "Google kodu",
|
||||
"Action name": "Toimingu nimi",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Toetatud keeled",
|
||||
"英语": "Inglise keel",
|
||||
"Google Home操作流程的值": "1. Kasutage Smart lock APP lukud ja väravad\n\n2. Lubage APP luku kauglukust avamise funktsiooni (see funktsioon on vaikimisi välja lülitatud). Ilma selle valikuteta ei toeta lukk Google Kodu.\n\n3. Paigalda Google Home APP ja klõpsake \" \" nuppu ülemine vasak nurk\n\n4. Seadistused lehel valige \"Töö Google'ga\"\n\n5. Otsige \"ScienerSmart\" ja kasutage nutikas lukustatud APP konto ja parooli, et autoriseerida.",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Parool peab sisaldama vähemalt kahte järgmistest: numbreid, tähti ja erimärkid",
|
||||
"已开锁": "Lukustatud",
|
||||
"已闭锁": "Lukustatud",
|
||||
"两次密码不一致哦": "Paroolid ei ole järjekindlad"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Kun lukko on nollattu, metakarppinen suoneet poistetaan. Haluatko varmasti palauttaa?",
|
||||
"在线": "Verkossa",
|
||||
"离线": "Offline-verkosto"
|
||||
"离线": "Offline-verkosto",
|
||||
"购买记录": "Hankintamenettely",
|
||||
"使用记录": "Käyttäjätiedot",
|
||||
"失效时间要大于当前时间": "Päättymisajan on oltava pidempi kuin nykyinen aika.",
|
||||
"修改名字": "Muokkaa nimi",
|
||||
"时": "Tunti",
|
||||
"分": "Minuutti",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Voit käyttää Alexa avata, lukitse ja tarkistaa lukon tila",
|
||||
"支持的国家": "Tuetut maat",
|
||||
"支持的国家值": "Yhdysvallat, Kanada, Yhdistynyt kuningaskunta, Australia, Intia, Saksa, Ranska, Italia, Espanja, Japani",
|
||||
"操作流程": "Toimintaprosessi.",
|
||||
"操作流程值": "1 Lisää lukko ja portti Smart-lukko APP:n avulla\n\n2 Ota APP-lukon etälukutustoiminto (tämä toiminto on oletuksena pois päältä). Jos sinulla ei ole tätä vaihtoehtoa, lukko ei tue Alexa\n\n3 Lisää taitoja Alexa ja valtuuttaa ne Smart lukko APP tili ja salasana. Kun valtuutus on onnistunut, voit löytää laitteet tililä\n\n4 Etsi lukko Alexa-sovelluksessa, käynnistä ääni avautuminen ja asettaa kieli salasanan\n\n5 Lukko voidaan käyttää Alexan kautta",
|
||||
"Google Home": "Google-koti",
|
||||
"Action name": "Toiminnan nimi",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Tuetut kielet",
|
||||
"英语": "Englanti",
|
||||
"Google Home操作流程的值": "1. Käytä Smart-lukko APP lisää lukkoja ja portteja\n\n2. Ota APP-lukon etälukutustoiminto (tämä toiminto on oletuksena sammutettu). Ilman tätä vaihtoehtoa lukko ei tue Google Homes\n\n3. Asenna Google Home APP ja klikkaa \" \" painiketta vasemmassa yläkulmassa.\n\n4. Valitse Asetukset sivulla \"Työ Googlen kanssa\"\n\n5. Etsi \"ScienerSmart\" ja käyttää älykkää lukko APP-tiliä ja salasanaa valtuuttaakseen",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Salasanassa on oltava vähintään kaksi seuraavista: numeroita, kirjaimia ja erityismerkkejä",
|
||||
"已开锁": "Avaa lukitus",
|
||||
"已闭锁": "Lukittu",
|
||||
"两次密码不一致哦": "Salasanat ovat epäjohdonmukaiset."
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Après réinitialisation, les veines métacarpiennes de la serrure seront supprimées. Êtes-vous sûr de vouloir réinitialiser?",
|
||||
"在线": "En ligne",
|
||||
"离线": "Hors ligne"
|
||||
"离线": "Hors ligne",
|
||||
"购买记录": "Dossier d'achat",
|
||||
"使用记录": "Enregistrement de l'utilisateur",
|
||||
"失效时间要大于当前时间": "Le délai d'expiration doit être plus long que l'heure actuelle",
|
||||
"修改名字": "Modifier le nom",
|
||||
"时": "Heure",
|
||||
"分": "Minute",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Vous pouvez utiliser Alexa pour déverrouiller, verrouiller et vérifier l'état du verrouillage",
|
||||
"支持的国家": "Pays soutenus",
|
||||
"支持的国家值": "États-Unis, Canada, Royaume-Uni, Australie, Inde, Allemagne, France, Italie, Espagne, Japon",
|
||||
"操作流程": "Processus d'opération",
|
||||
"操作流程值": "1 Ajoutez un verrou et une passerelle avec l'application Smart Lock\n\n2 Activez la fonction de déverrouillage à distance du verrou dans l'APP (cette fonction est désactivée par défaut). Si vous n'avez pas cette option, le verrou ne prend pas en charge Alexa\n\n3 Ajoutez des compétences à Alexa et autorisez-les avec le compte et le mot de passe de l'application Smart Lock. Une fois l'autorisation réussie, vous pouvez découvrir les appareils sous le compte\n\n4 Localisez le verrou dans l'application Alexa, activez la fonction de déverrouillage vocal et définissez le mot de passe linguistique\n\n5 La serrure peut être actionnée par Alexa",
|
||||
"Google Home": "Accueil Google",
|
||||
"Action name": "Nom de l'action",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Langues prises en charge",
|
||||
"英语": "Anglais",
|
||||
"Google Home操作流程的值": "1. Utilisez l'application Smart Lock pour ajouter des verrous et des passerelles\n\n2. activer la fonction de déverrouillage à distance de la serrure dans l'application (cette fonction est désactivée par défaut). Sans cette option, le verrou ne prend pas en charge Google Home\n\n3. Installez l'application Google Home et cliquez sur le bouton \"\" dans le coin supérieur gauche\n\n4. Sur la page Paramètres, sélectionnez \"Travailler avec Google\"\n\n5. recherchez \"ScienerSmart\" et utilisez le compte APP de verrouillage intelligent et le mot de passe pour autoriser",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Le mot de passe doit contenir au moins deux des éléments suivants: chiffres, lettres et caractères spéciaux",
|
||||
"已开锁": "Déverrouillé",
|
||||
"已闭锁": "Verrouillé",
|
||||
"两次密码不一致哦": "Les mots de passe sont incohérents"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "לאחר איפוס, הורידים של המנעול יימחקו. אתה בטוח שברצונך לאפס?",
|
||||
"在线": "באינטרנט",
|
||||
"离线": "מנותק"
|
||||
"离线": "מנותק",
|
||||
"购买记录": "רישום רכישה",
|
||||
"使用记录": "רשומות משתמש",
|
||||
"失效时间要大于当前时间": "זמן המימוש חייב להיות ארוך יותר מאשר הזמן הנוכחי",
|
||||
"修改名字": "שם עריכה",
|
||||
"时": "שעה",
|
||||
"分": "דקה",
|
||||
"Amazon Alexa": "אלכס",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "אתה יכול להשתמש alexa כדי לפתוח, לנעול ולבדוק את מצב המנעול",
|
||||
"支持的国家": "מדינות נתמכות",
|
||||
"支持的国家值": "Usa, canada, uk, אוסטרליה, הודו, germany, צרפת, איטליה, ספרד, ספרד, יפן",
|
||||
"操作流程": "תהליך פעולה",
|
||||
"操作流程值": "1 להוסיף מנעול ושער עם אפליקציית נעילה חכמה\n\n2 הפעל את הפונקציה unlocking מרחוק של המנעול באפליקציה (פונקציה זו מכבה כברירת מחדל). אם אין לך אפשרות זו, המנעול לא תומך באלכסנa\n\n3 להוסיף מיומנויות כדי alexa ולאשר להם את החשבון ואת הסיסמה של האפליקציה המנעול החכם. לאחר האישור מוצלח, אתה יכול לגלות התקנים תחת החשבון\n\n4 לאתר את המנעול באפליקציית alexa, הפעל את פונקצית נעילת הקול, ולהגדיר את הסיסמה השפה\n\n5 המנעול יכול להיות מופעל באמצעות alexa",
|
||||
"Google Home": "בית גוגל",
|
||||
"Action name": "שם פעולה",
|
||||
"ScienerSmart": "נדוש",
|
||||
"支持的语言": "שפות נתמכות",
|
||||
"英语": "אנגלית",
|
||||
"Google Home操作流程的值": "1. השתמש ביישום מנעול חכם כדי להוסיף מנעולים ושערים\n\n2. הפעל את הפונקציה unlocking מרחוק של הנעילה באפליקציה (פונקציה זו מכבה כברירת מחדל). ללא אפשרות זו, המנעול אינו תומך בבית גוגל\n\n3. להתקין את אפליקציית הבית של גוגל ולחץ על כפתור \"בפינה השמאלית העליונה\n\n4. בדף ההגדרות, בחר \"עבודה עם Google\"\n\n5. חיפוש אחר \"scienersmart\" ולהשתמש חשבון יישום נעילה חכם וסיסמה כדי לאשר",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "הסיסמה חייבת להכיל לפחות 2 מאלה: מספרים, אותיות ותווים מיוחדים",
|
||||
"已开锁": "נעול",
|
||||
"已闭锁": "נעול",
|
||||
"两次密码不一致哦": "הסיסמאות אינן עקביות"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Nakon resetiranja, metakarpalne vene brave će biti izbrisane. Jeste li sigurni da želite resetiranje?",
|
||||
"在线": "Na internetu",
|
||||
"离线": "Odspojeno"
|
||||
"离线": "Odspojeno",
|
||||
"购买记录": "Podaci o prodaji",
|
||||
"使用记录": "Korisnički zapisi",
|
||||
"失效时间要大于当前时间": "Vrijeme isteka mora biti duže od trenutnog vremena",
|
||||
"修改名字": "Uredi ime:",
|
||||
"时": "Sat",
|
||||
"分": "Minute",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Možete koristiti Alexu za otključavanje, zaključati i provjeriti status brave.",
|
||||
"支持的国家": "Podržane države",
|
||||
"支持的国家值": "SAD, Kanada, Velika Britanija, Australija, Indija, Njemačka, Francuska, Italija, Španjolska, Japana",
|
||||
"操作流程": "Proces operacije",
|
||||
"操作流程值": "1 Dodajte bravu i prolaz s Smart zaključavanje APP-a\n\n2 Omogućite daljinsku funkciju otključavanja brave u APP (ova funkcija je zadano isključena). Ako nemate ovu opciju, brava ne podržava Alexu\n\n3 Dodati vještine Alexa i odobriti ih s Smart lock APP račun i lozinku. Nakon što je ovlaštenje uspješno, možete otkriti uređaje ispod računa\n\n4 Pronađite bravu u Alexa aplikacija, uključi glas otključavanje funkcije, i postavite jezičnu lozinku.\n\n5 brava se može upravljati preko Alexa",
|
||||
"Google Home": "Google kuća",
|
||||
"Action name": "Ime akcije",
|
||||
"ScienerSmart": "ZnanstvenikSmart",
|
||||
"支持的语言": "Podržani jezici",
|
||||
"英语": "EngleskiName",
|
||||
"Google Home操作流程的值": "1. Koristite Smart lock APP za dodavanje brava i prolaza\n\n2. Omogućite daljinsku funkciju otključavanja brave u APP (ova funkcija je zadano isključena). Bez ove opcije, brava ne podržava Google HomeName\n\n3. Instalirajte Google Home APP i kliknite \" \" gumb u gornjem lijevom kutu\n\n4. Na stranici podešavanja odaberite \"Radi s Googleom\"\n\n5. Tražite \"ScienerSmart\" i upotrijebite pametni APP račun i lozinku za ovlašćenje",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Lozinka mora sadržavati najmanje 2 od sljedećih: brojeve, slova i posebne znakove",
|
||||
"已开锁": "Otključan",
|
||||
"已闭锁": "Zaključano",
|
||||
"两次密码不一致哦": "Šifre nisu dosljedne"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "A reset után a zár metakarpális erei törlődnek. Biztos vagy benne, hogy vissza akarsz állítani?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Vásárlási rekord",
|
||||
"使用记录": "Felhasználói rekord",
|
||||
"失效时间要大于当前时间": "A lejárati időnek hosszabb kell lennie, mint a jelenlegi idő",
|
||||
"修改名字": "Név szerkesztése",
|
||||
"时": "Óra",
|
||||
"分": "Perc",
|
||||
"Amazon Alexa": "Amazon alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Alexa segítségével kinyit, zár és ellenőrizze a zár állapotát",
|
||||
"支持的国家": "Támogatott országok",
|
||||
"支持的国家值": "Usa, kanada, egyesült királyság, ausztrália, india, németország, franciaország, olaszország, spanyolország, japán",
|
||||
"操作流程": "Műveleti folyamat",
|
||||
"操作流程值": "1 egy zár és átjáró hozzáadása a smart lock alkalmazással\n\n2 engedélyezze az alkalmazásban lévő zár távoli feloldási funkcióját (ez a funkció alapértelmezés szerint kikapcsolt). Ha nem rendelkezik ezzel a lehetőséggel, a zár nem támogatja az alexát\n\n3 adjunk hozzá készségek alexa, és engedélyezze őket a smart lock app fiókját és jelszavát. Miután az engedélyezés sikeres, a fiók alatti eszközöket fedezhet fel\n\n4 keresse meg a zár az alexa app, kapcsolja be a hang kinyit funkció, és állítsa be a nyelv jelszó\n\n5 a zár lehet működtetni keresztül alexa",
|
||||
"Google Home": "Google home",
|
||||
"Action name": "Akció neve",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "Támogatott nyelvek",
|
||||
"英语": "Angol",
|
||||
"Google Home操作流程的值": "1. használja az intelligens zár alkalmazást a zárak és átjárók hozzáadásához\n\n2. engedélyezze az alkalmazásban lévő zár távoli feloldási funkcióját (ez a funkció alapértelmezés szerint kikapcsolt). E lehetőség nélkül a zár nem támogatja a google home-t\n\n3. telepítse a google home alkalmazást, és kattintson a \"\" gombra a bal felső sarokban\n\n4. a beállítások oldalon válassza a \"munka a google\" lehetőséget\n\n5. keresse meg a \"scienersmart\" és használja a smart lock app fiókot és a jelszót, hogy engedélyezze",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "A jelszónak a következők közül legalább 2 kell tartalmaznia: számok, betűk és speciális karakterek",
|
||||
"已开锁": "Unlocked",
|
||||
"已闭锁": "Locked",
|
||||
"两次密码不一致哦": "A jelszavak nem következetesek"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Setelah mengulang, pembuluh darah metakarpal dari kunci akan dihapus. Yakin ingin mengatur ulang?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Catatan pembelian",
|
||||
"使用记录": "Catatan Pengguna",
|
||||
"失效时间要大于当前时间": "Waktu kedaluwarsa harus lebih lama dari waktu saat ini",
|
||||
"修改名字": "Edit nama",
|
||||
"时": "Jam",
|
||||
"分": "Menit",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Anda dapat menggunakan Alexa untuk membuka, mengunci dan memeriksa status kunci",
|
||||
"支持的国家": "Negara yang didukung",
|
||||
"支持的国家值": "AS, Kanada, Inggris Raya, Australia, India, Jerman, Prancis, Italia, Spanyol, Jepang",
|
||||
"操作流程": "Proses operasi",
|
||||
"操作流程值": "1 tambahkan kunci dan gateway dengan aplikasi kunci cerdas\n\n2 Aktifkan fungsi membuka kunci jarak jauh pada aplikasi (fungsi ini dinonaktifkan secara default). Jika Anda tidak memiliki opsi ini, kunci tidak mendukung Alexa\n\n3 tambahkan keterampilan untuk Alexa dan otorisasi akun dan kata sandi aplikasi Smart lock. Setelah otorisasi berhasil, Anda dapat menemukan perangkat di bawah akun\n\n4 temukan kunci di aplikasi Alexa, nyalakan fungsi Buka kunci suara, dan atur kata sandi bahasa\n\n5 kunci dapat dioperasikan melalui Alexa",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Nama Aksi",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Bahasa yang didukung",
|
||||
"英语": "Inggris",
|
||||
"Google Home操作流程的值": "1. Gunakan aplikasi kunci cerdas untuk menambahkan kunci dan gerbang\n\n2. Aktifkan fungsi membuka kunci jarak jauh pada aplikasi (fungsi ini dinonaktifkan secara default). Tanpa opsi ini, kunci tidak mendukung Google Home\n\n3. Pasang aplikasi Google Home dan klik tombol \"di sudut kiri atas\n\n4. Pada halaman pengaturan, pilih bekerja dengan Google\n\n5. Cari \"ScienerSmart\" dan gunakan akun aplikasi kunci pintar dan kata sandi untuk mengotorisasi",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Kata sandi harus berisi setidaknya 2 karakter berikut: angka, huruf, dan karakter khusus",
|
||||
"已开锁": "Tidak terkunci",
|
||||
"已闭锁": "Terkunci",
|
||||
"两次密码不一致哦": "Kata sandi tidak konsisten"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Dopo il reset, le vene metacarpali della serratura verranno cancellate. Sei sicuro di voler reimpostare?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Record di acquisto",
|
||||
"使用记录": "Registrazione utente",
|
||||
"失效时间要大于当前时间": "Il tempo di scadenza deve essere più lungo dell'ora corrente",
|
||||
"修改名字": "Modifica nome",
|
||||
"时": "Ora",
|
||||
"分": "Minuto",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "È possibile utilizzare Alexa per sbloccare, bloccare e controllare lo stato di blocco",
|
||||
"支持的国家": "Paesi supportati",
|
||||
"支持的国家值": "USA, Canada, Regno Unito, Australia, India, Germania, Francia, Italia, Spagna, Giappone",
|
||||
"操作流程": "Processo di funzionamento",
|
||||
"操作流程值": "1 Aggiungi un lucchetto e un gateway con l'APP Smart Lock\n\n2 Abilita la funzione di sblocco remoto del blocco nell'APP (questa funzione è disattivata per impostazione predefinita). Se non hai questa opzione, il blocco non supporta Alexa\n\n3 Aggiungi competenze ad Alexa e autorizzale con l'account e la password dell'APP Smart Lock. Una volta completata l'autorizzazione, puoi scoprire i dispositivi sotto l'account\n\n4 Individuare il blocco nell'app Alexa, attivare la funzione di sblocco vocale e impostare la password della lingua\n\n5 La serratura può essere azionata tramite Alexa",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Nome azione",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Lingue supportate",
|
||||
"英语": "Inglese",
|
||||
"Google Home操作流程的值": "1. Utilizzare l'APP Smart Lock per aggiungere serrature e gateway\n\n2. Abilita la funzione di sblocco remoto del blocco nell'APP (questa funzione è disattivata per impostazione predefinita). Senza questa opzione, il blocco non supporta Google Home\n\n3. Installare l'APP Google Home e fare clic sul pulsante \"\" nell'angolo in alto a sinistra\n\n4. Nella pagina Impostazioni, seleziona \"Lavora con Google\"\n\n5. Cerca \"ScienerSmart\" e utilizza l'account e la password APP smart lock per autorizzare",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "La password deve contenere almeno 2 dei seguenti: numeri, lettere e caratteri speciali",
|
||||
"已开锁": "Sbloccato",
|
||||
"已闭锁": "Bloccato",
|
||||
"两次密码不一致哦": "Le password sono incoerenti"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "リセット後、ロックの中手骨静脈が削除されます。リセットしてもよろしいですか。",
|
||||
"在线": "オンライン",
|
||||
"离线": "オフライン"
|
||||
"离线": "オフライン",
|
||||
"购买记录": "購入記録",
|
||||
"使用记录": "ユーザーレコード",
|
||||
"失效时间要大于当前时间": "有効期限は現在の時間より長くなければなりません",
|
||||
"修改名字": "名前を編集",
|
||||
"时": "時間",
|
||||
"分": "分",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Alexaを使用して、ロックステータスのロックを解除、ロック、および確認できます。",
|
||||
"支持的国家": "支えられた国",
|
||||
"支持的国家值": "米国、カナダ、イギリス、オーストラリア、インド、ドイツ、フランス、イタリア、スペイン、日本",
|
||||
"操作流程": "操作プロセス",
|
||||
"操作流程值": "1スマートロックアプリでロックとゲートウェイを追加する\n\n2 APPでロックのリモートロック解除機能を有効にします (この機能はデフォルトでオフになっています)。このオプションがない場合、ロックはAlexaをサポートしていません\n\n3 Alexaにスキルを追加し、Smart lock APPのアカウントとパスワードでそれらを承認します。承認が成功すると、アカウントの下にあるデバイスを検出できます。\n\n4 Alexaアプリでロックを見つけ、音声ロック解除機能をオンにして、言語パスワードを設定します\n\n5ロックはAlexaを通して操作することができます",
|
||||
"Google Home": "Googleホーム",
|
||||
"Action name": "アクション名",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "サポートされている言語",
|
||||
"英语": "英語",
|
||||
"Google Home操作流程的值": "1.スマートロックアプリを使用してロックとゲートウェイを追加する\n\n2.APPでロックのリモートロック解除機能を有効にします (この機能はデフォルトでオフになっています)。このオプションがないと、ロックはGoogle Homeをサポートしません\n\n3.Google Home APPをインストールし、左上隅の「」ボタンをクリックします\n\n4.設定ページで、「Googleで作業する」を選択します\n\n5.「ScienerSmart」を検索し、スマートロックAPPアカウントとパスワードを使用して承認する",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "パスワードには、数字、文字、特殊文字のうち少なくとも2つを含める必要があります。",
|
||||
"已开锁": "ロック解除",
|
||||
"已闭锁": "ロック済み",
|
||||
"两次密码不一致哦": "パスワードが一致しない"
|
||||
}
|
||||
@ -1090,5 +1090,23 @@
|
||||
"失效时间要大于当前时间": "失效时间要大于当前时间",
|
||||
"修改名字": "修改名字",
|
||||
"时": "时",
|
||||
"分": "分"
|
||||
"分": "分",
|
||||
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "您可以使用Alexa进行开锁、闭锁和查看锁状态",
|
||||
"支持的国家": "支持的国家",
|
||||
"支持的国家值": "美国、加拿大、英国、澳大利亚、印度、德国、法国、意大利、西班牙、日本",
|
||||
"操作流程": "操作流程",
|
||||
"操作流程值":"1 用智能锁APP添加锁和网关\n\n2 在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Alexa \n\n3 在Alexa中添加Skill,并用智能锁APP的账号和密码进行授权。授权成功后就可以发现账号下的设备\n\n4 在Alexa app里找到锁,开启语音开锁的功能,并设置语言密码\n\n5 可以通过Alexa操作锁了",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Action name",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "支持的语言",
|
||||
"英语": "英语",
|
||||
"Google Home操作流程的值": "1.用智能锁APP添加锁和网关\n\n2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home \n\n3.安装Google Home APP,点击左上角的“+”按钮\n\n4.在设置页面,选择“与Google协同工作”\n\n5.搜索“ScienerSmart”,并用智能锁APP的账号和密码进行授权\n\n",
|
||||
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "密码需至少包含数字/字母/字符中的2种组合",
|
||||
"已开锁": "已开锁",
|
||||
"已闭锁": "已闭锁",
|
||||
"两次密码不一致哦": "两次密码不一致哦"
|
||||
}
|
||||
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Қайта ысырып тастағаннан соң бұғаттағы метакарпалар өшіріледі. Шынымен ысырып тастауды қалайсыз ба?",
|
||||
"在线": "Онлайн",
|
||||
"离线": "Желіде емес"
|
||||
"离线": "Желіде емес",
|
||||
"购买记录": "Сөндіру жазу",
|
||||
"使用记录": "Пайдаланушы жазу",
|
||||
"失效时间要大于当前时间": "Уақыт уақыты назардағы уақыттан артық болу керек.",
|
||||
"修改名字": "Атауы өңдеу",
|
||||
"时": "Сағат",
|
||||
"分": "Минуты",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Бұғат күй- жайын шектеу үшін Alexa қолдануға, бұғаттап тексеру",
|
||||
"支持的国家": "Қолданысталған елдер",
|
||||
"支持的国家值": "Америка, Канада, Британия, Австралия, Индия, Германия, Франция, Италия, Испания, Япония, Япония.",
|
||||
"操作流程": "Әрекет процесі",
|
||||
"操作流程值": "1 Smart Lock APP- ғазамен бұғаттау мен шүшін\n\n2 APP- ге бұғатталған қашықтағы бұғаттау функциясын рұқсат ету Егер бұл параметрі жоқ болса, блокта Alexa қолдамайды\n\n3 Alexa дегенге бақылауды қосып, оларды Smart Lock APP тіркелгі мен паролін рұқсат ету. Құрылғының сәтті тіркелгісінде құрылғыларды табыла аласыз.\n\n4 Alexa қолданбасында блоктауды орнатыңыз, дақы бұғаттап тіл парольді орнату\n\n5 Бұқсат Alexa арнайы қолданылсын",
|
||||
"Google Home": "Google Мекені",
|
||||
"Action name": "Әрекет атауы",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Қолдайтын тілдер",
|
||||
"英语": "Англияс",
|
||||
"Google Home操作流程的值": "1. Бұғаттарды мен шшұрарды қосу үшін Smart Lock APP қолданылсын\n\n2. APP- ге блоктасын қашықтағы бұғаттау функциясын рұқсат ету Бұл құсбелгіні блоктау Google Home қолдамайды\n\n3. Google Home APP- енді орнатып, жоғарғы сол жақтағы батырмасын басыңын\n\n4. Баптаулар бетінде \"Google with Joork\" дегенді таңдаңыз\n\n5. \"ScienerSmart\" іздеп, Smart Lock APP тіркелгі тіркелгі мен паролін рұқсат ету үшін қолданылсын",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Парольді келесінің кемінде 2- кемде болу керек: сандар, әріптер мен арнаулы таңбалары",
|
||||
"已开锁": "Жүктеу",
|
||||
"已闭锁": "Бұғатталған",
|
||||
"两次密码不一致哦": "Парольдер болмаған"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "재설정 후 잠금 장치의 중수골 정맥이 삭제됩니다. 당신은 당신이 재설정 하시겠습니까?",
|
||||
"在线": "온라인",
|
||||
"离线": "오프라인"
|
||||
"离线": "오프라인",
|
||||
"购买记录": "구매 기록",
|
||||
"使用记录": "사용자 기록",
|
||||
"失效时间要大于当前时间": "만료 시간은 현재 시간보다 길어야합니다.",
|
||||
"修改名字": "이름 편집",
|
||||
"时": "시간",
|
||||
"分": "분",
|
||||
"Amazon Alexa": "아마존 알렉사",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Alexa를 사용하여 잠금 상태를 잠금 해제, 잠금 및 확인할 수 있습니다.",
|
||||
"支持的国家": "지원되는 국가",
|
||||
"支持的国家值": "미국, 캐나다, 영국, 호주, 인도, 독일, 프랑스, 이탈리아, 스페인, 일본",
|
||||
"操作流程": "운영 프로세스",
|
||||
"操作流程值": "1 스마트 잠금 앱으로 잠금 및 게이트웨이 추가\n\n2 APP에서 잠금 장치의 원격 잠금 해제 기능을 활성화하십시오 (이 기능은 기본적으로 꺼져 있음). 이 옵션이 없으면 잠금 장치가 Alexa를 지원하지 않습니다.\n\n3 Alexa에 기술을 추가하고 스마트 잠금 APP의 계정과 암호로 권한을 부여합니다. 승인이 성공하면 계정에서 장치를 발견 할 수 있습니다.\n\n4 Alexa 앱에서 잠금을 찾아 음성 잠금 해제 기능을 켜고 언어 암호를 설정하십시오.\n\n5 자물쇠는 Alexa를 통해 운영될 수 있습니다",
|
||||
"Google Home": "구글 홈",
|
||||
"Action name": "액션 이름",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "지원되는 언어",
|
||||
"英语": "영어",
|
||||
"Google Home操作流程的值": "1. 잠금 장치 및 게이트웨이를 추가하려면 스마트 잠금 응용 프로그램을 사용하십시오.\n\n2. APP에서 잠금 장치의 원격 잠금 해제 기능을 활성화하십시오 (이 기능은 기본적으로 꺼져 있습니다). 이 옵션이 없으면 잠금 장치가 Google Home을 지원하지 않습니다.\n\n3. Google Home 앱을 설치하고 왼쪽 상단에있는 \"\" 버튼을 클릭하십시오.\n\n4. 설정 페이지에서 \"Google로 작업\" 을 선택하십시오.\n\n5. \"ScienerSmart\" 를 검색하고 스마트 잠금 APP 계정과 암호를 사용하여 권한을 부여하십시오.",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "암호에는 숫자, 문자 및 특수 문자 중 2 개 이상이 있어야합니다.",
|
||||
"已开锁": "잠금 해제",
|
||||
"已闭锁": "잠긴",
|
||||
"两次密码不一致哦": "암호가 일치하지 않습니다."
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po reset užrakto metakarpinės venos bus ištrintos. Ar tikrai norite atstatyti?",
|
||||
"在线": "Online",
|
||||
"离线": "Neprisijungęs"
|
||||
"离线": "Neprisijungęs",
|
||||
"购买记录": "Pirkimo įrašas",
|
||||
"使用记录": "Vartotojo įrašas",
|
||||
"失效时间要大于当前时间": "Galiojimo laikas turi būti ilgesnis nei dabartinis laikas",
|
||||
"修改名字": "Redaguoti pavadinimą",
|
||||
"时": "Valanda",
|
||||
"分": "Minutė",
|
||||
"Amazon Alexa": "Amazon alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Galite naudoti alexa atrakinti, užrakinti ir patikrinti užrakto būseną",
|
||||
"支持的国家": "Remiamos šalys",
|
||||
"支持的国家值": "Jav, kanada, jungtinė karalystė, australija, indija, vokietija, prancūzija, italija, ispanija, japonija",
|
||||
"操作流程": "Operacijos procesas",
|
||||
"操作流程值": "1 pridėkite užraktą ir vartus su \"smart lock\" programa\n\n2 įjungti nuotolinio užrakinimo funkciją programoje (ši funkcija pagal numatytuosius nustatymus išjungta). Jei jūs neturite šią parinktį, užraktas nepalaiko alexa\n\n3 pridėti įgūdžius alexa ir leisti juos su smart lock app paskyrą ir slaptažodį. Po to, kai leidimas bus sėkmingas, galite atrasti įrenginius pagal sąskaitą\n\n4 suraskite alexa programos užraktą, įjunkite balso atrakinimo funkciją ir nustatykite kalbos slaptažodį\n\n5 užraktas gali būti valdomas per alexa",
|
||||
"Google Home": "„ Google “namai",
|
||||
"Action name": "Veiksmo pavadinimas",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "Palaikomos kalbos",
|
||||
"英语": "Anglų kalba",
|
||||
"Google Home操作流程的值": "1. naudokite \"smart lock\" programą, kad pridėtumėte spynos ir vartus\n\n2. įjungti nuotolinio užrakinimo funkciją programoje (ši funkcija pagal numatytuosius nustatymus išjungta). Be šios parinkties, užraktas nepalaiko \"google home\"\n\n3. įdiegti \"google home\" programą ir spustelėkite \"\" mygtuką viršutiniame kairiajame kampe\n\n4. nustatymų puslapyje pasirinkite \"dirbti su\" google\"\n\n5. ieškoti \"scienersmart\" ir naudoti \"smart lock\" programos sąskaitą ir slaptažodį autorizuoti",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Slaptažodyje turi būti bent 2 iš šių: skaičiai, raidės ir specialūs simboliai",
|
||||
"已开锁": "Atrakinta",
|
||||
"已闭锁": "Užrakinta",
|
||||
"两次密码不一致哦": "Slaptažodžiai yra nenuoseklūs"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Selepas menetapkan semula, urat metacarpal kunci akan dipadamkan. Adakah anda pasti anda mahu menetapkan semula?",
|
||||
"在线": "Dalam talian",
|
||||
"离线": "Luar talian"
|
||||
"离线": "Luar talian",
|
||||
"购买记录": "Rekod pembelian",
|
||||
"使用记录": "Rekod pengguna",
|
||||
"失效时间要大于当前时间": "Waktu tamat tempoh mestilah lebih lama daripada masa semasa",
|
||||
"修改名字": "Edit nama",
|
||||
"时": "Jam",
|
||||
"分": "Minit",
|
||||
"Amazon Alexa": "Alexa Amazon",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Anda boleh menggunakan Alexa untuk membuka kunci, mengunci dan menyemak status kunci",
|
||||
"支持的国家": "Negara-negara yang disokong",
|
||||
"支持的国家值": "Amerika syarikat, kanada, UK, Australia, India, jerman, perancis, itali, sepanyol, jepun",
|
||||
"操作流程": "Proses operasi",
|
||||
"操作流程值": "1 tambah kunci dan pintu masuk dengan aplikasi kunci pintar\n\n2 membolehkan fungsi membuka kunci kunci dalam aplikasi (fungsi ini dimatikan secara lalai). Jika anda tidak mempunyai pilihan ini, kunci tidak menyokong Alexa\n\n3 tambah kemahiran untuk Alexa dan memberi kuasa kepada mereka dengan akaun dan kata laluan Smart lock APP. Selepas kebenaran berjaya, anda boleh menemui peranti di bawah akaun\n\n4 cari kunci dalam app Alexa, hidupkan fungsi buka kunci suara, dan tetapkan kata laluan bahasa\n\n5 kunci boleh dikendalikan melalui Alexa",
|
||||
"Google Home": "Rumah Google",
|
||||
"Action name": "Nama tindakan",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Bahasa yang disokong",
|
||||
"英语": "Bahasa inggeris",
|
||||
"Google Home操作流程的值": "1. Gunakan aplikasi kunci pintar untuk menambah kunci dan pintu masuk\n\n2. Dayakan fungsi membuka kunci kunci dalam aplikasi (fungsi ini dimatikan secara lalai). Tanpa pilihan ini, kunci tidak menyokong rumah Google\n\n3. Pasang aplikasi Google Home dan klik butang \"\" di sudut kiri atas\n\n4. Pada halaman tetapan, pilih \"bekerja dengan Google\"\n\n5. Cari \"ScienerSmart\" dan gunakan akaun aplikasi kunci pintar dan kata laluan untuk memberi kuasa",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Kata laluan mesti mengandungi sekurang-kurangnya 2 daripada yang berikut: nombor, huruf, dan aksara khas",
|
||||
"已开锁": "Dikunci",
|
||||
"已闭锁": "Dikunci",
|
||||
"两次密码不一致哦": "Kata laluan tidak konsisten"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Na reset worden de middenhandsbeenaders van het slot verwijderd. Weet je zeker dat je wilt resetten?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Aankooprecord",
|
||||
"使用记录": "Gebruikersrecord",
|
||||
"失效时间要大于当前时间": "De vervaltijd moet langer zijn dan de huidige tijd",
|
||||
"修改名字": "Naam bewerken",
|
||||
"时": "Uur",
|
||||
"分": "Minuut",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Je kunt Alexa gebruiken om de vergrendelingsstatus te ontgrendelen, vergrendelen en controleren",
|
||||
"支持的国家": "Ondersteunde landen",
|
||||
"支持的国家值": "VS, Canada, VK, Australië, India, Duitsland, Frankrijk, Italië, Spanje, Japan",
|
||||
"操作流程": "Operatie proces",
|
||||
"操作流程值": "1 Voeg een slot en gateway toe met de Smart Lock APP\n\n2 Schakel de externe ontgrendelingsfunctie van het slot in de APP in (deze functie is standaard uitgeschakeld). Als u deze optie niet hebt, ondersteunt het slot Alexa niet\n\n3 Voeg vaardigheden toe aan Alexa en autoriseer ze met het account en wachtwoord van de Smart Lock APP. Nadat de autorisatie succesvol is, kunt u apparaten ontdekken onder het account\n\n4 Zoek het slot in de Alexa-app, schakel de spraakontgrendelingsfunctie in en stel het taalwachtwoord in\n\n5 Het slot kan worden bediend via Alexa",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Actienaam",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Ondersteunde talen",
|
||||
"英语": "Engels",
|
||||
"Google Home操作流程的值": "1. Gebruik de Smart Lock APP om sloten en gateways toe te voegen\n\n2. Schakel de externe ontgrendelingsfunctie van het slot in de APP in (deze functie is standaard uitgeschakeld). Zonder deze optie ondersteunt het slot Google Home niet\n\n3. Installeer de Google Home APP en klik op de knop \"\" in de linkerbovenhoek\n\n4. Selecteer op de pagina Instellingen \"Werken met Google\"\n\n5. Zoek naar \"ScienerSmart\" en gebruik de smart lock APP-account en het wachtwoord om te autoriseren",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Het wachtwoord moet ten minste 2 van de volgende bevatten: cijfers, letters en speciale tekens",
|
||||
"已开锁": "Ontgrendeld",
|
||||
"已闭锁": "Vergrendeld",
|
||||
"两次密码不一致哦": "De wachtwoorden zijn inconsistent"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po zresetowaniu żyły śródręcza zamka zostaną usunięte. Czy na pewno chcesz zresetować?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Rekord zakupu",
|
||||
"使用记录": "Rekord użytkownika",
|
||||
"失效时间要大于当前时间": "Czas wygaśnięcia musi być dłuższy niż aktualny czas",
|
||||
"修改名字": "Edytuj nazwę",
|
||||
"时": "Godzina",
|
||||
"分": "Minuta",
|
||||
"Amazon Alexa": "Amazonka Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Możesz użyć Alexy, aby odblokować, zablokować i sprawdzić status blokady",
|
||||
"支持的国家": "Kraje wspierane",
|
||||
"支持的国家值": "USA, Kanada, Wielka Brytania, Australia, Indie, Niemcy, Francja, Włochy, Hiszpania, Japonia",
|
||||
"操作流程": "Proces działania",
|
||||
"操作流程值": "1 Dodaj zamek i bramę za pomocą aplikacji Smart Lock\n\n2 Włącz funkcję zdalnego odblokowania blokady w aplikacji (ta funkcja jest domyślnie wyłączona). Jeśli nie masz tej opcji, zamek nie obsługuje Alexa\n\n3 Dodaj umiejętności do Alexy i autoryzuj je za pomocą konta i hasła aplikacji Smart lock. Po pomyślnym zakończeniu autoryzacji możesz odkryć urządzenia na koncie\n\n4 Zlokalizuj blokadę w aplikacji Alexa, włącz funkcję odblokowywania głosu i ustaw hasło językowe\n\n5 Zamek może być obsługiwany przez Alexa",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Nazwa działania",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Obsługiwane języki",
|
||||
"英语": "Angielski",
|
||||
"Google Home操作流程的值": "1. Użyj aplikacji Smart Lock, aby dodać zamki i bramy\n\n2. Włącz funkcję zdalnego odblokowania blokady w aplikacji (ta funkcja jest domyślnie wyłączona). Bez tej opcji blokada nie obsługuje Google Home\n\n3. Zainstaluj aplikację Google Home i kliknij przycisk „ ”w lewym górnym rogu\n\n4. Na stronie Ustawienia wybierz „ Pracuj z Google”\n\n5. Wyszukaj \"ScienerSmart\" i użyj konta i hasła Smart Lock APP do autoryzacji",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Hasło musi zawierać co najmniej 2 z następujących elementów: cyfry, litery i znaki specjalne",
|
||||
"已开锁": "Odblokowany",
|
||||
"已闭锁": "Zamknięty",
|
||||
"两次密码不一致哦": "Hasła są niespójne"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Após a reinicialização, as veias do metacarpo do bloqueio serão excluídas. Tens a certeza que queres reiniciar?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Comprar registro",
|
||||
"使用记录": "Registro do usuário",
|
||||
"失效时间要大于当前时间": "O tempo de expiração deve ser maior que o tempo atual",
|
||||
"修改名字": "Editar nome",
|
||||
"时": "Hora",
|
||||
"分": "Minuto",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Você pode usar Alexa para desbloquear, bloquear e verificar o status do bloqueio",
|
||||
"支持的国家": "Países suportados",
|
||||
"支持的国家值": "EUA, Canadá, Reino Unido, Austrália, Índia, Alemanha, França, Itália, Espanha, Japão",
|
||||
"操作流程": "Operação processo",
|
||||
"操作流程值": "1 Adicione um cadeado e gateway com o aplicativo Smart lock\n\n2 Ative a função de desbloqueio remoto do bloqueio no aplicativo (esta função está desativada por padrão). Se você não tiver essa opção, o bloqueio não suporta Alexa\n\n3 Adicione habilidades ao Alexa e autorize-as com a conta e a senha do aplicativo Smart lock. Depois que a autorização for bem-sucedida, você poderá descobrir dispositivos na conta\n\n4 Localize o bloqueio no aplicativo Alexa, ative a função de desbloqueio de voz e defina a senha do idioma\n\n5 O bloqueio pode ser operado através Alexa",
|
||||
"Google Home": "Casa do Google",
|
||||
"Action name": "Nome ação",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Idiomas suportados",
|
||||
"英语": "Português",
|
||||
"Google Home操作流程的值": "1. Use o aplicativo Smart lock para adicionar bloqueios e gateways\n\n2. Ative a função de desbloqueio remoto do bloqueio no APP (esta função está desativada por padrão). Sem essa opção, o bloqueio não suporta o Google Home\n\n3. Instale o Google Home APP e clique no botão \"\" no canto superior esquerdo\n\n4. Na página Configurações, selecione \"Trabalhar com o Google\"\n\n5. Procure por \"ScienerSmart\" e use a conta e a senha do APP do bloqueio inteligente para autorizar",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "A senha deve conter pelo menos 2 dos seguintes elementos: números, letras e caracteres especiais.",
|
||||
"已开锁": "Desbloqueado",
|
||||
"已闭锁": "Trancado",
|
||||
"两次密码不一致哦": "As senhas são inconsistentes"
|
||||
}
|
||||
@ -180,7 +180,7 @@
|
||||
"隐藏无效开锁权限": "Ascunde acces nevalid",
|
||||
"APP开锁时需手机连网的锁": "Încuietori care necesită telefon online",
|
||||
"增值服务": "Servicii",
|
||||
"关于": "Despre...",
|
||||
"关于": "Despre",
|
||||
"退出": "Autentificare",
|
||||
"删除账号": "Șterge cont",
|
||||
"个人信息": "Informații cont",
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "După resetare, venele metacarpale ale încuietorii vor fi şterse. Sigur doriți să resetați?",
|
||||
"在线": "Online",
|
||||
"离线": "Deconectat"
|
||||
"离线": "Deconectat",
|
||||
"购买记录": "Înregistrarea achiziției",
|
||||
"使用记录": "Înregistrare utilizator",
|
||||
"失效时间要大于当前时间": "Timpul de expirare trebuie să fie mai mare decât timpul curent.",
|
||||
"修改名字": "Editează nume",
|
||||
"时": "Oră",
|
||||
"分": "Minute",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Puteți folosi Alexa pentru a debloca, bloca și verifica starea de blocare a statului",
|
||||
"支持的国家": "Țări sprijinite",
|
||||
"支持的国家值": "Statele Unite ale Americii, Canada, Marea Britanie, Australia, India, Germania, Franța, Italia, Spania, Japonia",
|
||||
"操作流程": "Procesul operațional",
|
||||
"操作流程值": "1 Adăugați o blocare și o poartă cu Smart blocare APP\n\n2 Activați funcția de deblocare la distanță a încuietorii din APP (acesta funcție este oprită implicit). Dacă nu aveți această opțiune, blocarea nu suportă Alexa\n\n3 Adăugați abilități pentru Alexa și autorizați-le cu Smart blocare contul și parola APP. După ce autorizaţia va avea succes, puteţi descoperi dispozitivele sub cont\n\n4 Localizaţi blocarea în aplicaţia Alexa, activaţi funcţia de deblocare vocală, şi setaţi parola limbii\n\n5 Încuietoarea poate fi operată prin Alexa",
|
||||
"Google Home": "Acasă GoogleName",
|
||||
"Action name": "Nume acțiune",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Limbi suportate",
|
||||
"英语": "Engleză",
|
||||
"Google Home操作流程的值": "1. Utilizați Smart blocare APP pentru a adăuga încuietori și poartă\n\n2. Activaţi funcţia de deblocare la distanţă a blocării din APP (acesta funcţie este oprită în mod implicit). Fără această opțiune, blocarea nu suportă Google Home.\n\n3. Instalați Google Home APP și faceți clic pe butonul \" în colțul din stânga sus.\n\n4. Pe pagina Setări, selectați \"Lucrul cu Google\"\n\n5. Căutați \"ScienerSmart\" și utilizați contul de blocare inteligent APP și parola pentru a autoriza contul de blocare inteligentă",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Parola trebuie să conțină cel puțin 2 dintre următoarele: numere, litere și caractere speciale",
|
||||
"已开锁": "Deblocat",
|
||||
"已闭锁": "Blocat",
|
||||
"两次密码不一致哦": "Parolele sunt inconsistente"
|
||||
}
|
||||
@ -180,7 +180,7 @@
|
||||
"隐藏无效开锁权限": "Скрыть недопустимый доступ",
|
||||
"APP开锁时需手机连网的锁": "Замки требующие телефона онлайн",
|
||||
"增值服务": "Услуги",
|
||||
"关于": "О",
|
||||
"关于": "Касательно",
|
||||
"退出": "Выход",
|
||||
"删除账号": "Удалить аккаунт",
|
||||
"个人信息": "Информация счета",
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "После сброса пястные вены замка будут удалены. Вы уверены, что хотите сбросить?",
|
||||
"在线": "Онлайн",
|
||||
"离线": "Оффлайн"
|
||||
"离线": "Оффлайн",
|
||||
"购买记录": "Запись покупки",
|
||||
"使用记录": "Запись пользователя",
|
||||
"失效时间要大于当前时间": "Время истечения должно быть больше, чем текущее время",
|
||||
"修改名字": "Изменить имя",
|
||||
"时": "Час",
|
||||
"分": "Минута",
|
||||
"Amazon Alexa": "Амазон Алекса",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Вы можете использовать Alexa для разблокировки, блокировки и проверки состояния блокировки.",
|
||||
"支持的国家": "Поддерживаемые страны",
|
||||
"支持的国家值": "США, Канада, Великобритания, Австралия, Индия, Германия, Франция, Италия, Испания, Япония",
|
||||
"操作流程": "Процесс операции",
|
||||
"操作流程值": "1 Добавьте замок и шлюз с помощью приложения Smart Lock\n\n2 Включите функцию удаленной разблокировки замка в приложении (эта функция отключена по умолчанию). Если у вас нет этой опции, блокировка не поддерживает Alexa.\n\n3 Добавьте навыки в Alexa и авторизуйтесь с помощью учетной записи и пароля приложения Smart Lock. После успешной авторизации вы можете обнаружить устройства под учетной записью.\n\n4 Найдите замок в приложении Alexa, включите функцию голосовой разблокировки и установите языковой пароль.\n\n5 Замок можно управлять через Alexa",
|
||||
"Google Home": "Гугл Главная",
|
||||
"Action name": "Название действия",
|
||||
"ScienerSmart": "Сайенсмарт",
|
||||
"支持的语言": "Поддерживаемые языки",
|
||||
"英语": "Английский",
|
||||
"Google Home操作流程的值": "1. Используйте приложение Smart Lock для добавления замков и шлюзов.\n\n2. Включите функцию удаленной разблокировки замка в приложении (эта функция отключена по умолчанию). Без этой опции блокировка не поддерживает Google Home.\n\n3. Установите приложение Google Home и нажмите кнопку «» в верхнем левом углу.\n\n4. На странице настроек выберите «Работа с Google»\n\n5. Найдите «ScienerSmart» и используйте учетную запись приложения Smart Lock и пароль для авторизации.",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Пароль должен содержать не менее 2 из следующих символов: цифры, буквы и специальные символы.",
|
||||
"已开锁": "Разблокирован",
|
||||
"已闭锁": "Заперт",
|
||||
"两次密码不一致哦": "Пароли являются несовместимыми"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po resetovaní budú metakarpálne žily zámku vymazané. Ste si istí, že chcete obnoviť?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Zápis nákupu",
|
||||
"使用记录": "Záznam používateľa",
|
||||
"失效时间要大于当前时间": "Doba vypršania musí byť dlhšia ako aktuálny čas",
|
||||
"修改名字": "Upraviť názov",
|
||||
"时": "Hodina",
|
||||
"分": "Minúta",
|
||||
"Amazon Alexa": "Amazon alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Môžete použiť alexa odomknúť, zamknúť a skontrolovať stav zámku",
|
||||
"支持的国家": "Podporované krajiny",
|
||||
"支持的国家值": "Usa, kanada, veľká británia, austrália, india, nemecko, francúzsko, taliansko, španielsko, japonsko",
|
||||
"操作流程": "Prevádzkový proces",
|
||||
"操作流程值": "1 pridajte zámok a bránu s aplikáciou smart lock\n\n2 zapnite funkciu diaľkového odblokovania zámku v aplikácii (táto funkcia je predvolene vypnutá). Ak nemáte túto možnosť, zámok nepodporuje alexa\n\n3 pridajte zručnosti alexa a autorizujte ich pomocou účtu a hesla aplikácie smart lock. Po tom, čo je povolenie úspešné, môžete objaviť zariadenia pod účtom\n\n4 nájdite zámok v aplikácii alexa, zapnite funkciu odomknúť hlas a nastavte heslo jazyka\n\n5 zámok môže byť ovládaný cez alexa",
|
||||
"Google Home": "Google home",
|
||||
"Action name": "Názov akcie",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "Podporované jazyky",
|
||||
"英语": "Angl.",
|
||||
"Google Home操作流程的值": "1. použite aplikáciu smart lock na pridanie zámkov a brán\n\n2. povoľte diaľkovú funkciu odblokovania zámku v aplikácii (táto funkcia je predvolene vypnutá). Bez tejto možnosti zámok nepodporuje google home\n\n3. nainštalujte aplikáciu google home a kliknite na tlačidlo \"\" v ľavom hornom rohu\n\n4. na stránke nastavenia vyberte \"práca s google\"\n\n5. vyhľadajte \"scienersmart\" a použite účet aplikácie smart lock a heslo na autorizáciu",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Heslo musí obsahovať najmenej 2 z nasledujúcich: čísla, písmená a špeciálne znaky",
|
||||
"已开锁": "Odomknuté",
|
||||
"已闭锁": "Uzamknutý",
|
||||
"两次密码不一致哦": "Heslá sú nekonzistentné"
|
||||
}
|
||||
@ -181,7 +181,7 @@
|
||||
"隐藏无效开锁权限": "Сакриј неважећи приступ",
|
||||
"APP开锁时需手机连网的锁": "Браве које захтевају телефон на мрежи",
|
||||
"增值服务": "Услуге",
|
||||
"关于": "О",
|
||||
"关于": "Povodom",
|
||||
"退出": "Одјавити се",
|
||||
"删除账号": "Избриши налог",
|
||||
"个人信息": "Информације о налогу",
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Након ресетовања, метакарпалне вене браве ће бити избрисане. Да ли сте сигурни да желите да ресетујете?",
|
||||
"在线": "Онлине",
|
||||
"离线": "Ванмрежне"
|
||||
"离线": "Ванмрежне",
|
||||
"购买记录": "Записник о куповини",
|
||||
"使用记录": "Кориснички запис",
|
||||
"失效时间要大于当前时间": "Време истека мора бити дуже од тренутног времена",
|
||||
"修改名字": "Измени име",
|
||||
"时": "Сат",
|
||||
"分": "Минут",
|
||||
"Amazon Alexa": "амазонка Алека",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Можете користити Алека за откључавање, закључавање и проверу статуса закључавања",
|
||||
"支持的国家": "Подржане земље",
|
||||
"支持的国家值": "САД , Канада, Велика Британија, Аустралија, Индија, Немачка, Француска, Италија, Шпанија, Јапан",
|
||||
"操作流程": "Процес рада",
|
||||
"操作流程值": "1 Додајте браву и капију са Смарт лоцк АПП\n\n2 Омогућите функцију даљинског откључавања браве у АПП (ова функција је подразумевано искључена). Ако немате ову опцију, брава не подржава Алека\n\n3 Додајте вештине Алека и овлашћују их са налогом и лозинком Смарт Лоцк АПП је. Након што је ауторизација успешна, можете открити уређаје под рачуном\n\n4 Пронађите браву у апликацији Алека, укључите функцију гласовног откључавања и подесите лозинку језика\n\n5 Брава се може управљати преко Алека",
|
||||
"Google Home": "Гугл почетна страница",
|
||||
"Action name": "Име акције",
|
||||
"ScienerSmart": "Српско-хрватски",
|
||||
"支持的语言": "Подржани језици",
|
||||
"英语": "Енглески",
|
||||
"Google Home操作流程的值": "1 . Користите Смарт Лоцк АПП да додате браве и гатеваи\n\n2 . Омогућите функцију даљинског откључавања браве у АПП-у (ова функција је подразумевано искључена). Без ове опције, брава не подржава Гоогле Хоме\n\n3 . Инсталирајте Гоогле Хоме АПП и кликните на дугме \"+\" у горњем левом углу\n\n4 . На страници Подешавања изаберите \"Рад са Гоогле-ом\"\n\n5 . Потражите \"СциенерСмарт\" и користите паметну браву АПП налог и лозинку за ауторизацију",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Лозинка мора да садржи најмање 2 од следећег: бројеве, слова и специјалне знакове",
|
||||
"已开锁": "Откљуиана",
|
||||
"已闭锁": "Закљуиана",
|
||||
"两次密码不一致哦": "Лозинке су недоследне"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Efter återställd, de metakarpal venerna i låset tas bort. Är du säker på att du vill återställa?",
|
||||
"在线": "Online:",
|
||||
"离线": "Frånkoppling"
|
||||
"离线": "Frånkoppling",
|
||||
"购买记录": "Inköpsregistret",
|
||||
"使用记录": "Användarlista",
|
||||
"失效时间要大于当前时间": "Utgångstiden måste vara längre än nuvarande tid.",
|
||||
"修改名字": "Redigera namn",
|
||||
"时": "Timme",
|
||||
"分": "Minuter",
|
||||
"Amazon Alexa": "Amazon- Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Du kan använda Alexa för att låsa upp, låsa och kontrollera låsstatus",
|
||||
"支持的国家": "Stödda länder",
|
||||
"支持的国家值": "USA, Kanada, Storbritannien, Australien, Indien, Tyskland, Frankrike, Italien, Spanien, Japan.",
|
||||
"操作流程": "Driftsprocess",
|
||||
"操作流程值": "1 Lägg till ett lås och gateway med Smart Lås APP\n\n2 Aktivera fjärrlåsningsfunktionen för låset i APP (denna funktion är avstängd som standard). Om du inte har det här alternativet stöder inte låset Alexa\n\n3 Lägg till färdigheter till Alexa och godkänna dem med Smart lås APP konto och lösenord. När auktorisationen är framgångsrik kan du upptäcka enheter under kontot\n\n4 Hitta låset i Alexa-appen, slå på röst upplåsningsfunktionen och ställa in språklösenordet.\n\n5 Låset kan manövreras genom Alexa",
|
||||
"Google Home": "Google HomeName",
|
||||
"Action name": "Åtgärdsnamn",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Stödda språk",
|
||||
"英语": "Engelska",
|
||||
"Google Home操作流程的值": "1. Använd Smart Lås APP för att lägga till lås och gateways\n\n2. Aktivera fjärrlåsningsfunktionen för låset i APP (denna funktion är avstängd som standard). Utan det här alternativet stöder inte låset Google Home.\n\n3. Installera Google Home APP och klicka på \" \" knappen i det övre vänstra hörnet.\n\n4. På sidan Inställningar, välj \"Arbeta med Google\"\n\n5. Sök efter \"ScienerSmart\" och använd smart Lock APP-konto och lösenord för att auktorisera",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Lösenordet måste innehålla minst två av följande: siffror, bokstäver och specialtecken.",
|
||||
"已开锁": "Olås",
|
||||
"已闭锁": "Låst",
|
||||
"两次密码不一致哦": "Lösenord är inkonsekventa"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "หลังจากรีเซ็ตแล้วหลอดเลือดดำ metacarpal ของล็อคจะถูกลบออกคุณแน่ใจว่าอยากจะรีเซ็ต?",
|
||||
"在线": "ออนไลน์ผ่าน",
|
||||
"离线": "ออฟไลน์"
|
||||
"离线": "ออฟไลน์",
|
||||
"购买记录": "บันทึกการซื้อ",
|
||||
"使用记录": "บันทึกผู้ใช้",
|
||||
"失效时间要大于当前时间": "วันหมดอายุต้องนานกว่าเวลาปัจจุบัน",
|
||||
"修改名字": "แก้ไขชื่อ",
|
||||
"时": "ชั่วโมงต่อชั่วโมง",
|
||||
"分": "นาทีของคุณ",
|
||||
"Amazon Alexa": "Amazon Alexa อเมซอน",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "คุณสามารถใช้ Alexa เพื่อปลดล็อกล็อกและตรวจสอบสถานะการล็อก",
|
||||
"支持的国家": "ประเทศที่รองรับ",
|
||||
"支持的国家值": "สหรัฐอเมริกา, แคนาดา, สหราชอาณาจักร, ออสเตรเลีย, อินเดีย, เยอรมนี, ฝรั่งเศส, อิตาลี, สเปน, ญี่ปุ่น",
|
||||
"操作流程": "ขั้นตอนการดำเนินงาน",
|
||||
"操作流程值": "1เพิ่มล็อคและเกตเวย์กับ APP ล็อคสมาร์ท\n\n2เปิดใช้งานฟังก์ชั่นปลดล็อคระยะไกลของล็อคใน App (ฟังก์ชั่นนี้ถูกปิดโดยค่าเริ่มต้น) หากคุณไม่มีตัวเลือกนี้ล็อคจะไม่รองรับ Alexa\n\n3เพิ่มทักษะให้กับ Alexa และอนุญาตให้พวกเขาด้วยบัญชีสมาร์ทล็อค APP และรหัสผ่านหลังจากการอนุมัติประสบความสำเร็จคุณสามารถค้นพบอุปกรณ์ภายใต้บัญชี\n\n4ค้นหาการล็อคในแอป Alexa เปิดฟังก์ชั่นปลดล็อคด้วยเสียงและตั้งรหัสผ่านภาษา\n\n5ล็อคสามารถทำงานผ่าน Alexa",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "ชื่อแอคชัน",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "ภาษาที่รองรับ",
|
||||
"英语": "ภาษาอังกฤษแบบสบายๆ",
|
||||
"Google Home操作流程的值": "1.ใช้แอป Smart Lock เพื่อเพิ่มล็อคและเกตเวย์\n\n2.เปิดใช้งานฟังก์ชั่นการปลดล็อกระยะไกลของล็อคในแอป (ฟังก์ชั่นนี้ถูกปิดโดยค่าเริ่มต้น) ไม่มีตัวเลือกนี้ล็อคไม่รองรับ Google Home\n\n3.ติดตั้งแอป Google Home และคลิกปุ่ม \"\" ที่มุมบนซ้าย\n\n4.ในหน้าการตั้งค่าให้เลือก \"ทำงานร่วมกับ Google\"\n\n5.ค้นหา \"scienersmart\" และใช้บัญชีแอปล็อคอัจฉริยะและรหัสผ่านเพื่ออนุญาต",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "รหัสผ่านต้องมีอย่างน้อย2รายการต่อไปนี้: ตัวเลขตัวอักษรและอักขระพิเศษ",
|
||||
"已开锁": "ปลดล็อคแล้ว",
|
||||
"已闭锁": "ล็อคล็อคได้",
|
||||
"两次密码不一致哦": "รหัสผ่านไม่สอดคล้องกัน"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Sıfırlamadan sonra, kilidin metacarpal damarları silinecektir. Sıfırlamak istediğine emin misin?",
|
||||
"在线": "Çevrimiçi",
|
||||
"离线": "Çevrimdışı"
|
||||
"离线": "Çevrimdışı",
|
||||
"购买记录": "Satın alma kaydı",
|
||||
"使用记录": "Kullanıcı kaydı",
|
||||
"失效时间要大于当前时间": "Son kullanma süresi mevcut süreden daha uzun olmalıdır",
|
||||
"修改名字": "İsim düzenleme",
|
||||
"时": "Saat",
|
||||
"分": "Dakika",
|
||||
"Amazon Alexa": "Amazon alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Kilit durumunu açmak, kilitlemek ve kontrol etmek için alexa'yı kullanabilirsiniz",
|
||||
"支持的国家": "Desteklenen ülkeler",
|
||||
"支持的国家值": "Abd, kanada, İngiltere, avustralya, hindistan, almanya, fransa, İtalya, İspanya, japonya",
|
||||
"操作流程": "Operasyon süreci",
|
||||
"操作流程值": "1 akıllı kilit uygulaması ile bir kilit ve ağ geçidi ekleyin\n\n2 uygulamadaki kilidin uzaktan kilit açma işlevini etkinleştirin (bu işlev varsayılan olarak kapatılır). Bu seçeneğiniz yoksa, kilit alexa'yı desteklemiyor\n\n3 alexa'ya beceri ekleyin ve bunları akıllı kilit uygulamasının hesabı ve şifresiyle yetkilendirin. Yetkilendirme başarılı olduktan sonra, hesap altındaki cihazları keşfedebilirsiniz\n\n4 alexa uygulamasında kilidi bulun, ses açma işlevini açın ve dil şifresini ayarlayın\n\n5 kilit alexa ile çalıştırılabilir",
|
||||
"Google Home": "Google ev",
|
||||
"Action name": "Eylem adı",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "Desteklenen diller",
|
||||
"英语": "İngilizce",
|
||||
"Google Home操作流程的值": "1. kilitler ve ağ geçitleri eklemek için akıllı kilit uygulamasını kullanın\n\n2. uygulamadaki kilidin uzaktan kilit açma işlevini etkinleştirin (bu işlev varsayılan olarak kapatılır). Bu seçenek olmadan, kilit google home'u desteklemiyor\n\n3. google home uygulamasını yükleyin ve sol üst köşedeki \"\" düğmesine tıklayın\n\n4. ayarlar sayfasında \"google ile çalış\" ı seçin\n\n5. \"scienersmart\" için arama yapın ve yetkilendirmek için akıllı kilit uygulaması hesabını ve şifresini kullanın",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Şifre aşağıdakilerden en az 2 tane içermelidir: sayılar, harfler ve özel karakterler",
|
||||
"已开锁": "Unlocked",
|
||||
"已闭锁": "Kilitli",
|
||||
"两次密码不一致哦": "Şifreler tutarsız"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置後,鎖的掌靜脈將被刪除。 是否確實要重置?",
|
||||
"在线": "在線",
|
||||
"离线": "離線"
|
||||
"离线": "離線",
|
||||
"购买记录": "採購記錄",
|
||||
"使用记录": "用戶記錄",
|
||||
"失效时间要大于当前时间": "過期時間必須長於當前時間",
|
||||
"修改名字": "編輯名稱",
|
||||
"时": "小時",
|
||||
"分": "分鐘",
|
||||
"Amazon Alexa": "亞馬遜Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "您可以使用Alexa解鎖,鎖定和檢查鎖定狀態",
|
||||
"支持的国家": "支持的國家",
|
||||
"支持的国家值": "美國,加拿大,英國,澳大利亞,印度,德國,法國,意大利,西班牙,日本",
|
||||
"操作流程": "操作流程",
|
||||
"操作流程值": "1使用智能鎖應用程序添加鎖和網關\n\n2在應用程序中啟用鎖的遠程解鎖功能 (默認情況下此功能處於關閉狀態)。 如果您沒有此選項,則鎖不支持Alexa\n\n3向Alexa添加技能,並使用Smart lock應用程序的帳戶和密碼對其進行授權。 授權成功後,您可以發現該賬號下的設備\n\n4在Alexa應用程序中找到鎖,打開語音解鎖功能,並設置語言密碼\n\n5鎖可以通過Alexa操作",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "動作名稱",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "支持的語言",
|
||||
"英语": "英語",
|
||||
"Google Home操作流程的值": "1.使用智能鎖應用程序添加鎖和網關\n\n2.在應用程序中啟用鎖的遠程解鎖功能 (默認情況下此功能處於關閉狀態)。 如果沒有此選項,鎖不支持Google Home\n\n3.安裝Google Home應用程序,然後單擊左上角的 「」 按鈕\n\n4.在設置頁面上,選擇 「與Google合作」\n\n5.搜索 「scienershart」 並使用smart lock APP帳戶和密碼進行授權",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "密碼必須至少包含以下兩項: 數字、字母和特殊字符",
|
||||
"已开锁": "已解鎖",
|
||||
"已闭锁": "已鎖定",
|
||||
"两次密码不一致哦": "密碼不一致"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Після скидання п'ясткові вени замку будуть видалені. Ви впевнені, що хочете скинути налаштування?",
|
||||
"在线": "Онлайн",
|
||||
"离线": "Автономних"
|
||||
"离线": "Автономних",
|
||||
"购买记录": "Запис про покупку",
|
||||
"使用记录": "Запис користувача",
|
||||
"失效时间要大于当前时间": "Час експірації має бути довшим за поточний час",
|
||||
"修改名字": "Редагувати ім'я",
|
||||
"时": "година",
|
||||
"分": "хвилина",
|
||||
"Amazon Alexa": "Амазонка Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Ви можете використовувати Alexa для розблокування, блокування та перевірки статусу замка",
|
||||
"支持的国家": "Підтримувані країни",
|
||||
"支持的国家值": "США, Канада, Великобританія, Австралія, Індія, Німеччина, Франція, Італія, Іспанія, Японія",
|
||||
"操作流程": "Процес операції",
|
||||
"操作流程值": "1 Додайте замок і шлюз за допомогою програми Smart lock APP\n\n2 Увімкніть функцію дистанційного розблокування замка в APP (ця функція вимкнена за замовчуванням). Якщо у вас немає цієї опції, замок не підтримує Alexa\n\n3 Додайте навички до Alexa та авторизуйте їх за допомогою облікового запису та пароля програми Smart lock. Після успішної авторизації ви зможете виявити пристрої під обліковим записом\n\n4 Знайдіть замок у програмі Alexa, увімкніть функцію голосового розблокування та встановіть пароль мови\n\n5 Замком можна керувати через Alexa",
|
||||
"Google Home": "Домашня сторінка Google",
|
||||
"Action name": "Назва дії",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Підтримувані мови",
|
||||
"英语": "Англійська",
|
||||
"Google Home操作流程的值": "1. Використовуйте додаток Smart lock, щоб додати замки та шлюзи\n\n2. Увімкніть функцію дистанційного розблокування замка в APP (ця функція вимкнена за замовчуванням). Без цієї опції замок не підтримує Google Home\n\n3. Встановіть додаток Google Home і натисніть кнопку «+» у верхньому лівому куті\n\n4. На сторінці налаштувань виберіть «Робота з Google»\n\n5. Знайдіть «ScienerSmart» і використовуйте обліковий запис і пароль APP smart lock для авторизації",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Пароль повинен містити не менше 2 з наступних: цифри, букви та спеціальні символи",
|
||||
"已开锁": "Розблокована",
|
||||
"已闭锁": "Заблокований",
|
||||
"两次密码不一致哦": "Паролі несумісні"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Sau khi đặt lại, các tĩnh mạch metacarpal của khóa sẽ bị xóa. Bạn có chắc muốn thiết lập lại không?",
|
||||
"在线": "Trực tuyến",
|
||||
"离线": "Ngoại tuyến"
|
||||
"离线": "Ngoại tuyến",
|
||||
"购买记录": "Hồ Sơ mua hàng",
|
||||
"使用记录": "Bản ghi người dùng",
|
||||
"失效时间要大于当前时间": "Thời gian hết hạn phải dài hơn thời gian hiện tại",
|
||||
"修改名字": "Chỉnh sửa tên",
|
||||
"时": "Giờ",
|
||||
"分": "PHÚT",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Bạn có thể sử dụng Alexa để mở khóa, khóa và kiểm tra trạng thái khóa",
|
||||
"支持的国家": "Các Quốc Gia được hỗ trợ",
|
||||
"支持的国家值": "Mỹ, Canada, Anh, Úc, Ấn Độ, Đức, Pháp, Ý, Tây Ban Nha, Nhật Bản",
|
||||
"操作流程": "Quy trình vận hành",
|
||||
"操作流程值": "1 thêm khóa và cổng vào với ứng dụng Smart Lock\n\n2 Bật chức năng mở khóa từ xa của khóa trong ứng dụng (chức năng này bị tắt theo mặc định). Nếu bạn không có tùy chọn này, khóa không hỗ trợ Alexa\n\n3 thêm kỹ năng vào Alexa và ủy quyền cho họ bằng tài khoản và mật khẩu của ứng dụng Smart Lock. Sau khi ủy quyền thành công, bạn có thể khám phá các thiết bị trong tài khoản\n\n4 xác định vị trí khóa trong ứng dụng Alexa, bật chức năng mở khóa bằng giọng nói và đặt mật khẩu ngôn ngữ\n\n5 ổ khóa có thể hoạt động thông qua Alexa",
|
||||
"Google Home": "Trang chủ Google",
|
||||
"Action name": "Tên hành động",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "Ngôn ngữ được hỗ trợ",
|
||||
"英语": "Tiếng Anh",
|
||||
"Google Home操作流程的值": "1. Sử dụng ứng dụng khóa thông minh để thêm khóa và cổng\n\n2. Kích hoạt chức năng mở khóa từ xa của khóa trong ứng dụng (chức năng này bị tắt theo mặc định). Không có tùy chọn này, khóa không hỗ trợ Google Home\n\n3. Cài đặt ứng dụng Google Home và nhấp vào nút \"\" ở góc trên cùng bên trái\n\n4. trên trang cài đặt, chọn \"làm việc với Google\"\n\n5. Tìm kiếm \"scienersmart\" và sử dụng tài khoản và mật khẩu ứng dụng Smart Lock để ủy quyền",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Mật khẩu phải chứa ít nhất 2 trong số những điều sau: số, chữ cái và ký tự đặc biệt",
|
||||
"已开锁": "Đã mở khóa",
|
||||
"已闭锁": "Khóa",
|
||||
"两次密码不一致哦": "Mật khẩu không nhất quán"
|
||||
}
|
||||
@ -1091,19 +1091,22 @@
|
||||
"修改名字": "修改名字",
|
||||
"时": "时",
|
||||
"分": "分",
|
||||
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "您可以使用Alexa进行开锁、闭锁和查看锁状态",
|
||||
"支持的国家": "支持的国家",
|
||||
"支持的国家值": "美国、加拿大、英国、澳大利亚、印度、德国、法国、意大利、西班牙、日本",
|
||||
"操作流程": "操作流程",
|
||||
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "密码需至少包含数字/字母/字符中的2种组合",
|
||||
|
||||
"操作流程值":"1 用智能锁APP添加锁和网关\n\n2 在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Alexa \n\n3 在Alexa中添加Skill,并用智能锁APP的账号和密码进行授权。授权成功后就可以发现账号下的设备\n\n4 在Alexa app里找到锁,开启语音开锁的功能,并设置语言密码\n\n5 可以通过Alexa操作锁了",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Action name",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "支持的语言",
|
||||
"英语": "英语",
|
||||
"Google Home操作流程的值": "1.用智能锁APP添加锁和网关\n\n2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home \n\n3.安装Google Home APP,点击左上角的“+”按钮\n\n4.在设置页面,选择“与Google协同工作”\n\n5.搜索“ScienerSmart”,并用智能锁APP的账号和密码进行授权\n\n"
|
||||
"Google Home操作流程的值": "1.用智能锁APP添加锁和网关\n\n2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home \n\n3.安装Google Home APP,点击左上角的“+”按钮\n\n4.在设置页面,选择“与Google协同工作”\n\n5.搜索“ScienerSmart”,并用智能锁APP的账号和密码进行授权\n\n",
|
||||
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "密码需至少包含数字/字母/字符中的2种组合",
|
||||
"已开锁": "已开锁",
|
||||
"已闭锁": "已闭锁",
|
||||
"两次密码不一致哦": "两次密码不一致哦"
|
||||
}
|
||||
|
||||
@ -46,12 +46,11 @@ class GatewayConfiguringWifiCommand extends SenderProtocol {
|
||||
subData = getFixedLengthList(subData, 20 - passwordLength);
|
||||
|
||||
//gatewayConfigurationStr
|
||||
// final int clientIdLength = utf8.encode(gatewayConfigurationStr!).length;
|
||||
// subData.add(clientIdLength);
|
||||
final int clientIdLength = utf8.encode(gatewayConfigurationStr!).length;
|
||||
subData.add(clientIdLength);
|
||||
subData.addAll(utf8.encode(gatewayConfigurationStr!));
|
||||
// subData = getFixedLengthList(subData, 20 - clientIdLength);
|
||||
|
||||
data.add(subData.length);
|
||||
data.addAll(subData);
|
||||
|
||||
printLog(data);
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
// 获取网关状态
|
||||
import 'dart:convert';
|
||||
|
||||
@ -8,7 +7,6 @@ import '../io_tool/io_tool.dart';
|
||||
import '../io_type.dart';
|
||||
|
||||
class GatewayGetStatusCommand extends SenderProtocol {
|
||||
|
||||
GatewayGetStatusCommand({
|
||||
this.lockID,
|
||||
this.userID,
|
||||
@ -45,7 +43,6 @@ class GatewayGetStatusCommand extends SenderProtocol {
|
||||
subData.addAll(utf8.encode(userID!));
|
||||
subData = getFixedLengthList(subData, 20 - passwordLength);
|
||||
|
||||
data.add(subData.length);
|
||||
data.addAll(subData);
|
||||
|
||||
printLog(data);
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
// import 'package:crypto/crypto.dart' as crypto;
|
||||
@ -10,14 +9,12 @@ import '../io_tool/io_tool.dart';
|
||||
import '../io_type.dart';
|
||||
|
||||
class GatewayGetWifiCommand extends SenderProtocol {
|
||||
|
||||
GatewayGetWifiCommand({
|
||||
this.userID,
|
||||
}) : super(CommandType.gatewayGetWifiList);
|
||||
|
||||
String? userID;
|
||||
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'SenderGetWifiCommand{userID: $userID}';
|
||||
@ -36,14 +33,12 @@ class GatewayGetWifiCommand extends SenderProtocol {
|
||||
data.add(type1);
|
||||
data.add(type2);
|
||||
|
||||
|
||||
//userID 20
|
||||
final int userIDLength = utf8.encode(userID!).length;
|
||||
subData.addAll(utf8.encode(userID!));
|
||||
subData = getFixedLengthList(subData, 20 - userIDLength);
|
||||
AppLog.log('ebcData: $subData');
|
||||
|
||||
data.add(subData.length);
|
||||
data.addAll(subData);
|
||||
|
||||
printLog(data);
|
||||
@ -61,7 +56,8 @@ class GatewayGetWifiReply extends Reply {
|
||||
}
|
||||
|
||||
class GatewayGetWifiListReply extends Reply {
|
||||
GatewayGetWifiListReply.parseData(CommandType commandType, List<int> dataDetail)
|
||||
GatewayGetWifiListReply.parseData(
|
||||
CommandType commandType, List<int> dataDetail)
|
||||
: super.parseData(commandType, dataDetail) {
|
||||
data = dataDetail;
|
||||
}
|
||||
@ -10,8 +10,8 @@ import 'package:star_lock/blue/io_protocol/io_cleanUpUsers.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_deletUser.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_editUser.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_factoryDataReset.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_gateway_configuringWifi.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_gateway_getWifiList.dart';
|
||||
import 'package:star_lock/blue/io_gateway/io_gateway_configuringWifi.dart';
|
||||
import 'package:star_lock/blue/io_gateway/io_gateway_getWifiList.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_otaUpgrade.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_processOtaUpgrade.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart';
|
||||
@ -33,7 +33,7 @@ import 'io_protocol/io_addUser.dart';
|
||||
import 'io_protocol/io_checkingCardStatus.dart';
|
||||
import 'io_protocol/io_checkingUserInfoCount.dart';
|
||||
import 'io_protocol/io_configuringWifi.dart';
|
||||
import 'io_protocol/io_gateway_getStatus.dart';
|
||||
import 'io_gateway/io_gateway_getStatus.dart';
|
||||
import 'io_protocol/io_getPrivateKey.dart';
|
||||
import 'io_protocol/io_getPublicKey.dart';
|
||||
import 'io_protocol/io_getStarLockStatusInfo.dart';
|
||||
@ -110,7 +110,8 @@ class CommandReciverManager {
|
||||
// 获取的加密数组
|
||||
final List<int> getDataList = data.sublist(12, 12 + dataLen);
|
||||
|
||||
final List<String>? res = await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<String>? res =
|
||||
await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList = changeStringListToIntList(res!);
|
||||
|
||||
// 解密
|
||||
@ -245,7 +246,8 @@ class CommandReciverManager {
|
||||
break;
|
||||
case CommandType.updataLockRemoteControlList:
|
||||
{
|
||||
reply = UpdataLockRemoteControlListReply.parseData(commandType, data);
|
||||
reply =
|
||||
UpdataLockRemoteControlListReply.parseData(commandType, data);
|
||||
}
|
||||
break;
|
||||
case CommandType.updataLockSet:
|
||||
@ -260,7 +262,8 @@ class CommandReciverManager {
|
||||
break;
|
||||
case CommandType.gatewayConfiguringWifiResult:
|
||||
{
|
||||
reply = GatewayConfiguringWifiResultReply.parseData(commandType, data);
|
||||
reply =
|
||||
GatewayConfiguringWifiResultReply.parseData(commandType, data);
|
||||
}
|
||||
break;
|
||||
case CommandType.gatewayGetWifiList:
|
||||
@ -313,8 +316,8 @@ class CommandReciverManager {
|
||||
case 19:
|
||||
{
|
||||
// 重置开锁密码
|
||||
reply = SenderResetPasswordsReply.parseData(
|
||||
commandType, data);
|
||||
reply =
|
||||
SenderResetPasswordsReply.parseData(commandType, data);
|
||||
}
|
||||
break;
|
||||
case 20:
|
||||
@ -347,8 +350,8 @@ class CommandReciverManager {
|
||||
case 26:
|
||||
{
|
||||
// 注册遥控开始
|
||||
reply = SenderAddRemoteControlWithTimeCycleCoercionReply.parseData(
|
||||
commandType, data);
|
||||
reply = SenderAddRemoteControlWithTimeCycleCoercionReply
|
||||
.parseData(commandType, data);
|
||||
}
|
||||
break;
|
||||
case 27:
|
||||
|
||||
@ -3,7 +3,7 @@ import 'package:star_lock/blue/io_protocol/io_addFace.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_cleanUpUsers.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_deletUser.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_gateway_getWifiList.dart';
|
||||
import 'package:star_lock/blue/io_gateway/io_gateway_getWifiList.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_otaUpgrade.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_processOtaUpgrade.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart';
|
||||
@ -25,8 +25,8 @@ import 'io_protocol/io_checkingUserInfoCount.dart';
|
||||
import 'io_protocol/io_configuringWifi.dart';
|
||||
import 'io_protocol/io_editUser.dart';
|
||||
import 'io_protocol/io_factoryDataReset.dart';
|
||||
import 'io_protocol/io_gateway_configuringWifi.dart';
|
||||
import 'io_protocol/io_gateway_getStatus.dart';
|
||||
import 'io_gateway/io_gateway_configuringWifi.dart';
|
||||
import 'io_gateway/io_gateway_getStatus.dart';
|
||||
import 'io_protocol/io_getPrivateKey.dart';
|
||||
import 'io_protocol/io_getPublicKey.dart';
|
||||
import 'io_protocol/io_getStarLockStatusInfo.dart';
|
||||
|
||||
@ -107,9 +107,9 @@ class F {
|
||||
static String get apiPrefix {
|
||||
switch (appFlavor) {
|
||||
case Flavor.local:
|
||||
// return 'https://ge.lock.star-lock.cn'; // 葛工
|
||||
// return 'http://192.168.1.15:8022'; // 谢工
|
||||
return 'http://zhou.lock.star-lock.cn'; // 周工
|
||||
return 'http://lock.ge.star-lock.cn'; // 葛工
|
||||
// return 'http://192.168.1.15:8022'; // 谢工
|
||||
// return 'http://zhou.lock.star-lock.cn'; // 周工
|
||||
|
||||
case Flavor.dev:
|
||||
case Flavor.xhj_dev:
|
||||
|
||||
@ -10,7 +10,7 @@ class StarLockLoginState {
|
||||
RxBool agree = false.obs;
|
||||
|
||||
RxString countryCode = '86'.obs;
|
||||
RxString countryName = '中国'.obs;
|
||||
RxString countryName = '中国'.tr.obs;
|
||||
|
||||
RxString emailOrPhone = ''.obs;
|
||||
RxString pwd = ''.obs;
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:azlistview/azlistview.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@ -17,7 +16,8 @@ class SelectCountryRegionPage extends StatefulWidget {
|
||||
const SelectCountryRegionPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<SelectCountryRegionPage> createState() => _SelectCountryRegionPageState();
|
||||
State<SelectCountryRegionPage> createState() =>
|
||||
_SelectCountryRegionPageState();
|
||||
}
|
||||
|
||||
class _SelectCountryRegionPageState extends State<SelectCountryRegionPage> {
|
||||
@ -29,18 +29,20 @@ class _SelectCountryRegionPageState extends State<SelectCountryRegionPage> {
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
SuspensionUtil.setShowSuspensionStatus(countriesList.cast<ISuspensionBean>());
|
||||
SuspensionUtil.setShowSuspensionStatus(
|
||||
countriesList.cast<ISuspensionBean>());
|
||||
Future.delayed(const Duration(milliseconds: 20), getCountriesListRequest);
|
||||
}
|
||||
|
||||
//请求国家/地区json文件
|
||||
Future<void> getCountriesListRequest() async {
|
||||
final CountryRegionEntity entity = await ApiRepository.to.getCountryRegion('1');
|
||||
final CountryRegionEntity entity =
|
||||
await ApiRepository.to.getCountryRegion('1');
|
||||
countriesList.clear();
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
countriesList.addAll(entity.dataList!);
|
||||
for(final CountryRegionModel model in countriesList){
|
||||
if(model.name! == '中国'){
|
||||
for (final CountryRegionModel model in countriesList) {
|
||||
if (model.code! == '86') {
|
||||
topCountriesList.add(model);
|
||||
break;
|
||||
}
|
||||
@ -77,15 +79,14 @@ class _SelectCountryRegionPageState extends State<SelectCountryRegionPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: (){
|
||||
onTap: () {
|
||||
FocusScope.of(context).unfocus();
|
||||
},
|
||||
child: Scaffold(
|
||||
resizeToAvoidBottomInset: false,
|
||||
backgroundColor: const Color(0xFFFFFFFF),
|
||||
appBar: TitleAppBar(
|
||||
barTitle:
|
||||
'选择国家/地区'.tr,
|
||||
barTitle: '选择国家/地区'.tr,
|
||||
haveBack: true,
|
||||
backgroundColor: AppColors.mainColor,
|
||||
),
|
||||
@ -95,38 +96,43 @@ class _SelectCountryRegionPageState extends State<SelectCountryRegionPage> {
|
||||
editingController: searchController,
|
||||
backgroundColor: AppColors.mainBackgroundColor,
|
||||
onSubmittedAction: () {
|
||||
if(searchController.text.isEmpty){
|
||||
if (searchController.text.isEmpty) {
|
||||
getCountriesListRequest();
|
||||
}else{
|
||||
final List<CountryRegionModel> searchList = <CountryRegionModel>[];
|
||||
for (int i = 0, length = countriesList.length; i < length; i++) {
|
||||
} else {
|
||||
final List<CountryRegionModel> searchList =
|
||||
<CountryRegionModel>[];
|
||||
for (int i = 0, length = countriesList.length;
|
||||
i < length;
|
||||
i++) {
|
||||
final CountryRegionModel countryModel = countriesList[i];
|
||||
if(countryModel.name!.contains(searchController.text) || countryModel.code!.contains(searchController.text)){
|
||||
if (countryModel.name!.contains(searchController.text) ||
|
||||
countryModel.code!.contains(searchController.text)) {
|
||||
searchList.add(countryModel);
|
||||
}
|
||||
}
|
||||
countriesList= searchList;
|
||||
countriesList = searchList;
|
||||
_handleList(searchList);
|
||||
}
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
SizedBox(height:20.h),
|
||||
SizedBox(height: 20.h),
|
||||
Visibility(
|
||||
visible: searchController.text.isEmpty,
|
||||
child: Utils.getSusItem(context, '★')
|
||||
),
|
||||
if (countriesList.isNotEmpty) Visibility(
|
||||
visible: searchController.text.isEmpty,
|
||||
child: Utils.getListItem(context, topCountriesList[0], () {
|
||||
final CountryRegionModel model = topCountriesList[0];
|
||||
final Map<String, dynamic> resultMap = {};
|
||||
resultMap['code'] = model.code ?? '';
|
||||
resultMap['countryId'] = model.countryId.toString() ?? '';
|
||||
resultMap['countryName'] = model.name ?? '' ;
|
||||
Navigator.pop(context, resultMap);
|
||||
})
|
||||
) else Container(),
|
||||
child: Utils.getSusItem(context, '★')),
|
||||
if (countriesList.isNotEmpty)
|
||||
Visibility(
|
||||
visible: searchController.text.isEmpty,
|
||||
child: Utils.getListItem(context, topCountriesList[0], () {
|
||||
final CountryRegionModel model = topCountriesList[0];
|
||||
final Map<String, dynamic> resultMap = {};
|
||||
resultMap['code'] = model.code ?? '';
|
||||
resultMap['countryId'] = model.countryId.toString() ?? '';
|
||||
resultMap['countryName'] = model.name ?? '';
|
||||
Navigator.pop(context, resultMap);
|
||||
}))
|
||||
else
|
||||
Container(),
|
||||
Expanded(
|
||||
child: AzListView(
|
||||
data: countriesList,
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
|
||||
import 'package:expandable/expandable.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_native_contact_picker/flutter_native_contact_picker.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
@ -19,6 +20,7 @@ import '../../../../app_settings/app_colors.dart';
|
||||
import '../../../../tools/CustomUnderlineTabIndicator.dart';
|
||||
import '../../../../tools/NativeInteractionTool.dart';
|
||||
import '../../../../tools/commonItem.dart';
|
||||
import '../../../../tools/key_name_item.dart';
|
||||
import '../../../../tools/submitBtn.dart';
|
||||
import '../../../../tools/titleAppBar.dart';
|
||||
import 'authorizedAdmin_logic.dart';
|
||||
@ -136,12 +138,15 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
}
|
||||
},
|
||||
),
|
||||
CommonItem(
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '',
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: getTFWidget(
|
||||
false, '请输入姓名'.tr, 2)),
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.keyNameController),
|
||||
// CommonItem(
|
||||
// leftTitel: '姓名'.tr,
|
||||
// rightTitle: '',
|
||||
// isHaveRightWidget: true,
|
||||
// rightWidget: getTFWidget(false, '请输入姓名'.tr, 2)),
|
||||
Container(height: 10.h),
|
||||
],
|
||||
);
|
||||
@ -191,18 +196,19 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
Widget keyOnlyManageWidget() {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
CommonItem(
|
||||
leftTitel: '仅管理自己创建的用户'.tr,
|
||||
rightTitle: '',
|
||||
isHaveRightWidget: true,
|
||||
isTipsImg: true,
|
||||
tipsImgAction: () {
|
||||
ShowTipView().showSureAlertDialog('授权管理员只能查看和管理自己下发的钥匙、密码等权限'.tr);
|
||||
},
|
||||
rightWidget: SizedBox(
|
||||
width: 60.w,
|
||||
height: 50.h,
|
||||
child: _onlyManageYouCreatesUserSwitch())),
|
||||
// CommonItem(
|
||||
// leftTitel: '仅管理自己创建的用户'.tr,
|
||||
// rightTitle: '',
|
||||
// isHaveRightWidget: true,
|
||||
// isTipsImg: true,
|
||||
// tipsImgAction: () {
|
||||
// ShowTipView().showSureAlertDialog('授权管理员只能查看和管理自己下发的钥匙、密码等权限'.tr);
|
||||
// },
|
||||
// rightWidget: SizedBox(
|
||||
// width: 60.w,
|
||||
// height: 50.h,
|
||||
// child: _onlyManageYouCreatesUserSwitch())),
|
||||
onlyManageSelf('仅管理自己创建的用户'.tr),
|
||||
Container(height: 10.h),
|
||||
keyRealNameWidget(),
|
||||
Container(height: 10.h),
|
||||
@ -210,6 +216,67 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
);
|
||||
}
|
||||
|
||||
Widget onlyManageSelf(String leftTitel) {
|
||||
return Container(
|
||||
// height: 65.h,
|
||||
width: 1.sw,
|
||||
padding: EdgeInsets.only(left: 20.w, right: 5.w, top: 10.h, bottom: 10.h),
|
||||
color: Colors.white,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
SizedBox(
|
||||
width: 1.sw - 150.w,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Flexible(
|
||||
child: Text(leftTitel ?? '',
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(fontSize: 22.sp)),
|
||||
),
|
||||
SizedBox(width: 5.w),
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
ShowTipView()
|
||||
.showSureAlertDialog('授权管理员只能查看和管理自己下发的钥匙、密码等权限'.tr);
|
||||
},
|
||||
child: Container(
|
||||
width: 50.h,
|
||||
height: 50.h,
|
||||
// color: Colors.red,
|
||||
padding:
|
||||
EdgeInsets.only(right: 10.h, top: 15.h, bottom: 10.h),
|
||||
child: Image.asset(
|
||||
'images/icon_tips_Q.png',
|
||||
width: 20.w,
|
||||
height: 20.w,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
// SizedBox(width: 6.w),
|
||||
// Spacer(),
|
||||
CupertinoSwitch(
|
||||
activeColor: CupertinoColors.activeBlue,
|
||||
trackColor: CupertinoColors.systemGrey5,
|
||||
thumbColor: CupertinoColors.white,
|
||||
value: state.onlyManageYouCreatesUser.value,
|
||||
onChanged: (bool value) {
|
||||
setState(() {
|
||||
state.onlyManageYouCreatesUser.value =
|
||||
!state.onlyManageYouCreatesUser.value;
|
||||
});
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget keyBottomWidget(String tipStr) {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
@ -258,7 +325,8 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
},
|
||||
child: Text(
|
||||
'批量授权锁'.tr,
|
||||
style: TextStyle(color: AppColors.mainColor, fontSize: 24.sp),
|
||||
style:
|
||||
TextStyle(color: AppColors.mainColor, fontSize: 24.sp),
|
||||
)),
|
||||
],
|
||||
),
|
||||
@ -352,8 +420,9 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
height: 10.h,
|
||||
),
|
||||
OutLineBtn(
|
||||
btnName:
|
||||
state.emailOrPhoneController.text.contains('@') ? '邮件通知'.tr : '短信通知'.tr,
|
||||
btnName: state.emailOrPhoneController.text.contains('@')
|
||||
? '邮件通知'.tr
|
||||
: '短信通知'.tr,
|
||||
onClick: () {
|
||||
Get.toNamed(Routers.sendEmailNotificationPage,
|
||||
arguments: <String, Object?>{
|
||||
@ -483,20 +552,20 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
}
|
||||
|
||||
//仅管理自己创建的用户
|
||||
CupertinoSwitch _onlyManageYouCreatesUserSwitch() {
|
||||
return CupertinoSwitch(
|
||||
activeColor: CupertinoColors.activeBlue,
|
||||
trackColor: CupertinoColors.systemGrey5,
|
||||
thumbColor: CupertinoColors.white,
|
||||
value: state.onlyManageYouCreatesUser.value,
|
||||
onChanged: (bool value) {
|
||||
setState(() {
|
||||
state.onlyManageYouCreatesUser.value =
|
||||
!state.onlyManageYouCreatesUser.value;
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
// CupertinoSwitch _onlyManageYouCreatesUserSwitch() {
|
||||
// return CupertinoSwitch(
|
||||
// activeColor: CupertinoColors.activeBlue,
|
||||
// trackColor: CupertinoColors.systemGrey5,
|
||||
// thumbColor: CupertinoColors.white,
|
||||
// value: state.onlyManageYouCreatesUser.value,
|
||||
// onChanged: (bool value) {
|
||||
// setState(() {
|
||||
// state.onlyManageYouCreatesUser.value =
|
||||
// !state.onlyManageYouCreatesUser.value;
|
||||
// });
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
|
||||
Future _openModalBottomSheet() async {
|
||||
showModalBottomSheet(
|
||||
@ -644,11 +713,11 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
TabBar _tabBar() {
|
||||
return TabBar(
|
||||
controller: state.tabController,
|
||||
tabs: _itemTabs.map(_tab).toList(),
|
||||
onTap: (int index) {
|
||||
FocusScope.of(context).requestFocus(FocusNode());
|
||||
},
|
||||
isScrollable: true,
|
||||
tabs: _itemTabs.map(_tab).toList(),
|
||||
isScrollable: false,
|
||||
indicatorColor: Colors.red,
|
||||
unselectedLabelColor: Colors.black,
|
||||
unselectedLabelStyle: TextStyle(
|
||||
@ -665,20 +734,19 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
borderSide: BorderSide(color: AppColors.mainColor, width: 4.w),
|
||||
strokeCap: StrokeCap.round,
|
||||
width: 30.w),
|
||||
labelPadding: EdgeInsets.symmetric(horizontal: 10.w),
|
||||
padding: EdgeInsets.zero, // 去除TabBar两侧的间隙
|
||||
);
|
||||
}
|
||||
|
||||
Tab _tab(ItemView item) {
|
||||
return Tab(
|
||||
child: Container(
|
||||
width: 1.sw / 4,
|
||||
margin: EdgeInsets.all(10.w),
|
||||
child: Text(
|
||||
item.title,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
);
|
||||
child: Container(
|
||||
// color: Colors.red,
|
||||
width: (1.sw - 10.w * 3) / 2,
|
||||
// width: 1.sw / 4,
|
||||
alignment: Alignment.center,
|
||||
child: Text(item.title, textAlign: TextAlign.center)));
|
||||
}
|
||||
|
||||
Widget _pageWidget() {
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@ -15,6 +14,7 @@ import '../../../../app_settings/app_colors.dart';
|
||||
import '../../../../tools/CustomUnderlineTabIndicator.dart';
|
||||
import '../../../../tools/commonItem.dart';
|
||||
import '../../../../tools/dateTool.dart';
|
||||
import '../../../../tools/key_name_item.dart';
|
||||
import '../../../../tools/storage.dart';
|
||||
import '../../../../tools/submitBtn.dart';
|
||||
import '../../../../tools/titleAppBar.dart';
|
||||
@ -78,10 +78,10 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyBottomWidget()
|
||||
],
|
||||
),
|
||||
@ -93,10 +93,10 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyTimeLimitWidget(),
|
||||
// SizedBox(height: 10.h),
|
||||
keyBottomWidget()
|
||||
@ -110,10 +110,10 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyCyclicDate(),
|
||||
SizedBox(height: 10.h),
|
||||
keyBottomWidget()
|
||||
@ -126,21 +126,6 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
}
|
||||
}
|
||||
|
||||
// 密码命名输入框
|
||||
Widget perpetualKeyWidget(
|
||||
String titleStr, String rightTitle, TextEditingController controller) {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
CommonItem(
|
||||
leftTitel: titleStr,
|
||||
rightTitle: '',
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: getTFWidget(rightTitle)),
|
||||
Container(height: 10.h),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
// 限时顶部选择日期
|
||||
Widget keyTimeLimitWidget() {
|
||||
return Column(
|
||||
@ -154,7 +139,8 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.parse(state.timeLimitBeginTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitBeginTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
@ -164,10 +150,11 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
rightTitle: state.timeLimitEndTime.value,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
final PDuration selectDate =
|
||||
PDuration.parse(DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitEndTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
@ -188,14 +175,14 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result =
|
||||
await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
if (result != null && result.isNotEmpty) {
|
||||
state.weekdaysList.value = result['validityValue'];
|
||||
state.cycleBeginTime.value = result['starDate'];
|
||||
@ -212,7 +199,8 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
@ -232,10 +220,12 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
visible: state.effectiveDateTime.value.isNotEmpty,
|
||||
child: CommonItem(
|
||||
leftTitel: '有效时间'.tr,
|
||||
rightTitle: '${state.effectiveDateTime.value}-${state.failureDateTime.value}',
|
||||
rightTitle:
|
||||
'${state.effectiveDateTime.value}-${state.failureDateTime.value}',
|
||||
isHaveDirection: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
@ -304,59 +294,6 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
);
|
||||
}
|
||||
|
||||
// 接受者信息输入框
|
||||
Widget getTFWidget(String tfStr) {
|
||||
return Container(
|
||||
// color: Colors.red,
|
||||
height: 65.h,
|
||||
width: 300.w,
|
||||
padding: EdgeInsets.only(top: 5.h),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: TextField(
|
||||
//输入框一行
|
||||
maxLines: 1,
|
||||
inputFormatters: <TextInputFormatter>[
|
||||
FilteringTextInputFormatter.deny('\n'),
|
||||
LengthLimitingTextInputFormatter(50),
|
||||
],
|
||||
style: TextStyle(
|
||||
fontSize: 22.sp, color: AppColors.darkGrayTextColor),
|
||||
controller: state.nameController,
|
||||
autofocus: false,
|
||||
textAlign: TextAlign.end,
|
||||
decoration: InputDecoration(
|
||||
//输入里面输入文字内边距设置
|
||||
// contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
|
||||
hintText: tfStr,
|
||||
hintStyle: TextStyle(fontSize: 22.sp),
|
||||
focusedBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
disabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
enabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
border: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 0),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 10.w,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
//isStressFingerprint false:不是胁迫指纹 ture:胁迫指纹
|
||||
CupertinoSwitch _isStressFingerprint() {
|
||||
return CupertinoSwitch(
|
||||
@ -402,10 +339,8 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
},
|
||||
tabs: state.fromType.value == 1
|
||||
? _itemTabs.map(_tab).toList()
|
||||
: _fromCheckInTypeItemTabs
|
||||
.map(_tab)
|
||||
.toList(),
|
||||
isScrollable: true,
|
||||
: _fromCheckInTypeItemTabs.map(_tab).toList(),
|
||||
isScrollable: false,
|
||||
indicatorColor: Colors.red,
|
||||
unselectedLabelColor: Colors.black,
|
||||
unselectedLabelStyle: TextStyle(
|
||||
@ -422,13 +357,18 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
borderSide: BorderSide(color: AppColors.mainColor, width: 4.w),
|
||||
strokeCap: StrokeCap.round,
|
||||
width: 30.w),
|
||||
labelPadding: EdgeInsets.symmetric(horizontal: 10.w),
|
||||
padding: EdgeInsets.zero, // 去除TabBar两侧的间隙
|
||||
);
|
||||
}
|
||||
|
||||
Tab _tab(ItemView item) {
|
||||
return Tab(
|
||||
child: SizedBox(
|
||||
width: 1.sw / 5,
|
||||
child: Container(
|
||||
// color: Colors.red,
|
||||
width: (1.sw - 10.w * 5) / 3,
|
||||
// width: 1.sw / 4,
|
||||
alignment: Alignment.center,
|
||||
child: Text(item.title, textAlign: TextAlign.center)));
|
||||
}
|
||||
|
||||
@ -437,9 +377,7 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
child: TabBarView(
|
||||
controller: state.tabController,
|
||||
children: state.fromType.value == 1
|
||||
? _itemTabs
|
||||
.map((ItemView item) => Obx(indexChangeWidget))
|
||||
.toList()
|
||||
? _itemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList()
|
||||
: _fromCheckInTypeItemTabs
|
||||
.map((ItemView item) => Obx(indexChangeWidget))
|
||||
.toList(),
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
@ -131,7 +130,8 @@ class CardListLogic extends BaseGetXController {
|
||||
privateKey: getPrivateKeyList,
|
||||
token: getTokenList,
|
||||
isBeforeAddUser: false);
|
||||
} else if (deviceConnectionState == BluetoothConnectionState.disconnected) {
|
||||
} else if (deviceConnectionState ==
|
||||
BluetoothConnectionState.disconnected) {
|
||||
dismissEasyLoading();
|
||||
cancelBlueConnetctToastTimer();
|
||||
if (state.ifCurrentScreen.value == true) {
|
||||
@ -218,13 +218,13 @@ class CardListLogic extends BaseGetXController {
|
||||
String keyDateTypeStr = ''; // 永久:1;限时2,单次3,循环:4
|
||||
if (fingerprintItemData.cardType! == 1) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} 永久';
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} ${'永久'.tr}';
|
||||
} else if (fingerprintItemData.cardType! == 2) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时';
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} ${'限时'.tr}';
|
||||
} else if (fingerprintItemData.cardType! == 4) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环';
|
||||
'${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} ${'循环'.tr}';
|
||||
}
|
||||
return keyDateTypeStr;
|
||||
}
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@ -15,6 +14,7 @@ import '../../../../appRouters.dart';
|
||||
import '../../../../app_settings/app_colors.dart';
|
||||
import '../../../../tools/CustomUnderlineTabIndicator.dart';
|
||||
import '../../../../tools/commonItem.dart';
|
||||
import '../../../../tools/key_name_item.dart';
|
||||
import '../../../../tools/storage.dart';
|
||||
import '../../../../tools/submitBtn.dart';
|
||||
import '../../../../tools/titleAppBar.dart';
|
||||
@ -27,7 +27,8 @@ class AddFaceTypePage extends StatefulWidget {
|
||||
State<AddFaceTypePage> createState() => _AddFaceTypePageState();
|
||||
}
|
||||
|
||||
class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProviderStateMixin {
|
||||
class _AddFaceTypePageState extends State<AddFaceTypePage>
|
||||
with SingleTickerProviderStateMixin {
|
||||
final AddFaceTypeLogic logic = Get.put(AddFaceTypeLogic());
|
||||
final AddFaceTypeState state = Get.find<AddFaceTypeLogic>().state;
|
||||
|
||||
@ -77,10 +78,10 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyBottomWidget()
|
||||
],
|
||||
),
|
||||
@ -92,10 +93,10 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyTimeLimitWidget(),
|
||||
keyBottomWidget()
|
||||
],
|
||||
@ -108,10 +109,10 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyCyclicDate(),
|
||||
SizedBox(height: 10.h),
|
||||
keyBottomWidget()
|
||||
@ -124,22 +125,6 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
}
|
||||
}
|
||||
|
||||
// 密码命名输入框
|
||||
Widget perpetualKeyWidget(
|
||||
String titleStr, String rightTitle, TextEditingController controller) {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
// Container(height: 10.h),
|
||||
CommonItem(
|
||||
leftTitel: titleStr,
|
||||
rightTitle: '',
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: getTFWidget(rightTitle)),
|
||||
Container(height: 10.h),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
// 限时顶部选择日期
|
||||
Widget keyTimeLimitWidget() {
|
||||
return Column(
|
||||
@ -153,7 +138,8 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.parse(state.timeLimitBeginTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitBeginTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
@ -166,7 +152,8 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitEndTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
@ -187,14 +174,14 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result =
|
||||
await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
if (result != null && result.isNotEmpty) {
|
||||
state.weekdaysList.value = result['validityValue'];
|
||||
state.cycleBeginTime.value = result['starDate'];
|
||||
@ -211,7 +198,8 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
@ -235,7 +223,8 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
'${state.effectiveDateTime.value}-${state.failureDateTime.value}',
|
||||
isHaveDirection: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
@ -265,8 +254,8 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
rightTitle: '',
|
||||
isTipsImg: false,
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: SizedBox(
|
||||
width: 60.w, height: 50.h, child: _isAdmin())))),
|
||||
rightWidget:
|
||||
SizedBox(width: 60.w, height: 50.h, child: _isAdmin())))),
|
||||
SizedBox(height: 30.h),
|
||||
SubmitBtn(
|
||||
btnName: '下一步'.tr,
|
||||
@ -287,59 +276,6 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
);
|
||||
}
|
||||
|
||||
// 接受者信息输入框
|
||||
Widget getTFWidget(String tfStr) {
|
||||
return Container(
|
||||
// color: Colors.red,
|
||||
height: 65.h,
|
||||
width: 300.w,
|
||||
padding: EdgeInsets.only(top: 5.h),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: TextField(
|
||||
//输入框一行
|
||||
maxLines: 1,
|
||||
inputFormatters: <TextInputFormatter>[
|
||||
FilteringTextInputFormatter.deny('\n'),
|
||||
LengthLimitingTextInputFormatter(50),
|
||||
],
|
||||
style: TextStyle(
|
||||
fontSize: 22.sp, color: AppColors.darkGrayTextColor),
|
||||
controller: state.nameController,
|
||||
autofocus: false,
|
||||
textAlign: TextAlign.end,
|
||||
decoration: InputDecoration(
|
||||
//输入里面输入文字内边距设置
|
||||
// contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
|
||||
hintText: tfStr,
|
||||
hintStyle: TextStyle(fontSize: 22.sp),
|
||||
focusedBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
disabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
enabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
border: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 0),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 10.w,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// 是否为管理员
|
||||
CupertinoSwitch _isAdmin() {
|
||||
return CupertinoSwitch(
|
||||
@ -372,10 +308,8 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
},
|
||||
tabs: state.fromType.value == 1
|
||||
? _itemTabs.map(_tab).toList()
|
||||
: _fromCheckInTypeItemTabs
|
||||
.map(_tab)
|
||||
.toList(),
|
||||
isScrollable: true,
|
||||
: _fromCheckInTypeItemTabs.map(_tab).toList(),
|
||||
isScrollable: false,
|
||||
indicatorColor: Colors.red,
|
||||
unselectedLabelColor: Colors.black,
|
||||
unselectedLabelStyle: TextStyle(
|
||||
@ -392,13 +326,18 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
borderSide: BorderSide(color: AppColors.mainColor, width: 4.w),
|
||||
strokeCap: StrokeCap.round,
|
||||
width: 30.w),
|
||||
labelPadding: EdgeInsets.symmetric(horizontal: 10.w),
|
||||
padding: EdgeInsets.zero, // 去除TabBar两侧的间隙
|
||||
);
|
||||
}
|
||||
|
||||
Tab _tab(ItemView item) {
|
||||
return Tab(
|
||||
child: SizedBox(
|
||||
width: 1.sw / 5,
|
||||
child: Container(
|
||||
// color: Colors.red,
|
||||
width: (1.sw - 10.w * 5) / 3,
|
||||
// width: 1.sw / 4,
|
||||
alignment: Alignment.center,
|
||||
child: Text(item.title, textAlign: TextAlign.center)));
|
||||
}
|
||||
|
||||
@ -407,9 +346,7 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
child: TabBarView(
|
||||
controller: state.tabController,
|
||||
children: state.fromType.value == 1
|
||||
? _itemTabs
|
||||
.map((ItemView item) => Obx(indexChangeWidget))
|
||||
.toList()
|
||||
? _itemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList()
|
||||
: _fromCheckInTypeItemTabs
|
||||
.map((ItemView item) => Obx(indexChangeWidget))
|
||||
.toList(),
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
||||
@ -24,9 +23,11 @@ class FaceListLogic extends BaseGetXController {
|
||||
// 获取解析后的数据
|
||||
late StreamSubscription<Reply> _replySubscription;
|
||||
void _initReplySubscription() {
|
||||
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
|
||||
_replySubscription =
|
||||
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
|
||||
// 添加人脸开始(此处用作删除人脸)
|
||||
if ((reply is SenderAddFaceReply) && (state.ifCurrentScreen.value == true)) {
|
||||
if ((reply is SenderAddFaceReply) &&
|
||||
(state.ifCurrentScreen.value == true)) {
|
||||
_replyAddFaceBegin(reply);
|
||||
}
|
||||
|
||||
@ -58,10 +59,13 @@ class FaceListLogic extends BaseGetXController {
|
||||
break;
|
||||
case 0x06:
|
||||
//无权限
|
||||
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
|
||||
final List<String>? privateKey =
|
||||
await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList =
|
||||
changeStringListToIntList(privateKey!);
|
||||
|
||||
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
|
||||
final List<String>? signKey =
|
||||
await Storage.getStringList(saveBlueSignKey);
|
||||
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
|
||||
|
||||
final List<int> token = reply.data.sublist(5, 9);
|
||||
@ -69,25 +73,24 @@ class FaceListLogic extends BaseGetXController {
|
||||
Storage.setStringList(saveBlueToken, saveStrList);
|
||||
|
||||
IoSenderManage.senderAddFaceCommand(
|
||||
keyID:state.deletKeyID,
|
||||
userID:(await Storage.getUid())!,
|
||||
faceNo:state.deletFaceNo,
|
||||
useCountLimit:0xffff,
|
||||
operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部
|
||||
isAdmin:0,
|
||||
isForce:0, // 是否是胁迫
|
||||
isRound:0, // 是否是循环
|
||||
weekRound:0, // 周循环
|
||||
startDate: 0x11223344,
|
||||
endDate: 0x11223344,
|
||||
startTime:'0',
|
||||
endTime:'0',
|
||||
needAuthor:1,
|
||||
signKey:signKeyDataList,
|
||||
privateKey:getPrivateKeyList,
|
||||
token: token,
|
||||
isBeforeAddUser: false
|
||||
);
|
||||
keyID: state.deletKeyID,
|
||||
userID: (await Storage.getUid())!,
|
||||
faceNo: state.deletFaceNo,
|
||||
useCountLimit: 0xffff,
|
||||
operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部
|
||||
isAdmin: 0,
|
||||
isForce: 0, // 是否是胁迫
|
||||
isRound: 0, // 是否是循环
|
||||
weekRound: 0, // 周循环
|
||||
startDate: 0x11223344,
|
||||
endDate: 0x11223344,
|
||||
startTime: '0',
|
||||
endTime: '0',
|
||||
needAuthor: 1,
|
||||
signKey: signKeyDataList,
|
||||
privateKey: getPrivateKeyList,
|
||||
token: token,
|
||||
isBeforeAddUser: false);
|
||||
break;
|
||||
default:
|
||||
//失败
|
||||
@ -257,37 +260,39 @@ class FaceListLogic extends BaseGetXController {
|
||||
BlueManage().blueSendData(BlueManage().connectDeviceName,
|
||||
(BluetoothConnectionState deviceConnectionState) async {
|
||||
if (deviceConnectionState == BluetoothConnectionState.connected) {
|
||||
|
||||
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
|
||||
final List<String>? signKey =
|
||||
await Storage.getStringList(saveBlueSignKey);
|
||||
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
|
||||
|
||||
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
|
||||
final List<String>? privateKey =
|
||||
await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList =
|
||||
changeStringListToIntList(privateKey!);
|
||||
|
||||
final List<String>? token = await Storage.getStringList(saveBlueToken);
|
||||
final List<int> getTokenList = changeStringListToIntList(token!);
|
||||
|
||||
IoSenderManage.senderAddFaceCommand(
|
||||
keyID:state.deletKeyID,
|
||||
userID:(await Storage.getUid())!,
|
||||
faceNo:state.deletFaceNo,
|
||||
useCountLimit:0xffff,
|
||||
operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部
|
||||
isAdmin:0,
|
||||
isForce:0, // 是否是胁迫
|
||||
isRound:0, // 是否是循环
|
||||
weekRound:0, // 周循环
|
||||
startDate: 0x11223344,
|
||||
endDate: 0x11223344,
|
||||
startTime:'0',
|
||||
endTime:'0',
|
||||
needAuthor:1,
|
||||
signKey:signKeyDataList,
|
||||
privateKey:getPrivateKeyList,
|
||||
token: getTokenList,
|
||||
isBeforeAddUser: false
|
||||
);
|
||||
} else if (deviceConnectionState == BluetoothConnectionState.disconnected) {
|
||||
keyID: state.deletKeyID,
|
||||
userID: (await Storage.getUid())!,
|
||||
faceNo: state.deletFaceNo,
|
||||
useCountLimit: 0xffff,
|
||||
operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部
|
||||
isAdmin: 0,
|
||||
isForce: 0, // 是否是胁迫
|
||||
isRound: 0, // 是否是循环
|
||||
weekRound: 0, // 周循环
|
||||
startDate: 0x11223344,
|
||||
endDate: 0x11223344,
|
||||
startTime: '0',
|
||||
endTime: '0',
|
||||
needAuthor: 1,
|
||||
signKey: signKeyDataList,
|
||||
privateKey: getPrivateKeyList,
|
||||
token: getTokenList,
|
||||
isBeforeAddUser: false);
|
||||
} else if (deviceConnectionState ==
|
||||
BluetoothConnectionState.disconnected) {
|
||||
dismissEasyLoading();
|
||||
cancelBlueConnetctToastTimer();
|
||||
if (state.ifCurrentScreen.value == true) {
|
||||
@ -298,12 +303,14 @@ class FaceListLogic extends BaseGetXController {
|
||||
}
|
||||
|
||||
// 获取人脸列表
|
||||
Future<FingerprintListDataEntity> getFaceListData({required bool isRefresh}) async {
|
||||
Future<FingerprintListDataEntity> getFaceListData(
|
||||
{required bool isRefresh}) async {
|
||||
if (isRefresh) {
|
||||
state.faceItemListData.clear();
|
||||
pageNo = 1;
|
||||
}
|
||||
final FingerprintListDataEntity entity = await ApiRepository.to.getFaceListData(
|
||||
final FingerprintListDataEntity entity =
|
||||
await ApiRepository.to.getFaceListData(
|
||||
lockId: state.lockId.value.toString(),
|
||||
pageNo: pageNo.toString(),
|
||||
pageSize: pageSize.toString(),
|
||||
@ -341,7 +348,7 @@ class FaceListLogic extends BaseGetXController {
|
||||
lockId: state.lockId.value,
|
||||
);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
showToast('删除成功'.tr, something: (){
|
||||
showToast('删除成功'.tr, something: () {
|
||||
getFaceListData(isRefresh: true);
|
||||
});
|
||||
}
|
||||
@ -359,34 +366,37 @@ class FaceListLogic extends BaseGetXController {
|
||||
lockId: state.lockId.value,
|
||||
);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
showToast('重置成功'.tr, something: (){
|
||||
showToast('重置成功'.tr, something: () {
|
||||
getFaceListData(isRefresh: true);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
String getKeyType(FingerprintItemData fingerprintItemData){
|
||||
String getKeyType(FingerprintItemData fingerprintItemData) {
|
||||
// fingerprintStatus 1:正常 2:失效
|
||||
String keyTypeStr = '';//
|
||||
if(fingerprintItemData.status == 1){
|
||||
if(fingerprintItemData.startDate! > DateTime.now().millisecondsSinceEpoch){
|
||||
String keyTypeStr = ''; //
|
||||
if (fingerprintItemData.status == 1) {
|
||||
if (fingerprintItemData.startDate! >
|
||||
DateTime.now().millisecondsSinceEpoch) {
|
||||
keyTypeStr = '未生效'.tr;
|
||||
}
|
||||
|
||||
}else if(fingerprintItemData.status == 2){
|
||||
} else if (fingerprintItemData.status == 2) {
|
||||
keyTypeStr = '已失效'.tr;
|
||||
}
|
||||
return keyTypeStr;
|
||||
}
|
||||
|
||||
String getKeyDateType(FingerprintItemData fingerprintItemData){
|
||||
String keyDateTypeStr = '';// 永久:1;限时2,单次3,循环:4
|
||||
if(fingerprintItemData.faceType! == 1){
|
||||
keyDateTypeStr = '${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} 永久';
|
||||
}else if(fingerprintItemData.faceType! == 2){
|
||||
keyDateTypeStr = '${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时';
|
||||
}else if(fingerprintItemData.faceType! == 4){
|
||||
keyDateTypeStr = '${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环';
|
||||
String getKeyDateType(FingerprintItemData fingerprintItemData) {
|
||||
String keyDateTypeStr = ''; // 永久:1;限时2,单次3,循环:4
|
||||
if (fingerprintItemData.faceType! == 1) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} ${'永久'.tr}';
|
||||
} else if (fingerprintItemData.faceType! == 2) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} ${'限时'.tr}';
|
||||
} else if (fingerprintItemData.faceType! == 4) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} ${'循环'.tr}';
|
||||
}
|
||||
return keyDateTypeStr;
|
||||
}
|
||||
@ -394,7 +404,9 @@ class FaceListLogic extends BaseGetXController {
|
||||
// 监听修改完详情之后刷新列表
|
||||
late StreamSubscription _teamEvent;
|
||||
void _initRefreshAction() {
|
||||
_teamEvent = eventBus.on<OtherTypeRefreshListEvent>().listen((OtherTypeRefreshListEvent event) {
|
||||
_teamEvent = eventBus
|
||||
.on<OtherTypeRefreshListEvent>()
|
||||
.listen((OtherTypeRefreshListEvent event) {
|
||||
getFaceListData(isRefresh: true);
|
||||
});
|
||||
}
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@ -15,6 +14,7 @@ import '../../../../app_settings/app_colors.dart';
|
||||
import '../../../../tools/CustomUnderlineTabIndicator.dart';
|
||||
import '../../../../tools/commonItem.dart';
|
||||
import '../../../../tools/dateTool.dart';
|
||||
import '../../../../tools/key_name_item.dart';
|
||||
import '../../../../tools/storage.dart';
|
||||
import '../../../../tools/submitBtn.dart';
|
||||
import '../../../../tools/titleAppBar.dart';
|
||||
@ -27,7 +27,8 @@ class AddFingerprintTypePage extends StatefulWidget {
|
||||
State<AddFingerprintTypePage> createState() => _AddFingerprintTypePageState();
|
||||
}
|
||||
|
||||
class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with SingleTickerProviderStateMixin{
|
||||
class _AddFingerprintTypePageState extends State<AddFingerprintTypePage>
|
||||
with SingleTickerProviderStateMixin {
|
||||
final AddFingerprintTypeLogic logic = Get.put(AddFingerprintTypeLogic());
|
||||
final AddFingerprintState state = Get.find<AddFingerprintTypeLogic>().state;
|
||||
|
||||
@ -37,7 +38,9 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
|
||||
state.tabController = TabController(
|
||||
vsync: this,
|
||||
length: state.fromType.value == 1 ? _itemTabs.length : _fromCheckInTypeItemTabs.length,
|
||||
length: state.fromType.value == 1
|
||||
? _itemTabs.length
|
||||
: _fromCheckInTypeItemTabs.length,
|
||||
initialIndex: 0);
|
||||
state.tabController.addListener(() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
@ -55,7 +58,7 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.mainBackgroundColor,
|
||||
appBar: TitleAppBar(
|
||||
barTitle:'添加指纹'.tr,
|
||||
barTitle: '添加指纹'.tr,
|
||||
haveBack: true,
|
||||
backgroundColor: AppColors.mainColor),
|
||||
body: Column(
|
||||
@ -76,10 +79,10 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyBottomWidget()
|
||||
],
|
||||
),
|
||||
@ -91,10 +94,10 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyTimeLimitWidget(),
|
||||
keyBottomWidget()
|
||||
],
|
||||
@ -107,10 +110,10 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyCyclicDate(),
|
||||
SizedBox(height: 10.h),
|
||||
keyBottomWidget()
|
||||
@ -123,21 +126,6 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
}
|
||||
}
|
||||
|
||||
// 密码命名输入框
|
||||
Widget perpetualKeyWidget(
|
||||
String titleStr, String rightTitle, TextEditingController controller) {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
CommonItem(
|
||||
leftTitel: titleStr,
|
||||
rightTitle: '',
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: getTFWidget(rightTitle)),
|
||||
Container(height: 10.h),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
// 限时顶部选择日期
|
||||
Widget keyTimeLimitWidget() {
|
||||
return Column(
|
||||
@ -148,24 +136,28 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () async {
|
||||
final PDuration selectDate =
|
||||
PDuration.parse(DateTime.tryParse(state.timeLimitBeginTime.value));
|
||||
Pickers.showDatePicker(context,selectDate:selectDate, mode: DateMode.YMDHM,
|
||||
onConfirm: (PDuration p) {
|
||||
state.timeLimitBeginTime.value = DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.tryParse(state.timeLimitBeginTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitBeginTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
})),
|
||||
Obx(() => CommonItem(
|
||||
leftTitel: '失效时间'.tr,
|
||||
rightTitle: state.timeLimitEndTime.value,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
final PDuration selectDate =
|
||||
PDuration.parse(DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
Pickers.showDatePicker(context,selectDate:selectDate, mode: DateMode.YMDHM,
|
||||
onConfirm: (PDuration p) {
|
||||
state.timeLimitEndTime.value = DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitEndTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
})),
|
||||
Container(height: 10.h),
|
||||
],
|
||||
@ -178,17 +170,19 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
children: <Widget>[
|
||||
Obx(() => CommonItem(
|
||||
leftTitel: '有效期'.tr,
|
||||
rightTitle:'${state.cycleBeginTime.value}\n${state.cycleEndTime.value}',
|
||||
rightTitle:
|
||||
'${state.cycleBeginTime.value}\n${state.cycleEndTime.value}',
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
if (result != null && result.isNotEmpty) {
|
||||
state.weekdaysList.value = result['validityValue'];
|
||||
state.cycleBeginTime.value = result['starDate'];
|
||||
@ -205,13 +199,15 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
if (result != null && result.isNotEmpty) {
|
||||
state.weekdaysList.value = result['validityValue'];
|
||||
state.cycleBeginTime.value = result['starDate'];
|
||||
@ -224,16 +220,19 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
visible: state.effectiveDateTime.value.isNotEmpty,
|
||||
child: CommonItem(
|
||||
leftTitel: '有效时间'.tr,
|
||||
rightTitle: '${state.effectiveDateTime.value}-${state.failureDateTime.value}',
|
||||
rightTitle:
|
||||
'${state.effectiveDateTime.value}-${state.failureDateTime.value}',
|
||||
isHaveDirection: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
if (result != null && result.isNotEmpty) {
|
||||
state.weekdaysList.value = result['validityValue'];
|
||||
state.cycleBeginTime.value = result['starDate'];
|
||||
@ -268,13 +267,12 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
width: 60.w, height: 50.h, child: _isStressFingerprint()))),
|
||||
Container(
|
||||
color: Colors.white,
|
||||
padding: EdgeInsets.only(left:20.w, right: 20.w, bottom: 20.h),
|
||||
padding: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 20.h),
|
||||
child: Text(
|
||||
"${"当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。".tr}\n${"请不要将胁迫指纹用于日常开锁".tr}",
|
||||
style: TextStyle(
|
||||
fontSize: 22.sp, color: AppColors.darkGrayTextColor),
|
||||
)
|
||||
),
|
||||
)),
|
||||
SizedBox(height: 30.h),
|
||||
SubmitBtn(
|
||||
btnName: '下一步'.tr,
|
||||
@ -365,54 +363,6 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
// );
|
||||
// }
|
||||
|
||||
// 接受者信息输入框
|
||||
Widget getTFWidget(String tfStr) {
|
||||
return Container(
|
||||
// color: Colors.red,
|
||||
height: 65.h,
|
||||
width: 300.w,
|
||||
padding: EdgeInsets.only(top: 5.h),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: TextField(
|
||||
//输入框一行
|
||||
maxLines: 1,
|
||||
inputFormatters: <TextInputFormatter>[
|
||||
FilteringTextInputFormatter.deny('\n'),
|
||||
LengthLimitingTextInputFormatter(50),
|
||||
],
|
||||
style: TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor),
|
||||
controller: state.nameController,
|
||||
// autofocus: false,
|
||||
textAlign: TextAlign.end,
|
||||
decoration: InputDecoration(
|
||||
//输入里面输入文字内边距设置
|
||||
// contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
|
||||
hintText: tfStr,
|
||||
hintStyle: TextStyle(fontSize: 22.sp),
|
||||
focusedBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
|
||||
disabledBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
|
||||
enabledBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
|
||||
border: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 0),
|
||||
// suffixIcon: IconButton(
|
||||
// icon: const Icon(Icons.clear),
|
||||
// onPressed: state.nameController.clear,
|
||||
// ),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 10.w,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
//isStressFingerprint false:不是胁迫指纹 ture:胁迫指纹
|
||||
CupertinoSwitch _isStressFingerprint() {
|
||||
return CupertinoSwitch(
|
||||
@ -439,13 +389,13 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
);
|
||||
}
|
||||
|
||||
final List<ItemView> _itemTabs = <ItemView>[
|
||||
final List<ItemView> _itemTabs = <ItemView>[
|
||||
ItemView(title: '永久'.tr, selectType: '0'),
|
||||
ItemView(title: '限时'.tr, selectType: '1'),
|
||||
ItemView(title: '循环'.tr, selectType: '2'),
|
||||
];
|
||||
|
||||
final List<ItemView> _fromCheckInTypeItemTabs = <ItemView>[
|
||||
final List<ItemView> _fromCheckInTypeItemTabs = <ItemView>[
|
||||
ItemView(title: '永久'.tr, selectType: '0'),
|
||||
ItemView(title: '限时'.tr, selectType: '1'),
|
||||
];
|
||||
@ -456,8 +406,10 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
onTap: (int index) {
|
||||
FocusScope.of(context).requestFocus(FocusNode());
|
||||
},
|
||||
tabs: state.fromType.value == 1 ? _itemTabs.map(_tab).toList() : _fromCheckInTypeItemTabs.map(_tab).toList(),
|
||||
isScrollable: true,
|
||||
tabs: state.fromType.value == 1
|
||||
? _itemTabs.map(_tab).toList()
|
||||
: _fromCheckInTypeItemTabs.map(_tab).toList(),
|
||||
isScrollable: false,
|
||||
indicatorColor: Colors.red,
|
||||
unselectedLabelColor: Colors.black,
|
||||
unselectedLabelStyle: TextStyle(
|
||||
@ -474,13 +426,18 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
borderSide: BorderSide(color: AppColors.mainColor, width: 4.w),
|
||||
strokeCap: StrokeCap.round,
|
||||
width: 30.w),
|
||||
labelPadding: EdgeInsets.symmetric(horizontal: 10.w),
|
||||
padding: EdgeInsets.zero, // 去除TabBar两侧的间隙
|
||||
);
|
||||
}
|
||||
|
||||
Tab _tab(ItemView item) {
|
||||
return Tab(
|
||||
child: SizedBox(
|
||||
width: 1.sw / 5,
|
||||
child: Container(
|
||||
// color: Colors.red,
|
||||
width: (1.sw - 10.w * 5) / 3,
|
||||
// width: 1.sw / 4,
|
||||
alignment: Alignment.center,
|
||||
child: Text(item.title, textAlign: TextAlign.center)));
|
||||
}
|
||||
|
||||
@ -488,14 +445,14 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
return Expanded(
|
||||
child: TabBarView(
|
||||
controller: state.tabController,
|
||||
children:
|
||||
state.fromType.value == 1
|
||||
children: state.fromType.value == 1
|
||||
? _itemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList()
|
||||
: _fromCheckInTypeItemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList(),
|
||||
: _fromCheckInTypeItemTabs
|
||||
.map((ItemView item) => Obx(indexChangeWidget))
|
||||
.toList(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class ItemView {
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
||||
@ -328,7 +327,8 @@ class FingerprintListLogic extends BaseGetXController {
|
||||
*/
|
||||
|
||||
// 获取指纹列表
|
||||
Future<FingerprintListDataEntity> getFingerprintsListData({required bool isRefresh}) async {
|
||||
Future<FingerprintListDataEntity> getFingerprintsListData(
|
||||
{required bool isRefresh}) async {
|
||||
// 如果是下拉刷新,清空已有数据
|
||||
if (isRefresh) {
|
||||
state.fingerprintItemListData.clear();
|
||||
@ -420,22 +420,21 @@ class FingerprintListLogic extends BaseGetXController {
|
||||
"${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} ${"永久".tr}";
|
||||
} else if (fingerprintItemData.fingerprintType! == 2) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时';
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} ${'限时'.tr}';
|
||||
} else if (fingerprintItemData.fingerprintType! == 4) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环';
|
||||
'${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} ${'循环'.tr}';
|
||||
}
|
||||
return keyDateTypeStr;
|
||||
}
|
||||
|
||||
//刷新单条信息
|
||||
Future<void> refreshIndividualKeys(
|
||||
{required int fingerprintId}) async {
|
||||
Future<void> refreshIndividualKeys({required int fingerprintId}) async {
|
||||
final FingerprintEntity entity =
|
||||
await ApiRepository.to.getFingerprintsData(fingerprintId);
|
||||
await ApiRepository.to.getFingerprintsData(fingerprintId);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
final int index = state.fingerprintItemListData
|
||||
.indexWhere((FingerprintItemData item) => item.fingerprintId == fingerprintId);
|
||||
final int index = state.fingerprintItemListData.indexWhere(
|
||||
(FingerprintItemData item) => item.fingerprintId == fingerprintId);
|
||||
state.fingerprintItemListData.removeAt(index);
|
||||
state.fingerprintItemListData.insert(index, entity.data!);
|
||||
}
|
||||
|
||||
@ -7,6 +7,7 @@ import 'package:get/get.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
|
||||
import 'package:star_lock/login/login/entity/LoginEntity.dart';
|
||||
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockSet/lockTime/getServerDatetime_entity.dart';
|
||||
import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart';
|
||||
@ -572,6 +573,15 @@ class LockDetailLogic extends BaseGetXController {
|
||||
}
|
||||
}
|
||||
|
||||
// 远程开锁
|
||||
Future<void> remoteOpenLock() async {
|
||||
final LoginEntity entity = await ApiRepository.to
|
||||
.remoteOpenLock(lockId: state.keyInfos.value.lockId.toString());
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
showToast('已开锁'.tr);
|
||||
}
|
||||
}
|
||||
|
||||
/// 锁设置里面开启关闭考勤刷新锁详情
|
||||
void initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction() {
|
||||
// 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus
|
||||
|
||||
@ -171,6 +171,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
),
|
||||
Visibility(
|
||||
visible: state.iSClosedUnlockSuccessfulPopup.value,
|
||||
// visible: true,
|
||||
child: Container(
|
||||
width: 1.sw,
|
||||
height: 1.sh - ScreenUtil().statusBarHeight * 2,
|
||||
@ -297,6 +298,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
SizedBox(height: 10.h),
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
ShowTipView().showSureAlertDialog(
|
||||
@ -359,85 +361,126 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
],
|
||||
),
|
||||
),
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
if (state.openDoorBtnisUneable.value == true) {
|
||||
logic.functionBlocker.block(isNeedRealNameAuthThenOpenLock);
|
||||
}
|
||||
},
|
||||
onLongPressStart: (LongPressStartDetails details) {
|
||||
if (state.openDoorBtnisUneable.value == true) {
|
||||
void callback() {
|
||||
setState(startUnLock);
|
||||
}
|
||||
Container(
|
||||
height: 200.r,
|
||||
child: Stack(
|
||||
children: [
|
||||
Center(
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
if (state.openDoorBtnisUneable.value == true) {
|
||||
logic.functionBlocker
|
||||
.block(isNeedRealNameAuthThenOpenLock);
|
||||
}
|
||||
},
|
||||
onLongPressStart: (LongPressStartDetails details) {
|
||||
if (state.openDoorBtnisUneable.value == true) {
|
||||
void callback() {
|
||||
setState(startUnLock);
|
||||
}
|
||||
|
||||
logic.functionBlocker.block(callback);
|
||||
}
|
||||
},
|
||||
child: Container(
|
||||
width: 200.r,
|
||||
height: 200.r,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(100.w),
|
||||
boxShadow: <BoxShadow>[
|
||||
BoxShadow(
|
||||
color: Colors.black.withOpacity(0.3),
|
||||
offset: const Offset(0, 0),
|
||||
blurRadius: 15.r,
|
||||
spreadRadius: 0,
|
||||
logic.functionBlocker.block(callback);
|
||||
}
|
||||
},
|
||||
child: Container(
|
||||
width: 200.r,
|
||||
height: 200.r,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(100.w),
|
||||
boxShadow: <BoxShadow>[
|
||||
BoxShadow(
|
||||
color: Colors.black.withOpacity(0.3),
|
||||
offset: const Offset(0, 0),
|
||||
blurRadius: 15.r,
|
||||
spreadRadius: 0,
|
||||
),
|
||||
]),
|
||||
child: Stack(
|
||||
alignment: AlignmentDirectional.center,
|
||||
children: <Widget>[
|
||||
if (state.openDoorBtnisUneable.value == false)
|
||||
Icon(
|
||||
Icons.bluetooth_searching,
|
||||
size: 78.r,
|
||||
color: AppColors.mainColor.withOpacity(0.6),
|
||||
)
|
||||
else
|
||||
Image.asset(
|
||||
state.isOpenPassageMode.value == 1
|
||||
? 'images/icon_lock_err.png'
|
||||
: 'images/icon_lock_fill.png',
|
||||
width: 68.r,
|
||||
height: 68.r,
|
||||
color: AppColors.mainColor,
|
||||
),
|
||||
if (state.openLockBtnState.value == 1)
|
||||
xhjBuildRotationTransition(
|
||||
width: 168.r,
|
||||
height: 168.r,
|
||||
)
|
||||
else
|
||||
Positioned(
|
||||
child: Image.asset(
|
||||
'images/icon_circle_dotted.png',
|
||||
width: 168.r,
|
||||
height: 168.r,
|
||||
color: state.openDoorBtnisUneable.value == false
|
||||
? AppColors.mainColor.withOpacity(0.6)
|
||||
: state.isOpenPassageMode.value == 1
|
||||
? Colors.red
|
||||
: AppColors.mainColor,
|
||||
)),
|
||||
],
|
||||
),
|
||||
),
|
||||
]),
|
||||
child: Stack(
|
||||
alignment: AlignmentDirectional.center,
|
||||
children: <Widget>[
|
||||
if (state.openDoorBtnisUneable.value == false)
|
||||
Icon(
|
||||
Icons.bluetooth_searching,
|
||||
size: 78.r,
|
||||
color: AppColors.mainColor.withOpacity(0.6),
|
||||
)
|
||||
else
|
||||
Image.asset(
|
||||
state.isOpenPassageMode.value == 1
|
||||
? 'images/icon_lock_err.png'
|
||||
: 'images/icon_lock_fill.png',
|
||||
width: 68.r,
|
||||
height: 68.r,
|
||||
color: AppColors.mainColor,
|
||||
),
|
||||
if (state.openLockBtnState.value == 1)
|
||||
xhjBuildRotationTransition(
|
||||
width: 168.r,
|
||||
height: 168.r,
|
||||
)
|
||||
else
|
||||
Positioned(
|
||||
child: Image.asset(
|
||||
'images/icon_circle_dotted.png',
|
||||
width: 168.r,
|
||||
height: 168.r,
|
||||
color: state.openDoorBtnisUneable.value == false
|
||||
? AppColors.mainColor.withOpacity(0.6)
|
||||
: state.isOpenPassageMode.value == 1
|
||||
? Colors.red
|
||||
: AppColors.mainColor,
|
||||
)),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
right: 90.w,
|
||||
bottom: 1,
|
||||
child: Obx(() => Visibility(
|
||||
visible:
|
||||
state.keyInfos.value.lockSetting!.remoteUnlock == 1,
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
ShowCupertinoAlertView().isToRemoteUnLockAlert(
|
||||
remoteUnlockAction: () {
|
||||
if (state.keyInfos.value.hasGateway != 1) {
|
||||
logic.showToast('附近没有可用网关'.tr);
|
||||
}
|
||||
logic.remoteOpenLock();
|
||||
});
|
||||
},
|
||||
child: Align(
|
||||
alignment: const Alignment(0.6, 1),
|
||||
child: FlavorsImg(
|
||||
child: Image.asset(
|
||||
'images/main/icon_main_remoteUnlocking_xhj.png',
|
||||
width: 50.w,
|
||||
height: 52.w,
|
||||
),
|
||||
)),
|
||||
))),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
// SizedBox(height: 15.h),
|
||||
Expanded(
|
||||
child: Text(
|
||||
'点击开锁,长按闭锁'.tr,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
color: AppColors.darkGrayTextColor,
|
||||
fontSize: 20.sp,
|
||||
child: Center(
|
||||
child: Text(
|
||||
'点击开锁,长按闭锁'.tr,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
color: AppColors.darkGrayTextColor,
|
||||
fontSize: 20.sp,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
adminInfoView(center: false, max: false),
|
||||
adminInfoView(center: true, max: false),
|
||||
SizedBox(height: 10.h)
|
||||
],
|
||||
),
|
||||
);
|
||||
@ -530,7 +573,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
bottom: 16.h,
|
||||
right: 15.w,
|
||||
),
|
||||
child: adminInfoView(center: false, add: true),
|
||||
child: adminInfoView(center: false),
|
||||
),
|
||||
),
|
||||
Stack(
|
||||
@ -697,6 +740,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
if (state.keyInfos.value.hasGateway != 1) {
|
||||
logic.showToast('附近没有可用网关'.tr);
|
||||
}
|
||||
logic.remoteOpenLock();
|
||||
});
|
||||
},
|
||||
child: Align(
|
||||
@ -716,17 +760,19 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
SizedBox(
|
||||
height: 30.h,
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 20.w),
|
||||
child: Center(
|
||||
child: Text(
|
||||
logic.getKeyStatusTextAndShow(),
|
||||
maxLines: 2,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 22.sp,
|
||||
color: AppColors.btnDisableColor,
|
||||
fontWeight: FontWeight.w500),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 30.h,
|
||||
@ -745,8 +791,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
);
|
||||
}
|
||||
|
||||
Widget adminInfoView(
|
||||
{bool center = true, bool max = true, bool add = false}) {
|
||||
Widget adminInfoView({bool center = true, bool max = true}) {
|
||||
return Row(
|
||||
mainAxisAlignment:
|
||||
center ? MainAxisAlignment.center : MainAxisAlignment.start,
|
||||
@ -770,7 +815,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
style: TextStyle(
|
||||
fontSize: 20.sp, color: AppColors.darkGrayTextColor),
|
||||
),
|
||||
if (add) SizedBox(width: 20.w) else SizedBox(width: 40.w),
|
||||
SizedBox(width: 40.w),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
@ -794,7 +839,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
? AppColors.mainColor
|
||||
: AppColors.btnDisableColor),
|
||||
),
|
||||
if (add) SizedBox(width: 20.w) else SizedBox(width: 20.w),
|
||||
SizedBox(width: 20.w),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
@ -817,35 +862,6 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
? AppColors.mainColor
|
||||
: AppColors.btnDisableColor),
|
||||
),
|
||||
if (add) ...<Widget>[
|
||||
const Spacer(),
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
Get.toNamed(Routers.selectLockTypePage);
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: <Widget>[
|
||||
FlavorsImg(
|
||||
child: Image.asset(
|
||||
'images/mine/icon_mine_main_addLock.png',
|
||||
width: 24.w,
|
||||
height: 20.w,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
'添加设备'.tr,
|
||||
style: TextStyle(
|
||||
fontSize: 20.sp,
|
||||
color: AppColors.darkGrayTextColor),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
],
|
||||
)
|
||||
],
|
||||
@ -1013,13 +1029,13 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
List<Widget> getNormalWidget() {
|
||||
final List<Widget> showWidgetArr = <Widget>[];
|
||||
// 考勤
|
||||
if (state.isAttendance.value == 1) {
|
||||
showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png',
|
||||
'考勤'.tr, state.bottomBtnisEable.value, () {
|
||||
Get.toNamed(Routers.checkingInListPage,
|
||||
arguments: state.keyInfos.value);
|
||||
}));
|
||||
}
|
||||
// if (state.isAttendance.value == 1) {
|
||||
// showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png',
|
||||
// '考勤'.tr, state.bottomBtnisEable.value, () {
|
||||
// Get.toNamed(Routers.checkingInListPage,
|
||||
// arguments: state.keyInfos.value);
|
||||
// }));
|
||||
// }
|
||||
// 操作记录
|
||||
showWidgetArr.add(bottomItem('images/main/icon_main_operatingRecord.png',
|
||||
'操作记录'.tr, state.bottomBtnisEable.value, () {
|
||||
@ -1047,13 +1063,13 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
List<Widget> getAllWidget() {
|
||||
final List<Widget> showWidgetArr = <Widget>[];
|
||||
// 考勤
|
||||
if (state.isAttendance.value == 1) {
|
||||
showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png',
|
||||
'考勤'.tr, state.bottomBtnisEable.value, () {
|
||||
Get.toNamed(Routers.checkingInListPage,
|
||||
arguments: state.keyInfos.value);
|
||||
}));
|
||||
}
|
||||
// if (state.isAttendance.value == 1) {
|
||||
// showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png',
|
||||
// '考勤'.tr, state.bottomBtnisEable.value, () {
|
||||
// Get.toNamed(Routers.checkingInListPage,
|
||||
// arguments: state.keyInfos.value);
|
||||
// }));
|
||||
// }
|
||||
|
||||
// 电子钥匙
|
||||
showWidgetArr.add(bottomItem('images/main/icon_main_electronicKey.png',
|
||||
@ -1348,19 +1364,27 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
child: Stack(
|
||||
children: <Widget>[
|
||||
Image.asset(
|
||||
state.iSOpenLock.value == true
|
||||
? 'images/main/unlocked_bg.png'
|
||||
: 'images/main/locked_bg.png',
|
||||
'images/main/icon_lockDetail_openLock_succeed.png',
|
||||
width: 358.w,
|
||||
height: 348.h,
|
||||
),
|
||||
Positioned(
|
||||
top: 180.h,
|
||||
top: 120.h,
|
||||
width: 358.w,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Text(state.iSOpenLock.value == true ? '已开锁'.tr : '已闭锁'.tr,
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
color: AppColors.mainColor,
|
||||
fontSize: 32.sp,
|
||||
fontWeight: FontWeight.w600)),
|
||||
SizedBox(
|
||||
height: 10.h,
|
||||
),
|
||||
Text(
|
||||
lockAlias,
|
||||
style: TextStyle(
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
@ -27,13 +26,14 @@ class LockSetPage extends StatefulWidget {
|
||||
State<LockSetPage> createState() => _LockSetPageState();
|
||||
}
|
||||
|
||||
class _LockSetPageState extends State<LockSetPage> with WidgetsBindingObserver, RouteAware {
|
||||
class _LockSetPageState extends State<LockSetPage>
|
||||
with WidgetsBindingObserver, RouteAware {
|
||||
final LockSetLogic logic = Get.put(LockSetLogic());
|
||||
final LockSetState state = Get.find<LockSetLogic>().state;
|
||||
|
||||
Future<void> getHttpData() async {
|
||||
logic.getLockSettingInfoData().then((LockSetInfoEntity value) {
|
||||
if(mounted){
|
||||
if (mounted) {
|
||||
setState(() {});
|
||||
}
|
||||
});
|
||||
@ -501,17 +501,17 @@ class _LockSetPageState extends State<LockSetPage> with WidgetsBindingObserver,
|
||||
// }));
|
||||
// }),
|
||||
// 考勤
|
||||
Obx(
|
||||
() => Visibility(
|
||||
visible: state.lockBasicInfo.value.isLockOwner == 1 &&
|
||||
state.lockFeature.value.attendance == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: '考勤'.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: true,
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: _openCheckInSwitch())),
|
||||
),
|
||||
// Obx(
|
||||
// () => Visibility(
|
||||
// visible: state.lockBasicInfo.value.isLockOwner == 1 &&
|
||||
// state.lockFeature.value.attendance == 1,
|
||||
// child: CommonItem(
|
||||
// leftTitel: '考勤'.tr,
|
||||
// rightTitle: '',
|
||||
// isHaveLine: true,
|
||||
// isHaveRightWidget: true,
|
||||
// rightWidget: _openCheckInSwitch())),
|
||||
// ),
|
||||
// 开锁提醒
|
||||
Obx(
|
||||
() => Visibility(
|
||||
@ -543,7 +543,7 @@ class _LockSetPageState extends State<LockSetPage> with WidgetsBindingObserver,
|
||||
() => Visibility(
|
||||
visible: state.lockFeature.value.wifi == 1,
|
||||
child: CommonItem(
|
||||
leftTitel:'WiFi配网'.tr,
|
||||
leftTitel: 'WiFi配网'.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
@ -654,31 +654,31 @@ class _LockSetPageState extends State<LockSetPage> with WidgetsBindingObserver,
|
||||
}
|
||||
|
||||
// 开启考勤
|
||||
CupertinoSwitch _openCheckInSwitch() {
|
||||
return CupertinoSwitch(
|
||||
activeColor: CupertinoColors.activeBlue,
|
||||
trackColor: CupertinoColors.systemGrey5,
|
||||
thumbColor: CupertinoColors.white,
|
||||
value: state.isAttendance.value == 1,
|
||||
onChanged: (bool value) {
|
||||
logic.openCheckingInData(
|
||||
(CheckingInInfoDataEntity checkingInInfoDataEntity) {
|
||||
if (checkingInInfoDataEntity.data!.companyId == 0) {
|
||||
// logic.showCupertinoAlertDialog(context);
|
||||
ShowTipView().showIosTipWithContentDialog('创建公司后,考勤功能才能使用'.tr, () {
|
||||
// 删除锁
|
||||
Get.toNamed(Routers.checkInCreatCompanyPage,
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
});
|
||||
} else {
|
||||
logic.setLockSetGeneralSetting();
|
||||
}
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
// CupertinoSwitch _openCheckInSwitch() {
|
||||
// return CupertinoSwitch(
|
||||
// activeColor: CupertinoColors.activeBlue,
|
||||
// trackColor: CupertinoColors.systemGrey5,
|
||||
// thumbColor: CupertinoColors.white,
|
||||
// value: state.isAttendance.value == 1,
|
||||
// onChanged: (bool value) {
|
||||
// logic.openCheckingInData(
|
||||
// (CheckingInInfoDataEntity checkingInInfoDataEntity) {
|
||||
// if (checkingInInfoDataEntity.data!.companyId == 0) {
|
||||
// // logic.showCupertinoAlertDialog(context);
|
||||
// ShowTipView().showIosTipWithContentDialog('创建公司后,考勤功能才能使用'.tr, () {
|
||||
// // 删除锁
|
||||
// Get.toNamed(Routers.checkInCreatCompanyPage,
|
||||
// arguments: <String, LockSetInfoData>{
|
||||
// 'lockSetInfoData': state.lockSetInfoData.value
|
||||
// });
|
||||
// });
|
||||
// } else {
|
||||
// logic.setLockSetGeneralSetting();
|
||||
// }
|
||||
// });
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
|
||||
// 开锁提醒
|
||||
CupertinoSwitch _lockRemindSwitch() {
|
||||
@ -700,11 +700,13 @@ class _LockSetPageState extends State<LockSetPage> with WidgetsBindingObserver,
|
||||
trackColor: CupertinoColors.systemGrey5,
|
||||
thumbColor: CupertinoColors.white,
|
||||
value: state.isOpenLockNeedOnline.value == 1,
|
||||
onChanged: state.sureBtnState.value == 1 ? null : (bool value) {
|
||||
setState(() {
|
||||
logic.sendBurglarAlarm(55);
|
||||
});
|
||||
},
|
||||
onChanged: state.sureBtnState.value == 1
|
||||
? null
|
||||
: (bool value) {
|
||||
setState(() {
|
||||
logic.sendBurglarAlarm(55);
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@ -16,18 +15,21 @@ import '../../../../appRouters.dart';
|
||||
import '../../../../app_settings/app_colors.dart';
|
||||
import '../../../../tools/CustomUnderlineTabIndicator.dart';
|
||||
import '../../../../tools/commonItem.dart';
|
||||
import '../../../../tools/key_name_item.dart';
|
||||
import '../../../../tools/storage.dart';
|
||||
import '../../../../tools/submitBtn.dart';
|
||||
import '../../../../tools/titleAppBar.dart';
|
||||
|
||||
class AddPalmTypePage extends StatefulWidget { // 从添加员工进入 传入员工名字
|
||||
class AddPalmTypePage extends StatefulWidget {
|
||||
// 从添加员工进入 传入员工名字
|
||||
const AddPalmTypePage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<AddPalmTypePage> createState() => _AddPalmTypePageState();
|
||||
}
|
||||
|
||||
class _AddPalmTypePageState extends State<AddPalmTypePage> with SingleTickerProviderStateMixin {
|
||||
class _AddPalmTypePageState extends State<AddPalmTypePage>
|
||||
with SingleTickerProviderStateMixin {
|
||||
final AddPalmTypeLogic logic = Get.put(AddPalmTypeLogic());
|
||||
final AddPalmTypeState state = Get.find<AddPalmTypeLogic>().state;
|
||||
|
||||
@ -77,10 +79,10 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> with SingleTickerProv
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyBottomWidget()
|
||||
],
|
||||
),
|
||||
@ -92,10 +94,10 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> with SingleTickerProv
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyTimeLimitWidget(),
|
||||
// SizedBox(height: 10.h),
|
||||
keyBottomWidget()
|
||||
@ -109,10 +111,10 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> with SingleTickerProv
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyCyclicDate(),
|
||||
SizedBox(height: 10.h),
|
||||
keyBottomWidget()
|
||||
@ -125,21 +127,6 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> with SingleTickerProv
|
||||
}
|
||||
}
|
||||
|
||||
// 密码命名输入框
|
||||
Widget perpetualKeyWidget(
|
||||
String titleStr, String rightTitle, TextEditingController controller) {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
CommonItem(
|
||||
leftTitel: titleStr,
|
||||
rightTitle: '',
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: getTFWidget(rightTitle)),
|
||||
Container(height: 10.h),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
// 限时顶部选择日期
|
||||
Widget keyTimeLimitWidget() {
|
||||
return Column(
|
||||
@ -153,23 +140,25 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> with SingleTickerProv
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.parse(state.timeLimitBeginTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitBeginTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitBeginTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
})),
|
||||
Obx(() => CommonItem(
|
||||
leftTitel: '失效时间'.tr,
|
||||
rightTitle: state.timeLimitEndTime.value,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
final PDuration selectDate =
|
||||
PDuration.parse(DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitEndTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitEndTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
})),
|
||||
Container(height: 10.h),
|
||||
],
|
||||
@ -183,18 +172,18 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> with SingleTickerProv
|
||||
Obx(() => CommonItem(
|
||||
leftTitel: '有效期'.tr,
|
||||
rightTitle:
|
||||
'${state.cycleBeginTime.value}\n${state.cycleEndTime.value}',
|
||||
'${state.cycleBeginTime.value}\n${state.cycleEndTime.value}',
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result =
|
||||
await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
if (result != null && result.isNotEmpty) {
|
||||
state.weekdaysList.value = result['validityValue'];
|
||||
state.cycleBeginTime.value = result['starDate'];
|
||||
@ -211,7 +200,8 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> with SingleTickerProv
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
@ -231,10 +221,12 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> with SingleTickerProv
|
||||
visible: state.effectiveDateTime.value.isNotEmpty,
|
||||
child: CommonItem(
|
||||
leftTitel: '有效时间'.tr,
|
||||
rightTitle: '${state.effectiveDateTime.value}-${state.failureDateTime.value}',
|
||||
rightTitle:
|
||||
'${state.effectiveDateTime.value}-${state.failureDateTime.value}',
|
||||
isHaveDirection: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
@ -265,7 +257,7 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> with SingleTickerProv
|
||||
isTipsImg: false,
|
||||
isHaveRightWidget: true,
|
||||
rightWidget:
|
||||
SizedBox(width: 60.w, height: 50.h, child: _isAdmin())))),
|
||||
SizedBox(width: 60.w, height: 50.h, child: _isAdmin())))),
|
||||
SizedBox(height: 10.h),
|
||||
Obx(() => CommonItem(
|
||||
leftTitel: '胁迫掌静脉'.tr,
|
||||
@ -303,59 +295,6 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> with SingleTickerProv
|
||||
);
|
||||
}
|
||||
|
||||
// 接受者信息输入框
|
||||
Widget getTFWidget(String tfStr) {
|
||||
return Container(
|
||||
// color: Colors.red,
|
||||
height: 65.h,
|
||||
width: 300.w,
|
||||
padding: EdgeInsets.only(top: 5.h),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: TextField(
|
||||
//输入框一行
|
||||
maxLines: 1,
|
||||
inputFormatters: <TextInputFormatter>[
|
||||
FilteringTextInputFormatter.deny('\n'),
|
||||
LengthLimitingTextInputFormatter(50),
|
||||
],
|
||||
style: TextStyle(
|
||||
fontSize: 22.sp, color: AppColors.darkGrayTextColor),
|
||||
controller: state.nameController,
|
||||
autofocus: false,
|
||||
textAlign: TextAlign.end,
|
||||
decoration: InputDecoration(
|
||||
//输入里面输入文字内边距设置
|
||||
// contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
|
||||
hintText: tfStr,
|
||||
hintStyle: TextStyle(fontSize: 22.sp),
|
||||
focusedBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
disabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
enabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
border: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 0),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 10.w,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
//isStressFingerprint false:不是胁迫指纹 ture:胁迫指纹
|
||||
CupertinoSwitch _isStressFingerprint() {
|
||||
return CupertinoSwitch(
|
||||
@ -399,12 +338,8 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> with SingleTickerProv
|
||||
onTap: (int index) {
|
||||
FocusScope.of(context).requestFocus(FocusNode());
|
||||
},
|
||||
tabs: state.fromType.value == 1
|
||||
? _itemTabs.map(_tab).toList()
|
||||
: _fromCheckInTypeItemTabs
|
||||
.map(_tab)
|
||||
.toList(),
|
||||
isScrollable: true,
|
||||
tabs: _itemTabs.map(_tab).toList(),
|
||||
isScrollable: false,
|
||||
indicatorColor: Colors.red,
|
||||
unselectedLabelColor: Colors.black,
|
||||
unselectedLabelStyle: TextStyle(
|
||||
@ -421,13 +356,18 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> with SingleTickerProv
|
||||
borderSide: BorderSide(color: AppColors.mainColor, width: 4.w),
|
||||
strokeCap: StrokeCap.round,
|
||||
width: 30.w),
|
||||
labelPadding: EdgeInsets.symmetric(horizontal: 10.w),
|
||||
padding: EdgeInsets.zero, // 去除TabBar两侧的间隙
|
||||
);
|
||||
}
|
||||
|
||||
Tab _tab(ItemView item) {
|
||||
return Tab(
|
||||
child: SizedBox(
|
||||
width: 1.sw / 5,
|
||||
child: Container(
|
||||
// color: Colors.red,
|
||||
width: (1.sw - 10.w * 5) / 3,
|
||||
// width: 1.sw / 4,
|
||||
alignment: Alignment.center,
|
||||
child: Text(item.title, textAlign: TextAlign.center)));
|
||||
}
|
||||
|
||||
@ -436,12 +376,10 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> with SingleTickerProv
|
||||
child: TabBarView(
|
||||
controller: state.tabController,
|
||||
children: state.fromType.value == 1
|
||||
? _itemTabs
|
||||
.map((ItemView item) => Obx(indexChangeWidget))
|
||||
.toList()
|
||||
? _itemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList()
|
||||
: _fromCheckInTypeItemTabs
|
||||
.map((ItemView item) => Obx(indexChangeWidget))
|
||||
.toList(),
|
||||
.map((ItemView item) => Obx(indexChangeWidget))
|
||||
.toList(),
|
||||
),
|
||||
);
|
||||
}
|
||||
@ -452,4 +390,4 @@ class ItemView {
|
||||
|
||||
final String title;
|
||||
final String selectType;
|
||||
}
|
||||
}
|
||||
|
||||
@ -23,12 +23,14 @@ class PalmListLogic extends BaseGetXController {
|
||||
// 获取解析后的数据
|
||||
late StreamSubscription<Reply> _replySubscription;
|
||||
void _initReplySubscription() {
|
||||
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
|
||||
// 添加掌静脉开始(重置锁里面所有掌静脉)
|
||||
if ((reply is SenderAddPalmWithTimeCycleCoercionReply) && (state.ifCurrentScreen.value == true)) {
|
||||
_replyAddPalmBegin(reply);
|
||||
}
|
||||
});
|
||||
_replySubscription =
|
||||
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
|
||||
// 添加掌静脉开始(重置锁里面所有掌静脉)
|
||||
if ((reply is SenderAddPalmWithTimeCycleCoercionReply) &&
|
||||
(state.ifCurrentScreen.value == true)) {
|
||||
_replyAddPalmBegin(reply);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 添加卡片开始(此处用作删除卡片)
|
||||
@ -37,23 +39,23 @@ class PalmListLogic extends BaseGetXController {
|
||||
|
||||
switch (status) {
|
||||
case 0x00:
|
||||
//成功
|
||||
//成功
|
||||
cancelBlueConnetctToastTimer();
|
||||
if(state.isDeletAll == true){
|
||||
if (state.isDeletAll == true) {
|
||||
resetPalmData();
|
||||
}else{
|
||||
} else {
|
||||
deletPalmData();
|
||||
}
|
||||
break;
|
||||
case 0x06:
|
||||
//无权限
|
||||
//无权限
|
||||
final List<String>? privateKey =
|
||||
await Storage.getStringList(saveBluePrivateKey);
|
||||
await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList =
|
||||
changeStringListToIntList(privateKey!);
|
||||
changeStringListToIntList(privateKey!);
|
||||
|
||||
final List<String>? signKey =
|
||||
await Storage.getStringList(saveBlueSignKey);
|
||||
await Storage.getStringList(saveBlueSignKey);
|
||||
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
|
||||
|
||||
final List<int> token = reply.data.sublist(5, 9);
|
||||
@ -81,7 +83,7 @@ class PalmListLogic extends BaseGetXController {
|
||||
isBeforeAddUser: false);
|
||||
break;
|
||||
default:
|
||||
//失败
|
||||
//失败
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -93,59 +95,60 @@ class PalmListLogic extends BaseGetXController {
|
||||
dismissEasyLoading();
|
||||
});
|
||||
BlueManage().blueSendData(BlueManage().connectDeviceName,
|
||||
(BluetoothConnectionState deviceConnectionState) async {
|
||||
if (deviceConnectionState == BluetoothConnectionState.connected) {
|
||||
final List<String>? signKey =
|
||||
(BluetoothConnectionState deviceConnectionState) async {
|
||||
if (deviceConnectionState == BluetoothConnectionState.connected) {
|
||||
final List<String>? signKey =
|
||||
await Storage.getStringList(saveBlueSignKey);
|
||||
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
|
||||
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
|
||||
|
||||
final List<String>? privateKey =
|
||||
final List<String>? privateKey =
|
||||
await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList =
|
||||
final List<int> getPrivateKeyList =
|
||||
changeStringListToIntList(privateKey!);
|
||||
|
||||
final List<String>? token = await Storage.getStringList(saveBlueToken);
|
||||
final List<int> getTokenList = changeStringListToIntList(token!);
|
||||
final List<String>? token = await Storage.getStringList(saveBlueToken);
|
||||
final List<int> getTokenList = changeStringListToIntList(token!);
|
||||
|
||||
IoSenderManage.senderAddPalmWithTimeCycleCoercionCommand(
|
||||
keyID: state.deletKeyID,
|
||||
userID: (await Storage.getUid())!,
|
||||
palmNo: state.deletPalmVeinNo,
|
||||
useCountLimit: 0xffff,
|
||||
operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部
|
||||
isAdmin: 0,
|
||||
isForce: 0, // 是否是胁迫
|
||||
isRound: 0, // 是否是循环
|
||||
weekRound: 0, // 周循环
|
||||
startDate: 0x11223344,
|
||||
endDate: 0x11223344,
|
||||
startTime: '0',
|
||||
endTime: '0',
|
||||
needAuthor: 1,
|
||||
signKey: signKeyDataList,
|
||||
privateKey: getPrivateKeyList,
|
||||
token: getTokenList,
|
||||
isBeforeAddUser: false);
|
||||
} else if (deviceConnectionState ==
|
||||
BluetoothConnectionState.disconnected) {
|
||||
dismissEasyLoading();
|
||||
cancelBlueConnetctToastTimer();
|
||||
if (state.ifCurrentScreen.value == true) {
|
||||
showBlueConnetctToast();
|
||||
}
|
||||
}
|
||||
});
|
||||
IoSenderManage.senderAddPalmWithTimeCycleCoercionCommand(
|
||||
keyID: state.deletKeyID,
|
||||
userID: (await Storage.getUid())!,
|
||||
palmNo: state.deletPalmVeinNo,
|
||||
useCountLimit: 0xffff,
|
||||
operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部
|
||||
isAdmin: 0,
|
||||
isForce: 0, // 是否是胁迫
|
||||
isRound: 0, // 是否是循环
|
||||
weekRound: 0, // 周循环
|
||||
startDate: 0x11223344,
|
||||
endDate: 0x11223344,
|
||||
startTime: '0',
|
||||
endTime: '0',
|
||||
needAuthor: 1,
|
||||
signKey: signKeyDataList,
|
||||
privateKey: getPrivateKeyList,
|
||||
token: getTokenList,
|
||||
isBeforeAddUser: false);
|
||||
} else if (deviceConnectionState ==
|
||||
BluetoothConnectionState.disconnected) {
|
||||
dismissEasyLoading();
|
||||
cancelBlueConnetctToastTimer();
|
||||
if (state.ifCurrentScreen.value == true) {
|
||||
showBlueConnetctToast();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 获取掌静脉列表
|
||||
Future<FingerprintListDataEntity> getPalmListData({required bool isRefresh}) async {
|
||||
Future<FingerprintListDataEntity> getPalmListData(
|
||||
{required bool isRefresh}) async {
|
||||
// 如果是下拉刷新,清空已有数据
|
||||
if (isRefresh) {
|
||||
state.fingerprintItemListData.clear();
|
||||
pageNo = 1;
|
||||
}
|
||||
final FingerprintListDataEntity entity =
|
||||
await ApiRepository.to.getPalmListData(
|
||||
await ApiRepository.to.getPalmListData(
|
||||
lockId: state.lockId.value.toString(),
|
||||
pageNo: pageNo.toString(),
|
||||
pageSize: pageSize,
|
||||
@ -162,9 +165,8 @@ class PalmListLogic extends BaseGetXController {
|
||||
|
||||
// 删除所有掌静脉
|
||||
Future<void> resetPalmData() async {
|
||||
final LoginEntity entity = await ApiRepository.to.resetPalmData(
|
||||
lockId: state.lockId.value
|
||||
);
|
||||
final LoginEntity entity =
|
||||
await ApiRepository.to.resetPalmData(lockId: state.lockId.value);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
showToast('重置成功'.tr, something: () {
|
||||
getPalmListData(isRefresh: true);
|
||||
@ -211,13 +213,13 @@ class PalmListLogic extends BaseGetXController {
|
||||
String keyDateTypeStr = ''; // 永久:1;限时2,单次3,循环:4
|
||||
if (fingerprintItemData.palmVeinType! == 1) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} 永久';
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} ${'永久'.tr}';
|
||||
} else if (fingerprintItemData.palmVeinType! == 2) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时';
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} ${'限时'.tr}';
|
||||
} else if (fingerprintItemData.palmVeinType! == 4) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环';
|
||||
'${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} ${'循环'.tr}';
|
||||
}
|
||||
return keyDateTypeStr;
|
||||
}
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@ -88,10 +87,7 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
false,
|
||||
'姓名'.tr,
|
||||
'请给密码命名'.tr,
|
||||
state.nameController),
|
||||
false, '姓名'.tr, '请给密码命名'.tr, state.nameController),
|
||||
keyBottomWidget(
|
||||
'密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。'
|
||||
.tr)
|
||||
@ -107,10 +103,7 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
|
||||
children: <Widget>[
|
||||
keyTimeLimitWidget(),
|
||||
perpetualKeyWidget(
|
||||
false,
|
||||
'姓名'.tr,
|
||||
'请给密码命名'.tr,
|
||||
state.nameController),
|
||||
false, '姓名'.tr, '请给密码命名'.tr, state.nameController),
|
||||
keyBottomWidget(
|
||||
'密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。'
|
||||
.tr)
|
||||
@ -125,12 +118,8 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
false,
|
||||
'姓名'.tr,
|
||||
'请给密码命名'.tr,
|
||||
state.nameController),
|
||||
keyBottomWidget(
|
||||
'密码有限期为6个小时,只能使用一次'.tr)
|
||||
false, '姓名'.tr, '请给密码命名'.tr, state.nameController),
|
||||
keyBottomWidget('密码有限期为6个小时,只能使用一次'.tr)
|
||||
],
|
||||
),
|
||||
);
|
||||
@ -147,18 +136,11 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
|
||||
else
|
||||
Container(),
|
||||
perpetualKeyWidget(
|
||||
false,
|
||||
'姓名'.tr,
|
||||
'请给密码命名'.tr,
|
||||
state.nameController),
|
||||
false, '姓名'.tr, '请给密码命名'.tr, state.nameController),
|
||||
perpetualKeyWidget(
|
||||
false,
|
||||
'密码'.tr,
|
||||
'请输入6-9位数字'.tr,
|
||||
state.pwdController),
|
||||
false, '密码'.tr, '请输入6-9位数字'.tr, state.pwdController),
|
||||
keyIfAdministratorWidget(),
|
||||
keyBottomWidget(
|
||||
'手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加'.tr)
|
||||
keyBottomWidget('手动输入6-9位数字作为密码。可在锁旁边通过手机蓝牙添加,也可以通过网关远程添加'.tr)
|
||||
],
|
||||
),
|
||||
);
|
||||
@ -171,10 +153,7 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
|
||||
children: <Widget>[
|
||||
keyCirculationWidget(),
|
||||
perpetualKeyWidget(
|
||||
true,
|
||||
'姓名'.tr,
|
||||
'请给密码命名'.tr,
|
||||
state.nameController),
|
||||
true, '姓名'.tr, '请给密码命名'.tr, state.nameController),
|
||||
keyBottomWidget(
|
||||
'密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。密码激活后,有效期内不限次数使用。'
|
||||
.tr)
|
||||
@ -189,10 +168,7 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
false,
|
||||
'姓名'.tr,
|
||||
'请给密码命名'.tr,
|
||||
state.nameController),
|
||||
false, '姓名'.tr, '请给密码命名'.tr, state.nameController),
|
||||
keyBottomWidget('清空密码底部提示'.tr)
|
||||
],
|
||||
),
|
||||
@ -210,12 +186,74 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
if (isTopHeight) SizedBox(height: 10.h) else Container(),
|
||||
CommonItem(
|
||||
leftTitel: titleStr,
|
||||
rightTitle: '',
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: getTFWidget(rightTitle, controller)),
|
||||
SizedBox(height: 10.h),
|
||||
// CommonItem(
|
||||
// leftTitel: titleStr,
|
||||
// rightTitle: '',
|
||||
// isHaveRightWidget: true,
|
||||
// rightWidget: getTFWidget(rightTitle, controller)),
|
||||
// SizedBox(height: 10.h),
|
||||
Container(
|
||||
height: 65.h,
|
||||
padding: EdgeInsets.only(left: 20.w, right: 20.w),
|
||||
color: Colors.white,
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
Text(titleStr, style: TextStyle(fontSize: 22.sp)),
|
||||
SizedBox(width: 6.w),
|
||||
Expanded(
|
||||
child: TextField(
|
||||
//输入框一行
|
||||
maxLines: 1,
|
||||
inputFormatters: controller == state.pwdController
|
||||
? <TextInputFormatter>[
|
||||
FilteringTextInputFormatter.deny('\n'),
|
||||
LengthLimitingTextInputFormatter(9),
|
||||
FilteringTextInputFormatter.allow(RegExp(r'[0-9]')),
|
||||
]
|
||||
: <TextInputFormatter>[
|
||||
FilteringTextInputFormatter.deny('\n'),
|
||||
LengthLimitingTextInputFormatter(50),
|
||||
],
|
||||
keyboardType: controller == state.nameController
|
||||
? TextInputType.text
|
||||
: TextInputType.number,
|
||||
style: TextStyle(
|
||||
fontSize: 22.sp, color: AppColors.darkGrayTextColor),
|
||||
controller: controller,
|
||||
autofocus: false,
|
||||
textAlign: TextAlign.end,
|
||||
// decoration: InputDecoration(
|
||||
// //输入里面输入文字内边距设置
|
||||
// contentPadding: EdgeInsets.only(top: 24.h, bottom: 16.h),
|
||||
// hintText: tfStr,
|
||||
// hintStyle: TextStyle(fontSize: 22.sp),
|
||||
// //不需要输入框下划线
|
||||
// border: InputBorder.none,
|
||||
// ),
|
||||
decoration: InputDecoration(
|
||||
//输入里面输入文字内边距设置
|
||||
// contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
|
||||
hintText: rightTitle,
|
||||
hintStyle: TextStyle(fontSize: 22.sp),
|
||||
focusedBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
disabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
enabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
border: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 0),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
@ -242,7 +280,8 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
|
||||
day: DateTime.now().day,
|
||||
hour: 24),
|
||||
// minDate: PDuration.now(),
|
||||
mode: DateMode.YMDHM, hourShow24: true, onConfirm: (PDuration p) {
|
||||
mode: DateMode.YMDHM,
|
||||
hourShow24: true, onConfirm: (PDuration p) {
|
||||
state.beginTime.value = DateTool().getYMDHNDateString(p, 4);
|
||||
});
|
||||
}),
|
||||
@ -266,8 +305,7 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
|
||||
month: DateTime.now().month,
|
||||
day: DateTime.now().day),
|
||||
mode: DateMode.YMDH,
|
||||
hourShow24: true,
|
||||
onConfirm: (PDuration p) {
|
||||
hourShow24: true, onConfirm: (PDuration p) {
|
||||
state.endTime.value = DateTool().getYMDHNDateString(p, 4);
|
||||
});
|
||||
}),
|
||||
@ -472,9 +510,7 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
|
||||
height: 20.h,
|
||||
),
|
||||
SubmitBtn(
|
||||
btnName: state.widgetType.value == 3
|
||||
? '设置密码'.tr
|
||||
: '获取密码'.tr,
|
||||
btnName: state.widgetType.value == 3 ? '设置密码'.tr : '获取密码'.tr,
|
||||
onClick: () async {
|
||||
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
|
||||
if (isDemoMode == false) {
|
||||
@ -562,70 +598,70 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
|
||||
}
|
||||
|
||||
// 接受者信息输入框
|
||||
Widget getTFWidget(String tfStr, TextEditingController editController) {
|
||||
return SizedBox(
|
||||
height: 65.h,
|
||||
width: 300.w,
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: TextField(
|
||||
//输入框一行
|
||||
maxLines: 1,
|
||||
inputFormatters: editController == state.pwdController
|
||||
? <TextInputFormatter>[
|
||||
FilteringTextInputFormatter.deny('\n'),
|
||||
LengthLimitingTextInputFormatter(9),
|
||||
FilteringTextInputFormatter.allow(RegExp(r'[0-9]')),
|
||||
]
|
||||
: <TextInputFormatter>[
|
||||
FilteringTextInputFormatter.deny('\n'),
|
||||
LengthLimitingTextInputFormatter(50),
|
||||
],
|
||||
keyboardType: editController == state.nameController
|
||||
? TextInputType.text
|
||||
: TextInputType.number,
|
||||
style: TextStyle(
|
||||
fontSize: 22.sp, color: AppColors.darkGrayTextColor),
|
||||
controller: editController,
|
||||
autofocus: false,
|
||||
textAlign: TextAlign.end,
|
||||
// decoration: InputDecoration(
|
||||
// //输入里面输入文字内边距设置
|
||||
// contentPadding: EdgeInsets.only(top: 24.h, bottom: 16.h),
|
||||
// hintText: tfStr,
|
||||
// hintStyle: TextStyle(fontSize: 22.sp),
|
||||
// //不需要输入框下划线
|
||||
// border: InputBorder.none,
|
||||
// ),
|
||||
decoration: InputDecoration(
|
||||
//输入里面输入文字内边距设置
|
||||
// contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
|
||||
hintText: tfStr,
|
||||
hintStyle: TextStyle(fontSize: 22.sp),
|
||||
focusedBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
disabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
enabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
border: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 0),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 10.w,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
// Widget getTFWidget(String tfStr, TextEditingController editController) {
|
||||
// return SizedBox(
|
||||
// height: 65.h,
|
||||
// width: 300.w,
|
||||
// child: Row(
|
||||
// children: <Widget>[
|
||||
// Expanded(
|
||||
// child: TextField(
|
||||
// //输入框一行
|
||||
// maxLines: 1,
|
||||
// inputFormatters: editController == state.pwdController
|
||||
// ? <TextInputFormatter>[
|
||||
// FilteringTextInputFormatter.deny('\n'),
|
||||
// LengthLimitingTextInputFormatter(9),
|
||||
// FilteringTextInputFormatter.allow(RegExp(r'[0-9]')),
|
||||
// ]
|
||||
// : <TextInputFormatter>[
|
||||
// FilteringTextInputFormatter.deny('\n'),
|
||||
// LengthLimitingTextInputFormatter(50),
|
||||
// ],
|
||||
// keyboardType: editController == state.nameController
|
||||
// ? TextInputType.text
|
||||
// : TextInputType.number,
|
||||
// style: TextStyle(
|
||||
// fontSize: 22.sp, color: AppColors.darkGrayTextColor),
|
||||
// controller: editController,
|
||||
// autofocus: false,
|
||||
// textAlign: TextAlign.end,
|
||||
// // decoration: InputDecoration(
|
||||
// // //输入里面输入文字内边距设置
|
||||
// // contentPadding: EdgeInsets.only(top: 24.h, bottom: 16.h),
|
||||
// // hintText: tfStr,
|
||||
// // hintStyle: TextStyle(fontSize: 22.sp),
|
||||
// // //不需要输入框下划线
|
||||
// // border: InputBorder.none,
|
||||
// // ),
|
||||
// decoration: InputDecoration(
|
||||
// //输入里面输入文字内边距设置
|
||||
// // contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
|
||||
// hintText: tfStr,
|
||||
// hintStyle: TextStyle(fontSize: 22.sp),
|
||||
// focusedBorder: const OutlineInputBorder(
|
||||
// borderSide:
|
||||
// BorderSide(width: 0, color: Colors.transparent)),
|
||||
// disabledBorder: const OutlineInputBorder(
|
||||
// borderSide:
|
||||
// BorderSide(width: 0, color: Colors.transparent)),
|
||||
// enabledBorder: const OutlineInputBorder(
|
||||
// borderSide:
|
||||
// BorderSide(width: 0, color: Colors.transparent)),
|
||||
// border: const OutlineInputBorder(
|
||||
// borderSide:
|
||||
// BorderSide(width: 0, color: Colors.transparent)),
|
||||
// contentPadding: const EdgeInsets.symmetric(vertical: 0),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// SizedBox(
|
||||
// width: 10.w,
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
|
||||
CupertinoSwitch _switch() {
|
||||
return CupertinoSwitch(
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@ -13,6 +12,7 @@ import '../../../../app_settings/app_colors.dart';
|
||||
import '../../../../tools/CustomUnderlineTabIndicator.dart';
|
||||
import '../../../../tools/commonItem.dart';
|
||||
import '../../../../tools/dateTool.dart';
|
||||
import '../../../../tools/key_name_item.dart';
|
||||
import '../../../../tools/storage.dart';
|
||||
import '../../../../tools/submitBtn.dart';
|
||||
import '../../../../tools/titleAppBar.dart';
|
||||
@ -23,21 +23,22 @@ class AddRemoteControlTypePage extends StatefulWidget {
|
||||
const AddRemoteControlTypePage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<AddRemoteControlTypePage> createState() => _AddRemoteControlTypePageState();
|
||||
State<AddRemoteControlTypePage> createState() =>
|
||||
_AddRemoteControlTypePageState();
|
||||
}
|
||||
|
||||
class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> with SingleTickerProviderStateMixin {
|
||||
class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage>
|
||||
with SingleTickerProviderStateMixin {
|
||||
final AddRemoteControlTypeLoigc logic = Get.put(AddRemoteControlTypeLoigc());
|
||||
final AddRemoteControlTypeState state = Get.find<AddRemoteControlTypeLoigc>().state;
|
||||
final AddRemoteControlTypeState state =
|
||||
Get.find<AddRemoteControlTypeLoigc>().state;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
state.tabController = TabController(
|
||||
vsync: this,
|
||||
length: _itemTabs.length,
|
||||
initialIndex: 0);
|
||||
state.tabController =
|
||||
TabController(vsync: this, length: _itemTabs.length, initialIndex: 0);
|
||||
state.tabController.addListener(() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
state.selectType.value = state.tabController.index.toString();
|
||||
@ -54,8 +55,7 @@ class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> wit
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.mainBackgroundColor,
|
||||
appBar: TitleAppBar(
|
||||
barTitle:
|
||||
'添加遥控'.tr,
|
||||
barTitle: '添加遥控'.tr,
|
||||
haveBack: true,
|
||||
backgroundColor: AppColors.mainColor),
|
||||
body: Column(
|
||||
@ -75,10 +75,10 @@ class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> wit
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyBottomWidget()
|
||||
],
|
||||
),
|
||||
@ -90,10 +90,10 @@ class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> wit
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyTimeLimitWidget(),
|
||||
// SizedBox(height: 10.h),
|
||||
keyBottomWidget()
|
||||
@ -107,10 +107,10 @@ class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> wit
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyCyclicDate(),
|
||||
SizedBox(height: 10.h),
|
||||
keyBottomWidget()
|
||||
@ -151,23 +151,25 @@ class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> wit
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.parse(state.timeLimitBeginTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitBeginTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitBeginTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
})),
|
||||
Obx(() => CommonItem(
|
||||
leftTitel: '失效时间'.tr,
|
||||
rightTitle: state.timeLimitEndTime.value,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
final PDuration selectDate =
|
||||
PDuration.parse(DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitEndTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitEndTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
})),
|
||||
Container(height: 10.h),
|
||||
],
|
||||
@ -181,17 +183,18 @@ class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> wit
|
||||
Obx(() => CommonItem(
|
||||
leftTitel: '有效期'.tr,
|
||||
rightTitle:
|
||||
'${state.cycleBeginTime.value}\n${state.cycleEndTime.value}',
|
||||
'${state.cycleBeginTime.value}\n${state.cycleEndTime.value}',
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
if (result != null && result.isNotEmpty) {
|
||||
state.weekdaysList.value = result['validityValue'];
|
||||
state.cycleBeginTime.value = result['starDate'];
|
||||
@ -208,7 +211,8 @@ class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> wit
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
@ -228,10 +232,12 @@ class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> wit
|
||||
visible: state.effectiveDateTime.value.isNotEmpty,
|
||||
child: CommonItem(
|
||||
leftTitel: '有效时间'.tr,
|
||||
rightTitle: '${state.effectiveDateTime.value}-${state.failureDateTime.value}',
|
||||
rightTitle:
|
||||
'${state.effectiveDateTime.value}-${state.failureDateTime.value}',
|
||||
isHaveDirection: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
@ -290,7 +296,8 @@ class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> wit
|
||||
return;
|
||||
}
|
||||
|
||||
logic.checkRemoteControlNameDuplicatedData(state.nameController.text);
|
||||
logic.checkRemoteControlNameDuplicatedData(
|
||||
state.nameController.text);
|
||||
} else {
|
||||
// Get.toNamed(Routers.selectLockTypePage);
|
||||
logic.showToast('演示模式'.tr);
|
||||
@ -331,16 +338,16 @@ class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> wit
|
||||
hintStyle: TextStyle(fontSize: 22.sp),
|
||||
focusedBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
disabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
enabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
border: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 0),
|
||||
),
|
||||
),
|
||||
@ -385,7 +392,6 @@ class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> wit
|
||||
ItemView(title: '循环'.tr, selectType: '2'),
|
||||
];
|
||||
|
||||
|
||||
TabBar _tabBar() {
|
||||
return TabBar(
|
||||
controller: state.tabController,
|
||||
@ -393,7 +399,7 @@ class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> wit
|
||||
FocusScope.of(context).requestFocus(FocusNode());
|
||||
},
|
||||
tabs: _itemTabs.map(_tab).toList(),
|
||||
isScrollable: true,
|
||||
isScrollable: false,
|
||||
indicatorColor: Colors.red,
|
||||
unselectedLabelColor: Colors.black,
|
||||
unselectedLabelStyle: TextStyle(
|
||||
@ -410,13 +416,18 @@ class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> wit
|
||||
borderSide: BorderSide(color: AppColors.mainColor, width: 4.w),
|
||||
strokeCap: StrokeCap.round,
|
||||
width: 30.w),
|
||||
labelPadding: EdgeInsets.symmetric(horizontal: 10.w),
|
||||
padding: EdgeInsets.zero, // 去除TabBar两侧的间隙
|
||||
);
|
||||
}
|
||||
|
||||
Tab _tab(ItemView item) {
|
||||
return Tab(
|
||||
child: SizedBox(
|
||||
width: 1.sw / 5,
|
||||
child: Container(
|
||||
// color: Colors.red,
|
||||
width: (1.sw - 10.w * 5) / 3,
|
||||
// width: 1.sw / 4,
|
||||
alignment: Alignment.center,
|
||||
child: Text(item.title, textAlign: TextAlign.center)));
|
||||
}
|
||||
|
||||
@ -424,9 +435,8 @@ class _AddRemoteControlTypePageState extends State<AddRemoteControlTypePage> wit
|
||||
return Expanded(
|
||||
child: TabBarView(
|
||||
controller: state.tabController,
|
||||
children: _itemTabs
|
||||
.map((ItemView item) => Obx(indexChangeWidget))
|
||||
.toList(),
|
||||
children:
|
||||
_itemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:flutter_slidable/flutter_slidable.dart';
|
||||
@ -145,8 +145,10 @@ class _LockListXHJPageState extends State<LockListXHJPage> with RouteAware {
|
||||
}
|
||||
|
||||
//设备多层级列表
|
||||
Widget _buildLockExpandedList(BuildContext context, int index, GroupList itemData) {
|
||||
final List<LockListInfoItemEntity> lockItemList = itemData.lockList ?? <LockListInfoItemEntity>[];
|
||||
Widget _buildLockExpandedList(
|
||||
BuildContext context, int index, GroupList itemData) {
|
||||
final List<LockListInfoItemEntity> lockItemList =
|
||||
itemData.lockList ?? <LockListInfoItemEntity>[];
|
||||
// AppLog.log('lockItemList[0].lockAlias:${lockItemList[0].lockAlias}');
|
||||
final List<Widget> list = forItems(lockItemList);
|
||||
return LockListGroupView(
|
||||
@ -162,7 +164,7 @@ class _LockListXHJPageState extends State<LockListXHJPage> with RouteAware {
|
||||
crossAxisCount: 2,
|
||||
crossAxisSpacing: 15.w,
|
||||
mainAxisSpacing: 15.h,
|
||||
childAspectRatio: 1.1,
|
||||
childAspectRatio: 0.95,
|
||||
),
|
||||
padding: EdgeInsets.symmetric(vertical: 15.h, horizontal: 15.w),
|
||||
shrinkWrap: true,
|
||||
@ -304,13 +306,20 @@ class _LockListXHJPageState extends State<LockListXHJPage> with RouteAware {
|
||||
),
|
||||
],
|
||||
),
|
||||
Text(
|
||||
keyInfo.isLockOwner == 1
|
||||
? '超级管理员'.tr
|
||||
: (keyInfo.keyRight == 1 ? '授权管理员'.tr : '普通用户'.tr),
|
||||
style: TextStyle(
|
||||
fontSize: 16.sp,
|
||||
color: AppColors.darkGrayTextColor),
|
||||
SizedBox(
|
||||
width: (1.sw - 10.w * 3) / 2 - 48.w - 50.w,
|
||||
child: Text(
|
||||
keyInfo.isLockOwner == 1
|
||||
? '超级管理员'.tr
|
||||
: (keyInfo.keyRight == 1
|
||||
? '授权管理员'.tr
|
||||
: '普通用户'.tr),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
fontSize: 16.sp,
|
||||
color: AppColors.darkGrayTextColor),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
@ -324,69 +333,70 @@ class _LockListXHJPageState extends State<LockListXHJPage> with RouteAware {
|
||||
style: lockAliasTextStyle,
|
||||
maxLines: 2,
|
||||
),
|
||||
Row(
|
||||
children: <Widget>[
|
||||
Visibility(
|
||||
visible: keyInfo.passageMode == 1,
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(
|
||||
top: 2.h, right: 3.w, left: 3.w, bottom: 1.h),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(5.w),
|
||||
color: AppColors.openPassageModeColor,
|
||||
),
|
||||
child: Text('常开模式开启'.tr,
|
||||
style: TextStyle(
|
||||
fontSize: 18.sp,
|
||||
color: AppColors.appBarIconColor)),
|
||||
)),
|
||||
if (keyInfo.passageMode == 1)
|
||||
SizedBox(
|
||||
width: 5.w,
|
||||
),
|
||||
Visibility(
|
||||
visible: keyInfo.lockSetting!.remoteUnlock == 1,
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
Container(
|
||||
padding: EdgeInsets.only(
|
||||
top: 2.h, right: 3.w, left: 3.w, bottom: 1.h),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(5.w),
|
||||
color: AppColors.mainColor,
|
||||
),
|
||||
child: Text(
|
||||
'远程开锁'.tr,
|
||||
style: TextStyle(
|
||||
fontSize: 18.sp, color: Colors.white),
|
||||
),
|
||||
),
|
||||
],
|
||||
)),
|
||||
],
|
||||
),
|
||||
Visibility(
|
||||
visible: logic.getShowType(keyInfo),
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(top: 5.h),
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
Container(
|
||||
padding: EdgeInsets.only(right: 5.w, left: 5.w),
|
||||
visible: keyInfo.passageMode == 1,
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(
|
||||
top: 2.h, right: 3.w, left: 3.w, bottom: 1.h),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(5.w),
|
||||
color: AppColors.openPassageModeColor,
|
||||
),
|
||||
child: Text('常开模式开启'.tr,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
fontSize: 18.sp, color: AppColors.appBarIconColor)),
|
||||
)),
|
||||
if (keyInfo.passageMode == 1)
|
||||
SizedBox(
|
||||
height: 5.h,
|
||||
),
|
||||
Visibility(
|
||||
visible: keyInfo.lockSetting!.remoteUnlock == 1,
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
Flexible(
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(
|
||||
top: 2.h, right: 3.w, left: 3.w, bottom: 1.h),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(5.w),
|
||||
color: DateTool()
|
||||
.compareTimeIsOvertime(keyInfo.endDate!)
|
||||
? AppColors.listTimeYellowColor
|
||||
: AppColors.mainColor,
|
||||
color: AppColors.mainColor,
|
||||
),
|
||||
child: Text(
|
||||
'远程开锁'.tr,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style:
|
||||
TextStyle(fontSize: 18.sp, color: Colors.white),
|
||||
),
|
||||
child: Text(logic.getKeyEffective(keyInfo),
|
||||
style: TextStyle(
|
||||
fontSize: 18.sp, color: Colors.white)
|
||||
// child: Text(logic.compareTimeIsOvertime(keyInfo.endDate!) ? "已过期" : "余${logic.compareTimeGetDaysFromNow(keyInfo.endDate!)}天", style: TextStyle(fontSize: 18.sp, color: Colors.white)
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
)),
|
||||
Visibility(
|
||||
visible: logic.getShowType(keyInfo),
|
||||
child: Flexible(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(top: 5.h),
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(right: 5.w, left: 5.w),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(5.w),
|
||||
color:
|
||||
DateTool().compareTimeIsOvertime(keyInfo.endDate!)
|
||||
? AppColors.listTimeYellowColor
|
||||
: AppColors.mainColor,
|
||||
),
|
||||
child: Text(logic.getKeyEffective(keyInfo),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style:
|
||||
TextStyle(fontSize: 18.sp, color: Colors.white)
|
||||
// child: Text(logic.compareTimeIsOvertime(keyInfo.endDate!) ? "已过期" : "余${logic.compareTimeGetDaysFromNow(keyInfo.endDate!)}天", style: TextStyle(fontSize: 18.sp, color: Colors.white)
|
||||
),
|
||||
),
|
||||
),
|
||||
)),
|
||||
SizedBox(height: 5.h),
|
||||
@ -408,11 +418,15 @@ class _LockListXHJPageState extends State<LockListXHJPage> with RouteAware {
|
||||
color: AppColors.darkGrayTextColor),
|
||||
),
|
||||
SizedBox(width: 5.w),
|
||||
Text(
|
||||
useKeyTypeListStr[2],
|
||||
style: TextStyle(
|
||||
fontSize: 16.sp,
|
||||
color: AppColors.darkGrayTextColor),
|
||||
Expanded(
|
||||
child: Text(
|
||||
useKeyTypeListStr[2],
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
fontSize: 16.sp,
|
||||
color: AppColors.darkGrayTextColor),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@ -186,7 +186,7 @@ class LockMainLogic extends BaseGetXController {
|
||||
if (!notificationEnabled) {
|
||||
//推送未开启
|
||||
ShowTipView().showIosTipWithContentDialog(
|
||||
'为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。'.tr, () async {
|
||||
'为了让您及时收到重要通知和更新,我们需要获取通知权限。请点击“确定”按钮,然后在设置页面中启用通知权限。', () async {
|
||||
openAppSettings();
|
||||
});
|
||||
}
|
||||
|
||||
@ -1,6 +1,4 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
@ -30,6 +28,8 @@ class _AboutPageState extends State<AboutPage> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
// AppLog.log('Get.locale!: ${Get.locale.toString()}');
|
||||
|
||||
initPackageInfo();
|
||||
}
|
||||
|
||||
@ -87,7 +87,8 @@ class _AboutPageState extends State<AboutPage> {
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Navigator.pushNamed(context, Routers.webviewShowPage, arguments: {
|
||||
'url': XSConstantMacro.introduceURL,
|
||||
'url': XSConstantMacro.introduceURL +
|
||||
'?lang=${Get.locale!.toString()}',
|
||||
'title': '介绍'.tr
|
||||
});
|
||||
}),
|
||||
@ -104,7 +105,8 @@ class _AboutPageState extends State<AboutPage> {
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.webviewShowPage, arguments: {
|
||||
'url': XSConstantMacro.userAgreementURL,
|
||||
'url': XSConstantMacro.userAgreementURL +
|
||||
'?lang=${Get.locale!.toString()}',
|
||||
'title': '用户协议'.tr
|
||||
});
|
||||
}),
|
||||
@ -121,7 +123,8 @@ class _AboutPageState extends State<AboutPage> {
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Navigator.pushNamed(context, Routers.webviewShowPage, arguments: {
|
||||
'url': XSConstantMacro.privacyPolicyURL,
|
||||
'url': XSConstantMacro.privacyPolicyURL +
|
||||
'?lang=${Get.locale!.toString()}',
|
||||
'title': '隐私政策'.tr
|
||||
});
|
||||
}),
|
||||
@ -138,7 +141,8 @@ class _AboutPageState extends State<AboutPage> {
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Navigator.pushNamed(context, Routers.webviewShowPage, arguments: {
|
||||
'url': XSConstantMacro.collectionListURL,
|
||||
'url': XSConstantMacro.collectionListURL +
|
||||
'?lang=${Get.locale!.toString()}',
|
||||
'title': '个人信息收集清单'.tr
|
||||
});
|
||||
}),
|
||||
@ -149,13 +153,14 @@ class _AboutPageState extends State<AboutPage> {
|
||||
endIndent: 20.w,
|
||||
),
|
||||
CommonItem(
|
||||
leftTitel:'应用权限说明'.tr,
|
||||
leftTitel: '应用权限说明'.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: false,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Navigator.pushNamed(context, Routers.webviewShowPage, arguments: {
|
||||
'url': XSConstantMacro.appPermissionDescURL,
|
||||
'url': XSConstantMacro.appPermissionDescURL +
|
||||
'?lang=${Get.locale!.toString()}',
|
||||
'title': '应用权限说明'.tr
|
||||
});
|
||||
}),
|
||||
@ -166,13 +171,14 @@ class _AboutPageState extends State<AboutPage> {
|
||||
endIndent: 20.w,
|
||||
),
|
||||
CommonItem(
|
||||
leftTitel:'第三方信息共享清单'.tr,
|
||||
leftTitel: '第三方信息共享清单'.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: false,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Navigator.pushNamed(context, Routers.webviewShowPage, arguments: {
|
||||
'url': XSConstantMacro.thirdPartyInfShareListURL,
|
||||
'url': XSConstantMacro.thirdPartyInfShareListURL +
|
||||
'?lang=${Get.locale!.toString()}',
|
||||
'title': '第三方信息共享清单'.tr
|
||||
});
|
||||
}),
|
||||
|
||||
@ -1,16 +1,17 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:star_lock/app_settings/app_settings.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
|
||||
class WebviewShowState {
|
||||
late WebViewController webViewController = WebViewController()
|
||||
..setJavaScriptMode(JavaScriptMode.unrestricted);
|
||||
var webURL = '';
|
||||
var webTitle = '';
|
||||
var webProgress = 0.0.obs;
|
||||
|
||||
WebviewShowState() {
|
||||
Map map = Get.arguments;
|
||||
webURL = map["url"];
|
||||
webURL = map['url'];
|
||||
webTitle = map['title'];
|
||||
AppLog.log('webURL: $webURL');
|
||||
}
|
||||
late WebViewController webViewController = WebViewController()
|
||||
..setJavaScriptMode(JavaScriptMode.unrestricted);
|
||||
String webURL = '';
|
||||
String webTitle = '';
|
||||
RxDouble webProgress = 0.0.obs;
|
||||
}
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
||||
import 'package:get/get.dart';
|
||||
@ -7,14 +8,13 @@ import 'package:star_lock/app_settings/app_settings.dart';
|
||||
import 'package:star_lock/tools/baseGetXController.dart';
|
||||
|
||||
import '../../../../blue/blue_manage.dart';
|
||||
import '../../../../blue/io_protocol/io_gateway_configuringWifi.dart';
|
||||
import '../../../../blue/io_gateway/io_gateway_configuringWifi.dart';
|
||||
import '../../../../blue/io_reply.dart';
|
||||
import '../../../../blue/io_tool/io_tool.dart';
|
||||
import '../../../../blue/io_tool/manager_event_bus.dart';
|
||||
import '../../../../blue/sender_manage.dart';
|
||||
import '../../../../login/login/entity/LoginEntity.dart';
|
||||
import '../../../../network/api_repository.dart';
|
||||
import '../../../../tools/storage.dart';
|
||||
import 'gatewayConfigurationWifi_state.dart';
|
||||
import 'getGatewayConfiguration_entity.dart';
|
||||
|
||||
@ -31,7 +31,7 @@ class GatewayConfigurationWifiLogic extends BaseGetXController {
|
||||
networkName: state.wifiNameTF.text,
|
||||
networkMac: state.gatewayModel.wifiMac,
|
||||
version: state.gatewayModel.gatewayVersion,
|
||||
secretKey: state.secretKey);
|
||||
gatewayJson: jsonDecode(state.gatewayJson));
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
showToast('配网成功'.tr, something: () {
|
||||
// eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
|
||||
@ -94,9 +94,10 @@ class GatewayConfigurationWifiLogic extends BaseGetXController {
|
||||
state.sureBtnState.value = 0;
|
||||
cancelBlueConnetctToastTimer();
|
||||
dismissEasyLoading();
|
||||
|
||||
final List<int> secretKeyList = reply.data.sublist(3, 23);
|
||||
state.secretKey = utf8String(secretKeyList);
|
||||
final int secretKeyJsonLength = (reply.data[3] << 8) + reply.data[4];
|
||||
final List<int> secretKeyList =
|
||||
reply.data.sublist(5, 5 + secretKeyJsonLength);
|
||||
state.gatewayJson = utf8String(secretKeyList);
|
||||
|
||||
gatewayDistributionNetwork();
|
||||
break;
|
||||
|
||||
@ -30,7 +30,7 @@ class GatewayConfigurationWifiState {
|
||||
final TextEditingController firstChoiceDNSTF = TextEditingController();
|
||||
final TextEditingController alternativeDNSTF = TextEditingController();
|
||||
|
||||
String secretKey = '';
|
||||
String gatewayJson = '';
|
||||
String getGatewayConfigurationStr = '';
|
||||
// RxString wifiName = '请选择WiFi'.obs;
|
||||
RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示
|
||||
|
||||
@ -1,10 +1,9 @@
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_gateway_configuringWifi.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_gateway_getWifiList.dart';
|
||||
import 'package:star_lock/blue/io_gateway/io_gateway_configuringWifi.dart';
|
||||
import 'package:star_lock/blue/io_gateway/io_gateway_getWifiList.dart';
|
||||
import 'package:star_lock/tools/baseGetXController.dart';
|
||||
|
||||
import '../../../../../blue/io_tool/io_tool.dart';
|
||||
@ -21,12 +20,13 @@ class GatewayGetWifiListLogic extends BaseGetXController {
|
||||
// 获取解析后的数据
|
||||
late StreamSubscription<Reply> _replySubscription;
|
||||
void _initReplySubscription() {
|
||||
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
|
||||
if(reply is GatewayGetWifiReply) {
|
||||
_replySubscription =
|
||||
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
|
||||
if (reply is GatewayGetWifiReply) {
|
||||
_replySendGetWifiParameters(reply);
|
||||
}
|
||||
|
||||
if(reply is GatewayGetWifiListReply) {
|
||||
if (reply is GatewayGetWifiListReply) {
|
||||
_replyGetWifiListParameters(reply);
|
||||
}
|
||||
});
|
||||
@ -35,33 +35,33 @@ class GatewayGetWifiListLogic extends BaseGetXController {
|
||||
// 发送获取wifi列表数据解析
|
||||
Future<void> _replySendGetWifiParameters(Reply reply) async {
|
||||
final int status = reply.data[2];
|
||||
switch(status){
|
||||
switch (status) {
|
||||
case 0x00:
|
||||
//成功
|
||||
//成功
|
||||
showEasyLoading();
|
||||
cancelBlueConnetctToastTimer();
|
||||
Future.delayed(5.seconds, dismissEasyLoading);
|
||||
break;
|
||||
case 0x06:
|
||||
// 需要鉴权
|
||||
// 需要鉴权
|
||||
|
||||
// var token = await Storage.getStringList(saveBlueToken);
|
||||
// List<int> getTokenList = changeStringListToIntList(token!);
|
||||
//
|
||||
// var privateKey = await Storage.getStringList(saveBluePrivateKey);
|
||||
// List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
|
||||
//
|
||||
// var publicKey = await Storage.getStringList(saveBluePublicKey);
|
||||
// List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
|
||||
//
|
||||
// IoSenderManage.getWifiListCommand(
|
||||
// keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
|
||||
// userID: await Storage.getUid(),
|
||||
// token: getTokenList,
|
||||
// needAuthor: 1,
|
||||
// publicKey: publicKeyDataList,
|
||||
// privateKey: getPrivateKeyList,
|
||||
// );
|
||||
// var token = await Storage.getStringList(saveBlueToken);
|
||||
// List<int> getTokenList = changeStringListToIntList(token!);
|
||||
//
|
||||
// var privateKey = await Storage.getStringList(saveBluePrivateKey);
|
||||
// List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
|
||||
//
|
||||
// var publicKey = await Storage.getStringList(saveBluePublicKey);
|
||||
// List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
|
||||
//
|
||||
// IoSenderManage.getWifiListCommand(
|
||||
// keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
|
||||
// userID: await Storage.getUid(),
|
||||
// token: getTokenList,
|
||||
// needAuthor: 1,
|
||||
// publicKey: publicKeyDataList,
|
||||
// privateKey: getPrivateKeyList,
|
||||
// );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -71,10 +71,10 @@ class GatewayGetWifiListLogic extends BaseGetXController {
|
||||
// 获取WiFi数据解析
|
||||
Future<void> _replyGetWifiListParameters(Reply reply) async {
|
||||
final int status = reply.data[2];
|
||||
switch(status){
|
||||
switch (status) {
|
||||
case 0x00:
|
||||
//成功
|
||||
// showEasyLoading();
|
||||
//成功
|
||||
// showEasyLoading();
|
||||
dismissEasyLoading();
|
||||
state.sureBtnState.value = 0;
|
||||
|
||||
@ -102,18 +102,19 @@ class GatewayGetWifiListLogic extends BaseGetXController {
|
||||
|
||||
// 获取wifi列表
|
||||
Future<void> senderGetWifiListWifiAction() async {
|
||||
if(state.sureBtnState.value == 1){
|
||||
if (state.sureBtnState.value == 1) {
|
||||
return;
|
||||
}
|
||||
state.sureBtnState.value = 1;
|
||||
|
||||
showEasyLoading();
|
||||
showBlueConnetctToastTimer(action: (){
|
||||
showBlueConnetctToastTimer(action: () {
|
||||
dismissEasyLoading();
|
||||
state.sureBtnState.value = 0;
|
||||
});
|
||||
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async {
|
||||
if (connectionState == BluetoothConnectionState.connected){
|
||||
BlueManage().blueSendData(BlueManage().connectDeviceName,
|
||||
(BluetoothConnectionState connectionState) async {
|
||||
if (connectionState == BluetoothConnectionState.connected) {
|
||||
IoSenderManage.gatewayGetWifiCommand(
|
||||
userID: await Storage.getUid(),
|
||||
);
|
||||
@ -121,7 +122,7 @@ class GatewayGetWifiListLogic extends BaseGetXController {
|
||||
dismissEasyLoading();
|
||||
state.sureBtnState.value = 0;
|
||||
cancelBlueConnetctToastTimer();
|
||||
if(state.ifCurrentScreen.value == true){
|
||||
if (state.ifCurrentScreen.value == true) {
|
||||
showBlueConnetctToast();
|
||||
}
|
||||
}
|
||||
@ -147,5 +148,4 @@ class GatewayGetWifiListLogic extends BaseGetXController {
|
||||
super.onClose();
|
||||
_replySubscription.cancel();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -9,7 +9,7 @@ import 'package:star_lock/tools/baseGetXController.dart';
|
||||
import '../../../../appRouters.dart';
|
||||
import '../../../../app_settings/app_settings.dart';
|
||||
import '../../../../blue/blue_manage.dart';
|
||||
import '../../../../blue/io_protocol/io_gateway_getStatus.dart';
|
||||
import '../../../../blue/io_gateway/io_gateway_getStatus.dart';
|
||||
import '../../../../blue/io_reply.dart';
|
||||
import '../../../../blue/io_tool/io_tool.dart';
|
||||
import '../../../../blue/io_tool/manager_event_bus.dart';
|
||||
@ -72,13 +72,13 @@ class SelectGatewayListLogic extends BaseGetXController {
|
||||
// AppLog.log('软件版本 gatewayVersion:$gatewayVersion gatewayVersionStr:$gatewayVersionStr');
|
||||
|
||||
// wifiMac地址
|
||||
// final List<int> wifiMac = reply.data.sublist(index, index + 20);
|
||||
// final String wifiMacStr = utf8String(wifiMac);
|
||||
// // lockInfo['wifiMac'] = wifiMacStr;
|
||||
// gatewayModel.wifiMac = wifiMacStr;
|
||||
// index = index + 20;
|
||||
// AppLog.log('wifiMac地址 wifiMac:$wifiMac wifiMacStr:$wifiMacStr');
|
||||
gatewayModel.wifiMac = '00:00:00:00:00:00';
|
||||
final List<int> wifiMac = reply.data.sublist(index, index + 20);
|
||||
final String wifiMacStr = utf8String(wifiMac);
|
||||
// lockInfo['wifiMac'] = wifiMacStr;
|
||||
gatewayModel.wifiMac = wifiMacStr;
|
||||
index = index + 20;
|
||||
AppLog.log('wifiMac地址 wifiMac:$wifiMac wifiMacStr:$wifiMacStr');
|
||||
// gatewayModel.wifiMac = '00:00:00:00:00:00';
|
||||
|
||||
Get.toNamed(Routers.gatewayGetWifiListPage, arguments: {
|
||||
'gatewayModel': gatewayModel,
|
||||
|
||||
@ -43,7 +43,7 @@ class StarLockMinePageState extends State<StarLockMinePage> with BaseWidget {
|
||||
topWidget(),
|
||||
bottomListWidget(),
|
||||
SizedBox(
|
||||
height: 60.h,
|
||||
height: 80.h,
|
||||
),
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
@ -169,17 +169,13 @@ class StarLockMinePageState extends State<StarLockMinePage> with BaseWidget {
|
||||
}
|
||||
|
||||
Widget bottomListWidget() {
|
||||
return Expanded(
|
||||
child: ListView(
|
||||
padding: EdgeInsets.only(
|
||||
left: 60.w,
|
||||
top: 50.h,
|
||||
),
|
||||
children: <Widget>[
|
||||
// mineItem('images/mine/icon_mine_main_personInfo.png',
|
||||
// TranslationLoader.lanKeys!.personalInformation!.tr, () {
|
||||
// Navigator.pushNamed(context, Routers.minePersonInfoPage);
|
||||
// }),
|
||||
return Container(
|
||||
padding: EdgeInsets.only(
|
||||
left: 60.w,
|
||||
top: 50.h,
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
mineItem('images/mine/icon_mine_main_addLock.png', '添加设备'.tr, () {
|
||||
Get.back();
|
||||
Get.toNamed(Routers.selectLockTypePage);
|
||||
@ -218,8 +214,8 @@ class StarLockMinePageState extends State<StarLockMinePage> with BaseWidget {
|
||||
Get.back();
|
||||
Get.toNamed(Routers.lockMallPage);
|
||||
}),
|
||||
if (F.isSKY)
|
||||
mineItem('images/mine/icon_mine_main_shoppingcart.png', '客服'.tr,
|
||||
if (F.isSKY && Get.locale!.languageCode == 'zh')
|
||||
mineItem('images/mine/icon_mine_main_supportStaff.png', '客服'.tr,
|
||||
() {
|
||||
Get.back();
|
||||
WechatManageTool.getAppInfo(CustomerTool.openCustomerService);
|
||||
@ -233,39 +229,39 @@ class StarLockMinePageState extends State<StarLockMinePage> with BaseWidget {
|
||||
);
|
||||
}
|
||||
|
||||
Widget keyBottomWidget() {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
SubmitBtn(
|
||||
btnName: '退出'.tr,
|
||||
borderRadius: 20.w,
|
||||
fontSize: 32.sp,
|
||||
margin: EdgeInsets.only(left: 60.w, right: 60.w),
|
||||
padding: EdgeInsets.only(top: 15.w, bottom: 15.w),
|
||||
onClick: () {}),
|
||||
Container(
|
||||
padding: EdgeInsets.only(right: 30.w),
|
||||
// color: Colors.red,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: <Widget>[
|
||||
TextButton(
|
||||
child: Text(
|
||||
'删除账号'.tr,
|
||||
style: TextStyle(
|
||||
color: AppColors.mainColor, fontWeight: FontWeight.w500),
|
||||
),
|
||||
onPressed: () {},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 30.h,
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
// Widget keyBottomWidget() {
|
||||
// return Column(
|
||||
// children: <Widget>[
|
||||
// SubmitBtn(
|
||||
// btnName: '退出'.tr,
|
||||
// borderRadius: 20.w,
|
||||
// fontSize: 32.sp,
|
||||
// margin: EdgeInsets.only(left: 60.w, right: 60.w),
|
||||
// padding: EdgeInsets.only(top: 15.w, bottom: 15.w),
|
||||
// onClick: () {}),
|
||||
// Container(
|
||||
// padding: EdgeInsets.only(right: 30.w),
|
||||
// // color: Colors.red,
|
||||
// child: Row(
|
||||
// mainAxisAlignment: MainAxisAlignment.end,
|
||||
// children: <Widget>[
|
||||
// TextButton(
|
||||
// child: Text(
|
||||
// '删除账号'.tr,
|
||||
// style: TextStyle(
|
||||
// color: AppColors.mainColor, fontWeight: FontWeight.w500),
|
||||
// ),
|
||||
// onPressed: () {},
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// SizedBox(
|
||||
// height: 30.h,
|
||||
// )
|
||||
// ],
|
||||
// );
|
||||
// }
|
||||
|
||||
Widget mineItem(
|
||||
String lockTypeIcon, String lockTypeTitle, Function() action) {
|
||||
|
||||
@ -171,8 +171,9 @@ class MineSetLogic extends BaseGetXController {
|
||||
|
||||
String _getCurrentLanguage() {
|
||||
String? languageCode = StoreService.to.getLanguageCode();
|
||||
// AppLog.log('languageCode: $languageCode');
|
||||
if (languageCode!.isEmpty) {
|
||||
languageCode = Get.deviceLocale!.languageCode;
|
||||
languageCode = Get.locale!.languageCode;
|
||||
}
|
||||
final String currentLanguage = ExtensionLanguageType.fromLocale(appDept
|
||||
.deptSupportedLocales
|
||||
@ -187,6 +188,7 @@ class MineSetLogic extends BaseGetXController {
|
||||
super.onReady();
|
||||
|
||||
state.currentLanguage.value = _getCurrentLanguage();
|
||||
|
||||
_initLoadDataAction();
|
||||
getUserInfoRequest();
|
||||
}
|
||||
|
||||
@ -161,6 +161,7 @@ abstract class Api {
|
||||
final String updateGatewayURL = '/gateway/update'; // 更新网关
|
||||
final String gatewayListByLockURL = '/gateway/listByLock'; // 网关-附近的锁
|
||||
final String getGatewayConfigURL = '/gateway/getGatewayConfig'; // 获取网关配置
|
||||
final String remoteOpenLockURL = '/gateway/unlock'; // 远程开锁
|
||||
|
||||
final String getKeyDetailURL = '/key/get'; //获取单把钥匙详情信息
|
||||
final String lockUserListURL = '/keyUser/listKeyUser'; //锁用户列表
|
||||
|
||||
@ -1732,7 +1732,7 @@ class ApiProvider extends BaseProvider {
|
||||
String networkName,
|
||||
String networkMac,
|
||||
String version,
|
||||
String secretKey,
|
||||
Map gatewayJson,
|
||||
) =>
|
||||
post(
|
||||
addGatewayURL.toUrl,
|
||||
@ -1744,7 +1744,7 @@ class ApiProvider extends BaseProvider {
|
||||
'networkName': networkName,
|
||||
'networkMac': networkMac,
|
||||
'version': version,
|
||||
'secretKey': secretKey,
|
||||
'gatewayJson': gatewayJson,
|
||||
}));
|
||||
|
||||
// 删除网关
|
||||
@ -1757,7 +1757,7 @@ class ApiProvider extends BaseProvider {
|
||||
'gatewayId': gatewayId,
|
||||
}));
|
||||
|
||||
// 删除网关
|
||||
// 网关更新
|
||||
Future<Response> gatewayUpdate(
|
||||
int gatewayId,
|
||||
String gatewayName,
|
||||
@ -1769,6 +1769,16 @@ class ApiProvider extends BaseProvider {
|
||||
'gatewayName': gatewayName,
|
||||
}));
|
||||
|
||||
// 远程开锁
|
||||
Future<Response> remoteOpenLock(
|
||||
String lockId,
|
||||
) =>
|
||||
post(
|
||||
remoteOpenLockURL.toUrl,
|
||||
jsonEncode({
|
||||
'lockId': lockId,
|
||||
}));
|
||||
|
||||
// 转移网关确认
|
||||
Future<Response> transferGatewayConfirmInfoData(
|
||||
String receiverUsername, String type, String countryCode) =>
|
||||
|
||||
@ -1917,10 +1917,17 @@ class ApiRepository {
|
||||
required String networkName,
|
||||
required String networkMac,
|
||||
required String version,
|
||||
required String secretKey,
|
||||
required Map gatewayJson,
|
||||
}) async {
|
||||
final res = await apiProvider.addGatewayNetwork(gatewayName, gatewayMac,
|
||||
serialNumber, gatewayType, networkName, networkMac, version, secretKey);
|
||||
final res = await apiProvider.addGatewayNetwork(
|
||||
gatewayName,
|
||||
gatewayMac,
|
||||
serialNumber,
|
||||
gatewayType,
|
||||
networkName,
|
||||
networkMac,
|
||||
version,
|
||||
gatewayJson);
|
||||
return LoginEntity.fromJson(res.body);
|
||||
}
|
||||
|
||||
@ -1932,7 +1939,7 @@ class ApiRepository {
|
||||
return LoginEntity.fromJson(res.body);
|
||||
}
|
||||
|
||||
// 网关
|
||||
// 网关更新
|
||||
Future<LoginEntity> gatewayUpdate({
|
||||
required int gatewayId,
|
||||
required String gatewayName,
|
||||
@ -1958,6 +1965,12 @@ class ApiRepository {
|
||||
return GatewayConnectionLockListEntity.fromJson(res.body);
|
||||
}
|
||||
|
||||
// 远程开锁
|
||||
Future<LoginEntity> remoteOpenLock({required String lockId}) async {
|
||||
final res = await apiProvider.remoteOpenLock(lockId);
|
||||
return LoginEntity.fromJson(res.body);
|
||||
}
|
||||
|
||||
// 转移智能锁
|
||||
Future<RecipientInformationEntity> transferGatewayInfoData(
|
||||
{required String receiverUsername,
|
||||
|
||||
@ -3,6 +3,7 @@ import 'dart:convert';
|
||||
import 'dart:ui';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:get/get_connect/http/src/request/request.dart';
|
||||
import 'package:star_lock/app_settings/app_settings.dart';
|
||||
import 'package:star_lock/login/login/entity/LoginData.dart';
|
||||
|
||||
import '../tools/platform_info_services.dart';
|
||||
@ -20,7 +21,8 @@ String getUserAgent() {
|
||||
|
||||
FutureOr<Request> requestInterceptor(Request request) async {
|
||||
request.headers['User-Agent'] = getUserAgent();
|
||||
request.headers['Accept-Language'] = getLanguageCode(); // StoreService.to.getLanguageCode()
|
||||
request.headers['Accept-Language'] =
|
||||
getLanguageCode(); // StoreService.to.getLanguageCode()
|
||||
// request.headers['Content-Type'] = 'application/json';
|
||||
// request.headers['token'] = StoreService.to.userToken!;
|
||||
String? xToken = '';
|
||||
@ -32,13 +34,13 @@ FutureOr<Request> requestInterceptor(Request request) async {
|
||||
return request;
|
||||
}
|
||||
|
||||
|
||||
String getLanguageCode() {
|
||||
final Locale locale = StoreService.to.getLanguageCode()!.isNotEmpty
|
||||
? appDept.deptSupportedLocales
|
||||
.where((Locale element) =>
|
||||
element.languageCode == StoreService.to.getLanguageCode())
|
||||
.first
|
||||
: Get.locale!;// Get.deviceLocale;
|
||||
.where((Locale element) =>
|
||||
element.languageCode == StoreService.to.getLanguageCode())
|
||||
.first
|
||||
: Get.locale!; // Get.deviceLocale;
|
||||
AppLog.log('languageCode: ${locale.toLanguageTag()} locale: $locale');
|
||||
return locale.toLanguageTag();
|
||||
}
|
||||
}
|
||||
|
||||
@ -52,7 +52,7 @@ class UdpHelp {
|
||||
ipList: serversList,
|
||||
tokenStr: 'b989fa15f75c2ac02718b7c9bb64f80e',
|
||||
);
|
||||
AppLog.log('发送心跳了');
|
||||
// AppLog.log('发送心跳了');
|
||||
} else {
|
||||
timer.cancel();
|
||||
}
|
||||
|
||||
@ -20,7 +20,7 @@ class CommandUDPReciverManager {
|
||||
if (dataSize < 4) {
|
||||
return;
|
||||
}
|
||||
AppLog.log('appReceiveUDPData:$data');
|
||||
// AppLog.log('appReceiveUDPData:$data');
|
||||
|
||||
final Uint8List data1 = Uint8List.fromList(data);
|
||||
if (data1.length == 1) {
|
||||
@ -95,7 +95,7 @@ class CommandUDPReciverManager {
|
||||
case 10:
|
||||
{
|
||||
//开门反馈
|
||||
AppLog.log('appReceiveUDPData:$data');
|
||||
// AppLog.log('appReceiveUDPData:$data');
|
||||
if ((data[7] & 0x3) == 2) {
|
||||
AppLog.log('开门成功');
|
||||
EasyLoading.showToast('开门成功'.tr, duration: 2000.milliseconds);
|
||||
|
||||
81
lib/tools/key_name_item.dart
Normal file
81
lib/tools/key_name_item.dart
Normal file
@ -0,0 +1,81 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
|
||||
import '../app_settings/app_colors.dart';
|
||||
|
||||
class KeyNameItem extends StatelessWidget {
|
||||
KeyNameItem(
|
||||
{required this.leftTitel, Key? key, this.rightTitle, this.controller})
|
||||
: super(key: key);
|
||||
String? leftTitel;
|
||||
String? rightTitle;
|
||||
TextEditingController? controller;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
height: 65.h,
|
||||
padding: EdgeInsets.only(left: 20.w, right: 20.w),
|
||||
// color: Colors.white,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
border: Border(
|
||||
bottom: BorderSide(
|
||||
color: AppColors.greyLineColor, // 设置边框颜色
|
||||
width: 2.0.h, // 设置边框宽度
|
||||
),
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
Text(leftTitel ?? '', style: TextStyle(fontSize: 22.sp)),
|
||||
SizedBox(width: 6.w),
|
||||
Expanded(
|
||||
child: TextField(
|
||||
//输入框一行
|
||||
maxLines: 1,
|
||||
inputFormatters: <TextInputFormatter>[
|
||||
FilteringTextInputFormatter.deny('\n'),
|
||||
LengthLimitingTextInputFormatter(50),
|
||||
],
|
||||
keyboardType: TextInputType.text,
|
||||
style: TextStyle(
|
||||
fontSize: 22.sp, color: AppColors.darkGrayTextColor),
|
||||
controller: controller,
|
||||
autofocus: false,
|
||||
textAlign: TextAlign.end,
|
||||
// decoration: InputDecoration(
|
||||
// //输入里面输入文字内边距设置
|
||||
// contentPadding: EdgeInsets.only(top: 24.h, bottom: 16.h),
|
||||
// hintText: tfStr,
|
||||
// hintStyle: TextStyle(fontSize: 22.sp),
|
||||
// //不需要输入框下划线
|
||||
// border: InputBorder.none,
|
||||
// ),
|
||||
decoration: InputDecoration(
|
||||
//输入里面输入文字内边距设置
|
||||
// contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
|
||||
hintText: rightTitle,
|
||||
hintStyle: TextStyle(fontSize: 22.sp),
|
||||
focusedBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
disabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
enabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
border: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 0),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -100,8 +100,10 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||
# 1.0.79+2024083001:测试所有国家国际化功能
|
||||
# 1.0.79+2024083001:测试开完锁数据上传功能
|
||||
# 1.0.81+2024092901:添加开锁数据收集功能
|
||||
# 1.0.85+2024120301:完善网关功能
|
||||
# 1.0.85+2024120401:修复网关问题,打包给谢敬调试
|
||||
|
||||
version: 1.0.84+2024111201
|
||||
version: 1.0.85+2024120402
|
||||
|
||||
environment:
|
||||
sdk: '>=2.12.0 <3.0.0'
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user