From fd51dd14e26ba733438f706f48dc6ddc686b99b4 Mon Sep 17 00:00:00 2001 From: ZHR007 Date: Wed, 26 Nov 2025 11:53:34 +0800 Subject: [PATCH] no message --- lib/controller/discover/room_controller.dart | 32 +++-- lib/controller/mine/auth_controller.dart | 10 +- lib/controller/mine/league_controller.dart | 112 +++++++++++++++++ lib/controller/mine/mine_controller.dart | 1 + lib/pages/discover/discover_page.dart | 57 ++++----- lib/pages/mine/auth_center_page.dart | 4 +- lib/pages/mine/real_name_page.dart | 5 +- lib/pages/setting/match_league_page.dart | 118 ++++++++++++++++++ .../live/live_room_notice_chat_panel.dart | 10 +- 9 files changed, 302 insertions(+), 47 deletions(-) create mode 100644 lib/controller/mine/league_controller.dart create mode 100644 lib/pages/setting/match_league_page.dart diff --git a/lib/controller/discover/room_controller.dart b/lib/controller/discover/room_controller.dart index dae3829..7b57bbb 100644 --- a/lib/controller/discover/room_controller.dart +++ b/lib/controller/discover/room_controller.dart @@ -14,6 +14,8 @@ import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; import '../../model/live/live_chat_message.dart'; +import '../../pages/mine/real_name_page.dart'; +import '../../pages/setting/match_league_page.dart'; // 当前角色 enum CurrentRole { @@ -31,8 +33,8 @@ class RoomController extends GetxController { final NetworkService _networkService; CurrentRole currentRole = CurrentRole.normalUser; - bool isLive = false; - final userData = GlobalData().userData.obs; + var isLive = false.obs; + var matchmakerFlag = false.obs; /// 当前频道信息 final Rxn rtcChannel = Rxn(); final Rxn rtcChannelDetail = Rxn(); @@ -46,9 +48,12 @@ class RoomController extends GetxController { /// 消息服务实例 final LiveChatMessageService _messageService = LiveChatMessageService.instance; + // matchmakerFlag + @override void onInit() { super.onInit(); + matchmakerFlag.value = GlobalData().userData!.matchmakerFlag!; // 注册消息监听 _registerMessageListener(); // 加载礼物产品列表 @@ -101,6 +106,9 @@ class RoomController extends GetxController { /// 调用接口创建 RTC 频道 Future createRtcChannel() async { + if(isLive.value){ + return; + } final granted = await _ensureRtcPermissions(); if (!granted) return; @@ -110,7 +118,7 @@ class RoomController extends GetxController { if (base.isSuccess && base.data != null) { rtcChannel.value = base.data; currentRole = CurrentRole.broadcaster; - isLive = true; + isLive.value = true; await _joinRtcChannel( base.data!.token, base.data!.channelId, @@ -208,14 +216,14 @@ class RoomController extends GetxController { femaleInfo: role == CurrentRole.femaleAudience ? userInfo : null, ); rtcChannelDetail.value = newDetail; - isLive = true; + isLive.value = true; } Future leaveChat() async { final data = {'channelId': RTCManager.instance.currentChannelId}; final response = await _networkService.rtcApi.disconnectRtcChannel(data); if (response.data.isSuccess) { - isLive = false; + isLive.value = false; await RTCManager.instance.unpublish(currentRole); if (currentRole == CurrentRole.maleAudience) { final newDetail = RtcChannelDetail( @@ -297,8 +305,8 @@ class RoomController extends GetxController { ); } } - - isLive = false; + + isLive.value = false; if (currentRole == CurrentRole.maleAudience || currentRole == CurrentRole.femaleAudience) { await RTCManager.instance.unpublish(currentRole); @@ -409,4 +417,14 @@ class RoomController extends GetxController { } } } + + void registerMatch(){ + if(GlobalData().userData!.identityCard != null && GlobalData().userData!.identityCard!.isNotEmpty){ + Get.to(() => MatchLeaguePage()); + } else { + SmartDialog.showToast('请先进行实名认证'); + Get.to(() => RealNamePage(type: 1)); + } + } + } diff --git a/lib/controller/mine/auth_controller.dart b/lib/controller/mine/auth_controller.dart index e713cb1..042d6c1 100644 --- a/lib/controller/mine/auth_controller.dart +++ b/lib/controller/mine/auth_controller.dart @@ -3,6 +3,7 @@ import 'package:get/get.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import '../../generated/assets.dart'; import '../../network/user_api.dart'; +import '../../pages/setting/match_league_page.dart'; import '../global.dart'; class AuthController extends GetxController { @@ -82,7 +83,7 @@ class AuthController extends GetxController { dataList.assignAll(updatedMessages); } - Future startAuthing() async { + Future startAuthing(int type) async { if (name.value.isEmpty) { SmartDialog.showToast('请输入姓名'); return; @@ -111,7 +112,12 @@ class AuthController extends GetxController { if (response.data.isSuccess) { GlobalData().userData!.identityCard = idcard.value; SmartDialog.showToast('认证成功'); - Get.back(result: 3); + if(type == 1){ + // 进入认证成功之后的下一个页面; + Get.off(() => MatchLeaguePage()); + } else { + Get.back(result: 3); + } } else { SmartDialog.showToast(response.data.message); } diff --git a/lib/controller/mine/league_controller.dart b/lib/controller/mine/league_controller.dart new file mode 100644 index 0000000..ecadc9c --- /dev/null +++ b/lib/controller/mine/league_controller.dart @@ -0,0 +1,112 @@ +import 'dart:async'; +import 'package:get/get.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import '../../network/user_api.dart'; +import '../global.dart'; + +class LeagueController extends GetxController { + late UserApi _userApi; + final phone = ''.obs; + // 手机号输入 + final phoneNumber = ''.obs; + // 验证码输入 + final verificationCode = ''.obs; + // 是否正在发送验证码 + final isSendingCode = false.obs; + // 倒计时秒数 + final countdownSeconds = 0.obs; + final agree = false.obs; + + @override + void onInit() { + super.onInit(); + // 从全局依赖中获取UserApi + _userApi = Get.find(); + phone.value = GlobalData().userData!.phone!; + } + + // 获取验证码 + Future getVerificationCode() async { + if (countdownSeconds.value > 0) { + return; + } + // 验证手机号格式 + if (phoneNumber.value.isEmpty || phoneNumber.value.length != 11) { + SmartDialog.showToast('请输入正确的手机号'); + return; + } + isSendingCode.value = true; + try { + // 构建请求参数 + final params = { + 'purpose': 2, // 红娘申请 + 'verifiableAccount': phoneNumber.value, + 'verifiableAccountType': 1, // 手机 + }; + // 调用UserApi中的验证码接口 + final response = await _userApi.getVerificationCode(params); + // 处理响应 + if (response.data.isSuccess) { + // 生产环境移除打印,可考虑使用正式的日志框架 + SmartDialog.showToast('验证码发送成功'); + // 开始倒计时 + countdownSeconds.value = 60; + startCountdown(); + } else { + SmartDialog.showToast(response.data.message); + } + } catch (e) { + SmartDialog.showToast('网络请求失败,请重试'); + } finally { + isSendingCode.value = false; + } + } + + // 开始倒计时 + void startCountdown() { + Future.delayed(const Duration(seconds: 1), () { + if (countdownSeconds.value > 0) { + countdownSeconds.value--; + startCountdown(); + } else { + isSendingCode.value = false; + } + }); + } + + Future changePhone() async { + if(isSendingCode.value){ + return; + } + if (phoneNumber.value.isEmpty) { + SmartDialog.showToast('请输入手机号'); + return; + } + if (verificationCode.value.isEmpty) { + SmartDialog.showToast('请输入验证码'); + return; + } + isSendingCode.value = true; + try { + // 调用登录接口 + SmartDialog.showLoading(msg: '处理中'); + final param = { 'phone': phoneNumber.value, 'captcha': verificationCode.value}; + final response = await _userApi.updatePhone(param); + // 处理响应 + if (response.data.isSuccess) { + GlobalData().userData!.phone = phoneNumber.value; + SmartDialog.showToast('更换成功'); + Get.back(result: 1); + } else { + SmartDialog.showToast(response.data.message); + } + } catch (e) { + SmartDialog.showToast('网络请求失败,请检查网络连接'); + } finally { + SmartDialog.dismiss(); + isSendingCode.value = true; + } + } + +} + diff --git a/lib/controller/mine/mine_controller.dart b/lib/controller/mine/mine_controller.dart index 79b2920..f6c8a59 100644 --- a/lib/controller/mine/mine_controller.dart +++ b/lib/controller/mine/mine_controller.dart @@ -39,6 +39,7 @@ class MineController extends GetxController { super.onInit(); userData.value = GlobalData().userData; userId.value = GlobalData().userId; + print(41); } diff --git a/lib/pages/discover/discover_page.dart b/lib/pages/discover/discover_page.dart index 5a69f78..ccfedf7 100644 --- a/lib/pages/discover/discover_page.dart +++ b/lib/pages/discover/discover_page.dart @@ -6,6 +6,10 @@ import 'package:dating_touchme_app/pages/discover/party_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:tdesign_flutter/tdesign_flutter.dart'; + +import '../../controller/global.dart'; class DiscoverPage extends StatefulWidget { const DiscoverPage({super.key}); @@ -39,6 +43,7 @@ class _DiscoverPageState extends State roomController = Get.put(RoomController()); } _pageController = PageController(initialPage: 0); + roomController.matchmakerFlag.value = GlobalData().userData!.matchmakerFlag!; } @override @@ -60,37 +65,33 @@ class _DiscoverPageState extends State ), Container( padding: EdgeInsets.symmetric(horizontal: 12.w), - // constraints: BoxConstraints(minHeight: ScreenUtil().setHeight(800)), child: Column( children: [ - HomeAppbar( - topNav: topNav, - changeNav: changeNav, - activeIndex: active, - right: InkWell( - onTap: () async { - await roomController.createRtcChannel(); - }, - child: Container( - width: 52.w, - height: 20.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(20.w)), - color: const Color.fromRGBO(108, 105, 244, 1), - ), - child: Center( - child: Text( - "申请红娘", - style: TextStyle( - fontSize: 10.w, - color: Colors.white, - fontWeight: FontWeight.w500, - ), - ), - ), + Obx(() { + return HomeAppbar( + topNav: topNav, + changeNav: changeNav, + activeIndex: active, + right: TDButton( + text: roomController.matchmakerFlag.value ? '开始直播' : '申请红娘', + width: 60.w, + height: 24.h, + padding: EdgeInsetsGeometry.symmetric(horizontal: 4.w), + size: TDButtonSize.small, + type: TDButtonType.fill, + shape: TDButtonShape.round, + theme: roomController.matchmakerFlag.value ? TDButtonTheme.danger : TDButtonTheme.primary, + textStyle: TextStyle(fontSize: 10.w), + onTap: () async { + if(roomController.matchmakerFlag.value){ + await roomController.createRtcChannel(); + } else { + roomController.registerMatch(); + } + }, ), - ), - ), + ); + }), Expanded( child: PageView( controller: _pageController, diff --git a/lib/pages/mine/auth_center_page.dart b/lib/pages/mine/auth_center_page.dart index 7b59cb0..d07935c 100644 --- a/lib/pages/mine/auth_center_page.dart +++ b/lib/pages/mine/auth_center_page.dart @@ -6,8 +6,6 @@ import 'package:get/get.dart'; import '../../components/page_appbar.dart'; import '../../controller/mine/auth_controller.dart'; -import '../../extension/router_service.dart'; -import '../../generated/assets.dart'; import 'edit_info_page.dart'; import 'phone_page.dart'; @@ -113,7 +111,7 @@ class AuthCenterPage extends StatelessWidget { if(item.authed){ return; } - await Get.to(() => RealNamePage()); + await Get.to(() => RealNamePage(type: 0)); } controller.loadInitialData(); }); diff --git a/lib/pages/mine/real_name_page.dart b/lib/pages/mine/real_name_page.dart index 9aa3bd2..34abfb4 100644 --- a/lib/pages/mine/real_name_page.dart +++ b/lib/pages/mine/real_name_page.dart @@ -8,7 +8,8 @@ import '../../components/page_appbar.dart'; import '../../controller/mine/auth_controller.dart'; class RealNamePage extends StatelessWidget { - RealNamePage({super.key}); + final int type; + RealNamePage({super.key, required this.type}); final AuthController controller = Get.put(AuthController()); // 是否同意协议 @override @@ -188,7 +189,7 @@ class RealNamePage extends StatelessWidget { backgroundColor: Color(0xC37562F9), ), onTap: (){ - controller.startAuthing(); + controller.startAuthing(type); }, ), ], diff --git a/lib/pages/setting/match_league_page.dart b/lib/pages/setting/match_league_page.dart new file mode 100644 index 0000000..b9f7c77 --- /dev/null +++ b/lib/pages/setting/match_league_page.dart @@ -0,0 +1,118 @@ +import 'package:dating_touchme_app/extension/ex_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:tdesign_flutter/tdesign_flutter.dart'; + +import '../../components/page_appbar.dart'; +import '../../controller/mine/league_controller.dart'; + +class MatchLeaguePage extends StatelessWidget { + MatchLeaguePage({super.key}); + final LeagueController controller = Get.put(LeagueController()); +// 是否同意协议 + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Color(0xffFFFFFF), + appBar: PageAppbar(title: "填写申请资料"), + body: Column( + children: [ + SizedBox(height: 12), + TDInput( + type: TDInputType.cardStyle, + inputType: TextInputType.phone, + maxLength: 11, + cardStyle: TDCardStyle.topText, + width: MediaQuery.of(context).size.width - 40, + hintText: '请输入你的手机号', + onChanged: (text) { + } + ), + SizedBox(height: 24), + TDInput( + type: TDInputType.cardStyle, + inputType: TextInputType.number, + maxLength: 6, + cardStyle: TDCardStyle.topText, + width: MediaQuery.of(context).size.width - 40, + hintText: '请输入验证码', + onChanged: (text) { + controller.verificationCode.value = text; + }, + rightBtn: SizedBox( + width: 100, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.only(right: 10), + child: Container( + width: 0.5, + height: 24, + color: TDTheme.of(context).grayColor3, + ), + ), + controller.countdownSeconds.value > 0 ? + TDText('${controller.countdownSeconds.value}秒后重试', textColor: TDTheme.of(context).fontGyColor4) + : TDText('获取验证码', textColor: Color(0xFF7562F9)), + ], + ), + ), + needClear: false, + onBtnTap: () { + controller.getVerificationCode(); + } + ), + SizedBox(height: 24), + // 协议同意复选框 + Row( + crossAxisAlignment: CrossAxisAlignment.center, // 垂直居中 + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox(width: 8), + Obx(() => Checkbox( + value: controller.agree.value, + onChanged: (value) { + controller.agree.value = value ?? false; + }, + activeColor: Color(0xff7562F9), + side: const BorderSide(color: Colors.grey), + shape: const CircleBorder(), + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + )), + Text('阅读并同意', style: TextStyle( fontSize: 14, color: Colors.black54 )), + Text( + '《趣招亲红娘代理协议》', + style: TextStyle( fontSize: 14, color: Color(0xFFEE811B) ) + ).onTap((){ + + }), + ], + ), + SizedBox(height: 32), + + TDButton( + text: '下一步', + width: MediaQuery.of(context).size.width - 40, + size: TDButtonSize.large, + type: TDButtonType.fill, + shape: TDButtonShape.round, + style: TDButtonStyle( + textColor: Colors.white, + backgroundColor: Color(0xFF7562F9), + ), + activeStyle: TDButtonStyle( + textColor: Colors.white, + backgroundColor: Color(0xC37562F9), + ), + onTap: (){ + // controller.startAuthing(); + }, + ), + ], + ), + ); + } + +} diff --git a/lib/widget/live/live_room_notice_chat_panel.dart b/lib/widget/live/live_room_notice_chat_panel.dart index 4de83f3..b1cb960 100644 --- a/lib/widget/live/live_room_notice_chat_panel.dart +++ b/lib/widget/live/live_room_notice_chat_panel.dart @@ -78,7 +78,7 @@ class _LiveRoomNoticeChatPanelState extends State { Obx((){ if(controller.rtcChannelDetail.value?.maleInfo == null && GlobalData().userData?.genderCode == 0 && controller.currentRole != CurrentRole.broadcaster || controller.rtcChannelDetail.value?.femaleInfo == null && GlobalData().userData?.genderCode == 1 && controller.currentRole != CurrentRole.broadcaster || - controller.isLive && controller.currentRole != CurrentRole.broadcaster){ + controller.isLive.value && controller.currentRole != CurrentRole.broadcaster){ return Container( width: 120.w, height: 55.w, @@ -86,7 +86,7 @@ class _LiveRoomNoticeChatPanelState extends State { decoration: BoxDecoration( borderRadius: BorderRadius.circular(10.w), gradient: LinearGradient( - colors: controller.isLive ? [Colors.grey, Colors.grey] : [Color(0xFF7C63FF), Color(0xFF987CFF)], + colors: controller.isLive.value ? [Colors.grey, Colors.grey] : [Color(0xFF7C63FF), Color(0xFF987CFF)], begin: Alignment.topLeft, end: Alignment.bottomRight, ), @@ -103,7 +103,7 @@ class _LiveRoomNoticeChatPanelState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - controller.isLive ? '申请连麦中' : '免费连麦', + controller.isLive.value ? '申请连麦中' : '免费连麦', style: TextStyle( fontSize: 13.w, color: Colors.white, @@ -111,7 +111,7 @@ class _LiveRoomNoticeChatPanelState extends State { ), ), SizedBox(height: 2.w), - controller.isLive ? const SizedBox() :Text( + controller.isLive.value ? const SizedBox() :Text( '剩余2张相亲卡', style: TextStyle( fontSize: 9.w, @@ -123,7 +123,7 @@ class _LiveRoomNoticeChatPanelState extends State { ], ), ).onTap(() async{ - if(controller.isLive){ + if(controller.isLive.value){ await controller.leaveChat(); }else{ await controller.joinChat(GlobalData().userData?.genderCode == 0 ? CurrentRole.maleAudience : CurrentRole.femaleAudience);