Merge branch 'release' of gitee.com:starlock-cn/app-starlock into release
This commit is contained in:
commit
f86c35a5ee
@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -682,6 +682,7 @@
|
|||||||
"刷新": "刷新",
|
"刷新": "刷新",
|
||||||
"手动配网": "手动配网",
|
"手动配网": "手动配网",
|
||||||
"远距离": "远距离",
|
"远距离": "远距离",
|
||||||
|
"中距离": "中距离",
|
||||||
"近距离": "近距离",
|
"近距离": "近距离",
|
||||||
"锁时间更新成功": "锁时间更新成功",
|
"锁时间更新成功": "锁时间更新成功",
|
||||||
"锁用户": "锁用户",
|
"锁用户": "锁用户",
|
||||||
@ -957,5 +958,11 @@
|
|||||||
"发送钥匙": "发送钥匙",
|
"发送钥匙": "发送钥匙",
|
||||||
"进度": "进度",
|
"进度": "进度",
|
||||||
"失败": "失败",
|
"失败": "失败",
|
||||||
"人脸详情": "人脸详情"
|
"人脸详情": "人脸详情",
|
||||||
|
|
||||||
|
"感应到门前约1.5米有人时,将自动启动面部识别开锁。": "感应到门前约1.5米有人时,将自动启动面部识别开锁。",
|
||||||
|
"感应到门前约0.8米有人时,将自动启动面部识别开锁。": "感应到门前约0.8米有人时,将自动启动面部识别开锁。",
|
||||||
|
"感应到门前约0.5米有人时,将自动启动面部识别开锁。": "感应到门前约0.5米有人时,将自动启动面部识别开锁。",
|
||||||
|
"感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。",
|
||||||
|
"防误开已打开,时间是": "防误开已打开,时间是"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,6 +655,7 @@
|
|||||||
"刷新": "刷新",
|
"刷新": "刷新",
|
||||||
"手动配网": "手动配网",
|
"手动配网": "手动配网",
|
||||||
"远距离": "远距离",
|
"远距离": "远距离",
|
||||||
|
"中距离": "中距离",
|
||||||
"近距离": "近距离",
|
"近距离": "近距离",
|
||||||
"锁时间更新成功": "锁时间更新成功",
|
"锁时间更新成功": "锁时间更新成功",
|
||||||
"锁用户": "锁用户",
|
"锁用户": "锁用户",
|
||||||
@ -922,6 +923,11 @@
|
|||||||
"发送钥匙": "发送钥匙",
|
"发送钥匙": "发送钥匙",
|
||||||
"进度": "进度",
|
"进度": "进度",
|
||||||
"失败": "失败",
|
"失败": "失败",
|
||||||
"人脸详情": "人脸详情"
|
"人脸详情": "人脸详情",
|
||||||
|
|
||||||
|
"感应到门前约1.5米有人时,将自动启动面部识别开锁。": "感应到门前约1.5米有人时,将自动启动面部识别开锁。",
|
||||||
|
"感应到门前约0.8米有人时,将自动启动面部识别开锁。": "感应到门前约0.8米有人时,将自动启动面部识别开锁。",
|
||||||
|
"感应到门前约0.5米有人时,将自动启动面部识别开锁。": "感应到门前约0.5米有人时,将自动启动面部识别开锁。",
|
||||||
|
"感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。",
|
||||||
|
"防误开已打开,时间是": "防误开已打开,时间是"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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()),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
import 'package:star_lock/tools/baseGetXController.dart';
|
||||||
|
|
||||||
|
import 'doorLockLogDetail_state.dart';
|
||||||
|
|
||||||
|
class DoorLockLogDetailLogic extends BaseGetXController {
|
||||||
|
final DoorLockLogDetailState state = DoorLockLogDetailState();
|
||||||
|
|
||||||
|
}
|
||||||
@ -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)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
),
|
||||||
),
|
],
|
||||||
],
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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){
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -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防误开
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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);
|
||||||
});
|
});
|
||||||
}),
|
}),
|
||||||
|
|||||||
@ -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,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// 设置面容自动亮屏
|
// 设置面容自动亮屏
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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)),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user