添加删除锁接口与逻辑

This commit is contained in:
魏少阳 2023-08-29 17:39:35 +08:00
parent 62370f364a
commit e91e45d71a
17 changed files with 210 additions and 22 deletions

View File

@ -1,9 +1,12 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/translations/trans_lib.dart';
import 'tools/refreshHeadFoot.dart';
mixin BaseWidget {
double fs(double value) => value.sp;
double w(double width) => width.w;
@ -44,4 +47,24 @@ mixin BaseWidget {
),
);
}
SmartRefresher smartRefresher(RefreshController refreshController,{
Widget? child,
Function()? onRefresh,
Function()? onLoading,
bool enablePullDown = true,
bool enablePullUp = false,
bool enableTwoLevel = false,
}) => SmartRefresher(
controller: refreshController,
onRefresh: onRefresh,
onLoading: onLoading,
enablePullUp: enablePullUp,
enablePullDown: enablePullDown,
enableTwoLevel: enableTwoLevel,
header: const HeaderWidget(),
footer: const FooterWidget(),
child: child,
);
}

View File

@ -62,6 +62,14 @@ class DeletUserCommand extends SenderProtocol {
data.addAll(utf8.encode(keyID!));
data = getFixedLengthList(data, 40 - keyIDLength);
//delUserID 20
int delUserIDLength = utf8.encode(delUserID!).length;
// print("${commandType!.typeValue}authUserIDLength:$authUserIDLength utf8.encode(authUserID!)${utf8.encode(authUserID!)}");
data.addAll(utf8.encode(delUserID!));
data = getFixedLengthList(data, 20 - delUserIDLength);
data.addAll(token!);
if(needAuthor == 0){
//AuthCodeLen 1
data.add(0);

View File

@ -22,7 +22,7 @@ class StarLockLoginLogic extends BaseGetXController{
);
if(entity.errorCode!.codeIsSuccessful){
// await StoreService.to.saveLogInInfo(entity);
stateMyLogic.saveLoginData(entity);
stateMyLogic.saveLoginData(entity.data);
// Get.back();
Get.toNamed(Routers.starLockMain);
}

View File

@ -1,16 +1,18 @@
import 'dart:async';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:get/get.dart';
import 'package:star_lock/blue/io_protocol/io_deletUser.dart';
import '../../../../appRouters.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_protocol/io_reply.dart';
import '../../../../blue/io_tool/io_manager.dart';
import '../../../../blue/io_tool/io_tool.dart';
import '../../../../blue/io_tool/manager_event_bus.dart';
import '../../../../blue/sender_manage.dart';
import '../../../../network/api_repository.dart';
import '../../../../tools/baseGetXController.dart';
import '../../../../tools/storage.dart';
import 'lockSet_state.dart';
@ -18,6 +20,15 @@ import 'lockSet_state.dart';
class LockSetLogic extends BaseGetXController{
final LockSetState state = LockSetState();
void deletLockInfoData() async{
var entity = await ApiRepository.to.deletLockData(
lockId:state.getKeyInfosData.value.lockId.toString(),
);
if(entity.errorCode!.codeIsSuccessful){
Get.offAllNamed(Routers.starLockMain);
}
}
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((reply) async {
@ -32,12 +43,28 @@ class LockSetLogic extends BaseGetXController{
case 0x00:
//
print("${reply.commandType}解析成功");
deletLockInfoData();
break;
case 0x06:
//
print("${reply.commandType}需要鉴权");
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
IoSenderManage.deletUser(
lockID:BlueManage().connectDeviceName,
authUserID:"100001",
keyID:"1",
delUserID:"100001",
needAuthor:1,
publicKey:publicKeyDataList,
privateKey:getPrivateKeyList,
token: tokenData
);
break;
case 0x07:
//

View File

@ -1,5 +1,12 @@
import 'package:get/get.dart';
import 'package:star_lock/main/lockMian/entity/lockInfoEntity.dart';
class LockSetState {
var getKeyInfosData = KeyInfos().obs;
LockSetState() {
getKeyInfosData.value = Get.arguments as KeyInfos;
}
}

View File

@ -1,5 +1,6 @@
import 'dart:async';
import 'dart:convert';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:star_lock/blue/io_protocol/io_editUser.dart';
@ -14,6 +15,7 @@ import '../../../blue/io_tool/io_manager.dart';
import '../../../blue/io_tool/io_tool.dart';
import '../../../blue/io_tool/manager_event_bus.dart';
import '../../../blue/sender_manage.dart';
import '../../../login/login/entity/LoginData.dart';
import '../../../tools/baseGetXController.dart';
import '../../../tools/storage.dart';
import 'lockDetail_state.dart';
@ -308,11 +310,18 @@ class LockDetailLogic extends BaseGetXController{
List<int> getTokenList = changeStringListToIntList(token!);
print("openDoorTokenPubToken:$getTokenList");
// var userId = "";
// final data = await Storage.getString('userLoginData');
// print("getLoginData:$data");
// if (data != null && data.isNotEmpty) {
// userId = LoginData.fromJson(jsonDecode(data)).userid as String;
// }
IoSenderManage.senderOpenLock(
keyID: "1",
userID: "100001",
userID: "10001",
openMode: 1,
openTime: 0x11223344,
openTime: DateTime.now().millisecondsSinceEpoch,
token: getTokenList,
needAuthor: 1,
signKey: signKeyDataList,

View File

@ -9,9 +9,11 @@ import '../../lockMian/entity/lockInfoEntity.dart';
import 'lockDetail_logic.dart';
class LockDetailPage extends StatefulWidget {
final isFrist;
final KeyInfos keyInfo;
final LockMainEntity lockMainEntity;
const LockDetailPage({Key? key, required this.lockMainEntity})
const LockDetailPage({Key? key, required this.lockMainEntity, required this.isFrist, required this.keyInfo})
: super(key: key);
@override
@ -26,10 +28,13 @@ class _LockDetailPageState extends State<LockDetailPage> {
Widget build(BuildContext context) {
return Container(
width: 1.sw,
height: 1.sh,
height: 1.sh - ScreenUtil().statusBarHeight*2,
color: Colors.white,
child: Column(
children: [topWidget(), Expanded(child: bottomWidget())],
children: [
topWidget(),
Expanded(child: bottomWidget())
],
),
);
}
@ -182,7 +187,7 @@ class _LockDetailPageState extends State<LockDetailPage> {
}),
bottomItem('images/main/icon_main_set.png',
TranslationLoader.lanKeys!.set!.tr, () {
Navigator.pushNamed(context, Routers.lockSetPage);
Navigator.pushNamed(context, Routers.lockSetPage, arguments: widget.keyInfo);
}),
],
),

View File

@ -1,5 +1,7 @@
import 'dart:async';
import 'package:get/get.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import '../../../blue/io_tool/manager_event_bus.dart';
import '../../../network/api_repository.dart';
@ -9,12 +11,38 @@ import 'lockMain_state.dart';
class LockMainLogic extends BaseGetXController {
final LockMainState state = LockMainState();
var page = 1;
// final RefreshController refreshController = RefreshController(
// initialRefresh: false
// );
///
// void onRefresh() {
// page = 1;
// getLockInfo();
// }
//
// void onLoading() {
// getLockInfo();
// }
void getLockInfo() async{
var entity = await ApiRepository.to.getLockInfo(
lastUpdateDate:DateTime.now().millisecondsSinceEpoch.toString(),
pageNo:"1",
pageNo:page.toString(),
);
if(entity.errorCode!.codeIsSuccessful){
// if (page == 0) {
// refreshController.refreshCompleted();
// } else {
// if (entity.data!.keyInfos!.isEmpty) {
// refreshController.loadNoData();
// } else {
// refreshController.loadComplete();
// }
// }
// page++;
if(entity.data!.keyInfos!.isEmpty){
state.dataLength.value = 0;
}else if(entity.data!.keyInfos!.length == 1){
@ -23,7 +51,10 @@ class LockMainLogic extends BaseGetXController {
state.dataLength.value = 2;
}
state.lockMainEntity.value = entity;
}else{
// refreshController.loadFailed();
}
// refreshController.refreshCompleted();
}
//
@ -56,6 +87,8 @@ class LockMainLogic extends BaseGetXController {
void onClose() {
// TODO: implement onClose
super.onClose();
// refreshController.dispose();
_addLockSubscription.cancel();
}

View File

@ -2,11 +2,13 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import '../../../appRouters.dart';
import '../../../baseWidget.dart';
import '../../../mine/mine/starLockMine_page.dart';
import '../../../tools/refreshHeadFoot.dart';
import '../../../tools/titleAppBar.dart';
import '../../../translations/trans_lib.dart';
import '../../lockDetail/lockDetail/lockDetail_page.dart';
@ -62,7 +64,12 @@ class _StarLockMainPageState extends State<StarLockMainPage> with BaseWidget {
width: 1.sw / 3 * 2,
child: const StarLockMinePage(),
),
body: Obx(() => getDataReturnUI(state.dataLength.value, )),
body: Obx(() => getDataReturnUI(state.dataLength.value)),
// body:smartRefresher(
// logic.refreshController,
// onRefresh:logic.onRefresh,
// onLoading:logic.onLoading,
// child:Obx(() => getDataReturnUI(state.dataLength.value))),
// body: getLockList(),
// body: unHaveData(),
);
@ -75,7 +82,7 @@ class _StarLockMainPageState extends State<StarLockMainPage> with BaseWidget {
returnWidget = unHaveData();
break;
case 1:
returnWidget = LockDetailPage(lockMainEntity: logic.state.lockMainEntity.value);
returnWidget = LockDetailPage(lockMainEntity: logic.state.lockMainEntity.value, isFrist: true, keyInfo:logic.state.lockMainEntity.value.data!.keyInfos![0]);
break;
case 2:
returnWidget = LockListPage(lockMainEntity:logic.state.lockMainEntity.value);

View File

@ -89,7 +89,7 @@ class _LockAddressGaoDePageState extends State<LockAddressGaoDePage>{
if (addressInfo?['latitude'] == null ||
addressInfo?['longitude'] == null ||
addressInfo?['errorCode'] == 0) {
return const Text('Sorry');
return const Center(child: Text('地图加载中,请稍候。。。'));
}
var latitude = 39.909187;

View File

@ -257,7 +257,7 @@ class SaveLockLogic extends BaseGetXController {
);
if(entity.errorCode!.codeIsSuccessful){
EventBusManager().eventBusFir(RefreshLockListInfoDataEvent);
Get.toNamed(Routers.starLockMain);
Get.offAllNamed(Routers.starLockMain);
}
}

View File

@ -7,11 +7,11 @@ import '../../login/login/entity/LoginEntity.dart';
import '../../tools/storage.dart';
class StarLockMineState {
final loginData = LoginEntity().obs;
final loginData = LoginData().obs;
///
void saveLoginData(LoginEntity data) async {
print("saveLoginData:${data.data!.mobile}");
void saveLoginData(LoginData? data) async {
print("saveLoginData:${data!.mobile}");
await Storage.setString('userLoginData', jsonEncode(data));
loginData.value = data;
}
@ -21,28 +21,28 @@ class StarLockMineState {
final data = await Storage.getString('userLoginData');
print("getLoginData:$data");
if (data != null && data.isNotEmpty) {
loginData.value = LoginEntity.fromJson(jsonDecode(data));
loginData.value = LoginData.fromJson(jsonDecode(data));
}
}
///退
void logOut() async {
await Storage.setString('userLoginData', '');
loginData.value = LoginEntity();
loginData.value = LoginData();
}
///token
String token() {
return loginData.value.data?.accessToken ?? '';
return loginData.value.accessToken ?? '';
}
String mobile() {
return loginData.value.data?.mobile ?? '-';
return loginData.value.mobile ?? '-';
}
///
String headUrl() {
return loginData.value.data!.headUrl ?? '';
return loginData.value.headUrl ?? '';
// return "https://img2.woyaogexing.com/2022/04/14/156cdbabd5bc496abee2cd0fca527434!400x400.jpeg";
}

View File

@ -27,6 +27,7 @@ abstract class Api {
final String passwordKeyResetURL = '/keyboardPwd/reset'; //
final String getLockInfoURL = '/lock/syncDataPage'; //
final String deletLockURL = '/lock/delete'; //
final String passwordKeyGetURL = '/keyboardPwd/get'; //
final String clearOperationRecordURL = '/lockRecords/clear'; //

View File

@ -260,6 +260,15 @@ class ApiProvider extends BaseProvider {
"pageNo": pageNo,
}));
//
Future<Response> deletLockInfo(
String lockId) =>
post(
deletLockURL.toUrl,
jsonEncode({
'lockId': lockId,
}));
Future<Response> passwordKeyList(
String keyStatus,
String lockId,

View File

@ -259,6 +259,13 @@ class ApiRepository {
return LockMainEntity.fromJson(res.body);
}
//
Future<LockMainEntity> deletLockData({
required String lockId}) async {
final res = await apiProvider.deletLockInfo(lockId);
return LockMainEntity.fromJson(res.body);
}
//
Future<PasswordKeyEntity> getPasswordKey(
String endDate,

View File

@ -0,0 +1,49 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
//
class HeaderWidget extends StatelessWidget {
const HeaderWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const WaterDropHeader(
refresh: CupertinoActivityIndicator(),
complete: CupertinoActivityIndicator(),
idleIcon: CupertinoActivityIndicator(),
// waterDropColor: null,
);
}
}
//
class FooterWidget extends StatelessWidget {
const FooterWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return CustomFooter(
builder: (BuildContext context, LoadStatus? mode) {
Widget body;
if (mode == LoadStatus.idle) {
body = const Text("上拉加载");
} else if (mode == LoadStatus.loading) {
body = const CupertinoActivityIndicator();
} else if (mode == LoadStatus.failed) {
body = const Text("加载失败");
} else if (mode == LoadStatus.canLoading) {
body = const Text("加载更多");
} else if(mode == LoadStatus.noMore){
body = const Text("没有更多数据");
}else{
// body = Text("没有更多数据");
body = Text("");
}
return Container(
height: 55.0,
child: Center(child: body),
);
},
);
}
}

View File

@ -89,6 +89,9 @@ dependencies:
crypto: ^3.0.3
date_format: ^2.0.7
# 下拉刷新
pull_to_refresh: ^2.0.0
#高德地图定位
amap_flutter_location: ^3.0.0
#权限使用