diff --git a/lib/api/api_path.dart b/lib/api/api_path.dart index 2b8d92c..bf193cd 100644 --- a/lib/api/api_path.dart +++ b/lib/api/api_path.dart @@ -2,4 +2,7 @@ class ApiPath { static const String sendValidationCode = "/v1/common/sendValidationCode"; static const String validationCodeLogin = "/v1/user/codeLogin"; static const String passwordLogin = "/v1/user/pwdLogin"; + static const String allTeamList = "/v1/team/teamListAll"; + static const String sceneList = "/v1/team/sceneList"; + static const String createTeam = "/v1/team/createTeam"; } diff --git a/lib/api/base_api_service.dart b/lib/api/base_api_service.dart index cd47f53..3f368e1 100644 --- a/lib/api/base_api_service.dart +++ b/lib/api/base_api_service.dart @@ -1,7 +1,11 @@ import 'package:dio/dio.dart' as dioAlias; +import 'package:dio/dio.dart'; import 'package:starwork_flutter/api/api_response.dart'; +import 'package:starwork_flutter/base/app_logger.dart'; +import 'package:starwork_flutter/common/constant/cache_keys.dart'; import 'package:starwork_flutter/common/constant/http_constant.dart'; +import 'package:starwork_flutter/common/utils/shared_preferences_utils.dart'; import 'package:starwork_flutter/flavors.dart'; import 'package:flutter/foundation.dart'; // 用于 debugPrint @@ -12,6 +16,27 @@ class BaseApiService { dio.options.baseUrl = F.apiHost; dio.options.connectTimeout = const Duration(seconds: 30); dio.options.receiveTimeout = const Duration(seconds: 30); + // 添加拦截器 + dio.interceptors.add(InterceptorsWrapper( + onRequest: (options, handler) { + var token = SharedPreferencesUtils.getString(CacheKeys.token); + AppLogger.info('token:${token}'); + if (token != null) { + options.headers['Authorization'] = 'Bearer $token'; + } + + /// 请求拦截器 + return handler.next(options); + }, + onResponse: (response, handler) { + /// 响应拦截器 + return handler.next(response); + }, + onError: (DioError e, handler) { + // 异常拦截器 + return handler.next(e); + }, + )); } /// 统一请求方法 diff --git a/lib/api/model/team/request/create_team_request.dart b/lib/api/model/team/request/create_team_request.dart new file mode 100644 index 0000000..250e545 --- /dev/null +++ b/lib/api/model/team/request/create_team_request.dart @@ -0,0 +1,32 @@ +class CreateTeamRequest { + final String teamName; + final int scene; + final String sceneCustomName; + + CreateTeamRequest({ + required this.teamName, + required this.scene, + this.sceneCustomName = '', + }); + + factory CreateTeamRequest.fromJson(Map json) { + return CreateTeamRequest( + teamName: json['teamName'] as String, + scene: json['scene'] as int, + sceneCustomName: json['sceneCustomName'] as String, + ); + } + + Map toJson() { + return { + 'teamName': teamName, + 'scene': scene, + 'sceneCustomName': sceneCustomName, + }; + } + + @override + String toString() { + return 'CreateTeamRequest{teamName: $teamName, scene: $scene, sceneCustomName: $sceneCustomName}'; + } +} diff --git a/lib/api/model/team/response/all_team_list_response.dart b/lib/api/model/team/response/all_team_list_response.dart new file mode 100644 index 0000000..d6cd21c --- /dev/null +++ b/lib/api/model/team/response/all_team_list_response.dart @@ -0,0 +1,42 @@ +import 'package:starwork_flutter/api/model/team/response/team_info_response.dart'; + +class AllTeamListResponse { + final List? myTeam; // 我的团队列表(可为空) + final List? pendTeam; // 待加入团队列表(可为空) + + AllTeamListResponse({ + this.myTeam, + this.pendTeam, + }); + + /// 从 JSON 创建对象 + factory AllTeamListResponse.fromJson(Map json) { + List parseTeamList(dynamic list) { + if (list == null) return []; + if (list is! List) return []; + return list + .where((item) => item != null) + .map((item) => TeamInfoResponse.fromJson(item as Map)) + .toList(); + } + + return AllTeamListResponse( + myTeam: parseTeamList(json['myTeam']), + pendTeam: parseTeamList(json['pendTeam']), + ); + } + + /// 转换为 JSON + Map toJson() { + return { + 'myTeam': myTeam?.map((e) => e.toJson()).toList(), + 'pendTeam': pendTeam?.map((e) => e.toJson()).toList(), + }; + } + + /// 字符串表示 + @override + String toString() { + return 'AllTeamListResponse{myTeam: $myTeam, pendTeam: $pendTeam}'; + } +} \ No newline at end of file diff --git a/lib/api/model/team/response/create_team_response.dart b/lib/api/model/team/response/create_team_response.dart new file mode 100644 index 0000000..c3989e3 --- /dev/null +++ b/lib/api/model/team/response/create_team_response.dart @@ -0,0 +1,19 @@ +class CreateTeamResponse { + final String? teamNo; + + CreateTeamResponse({ + this.teamNo, + }); + + factory CreateTeamResponse.fromJson(Map json) { + return CreateTeamResponse( + teamNo: json['teamNo'] as String?, + ); + } + + Map toJson() { + return { + 'teamNo': teamNo, + }; + } +} diff --git a/lib/api/model/team/response/scene_info_response.dart b/lib/api/model/team/response/scene_info_response.dart new file mode 100644 index 0000000..3c5f958 --- /dev/null +++ b/lib/api/model/team/response/scene_info_response.dart @@ -0,0 +1,52 @@ +class SceneInfoResponse { + final int? id; + final String? name; + final int? isManual; + final int? sort; + + SceneInfoResponse({this.id, this.name, this.isManual, this.sort}); + + factory SceneInfoResponse.fromJson(Map json) { + return SceneInfoResponse( + id: json['id'], + name: json['name'], + isManual: json['isManual'], + sort: json['sort'], + ); + } + + Map toJson() { + return { + 'id': id, + 'name': name, + 'isManual': isManual, + 'sort': sort, + }; + } + + @override + String toString() { + return 'SceneInfoResponse{id: $id, name: $name, isManual: $isManual, sort: $sort}'; + } +} + +class SceneInfoResponseList { + final List list; + + SceneInfoResponseList({required this.list}); + + factory SceneInfoResponseList.fromJson(List jsonList) { + return SceneInfoResponseList( + list: jsonList.map((item) => SceneInfoResponse.fromJson(item as Map)).toList(), + ); + } + + List> toJson() { + return list.map((item) => item.toJson()).toList(); + } + + @override + String toString() { + return 'SceneInfoResponseList{list: $list}'; + } +} diff --git a/lib/api/model/team/response/team_info_response.dart b/lib/api/model/team/response/team_info_response.dart new file mode 100644 index 0000000..8a53ef3 --- /dev/null +++ b/lib/api/model/team/response/team_info_response.dart @@ -0,0 +1,57 @@ +class TeamInfoResponse { + final int? id; // 团队ID + final String? teamNo; // 团队编号 + final String? teamName; // 团队名称 + final String? teamCode; // 团队邀请码 + final int? scene; // 场景ID + final String? sceneCustomName; // 其他场景名称 + final String? personNo; // 人员编号 + final bool? isOwner; // 是否我的团队 + + TeamInfoResponse({ + this.id, + this.teamNo, + this.teamName, + this.teamCode, + this.scene, + this.sceneCustomName, + this.personNo, + this.isOwner, + }); + + // 从JSON构造函数 + factory TeamInfoResponse.fromJson(Map json) { + return TeamInfoResponse( + id: json['id'] as int?, + teamNo: json['teamNo'] as String?, + teamName: json['teamName'] as String?, + teamCode: json['teamCode'] as String?, + scene: json['scene'] as int?, + sceneCustomName: json['sceneCustomName'] as String?, + personNo: json['personNo'] as String?, + isOwner: json['isOwner'] as bool?, + ); + } + + // 转换为JSON的方法 + Map toJson() { + return { + 'id': id, + 'teamNo': teamNo, + 'teamName': teamName, + 'teamCode': teamCode, + 'scene': scene, + 'sceneCustomName': sceneCustomName, + 'personNo': personNo, + 'isOwner': isOwner, + }; + } + + // 字符串表示形式 + @override + String toString() { + return 'TeamInfoResponse{id: $id, teamNo: $teamNo, teamName: $teamName, teamCode: $teamCode, ' + 'scene: $scene, sceneCustomName: $sceneCustomName, personNo: $personNo, ' + ' isOwner: $isOwner}'; + } +} diff --git a/lib/api/service/team_api_service.dart b/lib/api/service/team_api_service.dart new file mode 100644 index 0000000..154f657 --- /dev/null +++ b/lib/api/service/team_api_service.dart @@ -0,0 +1,50 @@ +import 'package:get/get.dart'; +import 'package:starwork_flutter/api/api_path.dart'; +import 'package:starwork_flutter/api/api_response.dart'; +import 'package:starwork_flutter/api/base_api_service.dart'; +import 'package:starwork_flutter/api/model/team/request/create_team_request.dart'; +import 'package:starwork_flutter/api/model/team/response/all_team_list_response.dart'; +import 'package:starwork_flutter/api/model/team/response/create_team_response.dart'; +import 'package:starwork_flutter/api/model/team/response/scene_info_response.dart'; +import 'package:starwork_flutter/api/model/user/request/validation_code_login.dart'; +import 'package:starwork_flutter/api/model/user/response/token_response.dart'; +import 'package:starwork_flutter/common/constant/http_constant.dart'; + +class TeamApiService { + final BaseApiService _api; + + TeamApiService(this._api); // 通过构造函数注入 + + // 创建团队 + Future> requestCreateTeam({ + required CreateTeamRequest request, + }) { + return _api.makeRequest( + // 通过实例调用 + path: ApiPath.createTeam, + method: HttpConstant.post, + data: request.toJson(), + fromJson: (data) => CreateTeamResponse.fromJson(data), + ); + } + + // 所有团队列表 + Future> requestAllTeamInfoList() { + return _api.makeRequest( + // 通过实例调用 + path: ApiPath.allTeamList, + method: HttpConstant.post, + fromJson: (data) => AllTeamListResponse.fromJson(data), + ); + } + + // 所有团队使用场景列表 + Future> requestAllSceneInfoList() { + return _api.makeRequest( + // 通过实例调用 + path: ApiPath.sceneList, + method: HttpConstant.post, + fromJson: (data) => SceneInfoResponseList.fromJson(data), + ); + } +} diff --git a/lib/base/app_initialization.dart b/lib/base/app_initialization.dart index a589078..91f5a0e 100644 --- a/lib/base/app_initialization.dart +++ b/lib/base/app_initialization.dart @@ -8,6 +8,7 @@ import 'package:starcloud/sdk/starcloud.dart'; import 'package:starwork_flutter/api/base_api_service.dart'; import 'package:starwork_flutter/api/service/common_api_service.dart'; +import 'package:starwork_flutter/api/service/team_api_service.dart'; import 'package:starwork_flutter/api/service/user_api_service.dart'; import 'package:starwork_flutter/api/starcloud/starcloud_api_service.dart'; import 'package:starwork_flutter/api/starcloud/starcloud_base_api_service.dart'; @@ -34,6 +35,7 @@ class AppInitialization { Get.put(StarCloudBaseApiService()); Get.put(CommonApiService(Get.find())); Get.put(UserApiService(Get.find())); + Get.put(TeamApiService(Get.find())); Get.put(StarCloudApiService(Get.find())); Get.put(LoginController()); Get.put(MainController()); diff --git a/lib/flavors.dart b/lib/flavors.dart index 10b2091..6b6fb1f 100644 --- a/lib/flavors.dart +++ b/lib/flavors.dart @@ -21,7 +21,7 @@ class F { // Release环境的API地址 switch (appFlavor) { case Flavor.sky: - return 'https://192.168.1.121:8112/api'; // 生产环境API + return 'https://192.168.1.136:8112/api'; // 生产环境API case Flavor.xhj: return 'https://api.xhjcn.ltd/api'; // 生产环境API } @@ -29,7 +29,7 @@ class F { // Debug/Profile环境的API地址(开发环境) switch (appFlavor) { case Flavor.sky: - return 'http://197o136q43.oicp.vip/api'; + return 'http://192.168.1.136:8112/api'; case Flavor.xhj: return 'https://loacl.work.star-lock.cn/api'; } @@ -39,18 +39,18 @@ class F { static String get starCloudClientId { switch (appFlavor) { case Flavor.sky: - return '0JLrKMhBSSHH0VlRLcIko5NrESfzDJ8B'; + return 'W3rrBEg2ZFEpZQ3o5eu2tWLEJP4t7a8X'; case Flavor.xhj: - return '0JLrKMhBSSHH0VlRLcIko5NrESfzDJ8B'; + return 'W3rrBEg2ZFEpZQ3o5eu2tWLEJP4t7a8X'; } } static String get starCloudSecret { switch (appFlavor) { case Flavor.sky: - return 'KS8KvZKPKKHgsoDbcfQCCScvyyqeolDt'; + return 'v8WaKjljfnQFv0inIQnZ17DieFgVQEzJ'; case Flavor.xhj: - return 'KS8KvZKPKKHgsoDbcfQCCScvyyqeolDt'; + return 'v8WaKjljfnQFv0inIQnZ17DieFgVQEzJ'; } } @@ -67,7 +67,7 @@ class F { // Debug/Profile环境的StarCloud地址(开发环境) switch (appFlavor) { case Flavor.sky: - return 'http://192.168.1.121:8111/sdk'; + return 'http://192.168.1.136:8111/sdk'; case Flavor.xhj: return 'http://local.cloud.star-lock.cn'; } diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index e2e1e9d..9d15460 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -24,6 +24,8 @@ import 'package:starwork_flutter/views/messages/messages_binding.dart'; import 'package:starwork_flutter/views/messages/messages_view.dart'; import 'package:starwork_flutter/views/mine/mine_binding.dart'; import 'package:starwork_flutter/views/mine/mine_view.dart'; +import 'package:starwork_flutter/views/team/useCaseSetting/use_case_setting_binding.dart'; +import 'package:starwork_flutter/views/team/useCaseSetting/use_case_setting_view.dart'; class AppPages { // 定义所有路由 @@ -88,5 +90,10 @@ class AppPages { page: () => const TeamNoticeDetailsView(), binding: TeamNoticeDetailsBinding(), ), + GetPage( + name: AppRoutes.teamUseCaseSetting, + page: () => UseCaseSettingView(), + binding: UseCaseSettingBinding(), + ), ]; -} +} \ No newline at end of file diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index 4a457fd..742d3a2 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -10,6 +10,7 @@ class AppRoutes{ static const String setNewPassword = '/setNewPassword'; static const String searchDevice = '/searchDevice'; static const String confirmPairDevice = '/confirmPairDevice'; - static const String teamNotice = '/teamNotice'; - static const String teamNoticeDetails = '/teamNoticeDetails'; + static const String teamNotice = '/team/teamNotice'; + static const String teamNoticeDetails = '/team/teamNoticeDetails'; + static const String teamUseCaseSetting = '/team/useCaseSetting'; } \ No newline at end of file diff --git a/lib/views/home/home_controller.dart b/lib/views/home/home_controller.dart index a5b270a..e9ed2b9 100644 --- a/lib/views/home/home_controller.dart +++ b/lib/views/home/home_controller.dart @@ -2,19 +2,19 @@ import 'package:carousel_slider/carousel_controller.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; +import 'package:starwork_flutter/api/model/team/response/team_info_response.dart'; +import 'package:starwork_flutter/api/service/team_api_service.dart'; +import 'package:starwork_flutter/base/app_logger.dart'; import 'package:starwork_flutter/base/app_permission.dart'; import 'package:starwork_flutter/base/base_controller.dart'; +import 'package:starwork_flutter/routes/app_routes.dart'; import 'package:starwork_flutter/views/main/main_controller.dart'; class HomeController extends BaseController { - final mainController = Get.find(); - + final teamApi = Get.find(); final isOpenNotificationPermission = false.obs; - // 页面加载状态 - final isLoading = true.obs; - var carouselCurrentIndex = 0.obs; // 渐变颜色列表 @@ -29,10 +29,10 @@ class HomeController extends BaseController { @override void onInit() async { super.onInit(); - - // 模拟初始化加载 - await _initializeData(); - + + // 初始化加载 + _initializeData(); + // 监听轮播图切换,更新渐变颜色 carouselCurrentIndex.listen((index) { updateGradientColor(index); @@ -40,17 +40,31 @@ class HomeController extends BaseController { } // 初始化数据 - Future _initializeData() async { - // 模拟加载延迟(2秒) - await Future.delayed(const Duration(seconds: 2)); - + void _initializeData() async { + showLoading(); + + /// 请求团队信息 + requestAllTeamInfoList(); // 检查通知权限 isOpenNotificationPermission.value = await AppPermission.checkPermission( permission: Permission.notification, ); - - // 加载完成,隐藏骨架屏 - isLoading.value = false; + hideLoading(); + } + + /// 请求团队信息 + void requestAllTeamInfoList() async { + var teamList = await teamApi.requestAllTeamInfoList(); + if (teamList.isSuccess) { + // 我的团队信息 + List myTeamList = teamList.data?.myTeam ?? []; + // 待加入团队信息 + List pendTeamList = teamList.data?.pendTeam ?? []; + if (myTeamList.isEmpty) { + // 如果是空的则自动创建并跳转到团队使用场景页面 + Get.toNamed(AppRoutes.teamUseCaseSetting); + } + } } // 根据轮播图索引更新渐变颜色 @@ -59,8 +73,7 @@ class HomeController extends BaseController { currentGradientColor.value = gradientColors[index]; } else { // 如果索引超出颜色数量,使用模运算轮环 - currentGradientColor.value = - gradientColors[index % gradientColors.length]; + currentGradientColor.value = gradientColors[index % gradientColors.length]; } } @@ -68,25 +81,25 @@ class HomeController extends BaseController { Future refreshHome() async { // 显示加载状态(可选) // isLoading.value = true; - + // 模拟网络请求延迟 await Future.delayed(const Duration(seconds: 1)); - + // 这里可以添加实际的刷新逻辑,比如: // 1. 重新获取轮播图数据 // 2. 刷新统计数据 // 3. 更新功能列表 // 4. 刷新考勤图表数据 // 5. 更新门禁列表 - + // 重新检查通知权限 isOpenNotificationPermission.value = await AppPermission.checkPermission( permission: Permission.notification, ); - + // 隐藏加载状态 // isLoading.value = false; - + print('首页数据刷新完成'); } } diff --git a/lib/views/home/home_view.dart b/lib/views/home/home_view.dart index 3432a03..631ea7f 100644 --- a/lib/views/home/home_view.dart +++ b/lib/views/home/home_view.dart @@ -5,6 +5,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:starwork_flutter/base/app_permission.dart'; import 'package:starwork_flutter/routes/app_routes.dart'; +import 'package:starwork_flutter/views/home/widget/home_not_device_area.dart'; import 'package:super_tooltip/super_tooltip.dart'; import 'package:starwork_flutter/views/home/widget/home_attendance_chart_area_widget.dart'; import 'package:starwork_flutter/views/home/widget/home_carousel_area_widget.dart'; @@ -153,8 +154,7 @@ class HomeView extends GetView { const Spacer(), GestureDetector( onTap: () async { - controller.isOpenNotificationPermission.value = - await AppPermission.requestNotificationPermission(); + controller.isOpenNotificationPermission.value = await AppPermission.requestNotificationPermission(); }, child: Container( padding: EdgeInsets.symmetric(horizontal: 6.w, vertical: 4.h), @@ -232,6 +232,8 @@ class HomeView extends GetView { HomeCarouselAreaWidget( carouselCurrentIndex: controller.carouselCurrentIndex, ), + SizedBox(height: 10.h), + HomeNotDeviceArea(), HomeTeamNoticeRowWidget(), HomeStatisticsRowWidget( personCount: 12, diff --git a/lib/views/home/widget/home_carousel_area_widget.dart b/lib/views/home/widget/home_carousel_area_widget.dart index fe25149..9e010bd 100644 --- a/lib/views/home/widget/home_carousel_area_widget.dart +++ b/lib/views/home/widget/home_carousel_area_widget.dart @@ -44,7 +44,7 @@ class _HomeCarouselAreaWidgetState extends State { return Builder( builder: (BuildContext context) { return ClipRRect( - borderRadius: BorderRadius.circular(8.0), + borderRadius: BorderRadius.circular(8.0.r), child: Image.asset( width: double.infinity, height: 68.h, diff --git a/lib/views/home/widget/home_not_device_area.dart b/lib/views/home/widget/home_not_device_area.dart new file mode 100644 index 0000000..1c1a492 --- /dev/null +++ b/lib/views/home/widget/home_not_device_area.dart @@ -0,0 +1,92 @@ +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'; + +class HomeNotDeviceArea extends StatefulWidget { + const HomeNotDeviceArea({super.key}); + + @override + State createState() => _HomeNotDeviceAreaState(); +} + +class _HomeNotDeviceAreaState extends State { + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric( + horizontal: 10.w, + vertical: 10.h, + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.0.r), + ), + width: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '签勤全天候为您守护'.tr, + style: TextStyle( + color: Colors.black, + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + Text( + '快点新增设备,开始指挥互联吧'.tr, + style: TextStyle( + color: Colors.black, + fontSize: 12.sp, + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.blueAccent, + padding: EdgeInsets.symmetric( + vertical: 8.h, + horizontal: 10.w, + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.r), + ), + elevation: 0, + ), + onPressed: () {}, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.double_arrow_rounded, + color: Colors.white, + size: 16.sp, + ), + Text( + '添加设备', + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ) + ], + ), + ], + ), + ); + } +} diff --git a/lib/views/team/useCaseSetting/use_case_setting_binding.dart b/lib/views/team/useCaseSetting/use_case_setting_binding.dart new file mode 100644 index 0000000..6f6abaf --- /dev/null +++ b/lib/views/team/useCaseSetting/use_case_setting_binding.dart @@ -0,0 +1,9 @@ +import 'package:get/get.dart'; +import 'package:starwork_flutter/views/team/useCaseSetting/use_case_setting_controller.dart'; + +class UseCaseSettingBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => UseCaseSettingController()); + } +} \ No newline at end of file diff --git a/lib/views/team/useCaseSetting/use_case_setting_controller.dart b/lib/views/team/useCaseSetting/use_case_setting_controller.dart new file mode 100644 index 0000000..397b819 --- /dev/null +++ b/lib/views/team/useCaseSetting/use_case_setting_controller.dart @@ -0,0 +1,66 @@ +import 'package:flutter/widgets.dart'; +import 'package:get/get.dart'; +import 'package:starwork_flutter/api/model/team/request/create_team_request.dart'; +import 'package:starwork_flutter/api/model/team/response/scene_info_response.dart'; +import 'package:starwork_flutter/api/service/team_api_service.dart'; +import 'package:starwork_flutter/base/app_logger.dart'; +import 'package:starwork_flutter/base/base_controller.dart'; +import 'package:starwork_flutter/common/constant/cache_keys.dart'; +import 'package:starwork_flutter/common/utils/shared_preferences_utils.dart'; +import 'dart:convert'; + +class UseCaseSettingController extends BaseController { + TextEditingController teamNameInputController = TextEditingController(); + final teamApi = Get.find(); + + // 用于存储选中的使用场景 + final selectedUseCase = Rx(null); + + // 用于存储场景列表 + final useCases = [].obs; + + @override + void onInit() { + super.onInit(); + _generateRandomNumber(); + requestAllTeamInfoList(); + } + + /// 请求团队信息 + void requestAllTeamInfoList() async { + showLoading(); + + var sceneList = await teamApi.requestAllSceneInfoList(); + if (sceneList.isSuccess) { + // 使用场景列表 + useCases.value = sceneList.data?.list ?? []; + useCases.refresh(); + } + hideLoading(); + } + + void requestCreateTeam() async { + showLoading(); + var createTeamResponse = await teamApi.requestCreateTeam( + request: CreateTeamRequest( + teamName: teamNameInputController.text, + scene: selectedUseCase.value?.id ?? 0, + ), + ); + if (createTeamResponse.isSuccess) { + // 创建成功 + showSuccess(); + Get.back(); + } else { + // 创建失败 + showError(message: createTeamResponse.errorMsg!); + } + } + + /// 基于时间戳生成一个9位随机数 + void _generateRandomNumber() { + int timestamp = DateTime.now().millisecondsSinceEpoch; + int randomNumber = timestamp % 1000000000; + teamNameInputController.text = randomNumber.toString() + '的互联'.tr; + } +} diff --git a/lib/views/team/useCaseSetting/use_case_setting_view.dart b/lib/views/team/useCaseSetting/use_case_setting_view.dart new file mode 100644 index 0000000..6020909 --- /dev/null +++ b/lib/views/team/useCaseSetting/use_case_setting_view.dart @@ -0,0 +1,204 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:starwork_flutter/base/app_logger.dart'; +import 'package:starwork_flutter/views/team/useCaseSetting/use_case_setting_controller.dart'; + +class UseCaseSettingView extends GetView { + const UseCaseSettingView({super.key}); + + @override + Widget build(BuildContext context) { + // 将废弃的WillPopScope替换为新的PopScope + return PopScope( + canPop: false, // 禁用返回键 + onPopInvoked: (bool didPop) { + // 可以在这里处理返回事件 + }, + child: Scaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + actions: [ + IconButton( + icon: const Icon(Icons.close), + onPressed: () { + if (controller.selectedUseCase.value == null) { + controller.showToast('请先选择使用场景'.tr); + return; + } + controller.requestCreateTeam(); + }, + ), + ], + ), + body: GestureDetector( + onTap: () { + // 点击空白处收起键盘 + FocusScope.of(context).unfocus(); + }, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 20.w, + vertical: 18.h, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '邀请您选择使用场景,以便于我们更好的为您提供服务'.tr, + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.bold, + color: Colors.black87, + ), + ), + SizedBox( + height: 24.h, + ), + Text( + '团队/家庭名称', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.bold, + color: Colors.black87, + ), + ), + SizedBox(height: 8.h), + TextField( + controller: controller.teamNameInputController, + keyboardType: TextInputType.text, + textInputAction: TextInputAction.done, + onChanged: (value) { + // 触发更新以显示/隐藏清除按钮 + }, + decoration: InputDecoration( + counterText: '', + hintText: '请输入团队/家庭名称', + // 设置无边框 + border: InputBorder.none, + // 设置背景颜色为灰色,圆角 + filled: true, + fillColor: Colors.grey[100], + contentPadding: EdgeInsets.symmetric( + horizontal: 16.w, + vertical: 12.h, + ), + suffixIcon: controller.teamNameInputController.text.isNotEmpty + ? IconButton( + icon: const Icon(Icons.clear, color: Colors.grey), + onPressed: () { + controller.teamNameInputController.clear(); // 清空输入 + }, + ) + : null, + // 如果没有内容,就不显示清除按钮, + // 获取焦点时的边框 + 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), + ), + ), + ), + SizedBox(height: 12.h), + + // 选择使用场景标题 + Text( + '选择使用场景', + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.bold, + color: Colors.black87, + ), + ), + SizedBox(height: 12.h), + + // 使用场景按钮网格布局(两列) + Expanded( + child: Obx( + () => GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + childAspectRatio: 3, + crossAxisSpacing: 10.h, + mainAxisSpacing: 10.w, + ), + itemCount: controller.useCases.length, + itemBuilder: (context, index) { + return Obx( + () => GestureDetector( + onTap: () { + // 切换选中状态(简单逻辑,实际可结合控制器管理) + controller.selectedUseCase.value = controller.useCases[index]; + }, + child: Container( + decoration: BoxDecoration( + color: controller.selectedUseCase.value == controller.useCases[index] + ? Colors.blue.withOpacity(0.2) + : Colors.grey[200], + borderRadius: BorderRadius.circular(8), + border: controller.selectedUseCase.value == controller.useCases[index] + ? Border.all(color: Colors.blue, width: 1.5) + : null, + ), + alignment: Alignment.center, + child: Text( + controller.useCases[index].name ?? '', + style: TextStyle( + color: controller.selectedUseCase.value == controller.useCases[index] + ? Colors.blue + : Colors.grey[700], + fontSize: 14.sp, + ), + ), + ), + ), + ); + }, + ), + ), + ), + + // 确定按钮 + SizedBox(height: 10.h), + SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: () { + if (controller.selectedUseCase.value == null) { + controller.showToast('请先选择使用场景'.tr); + return; + } + controller.requestCreateTeam(); + }, + style: ElevatedButton.styleFrom( + backgroundColor: Colors.blue, + padding: EdgeInsets.symmetric(vertical: 12.h), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.r)), + ), + child: Text( + '确定'.tr, + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w500, + ), + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +}