From d2775ada04d5ced017e62ec31354c653c8aab77e Mon Sep 17 00:00:00 2001 From: w-R <953969641@qq.com> Date: Fri, 14 Jan 2022 10:55:07 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/image/2x/c_z.png | Bin 0 -> 1945 bytes assets/image/2x/icon_gz.png | Bin 0 -> 5086 bytes assets/image/2x/icon_pl.png | Bin 0 -> 4684 bytes assets/image/2x/icon_z.png | Bin 0 -> 5220 bytes assets/image/3x/c_z.png | Bin 0 -> 3534 bytes assets/image/3x/icon_gz.png | Bin 0 -> 11213 bytes assets/image/3x/icon_pl.png | Bin 0 -> 11348 bytes assets/image/3x/icon_z.png | Bin 0 -> 12126 bytes assets/image/c_z.png | Bin 0 -> 955 bytes assets/image/icon_gz.png | Bin 0 -> 1955 bytes assets/image/icon_pl.png | Bin 0 -> 1798 bytes assets/image/icon_z.png | Bin 0 -> 1911 bytes lib/main.dart | 3 + lib/message/system_details.dart | 875 +++++++++++++++++++++++++++++++ lib/message/system_message.dart | 534 +++++++++++++++---- lib/retrofit/min_api.dart | 2 +- lib/retrofit/retrofit_api.dart | 8 +- lib/retrofit/retrofit_api.g.dart | 2 +- 18 files changed, 1306 insertions(+), 118 deletions(-) create mode 100644 assets/image/2x/c_z.png create mode 100644 assets/image/2x/icon_gz.png create mode 100644 assets/image/2x/icon_pl.png create mode 100644 assets/image/2x/icon_z.png create mode 100644 assets/image/3x/c_z.png create mode 100644 assets/image/3x/icon_gz.png create mode 100644 assets/image/3x/icon_pl.png create mode 100644 assets/image/3x/icon_z.png create mode 100644 assets/image/c_z.png create mode 100644 assets/image/icon_gz.png create mode 100644 assets/image/icon_pl.png create mode 100644 assets/image/icon_z.png create mode 100644 lib/message/system_details.dart diff --git a/assets/image/2x/c_z.png b/assets/image/2x/c_z.png new file mode 100644 index 0000000000000000000000000000000000000000..547e82d4f4cdcce8db4bd879a7ff2f0339c8a5b4 GIT binary patch literal 1945 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 Oy?o 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 literal 0 HcmV?d00001 diff --git a/assets/image/3x/icon_gz.png b/assets/image/3x/icon_gz.png new file mode 100644 index 0000000000000000000000000000000000000000..2047e60be02d83292f02413d02296188777db8ab GIT binary patch literal 11213 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 literal 0 HcmV?d00001 diff --git a/assets/image/3x/icon_pl.png b/assets/image/3x/icon_pl.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b3cce58723f5d0f2dbcd5abb07bd85c1a63e0a GIT binary patch literal 11348 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 US&SliZ2$lO07*qoM6N<$f>q`6VE_OC literal 0 HcmV?d00001 diff --git a/assets/image/c_z.png b/assets/image/c_z.png new file mode 100644 index 0000000000000000000000000000000000000000..71d21f72bccf22d7acbf5e91539d6402fd9a9ae1 GIT binary patch literal 955 zcmV;s14R6ZP)Px&bxA})R9HvtnQKUsQ5eVnXL)Nb!z44c#9C3At&EtLEb)Q~VHfFQnfjrqh{6)m zE?>GQMi<1;K6pu}h_oOoE6eQSW#lC@N-3v?X=#?jFfZGQ^TtL~m%f|Rec1DD@1DzV z|L45tIh+vykYq>C6{rMf2%*6Mv18B1&!~b@QlJv34!w!FT1PlIN=gZc{rEu*u1rCH zs0j5YOEP0~3Bh_(f>X0liag?#71KHXZPg_YRS>VNSZa#ushP}xhIYrSpjpA;6p%QI z5$5g#AD4x26xyR-r9_kBD+-&+@u0pG&0TH7rTFjndaXhC$s`Cl~Ruxq8GocmY0(OvNNCp;q!+wT0Ze+dMy5^PH)bT9FH17f(o?J+%BE z%FA&0d75zm%VRPJB|h>z9r^N7M0af9UNu)^U%>_Ayv0S4sanN8d~ZZjSq}PDe_LGJ z(Z~V1**R%ioHPLNk-Q9tjI|G@1n-Bh%Oah>ek3hEC%cC0?;jgSL0@N2q=X#M8<4$J zYw{AH=>26JK$i8G-*&7P`wdy(bV)YE_O64b2Xkg~_~?r(+|=P?yk;>=Y$>ona=;$= z&saR-It=bo`Ay`!%O7!!+L1RP3uGH`{IV_BI4^M6V^?=y4^EY2kQHTzST=XJE(nF4wJpcd(Ak3YsylepAk&vi z6K61>I+M`C27zu~`0=|7Y+6umt2W$54bX6up);5P4OP~x;3z0);un}Ee+6vvm*{Mb dnDXBce*n!EoBoInLy`ah002ovPDHLkV1gK$yRiTO literal 0 HcmV?d00001 diff --git a/assets/image/icon_gz.png b/assets/image/icon_gz.png new file mode 100644 index 0000000000000000000000000000000000000000..e024a3c8d0ee7af734dc3a2c5ed2f4578626379f GIT binary patch literal 1955 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 literal 0 HcmV?d00001 diff --git a/assets/image/icon_z.png b/assets/image/icon_z.png new file mode 100644 index 0000000000000000000000000000000000000000..20b0f313be35cd958977c9517fda81aeb6a7ed3e GIT binary patch literal 1911 zcmV--2Z;EIP)Px+F-b&0R9Hv7nSX3mXBo#o&wFoM+EIF;l)yUT911wyG_o<3MaK_?F&1!c;*|M^ z8YnIFa!u5gMRG%wYGNo7Y3s6?Xl6FUT$obl1aXc(Hs%)5%_!NNQ&vDI{k`?~ea!iF zd+zNy=iZ|8G&gC_d(ZoR&-ZcuOVtveXh39(3JbBG_C5}g2xl?+2oteG^6i$+ zV%IGSpf)sABk{coUq&c%SqcVZ%@_vO85*2}3jr+%P0mIi zDWA!y0C(I3Er7ctT* z+glp405z4WRn7d}F2WINkTVuDP?dnVfx&(lAI;6yvQn5?1v&w5^@3*dvRRzi%f?`i zDvgNBBH7;3X)~z18uzJ4Q&H^I)W9b`2}^H4W|Z6W>%;_{eH~8y&H-`DD!As|NG#?6 z7#Tuedl_Ch27O&cDUb-wvh~1jv4y|C=Zz`a8ldELil#aF#a{*NUcgE>~kt6)Y?7SpxTMLySRBpMqz9 z4gEdNLS<#}p^w1F*E{e|{t8}s9>zzU@v3V0=vw6Z<&c>`pKOP7uSJ>*>p6+bEuvp* zykC*#(4uQCV8vTw6Edd;efDYi{ZqMGAWYiwy5tlf&tzYeuD`8TaFaA`93!s?(CEsu-t%`4P}?E9=a@R@of zF&Dk~Cj6oeM&1sVuCj7iw+)&1E_ATl0XKNLpn~}PVUy^$Qp=T0uG9r?ne|F)J6|fR z;M4WU?0KlA8b{k;crbV2@(Ng2hs<4w4s^lOt?;%hjfI*kuU8RE>MXNR())&rI*oWB zgFbNH_*Ip#u^yQ-AML&X9c?hw?>t{V(*ajqi}qcFV-`3!^MmFOuwAxUIGwoGv0KeP zyOk4zE-+6^{XK~FV8u+h(*r-ux|GV8{cRt#C!2#z_2#sfcPklI-iKWCKF7eGKLaO!0;6v76zkI6?@3HrWrNT1+mr5VsMZ-J;Z0Kz zu>6H*CLD%`dZ!wSpmO2?GOqD5w#DjVY;>vImDe=cAP*!rBRr~hljAZnKz9$EoQ(qTad8 zJK7IBM%QLf=%6C8Nmk|_BH3A-f9d{IITd<13$l>bdUY(Uj^@=l3y^y8XD6d}Fk9}C zj}>uvl-+8J$=cq7K%M%J--@hb*4#*!jR72@rMV%wyX#mO!zq_qsu#DuxjEwH_N=Z routers = { HeadlinesColumnDetails(arguments: arguments), '/router/photo_view_gallery_screen': (context, {arguments}) => PhotoViewGalleryScreen(), + '/router/system_details': (context, {arguments}) => + SystemDetails(), }; diff --git a/lib/message/system_details.dart b/lib/message/system_details.dart new file mode 100644 index 00000000..7a419575 --- /dev/null +++ b/lib/message/system_details.dart @@ -0,0 +1,875 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:huixiang/generated/l10n.dart'; +import 'package:huixiang/retrofit/data/base_data.dart'; +import 'package:huixiang/retrofit/data/message.dart'; +import 'package:huixiang/retrofit/data/page.dart'; +import 'package:huixiang/retrofit/retrofit_api.dart'; +import 'package:huixiang/utils/font_weight.dart'; +import 'package:huixiang/view_widget/classic_header.dart'; +import 'package:huixiang/view_widget/custom_image.dart'; +import 'package:huixiang/view_widget/my_appbar.dart'; +import 'package:huixiang/view_widget/my_footer.dart'; +import 'package:huixiang/view_widget/no_data_view.dart'; +import 'package:huixiang/view_widget/round_button.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class SystemDetails extends StatefulWidget { + @override + State createState() { + return _SystemDetails(); + } +} + +class _SystemDetails extends State { + ApiService apiService; + + @override + void initState() { + super.initState(); + + SharedPreferences.getInstance().then((value) { + apiService = + ApiService(Dio(), token: value.getString("token"), context: context); + queryMessage(); + }); + } + + int pageNum = 1; + List messages = []; + + _refresh() { + pageNum = 1; + queryMessage(); + } + + queryMessage() async { + BaseData> baseData = await apiService.msgList({ + "pageNum": pageNum, + "pageSize": 10, + "searchKey": "", + "state": "", + "typed": "" + }).catchError((onError) { + _refreshController.loadFailed(); + _refreshController.refreshFailed(); + }); + if (baseData != null && baseData.isSuccess) { + if (pageNum == 1) { + messages.clear(); + } + messages.addAll(baseData.data.list); + _refreshController.loadComplete(); + _refreshController.refreshCompleted(); + if (mounted) setState(() {}); + if (pageNum * 10 > int.tryParse(baseData.data.total)) { + _refreshController.loadNoData(); + } else { + pageNum += 1; + } + } else { + _refreshController.loadFailed(); + _refreshController.refreshFailed(); + } + } + + RefreshController _refreshController = RefreshController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppBar( + background: Colors.white, + leadingColor: Colors.black, + // title: "订单通知", + // title: "充值消息", + title: "点赞", + titleSize: 18.sp, + titleColor: Colors.black, + ), + body: SmartRefresher( + enablePullDown: true, + enablePullUp: true, + header: MyHeader(), + physics: BouncingScrollPhysics(), + footer: CustomFooter( + loadStyle: LoadStyle.ShowWhenLoading, + builder: (BuildContext context, LoadStatus mode) { + return MyFooter(mode); + }, + ), + controller: _refreshController, + onRefresh: _refresh, + onLoading: () { + queryMessage(); + }, + child: Container( + child: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Container( + child: Column( + children: [ + orderMessage(), + // rechargeMessage(), + // fabulousMessage(), + // commentMessage(), + // followMessage(), + ], + ), + ), + ), + ), + + ), + ); + } + + ///订单通知 + Widget orderMessage(){ + return Container( + color: Colors.white, + width: double.infinity, + padding: EdgeInsets.only(top:10.h,bottom:20.h,left: 20.w,right: 20.w), + child:Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (messages == null || messages.length == 0) + ? NoDataView( + isShowBtn: false, + text: S.of(context).haimeiyouxiaoxi, + fontSize: 16.sp, + margin: EdgeInsets.only(top: 120.h), + ) + : ListView.builder( + padding: EdgeInsets.only(top: 16), + itemCount: messages.length, + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + // if (messages[position].typed == 2) { + // Navigator.of(context) + // .pushNamed('/router/exchange_order_details'); + // } + }, + child: orderMessageItem(messages[position]), + ); + }), + ], + ) + ); + } + Widget orderMessageItem(Message message) { + return Container( + margin: EdgeInsets.only(top: 8.h, bottom: 8.h), + child: + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + children: [ + Image.asset( + (message.typed == 1) + ? "assets/image/icon_system_message.png" + : (message.typed == 2) + ? "assets/image/icon_system_message.png" + : "assets/image/c_z.png", + width: 24.w, + height: 24.h, + ), + SizedBox( + width:8.w, + ), + Text( + (message.typed == 1) + ? S.of(context).xitongtongzhi + : (message.typed == 2) + ? S.of(context).dingdanxiaoxi + : S.of(context).chongzhixiaoxi, + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.bold, + color: Color(0xFF060606), + ), + ) + ], + ), + Text( + message.updateTime, + style: TextStyle( + fontSize: 10.sp, + color: Color(0xFFA29E9E), + ), + ), + ], + ), + Container( + width: double.infinity, + margin: EdgeInsets.only(left:30.w, top:20.h), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded(child: Text( + message.content, + maxLines: 2, + overflow:TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFF353535), + ), + ),), + Icon( + Icons.keyboard_arrow_right, + color: Colors.black, + ) + ], + ), + Container( + margin: EdgeInsets.only(top: 14.h), + height: 1, + width: double.infinity, + color: Color(0XFFF7F7F7), + ) + ], + ), + ) + ], + ), + ); + } + + ///充值消息通知 + Widget rechargeMessage(){ + return Container( + color: Colors.white, + width: double.infinity, + padding: EdgeInsets.only(top:10.h,bottom:20.h,left: 20.w,right: 20.w), + child:Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (messages == null || messages.length == 0) + ? NoDataView( + isShowBtn: false, + text: S.of(context).haimeiyouxiaoxi, + fontSize: 16.sp, + margin: EdgeInsets.only(top: 120.h), + ) + : ListView.builder( + padding: EdgeInsets.only(top: 16), + itemCount: messages.length, + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + // if (messages[position].typed == 2) { + // Navigator.of(context) + // .pushNamed('/router/exchange_order_details'); + // } + }, + child: rechargeMessageItem(messages[position]), + ); + }), + ], + ) + ); + } + Widget rechargeMessageItem(Message message) { + return Container( + margin: EdgeInsets.only(top: 8.h, bottom: 8.h), + child: + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + children: [ + Image.asset( + (message.typed == 1) + ? "assets/image/icon_system_message.png" + : (message.typed == 2) + ? "assets/image/icon_system_message.png" + : "assets/image/c_z.png", + width: 24.w, + height: 24.h, + ), + SizedBox( + width:8.w, + ), + Text( + (message.typed == 1) + ? S.of(context).xitongtongzhi + : (message.typed == 2) + ? S.of(context).dingdanxiaoxi + : "充值通知", + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.bold, + color: Color(0xFF060606), + ), + ) + ], + ), + Text( + message.updateTime, + style: TextStyle( + fontSize: 10.sp, + color: Color(0xFFA29E9E), + ), + ), + ], + ), + Container( + width: double.infinity, + margin: EdgeInsets.only(left:30.w, top:20.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "充值成功", + style: TextStyle( + fontSize: 20.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF353535), + ), + ), + SizedBox(height:8.h,), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded(child: Text( + message.content, + maxLines: 2, + overflow:TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFF353535), + ), + ),), + Icon( + Icons.keyboard_arrow_right, + color: Colors.black, + ) + ], + ), + Container( + margin: EdgeInsets.only(top: 14.h), + height: 1, + width: double.infinity, + color: Color(0XFFF7F7F7), + ) + ], + ), + ) + ], + ), + ); + } + + ///点赞通知 + Widget fabulousMessage(){ + return Container( + color: Colors.white, + width: double.infinity, + padding: EdgeInsets.only(bottom:20.h,left: 20.w,right: 20.w), + child:Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (messages == null || messages.length == 0) + ? NoDataView( + isShowBtn: false, + text: S.of(context).haimeiyouxiaoxi, + fontSize: 16.sp, + margin: EdgeInsets.only(top: 120.h), + ) + : ListView.builder( + padding: EdgeInsets.only(top: 16), + itemCount: messages.length, + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + // if (messages[position].typed == 2) { + // Navigator.of(context) + // .pushNamed('/router/exchange_order_details'); + // } + }, + child: fabulousMessageItem(messages[position]), + ); + }), + ], + ) + ); + } + Widget fabulousMessageItem(Message message) { + return Container( + child: + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + "assets/image/c_z.png", + width: 44.w, + height: 44.h, + ), + // MImage( + // "", + // width: 44, + // height: 44, + // isCircle: true, + // fit: BoxFit.cover, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + SizedBox(width: 8,), + Expanded(child:Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + "张五", + style: TextStyle( + fontWeight: MyFontWeight.semi_bold, + fontSize: 14.sp, + color: Color(0xFF1A1A1A)) + ), + SizedBox(width:8.w,), + Text( + "点赞了", + style:TextStyle( + fontWeight: MyFontWeight.medium, + fontSize: 14.sp, + color: Color(0xFF32A060), + ), + ), + ], + ), + SizedBox(height: 8,), + Text( + message.updateTime, + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFFA29E9E), + ), + ), + SizedBox(height:12.h,), + Container( + width: double.infinity, + color:Color(0xFFF2F2F2), + padding:EdgeInsets.all(5), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "我的评论:", + style: TextStyle( + fontSize: 12.sp, + height: 1.3, + fontWeight: MyFontWeight.regular, + color: Color(0xFF1A1A1A), + ), + ), + // MImage( + // "", + // width: 38, + // height: 38, + // isCircle: true, + // fit: BoxFit.cover, + // radius: BorderRadius.circular(2), + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + SizedBox(width:2.w), + Expanded(child:Text( + "文本,是指书面语言的表现形式文本,文本,是指书面语言的表现形式文本。", + maxLines: 2, + overflow:TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12.sp, + height: 1.3, + fontWeight: MyFontWeight.regular, + color: Color(0xFF808080), + ), + ),) + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 16.h,bottom:16.h), + height: 1.h, + width: double.infinity, + color: Color(0xFFF7F7F7), + ), + ], + )), + ], + ), + ); + } + + ///评论通知 + Widget commentMessage(){ + return Container( + color: Colors.white, + width: double.infinity, + padding: EdgeInsets.only(bottom:20.h,left: 20.w,right: 20.w), + child:Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (messages == null || messages.length == 0) + ? NoDataView( + isShowBtn: false, + text: S.of(context).haimeiyouxiaoxi, + fontSize: 16.sp, + margin: EdgeInsets.only(top: 120.h), + ) + : ListView.builder( + padding: EdgeInsets.only(top: 16), + itemCount: messages.length, + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + // if (messages[position].typed == 2) { + // Navigator.of(context) + // .pushNamed('/router/exchange_order_details'); + // } + }, + child: commentMessageItem(messages[position]), + ); + }), + ], + ) + ); + } + Widget commentMessageItem(Message message) { + return Container( + child: + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + "assets/image/c_z.png", + width: 44.w, + height: 44.h, + ), + // MImage( + // "", + // width: 44, + // height: 44, + // isCircle: true, + // fit: BoxFit.cover, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + SizedBox(width: 8,), + Expanded(child:Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded(child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + "张五", + style: TextStyle( + fontWeight: MyFontWeight.semi_bold, + fontSize: 14.sp, + color: Color(0xFF1A1A1A)) + ), + SizedBox(width:8.w,), + Text( + "评论了", + style:TextStyle( + fontWeight: MyFontWeight.medium, + fontSize: 14.sp, + color: Color(0xFF32A060), + ), + ), + ], + ), + SizedBox(height: 8,), + Text( + message.updateTime, + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFFA29E9E), + ), + ), + ], + ),), + Container( + height: 21.h, + width: 40.w, + padding:EdgeInsets.only(left:2,right:2), + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(11), + border: Border.all( + width: 1, + color: Color(0xFF00A359), + style: BorderStyle.solid, + ), + ), + child: Text( + "回复", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF00A359), + ), + ), + ), + ], + ), + SizedBox(height:8.h,), + Text( + "文本,是指书面语言的表现形式,从文学角度说,通常是具有完整、系统含义(Mess…", + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12.sp, + height: 1.3, + fontWeight: MyFontWeight.regular, + color: Color(0xFF1A1A1A), + ), + ), + SizedBox(height:12.h,), + Container( + width: double.infinity, + color:Color(0xFFF2F2F2), + padding:EdgeInsets.all(5), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "我的评论:", + style: TextStyle( + fontSize: 12.sp, + height: 1.3, + fontWeight: MyFontWeight.regular, + color: Color(0xFF1A1A1A), + ), + ), + // MImage( + // "", + // width: 38, + // height: 38, + // isCircle: true, + // fit: BoxFit.cover, + // radius: BorderRadius.circular(2), + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + SizedBox(width:2.w), + Expanded(child:Text( + "文本,是指书面语言的表现形式文本,文本,是指书面语言的表现形式文本。", + maxLines: 2, + overflow:TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12.sp, + height: 1.3, + fontWeight: MyFontWeight.regular, + color: Color(0xFF808080), + ), + ),) + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 16.h,bottom:16.h), + height: 1.h, + width: double.infinity, + color: Color(0xFFF7F7F7), + ), + ], + )), + ], + ), + ); + } + + ///关注通知 + Widget followMessage(){ + return Container( + color: Colors.white, + width: double.infinity, + padding: EdgeInsets.only(bottom:20.h,left: 20.w,right: 20.w), + child:Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (messages == null || messages.length == 0) + ? NoDataView( + isShowBtn: false, + text: S.of(context).haimeiyouxiaoxi, + fontSize: 16.sp, + margin: EdgeInsets.only(top: 120.h), + ) + : ListView.builder( + padding: EdgeInsets.only(top: 16), + itemCount: messages.length, + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + // if (messages[position].typed == 2) { + // Navigator.of(context) + // .pushNamed('/router/exchange_order_details'); + // } + }, + child: followMessageItem(messages[position]), + ); + }), + ], + ) + ); + } + Widget followMessageItem(Message message) { + return Container( + child: + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + "assets/image/c_z.png", + width: 44.w, + height: 44.h, + ), + // MImage( + // "", + // width: 44, + // height: 44, + // isCircle: true, + // fit: BoxFit.cover, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + SizedBox(width: 8,), + Expanded(child:Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded(child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + "张五", + style: TextStyle( + fontWeight: MyFontWeight.semi_bold, + fontSize: 14.sp, + color: Color(0xFF1A1A1A)) + ), + SizedBox(width:8.w,), + Text( + "关注了你", + style:TextStyle( + fontWeight: MyFontWeight.medium, + fontSize: 14.sp, + color: Color(0xFF32A060), + ), + ), + ], + ), + SizedBox(height: 8,), + Text( + message.updateTime, + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFFA29E9E), + ), + ), + ], + ),), + Container( + height: 21.h, + width:56.w, + padding:EdgeInsets.only(left:5,right:5), + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(11), + border: Border.all( + width: 1, + color: Color(0xFF00A359), + style: BorderStyle.solid, + ), + color: Color(0xFF00A359), + ), + child: Row( + children: [ + Icon(Icons.add, + color:Colors.white, + size: 16, + ), + Text( + "回关", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.medium, + color: Colors.white, + ), + ), + ], + ), + ), + ], + ), + SizedBox(height:8.h,), + Container( + margin: EdgeInsets.only(top: 16.h,bottom:16.h), + height: 1.h, + width: double.infinity, + color: Color(0xFFF7F7F7), + ), + ], + )), + ], + ), + ); + } +} diff --git a/lib/message/system_message.dart b/lib/message/system_message.dart index f880c5e0..bf4967f7 100644 --- a/lib/message/system_message.dart +++ b/lib/message/system_message.dart @@ -10,6 +10,7 @@ import 'package:huixiang/view_widget/classic_header.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:huixiang/view_widget/my_footer.dart'; import 'package:huixiang/view_widget/no_data_view.dart'; +import 'package:huixiang/view_widget/round_button.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -80,11 +81,29 @@ class _SystemMessagePage extends State { Widget build(BuildContext context) { return Scaffold( appBar: MyAppBar( - background: Color(0xFFF7F7F7), + background: Colors.white, leadingColor: Colors.black, - title: S.of(context).xitongxiaoxi, + title: S.of(context).xiaoxi, titleSize: 18.sp, titleColor: Colors.black, + actions: [ + Container( + margin: EdgeInsets.only(right: 16.w), + alignment: Alignment.centerRight, + child: GestureDetector( + onTap: () { + }, + child: Text( + "标为已读", + style: TextStyle( + fontSize: 16.sp, + fontWeight:MyFontWeight.semi_bold, + color: Color(0xFF353535), + ), + ), + ), + ), + ], ), body: SmartRefresher( enablePullDown: true, @@ -102,151 +121,442 @@ class _SystemMessagePage extends State { onLoading: () { queryMessage(); }, - child: (messages == null || messages.length == 0) - ? NoDataView( - isShowBtn: false, - text: S.of(context).haimeiyouxiaoxi, - fontSize: 16.sp, - margin: EdgeInsets.only(top: 120.h), - ) - : ListView.builder( - padding: EdgeInsets.only(top: 16), - itemCount: messages.length, - physics: NeverScrollableScrollPhysics(), - itemBuilder: (context, position) { - return GestureDetector( - onTap: () { - if (messages[position].typed == 2) { - Navigator.of(context) - .pushNamed('/router/exchange_order_details'); - } - }, - child: buildMessageItem(messages[position]), - ); - }), + child: Container( + child: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Container( + child: Column( + children: [ + newsSurvey(), + SizedBox(height: 16.h,), + buildMessage(), + ], + ), + ), + ), + ), + ), ); } - Widget buildMessageItem(Message message) { + Widget newsSurvey(){ return Container( - margin: EdgeInsets.only(left: 16.w, right: 16.w, top: 8.h, bottom: 8.h), - padding: EdgeInsets.all(20.w), - decoration: BoxDecoration( - color: Colors.white, - boxShadow: [ - BoxShadow( - color: Colors.black.withAlpha(12), - offset: Offset(0, 3), - blurRadius: 14, - spreadRadius: 0, - ) - ], - borderRadius: BorderRadius.circular(8), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, + color: Colors.white, + padding: EdgeInsets.only(top: 16.h,bottom: 16.h), + child: Row( children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, + Expanded(child: Column( children: [ - Row( + Stack( children: [ Image.asset( - (message.typed == 1) - ? "assets/image/icon_system_notices.png" - : (message.typed == 2) - ? "assets/image/icon_system_order.png" - : "assets/image/icon_system_recharge.png", - width: 24.w, - height: 24.h, + "assets/image/icon_z.png", + width: 40, + height: 40, ), - SizedBox( - width: 4.w, + Container( + width:48, + alignment: Alignment.topRight, + child:Container( + width:20, + height:17, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(100), + border: Border.all( + width: 1, + color: Colors.white, + style: BorderStyle.solid, + ), + color:Color(0xFFFF441A), + ), + child:RoundButton( + text: "99+", + textColor: Colors.white, + fontWeight: MyFontWeight.regular, + backgroup: Color(0xFFFF441A), + fontSize:8.sp, + radius: 100, + ) + ), + ) + ], + ), + SizedBox(height: 6.h), + GestureDetector( + onTap: (){ + Navigator.of(context) + .pushNamed('/router/system_details'); + }, + child:Text( + "点赞", + style: TextStyle( + fontSize: 14.sp, + fontWeight:MyFontWeight.medium, + color: Color(0xFF060606), ), - Text( - (message.typed == 1) - ? S.of(context).xitongtongzhi - : (message.typed == 2) - ? S.of(context).dingdanxiaoxi - : S.of(context).chongzhixiaoxi, - style: TextStyle( - fontSize: 14.sp, - fontWeight: FontWeight.bold, - color: Color(0xFF060606), + ) + ), + ], + )), + Expanded(child:Column( + children: [ + Stack( + children: [ + Image.asset( + "assets/image/icon_pl.png", + width: 40, + height: 40, + ), + Container( + width:48, + alignment: Alignment.topRight, + child:Container( + width:16, + height:16, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(100), + border: Border.all( + width: 1, + color: Colors.white, + style: BorderStyle.solid, + ), + color:Color(0xFFFF441A), + ), + child:RoundButton( + text: "99", + textColor: Colors.white, + fontWeight: MyFontWeight.regular, + backgroup: Color(0xFFFF441A), + fontSize:8.sp, + radius: 100, + ) ), ) ], ), + SizedBox(height: 6.h), Text( - message.updateTime, + S.of(context).pinglun, style: TextStyle( - fontSize: 10.sp, - color: Color(0xFFA29E9E), + fontSize: 14.sp, + fontWeight:MyFontWeight.medium, + color: Color(0xFF060606), ), ), ], - ), - if (message.typed != 3) - Container( - margin: EdgeInsets.only(left: 28.w, top: 12.h), - child: Text( - S.of(context).ninyouyigexindedingdan, - style: TextStyle( - fontSize: 10.sp, - color: Color(0xFF353535), - ), + )), + Expanded(child:Column( + children: [ + Stack( + children: [ + Image.asset( + "assets/image/icon_gz.png", + width: 40, + height: 40, + ), + Container( + width:48, + alignment: Alignment.topRight, + child:Container( + width:16, + height:16, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(100), + border: Border.all( + width: 1, + color: Colors.white, + style: BorderStyle.solid, + ), + color:Color(0xFFFF441A), + ), + child:RoundButton( + text: "1", + textColor: Colors.white, + fontWeight: MyFontWeight.regular, + backgroup: Color(0xFFFF441A), + fontSize:8.sp, + radius: 100, + ) + ), + ) + ], ), - ) - else - Container( - margin: EdgeInsets.only(left: 28.w, top: 18.h), - child: Text( - message.title, + SizedBox(height: 6.h), + Text( + S.of(context).guanzhu, style: TextStyle( - fontSize: 20.sp, - fontWeight: MyFontWeight.semi_bold, - color: Color(0xFF353535), + fontSize: 14.sp, + fontWeight:MyFontWeight.medium, + color: Color(0xFF060606), ), ), + ], + )), + ], + ), + ); + } + + Widget buildMessage(){ + return Container( + color: Colors.white, + width: double.infinity, + padding: EdgeInsets.all(20.w), + child:Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + S.of(context).xitongxiaoxi, + style: TextStyle( + fontSize: 16.sp, + fontWeight:MyFontWeight.semi_bold, + color: Colors.black, ), - if (message.typed != 3) - Container( - margin: EdgeInsets.only(left: 28.w, top: 22.h), - child: Row( + ), + (messages == null || messages.length == 0) + ? NoDataView( + isShowBtn: false, + text: S.of(context).haimeiyouxiaoxi, + fontSize: 16.sp, + margin: EdgeInsets.only(top: 120.h), + ) + : ListView.builder( + padding: EdgeInsets.only(top: 16), + itemCount: messages.length, + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + // if (messages[position].typed == 2) { + // Navigator.of(context) + // .pushNamed('/router/exchange_order_details'); + // } + Navigator.of(context) + .pushNamed('/router/system_details'); + }, + child: buildMessageItem(messages[position]), + ); + }), + ], + ) + ); + } + + Widget buildMessageItem(Message message) { + return Container( + margin: EdgeInsets.only(top: 8.h, bottom: 8.h), + // margin: EdgeInsets.only(left: 16.w, right: 16.w, top: 8.h, bottom: 8.h), + // padding: EdgeInsets.all(20.w), + // decoration: BoxDecoration( + // color: Colors.white, + // boxShadow: [ + // BoxShadow( + // color: Colors.black.withAlpha(12), + // offset: Offset(0, 3), + // blurRadius: 14, + // spreadRadius: 0, + // ) + // ], + // borderRadius: BorderRadius.circular(8), + // ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + (message.typed == 1) + ? "assets/image/icon_system_message.png" + : (message.typed == 2) + ? "assets/image/icon_system_message.png" + : "assets/image/c_z.png", + width: 40.w, + height: 40.h, + ), + SizedBox( + width:12.w, + ), + Expanded(child:Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, children: [ + Row( + children: [ + Expanded(child:Text( + (message.typed == 1) + ? S.of(context).xitongtongzhi + : (message.typed == 2) + ? S.of(context).dingdanxiaoxi + : S.of(context).chongzhixiaoxi, + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF060606), + ), + )), + Text( + message.updateTime, + style: TextStyle( + fontSize: 10.sp, + color: Color(0xFFA29E9E), + ), + ), + ], + ), + SizedBox(height:4.h,), + (message.typed != 3) ? + Row( + mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded(child: + Text( + S.of(context).ninyouyigexindedingdan, + style: TextStyle( + fontSize: 10.sp, + color: Color(0xFF353535), + ), + ),), + RoundButton( + width: 16, + height: 16, + text: "1", + textColor: Colors.white, + fontWeight: MyFontWeight.regular, + backgroup: Color(0xFFFF441A), + fontSize:10.sp, + radius: 100, + ), + ], + ): Text( - S.of(context).chakangengduo, + message.content, style: TextStyle( - fontSize: 12.sp, - fontWeight: FontWeight.bold, + fontSize: 10.sp, color: Color(0xFF353535), ), ), - Icon( - Icons.keyboard_arrow_right, - color: Colors.black, - ) ], - ), - ) - else - Container( - margin: EdgeInsets.only(left: 28.w, top: 22.h), - child: Text( - message.content, - style: TextStyle( - fontSize: 10.sp, - color: Color(0xFF353535), - ), - ), - ), + )), + ], + ), + Container( + margin: EdgeInsets.only(top: 16.h,bottom:8.h), + height: 1.h, + width: double.infinity, + color: Color(0xFFF7F7F7), + ), ], ), + // Column( + // mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // crossAxisAlignment: CrossAxisAlignment.center, + // children: [ + // Row( + // children: [ + // Image.asset( + // (message.typed == 1) + // ? "assets/image/icon_system_notices.png" + // : (message.typed == 2) + // ? "assets/image/icon_system_order.png" + // : "assets/image/icon_system_recharge.png", + // width: 24.w, + // height: 24.h, + // ), + // SizedBox( + // width: 4.w, + // ), + // Text( + // (message.typed == 1) + // ? S.of(context).xitongtongzhi + // : (message.typed == 2) + // ? S.of(context).dingdanxiaoxi + // : S.of(context).chongzhixiaoxi, + // style: TextStyle( + // fontSize: 14.sp, + // fontWeight: FontWeight.bold, + // color: Color(0xFF060606), + // ), + // ) + // ], + // ), + // Text( + // message.updateTime, + // style: TextStyle( + // fontSize: 10.sp, + // color: Color(0xFFA29E9E), + // ), + // ), + // ], + // ), + // if (message.typed != 3) + // Container( + // margin: EdgeInsets.only(left: 28.w, top: 12.h), + // child: Text( + // S.of(context).ninyouyigexindedingdan, + // style: TextStyle( + // fontSize: 10.sp, + // color: Color(0xFF353535), + // ), + // ), + // ) + // else + // Container( + // margin: EdgeInsets.only(left: 28.w, top: 18.h), + // child: Text( + // message.title, + // style: TextStyle( + // fontSize: 20.sp, + // fontWeight: MyFontWeight.semi_bold, + // color: Color(0xFF353535), + // ), + // ), + // ), + // if (message.typed != 3) + // Container( + // margin: EdgeInsets.only(left: 28.w, top: 22.h), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // crossAxisAlignment: CrossAxisAlignment.center, + // children: [ + // Text( + // S.of(context).chakangengduo, + // style: TextStyle( + // fontSize: 12.sp, + // fontWeight: FontWeight.bold, + // color: Color(0xFF353535), + // ), + // ), + // Icon( + // Icons.keyboard_arrow_right, + // color: Colors.black, + // ) + // ], + // ), + // ) + // else + // Container( + // margin: EdgeInsets.only(left: 28.w, top: 22.h), + // child: Text( + // message.content, + // style: TextStyle( + // fontSize: 10.sp, + // color: Color(0xFF353535), + // ), + // ), + // ), + // ], + // ), ); } } diff --git a/lib/retrofit/min_api.dart b/lib/retrofit/min_api.dart index 6a3061ec..80e51624 100644 --- a/lib/retrofit/min_api.dart +++ b/lib/retrofit/min_api.dart @@ -201,7 +201,7 @@ abstract class MinApiService { @POST("store/getStore") Future queryStoreInfo1(@Body() Map param); - // 父订单信息 + /// 父订单信息 @GET("order/getParentInfo?tableId={tableId}") Future getParentInfo(@Path("tableId") String tableId); diff --git a/lib/retrofit/retrofit_api.dart b/lib/retrofit/retrofit_api.dart index 0d7deff9..c62ed445 100644 --- a/lib/retrofit/retrofit_api.dart +++ b/lib/retrofit/retrofit_api.dart @@ -53,8 +53,8 @@ import 'data/wx_pay.dart'; part 'retrofit_api.g.dart'; -const base_url = "https://pos.platform.lotus-wallet.com/app/"; ///正式 -const baseUrl = "https://pos.platform.lotus-wallet.com/app/"; ///正式 +// const base_url = "https://pos.platform.lotus-wallet.com/app/"; ///正式 +// const baseUrl = "https://pos.platform.lotus-wallet.com/app/"; ///正式 // const base_url = "http://platform.prod.kunqi.lotus-wallet.com/app/"; ///222 // const baseUrl = "http://platform.prod.kunqi.lotus-wallet.com/app/"; ///222 @@ -66,8 +66,8 @@ const baseUrl = "https://pos.platform.lotus-wallet.com/app/"; ///正式 // const baseUrl = "http://192.168.10.37:8766/app/"; -// const base_url = "http://192.168.10.142:8766/app/";///詹云久 -// const baseUrl = "http://192.168.10.142:8766/app/";///詹云久 +const base_url = "http://192.168.10.142:8766/app/";///詹云久 +const baseUrl = "http://192.168.10.142:8766/app/";///詹云久 @RestApi(baseUrl: baseUrl) abstract class ApiService { diff --git a/lib/retrofit/retrofit_api.g.dart b/lib/retrofit/retrofit_api.g.dart index 8ead78b2..1e3aebc3 100644 --- a/lib/retrofit/retrofit_api.g.dart +++ b/lib/retrofit/retrofit_api.g.dart @@ -9,7 +9,7 @@ part of 'retrofit_api.dart'; class _ApiService implements ApiService { _ApiService(this._dio, {this.baseUrl}) { ArgumentError.checkNotNull(_dio, '_dio'); - baseUrl ??= 'https://pos.platform.lotus-wallet.com/app/'; + baseUrl ??= 'http://192.168.10.142:8766/app/'; } final Dio _dio; From 0247ab84f3cafd7c624772156468f7abdafb019a Mon Sep 17 00:00:00 2001 From: w-R <953969641@qq.com> Date: Wed, 19 Jan 2022 16:43:19 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81,?= =?UTF-8?q?=E9=A6=96=E9=A1=B5=E6=9B=B4=E6=94=B9,=E7=A4=BE=E7=BE=A4?= =?UTF-8?q?=E4=B8=93=E6=A0=8F=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/community/community_child_page.dart | 31 +- lib/community/community_details.dart | 53 +- .../community_view/community_dynamic.dart | 94 +-- .../headlines/headlines_collection.dart | 95 +-- .../headlines/headlines_column_details.dart | 24 +- lib/home/home_page.dart | 156 ++++- lib/home/home_view/featured_acticvity.dart | 61 +- lib/home/home_view/quick_order.dart | 2 +- lib/home/home_view/shortcut_operation.dart | 41 +- .../points_mall_view/points_goods_title.dart | 5 + lib/login/login_page.dart | 24 +- lib/main.dart | 2 +- lib/message/system_details.dart | 635 ++++++++++++------ lib/message/system_message.dart | 392 ++++++----- lib/mine/mine_page.dart | 69 +- lib/mine/mine_view/mine_item.dart | 179 ++--- lib/mine/mine_view/mine_view.dart | 8 +- lib/mine/mine_wallet_page.dart | 29 +- lib/mine/release_page.dart | 34 +- lib/order/order_view/order_commodity.dart | 2 +- lib/retrofit/data/article.dart | 130 +++- lib/retrofit/data/message.dart | 129 ++-- lib/retrofit/data/msg_stats.dart | 29 + lib/retrofit/retrofit_api.dart | 17 +- lib/retrofit/retrofit_api.g.dart | 24 +- .../settlement_order_commodity.dart | 2 +- lib/store/store_order.dart | 2 +- lib/store/store_view/store_info.dart | 2 +- lib/view_widget/item_input_widget.dart | 3 +- lib/view_widget/request_permission.dart | 8 +- 30 files changed, 1475 insertions(+), 807 deletions(-) create mode 100644 lib/retrofit/data/msg_stats.dart diff --git a/lib/community/community_child_page.dart b/lib/community/community_child_page.dart index fce17374..0295df8b 100644 --- a/lib/community/community_child_page.dart +++ b/lib/community/community_child_page.dart @@ -1,6 +1,9 @@ +import 'dart:convert'; + import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:huixiang/community/community_view/community_dynamic.dart'; +import 'package:huixiang/retrofit/data/article.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/comunity_comment.dart'; import 'package:huixiang/retrofit/data/page.dart'; @@ -27,7 +30,7 @@ class _CommunityChildPage extends State { int pageNum = 0; String userId; - List comments = []; + List
articles = []; @override void initState() { @@ -67,11 +70,25 @@ class _CommunityChildPage extends State { refreshController.loadComplete(); if (baseData.isSuccess) { if (pageNum == 1) { - comments.clear(); + articles.clear(); } - comments.addAll(baseData.data.list); + baseData.data.list.forEach((element) { + var article = Article(); + article.id = element.id; + article.content = jsonEncode(element.subjectInfo); + article.mainTitle =element.subject; + article.liked = element.selfFollow; + article.authorHeadImg = element.memberInfo?.avatar; + article.authorName = element.memberInfo?.nickname; + article.createTime = element.createTime; + article.updateUser = element.memberInfo?.mid; + article.viewers = element?.viewers; + article.likes = element?.likes; + article.comments = element?.comments; + articles.add(article); + }); // comments.sort((a,b)=>b.createTime.compareTo(a.createTime)); - print("comments: ${comments.length}"); + // print("comments: ${comments.length}"); if (int.tryParse(baseData.data.total) < (pageNum * 10)) { refreshController.loadNoData(); } @@ -103,7 +120,7 @@ class _CommunityChildPage extends State { itemBuilder: (context, position) { return InkWell( child: CommunityDynamic( - comments[position], + articles[position], 0, userId: userId, isList: true, @@ -117,14 +134,14 @@ class _CommunityChildPage extends State { Navigator.of(context).pushNamed( '/router/community_details', arguments: { - "comment": comments[position], + "businessId": articles[position].id, "userId": userId, }, ); }, ); }, - itemCount: comments.length, + itemCount: articles.length, ), ); }, diff --git a/lib/community/community_details.dart b/lib/community/community_details.dart index ded19a6e..4b627168 100644 --- a/lib/community/community_details.dart +++ b/lib/community/community_details.dart @@ -30,7 +30,7 @@ class CommunityDetails extends StatefulWidget { class _CommunityDetails extends State with WidgetsBindingObserver { double height = 0; double commentHeight = 60.h; - ComunityComment comunity; + // ComunityComment comunity; String parenId = "0"; final GlobalKey commentKey = GlobalKey(); final ScrollController scrollController = ScrollController(); @@ -43,6 +43,8 @@ class _CommunityDetails extends State with WidgetsBindingObser bool isKeyBoardShow = false; int commentTotal = 0; Article article; + String businessId; + @override void didChangeMetrics() { @@ -72,15 +74,16 @@ class _CommunityDetails extends State with WidgetsBindingObser @override void initState() { super.initState(); - comunity = widget.arguments["comment"]; + // comunity = widget.arguments["comment"]; + businessId = widget.arguments["businessId"]; WidgetsBinding.instance.addObserver(this); _queryMemberCommentList(); - queryDetails(); + queryDetails(businessId); } ///详情接口 - queryDetails() async { + queryDetails(id) async { SharedPreferences value = await SharedPreferences.getInstance(); if (apiService == null) apiService = ApiService( @@ -88,11 +91,15 @@ class _CommunityDetails extends State with WidgetsBindingObser context: context, token: value.getString("token"), ); - BaseData
baseData = await apiService.informationInfo(comunity.id) + BaseData
baseData = await apiService.informationInfo(id) .catchError((onError) { debugPrint(onError.toString()); }); - if (baseData != null && baseData.isSuccess) {} + if (baseData != null && baseData.isSuccess) { + setState(() { + article = baseData.data; + }); + } } @override @@ -114,13 +121,14 @@ class _CommunityDetails extends State with WidgetsBindingObser physics: BouncingScrollPhysics(), child: Column( children: [ + if(article != null) CommunityDynamic( - comunity, + article, 0, exitFull: () { setState(() {}); }, - userId:widget.arguments["userId"], + userId:widget.arguments !=null ? widget.arguments["userId"] :widget.arguments["mid"], itemCount: 3, isDetails: true, heightFun: (height) { @@ -136,9 +144,9 @@ class _CommunityDetails extends State with WidgetsBindingObser ), CommentList( commentKey, - comunity?.likes ?? comunity?.likes.toString() ?? 0, - comunity.id, - 1, + article?.likes ?? 0, + businessId, + 4, isKeyBoardShow, _reply, _delCommentTips, @@ -154,8 +162,7 @@ class _CommunityDetails extends State with WidgetsBindingObser margin: EdgeInsets.only(top: 40), padding: EdgeInsets.all(22.h), child: Text( - S - .of(context) + S.of(context) .zanwupinglun, style: TextStyle( fontSize: 12, @@ -180,7 +187,7 @@ class _CommunityDetails extends State with WidgetsBindingObser _toComment, _queryMemberComment, _queryInformationLikes, - isLike: comunity.selfLike, + isLike: article?.liked ?? false, ), ], ), @@ -190,15 +197,15 @@ class _CommunityDetails extends State with WidgetsBindingObser ///给文章/活动点赞 _queryInformationLikes() async { - BaseData baseData = await apiService.informationLikes(comunity.id).catchError((onError) {}); + BaseData baseData = await apiService.informationLikes(businessId).catchError((onError) {}); if (baseData != null && baseData.isSuccess) { commentKey.currentState.setState(() {}); setState(() { - if (comunity.selfLike ?? false) - comunity.likes -= 1; + if (article?.liked ?? false) + article?.likes -= 1; else - comunity.likes += 1; - comunity.selfLike = !comunity.selfLike ?? false; + article?.likes += 1; + article?.liked = !(article.liked ?? false); }); } else { // SmartDialog.showToast(baseData.msg, alignment: Alignment.center); @@ -210,8 +217,8 @@ class _CommunityDetails extends State with WidgetsBindingObser BaseData baseData = await apiService.memberComment({ "content": content, "parentId": parenId, - "relationalId": comunity.id, - "relationalType":1 + "relationalId": businessId, + "relationalType":4 }).catchError((error) {}); if (baseData != null && baseData.isSuccess) { CommentListState state = commentKey.currentState; @@ -295,8 +302,8 @@ class _CommunityDetails extends State with WidgetsBindingObser await apiService.memberCommentList({ "pageNum": 1, "pageSize": 100, - "relationalId": comunity.id, - "relationalType":1, + "relationalId": businessId, + "relationalType":4, }).catchError((error) {}); if (baseData != null && baseData.isSuccess) { commentTotal = baseData.data.size; diff --git a/lib/community/community_view/community_dynamic.dart b/lib/community/community_view/community_dynamic.dart index d72cfb61..dc9674df 100644 --- a/lib/community/community_view/community_dynamic.dart +++ b/lib/community/community_view/community_dynamic.dart @@ -1,10 +1,11 @@ +import 'dart:convert'; import 'dart:ui'; import 'package:chewie/chewie.dart'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:huixiang/retrofit/data/article.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; -import 'package:huixiang/retrofit/data/comunity_comment.dart'; import 'package:chewie/src/chewie_progress_colors.dart' as chewie; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/utils/font_weight.dart'; @@ -13,8 +14,6 @@ import 'package:huixiang/view_widget/custom_image.dart'; import 'package:huixiang/view_widget/icon_text.dart'; import 'package:huixiang/view_widget/round_button.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:image_pickers/image_pickers.dart'; -import 'package:photo_view/photo_view.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:video_player/video_player.dart'; @@ -29,11 +28,11 @@ class CommunityDynamic extends StatefulWidget { final Function removalDynamic; final Function exitFull; final bool isList; - final ComunityComment comment; + final Article article; final String userId; CommunityDynamic( - this.comment, + this.article, this.commentType, { Key key, this.itemCount = 9, @@ -78,15 +77,18 @@ class _CommunityDynamic extends State { String filePath; initVideo() async { - if (widget.comment.subjectInfo.type == "video" && - widget.comment.subjectInfo.video.isNotEmpty) { + if(widget?.article?.content == null) + return; + var cnt = jsonDecode(widget.article.content); + if (cnt["type"] == "video" && + cnt["video"] != null) { if (widget.isList) { videoPlayerController = VideoPlayerController.network( - widget.comment.subjectInfo.video, + cnt["video"], )..initialize().then((value) {}); } else { videoPlayerController = VideoPlayerController.network( - widget.comment.subjectInfo.video, + cnt["video"], )..initialize().then((value) { chewieAudioController = ChewieController( videoPlayerController: videoPlayerController, @@ -172,13 +174,17 @@ class _CommunityDynamic extends State { children: [ GestureDetector( onTap: (){ + if(widget?.article?.authorHeadImg == ""){ + SmartDialog.showToast("用户暂未设置头像", alignment: Alignment.center); + return; + } Navigator.push(context, MaterialPageRoute( builder: (context) => PhotoViewGalleryScreen( - images:[widget?.comment?.memberInfo?.avatar ?? ""],//传入图片list + images:[widget?.article?.authorHeadImg ?? ""],//传入图片list index: 0,//传入当前点击的图片的index - ), ), ); + ), )); }, child: MImage( - widget?.comment?.memberInfo?.avatar ?? "", + widget?.article?.authorHeadImg ?? "", width: 44, height: 44, isCircle: true, @@ -195,7 +201,7 @@ class _CommunityDynamic extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - widget?.comment?.memberInfo?.nickname ?? "", + widget?.article?.authorName ?? "", style: TextStyle( fontSize: 15.sp, fontWeight: MyFontWeight.semi_bold, @@ -203,7 +209,7 @@ class _CommunityDynamic extends State { ), ), Text( - widget?.comment?.createTime ?? "", + widget?.article?.createTime ?? "", style: TextStyle( fontSize: 13.sp, fontWeight: MyFontWeight.regular, @@ -215,14 +221,14 @@ class _CommunityDynamic extends State { ], ), ), - if (widget?.comment?.memberInfo?.mid != widget.userId ?? "") + if (widget?.article?.updateUser != widget.userId ?? "") GestureDetector( onTap: () { setState(() { if (widget.commentType == 0) { - widget.comment.selfFollow = - !(widget.comment.selfFollow ?? false); - _vipFollow(widget.comment.memberInfo?.mid,widget.comment.selfFollow ?? false); + widget.article.liked = + !(widget.article.liked ?? false); + _vipFollow(widget.article.updateUser,widget.article.liked ?? false); } else { showDeleteDialog(); } @@ -235,21 +241,21 @@ class _CommunityDynamic extends State { alignment: Alignment.center, child: RoundButton( height: 25.h, - backgroup: (widget.comment.selfFollow ?? false) + backgroup: (widget?.article?.liked ?? false) ? Color(0xFFE6E6E6) : Color(0xFF32A060), - textColor: (widget.comment.selfFollow ?? false) + textColor: (widget?.article?.liked ?? false) ? Color(0xFF808080) : Colors.white, - text: (widget.comment.selfFollow ?? false) + text: (widget?.article?.liked ?? false) ? "已关注" : "关注", radius: 20, icons: Icon( - (widget.comment.selfFollow ?? false) + (widget?.article?.liked ?? false) ? Icons.check : Icons.add, - color: (widget.comment.selfFollow ?? false) + color: (widget?.article?.liked ?? false) ? Color(0xFF808080) : Colors.white, size: 15, @@ -267,7 +273,7 @@ class _CommunityDynamic extends State { height: 12.h, ), Text( - widget.comment.subject ?? "", + widget?.article?.mainTitle ?? "", maxLines: 5, overflow: TextOverflow.ellipsis, style: TextStyle( @@ -276,7 +282,7 @@ class _CommunityDynamic extends State { fontSize: 15.sp, ), ), - buildMedia(widget.comment.subjectInfo), + buildMedia(widget?.article?.content), if (!widget.isDetails) SizedBox( height: 12.h, @@ -287,8 +293,8 @@ class _CommunityDynamic extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ IconText( - (widget.comment != null) - ? "${widget.comment.viewers}" + (widget.article != null) + ? "${widget.article.viewers}" : "", space: 4.w, leftImage: "assets/svg/liulanliang.svg", @@ -298,7 +304,7 @@ class _CommunityDynamic extends State { ), ), IconText( - "${widget.comment.comments ?? 0}", + "${widget.article.comments ?? 0}", space: 4.w, leftImage: "assets/svg/pinglun.svg", iconSize: 16, @@ -309,7 +315,7 @@ class _CommunityDynamic extends State { GestureDetector( onTap: () {}, child: IconText( - "${widget.comment.likes ?? 0}", + "${widget.article.likes ?? 0}", space: 4.w, leftImage: "assets/svg/xihuan.svg", iconSize: 16, @@ -332,24 +338,25 @@ class _CommunityDynamic extends State { } ///动态内容 - Widget buildMedia(SubjectInfo subjectInfo) { - if (subjectInfo == null) { + Widget buildMedia(String subjectInfo) { + if (subjectInfo == null || !subjectInfo.startsWith("{")) { return Container(); } + var cnt = jsonDecode(subjectInfo); Widget itemWidget = Container(); - if (subjectInfo.type == "image" && subjectInfo.images.length > 0) { - if (subjectInfo.images.length == 1) { + if (cnt["type"] == "image"&& cnt["images"] != null && cnt["images"].length > 0) { + if (cnt["images"].length == 1) { itemWidget = Container( child: InkWell( onTap: () { // ImagePickers.previewImages(subjectInfo.images,0); Navigator.push(context, MaterialPageRoute( builder: (context) => PhotoViewGalleryScreen( - images:subjectInfo.images,//传入图片list + images:cnt["images"],//传入图片list index: 0,//传入当前点击的图片的index ), ), ); }, child: MImage( - subjectInfo.images[0], + cnt["images"][0], fit: BoxFit.cover, radius: BorderRadius.circular(2), width: MediaQuery.of(context).size.width / 1.5, @@ -361,8 +368,8 @@ class _CommunityDynamic extends State { } else { itemWidget = GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: (subjectInfo.images.length == 2 || - subjectInfo.images.length == 4) + crossAxisCount: (cnt["images"].length == 2 || + cnt["images"].length == 4) ? 2 : 3, crossAxisSpacing: 12.w, @@ -378,12 +385,12 @@ class _CommunityDynamic extends State { onTap: () { // ImagePickers.previewImages(subjectInfo.images, position); Navigator.push(context, MaterialPageRoute( builder: (context) => PhotoViewGalleryScreen( - images:subjectInfo.images,//传入图片list + images:cnt["images"],//传入图片list index: position,//传入当前点击的图片的index ), ), ); }, child: MImage( - subjectInfo.images[position], + cnt["images"][position], fit: BoxFit.cover, aspectRatio: 1, radius: BorderRadius.circular(1), @@ -393,17 +400,18 @@ class _CommunityDynamic extends State { ), ); }, - itemCount: subjectInfo.images.length, + itemCount: cnt["images"].length, ); } - } else if (subjectInfo.type == "video" && subjectInfo.video.isNotEmpty) { + } + else if (cnt["type"] == "video" && cnt["video"]!= null && cnt["video"].isNotEmpty) { itemWidget = videoWidget( MediaQuery.of(context).size.width - 32, videoPlayerController != null ? (MediaQuery.of(context).size.width - 32) / videoPlayerController.value.aspectRatio : MediaQuery.of(context).size.width / 2, - !widget.isList ? subjectInfo.video : widget.comment.coverImg, + !widget.isList ? cnt["video"] : widget.article.coverImg, ); } return Column( @@ -551,7 +559,7 @@ class _CommunityDynamic extends State { fontWeight: FontWeight.bold, ), onTap: () { - _deleteDynamic(widget.comment.id); + _deleteDynamic(widget.article.id); Navigator.of(context).pop(); }, ), diff --git a/lib/community/headlines/headlines_collection.dart b/lib/community/headlines/headlines_collection.dart index 77ae7f4d..cc0fc2f3 100644 --- a/lib/community/headlines/headlines_collection.dart +++ b/lib/community/headlines/headlines_collection.dart @@ -37,7 +37,7 @@ class _HeadlinesCollection extends State { @override Widget build(BuildContext context) { return Container( - height: 60.h, + height: 100.h, margin: EdgeInsets.only(top:10), child: ListView.builder( scrollDirection: Axis.horizontal, @@ -61,7 +61,7 @@ class _HeadlinesCollection extends State { Widget headlinesCollectionItem(HeadlinesList headlines) { return Container( width: 225.w, - height:60.h, + height:100.h, decoration: BoxDecoration( borderRadius: BorderRadius.circular(4), boxShadow: [ @@ -85,7 +85,7 @@ class _HeadlinesCollection extends State { child: MImage( headlines?.coverImg ?? "", width: 225.w, - height: 60.h, + height: 100.h, fit: BoxFit.cover, errorSrc: "assets/image/default_1.png", fadeSrc: "assets/image/default_1.png", @@ -97,69 +97,40 @@ class _HeadlinesCollection extends State { ), ), Container( - padding: EdgeInsets.only(left:12.w,right: 12.w), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded(child: Row( - children: [ - Container( - margin: EdgeInsets.only(right:4), - padding:EdgeInsets.only(left:2,right:2), - height:22.h, - alignment: Alignment.center, - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular(2), - color: Color(0xFF32A060), - ), - child: Text( - "专栏", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Colors.white, - ), - ), + padding: EdgeInsets.only(left:12.w,right: 12.w,bottom: 8), + alignment: Alignment.bottomLeft, + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right:4), + padding:EdgeInsets.only(left:2,right:2), + height:22.h, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(2), + color: Color(0xFF007EFF), ), - Expanded(child:Text( - headlines?.name ?? "", - overflow: TextOverflow.ellipsis, - maxLines: 2, + child: Text( + "专栏", style: TextStyle( - fontSize: 15.sp, - fontWeight: MyFontWeight.semi_bold, + fontSize: 12.sp, + fontWeight: MyFontWeight.medium, color: Colors.white, ), - ),), - ],)), - // Row( - // children: [ - // Expanded(child:Text( - // "更新3篇", - // style: TextStyle( - // fontSize: 12.sp, - // fontWeight: MyFontWeight.medium, - // color: Colors.white, - // ), - // )), - // Text( - // "查看专栏", - // style: TextStyle( - // fontSize: 12.sp, - // fontWeight: MyFontWeight.regular, - // color: Colors.white, - // ), - // ), - // SizedBox(width: 2), - // Image.asset( - // "assets/image/t_right.png", - // width: 14, - // height: 14, - // ), - // ],), - ],), + ), + ), + Expanded(child:Text( + headlines?.name ?? "", + overflow: TextOverflow.ellipsis, + maxLines: 2, + style: TextStyle( + fontSize: 15.sp, + fontWeight: MyFontWeight.semi_bold, + color: Colors.white, + ), + ),), + ],) ), ], ), diff --git a/lib/community/headlines/headlines_column_details.dart b/lib/community/headlines/headlines_column_details.dart index 699795d0..ebf21fd3 100644 --- a/lib/community/headlines/headlines_column_details.dart +++ b/lib/community/headlines/headlines_column_details.dart @@ -142,14 +142,20 @@ class _HeadlinesColumnDetails extends State Stack( children: [ Positioned( - child: MImage( - headlinesListDetails?.bannerImg ?? "", - width: double.infinity, - height: 260.h, - fit: BoxFit.cover, - errorSrc: "assets/image/default_1.png", - fadeSrc: "assets/image/default_1.png", - ), + child: Container( + color: Colors.black, + child:Opacity( + opacity:0.75, + child: MImage( + headlinesListDetails?.bannerImg ?? "", + width: double.infinity, + height: 260.h, + fit: BoxFit.cover, + errorSrc: "assets/image/default_1.png", + fadeSrc: "assets/image/default_1.png", + ) + ) + ) ), Container( margin: EdgeInsets.only( @@ -194,7 +200,7 @@ class _HeadlinesColumnDetails extends State decoration: BoxDecoration( borderRadius: BorderRadius.circular(2), - color: Color(0xFF32A060), + color: Color(0xFF007EFF), ), child: Text( "专栏", diff --git a/lib/home/home_page.dart b/lib/home/home_page.dart index 6d30b07d..b2663c6e 100644 --- a/lib/home/home_page.dart +++ b/lib/home/home_page.dart @@ -21,14 +21,17 @@ import 'package:huixiang/retrofit/data/founder.dart'; import 'package:huixiang/retrofit/data/goods.dart'; import 'package:huixiang/retrofit/data/goods_category.dart'; import 'package:huixiang/retrofit/data/login_info.dart'; +import 'package:huixiang/retrofit/data/msg_stats.dart'; import 'package:huixiang/retrofit/data/page.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/utils/event_type.dart'; +import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/view_widget/classic_header.dart'; import 'package:huixiang/view_widget/invite_success_dialog.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:huixiang/view_widget/new_people_reward.dart'; import 'package:huixiang/view_widget/request_permission.dart'; +import 'package:huixiang/view_widget/round_button.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -42,7 +45,8 @@ class HomePage extends StatefulWidget { final List interviewCouponList; final List newUserCouponList; - HomePage(this.changeTab, {this.invite,this.interviewCouponList,this.newUserCouponList}); + HomePage(this.changeTab, + {this.invite, this.interviewCouponList, this.newUserCouponList}); @override State createState() { @@ -63,21 +67,21 @@ class _HomePage extends State with AutomaticKeepAliveClientMixin { } }); - if((widget.invite??"") != "" || widget.interviewCouponList != null - && widget.interviewCouponList.length > 0) - showInvite = true; + if ((widget.invite ?? "") != "" || + widget.interviewCouponList != null && + widget.interviewCouponList.length > 0) showInvite = true; - if(widget.newUserCouponList != null && widget.newUserCouponList.length > 0) + if (widget.newUserCouponList != null && widget.newUserCouponList.length > 0) showNew = true; } ///邀请成功弹窗 - inviteShowAlertDialog(invite,InterviewCouponList interviewCouponList) { + inviteShowAlertDialog(invite, InterviewCouponList interviewCouponList) { //显示对话框 showDialog( context: context, builder: (BuildContext context) { - return InviteSuccessDialog(invite,interviewCouponList); + return InviteSuccessDialog(invite, interviewCouponList); }, ); } @@ -114,6 +118,7 @@ class _HomePage extends State with AutomaticKeepAliveClientMixin { List gooods = []; Founder founder; bool isSigned = false; + int totalMsg = 0; queryHome() async { EasyLoading.show(status: S.of(context).zhengzaijiazai); @@ -231,16 +236,43 @@ class _HomePage extends State with AutomaticKeepAliveClientMixin { refreshController.refreshFailed(); } EasyLoading.dismiss(); - if(showInvite){ - inviteShowAlertDialog(widget.invite,widget.interviewCouponList[0]); + if (showInvite) { + inviteShowAlertDialog(widget.invite, widget.interviewCouponList[0]); showInvite = false; } - if(showNew){ + if (showNew) { newShowAlertDialog(widget.newUserCouponList); showNew = false; } } + queryMsgStats() async { + if (apiService == null) { + SharedPreferences value = await SharedPreferences.getInstance(); + apiService = ApiService( + Dio(), + context: context, + token: value.getString("token"), + ); + } + BaseData> baseData = await apiService.stats().catchError((onError) {}); + if (baseData != null && baseData.isSuccess) { + setState(() { + baseData.data.forEach((element) { + totalMsg += element.number; + }); + }); + refreshController.loadComplete(); + refreshController.refreshCompleted(); + } + EasyLoading.dismiss(); + } + + _onRefresh(){ + queryHome(); + queryMsgStats(); + } + @override void dispose() { super.dispose(); @@ -259,17 +291,55 @@ class _HomePage extends State with AutomaticKeepAliveClientMixin { leading: false, actions: [ Container( - margin: EdgeInsets.only(right: 12.w), - child: GestureDetector( - onTap: () { - Navigator.of(context).pushNamed('/router/system_msg_page'); - }, - child: SvgPicture.asset( - "assets/svg/tixing.svg", - width: 24, - height: 24, - ), + height: 24, + alignment: Alignment.center, + margin: EdgeInsets.only( + right: 12.w, ), + child: GestureDetector( + onTap: () { + Navigator.of(context).pushNamed('/router/system_msg_page'); + }, + child: Container( + height: 24, + alignment:Alignment.center, + child:Stack( + children: [ + SvgPicture.asset( + "assets/svg/tixing.svg", + width: 24, + height: 24, + ), + if(totalMsg != 0) + Container( + width:36, + alignment: Alignment.topRight, + child:Container( + width:22, + height:14, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(100), + border: Border.all( + width: 1, + color: Colors.white, + style: BorderStyle.solid, + ), + color:Color(0xFFFF441A), + ), + child:RoundButton( + text:totalMsg.toString(), + textColor: Colors.white, + fontWeight: MyFontWeight.regular, + backgroup: Color(0xFFFF441A), + fontSize:8.sp, + radius: 100, + ) + ), + ) + ], + ), + ) + ) ), Container( margin: EdgeInsets.only(right: 16.w), @@ -300,7 +370,7 @@ class _HomePage extends State with AutomaticKeepAliveClientMixin { child: SingleChildScrollView( physics: NeverScrollableScrollPhysics(), child: FutureBuilder( - future: queryHome(), + future: _onRefresh(), builder: (context, snapshot) { return Column( children: [ @@ -308,14 +378,16 @@ class _HomePage extends State with AutomaticKeepAliveClientMixin { HomeBanner(bannerData, controller), ///快捷操作 - ShortcutOperation((){ + ShortcutOperation(() { widget.changeTab(1); }), ///签到 - SignView(isSigned,(value){setState(() { - isSigned = value; - });}), + SignView(isSigned, (value) { + setState(() { + isSigned = value; + }); + }), // ///热门文章 // HotArticle(articles), @@ -330,12 +402,16 @@ class _HomePage extends State with AutomaticKeepAliveClientMixin { ///超级优惠券 // CouponView(), - ///积分商城 - HomeIntegralStore(gooods), + SizedBox( + height: 28, + ), ///精选活动 FeaturedActivity(), + ///积分商城 + HomeIntegralStore(gooods), + ///积分商品头Tab PointsGoodsTitle( gooodsCategorys, @@ -384,7 +460,7 @@ class _HomePage extends State with AutomaticKeepAliveClientMixin { S.of(context).ninxiangjiquanxianweikaiqi, S.of(context).weilekaipaizhaoxuanzhetouxiang, S.of(context).kaiqiquanxian, - (result) async { + (result) async { if (result) { await openAppSettings(); } @@ -400,7 +476,12 @@ class _HomePage extends State with AutomaticKeepAliveClientMixin { String tableId = uri.queryParameters["tableId"]; String tenantCode = uri.queryParameters["tenantCode"]; String shopId = uri.queryParameters["shopId"]; - if (tableId != null && tableId != "" && tenantCode != null && tenantCode != "" && shopId != null && shopId != "") { + if (tableId != null && + tableId != "" && + tenantCode != null && + tenantCode != "" && + shopId != null && + shopId != "") { Navigator.of(context).pushNamed( '/router/store_order', arguments: { @@ -412,7 +493,22 @@ class _HomePage extends State with AutomaticKeepAliveClientMixin { ); } } else { - await Permission.camera.request(); + showCupertinoDialog( + context: context, + builder: (context) { + return RequestPermission( + "assets/image/icon_camera_permission_tips.png", + S.of(context).ninxiangjiquanxianweikaiqi, + S.of(context).weilekaipaizhaoxuanzhetouxiang, + S.of(context).kaiqiquanxian, + (result) async { + if (result) { + await Permission.camera.request(); + } + }, + heightRatioWithWidth: 0.82, + ); + }); } } diff --git a/lib/home/home_view/featured_acticvity.dart b/lib/home/home_view/featured_acticvity.dart index dfb3ac54..2aea1f43 100644 --- a/lib/home/home_view/featured_acticvity.dart +++ b/lib/home/home_view/featured_acticvity.dart @@ -78,9 +78,9 @@ class _FeaturedActivity extends State { child: stackItem(18.sp, activityList[0]), margin: EdgeInsets.symmetric(horizontal: 5.w), width: (MediaQuery.of(context).size.width - 42) / 2, - height: 190.h, + height: 125.h, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4), + borderRadius: BorderRadius.circular(6), color: Colors.red, image: DecorationImage( image: NetworkImage( @@ -106,9 +106,9 @@ class _FeaturedActivity extends State { child: stackItem(12.sp, activityList[1]), margin: EdgeInsets.symmetric(horizontal: 5.w), width: (MediaQuery.of(context).size.width - 42) / 2, - height: 190.h / 2, + height:125.h, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4), + borderRadius: BorderRadius.circular(6), color: Colors.green, image: DecorationImage( image: NetworkImage( @@ -122,28 +122,28 @@ class _FeaturedActivity extends State { SizedBox( height: 5, ), - GestureDetector( - onTap: () { - Navigator.of(context).pushNamed('/router/web_page', - arguments: {"activityId": activityList[2].id}); - }, - child: Container( - child: stackItem(12.sp, activityList[2]), - margin: EdgeInsets.symmetric(horizontal: 5.w), - width: (MediaQuery.of(context).size.width - 42) / 2, - height: 190.h / 2, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4), - color: Colors.blue, - image: DecorationImage( - image: NetworkImage( - activityList[2].coverImg, - ), - fit: BoxFit.fill, - ), - ), - ), - ), + // GestureDetector( + // onTap: () { + // Navigator.of(context).pushNamed('/router/web_page', + // arguments: {"activityId": activityList[2].id}); + // }, + // child: Container( + // child: stackItem(12.sp, activityList[2]), + // margin: EdgeInsets.symmetric(horizontal: 5.w), + // width: (MediaQuery.of(context).size.width - 42) / 2, + // height: 190.h / 2, + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(4), + // color: Colors.blue, + // image: DecorationImage( + // image: NetworkImage( + // activityList[2].coverImg, + // ), + // fit: BoxFit.fill, + // ), + // ), + // ), + // ), ], ), ), @@ -160,7 +160,10 @@ class _FeaturedActivity extends State { Widget stackItem(double textSize, Activity activity) { return Container( - color: Color.fromARGB(80, 0, 0, 0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6), + color: Color.fromARGB(80, 0, 0, 0), + ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, @@ -176,7 +179,7 @@ class _FeaturedActivity extends State { maxLines: 1, style: TextStyle( fontWeight: MyFontWeight.semi_bold, - fontSize: textSize, + fontSize: 14.sp, color: Colors.white, ), ), @@ -195,7 +198,7 @@ class _FeaturedActivity extends State { ), ), Container( - width: 58.w, + width: 48.w, margin: EdgeInsets.only(left: 8, bottom: 8), padding: EdgeInsets.symmetric( vertical: 4.h, diff --git a/lib/home/home_view/quick_order.dart b/lib/home/home_view/quick_order.dart index b21ff508..34ea054d 100644 --- a/lib/home/home_view/quick_order.dart +++ b/lib/home/home_view/quick_order.dart @@ -160,7 +160,7 @@ class _QuickOrder extends State { children: [ ItemTitle( text: "店铺推荐", - imgPath: "assets/image/icon_points_mall.png", + imgPath: "assets/image/icon_shop.png", ), Container( height: 170, diff --git a/lib/home/home_view/shortcut_operation.dart b/lib/home/home_view/shortcut_operation.dart index 82e76630..98e36e36 100644 --- a/lib/home/home_view/shortcut_operation.dart +++ b/lib/home/home_view/shortcut_operation.dart @@ -46,7 +46,18 @@ class _ShortcutOperation extends State { }, child: Container( width: 106, - color: Colors.white, + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(4), + ), margin: EdgeInsets.only(right:10), padding: EdgeInsets.only(top: 8,bottom: 8), child: Column( @@ -84,7 +95,18 @@ class _ShortcutOperation extends State { }, child: Container( width: 106, - color: Colors.white, + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(4), + ), margin: EdgeInsets.only(right:10), padding: EdgeInsets.only(top: 8,bottom: 8), child: Column( @@ -99,7 +121,7 @@ class _ShortcutOperation extends State { ), SizedBox(height: 5), Text( - "充值送会员!", + "会员享有赠送!", style: TextStyle( fontWeight: MyFontWeight.regular, fontSize: 12.sp, @@ -122,7 +144,18 @@ class _ShortcutOperation extends State { }, child:Container( width: 106, - color: Colors.white, + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(4), + ), padding: EdgeInsets.only(top: 8,bottom: 8), child: Column( children: [ diff --git a/lib/home/points_mall_view/points_goods_title.dart b/lib/home/points_mall_view/points_goods_title.dart index a28e59c3..e9b12d45 100644 --- a/lib/home/points_mall_view/points_goods_title.dart +++ b/lib/home/points_mall_view/points_goods_title.dart @@ -3,6 +3,7 @@ import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/retrofit/data/goods_category.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:huixiang/view_widget/item_title.dart'; import 'package:huixiang/view_widget/my_tab.dart'; class PointsGoodsTitle extends StatefulWidget { @@ -41,6 +42,10 @@ class _PointsGoodsTitle extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ + ItemTitle( + text: S.of(context).jifenshangcheng, + imgPath: "assets/image/icon_points_mall.png", + ), // ItemTitle( // text: S.of(context).jifenshangcheng, // imgPath: "assets/image/icon_points_mall.png", diff --git a/lib/login/login_page.dart b/lib/login/login_page.dart index 76349a7b..986c1ae8 100644 --- a/lib/login/login_page.dart +++ b/lib/login/login_page.dart @@ -512,20 +512,16 @@ class _MyLoginPageState extends State with TickerProviderStateMixin { ), ), ), - Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.asset( - "assets/image/icon_login_logo.png", - width: 91.w, - height: 91.h, - ), - SizedBox( - height: 0.596.sh, - ), - ], - ), + Container( + height: MediaQuery.of(context).size.height * 0.78, + margin: EdgeInsets.only(top: 56.h), + alignment: Alignment.topCenter, + child:Image.asset( + "assets/image/icon_login_logo.png", + width: 91.w, + height: 91.h, + ), + ) ], ), ), diff --git a/lib/main.dart b/lib/main.dart index 45b26751..ff2580d3 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -330,5 +330,5 @@ Map routers = { '/router/photo_view_gallery_screen': (context, {arguments}) => PhotoViewGalleryScreen(), '/router/system_details': (context, {arguments}) => - SystemDetails(), + SystemDetails(arguments:arguments), }; diff --git a/lib/message/system_details.dart b/lib/message/system_details.dart index 7a419575..b27b1a19 100644 --- a/lib/message/system_details.dart +++ b/lib/message/system_details.dart @@ -1,22 +1,31 @@ +import 'dart:convert'; + import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:huixiang/generated/l10n.dart'; +import 'package:huixiang/retrofit/data/article.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/message.dart'; import 'package:huixiang/retrofit/data/page.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/view_widget/classic_header.dart'; +import 'package:huixiang/view_widget/comment_menu.dart'; import 'package:huixiang/view_widget/custom_image.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:huixiang/view_widget/my_footer.dart'; import 'package:huixiang/view_widget/no_data_view.dart'; import 'package:huixiang/view_widget/round_button.dart'; +import 'package:huixiang/web/web_view/comment_list.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; class SystemDetails extends StatefulWidget { + final Map arguments; + + SystemDetails({this.arguments}); @override State createState() { return _SystemDetails(); @@ -25,10 +34,22 @@ class SystemDetails extends StatefulWidget { class _SystemDetails extends State { ApiService apiService; + int pageNum = 1; + List messages = []; + int msgType = 0; + String parenId = "0"; + var commentFocus = FocusNode(); + String hintText = S.current.liuxianinjingcaidepinglunba; + bool isKeyBoardShow = false; + final GlobalKey commentKey = GlobalKey(); + final GlobalKey inputKey = GlobalKey(); + final TextEditingController commentTextController = TextEditingController(); + @override void initState() { super.initState(); + msgType = widget.arguments["msgType"]; SharedPreferences.getInstance().then((value) { apiService = @@ -37,8 +58,6 @@ class _SystemDetails extends State { }); } - int pageNum = 1; - List messages = []; _refresh() { pageNum = 1; @@ -51,7 +70,7 @@ class _SystemDetails extends State { "pageSize": 10, "searchKey": "", "state": "", - "typed": "" + "typed": msgType }).catchError((onError) { _refreshController.loadFailed(); _refreshController.refreshFailed(); @@ -75,6 +94,46 @@ class _SystemDetails extends State { } } + //关注/取关会员 + _vipFollow(followId,isFollow) async { + BaseData baseData = await apiService.follow(followId); + if (baseData != null && baseData.isSuccess) { + // widget.refresh(); + queryMessage(); + SmartDialog.showToast(isFollow?"取关成功":"关注成功", alignment: Alignment.center); + } else { + SmartDialog.showToast(baseData.msg, alignment: Alignment.center); + } + } + + ///评论 回复 + _reply(messageRelational) { + var messageRelational = jsonDecode(messages[0].relational), + parenId = messageRelational["mid"].toString(); + hintText = S.of(context).huifu_("${messageRelational["nickname"]}"); + } + + ///动态发布评论 + _queryMemberComment(String content) async { + BaseData baseData = await apiService.memberComment({ + "content": content, + "parentId": parenId, + "relationalId": messages[0].mid, + "relationalType":4 + }).catchError((error) {}); + if (baseData != null && baseData.isSuccess) { + // CommentListState state = commentKey.currentState; + // state.queryMemberCommentList(); + commentTextController.text = ""; + FocusScope.of(context).unfocus(); + Navigator.of(context).pop(); + SmartDialog.showToast("发布成功", alignment: Alignment.center); + } + else{ + SmartDialog.showToast("发布失败", alignment: Alignment.center); + } + } + RefreshController _refreshController = RefreshController(); @override @@ -83,13 +142,11 @@ class _SystemDetails extends State { appBar: MyAppBar( background: Colors.white, leadingColor: Colors.black, - // title: "订单通知", - // title: "充值消息", - title: "点赞", + title: (msgType == 2) ?"订单通知":(msgType == 3) ?"充值消息":(msgType == 4) ?"关注":(msgType == 5) ?"点赞":"评论", titleSize: 18.sp, titleColor: Colors.black, ), - body: SmartRefresher( + body:SmartRefresher( enablePullDown: true, enablePullUp: true, header: MyHeader(), @@ -97,7 +154,7 @@ class _SystemDetails extends State { footer: CustomFooter( loadStyle: LoadStyle.ShowWhenLoading, builder: (BuildContext context, LoadStatus mode) { - return MyFooter(mode); + return (messages.length == 0)?Container():MyFooter(mode); }, ), controller: _refreshController, @@ -105,23 +162,29 @@ class _SystemDetails extends State { onLoading: () { queryMessage(); }, - child: Container( - child: SingleChildScrollView( - physics: BouncingScrollPhysics(), - child: Container( - child: Column( - children: [ - orderMessage(), - // rechargeMessage(), - // fabulousMessage(), - // commentMessage(), - // followMessage(), - ], + child: + Container( + child: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: + Container( + child: Column( + children: [ + if(msgType == 2) + orderMessage(), + if(msgType == 3) + rechargeMessage(), + if(msgType == 5) + fabulousMessage(), + if(msgType == 6) + commentMessage(), + if(msgType == 4) + followMessage(), + ], + ), + ), ), ), - ), - ), - ), ); } @@ -410,10 +473,13 @@ class _SystemDetails extends State { itemBuilder: (context, position) { return GestureDetector( onTap: () { - // if (messages[position].typed == 2) { - // Navigator.of(context) - // .pushNamed('/router/exchange_order_details'); - // } + Navigator.of(context).pushNamed( + '/router/community_details', + arguments: { + "businessId":jsonDecode(messages[position].relational)["businessId"].toString(), + "mid":messages[position].mid + }, + ); }, child: fabulousMessageItem(messages[position]), ); @@ -423,26 +489,27 @@ class _SystemDetails extends State { ); } Widget fabulousMessageItem(Message message) { + var messageRelational = jsonDecode(message.relational); return Container( child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Image.asset( - "assets/image/c_z.png", - width: 44.w, - height: 44.h, - ), - // MImage( - // "", - // width: 44, - // height: 44, - // isCircle: true, - // fit: BoxFit.cover, - // errorSrc: "assets/image/default_1.png", - // fadeSrc: "assets/image/default_1.png", + // Image.asset( + // "assets/image/c_z.png", + // width: 44.w, + // height: 44.h, // ), + MImage( + messageRelational["avatar"], + width: 44, + height: 44, + isCircle: true, + fit: BoxFit.cover, + errorSrc: "assets/image/default_1.png", + fadeSrc: "assets/image/default_1.png", + ), SizedBox(width: 8,), Expanded(child:Column( mainAxisAlignment: MainAxisAlignment.start, @@ -451,7 +518,7 @@ class _SystemDetails extends State { Row( children: [ Text( - "张五", + messageRelational["nickname"], style: TextStyle( fontWeight: MyFontWeight.semi_bold, fontSize: 14.sp, @@ -483,30 +550,30 @@ class _SystemDetails extends State { padding:EdgeInsets.all(5), child: Row( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text( - "我的评论:", - style: TextStyle( - fontSize: 12.sp, - height: 1.3, - fontWeight: MyFontWeight.regular, - color: Color(0xFF1A1A1A), - ), - ), - // MImage( - // "", - // width: 38, - // height: 38, - // isCircle: true, - // fit: BoxFit.cover, - // radius: BorderRadius.circular(2), - // errorSrc: "assets/image/default_1.png", - // fadeSrc: "assets/image/default_1.png", + // Text( + // "我的评论:", + // style: TextStyle( + // fontSize: 12.sp, + // height: 1.3, + // fontWeight: MyFontWeight.regular, + // color: Color(0xFF1A1A1A), + // ), // ), + MImage( + messageRelational["nickname"], + width: 38, + height: 38, + isCircle: true, + fit: BoxFit.cover, + radius: BorderRadius.circular(2), + errorSrc: "assets/image/default_1.png", + fadeSrc: "assets/image/default_1.png", + ), SizedBox(width:2.w), Expanded(child:Text( - "文本,是指书面语言的表现形式文本,文本,是指书面语言的表现形式文本。", + messageRelational["content"], maxLines: 2, overflow:TextOverflow.ellipsis, style: TextStyle( @@ -535,61 +602,60 @@ class _SystemDetails extends State { ///评论通知 Widget commentMessage(){ return Container( - color: Colors.white, - width: double.infinity, - padding: EdgeInsets.only(bottom:20.h,left: 20.w,right: 20.w), - child:Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - (messages == null || messages.length == 0) - ? NoDataView( - isShowBtn: false, - text: S.of(context).haimeiyouxiaoxi, - fontSize: 16.sp, - margin: EdgeInsets.only(top: 120.h), + color: Colors.white, + width: double.infinity, + padding: EdgeInsets.only(bottom:20.h,left: 20.w,right: 20.w), + child:Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (messages == null || messages.length == 0) + ? NoDataView( + isShowBtn: false, + text: S.of(context).haimeiyouxiaoxi, + fontSize: 16.sp, + margin: EdgeInsets.only(top: 120.h), + ) + : ListView.builder( + padding: EdgeInsets.only(top: 16), + itemCount: messages.length, + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + Navigator.of(context).pushNamed( + '/router/community_details', + arguments: { + "businessId":jsonDecode(messages[position].relational)["businessId"].toString(), + "mid":messages[position].mid + }, + ); + }, + child: commentMessageItem(messages[position]), + ); + }), + ], ) - : ListView.builder( - padding: EdgeInsets.only(top: 16), - itemCount: messages.length, - shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), - itemBuilder: (context, position) { - return GestureDetector( - onTap: () { - // if (messages[position].typed == 2) { - // Navigator.of(context) - // .pushNamed('/router/exchange_order_details'); - // } - }, - child: commentMessageItem(messages[position]), - ); - }), - ], - ) - ); + ); } Widget commentMessageItem(Message message) { + var messageRelational = jsonDecode(message.relational); return Container( child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Image.asset( - "assets/image/c_z.png", - width: 44.w, - height: 44.h, + MImage( + messageRelational["avatar"], + width: 44, + height: 44, + isCircle: true, + fit: BoxFit.cover, + errorSrc: "assets/image/default_1.png", + fadeSrc: "assets/image/default_1.png", ), - // MImage( - // "", - // width: 44, - // height: 44, - // isCircle: true, - // fit: BoxFit.cover, - // errorSrc: "assets/image/default_1.png", - // fadeSrc: "assets/image/default_1.png", - // ), SizedBox(width: 8,), Expanded(child:Column( mainAxisAlignment: MainAxisAlignment.start, @@ -606,7 +672,7 @@ class _SystemDetails extends State { Row( children: [ Text( - "张五", + messageRelational["nickname"], style: TextStyle( fontWeight: MyFontWeight.semi_bold, fontSize: 14.sp, @@ -633,73 +699,123 @@ class _SystemDetails extends State { ), ], ),), - Container( - height: 21.h, - width: 40.w, - padding:EdgeInsets.only(left:2,right:2), - alignment: Alignment.center, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(11), - border: Border.all( - width: 1, - color: Color(0xFF00A359), - style: BorderStyle.solid, + GestureDetector( + onTap: (){ + setState(() { + showDeleteDialog(); + _reply(messageRelational); + }); + }, + child: Container( + height:22.h, + width: 40.w, + padding:EdgeInsets.only(left:2,right:2), + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(11), + border: Border.all( + width: 1, + color: Color(0xFF00A359), + style: BorderStyle.solid, + ), ), - ), - child: Text( - "回复", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Color(0xFF00A359), + child: Text( + "回复", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF00A359), + ), ), ), - ), + ) ], ), SizedBox(height:8.h,), - Text( - "文本,是指书面语言的表现形式,从文学角度说,通常是具有完整、系统含义(Mess…", - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 12.sp, - height: 1.3, - fontWeight: MyFontWeight.regular, - color: Color(0xFF1A1A1A), - ), - ), - SizedBox(height:12.h,), + // Text( + // messageRelational["content"], + // maxLines: 2, + // overflow: TextOverflow.ellipsis, + // style: TextStyle( + // fontSize: 12.sp, + // height: 1.3, + // fontWeight: MyFontWeight.regular, + // color: Color(0xFF1A1A1A), + // ), + // ), + // SizedBox(height:12.h,), + // Container( + // width: double.infinity, + // color:Color(0xFFF2F2F2), + // padding:EdgeInsets.all(5), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // Text( + // "我的评论:", + // style: TextStyle( + // fontSize: 12.sp, + // height: 1.3, + // fontWeight: MyFontWeight.regular, + // color: Color(0xFF1A1A1A), + // ), + // ), + // // MImage( + // // "", + // // width: 38, + // // height: 38, + // // isCircle: true, + // // fit: BoxFit.cover, + // // radius: BorderRadius.circular(2), + // // errorSrc: "assets/image/default_1.png", + // // fadeSrc: "assets/image/default_1.png", + // // ), + // SizedBox(width:2.w), + // Expanded(child:Text( + // "文本,是指书面语言的表现形式文本,文本,是指书面语言的表现形式文本。", + // maxLines: 2, + // overflow:TextOverflow.ellipsis, + // style: TextStyle( + // fontSize: 12.sp, + // height: 1.3, + // fontWeight: MyFontWeight.regular, + // color: Color(0xFF808080), + // ), + // ),) + // ], + // ), + // ), Container( width: double.infinity, color:Color(0xFFF2F2F2), padding:EdgeInsets.all(5), child: Row( mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text( - "我的评论:", - style: TextStyle( - fontSize: 12.sp, - height: 1.3, - fontWeight: MyFontWeight.regular, - color: Color(0xFF1A1A1A), - ), - ), - // MImage( - // "", - // width: 38, - // height: 38, - // isCircle: true, - // fit: BoxFit.cover, - // radius: BorderRadius.circular(2), - // errorSrc: "assets/image/default_1.png", - // fadeSrc: "assets/image/default_1.png", + // Text( + // "我的评论:", + // style: TextStyle( + // fontSize: 12.sp, + // height: 1.3, + // fontWeight: MyFontWeight.regular, + // color: Color(0xFF1A1A1A), + // ), // ), + MImage( + messageRelational["nickname"], + width: 38, + height: 38, + isCircle: true, + fit: BoxFit.cover, + radius: BorderRadius.circular(2), + errorSrc: "assets/image/default_1.png", + fadeSrc: "assets/image/default_1.png", + ), SizedBox(width:2.w), Expanded(child:Text( - "文本,是指书面语言的表现形式文本,文本,是指书面语言的表现形式文本。", + messageRelational["content"], maxLines: 2, overflow:TextOverflow.ellipsis, style: TextStyle( @@ -763,26 +879,22 @@ class _SystemDetails extends State { ); } Widget followMessageItem(Message message) { + var messageRelational = jsonDecode(message.relational); return Container( child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Image.asset( - "assets/image/c_z.png", - width: 44.w, - height: 44.h, + MImage( + messageRelational["avatar"], + width: 44, + height: 44, + isCircle: true, + fit: BoxFit.cover, + errorSrc: "assets/image/default_1.png", + fadeSrc: "assets/image/default_1.png", ), - // MImage( - // "", - // width: 44, - // height: 44, - // isCircle: true, - // fit: BoxFit.cover, - // errorSrc: "assets/image/default_1.png", - // fadeSrc: "assets/image/default_1.png", - // ), SizedBox(width: 8,), Expanded(child:Column( mainAxisAlignment: MainAxisAlignment.start, @@ -799,7 +911,7 @@ class _SystemDetails extends State { Row( children: [ Text( - "张五", + messageRelational["nickname"], style: TextStyle( fontWeight: MyFontWeight.semi_bold, fontSize: 14.sp, @@ -826,36 +938,74 @@ class _SystemDetails extends State { ), ], ),), - Container( - height: 21.h, - width:56.w, - padding:EdgeInsets.only(left:5,right:5), - alignment: Alignment.center, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(11), - border: Border.all( - width: 1, - color: Color(0xFF00A359), - style: BorderStyle.solid, + GestureDetector( + onTap: (){ + setState(() { + _vipFollow(messageRelational["mid"].toString(),message?.followed ?? false); + }); + }, + child: + RoundButton( + height: 21.h, + width:56.w, + padding: EdgeInsets.all(2), + backgroup: (message?.followed ?? false) + ? Color(0xFFE6E6E6) + : Color(0xFF32A060), + textColor: (message?.followed ?? false) + ? Color(0xFF808080) + : Colors.white, + text: (message?.followed ?? false) ? "已关注" : "回关", + radius:20, + icons: Icon( + (message?.followed ?? false) + ? Icons.check + : Icons.add, + color: (message?.followed?? false) + ? Color(0xFF808080) + : Colors.white, + size: 12, ), - color: Color(0xFF00A359), - ), - child: Row( - children: [ - Icon(Icons.add, - color:Colors.white, - size: 16, - ), - Text( - "回关", - style: TextStyle( - fontSize: 12.sp, - fontWeight: MyFontWeight.medium, - color: Colors.white, - ), - ), - ], - ), + ) + // Container( + // height: 21.h, + // width:56.w, + // padding:EdgeInsets.only(left:5,right:5), + // alignment: Alignment.center, + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(11), + // border: Border.all( + // width: 1, + // color: Color(0xFF00A359), + // style: BorderStyle.solid, + // ), + // color: (message?.followed ?? false) + // ? Color(0xFFE6E6E6) + // : Color(0xFF32A060), + // ), + // child: Row( + // children: [ + // Icon((message?.followed ?? false) + // ? Icons.check + // : Icons.add, + // color:(message?.followed?? false) + // ? Color(0xFF808080) + // : Colors.white, + // size: 16, + // ), + // Text( + // (message?.followed ?? false) ? "已关注" : "回关", + // style: TextStyle( + // fontSize: 12.sp, + // fontWeight: MyFontWeight.medium, + // color:(message?.followed ?? false) + // ? Color(0xFF808080) + // : Colors.white, + // ), + // ), + // ], + // ), + // ) ), ], ), @@ -872,4 +1022,87 @@ class _SystemDetails extends State { ), ); } + + ///动态弹窗 + showDeleteDialog() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + content: Container( + height: 150.h, + // padding: EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 2), + blurRadius: 14, + spreadRadius: 0, + ), + ], + borderRadius: BorderRadius.vertical( + top: Radius.circular(8), + ), + ), + child: Row( + children: [ + Expanded( + flex: 1, + child: Container( + decoration: BoxDecoration( + color: Color(0xffF2F2F2), + borderRadius: BorderRadius.circular(2.0), + ), + child: Container( + margin: EdgeInsets.symmetric(horizontal: 4.w), + alignment: Alignment.topLeft, + child: TextField( + maxLines: 8, + minLines: 1, + focusNode:commentFocus, + controller:commentTextController, + decoration: InputDecoration( + border: InputBorder.none, + hintText:hintText, + hintStyle: TextStyle( + fontSize: 14.sp, + color: Color(0xFF868686), + ), + ), + ), + ), + ), + ), + if (!isKeyBoardShow) + GestureDetector( + onTap: () { + setState(() { + var commentText = commentTextController.text; + if (commentText.trim() == "") { + return; + } + _queryMemberComment(commentText); + }); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: Text( + S.of(context).fasong, + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.bold, + color: Color(0XFF1A1A1A), + ), + ), + ), + ), + ], + ), + ), + ); + }, + ); + } } diff --git a/lib/message/system_message.dart b/lib/message/system_message.dart index bf4967f7..9be81392 100644 --- a/lib/message/system_message.dart +++ b/lib/message/system_message.dart @@ -1,8 +1,10 @@ import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/message.dart'; +import 'package:huixiang/retrofit/data/msg_stats.dart'; import 'package:huixiang/retrofit/data/page.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/utils/font_weight.dart'; @@ -24,6 +26,18 @@ class SystemMessagePage extends StatefulWidget { class _SystemMessagePage extends State { ApiService apiService; + int pageNum = 1; + List messages = []; + List msgStats = []; + Map msgNumber = { + "1":0, + "2":0, + "3":0, + "4":0, + "5":0, + "6":0, + }; + int state = 0; @override void initState() { @@ -33,15 +47,14 @@ class _SystemMessagePage extends State { apiService = ApiService(Dio(), token: value.getString("token"), context: context); queryMessage(); + queryMsgStats(); }); } - int pageNum = 1; - List messages = []; - _refresh() { pageNum = 1; queryMessage(); + queryMsgStats(); } queryMessage() async { @@ -60,7 +73,13 @@ class _SystemMessagePage extends State { if (pageNum == 1) { messages.clear(); } - messages.addAll(baseData.data.list); + List message = []; + message.addAll(baseData.data.list); + message.forEach((element) { + if(element.typed==2 || element.typed==3){ + messages.add(element); + } + }); _refreshController.loadComplete(); _refreshController.refreshCompleted(); if (mounted) setState(() {}); @@ -75,6 +94,32 @@ class _SystemMessagePage extends State { } } + queryMsgStats() async { + if (apiService == null) { + SharedPreferences value = await SharedPreferences.getInstance(); + apiService = ApiService( + Dio(), + context: context, + token: value.getString("token"), + ); + } + BaseData> baseData = await apiService.stats().catchError((onError) {}); + if (baseData != null && baseData.isSuccess) { + setState(() { + msgStats.clear(); + msgStats = baseData.data; + msgStats.forEach((element) { + if(msgNumber.containsKey(element.name)){ + msgNumber[element.name] = element.number; + } + }); + }); + _refreshController.loadComplete(); + _refreshController.refreshCompleted(); + } + EasyLoading.dismiss(); + } + RefreshController _refreshController = RefreshController(); @override @@ -92,6 +137,9 @@ class _SystemMessagePage extends State { alignment: Alignment.centerRight, child: GestureDetector( onTap: () { + setState(() { + queryMsgStats(); + }); }, child: Text( "标为已读", @@ -113,13 +161,15 @@ class _SystemMessagePage extends State { footer: CustomFooter( loadStyle: LoadStyle.ShowWhenLoading, builder: (BuildContext context, LoadStatus mode) { - return MyFooter(mode); + return (messages.length == 0)?Container():MyFooter(mode); }, ), controller: _refreshController, onRefresh: _refresh, onLoading: () { - queryMessage(); + setState(() { + _refresh(); + }); }, child: Container( child: SingleChildScrollView( @@ -146,49 +196,50 @@ class _SystemMessagePage extends State { padding: EdgeInsets.only(top: 16.h,bottom: 16.h), child: Row( children: [ - Expanded(child: Column( - children: [ - Stack( - children: [ - Image.asset( - "assets/image/icon_z.png", - width: 40, - height: 40, - ), - Container( - width:48, - alignment: Alignment.topRight, - child:Container( - width:20, - height:17, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(100), - border: Border.all( - width: 1, - color: Colors.white, - style: BorderStyle.solid, - ), - color:Color(0xFFFF441A), - ), - child:RoundButton( - text: "99+", - textColor: Colors.white, - fontWeight: MyFontWeight.regular, - backgroup: Color(0xFFFF441A), - fontSize:8.sp, - radius: 100, - ) + Expanded(child: GestureDetector( + onTap: (){ + Navigator.of(context) + .pushNamed('/router/system_details',arguments: {"msgType":5}); + }, + child:Column( + children: [ + Stack( + children: [ + Image.asset( + "assets/image/icon_z.png", + width: 40, + height: 40, ), - ) - ], - ), - SizedBox(height: 6.h), - GestureDetector( - onTap: (){ - Navigator.of(context) - .pushNamed('/router/system_details'); - }, - child:Text( + if(msgNumber["5"].toString() != "0") + Container( + width:48, + alignment: Alignment.topRight, + child:Container( + width:20, + height:17, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(100), + border: Border.all( + width: 1, + color: Colors.white, + style: BorderStyle.solid, + ), + color:Color(0xFFFF441A), + ), + child:RoundButton( + text:msgNumber["5"].toString(), + textColor: Colors.white, + fontWeight: MyFontWeight.regular, + backgroup: Color(0xFFFF441A), + fontSize:8.sp, + radius: 100, + ) + ), + ) + ], + ), + SizedBox(height: 6.h), + Text( "点赞", style: TextStyle( fontSize: 14.sp, @@ -196,103 +247,121 @@ class _SystemMessagePage extends State { color: Color(0xFF060606), ), ) - ), - ], - )), - Expanded(child:Column( - children: [ - Stack( - children: [ - Image.asset( - "assets/image/icon_pl.png", - width: 40, - height: 40, - ), - Container( - width:48, - alignment: Alignment.topRight, - child:Container( - width:16, - height:16, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(100), - border: Border.all( - width: 1, - color: Colors.white, - style: BorderStyle.solid, - ), - color:Color(0xFFFF441A), + ], + ) + ) + ), + Expanded(child: + GestureDetector( + onTap: (){ + Navigator.of(context) + .pushNamed('/router/system_details',arguments: {"msgType":6}); + }, + child: Column( + children: [ + Stack( + children: [ + Image.asset( + "assets/image/icon_pl.png", + width: 40, + height: 40, ), - child:RoundButton( - text: "99", - textColor: Colors.white, - fontWeight: MyFontWeight.regular, - backgroup: Color(0xFFFF441A), - fontSize:8.sp, - radius: 100, + if(msgNumber["6"].toString() != "0") + Container( + width:48, + alignment: Alignment.topRight, + child:Container( + width:16, + height:16, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(100), + border: Border.all( + width: 1, + color: Colors.white, + style: BorderStyle.solid, + ), + color:Color(0xFFFF441A), + ), + child:RoundButton( + text: msgNumber["6"].toString(), + textColor: Colors.white, + fontWeight: MyFontWeight.regular, + backgroup: Color(0xFFFF441A), + fontSize:8.sp, + radius: 100, + ) + ), ) + ], ), - ) - ], - ), - SizedBox(height: 6.h), - Text( - S.of(context).pinglun, - style: TextStyle( - fontSize: 14.sp, - fontWeight:MyFontWeight.medium, - color: Color(0xFF060606), - ), - ), - ], - )), - Expanded(child:Column( - children: [ - Stack( - children: [ - Image.asset( - "assets/image/icon_gz.png", - width: 40, - height: 40, - ), - Container( - width:48, - alignment: Alignment.topRight, - child:Container( - width:16, - height:16, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(100), - border: Border.all( - width: 1, - color: Colors.white, - style: BorderStyle.solid, - ), - color:Color(0xFFFF441A), + SizedBox(height: 6.h), + Text( + S.of(context).pinglun, + style: TextStyle( + fontSize: 14.sp, + fontWeight:MyFontWeight.medium, + color: Color(0xFF060606), + ), + ), + ], + ) + )), + Expanded(child: + GestureDetector( + onTap: (){ + Navigator.of(context) + .pushNamed('/router/system_details',arguments: {"msgType":4}); + }, + child:Column( + children: [ + Stack( + children: [ + Image.asset( + "assets/image/icon_gz.png", + width: 40, + height: 40, ), - child:RoundButton( - text: "1", - textColor: Colors.white, - fontWeight: MyFontWeight.regular, - backgroup: Color(0xFFFF441A), - fontSize:8.sp, - radius: 100, + if(msgNumber["4"].toString() != "0") + Container( + width:48, + alignment: Alignment.topRight, + child:Container( + width:16, + height:16, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(100), + border: Border.all( + width: 1, + color: Colors.white, + style: BorderStyle.solid, + ), + color:Color(0xFFFF441A), + ), + child:RoundButton( + text: msgNumber["4"].toString(), + textColor: Colors.white, + fontWeight: MyFontWeight.regular, + backgroup: Color(0xFFFF441A), + fontSize:8.sp, + radius: 100, + ) + ), ) + ], ), - ) - ], - ), - SizedBox(height: 6.h), - Text( - S.of(context).guanzhu, - style: TextStyle( - fontSize: 14.sp, - fontWeight:MyFontWeight.medium, - color: Color(0xFF060606), - ), - ), - ], - )), + SizedBox(height: 6.h), + Text( + S.of(context).guanzhu, + style: TextStyle( + fontSize: 14.sp, + fontWeight:MyFontWeight.medium, + color: Color(0xFF060606), + ), + ), + ], + ) + ) + ), ], ), ); @@ -322,7 +391,7 @@ class _SystemMessagePage extends State { fontSize: 16.sp, margin: EdgeInsets.only(top: 120.h), ) - : ListView.builder( + :ListView.builder( padding: EdgeInsets.only(top: 16), itemCount: messages.length, shrinkWrap: true, @@ -330,12 +399,12 @@ class _SystemMessagePage extends State { itemBuilder: (context, position) { return GestureDetector( onTap: () { - // if (messages[position].typed == 2) { - // Navigator.of(context) - // .pushNamed('/router/exchange_order_details'); - // } + if(messages[position].typed == 2) Navigator.of(context) - .pushNamed('/router/system_details'); + .pushNamed('/router/system_details',arguments: {"msgType":2}); + else if(messages[position].typed == 3) + Navigator.of(context) + .pushNamed('/router/system_details',arguments: {"msgType":3}); }, child: buildMessageItem(messages[position]), ); @@ -423,10 +492,11 @@ class _SystemMessagePage extends State { color: Color(0xFF353535), ), ),), + if(msgNumber["2"].toString() != "0") RoundButton( width: 16, height: 16, - text: "1", + text:msgNumber["2"].toString(), textColor: Colors.white, fontWeight: MyFontWeight.regular, backgroup: Color(0xFFFF441A), @@ -435,12 +505,30 @@ class _SystemMessagePage extends State { ), ], ): - Text( - message.content, - style: TextStyle( - fontSize: 10.sp, - color: Color(0xFF353535), - ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded(child: + Text( + message.content, + style: TextStyle( + fontSize: 10.sp, + color: Color(0xFF353535), + ), + )), + if(msgNumber["3"].toString() != "0") + RoundButton( + width: 16, + height: 16, + text:msgNumber["3"].toString(), + textColor: Colors.white, + fontWeight: MyFontWeight.regular, + backgroup: Color(0xFFFF441A), + fontSize:10.sp, + radius: 100, + ), + ], ), ], )), diff --git a/lib/mine/mine_page.dart b/lib/mine/mine_page.dart index 6a118fd1..b6cdfcde 100644 --- a/lib/mine/mine_page.dart +++ b/lib/mine/mine_page.dart @@ -198,9 +198,6 @@ class _MinePage extends State with AutomaticKeepAliveClientMixin { }, ), - ///关注度/粉丝/发布 - attention(), - ///我的 VIP等级信息 MineVipView( tag: "vip", @@ -214,6 +211,9 @@ class _MinePage extends State with AutomaticKeepAliveClientMixin { ), ), + ///关注度/粉丝/发布 + attention(), + /// 钱包或领券中心 WalletCoupon(), @@ -311,7 +311,20 @@ class _MinePage extends State with AutomaticKeepAliveClientMixin { ///关注度/粉丝/成就数量 Widget attention(){ return Container( - margin: EdgeInsets.only(left: 16,top: 10), + margin: EdgeInsets.only(left: 16,top: 10,right: 16), + padding: EdgeInsets.only(top: 16,bottom: 16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), child:GestureDetector( onTap:(){ Navigator.of(context).pushNamed( @@ -331,23 +344,23 @@ class _MinePage extends State with AutomaticKeepAliveClientMixin { ); }, child: - Row( + Column( children: [ Text( - S.of(context).guanzhu, + infoNumber != null ?infoNumber.follow.toString() :"0", style: TextStyle( color: Color(0xFF000000), - fontSize: 14.sp, - fontWeight: MyFontWeight.regular, + fontSize: 15.sp, + fontWeight: MyFontWeight.medium, ), ), - SizedBox(width: 5,), + SizedBox(height:4,), Text( - infoNumber != null ?infoNumber.follow.toString() :"0", + S.of(context).guanzhu, style: TextStyle( color: Color(0xFF000000), - fontSize: 15.sp, - fontWeight: MyFontWeight.medium, + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, ), ), ], @@ -361,23 +374,23 @@ class _MinePage extends State with AutomaticKeepAliveClientMixin { ); }, child: - Row( + Column( children: [ Text( - S.of(context).fensi, + infoNumber != null ?infoNumber.fans.toString() :"0", style: TextStyle( color: Color(0xFF000000), - fontSize: 14.sp, - fontWeight: MyFontWeight.regular, + fontSize: 15.sp, + fontWeight: MyFontWeight.medium, ), ), - SizedBox(width: 5,), + SizedBox(height:4,), Text( - infoNumber != null ?infoNumber.fans.toString() :"0", + S.of(context).fensi, style: TextStyle( color: Color(0xFF000000), - fontSize: 15.sp, - fontWeight: MyFontWeight.medium, + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, ), ), ], @@ -391,23 +404,23 @@ class _MinePage extends State with AutomaticKeepAliveClientMixin { ); }, child: - Row( + Column( children: [ Text( - "成就", + infoNumber != null ?infoNumber.achievementNumber.toString() :"0", style: TextStyle( color: Color(0xFF000000), - fontSize: 14.sp, - fontWeight: MyFontWeight.regular, + fontSize: 15.sp, + fontWeight: MyFontWeight.medium, ), ), - SizedBox(width: 5,), + SizedBox(height:4,), Text( - infoNumber != null ?infoNumber.achievementNumber.toString() :"0", + "成就", style: TextStyle( color: Color(0xFF000000), - fontSize: 15.sp, - fontWeight: MyFontWeight.medium, + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, ), ), ], diff --git a/lib/mine/mine_view/mine_item.dart b/lib/mine/mine_view/mine_item.dart index 092ca029..450338a0 100644 --- a/lib/mine/mine_view/mine_item.dart +++ b/lib/mine/mine_view/mine_item.dart @@ -17,7 +17,7 @@ class _MineItem extends State { Widget build(BuildContext context) { return Container( margin: EdgeInsets.fromLTRB(16.w, 10.h, 16.w, 28.h), - padding: EdgeInsets.fromLTRB(20.w, 12.h, 20.w, 12.h), + // padding: EdgeInsets.fromLTRB(20.w, 12.h, 20.w, 12.h), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(8), @@ -50,7 +50,7 @@ class _MineItem extends State { // ), // ), Container( - padding: EdgeInsets.symmetric(vertical: 4.h), + padding: EdgeInsets.only(left: 16,top:16,bottom:4), child: Text( S.of(context).wodegongju, style: TextStyle( @@ -60,74 +60,79 @@ class _MineItem extends State { ), ), ), - InkWell( - onTap: () { - SharedPreferences.getInstance().then((value) { - if (value.getString("token") == null || - value.getString("token") == "") { - LoginTipsDialog().show(context); - return; - } - Navigator.of(context) - .pushNamed('/router/releasePage', - arguments: {}); - }); - }, - child: mineItem( - S.of(context).wodedongtai, - "assets/image/dynamic.png", - ), - ), - InkWell( - onTap: () { - SharedPreferences.getInstance().then((value) { - if (value.getString("token") == null || - value.getString("token") == "") { - LoginTipsDialog().show(context); - return; - } - Navigator.of(context) - .pushNamed('/router/exchange_history_page'); - }); - }, - child: mineItem( - S.of(context).duihuanlishi, - "assets/image/icon_mine_records_of_consumption.png", - ), - ), - InkWell( - onTap: () { - SharedPreferences.getInstance().then((value) { - if (value.getString("token") == null || - value.getString("token") == "") { - LoginTipsDialog().show(context); - return; - } - Navigator.of(context).pushNamed('/router/mine_card'); - }); - }, - child: mineItem( - S.of(context).wodekaquan, - "assets/image/icon_mine_card.png", - ), + Row( + children: [ + Expanded(child: InkWell( + onTap: () { + SharedPreferences.getInstance().then((value) { + if (value.getString("token") == null || + value.getString("token") == "") { + LoginTipsDialog().show(context); + return; + } + Navigator.of(context) + .pushNamed('/router/releasePage', + arguments: {}); + }); + }, + child: mineItem( + S.of(context).wodedongtai, + "assets/image/dynamic.png", + ), + ),), + Expanded(child: InkWell( + onTap: () { + SharedPreferences.getInstance().then((value) { + if (value.getString("token") == null || + value.getString("token") == "") { + LoginTipsDialog().show(context); + return; + } + Navigator.of(context) + .pushNamed('/router/exchange_history_page'); + }); + }, + child: mineItem( + S.of(context).duihuanlishi, + "assets/image/icon_mine_records_of_consumption.png", + ), + ),), + Expanded(child: InkWell( + onTap: () { + SharedPreferences.getInstance().then((value) { + if (value.getString("token") == null || + value.getString("token") == "") { + LoginTipsDialog().show(context); + return; + } + Navigator.of(context).pushNamed('/router/mine_card'); + }); + }, + child: mineItem( + S.of(context).wodekaquan, + "assets/image/icon_mine_card.png", + ), + ),), + Expanded(child: InkWell( + onTap: () { + SharedPreferences.getInstance().then((value) { + if (value.getString("token") == null || + value.getString("token") == "") { + LoginTipsDialog().show(context); + return; + } + Navigator.of(context).pushNamed('/router/manage_address_page'); + }); + }, + child: mineItem( + S.of(context).guanlidizhi, + "assets/image/icon_location_address.png", + ), + ),) + ], ), - InkWell( - onTap: () { - SharedPreferences.getInstance().then((value) { - if (value.getString("token") == null || - value.getString("token") == "") { - LoginTipsDialog().show(context); - return; - } - Navigator.of(context).pushNamed('/router/manage_address_page'); - }); - }, - child: mineItem( - S.of(context).guanlidizhi, - "assets/image/icon_location_address.png", - ), - ), - InkWell( + Padding(padding:EdgeInsets.only(left:24), + child: InkWell( onTap: () { Navigator.of(context).pushNamed('/router/qr_share', arguments: {}); }, @@ -135,7 +140,8 @@ class _MineItem extends State { S.of(context).tuiguangma, "assets/image/icon_mine_promotion_code.png", ), - ), + ),) + // mineItem( // S.of(context).bangzhuyufankui, // "assets/image/icon_mine_feedback.png", @@ -150,34 +156,31 @@ class _MineItem extends State { return Container( color: Colors.white, margin: EdgeInsets.symmetric(vertical: 6.h), - child: Row( + child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Image.asset( icon, - width: 28.w, - height: 28.h, + width: 32.w, + height: 32.w, ), SizedBox( - width: 8.w, + height: 2.h, ), - Expanded( - flex: 1, - child: Text( - text, - style: TextStyle( - fontWeight: MyFontWeight.medium, - fontSize: 16.sp, - color: Color(0xFF353535), - ), + Text( + text, + style: TextStyle( + fontWeight: MyFontWeight.medium, + fontSize: 12.sp, + color: Color(0xFF353535), ), ), - Icon( - Icons.keyboard_arrow_right, - size: 20, - color: Colors.black, - ) + // Icon( + // Icons.keyboard_arrow_right, + // size: 20, + // color: Colors.black, + // ) ], ), ); diff --git a/lib/mine/mine_view/mine_view.dart b/lib/mine/mine_view/mine_view.dart index 44baa223..9650f6d0 100644 --- a/lib/mine/mine_view/mine_view.dart +++ b/lib/mine/mine_view/mine_view.dart @@ -42,8 +42,8 @@ class _MineView extends State { padding: EdgeInsets.all(8.h), child: Image.asset( "assets/image/icon_scan_qr_code.png", - width: 24.w, - height: 24.h, + width:32.w, + height: 32.h, ), ), ), @@ -56,8 +56,8 @@ class _MineView extends State { margin: EdgeInsets.only(right: 12.w), child: Image.asset( "assets/image/icon_mine_setting.png", - width: 24.w, - height: 24.h, + width: 32.w, + height: 32.h, ), ), ), diff --git a/lib/mine/mine_wallet_page.dart b/lib/mine/mine_wallet_page.dart index 1a3eb244..faf730b8 100644 --- a/lib/mine/mine_wallet_page.dart +++ b/lib/mine/mine_wallet_page.dart @@ -12,6 +12,7 @@ import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/view_widget/classic_header.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:huixiang/view_widget/my_footer.dart'; +import 'package:huixiang/view_widget/no_data_view.dart'; import 'package:huixiang/view_widget/round_button.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; @@ -57,7 +58,8 @@ class _MineWalletPage extends State { } queryUserBalance() async { - BaseData baseData = await apiService.queryInfo().catchError((onError) {}); + BaseData baseData = + await apiService.queryInfo().catchError((onError) {}); if (baseData != null && baseData.isSuccess) { userInfo = baseData.data; mBalance = double.tryParse(userInfo.money); @@ -168,14 +170,21 @@ class _MineWalletPage extends State { ), Container( margin: EdgeInsets.only(top: 14.h), - child: ListView.builder( - itemCount: userBills != null ? userBills.length : 0, - shrinkWrap: true, - padding: EdgeInsets.only(bottom: 20.h), - physics: NeverScrollableScrollPhysics(), - itemBuilder: (context, position) { - return historyItem(userBills[position], position); - }), + child: (userBills == null || userBills.length == 0) + ? NoDataView( + isShowBtn: false, + text: "目前暂未记录哦", + fontSize: 16.sp, + margin: EdgeInsets.only(top: 120.h), + ) + : ListView.builder( + itemCount: userBills != null ? userBills.length : 0, + shrinkWrap: true, + padding: EdgeInsets.only(bottom: 20.h), + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, position) { + return historyItem(userBills[position], position); + }), ), ], ), @@ -200,7 +209,7 @@ class _MineWalletPage extends State { Expanded( flex: 1, child: Container( - height: 34.h, + // height: 34.h, child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/mine/release_page.dart b/lib/mine/release_page.dart index f4191078..7a52ff00 100644 --- a/lib/mine/release_page.dart +++ b/lib/mine/release_page.dart @@ -1,8 +1,11 @@ +import 'dart:convert'; + import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:huixiang/community/community_view/community_dynamic.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:huixiang/retrofit/data/article.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/comunity_comment.dart'; import 'package:huixiang/retrofit/data/page.dart'; @@ -26,7 +29,7 @@ class _ReleasePage extends State { int pageNum = 0; String userId; - List comments = []; + List
articles = []; @override void initState() { @@ -66,10 +69,24 @@ class _ReleasePage extends State { refreshController.loadComplete(); if (baseData.isSuccess) { if (pageNum == 1) { - comments.clear(); + articles.clear(); } - comments.addAll(baseData.data.list); - print("comments: ${comments.length}"); + baseData.data.list.forEach((element) { + var article = Article(); + article.id = element.id; + article.content = jsonEncode(element.subjectInfo); + article.mainTitle =element.subject; + article.liked = element.selfFollow; + article.authorHeadImg = element.memberInfo?.avatar; + article.authorName = element.memberInfo?.nickname; + article.createTime = element.createTime; + article.updateUser = element.memberInfo?.mid; + article.viewers = element?.viewers; + article.likes = element?.likes; + article.comments = element?.comments; + articles.add(article); + }); + // print("comments: ${comments.length}"); if (int.tryParse(baseData.data.total) < (pageNum * 10)) { refreshController.loadNoData(); } @@ -109,8 +126,9 @@ class _ReleasePage extends State { itemBuilder: (context, position) { return InkWell( child: CommunityDynamic( - comments[position], - 1,exitFull: (){setState(() { + articles[position], + 1, + exitFull: (){setState(() { _onRefresh(); });}, removalDynamic: () { @@ -121,13 +139,13 @@ class _ReleasePage extends State { Navigator.of(context).pushNamed( '/router/community_details', arguments: { - "comment": comments[position],"userId":userId, + "businessId": articles[position].id,"userId":userId, }, ); }, ); }, - itemCount: comments.length, + itemCount: articles.length, )), ); }, diff --git a/lib/order/order_view/order_commodity.dart b/lib/order/order_view/order_commodity.dart index 1856edec..8ceae95e 100644 --- a/lib/order/order_view/order_commodity.dart +++ b/lib/order/order_view/order_commodity.dart @@ -169,7 +169,7 @@ class _OrderCommodity extends State { margin: EdgeInsets.only( left: 16.w, ), - height: 44.h, + // height: 44.h, child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/retrofit/data/article.dart b/lib/retrofit/data/article.dart index 72a130e3..5af314d9 100644 --- a/lib/retrofit/data/article.dart +++ b/lib/retrofit/data/article.dart @@ -14,7 +14,7 @@ class Article { dynamic _viceTitle; String _content; String _coverImg; - Author _author; + dynamic _author; int _type; String _startTime; String _categoryId; @@ -26,6 +26,8 @@ class Article { bool _liked; int _viewers; int _comments; + String _authorName; + String _authorHeadImg; bool isFollow; dynamic _storeName; @@ -39,7 +41,7 @@ class Article { dynamic get viceTitle => _viceTitle; String get content => _content; String get coverImg => _coverImg; - Author get author => _author; + dynamic get author => _author; int get type => _type; String get startTime => _startTime; String get categoryId => _categoryId; @@ -51,8 +53,14 @@ class Article { bool get liked => _liked; int get viewers => _viewers; int get comments => _comments; + String get authorName => _authorName; + String get authorHeadImg => _authorHeadImg; dynamic get storeName => _storeName; + set id(String value) { + _id = value; + } + set likes(int value) { _likes = value; } @@ -69,27 +77,38 @@ class Article { _comments = value; } + set authorName(String value) { + _authorName = value; + } + + set authorHeadImg(String value) { + _authorHeadImg = value; + } + Article({ - String id, - String createTime, - dynamic createUser, - String updateTime, - dynamic updateUser, - String storeId, - String mainTitle, - dynamic viceTitle, - String content, + String id, + String createTime, + dynamic createUser, + String updateTime, + dynamic updateUser, + String storeId, + String mainTitle, + dynamic viceTitle, + String content, String coverImg, Author author, - int type, - String startTime, - String endTime, - int state, - int isDelete, + int type, + String startTime, + String endTime, + int state, + int isDelete, int likes, bool isHot, int viewers, int comments, + String authorName, + String authorHeadImg, + dynamic storeName}){ _id = id; _createTime = createTime; @@ -113,6 +132,8 @@ class Article { _liked = liked; _viewers = viewers; _comments = comments; + _authorName = authorName; + _authorHeadImg = authorHeadImg; _storeName = storeName; } @@ -127,7 +148,7 @@ class Article { _viceTitle = json["viceTitle"]; _content = json["content"]; _coverImg = json["coverImg"]; - _author = json["author"] == null ? null : Author.fromJson(jsonDecode(json["author"])); + _author = json["author"] == null ? null : json["author"].toString().startsWith("{") ? Author.fromJson(jsonDecode(json["author"])):null; _type = json["type"]; _startTime = json["startTime"]; _categoryId = json["categoryId"]; @@ -139,6 +160,8 @@ class Article { _liked = json["liked"]; _viewers = json["viewers"]; _comments = json["comments"]; + _authorName = json["authorName"]; + _authorHeadImg = json["authorHeadImg"]; _storeName = json["storeName"]; } @@ -166,8 +189,81 @@ class Article { map["liked"] = _liked; map["viewers"] = _viewers; map["comments"] = _comments; + map["authorName"] = _authorName; + map["authorHeadImg"] = _authorHeadImg; map["storeName"] = _storeName; return map; } + set createTime(String value) { + _createTime = value; + } + + set createUser(dynamic value) { + _createUser = value; + } + + set updateTime(String value) { + _updateTime = value; + } + + set updateUser(dynamic value) { + _updateUser = value; + } + + set storeId(String value) { + _storeId = value; + } + + set mainTitle(String value) { + _mainTitle = value; + } + + set viceTitle(dynamic value) { + _viceTitle = value; + } + + set content(String value) { + _content = value; + } + + set coverImg(String value) { + _coverImg = value; + } + + set author(dynamic value) { + _author = value; + } + + set type(int value) { + _type = value; + } + + set startTime(String value) { + _startTime = value; + } + + set categoryId(String value) { + _categoryId = value; + } + + set endTime(String value) { + _endTime = value; + } + + set state(int value) { + _state = value; + } + + set isDelete(int value) { + _isDelete = value; + } + + set isHot(bool value) { + _isHot = value; + } + + set storeName(dynamic value) { + _storeName = value; + } } \ No newline at end of file diff --git a/lib/retrofit/data/message.dart b/lib/retrofit/data/message.dart index cc9a30d3..395b2bea 100644 --- a/lib/retrofit/data/message.dart +++ b/lib/retrofit/data/message.dart @@ -1,44 +1,18 @@ -/// id : "1420215467561189376" -/// createTime : "2021-07-28 10:58:26" +/// id : "1483062749750624256" +/// createTime : "2022-01-17 21:04:48" /// createUser : "0" -/// updateTime : "2021-07-28 10:58:29" +/// updateTime : "2022-01-17 21:04:48" /// updateUser : "0" -/// mid : "1406879717390286848" -/// title : "充值成功" -/// content : "你于2021-07-28 10:52:02充值0.01元,当前余额:0.08元。" -/// typed : 3 -/// relational : "" -/// state : 1 +/// mid : "1478548672881885184" +/// title : "粉丝关注" +/// content : "哈哈哈关注了你!" +/// typed : 4 +/// relational : "{\"businessId\":1483062749356359680,\"mid\":1379254113602109440,\"avatar\":\"https://pos.upload.gznl.top/admin/2021/08/1f8d55ed-85d2-42a2-b155-6737a66226e8.jpg\",\"typed\":\"MEMBER\",\"nickname\":\"哈哈哈\",\"action\":\"FOLLOW\",\"receiveMid\":1478548672881885184}" +/// state : 0 /// isDelete : 0 +/// followed : false class Message { - - String _id; - String _createTime; - String _createUser; - String _updateTime; - String _updateUser; - String _mid; - String _title; - String _content; - int _typed; - String _relational; - int _state; - int _isDelete; - - String get id => _id; - String get createTime => _createTime; - String get createUser => _createUser; - String get updateTime => _updateTime; - String get updateUser => _updateUser; - String get mid => _mid; - String get title => _title; - String get content => _content; - int get typed => _typed; - String get relational => _relational; - int get state => _state; - int get isDelete => _isDelete; - Message({ String id, String createTime, @@ -51,7 +25,8 @@ class Message { int typed, String relational, int state, - int isDelete}){ + int isDelete, + bool followed,}){ _id = id; _createTime = createTime; _createUser = createUser; @@ -64,37 +39,67 @@ class Message { _relational = relational; _state = state; _isDelete = isDelete; + _followed = followed; } Message.fromJson(dynamic json) { - _id = json["id"]; - _createTime = json["createTime"]; - _createUser = json["createUser"]; - _updateTime = json["updateTime"]; - _updateUser = json["updateUser"]; - _mid = json["mid"]; - _title = json["title"]; - _content = json["content"]; - _typed = json["typed"]; - _relational = json["relational"]; - _state = json["state"]; - _isDelete = json["isDelete"]; + _id = json['id']; + _createTime = json['createTime']; + _createUser = json['createUser']; + _updateTime = json['updateTime']; + _updateUser = json['updateUser']; + _mid = json['mid']; + _title = json['title']; + _content = json['content']; + _typed = json['typed']; + _relational = json['relational']; + _state = json['state']; + _isDelete = json['isDelete']; + _followed = json['followed']; } + String _id; + String _createTime; + String _createUser; + String _updateTime; + String _updateUser; + String _mid; + String _title; + String _content; + int _typed; + String _relational; + int _state; + int _isDelete; + bool _followed; + + String get id => _id; + String get createTime => _createTime; + String get createUser => _createUser; + String get updateTime => _updateTime; + String get updateUser => _updateUser; + String get mid => _mid; + String get title => _title; + String get content => _content; + int get typed => _typed; + String get relational => _relational; + int get state => _state; + int get isDelete => _isDelete; + bool get followed => _followed; Map toJson() { - var map = {}; - map["id"] = _id; - map["createTime"] = _createTime; - map["createUser"] = _createUser; - map["updateTime"] = _updateTime; - map["updateUser"] = _updateUser; - map["mid"] = _mid; - map["title"] = _title; - map["content"] = _content; - map["typed"] = _typed; - map["relational"] = _relational; - map["state"] = _state; - map["isDelete"] = _isDelete; + final map = {}; + map['id'] = _id; + map['createTime'] = _createTime; + map['createUser'] = _createUser; + map['updateTime'] = _updateTime; + map['updateUser'] = _updateUser; + map['mid'] = _mid; + map['title'] = _title; + map['content'] = _content; + map['typed'] = _typed; + map['relational'] = _relational; + map['state'] = _state; + map['isDelete'] = _isDelete; + map['followed'] = _followed; return map; } diff --git a/lib/retrofit/data/msg_stats.dart b/lib/retrofit/data/msg_stats.dart new file mode 100644 index 00000000..cb3f4d17 --- /dev/null +++ b/lib/retrofit/data/msg_stats.dart @@ -0,0 +1,29 @@ +/// name : "4" +/// number : 8 + +class MsgStats { + MsgStats({ + String name, + int number,}){ + _name = name; + _number = number; +} + + MsgStats.fromJson(dynamic json) { + _name = json['name']; + _number = json['number']; + } + String _name; + int _number; + + String get name => _name; + int get number => _number; + + Map toJson() { + final map = {}; + map['name'] = _name; + map['number'] = _number; + return map; + } + +} \ No newline at end of file diff --git a/lib/retrofit/retrofit_api.dart b/lib/retrofit/retrofit_api.dart index c62ed445..24fa7fba 100644 --- a/lib/retrofit/retrofit_api.dart +++ b/lib/retrofit/retrofit_api.dart @@ -36,6 +36,7 @@ import 'data/headlines_list_details.dart'; import 'data/logistics.dart'; import 'data/member_comment_list.dart'; import 'data/message.dart'; +import 'data/msg_stats.dart'; import 'data/page.dart'; import 'data/rank.dart'; import 'data/second_card_list.dart'; @@ -53,8 +54,8 @@ import 'data/wx_pay.dart'; part 'retrofit_api.g.dart'; -// const base_url = "https://pos.platform.lotus-wallet.com/app/"; ///正式 -// const baseUrl = "https://pos.platform.lotus-wallet.com/app/"; ///正式 +const base_url = "https://pos.platform.lotus-wallet.com/app/"; ///正式 +const baseUrl = "https://pos.platform.lotus-wallet.com/app/"; ///正式 // const base_url = "http://platform.prod.kunqi.lotus-wallet.com/app/"; ///222 // const baseUrl = "http://platform.prod.kunqi.lotus-wallet.com/app/"; ///222 @@ -62,12 +63,15 @@ part 'retrofit_api.g.dart'; // const base_url = "http://192.168.10.236:8766/app/"; ///费韬 // const baseUrl = "http://192.168.10.236:8766/app/"; ///费韬 +// const base_url = "http://192.168.10.159:8766/app/"; ///费韬 +// const baseUrl = "http://192.168.10.159:8766/app/"; ///费韬 + // const base_url = "http://192.168.10.37:8766/app/"; // const baseUrl = "http://192.168.10.37:8766/app/"; -const base_url = "http://192.168.10.142:8766/app/";///詹云久 -const baseUrl = "http://192.168.10.142:8766/app/";///詹云久 +// const base_url = "http://192.168.10.142:8766/app/";///詹云久 +// const baseUrl = "http://192.168.10.142:8766/app/";///詹云久 @RestApi(baseUrl: baseUrl) abstract class ApiService { @@ -345,6 +349,10 @@ abstract class ApiService { @GET("/app-msg/{id}") Future queryMsg(@Path("id") String id); + ///App消息 统计各类消息数量 + @GET("/app-msg/stats") + Future>> stats(); + ///给文章/活动点赞 @GET("/information/likes/{id}") Future informationLikes(@Path("id") String id); @@ -396,7 +404,6 @@ abstract class ApiService { @POST("/member/follow/list") Future>> followList(@Body() Map map); - ///关注/取关会员 @PUT("/member/follow/{followId}") Future follow(@Path("followId") String followId); diff --git a/lib/retrofit/retrofit_api.g.dart b/lib/retrofit/retrofit_api.g.dart index 1e3aebc3..5735110a 100644 --- a/lib/retrofit/retrofit_api.g.dart +++ b/lib/retrofit/retrofit_api.g.dart @@ -9,7 +9,7 @@ part of 'retrofit_api.dart'; class _ApiService implements ApiService { _ApiService(this._dio, {this.baseUrl}) { ArgumentError.checkNotNull(_dio, '_dio'); - baseUrl ??= 'http://192.168.10.142:8766/app/'; + baseUrl ??= 'https://pos.platform.lotus-wallet.com/app/'; } final Dio _dio; @@ -1032,6 +1032,28 @@ class _ApiService implements ApiService { return value; } + @override + Future>> stats() async { + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>( + '/app-msg/stats', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData>.fromJson( + _result.data, + (json) => (json as List) + .map((i) => MsgStats.fromJson(i as Map)) + .toList()); + return value; + } + @override Future> informationLikes(id) async { ArgumentError.checkNotNull(id, 'id'); diff --git a/lib/settlement/settlement_view/settlement_order_commodity.dart b/lib/settlement/settlement_view/settlement_order_commodity.dart index 4b7e12c1..67529d5b 100644 --- a/lib/settlement/settlement_view/settlement_order_commodity.dart +++ b/lib/settlement/settlement_view/settlement_order_commodity.dart @@ -134,7 +134,7 @@ class _SettlementOrderCommodity extends State { margin: EdgeInsets.only( left: 16.w, ), - height: 44.h, + // height: 44.h, child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/store/store_order.dart b/lib/store/store_order.dart index 2e9a186c..42bae5f3 100644 --- a/lib/store/store_order.dart +++ b/lib/store/store_order.dart @@ -313,7 +313,7 @@ class _StoreOrderPage extends State ], ), ), - top: 110.h, + top: 100.h, bottom: 0, left: 0, right: 0, diff --git a/lib/store/store_view/store_info.dart b/lib/store/store_view/store_info.dart index e7cd4870..cf0e46be 100644 --- a/lib/store/store_view/store_info.dart +++ b/lib/store/store_view/store_info.dart @@ -30,7 +30,7 @@ class _StoreInfoView extends State { top: 5.h, bottom: 6.h, ), - height: 138.h, + height: 140.h, padding: EdgeInsets.all(12.w), decoration: BoxDecoration( color: Colors.white, diff --git a/lib/view_widget/item_input_widget.dart b/lib/view_widget/item_input_widget.dart index c79ba14f..a5e15006 100644 --- a/lib/view_widget/item_input_widget.dart +++ b/lib/view_widget/item_input_widget.dart @@ -147,7 +147,8 @@ class ItemInputWidget extends StatelessWidget { margin: EdgeInsets.only(left: 5, bottom: 12.h), ), Container( - height: 0.035.sh, + // height: 0.035.sh, + margin: EdgeInsets.only(bottom:10.h), child: TextField( controller: controller, style: style, diff --git a/lib/view_widget/request_permission.dart b/lib/view_widget/request_permission.dart index 9558dd43..e02beb4d 100644 --- a/lib/view_widget/request_permission.dart +++ b/lib/view_widget/request_permission.dart @@ -37,7 +37,9 @@ class _RequestPermission extends State { type: MaterialType.transparency, child: Center( child: Container( - width: widget.width ?? 0.7867.sw, + // width: widget.width ?? 0.7867.sw, + width: double.infinity, + margin: EdgeInsets.symmetric(horizontal: 24.w), padding: EdgeInsets.symmetric(vertical: 20.h, horizontal: 24.w), decoration: BoxDecoration( color: Colors.white, @@ -50,8 +52,8 @@ class _RequestPermission extends State { children: [ Image.asset( widget.src, - width: 0.7867.sw * 0.6, - height: 0.7867.sw * 0.6 * 0.7, + // width: 0.7867.sw * 0.6, + // height: 0.7867.sw * 0.6 * 0.7, fit: BoxFit.fill, ), SizedBox(