Merge branch 'release' of gitee.com:starlock-cn/app-starlock into release

This commit is contained in:
“DaisyWu” 2024-07-17 17:29:40 +08:00
commit f86c35a5ee
22 changed files with 494 additions and 209 deletions

View File

@ -656,6 +656,7 @@
"刷新": "Refresh", "刷新": "Refresh",
"手动配网": "Manual distribution network", "手动配网": "Manual distribution network",
"远距离": "Long distance", "远距离": "Long distance",
"中距离": "Medium distance",
"近距离": "Short distance", "近距离": "Short distance",
"锁时间更新成功": "Lock time update success", "锁时间更新成功": "Lock time update success",
"锁用户": "Lock user", "锁用户": "Lock user",
@ -925,5 +926,10 @@
"发送钥匙": "Send key", "发送钥匙": "Send key",
"进度": "Progress", "进度": "Progress",
"失败": "Failure", "失败": "Failure",
"人脸详情": "Face details" "人脸详情": "Face details",
"感应到门前约1.5米有人时,将自动启动面部识别开锁。": "When someone is sensed about 1.5 meters in front of the door, the face recognition unlocking will be automatically started.",
"感应到门前约0.8米有人时,将自动启动面部识别开锁。": "When someone is sensed about 0.8 meters in front of the door, the face recognition unlocking will be automatically started.",
"感应到门前约0.5米有人时,将自动启动面部识别开锁。": "When someone is sensed about 0.5 meters in front of the door, the face recognition unlocking will be automatically started.",
"感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "The sensing distance has been turned off, you need to manually touch any key on the keyboard to perform face recognition unlocking.",
"防误开已打开,时间是": "The anti-mistake opening has been turned on, and the time is"
} }

View File

@ -682,6 +682,7 @@
"刷新": "刷新", "刷新": "刷新",
"手动配网": "手动配网", "手动配网": "手动配网",
"远距离": "远距离", "远距离": "远距离",
"中距离": "中距离",
"近距离": "近距离", "近距离": "近距离",
"锁时间更新成功": "锁时间更新成功", "锁时间更新成功": "锁时间更新成功",
"锁用户": "锁用户", "锁用户": "锁用户",
@ -957,5 +958,11 @@
"发送钥匙": "发送钥匙", "发送钥匙": "发送钥匙",
"进度": "进度", "进度": "进度",
"失败": "失败", "失败": "失败",
"人脸详情": "人脸详情" "人脸详情": "人脸详情",
"感应到门前约1.5米有人时,将自动启动面部识别开锁。": "感应到门前约1.5米有人时,将自动启动面部识别开锁。",
"感应到门前约0.8米有人时,将自动启动面部识别开锁。": "感应到门前约0.8米有人时,将自动启动面部识别开锁。",
"感应到门前约0.5米有人时,将自动启动面部识别开锁。": "感应到门前约0.5米有人时,将自动启动面部识别开锁。",
"感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。",
"防误开已打开,时间是": "防误开已打开,时间是"
} }

View File

@ -655,6 +655,7 @@
"刷新": "刷新", "刷新": "刷新",
"手动配网": "手动配网", "手动配网": "手动配网",
"远距离": "远距离", "远距离": "远距离",
"中距离": "中距离",
"近距离": "近距离", "近距离": "近距离",
"锁时间更新成功": "锁时间更新成功", "锁时间更新成功": "锁时间更新成功",
"锁用户": "锁用户", "锁用户": "锁用户",
@ -922,6 +923,11 @@
"发送钥匙": "发送钥匙", "发送钥匙": "发送钥匙",
"进度": "进度", "进度": "进度",
"失败": "失败", "失败": "失败",
"人脸详情": "人脸详情" "人脸详情": "人脸详情",
"感应到门前约1.5米有人时,将自动启动面部识别开锁。": "感应到门前约1.5米有人时,将自动启动面部识别开锁。",
"感应到门前约0.8米有人时,将自动启动面部识别开锁。": "感应到门前约0.8米有人时,将自动启动面部识别开锁。",
"感应到门前约0.5米有人时,将自动启动面部识别开锁。": "感应到门前约0.5米有人时,将自动启动面部识别开锁。",
"感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。",
"防误开已打开,时间是": "防误开已打开,时间是"
} }

View File

@ -84,6 +84,7 @@ import 'main/lockDetail/checkingIn/checkingInSetWorkdaySet/checkingInSetWorkdayS
import 'main/lockDetail/checkingIn/checkingInStaff/checkingInSetAddStaff/checkingInAddStaff_page.dart'; import 'main/lockDetail/checkingIn/checkingInStaff/checkingInSetAddStaff/checkingInAddStaff_page.dart';
import 'main/lockDetail/checkingIn/checkingInStaff/checkingInSetStaffList/checkingInStaffList_page.dart'; import 'main/lockDetail/checkingIn/checkingInStaff/checkingInSetStaffList/checkingInStaffList_page.dart';
import 'main/lockDetail/checkingIn/checkingInStaff/checkingInStaffDetail/checkingInStaffDetail_page.dart'; import 'main/lockDetail/checkingIn/checkingInStaff/checkingInStaffDetail/checkingInStaffDetail_page.dart';
import 'main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_page.dart';
import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_page.dart'; import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_page.dart';
import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart'; import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart';
import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_page.dart'; import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_page.dart';
@ -488,6 +489,7 @@ abstract class Routers {
static const String batchExportLogPage = '/batchExportLogPage'; // static const String batchExportLogPage = '/batchExportLogPage'; //
static const String exportSuccessPage = '/exportSuccessPage'; // static const String exportSuccessPage = '/exportSuccessPage'; //
static const String viewExportRecordPage = '/viewExportRecordPage'; // static const String viewExportRecordPage = '/viewExportRecordPage'; //
static const String doorLockLogDetailPage = '/doorLockLogDetailPage'; //
static const String login = '/login'; // static const String login = '/login'; //
} }
@ -1146,5 +1148,7 @@ abstract class AppRouters {
page: () => const ViewExportRecordPage()), page: () => const ViewExportRecordPage()),
GetPage<dynamic>( GetPage<dynamic>(
name: Routers.expireKeyChangeValidityDatePage, page: () => const ExpireKeyChangeValidityDatePage()), name: Routers.expireKeyChangeValidityDatePage, page: () => const ExpireKeyChangeValidityDatePage()),
GetPage<dynamic>(
name: Routers.doorLockLogDetailPage, page: () => const DoorLockLogDetailPage()),
]; ];
} }

View File

@ -0,0 +1,9 @@
import 'package:star_lock/tools/baseGetXController.dart';
import 'doorLockLogDetail_state.dart';
class DoorLockLogDetailLogic extends BaseGetXController {
final DoorLockLogDetailState state = DoorLockLogDetailState();
}

View File

@ -0,0 +1,57 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/tools/dateTool.dart';
import '../../../../app_settings/app_colors.dart';
import '../../../../tools/titleAppBar.dart';
import 'doorLockLogDetail_logic.dart';
import 'doorLockLogDetail_state.dart';
class DoorLockLogDetailPage extends StatefulWidget {
const DoorLockLogDetailPage({Key? key}) : super(key: key);
@override
State<DoorLockLogDetailPage> createState() => _DoorLockLogDetailPageState();
}
class _DoorLockLogDetailPageState extends State<DoorLockLogDetailPage> {
final DoorLockLogDetailLogic logic = Get.put(DoorLockLogDetailLogic());
final DoorLockLogDetailState state = Get.find<DoorLockLogDetailLogic>().state;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.mainBackgroundColor,
appBar: TitleAppBar(
barTitle: '操作记录详情',
haveBack: true,
backgroundColor: AppColors.mainColor,
),
body: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: EdgeInsets.all(20.w),
child: Text('操作时间:${DateTool().dateIntToYMDHNString(state.timelineDataItem.value.operateDate)}', style: TextStyle(fontSize: 23.sp)),
),
Container(
width: 1.sw,
padding: EdgeInsets.all(15.w),
margin: EdgeInsets.only(left:20.w, right: 20.w, bottom: 20.w),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10.w),
),
child: Text(state.timelineDataItem.value.recordDetailStr ?? '', style: TextStyle(fontSize: 25.sp)),
),
],
),
),
);
}
}

View File

@ -0,0 +1,15 @@
import 'package:get/get.dart';
import '../doorLockLog_entity.dart';
class DoorLockLogDetailState {
DoorLockLogDetailState() {
final Map map = Get.arguments;
if(map['doorLockLogDataItem'] != null){
timelineDataItem.value = map['doorLockLogDataItem'];
}
}
Rx<DoorLockLogDataItem> timelineDataItem = DoorLockLogDataItem().obs;
}

View File

@ -73,7 +73,8 @@ class DoorLockLogDataItem {
this.headUrl, this.headUrl,
this.userid, this.userid,
this.keyboardPwd, this.keyboardPwd,
this.recordStr}); this.recordStr,
this.recordDetailStr});
DoorLockLogDataItem.fromJson(Map<String, dynamic> json) { DoorLockLogDataItem.fromJson(Map<String, dynamic> json) {
recordId = json['recordId']; recordId = json['recordId'];
@ -89,6 +90,7 @@ class DoorLockLogDataItem {
userid = json['userid']; userid = json['userid'];
keyboardPwd = json['keyboardPwd']; keyboardPwd = json['keyboardPwd'];
recordStr = json['recordStr']; recordStr = json['recordStr'];
recordDetailStr = json['recordDetailStr'];
} }
int? recordId; int? recordId;
int? lockId; int? lockId;
@ -103,6 +105,7 @@ class DoorLockLogDataItem {
String? userid; String? userid;
String? keyboardPwd; String? keyboardPwd;
String? recordStr; String? recordStr;
String? recordDetailStr;
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
@ -119,6 +122,7 @@ class DoorLockLogDataItem {
data['userid'] = userid; data['userid'] = userid;
data['keyboardPwd'] = keyboardPwd; data['keyboardPwd'] = keyboardPwd;
data['recordStr'] = recordStr; data['recordStr'] = recordStr;
data['recordDetailStr'] = recordDetailStr;
return data; return data;
} }
} }

View File

@ -26,7 +26,7 @@ class DoorLockLogLogic extends BaseGetXController {
late StreamSubscription<Reply> _replySubscription; late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() { void _initReplySubscription() {
_replySubscription = _replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((reply) { EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
if (reply is SenderReferEventRecordTimeReply && if (reply is SenderReferEventRecordTimeReply &&
state.ifCurrentScreen.value == true) { state.ifCurrentScreen.value == true) {
_replyReferEventRecordTime(reply); _replyReferEventRecordTime(reply);
@ -50,19 +50,22 @@ class DoorLockLogLogic extends BaseGetXController {
if (reply.data.length < 17) { if (reply.data.length < 17) {
return; return;
} }
final getList = splitList(reply.data, 17); final List<List<int>> getList = splitList(reply.data, 17);
// AppLog.log("getList:$getList"); // AppLog.log("getList:$getList");
final uploadList = []; final List uploadList = [];
for (int i = 0; i < getList.length; i++) { for (int i = 0; i < getList.length; i++) {
final indexList = getList[i]; final List<int> indexList = getList[i];
// AppLog.log("indexList:$indexList"); // AppLog.log("indexList:$indexList");
final indexMap = {}; final Map indexMap = {};
indexMap['type'] = indexList[0].toString(); indexMap['type'] = indexList[0].toString();
final int operateDate = 0; const int operateDate = 0;
if (indexList[0] == 2) { if (indexList[0] == 2) {
final passwordData = indexList.sublist(7, 17); final int userNo = (indexList[1] * 256) + indexList[2];
final password = utf8String(passwordData); indexMap['user'] = userNo.toString();
indexMap['user'] = password.toString();
final List<int> passwordData = indexList.sublist(7, 17);
final String password = utf8String(passwordData);
indexMap['password'] = password.toString();
} else { } else {
final int userNo = (indexList[1] * 256) + indexList[2]; final int userNo = (indexList[1] * 256) + indexList[2];
indexMap['user'] = userNo.toString(); indexMap['user'] = userNo.toString();
@ -70,10 +73,10 @@ class DoorLockLogLogic extends BaseGetXController {
indexMap['success'] = '1'; indexMap['success'] = '1';
final int time = ((0xff & indexList[(3)]) << 24 | final int time = (0xff & indexList[3]) << 24 |
(0xff & indexList[4]) << 16 | (0xff & indexList[4]) << 16 |
(0xff & indexList[5]) << 8 | (0xff & indexList[5]) << 8 |
(0xFF & indexList[6])); (0xFF & indexList[6]);
indexMap['date'] = '${time * 1000}'; indexMap['date'] = '${time * 1000}';
uploadList.add(indexMap); uploadList.add(indexMap);
@ -108,14 +111,14 @@ class DoorLockLogLogic extends BaseGetXController {
BlueManage().blueSendData(BlueManage().connectDeviceName, BlueManage().blueSendData(BlueManage().connectDeviceName,
(BluetoothConnectionState connectionStateState) async { (BluetoothConnectionState connectionStateState) async {
if (connectionStateState == BluetoothConnectionState.connected) { if (connectionStateState == BluetoothConnectionState.connected) {
final privateKey = await Storage.getStringList(saveBluePrivateKey); final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!); changeStringListToIntList(privateKey!);
final token = await Storage.getStringList(saveBlueToken); final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!); final List<int> getTokenList = changeStringListToIntList(token!);
final publicKey = await Storage.getStringList(saveBluePublicKey); final List<String>? publicKey = await Storage.getStringList(saveBluePublicKey);
final List<int> getPublicKeyList = final List<int> getPublicKeyList =
changeStringListToIntList(publicKey!); changeStringListToIntList(publicKey!);
@ -230,11 +233,10 @@ class DoorLockLogLogic extends BaseGetXController {
@override @override
Future<void> onReady() async { Future<void> onReady() async {
// TODO: implement onReady
super.onReady(); super.onReady();
// //
final isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) { if (isDemoMode == false) {
// _initReplySubscription(); // _initReplySubscription();

View File

@ -274,56 +274,63 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
final String formattedTime = final String formattedTime =
'${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')}'; '${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')}';
return Padding( return GestureDetector(
padding: EdgeInsets.only(left: 20.w, top: 20.h), onTap: () {
child: Column( Get.toNamed(Routers.doorLockLogDetailPage, arguments: {
mainAxisAlignment: MainAxisAlignment.start, 'doorLockLogDataItem': timelineData
crossAxisAlignment: CrossAxisAlignment.start, });
children: <Widget>[ },
Text( child: Padding(
// '$formattedTime ${timelineData.username!.isNotEmpty ? "${timelineData.username}操作" : ""}${timelineData.recordTypeName}', padding: EdgeInsets.only(left: 20.w, top: 20.h),
timelineData.recordStr ?? '', child: Column(
textAlign: TextAlign.left, mainAxisAlignment: MainAxisAlignment.start,
style: TextStyle( crossAxisAlignment: CrossAxisAlignment.start,
color: Colors.black, children: <Widget>[
fontSize: 24.sp, Text(
fontWeight: FontWeight.w600, // '$formattedTime ${timelineData.username!.isNotEmpty ? "${timelineData.username}操作" : ""}${timelineData.recordTypeName}',
timelineData.recordStr ?? '',
textAlign: TextAlign.left,
style: TextStyle(
color: Colors.black,
fontSize: 24.sp,
fontWeight: FontWeight.w600,
),
), ),
), SizedBox(
SizedBox( height: 10.h,
height: 10.h, ),
), GestureDetector(
GestureDetector( onTap: () {
onTap: () { Get.toNamed(Routers.videoLogDetailPage);
Get.toNamed(Routers.videoLogDetailPage); },
}, child: Stack(
child: Stack( children: <Widget>[
children: <Widget>[ if (timelineData.imagesUrl!.isNotEmpty)
if (timelineData.imagesUrl!.isNotEmpty) Image.network(
Image.network( timelineData.imagesUrl!,
timelineData.imagesUrl!, width: 260.w,
width: 260.w, height: 260.h,
height: 260.h, )
) else
else Container(),
Container(), Positioned(
Positioned( top: 150.h,
top: 150.h, left: 10.w,
left: 10.w, child: Image(
child: Image( image: const AssetImage(
image: const AssetImage( 'images/main/icon_lockLog_play.png'),
'images/main/icon_lockLog_play.png'), width: 24.w,
width: 24.w, height: 20.w,
height: 20.w, ),
), ),
), ],
], ),
), ),
), SizedBox(
SizedBox( height: 20.h,
height: 20.h, ),
), ],
], ),
), ),
); );
}, },

View File

@ -172,7 +172,7 @@ class FingerprintDetailLogic extends BaseGetXController{
changeType: '1', changeType: '1',
startTime: int.parse(state.startDate.value), startTime: int.parse(state.startDate.value),
endTime: int.parse(state.endTime.value), endTime: int.parse(state.endTime.value),
fingerprintType: state.fingerprintItemData.value.fingerprintType!, fingerprintType: state.keyType.value,
fingerRight: state.isAdministrator.value ? 1 : 0, fingerRight: state.isAdministrator.value ? 1 : 0,
); );
if(entity.errorCode!.codeIsSuccessful){ if(entity.errorCode!.codeIsSuccessful){

View File

@ -110,6 +110,12 @@ class AutomaticBlockingLogic extends BaseGetXController {
// () // ()
Future<void> sendAutoLock() async { Future<void> sendAutoLock() async {
final String autoTime = state.timeController.text;
if (int.parse(autoTime) > 60) {
showToast('请输入小于或等于60的数字'.tr);
return;
}
if (state.sureBtnState.value == 1) { if (state.sureBtnState.value == 1) {
return; return;
} }

View File

@ -1,74 +1,215 @@
import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart'; import 'package:star_lock/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart';
import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/versionUndate/versionUndate_entity.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_protocol/io_setSupportFunctionsWithParameters.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 '../../../../tools/eventBusEventManage.dart';
import '../../../../tools/storage.dart';
class FaceUnlockLogic extends BaseGetXController { class FaceUnlockLogic extends BaseGetXController {
final FaceUnlockState state = FaceUnlockState(); final FaceUnlockState state = FaceUnlockState();
//
Future<LockSetInfoEntity> getLockSettingInfoData() async {
LockSetInfoEntity entity = await ApiRepository.to.getLockSettingInfoData(
lockId: state.lockSetInfoData.value.lockId.toString(),
);
if (entity.errorCode!.codeIsSuccessful) {
state.lockSetInfoData.value = entity.data!;
state.faceOn.value =
entity.data!.lockSettingInfo!.faceSwitch == 0 ? false : true;
state.autoBright.value =
entity.data!.lockSettingInfo!.faceAutoLightScreen == 0 ? false : true;
state.senseDistance.value =
entity.data!.lockSettingInfo!.faceInductionDistance! == 0
? '远距离'.tr
: '近距离'.tr;
state.antiMisoperation.value =
entity.data!.lockSettingInfo!.faceAntiMistakeOpen!;
}
return entity;
}
// //
void updateFaceSwitch() async { Future<void> updateFaceSwitch() async {
var entity = await ApiRepository.to.updateFaceSwitch( final VersionUndateEntity entity = await ApiRepository.to.updateFaceSwitch(
lockId: state.lockSetInfoData.value.lockId ?? 0, lockId: state.lockSetInfoData.value.lockId ?? 0,
faceSwitch: state.faceOn.value == false ? 0 : 1, faceSwitch: state.faceOn.value == false ? 0 : 1,
); );
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
showToast('设置成功'.tr); showToast('设置成功'.tr, something: (){
} eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
} Get.back();
});
//
void updateFaceConfig() async {
var entity = await ApiRepository.to.updateFaceAutoLightScreen(
lockId: state.lockSetInfoData.value.lockId ?? 0,
faceAutoLightScreen: state.autoBright.value == false ? 0 : 1,
);
if (entity.errorCode!.codeIsSuccessful) {
showToast('设置成功'.tr);
} }
} }
// //
void updateFaceSenseDistance() async { Future<void> updateFaceSenseDistance() async {
var entity = await ApiRepository.to.updateFaceSenseDistance( int faceInductionDistance = 0;
if(state.senseDistance.value == '远距离'.tr){
faceInductionDistance = 1;
}
if(state.senseDistance.value == '中距离'.tr){
faceInductionDistance = 2;
}
if(state.senseDistance.value == '近距离'.tr){
faceInductionDistance = 3;
}
if(state.senseDistance.value == '关闭'.tr){
faceInductionDistance = 0;
}
final VersionUndateEntity entity = await ApiRepository.to.updateFaceSenseDistance(
lockId: state.lockSetInfoData.value.lockId ?? 0, lockId: state.lockSetInfoData.value.lockId ?? 0,
faceInductionDistance: state.senseDistance.value == '远距离'.tr ? 0 : 1, faceInductionDistance: faceInductionDistance,
); );
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
showToast('设置成功'.tr); showToast('设置成功'.tr, something: (){
eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
Get.back();
});
} }
} }
// //
void updateFacePreventMisrun() async { Future<void> updateFacePreventMisrun() async {
var entity = await ApiRepository.to.updateFacePreventMisrun( final VersionUndateEntity entity = await ApiRepository.to.updateFacePreventMisrun(
lockId: state.lockSetInfoData.value.lockId ?? 0, lockId: state.lockSetInfoData.value.lockId ?? 0,
faceAntiMistakeOpen: state.antiMisoperation.value, faceEnErrUnlock: state.antiMisoperation.value,
); );
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
showToast('设置成功'); showToast('设置成功'.tr, something: (){
eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
Get.back();
});
} }
} }
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
if(reply is SetSupportFunctionsWithParametersReply && (state.ifCurrentScreen.value == true)) {
_replySetSupportFunctionsWithParameters(reply);
}
});
}
//
Future<void> _replySetSupportFunctionsWithParameters(Reply reply) async {
final int status = reply.data[2];
switch(status){
case 0x00:
//
state.sureBtnState.value = 0;
cancelBlueConnetctToastTimer();
dismissEasyLoading();
switch(state.setType.value){
case 0:
updateFaceSwitch();
break;
case 1:
updateFaceSenseDistance();
break;
case 2:
updateFacePreventMisrun();
break;
}
break;
case 0x06:
//
break;
default:
break;
}
}
// ()
Future<void> sendFaceUnlock() async {
if(state.sureBtnState.value == 1){
return;
}
state.sureBtnState.value = 1;
showEasyLoading();
showBlueConnetctToastTimer(action: (){
dismissEasyLoading();
state.sureBtnState.value = 0;
});
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async {
if (connectionState == BluetoothConnectionState.connected) {
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!);
final List<String>? publicKey = await Storage.getStringList(saveBluePublicKey);
final List<int> getPublicKeyList = changeStringListToIntList(publicKey!);
final List<int> list = <int>[];
//
list.add(state.faceOn.value ? 1 : 0);
//
int faceInductionDistance = 0;
if(state.senseDistance.value == '远距离'.tr){
faceInductionDistance = 3;
}else if(state.senseDistance.value == '中距离'.tr){
faceInductionDistance = 2;
}else if(state.senseDistance.value == '近距离'.tr){
faceInductionDistance = 1;
}else if(state.senseDistance.value == '关闭'.tr){
faceInductionDistance = 0;
}
list.add(faceInductionDistance);
//
list.add(state.antiMisoperation.value);
IoSenderManage.setSupportFunctionsWithParametersCommand(
keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
userID: await Storage.getUid(),
featureBit: 5,
featureParaLength: 3,
featureData: list,
token: getTokenList,
needAuthor: 1,
publicKey: getPublicKeyList,
privateKey: getPrivateKeyList);
} else if (connectionState == BluetoothConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
state.sureBtnState.value = 0;
if(state.ifCurrentScreen.value == true){
showBlueConnetctToast();
}
}
});
}
String getSensingDistanceString(){
if(state.senseDistance.value == '远距离'.tr){
return '感应到门前约1.5米有人时,将自动启动面部识别开锁。'.tr;
}else if(state.senseDistance.value == '中距离'.tr){
return '感应到门前约0.8米有人时,将自动启动面部识别开锁。'.tr;
}else if(state.senseDistance.value == '近距离'.tr){
return '感应到门前约0.5米有人时,将自动启动面部识别开锁。'.tr;
}else{
return '感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。'.tr;
}
}
@override
void onReady() {
super.onReady();
_initReplySubscription();
}
@override
void onInit() {
super.onInit();
// _readSupportFunctionsWithParameters();
}
@override
void onClose() {
super.onClose();
_replySubscription.cancel();
}
} }

View File

@ -1,12 +1,16 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/main/lockDetail/lockSet/faceUnlock/faceUnlock_logic.dart'; import 'package:star_lock/main/lockDetail/lockSet/faceUnlock/faceUnlock_logic.dart';
import 'package:star_lock/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart';
import 'package:star_lock/tools/custom_bottom_sheet.dart'; import 'package:star_lock/tools/custom_bottom_sheet.dart';
import '../../../../app_settings/app_colors.dart'; import '../../../../app_settings/app_colors.dart';
import '../../../../tools/commonItem.dart'; import '../../../../tools/commonItem.dart';
import '../../../../tools/pickers/pickers.dart';
import '../../../../tools/titleAppBar.dart'; import '../../../../tools/titleAppBar.dart';
import '../../../../translations/trans_lib.dart'; import '../../../../translations/trans_lib.dart';
@ -18,14 +22,8 @@ class FaceUnlockPage extends StatefulWidget {
} }
class _FaceUnlockPageState extends State<FaceUnlockPage> { class _FaceUnlockPageState extends State<FaceUnlockPage> {
final logic = Get.put(FaceUnlockLogic()); final FaceUnlockLogic logic = Get.put(FaceUnlockLogic());
final state = Get.find<FaceUnlockLogic>().state; final FaceUnlockState state = Get.find<FaceUnlockLogic>().state;
@override
void initState() {
super.initState();
logic.getLockSettingInfoData();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -36,45 +34,42 @@ class _FaceUnlockPageState extends State<FaceUnlockPage> {
haveBack: true, haveBack: true,
backgroundColor: AppColors.mainColor), backgroundColor: AppColors.mainColor),
body: Obx(() => Column( body: Obx(() => Column(
children: [ children: <Widget>[
Container( Container(
margin: EdgeInsets.only(left: 20.w), margin: EdgeInsets.only(left: 20.w),
child: CommonItem( child: CommonItem(
leftTitel: TranslationLoader.lanKeys!.faceUnlocks!.tr, leftTitel: TranslationLoader.lanKeys!.faceUnlocks!.tr,
rightTitle: "", rightTitle: '',
allHeight: 70.h, allHeight: 70.h,
isHaveLine: true, isHaveLine: true,
isHaveRightWidget: true, isHaveRightWidget: true,
rightWidget: SizedBox( rightWidget: SizedBox(
width: 60.w, height: 50.h, child: _switch(1))), width: 60.w, height: 50.h, child: _switch(1))),
), ),
Container(
margin: EdgeInsets.only(left: 20.w),
child: CommonItem(
leftTitel: TranslationLoader
.lanKeys!.automaticBrighteningScreen!.tr,
rightTitle: "",
isHaveLine: true,
isHaveRightWidget: true,
rightWidget: SizedBox(
width: 60.w, height: 50.h, child: _switch(2))),
),
_buildSubTitleItem( _buildSubTitleItem(
TranslationLoader.lanKeys!.sensingDistance!.tr, TranslationLoader.lanKeys!.sensingDistance!.tr,
TranslationLoader.lanKeys!.sensingDistanceTip!.tr, // TranslationLoader.lanKeys!.sensingDistanceTip!.tr,
state.senseDistance.value, () { logic.getSensingDistanceString(),
state.senseDistance.value,
state.faceOn.value, () {
_openBottomItemSheet(state.senseDistanceList.value, 0); _openBottomItemSheet(state.senseDistanceList.value, 0);
}), }),
SizedBox( SizedBox(height: 30.h),
height: 30.h,
),
_buildSubTitleItem( _buildSubTitleItem(
TranslationLoader.lanKeys!.preventWrongOpening!.tr, TranslationLoader.lanKeys!.preventWrongOpening!.tr,
TranslationLoader.lanKeys!.preventWrongOpeningTip!.tr,
state.antiMisoperation.value == 0 state.antiMisoperation.value == 0
? '关闭' ? TranslationLoader.lanKeys!.preventWrongOpeningTip!.tr
: '${state.antiMisoperation.value}', () { :'防误开已打开,时间是'.tr + state.antiMisoperation.value.toString() + ''.tr,
_openBottomItemSheet(state.antiMisoperationStrList.value, 1); // state.antiMisoperation.value == 0 ? '关闭' :
'${state.antiMisoperation.value}' + ''.tr,
state.faceOn.value, () {
Pickers.showSinglePicker(Get.context!, data: state.antiMisoperationStrList.value, onConfirm: (var data, int position) {
AppLog.log('data = $data, position = $position');
state.antiMisoperation.value = position;
state.setType.value = 2;
logic.sendFaceUnlock();
});
// _openBottomItemSheet(state.antiMisoperationStrList.value, 1);
}), }),
Expanded( Expanded(
child: SizedBox( child: SizedBox(
@ -88,28 +83,27 @@ class _FaceUnlockPageState extends State<FaceUnlockPage> {
))); )));
} }
Widget _buildSubTitleItem( Widget _buildSubTitleItem(String leftStr, String subTitle, String rightStr, bool isAble, Function()? action) {
String leftStr, String subTitle, String rightStr, Function()? action) {
return GestureDetector( return GestureDetector(
onTap: action, onTap: isAble ? action : null,
child: Container( child: Container(
margin: EdgeInsets.only(left: 20.sp, right: 20.sp, top: 20.h), margin: EdgeInsets.only(left: 20.sp, right: 20.sp, top: 20.h),
color: Colors.white, color: Colors.white,
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: <Widget>[
SizedBox( SizedBox(
width: 20.w, width: 20.w,
), ),
Expanded( Expanded(
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: <Widget>[
Container( Container(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: Text( child: Text(
leftStr, leftStr,
style: TextStyle(fontSize: 24.sp, color: Colors.black), style: TextStyle(fontSize: 24.sp, color: isAble ? Colors.black : AppColors.placeholderTextColor),
), ),
), ),
SizedBox( SizedBox(
@ -133,7 +127,7 @@ class _FaceUnlockPageState extends State<FaceUnlockPage> {
Text( Text(
rightStr, rightStr,
style: TextStyle( style: TextStyle(
fontSize: 22.sp, color: AppColors.darkGrayTextColor), fontSize: 22.sp, color: isAble ? Colors.black : AppColors.placeholderTextColor),
), ),
SizedBox( SizedBox(
width: 10.w, width: 10.w,
@ -169,16 +163,13 @@ class _FaceUnlockPageState extends State<FaceUnlockPage> {
activeColor: CupertinoColors.activeBlue, activeColor: CupertinoColors.activeBlue,
trackColor: CupertinoColors.systemGrey5, trackColor: CupertinoColors.systemGrey5,
thumbColor: CupertinoColors.white, thumbColor: CupertinoColors.white,
value: getIndex == 1 ? state.faceOn.value : state.autoBright.value, value: state.faceOn.value, // getIndex == 1 ? state.faceOn.value : state.autoBright.value,
onChanged: (value) { onChanged: (bool value) {
if (getIndex == 1) { if (getIndex == 1) {
// //
state.faceOn.value = value; state.faceOn.value = value;
logic.updateFaceSwitch(); state.setType.value = 0;
} else { logic.sendFaceUnlock();
//
state.autoBright.value = value;
logic.updateFaceConfig();
} }
}, },
); );
@ -193,18 +184,11 @@ class _FaceUnlockPageState extends State<FaceUnlockPage> {
return AlertBottomWidget( return AlertBottomWidget(
topTitle: '', topTitle: '',
items: bottomItemList, items: bottomItemList,
chooseCallback: (value) { chooseCallback: (int value) {
if (clickIndex == 0) { state.senseDistance.value =
// state.senseDistanceList.value[value];
state.senseDistance.value = state.setType.value = 1;
state.senseDistanceList.value[value]; logic.sendFaceUnlock();
logic.updateFaceSenseDistance();
} else if (clickIndex == 1) {
//
state.antiMisoperation.value =
state.antiMisoperationList.value[value];
logic.updateFacePreventMisrun();
}
}, },
); );
}); });

View File

@ -1,3 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -7,26 +8,54 @@ import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dar
import '../../../../translations/trans_lib.dart'; import '../../../../translations/trans_lib.dart';
class FaceUnlockState { class FaceUnlockState {
var lockSetInfoData = LockSetInfoData().obs;
var isCheck = false.obs; FaceUnlockState() {
var faceOn = false.obs; // Map map = Get.arguments;
var autoBright = false.obs; // if (map['lockSetInfoData'] != null) {
var senseDistance = TranslationLoader.lanKeys!.remote!.tr.obs; // lockSetInfoData.value = map['lockSetInfoData'];
var antiMisoperation = 0.obs; // faceOn.value = lockSetInfoData.value.lockSettingInfo!.faceSwitch != 0;
var senseDistanceList = [ // autoBright.value = lockSetInfoData.value.lockSettingInfo!.faceAutoLightScreen != 0;
TranslationLoader.lanKeys!.remote!.tr,
TranslationLoader.lanKeys!.closeRange!.tr switch(lockSetInfoData.value.lockSettingInfo!.faceInductionDistance!){
].obs; case 1:
var antiMisoperationList = [0, 5, 10, 15, 30, 60].obs; senseDistance.value = '远距离';
var antiMisoperationStrList = [ break;
TranslationLoader.lanKeys!.close!.tr, case 2:
'5${TranslationLoader.lanKeys!.second!.tr}', senseDistance.value = '中距离';
'10${TranslationLoader.lanKeys!.second!.tr}', break;
'15${TranslationLoader.lanKeys!.second!.tr}', case 3:
'30${TranslationLoader.lanKeys!.second!.tr}', senseDistance.value = '近距离';
'60${TranslationLoader.lanKeys!.second!.tr}' break;
case 0:
senseDistance.value = '关闭';
break;
}
antiMisoperation.value = lockSetInfoData.value.lockSettingInfo!.faceEnErrUnlock!;
}
for(int i = 0; i < 31; i++) {
antiMisoperationStrList.add(i.toString() + ''.tr);
}
}
Rx<LockSetInfoData> lockSetInfoData = LockSetInfoData().obs;
// RxBool isCheck = false.obs;
RxBool faceOn = false.obs; //
// RxBool autoBright = false.obs; //
RxString senseDistance = TranslationLoader.lanKeys!.remote!.tr.obs; //
RxInt antiMisoperation = 0.obs; //
RxList<String> senseDistanceList = <String>[
'远距离'.tr,
'中距离'.tr,
'近距离'.tr,
'关闭'.tr
].obs; ].obs;
// RxList<int> antiMisoperationList = <int>[0, 5, 10, 15, 30, 60].obs;
RxList<String> antiMisoperationStrList = <String>[].obs;
// TextEditingController antiMisoperationStrController = TextEditingController();
// //
final TextStyle titleStyle = TextStyle( final TextStyle titleStyle = TextStyle(
color: Colors.black, fontSize: 24.sp, fontWeight: FontWeight.w500); color: Colors.black, fontSize: 24.sp, fontWeight: FontWeight.w500);
@ -34,7 +63,7 @@ class FaceUnlockState {
final TextStyle subTipsStyle = final TextStyle subTipsStyle =
TextStyle(color: AppColors.placeholderTextColor, fontSize: 22.sp); TextStyle(color: AppColors.placeholderTextColor, fontSize: 22.sp);
late InlineSpan tipsPreviewSpan = TextSpan(children: [ late InlineSpan tipsPreviewSpan = TextSpan(children: <InlineSpan>[
TextSpan( TextSpan(
text: '${TranslationLoader.lanKeys!.addAndUseFaceWhenUnlocking!.tr}:\n', text: '${TranslationLoader.lanKeys!.addAndUseFaceWhenUnlocking!.tr}:\n',
style: titleStyle), style: titleStyle),
@ -43,10 +72,8 @@ class FaceUnlockState {
style: subTipsStyle), style: subTipsStyle),
]); ]);
FaceUnlockState() { RxBool ifCurrentScreen = true.obs; // ,
Map map = Get.arguments; RxInt sureBtnState = 0.obs;
if (map['lockSetInfoData'] != null) {
lockSetInfoData.value = map['lockSetInfoData']; RxInt setType = 0.obs; // 0 1 2
}
}
} }

View File

@ -490,9 +490,10 @@ class LockSettingInfo {
int? faceSwitch; // 0: 1: int? faceSwitch; // 0: 1:
int? faceAutoLightScreen; // 0: 1: int? faceAutoLightScreen; // 0: 1:
int? faceInductionDistance; // int? faceInductionDistance; //
int? faceAntiMistakeOpen; // 0: 1: // int? faceAntiMistakeOpen; // 0: 1:
int? autoLightScreen; //- 0: 1: int? autoLightScreen; //- 0: 1:
int? autoLightScreenTime; //- int? autoLightScreenTime; //-
int? faceEnErrUnlock; //
// List<CatEyeModeConfig>? catEyeConfigList; // List<CatEyeModeConfig>? catEyeConfigList;
// int? faceSwitch; // 0: 1: // int? faceSwitch; // 0: 1:
@ -538,9 +539,10 @@ class LockSettingInfo {
this.faceSwitch, this.faceSwitch,
this.faceAutoLightScreen, this.faceAutoLightScreen,
this.faceInductionDistance, this.faceInductionDistance,
this.faceAntiMistakeOpen, // this.faceAntiMistakeOpen,
this.autoLightScreen, this.autoLightScreen,
this.autoLightScreenTime, this.autoLightScreenTime,
this.faceEnErrUnlock,
// this.dayNotOpenDoorSwitch, // this.dayNotOpenDoorSwitch,
// this.dayNotOpenDoorValue, // this.dayNotOpenDoorValue,
// this.doorNotCloseSwitch, // this.doorNotCloseSwitch,
@ -589,9 +591,11 @@ class LockSettingInfo {
faceSwitch = json['faceSwitch']; faceSwitch = json['faceSwitch'];
faceAutoLightScreen = json['faceAutoLightScreen']; faceAutoLightScreen = json['faceAutoLightScreen'];
faceInductionDistance = json['faceInductionDistance']; faceInductionDistance = json['faceInductionDistance'];
faceAntiMistakeOpen = json['faceAntiMistakeOpen']; // faceAntiMistakeOpen = json['faceAntiMistakeOpen'];
autoLightScreen = json['autoLightScreen']; autoLightScreen = json['autoLightScreen'];
autoLightScreenTime = json['autoLightScreenTime']; autoLightScreenTime = json['autoLightScreenTime'];
faceEnErrUnlock = json['faceEnErrUnlock'];
// dayNotOpenDoorSwitch = json['dayNotOpenDoorSwitch']; // dayNotOpenDoorSwitch = json['dayNotOpenDoorSwitch'];
// dayNotOpenDoorValue = json['dayNotOpenDoorValue']; // dayNotOpenDoorValue = json['dayNotOpenDoorValue'];
// doorNotCloseSwitch = json['doorNotCloseSwitch']; // doorNotCloseSwitch = json['doorNotCloseSwitch'];
@ -636,9 +640,11 @@ class LockSettingInfo {
data['faceSwitch'] = faceSwitch; data['faceSwitch'] = faceSwitch;
data['faceAutoLightScreen'] = faceAutoLightScreen; data['faceAutoLightScreen'] = faceAutoLightScreen;
data['faceInductionDistance'] = faceInductionDistance; data['faceInductionDistance'] = faceInductionDistance;
data['faceAntiMistakeOpen'] = faceAntiMistakeOpen; // data['faceAntiMistakeOpen'] = faceAntiMistakeOpen;
data['autoLightScreen'] = autoLightScreen; data['autoLightScreen'] = autoLightScreen;
data['autoLightScreenTime'] = autoLightScreenTime; data['autoLightScreenTime'] = autoLightScreenTime;
data['faceEnErrUnlock'] = faceEnErrUnlock;
// data['dayNotOpenDoorSwitch'] = dayNotOpenDoorSwitch; // data['dayNotOpenDoorSwitch'] = dayNotOpenDoorSwitch;
// data['dayNotOpenDoorValue'] = dayNotOpenDoorValue; // data['dayNotOpenDoorValue'] = dayNotOpenDoorValue;
// data['doorNotCloseSwitch'] = doorNotCloseSwitch; // data['doorNotCloseSwitch'] = doorNotCloseSwitch;

View File

@ -191,7 +191,7 @@ class PasswordKeyDetailLogic extends BaseGetXController {
case 3: case 3:
// 3 24使 // 3 24使
useDateStr = useDateStr =
'${startDateStr.toLocal().toString().substring(0, 16)}\n${endDateStr.toLocal().toString().substring(0, 16)}'; '${startDateStr.toLocal().toString().substring(0, 16)}\n${DateTime.fromMillisecondsSinceEpoch(state.itemData.value.endDate!-1).toLocal().toString().substring(0, 16)}';
state.isCirculation.value = false; state.isCirculation.value = false;
break; break;
case 4: case 4:

View File

@ -243,7 +243,7 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
day: DateTime.now().day, day: DateTime.now().day,
hour: 24), hour: 24),
// minDate: PDuration.now(), // minDate: PDuration.now(),
mode: DateMode.YMDHM, onConfirm: (PDuration p) { mode: DateMode.YMDHM, hourShow24: true, onConfirm: (PDuration p) {
state.beginTime.value = DateTool().getYMDHNDateString(p, 4); state.beginTime.value = DateTool().getYMDHNDateString(p, 4);
}); });
}), }),
@ -266,7 +266,9 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
year: DateTime.now().year, year: DateTime.now().year,
month: DateTime.now().month, month: DateTime.now().month,
day: DateTime.now().day), day: DateTime.now().day),
mode: DateMode.YMDH, onConfirm: (PDuration p) { mode: DateMode.YMDH,
hourShow24: true,
onConfirm: (PDuration p) {
state.endTime.value = DateTool().getYMDHNDateString(p, 4); state.endTime.value = DateTool().getYMDHNDateString(p, 4);
}); });
}), }),

View File

@ -1881,7 +1881,7 @@ class ApiProvider extends BaseProvider {
// //
Future<Response> updateFaceSwitch(int lockId, int faceSwitch) => post( Future<Response> updateFaceSwitch(int lockId, int faceSwitch) => post(
updateFaceConfigURL.toUrl, updateLockSettingUrl.toUrl,
jsonEncode({ jsonEncode({
'lockId': lockId, 'lockId': lockId,
'faceSwitch': faceSwitch, 'faceSwitch': faceSwitch,
@ -1891,7 +1891,7 @@ class ApiProvider extends BaseProvider {
Future<Response> updateFaceSenseDistance( Future<Response> updateFaceSenseDistance(
int lockId, int faceInductionDistance) => int lockId, int faceInductionDistance) =>
post( post(
updateFaceConfigURL.toUrl, updateLockSettingUrl.toUrl,
jsonEncode({ jsonEncode({
'lockId': lockId, 'lockId': lockId,
'faceInductionDistance': faceInductionDistance, 'faceInductionDistance': faceInductionDistance,
@ -1899,12 +1899,12 @@ class ApiProvider extends BaseProvider {
// //
Future<Response> updateFacePreventMisrun( Future<Response> updateFacePreventMisrun(
int lockId, int faceAntiMistakeOpen) => int lockId, int faceEnErrUnlock) =>
post( post(
updateFaceConfigURL.toUrl, updateLockSettingUrl.toUrl,
jsonEncode({ jsonEncode({
'lockId': lockId, 'lockId': lockId,
'faceAntiMistakeOpen': faceAntiMistakeOpen, 'faceEnErrUnlock': faceEnErrUnlock,
})); }));
// //

View File

@ -1941,9 +1941,9 @@ class ApiRepository {
// //
Future<VersionUndateEntity> updateFacePreventMisrun( Future<VersionUndateEntity> updateFacePreventMisrun(
{required int lockId, required int faceAntiMistakeOpen}) async { {required int lockId, required int faceEnErrUnlock}) async {
final res = final res =
await apiProvider.updateFacePreventMisrun(lockId, faceAntiMistakeOpen); await apiProvider.updateFacePreventMisrun(lockId, faceEnErrUnlock);
return VersionUndateEntity.fromJson(res.body); return VersionUndateEntity.fromJson(res.body);
} }

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:star_lock/app_settings/app_colors.dart';
/// ///
/// [showTitleBar] true /// [showTitleBar] true
@ -167,8 +168,8 @@ class PickerStyle {
Container( Container(
alignment: Alignment.center, alignment: Alignment.center,
padding: const EdgeInsets.only(left: 12, right: 22), padding: const EdgeInsets.only(left: 12, right: 22),
child: const Text('确定', child: Text('确定',
style: TextStyle(color: Colors.blue, fontSize: 16.0)), style: TextStyle(color: AppColors.mainColor, fontSize: 16.0)),
); );
} }

View File

@ -49,6 +49,7 @@ class ShowTFView extends StatelessWidget {
height: 60.h, height: 60.h,
// color: Colors.white, // color: Colors.white,
// padding: EdgeInsets.only(left:20.w, right: 110.w), // padding: EdgeInsets.only(left:20.w, right: 110.w),
margin: EdgeInsets.only(top: 20.w),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(15.w)), borderRadius: BorderRadius.circular(15.w)),