From 4b5a0fd71cd59a20a53c46a1c8079e5996de24c4 Mon Sep 17 00:00:00 2001 From: w-R <953969641@qq.com> Date: Fri, 15 Oct 2021 18:56:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/image/2x/closed_bill.png | Bin 0 -> 1937 bytes assets/image/2x/distribution.png | Bin 0 -> 3749 bytes assets/image/2x/service.png | Bin 0 -> 3221 bytes assets/image/3x/closed_bill.png | Bin 0 -> 3374 bytes assets/image/3x/distribution.png | Bin 0 -> 6727 bytes assets/image/3x/service.png | Bin 0 -> 6064 bytes assets/image/closed_bill.png | Bin 0 -> 857 bytes assets/image/distribution.png | Bin 0 -> 1755 bytes assets/image/service.png | Bin 0 -> 1451 bytes lib/main.dart | 8 + lib/mine/fans_page.dart | 144 +++++++++ lib/mine/follow_page.dart | 144 +++++++++ lib/mine/mine_page.dart | 85 +++++ lib/mine/mine_view/community_follow.dart | 65 ++++ lib/mine/release_page.dart | 226 +++++++++++++ lib/order/order_view/order_status.dart | 8 +- lib/retrofit/min_api.g.dart | 111 +++++++ lib/store/store_order.dart | 6 +- lib/store/store_view/settlement.dart | 386 +++++++++++++++++++++-- lib/store/store_view/store_activity.dart | 3 +- 20 files changed, 1160 insertions(+), 26 deletions(-) create mode 100644 assets/image/2x/closed_bill.png create mode 100644 assets/image/2x/distribution.png create mode 100644 assets/image/2x/service.png create mode 100644 assets/image/3x/closed_bill.png create mode 100644 assets/image/3x/distribution.png create mode 100644 assets/image/3x/service.png create mode 100644 assets/image/closed_bill.png create mode 100644 assets/image/distribution.png create mode 100644 assets/image/service.png create mode 100644 lib/mine/fans_page.dart create mode 100644 lib/mine/follow_page.dart create mode 100644 lib/mine/mine_view/community_follow.dart create mode 100644 lib/mine/release_page.dart create mode 100644 lib/retrofit/min_api.g.dart diff --git a/assets/image/2x/closed_bill.png b/assets/image/2x/closed_bill.png new file mode 100644 index 0000000000000000000000000000000000000000..4279900029c82623f19c83da430ff9ae5082afe1 GIT binary patch literal 1937 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 E4*{0p>Hq)$ literal 0 HcmV?d00001 diff --git a/assets/image/3x/closed_bill.png b/assets/image/3x/closed_bill.png new file mode 100644 index 0000000000000000000000000000000000000000..6601bbb161bd3e0122bb899194e897d972d39a80 GIT binary patch literal 3374 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 literal 0 HcmV?d00001 diff --git a/assets/image/3x/distribution.png b/assets/image/3x/distribution.png new file mode 100644 index 0000000000000000000000000000000000000000..f90a99b99964ca59584a42e5c4fe2172a3b6acf1 GIT binary patch literal 6727 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 literal 0 HcmV?d00001 diff --git a/assets/image/3x/service.png b/assets/image/3x/service.png new file mode 100644 index 0000000000000000000000000000000000000000..b977862f9619bd3f51428cd5be58a2a56566b5b4 GIT binary patch literal 6064 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 literal 0 HcmV?d00001 diff --git a/assets/image/service.png b/assets/image/service.png new file mode 100644 index 0000000000000000000000000000000000000000..44d9b7cf1e1a5a8547127c93231be899a8e80da9 GIT binary patch literal 1451 zcmV;c1yuTpP)Px)Wl2OqRCr$PnrW<^Qxt}u*E|$8izpTRK%-JaQc@zuC^b|FNzIfPl9JMzLn$Fb zlS=qY(*7|QArg|3niA3=5=5m!{4gZuamjn_)0}&9&-wQEopXE6z5P~lf8D*;x7U-k z*M9ffN7Ob%KsAT|3Dh7`Ce$Em5W|Z?oe_0L)EP12L0NB&4P|RY#E!rM;0#Iow$n}H zHX|Zp8(0=N=b2<+Sx`2CV@822C|ViVvZ;8tML2m#NM^!&I5 z5fR?r=KyyC`?U%5UuTD;@5d#Gh?oi74NNV#Jbol;N~bYnvRFpM(ZD@G+v3*}^rMol z7&jmy;!t1_aAL{!!5m3XjCl|du|IGZaAw8U!DLBaj#&^9F&VfWm;-EFG7B2R*Gk&6 zXzoDPh=|w~xEZ({*t{r+g8wg*bY78H<~dt- zlH|R2Qr=f4osBvN6z?B0}&AiCpmm_MK#!1|C@mKxwnF^(YeBErKF>BAb3pAK}3YF z!oCup4Q!OVkT&C90?q=g4Btwfrd*ecCHXYUvYvs6h&|FNa3SC(Nw>Bv)q)AY+Z}oh z?Y=Wpl66LwbqyjS+zxYF%0Ivd;;8pBgNz2PjECdk|-lsml?*R5G z<2-ZhZ$4optw@<*$^A}CD?ZcJx?z(feN|>s4hUE5!^=1=G1kS*ZT6K3f=>wRhJ#A@ zXdSvn(%xm~=YTjaWyGu=*Mx7a7A1X9Qf$19Uf@UagsFo?7AG!-I>FXv4 zR-rC#mDbY&??6c(mj&AOhtt*C_W(;_L)ojtA}o`w_}0BRMZ`3~HKJ34B{#0`(up6&)Eo61)OtA`` zFUftz1_XDfU(0N;cu*K zO^q0<)Y8_A1(g11%l2`7@V-7Ba2Lx`zKXpr$;W#o>pO@RC=-3EBq(mpS!w3lB1!&{ zNG0nVh=}lB{t0*nc((O!kbVMmY=Uws;Ag;2W|jJKB?>*-o0YyD5muLtHw~Zr?*UH( zOPY^ZJ5LusYZY%F|F!-)?r&fRNd{ZV`k4{UAR3EzKnFWYi)`;w|Y z6AXQ7&_FyW$z88(OTE$wl0M0vG{V3^0H+_Abbg%B56(EC=5ukTp;PbenJ?8Q^SREnxsnigI>bx=hj%2uI5?K_Pq>xBwu|4 zG1`HZ^WmoiK&iJzy)}j>#(&8!X;RmHWE21Z002ovPDHLk FV1oC8rp^EW literal 0 HcmV?d00001 diff --git a/lib/main.dart b/lib/main.dart index d7ff1d43..fce7add2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -72,7 +72,11 @@ import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart'; import 'home/guide_page.dart'; import 'main_page.dart'; +import 'mine/fans_page.dart'; +import 'mine/follow_page.dart'; import 'mine/manage_address_page.dart'; +import 'mine/mine_view/community_follow.dart'; +import 'mine/release_page.dart'; import 'mine/roll_center_page.dart'; void main() async { @@ -267,4 +271,8 @@ Map routers = { '/router/main_page': (context, {arguments}) => MainPage(), '/router/test_page': (context, {arguments}) => TestPage(), // '/router/ui_test': (context, {arguments}) => UITest(), + '/router/communityFollow': (context, {arguments}) => CommunityFollow(), + '/router/followPage': (context, {arguments}) => FollowPage(), + '/router/fansPage': (context, {arguments}) => FansPage(), + '/router/releasePage': (context, {arguments}) => ReleasePage(), }; diff --git a/lib/mine/fans_page.dart b/lib/mine/fans_page.dart new file mode 100644 index 00000000..72362b2a --- /dev/null +++ b/lib/mine/fans_page.dart @@ -0,0 +1,144 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/cupertino.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/vip_card.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_footer.dart'; +import 'package:huixiang/view_widget/no_data_view.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 FansPage extends StatefulWidget { + @override + State createState() { + return _FansPage(); + } +} + +class _FansPage extends State { + RefreshController _refreshController; + + ApiService apiService; + + @override + void initState() { + super.initState(); + _refreshController = RefreshController(); + + SharedPreferences.getInstance().then((value) { + apiService = + ApiService(Dio(), context: context, token: value.getString("token")); + + }); + } + + + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + child: SmartRefresher( + enablePullDown: true, + enablePullUp: false, + header: MyHeader(), + footer: CustomFooter( + builder: (context, mode) { + return MyFooter(mode); + }, + ), + controller: _refreshController, + // onRefresh: , + physics: BouncingScrollPhysics(), + child: ListView.builder( + padding: EdgeInsets.symmetric(vertical: 8.h), + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + + }, + child: fansItem(), + ); + }, + itemCount:5, + ) + // NoDataView( + // isShowBtn: false, + // text: "共关注0人", + // fontSize: 16.sp, + // margin: EdgeInsets.only(top: 120.h), + // ), + ), + ), + ); + } + + + Widget fansItem() { + return Container( + margin: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h), + child:Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment:CrossAxisAlignment.center, + children: [ + MImage( + "assets/image/default_1.png", + 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:Text( + "百花谷", + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + ), + )), + Container( + width: 56.w, + height: 21.h, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(11.w), + color: Color(0xFF32A060), + ), + child:Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment:CrossAxisAlignment.center, + children: [ + Icon( + Icons.add, + color: Colors.white, + size: 14, + ), + SizedBox( + width:4, + ), + Text( + "关注", + style: TextStyle( + color: Colors.white, + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + ), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/mine/follow_page.dart b/lib/mine/follow_page.dart new file mode 100644 index 00000000..633d8309 --- /dev/null +++ b/lib/mine/follow_page.dart @@ -0,0 +1,144 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/cupertino.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/vip_card.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_footer.dart'; +import 'package:huixiang/view_widget/no_data_view.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 FollowPage extends StatefulWidget { + @override + State createState() { + return _FollowPage(); + } +} + +class _FollowPage extends State { + RefreshController _refreshController; + + ApiService apiService; + + @override + void initState() { + super.initState(); + _refreshController = RefreshController(); + + SharedPreferences.getInstance().then((value) { + apiService = + ApiService(Dio(), context: context, token: value.getString("token")); + + }); + } + + + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + child: SmartRefresher( + enablePullDown: true, + enablePullUp: false, + header: MyHeader(), + footer: CustomFooter( + builder: (context, mode) { + return MyFooter(mode); + }, + ), + controller: _refreshController, + // onRefresh: , + physics: BouncingScrollPhysics(), + child: ListView.builder( + padding: EdgeInsets.symmetric(vertical: 8.h), + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + + }, + child: followItem(), + ); + }, + itemCount:5, + ) + // NoDataView( + // isShowBtn: false, + // text: "共关注0人", + // fontSize: 16.sp, + // margin: EdgeInsets.only(top: 120.h), + // ), + ), + ), + ); + } + + + Widget followItem() { + return Container( + margin: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h), + child:Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment:CrossAxisAlignment.center, + children: [ + MImage( + "assets/image/default_1.png", + 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:Text( + "百花谷", + style: TextStyle( + color: Color(0xFF1A1A1A), + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + ), + )), + Container( + width: 69.w, + height: 21.h, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(11.w), + color: Color(0xFFE6E6E6), + ), + child:Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment:CrossAxisAlignment.center, + children: [ + Icon( + Icons.check, + color: Color(0xFF808080), + size: 14, + ), + SizedBox( + width:4, + ), + Text( + "已关注", + style: TextStyle( + color: Color(0xFF808080), + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + ), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/mine/mine_page.dart b/lib/mine/mine_page.dart index c7bb2a89..6fb622f8 100644 --- a/lib/mine/mine_page.dart +++ b/lib/mine/mine_page.dart @@ -164,6 +164,9 @@ class _MinePage extends State with AutomaticKeepAliveClientMixin { }, ), + ///关注度/粉丝/发布 + attention(), + ///我的 VIP等级信息 MineVipView( tag: "vip", @@ -205,6 +208,7 @@ class _MinePage extends State with AutomaticKeepAliveClientMixin { ); } + ///横向的提示 Widget buildNotice() { return Container( @@ -278,6 +282,87 @@ class _MinePage extends State with AutomaticKeepAliveClientMixin { ); } + ///关注度/粉丝/发布 + Widget attention(){ + return Container( + margin: EdgeInsets.only(left: 16,right: 17,top: 10), + child:GestureDetector( + onTap:(){ + Navigator.of(context).pushNamed( + '/router/communityFollow', + arguments: {}, + ); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + "关注", + style: TextStyle( + color: Color(0xFF000000), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + ), + Text( + "45", + style: TextStyle( + color: Color(0xFF000000), + fontSize: 15.sp, + fontWeight: MyFontWeight.medium, + ), + ), + ], + ), + Row( + children: [ + Text( + "粉丝", + style: TextStyle( + color: Color(0xFF000000), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + ), + Text( + "666", + style: TextStyle( + color: Color(0xFF000000), + fontSize: 15.sp, + fontWeight: MyFontWeight.medium, + ), + ), + ], + ), + Row( + children: [ + Text( + "发布", + style: TextStyle( + color: Color(0xFF000000), + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + ), + Text( + "666", + style: TextStyle( + color: Color(0xFF000000), + fontSize: 15.sp, + fontWeight: MyFontWeight.medium, + ), + ), + ], + ), + ], + ), + ), + ); + } + toIntegralPage() async { SharedPreferences shared = await SharedPreferences.getInstance(); if (shared.getString("token") == null || shared.getString("token") == "") { diff --git a/lib/mine/mine_view/community_follow.dart b/lib/mine/mine_view/community_follow.dart new file mode 100644 index 00000000..3ea67a39 --- /dev/null +++ b/lib/mine/mine_view/community_follow.dart @@ -0,0 +1,65 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:huixiang/generated/l10n.dart'; +import 'package:huixiang/mine/follow_page.dart'; +import 'package:huixiang/mine/release_page.dart'; +import 'package:huixiang/mine/vip_card_page.dart'; +import 'package:huixiang/utils/font_weight.dart'; +import 'package:huixiang/view_widget/my_appbar.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:huixiang/view_widget/my_tab.dart'; + +import '../fans_page.dart'; + + +class CommunityFollow extends StatefulWidget { + @override + State createState() { + return _CommunityFollow(); + } +} + +class _CommunityFollow extends State + with SingleTickerProviderStateMixin { + @override + Widget build(BuildContext context) { + return DefaultTabController( + length: 3, + child: Scaffold( + appBar: MyAppBar( + title: "", + titleColor: Colors.black, + background: Colors.white, + leadingColor: Colors.black, + toolbarHeight: kToolbarHeight + MediaQuery.of(context).padding.top, + bottom: TabBar( + // isScrollable: true, //可滚动 + indicatorColor: Color(0xff39B54A), + labelColor: Colors.black, + labelStyle: TextStyle( + fontSize: 17.sp, + fontWeight: FontWeight.bold, + ), + unselectedLabelStyle: TextStyle( + fontSize: 16.sp, + fontWeight: MyFontWeight.medium, + ), + // controller: tabController, + //未选中文字颜色 + unselectedLabelColor: Color(0xffA29E9E), + indicatorSize: TabBarIndicatorSize.label, + //指示器与文字等宽 + tabs: [ + MyTab(text:"关注(23)"), + MyTab(text: "粉丝(55)"), + MyTab(text: "发布(26)"), + ], + ), + ), + body: TabBarView( + children: [FollowPage(),FansPage(),ReleasePage()], + ), + ), + ); + } +} diff --git a/lib/mine/release_page.dart b/lib/mine/release_page.dart new file mode 100644 index 00000000..dd99cb28 --- /dev/null +++ b/lib/mine/release_page.dart @@ -0,0 +1,226 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/cupertino.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/vip_card.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_footer.dart'; +import 'package:huixiang/view_widget/no_data_view.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 ReleasePage extends StatefulWidget { + @override + State createState() { + return _ReleasePage(); + } +} + +class _ReleasePage extends State { + RefreshController _refreshController; + var isShowShrink = false; + ApiService apiService; + + @override + void initState() { + super.initState(); + _refreshController = RefreshController(); + + SharedPreferences.getInstance().then((value) { + apiService = + ApiService(Dio(), context: context, token: value.getString("token")); + + }); + } + + + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + child: SmartRefresher( + enablePullDown: true, + enablePullUp: false, + header: MyHeader(), + footer: CustomFooter( + builder: (context, mode) { + return MyFooter(mode); + }, + ), + controller: _refreshController, + // onRefresh: , + physics: BouncingScrollPhysics(), + child: ListView.builder( + padding: EdgeInsets.symmetric(vertical: 8.h), + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + + }, + child: releaseItem(), + ); + }, + itemCount:5, + ) + // NoDataView( + // isShowBtn: false, + // text: "共关注0人", + // fontSize: 16.sp, + // margin: EdgeInsets.only(top: 120.h), + // ), + ), + ), + ); + } + + + Widget releaseItem() { + return Container( + color: Colors.white, + padding: EdgeInsets.symmetric(horizontal: 16.w), + margin: EdgeInsets.symmetric(vertical: 16.w), + child:Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment:CrossAxisAlignment.start, + children: [ + Row( + children: [ + ClipOval( + child: Image.network( + "https://t7.baidu.com/it/u=2841334870,333581502&fm=193&f=GIF", + fit: BoxFit.cover, + width: 44.w, + height: 44.h, + ), + clipBehavior: Clip.hardEdge, + ), + SizedBox( + width: 8.w, + ), + Expanded( + child: Container( + height: 60.h, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded(child: Text( + "百花谷", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xff808080), + ), + ), ), + InkWell( + onTap: () { + }, + child: Icon( + Icons.close, + color: Colors.black, + size: 16, + ), + ), + ], + ), + Text( + "2021.04.12 12:12", + overflow: TextOverflow.ellipsis, + maxLines: 2, + style: TextStyle( + fontSize: 12.sp, + color: Color(0xff808080), + ), + ), + ], + ), + ), + flex: 1, + ), + ], + ), + SizedBox(height: 12), + Text( + "文本,是指书面语言的表现形式,从文学角度说,通常是具有完整、系统含义(Message)的一个句子或多个句子的组合。" + "一个文本可以是一个句子(Sentence)、一个段落(Paragraph)或者一个篇章(Discourse)。广义“文本”:" + "任何由书写所固定下来的任何话语。(利科尔) 狭义“文本”:由语言文字组成的文学实体,代指“作品”,相对于作者、世界构成一个独立、自足的系统。", + overflow: isShowShrink + ? TextOverflow.visible + : TextOverflow.ellipsis, + maxLines: isShowShrink ? 10 :5, + style: TextStyle( + fontSize: 14.sp, + color:Color(0xFF1A1A1A), + fontWeight: MyFontWeight.regular, + ), + ), + SizedBox(height: 4.h), + GestureDetector( + onTap: () { + setState(() { + isShowShrink = !isShowShrink; + }); + }, + child: Row( + // mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + Text( + (isShowShrink != null && !isShowShrink) + ?"查看全文":"收起", + style: TextStyle( + fontSize: 14.sp, + color: Color(0xFF32A060), + fontWeight: MyFontWeight.medium, + ), + ), + ], + ), + ), + SizedBox(height:16.h), + Image.asset( + "assets/image/laoban.png", + height: 310.h, + ), + SizedBox(height: 17.h), + Row( + children: [ + Row( + children: [ + InkWell( + onTap: () { + }, + child: Icon( + Icons.close, + color: Colors.black, + size: 16, + ), + ), + SizedBox(width:4), + Text( + "52", + style: TextStyle( + fontSize: 12.sp, + color:Color(0xFF1A1A1A), + fontWeight: MyFontWeight.regular, + ), + ), + ], + ), + ], + ), + SizedBox(height: 16.h), + ], + ), + ); + } +} diff --git a/lib/order/order_view/order_status.dart b/lib/order/order_view/order_status.dart index ab3af21a..2dabdf1f 100644 --- a/lib/order/order_view/order_status.dart +++ b/lib/order/order_view/order_status.dart @@ -211,10 +211,16 @@ class _OrderStatus extends State { tripStatus = "assets/image/order_ok.png"; } else if (status.contains(S.of(context).dingdanyituikuan)) { tripStatus = "assets/image/order_refund.png"; - } else if (status.contains(S.of(context).quxiaodingdan)) { + } else if (status.contains(S.of(context).yiquxiao)) { tripStatus = "assets/image/oeder_cancel.png"; } else if (status.contains(S.of(context).dengdaiyonghuqucan)) { tripStatus = "assets/image/wait_meal.png"; + }else if (status.contains(S.of(context).zhengzaihujiaoqishou)) { + tripStatus = "assets/image/distribution.png"; + }else if (status.contains(S.of(context).qishouyijiedanquhuozhong)) { + tripStatus = "assets/image/closed_bill.png"; + } else if (status.contains(S.of(context).dingdanyisongda)) { + tripStatus = "assets/image/service.png"; } return tripStatus; } diff --git a/lib/retrofit/min_api.g.dart b/lib/retrofit/min_api.g.dart new file mode 100644 index 00000000..0ca13580 --- /dev/null +++ b/lib/retrofit/min_api.g.dart @@ -0,0 +1,111 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'min_api.dart'; + +// ************************************************************************** +// RetrofitGenerator +// ************************************************************************** + +class _MinApiService implements MinApiService { + _MinApiService(this._dio, {this.baseUrl}) { + ArgumentError.checkNotNull(_dio, '_dio'); + baseUrl ??= 'http://192.168.10.236:8765/app/'; + } + + final Dio _dio; + + String baseUrl; + + @override + Future>> findMiNiGroupList(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + 'product/findMiNiGroupList', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData>.fromJson( + _result.data, + (json) => (json as List) + .map( + (i) => FindMiNiGroupList.fromJson(i as Map)) + .toList()); + return value; + } + + @override + Future> miNiDetail(id) async { + ArgumentError.checkNotNull(id, 'id'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>( + '/product/queryMiNiProductDetail?id=$id', + queryParameters: queryParameters, + options: RequestOptions( + method: 'GET', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson( + _result.data, + (json) => MiNiDetail.fromJson(json), + ); + return value; + } + + @override + Future> shoppingCart(param, header) async { + ArgumentError.checkNotNull(param, 'param'); + ArgumentError.checkNotNull(header, 'header'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>('shoppingcart', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson( + _result.data, + (json) => ShoppingCart.fromJson(json), + ); + return value; + } + + @override + Future> getOrderInfo(param) async { + ArgumentError.checkNotNull(param, 'param'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + _data.addAll(param ?? {}); + final _result = await _dio.request>( + 'order/getOrderInfo', + queryParameters: queryParameters, + options: RequestOptions( + method: 'POST', + headers: {}, + extra: _extra, + baseUrl: baseUrl), + data: _data); + final value = BaseData.fromJson( + _result.data, + (json) => SettleOrderInfo.fromJson(json), + ); + return value; + } +} diff --git a/lib/store/store_order.dart b/lib/store/store_order.dart index 92f190d7..e7768863 100644 --- a/lib/store/store_order.dart +++ b/lib/store/store_order.dart @@ -241,16 +241,12 @@ class _StoreOrderPage extends State coupon: true, ), - SizedBox( - height: 8, - ), - ///门店对应VIP信息 Vip(storeInfo, () {}, false), ], ), ), - top: 110.h, + top: 100.h, bottom: 0, left: 0, right: 0, diff --git a/lib/store/store_view/settlement.dart b/lib/store/store_view/settlement.dart index 86385dac..410cf977 100644 --- a/lib/store/store_view/settlement.dart +++ b/lib/store/store_view/settlement.dart @@ -4,24 +4,27 @@ import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/order/order_view/order_commodity.dart'; +import 'package:huixiang/order/order_view/order_info.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; +import 'package:huixiang/retrofit/data/coupon.dart'; import 'package:huixiang/retrofit/data/order_info.dart'; import 'package:huixiang/retrofit/data/settleOrderInfo.dart'; import 'package:huixiang/retrofit/data/store_info.dart'; import 'package:huixiang/retrofit/min_api.dart'; -import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:huixiang/view_widget/rename_dialog.dart'; import 'package:huixiang/view_widget/rename_dialog_content.dart'; import 'package:huixiang/view_widget/round_button.dart'; +import 'package:huixiang/view_widget/separator.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; class Settlement extends StatefulWidget { final arguments; + final OrderInfo orderInfo; - Settlement({this.arguments}); + Settlement({this.arguments,this.orderInfo}); @override State createState() { @@ -33,6 +36,10 @@ class _Settlement extends State { MinApiService minService; int selectedBtn = 0; OrderInfo orderInfo; + Coupon coupon; + Function(int type) callback; + GestureTapCallback callbackEx; + int isSelected = 0; @override void initState() { @@ -44,21 +51,23 @@ class _Settlement extends State { context: context, token: value.getString("token"), ); - // queryOrderInfo(); + queryOrderInfo(); }); storeInfo = widget.arguments["storeInfo"]; } StoreInfo storeInfo; + SettleOrderInfo settleOrderInfo; int payStatus = 0; int orderStatus = 0; int sendStatus = 0; int isTakeOut = 0; int refundStatus = 0; + // String storeType = "NORMALSTORE"; //NORMALSTORE FASTSTORE RETAILSTORE // queryDetails() async { - // BaseData baseData = await minService.orderDetail(widget.arguments["id"]); + // BaseData baseData = await apiService.orderDetail(widget.arguments["id"]); // if (baseData != null && baseData.isSuccess) { // orderInfo = baseData.data; // payStatus = orderInfo.payStatus; @@ -81,16 +90,18 @@ class _Settlement extends State { ///订单结算信息 queryOrderInfo() async { - // BaseData baseData = await minService.getOrderInfo({ - // "addressId":0, - // "isTake": 0, - // "memberCouponId": 0, - // "orderId": widget.arguments["orderId"], - // "promotionId": 0 - // }); - // if (baseData != null && baseData.isSuccess) { - // setState(() {}); - // } + BaseData baseData = await minService.getOrderInfo({ + "addressId":0, + "isTake": 0, + "memberCouponId": 0, + "orderId": widget.arguments["orderId"], + "promotionId": 0 + }); + if (baseData != null && baseData.isSuccess) { + settleOrderInfo = baseData.data; + setState(() { + }); + } } @override @@ -140,8 +151,6 @@ class _Settlement extends State { ///支付方式 payMethod(), - - ], ), ), @@ -209,6 +218,7 @@ class _Settlement extends State { String center = ""; TextEditingController _vc = TextEditingController(); + statusTitle() { if (isTakeOut == 0) { if (payStatus == 0) { @@ -643,10 +653,18 @@ class _Settlement extends State { fontWeight: MyFontWeight.semi_bold ), ), - Icon( - Icons.keyboard_arrow_right, - size: 16, + InkWell( + onTap: () { + setState(() { + couponCart(); + }); + }, + child: Icon( + Icons.keyboard_arrow_right, + size: 16, + ), ), + ], ), SizedBox(height: 13, @@ -802,6 +820,7 @@ class _Settlement extends State { ); } + ///手机号编辑 showAlertDialog() { //显示对话框 showDialog( @@ -823,6 +842,335 @@ class _Settlement extends State { }); } + ///优惠券弹窗 + couponCart() { + showModalBottomSheet( + context: context, + backgroundColor: Colors.transparent, + builder: (context) { + return StatefulBuilder(builder: (context1, state) { + return Container( + alignment: Alignment.topCenter, + width: double.infinity, + height: MediaQuery.of(context).size.height / 2, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), + topRight: Radius.circular(8), + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.only( + top: 16, + left: 16, + right: 16, + bottom: 8, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "可用优惠券", + style: TextStyle( + color: Color(0xFF000000), + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + ), + ), + SizedBox(width: 4,), + Expanded(child: Text( + "(1)", + style: TextStyle( + color: Color(0xFF000000), + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + ), + ),), + InkWell( + onTap: () { + Navigator.of(context).pop(); + }, + child: Image.asset( + "assets/image/cancel.png", + width: 24, + height: 24, + ), + ), + ], + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.only( + top: 8, + left: 16, + right: 16, + ), + child: ListView.builder( + itemCount:5, + physics: BouncingScrollPhysics(), + itemBuilder: (context, position) { + // return shoppGoodsItem(); + return GestureDetector( + onTap: () { + }, + child: couponItem(position), + ); + }, + ), + ), + ), + ], + ), + ); + }); + }, + ); + } + + ///优惠券列表 + Widget couponItem(int index) { + return StatefulBuilder(builder: (context1, state){ + return Container( + height:170, + width: double.infinity, + margin: EdgeInsets.fromLTRB(14.w, 6.h, 14.w, 6.h), + 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: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Container( + margin: EdgeInsets.only(top: 14.h, bottom: 8.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child:Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.baseline, + textBaseline: TextBaseline.alphabetic, + children: [ + Text( + "¥", + style: TextStyle( + fontSize: 22.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xff32A060), + ), + ), + SizedBox( + height: 4.h, + ), + Text( + "5", + style: TextStyle( + fontSize: 40.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xff32A060), + ), + ), + ], + ), + ), + Text( + S.of(context).manyuankeyong(30), + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xff32A060), + ), + ), + ], + ), + flex: 1, + ), + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + padding: EdgeInsets.fromLTRB(4, 2, 4, 2), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(2), + border: Border.all( + width: 1, + color: Color(0xFFFF7A1A), + style: BorderStyle.solid, + ), + ), + child: Text( + S.of(context).shangjiaquan, + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFFFF7A1A), + ), + ), + ), + SizedBox( + width: 8.w, + ), + Expanded( + child: Text( + "百年川椒火锅店", + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xff353535), + ), + ), + flex: 1, + ) + ], + ), + Text( + "#新客户满减优惠#", + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 14.sp, + color: Color(0xff727272), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + S.of(context).quanchangtongyong, + style: TextStyle( + color: Color(0xFF353535), + fontSize: 12.sp, + ), + ), + Container( + margin: EdgeInsets.only(right: 23.w), + child:GestureDetector( + onTap: (){ + state(() { + isSelected = index; + }); + }, + child:Image.asset( + isSelected != index + ? "assets/image/icon_radio_unselected.png" + : "assets/image/icon_radio_selected.png", + width: 24, + height: 24, + ), + ), + ), + ], + ), + ], + ), + ), + ], + ), + ), + flex: (coupon != null && coupon.isEx) ? 97 : 97, + ), + Container( + padding: EdgeInsets.symmetric(horizontal: 23.w), + child: MySeparator( + width: 5.w, + height: 1.h, + color: Color(0xFF353535), + ), + ), + Expanded( + flex: (coupon != null && coupon.isEx) ? 56 : 42, + child: Container( + margin: EdgeInsets.symmetric(horizontal: 23.w, vertical: 8.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + S.of(context).xiangqing, + style: TextStyle( + color: Color(0xFF353535), + fontSize: 10.sp, + ), + ), + GestureDetector( + child: Icon( + (coupon != null && !coupon.isEx) + ? Icons.keyboard_arrow_down + : Icons.keyboard_arrow_up, + color: Colors.black, + size: 18, + ), //点击按钮布局 + onTap: callbackEx, + ), + ], + ), + if (coupon != null && coupon.isEx) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + S.of(context).shiyongriqi, + style: TextStyle( + color: Color(0xFF353535), + fontSize: 10.sp, + ), + ), + Text( + (coupon.useStartTime == null && + coupon.useEndTime == null) + ? S.of(context).quantian + : "${coupon.useStartTime.replaceAll("-", ".").split(" ")[0]} - ${coupon.useEndTime.replaceAll("-", ".").split(" ")[0]}", + style: TextStyle( + color: Color(0xFF353535), + fontSize: 10.sp, + ), + ), + ], + ), + ], + ), + ), + ), + ], + ), + ); + }); + } + var checkIndex = 1; Widget checkView(var index) { diff --git a/lib/store/store_view/store_activity.dart b/lib/store/store_view/store_activity.dart index c79863a1..4bf0e441 100644 --- a/lib/store/store_view/store_activity.dart +++ b/lib/store/store_view/store_activity.dart @@ -31,6 +31,7 @@ class _StoreActivity extends State { : Container( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, + margin: EdgeInsets.only(top: 160.h), color: Colors.white, child: Swiper( viewportFraction: 0.95, @@ -53,7 +54,7 @@ class _StoreActivity extends State { child: Container( margin: EdgeInsets.symmetric(horizontal: 5.w), decoration: BoxDecoration( - color: Colors.white, + // color: Colors.white, borderRadius: BorderRadius.circular(8), boxShadow: [ BoxShadow(