From 9c1e8de478dcb2a8442c6dbbabfddba61f0af6ba Mon Sep 17 00:00:00 2001 From: CYH <13923927013@163.com> Date: Thu, 24 Apr 2025 17:29:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/data/img/circle/forward.png | Bin 0 -> 2738 bytes .../lib/circle_app/help_back/binding.dart | 10 + .../lib/circle_app/help_back/logic.dart | 85 ++++++ circle_app/lib/circle_app/help_back/view.dart | 260 ++++++++++++++++++ .../tim_uikit_conversation.dart | 6 +- .../tim_uikit_conversation_item.dart | 72 ++--- .../tim_uikit_conversation_last_msg.dart | 3 +- 7 files changed, 394 insertions(+), 42 deletions(-) create mode 100644 circle_app/data/img/circle/forward.png create mode 100644 circle_app/lib/circle_app/help_back/binding.dart create mode 100644 circle_app/lib/circle_app/help_back/logic.dart create mode 100644 circle_app/lib/circle_app/help_back/view.dart diff --git a/circle_app/data/img/circle/forward.png b/circle_app/data/img/circle/forward.png new file mode 100644 index 0000000000000000000000000000000000000000..9955d1a26f99dee40c2fb0845a84767c3b782902 GIT binary patch literal 2738 zcmV;j3QhHiP)Px~D4X?JF@-L9l}mbx>u-EK<} z#3Dwi25SUC4J5uGCLoDOFiM5A3Ro&#%A=IdOmTN+rL+|G&JrGt)JB37Ll6q>?sgvc zaXvkFcXTZ~kDZXftG2cIYkJ>j6FO!0}Xi3ukPd1V$Vchlq|b#H%`V|5LSwo>9O+ zU?M|JLJC2G5L!D!f#+)pJ!60sMTLAmcRd395IH}Cgdid?1=?+$`sa;WLC+XqP4hr5 zYhHoed`>tljf~9!B5B?)=Pj{vb;m`AYXLo@fRAT0>pDY$t%-g^CkGOMpmEN@ww*&h zHhhk*>!YrG3eSuLmOQ(XgKHUxhY?Yc&P)jBAevTdINbXF6nLjUEET-8H0gqd3qY~{ zbQcQv6CyN@LI1@*j?u2JK&D#g8LQy}P`uap8Zg)d0E#qk#}U1ekbgzB+1RuL$5O@? zh4FP0X}AEL=reu^48Jekwx(%dn)%I;LQNSOM-4jWGg%# z?}to!JWwJzc&DN&H(HkICMbf$ZP8HhN0WuFJ8h$A2e z0GVhgK3_vg-~$H^Xm7rgy9*IENKG@wKse5=k@ny%lYy=a@KbwUp3Q~*1#q03nwn>| znt2m!+m@czJ$hpq2?g(}6uPFs zJDwgqT~nNO2za&E*KnRRKM5+GjjC#{RmA+(uIp`?^ z_wE^3Xj^Qzs;Ot0=BPsM6J)aQccotVG$Xc`F}83NT3DdL z`H{BZ!BTTg2{@55){~$+xT2gYgaGMjbNQS>BsTg`c}&+AOOvhJvomEZQV1SbRc(>& z*g(R0p8!@xL&3ep7OfgMmP~JFK;3|-$Q_oNb%4I9+3?7U6@g=QqdZ~acnaYg7dsAvQY53`92TylQ+KY&1 z%62gU^oEzWbRf!@U!VSQ1+eZ$$5QDl7}5QJ=#_gffZ~zmEh~%3RuOP4X*{4R>eaSw zNxGvxA>V*9ZB0_IF`D z@a?GxKE6D(9A`F{ojPfojB&2!p6^(;>|f>Pe>yp^%mIiavSxQIiM?oAt14;#lmy!!m-&VsLd3Pw`vHmD!W9(UvYN^APt0aS zIuU%YsiA49jE%PKOi&)myj!?3m8*y4H+_Bk=2@VGUKravsF-FTe^x&%{cfbF|AP9Rs0tJgE*D%!i zLm;!7<w54+nI4abwlHqQCwrFvSa6e&4MzseXpTP8gK zU<<@GomJdD71eMoWeh5eFJ_#}dUiv!J+Sda;GUiy-Z*=~YR2IYoGZ;T%NcFGh&%!O z4H!HW)dP2ww2HCIv|_++_rx-vldxm8uPuOmx!OoEA+S7$q|LFUc4f(@x1P%parCf_ zJv;mM%~L?TMN!rDj&R&`OYS}*J^>`|4~K#~%6VJ)zEod&=T4(RX~Z3j;U#0RCII_V zB-HX`C39D7(((TE8co$6ljqNIL^=}k2gVPMCkM_3z!)OB#kVwF$8kO&5SLQ+-RGjw zXueW`iU7M=R6IHGDCg>>j^p02$otgqM0EeXmCju;a3X2^lq>43(meB)b!Sv>`9WcD ztatx8z?39IJk9mq0E7%Tg_rxkRgECUG%O1hP4iqMJ-n2|7GiT}XzGQ^geDzNrJrJm zozk4Mne3&JcE8MMAf8Nj0Mg@}DLx^?i4aGD=(=!w@Q>BNo@mm!Y~Jl!#`^|t0mPrl z_p&c$TltOQ&_x@nU1R*XiGh>G-vMA@V`CE>9U1YjY7Y$VO1^`<25{z&2@7U7ckC#KIRW(f9#&&(|k8ve(t&ERMshsoe(&dH2#4A^CfWh z=+Jyy1B(+&0b`3s?`(yAC`JPR@-9|XTx!(R}_|I{J{8f_bi z{a)aadX%6Onsg#%yiNoQ4EpEou`s Help_BackLogic()); + } +} diff --git a/circle_app/lib/circle_app/help_back/logic.dart b/circle_app/lib/circle_app/help_back/logic.dart new file mode 100644 index 0000000..a0f1a3d --- /dev/null +++ b/circle_app/lib/circle_app/help_back/logic.dart @@ -0,0 +1,85 @@ + +import 'package:circle_app/utils/util.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:get/get.dart'; +import 'package:image_picker/image_picker.dart'; + +import '../../commons/config.dart'; +import '../../net/api.dart'; +import '../../net/dio_manager.dart'; +import '../../utils/qiniu.dart'; + +class Help_BackLogic extends GetxController { + TextEditingController textEditingController = TextEditingController(); + final ImagePicker _picker = ImagePicker(); + + TextEditingController photoController = TextEditingController(); + + var quToken = ''; + + String maxMsg = "0/200"; + + List imaglist = []; + + @override + void onInit() async{ + super.onInit(); + + getToken(); + } + + getToken() async { + // var data = await DioManager.instance.get(url: Api.tokenNoLogin, params: {}); + // var bean = BaseResponse.fromJson( + // data, (data) => QnTokenData.fromJson(data)); + // if(data['code'] == 200){ + // quToken = data['data']['token']; + // } + } + + Future getImageFile() async { + try { + final XFile? pickedFile = await _picker.pickImage( + source: ImageSource.gallery, + ); + if(null==pickedFile){ + return; + } + SmartDialog.showLoading(msg: '上传中'); + uploadImage(quToken,pickedFile,ImgPath.CALL_OUT_IMAGE,(result){ + SmartDialog.dismiss(force: true); + if (result.toString().isNotEmpty) { + imaglist.add(result); + update(); + } else { + getToken(); + } + }); + } catch (_) { + SmartDialog.dismiss(force: true); + } + } + + void getFeedBack() async { + if (photoController.text.isEmpty) { + showOKToast('请输入手机号'); + } else if (textEditingController.text.isEmpty) { + showOKToast('请输入您的问题'); + } else { + // var result = await DioManager.instance.postBody(url: Api.registerFeedback, params: { + // "content": textEditingController.text, + // "images": imaglist, + // "mobile": photoController.text + // }); + // if (result['code'] == 200) { + // showOKToast('提交成功'); + // Get.back(); + // } else { + // showOKToast(result['msg']); + // } + } + + } + +} diff --git a/circle_app/lib/circle_app/help_back/view.dart b/circle_app/lib/circle_app/help_back/view.dart new file mode 100644 index 0000000..3abe820 --- /dev/null +++ b/circle_app/lib/circle_app/help_back/view.dart @@ -0,0 +1,260 @@ +import 'package:circle_app/commons/colors/app_color.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../commons/Widgets/my_app_bar.dart'; +import '../../router/routers.dart'; +import '../../utils/util.dart'; +import 'logic.dart'; + +class Help_BackPage extends StatelessWidget { + Help_BackPage({Key? key}) : super(key: key); + + final logic = Get.find(); + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (Help_BackLogic controller) { + return GestureDetector( + onTap: () { + FocusManager.instance.primaryFocus?.unfocus(); + }, + child: Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getBaseImage("home_back")), + fit: BoxFit.cover, + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: MyAppBar( + centerTitle: '获取帮助', + ), + body: SingleChildScrollView( + child: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + margin: EdgeInsets.only( + left: 16.0.sp, + top: 16.0.sp, + right: 16.0.sp, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.0.sp), + color: const Color( + 0xFF4C3E5F), + ), + height: 40.0.sp, + child: Row( + // mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + alignment: Alignment.centerLeft, + padding: + EdgeInsets.only(left: 16.0.sp, right: 10.sp,top: 4.sp), + child: Text( + "+86", + style: TextStyle( + color: Colors.white, + fontSize: 14.0.sp, + ), + )), + Expanded( + child: Container( + height: 32.sp, + alignment: Alignment.center, + child: TextField( + controller: logic.photoController, + textAlignVertical: TextAlignVertical.center, + maxLines: 1, + decoration: InputDecoration( + hintText: '请输入手机号,方便我们联系您', + counterText:"", + hintStyle: TextStyle( + color: Colors.grey.shade300, + fontSize: 14.0.sp, + ), + border: InputBorder.none, + ), + style: TextStyle( + color: Colors.white, + fontSize: 14.0.sp, + height: 1.0.sp, + ), + ), + ), + ) + ], + ), + ), + Stack( + children: [ + Container( + height: 200, + margin: EdgeInsets.symmetric( + horizontal: 16.sp, vertical: 16.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(13), + color: const Color( + 0xFF4C3E5F), + ), + padding: EdgeInsets.all(13), + child: TextField( + maxLength: 200, + controller: controller.textEditingController, + onChanged: (msg){ + print(msg); + controller.maxMsg = '${msg.length}/200'; + controller.update(); + }, + decoration: InputDecoration( + hintText: '请详细描述问题,方便我们帮您处理~', + counterText: '', + hintStyle: TextStyle( + color: Color(0xFFB7BECC), fontSize: 14.sp), + border: InputBorder.none, + ), + maxLines: null, + style: TextStyle(color: Colors.white), + ), + ), + Positioned( + right: 30.sp, + bottom: 30.sp, + child: Text( + controller.maxMsg, + style: TextStyle(color: Colors.white), + )) + ], + ), + Container( + height: 120.sp, + margin: EdgeInsets.only(left: 8.sp, right: 16.sp), + child: GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, // 每行显示的项目数量 + ), + itemCount:controller.imaglist.length<3 ? controller.imaglist.length+1: controller.imaglist.length, // Replace with your item count + itemBuilder: (context, index) { + + if (index == 0&&controller.imaglist.length<3) { + // 第一个项目,显示固定的图片 + return GestureDetector( + onTap: () { + controller.getImageFile(); + }, + child: Container( + margin: EdgeInsets.all(5.sp), + child: Image( + image: + AssetImage(getMineImage("icon_img_add")), + ), + ), + ); + } else { + // 后续项目,根据接口获取数据 + // 假设通过接口获取到的数据存储在一个名为 data 的列表中 + // var itemData = data[index - 1]; // 减去第一个固定图片的索引 + return Container( + margin: EdgeInsets.all(5.sp), + child: Center( + child: _buildImageItem(controller.imaglist.length<3 ? + controller.imaglist[index-1]: controller.imaglist[index], // Replace with your item count + controller,controller.imaglist.length<3 ? index-1:index ), + ), + ); + } + }, + ), + ), + Padding( + padding: EdgeInsets.only(left: 18.sp, top: 8.sp), + child: Text( + '最多选择3张图片', + style: + TextStyle(color: Color(0xFFB7BECC), fontSize: 12), + ), + ), + SizedBox(height: 50), + GestureDetector( + onTap: () { + // showToast("完善资料"); + controller.getFeedBack(); + // Get.toNamed(AppRoutes.Complete_materialPage, arguments: "user"); + // controller.onInit(); + }, + child: Center( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(21.sp), + gradient: AppColor.mainVerLinearGradient + ), + padding: EdgeInsets.only( + top: 14.sp, bottom: 14.sp, left: 95.sp, right: 95.sp), + child: Text( + "提交", + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + ), + ), + ), + ), + ), + ], + ), + ), + )), + ), + ); + }); + } + + Widget _buildImageItem(String url, Help_BackLogic controller, int index) { + return Stack( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(0.0), + child: Container( + width: double.infinity, // 设置容器宽度为屏幕宽度 + height: double.infinity, // 设置容器高度为屏幕高度 + child: ClipRRect( + borderRadius: BorderRadius.circular(0.0), + child: GestureDetector( + onTap: () { + Get.toNamed(Routes.SwiperPage, arguments: { + 'imaglist': controller.imaglist, + 'index': index + }); + }, + child: Image.network( + fit: BoxFit.cover, + url, + ), + ), + ), + ), + ), + Positioned( + top: 0, + right: 0, + child: GestureDetector( + onTap: () { + controller.imaglist.removeAt(index); + controller.update(); + }, + child: Image( + image: AssetImage(getMineImage("icon_img_del")), + width: 20.sp, + height: 20.sp, + ), + )) + ], + ); + } + +} diff --git a/circle_app/lib/circle_app/msg/TIMUIKitConversation/tim_uikit_conversation.dart b/circle_app/lib/circle_app/msg/TIMUIKitConversation/tim_uikit_conversation.dart index cb941ef..76bb454 100644 --- a/circle_app/lib/circle_app/msg/TIMUIKitConversation/tim_uikit_conversation.dart +++ b/circle_app/lib/circle_app/msg/TIMUIKitConversation/tim_uikit_conversation.dart @@ -751,11 +751,7 @@ class _TIMConversationState extends TIMUIKitState { )); }); }) - : (widget.emptyBuilder != null - ? widget.emptyBuilder!() - : recommendCircleFriendData.isNotEmpty - ? recommendCircleFriendWidget() - : Container()); + : Container(); } // EasyRefresh( diff --git a/circle_app/lib/circle_app/msg/TIMUIKitConversation/tim_uikit_conversation_item.dart b/circle_app/lib/circle_app/msg/TIMUIKitConversation/tim_uikit_conversation_item.dart index 0bcc476..cc8a7f3 100644 --- a/circle_app/lib/circle_app/msg/TIMUIKitConversation/tim_uikit_conversation_item.dart +++ b/circle_app/lib/circle_app/msg/TIMUIKitConversation/tim_uikit_conversation_item.dart @@ -139,37 +139,37 @@ class TIMConversationItem extends TIMUIKitStatelessWidget { @override Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { int vipType = 0; - // if (userInfo != null && myuserInfo != null) { - // if (userInfo!.customInfo! - // .containsKey('Label')) { - // if (userInfo!.customInfo!['Label'] - // .toString() - // .isNotEmpty) { - // Map otherInfo = jsonDecode(userInfo! - // .customInfo!['Label'] - // .toString()); - // Map myInfo = jsonDecode(myuserInfo! - // .customInfo!['Label'] - // .toString()); - // - // if (otherInfo.containsKey('mark')) { - // mark = otherInfo['mark'] ?? 0; - // } - // } - // } - // - // if (userInfo != null) { - // List userIdList = - // userInfo!.userID!.split('_'); - // if (userIdList.length >= 4) { - // if (int.parse(userIdList[2]) == 10) { - // isOfficial = true; - // } else { - // isOfficial = false; - // } - // } - // } - // } + if (userInfo != null && myuserInfo != null) { + if (userInfo!.customInfo! + .containsKey('Label')) { + if (userInfo!.customInfo!['Label'] + .toString() + .isNotEmpty) { + Map otherInfo = jsonDecode(userInfo! + .customInfo!['Label'] + .toString()); + Map myInfo = jsonDecode(myuserInfo! + .customInfo!['Label'] + .toString()); + + if (otherInfo.containsKey('mark')) { + mark = otherInfo['mark'] ?? 0; + } + } + } + + if (userInfo != null) { + List userIdList = + userInfo!.userID!.split('_'); + if (userIdList.length >= 4) { + if (int.parse(userIdList[2]) == 10) { + isOfficial = true; + } else { + isOfficial = false; + } + } + } + } final TUITheme theme = value.theme; final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; @@ -229,10 +229,10 @@ class TIMConversationItem extends TIMUIKitStatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(6.5.sp), - gradient: sexBgGradient(userInfo!.role ?? 0)), - child: Text(getGenderStr(userInfo!.role ?? 0), + gradient: sexBgGradient(userInfo?.role ?? 0)), + child: Text(getGenderStr(userInfo?.role ?? 0), style: TextStyle( - color: sexBgColor(userInfo!.role ?? 0), + color: sexBgColor(userInfo?.role ?? 0), fontSize: 9.sp, ),), ) @@ -252,7 +252,7 @@ class TIMConversationItem extends TIMUIKitStatelessWidget { Row( children: [ Text( - nickName, + nickName ?? '', softWrap: true, textAlign: TextAlign.left, overflow: TextOverflow.ellipsis, @@ -279,7 +279,7 @@ class TIMConversationItem extends TIMUIKitStatelessWidget { // if (vipType > 0) Container( margin: EdgeInsets.only(left: 5.sp,bottom: isOfficial ? 5.sp : 0.sp), - child: UserTagWidget(mark)), + child: UserTagWidget(mark ?? 0)), Expanded( child:Container()), diff --git a/circle_app/lib/circle_app/msg/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart b/circle_app/lib/circle_app/msg/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart index b2c7fe9..a837e42 100644 --- a/circle_app/lib/circle_app/msg/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart +++ b/circle_app/lib/circle_app/msg/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart @@ -139,9 +139,10 @@ class _TIMLastMsgState extends TIMUIKitState { final msgStatus = widget.lastMsg!.status; final theme = Provider.of(context).theme; final msgType = widget.lastMsg; - if (msgStatus == MessageStatus.V2TIM_MSG_STATUS_SEND_FAIL && msgType != MessageElemType.V2TIM_ELEM_TYPE_CUSTOM) { + if (msgStatus == MessageStatus.V2TIM_MSG_STATUS_SEND_FAIL && msgType?.elemType != MessageElemType.V2TIM_ELEM_TYPE_CUSTOM) { return Icon(Icons.error, color: theme.cautionColor, size: 16); } + if (msgStatus == MessageStatus.V2TIM_MSG_STATUS_SENDING) { return Icon(Icons.arrow_back, color: theme.weakTextColor, size: 16); }