1,群发电子钥匙、授权管理员选择锁页面根据是否为VIP来显示不同权限内容及点击处理逻辑

2,群发电子钥匙--选择锁页面重构代码结构
3,修改部分URL为V2版本
This commit is contained in:
Daisy 2024-05-03 11:24:21 +08:00
parent 8d34a727f8
commit 27c3d36e49
14 changed files with 170 additions and 72 deletions

View File

@ -776,7 +776,7 @@
"的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "The entire content of. By clicking \"Agree\", you agree and accept all terms. If you choose not to agree, you will not be able to use our products and services and will exit the application.",
"不同意": "Disagree",
"同意": "agree",
"已开通": "Have opened",
"已开通": "Current status: Enabled",
"该功能是高级功能,请开通后再使用": "This function is an advanced function. Please enable it before using it",
"常用程序": "Common Programs",
"该锁已被重置": "The lock has been reset",
@ -788,5 +788,6 @@
"文件校验失败 0x02": "File verification failed 0x02",
"文件校验失败 0x03": "File verification failed 0x03",
"固件升级完成": "Firmware upgrade completed",
"记录":"Record"
"记录":"Record",
"开通高级功能后才可以对锁进行管理":"You can manage locks only after the advanced function is enabled"
}

View File

@ -803,7 +803,7 @@
"的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。",
"不同意":"不同意",
"同意":"同意",
"已开通":"已开通",
"当前状态:已开通":"当前状态:已开通",
"该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用",
"常用程序":"常用程序",
"该锁已被重置":"该锁已被重置",
@ -815,5 +815,6 @@
"文件校验失败 0x02":"文件校验失败 0x02",
"文件校验失败 0x03":"文件校验失败 0x03",
"固件升级完成":"固件升级完成",
"记录":"记录"
"记录":"记录",
"开通高级功能后才可以对锁进行管理":"开通高级功能后才可以对锁进行管理"
}

View File

@ -806,7 +806,7 @@
"的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。",
"不同意":"不同意",
"同意":"同意",
"已开通":"已开通",
"当前状态:已开通":"当前状态:已开通",
"该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用",
"常用程序":"常用程序",
"该锁已被重置":"该锁已被重置",
@ -818,5 +818,6 @@
"解析元数据失败,请选择正确的文件":"解析元数据失败,请选择正确的文件",
"文件校验失败 0x02":"文件校验失败 0x02",
"文件校验失败 0x03":"文件校验失败 0x03",
"固件升级完成":"固件升级完成"
"固件升级完成":"固件升级完成",
"开通高级功能后才可以对锁进行管理":"开通高级功能后才可以对锁进行管理"
}

View File

@ -134,6 +134,12 @@ class AppColors {
Color.fromRGBO(223, 237, 254, 1); // 139 148 176
static const msgNoticeTextColor = Color.fromRGBO(139, 148, 176, 1); //
static const alphaBgViewColor = Color.fromRGBO(0, 0, 0, 0.2); //
static const vipFeatureBgColor =
Color.fromRGBO(251, 248, 229, 1); //
static const vipFeatureBtnBgColor =
Color.fromRGBO(197, 167, 109, 1); //
static const vipFeatureBtnTextColor =
Color.fromRGBO(110, 98, 81, 1); //
static Color openPassageModeColor = const Color(0xFFEB2A3B); // ()
static Color listTimeYellowColor = const Color(0xFFF3BA37); // ()

View File

@ -9,12 +9,14 @@ class massSendLockGroupCell extends StatelessWidget {
final int currentIndex;
List lockListByGroup;
final _CallBack selectLockAction;
bool isVip;
massSendLockGroupCell(int index,
{Key? key,
required this.currentIndex,
required this.lockListByGroup,
required this.selectLockAction})
required this.selectLockAction,
required this.isVip})
: super(key: key);
@override
@ -70,6 +72,7 @@ class massSendLockGroupCell extends StatelessWidget {
: "images/icon_round_unSelect.png",
width: 30.w,
height: 30.w,
color: !isVip ? Colors.grey : AppColors.mainColor,
),
SizedBox(
width: 30.w,
@ -78,6 +81,9 @@ class massSendLockGroupCell extends StatelessWidget {
),
),
onTap: () {
if (isVip == false) {
return;
}
selectLockAction(itemIndex, itemData.lockId.toString());
},
);

View File

@ -57,11 +57,16 @@ class GroupListItem {
List<LockListItem>? lockList;
bool _isChecked = false;
bool get isChecked => _isChecked ?? false;
bool isVip = false;
set isChecked(bool value) => _isChecked = value;
GroupListItem(
{this.lockNum, this.keyGroupId, this.groupType, this.keyGroupName, this.lockList});
{this.lockNum,
this.keyGroupId,
this.groupType,
this.keyGroupName,
this.lockList});
GroupListItem.fromJson(Map<String, dynamic> json) {
lockNum = json['lockNum'];

View File

@ -0,0 +1,31 @@
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupListEntity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupList_state.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/storage.dart';
class MassSendLockGroupListLogic extends BaseGetXController {
final MassSendLockGroupListState state = MassSendLockGroupListState();
//
Future<void> mockNetworkDataRequest() async {
MassSendLockGroupListEntity entity =
await ApiRepository.to.lockGroupList('2');
if (entity.errorCode!.codeIsSuccessful) {
if (entity.data != null) {
state.lockGroupList.value = entity.data!.groupList!;
state.lockGroupList.refresh();
}
}
}
@override
Future<void> onReady() async {
super.onReady();
var isVip = await Storage.getBool(saveIsVip);
state.isVip.value = isVip ?? false;
AppLog.log('isVip: ${state.isVip.value}');
}
}

View File

@ -1,12 +1,12 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/appRouters.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupCell.dart';
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupListEntity.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupList_logic.dart';
import 'package:star_lock/tools/ExpandedListView.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/submitBtn.dart';
import 'package:star_lock/translations/trans_lib.dart';
@ -20,16 +20,13 @@ class MassSendLockGroupListPage extends StatefulWidget {
}
class _MassSendLockGroupListPageState extends State<MassSendLockGroupListPage> {
List lockGroupList = [];
// List selectGroupIdList = [];
List selectLockIdList = [];
// int clickIndex = -1;
final logic = Get.put(MassSendLockGroupListLogic());
final state = Get.find<MassSendLockGroupListLogic>().state;
@override
void initState() {
initState() {
super.initState();
mockNetworkDataRequest();
logic.mockNetworkDataRequest();
}
@override
@ -54,6 +51,41 @@ class _MassSendLockGroupListPageState extends State<MassSendLockGroupListPage> {
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Obx(() => Visibility(
visible: state.isVip.value ? false : true,
child: Container(
color: AppColors.vipFeatureBgColor,
padding: EdgeInsets.only(left: 20.w, right: 20.w),
height: 80.h,
child: Row(
children: [
Text('开通高级功能后才可以对锁进行管理'.tr,
style: TextStyle(
color: AppColors.vipFeatureBtnTextColor,
fontSize: 22.sp)),
Expanded(
child: SizedBox(
width: 10.w,
)),
SizedBox(
width: 150.w,
height: 46.h,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: AppColors.vipFeatureBtnBgColor,
),
onPressed: () {
Get.toNamed(Routers.advancedFeaturesWebPage);
},
child: Text(
'去开通',
style: TextStyle(
color: Colors.white, fontSize: 22.sp),
)),
)
],
),
))),
SizedBox(
height: 10.h,
),
@ -67,15 +99,21 @@ class _MassSendLockGroupListPageState extends State<MassSendLockGroupListPage> {
SizedBox(
height: 10.h,
),
Expanded(child: _buildListView(context, lockGroupList)),
SubmitBtn(
btnName: '确定'.tr,
onClick: () {
Map<String, dynamic> resultMap = {};
resultMap['selectLockIdList'] = selectLockIdList;
Navigator.pop(context, resultMap);
},
),
Expanded(
child: Obx(
() => _buildListView(context, state.lockGroupList.value))),
Obx(() => Visibility(
visible: state.isVip.value ? true : false,
child: SubmitBtn(
btnName: '确定'.tr,
onClick: () {
Map<String, dynamic> resultMap = {};
resultMap['selectLockIdList'] =
state.selectLockIdList.value;
Navigator.pop(context, resultMap);
},
),
)),
SizedBox(
height: 40.h,
)
@ -83,20 +121,6 @@ class _MassSendLockGroupListPageState extends State<MassSendLockGroupListPage> {
));
}
//
Future<List<GroupListItem>> mockNetworkDataRequest() async {
MassSendLockGroupListEntity entity = await ApiRepository.to.lockGroupList('2');
List<GroupListItem> dataList = [];
if (entity.errorCode!.codeIsSuccessful) {
if (entity.data != null) {
dataList = entity.data!.groupList!;
}
}
lockGroupList = dataList;
setState(() {});
return dataList;
}
Widget _buildListView(BuildContext context, List itemList) {
return ListView.separated(
itemCount: itemList.length,
@ -116,39 +140,39 @@ class _MassSendLockGroupListPageState extends State<MassSendLockGroupListPage> {
//
Widget _buildLockExpandedList(context, index, GroupListItem itemData) {
List lockItemList = itemData.lockList ?? [];
itemData.isVip = state.isVip.value;
return ExpandedListTile(
onTap: () {
// selectGroupIdList.add(index);
// clickIndex = index;
//
if (itemData.isChecked) {
var selectList = itemData.lockList;
for(LockListItem lockListItem in selectList!){
for (LockListItem lockListItem in selectList!) {
lockListItem.isChecked = true;
selectLockIdList.add(lockListItem.lockId);
state.selectLockIdList.value.add(lockListItem.lockId);
}
// lockItemList[selectIndex] =
}else{
} else {
var selectList = itemData.lockList;
for(LockListItem lockListItem in selectList!){
for (LockListItem lockListItem in selectList!) {
lockListItem.isChecked = false;
selectLockIdList.remove(lockListItem.lockId);
state.selectLockIdList.value.remove(lockListItem.lockId);
}
}
setState(() {});
},
typeImgList: const [],
groupItem: itemData,
child: massSendLockGroupCell(index, currentIndex: index, lockListByGroup: lockItemList, selectLockAction: (selectIndex, selectLockId) {
child: massSendLockGroupCell(index,
currentIndex: index,
lockListByGroup: lockItemList,
isVip: state.isVip.value,
selectLockAction: (selectIndex, selectLockId) {
LockListItem lockItem = lockItemList[selectIndex];
setState(() {
lockItem.isChecked = !lockItem.isChecked;
if (lockItem.isChecked) {
selectLockIdList.add(lockItem.lockId);
}
});
lockItem.isChecked = !lockItem.isChecked;
if (lockItem.isChecked) {
state.selectLockIdList.value.add(lockItem.lockId);
}
setState(() {});
}),
);
}
}

View File

@ -0,0 +1,7 @@
import 'package:get/get.dart';
class MassSendLockGroupListState {
var lockGroupList = [].obs;
var selectLockIdList = [].obs;
var isVip = false.obs;
}

View File

@ -69,8 +69,7 @@ class RecordItem {
int? cloudauthCount;
int? vipLockCount;
int? vipYear;
int? isApply;
String? money;
String? amount;
String? createdAt;
String? updatedAt;
@ -85,8 +84,7 @@ class RecordItem {
this.cloudauthCount,
this.vipLockCount,
this.vipYear,
this.isApply,
this.money,
this.amount,
this.createdAt,
this.updatedAt});
@ -101,8 +99,7 @@ class RecordItem {
cloudauthCount = json['cloudauth_count'];
vipLockCount = json['vip_lock_count'];
vipYear = json['vip_year'];
isApply = json['is_apply'];
money = json['money'];
amount = json['amount'];
createdAt = json['created_at'];
updatedAt = json['updated_at'];
}
@ -119,8 +116,7 @@ class RecordItem {
data['cloudauth_count'] = cloudauthCount;
data['vip_lock_count'] = vipLockCount;
data['vip_year'] = vipYear;
data['is_apply'] = isApply;
data['money'] = money;
data['amount'] = amount;
data['created_at'] = createdAt;
data['updated_at'] = updatedAt;
return data;

View File

@ -71,7 +71,7 @@ class _AdvancedFunctionRecordPageState
fontWeight: FontWeight.bold),
),
Expanded(child: Container()),
Text('${itemData.money}',
Text('${itemData.amount}',
style: TextStyle(
fontSize: 24.sp,
color: AppColors.blackColor,

View File

@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedServicesHighFunction_logic.dart';
import '../../../appRouters.dart';
@ -51,7 +50,7 @@ class _ValueAddedServicesHighFunctionPageState
],
),
),
_bottomBtn(),
// _bottomBtn(),
],
));
}
@ -86,7 +85,7 @@ class _ValueAddedServicesHighFunctionPageState
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"已开通".tr,
"当前状态:已开通".tr,
style: TextStyle(
fontSize: 24.sp, fontWeight: FontWeight.w600),
),
@ -151,7 +150,24 @@ class _ValueAddedServicesHighFunctionPageState
SizedBox(
height: 10.h,
),
Container(
GestureDetector(
onTap: () {},
child: Container(
margin: EdgeInsets.only(left: 20.w, right: 20.w),
decoration: BoxDecoration(
color: const Color(0xFFF5F5F5),
borderRadius: BorderRadius.circular(15.w),
),
child: Padding(
padding: EdgeInsets.only(
left: 20.w, top: 10.h, right: 20.w, bottom: 10.h),
child: Text(
'查看详情 >',
style: TextStyle(fontSize: 20.sp),
)),
),
),
SizedBox(
height: 1.sw,
child: GridView.count(
padding: EdgeInsets.all(10.h),

View File

@ -8,7 +8,7 @@ abstract class Api {
final String resetPasswordURL = '/user/resetPassword'; //
final String getCountryRegionURL = '/system/listCountry'; //
final String electronicKeyListURL = '/key/listUser'; //
final String sendElectronicKeyURL = '/key/send'; //
final String sendElectronicKeyURL = '/v2/key/send'; //
final String resetElectronicKeyURL = '/key/reset'; //
final String keyOperationRecordURL = '/lockRecords/list'; //
@ -55,7 +55,7 @@ abstract class Api {
final String setlockGroupURL = '/keyGroup/setGroup'; //
final String lockGroupListURL = '/authorizedAdmin/listGroup'; //
final String lockDeletGroupURL = '/keyGroup/delete'; //
final String lockGroupAddLockURL = '/keyGroup/addLockGroup'; //
final String lockGroupAddLockURL = '/v2/keyGroup/addLockGroup'; //
final String lockGroupDeletLockURL = '/keyGroup/deleteLockGroup'; //
final String listLockByGroupURL =
@ -65,7 +65,7 @@ abstract class Api {
// final String lockListByGroupURL = '/room/listByGroup'; //
final String getWifiServiceIpURL = '/wifiLock/getWifiServiceIp'; // Wifi锁服务器
final String updateLockSettingUrl =
'/lockSetting/updateLockSetting'; //
'/v2/lockSetting/updateLockSetting'; //
final String roomQueryDateUrl = '/room/queryDate'; //
final String lockDiagnoseUrl = '/room/uploadLockInfo'; //

View File

@ -68,6 +68,7 @@ class _ExpandedListTileState extends State<ExpandedListTile> {
: "images/icon_round_unSelect.png",
width: 30.w,
height: 30.w,
color: widget.groupItem.isVip ? AppColors.mainColor : Colors.grey,
),
SizedBox(
width: 20.w,
@ -76,6 +77,9 @@ class _ExpandedListTileState extends State<ExpandedListTile> {
),
),
onTap: () {
if (widget.groupItem.isVip == false) {
return;
}
//
setState(() {
_isCheck = !_isCheck;