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 0000000..7ae188c Binary files /dev/null and b/circle_app/assets/images/mine/edit_good_review.png differ 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 0000000..c766b29 Binary files /dev/null and b/circle_app/assets/images/mine/icon_upload.png differ diff --git a/circle_app/assets/images/mine/share.png b/circle_app/assets/images/mine/share.png new file mode 100644 index 0000000..1581274 Binary files /dev/null and b/circle_app/assets/images/mine/share.png differ 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