From 2eb774988e9ec33bf583a96e16db9c4ba03de6de Mon Sep 17 00:00:00 2001 From: CYH <13923927013@163.com> Date: Wed, 22 Nov 2023 12:08:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9B=BE=E7=89=87=E5=8E=8B?= =?UTF-8?q?=E7=BC=A9=E7=AC=AC=E4=B8=89=E6=96=B9=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=90=E7=A4=BA=E7=BA=A2=E7=82=B9=EF=BC=8C?= =?UTF-8?q?=E8=AF=84=E4=BB=B7=E6=9C=89=E5=A5=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/images/mine/edit_good_review.png | Bin 0 -> 5065 bytes circle_app/assets/images/mine/icon_upload.png | Bin 0 -> 6171 bytes circle_app/assets/images/mine/share.png | Bin 0 -> 5754 bytes circle_app/lib/app/aboutapp/view.dart | 149 +++++----- circle_app/lib/app/call_out/logic.dart | 4 +- circle_app/lib/app/call_out/view.dart | 14 +- circle_app/lib/app/chat/view.dart | 2 +- .../app/circle/widgets/info_list_view.dart | 17 +- .../lib/app/circle/widgets/like_view.dart | 18 +- circle_app/lib/app/dialog/UpdateDialog.dart | 4 +- circle_app/lib/app/externalshare/binding.dart | 10 + circle_app/lib/app/externalshare/logic.dart | 67 +++++ circle_app/lib/app/externalshare/state.dart | 6 + circle_app/lib/app/externalshare/view.dart | 257 ++++++++++++++++++ circle_app/lib/app/good_reviews/binding.dart | 10 + circle_app/lib/app/good_reviews/logic.dart | 79 ++++++ circle_app/lib/app/good_reviews/view.dart | 163 +++++++++++ circle_app/lib/app/home/binding.dart | 2 + circle_app/lib/app/home/logic.dart | 110 +++++++- circle_app/lib/app/home/view.dart | 36 ++- circle_app/lib/app/like/view.dart | 13 +- .../app/login/complete_material/logic.dart | 4 +- .../lib/app/login/complete_material/view.dart | 15 +- circle_app/lib/app/minefragment/logic.dart | 14 +- circle_app/lib/app/minefragment/view.dart | 200 +++++++++++++- .../lib/app/msg/sys_notify_list/logic.dart | 19 +- circle_app/lib/app/msg/view.dart | 2 +- circle_app/lib/app/setup/view.dart | 14 + circle_app/lib/common/config.dart | 1 + circle_app/lib/network/dio_manager.dart | 1 - circle_app/lib/router/app_pages.dart | 14 + circle_app/lib/router/app_routers.dart | 4 + circle_app/lib/util/qiniu.dart | 70 +++-- circle_app/pubspec.lock | 18 +- circle_app/pubspec.yaml | 7 +- 35 files changed, 1167 insertions(+), 177 deletions(-) create mode 100644 circle_app/assets/images/mine/edit_good_review.png create mode 100644 circle_app/assets/images/mine/icon_upload.png create mode 100644 circle_app/assets/images/mine/share.png create mode 100644 circle_app/lib/app/externalshare/binding.dart create mode 100644 circle_app/lib/app/externalshare/logic.dart create mode 100644 circle_app/lib/app/externalshare/state.dart create mode 100644 circle_app/lib/app/externalshare/view.dart create mode 100644 circle_app/lib/app/good_reviews/binding.dart create mode 100644 circle_app/lib/app/good_reviews/logic.dart create mode 100644 circle_app/lib/app/good_reviews/view.dart diff --git a/circle_app/assets/images/mine/edit_good_review.png b/circle_app/assets/images/mine/edit_good_review.png new file mode 100644 index 0000000000000000000000000000000000000000..7ae188cd6ce2351e212e7e024d7c9ac870dcc80e GIT binary patch literal 5065 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 literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/mine/icon_upload.png b/circle_app/assets/images/mine/icon_upload.png new file mode 100644 index 0000000000000000000000000000000000000000..c766b298f8fe5c0b577b8db36ddf881cef7e2c72 GIT binary patch literal 6171 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 literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/mine/share.png b/circle_app/assets/images/mine/share.png new file mode 100644 index 0000000000000000000000000000000000000000..1581274a74609e0ebac5f13b4f68fb5b1faf04fc GIT binary patch literal 5754 zcmV-=7KQ1FP)Py0G)Y83RCr$PTX~RH)s;Wz-uJ$xn`TvUjM2CtC_2Pa2O@}=1S7;{%v6CDw~06! zol8i(bG2Ga5bzB{umusF6*Vcg-V|{S;(fr$=m<4s*P&o_|HC-XhB%)(l3xz`v0Za;z5`ZD&{r~{kzYGy7 zM9`=JQGr4LtpO^v#J=~sLE4~{UZu2NUcLt3Zobvs`^3i%&`00znWj_&;K(GVaaI?(*T+P+5?Gqx%RmIu_Cn*EhP zD-CT$1%Is6?=?}nVC;dVw{Z@pyJs_v-x_j&-n+3n5fLwsP+w%-qn6g)Hc%-t#<vk=1pCHPnPy0a2RWZhFK>z-^Y4K6Bi+%F6~bP;ZUR)2d0aeUKk>np&)SDpcC9R9@$V8& zc*mTyT#R-g`v4UzMvPUwmQ$QFEdM3>MOjEU)vNmWiQmHa2LjS=1N6e8%J@j>mo;MK zAn?l<(`Q2pC!3wEGaU~k8=RPgbq9_%9uoP!%XXF)@I8WCW&g=+&w}b>mUTsMnGtG8 zOuDsRi^fm78vAWYy9Lm%@2DPLAoY|&wHI01#t!8(k$`2xrGR0xjZ5(odD#*;@`_`5 z%i-8%{HxCBa-fJc@+(Rq$149JS%JMSyEO-K4sDhW#E??*Tce^GlP>8WNCO7Q2INki zELRGr8^01~!OriUNxKsamel(eSrYRAa)6f55*`S>KU zC0n>7k3M(viDxWYp|X7EbwoH+%$2=R!d}>f_g6;^0*T0>%4XGCimRX2t zptX0U7Y}bycXsw9Okji!GnL`s;1e%%5qoNWBO`Zn9I>972}^8L?c{P~QS0ify2}jadhT69`gw zITyUyeezbw8Ig}mP-3g%K=09__f?usn|krC8F#+`YHugKPp7#@A%4RcTXDM;Nt|J( zn=d@`yvN?af0p;a7L`RJ4h$T(IFtz!2sK-|6hTKPjGTEfZd4tCg=pIA(z<0yR;QB5@_4WNf~7c!V)(3v1v z5yjdZ7s~A3_LR4hjwa1KZ|9OpzW`cxZ?Y;<`ozSfAzNhRPb@?>p9@F6Ch%qHq&yeMe&9ZX~R2)Z8 zOX~NYa$e#5oyDT20R7_L>XEIjg_pXz6Zie#3PN%0D!A%#ro(i`@<7L^-Li!Ia76V1 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 spFBWKm-MIgfjs~pF literal 0 HcmV?d00001 diff --git a/circle_app/lib/app/aboutapp/view.dart b/circle_app/lib/app/aboutapp/view.dart index d1d906b..8389b6f 100644 --- a/circle_app/lib/app/aboutapp/view.dart +++ b/circle_app/lib/app/aboutapp/view.dart @@ -1,5 +1,3 @@ - - import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -8,15 +6,11 @@ import 'package:get/get.dart'; import '../../components/my_app_bar.dart'; import 'logic.dart'; - class AboutappPage extends StatelessWidget { AboutappPage({Key? key}) : super(key: key); final logic = Get.find(); - final state = Get - .find() - .state; - + final state = Get.find().state; @override Widget build(BuildContext context) { @@ -30,7 +24,9 @@ class AboutappPage extends StatelessWidget { ), child: Scaffold( backgroundColor: Colors.transparent, - appBar: const MyAppBar(centerTitle: '关于微乐园',), + appBar: const MyAppBar( + centerTitle: '关于微乐园', + ), body: Scaffold( backgroundColor: Colors.transparent, // Replace with your desired color @@ -39,18 +35,19 @@ class AboutappPage extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, - children: [ - GestureDetector(onTap: (){ - // showToast("13"); - }, - child:Image.asset( - getBaseImage("ic_launcher"), // Replace with your image path - width: 100.sp, - height: 100.sp, - fit: BoxFit.contain, - ) ,) - , + GestureDetector( + onTap: () { + // showToast("13"); + }, + child: Image.asset( + getBaseImage( + "ic_launcher"), // Replace with your image path + width: 100.sp, + height: 100.sp, + fit: BoxFit.contain, + ), + ), SizedBox(height: 20.sp), Text( logic.currentVersion, @@ -105,57 +102,58 @@ class AboutappPage extends StatelessWidget { SizedBox(height: 20.sp), GestureDetector( behavior: HitTestBehavior.opaque, - onTap: (){ + onTap: () { navigateToUserAgreement(); - }, - child: Row( - children: [ - Text( - '用户协议', - style: TextStyle( - color: const Color(0xFFF7FAFA), - fontSize: 16.sp, + }, + child: Row( + children: [ + Text( + '用户协议', + style: TextStyle( + color: const Color(0xFFF7FAFA), + fontSize: 16.sp, + ), ), - ), - const Spacer(), - Image( - image: AssetImage(getHomeImage("icon_in")), - width: 24.sp, - height: 24.sp, - fit: BoxFit.fill, - ), - ], - ),), + const Spacer(), + Image( + image: AssetImage(getHomeImage("icon_in")), + width: 24.sp, + height: 24.sp, + fit: BoxFit.fill, + ), + ], + ), + ), SizedBox(height: 20.sp), GestureDetector( behavior: HitTestBehavior.opaque, - onTap: (){ + onTap: () { navigateToPrivacyPolicy(); - }, - child: Row( - children: [ - Text( - '隐私政策', - style: TextStyle( - color: const Color(0xFFF7FAFA), - fontSize: 16.sp, + }, + child: Row( + children: [ + Text( + '隐私政策', + style: TextStyle( + color: const Color(0xFFF7FAFA), + fontSize: 16.sp, + ), ), - ), - const Spacer(), - Image( - image: AssetImage(getHomeImage("icon_in")), - width: 24.sp, - height: 24.sp, - fit: BoxFit.fill, - ), - ], - ),) - , + const Spacer(), + Image( + image: AssetImage(getHomeImage("icon_in")), + width: 24.sp, + height: 24.sp, + fit: BoxFit.fill, + ), + ], + ), + ), SizedBox(height: 20.sp), GestureDetector( behavior: HitTestBehavior.opaque, - onTap: (){ - logic.getUpVersion(); + onTap: () { + logic.getUpVersion(); }, child: Row( children: [ @@ -167,23 +165,23 @@ class AboutappPage extends StatelessWidget { ), ), const Spacer(), - logic.isUpdate? Container( - width: 6.sp, - height: 5.sp, - margin: EdgeInsets.only(top: 1.sp, right: 8.sp), - decoration: BoxDecoration( - color: Colors.red, - borderRadius: BorderRadius.circular(3.sp), - ), - ):Container(), + logic.isUpdate + ? Container( + width: 10.sp, + height: 10.sp, + margin: EdgeInsets.only(right: 4.sp), + decoration: const BoxDecoration( + color: Colors.red, + shape: BoxShape.circle), + ) + : Container(), Text( - "", + logic.isUpdate ? '有新版本啦' : "", style: TextStyle( color: const Color(0xFFB7BECC), - fontSize: 12.sp, + fontSize: 14.sp, ), ), - SizedBox(width: 8.sp), Image( image: AssetImage(getHomeImage("icon_in")), width: 24.sp, @@ -194,13 +192,13 @@ class AboutappPage extends StatelessWidget { ), ), ], - ),) - ),), + ), + )), + ), ); }); } - // String url = 'https://www.baidu.com'; // Replace with your desired URL // // void _openBrowser() async { @@ -210,5 +208,4 @@ class AboutappPage extends StatelessWidget { // throw 'Could not launch $url'; // } // } - } diff --git a/circle_app/lib/app/call_out/logic.dart b/circle_app/lib/app/call_out/logic.dart index 59b39df..d213a86 100644 --- a/circle_app/lib/app/call_out/logic.dart +++ b/circle_app/lib/app/call_out/logic.dart @@ -349,8 +349,8 @@ class Call_outLogic extends GetxController { } }); - uploadQiniu( - pickedFile.path, pickedFile.name, CONFIG.CALL_OUT_VIDEO, quToken, + uploadQiniuVideo( + File(pickedFile.path), pickedFile.name, CONFIG.CALL_OUT_VIDEO, quToken, (result) { SmartDialog.dismiss(); state.videolist.add(result); diff --git a/circle_app/lib/app/call_out/view.dart b/circle_app/lib/app/call_out/view.dart index 8fa7f56..9779a55 100644 --- a/circle_app/lib/app/call_out/view.dart +++ b/circle_app/lib/app/call_out/view.dart @@ -118,7 +118,7 @@ class _Call_outPageState extends State { child: Stack( children: [ SizedBox( - height: 200.sp, + height: 100.sp, child: TextField( controller: controller.textEditingController, @@ -130,7 +130,7 @@ class _Call_outPageState extends State { setState(() {}); }, style: TextStyle( - color: Colors.white, fontSize: 14.0.sp), + color: Colors.white, fontSize: 17.0.sp), maxLines: 32, maxLength: 200, decoration: InputDecoration( @@ -147,18 +147,18 @@ class _Call_outPageState extends State { ), Positioned( right: 15.sp, - top: 190.sp, + top: 100.sp, child: Text( '${controller.textEditingController.text.length}/200', style: TextStyle( color: Colors.white, fontSize: 12.sp), )), Container( - margin: EdgeInsets.only(top: 220.sp), + margin: EdgeInsets.only(top: 130.sp), child: _imageAdapter(controller)), Container( margin: EdgeInsets.only( - top: 220.sp, left: 15.sp, right: 15.sp), + top: 130.sp, left: 15.sp, right: 15.sp), child: _showVideo(controller), ) ], @@ -347,8 +347,8 @@ class _Call_outPageState extends State { : 240.sp, height: controller.videoPlayerController!.value.size.width < controller.videoPlayerController!.value.size.height - ? 240.sp - : 135.sp, + ? 135.sp / controller.videoPlayerController!.value.aspectRatio + : 240.sp / controller.videoPlayerController!.value.aspectRatio, child: GestureDetector( onTap: () { if (controller.videoPlayerController!.value.isPlaying) { diff --git a/circle_app/lib/app/chat/view.dart b/circle_app/lib/app/chat/view.dart index db619ba..b98f803 100644 --- a/circle_app/lib/app/chat/view.dart +++ b/circle_app/lib/app/chat/view.dart @@ -174,7 +174,7 @@ class _ChatPageState extends State { var data = await Get.toNamed(AppRoutes.UserInfoActivity,arguments: con.userID.toString().split('_').last,preventDuplicates: false); }, - child: Text('TA的主页',style: TextStyle(color: const Color(0xFF00FFF4),fontSize:12.sp,fontWeight: FontWeight.w500),), + child: Text('查看主页',style: TextStyle(color: const Color(0xFF00FFF4),fontSize:12.sp,fontWeight: FontWeight.w500),), ), onPressed: () {}, ), diff --git a/circle_app/lib/app/circle/widgets/info_list_view.dart b/circle_app/lib/app/circle/widgets/info_list_view.dart index 2ef339e..ae6990f 100644 --- a/circle_app/lib/app/circle/widgets/info_list_view.dart +++ b/circle_app/lib/app/circle/widgets/info_list_view.dart @@ -252,13 +252,26 @@ class InfoListViewState extends State with AutomaticKeepAliveClien pushChatPage(data['data']['account_id'].toString().split("_").last,data['data']['account_id'], bean.user!.nickname!); await Future.delayed(Duration(seconds: 1)); + + SharedPreferences sharedPreferences =await SharedPreferences.getInstance(); // SharedPreferencesHelper.getInstance().then((sharedPreferences) { int userId = sharedPreferences.getInt(SharedPreferencesHelper.USERID)??0; String avatar = sharedPreferences.getString(SharedPreferencesHelper.AVATAR)??""; String name = sharedPreferences.getString(SharedPreferencesHelper.NAME)??""; - bean.chat!.users!.add(Users(avatar: avatar,id: userId,nickname: name)); - widget.logic.update(); + + bool isContain = false; + for (var info in bean.chat!.users!) { + if (info.id == userId) { + isContain = true; + } + } + if (!isContain) { + bean.chat!.users!.add(Users(avatar: avatar,id: userId,nickname: name)); + bean.chat!.count = bean.chat!.count! + 1; + widget.logic.update(); + } + } } diff --git a/circle_app/lib/app/circle/widgets/like_view.dart b/circle_app/lib/app/circle/widgets/like_view.dart index 149b248..b1b26b9 100644 --- a/circle_app/lib/app/circle/widgets/like_view.dart +++ b/circle_app/lib/app/circle/widgets/like_view.dart @@ -265,8 +265,22 @@ class _LikeViewState extends State sharedPreferences.getString(SharedPreferencesHelper.AVATAR) ?? ""; String name = sharedPreferences.getString(SharedPreferencesHelper.NAME) ?? ""; - // bean.chat!.users!.add(Users(avatar: avatar,id: userId,nickname: name)); - // widget.logic.update(); + + bool isContain = false; + for (var info in bean.chat!.users!) { + if (info.id == userId) { + isContain = true; + } + } + if (!isContain) { + bean.chat!.users!.add(Users(avatar: avatar,id: userId,nickname: name)); + bean.chat!.count = bean.chat!.count + 1; + setState(() { + + }); + } + + } } diff --git a/circle_app/lib/app/dialog/UpdateDialog.dart b/circle_app/lib/app/dialog/UpdateDialog.dart index ecd9b01..0d6f247 100644 --- a/circle_app/lib/app/dialog/UpdateDialog.dart +++ b/circle_app/lib/app/dialog/UpdateDialog.dart @@ -2,7 +2,7 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_install_app/flutter_install_app.dart'; +// import 'package:flutter_install_app/flutter_install_app.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -260,7 +260,7 @@ class _CustomDialogState extends State { // SmartDialog.dismiss(); print(error); }); - await AppInstaller.installApk(filePath, actionRequired: false); + // await AppInstaller.installApk(filePath, actionRequired: false); } } diff --git a/circle_app/lib/app/externalshare/binding.dart b/circle_app/lib/app/externalshare/binding.dart new file mode 100644 index 0000000..b28d6f5 --- /dev/null +++ b/circle_app/lib/app/externalshare/binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'logic.dart'; + +class ExternalshareBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => ExternalshareLogic()); + } +} diff --git a/circle_app/lib/app/externalshare/logic.dart b/circle_app/lib/app/externalshare/logic.dart new file mode 100644 index 0000000..a1015ef --- /dev/null +++ b/circle_app/lib/app/externalshare/logic.dart @@ -0,0 +1,67 @@ + +import 'dart:convert'; + +import 'package:circle_app/app/login/login/logic.dart'; +import 'package:circle_app/util/util.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:get/get.dart'; +import 'package:image_picker/image_picker.dart'; + +import '../../common/config.dart'; +import '../../network/api.dart'; +import '../../network/dio_manager.dart'; +import '../../util/qiniu.dart'; +import 'state.dart'; + +class ExternalshareLogic extends GetxController { + final ExternalshareState state = ExternalshareState(); + + final ImagePicker _picker = ImagePicker(); + + var quToken = ''; + + @override + void onInit() async{ + super.onInit(); + var data = + await DioManager.instance.get(url: Api.getqiniuToken, params: {}); + + if(data['cpde'] == 200){ + quToken = data['data']['token']; + } + } + + updateExternalShare()async{ + if(state.imaglist==0){ + showOKToast("请上传图片"); + return ; + } + String jsonString = jsonEncode(state.imaglist); + var data = await DioManager.instance.post(url:' Api.UPDATE_EXTERNAL_SHARE', params: { + 'picUrl':jsonString + }); + if(data["code"]==200){ + Get.back(); + } + showOKToast(data["msg"]); + + } + + Future getImageFile() async { + try { + final XFile? pickedFile = await _picker.pickImage( + source: ImageSource.gallery, + ); + if(null==pickedFile){ + return; + } + SmartDialog.showLoading(); + uploadImage(quToken,pickedFile,CONFIG.USER_ALBUM_IMAGE,(result){ + SmartDialog.dismiss(force: true); + state.imaglist.add(result); + update(); + }); + } catch (_) { + } + } +} diff --git a/circle_app/lib/app/externalshare/state.dart b/circle_app/lib/app/externalshare/state.dart new file mode 100644 index 0000000..00a3fb1 --- /dev/null +++ b/circle_app/lib/app/externalshare/state.dart @@ -0,0 +1,6 @@ +class ExternalshareState { + ExternalshareState() { + ///Initialize variables + } + List imaglist = []; +} diff --git a/circle_app/lib/app/externalshare/view.dart b/circle_app/lib/app/externalshare/view.dart new file mode 100644 index 0000000..1af6fe5 --- /dev/null +++ b/circle_app/lib/app/externalshare/view.dart @@ -0,0 +1,257 @@ +import 'package:circle_app/common/colors/app_color.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../components/my_app_bar.dart'; +import '../../router/app_routers.dart'; +import '../../util/util.dart'; +import 'logic.dart'; + +class ExternalsharePage extends StatelessWidget { + ExternalsharePage({Key? key}) : super(key: key); + + final logic = Get.find(); + final state = Get.find().state; + + @override + Widget build(BuildContext context) { + // _getFormat(context); + return GetBuilder(builder: (logic) { + return Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getBaseImage("bg")), + fit: BoxFit.cover, + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: const MyAppBar( + centerTitle: '站外分享', + ), + body: Container( + height: Get.height, + child: Stack( + children: [ + SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "温馨提示:站外分享除了能享受'邀请有奖'的各种奖励,还能获得下述的奖励哦~", + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 18), + Text( + "奖励说明", + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + ), + ), + SizedBox(height: 8.sp), + buildRichText( + "1. 站外平台粉丝达到1000人以上,发新动态置顶一天,可获得1000豆子;"), + SizedBox(height: 8.sp), + buildRichText("2. 邀请海报发到微信朋友圈或QQ动态(删除无效),可获得100豆子;"), + SizedBox(height: 8.sp), + buildRichText( + "3. 分享到圈内群聊(QQ、微信、B站、快手、抖音、微博、推特或其他平台均有效),群里有多少人点击就获得多少豆子。"), + SizedBox(height: 24.sp), + + buildRichText("*上传分享截图"), + SizedBox(height: 8.sp), + buildRichText("截图时间跟发布时间需要间隔1小时以上才有效", fontSize: 14.sp), + SizedBox(height: 8.sp), + Container( + height: 380.sp, + // margin: EdgeInsets.only(left: 16.sp, right: 16.sp), + child: GridView.builder( + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, // 每行显示的项目数量 + ), + itemCount: logic.state.imaglist.length < 9 + ? logic.state.imaglist.length + 1 + : logic.state.imaglist.length, + // Replace with your item count + itemBuilder: (context, index) { + if (index == 0 && + logic.state.imaglist.length < 9) { + // 第一个项目,显示固定的图片 + return GestureDetector( + onTap: () { + logic.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( + logic.state.imaglist.length < 9 + ? logic.state.imaglist[index - 1] + : logic.state.imaglist[index], + // Replace with your item count + logic, + logic.state.imaglist.length < 9 + ? index - 1 + : index), + ), + ); + } + }, + ), + ), + ], + )), + ), + Positioned( + bottom: 0, + left: 20.sp, + right: 20.sp, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + //TODO 海报这版不做 + // Expanded( + // child: Container( + // margin: EdgeInsets.only(bottom: 35), + // child: ElevatedButton( + // onPressed: () { + // // TODO: 添加获取邀请海报的点击事件 + // }, + // style: ElevatedButton.styleFrom( + // primary: Color(0xFF21BEAB), + // shape: RoundedRectangleBorder( + // borderRadius: BorderRadius.circular(20), // 设置圆角的大小 + // ), + // ), + // child: Text( + // "获取邀请海报", + // style: TextStyle( + // color: Colors.white, + // fontSize: 12, + // ), + // ), + // ), + // ), + // ), + // SizedBox(width: 30.sp,), + + Expanded( + child: Container( + margin: EdgeInsets.only(bottom: 35, left: 20, right: 20), + child: ElevatedButton( + onPressed: () { + logic.updateExternalShare(); + }, + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), // 设置圆角的大小 + ), + padding: EdgeInsets.zero, // Remove default button padding + elevation: 0, // Remove button shad + backgroundColor: Colors.transparent, + primary: null, // Remove background color + ), + child: Ink( + decoration: BoxDecoration( + gradient:AppColor.mainVerLinearGradient, + borderRadius: BorderRadius.circular(20), // 设置圆角的大小 + ), + child: Container( + padding: EdgeInsets.symmetric(horizontal: 50, vertical: 10), + child: Text( + "提交奖励申请", + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + ), + ), + ), + ), + ), + ), + ), + + ], + ), + ), + ], + ), + ), + ), + ); + }); + } + + Widget _buildImageItem(String url, ExternalshareLogic logic, 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(AppRoutes.Swiper, arguments: { + 'imaglist': logic.state.imaglist, + 'index': index + }); + }, + child: Image.network( + fit: BoxFit.cover, + url, + ), + ), + ), + ), + ), + Positioned( + top: 0, + right: 0, + child: GestureDetector( + onTap: () { + logic.state.imaglist.removeAt(index); + logic.update(); + }, + child: Image( + image: AssetImage(getMineImage("icon_img_del")), + width: 20.sp, + height: 20.sp, + ), + )) + ], + ); + } + + Widget buildRichText(String text, {double fontSize = 16}) { + return RichText( + text: TextSpan( + text: text, + style: TextStyle(color: Colors.white, fontSize: fontSize), + ), + ); + } +} diff --git a/circle_app/lib/app/good_reviews/binding.dart b/circle_app/lib/app/good_reviews/binding.dart new file mode 100644 index 0000000..bec7ef1 --- /dev/null +++ b/circle_app/lib/app/good_reviews/binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'logic.dart'; + +class Good_reviewsBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => Good_reviewsLogic()); + } +} diff --git a/circle_app/lib/app/good_reviews/logic.dart b/circle_app/lib/app/good_reviews/logic.dart new file mode 100644 index 0000000..c7b73c0 --- /dev/null +++ b/circle_app/lib/app/good_reviews/logic.dart @@ -0,0 +1,79 @@ +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:get/get.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:circle_app/common/config.dart'; +import 'package:circle_app/network/api.dart'; +import 'package:circle_app/network/dio_manager.dart'; +import 'package:circle_app/util/qiniu.dart'; +import 'package:circle_app/util/util.dart'; + +class Good_reviewsLogic extends GetxController { + + List imgUrl = []; + List tipImgUrl = []; + final ImagePicker _picker = ImagePicker(); + var quToken = ''; + + @override + void onInit() { + // TODO: implement onInit + super.onInit(); + loadToken(); + loadTipImgUrl(); + } + + Future getImageFile() async { + try { + + final XFile? pickedFile = await _picker.pickImage( + source: ImageSource.gallery, + ); + if (null == pickedFile) { + return; + } + + SmartDialog.showLoading(); + uploadImage(quToken, pickedFile, CONFIG.USER_INFO_AVATAR, (result) async { + imgUrl.add(result); + update(); + SmartDialog.dismiss(); + }); + } catch (e) {} + } + + void loadTipImgUrl() async { + // var result = + // await DioManager.instance.get(url: 'Api.queryPositiveFeesBackExample', params: {}); + // if (result['code'] == 10000) { + // List list = result['list']; + // for (var element in list) { + // tipImgUrl.add(element); + // } + // update(); + // } + } + + void loadToken() async { + var qiniudata = + await DioManager.instance.get(url: Api.getqiniuToken, params: {}); + + if (qiniudata['code'] == 200) { + quToken = qiniudata['data']['token'].toString(); + } + } + + void sendGoodReview() async { + var albumList = []; + for (var url in imgUrl) { + Map info = {'type':1,'url':url}; + albumList.add(info); + } + var result = + await DioManager.instance.post(url: Api.getFeedBack, params: {'type':2,'album':albumList}); + if (result['code'] == 200) { + showOKToast('提交成功,等待审核'); + Get.back(); + print(result); + } + } +} diff --git a/circle_app/lib/app/good_reviews/view.dart b/circle_app/lib/app/good_reviews/view.dart new file mode 100644 index 0000000..d3efa3e --- /dev/null +++ b/circle_app/lib/app/good_reviews/view.dart @@ -0,0 +1,163 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:circle_app/components/my_app_bar.dart'; +import 'package:circle_app/router/app_routers.dart'; +import 'package:circle_app/util/util.dart'; + +import 'logic.dart'; + +class Good_reviewsPage extends StatelessWidget { + Good_reviewsPage({Key? key}) : super(key: key); + + final logic = Get.find(); + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (logic) { + List widgets = []; + List tipwidgets = []; + if (logic.imgUrl.isEmpty) { + widgets.add(GestureDetector( + onTap: () { + logic.getImageFile(); + }, + child: Image.asset( + getMineImage( + 'icon_upload', + ), + width: 100.sp, + ), + )); + } else { + for (var element in logic.imgUrl) { + widgets.add(Stack( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(8.sp), + child: Image.network( + element, + width: 100.sp, + height: 100.sp, + fit: BoxFit.cover, + )), + Positioned( + top: 0, + right: 0, + child: GestureDetector( + onTap: () { + // showToast("删除"); + logic.imgUrl.remove(element); + logic.update(); + }, + child: Image( + image: AssetImage(getMineImage("icon_img_del")), + width: 20.sp, + height: 20.sp, + ), + )) + ], + )); + widgets.add(SizedBox(width: 10.sp,)); + } + + if (logic.imgUrl.length < 3) { + widgets.add(GestureDetector( + onTap: () { + logic.getImageFile(); + }, + child: Image.asset( + getMineImage( + 'icon_upload', + ), + width: 100.sp, + ), + )); + } + } + + for (var element in logic.tipImgUrl) { + tipwidgets.add( + GestureDetector( + onTap: () { + Get.toNamed(AppRoutes.Swiper,arguments: { + 'imaglist': logic.tipImgUrl, + 'index': logic.tipImgUrl.indexOf(element) + }); + }, + child: ClipRRect( + borderRadius: BorderRadius.circular(8.sp), + child: Image.network( + element, + width: 100.sp, + height: 100.sp, + fit: BoxFit.cover, + )), + ), + ); + tipwidgets.add(SizedBox(width: 10.sp,)); + } + + return Scaffold( + backgroundColor: Colors.black, + appBar: MyAppBar( + centerTitle: '反馈截图', + actionWdiget: GestureDetector( + onTap: () { + if (logic.imgUrl.isEmpty) { + showOKToast('请上传评价截图:(至少一张)'); + } else { + logic.sendGoodReview(); + } + }, + child: Text( + '提交', + style: TextStyle(color: Colors.white, fontSize: 16.sp), + ), + ), + ), + body: Padding( + padding: EdgeInsets.only(left: 15.sp, right: 15.sp, top: 15.sp), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '感谢您的支持,请填写评价反馈,我们将在您提交反馈之后的24小时之内核实并发放奖励。', + style: TextStyle(color: Color(0xFFF7FAFA), fontSize: 16.sp), + ), + SizedBox( + height: 12.sp, + ), + Text( + '请上传评价截图:(至少一张)', + style: TextStyle(color: Color(0xFFF7FAFA), fontSize: 16.sp), + ), + Container( + margin: EdgeInsets.only(top: 10), + height: 100.sp, + child: Row( + children: widgets, + ), + ), + // SizedBox( + // height: 20.sp, + // ), + // + // Text( + // '示例:', + // style: TextStyle(color: Color(0xFFF7FAFA), fontSize: 14.sp), + // ), + // Container( + // margin: EdgeInsets.only(top: 10), + // height: 100.sp, + // child: Row( + // children: tipwidgets, + // ), + // ) + ], + ), + ), + ); + }); + } +} diff --git a/circle_app/lib/app/home/binding.dart b/circle_app/lib/app/home/binding.dart index b476cb9..5cbedcd 100644 --- a/circle_app/lib/app/home/binding.dart +++ b/circle_app/lib/app/home/binding.dart @@ -1,6 +1,7 @@ import 'package:circle_app/app/circle/logic.dart'; import 'package:get/get.dart'; +import '../minefragment/logic.dart'; import 'logic.dart'; class HomeBinding extends Bindings { @@ -8,5 +9,6 @@ class HomeBinding extends Bindings { void dependencies() { Get.lazyPut(() => HomeLogic()); Get.lazyPut(() => CircleLogic()); + Get.lazyPut(() => MinefragmentLogic()); } } diff --git a/circle_app/lib/app/home/logic.dart b/circle_app/lib/app/home/logic.dart index 121faa2..af7e536 100644 --- a/circle_app/lib/app/home/logic.dart +++ b/circle_app/lib/app/home/logic.dart @@ -28,7 +28,7 @@ import '../minefragment/view.dart'; import '../msg/view.dart'; import 'state.dart'; -class HomeLogic extends GetxController { +class HomeLogic extends GetxController with WidgetsBindingObserver { late TabController tabController; int currentIndex = 0; @@ -43,6 +43,11 @@ class HomeLogic extends GetxController { final RxBool showcirlceUnred = false.obs; late V2TimSimpleMsgListener msgListener; + InterestsBean mycircle = InterestsBean(lists: []); + + StreamSubscription? sub; + + bool isUpdateVersion = false; @override void onClose() { @@ -50,7 +55,8 @@ class HomeLogic extends GetxController { super.onClose(); TencentImSDKPlugin.v2TIMManager .v2TIMMessageManager.removeAdvancedMsgListener(); - + WidgetsBinding.instance.removeObserver(this); + sub!.cancel(); } @override @@ -66,14 +72,21 @@ class HomeLogic extends GetxController { tabs.add(MsgPage()); tabs.add(MinefragmentPage()); - // EventBusManager.on().listen((event) { - // getUnreadSize(); - // }); + sub = EventBusManager.on().listen((event) { + getUnreadSize(); + }); // getUnreadSize(); + WidgetsBinding.instance.addObserver(this); - + addMsgListener(); + + checkVersion(); + loadMyCircleData(); + } + + void addMsgListener() { msgListener = V2TimSimpleMsgListener(onRecvC2CTextMessage: ( msgID, userInfo, @@ -151,11 +164,31 @@ class HomeLogic extends GetxController { _messageService.addSimpleMsgListener(listener: msgListener); - - checkVersion(); } + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + switch (state) { + case AppLifecycleState.inactive: + break; + + case AppLifecycleState.resumed: //从后台切换前台,界面可见 + + break; + + case AppLifecycleState.paused: // 界面不可见,后台 + addBadge(); + break; + + case AppLifecycleState.detached: // APP结束时调用 + + break; + } + } + + + Future checkVersion() async { var data = await DioManager.instance.get(url: Api.APP_VERSION); @@ -165,6 +198,7 @@ class HomeLogic extends GetxController { showReportDialog(Get.context!, bean.data.constraint == 0, bean.data); } } + setLike(String userId) async { var data = await DioManager.instance.post( url: "${Api.setLike + userId}/follow", @@ -197,12 +231,12 @@ class HomeLogic extends GetxController { unreadSIze.value = getTotalUnreadMessageCountRes.data.toString(); } - if (Platform.isAndroid) { - setOfflinePushStatus(status: AppStatus.foreground); - } + } } catch (e) {} + + } } @@ -235,6 +269,12 @@ class HomeLogic extends GetxController { } + addBadge() { + if (Platform.isAndroid) { + setOfflinePushStatus(status: AppStatus.foreground); + } + } + void showReportDialog( BuildContext context, bool isDismiss, UpdateInfo updateInfo) { showDialog( @@ -284,4 +324,52 @@ class HomeLogic extends GetxController { } + + loadMyCircleData() async { + var data = await DioManager.instance + .get(url: Api.getMyCircleAll); + + // var bean = BaseResponse.fromJson( + // data, (data) => InterestsBean.fromJson(data)); + + if (data['code'] == 200) { + List circleList = data['data']; + if (circleList.isNotEmpty) { + List infoList = []; + circleList.forEach((element) { + var info = Circle.fromJson(element); + infoList.add(info); + }); + mycircle.lists = infoList; + if (currentIndex >= mycircle.lists.length - 1) { + currentIndex = mycircle.lists.length -1; + } + + loadCalloutsNew(); + } + } + } + + loadCalloutsNew() async { + List idList = []; + mycircle.lists.forEach((element) { + idList.add(element.id.toString()); + }); + var data = await DioManager.instance.post( + url:Api.calloutsNew, + params: {"interestIds":idList}); + + if (data['code'] == 200) { + List infoList = data['data']; + bool isHasNew = false; + if (infoList.isNotEmpty) { + infoList.forEach((element) { + if (element['hasNew']) { + isHasNew = true; + } + }); + } + showcirlceUnred.value = isHasNew; + } + } } diff --git a/circle_app/lib/app/home/view.dart b/circle_app/lib/app/home/view.dart index 0df2c6c..d9975c8 100644 --- a/circle_app/lib/app/home/view.dart +++ b/circle_app/lib/app/home/view.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import '../../main.dart'; import 'logic.dart'; class HomePage extends StatefulWidget { @@ -18,7 +19,7 @@ class HomePage extends StatefulWidget { } class _HomePageState extends State - with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin { + with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin,RouteAware { @override bool get wantKeepAlive => true; @@ -34,6 +35,39 @@ class _HomePageState extends State animationDuration: Duration.zero); } + @override + void didChangeDependencies() { + // TODO: implement didChangeDependencies + super.didChangeDependencies(); + + /// 路由订阅 + routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute); + } + + + void didPopNext() { + print('didPopNext'); + logic.getUnreadSize(); + } + + ///当前页面进入时触发 + void didPush() { + print('didPopNext'); + + } + void didPop() { + print('didPop'); + } + + + @override + void dispose() { + // TODO: implement dispose + super.dispose(); + routeObserver.unsubscribe(this); + } + + @override Widget build(BuildContext context) { return GetBuilder(builder: (HomeLogic controller) { diff --git a/circle_app/lib/app/like/view.dart b/circle_app/lib/app/like/view.dart index b3b7fa1..406031b 100644 --- a/circle_app/lib/app/like/view.dart +++ b/circle_app/lib/app/like/view.dart @@ -54,6 +54,7 @@ class _LikePageState extends State with RouteAware { print('didPopNext'); } + void didPop() { print('didPop'); } @@ -151,18 +152,18 @@ class _LikePageState extends State with RouteAware { }, child: Image.asset( getCircleImage('send_msg'), - width: 60.sp, + width: 70.sp, ))) ], ); } goDetailPage(Circle bean,int index) async { - if (!bean.isJoin) { - await logic.outCircle( - bean.id.toString(), - bean.isJoin); - } + // if (!bean.isJoin) { + // await logic.outCircle( + // bean.id.toString(), + // bean.isJoin); + // } var result = await Get.toNamed(AppRoutes.Signal_circle_list, arguments: bean.id); var data = await DioManager.instance.get( diff --git a/circle_app/lib/app/login/complete_material/logic.dart b/circle_app/lib/app/login/complete_material/logic.dart index 346b252..2ef9a7b 100644 --- a/circle_app/lib/app/login/complete_material/logic.dart +++ b/circle_app/lib/app/login/complete_material/logic.dart @@ -240,7 +240,7 @@ class Complete_materialLogic extends GetxController { } }); if(genderTagList.isEmpty){ - showOKToast("请选择你想认识的人"); + showOKToast("请点击选择你想认识的人"); return; } @@ -319,7 +319,7 @@ class Complete_materialLogic extends GetxController { } }); if(genderTagList.isEmpty){ - showOKToast("请选择你想认识的人"); + showOKToast("请点击选择你想认识的人"); return; } diff --git a/circle_app/lib/app/login/complete_material/view.dart b/circle_app/lib/app/login/complete_material/view.dart index 6d57f1d..b84342c 100644 --- a/circle_app/lib/app/login/complete_material/view.dart +++ b/circle_app/lib/app/login/complete_material/view.dart @@ -103,11 +103,16 @@ class _Complete_materialPageState extends State { height: 86.sp, ) : ClipOval( - child: CachedNetworkImage( - fit: BoxFit.cover, - imageUrl: controller.headUrl, - width: 86.sp, - height: 86.sp, + child: Container( + decoration: BoxDecoration( + gradient: AppColor.mainVerLinearGradient + ), + child: CachedNetworkImage( + fit: BoxFit.cover, + imageUrl: controller.headUrl, + width: 86.sp, + height: 86.sp, + ), ), ), ), diff --git a/circle_app/lib/app/minefragment/logic.dart b/circle_app/lib/app/minefragment/logic.dart index 232bc9d..eec93cd 100644 --- a/circle_app/lib/app/minefragment/logic.dart +++ b/circle_app/lib/app/minefragment/logic.dart @@ -6,6 +6,7 @@ import '../../network/dio_manager.dart'; import '../../util/SharedPreferencesHelper.dart'; import '../../util/eventBus.dart'; import '../../util/util.dart'; +import '../dialog/UpdateDialog.dart'; import 'state.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -29,7 +30,7 @@ class MinefragmentLogic extends GetxController { int orientation = -1; bool has_pwd = false; - + bool isUpdateVersion = false; String enterHomeInfoMsg = "进入主页"; String joinedCircle = ""; String vipMsg = "十几种专属特权等你领取"; @@ -45,12 +46,23 @@ class MinefragmentLogic extends GetxController { } getMode(); + checkVersion(); EventBusManager.on().listen((event) { isVip.value = event.vip; // update(); }); } + Future checkVersion() async { + var data = await DioManager.instance.get(url: Api.APP_VERSION); + var bean = BaseResponse.fromJson( + data, (data) => UpdateInfo.fromJson(data)); + if (bean.isSuccess()) { + isUpdateVersion = bean.data.update == 1; + update(); + } + } + getMode() async { var data = await DioManager.instance.get(url: Api.getUserMine); var bean = BaseResponse.fromJson( diff --git a/circle_app/lib/app/minefragment/view.dart b/circle_app/lib/app/minefragment/view.dart index 37f9d16..6b34f80 100644 --- a/circle_app/lib/app/minefragment/view.dart +++ b/circle_app/lib/app/minefragment/view.dart @@ -7,12 +7,15 @@ import 'package:circle_app/app/circle/view.dart'; import 'package:circle_app/app/msg/view.dart'; import 'package:circle_app/router/app_routers.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../../common/Widgets/open_vip_tip/view.dart'; +import '../../main.dart'; import '../../util/SharedPreferencesHelper.dart'; import '../../util/util.dart'; import 'logic.dart'; @@ -31,16 +34,54 @@ const MyImageWidget1 = Image( fit: BoxFit.fill, ); -class MinefragmentPage extends StatelessWidget { +class MinefragmentPage extends StatefulWidget { MinefragmentPage({Key? key}) : super(key: key); + @override + State createState() => _MinefragmentPageState(); +} + +class _MinefragmentPageState extends State with RouteAware { final logic = Get.lazyPut(() => MinefragmentLogic()); + final mineLogic = Get.find(); final state = Get .find() .state; + @override + void dispose() { + // TODO: implement dispose + super.dispose(); + routeObserver.unsubscribe(this); + } + + @override + void didChangeDependencies() { + // TODO: implement didChangeDependencies + super.didChangeDependencies(); + + /// 路由订阅 + routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute); + } + + + void didPopNext() { + print('didPopNext'); + mineLogic.checkVersion(); + } + + ///当前页面进入时触发 + void didPush() { + print('didPopNext'); + + } + void didPop() { + print('didPop'); + } + + @override Widget build(BuildContext context) { double statusBarHeight = MediaQuery @@ -121,7 +162,7 @@ class MinefragmentPage extends StatelessWidget { Widget _circleLiveView(MinefragmentLogic logic) { return Column( - children: [_circleItemView(logic),_invienItemView(), _helpItemView(),_setUpItemView()], + children: [_circleItemView(logic),_invienItemView(),_editGoodReviewItemView(), _helpItemView(),_setUpItemView()], ); } @@ -154,11 +195,24 @@ class MinefragmentPage extends StatelessWidget { ), Row( children: [ + mineLogic.isUpdateVersion + ? Container( + width: 10.sp, + height: 10.sp, + margin: EdgeInsets.only(right: 4.sp), + decoration: const BoxDecoration( + color: Colors.red, + shape: BoxShape.circle), + ) + : Container(), + if (mineLogic.isUpdateVersion) + Text('有新版本啦',style: TextStyle(color: Colors.white60),), Image( image: AssetImage(getHomeImage("icon_in")), width: 24.sp, height: 24.sp, ), + ], ) ], @@ -243,6 +297,14 @@ class MinefragmentPage extends StatelessWidget { ), Row( children: [ + Container( + width: 10.sp, + height: 10.sp, + margin: EdgeInsets.only(right: 4.sp), + decoration: const BoxDecoration( + color: Colors.red, + shape: BoxShape.circle), + ), const Text( "免费领取会员", style: TextStyle(color: Colors.white60), @@ -261,6 +323,104 @@ class MinefragmentPage extends StatelessWidget { ); } + Widget _editGoodReviewItemView() { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + showTipPop(); + }, + child: Container( + margin: EdgeInsets.only(top: 18.sp), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Image( + image: AssetImage(getMineImage("edit_good_review")), + width: 24.sp, + height: 24.sp, + ), + SizedBox(width: 10.sp), + + const Text( + "评价微乐园", + style: TextStyle(color: Colors.white), + ), + + ], + ), + Row( + children: [ + Container( + width: 10.sp, + height: 10.sp, + margin: EdgeInsets.only(right: 4.sp), + decoration: const BoxDecoration( + color: Colors.red, + shape: BoxShape.circle), + ), + const Text( + "+3天会员时长", + style: TextStyle(color: Colors.white60), + ), + Image( + image: AssetImage(getHomeImage("icon_in")), + width: 24.sp, + height: 24.sp, + ), + ], + ) + + ], + ), + ), + ); + } + + Widget _shareItemView() { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Get.toNamed(AppRoutes.ExternalsharePage); + // controller.state.hearUrl + }, + child: Container( + margin: EdgeInsets.only(top: 18.sp), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Image( + image: AssetImage(getMineImage("share")), + width: 24.sp, + height: 24.sp, + ), + SizedBox(width: 10.sp), + const Text( + "站外分享", + style: TextStyle(color: Colors.white), + ), + + ], + ), + Row( + children: [ + Image( + image: AssetImage(getHomeImage("icon_in")), + width: 24.sp, + height: 24.sp, + ), + ], + ) + + ], + ), + ), + ); + } + Widget _circleItemView(MinefragmentLogic logic) { return GestureDetector( behavior: HitTestBehavior.opaque, @@ -644,4 +804,40 @@ class MinefragmentPage extends StatelessWidget { } + + showTipPop() { + Get.bottomSheet( + CupertinoActionSheet( + // 标题 + //提示内容 + actions: [ + //操作按钮集合 + CupertinoActionSheetAction( + onPressed: () async { + Get.back(); + // + await launch('https://apps.apple.com/cn/app/%E5%BE%AE%E4%B9%90%E5%9B%AD-%E4%BA%9A%E6%96%87%E5%8C%96%E5%A4%9A%E5%85%83%E4%BA%A4%E5%8F%8B%E5%9F%BA%E5%9C%B0/id6459449499', forceSafariVC: false); + }, + child: Text('立即评价'), + ), + CupertinoActionSheetAction( + onPressed: () { + + Get.back(); + Get.toNamed(AppRoutes.Good_Reviews); + + }, + child: Text('反馈截图'), + ), + ], + cancelButton: CupertinoActionSheetAction( + //取消按钮 + onPressed: () { + Get.back(); + }, + child: Text('取消'), + ), + ), + isScrollControlled: true); + } } diff --git a/circle_app/lib/app/msg/sys_notify_list/logic.dart b/circle_app/lib/app/msg/sys_notify_list/logic.dart index 430f23b..8822e4e 100644 --- a/circle_app/lib/app/msg/sys_notify_list/logic.dart +++ b/circle_app/lib/app/msg/sys_notify_list/logic.dart @@ -44,15 +44,18 @@ class Sys_notify_listLogic extends GetxController { // lists.addAll(bean.data.lists); // } - List bean = data['data']['lists']; - if (bean.length > 0) { - bean.forEach((element) { - lists.add(Lists.fromJson(element)); - }); - } - if (bean.length < 10) { - isMore = false; + if (data['code'] == 200) { + List bean = data['data']['lists']; + if (bean.length > 0) { + bean.forEach((element) { + lists.add(Lists.fromJson(element)); + }); + } + if (bean.length < 10) { + isMore = false; + } } + isLoad = false; update(); if (page == 0) { diff --git a/circle_app/lib/app/msg/view.dart b/circle_app/lib/app/msg/view.dart index 59846ee..83ab615 100644 --- a/circle_app/lib/app/msg/view.dart +++ b/circle_app/lib/app/msg/view.dart @@ -244,7 +244,7 @@ class _MsgPageState extends State with AutomaticKeepAliveClientMixin { tipWidget() { return Container( margin: EdgeInsets.only(top: 18.sp, bottom: 15.sp), - padding: EdgeInsets.only(left: 16.sp, right: 18.sp), + padding: EdgeInsets.only(left: 16.sp, right: 12.sp), width: Get.width, height: 20, child: Row( diff --git a/circle_app/lib/app/setup/view.dart b/circle_app/lib/app/setup/view.dart index 12878bf..7c68a6b 100644 --- a/circle_app/lib/app/setup/view.dart +++ b/circle_app/lib/app/setup/view.dart @@ -1,3 +1,4 @@ +import 'package:circle_app/app/minefragment/logic.dart'; import 'package:circle_app/components/my_app_bar.dart'; import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; @@ -128,6 +129,8 @@ class SetupPage extends StatelessWidget { } Widget _buildItemRow(String text, String imagePath) { + var mineLogic = Get.find(); + return Container( padding: EdgeInsets.symmetric(horizontal: 16.sp), // 将 @dimen/dp_16 替换为相应的值 @@ -141,6 +144,17 @@ class SetupPage extends StatelessWidget { ), ), const Spacer(), + if (mineLogic.isUpdateVersion && text == '关于微乐园') + Container( + width: 10.sp, + height: 10.sp, + margin: EdgeInsets.only(right: 4.sp), + decoration: const BoxDecoration( + color: Colors.red, + shape: BoxShape.circle), + ), + if (mineLogic.isUpdateVersion && text == '关于微乐园') + Text('有新版本啦',style: TextStyle(color: Colors.white60,fontSize: 14.sp),), Image.asset( imagePath, width: 20.sp, // 将相应的值替换为图像的宽度 diff --git a/circle_app/lib/common/config.dart b/circle_app/lib/common/config.dart index 39ac0a4..8afe597 100644 --- a/circle_app/lib/common/config.dart +++ b/circle_app/lib/common/config.dart @@ -9,4 +9,5 @@ class CONFIG{ static const USER_INFO_AVATAR = 'user_info_avatar/'; static const USER_ALBUM_IMAGE = 'user_album_image/'; + } \ 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 7fe487c..6fc599a 100644 --- a/circle_app/lib/network/dio_manager.dart +++ b/circle_app/lib/network/dio_manager.dart @@ -232,7 +232,6 @@ class DioManager { pushLoginPage(); } else { switch (responseMap["code"]) { - case 1001: case 4000: case 4001: case 4002: diff --git a/circle_app/lib/router/app_pages.dart b/circle_app/lib/router/app_pages.dart index fc9fb91..25d554c 100644 --- a/circle_app/lib/router/app_pages.dart +++ b/circle_app/lib/router/app_pages.dart @@ -69,6 +69,10 @@ import 'package:get/get_navigation/src/routes/get_route.dart'; import '../app/blacklist/view.dart'; import '../app/circle/binding.dart'; +import '../app/externalshare/binding.dart'; +import '../app/externalshare/view.dart'; +import '../app/good_reviews/binding.dart'; +import '../app/good_reviews/view.dart'; import '../app/privacy/binding.dart'; import '../app/splash/view.dart'; import '../app/visitorlist/binding.dart'; @@ -238,5 +242,15 @@ class AppPages { page: () => Reset_pwdPage(), binding: Reset_pwdBinding(), ), + GetPage( + name: AppRoutes.ExternalsharePage, + page: () => ExternalsharePage(), + binding: ExternalshareBinding(), + ), + GetPage( + name: AppRoutes.Good_Reviews, + page: () => Good_reviewsPage(), + binding: Good_reviewsBinding(), + ), ]; } diff --git a/circle_app/lib/router/app_routers.dart b/circle_app/lib/router/app_routers.dart index ce6ee49..a79c423 100644 --- a/circle_app/lib/router/app_routers.dart +++ b/circle_app/lib/router/app_routers.dart @@ -41,6 +41,10 @@ abstract class AppRoutes { static const EditPwd = '/mine/EditPwd'; static const ResetPwd = '/mine/EditPwd/ResetPwd'; + static const ExternalsharePage = '/ExternalsharePage'; + + static const Good_Reviews = '/Good_Reviews'; + } \ No newline at end of file diff --git a/circle_app/lib/util/qiniu.dart b/circle_app/lib/util/qiniu.dart index abcdf0c..9c986ac 100644 --- a/circle_app/lib/util/qiniu.dart +++ b/circle_app/lib/util/qiniu.dart @@ -1,9 +1,10 @@ import 'dart:convert'; import 'dart:io'; import 'dart:math'; +import 'dart:typed_data'; import 'package:circle_app/util/util.dart'; -import 'package:flutter_luban/flutter_luban.dart'; +import 'package:flutter_image_compress/flutter_image_compress.dart'; 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'; @@ -17,7 +18,7 @@ import 'package:image/image.dart' as img; typedef void MyCallback(String result); //上传七牛云 -void uploadQiniu(String filePath, String name, String path, String quToken, +void uploadQiniuVideo(File file, String name, String path, String quToken, MyCallback myCallback) { var storage = Storage(); DateTime now = DateTime.now(); @@ -36,7 +37,32 @@ void uploadQiniu(String filePath, String name, String path, String quToken, print('上传进度: $status'); }); - storage.putFile(File(filePath), quToken, + storage.putFile(file, quToken, + options: PutOptions(controller: putController, key: imgPath)); +} + + +//上传七牛云 +void uploadQiniu(Uint8List bytes, String name, String path, String quToken, + MyCallback myCallback) { + 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); + } + print('状态变化: 当前任务状态:$status'); + }); + + putController.addProgressListener((double status) { + print('上传进度: $status'); + }); + + storage.putBytes(bytes, quToken, options: PutOptions(controller: putController, key: imgPath)); } @@ -65,30 +91,20 @@ void uploadImage(String quToken, XFile pickedFile, String updataRoute, } } - if(isImageJpgOrPng(pickedFile.path)){ - var path = await getApplicationSupportDirectoryPath(); - CompressObject compressObject = CompressObject( - imageFile: File(pickedFile.path), - path: path, - quality: 80, - step: 9, - mode: CompressMode.AUTO, - ); - Luban.compressImage(compressObject).then((_path) { - uploadQiniu(_path.toString(), pickedFile.name, updataRoute, quToken, - (result) { - myCallback(result); - }); - }).catchError((error) { - print(error); - showOKToast("图片上传失败"); - SmartDialog.dismiss(force: true); - }); - } else { - uploadQiniu(pickedFile.path, pickedFile.name, updataRoute, quToken, (result) { - myCallback(result); - }); - } + var result = await FlutterImageCompress.compressWithFile( + pickedFile.path, + minWidth: 2300, + minHeight: 1500, + quality: 94, + ); + + var size = await pickedFile.length(); + print(size); + print(result!.length); + + uploadQiniu(result!, pickedFile.name, updataRoute, quToken, (result) { + myCallback(result); + }); } void convertImageFormat( diff --git a/circle_app/pubspec.lock b/circle_app/pubspec.lock index f8baf87..c9cbf00 100644 --- a/circle_app/pubspec.lock +++ b/circle_app/pubspec.lock @@ -599,21 +599,13 @@ packages: source: hosted version: "2.2.2" flutter_image_compress: - dependency: transitive + dependency: "direct main" description: name: flutter_image_compress sha256: "37f1b26399098e5f97b74c1483f534855e7dff68ead6ddaccf747029fb03f29f" url: "https://pub.dev" source: hosted version: "1.1.3" - flutter_install_app: - dependency: "direct main" - description: - name: flutter_install_app - sha256: "9b117006d17c900e671c26bcbc9b15c7b8efd15d6f9b4442ad5d576de20fab53" - url: "https://pub.dev" - source: hosted - version: "1.3.0" flutter_intl: dependency: "direct main" description: @@ -651,14 +643,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_luban: - dependency: "direct main" - description: - name: flutter_luban - sha256: "42c01fbc1d0dd14f4d573372b79d6747415749552a8e996cf989018cc70cf2a8" - url: "https://pub.dev" - source: hosted - version: "0.1.13" flutter_markdown: dependency: transitive description: diff --git a/circle_app/pubspec.yaml b/circle_app/pubspec.yaml index af33f4c..d77080d 100644 --- a/circle_app/pubspec.yaml +++ b/circle_app/pubspec.yaml @@ -80,8 +80,6 @@ dependencies: video_player: ^2.6.1 #时间戳 flutter_intl: ^0.0.1 - #图片压缩 - flutter_luban: any #视频压缩 video_compress: ^3.1.2 #图片缓存 @@ -95,7 +93,7 @@ dependencies: #event_bus: event_bus: ^2.0.0 #安装apk - flutter_install_app: 1.3.0 +# flutter_install_app: 1.3.0 #闪屏页 flutter_native_splash: 2.2.16 #腾讯离线推送 @@ -111,6 +109,9 @@ dependencies: #腾讯bugly flutter_bugly: ^0.4.4 + #图片压缩 + flutter_image_compress: ^1.1.3 + dev_dependencies: flutter_test: sdk: flutter