feat: 增加门禁管理页

This commit is contained in:
liyi 2025-09-19 15:05:08 +08:00
parent e09eddd6f5
commit b176893a39
20 changed files with 828 additions and 59 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -63,5 +63,7 @@ class AppImages{
static const String iconNotificationSelected = 'assets/icon/bar/notification_selected.png';
static const String iconMine = 'assets/icon/bar/mine.png';
static const String iconMineSelected = 'assets/icon/bar/mine_selected.png';
static const String iconAccessControl = 'assets/icon/bar/access_control.png';
static const String iconAccessControlSelected = 'assets/icon/bar/access_control_selected.png';
}

View File

@ -8,6 +8,7 @@ class CustomAppBarWidget extends StatelessWidget implements PreferredSizeWidget
final bool centerTitle;
final Color? backgroundColor;
final double? elevation;
final bool? showBackButton;
const CustomAppBarWidget({
super.key,
@ -17,6 +18,7 @@ class CustomAppBarWidget extends StatelessWidget implements PreferredSizeWidget
this.centerTitle = true,
this.backgroundColor = Colors.white,
this.elevation,
this.showBackButton = true,
});
@override
@ -32,9 +34,10 @@ class CustomAppBarWidget extends StatelessWidget implements PreferredSizeWidget
),
),
actions: actions,
automaticallyImplyLeading: this.showBackButton ?? true,
// leading来决定使用什么
leading: leading ??
(showBackButton
(showBackButton && this.showBackButton == true
? IconButton(
icon: const Icon(Icons.arrow_back_ios_new_rounded),
onPressed: () => Navigator.of(context).pop(),

View File

@ -1,5 +1,7 @@
import 'package:get/get.dart';
import 'package:starwork_flutter/routes/app_routes.dart';
import 'package:starwork_flutter/views/accessControlManage/access_control_manage_binding.dart';
import 'package:starwork_flutter/views/accessControlManage/access_control_manage_view.dart';
import 'package:starwork_flutter/views/device/confirmPairDevice/confirm_pair_device_binding.dart';
import 'package:starwork_flutter/views/device/confirmPairDevice/confirm_pair_device_view.dart';
import 'package:starwork_flutter/views/device/deviceBasisInfo/device_basis_info_binding.dart';
@ -179,5 +181,10 @@ class AppPages {
page: () => VolumeSettingView(),
binding: VolumeSettingBinding(),
),
GetPage(
name: AppRoutes.accessControlManage,
page: () => AccessControlManageView(),
binding: AccessControlManageBinding(),
),
];
}

View File

@ -25,4 +25,5 @@ class AppRoutes{
static const String deviceBasisInfo = '/device/deviceBasisInfo';
static const String deviceSettingAutoCloseLock = '/device/deviceSetting/autoCloseLock';
static const String deviceSettingVolumeSetting = '/device/deviceSetting/volumeSetting';
static const String accessControlManage = '/home/accessControlManage';
}

View File

@ -0,0 +1,9 @@
import 'package:get/get.dart';
import 'package:starwork_flutter/views/accessControlManage/accessControl/access_control_controller.dart';
class AccessControlBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => AccessControlController());
}
}

View File

@ -0,0 +1,8 @@
import 'package:flutter/widgets.dart';
import 'package:starwork_flutter/base/base_controller.dart';
class AccessControlController extends BaseController{
//
TextEditingController searchInputController = TextEditingController();
}

View File

@ -0,0 +1,182 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:starwork_flutter/common/constant/app_colors.dart';
import 'package:starwork_flutter/common/constant/app_images.dart';
import 'package:starwork_flutter/common/widgets/custome_app_bar_wdiget.dart';
import 'package:starwork_flutter/views/accessControlManage/accessControl/access_control_controller.dart';
class AccessControlView extends GetView<AccessControlController> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.scaffoldBackgroundColor,
appBar: CustomAppBarWidget(
title: '门禁控制'.tr,
showBackButton: false,
backgroundColor: AppColors.scaffoldBackgroundColor,
),
body: SafeArea(
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: 10.w,
vertical: 10.h,
),
child: Column(
children: [
_buildSearchBar(),
SizedBox(
height: 10.h,
),
_buildList(),
],
),
),
),
);
}
_buildSearchBar() {
return TextField(
controller: controller.searchInputController,
textInputAction: TextInputAction.search,
decoration: InputDecoration(
hintText: '输入门禁点名称搜索'.tr,
hintStyle: TextStyle(
fontSize: 14.sp,
color: const Color(0xFF999999),
),
prefixIcon: const Icon(
Icons.search,
color: Color(0xFF999999),
),
filled: true,
//
fillColor: const Color(0xFFf0f0f0),
//
border: InputBorder.none,
//
contentPadding: EdgeInsets.symmetric(horizontal: 6.w, vertical: 6.h),
focusedBorder: OutlineInputBorder(
borderSide: const BorderSide(
color: Colors.blue,
width: 1.5,
),
borderRadius: BorderRadius.circular(8.0.r),
),
enabledBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.transparent),
borderRadius: BorderRadius.circular(8.0.r),
),
),
);
}
_buildList() {
return GridView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 2.2,
mainAxisSpacing: 10.0.w,
crossAxisSpacing: 10.0.h,
),
itemCount: 5,
itemBuilder: (context, index) {
return _buildItem();
},
);
}
_buildItem() {
return Stack(
children: [
Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8.0.r),
),
padding: EdgeInsets.symmetric(
horizontal: 10.w,
vertical: 10.h,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image(
image: const AssetImage(AppImages.iconLockTypeDoorLock),
width: 20.w,
height: 20.w,
fit: BoxFit.contain,
gaplessPlayback: true,
//
filterQuality: FilterQuality.medium,
//
errorBuilder: (context, error, stackTrace) {
return Icon(
Icons.image_not_supported,
size: 26.sp,
color: Colors.grey,
);
},
),
SizedBox(
height: 10.h,
),
Text('设备昵称')
],
),
Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(
Radius.circular(20.r),
),
border: Border.all(
color: Colors.grey.shade200,
width: 3.0,
),
),
padding: const EdgeInsets.all(5.0),
child: Icon(
Icons.key,
color: Colors.grey,
size: 18.sp,
),
)
],
),
),
Positioned(
top: 0,
right: 0,
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 6.w,
vertical: 2.h,
),
decoration: BoxDecoration(
color: Colors.green,
borderRadius: BorderRadius.only(
topRight: Radius.circular(8.0.r),
bottomLeft: Radius.circular(8.0.r),
),
),
child: Text(
'在线 '.tr,
style: TextStyle(
color: Colors.white,
fontSize: 8.sp,
fontWeight: FontWeight.w500,
),
),
),
)
],
);
}
}

View File

@ -0,0 +1,9 @@
import 'package:get/get.dart';
import 'package:starwork_flutter/views/accessControlManage/accessControlManageHome/access_control_manage_home_controller.dart';
class AccessControlManageHomeBinding implements Bindings {
@override
void dependencies() {
Get.lazyPut(() => AccessControlManageHomeController());
}
}

View File

@ -0,0 +1,5 @@
import 'package:starwork_flutter/base/base_controller.dart';
class AccessControlManageHomeController extends BaseController{
}

View File

@ -0,0 +1,411 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:starwork_flutter/common/constant/app_colors.dart';
import 'package:starwork_flutter/common/constant/app_images.dart';
import 'package:starwork_flutter/common/widgets/custome_app_bar_wdiget.dart';
import 'package:starwork_flutter/routes/app_routes.dart';
import 'package:starwork_flutter/views/accessControlManage/accessControlManageHome/access_control_manage_home_controller.dart';
class AccessControlManageHomeView extends GetView<AccessControlManageHomeController> {
const AccessControlManageHomeView({super.key});
@override
Widget build(BuildContext context) {
//
final Map<String, List<Map<String, dynamic>>> functionData = {
'门禁管理': [
{'icon': AppImages.iconAccessManagement, 'title': '人员管理', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconAccessAuthorization, 'title': '门禁授权', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconTrafficRecord, 'title': '通行记录', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconVisitorManagement, 'title': '消息订阅', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconMyVisitor, 'title': '门自动常开', 'route': AppRoutes.accessControlManage},
],
};
final List<Map<String, dynamic>> moreApplications = [
{'subtitle': '访客人员,临时通行', 'title': '访客', 'route': AppRoutes.accessControlManage},
{'subtitle': '广告、欢迎词发布到屏幕', 'title': '信息发布', 'route': AppRoutes.accessControlManage},
{'subtitle': '预约随需应变,灵活管理', 'title': '预约管理', 'route': AppRoutes.accessControlManage},
];
final currentFunctions = functionData['门禁管理'] ?? [];
return Scaffold(
backgroundColor: AppColors.scaffoldBackgroundColor,
body: SafeArea(
child: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: 10.w,
vertical: 10.h,
),
child: Column(
children: [
Container(
padding: EdgeInsets.symmetric(
horizontal: 10.w,
),
width: 1.sw,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Transform(
transform: Matrix4.skewX(-0.1), // 👈
child: Text(
'门禁开局引导'.tr,
style: TextStyle(
fontSize: 24.sp,
fontWeight: FontWeight.w600,
fontFamily: 'PingFangSC',
// italic
// fontStyle: FontStyle.italic,
),
),
),
TextButton(
onPressed: () {
controller.showFunctionNotOpen();
},
style: TextButton.styleFrom(
padding: EdgeInsets.symmetric(
horizontal: 4.w,
vertical: 8.h,
), //
minimumSize: const Size(0, 0), //
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
'点击查看'.tr,
style: TextStyle(
fontSize: 14.sp,
fontWeight: FontWeight.w400,
color: Colors.blue,
),
),
Icon(
Icons.arrow_forward,
size: 16.sp,
color: Colors.blue,
)
],
),
),
],
),
),
Container(
padding: EdgeInsets.symmetric(
horizontal: 10.w,
vertical: 10.h,
),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8.r),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Column(
children: [
Text(
'1',
style: TextStyle(
fontSize: 14.sp,
fontWeight: FontWeight.w500,
),
),
SizedBox(
height: 10.h,
),
Text(
'团队人员',
style: TextStyle(
fontSize: 14.sp,
color: Colors.grey,
),
)
],
),
Column(
children: [
Text(
'1',
style: TextStyle(
fontSize: 14.sp,
),
),
SizedBox(
height: 10.h,
),
Text(
'团队人员',
style: TextStyle(
fontSize: 14.sp,
color: Colors.grey,
),
)
],
),
Column(
children: [
Text(
'1',
style: TextStyle(
fontSize: 14.sp,
),
),
SizedBox(
height: 10.h,
),
Text(
'团队人员',
style: TextStyle(
fontSize: 14.sp,
color: Colors.grey,
),
)
],
)
],
),
),
SizedBox(height: 10.h),
Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8.r),
),
padding: EdgeInsets.symmetric(
horizontal: 10.w,
vertical: 10.h,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
textBaseline: TextBaseline.alphabetic,
children: [
Row(
children: [
Icon(
Icons.circle,
size: 6.sp,
color: Colors.red,
),
SizedBox(
width: 6.w,
),
const Text(
'您有1个人员、1条信息未同步到设备',
style: TextStyle(
color: Colors.black,
),
),
],
),
Icon(
Icons.arrow_forward_ios_rounded,
size: 16.sp,
color: Colors.grey,
)
],
),
),
SizedBox(height: 10.h),
Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8.r),
),
padding: EdgeInsets.symmetric(
horizontal: 10.w,
vertical: 10.h,
),
child: GridView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
childAspectRatio: 1.4,
),
itemCount: currentFunctions.length,
itemBuilder: (context, index) {
final function = currentFunctions[index];
return _buildFunctionItem(
icon: function['icon'],
title: function['title'],
routePath: function['route'],
);
},
),
),
SizedBox(height: 10.h),
Container(
width: double.infinity,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8.r),
),
padding: EdgeInsets.symmetric(
horizontal: 10.w,
vertical: 10.h,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'更多应用'.tr,
),
SizedBox(height: 10.h),
GridView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 2.8,
mainAxisSpacing: 10.0.w,
crossAxisSpacing: 10.0.h,
),
itemCount: moreApplications.length,
itemBuilder: (context, index) {
final function = moreApplications[index];
return _buildMoreApplicationsItem(
subtitle: function['subtitle'],
title: function['title'],
routePath: function['route'],
);
},
),
],
),
)
],
),
),
),
),
);
}
Widget _buildFunctionItem({required dynamic icon, required String title, required String routePath}) {
return GestureDetector(
onTap: () {
Get.toNamed(routePath);
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min, // Column最小化
children: [
//
icon is String
? _buildOptimizedImage(icon)
: Icon(
icon,
size: 26.sp,
color: Colors.blue.shade600,
),
SizedBox(height: 4.h), //
Flexible(
// 使Flexible而不是Expanded
child: Text(
title,
style: TextStyle(
fontSize: 10.sp, //
color: Colors.black87,
fontWeight: FontWeight.w400,
),
textAlign: TextAlign.center,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
],
),
);
}
Widget _buildOptimizedImage(String imagePath) {
return RepaintBoundary(
child: Image(
image: AssetImage(imagePath),
width: 26.w,
height: 26.w,
fit: BoxFit.contain,
gaplessPlayback: true,
//
filterQuality: FilterQuality.medium,
//
errorBuilder: (context, error, stackTrace) {
return Icon(
Icons.image_not_supported,
size: 26.sp,
color: Colors.grey,
);
},
),
);
}
Widget _buildMoreApplicationsItem({
required subtitle,
required title,
required routePath,
}) {
return GestureDetector(
onTap: () {
Get.toNamed(routePath);
},
child: Container(
decoration: BoxDecoration(
color: Colors.grey[50],
borderRadius: BorderRadius.circular(8.r),
),
padding: EdgeInsets.symmetric(
horizontal: 10.w,
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
title,
style: TextStyle(
fontSize: 12.sp,
color: Colors.black87,
fontWeight: FontWeight.w500,
),
textAlign: TextAlign.center,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
Icon(
Icons.play_circle_outline_rounded,
size: 16.sp,
color: Colors.grey,
)
],
),
Text(
subtitle,
style: TextStyle(
fontSize: 10.sp,
color: Colors.grey,
fontWeight: FontWeight.w400,
),
textAlign: TextAlign.center,
maxLines: 1,
overflow: TextOverflow.ellipsis,
)
],
),
),
);
}
}

View File

@ -0,0 +1,14 @@
import 'package:get/get.dart';
import 'package:starwork_flutter/base/base_controller.dart';
import 'package:starwork_flutter/views/accessControlManage/accessControl/access_control_controller.dart';
import 'package:starwork_flutter/views/accessControlManage/accessControlManageHome/access_control_manage_home_controller.dart';
import 'package:starwork_flutter/views/accessControlManage/access_control_manage_controller.dart';
class AccessControlManageBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => AccessControlManageController());
Get.lazyPut(() => AccessControlManageHomeController());
Get.lazyPut(() => AccessControlController());
}
}

View File

@ -0,0 +1,24 @@
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';
import 'package:starwork_flutter/base/base_controller.dart';
import 'package:starwork_flutter/views/accessControlManage/accessControl/access_control_view.dart';
import 'package:starwork_flutter/views/accessControlManage/accessControlManageHome/access_control_manage_home_view.dart';
import 'package:starwork_flutter/views/home/home_view.dart';
import 'package:starwork_flutter/views/messages/messages_view.dart';
import 'package:starwork_flutter/views/mine/mine_view.dart';
class AccessControlManageController extends BaseController {
//
var currentIndex = 0.obs;
//
final pages = [
AccessControlManageHomeView(),
AccessControlView(),
];
//
void changeIndex(int index) {
currentIndex.value = index;
}
}

View File

@ -0,0 +1,61 @@
import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:starwork_flutter/common/constant/app_colors.dart';
import 'package:starwork_flutter/common/constant/app_images.dart';
import 'package:starwork_flutter/common/widgets/custome_app_bar_wdiget.dart';
import 'package:starwork_flutter/views/accessControlManage/access_control_manage_controller.dart';
import 'package:starwork_flutter/views/main/widget/main_left_drawer_widget.dart';
class AccessControlManageView extends GetView<AccessControlManageController> {
@override
Widget build(BuildContext context) {
return Scaffold(
// 使 Obx currentIndex
body: Obx(
() => IndexedStack(
index: controller.currentIndex.value,
children: controller.pages,
),
),
bottomNavigationBar: Obx(
() => BottomNavigationBar(
currentIndex: controller.currentIndex.value,
onTap: (index) => controller.changeIndex(index),
items: bottomNavItems,
type: BottomNavigationBarType.fixed,
// 3 fixed
selectedFontSize: 12.sp,
unselectedFontSize: 12.sp,
),
),
);
}
//
List<BottomNavigationBarItem> get bottomNavItems => [
BottomNavigationBarItem(
icon: _buildTabIcon(AppImages.iconHome, AppImages.iconHomeSelected, 0),
label: '首页',
),
BottomNavigationBarItem(
icon: _buildTabIcon(AppImages.iconAccessControl, AppImages.iconAccessControlSelected, 1),
label: '门禁控制',
),
];
//
Widget _buildTabIcon(String unselectedIcon, String selectedIcon, int index) {
return Obx(
() => Image.asset(
controller.currentIndex.value == index ? selectedIcon : unselectedIcon,
width: 24.w,
height: 24.w,
fit: BoxFit.contain,
),
);
}
}

View File

@ -24,6 +24,7 @@ class DeviceManageView extends GetView<DeviceManageController> {
backgroundColor: AppColors.scaffoldBackgroundColor,
appBar: CustomAppBarWidget(
title: '设备管理'.tr,
showBackButton: false,
),
body: SafeArea(
child: Padding(

View File

@ -3,6 +3,7 @@ import 'package:get/get_rx/get_rx.dart';
import 'package:starcloud/entity/star_cloud_lock_list.dart';
import 'package:starcloud/net/entity/api_response.dart';
import 'package:starcloud/sdk/entity/entity_sender/enable_lock_settings.dart';
import 'package:starcloud/sdk/sdk_lock_operate_extension.dart';
import 'package:starcloud/sdk/sdk_lock_setting_operate_extension.dart';
import 'package:starcloud/sdk/starcloud.dart';
@ -12,6 +13,7 @@ import 'package:starwork_flutter/common/constant/app_view_parameter_keys.dart';
import 'package:starwork_flutter/common/constant/lock_function_number.dart';
import 'package:starwork_flutter/common/events/refresh_device_list_event.dart';
import 'package:starwork_flutter/common/utils/event_bus_util.dart';
import 'package:starwork_flutter/views/main/main_controller.dart';
class DeviceSettingController extends BaseController {
//
@ -24,6 +26,8 @@ class DeviceSettingController extends BaseController {
final lockFeatureMap = <String, dynamic>{}.obs;
final lockSettingMap = <String, dynamic>{}.obs;
final mainController = Get.find<MainController>();
@override
void onReady() {
super.onReady();
@ -99,4 +103,29 @@ class DeviceSettingController extends BaseController {
},
);
}
void removeDevice() async {
showLoading();
var teamInfo = mainController.selectedTeam.value;
var teamCloudInfo = teamInfo.teamCloudInfo;
if (teamCloudInfo == null) {
showToast('没找到对应的星云账户信息');
hideLoading();
return;
}
await StarCloudSDK.instance.resetLock(
lockId: lockInfo?.lockId ?? 0,
cloudUid: teamCloudInfo.uid,
onSuccess: () {
showSuccess();
EventBusUtil().instance.fire(RefreshDeviceListEvent());
Get.back();
},
onError: (err) {
hideLoading();
},
);
}
}

View File

@ -195,7 +195,9 @@ class DeviceSettingView extends GetView<DeviceSettingController> {
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: () {}.debounce(),
onPressed: () {
controller.removeDevice();
}.debounce(),
style: ElevatedButton.styleFrom(
backgroundColor: Colors.red,
padding: EdgeInsets.symmetric(vertical: 12.h),

View File

@ -2,18 +2,18 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:starwork_flutter/common/constant/app_images.dart';
import 'package:starwork_flutter/routes/app_routes.dart';
class HomeFunctionListAreaWidget extends StatefulWidget {
HomeFunctionListAreaWidget({super.key});
@override
State<HomeFunctionListAreaWidget> createState() =>
_HomeFunctionListAreaWidgetState();
State<HomeFunctionListAreaWidget> createState() => _HomeFunctionListAreaWidgetState();
}
class _HomeFunctionListAreaWidgetState extends State<HomeFunctionListAreaWidget>
with SingleTickerProviderStateMixin {
class _HomeFunctionListAreaWidgetState extends State<HomeFunctionListAreaWidget> with SingleTickerProviderStateMixin {
late TabController _tabController;
// Map
@ -162,7 +162,7 @@ class _HomeFunctionListAreaWidgetState extends State<HomeFunctionListAreaWidget>
print('菜单被点击');
},
child: Image(
image: AssetImage(AppImages.iconTableMenu),
image: AssetImage(AppImages.iconTableMenu),
width: 20.w,
height: 20.w,
fit: BoxFit.contain,
@ -197,64 +197,64 @@ class _HomeFunctionListAreaWidgetState extends State<HomeFunctionListAreaWidget>
//
final Map<String, List<Map<String, dynamic>>> functionData = {
'人员通行': [
{'icon': AppImages.iconAccessManagement, 'title': '门禁管理'},
{'icon': AppImages.iconAccessAuthorization, 'title': '门禁授权'},
{'icon': AppImages.iconOneClickOpenDoor, 'title': '一键开门'},
{'icon': AppImages.iconPasswordOpenDoor, 'title': '密码开门'},
{'icon': AppImages.iconTrafficRecord, 'title': '通行记录'},
{'icon': AppImages.iconVisitorManagement, 'title': '访客管理'},
{'icon': AppImages.iconMyVisitor, 'title': '我的访客'},
{'icon': AppImages.iconVisitorInvitation, 'title': '访客邀约'},
{'icon': AppImages.iconAccessManagement, 'title': '门禁管理', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconAccessAuthorization, 'title': '门禁授权', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconOneClickOpenDoor, 'title': '一键开门', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconPasswordOpenDoor, 'title': '密码开门', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconTrafficRecord, 'title': '通行记录', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconVisitorManagement, 'title': '访客管理', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconMyVisitor, 'title': '我的访客', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconVisitorInvitation, 'title': '访客邀约', 'route': AppRoutes.accessControlManage},
],
'考勤': [
{'icon': AppImages.iconAttendanceSetting, 'title': '考勤设置'},
{'icon': AppImages.iconAttendanceStatistics, 'title': '考勤统计'},
{'icon': AppImages.iconMyAttendance, 'title': '我的考勤'},
{'icon': AppImages.iconMobileCheckin, 'title': '手机打卡'},
{'icon': AppImages.iconLeaveRequest, 'title': '请假'},
{'icon': AppImages.iconMakeUpCard, 'title': '补卡'},
{'icon': AppImages.iconBusinessTrip, 'title': '出差'},
{'icon': AppImages.iconGoOut, 'title': '外出'},
{'icon': AppImages.iconAttendanceSetting, 'title': '考勤设置', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconAttendanceStatistics, 'title': '考勤统计', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconMyAttendance, 'title': '我的考勤', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconMobileCheckin, 'title': '手机打卡', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconLeaveRequest, 'title': '请假', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconMakeUpCard, 'title': '补卡', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconBusinessTrip, 'title': '出差', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconGoOut, 'title': '外出', 'route': AppRoutes.accessControlManage},
],
'审批': [
{'icon': AppImages.iconInitiateApproval, 'title': '发起审批'},
{'icon': AppImages.iconApprovalRecord, 'title': '审批记录'},
{'icon': Icons.pending, 'title': '审批中'},
{'icon': Icons.history, 'title': '审批历史'},
{'icon': Icons.rule, 'title': '审批规则'},
{'icon': Icons.group, 'title': '审批流程'},
{'icon': Icons.notifications, 'title': '审批提醒'},
{'icon': Icons.analytics, 'title': '审批统计'},
{'icon': AppImages.iconInitiateApproval, 'title': '发起审批', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconApprovalRecord, 'title': '审批记录', 'route': AppRoutes.accessControlManage},
{'icon': Icons.pending, 'title': '审批中', 'route': AppRoutes.accessControlManage},
{'icon': Icons.history, 'title': '审批历史', 'route': AppRoutes.accessControlManage},
{'icon': Icons.rule, 'title': '审批规则', 'route': AppRoutes.accessControlManage},
{'icon': Icons.group, 'title': '审批流程', 'route': AppRoutes.accessControlManage},
{'icon': Icons.notifications, 'title': '审批提醒', 'route': AppRoutes.accessControlManage},
{'icon': Icons.analytics, 'title': '审批统计', 'route': AppRoutes.accessControlManage},
],
'可视对讲': [
{'icon': AppImages.iconIntercomDevice, 'title': '对讲设备'},
{'icon': AppImages.iconCallRelationship, 'title': '呼叫关系'},
{'icon': AppImages.iconCallReminder, 'title': '呼叫提醒'},
{'icon': Icons.video_call, 'title': '视频通话'},
{'icon': Icons.volume_up, 'title': '广播通知'},
{'icon': Icons.settings_phone, 'title': '设备设置'},
{'icon': Icons.group_add, 'title': '群组管理'},
{'icon': Icons.emergency, 'title': '紧急呼叫'},
{'icon': AppImages.iconIntercomDevice, 'title': '对讲设备', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconCallRelationship, 'title': '呼叫关系', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconCallReminder, 'title': '呼叫提醒', 'route': AppRoutes.accessControlManage},
{'icon': Icons.video_call, 'title': '视频通话', 'route': AppRoutes.accessControlManage},
{'icon': Icons.volume_up, 'title': '广播通知', 'route': AppRoutes.accessControlManage},
{'icon': Icons.settings_phone, 'title': '设备设置', 'route': AppRoutes.accessControlManage},
{'icon': Icons.group_add, 'title': '群组管理', 'route': AppRoutes.accessControlManage},
{'icon': Icons.emergency, 'title': '紧急呼叫', 'route': AppRoutes.accessControlManage},
],
'信息发布': [
{'icon': AppImages.iconBroadcast, 'title': '广播'},
{'icon': AppImages.iconAnnouncement, 'title': '公告'},
{'icon': AppImages.iconInfoPublish, 'title': '信息发布'},
{'icon': Icons.schedule_send, 'title': '定时发布'},
{'icon': Icons.group, 'title': '目标群体'},
{'icon': Icons.analytics, 'title': '发布统计'},
{'icon': Icons.edit, 'title': '编辑模板'},
{'icon': Icons.history, 'title': '发布历史'},
{'icon': AppImages.iconBroadcast, 'title': '广播', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconAnnouncement, 'title': '公告', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconInfoPublish, 'title': '信息发布', 'route': AppRoutes.accessControlManage},
{'icon': Icons.schedule_send, 'title': '定时发布', 'route': AppRoutes.accessControlManage},
{'icon': Icons.group, 'title': '目标群体', 'route': AppRoutes.accessControlManage},
{'icon': Icons.analytics, 'title': '发布统计', 'route': AppRoutes.accessControlManage},
{'icon': Icons.edit, 'title': '编辑模板', 'route': AppRoutes.accessControlManage},
{'icon': Icons.history, 'title': '发布历史', 'route': AppRoutes.accessControlManage},
],
'其他应用': [
{'icon': AppImages.iconPersonnelManagement, 'title': '人员管理'},
{'icon': AppImages.iconTeamQrcode, 'title': '团队二维码'},
{'icon': AppImages.iconDeviceManagement, 'title': '设备管理'},
{'icon': AppImages.iconVideoCenter, 'title': '视频中心'},
{'icon': AppImages.iconIntelligentInspection, 'title': '智能巡检'},
{'icon': AppImages.iconVideoSearch, 'title': '录像智搜'},
{'icon': AppImages.iconIntelligentAnalysis, 'title': '智能分析'},
{'icon': AppImages.iconPersonCapture, 'title': '人员抓拍'},
{'icon': AppImages.iconPersonnelManagement, 'title': '人员管理', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconTeamQrcode, 'title': '团队二维码', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconDeviceManagement, 'title': '设备管理', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconVideoCenter, 'title': '视频中心', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconIntelligentInspection, 'title': '智能巡检', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconVideoSearch, 'title': '录像智搜', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconIntelligentAnalysis, 'title': '智能分析', 'route': AppRoutes.accessControlManage},
{'icon': AppImages.iconPersonCapture, 'title': '人员抓拍', 'route': AppRoutes.accessControlManage},
],
};
@ -267,7 +267,7 @@ class _HomeFunctionListAreaWidgetState extends State<HomeFunctionListAreaWidget>
return GridView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
childAspectRatio: 1.4,
),
@ -277,6 +277,7 @@ class _HomeFunctionListAreaWidgetState extends State<HomeFunctionListAreaWidget>
return _buildFunctionItem(
icon: function['icon'],
title: function['title'],
routePath: function['route'],
);
},
);
@ -285,11 +286,10 @@ class _HomeFunctionListAreaWidgetState extends State<HomeFunctionListAreaWidget>
);
}
Widget _buildFunctionItem({required dynamic icon, required String title}) {
Widget _buildFunctionItem({required dynamic icon, required String title, required String routePath}) {
return GestureDetector(
onTap: () {
print('点击了: $title');
//
Get.toNamed(routePath);
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,

View File

@ -216,6 +216,7 @@ class MainController extends BaseController {
}
void _requestTeamDeviceList() async {
if (selectedTeam.value.teamCloudInfo == null) return;
showLoading();
await StarCloudSDK.instance.getDeviceList(
pageNo: 1,