From b86d49ee2c0a9272e69eaeef9b51989b1d67b313 Mon Sep 17 00:00:00 2001 From: YangYuhao Date: Thu, 29 Jun 2023 18:33:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=96=8A=E8=AF=9D=20=20?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90=20=E8=BF=98=E5=B7=AE?= =?UTF-8?q?=E8=87=B3=E5=B0=8A=E5=96=8A=E8=AF=9D=E5=92=8C=E6=94=AF=E4=BB=98?= =?UTF-8?q?vip=20=E5=8A=9F=E8=83=BD=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=E6=88=91=E7=9A=84=E7=95=8C=E9=9D=A2=E6=8E=A5=E5=8F=A3=E5=92=8C?= =?UTF-8?q?=20=E4=B8=AA=E4=BA=BA=E4=B8=AD=E5=BF=83=E5=92=8C=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E4=BB=96=E4=BA=BA=E4=B8=AA=E4=BA=BA=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E7=9A=84=E5=9F=BA=E7=A1=80=E4=BF=A1=E6=81=AF=E5=AE=8C=E6=88=90?= =?UTF-8?q?=20=20=E5=A2=9E=E5=8A=A0=E8=A7=86=E9=A2=91=E5=8E=8B=E7=BC=A9?= =?UTF-8?q?=E5=92=8C=E5=9B=BE=E7=89=87=E5=8E=8B=E7=BC=A9=20=E5=B0=81?= =?UTF-8?q?=E8=A3=85=20=E4=B8=8A=E4=BC=A0=E4=B8=83=E7=89=9B=E4=BA=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/lib/app/call_out/logic.dart | 340 +++++++++++++----- circle_app/lib/app/call_out/view.dart | 109 ++++++ circle_app/lib/app/circle/logic.dart | 4 +- circle_app/lib/app/circle/view.dart | 13 +- circle_app/lib/app/feedback/logic.dart | 11 +- .../app/login/complete_material/logic.dart | 74 ++-- .../lib/app/login/complete_material/view.dart | 1 + circle_app/lib/app/minefragment/logic.dart | 99 ++++- circle_app/lib/app/minefragment/view.dart | 121 ++++--- circle_app/lib/app/select_circle/logic.dart | 30 +- circle_app/lib/app/select_circle/view.dart | 44 +-- circle_app/lib/app/userinfo/logic.dart | 133 +++++++ circle_app/lib/app/userinfo/state.dart | 7 +- circle_app/lib/app/userinfo/view.dart | 75 ++-- circle_app/lib/common/errorcode.dart | 237 ++++++++++++ circle_app/lib/network/api.dart | 15 + circle_app/lib/network/dio_manager.dart | 8 +- circle_app/lib/util/qiniu.dart | 72 ++++ circle_app/lib/util/util.dart | 114 ++++++ circle_app/pubspec.yaml | 6 + 20 files changed, 1255 insertions(+), 258 deletions(-) create mode 100644 circle_app/lib/common/errorcode.dart create mode 100644 circle_app/lib/util/qiniu.dart diff --git a/circle_app/lib/app/call_out/logic.dart b/circle_app/lib/app/call_out/logic.dart index 5dc3c6d..497a59d 100644 --- a/circle_app/lib/app/call_out/logic.dart +++ b/circle_app/lib/app/call_out/logic.dart @@ -4,16 +4,22 @@ import 'dart:typed_data'; import 'package:circle_app/util/util.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_luban/flutter_luban.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:video_player/video_player.dart'; import 'package:video_thumbnail/video_thumbnail.dart'; +import '../../common/errorcode.dart'; import '../../network/api.dart'; import '../../network/dio_manager.dart'; import '../../router/app_routers.dart'; +import '../../util/qiniu.dart'; import '../login/complete_material/logic.dart'; import '../select_circle/logic.dart'; import 'state.dart'; @@ -26,11 +32,11 @@ class Call_outLogic extends GetxController { late ConfigBean configBean; String circleName = ""; final ImagePicker _picker = ImagePicker(); - var storage = Storage(); var quToken = ''; VideoPlayerController? videoPlayerController; - List numbers = []; + List myConfigData= Get.arguments['numbers']; + int vip = 0; @override void onClose() { @@ -41,58 +47,76 @@ class Call_outLogic extends GetxController { @override void onInit() async { super.onInit(); - var data = - await DioManager.instance.get(url: Api.getCircleList, params: {}); + if(myConfigData!=null){ + // print(myConfigData.name); + numbers.addAll(myConfigData); + circleName = numbers[0].name; + SharedPreferences prefs = await SharedPreferences.getInstance(); + vip = prefs.getInt("vip")??0; + if(vip == 2){ + isCheck = true; + } + update(); + } + + + var data = await DioManager.instance.get(url: Api.getCircleList, params: {}); var bean = BaseResponse.fromJson( data, (data) => ConfigBean.fromJson(data)); - configBean = bean.data!; + if (bean.isSuccess()) { + configBean = bean.data!; + } else { + showToast(bean.msg); + } var quniuData = await DioManager.instance.get(url: Api.getqiniuToken, params: {}); var qiniuBean = BaseResponse.fromJson( quniuData, (quniuData) => QnTokenData.fromJson(quniuData)); quToken = qiniuBean.data!.token.toString(); + + } sendShout() async { if (numbers.isEmpty) { - showToast("选择圈子"); + showToast("请选择要喊话的圈子。"); return; } if (textEditingController.text.isEmpty) { showToast("请输入喊话内容"); return; } - if (state.imaglist.isEmpty || state.videolist.isEmpty) { - if (textEditingController.text.length < 50) { - showToast("内容不丰富"); + if (state.imaglist.isEmpty && state.videolist.isEmpty) { + if (textEditingController.text.length < 30) { + showToast("您当前未添加图片或视频,请至少输入30字故事内容。"); return; } } else { if (!state.imaglist.isEmpty) { - if (textEditingController.text.length < 10) { - showToast("内容不丰富"); + if (textEditingController.text.length < 5) { + showToast("请至少输入5个字内容"); return; } } if (!state.videolist.isEmpty) { - if (textEditingController.text.length < 10) { - showToast("内容不丰富"); + if (textEditingController.text.length < 5) { + showToast("请至少输入5个字内容"); return; } } } - + List myBean = []; - if (!state.imaglist.isEmpty){ + if (!state.imaglist.isEmpty) { state.imaglist.forEach((element) { myBean.add(MyBean(type: 1, url: element).toJson()); }); } - if (!state.videolist.isEmpty){ - myBean.add(MyBean(type: 1, url: state.videolist[0]).toJson()); + if (!state.videolist.isEmpty) { + myBean.add(MyBean(type: 2, url: state.videolist[0]).toJson()); } -print(myBean.toString()); + print(myBean.toString()); var data = await DioManager.instance.post(url: Api.SendShout, params: { 'album': myBean, 'content': textEditingController.text, @@ -100,12 +124,147 @@ print(myBean.toString()); 'useQueen': isCheck, }); - //Navigator.pop(context, numbers); + var beandata = BaseResponse.fromJson(data, (jsonData) => jsonData,); + + if (beandata.isSuccess()) { + showToast(beandata.msg); + // Navigator.pop(Get.context!, numbers); + Get.back(); + }else if(beandata.code == 30503){ + if(beandata.data ==null){ + return ; + } + showToast(beandata.msg); + var callOutBean = BaseResponse>.fromJson( + data, + (jsonData) => List.from(jsonData), + ); + + textEditingController.text = filterSensitiveWords(textEditingController.text , callOutBean.data!); + print(filterSensitiveWords(textEditingController.text , callOutBean.data!)); + update(); + } else if(beandata.code == 30505){ + var callOutBean = BaseResponse.fromJson(data, (jsonData) => CirclePaymentBean.fromJson(jsonData),); + showDialog(); + // tipWdiget() + }else{ + showToast(beandata.msg); + } + } + void showDialog(){ + Get.bottomSheet(Scaffold( + backgroundColor: Colors.transparent, + body: Container( + width: Get.width, + height: Get.height, + child: Center( + child: Container( + width: 339.sp, + height: 330.sp, + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.fill, + image: AssetImage(getCircleImage('add_tip_bg')))), + child: Stack( + alignment: Alignment.center, + children: [ + Positioned( + top: 5.sp, + right: 12.sp, + child: GestureDetector( + onTap: () { + Get.back(); + }, + child: Image.asset( + getCircleImage('close'), + width: 24.sp, + ), + )), + Positioned( + top: 24.sp, + child: Text( + '解锁圈子才能发布喊话', + style: TextStyle(color: Colors.white, fontSize: 16.sp), + )), + Positioned( + left: 17.sp, + top: 64.sp, + child: Text( + '为什么要解锁圈子?', + style: TextStyle(color: Colors.white, fontSize: 16.sp), + )), + Positioned( + top: 98.sp, + child: Container( + width: 339.sp, + padding: EdgeInsets.only(left: 17.sp, right: 17.sp), + child: Text( + '为打造纯净的社交环境,更好地服务大家,基于以下几方面考虑:1、平台升级为全天24小时人工审核,保证用户真实,避免骗子、酒托、虚假人士等扰乱平台 ;2、杜绝未入圈用户随意骚扰或影响已入圈的跨友;3、谢绝只会白嫖的猎奇人士。', + style: TextStyle( + color: Color.fromRGBO(247, 250, 250, 0.8), + fontSize: 12.sp)), + )), + Positioned( + bottom: 18.sp, + child: Container( + width: 168.sp, + height: 42.sp, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(21.sp), + gradient: const LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [Color(0xff0AFCFF), Color(0xffD739EA)])), + child: Text( + '立即解锁', + style: TextStyle(color: Colors.white, fontSize: 16.sp), + ), + )), + Positioned( + bottom: 72.sp, + child: Container( + child: Row( + children: [ + Text( + '¥18', + style: TextStyle( + color: Color(0xffE845FF), + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ), + SizedBox( + width: 2.sp, + ), + Text( + '(原价60)', + style: TextStyle( + color: Colors.white70, + fontSize: 16.sp, + fontWeight: FontWeight.w400, + decoration: TextDecoration.lineThrough, + decorationColor: Colors.white70, + ), + ), + ], + ), + )) + ], + ), + ), + ), + ), + ), + isScrollControlled: true, + enableDrag: false + ); } startSelectCircleActivity() async { var data = await Get.toNamed(AppRoutes.SelectCircleActivity, - arguments: {"interestMap": configBean.interestMap, "isRodio": true}); + arguments: {"interestMap": configBean.interestMap, + 'selectCircle':numbers, + "isRodio": true}); if (null != data) { numbers = data; circleName = numbers[0].name; @@ -117,8 +276,8 @@ print(myBean.toString()); showImg() async { try { - if (state.videolist.isNotEmpty) { - showToast("已添加图片,无法添加图片。"); + if (state.videolist.length!=0) { + showToast("已添加视频,无法添加图片。"); return; } if (state.imaglist.length == 6) { @@ -128,7 +287,24 @@ print(myBean.toString()); final XFile? pickedFile = await _picker.pickImage( source: ImageSource.gallery, ); - _setImageFileListFromFile(pickedFile!); + SmartDialog.showLoading(); + var path = await getApplicationSupportDirectoryPath(); + CompressObject compressObject = CompressObject( + imageFile:File(pickedFile!.path), //image + path:path, //compress to path + quality: 80,//first compress quality, default 80 + step: 9,//compress quality step, The bigger the fast, Smaller is more accurate, default 6 + mode: CompressMode.LARGE2SMALL,//default AUTO + ); + Luban.compressImage(compressObject).then((_path) { + updataQiniu(pickedFile!,CONFIG.CALL_OUT_IMAGE,quToken,(result){ + state.imaglist.add(result); + update(); + }); + }); + + + } catch (e) { print(e); } @@ -157,90 +333,55 @@ print(myBean.toString()); return completer.future; } - void _setImageFileListFromFile(XFile pickedFile) { - SmartDialog.showLoading(); - String imgPath = CONFIG.CALL_OUT_IMAGE + pickedFile.name; - PutController putController = PutController(); - putController.addStatusListener((StorageStatus status) { - if (status == StorageStatus.Success) { - var headUrl = CONFIG.IMAGE_HEAD + imgPath; - state.imaglist.add(headUrl); - update(); - SmartDialog.dismiss(); - } - print('状态变化: 当前任务状态:$status'); - }); - storage.putFile(File(pickedFile.path), quToken, - options: PutOptions( - controller: putController, - key: imgPath)); - } showVideo() async { if (state.imaglist.length != 0) { showToast("已添加图片,无法添加视频。"); return; } - if (state.videolist.length == 6) { - showToast("最多上传6个视频哦~"); + if (state.videolist.length!=0) { + showToast("最多上传1个视频哦~"); return; } try { final XFile? pickedFile = await _picker.pickVideo( source: ImageSource.gallery, ); - print(pickedFile!.path.toString()); - videoPlayerController = VideoPlayerController.file( - File(pickedFile!.path), - videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true), - ); - await videoPlayerController?.initialize(); - final Duration videoDuration = videoPlayerController!.value.duration; - final double durationInSeconds = videoDuration.inSeconds.toDouble(); - print(durationInSeconds.toString()); - if (durationInSeconds >= 5 && durationInSeconds <= 30) { - videoPlayerController?.setLooping(true); - videoPlayerController?.addListener(() { - if (!videoPlayerController!.value.isPlaying) { - // Navigator.pop(context); - } - }); + SmartDialog.showLoading(); + var path = await getApplicationSupportDirectoryPath(); + compressVideo(pickedFile!.path,path,(result) async{ + print(result); + videoPlayerController = VideoPlayerController.file( + File(result), + videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true), + ); + await videoPlayerController?.initialize(); + final Duration videoDuration = videoPlayerController!.value.duration; + final double durationInSeconds = videoDuration.inSeconds.toDouble(); + print(durationInSeconds.toString()); + if (durationInSeconds >= 5 && durationInSeconds <= 30) { + videoPlayerController?.setLooping(true); + videoPlayerController?.addListener(() { + if (!videoPlayerController!.value.isPlaying) { + // Navigator.pop(context); + } + }); - _setVideoFileListFromFile(pickedFile!); - }else{ - showToast("请上传5-30秒的视频"); - } + upVideoQiniu(result,pickedFile.name,CONFIG.CALL_OUT_VIDEO,quToken,(result){ + state.videolist.add(result); + update(); + }); + } else { + showToast("请上传5-30秒的视频"); + } + }); - - } catch (e) {} } - void _setVideoFileListFromFile(XFile pickedFile) { - SmartDialog.showLoading(); - String videoPath = CONFIG.CALL_OUT_VIDEO + pickedFile.name; - PutController putController = PutController(); - putController.addStatusListener((StorageStatus status) async { - print('状态变化: 当前任务状态:$status'); - if (status == StorageStatus.Success) { - // var img = await getFirstPic(CONFIG.IMAGE_HEAD + pickedFile.name); - state.videolist.add(CONFIG.IMAGE_HEAD + videoPath); - //state.videoThumbnaillist =img; - print(CONFIG.IMAGE_HEAD + videoPath); - - update(); - SmartDialog.dismiss(); - } - }); - storage.putFile(File(pickedFile.path), quToken, - options: PutOptions( - controller: putController, - key: CONFIG.CALL_OUT_VIDEO + pickedFile.name)); - } - Future _loadCaptions(BuildContext context) async { final String fileContents = await DefaultAssetBundle.of(context) .loadString('assets/bumble_bee_captions.vtt'); @@ -282,3 +423,28 @@ class ThumbnailResult { required this.height, required this.width}); } + + +class CirclePaymentBean { + final int id; + final String title; + final double amount; + final double oldAmount; + + CirclePaymentBean({ + required this.id, + required this.title, + required this.amount, + required this.oldAmount, + }); + + factory CirclePaymentBean.fromJson(Map json) { + return CirclePaymentBean( + id: json['id'] as int, + title: json['title'] as String, + amount: json['amount'] as double, + oldAmount: json['old_amount'] as double, + ); + } +} + diff --git a/circle_app/lib/app/call_out/view.dart b/circle_app/lib/app/call_out/view.dart index d742299..69e80b2 100644 --- a/circle_app/lib/app/call_out/view.dart +++ b/circle_app/lib/app/call_out/view.dart @@ -571,7 +571,9 @@ class Call_outPage extends StatelessWidget { GestureDetector( onTap: () { Navigator.pop(context); + controller.videoPlayerController=null; + controller.state.videolist = []; controller.update(); }, child: Container( @@ -613,4 +615,111 @@ class Call_outPage extends StatelessWidget { }, ); } + + + // tipWdiget() { + // return Container( + // width: Get.width, + // height: Get.height, + // child: Center( + // child: Container( + // width: 339.sp, + // height: 330.sp, + // decoration: BoxDecoration( + // image: DecorationImage( + // fit: BoxFit.fill, + // image: AssetImage(getCircleImage('add_tip_bg')))), + // child: Stack( + // alignment: Alignment.center, + // children: [ + // Positioned( + // top: 5.sp, + // right: 12.sp, + // child: GestureDetector( + // onTap: () { + // Get.back(); + // }, + // child: Image.asset( + // getCircleImage('close'), + // width: 24.sp, + // ), + // )), + // Positioned( + // top: 24.sp, + // child: Text( + // '解锁圈子才能主动私聊', + // style: TextStyle(color: Colors.white, fontSize: 16.sp), + // )), + // Positioned( + // left: 17.sp, + // top: 64.sp, + // child: Text( + // '为什么要解锁圈子?', + // style: TextStyle(color: Colors.white, fontSize: 16.sp), + // )), + // Positioned( + // top: 98.sp, + // child: Container( + // width: 339.sp, + // padding: EdgeInsets.only(left: 17.sp, right: 17.sp), + // child: Text( + // '为打造纯净的社交环境,更好地服务大家,基于以下几方面考虑:1、平台升级为全天24小时人工审核,保证用户真实,避免骗子、酒托、虚假人士等扰乱平台 ;2、杜绝未入圈用户随意骚扰或影响已入圈的跨友;3、谢绝只会白嫖的猎奇人士。', + // style: TextStyle( + // color: Color.fromRGBO(247, 250, 250, 0.8), + // fontSize: 12.sp)), + // )), + // Positioned( + // bottom: 18.sp, + // child: Container( + // width: 168.sp, + // height: 42.sp, + // alignment: Alignment.center, + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(21.sp), + // gradient: const LinearGradient( + // begin: Alignment.centerLeft, + // end: Alignment.centerRight, + // colors: [Color(0xff0AFCFF), Color(0xffD739EA)])), + // child: Text( + // '立即解锁', + // style: TextStyle(color: Colors.white, fontSize: 16.sp), + // ), + // )), + // Positioned( + // bottom: 72.sp, + // child: Container( + // child: Row( + // children: [ + // Text( + // '¥18', + // style: TextStyle( + // color: Color(0xffE845FF), + // fontSize: 16.sp, + // fontWeight: FontWeight.w600), + // ), + // SizedBox( + // width: 2.sp, + // ), + // Text( + // '(原价60)', + // style: TextStyle( + // color: Colors.white70, + // fontSize: 16.sp, + // fontWeight: FontWeight.w400, + // decoration: TextDecoration.lineThrough, + // decorationColor: Colors.white70, + // ), + // ), + // ], + // ), + // )) + // ], + // ), + // ), + // ), + // ); + // } + + + } diff --git a/circle_app/lib/app/circle/logic.dart b/circle_app/lib/app/circle/logic.dart index 01496dd..f004c64 100644 --- a/circle_app/lib/app/circle/logic.dart +++ b/circle_app/lib/app/circle/logic.dart @@ -49,8 +49,8 @@ class CircleLogic extends GetxController { showToast(bean.msg); } - getCircleIndexId() { - return circle.lists[state.index].id; + Circle getCircleIndex() { + return circle.lists[state.index]; } } diff --git a/circle_app/lib/app/circle/view.dart b/circle_app/lib/app/circle/view.dart index fa797e9..9be30f2 100644 --- a/circle_app/lib/app/circle/view.dart +++ b/circle_app/lib/app/circle/view.dart @@ -7,6 +7,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_swiper/flutter_swiper.dart'; import 'package:get/get.dart'; +import '../select_circle/logic.dart'; import 'logic.dart'; class CirclePage extends StatefulWidget { @@ -20,6 +21,7 @@ class _CirclePageState extends State with AutomaticKeepAliveClientMixin { @override bool get wantKeepAlive => true; + // 是否需要缓存 final logic = Get.put(CircleLogic()); @@ -82,8 +84,14 @@ class _CirclePageState extends State bottom: 36.sp, right: 10.sp, child: GestureDetector( - onTap: () { - Get.toNamed(AppRoutes.Call_out); + onTap: () async { + List numbers = []; + numbers.add(MyConfigData( + logic.getCircleIndex().id.toString(), + logic.getCircleIndex().title, + false)); + var data = await Get.toNamed(AppRoutes.Call_out, arguments: {'numbers': numbers}); + }, child: Image.asset( getCircleImage('send_msg'), @@ -481,5 +489,4 @@ class _CirclePageState extends State }, ); } - } diff --git a/circle_app/lib/app/feedback/logic.dart b/circle_app/lib/app/feedback/logic.dart index 16869ec..dcf76e0 100644 --- a/circle_app/lib/app/feedback/logic.dart +++ b/circle_app/lib/app/feedback/logic.dart @@ -17,7 +17,7 @@ class FeedbackLogic extends GetxController { final XFile? pickedFile = await _picker.pickImage( source: ImageSource.gallery, ); - _setImageFileListFromFile(pickedFile!); + // setState(() { // _setImageFileListFromFile(pickedFile); // }); @@ -28,12 +28,5 @@ class FeedbackLogic extends GetxController { } } - void _setImageFileListFromFile(XFile pickedFile) { - PutController putController = PutController(); - putController.addStatusListener((StorageStatus status) { - print('状态变化: 当前任务状态:$status'); - }); - // storage.putFile(File(pickedFile.path), quToken, - // options: PutOptions(controller: putController, key: CONFIG.USER_INFO_HEAD+pickedFile.name)); - } + } diff --git a/circle_app/lib/app/login/complete_material/logic.dart b/circle_app/lib/app/login/complete_material/logic.dart index 2bd9396..b92d6de 100644 --- a/circle_app/lib/app/login/complete_material/logic.dart +++ b/circle_app/lib/app/login/complete_material/logic.dart @@ -4,6 +4,7 @@ import 'dart:math'; import 'package:circle_app/network/dio_manager.dart'; import 'package:circle_app/router/app_routers.dart'; import 'package:circle_app/util/util.dart'; +import 'package:flutter_luban/flutter_luban.dart'; import 'package:flutter_pickers/time_picker/model/pduration.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -13,7 +14,9 @@ import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart'; import '../../../common/config.dart'; import '../../../network/api.dart'; import '../../../util/device.dart'; +import '../../../util/qiniu.dart'; import '../../select_circle/logic.dart'; +import '../../userinfo/logic.dart'; import '../login/logic.dart'; import 'state.dart'; @@ -21,7 +24,7 @@ class Complete_materialLogic extends GetxController { final Complete_materialState state = Complete_materialState(); final ImagePicker _picker = ImagePicker(); var type = Get.arguments ?? ""; - var storage = Storage(); + var quToken = ''; var headUrl = ''; @@ -34,8 +37,37 @@ class Complete_materialLogic extends GetxController { List roleList = []; + UserBean? userInfoBean = null; + @override void onInit() async { + if(type!=''){ + var data = await DioManager.instance.get(url: Api.getUserInfo); + var bean = BaseResponse.fromJson( + data, (data) => ResponseBean.fromJson(data)); + if(bean.isSuccess()){ + userInfoBean = bean.data.user; + state.nickName = userInfoBean!.nickname; + state.sex = getGenderContent(userInfoBean!.gender); + state.genderId = userInfoBean!.gender.toString(); + state.age = userInfoBean!.age.toString(); + state.brithday = userInfoBean!.age.toString(); + state.role = getRoleContent(userInfoBean!.role); + state.roleId = userInfoBean!.role.toString(); + state.orientation = getOrientationContent(userInfoBean!.orientation); + state.orientationId = userInfoBean!.orientation.toString(); + state.textEditingController.text = userInfoBean!.nickname; + state.descEditingController.text = userInfoBean!.signature; + headUrl = userInfoBean!.avatar; + update(); + // state.nickName = userInfoBean!.nickname; + }else{ + showToast(bean.msg); + } + + } + + var data = await DioManager.instance.get(url: Api.getqiniuToken, params: {}); var bean = BaseResponse.fromJson( @@ -65,32 +97,30 @@ class Complete_materialLogic extends GetxController { final XFile? pickedFile = await _picker.pickImage( source: ImageSource.gallery, ); - // setState(() { - _setImageFileListFromFile(pickedFile!); - // }); + var path = await getApplicationSupportDirectoryPath(); + CompressObject compressObject = CompressObject( + imageFile:File(pickedFile!.path), //image + path:path, //compress to path + quality: 80,//first compress quality, default 80 + step: 9,//compress quality step, The bigger the fast, Smaller is more accurate, default 6 + mode: CompressMode.LARGE2SMALL,//default AUTO + ); + Luban.compressImage(compressObject).then((_path) { + updataQiniu(pickedFile!,CONFIG.USER_INFO_AVATAR,quToken,(result){ + headUrl = result; + update(); + }); + }); + + + + + } catch (e) { print(e); - // setState(() { - // _pickImageError = e; - // }); } } - void _setImageFileListFromFile(XFile pickedFile) { - SmartDialog.showLoading(); - PutController putController = PutController(); - putController.addStatusListener((StorageStatus status) { - if (status == StorageStatus.Success) { - headUrl = CONFIG.IMAGE_HEAD + pickedFile.name; - print(headUrl); - update(); - SmartDialog.dismiss(); - } - print('状态变化: 当前任务状态:$status'); - }); - storage.putFile(File(pickedFile.path), quToken, - options: PutOptions(controller: putController, key: CONFIG.USER_INFO_AVATAR+pickedFile.name)); - } checkInfo() async { if (state.textEditingController.text.isEmpty) { diff --git a/circle_app/lib/app/login/complete_material/view.dart b/circle_app/lib/app/login/complete_material/view.dart index a636af8..a946b74 100644 --- a/circle_app/lib/app/login/complete_material/view.dart +++ b/circle_app/lib/app/login/complete_material/view.dart @@ -156,6 +156,7 @@ class Complete_materialPage extends StatelessWidget { AppRoutes.SelectCircleActivity, arguments: { "interestMap" :controller.configBean.interestMap, + 'selectCircle':controller.numbers, "isRodio" :false }); if (data != null) { diff --git a/circle_app/lib/app/minefragment/logic.dart b/circle_app/lib/app/minefragment/logic.dart index 424cf16..14617e6 100644 --- a/circle_app/lib/app/minefragment/logic.dart +++ b/circle_app/lib/app/minefragment/logic.dart @@ -1,13 +1,44 @@ -import 'package:dio/dio.dart'; + +import 'dart:ffi'; + import 'package:get/get.dart'; +import '../../network/api.dart'; +import '../../network/dio_manager.dart'; import '../../router/app_routers.dart'; +import '../../util/util.dart'; import 'state.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class MinefragmentLogic extends GetxController { final MinefragmentState state = MinefragmentState(); + UserData? userInfoBean = null; + String ageMsg = ""; + var isVip = 0; + @override + void onInit() async{ + super.onInit(); + var data = await DioManager.instance + .get(url: Api.getUserMine); + var bean = BaseResponse.fromJson( + data, (data) => UserData.fromJson(data)); + if(bean.isSuccess()){ + userInfoBean = bean.data; + if(userInfoBean!=null){ + isVip = userInfoBean!.vip; + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setInt('vip', isVip); + ageMsg = getAgeCOntent(userInfoBean!.gender, userInfoBean!.age, userInfoBean!.role, userInfoBean!.orientation); + } + + update(); + }else{ + showToast(bean.msg); + } + + } jumpSetUp() { Get.toNamed(AppRoutes.SetUpActivity); @@ -15,3 +46,69 @@ class MinefragmentLogic extends GetxController { } +class UserData { + final int id; + final String nickname; + final String avatar; + final String birthday; + final int age; + final int vip; + final int gender; + final int role; + final int orientation; + final double lng; + final double lat; + final String city; + + UserData({ + required this.id, + required this.nickname, + required this.avatar, + required this.birthday, + required this.age, + required this.vip, + required this.gender, + required this.role, + required this.orientation, + required this.lng, + required this.lat, + required this.city, + }); + + factory UserData.fromJson(Map json) { + return UserData( + id: json['user']['id'], + nickname: json['user']['nickname'], + avatar: json['user']['avatar'], + birthday: json['user']['birthday'], + age: json['user']['age'], + vip: json['user']['vip'], + gender: json['user']['gender'], + role: json['user']['role'], + orientation: json['user']['orientation'], + lng: json['user']['lng'], + lat: json['user']['lat'], + city: json['user']['city'], + ); + } +} + +class UserResponse { + final int code; + final String msg; + final UserData data; + + UserResponse({ + required this.code, + required this.msg, + required this.data, + }); + + factory UserResponse.fromJson(Map json) { + return UserResponse( + code: json['code'], + msg: json['msg'], + data: UserData.fromJson(json['data']), + ); + } +} diff --git a/circle_app/lib/app/minefragment/view.dart b/circle_app/lib/app/minefragment/view.dart index df6d929..aecd7fa 100644 --- a/circle_app/lib/app/minefragment/view.dart +++ b/circle_app/lib/app/minefragment/view.dart @@ -11,44 +11,51 @@ class MinefragmentPage extends StatelessWidget { final logic = Get.lazyPut(() => MinefragmentLogic()); - final state = Get.find().state; + final state = Get + .find() + .state; @override Widget build(BuildContext context) { - double statusBarHeight = MediaQuery.of(context).padding.top; + double statusBarHeight = MediaQuery + .of(context) + .padding + .top; - return Scaffold( - body: Container( - width: Get.width, - height: Get.height, - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage(getBaseImage("home_back")), - fit: BoxFit.cover, + return GetBuilder(builder: (logic) { + return Scaffold( + body: Container( + width: Get.width, + height: Get.height, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getBaseImage("home_back")), + fit: BoxFit.cover, + ), ), - ), - child: Padding( - padding: EdgeInsets.only( - top: 20.0 + statusBarHeight, - left: 11.sp, - right: 11.sp, - ), - child: Column( - children: [ - _buildAvatarRow(), - _FriendsRow(), - Container( - child: Image( - image: AssetImage(getHomeImage("icon_vip")), - fit: BoxFit.fill, + child: Padding( + padding: EdgeInsets.only( + top: 20.0 + statusBarHeight, + left: 11.sp, + right: 11.sp, + ), + child: Column( + children: [ + _buildAvatarRow(logic), + _FriendsRow(), + Container( + child: Image( + image: AssetImage(getHomeImage("icon_vip")), + fit: BoxFit.fill, + ), ), - ), - _CircleLiveView(), - ], + _CircleLiveView(), + ], + ), ), ), - ), - ); + ); + }); } Widget _CircleLiveView() { @@ -341,7 +348,7 @@ class MinefragmentPage extends StatelessWidget { ); } - Widget _buildAvatarRow() { + Widget _buildAvatarRow(MinefragmentLogic logic) { return GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { @@ -353,7 +360,7 @@ class MinefragmentPage extends StatelessWidget { child: Row( children: [ Center( - child: _buildAvatar1(), + child: _buildAvatar1(logic), ), Expanded( child: Container( @@ -361,9 +368,9 @@ class MinefragmentPage extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - _buildNameRow(), - SizedBox(height: 6.sp), - _buildInfoRow(), + _buildNameRow(logic), + SizedBox(height: 18.sp), + _buildInfoRow(logic), ], ), ), @@ -374,36 +381,41 @@ class MinefragmentPage extends StatelessWidget { ); } - Widget _buildAvatar1() { - return ClipOval( - child: GestureDetector( - onTap: () { + Widget _buildAvatar1(MinefragmentLogic logic) { + return ClipOval( + child: GestureDetector( + onTap: () { + if(logic.userInfoBean!=null){ var imgList = []; - imgList.add("https://book.flutterchina.club/assets/img/logo.png"); - // Get.toNamed(AppRoutes.Swiper,arguments:imgList); + imgList.add(logic.userInfoBean!.avatar!); + // Get.toNamed(AppRoutes.Swiper,arguments:imgList); Get.toNamed(AppRoutes.Swiper, arguments: { - 'imaglist':imgList, - 'index':0 + 'imaglist': imgList, + 'index': 0 }); + } - }, - child: Image.network( - 'https://book.flutterchina.club/assets/img/logo.png', - width: 65, - height: 65, - ), + }, + child:logic.userInfoBean==null ? Container( + width: 65.sp, + height: 65.sp, + ): Image.network( + logic.userInfoBean!=null ? logic.userInfoBean!.avatar!: "", + width: 65.sp, + height: 65.sp, ), + ), ); } - Widget _buildNameRow() { + Widget _buildNameRow(MinefragmentLogic logic) { return Container( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - "name", + logic.userInfoBean!=null ? logic.userInfoBean!.nickname:"", style: TextStyle( color: Color.fromRGBO(247, 250, 250, 1.0), fontSize: 16, @@ -430,7 +442,7 @@ class MinefragmentPage extends StatelessWidget { ); } - Widget _buildInfoRow() { + Widget _buildInfoRow(MinefragmentLogic logic) { return Row( children: [ Container( @@ -447,7 +459,7 @@ class MinefragmentPage extends StatelessWidget { ), padding: EdgeInsets.only(top: 2, bottom: 2, left: 10, right: 10), child: Text( - "男,33,CD", + logic.ageMsg, style: TextStyle( color: Colors.black, fontSize: 10, @@ -455,11 +467,12 @@ class MinefragmentPage extends StatelessWidget { ), ), SizedBox(width: 6), + logic.isVip>0 ? Image( image: AssetImage(getBaseImage("vip")), width: 44, height: 18, - ), + ):Container(), ], ); } diff --git a/circle_app/lib/app/select_circle/logic.dart b/circle_app/lib/app/select_circle/logic.dart index 1951734..74d5996 100644 --- a/circle_app/lib/app/select_circle/logic.dart +++ b/circle_app/lib/app/select_circle/logic.dart @@ -7,12 +7,36 @@ import 'state.dart'; class Select_circleLogic extends GetxController { late Map interestMap = Get.arguments['interestMap']; bool isRodio = Get.arguments['isRodio']; + List selectCircle = Get.arguments['selectCircle']; + var selectIndex = -1; @override void onInit() async { - interestMap.forEach((key, value) { - arrList.add(MyConfigData(key, value, false)); - }); + if(isRodio){ + List> entries = interestMap.entries.toList(); + + for (var entry in entries.asMap().entries) { + MyConfigData bean = MyConfigData(entry.value.key, entry.value.value, false); + selectCircle.forEach((element) { + if(entry.value.key==element.id){ + bean.isSelect = true; + selectIndex = entry.key; + } + arrList.add(bean); + }); + } + }else{ + interestMap.forEach((key, value) { + MyConfigData bean = MyConfigData(key, value, false); + selectCircle.forEach((element) { + if(key==element.id){ + bean.isSelect = true; + } + }); + arrList.add(bean); + }); + } + update(); } diff --git a/circle_app/lib/app/select_circle/view.dart b/circle_app/lib/app/select_circle/view.dart index 47f8f83..c093912 100644 --- a/circle_app/lib/app/select_circle/view.dart +++ b/circle_app/lib/app/select_circle/view.dart @@ -60,7 +60,7 @@ class Select_circlePage extends StatelessWidget { ); }); } - var selectIndex = -1; + Widget _reportAdapter(Select_circleLogic controller) { return GridView.builder( @@ -76,11 +76,11 @@ class Select_circlePage extends StatelessWidget { return GestureDetector( onTap: () { if (controller.isRodio) { - if(selectIndex != -1){ - controller.arrList[selectIndex].isSelect = false; - print(selectIndex); + if(controller.selectIndex != -1){ + controller.arrList[controller.selectIndex].isSelect = false; + print(controller.selectIndex); } - selectIndex = index; + controller.selectIndex = index; controller.arrList[index].isSelect = true; controller.update(); } else { @@ -95,7 +95,6 @@ class Select_circlePage extends StatelessWidget { } Widget _getItemSelect(MyConfigData bean) { - if (bean.isSelect) { return Container( margin: EdgeInsets.only(left: 8.sp, right: 8.sp, top: 6.sp, bottom: 6.sp), @@ -103,8 +102,8 @@ class Select_circlePage extends StatelessWidget { borderRadius: BorderRadius.circular(20.sp), gradient: LinearGradient( colors: [ - Color(0xFF06F9FA), - Color(0xFFDC5BFD), + bean.isSelect? Color(0xFF06F9FA): Color(0xFF392D53), + bean.isSelect? Color(0xFFDC5BFD): Color(0xFF392D53), ], begin: Alignment.centerLeft, end: Alignment.centerRight, @@ -120,33 +119,6 @@ class Select_circlePage extends StatelessWidget { ), ), ); - } else { - return Container( - margin: - EdgeInsets.only(left: 8.sp, right: 8.sp, top: 6.sp, bottom: 6.sp), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20.0), // 设置圆角半径 - border: Border.all( - color: Color(0xFF392D53), - ), - color: Color(0xFF392D53), - ), - child: Padding( - padding: EdgeInsets.only( - top: 0.sp, bottom: 0.sp, left: 15.sp, right: 15.sp), - child: Center( - child: Text( - bean.name, - style: TextStyle( - fontSize: 11.0, - color: Colors.white, - ), - ), - ), - ), - ), - ); - } + } } diff --git a/circle_app/lib/app/userinfo/logic.dart b/circle_app/lib/app/userinfo/logic.dart index 6a92fb7..d0f3aef 100644 --- a/circle_app/lib/app/userinfo/logic.dart +++ b/circle_app/lib/app/userinfo/logic.dart @@ -1,12 +1,65 @@ import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; +import '../../network/api.dart'; +import '../../network/dio_manager.dart'; +import '../../util/util.dart'; import 'state.dart'; class UserinfoLogic extends GetxController { var userId = Get.arguments ?? ""; final UserinfoState state = UserinfoState(); final ImagePicker _picker = ImagePicker(); + UserBean? userInfoBean = null; + String ageMsg = ""; + var isVip = 0; + var onLineCity = ""; + var isLikeFoMsg = ''; + + @override + void onInit() async { + super.onInit(); + if (userId == '') { + var data = await DioManager.instance.get(url: Api.getUserInfo); + var bean = BaseResponse.fromJson( + data, (data) => ResponseBean.fromJson(data)); + if(bean.isSuccess()){ + isLikeFoMsg = bean.data.imageUrgeCount.toString()+"位圈友感兴趣,其中"+bean.data.likeMeCount.toString()+"位已催您更新"; + userInfoBean = bean.data.user; + isVip = userInfoBean!.vip; + + onLineCity = userInfoBean!.isOnline == true? "在线":"离线"; + if(userInfoBean!.city != null) { + onLineCity = onLineCity + "·" + userInfoBean!.city.toString(); + } + ageMsg = getAgeCOntent(userInfoBean!.gender, userInfoBean!.age, userInfoBean!.role, userInfoBean!.orientation); + }else{ + showToast(bean.msg); + } + + + } else { + var data = await DioManager.instance.get(url: Api.getUserInfoTA); + var bean = BaseResponse.fromJson( + data, (data) => ResponseBean.fromJson(data)); + if(bean.isSuccess()){ + isLikeFoMsg = bean.data.imageUrgeCount.toString()+"位圈友感兴趣,其中"+bean.data.likeMeCount.toString()+"位已催您更新"; + userInfoBean = bean.data!; + isVip = userInfoBean!.vip; + onLineCity = userInfoBean!.isOnline == true? "在线":"离线"; + if(userInfoBean!.city != null){ + onLineCity = onLineCity +"·"+userInfoBean!.city.toString(); + } + + ageMsg = getAgeCOntent(userInfoBean!.gender, userInfoBean!.age, userInfoBean!.role, userInfoBean!.orientation); + }else{ + showToast(bean.msg); + } + } + update(); + + } + Future getImageFile() async { try { final XFile? pickedFile = await _picker.pickImage( @@ -22,3 +75,83 @@ class UserinfoLogic extends GetxController { } } } + +class UserBean { + int id; + String nickname; + String avatar; + String birthday; + int age; + String signature; + int vip; + int gender; + int role; + int orientation; + double lng; + double lat; + String? city; + bool isOnline; + DateTime? offlineTime; + String avatarThumb; + + UserBean({ + required this.id, + required this.nickname, + required this.avatar, + required this.birthday, + required this.age, + required this.signature, + required this.vip, + required this.gender, + required this.role, + required this.orientation, + required this.lng, + required this.lat, + this.city, + required this.isOnline, + this.offlineTime, + required this.avatarThumb, + }); + + factory UserBean.fromJson(Map json) { + return UserBean( + id: json['id'], + nickname: json['nickname'], + avatar: json['avatar'], + birthday: json['birthday'], + age: json['age'], + signature: json['signature'], + vip: json['vip'], + gender: json['gender'], + role: json['role'], + orientation: json['orientation'], + lng: json['lng'], + lat: json['lat'], + city: json['city'], + isOnline: json['isOnline'], + offlineTime: json['offlineTime'] != null ? DateTime.parse(json['offlineTime']) : null, + avatarThumb: json['avatar_thumb'], + ); + } +} + +class ResponseBean { + UserBean user; + int likeMeCount; + int imageUrgeCount; + + ResponseBean({ + required this.user, + required this.likeMeCount, + required this.imageUrgeCount, + }); + + factory ResponseBean.fromJson(Map json) { + return ResponseBean( + user: UserBean.fromJson(json['user']), + likeMeCount: json['like_me_count'], + imageUrgeCount: json['image_urge_count'], + ); + } +} + diff --git a/circle_app/lib/app/userinfo/state.dart b/circle_app/lib/app/userinfo/state.dart index 39276e0..b63fe67 100644 --- a/circle_app/lib/app/userinfo/state.dart +++ b/circle_app/lib/app/userinfo/state.dart @@ -3,10 +3,5 @@ class UserinfoState { ///Initialize variables } - List imaglist = ["https://book.flutterchina.club/assets/img/logo.png", - "https://book.flutterchina.club/assets/img/logo.png", - "https://book.flutterchina.club/assets/img/logo.png", - "https://book.flutterchina.club/assets/img/logo.png", - "https://book.flutterchina.club/assets/img/logo.png", - "https://book.flutterchina.club/assets/img/logo.png",]; + List imaglist = []; } diff --git a/circle_app/lib/app/userinfo/view.dart b/circle_app/lib/app/userinfo/view.dart index 7e0655b..fad9f1f 100644 --- a/circle_app/lib/app/userinfo/view.dart +++ b/circle_app/lib/app/userinfo/view.dart @@ -52,7 +52,7 @@ class _MyTabbedScreenState extends State @override Widget build(BuildContext context) { - return GetBuilder(builder: (UserinfoLogic controller) { + return GetBuilder(builder: (UserinfoLogic logic) { return Container( decoration: BoxDecoration( image: DecorationImage( @@ -63,17 +63,17 @@ class _MyTabbedScreenState extends State child: Scaffold( backgroundColor: Colors.transparent, appBar: MyAppBar( - centerTitle: '个人主页', + centerTitle: logic.userInfoBean!=null? logic.userInfoBean!.nickname+"的主页":"个人主页", ), body: Stack( children: [ Container( - child: buildContent(controller), + child: buildContent(logic), ), Positioned( bottom: 27.sp, width: Get.width, - child: _MeInfoButton(controller), + child: _MeInfoButton(logic), ) ], ), @@ -199,7 +199,7 @@ class _MyTabbedScreenState extends State children: [ _imagelistView(controller), Flexible( - child: buildUserContainer(), + child: buildUserContainer(controller), ), ], ), @@ -209,29 +209,29 @@ class _MyTabbedScreenState extends State Row( children: [ Text( - "name", + controller.userInfoBean!=null ?controller.userInfoBean!.nickname:"" , style: TextStyle( color: Color.fromRGBO(247, 250, 250, 1.0), fontSize: 16, ), ), SizedBox(width: 10.sp), - _buildInfoRow(), + _buildInfoRow(controller), ], ), Row( children: [ Container( margin: EdgeInsets.only(right: 5.sp), - width: 10.sp, - height: 10.sp, + width:5.sp, + height: 5.sp, decoration: BoxDecoration( shape: BoxShape.circle, color: Color(0xFF00FFF4), ), ), Text( - "在线·深圳", + controller.onLineCity, style: TextStyle(color: Color(0xFF00FFF4)), ) ], @@ -292,7 +292,7 @@ class _MyTabbedScreenState extends State Container( margin: EdgeInsets.only(top: 18.sp, bottom: 14.sp), child: Text( - "1314位圈友感兴趣,其中10位已催您更新", + controller.isLikeFoMsg, style: TextStyle(color: Colors.white30), )), Expanded( @@ -395,7 +395,7 @@ class _MyTabbedScreenState extends State ); } - Widget _buildInfoRow() { + Widget _buildInfoRow(UserinfoLogic controller) { return Row( children: [ Container( @@ -413,7 +413,7 @@ class _MyTabbedScreenState extends State padding: EdgeInsets.only( top: 2.sp, bottom: 2.sp, left: 10.sp, right: 10.sp), child: Text( - "男,33,CD", + controller.ageMsg , style: TextStyle( color: Colors.black, fontSize: 10, @@ -421,16 +421,17 @@ class _MyTabbedScreenState extends State ), ), SizedBox(width: 6.sp), + controller.isVip>0 ? Image( image: AssetImage(getBaseImage("vip")), width: 44.sp, height: 18.sp, - ), + ):Container(), ], ); } - Widget buildUserContainer() { + Widget buildUserContainer(UserinfoLogic controller) { return Container( margin: EdgeInsets.symmetric(horizontal: 1.sp, vertical: 14.sp), height: 58.sp, @@ -444,7 +445,7 @@ class _MyTabbedScreenState extends State margin: EdgeInsets.only(left: 24.sp), child: Center( child: Text( - '动物是灵性的动物是灵性的动物是灵性的动物是灵性的动物是灵性的动物是灵性的动物是灵性的,不同于植物。 你若孤独, 它陪伴你。在阳光的午后,蜷缩在你的...', + controller.userInfoBean!=null ? controller.userInfoBean!.signature:"", maxLines: 2, style: TextStyle(color: Colors.white), overflow: TextOverflow.ellipsis, @@ -480,24 +481,32 @@ class _MyTabbedScreenState extends State } Widget _buildAvatar1(UserinfoLogic controller) { - return ClipOval( - child: GestureDetector( - onTap: () { - var imgList = []; - imgList.add("https://book.flutterchina.club/assets/img/logo.png"); - // Get.toNamed(AppRoutes.Swiper,arguments:imgList); - Get.toNamed(AppRoutes.Swiper, arguments: { - 'imaglist':imgList, - 'index':0 - }); - }, - child: Image.network( - 'https://book.flutterchina.club/assets/img/logo.png', - width: 66.sp, - height: 66.sp, - ), - ), + if(controller.userInfoBean==null){ + return Container( + width: 66.sp, + height: 66.sp, ); + }else { + return ClipOval( + child: GestureDetector( + onTap: () { + var imgList = []; + imgList.add(controller.userInfoBean!.avatar); + Get.toNamed(AppRoutes.Swiper, arguments: { + 'imaglist': imgList, + 'index': 0 + }); + }, + child: Image.network( + controller.userInfoBean != null + ? controller.userInfoBean!.avatar + : "", + width: 66.sp, + height: 66.sp, + ), + ), + ); + } } Widget _buildImageItem(String url, UserinfoLogic controller,int index) { diff --git a/circle_app/lib/common/errorcode.dart b/circle_app/lib/common/errorcode.dart new file mode 100644 index 0000000..ccdc348 --- /dev/null +++ b/circle_app/lib/common/errorcode.dart @@ -0,0 +1,237 @@ +enum ErrorCode { + SUCCESS, + ERROR, + NOT_FOUND, + PARAMS_INVALID, + BAN_ACTION, + BAN_DEVICE, + BAN_USER, + BAN_USER_CLOSED, + BAN_USER_DESTROY, + BAN_PB_ACCOUNT_LOGIN, + BAN_PB_FOREVER, + BAN_PB_DEVICE, + TOKEN_INVALID, + TOKEN_NOT_FOUND, + TOKEN_EXPIRED, + TOKEN_LOGIN_OTHER_SIDE, + TEXT_CONTAINS_DENY_WORDS, + FEIGN_ERROR, + FEIGN_CHECK_WORD_ERROR, + FREQUENT_OPERATION, + FREQUENT_SMS_VERIFY, + LIMIT_OPERATION, + LIMIT_SMS_VERIFY, + LIMIT_CSRF, + ACCOUNT_PASSWORD_INVALID, + ACCOUNT_INCOMPLETE, + ACCOUNT_NOT_FOUND, + SMS_CODE_EXPIRE, + SMS_CODE_INVALID, + PHONE_BIND_ALREADY, + VIOLATION_TEXT_FAIL, + INTEREST_JOIN, + INTEREST_EXIT, + INTEREST_NOT_FOUND, + CALLOUT_CONTENT_NO_IMAGE, + CALLOUT_CONTENT_HAVE_IMAGE, + CALLOUT_CONTENT_INVALID, + CALLOUT_QUEEN_LIMIT, + CALLOUT_LIMIT, + CALLOUT_LIMIT_EXPIRE, + CALLOUT_ALBUM_LIMIT, +} + +extension ErrorCodeExtension on ErrorCode { + int get code { + switch (this) { + case ErrorCode.SUCCESS: + return 200; + case ErrorCode.ERROR: + return 500; + case ErrorCode.NOT_FOUND: + return 404; + case ErrorCode.PARAMS_INVALID: + return 1001; + case ErrorCode.BAN_ACTION: + return 4000; + case ErrorCode.BAN_DEVICE: + return 4001; + case ErrorCode.BAN_USER: + return 4002; + case ErrorCode.BAN_USER_CLOSED: + return 4003; + case ErrorCode.BAN_USER_DESTROY: + return 4004; + case ErrorCode.BAN_PB_ACCOUNT_LOGIN: + return 4100; + case ErrorCode.BAN_PB_FOREVER: + return 4101; + case ErrorCode.BAN_PB_DEVICE: + return 4102; + case ErrorCode.TOKEN_INVALID: + return 5000; + case ErrorCode.TOKEN_NOT_FOUND: + return 5001; + case ErrorCode.TOKEN_EXPIRED: + return 5002; + case ErrorCode.TOKEN_LOGIN_OTHER_SIDE: + return 5003; + case ErrorCode.TEXT_CONTAINS_DENY_WORDS: + return 10001; + case ErrorCode.FEIGN_ERROR: + return 10100; + case ErrorCode.FEIGN_CHECK_WORD_ERROR: + return 10101; + case ErrorCode.FREQUENT_OPERATION: + return 20000; + case ErrorCode.FREQUENT_SMS_VERIFY: + return 20001; + case ErrorCode.LIMIT_OPERATION: + return 21000; + case ErrorCode.LIMIT_SMS_VERIFY: + return 21001; + case ErrorCode.LIMIT_CSRF: + return 21002; + case ErrorCode.ACCOUNT_PASSWORD_INVALID: + return 30001; + case ErrorCode.ACCOUNT_INCOMPLETE: + return 30002; + case ErrorCode.ACCOUNT_NOT_FOUND: + return 30003; + case ErrorCode.SMS_CODE_EXPIRE: + return 30100; + case ErrorCode.SMS_CODE_INVALID: + return 30101; + case ErrorCode.PHONE_BIND_ALREADY: + return 30201; + case ErrorCode.VIOLATION_TEXT_FAIL: + return 30300; + case ErrorCode.INTEREST_JOIN: + return 30401; + case ErrorCode.INTEREST_EXIT: + return 30402; + case ErrorCode.INTEREST_NOT_FOUND: + return 30403; + case ErrorCode.CALLOUT_CONTENT_NO_IMAGE: + return 30501; + case ErrorCode.CALLOUT_CONTENT_HAVE_IMAGE: + return 30502; + case ErrorCode.CALLOUT_CONTENT_INVALID: + return 30503; + case ErrorCode.CALLOUT_QUEEN_LIMIT: + return 30504; + case ErrorCode.CALLOUT_LIMIT: + return 30505; + case ErrorCode.CALLOUT_LIMIT_EXPIRE: + return 30506; + case ErrorCode.CALLOUT_ALBUM_LIMIT: + return 30507; + default: + throw Exception('Unknown ErrorCode: $this'); + } + } + + String get message { + switch (this) { + case ErrorCode.SUCCESS: + return '成功'; + case ErrorCode.ERROR: + return '发生错误'; + case ErrorCode.NOT_FOUND: + return '资源没有找到'; + case ErrorCode.PARAMS_INVALID: + return '参数校验错误'; + case ErrorCode.BAN_ACTION: + return '用户当前操作被禁止'; + case ErrorCode.BAN_DEVICE: + return '当前设备被禁止'; + case ErrorCode.BAN_USER: + return '用户不存在或者状态异常'; + case ErrorCode.BAN_USER_CLOSED: + return '账户已被禁用'; + case ErrorCode.BAN_USER_DESTROY: + return '账户已被注销'; + case ErrorCode.BAN_PB_ACCOUNT_LOGIN: + return '账户被冻结登录'; + case ErrorCode.BAN_PB_FOREVER: + return '账户被永久封禁'; + case ErrorCode.BAN_PB_DEVICE: + return '该设备已被封禁'; + case ErrorCode.TOKEN_INVALID: + return '登录异常,请重新登录'; + case ErrorCode.TOKEN_NOT_FOUND: + return '你还没有登录,请先登录'; + case ErrorCode.TOKEN_EXPIRED: + return '登录超时,请重新登录'; + case ErrorCode.TOKEN_LOGIN_OTHER_SIDE: + return '网络异常,请重新登录'; + case ErrorCode.TEXT_CONTAINS_DENY_WORDS: + return '包含违规词,请重新编辑'; + case ErrorCode.FEIGN_ERROR: + return 'feign调用发生异常'; + case ErrorCode.FEIGN_CHECK_WORD_ERROR: + return '检验词汇时发生网络异常,请重试'; + case ErrorCode.FREQUENT_OPERATION: + return '操作频繁'; + case ErrorCode.FREQUENT_SMS_VERIFY: + return '验证码已经发送过了'; + case ErrorCode.LIMIT_OPERATION: + return '操作超过限制'; + case ErrorCode.LIMIT_SMS_VERIFY: + return '验证码当日发送次数已达到上线'; + case ErrorCode.LIMIT_CSRF: + return '请勿重复提交'; + case ErrorCode.ACCOUNT_PASSWORD_INVALID: + return '用户名或者密码错误'; + case ErrorCode.ACCOUNT_INCOMPLETE: + return '账户信息不完整'; + case ErrorCode.ACCOUNT_NOT_FOUND: + return '账户已被销毁或不存在'; + case ErrorCode.SMS_CODE_EXPIRE: + return '验证码已过期'; + case ErrorCode.SMS_CODE_INVALID: + return '验证码错误'; + case ErrorCode.PHONE_BIND_ALREADY: + return '已经绑定手机号,不要重复绑定'; + case ErrorCode.VIOLATION_TEXT_FAIL: + return '{} 包含违规词,请重新编辑'; + case ErrorCode.INTEREST_JOIN: + return '加入圈子失败'; + case ErrorCode.INTEREST_EXIT: + return '退出圈子失败'; + case ErrorCode.INTEREST_NOT_FOUND: + return '没有找到指定圈子'; + case ErrorCode.CALLOUT_CONTENT_NO_IMAGE: + return '您当前未添加图片或视频,请至少输入30字故事内容'; + case ErrorCode.CALLOUT_CONTENT_HAVE_IMAGE: + return '请至少输入5个字内容'; + case ErrorCode.CALLOUT_CONTENT_INVALID: + return '包含违规词汇,无法发布'; + case ErrorCode.CALLOUT_QUEEN_LIMIT: + return '至尊喊话为年会员特权,开通年会员即可享受哦~'; + case ErrorCode.CALLOUT_LIMIT: + return '解锁圈子才能发布喊话'; + case ErrorCode.CALLOUT_LIMIT_EXPIRE: + return '一小时只能发一条喊话哦,请等会再来~'; + case ErrorCode.CALLOUT_ALBUM_LIMIT: + return '图像超过数量'; + default: + throw Exception('Unknown ErrorCode: $this'); + } + } +} + +String getErrorMessageByCode(int code) { + for (ErrorCode errorCode in ErrorCode.values) { + if (errorCode.code == code) { + return errorCode.message; + } + } + return 'Unknown error'; +} + +void main() { + print(getErrorMessageByCode(200)); // Output: 成功 + print(getErrorMessageByCode(500)); // Output: 发生错误 +} diff --git a/circle_app/lib/network/api.dart b/circle_app/lib/network/api.dart index d5e068c..4bc080c 100644 --- a/circle_app/lib/network/api.dart +++ b/circle_app/lib/network/api.dart @@ -41,4 +41,19 @@ class Api { //发布喊话 static const SendShout = 'up-service/callout'; + + + + //mine 基本信息 + static const getUserMine = 'user-service/my/main'; + + + + //个人信息 + static const getUserInfo = 'user-service/my/home'; + + + + //他人信息 + static const getUserInfoTA = 'user-service/user/1/home'; } \ No newline at end of file diff --git a/circle_app/lib/network/dio_manager.dart b/circle_app/lib/network/dio_manager.dart index 3e16868..5276613 100644 --- a/circle_app/lib/network/dio_manager.dart +++ b/circle_app/lib/network/dio_manager.dart @@ -226,16 +226,20 @@ class DioManager { class BaseResponse { int code; String msg; - T? data; + dynamic? data; BaseResponse({required this.code, required this.msg, required this.data}); + isSuccess(){ + return code==200; + } + factory BaseResponse.fromJson(Map json, T Function(dynamic) fromJsonData) { return BaseResponse( code: json['code'], msg: json['msg'], - data: json['data'] != null ? fromJsonData?.call(json['data']) : null, + data: json['data'] != null ? fromJsonData?.call(json['data']) : '', ); } } diff --git a/circle_app/lib/util/qiniu.dart b/circle_app/lib/util/qiniu.dart new file mode 100644 index 0000000..29d4e73 --- /dev/null +++ b/circle_app/lib/util/qiniu.dart @@ -0,0 +1,72 @@ +import 'dart:convert'; +import 'dart:io'; +import 'dart:math'; + +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart'; +import 'package:intl/intl.dart'; + +import '../common/config.dart'; + +typedef void MyCallback(String result); + +void updataQiniu(XFile pickedFile,String path ,String quToken,MyCallback myCallback) { + SmartDialog.showLoading(); + var storage = Storage(); + DateTime now = DateTime.now(); + String yearMonth = DateFormat('yyyyMM').format(now); + String imgPath = path +yearMonth+"/"+generateRandomString(16)+ pickedFile.name; + PutController putController = PutController(); + putController.addStatusListener((StorageStatus status) { + if (status == StorageStatus.Success) { + var headUrl = CONFIG.IMAGE_HEAD + imgPath; + myCallback(headUrl); + SmartDialog.dismiss(); + } + print('状态变化: 当前任务状态:$status'); + }); + + putController.addProgressListener((double status) { + + print('上传进度: $status'); + }); + + storage.putFile(File(pickedFile.path), quToken, + options: PutOptions(controller: putController, key: imgPath)); +} + + + +void upVideoQiniu(String filePath,String name,String path ,String quToken,MyCallback myCallback) { + SmartDialog.showLoading(); + var storage = Storage(); + DateTime now = DateTime.now(); + String yearMonth = DateFormat('yyyyMM').format(now); + String imgPath = path +yearMonth+"/"+generateRandomString(16)+ name; + PutController putController = PutController(); + putController.addStatusListener((StorageStatus status) { + if (status == StorageStatus.Success) { + var headUrl = CONFIG.IMAGE_HEAD + imgPath; + myCallback(headUrl); + SmartDialog.dismiss(); + } + print('状态变化: 当前任务状态:$status'); + }); + + putController.addProgressListener((double status) { + + print('上传进度: $status'); + }); + + storage.putFile(File(filePath), quToken, + options: PutOptions(controller: putController, key: imgPath)); +} + + +String generateRandomString(int length) { + var random = Random.secure(); + var values = List.generate(length, (index) => random.nextInt(256)); + var randomString = base64Url.encode(values); + return randomString.substring(0, length); +} \ No newline at end of file diff --git a/circle_app/lib/util/util.dart b/circle_app/lib/util/util.dart index 9f92f40..8598f2b 100644 --- a/circle_app/lib/util/util.dart +++ b/circle_app/lib/util/util.dart @@ -1,3 +1,4 @@ +import 'dart:io'; import 'dart:ui'; import 'package:circle_app/common/values/values.dart'; @@ -7,6 +8,9 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:get/get.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:get/get_state_manager/get_state_manager.dart'; +import 'package:video_compress/video_compress.dart'; class Util { @@ -113,3 +117,113 @@ String convertToTenThousand(int number) { pushLoginPage() { Get.offAllNamed(AppRoutes.Login); } +String filterSensitiveWords(String input, List sensitiveWords) { + String filteredString = input; + for (String word in sensitiveWords) { + String replacement = '*' * word.length; + filteredString = filteredString.replaceAll(word, replacement); + } + return filteredString; +} + +String getAgeCOntent (int gender,int age,int role,int orientation){ + return "${getGenderContent(gender)}.${age}.${getRoleContent(role)}.${getOrientationContent(orientation)}"; + +} + +String getGenderContent(int number) { + switch (number) { + case 1: + return "男"; + case 2: + return "女"; + case 3: + return "MTF"; + case 4: + return "FTM"; + case 5: + return "CD"; + case 6: + return "酷儿"; + default: + return ""; + } +} +String getOrientationContent(int number) { + switch (number) { + case 1: + return "异性恋"; + case 2: + return "同性恋"; + case 3: + return "双性恋"; + case 4: + return "泛性恋"; + case 5: + return "无性恋"; + case 6: + return "智性恋"; + case 7: + return "性单恋"; + default: + return ""; + } +} +String getRoleContent(int number) { + switch (number) { + case 1: + return "Sado"; + case 2: + return "Maso"; + case 3: + return "Dom"; + case 4: + return "Sub"; + case 5: + return "Switch"; + default: + return ""; + } +} + +typedef void MyCallback(String path); + +Future compressVideo(String inputPath, String outputPath,MyCallback myCallback) async { + final info = await VideoCompress.compressVideo( + inputPath, + quality: VideoQuality.MediumQuality, + deleteOrigin: false, + ); + + if (info != null&&null!=info.path) { + print(info.path); + myCallback(info.path!); + } else { + print('视频压缩失败'); + } +} + + +// 获取应用程序的文档目录路径 +Future getApplicationDocumentsDirectoryPath() async { + final directory = await getApplicationDocumentsDirectory(); + return directory.path; +} + +// 获取应用程序的支持目录路径 +Future getApplicationSupportDirectoryPath() async { + final directory = await getApplicationSupportDirectory(); + return directory.path; +} + +// 获取临时目录路径 +Future getTemporaryDirectoryPath() async { + final directory = await getTemporaryDirectory(); + return directory.path; +} + +// 获取库目录路径 +Future getLibraryDirectoryPath() async { + final directory = await getLibraryDirectory(); + return directory.path; +} diff --git a/circle_app/pubspec.yaml b/circle_app/pubspec.yaml index e6a9f75..599bc32 100644 --- a/circle_app/pubspec.yaml +++ b/circle_app/pubspec.yaml @@ -76,6 +76,12 @@ dependencies: package_info_plus: ^1.4.3+1 #视频播放器 video_player: ^2.6.1 + #时间戳 + flutter_intl: ^0.0.1 + #图片压缩 + flutter_luban: ^0.1.13 + #视频压缩 + video_compress: ^3.1.2 #图片缓存 cached_network_image: ^3.2.3