From 6b86898654770bd2490d9345dc64fceb1f4349b3 Mon Sep 17 00:00:00 2001 From: w-R <953969641@qq.com> Date: Thu, 23 Dec 2021 15:18:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E5=BF=83=E5=9B=9E=E4=B9=A1=E5=95=86?= =?UTF-8?q?=E5=9F=8E=E6=9B=B4=E6=94=B9;=20=E8=AF=BE=E7=A8=8B=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=9B=B4=E5=A4=9A;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/image/2x/goods_cart.png | Bin 0 -> 1064 bytes assets/image/2x/goods_phone.png | Bin 0 -> 2020 bytes assets/image/2x/jg.png | Bin 0 -> 297 bytes assets/image/2x/kan_jia.png | Bin 0 -> 1658 bytes assets/image/2x/ms.png | Bin 0 -> 5175 bytes assets/image/2x/ms_t.png | Bin 0 -> 3670 bytes assets/image/2x/pin_t.png | Bin 0 -> 4510 bytes assets/image/2x/pin_tuan.png | Bin 0 -> 1374 bytes assets/image/2x/shopping_cart.png | Bin 0 -> 1360 bytes assets/image/2x/shopping_cart_h.png | Bin 0 -> 1885 bytes assets/image/2x/shopping_home.png | Bin 0 -> 1099 bytes assets/image/2x/shopping_home_h.png | Bin 0 -> 1535 bytes assets/image/2x/wx.png | Bin 0 -> 1846 bytes assets/image/2x/yq_zt.png | Bin 0 -> 2283 bytes assets/image/2x/zt_m.png | Bin 0 -> 3448 bytes assets/image/2x/zt_zf.png | Bin 0 -> 3488 bytes assets/image/2x/zu_tuan.png | Bin 0 -> 2391 bytes assets/image/3x/goods_cart.png | Bin 0 -> 1957 bytes assets/image/3x/goods_phone.png | Bin 0 -> 3849 bytes assets/image/3x/jg.png | Bin 0 -> 493 bytes assets/image/3x/kan_jia.png | Bin 0 -> 3189 bytes assets/image/3x/ms.png | Bin 0 -> 9538 bytes assets/image/3x/ms_t.png | Bin 0 -> 6759 bytes assets/image/3x/pin_t.png | Bin 0 -> 8639 bytes assets/image/3x/pin_tuan.png | Bin 0 -> 2549 bytes assets/image/3x/shopping_cart.png | Bin 0 -> 2453 bytes assets/image/3x/shopping_cart_h.png | Bin 0 -> 3499 bytes assets/image/3x/shopping_home.png | Bin 0 -> 1977 bytes assets/image/3x/shopping_home_h.png | Bin 0 -> 3007 bytes assets/image/3x/wx.png | Bin 0 -> 3312 bytes assets/image/3x/yq_zt.png | Bin 0 -> 4618 bytes assets/image/3x/zt_m.png | Bin 0 -> 6672 bytes assets/image/3x/zt_zf.png | Bin 0 -> 6213 bytes assets/image/3x/zu_tuan.png | Bin 0 -> 4764 bytes assets/image/goods_cart.png | Bin 0 -> 498 bytes assets/image/goods_phone.png | Bin 0 -> 852 bytes assets/image/jg.png | Bin 0 -> 197 bytes assets/image/kan_jia.png | Bin 0 -> 898 bytes assets/image/ms.png | Bin 0 -> 2348 bytes assets/image/ms_t.png | Bin 0 -> 1602 bytes assets/image/pin_t.png | Bin 0 -> 1978 bytes assets/image/pin_tuan.png | Bin 0 -> 859 bytes assets/image/shopping_cart.png | Bin 0 -> 733 bytes assets/image/shopping_cart_h.png | Bin 0 -> 843 bytes assets/image/shopping_home.png | Bin 0 -> 614 bytes assets/image/shopping_home_h.png | Bin 0 -> 735 bytes assets/image/wx.png | Bin 0 -> 763 bytes assets/image/yq_zt.png | Bin 0 -> 1106 bytes assets/image/zt_m.png | Bin 0 -> 1535 bytes assets/image/zt_zf.png | Bin 0 -> 1747 bytes assets/image/zu_tuan.png | Bin 0 -> 1099 bytes lib/community/community_course.dart | 15 - .../community_view/class_details.dart | 41 +- lib/community/headlines/article_page.dart | 19 - .../headlines/headlines_collection.dart | 133 +- lib/generated/intl/messages_en.dart | 2 + lib/generated/intl/messages_zh_CN.dart | 2 + lib/generated/intl/messages_zh_Hans_CN.dart | 2 + lib/generated/intl/messages_zh_Hant_CN.dart | 2 + lib/generated/intl/messages_zh_TW.dart | 2 + lib/generated/l10n.dart | 20 + lib/home/home_view/shortcut_operation.dart | 39 +- lib/l10n/intl_en.arb | 4 + lib/l10n/intl_zh_CN.arb | 2 + lib/l10n/intl_zh_Hans_CN.arb | 2 + lib/l10n/intl_zh_Hant_CN.arb | 3 +- lib/l10n/intl_zh_TW.arb | 2 + lib/main.dart | 25 + lib/mine/mine_view/mine_item.dart | 253 ++-- lib/mine/mine_view/mine_order.dart | 4 +- lib/order/bargain_group_order.dart | 439 ++++++ lib/order/order_history_page.dart | 27 +- lib/retrofit/data/activity_area_list.dart | 307 ++++ lib/retrofit/min_api.dart | 7 +- lib/retrofit/min_api.g.dart | 2 +- lib/retrofit/retrofit_api.dart | 12 +- lib/retrofit/retrofit_api.g.dart | 26 +- .../shopping/activity_prefecture_details.dart | 683 +++++++++ .../shopping_cart/cart_goods_list.dart | 203 +++ .../shopping_cart/shopping_cart_page.dart | 241 ++++ .../shopping/shopping_goods_details.dart | 1235 +++++++++++++++++ .../shopping_home/activity_banner.dart | 205 +++ .../shopping_home/bargain_details.dart | 753 ++++++++++ .../shopping/shopping_home/classify_list.dart | 97 ++ .../shopping/shopping_home/group_details.dart | 888 ++++++++++++ .../shopping_home/group_page_details.dart | 214 +++ .../recommend_goods_list_view.dart | 214 +++ .../shopping/shopping_home/search_page.dart | 607 ++++++++ .../shopping_home/shopping_acticvity.dart | 321 +++++ .../shopping_home/shopping_home_banner.dart | 120 ++ .../shopping_home/shopping_home_page.dart | 198 +++ .../shopping_home/shopping_title_tab.dart | 70 + lib/store/shopping/shopping_mall_home.dart | 244 ++++ lib/store/store_order.dart | 1 + lib/store/store_view/product_sku.dart | 10 +- lib/store/store_view/store_order_list.dart | 14 +- lib/union/union_page.dart | 70 +- lib/view_widget/new_people_reward.dart | 2 +- lib/web/web_view/comment_list.dart | 8 - pubspec.lock | 13 +- pubspec.yaml | 5 + 101 files changed, 7561 insertions(+), 247 deletions(-) create mode 100644 assets/image/2x/goods_cart.png create mode 100644 assets/image/2x/goods_phone.png create mode 100644 assets/image/2x/jg.png create mode 100644 assets/image/2x/kan_jia.png create mode 100644 assets/image/2x/ms.png create mode 100644 assets/image/2x/ms_t.png create mode 100644 assets/image/2x/pin_t.png create mode 100644 assets/image/2x/pin_tuan.png create mode 100644 assets/image/2x/shopping_cart.png create mode 100644 assets/image/2x/shopping_cart_h.png create mode 100644 assets/image/2x/shopping_home.png create mode 100644 assets/image/2x/shopping_home_h.png create mode 100644 assets/image/2x/wx.png create mode 100644 assets/image/2x/yq_zt.png create mode 100644 assets/image/2x/zt_m.png create mode 100644 assets/image/2x/zt_zf.png create mode 100644 assets/image/2x/zu_tuan.png create mode 100644 assets/image/3x/goods_cart.png create mode 100644 assets/image/3x/goods_phone.png create mode 100644 assets/image/3x/jg.png create mode 100644 assets/image/3x/kan_jia.png create mode 100644 assets/image/3x/ms.png create mode 100644 assets/image/3x/ms_t.png create mode 100644 assets/image/3x/pin_t.png create mode 100644 assets/image/3x/pin_tuan.png create mode 100644 assets/image/3x/shopping_cart.png create mode 100644 assets/image/3x/shopping_cart_h.png create mode 100644 assets/image/3x/shopping_home.png create mode 100644 assets/image/3x/shopping_home_h.png create mode 100644 assets/image/3x/wx.png create mode 100644 assets/image/3x/yq_zt.png create mode 100644 assets/image/3x/zt_m.png create mode 100644 assets/image/3x/zt_zf.png create mode 100644 assets/image/3x/zu_tuan.png create mode 100644 assets/image/goods_cart.png create mode 100644 assets/image/goods_phone.png create mode 100644 assets/image/jg.png create mode 100644 assets/image/kan_jia.png create mode 100644 assets/image/ms.png create mode 100644 assets/image/ms_t.png create mode 100644 assets/image/pin_t.png create mode 100644 assets/image/pin_tuan.png create mode 100644 assets/image/shopping_cart.png create mode 100644 assets/image/shopping_cart_h.png create mode 100644 assets/image/shopping_home.png create mode 100644 assets/image/shopping_home_h.png create mode 100644 assets/image/wx.png create mode 100644 assets/image/yq_zt.png create mode 100644 assets/image/zt_m.png create mode 100644 assets/image/zt_zf.png create mode 100644 assets/image/zu_tuan.png create mode 100644 lib/order/bargain_group_order.dart create mode 100644 lib/retrofit/data/activity_area_list.dart create mode 100644 lib/store/shopping/activity_prefecture_details.dart create mode 100644 lib/store/shopping/shopping_cart/cart_goods_list.dart create mode 100644 lib/store/shopping/shopping_cart/shopping_cart_page.dart create mode 100644 lib/store/shopping/shopping_goods_details.dart create mode 100644 lib/store/shopping/shopping_home/activity_banner.dart create mode 100644 lib/store/shopping/shopping_home/bargain_details.dart create mode 100644 lib/store/shopping/shopping_home/classify_list.dart create mode 100644 lib/store/shopping/shopping_home/group_details.dart create mode 100644 lib/store/shopping/shopping_home/group_page_details.dart create mode 100644 lib/store/shopping/shopping_home/recommend_goods_list_view.dart create mode 100644 lib/store/shopping/shopping_home/search_page.dart create mode 100644 lib/store/shopping/shopping_home/shopping_acticvity.dart create mode 100644 lib/store/shopping/shopping_home/shopping_home_banner.dart create mode 100644 lib/store/shopping/shopping_home/shopping_home_page.dart create mode 100644 lib/store/shopping/shopping_home/shopping_title_tab.dart create mode 100644 lib/store/shopping/shopping_mall_home.dart diff --git a/assets/image/2x/goods_cart.png b/assets/image/2x/goods_cart.png new file mode 100644 index 0000000000000000000000000000000000000000..2569ec2d97afc592d57ac9cf83538053627534f4 GIT binary patch literal 1064 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 literal 0 HcmV?d00001 diff --git a/assets/image/2x/kan_jia.png b/assets/image/2x/kan_jia.png new file mode 100644 index 0000000000000000000000000000000000000000..0847c09d5dd4d9dfe3afb3fadd93636dbee243fe GIT binary patch literal 1658 zcmV-=28H>FP)Px*G)Y83RCr$Pn|p{BRTRK~;wSpd^foajpvNcL8q3i)hriFoRt?ur`k(u>#y7SGwbMMT4f6V>& zyZ4+kzd85Zd(N59qZnlgcm<#G1PVY29#Q}*0NDkR!h;GADm=)JK;c1l{E8SClE5J8gpXqelEp`rY7jP<2<-pQkfQ7(Qz)lD9tVN^+bP(_Y zaK5z#Y60H@t-zX$fd%y&3E$Jrq1}|V$y5(+GnF87u_y9P`jrv3>e*+f) z!v@I|(0pKS!edF$H3_uUz=$$3jUhF4H`jhLW63{>_%$Y&06GNt0jN{R?E&r!w%!g6 zy`@uXfQi5@z~wP(wIEIIoIPp4A6V>pOvGo?h$`CFUe&SM(4M`fn*h2Vct)XY8E`Ss zXJbgP_732oG>{tFTc+Z%95`@jz2|T1tL+`TVa5{Em$pZQ!9%S8&W_Cg3#bSFFp!fp zbsliP2_z+)P=HTUPix1gNlN2>H}Rk!fukaVx`3H!m6utk4XG>~*i|#K`p7j`EZUOR zMiW5)0{cW1Nx*&}M)|bhDzG8tDU=AQv8%P$AN0ku_iU>YV|=`M>ss0uq=h5vOaQ4) zrrUu>BL+y&eLZrCTnbzU3>X?43#o40!MzjaPVWcr0JTi-k)D=ziD_0N3qW@Q4=Sv> zF($|-J%D(rTrY-3UHurw-8PM?+L1A9-N4DpgFXaKQCR*iAh}zbF$5`3I9UObV}H7W z!fU`KY3KxN=GN7ZnV*;Egmz}J#RSefk@z+UoC&19v^93MP8rNRI00e7QA0oSH^t zp(8kw>PTXJc!~HwfhoZErnZ^@+O9|np9QWnRjQi58_s~g0#BWI8XV=J*F@EP5tNEe zs+~s3s`Ra-@>e?KO&x7>jEgXba75hxfRs0C6)!>(=2uN#sEG$jze?pT*8V-#Enyj4zlPH@D8lYx&Ewwwj5%o32ujw^*qoccIUd5&V_4>*y{AN3J9C`>#5J!a11& zsvtP>yf+6QW|{CYN;QlGH$2}mm1>qd$gOnrjt@SZP;Dz&zX-TSM^JQ5CLWZt=On>- zDQJ(UD*HMIlmutz)*bEZ=PZ@_jEj*e92ck9UJscBXUnqnZ0=qwwHfK#%QrikKmWOB)528^F?-3>lLU@j0_96v)vyZ4DuGr( zx}l@35x;+>#!>z>aDyeJ+~L@HP!-$tLGTx>Yw5gK<8o6DlE(7gQ!Jr_Db1^Ssm07*qoM6N<$ Ef`Xd@m;e9( literal 0 HcmV?d00001 diff --git a/assets/image/2x/ms.png b/assets/image/2x/ms.png new file mode 100644 index 0000000000000000000000000000000000000000..86889ee99ae9b373ecdf86144e060d2cde468a97 GIT binary patch literal 5175 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 literal 0 HcmV?d00001 diff --git a/assets/image/2x/ms_t.png b/assets/image/2x/ms_t.png new file mode 100644 index 0000000000000000000000000000000000000000..3f152f26e5b23679859f1c890a7bb9bb048c5bbc GIT binary patch literal 3670 zcmV-c4yo~pP)Px@5J^NqRCr$PoC(yuQx(P^l2n?ML<3T3CPUFgEQ%)5JWE0}8k#3W3Kb=qHKBP< zg*2)(7^-DRlSYM#=0WRs*E!$XcYk}I^S<|gtJUi6wZ65u?-}=d&fd>{_J02>X(6LD zu+pg3i^f_gY~&$WC~Tpyks27;d~w3&sIVtVy8npr_LFp(q_>Xf(`x!ONk8w5HFk}& zF6}@`XVbZL!agKvrx7!(DQSI4UmwvYYkHNWYfJi5XRHrMddM8+>kV-`N$2$xcCMs5 z_C_kte=q5Jk{%`LJp=o+n*B`D%?6BfmZXgav|EuT|CDqsNq=c6jFWd|X*gsu7Je5= zFO+mp(BT)2>vd~M*L8iqAZe=s6JH@|^#Scxq{&Ytty>4kuH;Q6{WO^6(d8Py+dVs8 z(i0`UUD6YRe)~vzeX{E4l)Oz6_Ngbg=rlM=(t{gqK3CS=8s@K(e%VtPZ})UJ%0G%- zK{3a=XI#Y-C4EuSJ%icrC+XA4s-jc!0!fGTwAFdOU70gG6n~I(XGuR8Gfy_yZj#>Y z2Kuq2^(1}Ry)_hh#$5lWHu`^A(!C{N&__wOx%WzX zm>Y>}h#UW``~5|d4ldpbdo&NZfh11lEP^>XP14FqXQ0Z)k}jBK@JwOfDqhcyxxb`! zBt6Sbw3(!DO4>!z`-4T`@pu-=0g@Qk3MV+arbG6J`v+j&s?nG^Uo~W~s7q>xzCZbiKN4VN!}=Fk7R-Gl=N8l4B&gWhJqj7*eqDEr7XH~3$VLmr@=d%JL-lqHjKC*TM00{Q_UE-Or zao9I6f0Ojp;CJxRw?}N4Sn|xG(5M^uZ_5HxqQhYOV7oC9yqHiTg%Lc1+^xJx(o@P0 z09bpH@Pd0v`d%=@AsSniC#BQV}R>c2z7oj zA%8aG!Po8D7#|FWGa7utAOQi6R=`moEc_TenH2!;%_SWf%s`M1Y5WJc__JWpcEnrzd;H+iuY4i#oHjNX62eX778)JjtPu|!T<^|vws=e~-0N(*h zKUrec3A>pH*99Pq0gr@DZZGMS#uyNS&^lSXNms5j4y~!MNb}rx3_ct3g3;yr5YR^W z=!S*%p&xN5c+M{pW|wvlbv@w)!Km^FT=-?`f($ zhuHv=`Fw)y4&6@By(C^?zbfphZNsJ`+NQR_whh5eL%mL&fC?2I?1AB=D z90#w%|^P7?D^2TGUfnGXTi5s0i*y7OD3!d@?gkVgmvfi6vlusphN$_ zY}8r&CRt$y5t_7cFcu*e^iB(I)Na5I=pdW%x<(1mpFaRLflcAZU{X>qiR)+6o_XyZ zU?K&mW`xWV3#$S?gV2jWD*?Grt^yUZv|b&PpdF&H1w3g>01ein?PE$p8l|`7J4I1b z++23T7_7J0Xfi0{O$)P%@+^H!_M2KQ3RgcsBbI zqqZP_&^;i2nQ6%swzVWuYh&eoB?Sj{j9sz<0}7L{RLxf&!fsN0JgFfy@`|8>sI?yI zYhODsOpC_(QDI?;S<_O2UVRuHDGs5MCJLD0&tM4%c|iGGV~qZ@B^_Z_#c4xPq}}|S z#G=G%K8{U!_0C%)u0?SuaEK70khO=oAXnOyOkvm|7*t3=jwPofs*iYRDS`5nc;im^ z!ZAN1SPdr$gX-yE%Gj;adwbzI`(aJIfEwTS`VqsDrSdl-?AP;>wG;6iX*Mq~98s*v zTZ59Wg0e{1`l?2r!|-C@Ns?HxIm_Orc}{f^^UP9JO&rT@A^XK`NhMMkp3#5MfH(4G zNes%SpmM7~1d`8N;*ZJ$k`e^z5pRZ*;QDxyav9s1?1Hs&q8O(oD5ZBmFd5`Epus~s z77c)MBFcHlTc#F_q>0TuF)>^g4gtkk;kuKy=NkC}lpfPd(JvetnW>gwKVKv1I7w7< z?>oR#a%*6cmzj`AVVs(*M7*aojx>;jg;l}!aZUU+^&RVqS7V|aaAt^oPVD4&RjBsWN+*cS&AT9H;mC=;#qX@fRa#>;9ia7vjnv+-eF z!xKjSk!w_ida9@i&r8h|5!(1-U&1Kt94H%pGuR^s6Kq9m@5_1HY_-9i#jJR2vy?@vhekZHA_*#S-j1ODHV`te4nF#Ej_ zo`&?5Pj&+CPzKks3f__Yr7aJ@*ppU^62#awvN7ZnJ>1}#Ezl#>iAtCLQwppfpM?q| zZmgx{XqE`y8-0GqaB>Zi`c0va-?&mR77==`9@3v^#;bK@RUw!J6pK(vsA;0&h2bN8?$u`(PP_$>O~l0yU7?$(E4Z}0|H2xY)!zC;NaKuJ;c zrjTs}=#gZ#7r+gQU!ak#uvl`1QD_ofkqOruVNcknjIOptFC=YnURMh=i>X+aE3gV9)x?(&)m}mV zgWi30G&Tk%!G1S6r1IIX3D4`Jf^duR84IBfJN0jSX>X zo#2!`@F5WiP8bAV&yL-Jf4A%cnINuZkD#;4;UxI0x@>_3u0TpgSB!552*<4ZkG@y8 z^HOhSPfhFJ+F*}UX+gU|uW3?WEU0?IIw`Rt3Y7_PV$1YAXN6TJ!pnvtj*ZX z^w^Wo*!PH0gh^Qv-s%10y3U{1`JCT5*ZH0kck8C{VSWjI000hOzlOA6+t9yes_q>!B_`urdMB=*vz7Wi z1#$^=(Shai0S>^r5i)0acmG=`qJ?66mNKjocTW+xM;!EvcNi(zs5C#WFMTHtSxBT% zf&o~cV&Mj4Rt;Z=!=Flv#;YfG&Pyh|&`LAOC3L%OvM@*mFkA@8Giu9+4fK8b`oP7> zY4+OLw-W9*mjJ5It_(1n{+J7#lLG^xEIaV`NpSTLP7KQ8>f3nOG0(C|FyBr(p}$zn z_-Y?lA`FB>W?wzQI?5FqM?-~S14c><0`2`|W==n(j3TX27|DTC1ZJ;;CZ~x;(18jP zxMNi5vx_ps2LZDPFkBzp{Nl?G{(!PPh=V>uleOb-4SD=2BDeUP-8Abj@m8hc)s5Q( zqM`SiNl@}6AsA9eY;3IAI4$yE>E%gNP4|~2-PH|;K8)nf!!veTXo}Lwex-43 zjQc4Kkd=nj`aC998sG+IVZ=fG;;dC~(6<-z&|&Lv9+Q>Otqec`dj84U)5KMBTwCzC z0y|77WFw04hlZ}crG={*VVTTq`CVxX1J;#cdp$4YjaMba#o-v!0`KM#5-NL~`7w7H zIv^$2Cec$p%nEs^wq3$UM=#$5e{%y(YASJIKM6p=X=l6P8F?4keEZ8BO$7W!m8fmJ zyWM?kypc7>${>I{12xwN5JSVm58cho`YKAv|6YQ4cd_5RPc_`m@*S2{?Voje6X(YUe17*5`OOLcP=F?AXi+DB4>yK$>s zF=H4~>hE`!$f5(DVn}CzItv>q4{JV_&>l|uQDMec=`(SM8z(F`7p}CB&)pf0thYUU zkE{b7&;;ttl!B+?hI64#Bf)(v#F`QyezmQ|MP{X4Q=(VJjANqKFaJ!G6OARIJ*qg3n#z#qt$mXJW#J^ViIs;QbS%J#w@GV21) zrHbDaH%Q>zwDL0#D)NcXM9U3c*46Sp z^HY~%1zWe>{QTA&+HK?BPZp7S2y>h@O6Su|0-o>91U|8A5`Bf2c4w)r{DF zjup6&nA_+7R67Ncf9jcGA(AnyTLsts`tmL)%IG~mTzj>K}Y7&rLqc>i*1bmyC>}k7QMcpqyB>Xcd$GB>xkYK3<&+3c*vtzv9+(Y*w3BAy zITF4HXM1_(5YUqDKuoprK4mi17a$e!b?3pmhDOyM7Xj;bw!Y+b?7=cu@wTJV!ngRi zkxV+AT|>!72fhRT6&7zkNBcW$MSu-&W}_VL5f-CLDHsR6q#!+DMalM{(%sIqhiF$C zjOp#%X!4GN+V7}#f3D9#f)Hc@S@BLF~b~da?|*W7cZz)RaJ(} zR_mVXk182VG?{^}kOf+Q;UZu;1@ONW#UO; z({EC}wpH*DQ-vcNdU|>-tGoL$@}QXbd?50`K`1kYJb=Cvg%=h>%+uTmivu!NluiC8 zNyFhPuz=%V+NJvQ62kW1SbTeW`M$U|;kD(r?3T3yI|$t-i`3mdDG_mxOfy2-1g)IQ zpEZNfd+~MFCOc+_`>=GuAND0{y9PXf{K0Vp*N$h5hK2?q&L*r?*8~--1!$BXd{Er> z1<`6zb;H$Vd@~VNV`@m`_SnS0Kvgu}?cLYCcuxXmMEMvSPiO$3{r<7*AGPrB;}jRx zTzla_f;|t}VI){a7NmAFlSc$wmzI~8CrW3TJPG@msQakFk%c`- zHtBvP{M$0!(7=0T31%pjM+NkgTH9T>Q8gNqu|EB4XHgpi7OCSULB%KO<;#vH$eC<~ zH$QkmbsbbqiFIfq|F!((MLjW)8l4t=jmZ8Q(Z-4mUP8 z=k96+-1s^0!smAFf7NAvLz2(E)(ptN-=s2Ys=XA4nfrxioEx#SuTQ+>Hx97zWEa1r zpK^LnMy9eUoF?yv`Qmrbn70kFrJDA)~^!>qdIz=#nd}#%MGEv4g?}{>h{=U8>DXppEtHm(P@+be z?y39Q0_&l(`o@ZE%Je)zJ<1I=Yjf2$O{G1H5Zlf(b@;5X6pE0J@9(eVfE_!a`UHWy zzy74j5}RBNe;fx%uTnj3Wg9-hE)ySG>b`_xJBSUr~QMAyD&W_m_69 zyB{AHHa2FLGLw=?2Jd<~U39CFKt>S-N{$1BV73dD5)e$%u;JTNhu}!3wAOE_Y*yVB zl19`$^7pTtJMzzhhB*244Gu+4TW_p9EFhrIKGgyxsgKFxmwfb#?=NFx`Znrf7EViY z|Ls^)qjShf5ich;ij3q~@Uk3ws;9+XYhWZYkIa@d-*<()_YuV3TV$cf(jGslA+=zt z&b1V}56U)N{CC571Dmh1o9iXs(N6N*4^_TNLcFunXAX$20qYJ#%Li6w#4%vMg0e3P zYnB1tOw3()6t5qLKfw%w1*D}`D>2kK=tO0O6P@+LTiAzlv}brfb?ve@B}a4SZ+Y+e zg1_ZxRswR|YCR^_(YyFAzVq~HjhU@lSr>iKQPb||`+3-DzS))Q`+~5kwkiE+sGrZ~ zN>lj3X5CRiSb*53`s!x|qU!6|+uguX^BdlKoM7H{q-iVKt7MukQWL3}m7^3jibVQx z;fi0Sipjc=GAZ@CCpkU{)W-+5p1&Moyi&;7onRJlH^$cO? z%XJwdV4eaoryu?AppQJxbjY@A(HMvoth5+Q1k|lu<+5e|Vn&ecX3dNC(g<2So&8BE z-b7B$J~8Erur=up&MGo@JpC883H^kEjt0WYg2~mt2Bm7J{@R9F% z@GbwV+4VprdwNN+2vqsysdIm#uNXLfF6=BJxnomH{1= zh+md^N#cKUeqr-lb1p*IBNd&wC==sc_WGCpwO+_a4#Jhdov^`Jd?d7E^L#X|qwJC2 zNmxMXj#kZqnRpCqByBWBWoKyQ@a!Zd_r|GRF?CEACFjb8>ZuNC9-NLF*TCdDqq>a8 zJNSediQaHX$_puwX{K;QjZ7vt>VAsGU(`Q$?rjx};1et4WUVj~>D4CF+11shlxQsq zK44ds4%FNLym%97z)lciYM*r@O_ug+ZL)sj)t^A##O)$NeDN*Fhi0*KHG3)#Ao@k1 zBW()bbrMt$)CQwwTb}j_$mOY&srD3TB#5ecp^6#gSYeqwwW!SOZnsh1)|oeV{r&AX zdECIcWMXPhv4xBLfq^AZ1J?94K#+)hd>vxl9vbjYA@@qyZ*_Lh_-}^lbNeiAJpnfH zDb3<(`v<>4-2#qK&8y>7tY-0`EPF4(VqO;mnqYvVrO95{KEX{h>vG#!!0FMt9P)7- s9=`fDZ2z+CoNo)?C@>Px)7)eAyRCr$Pn_XxeRTRhnXEv&`ms%}GtooouOuv$;n`64>2r zGBdl`ugsm-IrrRie)GR)=gyu>kk^I;Nb=d3fCS{C5D7>Es;-Dg1xW=-1yx5tDyTYs zvIa>7HCREBNaS`RdK^Fkz@0>N8vv!cuqqxcnE5XNzXC`z^SOzMiQg;s2B6|4*3;7y zZf|ctK}3T9Zm1@R8jhW3=2Hs`3$JCf*<2;_R0Jp*jou32OJ?3($)xojLqy*Lc*Hc# ztA6M94aiYWM@PqKtH4(rbXX8w$bej_5`Cy33mWoCt$?;xTB0JfF!J1>Oj_EWfh0a8`<2oaqsGx10` z96mTUHa5Fi$yVbh9*=kCa=A|dJXGq3nFnp#e$T6azkn_f(cTj0GvRP}N3+0Ljco4f`J!#x`)UPfiio-koip7qM9-DPJ8j$c4zF?eQjn%;*8tp9 z;{2#(S?_qAu%33Bro9N@?UFhFwk)g5YaD(7{R5!0&^ZykV47yRy5uzmPj>O){hc{p z?6L+fUhy;lKr|X1Waf8E>}M^@y3wnTmH-qpl0#s2UM)gQ_>seH13&FKKjW5UAOQ8H z`|l?qzAb_AaVBXzEdc@OGmzXNcer$j3^n$1{77hc7h4RZ4XGLjQu-c@<-?jxCzo1MShnLW7n zi(xAOIs)cezh$4zB#oz9a*2UKaYKJb00%(uR-_p{0KzWX$$?-2G3XAU|*d2gn7E^ZjWIKr)b94L3NXg!VG$`@s~v zy_gp`qD+~l znFiMWbGjO9G#XWf5WPfneM8%Toq!tDNIq&=meZNKT>1btO?w5vke72OHE$$$f@|PW zgvTt)`l9FsG8VffpU?m4wC1_JOV#Ztf)hw14zn=xVcWKg_GFPrWT&Dizj%QIV4yCC zSyqFo^Kq!frKP2NCMPGI#_+-`q-omE0CuhesWHc)3WKTffjS1@yn7utP4hxI2$4wS zu23j+nwfi@KBT5OQ0FG=t#aR2pY&Eq+D{%5kP9sdNCNV+pw`+-1xW=-1yx5tDyTYs gvIa>7Ri~i;0C`~Qc1rABxBvhE07*qoM6N<$g1u~gi2wiq literal 0 HcmV?d00001 diff --git a/assets/image/2x/shopping_cart.png b/assets/image/2x/shopping_cart.png new file mode 100644 index 0000000000000000000000000000000000000000..80a684ff5240099760668c5bddc1223d9e37aa0e GIT binary patch literal 1360 zcmV-W1+V&vP)Px)3Q0skRA@u(nqO=bRTRd*Guzfu2?_X8{F9Uzl%O%~ZX1265=j6}1W{VV((aws zv@s+m`lK<&nh^S;555pV+nFgfR4QuYgMfQNf}T6BCQ2VCkQoV+LBN zZMSpp?(McIyRZA5^L@X2?##~ImT-rC=nmsW7I?8wJUij+gcsQgWViGp8|XBg?1Zxu z&fp5PpKo}93@&HTx!$6cP9rsXy6qRlmOjK4p~SDtn+b?c0z5jM|4hmF>eVp5a7|n45=jgA#&vCr zp8%}ZOQ6<`8BW}^g-n$OVDmG8D`m{)O2go7ap4@6>7O=m#5Uhz@E#enInoUDGYb1m z`?^g3w1LBx*aX5iGG=q6v0Y)Cvc1y=F0({og7BxTp>7?4H^zi>RJL#0z~eVAAGlD~ zRHN=Mx8T~nsO(6{_S6OJZ|P04rrLCby>8UrrP5CeaKsT!%y?79ScjI#D33*3PO0?L z0$gH=mxyps#W-y(;i6k(uL6NpdT9ZUSYizm0^gEUf(2?BdtB3gJ5V=8pamF>jYhbr z?+SpsRRg4=XT~t{LJ!BQnlGx>>jA#`h}i|;3Dp4VdcFcOcDYfjO}!TS{#;sOn|lfT z>O=?zH4(Gc2NDh$LnHZvy*-s3S5txYYcx(cS`W~^i68{t9TUzwsRo;?I&HwkmMAj_ z-`}1ve;yZ3#asnXwXZhdB1`12APfM=8xPY<45d@dAc!%;8$26ry%eOI?R#y&zDd{? zCjmT}PN2YAqBb{bRR`*l2($u695c$ycB*0I>UhW%PJx_ux=JhXy5o&G1Hbik664ua z0|nL*pK_y4d7v&66ZSnGIaHCiWN67|&ol1F_+f6U;ilDjJTN?#)7hhVQaQPg)(KBE zj_j+?_3}rz7>pv1&}UrF?Tj_-A5{UraX^^3Ydw43QpyQ+xz)|TsMIIZY6mX1M3F)0 z1n}4-({mnU%Nf(|lL=kYR=1uKi34D)9M>m^@qWy-(|#k<4ji_`2@sx|2F5t)n)bRN zVE+VV4Co=kim6&A)WxHAOHhxD{VWw*Vzoi=k8NlCc#Mb6nD)=J1uAjG8^rivW(~z% zVTBhAa7k-zDS2LZvOsJYW$~Jp(*eLul;kjh!GFYs^T2`u_Mf(v1D9spj*R}xz_<=!Y$_0F!)^n4+1z3kKS`@tz)u5{he};fkuyE60npAC&u8tem2^g^!^~* zTl-yF)_A^jS>X9v`Aqp{C!DF3o-d#5gy(DJGv%9|aHdvzzI?J1p0Ab9l<$AnskBVr Smb;$-0000Px+7fD1xRA@u(nSYF2RTam-=gp5*fwmK^HnmkqPzyp0WV-wAdCTfh;g4ctz*vxq z{sE{_(IQ&$k7_agsvv}@ji^A7Mw&`AA==b#?Amna-Z#rOxGPl&pi%Kxgp^Hxth+Ps z9dnv#vy|!1o0+%Wq@DBUd*_~WKKI;r-#zCN&N891j2B(tGd<(o40khphRr~CNuOZ} zeHBhO!`%#@VKdNO(({>6=iGHfbOnI%UAuNYvU&67IPG{6XV^J+n}}>6qVq+>n-NGA zz%u~8!OV}f6X1>=J2K0bEqf5aM`w)RozLg5Ef$MM+p&47F^Pb!wI2kqqlseyu!fm; zwGv<*_9p;tY%p$5KA&HkCUjEZp91(0fZL5R_Y;xA9h1?~(cJX(^ql~{3Sb{I4utNU~BD1 z06YTV&m!_Q0Q%h?lT0Qv===VEthIjv@Q!RYdr5C^?}6EXTZBy&IuY=J0|)XG6BD}u zy!&L3IF4`a@9+Pywf2_)uF+MH&*ukc1Flx9R|2@U*(zx8es3<9dt9GSPEKOs!i9%c zu3V`rE3qU3R%=5;L+AGN^n3!qB}9|~aG{9!0KU)6pDvfn-yx#UCH9=2;tK$_F!T44 zm`n_Ovaxcxd?gY627qH`cFwIAk*_Clnxf7E00p(@dEQOF?{8~nyKUg{@$tgp!-roY zqNBd=FCe1S4++hJ*Z0=i4FK*Fktc#6cz?4oZ3EYx{RP1JM0Bw+=8w&s&Bc4?+^r(= zLjaF5vu>`lN~gd-uWvrE&iVIs$git<`Ubhz5-@S2uH(_Iu~tXGG+F0KZ`7 z>yp^-2zc+_y~}gC+}}jx#UKb4Cvljjj&sh{e~s&y`DaONcLb~soOAybkvDjrx7_!A zU0$a}DwWCwQ4~E7;4pwUG4o^+$7ui$ipYBbtYv0BZJide)_zG#QX<-BjJYYP(=>qZ z5s^DYWK$3Xdd@yAVyztqaH)vAF9?EPC3V^{a2SRkj^p@I0FN`X*3EM+*4j(8D?&ss z=5o2E#bWV9G1JU>$H3)sS z^zl2PUp_U4;bM8kXatnalv`n+s9&ZV?8c!1a8WBC5 z%jGt-)9XqF*jlUKk=CORG4svV+AjmRi-@*IQM5G)MG~D{E;pIUWS%V+ixWxo8|kD1 zT&Yw{6h)SZo-)Q?)*}Fmq9}TM zCX@MHCxOi}_L*!pdqZz;Z(H_L0j_UcBLG&#aeR&Ec|!p96QySU7{7>UhvUrvMwq#; zoe51XBIn#j5!nJ@k1^(|x#)m|VYncUV_iu{nfaV~1s)w8U0AJFpBItWi^vcWjm>P> zw-emSV?<;b06on;&CGh*YFSdtuzC)|uoTC!c0m@k97*y45fR;JjA?fD)6in7!1ZtW z^IF9K$j$Jm4L&^)C20fcxX%Jusy7+OZHUMe5q-B-t35n0Fz|=u^Ycp0RDqpy>i}#Q z5h9}Biij@jcZtY*>dX6vW|^s<(mp04y5sL5BK>Cd0${O-{5_k^Ue?#w_tLxrE2MKy zyO?hUu#uVXJ|2{{_6q>M4dAcFma^ zF-9-%+LF{V?3}wuM0BbB+ZeNSCRBYg{s~~oY%N{q+!saUTSWArF-DK7C#1eV?CE5~ zQe&wBS1Ofa6h&G@G~7Y0wNC?hXC{+b)z{ZI+9*BN+HV55Q$+3xf?)GZ9c%4{0G zWMpJ@tyX(N;Z9a+r^E3o8*NR~EQ5CL+}Tqo6h0{;TAb_2=pR}p9z1w(>zXxdrjq!p zcQw93M5_V3R)23=ex`AqlWK;Oz|6N!7kIuiFxURO8J_DIo^Siz49|B4=Gy;Rm*M{d XQQy&9Bp=F600000NkvXXu0mjfPBV|J literal 0 HcmV?d00001 diff --git a/assets/image/2x/shopping_home.png b/assets/image/2x/shopping_home.png new file mode 100644 index 0000000000000000000000000000000000000000..267bfeb48aa7a93a7677f3ffb42541687045de5e GIT binary patch literal 1099 zcmV-R1ho5!P)Px(1xZ9fRA@u(nqO!fRTRd*Gc##o6O0zIFaFz-CTJveC!vKZl9#F#H3c;$t=+x5 zQKH~Ok&620lOhyRs?d;RW*Q@D0u}V3zG#&Sw$RREBw9flg!%`3sWGjR?97p+RW=nf z_fB`>nBINdd+s^k?|k>n&J0Vq%06_J@j?TycE`2D+Tm5!0ez%bnW6u{(GF{eYuEvM zY@mgMa5sTF05%wy34!r1g*WqWWhT!&{YXgE4`40?-q@KLI(;RQR^~`gK5p6-l%UE^!f$&SS9|@ znZeTxZd(dWZ}w#l?2*j3a#v~FD?9<_5de*f;ub;lyq|aW|382$^ZI+^t6=N};y;ZM z=-{5at*vz?wWQYJ_Q`>D4Hu;5Rm$}BjTG)^w~Xe7s!I)}86!bL~ z@bK*xZoA&N7@r2I?_~E>$HfBPqrz=h{uvw)@Qn3WgoD%MxD)}{VRJXLlQ5{NfT_0(Q z=IR-aYLcGes17B#u4h=Hxq619nxtnqszV8`r+0>lPjV3ME!Q_qubB_R>K-gK%^T)o z-5mze>tLup2&D2}`W%PUS}HofENAvzj=0Vsd<)=4*+Y?1hv|qfoCjqfI=#XaGe0I1 zd+F^(3LPd)`FXcj2EulQ13<{ct{AZG=8pk%kE|#p2nGfuD_za32xf#Go}*1%3n5gfB)XRfKi9`Th{p3!{mB~}Bc#fhYJXor*PY+CYahtuLjQaZH5Np&_Yd9}l7aUv-le*%H;mP}_! R9t8jZ002ovPDHLkV1l3|5)}Xd literal 0 HcmV?d00001 diff --git a/assets/image/2x/shopping_home_h.png b/assets/image/2x/shopping_home_h.png new file mode 100644 index 0000000000000000000000000000000000000000..9cc7f11435d655f31066e93a882d3edd8073ff08 GIT binary patch literal 1535 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 literal 0 HcmV?d00001 diff --git a/assets/image/2x/yq_zt.png b/assets/image/2x/yq_zt.png new file mode 100644 index 0000000000000000000000000000000000000000..46e801409ca1c5dac3997aba2ce147e67e395ad0 GIT binary patch literal 2283 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 JPDHLkV1kRClotR1 literal 0 HcmV?d00001 diff --git a/assets/image/3x/goods_cart.png b/assets/image/3x/goods_cart.png new file mode 100644 index 0000000000000000000000000000000000000000..34339a8f5f5b0dac2158d4580b403a4db25eaf16 GIT binary patch literal 1957 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 LNkvXXu0mjf{*ohY literal 0 HcmV?d00001 diff --git a/assets/image/3x/jg.png b/assets/image/3x/jg.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9c610b4ec98d30d514875cd0679c1b0706f106 GIT binary patch literal 493 zcmVPx$r%6OXRA@u(SiMREK@gs=5LN;f_Yl5^P0GdQuuY|{h+-oo!Ag{1t5sULMz&1j zd+0l)5P}N|BP)p<620Vh79H7Z_jdOC*_oYPkn#`8@lz)7+YV+2vICI{@oEwUw58_A$>~^~yW6TLN_m{;5F!bJEP9~F?)Vg8>YT%EFsPhfL8GtKE5@H0b zwF74U3H*Z72MOogK*EJ+0`r7DW#+X20T>iTaS@x?u>@eP-DBpPTEea>Y)I?_=iFUP ziH#yqmgT1R{+fvPS4I8hzguI>VO3QxE$7EoA@u}88CJc8g6*|a_YA-`GjB9(hc^I^ zM0753I!EO|+kGoJFB6bdvrVk*KpWL0=VS-gEu#QliRkIClu_LWnfg{jJ%Rt!3#q-( ze3o>zSIPwg^_TiUMD?>uy**I-u(cqe{%LVeMDOFSWVhKAD|e$!3Z)*;4y0DNDSmdK jNuku^*@4swH^qMk;|l&U(vh!e00000NkvXXu0mjf=9JxM literal 0 HcmV?d00001 diff --git a/assets/image/3x/kan_jia.png b/assets/image/3x/kan_jia.png new file mode 100644 index 0000000000000000000000000000000000000000..543944e81a9d57d5ea8a32e3821460047cc035b2 GIT binary patch literal 3189 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 literal 0 HcmV?d00001 diff --git a/assets/image/3x/pin_t.png b/assets/image/3x/pin_t.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe7701a55d556c5db12f3521a9e96df6dfb016c GIT binary patch literal 8639 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 K(S<0BH~$CtzL8S^ literal 0 HcmV?d00001 diff --git a/assets/image/3x/pin_tuan.png b/assets/image/3x/pin_tuan.png new file mode 100644 index 0000000000000000000000000000000000000000..6990ee299e094e613f71c2de096019d277dbde21 GIT binary patch literal 2549 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 IzKr|xKkB8xumAu6 literal 0 HcmV?d00001 diff --git a/assets/image/3x/shopping_cart.png b/assets/image/3x/shopping_cart.png new file mode 100644 index 0000000000000000000000000000000000000000..9b902ce2e527b12122ff0afcb89eb0805ad4f4f9 GIT binary patch literal 2453 zcma)8`#%$k1D)AC#zc8P<~@&jj3x5OF!H#UGLQ0>+9vOGJ@N=sZ7BC5<=MQs^T;z6 zHtDWQgy_n$>rpZ>q!m{3_5Ba-59gfE=X}l&=cn^IU}o zD)gqSx3pLhNZ*qQIXR=1_+;ySw z9{z`xQg31U_>1m#)7F7y1==goa1%0kCcp|~AfKcpJztg+xmSpK>VS_~xq6=l_YxyL zG6`FjJfB6fB;CJnHa&YdAPH-osn?v8p(PXwbP)+KQtpt$*xQFP&z(R3_IdbN3Ta8+};R%F2#wp=Iat~772GHk_q0X)jB(WE11qa zi!~|F))^*gPOh{-7o?xPy`-R+DVp>r&ucbJrTt#>N`E=S`gU$;=u4QBa%Sc9zsOsr z%q@ZWODc*{pN#d=7YXB?4_a3HRm0}vXY@0qCO0%?c?@U ze~tV#e%Nu`)`B?{yR?6l>RKE0oMi?;bWvV{ogn1LLmN+wCeg<}G8I8g4poM#<7+S)@ZBRNY#e&oY;3A!O5xB#!!Zr-h^%>3jq_d%Zr( zEPou~=M>bq3v4jXn}9zs$Ink9lnH>)z?4$ag%Oic5Nk+Mj?F<2vD8MhIHuW0l^B)2 z54x^fP3h}$c6vAm&lbns#cx!)aloAW%Laz*g~y+p18u=zmGsunvYQ^NsypPV*0B5? z(qnxEvTcO#AcZpS-!6AN@NjHEjb*kT4qGC7X~80h^KISMB1v$U*zqRA+%Gnz&Av&DdT?*o$k5$OrJ|wAG5&TaS{q z@UoC;I9% zp}gi61e`jMhHuSDoW|I?IP%WUXBlu?!x%`^eeG(z)AtHtff!-?%o1U_n56Yjpr|0p z_pAgVS=yX{+`HqTa=fQcy@pbt>T)eq1^#9UhR*b|fU5IiioDXfh$f z4G!PgrTef*dwot0=0FZAYn=8F71a>(*u>bH5#7rYWJn4Q)N`d;rzz~@8JN4TK4BVTAr;6Rix7~e$K-SZe#=@S%-#3yCBDCKG|zn^>Xt@diw4g% zidCmhwoLUIBnfAfZDi<$yt)W9hj%}3wI}>7%$|{d{*d?T{2qKF!=8%$jduFP2fn&W z*BtS5%aqj!<4aA1DDW$Bd%z15ylQ#nBFdnTNqyo&ZQ!@Hg%Zo;bqz5ucA^WnkAbgx z<7-#m^v4@&C3#NO8=pwCS4&KaOFZ<|wM}f^et8jP_D!TlmJ zf%awU3))~CCh*I6M(TP91;jI%qE+YZe8{|Fc-SLmC7Y{f)$phi%W`RChG2 z?lxhK#1#8katBXAoC=qD#%Qy^>tqcfr9D|W9T%=7%B+_E!@qVZOzh#ASPkLuT7et1 z#>)X4=<$gZZsj>da%HB3PIXGj{=Gkbk?7Zf`<3K;pld~J)@z5MoMKhv-2l3poPg{c za1(1U2*KE3CIM;ovp6M?+mrL4E{ZKLY`g&#!Fjf=c?<`9qlqNshDU^y&q2x6*r2P6y^-cIesbK@|+IU;Tnr z!77;AoOV&ZB(gypiK%EJ1%>MUgZo{FvKk$f5C*SE6GV^5q>7pPR(-n#n@EIhq3F#O z#ZYjN(3c`ayZSb(wpf?bamfQ+rgH2>jR!K+?4jUrmf9!TENVXH{hc-tVs|$d8zw4O zH%?yk)-;lXUneG?cSX!&tJcO*lQ?fB1qZpsHu3Jp+W^7ZQ(kY_^SDH#_UeIj+8|0ME}sOLq&k%WYBd0YRJP}NIn%}bFJ6?&|y$z z^scIWea9SL?VMTs*rB;op#!u%4Lv{ku`R0PxAN$PPyfC9n3w#e%&!Dy5v6EWrvFZY@q# z?W#qs5Wm^EX{fm{+X$*%TEK$KKXU%7@sa*-f-5Pw9yWILvj8rR?wD5lkgWd!yRMH| literal 0 HcmV?d00001 diff --git a/assets/image/3x/shopping_cart_h.png b/assets/image/3x/shopping_cart_h.png new file mode 100644 index 0000000000000000000000000000000000000000..5d3e017f80c5b43b1615f6fe92f7b31c2f2df14f GIT binary patch literal 3499 zcmZ{nc{tSF|HeNvW34b_En68|c4}zI)|kTBg)D=TWt1TyJL9o5$aqx9ggjH0tSMwm zdJGfE*hYpdQ3hjI)}H!K|NgG)_s2Q!f6jHzb)9qHuk*gs?QP8kjz}H>06@Uf0`17D z?tca!4`)VJTmW+lD9q6u1=J2mFL4(6S)wmEMR~1a;~$E4!|Ij`-kkr6{2QXHz;iMF zh6U9yf3kpiUMyG0VKhM0M1GIDheCVLy;e%Yd1r+FZK{9j@t@QUIfV1Jl!M9s-7t!z`U$VcZv|wTh|A&O$xHST)+s9iB^%DR{ z3Y1_pc5HMse15$C`q@UVcJ-16yX$;pow zl6j0&OAVhpr9n4!<*1uE7GE13X*-N3iuwiCw)u{~gn^ya0NZq;mfT!#o*%xJYt?aK zgF9SZTq=u52X%sg7Z6y0dtRd`%*`gQy1t>MHdYkAl_y&+JH3J&$ST!#=lklUsynpZ z&dsf`FVY1K%?cz3EV;;c5Nwqm%p1}@jsV^Y6kTG}{dr`_4sRj5b%eMWx|U322Td9` zNS9>VOQe?7rAuydH?UiIp$_M*5b!(XvJ)~EyEUF|O~I^zq9S0BNNmqCcgt(+78+Nq z$o%Un`_BOjsY=4>ifDv$jc*PsIxH0$|C|)*;o%V(X7VXQ1TFeyrYul)a(H+v+cC+1 zqO>v-g$S>Nd7G*Y+Mc4&fU8=KP!}1`c=csXTIgQMUubyf+lO1=Um7XR)R)zp#MXSUvvb}d|FXlHYt7UCSwL#~`*btEmgFDpWK>xi68O!)<<`FJ>8TUX%_);2+mm^{zF6Qm4?1pJut&|+aJhwR3QieE@tpBZ} zg7a*p54Tu`*~3GZe?E$Jh8T!vt|k*h0VE%A2V_bOE&Tnk?N-q|^GZcsowopRU2JMw zn)YSzR&UJ>Q+m<)E7oL0x_lg7I!FR#or#7^6A$_uT-EP1Kq;R4yhVqJqX%0Fyx7YO zf`8v;R3T(@=GzSV`%@gkAkvg%tSGZ*YNsH)oxX_b{#{2ITJ%d`R_P7008_e)8TDHe zo|SB$u+Pxb%*Cv(N6UJ@l{p5S|skMAw#4*Ci&vM2yuu%1WqpZR7Q+2hK9MPZ2`O6os}qVB?0T zXOWEH-Pidaq8fXYAN2aGd{c|7eZh-6p2ip+eo4W`IP)6hSj1Uk_7!5Upug+EiiRg9 z$eQ_^H?kr*SJijSV{t0JZa$Q@RfYco+AdVNf4RFMO{26I;d-ed7W%N#@^kL>! zeE@x%6ms*X$8G^YE^vaqh*ss_s?Cu%_j1TW({2L}s%r_rqmtYF5`waZQ9I3{^V3=Z zUido*k&JGi06w_{JG2>y0I`xllD31@#n0a#=}m#^wwd{sXAm#JeLSY?!GPX3ep~t(trLcFX53h=Q_X;h^N(3#&K?AQjB8)I0zZC)Ph~h%HE*L{9}*vo-XV4-IAtn$4zxP@8N?G z$L1$`dV1cvxSQrKf{M3Y}J6zaNj#0F52~UF9q!9}r>8BAdRdvvjq>-m%s>}xP z8=vkBk(W&Mfd6ih*L&Nf^zhL2Td8&t=8yx1`H`0^dcG-IH97`c%zD0q@~+ zW<+FNRTaBN&Ma+IVP}ZJP(=Onw?^rTWvVIFrU{?eGOXpQHdx5k@#}l&=Gf<5fk{$_ zy^&AZ$W?RT*WO#Pmw2&1+>%O~@2{YKe#06(f)EJ~2?@dBaLsp#17HHV8+ibB6e}#| zxKCA9>ysct%f35azjRj^KsIznfn`~ z&o8Tap*%%Oa=FjkB?e!jDmBLMik=x`hH$vR@z&3_(V8H#Qhr1sKX4_q*E4C;T3+Tz zYBR#O>yHVX=JZPGQ;y5vzSTMm3z;0~phcLuuAD~P^SP=G+>*8E00Q-4q1~pIuLldy z-6baS5aLDY?dO{h2w`WB@4eA)rxY8t#_q0dE87)gbH=yJ!GHRcdK6!WSO6_maXCijSBNlS4OS^ex9|6o7p3^klN`YQsHhtv9Ijrupp3F>YAG3X7h;kENflfgHtjQ}Y zzIS)dCgxo8?}!tEg}hL|>DBo8R!yauGdRu;)B9RO4vvvZ3$68YW5>!@P+~sG%?UAn z&v5YgYb%9c#C480h@&rI6~&XyMr+0}{m17*ykPCD_*U->- z%%d>-G}+}(dnA?H9cmnM4L*0+HFVCLwtkA=>yB7kPNG%E*%?U@ht3b)faZIz%PygzTM zHaGPm{&2?`9gg(ou~Jz@EeXiT$e5)--+~BXuuTZOwLi3QA2PJDja3`0a;cFVV=%gZ z+${%pCZ{ z50ojuJSDR(?LQC|3vo~K4=C;E_~imT`nU{+tp^1McQn;Wh30M@YWYD}DNt|b<$MWL zSH#qGKL5Fk@SK+T=gJq8+06a4@)7NO+wh$Cm&MH80v;jgaqt|Z2V*rfV_Y2GdY_Go z5u3egP$c`{qyN74AHIqM&92?= zKUt_K=iay^-ff>nSXga+NOTu_5G1B9g3{LZfDYYv95_XhcgmUzh8yThX8n3KezCrI zx(P28klgfK$8bH~5u^E?H4!`@{ss)Vj~_V1Yre$CzGMB{{sGd+@wN^JG9kdNtBIjF zaZ7nJ1)3Q&>EB!HK2rHKwhk4qxyS>|X1b9s z##L{!2*B)X4xX@raR5~+ z6mp89EYRh8x)i&Pv}JTP=t5f2NqhZ~LWHsJM<6BtUjPxY_`f;kr_gWthO)a-kW5bc O0xU1uqH9rC|N0-NvwuVY literal 0 HcmV?d00001 diff --git a/assets/image/3x/shopping_home.png b/assets/image/3x/shopping_home.png new file mode 100644 index 0000000000000000000000000000000000000000..3a195e711cb8f32eab5868c857c9402140f62a28 GIT binary patch literal 1977 zcmV;q2S)gbP)Px+b4f%&RCr$P+-qzURTKyC|G6`}OR?pl7O`NdV10xy&{nG?D#U2e7=w>iUb5Rt zsc336s4)R`eZ*(b#0N?Rc3Y`J@q>yI{i4K}AnF#PqKV3*f)7-zT4CMC%rR3%DYh~* zy}ho>-LF0OoO^$JGP^sya|!yTM1Yi3(M6!46*Yl|*3gOs6qV5(t)UeOC@P~nT0<)m zP*g^Dw1!qBps0-QXbr7MKv5ap(HdHjfTA+GqcwDIftvOjV@Go27=yB-{`ia7H}s^j zyEjgYX1!Q3gI?No)9?)Tmjw*!-kl2Vxv~6-l$RWSVspNur^X^f_M75L%jO0Gmoj6> zp9@V9(Owp`DnO|edPHp7z|9gV(e4< z{6ZdSTuwrt(_T}MI#4(h;KcwY9BC2G--)r84Dlc*%~+zb`RBvOys-1SG68;_nNRB{ z-_n`mn{RPb%TG+sL07I{FckYTOBj3ufMFgNl_V0YQDEMhsO^otW>>?-uxT}bWBbZU zgsl_Ga8?yHXFS$)6`niL3_5r9g3(Dk^RNw`1NQ%KHX?cpp+LiU(Y0$`?K;bmSi8M( z7KoQKP}Gmi=aykq&l&f0mn%7sK{)~a$2W?i^B8;|n5TGLLqFm4sW9k{WT<=nw%T=R z4Go|o9J1MaB z#3I~-qwUghW?TJuE6aC-xduQ;N*DK+geW`e7<_Y4xp6{Ckq90&*XYTu^;N>=7ABku zW^+)H4@q7WButxN;`HJ^uTJ^%VR-R|rqK649Jrj>eu9~gR|R}%oqz#MDK#*;#6ZyK zHG}+su54d09Le+|W?l%;e}a6F)fB)PqYRu=DllTmU)}xxho0Pa?KsNXPlJ1YO80k- zRNCMUZ*d{vqH+@@MLpR6V`%4oMQP_G5SB4=LpB(?m z%Qae&7F>Clr`)fEfDk1=8PK<-y~T!*x90)GsX zW+%QV+lFY=mX%m4bY(m|0Yr~8;}TgD{EzZ{0>-r+b@6v))t3hC{3qlWqWeK;Qu!l9 z7Q|tBY!JO@+uXRdPR@s;H0Y|8^{3f}{U(5tL0Y`pw1gy+IB(0mRUgPGEDgG%wLSvd zj>(u*uH+!bor${my)xz_4Z5-=;#`}XWK1e&auBWU2*+m1n2$W@c-`|1o+V>axsrnj zZzRI;=`!Y{q5nluL(6C}7dbSv3nUpK8d`>;iyRu-1(J*q4J|{_MGg(^0!c=QhL)k| zB8P@{fg~eDL(5QfkwZhfK#~!np=Bt#$f2QKAjt^P&@vQVwwa%gB5 zNHRi>254tL#WzG)PNwmOB?|V4Y?}MRv&}3agA!s)gY$q9^GW?aD(6u@@1Y6U%8Z3x z_f<@aMJ5SB&w%CZ^UH5&LK2|cI(Cj*=6R=3G%6~}I>R754(39S4g8Pr{Dua;V;D7C zA}ina169#BzY>}3D>C+%}Hdu zZ`-JWiRA_~VLt-ql#bae zJ{;hBdWOr}61IH7aD+0=Ok6X-o&GriO@s}>0^^!ZwJU$jDQE|`sl&F$-NQzWwXJO7G7Tp4OF{9B}XA^Cr-vZ|+8vQNulnqUx zVc-Ay4w$QaKz9=%ZW@^-ZV$t9TSGeZLF``*V}@;84*@83I~gZV5Y6}?9DCWzn8RZ$ zTI#L_^BONX2=pxxFHV!S_QQG4?e{X)P3)jRA1pkz{rbZ0RPs98;u!=uhn@rp)ca9) z08DHXJBOIi(vC<>%HtVlw$?XT%r^r(f|&ks!We@sFfyQ?+p!zcX2Fvm%^93yex!cu z__ue}xt#n2j5bU^uey`vghLn{(cR7Q8ShE^n?sEqDt z4XsE(Q5oIQ8d{NnqB6RpHMAlDMP+nHYiLCRipuDY*3gOs6qWfM@~b|GMK~K!00000 LNkvXXu0mjflUJw1 literal 0 HcmV?d00001 diff --git a/assets/image/3x/shopping_home_h.png b/assets/image/3x/shopping_home_h.png new file mode 100644 index 0000000000000000000000000000000000000000..9d59d24a06d685d7d84fb484b4e91495727c81bc GIT binary patch literal 3007 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 CT@Szj literal 0 HcmV?d00001 diff --git a/assets/image/3x/zt_zf.png b/assets/image/3x/zt_zf.png new file mode 100644 index 0000000000000000000000000000000000000000..2317bed03882c90ad1516ea01eb93f451cb04a4f GIT binary patch literal 6213 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 literal 0 HcmV?d00001 diff --git a/assets/image/3x/zu_tuan.png b/assets/image/3x/zu_tuan.png new file mode 100644 index 0000000000000000000000000000000000000000..c523aa9e31f3977e759a6a8298e8348db91df7ef GIT binary patch literal 4764 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 h0ZGnGpdSxUP&|p9`mjRNe|8f9q^zySoi<{ literal 0 HcmV?d00001 diff --git a/assets/image/goods_cart.png b/assets/image/goods_cart.png new file mode 100644 index 0000000000000000000000000000000000000000..7be4c8ebb3a0550c1b83df7950e24c0038ebc2b2 GIT binary patch literal 498 zcmVPx$tVu*cR7gv;)lY~|VHC#k&ooR^L~2qRWkE4nu$dhTC1XLdQc9E+L!`)JYGgxA zQ?sGSLZM_~Ln+Fig_R98Gm%oGkd4LEEacBjr{1aC>;37@@6XxYI`8wn_j%5HZkG;M z7cOHxSd+rk&tO5Ft7g^sYOy_{;nMH_S#01XN z0DO(Nt@QO^E_6zODZInsbfCKi;4kJYeVg$fr%Qk*Sc#oAgd4Ri4$Gbr;3kH!;XfIa zJg>seVLUWSfDw$MH#LDVMk#~b^BnLJD`EmmfL(YVmjthy z%poj{ERU4{o6;?g`|z_#z&c#OSP8HUchJ|QcpUqUv-nT~w4nR%(MEvXh*^%2on8WQ zHDbwqOWR<+1XzoiG^VjnVjtD5STV7QqYmLg2@nAVU^%{EeO-0j!tvC91a})*bPxy9 o&*#k&05KSsl0{eXr{f_n0K^7N@&U(`Q~&?~07*qoM6N<$f{M!Ad;kCd literal 0 HcmV?d00001 diff --git a/assets/image/goods_phone.png b/assets/image/goods_phone.png new file mode 100644 index 0000000000000000000000000000000000000000..435f12247db93a26e1b442ffac78216a1c5654e0 GIT binary patch literal 852 zcmV-a1FQUrP)Px&4oO5oR7gv;lud}1RTRh1J?Gr}K23;)o1jIeVJ(EPX!@dEi^RnUnG9Bx777(X zR8U%yRER-=n-QZ3MNDYIg@gosKy3^y=u29a(4wFmE5x4no{t+hW`@_9d2Qw$y1NJN z`Tw4K&j0)a{Ld%!(O(7te*?gU#qwtXn0bf0?*xFeL^L8ICl>>`2*AwGn%N#^e%H)~ z0bprLX}E3MGlN2=0Wroks`>>YzHermI-SnSobxFnI<2aA0e}qxnFbKiu~N#gyRQO( zKdV?uX;efGGxJj-vUf3nC5SkIh`Uv__J8^i(FdiJ+uZ$H0QhU6kbhs$G|e^LZuduK z-YOz*_ll&HMsm(aQ%W0i&f^0C0Dutjw-CZHGka)KWQd5~aQDq2gqE3a%{l)tC;*6P zpSwR?N?8E_zr+}~iO4=8ddtjS27sRzDqinT54mZY72R(4G$I}}v#l}4VO2drM9-<} zYlDbi1gIa(yvNL*A)>og^;04mclWgwmUI4o5Xj6;9zw(~0bt18Z=RgZ*8ni#?sovd z9}9)dii#NHO{)4iBAzg_dzkrlGy9N;zEah7y^xgB4FIq@=loGW_?%%EV|-9m4>0oq z5!sSbT3;6~gm8wL@5?!V*EG%Yob$KtemNqZBchi?WNhZf_e;~d#kF83Gw&CX$C&v} zcYm*xvXqE+l~S&E_tBKn2338$&Z@pT#(00*wm(g^vM*pVDqazh?TC2D%pL)NWs`Ou zDWz0vkD1vMJ+U$tLJ%TaCnBe2xoEBdGV}9h_9`NNVrHWN@OzB$764cyA_oDWovQ0} zI@gKFaR6B2?scCoT=E4|g(;;6L}Y&m;VdFJCmof7$GkdbS1rf&)@v|B)?*3>g zX_lJY7l|t*#0oI3gZL#20hU-}KhayG4Cq)HKc2ZQD)&!1=lE eEEe#e$?*?A)O08xspw(=0000OEZ?LoED{ zPIBaGFyLV^XRn`bcd+@Fz-#9#&Hfp6&lQCN1Tq&2bXk^fpL|zfjjXM&feY<$-?#cLsV u(pbwo+TN}Dc=K+lhbiN&+5fZmFl-Dk5#0Xe|5~6^7(8A5T-G@yGywp=!AG0` literal 0 HcmV?d00001 diff --git a/assets/image/kan_jia.png b/assets/image/kan_jia.png new file mode 100644 index 0000000000000000000000000000000000000000..dc91e94c3d18a131718bead8a7726b4c9b06a37d GIT binary patch literal 898 zcmV-|1AY97P)Px&JV``BR9HvtmrY1iQ51l`H~y85l@PfIF=HZ0HyKFOrbsHNprRm>%xqyvgkWJs zP}If>q958wYGq|a5fqr#LRy7|6$%xB21B$+`XSS5#+iv@cZTOUciww5Eet%X_ju== z``vTSJ@-6=NhZc5<6#QODkJ}8gwlXQV3uZgzkoNu53AkV`5rGqslXAS7Ra%1CQwbl zVPMG4!a5xtkPEm2Y;x%QIj|b|=Fl#pt^?W)Tvl4LKX{$TK zowb)hp!Y>pYiB%I9Z)w=3XB3vfgXz;=K)WEf@mnuh4LBMGt(X#A(jDt|A;TQujb}g zrzsl-GJ&Ts<|r)1zz0oA@_{ZhR8HBVE%SDiwka40F<|)83wx>?{Z4^G%HXl833)vO z8~_G^5(O6RHv;9Fmd1kmHNLEZ+38Bj>kqnC_Ej|xB$BdNK;kHzlI=j7#&N!DdU}_q zuB^cAnG;sA1tZG38j1x}1Dpe111oeVX<<`UcBU)v$S@44JrUb5PJu)}1Nf~A`4~)U zup?444q*}j(x%@gjP$o)A~hsNl1_6`CkwMyHQQ&vI^bt4hq@Y)J|TBkKj4YCqrWv1 z>@bW-d(hR)Y2cvpbqYA-1n2>5-@T&WVVu~Dso;8eK8NOtq4WK z_&yKgZSAi8{>m%P<4H8kMPPqC152P-Fz*^V@C^>h2qBlO>^_z_h7l)mfr@U|xYLJ6 zI?YY*?aB7`k^WD66oC#ZAs9=bl9tNj7#vfJn>%m=P;Y{&0B)&wIo9$Vt{KZTnZp}5 zLW^4}w_$JtLf+9}%Bra0$_ypr%1d=|E-^*k5sYPoM4`BOSDq_%^h<9=tBkeLasoK2 zN&Q)%&Z6iie6}oV8xG~SM;4Z!0vRvlhd>6oaaWBEKVvHY0?6)Kw)Ccetim)EA*%@e Y0s5UXG(IX;ga7~l07*qoM6N<$f&+nwQvd(} literal 0 HcmV?d00001 diff --git a/assets/image/ms.png b/assets/image/ms.png new file mode 100644 index 0000000000000000000000000000000000000000..7b605f265d0810330ab5faa73146bdfa00f1ffd2 GIT binary patch literal 2348 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 AWB>pF literal 0 HcmV?d00001 diff --git a/assets/image/pin_t.png b/assets/image/pin_t.png new file mode 100644 index 0000000000000000000000000000000000000000..f37d4a9d05cef87e855fd8be1d4805e79b914cc9 GIT binary patch literal 1978 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 literal 0 HcmV?d00001 diff --git a/assets/image/shopping_cart.png b/assets/image/shopping_cart.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3fe614a0851bead577c8d88767a367370df642 GIT binary patch literal 733 zcmV<30wVp1P)Px%mq|oHR7gwhmQ6?$VHn5%&#ojINc5$3NvT7LSUV9ymm=uarNm%`ns<^kDy(Y| zv0b8DP*m!nd1sA1Y#-D?I)vdN$V)Ry9~wv`dQqalzA$#)C)SVLWZapZmAp8|_j#WG z@A;aUm#{()tq>Qh;Q!Y7WodQlL+eJAU}y98u9rbG_XNk1#sPNSgONxC%>4D+)MV#K z`?F~;(e!9rt#Y{+KoyAOaP^j!1SOPT0-j(^>Vp8)F9h>>TUfUji_Jk_0H~a|5y2X& z-g?Rpz7)8Xna+Z^fu0nV~4-*4d}KheCm~L7Ft)1H6kFPl@=8Ujhuc3V1#!tn^a8 zzOBv%#-yGiP+WnJ3<#^o4;;iE2&|dnA_zAa=p*o3UtuPffR5LO94@NjeWs{#30dF< zU+A0zgD*J3TJp0QsN$?vT`FE#GF{q8#N)&?>6L(rP$elYL)0B{K8_6_(U&Qz;+Z*{ z`a>dWWbk)lI&2&ApI1yX#W5zN0A52(mu*8{%h#Pi71t+EY%WpJiN8XGJGL&*=}Qyg|(?@FcOGp+k_3mZe*_pK$9b^N4df=X6gIt0><;JsR{MAW;aK P00000NkvXXu0mjf2J=uv literal 0 HcmV?d00001 diff --git a/assets/image/shopping_cart_h.png b/assets/image/shopping_cart_h.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1a3293ce0da4d662286ee8deb2efeec5e886c3 GIT binary patch literal 843 zcmV-R1GM~!P)Px&1xZ9fR7gwhmQP4jQ543{xpSuxODagRlqiDG2uuom_smcVQ5i+iLWooAczraKxXcHh($z^v?`_oAtQ(u=Dd62#Y~JkId4Wt0`K;o zbAIo9_uTJ3gaul-KwMY^|1;(PZ>dK|M^|MsnR?5zl71zd)$#D~aJ7{3DFAE%_&t2z z0pK(d^%W}WIL>Bcj2B;ni2asj9YaJ@>;q-PvaF6`@IoE0ky1Vf00#irb=@v0Wzu!swu*|1k2%29)YM959>|C0 z!3TrEU~e!O%rrJO{wUOa!Qo0I66-^u&{hEGLd0GGh%)nzV)D)0XJ(0r?}ZS%EXx|t z-=A};ZQDM_%*%-AY^l&(yw>_LGxvwX;fKD#j^pez#+)Rgz2$&ovDlK@+S*TnK%mL8 ztUt%()ta;8WHPx{2=Ri5YRUoIwtaw^PZ3ee%>1GTqO~43#xzADkVwbu6lV7Sm# z^aG9~;&r9elTyI(czkJ9RaJU&a&l8^YwMSiJ5Hrimk{wA5%rV;b{waZnfEBA4*I@M z`GH#NqX2M72yx#SbHfiD5d||NGq;7q;n!t>ZQE{O=10sNMZ`fwj243%V}26RTSRpK z7F+a;nOWGjJ>k0Uwm=}@xtX6O0YK+$x2%r6B(3#bW)2|Y13y#%s04t1B3fQ{$6jJ0 zkysH5g=_$*_xu|GUIM^$3q)MU%ney@_+X4VABjXfFE6-?O6_H3jo_LP;tVq@0BBK4 zZO>KAUY#*!?h`^x7-KF-DI?9z&F|(5z6}6lN~xP!>Awmg8gj<3wcZH;Jw!y={X2;G zMk#e`USO^Dac`Px%AW1|)R7gwhmd|SwQ4q(!^LAU<60xGFP_3>9g({Ln4=PBDq96(e!J?LS-xg62 zq(}b>MetDTuYHM!R{VjY2R%qnrGnT^4<1CQ6>{>VRD_21jVxG5Vj}yJU@zI@?#z5< zzB9A$5mxD;RpO!r{%^|HCH0mYXPxz(&QXg5QL+8)hs$?dpB+inB66@Al0CoZ^SuNwnT_Svbg+pZJnDo}e9cB~U$GP^C;7SuR+@95x0%ds92 z&=+U&HYW&~9vcZq)L(JbPk^2Q=#B$jv2ogf?oJvWKN$qZQYQm>Oc1}Q>}UK0c!_~? zq0Bz5=2LUHQp$Tzp#AYde_Jy6V<@wGjKFCn3jn$r0R#9pBh{uBI8vZyk6TjLIb_Wo zE`IfMvFPi?4GU2+_Szqb4i@(SWU3_BJTNoPhrXI9g`{)x3^c0!D9phr<$WU1&dMq@ zqd)Jf$EEL+S^uPx%nMp)JR7gwhmQP4jK^(`w-}fvH53U_Iq=cdpLpoH>%%-=3ibCmR9V#TFL#OE9 zC5Rw{z{2vHMF*8cC=fcxde}E_!LSfE5DK9JPlXVXvO2$bpdripcO@@7$H&ZkX1?=% zU%td94Q>(_Meu)9e$7&6GMTMYQ&TrcHUXfByotx-?bX%Q(?Jj@k{tkk18CD)e_rY) zYXXmsj>czZX8J{B5|uw*bU^->-7c?FR5zDWwVmhhcaHz+Dl!ptXLNZ?hl>8c6m5c;cK(`o7<>Zt&pX zU}qDNc_s3k{28V!5IKo zjWNg916^2StsNlQqm=4h6*vsTRse^UQkM$>2SM-*K*ku;RRrgKBe zDvWuacfP*9eykvHDwR4%@}x1QW${Mobh^el*Qd3v%>jG>aM2hOrQN?_t?ec`td#0r z)qk8!CU=#Um8C_bMr*wwDMm&{YO~pF&uYNQWHMG-TKWk42B65f1 zcu7f#o12?E7Trv1U7vHaVUn*r&l{SZo%Nz(K=QtGZpavOGhg~G+d!9) z;D>YWY9f(%pCk1l09_=v1BhD5cM*B6wSHMp5hx_Di{J$X*3>dLQu0j${{=o0M=q6@ RWn};W002ovPDHLkV1k}dNSFWs literal 0 HcmV?d00001 diff --git a/assets/image/wx.png b/assets/image/wx.png new file mode 100644 index 0000000000000000000000000000000000000000..ce737166f04d57a46655dee38a77071938c703c4 GIT binary patch literal 763 zcmVPx%wMj%lR7gv`l}V_MVHC%Ie{l*D*mgT$ComisC#k$D$S;8H6~HQBgrxhn>jOU|ea#-WU0c%kbY^P`sJEoI zg&?xs7I+9ulvHZFUiyA7sZZ{p?eV~IV4kFdwj;QUzynE(ssgMA#z-2KBC8AB0|GEO z1Blum1r|!$mwbl+7l2lhKIVf&24}-b()P?{wW4y8T&YAQagpsVz+@mYoCTZ)t^y|| zJ<6U5z%5{#q$AZS!ge!Y2QVEd1#U#9KyzRaFd8@(LXi~z2|(2Gl%!BbL9^WkxD4C} zmPmSD+1Ymc6hPl3m=^)q1oV;=gO%4(LocP~FNo6FuA5a^_~c5OB;Owx8lK&NyTA}h zw+m=L6toNIF6p!F5XN$#WBQJsJqGqm+K`lZ2UwSzgP7h)z%WTMxfRTIsOGt(^+`P= zlmGHe)DggWNoSJJN?{)-{lo(3$=0@ea+fLA~V;3W{Mi28>`bD$RB%=nBv?3up{{lk};8l4c|&O_daf^P25=L(T!4CGDuui)MRH zf}8+CS!FQ`v1NfCX-?uDc`IpQL{K9@l3$1*Bsdjl4SWC^M)p7~yy#)MqzIvgnzlF@FuHuG#+u@DnboFG#Kdp+o=x002ovPDHLkV1f_QNksqv literal 0 HcmV?d00001 diff --git a/assets/image/yq_zt.png b/assets/image/yq_zt.png new file mode 100644 index 0000000000000000000000000000000000000000..38c8173fa8545f5573b6e3799bc018d91882d87b GIT binary patch literal 1106 zcmV-Y1g-mtP)Px(3`s;mR9Hvlm}_hlRTRhnXBVW6MT)Q>A;E2F3N{X>j8@gHww$T?=Dghu<{nYM-z_bD&=2DE0G=U`B_9lC06&3gOQb2@h{i@W7ideH zq#R21HO~{fKL@xXmrb(QQWulDArjbi$f_Sppx%&N@G$Thh*!g61jPW%VA_5Sc=tk3 zxh+~R1eJCMJs>_ngt;PTcK&C^DKJ$>-VDXe>`g&6NOJKp0JH5tNZty8Fq5FMt}$p>{s~GZOtVTbysrD|MXdbcV=y#X)s0h++ByihKv=78Lvfx%HH%1vO$$VD}ff+1x+wxOZ#`& z@U-91g%A|n7Ln_35ruPOJpi)S# zCBj#toEm|CbbLE{`(rqBC5kyy%1~N79UsgOWVsVXR5M^kT_mV%O&Mo^`V{$F0B_g@ zjo#?RwSik$_v2=4Tk;+z7L12ir{JuB0@xjvm6b-I?Erit&@nDI>X&|q*^|6kONSCF zp4al{60V6k@| zUhvLC(F29UX8nH;Wco2^A+VcVd4}D}Ik(#mh4n z;HA>}!!Mw{%(D$^4Yy)oFd{1jwn5tip)BXjjMG?`Usk87( z`64{-Db2Ep-x)yF9-E*(MVxv)&~yqd&8K5MkfxMpq<S0Ys__ z95K>K!8&3{maZ>JHAuL=0F8DQb)UwL8Di*!LGDQP{%?=QM|CFIHx>?Z?Yq9WmW~1a Y2hoQQNmHe8J^%m!07*qoM6N<$g6(7ViU0rr literal 0 HcmV?d00001 diff --git a/assets/image/zt_m.png b/assets/image/zt_m.png new file mode 100644 index 0000000000000000000000000000000000000000..ff7cfa4b39b138d955f78b05f3f1ef57344aae4d GIT binary patch literal 1535 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 Rwu=A&002ovPDHLkV1i~G0j~f6 literal 0 HcmV?d00001 diff --git a/lib/community/community_course.dart b/lib/community/community_course.dart index 21cfa78a..1c6abc9f 100644 --- a/lib/community/community_course.dart +++ b/lib/community/community_course.dart @@ -239,21 +239,6 @@ class _CommunityCourse extends State left: 0, right: 0, ), - if (brands != null && brands.length > 0) - Positioned( - child: Container( - color: Colors.white, - child: StoreTitleTab( - brands, - globaKeys, - scrollController, - isScroll: true, - ), - ), - top: 0, - left: 0, - right: 0, - ), ], ); } diff --git a/lib/community/community_view/class_details.dart b/lib/community/community_view/class_details.dart index ddde6b88..9377d1b5 100644 --- a/lib/community/community_view/class_details.dart +++ b/lib/community/community_view/class_details.dart @@ -45,6 +45,7 @@ class _ClassDetails extends State with WidgetsBindingObserver { bool isShowImg = true; int chapterIndex = 0; double height = 0; + var isShowMore = false; @override void initState() { @@ -179,7 +180,6 @@ class _ClassDetails extends State with WidgetsBindingObserver { ], ), Container( - height: 123, margin: EdgeInsets.only(bottom: 16.h), padding: EdgeInsets.only(left: 16, top: 16, right: 10), decoration: BoxDecoration( @@ -200,7 +200,7 @@ class _ClassDetails extends State with WidgetsBindingObserver { Row( children: [ Container( - height: 22.h, + height:26.h, padding:EdgeInsets.only(left:2,right:2), alignment: Alignment.center, decoration: BoxDecoration( @@ -290,14 +290,47 @@ class _ClassDetails extends State with WidgetsBindingObserver { ), Text( course != null ? course.introduce : "", - overflow: TextOverflow.ellipsis, - maxLines: 2, + overflow: isShowMore + ? TextOverflow.visible + : TextOverflow.ellipsis, + maxLines: isShowMore ? 10 : 2, style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.regular, color: Colors.black, ), ), + SizedBox(height: 3.h), + GestureDetector( + onTap: () { + setState(() { + isShowMore = !isShowMore; + }); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + Text( + S.of(context).gengduo, + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Colors.black, + ), + ), + Icon( + (isShowMore != null && !isShowMore) + ? Icons.chevron_right + : Icons.keyboard_arrow_up, + color: Colors.black, + size: 18, + ), + ], + ), + ), + SizedBox(height: 3.h), ], ), ), diff --git a/lib/community/headlines/article_page.dart b/lib/community/headlines/article_page.dart index 7a1fd383..f3b7870f 100644 --- a/lib/community/headlines/article_page.dart +++ b/lib/community/headlines/article_page.dart @@ -10,11 +10,7 @@ import 'package:huixiang/retrofit/data/article.dart'; import 'package:huixiang/retrofit/data/banner.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/brand.dart'; -import 'package:huixiang/retrofit/data/category_select_list.dart'; -import 'package:huixiang/retrofit/data/collect_class_list.dart'; -import 'package:huixiang/retrofit/data/course_list.dart'; import 'package:huixiang/retrofit/data/headlines_list.dart'; -import 'package:huixiang/retrofit/data/headlines_list_details.dart'; import 'package:huixiang/retrofit/data/page.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/utils/event_type.dart'; @@ -205,21 +201,6 @@ class _ArticlePage extends State left: 0, right: 0, ), - if (brands != null && brands.length > 0) - Positioned( - child: Container( - color: Colors.white, - child: StoreTitleTab( - brands, - globaKeys, - scrollController, - isScroll: true, - ), - ), - top: 0, - left: 0, - right: 0, - ), ], ); } diff --git a/lib/community/headlines/headlines_collection.dart b/lib/community/headlines/headlines_collection.dart index 07c48dfe..d26ff83d 100644 --- a/lib/community/headlines/headlines_collection.dart +++ b/lib/community/headlines/headlines_collection.dart @@ -15,7 +15,7 @@ class HeadlinesCollection extends StatefulWidget { final List headlines; final List
articles; - HeadlinesCollection(this.headlines,this.articles); + HeadlinesCollection(this.headlines, this.articles); @override State createState() { @@ -38,18 +38,18 @@ class _HeadlinesCollection extends State { Widget build(BuildContext context) { return Container( height: 60.h, - margin: EdgeInsets.only(top:10), + margin: EdgeInsets.only(top: 10), child: ListView.builder( scrollDirection: Axis.horizontal, physics: BouncingScrollPhysics(), padding: EdgeInsets.symmetric(horizontal: 10), - itemCount:widget.headlines == null ? 0 : widget.headlines.length, + itemCount: widget.headlines == null ? 0 : widget.headlines.length, itemBuilder: (context, position) { return GestureDetector( onTap: () { Navigator.of(context).pushNamed( '/router/headlines_column_details', - arguments: {"id":widget.headlines[position].id}); + arguments: {"id": widget.headlines[position].id}); }, child: headlinesCollectionItem(widget.headlines[position]), ); @@ -61,7 +61,7 @@ class _HeadlinesCollection extends State { Widget headlinesCollectionItem(HeadlinesList headlines) { return Container( width: 225.w, - height:60.h, + height: 60.h, decoration: BoxDecoration( borderRadius: BorderRadius.circular(4), boxShadow: [ @@ -75,7 +75,7 @@ class _HeadlinesCollection extends State { color: Colors.black, ), margin: EdgeInsets.symmetric( - horizontal:6, + horizontal: 6, ), child: Stack( children: [ @@ -97,73 +97,76 @@ class _HeadlinesCollection extends State { ), ), Container( - padding: EdgeInsets.only(left:12.w,right: 12.w), + 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: 16.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, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right: 4), + padding: EdgeInsets.only(left: 2, right: 2), + height: 16.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, + ), ), ), - ), - Expanded(child:Text( - headlines?.name ?? "", - overflow: TextOverflow.ellipsis, - maxLines: 2, - style: TextStyle( - fontSize: 15.sp, - fontWeight: MyFontWeight.semi_bold, - color: Colors.white, + Expanded( + child: Text( + headlines?.name ?? "", + overflow: TextOverflow.ellipsis, + maxLines: 2, + style: TextStyle( + fontSize: 15.sp, + fontWeight: MyFontWeight.semi_bold, + 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, - // ), - // ],), - ],), + ], + )), + // 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, + // ), + // ],), + ], + ), ), ], ), ); } - } diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart index 56650179..32610b00 100644 --- a/lib/generated/intl/messages_en.dart +++ b/lib/generated/intl/messages_en.dart @@ -535,8 +535,10 @@ class MessageLookup extends MessageLookupByLibrary { "wodegongju" : MessageLookupByLibrary.simpleMessage("我的工具"), "wodehuiyuandengji" : MessageLookupByLibrary.simpleMessage("我的会员等级"), "wodejifenzhi" : MessageLookupByLibrary.simpleMessage("我的积分值"), + "wodekanjia" : MessageLookupByLibrary.simpleMessage("我的砍价"), "wodekaquan" : MessageLookupByLibrary.simpleMessage("我的卡券"), "wodenianling" : MessageLookupByLibrary.simpleMessage("我的年龄"), + "wodepintuan" : MessageLookupByLibrary.simpleMessage("我的拼团"), "wodeqianbao" : MessageLookupByLibrary.simpleMessage("我的钱包"), "wodeshengri" : MessageLookupByLibrary.simpleMessage("我的生日"), "wodexiaoxi" : MessageLookupByLibrary.simpleMessage("我的消息"), diff --git a/lib/generated/intl/messages_zh_CN.dart b/lib/generated/intl/messages_zh_CN.dart index e1d59ac9..4354f664 100644 --- a/lib/generated/intl/messages_zh_CN.dart +++ b/lib/generated/intl/messages_zh_CN.dart @@ -533,8 +533,10 @@ class MessageLookup extends MessageLookupByLibrary { "wodegongju" : MessageLookupByLibrary.simpleMessage("我的工具"), "wodehuiyuandengji" : MessageLookupByLibrary.simpleMessage("我的会员等级"), "wodejifenzhi" : MessageLookupByLibrary.simpleMessage("我的积分值"), + "wodekanjia" : MessageLookupByLibrary.simpleMessage("我的砍价"), "wodekaquan" : MessageLookupByLibrary.simpleMessage("我的卡券"), "wodenianling" : MessageLookupByLibrary.simpleMessage("我的年龄"), + "wodepintuan" : MessageLookupByLibrary.simpleMessage("我的拼团"), "wodeqianbao" : MessageLookupByLibrary.simpleMessage("我的钱包"), "wodeshengri" : MessageLookupByLibrary.simpleMessage("我的生日"), "wodexiaoxi" : MessageLookupByLibrary.simpleMessage("我的消息"), diff --git a/lib/generated/intl/messages_zh_Hans_CN.dart b/lib/generated/intl/messages_zh_Hans_CN.dart index 63b3f40c..b7c0d583 100644 --- a/lib/generated/intl/messages_zh_Hans_CN.dart +++ b/lib/generated/intl/messages_zh_Hans_CN.dart @@ -533,8 +533,10 @@ class MessageLookup extends MessageLookupByLibrary { "wodegongju" : MessageLookupByLibrary.simpleMessage("我的工具"), "wodehuiyuandengji" : MessageLookupByLibrary.simpleMessage("我的会员等级"), "wodejifenzhi" : MessageLookupByLibrary.simpleMessage("我的积分值"), + "wodekanjia" : MessageLookupByLibrary.simpleMessage("我的砍价"), "wodekaquan" : MessageLookupByLibrary.simpleMessage("我的卡券"), "wodenianling" : MessageLookupByLibrary.simpleMessage("我的年龄"), + "wodepintuan" : MessageLookupByLibrary.simpleMessage("我的拼团"), "wodeqianbao" : MessageLookupByLibrary.simpleMessage("我的钱包"), "wodeshengri" : MessageLookupByLibrary.simpleMessage("我的生日"), "wodexiaoxi" : MessageLookupByLibrary.simpleMessage("我的消息"), diff --git a/lib/generated/intl/messages_zh_Hant_CN.dart b/lib/generated/intl/messages_zh_Hant_CN.dart index f3a037d6..66265693 100644 --- a/lib/generated/intl/messages_zh_Hant_CN.dart +++ b/lib/generated/intl/messages_zh_Hant_CN.dart @@ -532,8 +532,10 @@ class MessageLookup extends MessageLookupByLibrary { "wodegongju" : MessageLookupByLibrary.simpleMessage("我的工具"), "wodehuiyuandengji" : MessageLookupByLibrary.simpleMessage("我的會員等級"), "wodejifenzhi" : MessageLookupByLibrary.simpleMessage("我的積分值"), + "wodekanjia" : MessageLookupByLibrary.simpleMessage("我的砍價"), "wodekaquan" : MessageLookupByLibrary.simpleMessage("我的卡券"), "wodenianling" : MessageLookupByLibrary.simpleMessage("我的年齡"), + "wodepintuan" : MessageLookupByLibrary.simpleMessage("我的拼團"), "wodeqianbao" : MessageLookupByLibrary.simpleMessage("我的錢包"), "wodeshengri" : MessageLookupByLibrary.simpleMessage("我的生日"), "wodexiaoxi" : MessageLookupByLibrary.simpleMessage("我的消息"), diff --git a/lib/generated/intl/messages_zh_TW.dart b/lib/generated/intl/messages_zh_TW.dart index 738e14c7..d615c30d 100644 --- a/lib/generated/intl/messages_zh_TW.dart +++ b/lib/generated/intl/messages_zh_TW.dart @@ -533,8 +533,10 @@ class MessageLookup extends MessageLookupByLibrary { "wodegongju" : MessageLookupByLibrary.simpleMessage("我的工具"), "wodehuiyuandengji" : MessageLookupByLibrary.simpleMessage("我的會員等級"), "wodejifenzhi" : MessageLookupByLibrary.simpleMessage("我的積分值"), + "wodekanjia" : MessageLookupByLibrary.simpleMessage("我的砍價"), "wodekaquan" : MessageLookupByLibrary.simpleMessage("我的卡券"), "wodenianling" : MessageLookupByLibrary.simpleMessage("我的年齡"), + "wodepintuan" : MessageLookupByLibrary.simpleMessage("我的拼團"), "wodeqianbao" : MessageLookupByLibrary.simpleMessage("我的錢包"), "wodeshengri" : MessageLookupByLibrary.simpleMessage("我的生日"), "wodexiaoxi" : MessageLookupByLibrary.simpleMessage("我的消息"), diff --git a/lib/generated/l10n.dart b/lib/generated/l10n.dart index 5976a619..c61964fe 100644 --- a/lib/generated/l10n.dart +++ b/lib/generated/l10n.dart @@ -5635,6 +5635,26 @@ class S { ); } + /// `我的砍价` + String get wodekanjia { + return Intl.message( + '我的砍价', + name: 'wodekanjia', + desc: '', + args: [], + ); + } + + /// `我的拼团` + String get wodepintuan { + return Intl.message( + '我的拼团', + name: 'wodepintuan', + desc: '', + args: [], + ); + } + /// `并使用本机号码登录` String get privacy_policy4 { return Intl.message( diff --git a/lib/home/home_view/shortcut_operation.dart b/lib/home/home_view/shortcut_operation.dart index 82e76630..771ae260 100644 --- a/lib/home/home_view/shortcut_operation.dart +++ b/lib/home/home_view/shortcut_operation.dart @@ -46,9 +46,20 @@ class _ShortcutOperation extends State { }, child: Container( width: 106, - color: Colors.white, margin: EdgeInsets.only(right:10), padding: EdgeInsets.only(top: 8,bottom: 8), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(4), + ), child: Column( children: [ Text( @@ -84,9 +95,20 @@ class _ShortcutOperation extends State { }, child: Container( width: 106, - color: Colors.white, margin: EdgeInsets.only(right:10), padding: EdgeInsets.only(top: 8,bottom: 8), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(4), + ), child: Column( children: [ Text( @@ -122,8 +144,19 @@ class _ShortcutOperation extends State { }, child:Container( width: 106, - color: Colors.white, padding: EdgeInsets.only(top: 8,bottom: 8), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + borderRadius: BorderRadius.circular(4), + ), child: Column( children: [ Text( diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 32b382df..650ff5df 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -584,6 +584,10 @@ "invite_code_error": "邀请码输入错误", "yaoqingwancheng": "邀请完成", "xuanji": "选集", + "wodekanjia": "我的砍价", + "wodepintuan": "我的拼团", + + diff --git a/lib/l10n/intl_zh_CN.arb b/lib/l10n/intl_zh_CN.arb index 0151ed71..744b1ff0 100644 --- a/lib/l10n/intl_zh_CN.arb +++ b/lib/l10n/intl_zh_CN.arb @@ -581,6 +581,8 @@ "qingshuruyaoqingma": "请输入邀请码", "invite_code_error": "邀请码输入错误", "xuanji": "选集", + "wodekanjia": "我的砍价", + "wodepintuan": "我的拼团", diff --git a/lib/l10n/intl_zh_Hans_CN.arb b/lib/l10n/intl_zh_Hans_CN.arb index 17bdfa3e..8a557bd1 100644 --- a/lib/l10n/intl_zh_Hans_CN.arb +++ b/lib/l10n/intl_zh_Hans_CN.arb @@ -581,6 +581,8 @@ "qingshuruyaoqingma": "请输入邀请码", "invite_code_error": "邀请码输入错误", "xuanji": "选集", + "wodekanjia": "我的砍价", + "wodepintuan": "我的拼团", diff --git a/lib/l10n/intl_zh_Hant_CN.arb b/lib/l10n/intl_zh_Hant_CN.arb index 811a8988..1e789568 100644 --- a/lib/l10n/intl_zh_Hant_CN.arb +++ b/lib/l10n/intl_zh_Hant_CN.arb @@ -575,7 +575,8 @@ "qingshuruyaoqingma": "請輸入邀請碼", "invite_code_error": "邀請碼輸入錯誤", "xuanji": "選集", - + "wodekanjia": "我的砍價", + "wodepintuan": "我的拼團", "privacy_policy4": "并使用本機號碼登錄" diff --git a/lib/l10n/intl_zh_TW.arb b/lib/l10n/intl_zh_TW.arb index 91303103..7cb58780 100644 --- a/lib/l10n/intl_zh_TW.arb +++ b/lib/l10n/intl_zh_TW.arb @@ -575,6 +575,8 @@ "qingshuruyaoqingma": "請輸入邀請碼", "invite_code_error": "邀請碼輸入錯誤", "xuanji": "選集", + "wodekanjia": "我的砍價", + "wodepintuan": "我的拼團", diff --git a/lib/main.dart b/lib/main.dart index 72f074a7..bf494de9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -51,6 +51,14 @@ import 'package:huixiang/setting/help_feedback_page.dart'; import 'package:huixiang/setting/permission_setting_page.dart'; import 'package:huixiang/setting/setting_page.dart'; import 'package:huixiang/setting/treaty_page.dart'; +import 'package:huixiang/store/shopping/activity_prefecture_details.dart'; +import 'package:huixiang/store/shopping/shopping_cart/shopping_cart_page.dart'; +import 'package:huixiang/store/shopping/shopping_goods_details.dart'; +import 'package:huixiang/store/shopping/shopping_home/bargain_details.dart'; +import 'package:huixiang/store/shopping/shopping_home/group_details.dart'; +import 'package:huixiang/store/shopping/shopping_home/group_page_details.dart'; +import 'package:huixiang/store/shopping/shopping_home/search_page.dart'; +import 'package:huixiang/store/shopping/shopping_mall_home.dart'; import 'package:huixiang/store/store_order.dart'; import 'package:huixiang/settlement/settlement.dart'; import 'package:huixiang/test_page.dart'; @@ -79,6 +87,7 @@ import 'mine/mine_vip/binding_assistant_card.dart'; import 'mine/mine_vip/legal_right_details.dart'; import 'mine/mine_vip/mine_attainment_page.dart'; import 'mine/mine_vip/mine_vip_core.dart'; +import 'order/bargain_group_order.dart'; import 'order/exchange_write_off_page.dart'; import 'mine/release_page.dart'; import 'mine/roll_center_page.dart'; @@ -252,6 +261,8 @@ Map routers = { BindingAssistantCard(), '/router/order_history_page': (context, {arguments}) => OrderHistoryPage(arguments: arguments), + '/router/bargain_group_order': (context, {arguments}) => + BargainGroupOrder(), '/router/union_detail_page': (context, {arguments}) => UnionDetailsPage(arguments: arguments), '/router/address_edit_page': (context, {arguments}) => @@ -267,6 +278,14 @@ Map routers = { HotArticleDetailsPage(), '/router/store_order': (context, {arguments}) => StoreOrderPage(arguments: arguments), + '/router/shopping_mall_home': (context, {arguments}) => + ShoppingMallHome(arguments: arguments), + '/router/activity_prefecture_details': (context, {arguments}) => + ActivityPrefectureDetails(), + '/router/shopping_goods_details': (context, {arguments}) => + ShoppingGoodsDetails(), + '/router/search_page': (context, {arguments}) => + SearchPage(), '/router/vip_balance': (context, {arguments}) => VipBalancePage(arguments: arguments), '/router/exchange_order_details': (context, {arguments}) => @@ -325,4 +344,10 @@ Map routers = { MineAttainmentPage(arguments: arguments), '/router/headlines_column_details': (context, {arguments}) => HeadlinesColumnDetails(arguments: arguments), + '/router/group_details': (context, {arguments}) => + GroupDetails(), + '/router/bargain_details': (context, {arguments}) => + BargainDetails(), + '/router/group_page_details': (context, {arguments}) => + GroupPageDetails(), }; diff --git a/lib/mine/mine_view/mine_item.dart b/lib/mine/mine_view/mine_item.dart index 092ca029..2193cadf 100644 --- a/lib/mine/mine_view/mine_item.dart +++ b/lib/mine/mine_view/mine_item.dart @@ -60,81 +60,117 @@ 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", - ), + 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/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", - ), - ), - 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: () { - Navigator.of(context).pushNamed('/router/qr_share', arguments: {}); - }, - child: mineItem( - S.of(context).tuiguangma, - "assets/image/icon_mine_promotion_code.png", - ), + SizedBox(height: 10.h,), + 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/bargain_group_order'); + }); + }, + child: mineItem( + S.of(context).wodekanjia, + "assets/image/icon_mine_records_of_consumption.png", + ), + ),), + Expanded(child: InkWell( + onTap: () { + Navigator.of(context).pushNamed('/router/bargain_group_order'); + }, + child: mineItem( + S.of(context).wodepintuan, + "assets/image/kan_jia.png", + ), + ),), + Expanded(child: InkWell( + onTap: () { + Navigator.of(context).pushNamed('/router/qr_share', arguments: {}); + }, + child: mineItem( + S.of(context).tuiguangma, + "assets/image/pin_tuan.png", + ), + ),), + Expanded(child: Text("")), + ], ), // mineItem( // S.of(context).bangzhuyufankui, @@ -146,40 +182,71 @@ class _MineItem extends State { } ///我的页面下面条目 + // Widget mineItem(text, icon) { + // return Container( + // color: Colors.white, + // margin: EdgeInsets.symmetric(vertical: 6.h), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.center, + // children: [ + // Image.asset( + // icon, + // width: 28.w, + // height: 28.h, + // ), + // SizedBox( + // width: 8.w, + // ), + // Expanded( + // flex: 1, + // child: Text( + // text, + // style: TextStyle( + // fontWeight: MyFontWeight.medium, + // fontSize: 16.sp, + // color: Color(0xFF353535), + // ), + // ), + // ), + // Icon( + // Icons.keyboard_arrow_right, + // size: 20, + // color: Colors.black, + // ) + // ], + // ), + // ); + // } Widget mineItem(text, icon) { return Container( color: Colors.white, - margin: EdgeInsets.symmetric(vertical: 6.h), - child: Row( + margin: EdgeInsets.symmetric(vertical:4.h), + child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Image.asset( icon, - width: 28.w, - height: 28.h, + width: 36.w, + height: 36.w, + fit: BoxFit.contain, ), SizedBox( - width: 8.w, + height:4.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, - ) ], ), ); } + + } diff --git a/lib/mine/mine_view/mine_order.dart b/lib/mine/mine_view/mine_order.dart index 947758db..bb874b09 100644 --- a/lib/mine/mine_view/mine_order.dart +++ b/lib/mine/mine_view/mine_order.dart @@ -115,8 +115,8 @@ class _MineOrderView extends State { Image.asset( orderStatusImg[status], fit: BoxFit.contain, - width: 32.w, - height: 32.w, + width: 36.w, + height: 36.w, ), SizedBox(height: 4.h,), Text( diff --git a/lib/order/bargain_group_order.dart b/lib/order/bargain_group_order.dart new file mode 100644 index 00000000..a339b78c --- /dev/null +++ b/lib/order/bargain_group_order.dart @@ -0,0 +1,439 @@ +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/exchange_order.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/icon_text.dart'; +import 'package:huixiang/view_widget/my_appbar.dart'; +import 'package:huixiang/view_widget/my_footer.dart'; +import 'package:huixiang/view_widget/my_tab.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:flutter_screenutil/flutter_screenutil.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class BargainGroupOrder extends StatefulWidget { + @override + State createState() { + return _BargainGroupOrder(); + } +} + +class _BargainGroupOrder extends State + with SingleTickerProviderStateMixin { + List tabs; + List _pages; + TabController tabcontroller; + + @override + void initState() { + super.initState(); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + if (tabcontroller == null) + tabcontroller = TabController(length: 4, vsync: this); + tabs = [ + MyTab( + text: S.of(context).quanbu, + ), + MyTab( + text: "进行中", + ), + MyTab( + text: "成功", + ), + MyTab( + text: "失败", + ) + ]; + _pages = [ + ExchangeHistoryList(0), + ExchangeHistoryList(1), + ExchangeHistoryList(2), + ExchangeHistoryList(3) + ]; + } + + @override + Widget build(BuildContext context) { + return DefaultTabController( + length: 4, + child: Scaffold( + appBar: MyAppBar( + title: S.of(context).wodekanjia, + titleColor: Colors.black, + titleSize: 18.sp, + background: Color(0xFFFFFFFF), + leadingColor: Colors.black, + toolbarHeight: kToolbarHeight + MediaQuery.of(context).padding.top, + bottom: PreferredSize( + preferredSize: Size(double.infinity, 38.h), + child: TabBar( + controller: tabcontroller, + indicatorWeight: 2, + indicatorColor: Color(0xFF39B54A), + indicatorSize: TabBarIndicatorSize.label, + indicatorPadding: EdgeInsets.only(top: 3), + unselectedLabelStyle: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.normal, + ), + labelStyle: TextStyle( + color: Colors.black, + fontSize: 16.sp, + fontWeight: MyFontWeight.semi_bold), + labelColor: Colors.black, + tabs: tabs, + ), + ), + ), + body: TabBarView( + children: _pages, + controller: tabcontroller, + ), + ), + ); + } +} + +class ExchangeHistoryList extends StatefulWidget { + final int orderStatus; + + ExchangeHistoryList(this.orderStatus); + + @override + State createState() { + return _ExchangeHistoryList(); + } +} + +class _ExchangeHistoryList extends State { + ApiService apiService; + + RefreshController _refreshController = + RefreshController(initialRefresh: false); + + @override + void initState() { + super.initState(); + SharedPreferences.getInstance().then((value) => { + apiService = ApiService(Dio(), + context: context, token: value.getString('token')), + }); + } + + int pageNum = 1; + + _refresh() { + pageNum = 1; + } + + @override + Widget build(BuildContext context) { + return SmartRefresher( + enablePullDown: true, + enablePullUp: true, + header: MyHeader(), + footer: CustomFooter( + builder: (BuildContext context, LoadStatus mode) { + return MyFooter(mode); + }, + ), + controller: _refreshController, + onRefresh: _refresh, + // onLoading: queryHistory, + child: + // orders == null || orders.length == 0 + // ? NoDataView( + // isShowBtn: false, + // text: "还没有订单,快去下一单吧~", + // fontSize: 16.sp, + // margin: EdgeInsets.only(top: 120.h), + // ) + // : + ListView.builder( + // itemCount: orders == null ? 0 : orders.length, + itemCount: 5, + itemBuilder: (context, position) { + return bargainOrder(); + }, + ), + ); + } + + String orderStatus(state) { + String orderStatus = ""; + switch (state) { + case 1: + orderStatus = S.of(context).weiwancheng; + break; + case 2: + orderStatus = S.of(context).yiwancheng; + break; + case 9: + orderStatus = S.of(context).yiquxiao; + break; + } + return orderStatus; + } + + Widget bargainOrder() { + return Container( + margin: EdgeInsets.fromLTRB(16.w, 8.h, 16.w, 8.h), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(4), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(25), + offset: Offset(0, 1), + blurRadius: 12, + spreadRadius: 0, + ), + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 19.w, + height:21.h, + margin: EdgeInsets.only(left: 12.w, top: 12.h), + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(0xff32A060), + borderRadius: BorderRadius.circular(2), + ), + child: Text( + // (orderInfo != null && orderInfo.isTakeOut == 0) ? "自" : "外", + "自", + style: TextStyle( + fontSize: 12.sp, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ), + Expanded( + child: Container( + width: double.infinity, + margin: EdgeInsets.only(left: 6.w, top: 12.h), + alignment: Alignment.centerLeft, + child: Text( + // (orderInfo != null) ? orderInfo.storeName : "", + "一心回乡商城", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 14.sp, + color: Color(0xFF353535), + ), + ), + ), + flex: 1, + ), + Padding( + padding: EdgeInsets.only(top: 12.h, right: 12.w), + child: Text( + // (orderInfo != null && + // orderInfo.storeVO != null && + // orderInfo.storeVO.posType != null) + // ? StatusUtils.statusText( + // context, + // orderInfo.refundStatus, + // orderInfo.orderStatus, + // orderInfo.payStatus, + // orderInfo.sendStatus, + // orderInfo.isTakeOut) + // : "", + "还差¥23.4砍价成功", + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.bold, + color: + // (orderInfo == null) + // ? Color(0xFF32A060) + // : (orderInfo.refundStatus == 1 || + // orderInfo.orderStatus >= 5) + // ? Colors.grey + // : (orderInfo.orderStatus == 4) + // ? Color(0xFF32A060) + // : + Color(0xffFE951E), + ), + ), + ), + ], + ), + Container( + margin: EdgeInsets.only(left: 37.w), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + S.of(context).xiadanshijian_("下单时间:2020.01.20 10:50:22"), + style: TextStyle( + fontSize: 10.sp, + color: Color(0xFF727272), + ), + ), + SizedBox( + height: 8.h, + ), + Container( + height: 81.h, + margin: EdgeInsets.only(right: 12), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // MImage( + // "", + // width: 81.w, + // height: 81.h, + // fit: BoxFit.cover, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + Image.asset( + "assets/image/icon_story_td.png", + width: 81, + height: 81, + ), + SizedBox( + width: 10, + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "[生态小农]山林放养鸡蛋30枚/盒", + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF353535), + ), + ), + Text( + "套盒装", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF727272), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "x1", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF727272), + ), + ), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "已砍至:", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF868686), + ), + ), + TextSpan( + text: "58.2", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF32A060), + ), + ), + TextSpan( + text: "元", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF868686), + ), + ), + ], + ), + ), + ], + ), + ], + )), + ], + ), + ), + ], + ), + ), + SizedBox( + height: 12.h, + ), + Container( + margin: EdgeInsets.only(right: 12.w, bottom: 16.h), + child: Directionality( + textDirection: TextDirection.rtl, + child: Row( + children: [ + GestureDetector( + onTap: () {}, + child: RoundButton( + height: 25.h, + text: "查看详情", + textColor: Colors.white, + fontSize: 12.sp, + backgroup: Color(0xFF32A060), + radius: 2, + padding: EdgeInsets.fromLTRB(17.w,0, 17.w,0), + ), + ), + // GestureDetector( + // onTap: () { + // + // }, + // child:RoundButton( + // height: 25.h, + // padding: EdgeInsets.fromLTRB(8, 4, 8, 4), + // text: S.of(context).chakanxiangqing, + // textColor: Colors.white, + // fontSize: 12, + // backgroup: Color(0xFF32A060), + // radius: 2, + // ), + // ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/order/order_history_page.dart b/lib/order/order_history_page.dart index 3d003bae..42c454dd 100644 --- a/lib/order/order_history_page.dart +++ b/lib/order/order_history_page.dart @@ -242,10 +242,33 @@ class _OrderHistoryList extends State crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( - width: 19.w, - height: 19.h, + width: 19, + height: 21, margin: EdgeInsets.only(left: 12.w, top: 12.h), alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(2), + border: Border.all( + width: 1, + color: Color(0xFF32A060), + style: BorderStyle.solid, + ) + ), + child: Text( + "团", + style: TextStyle( + fontSize: 12.sp, + fontWeight: FontWeight.bold, + color: Color(0xFF32A060), + ), + ), + ), + Container( + width: 19, + height:21, + margin: EdgeInsets.only(left:7.w,top: 12.h), + alignment: Alignment.center, decoration: BoxDecoration( color: Color(0xff32A060), borderRadius: BorderRadius.circular(2), diff --git a/lib/retrofit/data/activity_area_list.dart b/lib/retrofit/data/activity_area_list.dart new file mode 100644 index 00000000..27accb42 --- /dev/null +++ b/lib/retrofit/data/activity_area_list.dart @@ -0,0 +1,307 @@ +import 'package:huixiang/retrofit/data/product.dart'; + +/// actTemplate : {"id":"1473198577613275136","createTime":"2021-12-21 15:48:06","createUser":"1333246101196636160","updateTime":"2021-12-21 15:48:06","updateUser":"1333246101196636160","storeId":"1333246101343436800","type":2,"limitTime":null,"limitNumber":0,"coverImg":"https://pos.upload.gznl.top/1175/2021/12/5bf7a846-768b-4a17-872f-e927988c24c9.jpg","shareImg":"https://pos.upload.gznl.top/1175/2021/12/65f6a0f7-14d1-4393-902e-42e5dc464800.jpg","bannerImg":"https://pos.upload.gznl.top/1175/2021/12/9ee395eb-718c-40c0-bfe0-673dbbade4cf.jpg","state":1,"allDay":false,"startTime":"2021-12-20 00:00:00","endTime":"2021-12-30 00:00:00","isDelete":0} +/// timeProductList : [{"actTime":{"id":"1473198590141661184","createTime":"2021-12-21 15:48:09","createUser":"1333246101196636160","updateTime":"2021-12-21 15:48:09","updateUser":"1333246101196636160","storeId":"1333246101343436800","templateId":"1473198577613275136","allDay":false,"startHour":"09:00:00","endHour":"10:00:00","isDelete":0},"productList":[]},{"actTime":{"id":"1473570616966643712","createTime":"2021-12-22 16:26:27","createUser":"1333246101196636160","updateTime":"2021-12-22 16:26:27","updateUser":"1333246101196636160","storeId":"1333246101343436800","templateId":"1473198577613275136","allDay":false,"startHour":"11:00:00","endHour":"17:00:00","isDelete":0},"productList":[{"id":"1473570776908038144","createTime":"2021-12-22 16:27:05","createUser":"1333246101196636160","updateTime":"2021-12-22 16:27:05","updateUser":"1333246101196636160","storeId":"1333246101343436800","templateId":"1473198577613275136","timeId":"1473570616966643712","productId":"1456500820571848704","productName":"毛毛虫面包","productImg":"https://pos.upload.gznl.top/1175/2021/11/4a6ffabd-0e10-4720-ac93-57ec6855c5cf.jpg","productPrice":"8.00","promotionPrice":"8.00","productStock":-20,"sellCount":0,"skuJson":[{"skuId":"1456500821968551936","skuPrice":8,"skuStock":-20}],"isDelete":0}]}] + +class ActivityAreaList { + ActivityAreaList({ + ActTemplate actTemplate, + List timeProductList,}){ + _actTemplate = actTemplate; + _timeProductList = timeProductList; +} + + ActivityAreaList.fromJson(dynamic json) { + _actTemplate = json['actTemplate'] != null ? ActTemplate.fromJson(json['actTemplate']) : null; + if (json['timeProductList'] != null) { + _timeProductList = []; + json['timeProductList'].forEach((v) { + _timeProductList.add(TimeProductList.fromJson(v)); + }); + } + } + ActTemplate _actTemplate; + List _timeProductList; + + ActTemplate get actTemplate => _actTemplate; + List get timeProductList => _timeProductList; + + Map toJson() { + final map = {}; + if (_actTemplate != null) { + map['actTemplate'] = _actTemplate.toJson(); + } + if (_timeProductList != null) { + map['timeProductList'] = _timeProductList.map((v) => v.toJson()).toList(); + } + return map; + } + +} + +/// actTime : {"id":"1473198590141661184","createTime":"2021-12-21 15:48:09","createUser":"1333246101196636160","updateTime":"2021-12-21 15:48:09","updateUser":"1333246101196636160","storeId":"1333246101343436800","templateId":"1473198577613275136","allDay":false,"startHour":"09:00:00","endHour":"10:00:00","isDelete":0} +/// productList : [] + +class TimeProductList { + TimeProductList({ + ActTime actTime, + List productList,}){ + _actTime = actTime; + _productList = productList; +} + + TimeProductList.fromJson(dynamic json) { + _actTime = json['actTime'] != null ? ActTime.fromJson(json['actTime']) : null; + if (json['productList'] != null) { + _productList = []; + json['productList'].forEach((v) { + _productList.add(ProductList.fromJson(v)); + }); + } + } + ActTime _actTime; + List _productList; + + ActTime get actTime => _actTime; + List get productList => _productList; + + Map toJson() { + final map = {}; + if (_actTime != null) { + map['actTime'] = _actTime.toJson(); + } + if (_productList != null) { + map['productList'] = _productList.map((v) => v.toJson()).toList(); + } + return map; + } + +} + +/// id : "1473198590141661184" +/// createTime : "2021-12-21 15:48:09" +/// createUser : "1333246101196636160" +/// updateTime : "2021-12-21 15:48:09" +/// updateUser : "1333246101196636160" +/// storeId : "1333246101343436800" +/// templateId : "1473198577613275136" +/// allDay : false +/// startHour : "09:00:00" +/// endHour : "10:00:00" +/// isDelete : 0 + +class ActTime { + ActTime({ + String id, + String createTime, + String createUser, + String updateTime, + String updateUser, + String storeId, + String templateId, + bool allDay, + String startHour, + String endHour, + int isDelete,}){ + _id = id; + _createTime = createTime; + _createUser = createUser; + _updateTime = updateTime; + _updateUser = updateUser; + _storeId = storeId; + _templateId = templateId; + _allDay = allDay; + _startHour = startHour; + _endHour = endHour; + _isDelete = isDelete; +} + + ActTime.fromJson(dynamic json) { + _id = json['id']; + _createTime = json['createTime']; + _createUser = json['createUser']; + _updateTime = json['updateTime']; + _updateUser = json['updateUser']; + _storeId = json['storeId']; + _templateId = json['templateId']; + _allDay = json['allDay']; + _startHour = json['startHour']; + _endHour = json['endHour']; + _isDelete = json['isDelete']; + } + String _id; + String _createTime; + String _createUser; + String _updateTime; + String _updateUser; + String _storeId; + String _templateId; + bool _allDay; + String _startHour; + String _endHour; + int _isDelete; + + String get id => _id; + String get createTime => _createTime; + String get createUser => _createUser; + String get updateTime => _updateTime; + String get updateUser => _updateUser; + String get storeId => _storeId; + String get templateId => _templateId; + bool get allDay => _allDay; + String get startHour => _startHour; + String get endHour => _endHour; + int get isDelete => _isDelete; + + Map toJson() { + final map = {}; + map['id'] = _id; + map['createTime'] = _createTime; + map['createUser'] = _createUser; + map['updateTime'] = _updateTime; + map['updateUser'] = _updateUser; + map['storeId'] = _storeId; + map['templateId'] = _templateId; + map['allDay'] = _allDay; + map['startHour'] = _startHour; + map['endHour'] = _endHour; + map['isDelete'] = _isDelete; + return map; + } + +} + +/// id : "1473198577613275136" +/// createTime : "2021-12-21 15:48:06" +/// createUser : "1333246101196636160" +/// updateTime : "2021-12-21 15:48:06" +/// updateUser : "1333246101196636160" +/// storeId : "1333246101343436800" +/// type : 2 +/// limitTime : null +/// limitNumber : 0 +/// coverImg : "https://pos.upload.gznl.top/1175/2021/12/5bf7a846-768b-4a17-872f-e927988c24c9.jpg" +/// shareImg : "https://pos.upload.gznl.top/1175/2021/12/65f6a0f7-14d1-4393-902e-42e5dc464800.jpg" +/// bannerImg : "https://pos.upload.gznl.top/1175/2021/12/9ee395eb-718c-40c0-bfe0-673dbbade4cf.jpg" +/// state : 1 +/// allDay : false +/// startTime : "2021-12-20 00:00:00" +/// endTime : "2021-12-30 00:00:00" +/// isDelete : 0 + +class ActTemplate { + ActTemplate({ + String id, + String createTime, + String createUser, + String updateTime, + String updateUser, + String storeId, + int type, + dynamic limitTime, + int limitNumber, + String coverImg, + String shareImg, + String bannerImg, + int state, + bool allDay, + String startTime, + String endTime, + int isDelete,}){ + _id = id; + _createTime = createTime; + _createUser = createUser; + _updateTime = updateTime; + _updateUser = updateUser; + _storeId = storeId; + _type = type; + _limitTime = limitTime; + _limitNumber = limitNumber; + _coverImg = coverImg; + _shareImg = shareImg; + _bannerImg = bannerImg; + _state = state; + _allDay = allDay; + _startTime = startTime; + _endTime = endTime; + _isDelete = isDelete; +} + + ActTemplate.fromJson(dynamic json) { + _id = json['id']; + _createTime = json['createTime']; + _createUser = json['createUser']; + _updateTime = json['updateTime']; + _updateUser = json['updateUser']; + _storeId = json['storeId']; + _type = json['type']; + _limitTime = json['limitTime']; + _limitNumber = json['limitNumber']; + _coverImg = json['coverImg']; + _shareImg = json['shareImg']; + _bannerImg = json['bannerImg']; + _state = json['state']; + _allDay = json['allDay']; + _startTime = json['startTime']; + _endTime = json['endTime']; + _isDelete = json['isDelete']; + } + String _id; + String _createTime; + String _createUser; + String _updateTime; + String _updateUser; + String _storeId; + int _type; + dynamic _limitTime; + int _limitNumber; + String _coverImg; + String _shareImg; + String _bannerImg; + int _state; + bool _allDay; + String _startTime; + String _endTime; + int _isDelete; + + String get id => _id; + String get createTime => _createTime; + String get createUser => _createUser; + String get updateTime => _updateTime; + String get updateUser => _updateUser; + String get storeId => _storeId; + int get type => _type; + dynamic get limitTime => _limitTime; + int get limitNumber => _limitNumber; + String get coverImg => _coverImg; + String get shareImg => _shareImg; + String get bannerImg => _bannerImg; + int get state => _state; + bool get allDay => _allDay; + String get startTime => _startTime; + String get endTime => _endTime; + int get isDelete => _isDelete; + + Map toJson() { + final map = {}; + map['id'] = _id; + map['createTime'] = _createTime; + map['createUser'] = _createUser; + map['updateTime'] = _updateTime; + map['updateUser'] = _updateUser; + map['storeId'] = _storeId; + map['type'] = _type; + map['limitTime'] = _limitTime; + map['limitNumber'] = _limitNumber; + map['coverImg'] = _coverImg; + map['shareImg'] = _shareImg; + map['bannerImg'] = _bannerImg; + map['state'] = _state; + map['allDay'] = _allDay; + map['startTime'] = _startTime; + map['endTime'] = _endTime; + map['isDelete'] = _isDelete; + return map; + } + +} \ No newline at end of file diff --git a/lib/retrofit/min_api.dart b/lib/retrofit/min_api.dart index 3ee52d73..1aa69ce7 100644 --- a/lib/retrofit/min_api.dart +++ b/lib/retrofit/min_api.dart @@ -21,8 +21,8 @@ import 'data/shoppingCart.dart'; part 'min_api.g.dart'; -const base_url = "https://pos.api.lotus-wallet.com/app/"; ///正式 -const baseUrl = "https://pos.api.lotus-wallet.com/app/"; ///正式 +// const base_url = "https://pos.api.lotus-wallet.com/app/"; ///正式 +// const baseUrl = "https://pos.api.lotus-wallet.com/app/"; ///正式 // const base_url = "http://user.prod.kunqi.lotus-wallet.com/app/"; ///222 @@ -35,6 +35,9 @@ const baseUrl = "https://pos.api.lotus-wallet.com/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:8765/app/";///詹云久 +const baseUrl = "http://192.168.10.142:8765/app/";///詹云久 + ///调用小程序的接口 @RestApi(baseUrl: baseUrl) abstract class MinApiService { diff --git a/lib/retrofit/min_api.g.dart b/lib/retrofit/min_api.g.dart index 02d9988a..ef360ca1 100644 --- a/lib/retrofit/min_api.g.dart +++ b/lib/retrofit/min_api.g.dart @@ -9,7 +9,7 @@ part of 'min_api.dart'; class _MinApiService implements MinApiService { _MinApiService(this._dio, {this.baseUrl}) { ArgumentError.checkNotNull(_dio, '_dio'); - baseUrl ??= 'https://pos.api.lotus-wallet.com/app/'; + baseUrl ??= 'http://192.168.10.142:8765/app/'; } final Dio _dio; diff --git a/lib/retrofit/retrofit_api.dart b/lib/retrofit/retrofit_api.dart index cf056f6e..48b32e23 100644 --- a/lib/retrofit/retrofit_api.dart +++ b/lib/retrofit/retrofit_api.dart @@ -19,6 +19,7 @@ import 'package:huixiang/view_widget/login_tips_dialog.dart'; import 'package:retrofit/retrofit.dart'; import 'data/achievement_detail_list.dart'; +import 'data/activity_area_list.dart'; import 'data/address.dart'; import 'data/banner.dart'; import 'data/brand_data.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 @@ -66,8 +67,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 { @@ -481,5 +482,8 @@ abstract class ApiService { @GET("/information/category/{id}") Future> headlinesDetails(@Path("id") String id); + ///活动专区,秒杀,砍价,拼团 + @GET("/actTemplate/findActListByType?allDay={allDay}&type={type}") + Future>> findActListByType(@Path("allDay") bool allDay, @Path("type") int type); } diff --git a/lib/retrofit/retrofit_api.g.dart b/lib/retrofit/retrofit_api.g.dart index d1a64c02..0b1bec7a 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; @@ -1773,4 +1773,28 @@ class _ApiService implements ApiService { return value; } + @override + Future>> findActListByType(allDay,type) async { + ArgumentError.checkNotNull(allDay, 'allDay'); + ArgumentError.checkNotNull(type, 'type'); + const _extra = {}; + final queryParameters = {}; + final _data = {}; + final _result = await _dio.request>( + '/actTemplate/findActListByType?allDay=$allDay&type=$type', + 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) => ActivityAreaList.fromJson(i as Map)) + .toList()); + return value; + } + } diff --git a/lib/store/shopping/activity_prefecture_details.dart b/lib/store/shopping/activity_prefecture_details.dart new file mode 100644 index 00000000..d2e7f1c6 --- /dev/null +++ b/lib/store/shopping/activity_prefecture_details.dart @@ -0,0 +1,683 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:huixiang/retrofit/data/activity_area_list.dart'; +import 'package:huixiang/retrofit/data/base_data.dart'; +import 'package:huixiang/retrofit/retrofit_api.dart'; +import 'package:huixiang/utils/font_weight.dart'; +import 'package:huixiang/view_widget/custom_image.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 ActivityPrefectureDetails extends StatefulWidget { + @override + State createState() { + return _ActivityPrefectureDetails(); + } +} + +class _ActivityPrefectureDetails extends State { + ApiService apiService; + int seckillIndex = 0; + RefreshController refreshController = RefreshController(); + List activityAreaList = []; + ScrollController _scrollController; + ScrollPhysics _scrollPhysics = NeverScrollableScrollPhysics(); + bool scrollFlag = false; + + + + @override + void initState() { + super.initState(); + _scrollController = ScrollController(); + _scrollController.addListener(() { + setState(() { + if(_scrollController.offset < (325.h-MediaQuery.of(context).padding.top)){ + _scrollPhysics = NeverScrollableScrollPhysics(); + } + else{ + _scrollPhysics = BouncingScrollPhysics(); + } + }); + }); + SharedPreferences.getInstance().then((value) { + apiService = + ApiService(Dio(), context: context, token: value.getString("token")); + queryFindActListByType(false,2); + }); + } + + ///秒杀/砍价/拼团列表 + queryFindActListByType(allDay,type) async { + if (apiService == null) { + SharedPreferences value = await SharedPreferences.getInstance(); + apiService = ApiService( + Dio(), + context: context, + token: value.getString("token"), + ); + } + BaseData> baseData = + await apiService.findActListByType(allDay,type).catchError((error) { + refreshController.refreshFailed(); + }); + if (baseData != null && baseData.isSuccess) { + activityAreaList.clear(); + activityAreaList.addAll(baseData.data); + setState(() { + refreshController.refreshCompleted(); + }); + } else { + refreshController.refreshFailed(); + } + } + + @override + Widget build(BuildContext context) { + return SingleChildScrollView( + physics: BouncingScrollPhysics(), + controller: _scrollController, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + seckillProduct(), + seckilList(), + ], + ), + ); + } + + Widget seckillProduct() { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.vertical( + bottom: Radius.circular(8.h), + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + color: Colors.white), + child: Column( + children: [ + swiper(), + seckillIndex == 0 ? + Container( + width: double.infinity, + alignment: Alignment.center, + height: 62.h, + padding: EdgeInsets.only(left: 16.w,right: 16.w), + decoration: BoxDecoration( + color: Color(0xFFFFEED9)), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + "assets/image/ms.png", + width:38, + height:38, + fit: BoxFit.contain, + ), + SizedBox(width: 14.w,), + Expanded(child:ListView.builder( + scrollDirection: Axis.horizontal, + physics: BouncingScrollPhysics(), + itemCount:activityAreaList != null ? activityAreaList.length : 0, + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + setState(() { + }); + }, + child: timeItem(activityAreaList[position],position), + ); + }, + )) + , + ], + ), + ) + : Container( + width: double.infinity, + alignment: Alignment.center, + height: 62.h, + padding: EdgeInsets.only(left: 16.w,right: 16.w), + decoration: BoxDecoration( + color: Color(0xFFFFEED9)), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + "assets/image/ms_t.png", + width:38, + height:38, + fit: BoxFit.contain, + ), + Spacer(), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "距秒杀结束还有", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.semi_bold, + color: Colors.black, + ), + ), + TextSpan( + text: "0", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFFFB312B), + ), + ), + TextSpan( + text: "天", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.semi_bold, + color: Colors.black, + ), + ), + ], + ), + ), + SizedBox(width: 4.w), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center,children: [ + InkWell( + onTap: () { + setState(() { + }); + }, + child:Container( + width: 20, + height: 20, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(0xFFFB312B), + borderRadius: BorderRadius.circular(1)), + child: Text( + "22", + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + ), + ), + ), + ), + Padding(padding:EdgeInsets.only(left: 2.w,right: 2.w), + child:Text( + ":", + style: TextStyle( + fontWeight: MyFontWeight.medium, + fontSize: 14.sp, + color: Color(0xFFFB312B), + ), + ),), + Container( + width: 20, + height: 20, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(0xFFFB312B), + borderRadius: BorderRadius.circular(1)), + child: Text( + "22", + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + ), + ), + ), + Padding(padding:EdgeInsets.only(left: 2.w,right: 2.w), + child:Text( + ":", + style: TextStyle( + fontWeight: MyFontWeight.medium, + fontSize: 14.sp, + color: Color(0xFFFB312B), + ), + ),), + InkWell( + onTap: () { + }, + child: Container( + width: 20, + height: 20, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(0xFFFB312B), + borderRadius: BorderRadius.circular(1)), + child: Text( + "22", + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + ), + ), + ), + ), + ],) + ], + ), + ) + ], + ), + ); + } + + Widget swiper() { + return Container( + child: AspectRatio( + aspectRatio: 1.3698, + child: Stack( + children: [ + MImage( + "", + width:double.infinity, + height: 330.h, + fit: BoxFit.cover, + errorSrc: "assets/image/default_1.png", + fadeSrc: "assets/image/default_1.png", + ), + GestureDetector( + onTap: () { + Navigator.of(context).pop(); + }, + child: Container( + margin: EdgeInsets.only(left: 16, top: 52), + padding: EdgeInsets.all(5), + child: Icon( + Icons.arrow_back_ios, + size: 24, + color: Colors.black, + ), + ), + ), + Align( + alignment: Alignment.topCenter, + child:Container( + margin: EdgeInsets.only(top: 52), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + color: Color.fromRGBO(0, 0, 0, 69000000), + ), + width:160.w, + height: 30.h, + child: Row( + children: [ + GestureDetector( + onTap: (){ + setState(() { + seckillIndex =0; + }); + }, + child: Container( + alignment: Alignment.center, + width: 72.w, + height:22.h, + margin: EdgeInsets.only(left:6.w), + decoration: BoxDecoration( + gradient: new LinearGradient( + begin: Alignment.centerRight, + end: Alignment.centerLeft, + colors: [ + seckillIndex == 0 ? Color(0xFFF67E5F):Colors.transparent, + seckillIndex == 0 ? Color(0xFFFC5237):Colors.transparent, + ]), + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), + child: Opacity( + opacity: seckillIndex == 0 ? 1 :0.5, + child: Text( + "限时秒杀", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + color: Colors.white, + ), + ), + ) + ) + ), + GestureDetector( + onTap: (){ + setState(() { + seckillIndex = 1; + }); + }, + child: Container( + alignment: Alignment.center, + width: 72.w, + height:22.h, + margin: EdgeInsets.only(left:6.w), + decoration: BoxDecoration( + gradient: new LinearGradient( + begin: Alignment.centerRight, + end: Alignment.centerLeft, + colors: [ + seckillIndex == 1 ? Color(0xFFF67E5F):Colors.transparent, + seckillIndex == 1 ? Color(0xFFFC5237):Colors.transparent, + ]), + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), + child:Opacity( + opacity: seckillIndex == 1 ? 1 :0.5, + child: Text( + "限天秒杀", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + color: Colors.white, + ), + ), + ) + ) + ), + ], + ), + ), + ), + ], + ), + ), + ); + } + + ///秒杀列表 + Widget seckilList() { + return Container( + height: MediaQuery.of(context).size.height-62.h-MediaQuery.of(context).padding.top, + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 16.h), + child: ListView.builder( + padding: EdgeInsets.zero, + itemCount:10, + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: _scrollPhysics, + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + setState(() {}); + }, + child: seckilItem(), + ); + }, + ), + ); + } + + Widget timeItem(ActivityAreaList activityAreaList,position) { + return Container( + margin: EdgeInsets.only(right:12.w,top:8.h,bottom:8.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + activityAreaList.timeProductList[position].actTime.startHour, + style: TextStyle( + fontSize: 17.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFFFC3127), + ), + ), + Expanded(child: Container( + alignment: Alignment.center, + width:48.w, + height:15.h, + decoration: BoxDecoration( + color: Color(0xFFFB312B), + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), + child: Text( + "已结束", + style: TextStyle( + fontSize:10.sp, + fontWeight: MyFontWeight.regular, + color: Colors.white, + ), + ), + )) + ], + ), + ); + } + + Widget seckilItem() { + return Container( + margin: EdgeInsets.only(right:12.w,top: 12.h,bottom: 12.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // MImage( + // "", + // width: 94.w, + // height: 94.h, + // fit: BoxFit.cover, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + Image.asset( + "assets/image/icon_story_td.png", + width: 94, + height: 94, + fit: BoxFit.cover, + ), + SizedBox(width:12.w,), + Expanded(child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "[生态小农]山林放养鸡蛋30枚/盒", + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 15.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF353535), + ), + ), + Text( + "限量45件", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF4D4D4D), + ), + ), + Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(6.5), + child: + Stack( + children: [ + Container( + width: 180.w, + height: 8.h, + color: Color(0xFFF5F5F5), + ), + Container( + width: 100.w, + height: 8.h, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [Color(0xFFFDBA56), Color(0xFFFB2B2B)])), + ) + ], + )), + SizedBox(width: 5,), + Text( + "已售67%", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF353535), + ), + ), + ], + ), + Row( + children: [ + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "¥", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFFFB2E2C), + ), + ), + TextSpan( + text: "123.00", + style: TextStyle( + fontSize: 18.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFFFB2E2C), + ), + ), + ], + ), + ), + Expanded(child: Text( + "¥234.00", + style: TextStyle( + fontSize: 10.sp, + decoration: TextDecoration.lineThrough, + decorationColor: Color(0xFF585858), + fontWeight: MyFontWeight.regular, + color: Color(0xFF353535), + ), + ),), + Container( + alignment: Alignment.center, + width:60.w, + height:24.h, + decoration: BoxDecoration( + color: Color(0xFFFB312B), + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), + child: Text( + "马上抢", + style: TextStyle( + fontSize:12.sp, + fontWeight: MyFontWeight.medium, + color: Colors.white, + ), + ), + ), + // Container( + // alignment: Alignment.center, + // width:60.w, + // height:24.h, + // decoration: BoxDecoration( + // color: Color(0xFFE2F6EA), + // borderRadius: BorderRadius.circular(12), + // boxShadow: [ + // BoxShadow( + // color: Colors.black.withAlpha(12), + // offset: Offset(0, 3), + // blurRadius: 14, + // spreadRadius: 0, + // ), + // ], + // ), + // child: Text( + // "即将开始", + // style: TextStyle( + // fontSize:12.sp, + // fontWeight: MyFontWeight.medium, + // color: Color(0xFF52AF79), + // ), + // ), + // ), + // Container( + // alignment: Alignment.center, + // width:60.w, + // height:24.h, + // decoration: BoxDecoration( + // color: Colors.transparent, + // borderRadius: BorderRadius.circular(12), + // boxShadow: [ + // BoxShadow( + // color: Colors.black.withAlpha(12), + // offset: Offset(0, 3), + // blurRadius: 14, + // spreadRadius: 0, + // ), + // ], + // ), + // child: Text( + // "已结束", + // style: TextStyle( + // fontSize:12.sp, + // fontWeight: MyFontWeight.medium, + // color: Color(0xFFADADAD), + // ), + // ), + // ), + ], + ), + ], + ),) + ], + ), + ); + } + +} diff --git a/lib/store/shopping/shopping_cart/cart_goods_list.dart b/lib/store/shopping/shopping_cart/cart_goods_list.dart new file mode 100644 index 00000000..fccc1bec --- /dev/null +++ b/lib/store/shopping/shopping_cart/cart_goods_list.dart @@ -0,0 +1,203 @@ +import 'package:flutter/material.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/my_footer.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +class CartGoodsList extends StatefulWidget { + + @override + State createState() { + return _CartGoodsList(); + } +} + +class _CartGoodsList extends State { + RefreshController refreshController = RefreshController(); + ApiService apiService; + int pageNum = 0; + + @override + void initState() { + super.initState(); + _onRefresh(); + } + + _onRefresh() async { + pageNum = 0; + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return Container( + height: MediaQuery.of(context).size.height - + 103.h - + MediaQuery.of(context).padding.top, + child: SmartRefresher( + controller: refreshController, + enablePullUp: false, + enablePullDown: true, + physics: BouncingScrollPhysics(), + header: MyHeader(), + onRefresh: () { + }, + child: ListView.builder( + itemCount:6, + padding: EdgeInsets.only( + top: 8.h, + bottom: 84.h, /* + (375.h - 88.h) + 4.h*/ + ), + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, position) { + return InkWell( + onTap: () { + }, + child: cartGoodsItem(), + ); + }), + ), + ); + } + + Widget cartGoodsItem() { + return Container( + margin: EdgeInsets.all(16), + padding: EdgeInsets.all(16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + color: Colors.white, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + // ? "assets/image/icon_radio_selected.png" : + "assets/image/icon_radio_unselected.png", + width:16, + height:16, + ), + SizedBox(width: 16.w), + // MImage( + // "assets/image/icon_story_td.png", + // isCircle: true, + // width:81, + // height:81, + // fit: BoxFit.cover, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + Image.asset( + "assets/image/icon_story_td.png", + width: 81, + height: 81, + fit: BoxFit.cover, + ), + SizedBox(width: 10.w), + Expanded(child: + Container( + height:81.h,child:Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "[生态小农]山林放养鸡蛋30枚/盒", + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF353535), + ), + ), + // SizedBox(height: 5.h), + Text( + "套盒装", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF727272), + ), + ), + // SizedBox(height: 5.h), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded(child:Text.rich( + TextSpan( + children: [ + TextSpan( + text: "¥", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF32A060), + ), + ), + TextSpan( + text: "58.2", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF32A060), + ), + ), + ], + ), + )), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center,children: [ + InkWell( + onTap: () { + setState(() { + }); + }, + child: Image.asset( + "assets/image/reduce.png", + width: 22, + height: 22, + ), + ), + Container( + width: 30, + alignment: Alignment.center, + child: Text( + "1", + style: TextStyle( + color: Colors.black, + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + ), + ), + ), + InkWell( + onTap: () { + }, + child: Image.asset( + "assets/image/add.png", + width: 22, + height: 22, + ), + ), + ],) + ], + ), + ], + )),), + ], + ), + ); + } +} diff --git a/lib/store/shopping/shopping_cart/shopping_cart_page.dart b/lib/store/shopping/shopping_cart/shopping_cart_page.dart new file mode 100644 index 00000000..035ed866 --- /dev/null +++ b/lib/store/shopping/shopping_cart/shopping_cart_page.dart @@ -0,0 +1,241 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:huixiang/generated/l10n.dart'; +import 'package:huixiang/retrofit/retrofit_api.dart'; +import 'package:huixiang/store/shopping/shopping_home/recommend_goods_list_view.dart'; +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/round_button.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +import 'cart_goods_list.dart'; + +class ShoppingCartPage extends StatefulWidget { + @override + State createState() { + return _ShoppingCartPage(); + } +} + +class _ShoppingCartPage extends State + with AutomaticKeepAliveClientMixin { + ApiService apiService; + + @override + void initState() { + super.initState(); + } + + final SwiperController controller = SwiperController(); + + @override + void dispose() { + super.dispose(); + if (refreshController != null) refreshController.dispose(); + } + + final RefreshController refreshController = RefreshController(); + + @override + Widget build(BuildContext context) { + super.build(context); + return Stack( + children: [ + Column( + children: [ + MyAppBar( + title: "购物车", + titleColor: Colors.black, + leadingColor: Colors.black, + background: Colors.transparent, + actions: [ + Container( + alignment: Alignment.center, + margin: EdgeInsets.only(right: 12.w), + child: GestureDetector( + onTap: () { + + }, + child: Text("管理", + style: TextStyle( + fontSize: 18.sp, + fontWeight: MyFontWeight.semi_bold, + color:Colors.black, + ), + ), + ), + ), + // Container( + // alignment: Alignment.center, + // margin: EdgeInsets.only(right: 12.w), + // child: GestureDetector( + // onTap: () { + // + // }, + // child: Text(S.of(context).quxiao, + // style: TextStyle( + // fontSize: 18.sp, + // fontWeight: MyFontWeight.semi_bold, + // color:Colors.black, + // ), + // ), + // ), + // ), + ], + ), + Expanded( + child: Container( + child: SmartRefresher( + controller: refreshController, + enablePullDown: true, + enablePullUp: false, + header: MyHeader(), + physics: BouncingScrollPhysics(), + onRefresh: () { + setState(() {}); + }, + child: SingleChildScrollView( + physics: NeverScrollableScrollPhysics(), + child: FutureBuilder( + // future: queryHome(), + builder: (context, snapshot) { + return Column( + children: [ + ///购物车商品列表 + CartGoodsList(), + ], + ); + }, + ), + ), + ), + ), + ), + ], + ), + Align( + alignment: Alignment(0.8,0.8), + child: Container( + height:70.h, + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + color: Color(0xFFFAFAFA), + ), + padding: EdgeInsets.only(left: 16.w,right: 16.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + "assets/image/icon_radio_unselected.png", + width: 16, + height: 16, + ), + SizedBox(width: 5.w), + Expanded(child: Text( + "全选", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFFA29E9E), + ), + ),), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "合计:", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Colors.black, + ), + ), + TextSpan( + text: "¥20.4", + style: TextStyle( + fontSize: 20.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF32A060), + ), + ), + + ], + ), + ), + Container( + alignment: Alignment.center, + width: 70.w, + height: 32.h, + margin: EdgeInsets.only(left:6.w), + decoration: BoxDecoration( + color: Color(0xFF32A060), + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), + child: Text( + "结算", + style: TextStyle( + fontSize: 16.sp, + fontWeight: MyFontWeight.regular, + color: Colors.white, + ), + ), + ), + // Container( + // alignment: Alignment.center, + // width: 70.w, + // height: 32.h, + // margin: EdgeInsets.only(left:6.w), + // decoration: BoxDecoration( + // color: Color(0xFFFB312B), + // borderRadius: BorderRadius.circular(16), + // boxShadow: [ + // BoxShadow( + // color: Colors.black.withAlpha(12), + // offset: Offset(0, 3), + // blurRadius: 14, + // spreadRadius: 0, + // ), + // ], + // ), + // child: Text( + // "删除", + // style: TextStyle( + // fontSize: 16.sp, + // fontWeight: MyFontWeight.regular, + // color: Colors.white, + // ), + // ), + // ), + ], + ), + ), + ), + ], + ); + } + + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/store/shopping/shopping_goods_details.dart b/lib/store/shopping/shopping_goods_details.dart new file mode 100644 index 00000000..72b7bb27 --- /dev/null +++ b/lib/store/shopping/shopping_goods_details.dart @@ -0,0 +1,1235 @@ +import 'dart:convert'; + +import 'package:dio/dio.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_html/flutter_html.dart'; +import 'package:flutter_html/image_render.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:huixiang/generated/l10n.dart'; +import 'package:huixiang/retrofit/data/base_data.dart'; +import 'package:huixiang/retrofit/data/goods.dart'; +import 'package:huixiang/retrofit/data/user_info.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:shared_preferences/shared_preferences.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class ShoppingGoodsDetails extends StatefulWidget { + @override + State createState() { + return _ShoppingGoodsDetails(); + } +} + +class _ShoppingGoodsDetails extends State { + ApiService apiService; + + @override + void initState() { + super.initState(); + + SharedPreferences.getInstance().then((value) { + apiService = + ApiService(Dio(), context: context, token: value.getString("token")); + }); + } + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Container( + color: Color(0xFFF7F7F7), + child: Column( + children: [ + Expanded( + child: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildColumn(), + + ///拼团 + groupOption(), + + ///拼团规则 + groupRule(), + goodsOption(), + Padding( + padding: EdgeInsets.only(top: 16.h, bottom: 12.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 21, + height: 1.h, + color: Color(0xFF979797), + ), + Text( + "商品详情", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF585858), + ), + ), + Container( + width: 21, + height: 1.h, + color: Color(0xFF979797), + ), + ], + ), + ), + Container( + color: Colors.white, + child: Html( + data: "", + customImageRenders: { + networkSourceMatcher(): networkImageRender( + loadingWidget: () { + return Container(); + }, + ), + }, + ), + ), + ], + ), + ), + flex: 1, + ), + ], + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: Container( + height:80.h, + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + color: Color(0xFFFAFAFA), + ), + padding: EdgeInsets.only(left: 16.w, right: 16.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + GestureDetector( + onTap: () { + setState(() { + Navigator.of(context) + .pushNamed('/router/shopping_mall_home', arguments: { + "type": 1, + }); + }); + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + "assets/image/goods_cart.png", + width: 24, + height: 24, + ), + Text( + "购物车", + style: TextStyle( + fontSize: 9.sp, + fontWeight: MyFontWeight.regular, + color: Colors.black, + ), + ), + ], + ), + ), + GestureDetector( + onTap: () { + setState(() { + // showCallMobile)(); + }); + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + "assets/image/goods_phone.png", + width: 24, + height: 24, + ), + Text( + "联系平台", + style: TextStyle( + fontSize: 9.sp, + fontWeight: MyFontWeight.regular, + color: Colors.black, + ), + ), + ], + ), + ), + payButton(), + ], + ), + ), + ), + ], + ); + } + + ///购买按钮 + Widget payButton() { + return Container( + child: Row( + children: [ + // GestureDetector( + // child:Container( + // alignment: Alignment.center, + // width: 120.w, + // height:37.h, + // margin: EdgeInsets.only(left:6.w), + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(16), + // border: Border.all( + // width: 1, + // color: Color(0xFF32A060), + // style: BorderStyle.solid, + // ), + // ), + // child: Text( + // "加入购物车", + // style: TextStyle( + // fontSize: 16.sp, + // fontWeight: MyFontWeight.regular, + // color: Color(0xFF32A060), + // ), + // ), + // ), + // ), + // GestureDetector( + // child: Container( + // alignment: Alignment.center, + // width: 120.w, + // height:37.h, + // margin: EdgeInsets.only(left:6.w), + // decoration: BoxDecoration( + // color: Color(0xFF32A060), + // borderRadius: BorderRadius.circular(16), + // boxShadow: [ + // BoxShadow( + // color: Colors.black.withAlpha(12), + // offset: Offset(0, 3), + // blurRadius: 14, + // spreadRadius: 0, + // ), + // ], + // ), + // child: Text( + // "立即购买", + // style: TextStyle( + // fontSize: 16.sp, + // fontWeight: MyFontWeight.regular, + // color: Colors.white, + // ), + // ), + // ) + // ), + ///秒杀按钮 + GestureDetector( + onTap: (){ + Navigator.of(context).popAndPushNamed('/router/group_details'); + }, + child: Container( + alignment: Alignment.center, + width: 120.w, + height:40.h, + margin: EdgeInsets.only(left: 6.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + border: Border.all( + width: 1, + color: Color(0xFF32A060), + style: BorderStyle.solid, + ), + ), + child: Column( + children: [ + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "¥", + style: TextStyle( + fontSize: 7.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF32A060), + ), + ), + TextSpan( + text: "284.00", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF32A060), + ), + ), + ], + ), + ), + Expanded(child: + Text( + "原价购买", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF32A060), + ), + )), + ], + ), + ), + ), + GestureDetector( + onTap: (){ + Navigator.of(context).popAndPushNamed('/router/bargain_details'); + }, + child: Container( + alignment: Alignment.center, + width: 120.w, + height: 40.h, + margin: EdgeInsets.only(left: 6.w), + decoration: BoxDecoration( + color: Color(0xFF32A060), + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), + child: Column( + children: [ + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "¥", + style: TextStyle( + fontSize: 7.sp, + fontWeight: MyFontWeight.medium, + color: Colors.white, + ), + ), + TextSpan( + text: "284.00", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.medium, + color: Colors.white, + ), + ), + ], + ), + ), + Expanded(child: + Text( + "我要秒杀", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.medium, + color: Colors.white, + ), + ),), + ], + ), + )), + ], + ), + ); + } + + Widget buildColumn() { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.vertical( + bottom: Radius.circular(8.h), + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + color: Colors.white), + child: Column( + children: [ + swiper(), + Container( + width: double.infinity, + alignment: Alignment.center, + height: 50.h, + padding: EdgeInsets.only(left: 16.w), + decoration: BoxDecoration( + // image: DecorationImage( + // fit: BoxFit.fill, + // image: AssetImage("assets/image/attainment_bj.png"), + // ), + color: Colors.green), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "¥", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Colors.white, + ), + ), + TextSpan( + text: "282.00", + style: TextStyle( + fontSize: 28.sp, + fontWeight: MyFontWeight.semi_bold, + color: Colors.white, + ), + ), + ], + ), + ), + SizedBox(width: 4.w), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "原价¥283.00", + style: TextStyle( + fontWeight: MyFontWeight.regular, + decoration: TextDecoration.lineThrough, + decorationColor: Colors.white, + fontSize: 9.sp, + color: Colors.white, + ), + ), + Text( + "已售12件", + style: TextStyle( + fontWeight: MyFontWeight.medium, + fontSize: 10.sp, + color: Colors.white, + ), + ), + ], + ) + ], + ), + ), + Container( + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 16.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Text( + "[前进麦味]全麦吐司250g", + style: TextStyle( + fontWeight: MyFontWeight.semi_bold, + fontSize: 15.sp, + color: Color(0xFF353535), + ), + ), + ), + Container( + margin: EdgeInsets.only(top: 8, right: 8), + padding: EdgeInsets.only(left: 2, right: 2), + height: 17.h, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(2), + color: Color(0xFF5A5A5A), + ), + child: Text( + "中国大陆5仓", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Colors.white, + ), + ), + ), + ], + ), + SizedBox( + height: 8.h, + ), + Text( + "人生没有标准答案,一切答案都在行动中,前进卖完也是一样,用真诚行动践行标准的定义", + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontWeight: MyFontWeight.regular, + fontSize: 13.sp, + color: Color(0xFF585858), + ), + ), + ], + ), + ), + ], + ), + ); + } + + Widget swiper() { + return Container( + child: AspectRatio( + aspectRatio: 1.3698, + child: Stack( + children: [ + Swiper( + pagination: SwiperPagination( + alignment: Alignment.bottomCenter, + builder: DotSwiperPaginationBuilder( + size: 8, + activeSize: 8, + space: 5, + activeColor: Colors.black, + color: Colors.black.withAlpha(76), + ), + ), + itemBuilder: (context, position) { + return + // goods == null + // ? + Container() + // : Image.network( + // goods.viceImgPaths.elementAt(position), + // fit: BoxFit.cover, + // ) + ; + }, + itemCount: 3, + ), + GestureDetector( + onTap: () { + Navigator.of(context).pop(); + }, + child: Container( + margin: EdgeInsets.only(left: 16, top: 52), + padding: EdgeInsets.all(5), + child: Image.asset( + "assets/image/integral_return.png", + // alignment: Alignment.center, + width: 24, + height: 24, + ), + ), + ), + ], + ), + ), + ); + } + + ///快递/規格/退款 + Widget goodsOption() { + return Container( + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.vertical( + bottom: Radius.circular(8.h), + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + color: Colors.white), + margin: EdgeInsets.only(top: 16.h), + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 16.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "快递", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFFA2A2A2), + ), + ), + SizedBox( + width: 8.w, + ), + Expanded( + child: Text( + "免邮费(吉林省、黑龙江省、西藏自治区、新疆维吾尔自治区、香港特别行政区除外)", + overflow: TextOverflow.ellipsis, + maxLines: 2, + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF353535), + ), + ), + ), + ], + ), + Container( + margin: EdgeInsets.only(left: 32.w, top: 8.h, bottom: 8.h), + width: double.infinity, + height: 1.h, + color: Color(0xFFF1F1F1), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "规格", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFFA2A2A2), + ), + ), + SizedBox( + width: 8.w, + ), + Expanded( + child: Text( + "250ml/瓶*2(礼盒装)", + overflow: TextOverflow.ellipsis, + maxLines: 2, + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF353535), + ), + ), + ), + GestureDetector( + onTap: () {}, + child: Icon( + Icons.arrow_forward_ios, + color: Colors.black, + size: 16.sp, + ), + ), + ], + ), + Container( + margin: EdgeInsets.only(left: 32.w, top: 8.h, bottom: 8.h), + width: double.infinity, + height: 1.h, + color: Color(0xFFF1F1F1), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "退款", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFFA2A2A2), + ), + ), + SizedBox( + width: 8.w, + ), + Expanded( + child: Text( + "如需退款请联系商家,待商家确认后,将进行退款。", + overflow: TextOverflow.ellipsis, + maxLines: 2, + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF353535), + ), + ), + ), + ], + ), + ], + ), + ); + } + + ///拼团 + Widget groupOption() { + return Container( + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.vertical( + bottom: Radius.circular(8.h), + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + color: Colors.white), + margin: EdgeInsets.only(top: 16.h), + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 16.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Text( + "可参加的团", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF353535), + ), + ), + ), + GestureDetector( + onTap: (){ + setState(() { + Navigator.of(context).popAndPushNamed('/router/group_page_details'); + }); + }, + child: Text( + "更多", + style: TextStyle( + fontSize: 11.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF585858), + ), + ), + ), + Icon( + Icons.arrow_forward_ios, + size: 16, + color: Colors.black, + ), + ], + ), + SizedBox(height: 12.h), + ListView.builder( + padding: EdgeInsets.zero, + itemCount: 2, + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + setState(() {}); + }, + child: groupItem(), + ); + }, + ), + ], + ), + ); + } + + Widget groupItem() { + return Container( + margin: EdgeInsets.only(top: 8.h, bottom: 8.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // MImage( + // "", + // width:30, + // height:30, + // fit: BoxFit.cover, + // isCircle: true, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + Image.asset( + "assets/image/icon_story_td.png", + width: 30, + height: 30, + fit: BoxFit.cover, + ), + SizedBox(width: 4.w), + Expanded( + child: Text( + "团长名称", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF4D4D4D), + ), + )), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "还差:", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF353535), + ), + ), + TextSpan( + text: "1", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF32A060), + ), + ), + TextSpan( + text: "人", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF353535), + ), + ), + ], + ), + ), + Text( + "剩余23:12:12", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF353535), + ), + ), + ], + ), + Container( + alignment: Alignment.center, + width: 53.w, + height: 22.h, + margin: EdgeInsets.only(left: 4.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(13), + gradient: new LinearGradient( + begin: Alignment.centerRight, + end: Alignment.centerLeft, + colors: [ + Color(0xFF61CE6B), + Color(0xFF32A057), + ]), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), + child: Text( + "去参团", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.medium, + color: Colors.white, + ), + ), + ) + ], + ), + ); + } + + ///拼团规则 + Widget groupRule() { + return Container( + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.vertical( + bottom: Radius.circular(8.h), + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + color: Colors.white), + margin: EdgeInsets.only(top: 16.h), + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 16.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "拼团规则", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF353535), + ), + ), + SizedBox(height: 12.h), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + "assets/image/zu_tuan.png", + width: 42, + height: 42, + fit: BoxFit.cover, + ), + Container( + width: 51, + child: Flex( + children: List.generate(8, (_) { + return SizedBox( + width: 3, + height: 1, + child: DecoratedBox( + decoration: + BoxDecoration(color: Color(0xFF32A060)), + ), + ); + }), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + ), + ), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + children: [ + Text( + "开团/参团", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF181818), + ), + ), + Text( + "拼团享低价", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF5F5F5F), + ), + ), + ], + ), + Container( + width: 43, + child: Flex( + children: List.generate(0, (_) { + return SizedBox( + width: 3, + height: 1, + child: DecoratedBox( + decoration: BoxDecoration(color: Colors.white), + ), + ); + }), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + ), + ), + ], + ), + ], + ), + Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + "assets/image/zt_zf.png", + width: 42, + height: 42, + fit: BoxFit.cover, + ), + Container( + width: 51, + child: Flex( + children: List.generate(8, (_) { + return SizedBox( + width: 3, + height: 1, + child: DecoratedBox( + decoration: + BoxDecoration(color: Color(0xFF32A060)), + ), + ); + }), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + ), + ), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + children: [ + Text( + "成功支付", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF181818), + ), + ), + Text( + "下单可开团", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF5F5F5F), + ), + ), + ], + ), + Container( + width: 43, + child: Flex( + children: List.generate(0, (_) { + return SizedBox( + width: 3, + height: 1, + child: DecoratedBox( + decoration: BoxDecoration(color: Colors.white), + ), + ); + }), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + ), + ), + ], + ), + ], + ), + Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + "assets/image/yq_zt.png", + width: 42, + height: 42, + fit: BoxFit.cover, + ), + Container( + width: 51, + child: Flex( + children: List.generate(8, (_) { + return SizedBox( + width: 3, + height: 1, + child: DecoratedBox( + decoration: + BoxDecoration(color: Color(0xFF32A060)), + ), + ); + }), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + ), + ), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + children: [ + Text( + "邀请参团", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF181818), + ), + ), + Text( + "一起享优惠", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF5F5F5F), + ), + ), + ], + ), + Container( + width: 43, + child: Flex( + children: List.generate(0, (_) { + return SizedBox( + width: 3, + height: 1, + child: DecoratedBox( + decoration: BoxDecoration(color: Colors.white), + ), + ); + }), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + ), + ), + ], + ), + ], + ), + Column( + children: [ + Image.asset( + "assets/image/zt_m.png", + width: 42, + height: 42, + fit: BoxFit.cover, + ), + SizedBox(height: 8.h), + Text( + "人满成团", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF181818), + ), + ), + Text( + "人不满退款", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF5F5F5F), + ), + ), + ], + ), + ], + ), + ], + ), + ); + } + + ///联系电话 +// showCallMobile() { +// showCupertinoModalPopup( +// context: context, +// builder: (context) { +// return CupertinoActionSheet( +// title: Text(S.of(context).bodadianhua), +// actions: [ +// if (widget.storeInfo != null && +// widget.storeInfo.tel != null && +// widget.storeInfo.tel != "") +// CupertinoActionSheetAction( +// child: Text(widget.storeInfo.tel), +// onPressed: () { +// callMobile(widget.storeInfo.tel); +// Navigator.of(context).pop(); +// }, +// isDefaultAction: true, +// isDestructiveAction: false, +// ), +// ], +// cancelButton: CupertinoActionSheetAction( +// onPressed: () { +// Navigator.of(context).pop(); +// }, +// child: Text(S.of(context).quxiao), +// isDestructiveAction: true, +// ), +// ); +// }); +// } +// +// callMobile(mobile) async { +// String url = "tel:$mobile"; +// if (await canLaunch(url)) { +// await launch(url); +// } else { +// throw 'Could not launch $url'; +// } +// } + +} diff --git a/lib/store/shopping/shopping_home/activity_banner.dart b/lib/store/shopping/shopping_home/activity_banner.dart new file mode 100644 index 00000000..83bf20ce --- /dev/null +++ b/lib/store/shopping/shopping_home/activity_banner.dart @@ -0,0 +1,205 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:huixiang/retrofit/data/banner.dart'; +import 'package:huixiang/retrofit/retrofit_api.dart'; +import 'package:huixiang/view_widget/custom_image.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; +import 'package:huixiang/utils/font_weight.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class ActivityBanner extends StatefulWidget { + final List bannerData; + final SwiperController controller; + + ActivityBanner(this.bannerData, this.controller); + + @override + State createState() { + return _ActivityBanner(); + } +} + +class _ActivityBanner extends State { + ApiService apiService; + final RefreshController refreshController = RefreshController(); + List bannerData = []; + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.only(bottom:10), + child: AspectRatio( + aspectRatio: 1.23, + child: Swiper( + viewportFraction: 0.9, + scale: 0.73, + pagination: SwiperPagination( + alignment: Alignment.bottomCenter, + builder: DotSwiperPaginationBuilder( + size: 8, + activeSize: 8, + space: 5, + activeColor: Colors.black, + color: Colors.black.withAlpha(76), + ), + ), + physics: BouncingScrollPhysics(), + itemBuilder: (context, position) { + return Column( + children: [ + InkWell( + onTap: () { + bannerClick(widget.bannerData[position]); + }, + child: + // MImage( + // (widget.bannerData != null && + // position < widget.bannerData.length) + // ? widget.bannerData[position].imgUrl + // : "", + // width:double.infinity, + // fit: BoxFit.cover, + // errorSrc: "assets/image/default_2_1.png", + // fadeSrc: "assets/image/default_2_1.png", + // ), + Image.asset( + "assets/image/icon_story_td.png", + height:185, + width:double.infinity, + fit: BoxFit.cover, + ), + ), + // Expanded(child: child) + Container( + height: 138, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.vertical(bottom: Radius.circular(8)), + ), + child: ListView.builder( + scrollDirection: Axis.horizontal, + physics: BouncingScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: 12), + itemCount: 4, + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + Navigator.of(context).pushNamed( + '/router/shopping_goods_details', + arguments: {}, + ); + }, + child: activityBannerItem(), + ); + }, + ), + ), + ], + ); + }, + itemCount: + (widget.bannerData != null && widget.bannerData.length > 0) + ? widget.bannerData.length + : 1), + ), + ); + } + + Widget activityBannerItem() { + return Container( + margin: EdgeInsets.only(right:7.w,left:7.w), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // MImage( + // "assets/image/icon_story_td.png", + // isCircle: true, + // width: 70.w, + // height: 70.h, + // fit: BoxFit.cover, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + Image.asset( + "assets/image/icon_story_td.png", + width: 70, + height: 70, + fit: BoxFit.cover, + ), + SizedBox( + height: 4, + ), + Text( + "[一心回乡]甄果", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF353535), + ), + ), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "¥", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF32A060), + ), + ), + TextSpan( + text: "12.60", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF32A060), + ), + ), + ], + ), + ), + ], + ), + ); + } + + /// contentType 跳转类型(0:不跳转,1:积分商品,2:活动,3:文章,4:页面跳转,5:课程) + bannerClick(BannerData bannerData) async { + switch (bannerData.contentType) { + case 1: + Navigator.of(context).pushNamed('/router/integral_store_page', + arguments: {"goodsId": bannerData.content}); + break; + case 2: + Navigator.of(context).pushNamed('/router/web_page', arguments: { + "activityId": bannerData.content, + }); + break; + case 3: + Navigator.of(context).pushNamed('/router/web_page', arguments: { + "articleId": bannerData.content, + }); + break; + case 4: + String router = bannerData.content; + if (router.contains("?")) { + String params = router.substring(router.indexOf("?")); + params = params.replaceAll("?", ""); + Map map = jsonDecode(params); + Navigator.of(context).pushNamed(router, arguments: map); + } else { + Navigator.of(context).pushNamed(router); + } + break; + case 5: + Navigator.of(context).pushNamed('/router/class_details', arguments: { + "id": bannerData.content, + }); + break; + } + } +} diff --git a/lib/store/shopping/shopping_home/bargain_details.dart b/lib/store/shopping/shopping_home/bargain_details.dart new file mode 100644 index 00000000..b5d04bdb --- /dev/null +++ b/lib/store/shopping/shopping_home/bargain_details.dart @@ -0,0 +1,753 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_swiper/flutter_swiper.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:pull_to_refresh/pull_to_refresh.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class BargainDetails extends StatefulWidget { + @override + State createState() { + return _BargainDetails(); + } +} + +class _BargainDetails extends State { + ApiService apiService; + + @override + void initState() { + super.initState(); + } + + final SwiperController controller = SwiperController(); + + @override + void dispose() { + super.dispose(); + if (refreshController != null) refreshController.dispose(); + } + + final RefreshController refreshController = RefreshController(); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Container( + color: Color(0xFFF7F7F7), + ), + Stack( + children: [ + Container( + height: 330.h, + decoration: BoxDecoration( + gradient: new LinearGradient( + begin: Alignment.centerRight, + end: Alignment.centerLeft, + colors: [ + Color(0xFFE8F5E9), + Color(0xFFE5F7FF), + ]), + ), + ), + Column( + children: [ + MyAppBar( + title: "砍价详情", + titleColor: Colors.black, + leadingColor: Colors.black, + background: Colors.transparent, + ), + Expanded( + child: Container( + child: SmartRefresher( + controller: refreshController, + enablePullDown: true, + enablePullUp: false, + header: MyHeader(), + physics: BouncingScrollPhysics(), + onRefresh: () { + setState(() {}); + }, + child: SingleChildScrollView( + physics: NeverScrollableScrollPhysics(), + child: FutureBuilder( + // future: queryHome(), + builder: (context, snapshot) { + return Column( + children: [ + bargainGoodsInfo(), + bargainProgress(), + bargainRule(), + bargainFriendsList(), + ], + ); + }, + ), + ), + ), + ), + ), + ], + ) + ], + ), + ], + ); + } + + ///商品信息b + Widget bargainGoodsInfo() { + return Container( + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + color: Colors.white), + margin: EdgeInsets.only(left: 16.w, right: 16.w, top: 24.h), + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 16.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(2), + child: Image.asset( + "assets/image/icon_story_td.png", + width: 85, + height: 85, + fit: BoxFit.cover, + ), + ), + // MImage( + // "", + // width: double.infinity, + // height: 166, + // fit: BoxFit.cover, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + SizedBox( + width: 10, + ), + Expanded( + child: Container( + height: 85, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "[生态小农]山林放养鸡蛋30枚/盒备份 2", + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF353535), + ), + ), + Text( + "套盒装", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF727272), + ), + ), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "¥", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF9476F7), + ), + ), + TextSpan( + text: "284.00", + style: TextStyle( + fontSize: 16.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF9476F7), + ), + ), + ], + ), + ), + ], + ), + )) + ], + ), + ); + } + + ///砍价进度 + Widget bargainProgress() { + return Container( + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + color: Colors.white), + margin: EdgeInsets.only(left: 16.w, right: 16.w, top: 24.h), + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 16.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container(margin: EdgeInsets.only(left: 10),child: + Stack( + alignment: Alignment.bottomLeft, + children: [ + Container( + alignment: Alignment.center, + width:67, + height:23.h, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + color: Color(0xFF9476F7), + ), + child: Text( + "砍价成功", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Colors.white, + ), + ), + ), + Align( + alignment: Alignment.bottomLeft, + child: + Container(height:8,child: Icon( + Icons.arrow_drop_down, + color: Color(0xFF9476F7), + size: 18, + ),), + ), + ], + ),), + SizedBox(height:10), + ClipRRect( + borderRadius: BorderRadius.circular(6.5), + child: + Stack( + children: [ + Container( + width:double.infinity, + height: 8.h, + color: Color(0xFFF5F5F5), + ), + Container( + width: 100.w, + height: 8.h, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [Color(0xFFFEC401), Color(0xFF9274F7)])), + ) + ], + )), + SizedBox(height: 3,), + Row( + children: [ + Expanded(child:Text( + "原价¥284.00", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF8D8D8D), + ), + ),), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "最低价¥", + style: TextStyle( + fontSize:9.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF9476F7), + ), + ), + TextSpan( + text: "284.00", + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF9476F7), + ), + ), + + ], + ), + ), + ], + ), + SizedBox(height:16), + Row(children: [ + Expanded(child: GestureDetector( + child:Container( + alignment: Alignment.center, + width:double.infinity, + height:54.h, + margin: EdgeInsets.only(left:6.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(27), + border: Border.all( + width: 1, + color: Color(0xFF9476F7), + style: BorderStyle.solid, + ), + ), + child: Text( + "我也要砍", + style: TextStyle( + fontSize: 16.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF9476F7), + ), + ), + ), + )), + // Expanded(child:GestureDetector( + // child: Container( + // alignment: Alignment.center, + // width:double.infinity, + // height:54.h, + // margin: EdgeInsets.only(left:6.w), + // decoration: BoxDecoration( + // color: Color(0xFF9476F7), + // borderRadius: BorderRadius.circular(27), + // boxShadow: [ + // BoxShadow( + // color: Colors.black.withAlpha(12), + // offset: Offset(0, 3), + // blurRadius: 14, + // spreadRadius: 0, + // ), + // ], + // ), + // child: Text( + // "帮他砍价", + // style: TextStyle( + // fontSize: 16.sp, + // fontWeight: MyFontWeight.medium, + // color: Colors.white, + // ), + // ), + // ) + // ),), + Expanded(child:GestureDetector( + child: Container( + alignment: Alignment.center, + width:double.infinity, + height:54.h, + margin: EdgeInsets.only(left:6.w), + decoration: BoxDecoration( + color: Color(0xFFE5E5E5), + borderRadius: BorderRadius.circular(27), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), + child: Text( + "已帮TA砍价", + style: TextStyle( + fontSize: 16.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF858585), + ), + ), + ) + ),), + ],), + // Container( + // alignment: Alignment.center, + // width:double.infinity, + // height:54.h, + // margin: EdgeInsets.only(left:6.w), + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(27), + // color: Color(0xFF9476F7), + // ), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.center, + // children: [ + // Image.asset( + // "assets/image/wx.png", + // width:24, + // height:24, + // fit: BoxFit.cover, + // ), + // SizedBox( + // width:8, + // ), + // Text( + // "邀请微信好友一起拼团", + // style: TextStyle( + // fontSize: 16.sp, + // fontWeight: MyFontWeight.medium, + // color: Colors.white, + // ), + // ) + // ], + // ) + // ) + ], + ), + ); + } + + ///砍价规则 + Widget bargainRule() { + return Container( + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + color: Colors.white), + margin: EdgeInsets.only(left: 16.w, right: 16.w, top: 24.h), + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 16.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 3, + height: 3, + margin: EdgeInsets.only(right: 10), + decoration: BoxDecoration( + color: Color(0xFF9476F7), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Container( + width: 5, + height: 5, + margin: EdgeInsets.only(right: 10), + decoration: BoxDecoration( + color: Color(0xFF9476F7), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Container( + width: 8, + height: 8, + margin: EdgeInsets.only(right: 4), + decoration: BoxDecoration( + color: Color(0xFF9476F7), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Text( + "砍价规则", + style: TextStyle( + fontSize:15.sp, + fontWeight: MyFontWeight.semi_bold, + color: Colors.black, + ), + ), + Container( + width: 8, + height: 8, + margin: EdgeInsets.only(right: 10, left: 4), + decoration: BoxDecoration( + color: Color(0xFF9476F7), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Container( + width: 5, + height: 5, + margin: EdgeInsets.only(right: 10), + decoration: BoxDecoration( + color: Color(0xFF9476F7), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Container( + width: 3, + height: 3, + decoration: BoxDecoration( + color: Color(0xFF9476F7), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + ], + ), + SizedBox( + height: 12, + ), + Text( + "1.选择自己喜欢的商品,邀请好友砍价,每次砍价金额以页面显示为主,邀请的越多,砍价成功的几率越高。", + style: TextStyle( + color: Color(0xFF4C4C4C), + fontSize:12.sp, + height: 1.5, + fontWeight: MyFontWeight.medium, + ), + ), + Text( + "2.砍价成功后,点击立即购买,将以最终价格进行结算。", + style: TextStyle( + color: Color(0xFF4C4C4C), + fontSize:12.sp, + height: 1.5, + fontWeight: MyFontWeight.medium, + ), + ), + Text( + "3.砍价商品不享受平台活动,优惠券以及会员折扣。", + style: TextStyle( + color: Color(0xFF4C4C4C), + fontSize:12.sp, + height: 1.5, + fontWeight: MyFontWeight.medium, + ), + ), + ], + ), + ); + } + + ///砍价好友榜 + Widget bargainFriendsList() { + return Container( + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + color: Colors.white), + margin: EdgeInsets.only(left: 16.w, right: 16.w, top: 24.h), + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 16.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 3, + height: 3, + margin: EdgeInsets.only(right: 10), + decoration: BoxDecoration( + color: Color(0xFF9476F7), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Container( + width: 5, + height: 5, + margin: EdgeInsets.only(right: 10), + decoration: BoxDecoration( + color: Color(0xFF9476F7), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Container( + width: 8, + height: 8, + margin: EdgeInsets.only(right: 4), + decoration: BoxDecoration( + color: Color(0xFF9476F7), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Text( + "好友砍价榜", + style: TextStyle( + fontSize:15.sp, + fontWeight: MyFontWeight.semi_bold, + color: Colors.black, + ), + ), + Container( + width: 8, + height: 8, + margin: EdgeInsets.only(right: 10, left: 4), + decoration: BoxDecoration( + color: Color(0xFF9476F7), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Container( + width: 5, + height: 5, + margin: EdgeInsets.only(right: 10), + decoration: BoxDecoration( + color: Color(0xFF9476F7), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Container( + width: 3, + height: 3, + decoration: BoxDecoration( + color: Color(0xFF9476F7), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + ], + ), + SizedBox( + height:20, + ), + Container( + alignment: Alignment.center, + width: double.infinity, + child: ListView.builder( + shrinkWrap: true, + padding: EdgeInsets.zero, + scrollDirection: Axis.vertical, + physics: BouncingScrollPhysics(), + itemCount: 3, + itemBuilder: (context, position) { + return GestureDetector( + onTap: () {}, + child: bargainFriendsItem(), + ); + }, + ), + // (coupons != null && coupons.length > 0) + // ? ListView.builder( + // padding: EdgeInsets.symmetric(vertical: 8.h), + // itemBuilder: (context, position) { + // return GestureDetector( + // onTap: () { + // Navigator.of(context).pushNamed( + // '/router/vip_details_page', + // arguments: {"id": coupons[position].id}); + // }, + // child: vipCardItem(coupons[position]), + // ); + // }, + // itemCount: coupons != null ? coupons.length : 0, + // ) + // : NoDataView( + // isShowBtn: false, + // text: "暂无好友帮忙砍价~", + // fontSize: 16.sp, + // margin: EdgeInsets.only(top: 120.h), + // ), + ), + SizedBox( + height:20, + ), + ], + ), + ); + } + + Widget bargainFriendsItem() { + return Container( + height: 36.h, + margin: EdgeInsets.only(bottom:10), + child:Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + // MImage( + // "", + // width:34, + // height:34, + // fit: BoxFit.cover, + // isCircle: true, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + Image.asset( + "assets/image/icon_story_td.png", + width: 34, + height: 34, + fit: BoxFit.cover, + ), + SizedBox(width: 4,), + Expanded(child:Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "张三", + style: TextStyle( + fontSize:12.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF353535), + ), + ), + Text( + "3分钟前", + style: TextStyle( + fontSize:10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFFACACAC), + ), + ), + ], + )), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "已砍", + style: TextStyle( + fontSize: 11.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF353535), + ), + ), + TextSpan( + text: "23.00元", + style: TextStyle( + fontSize:11.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF9476F7), + ), + ), + ], + ), + ), + ], + ) + ); + } + +} diff --git a/lib/store/shopping/shopping_home/classify_list.dart b/lib/store/shopping/shopping_home/classify_list.dart new file mode 100644 index 00000000..aaeecec4 --- /dev/null +++ b/lib/store/shopping/shopping_home/classify_list.dart @@ -0,0 +1,97 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart'; +import 'package:huixiang/retrofit/retrofit_api.dart'; +import 'package:huixiang/utils/font_weight.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class ClassifyList extends StatefulWidget { + + @override + State createState() { + return _ClassifyList(); + } +} + +class _ClassifyList extends State { + ApiService apiService; + BMFCoordinate latLng; + + final TextEditingController editingController = TextEditingController(); + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Container( + height: 100.h, + margin: EdgeInsets.only(top:12.h,left: 16.w,right: 16.w), + padding: EdgeInsets.only(bottom: 3.h, top: 16.h,), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + color: Colors.white, + ), + child: ListView.builder( + scrollDirection: Axis.horizontal, + physics: BouncingScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: 14), + itemCount:15, + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + Navigator.of(context) + .pushNamed('/router/search_page'); + }, + child: classifyItem(), + ); + }, + ), + ); + } + + Widget classifyItem() { + return Container( + // height:94.h, + margin: EdgeInsets.only(right: 19.w), + child: Column( + children: [ + // MImage( + // "assets/image/icon_story_td.png", + // isCircle: true, + // width: 48.w, + // height: 48.h, + // fit: BoxFit.cover, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + Image.asset( + "assets/image/icon_story_td.png", + width: 48, + height: 48, + fit: BoxFit.cover, + ), + SizedBox(height: 4,), + Text( + "时令水果", + style: TextStyle( + fontSize: 11.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF1A1A1A), + ), + ), + ], + ), + ); + } +} diff --git a/lib/store/shopping/shopping_home/group_details.dart b/lib/store/shopping/shopping_home/group_details.dart new file mode 100644 index 00000000..350a698b --- /dev/null +++ b/lib/store/shopping/shopping_home/group_details.dart @@ -0,0 +1,888 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_swiper/flutter_swiper.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:pull_to_refresh/pull_to_refresh.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class GroupDetails extends StatefulWidget { + @override + State createState() { + return _GroupDetails(); + } +} + +class _GroupDetails extends State { + ApiService apiService; + + @override + void initState() { + super.initState(); + } + + final SwiperController controller = SwiperController(); + + @override + void dispose() { + super.dispose(); + if (refreshController != null) refreshController.dispose(); + } + + final RefreshController refreshController = RefreshController(); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Container( + color: Color(0xFFF7F7F7), + ), + Stack( + children: [ + Container( + height: 330.h, + decoration: BoxDecoration( + gradient: new LinearGradient( + begin: Alignment.centerRight, + end: Alignment.centerLeft, + colors: [ + Color(0xFFE8F5E9), + Color(0xFFE5F7FF), + ]), + ), + ), + Column( + children: [ + MyAppBar( + title: "拼团详情", + titleColor: Colors.black, + leadingColor: Colors.black, + background: Colors.transparent, + ), + Expanded( + child: Container( + child: SmartRefresher( + controller: refreshController, + enablePullDown: true, + enablePullUp: false, + header: MyHeader(), + physics: BouncingScrollPhysics(), + onRefresh: () { + setState(() {}); + }, + child: SingleChildScrollView( + physics: NeverScrollableScrollPhysics(), + child: FutureBuilder( + // future: queryHome(), + builder: (context, snapshot) { + return Column( + children: [ + goodsInfo(), + inviteGroup(), + groupRule(), + ], + ); + }, + ), + ), + ), + ), + ), + ], + ) + ], + ), + ], + ); + } + + ///商品信息 + Widget goodsInfo() { + return Container( + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + color: Colors.white), + margin: EdgeInsets.only(left: 16.w, right: 16.w, top: 24.h), + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 16.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(2), + child: Image.asset( + "assets/image/icon_story_td.png", + width: 85, + height: 85, + fit: BoxFit.cover, + ), + ), + // MImage( + // "", + // width: double.infinity, + // height: 166, + // fit: BoxFit.cover, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + SizedBox( + width: 10, + ), + Expanded( + child: Container( + height: 85, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "[生态小农]山林放养鸡蛋30枚/盒备份 2", + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF353535), + ), + ), + Text( + "套盒装", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF727272), + ), + ), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "¥", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF32A060), + ), + ), + TextSpan( + text: "284.00", + style: TextStyle( + fontSize: 16.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF32A060), + ), + ), + ], + ), + ), + ], + ), + )) + ], + ), + ); + } + + ///邀请好友拼团 + Widget inviteGroup() { + return Container( + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + color: Colors.white), + margin: EdgeInsets.only(left: 16.w, right: 16.w, top: 24.h), + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 16.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 3, + height: 3, + margin: EdgeInsets.only(right: 10), + decoration: BoxDecoration( + color: Color(0xFFB8BAC1), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Container( + width: 5, + height: 5, + margin: EdgeInsets.only(right: 10), + decoration: BoxDecoration( + color: Color(0xFFB8BAC1), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Container( + width: 8, + height: 8, + margin: EdgeInsets.only(right: 4), + decoration: BoxDecoration( + color: Color(0xFFB8BAC1), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Text( + "拼团剩余时间", + style: TextStyle( + fontSize: 18.sp, + fontWeight: MyFontWeight.semi_bold, + color: Colors.black, + ), + ), + Container( + width: 8, + height: 8, + margin: EdgeInsets.only(right: 10, left: 4), + decoration: BoxDecoration( + color: Color(0xFFB8BAC1), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Container( + width: 5, + height: 5, + margin: EdgeInsets.only(right: 10), + decoration: BoxDecoration( + color: Color(0xFFB8BAC1), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + Container( + width: 3, + height: 3, + decoration: BoxDecoration( + color: Color(0xFFB8BAC1), + borderRadius: BorderRadius.all(Radius.circular(5))), + ), + ], + ), + SizedBox( + height: 12, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + InkWell( + onTap: () {}, + child: Container( + width: 27, + height: 28, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(0xFFD2D2D2), + borderRadius: BorderRadius.circular(4)), + child: Text( + "22", + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: Text( + ":", + style: TextStyle( + fontSize: 16.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFFD2D2D2), + ), + )), + InkWell( + onTap: () {}, + child: Container( + width: 27, + height: 28, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(0xFFD2D2D2), + borderRadius: BorderRadius.circular(4)), + child: Text( + "59", + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: Text( + ":", + style: TextStyle( + fontSize: 16.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFFD2D2D2), + ), + )), + InkWell( + onTap: () {}, + child: Container( + width: 27, + height: 28, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(0xFFD2D2D2), + borderRadius: BorderRadius.circular(4)), + child: Text( + "59", + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + fontWeight: MyFontWeight.medium, + ), + ), + ), + ), + ], + ), + SizedBox( + height: 24, + ), + // Text( + // "恭喜您拼团成功", + // style: TextStyle( + // fontSize: 18.sp, + // fontWeight: MyFontWeight.semi_bold, + // color: Colors.black, + // ), + // ), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "距离拼团成功还差", + style: TextStyle( + fontSize: 18.sp, + fontWeight: MyFontWeight.semi_bold, + color: Colors.black, + ), + ), + TextSpan( + text: "2", + style: TextStyle( + fontSize: 18.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFFF8961E), + ), + ), + TextSpan( + text: "人", + style: TextStyle( + fontSize: 18.sp, + fontWeight: MyFontWeight.semi_bold, + color: Colors.black, + ), + ), + ], + ), + ), + // Text( + // "很遗憾,拼团失败", + // style: TextStyle( + // fontSize: 18.sp, + // fontWeight: MyFontWeight.semi_bold, + // color: Colors.black, + // ), + // ), + SizedBox( + height: 32, + ), + Container( + alignment: Alignment.center, + width: double.infinity, + height: 75.h, + child: ListView.builder( + shrinkWrap: true, + padding: EdgeInsets.zero, + scrollDirection: Axis.horizontal, + physics: BouncingScrollPhysics(), + itemCount: 3, + itemBuilder: (context, position) { + return GestureDetector( + onTap: () {}, + child: groupItem(), + ); + }, + ), + ), + SizedBox( + height:54.h, + ), + InkWell( + onTap: () { + setState(() { + }); + }, + child:Container( + width:double.infinity, + height:54.h, + margin: EdgeInsets.only(bottom: 28), + alignment: Alignment.center, + decoration: BoxDecoration( + color: Color(0xFF00A359), + borderRadius: BorderRadius.circular(27)), + child: Text( + "查看拼团订单", + style: TextStyle( + fontSize: 16.sp, + fontWeight: MyFontWeight.medium, + color: Colors.white, + ), + )), + ), + // InkWell( + // onTap: () { + // setState(() { + // }); + // }, + // child:Container( + // width:double.infinity, + // height:54.h, + // margin: EdgeInsets.only(bottom: 28), + // alignment: Alignment.center, + // decoration: BoxDecoration( + // color: Color(0xFF00A359), + // borderRadius: BorderRadius.circular(27)), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.center, + // children: [ + // Image.asset( + // "assets/image/wx.png", + // width:24, + // height:24, + // fit: BoxFit.cover, + // ), + // SizedBox( + // width:8, + // ), + // Text( + // "邀请微信好友一起拼团", + // style: TextStyle( + // fontSize: 16.sp, + // fontWeight: MyFontWeight.medium, + // color: Colors.white, + // ), + // ) + // ], + // )), + // ), + // InkWell( + // onTap: () { + // setState(() { + // }); + // }, + // child:Container( + // width:double.infinity, + // height:54.h, + // margin: EdgeInsets.only(bottom: 28), + // alignment: Alignment.center, + // decoration: BoxDecoration( + // color: Color(0xFF00A359), + // borderRadius: BorderRadius.circular(27)), + // child: Text( + // "联系客服退款", + // style: TextStyle( + // fontSize: 16.sp, + // fontWeight: MyFontWeight.medium, + // color: Colors.white, + // ), + // )), + // ), + ], + ), + ); + } + + Widget groupItem() { + return Container( + margin: EdgeInsets.only(right:25), + child:Row( + children: [ + Stack( + children: [ + Container( + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(60), + border: Border.all( + width: 1, + color: Color(0xFFF8961E), + // style: BorderStyle.solid, + ), + ), + child:MImage( + "", + width:60.w, + height:60.h, + fit: BoxFit.cover, + isCircle: true, + errorSrc: "assets/image/default_1.png", + fadeSrc: "assets/image/default_1.png", + ), + ), + Align( + alignment: Alignment.bottomCenter, + child:Container( + width: 60.w, + child: Container( + width: 34.w, + height:14.h, + alignment: Alignment.center, + margin: EdgeInsets.only(left:10,right:10), + decoration: BoxDecoration( + color: Color(0xFFF8961E), + borderRadius: BorderRadius.circular(7)), + child: Text( + "团长", + style: TextStyle( + fontSize:8.sp, + fontWeight: MyFontWeight.light, + color: Colors.white, + ), + )), + ), + + ) + ], + ), + // Container( + // width: 60.w, + // height: 67.h, + // child:Image.asset( + // "assets/image/pin_t.png", + // width: 60.w, + // height: 60.h, + // fit: BoxFit.cover, + // ), + // ), + ], + ) + ); + } + + ///拼团规则 + Widget groupRule() { + return Container( + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + color: Colors.white), + margin: EdgeInsets.only(left: 16.w, right: 16.w, top: 24.h,bottom:40.h), + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 16.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "拼团规则", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF353535), + ), + ), + SizedBox(height: 12.h), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + "assets/image/zu_tuan.png", + width: 42, + height: 42, + fit: BoxFit.cover, + ), + Container( + width:45, + child: Flex( + children: List.generate(8, (_) { + return SizedBox( + width: 3, + height: 1, + child: DecoratedBox( + decoration: + BoxDecoration(color: Color(0xFF32A060)), + ), + ); + }), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + ), + ), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + children: [ + Text( + "开团/参团", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF181818), + ), + ), + Text( + "拼团享低价", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF5F5F5F), + ), + ), + ], + ), + Container( + width:35, + child: Flex( + children: List.generate(0, (_) { + return SizedBox( + width: 3, + height: 1, + child: DecoratedBox( + decoration: BoxDecoration(color: Colors.white), + ), + ); + }), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + ), + ), + ], + ), + ], + ), + Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + "assets/image/zt_zf.png", + width: 42, + height: 42, + fit: BoxFit.cover, + ), + Container( + width: 45, + child: Flex( + children: List.generate(8, (_) { + return SizedBox( + width: 3, + height: 1, + child: DecoratedBox( + decoration: + BoxDecoration(color: Color(0xFF32A060)), + ), + ); + }), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + ), + ), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + children: [ + Text( + "成功支付", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF181818), + ), + ), + Text( + "下单可开团", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF5F5F5F), + ), + ), + ], + ), + Container( + width: 35, + child: Flex( + children: List.generate(0, (_) { + return SizedBox( + width: 3, + height: 1, + child: DecoratedBox( + decoration: BoxDecoration(color: Colors.white), + ), + ); + }), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + ), + ), + ], + ), + ], + ), + Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + "assets/image/yq_zt.png", + width: 42, + height: 42, + fit: BoxFit.cover, + ), + Container( + width: 45, + child: Flex( + children: List.generate(8, (_) { + return SizedBox( + width: 3, + height: 1, + child: DecoratedBox( + decoration: + BoxDecoration(color: Color(0xFF32A060)), + ), + ); + }), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + ), + ), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + children: [ + Text( + "邀请参团", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF181818), + ), + ), + Text( + "一起享优惠", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF5F5F5F), + ), + ), + ], + ), + Container( + width: 35, + child: Flex( + children: List.generate(0, (_) { + return SizedBox( + width: 3, + height: 1, + child: DecoratedBox( + decoration: BoxDecoration(color: Colors.white), + ), + ); + }), + mainAxisAlignment: MainAxisAlignment.spaceBetween, + direction: Axis.horizontal, + ), + ), + ], + ) + ], + ), + Column( + children: [ + Image.asset( + "assets/image/zt_m.png", + width: 42, + height: 42, + fit: BoxFit.cover, + ), + SizedBox(height: 8.h), + Text( + "人满成团", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF181818), + ), + ), + Text( + "人不满退款", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF5F5F5F), + ), + ), + ], + ), + ], + ), + ], + ) + ); + } +} diff --git a/lib/store/shopping/shopping_home/group_page_details.dart b/lib/store/shopping/shopping_home/group_page_details.dart new file mode 100644 index 00000000..0e761da7 --- /dev/null +++ b/lib/store/shopping/shopping_home/group_page_details.dart @@ -0,0 +1,214 @@ +import 'package:flutter/material.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/my_appbar.dart'; +import 'package:huixiang/view_widget/my_footer.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class GroupPageDetails extends StatefulWidget { + + @override + State createState() { + return _GroupPageDetails(); + } +} + +class _GroupPageDetails extends State { + RefreshController refreshController = RefreshController(); + ApiService apiService; + int pageNum = 0; + + @override + void initState() { + super.initState(); + _onRefresh(); + } + + _onRefresh() async { + pageNum = 0; + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.white, + child: Column( + children: [ + MyAppBar( + title:"可参加的团", + titleColor: Colors.black, + leadingColor: Colors.black, + background: Colors.transparent, + ), + Expanded( + child: Container( + child: SmartRefresher( + controller: refreshController, + enablePullDown: true, + enablePullUp: true, + header: MyHeader(), + physics: BouncingScrollPhysics(), + onRefresh: () { + setState(() {}); + }, + child: SingleChildScrollView( + physics: NeverScrollableScrollPhysics(), + child: FutureBuilder( + // future: queryHome(), + builder: (context, snapshot) { + return Column( + children: [ + groupList(), + ], + ); + }, + ), + ), + ), + ), + ), + ], + ), + ); + } + + ///参团列表 + Widget groupList() { + return Container( + height: MediaQuery.of(context).size.height-62.h-MediaQuery.of(context).padding.top, + padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 16.h), + child: ListView.builder( + padding: EdgeInsets.zero, + itemCount:10, + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: BouncingScrollPhysics(), + itemBuilder: (context, position) { + return GestureDetector( + onTap: () { + setState(() {}); + }, + child: groupItem(), + ); + }, + ), + ); + } + + Widget groupItem() { + return Container( + height: 44.h, + margin: EdgeInsets.only(top: 8.h, bottom: 8.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // MImage( + // "", + // width:44, + // height:44, + // fit: BoxFit.cover, + // isCircle: true, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + Image.asset( + "assets/image/icon_story_td.png", + width: 44, + height: 44, + fit: BoxFit.cover, + ), + SizedBox(width: 4.w), + Expanded( + child: Text( + "团长名称", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF4D4D4D), + ), + )), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "还差:", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF353535), + ), + ), + TextSpan( + text: "1", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF32A060), + ), + ), + TextSpan( + text: "人", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF353535), + ), + ), + ], + ), + ), + Text( + "剩余23:12:12", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF353535), + ), + ), + ], + ), + Container( + alignment: Alignment.center, + width: 53.w, + height: 22.h, + margin: EdgeInsets.only(left: 4.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(13), + gradient: new LinearGradient( + begin: Alignment.centerRight, + end: Alignment.centerLeft, + colors: [ + Color(0xFF61CE6B), + Color(0xFF32A057), + ]), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), + child: Text( + "去参团", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.medium, + color: Colors.white, + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/store/shopping/shopping_home/recommend_goods_list_view.dart b/lib/store/shopping/shopping_home/recommend_goods_list_view.dart new file mode 100644 index 00000000..b98bfa1b --- /dev/null +++ b/lib/store/shopping/shopping_home/recommend_goods_list_view.dart @@ -0,0 +1,214 @@ +import 'package:flutter/material.dart'; +import 'package:huixiang/utils/flutter_utils.dart'; +import 'package:huixiang/utils/font_weight.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class RecommendGoodsListView extends StatefulWidget { + @override + State createState() { + return _RecommendGoodsListView(); + } +} + +class _RecommendGoodsListView extends State { + @override + Widget build(BuildContext context) { + return Column( + children: [ + Text( + "为你推荐", + overflow: TextOverflow.ellipsis, + maxLines: 2, + style: TextStyle( + fontSize: 16.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF1A1A1A), + ), + ), + Container( + color: Color(0xFF32A060), + width: 35.w, + height: 5.h, + ), + GridView.builder( + itemCount: 6, + padding: EdgeInsets.only( + left: 16.w, + right: 16.w, + top: 13.h, + bottom: 16.h, + ), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + //一行的Widget数量 + crossAxisCount: 2, + //水平子Widget之间间距 + crossAxisSpacing: 11.w, + //垂直子Widget之间间距 + mainAxisSpacing: 16.w, + //子Widget宽高比例 0.59 + childAspectRatio: + 185 / (281 / 2 + (281 / 2) * AppUtils.textScale(context)), + ), + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + Navigator.of(context).pushNamed( + '/router/shopping_goods_details', + arguments: {}, + ); + }, + child: goodsListItem(), + ); + }, + ) + ], + ); + } + + Widget goodsListItem() { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.vertical( + top: Radius.circular(8), + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(10), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + color: Colors.white, + ), + margin: EdgeInsets.symmetric( + vertical: 3, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(10), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + ), + child: + // MImage( + // "", + // width: double.infinity, + // height: 166, + // fit: BoxFit.cover, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + Image.asset( + "assets/image/icon_story_td.png", + width: double.infinity, + fit: BoxFit.cover, + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.only(left: 12.w, right: 12.w), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Container( + margin: EdgeInsets.only(top: 8, right: 8), + padding: EdgeInsets.only(left: 2, right: 2), + height: 17.h, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(2), + color: Color(0xFF5A5A5A), + ), + child: Text( + "中国大陆5仓", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Colors.white, + ), + ), + ), + Text( + "已售12件", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF5D5D5D), + ), + ), + ], + ), + Text( + "SWISSGEAR瑞士军刀联名款马克杯", + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF353535), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "¥", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF32A060), + ), + ), + TextSpan( + text: "284.00", + style: TextStyle( + fontSize: 18.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF32A060), + ), + ), + ], + ), + ), + Text( + "¥283.00", + style: TextStyle( + fontSize: 14.sp, + decoration: TextDecoration.lineThrough, + decorationColor: Color(0xFF585858), + fontWeight: MyFontWeight.regular, + color: Color(0xFFA2A2A2), + ), + ), + ], + ), + ], + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/store/shopping/shopping_home/search_page.dart b/lib/store/shopping/shopping_home/search_page.dart new file mode 100644 index 00000000..f6482224 --- /dev/null +++ b/lib/store/shopping/shopping_home/search_page.dart @@ -0,0 +1,607 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_html/flutter_html.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:fluwx/fluwx.dart'; +import 'package:huixiang/generated/l10n.dart'; +import 'package:huixiang/retrofit/data/base_data.dart'; +import 'package:huixiang/retrofit/data/vip_benefit_list.dart'; +import 'package:huixiang/retrofit/data/vip_rule_details.dart'; +import 'package:huixiang/retrofit/data/wx_pay.dart'; +import 'package:huixiang/retrofit/retrofit_api.dart'; +import 'package:huixiang/utils/flutter_utils.dart'; +import 'package:huixiang/utils/font_weight.dart'; +import 'package:huixiang/utils/min.dart'; +import 'package:huixiang/view_widget/classic_header.dart'; +import 'package:huixiang/view_widget/icon_text.dart'; +import 'package:huixiang/view_widget/item_input_widget.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:huixiang/view_widget/my_appbar.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'; + +class SearchPage extends StatefulWidget { + @override + State createState() { + return _SearchPage(); + } +} + +class _SearchPage extends State { + ApiService apiService; + TextEditingController controller = TextEditingController(); + final RefreshController refreshController = RefreshController(); + int optionIndex = 0; + + @override + void initState() { + super.initState(); + + SharedPreferences.getInstance().then((value) { + apiService = ApiService(Dio(), + context: context, token: value.getString("token"), pay: true); + }); + } + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.transparent, + ), + color: Colors.transparent, + borderRadius: new BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + ), + ), + ), + Stack( + children: [ + Container( + // padding: EdgeInsets.only(top: 40.h), + height: 140.h, + decoration: BoxDecoration( + gradient: new LinearGradient( + begin: Alignment.centerRight, + end: Alignment.centerLeft, + colors: [ + Color(0xFFE8F5E9), + Color(0xFFE5F7FF), + ]), + ), + ), + Column( + children: [ + Container( + height: 100.h, + color: Colors.transparent, + margin: EdgeInsets.only(left: 16.w, right: 16.w, top: 15.h), + child: Row( + children: [ + GestureDetector( + onTap: (){ + Navigator.of(context).pop(); + }, + child: Icon( + Icons.arrow_back_ios, + size: 24, + color: Colors.black, + ), + ), + Expanded( + child: Container( + height: 30.h, + margin: EdgeInsets.fromLTRB(0.w, 0, 8.w, 0.h), + padding: EdgeInsets.fromLTRB(12.w, 7.h, 0, 7.h), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(18), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), + child: GestureDetector( + onTap: () {}, + child: Row( + children: [ + Icon( + Icons.search, + size: 16, + color: Color(0xFFABACAB), + ), + SizedBox( + width: 3.w, + ), + Text( + "前进麦味", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF727272), + ), + ), + ], + ), + ), + )), + Container( + alignment: Alignment.center, + child: GestureDetector( + onTap: () {}, + child: Text( + "搜索", + style: TextStyle( + fontSize: 18.sp, + fontWeight: MyFontWeight.semi_bold, + color: Colors.black, + ), + ), + ), + ), + ], + )), + Expanded( + child: Container( + decoration: BoxDecoration( + border: Border.all( + width: 0, + color: Colors.white, + ), + color: Colors.white, + borderRadius: new BorderRadius.only( + topLeft: Radius.circular(8), + topRight: Radius.circular(8), + ), + ), + padding: EdgeInsets.only(left: 17.w, top: 16.h,right: 17.w), + child: SmartRefresher( + controller: refreshController, + enablePullDown: true, + enablePullUp: false, + header: MyHeader(), + physics: BouncingScrollPhysics(), + onRefresh: () { + setState(() {}); + }, + child: SingleChildScrollView( + physics: NeverScrollableScrollPhysics(), + child: FutureBuilder( + // future: queryHome(), + builder: (context, snapshot) { + return Column( + children: [ + // hotSearch(), + // historySearch(), + searchList() + ], + ); + }, + ), + ), + ), + ), + ), + ], + ) + ], + ), + ], + ); + } + + ///热门搜索 + Widget hotSearch() { + return Container( + width: double.infinity, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "热门搜索", + style: TextStyle( + fontSize: 15.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF181818), + ), + ), + SizedBox(height: 16.h), + GridView.builder( + itemCount: 6, + shrinkWrap: true, + padding: EdgeInsets.zero, + physics: NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + //一行的Widget数量 + crossAxisCount: 4, + //水平子Widget之间间距 + crossAxisSpacing: 6.w, + //垂直子Widget之间间距 + mainAxisSpacing: 12.w, + //垂直单个子Widget之间间距 + childAspectRatio: 3 / 1, + ), + itemBuilder: (context, index) { + return GestureDetector( + onTap: () {}, + child: hotSearchItem(), + ); + }, + ), + ], + ), + ); + } + + Widget hotSearchItem() { + return Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RoundButton( + width: 68.w, + height: 29.h, + text: "稻田里的书店", + textColor: Color(0xFF181818), + fontWeight: MyFontWeight.regular, + radius: 4, + backgroup: Color(0xFFF5F5F5), + fontSize: 12.sp, + ), + ], + ), + ); + } + + ///历史搜索 + Widget historySearch() { + return Container( + width: double.infinity, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded(child:Text( + "历史搜索", + style: TextStyle( + fontSize: 15.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF181818), + ), + )), + Image.asset( + "assets/image/icon_delete.png", + width: 22.w, + height:20.h, + ), + Text( + "删除", + style: TextStyle( + fontSize: 15.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF181818), + ), + ), + ], + ), + + SizedBox(height: 16.h), + GridView.builder( + itemCount: 6, + shrinkWrap: true, + padding: EdgeInsets.zero, + physics: NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + //一行的Widget数量 + crossAxisCount: 4, + //水平子Widget之间间距 + crossAxisSpacing: 6.w, + //垂直子Widget之间间距 + mainAxisSpacing: 12.w, + //垂直单个子Widget之间间距 + childAspectRatio: 3 / 1, + ), + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + + }, + child: historySearchItem(), + ); + }, + ), + ], + ), + ); + } + + Widget historySearchItem() { + return Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RoundButton( + width: 68.w, + height: 29.h, + text: "稻田里的书店", + textColor: Color(0xFF181818), + fontWeight: MyFontWeight.regular, + radius: 4, + backgroup: Color(0xFFF5F5F5), + fontSize: 12.sp, + ), + ], + ), + ); + } + + ///搜索列表 + Widget searchList() { + return Container( + width: double.infinity, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + GestureDetector( + onTap: (){ + setState(() { + optionIndex = 0 ; + }); + }, + child: Text( + "默认推荐", + style: TextStyle( + fontSize: optionIndex == 0 ? 15.sp :14.sp, + fontWeight: optionIndex == 0 ? MyFontWeight.semi_bold : MyFontWeight.regular, + color: optionIndex == 0 ? Color(0xFF181818) : Color(0xFF4D4D4D), + ), + ), + ), + GestureDetector( + onTap: (){ + setState(() { + optionIndex = 1 ; + }); + }, + child:Text( + "销量", + style: TextStyle( + fontSize: optionIndex == 1 ? 15.sp :14.sp, + fontWeight: optionIndex == 1 ? MyFontWeight.semi_bold : MyFontWeight.regular, + color: optionIndex == 1 ? Color(0xFF181818) : Color(0xFF4D4D4D), + ), + ), + ), + GestureDetector( + onTap: (){ + setState(() { + optionIndex = 2 ; + }); + }, + child:Row(children: [ + Text( + "价格", + style: TextStyle( + fontSize: optionIndex == 2 ? 15.sp :14.sp, + fontWeight: optionIndex == 2 ? MyFontWeight.semi_bold : MyFontWeight.regular, + color: optionIndex == 2 ? Color(0xFF181818) : Color(0xFF4D4D4D), + ), + ), + Image.asset( + "assets/image/jg.png", + width:16, + height:16, + ), + ],), + ), + GestureDetector( + onTap: (){ + setState(() { + optionIndex = 3 ; + }); + }, + child: Text( + "专区", + style: TextStyle( + fontSize: optionIndex == 3 ? 15.sp :14.sp, + fontWeight: optionIndex == 3 ? MyFontWeight.semi_bold : MyFontWeight.regular, + color: optionIndex == 3 ? Color(0xFF181818) : Color(0xFF4D4D4D), + ), + ), + ), + ], + ), + SizedBox(height: 16.h), + GridView.builder( + itemCount:6, + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + //一行的Widget数量 + crossAxisCount:2, + //水平子Widget之间间距 + crossAxisSpacing: 11.w, + //垂直子Widget之间间距 + mainAxisSpacing: 16.w, + //子Widget宽高比例 0.59 + childAspectRatio: + 185 / (281 / 2 + (281 / 2) * AppUtils.textScale(context)), + ), + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + Navigator.of(context).pushNamed('/router/shopping_mall_home',arguments: { + "type" : 1, + }); + }, + child: searchListItem(), + ); + }, + ) + ], + ), + ); + } + + Widget searchListItem() { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(10), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + color: Colors.white, + ), + margin: EdgeInsets.symmetric( + vertical: 3, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(10), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ) + ], + ), + child: + // MImage( + // "", + // width: double.infinity, + // height: 166, + // fit: BoxFit.cover, + // errorSrc: "assets/image/default_1.png", + // fadeSrc: "assets/image/default_1.png", + // ), + Image.asset( + "assets/image/icon_story_td.png", + width:double.infinity, + fit: BoxFit.cover, + ), + ), + Expanded(child:Container( + padding: EdgeInsets.only(left:8.w,right:8.w), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Container( + margin: EdgeInsets.only(top: 8, right: 8), + padding: EdgeInsets.only(left: 2, right: 2), + height: 17.h, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(2), + color: Color(0xFF5A5A5A), + ), + child: Text( + "中国大陆5仓", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.regular, + color: Colors.white, + ), + ), + ), + Text( + "已售12件", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF5D5D5D), + ), + ), + ], + ), + Text( + "SWISSGEAR瑞士军刀联名款马克杯", + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16.sp, + fontWeight: MyFontWeight.medium, + color: Color(0xFF353535), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "¥", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF32A060), + ), + ), + TextSpan( + text: "284.00", + style: TextStyle( + fontSize:18.sp, + fontWeight: MyFontWeight.semi_bold, + color: Color(0xFF32A060), + ), + ), + ], + ), + ), + Text( + "¥283.00", + style: TextStyle( + fontSize:14.sp, + decoration: TextDecoration.lineThrough, + decorationColor: Color(0xFF585858), + fontWeight: MyFontWeight.regular, + color: Color(0xFFA2A2A2), + ), + ), + ], + ), + ], + ), + ),) + ], + ), + ); + } +} diff --git a/lib/store/shopping/shopping_home/shopping_acticvity.dart b/lib/store/shopping/shopping_home/shopping_acticvity.dart new file mode 100644 index 00000000..0a443d42 --- /dev/null +++ b/lib/store/shopping/shopping_home/shopping_acticvity.dart @@ -0,0 +1,321 @@ +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/activity.dart'; +import 'package:huixiang/retrofit/data/base_data.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/item_title.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class ShoppingActivity extends StatefulWidget { + @override + State createState() { + return _ShoppingActivity(); + } +} + +class _ShoppingActivity extends State { + ApiService apiService; + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + SizedBox( + height: 10.h, + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 9.w), + child: Row( + children: [ + GestureDetector( + onTap: () { + Navigator.of(context).pushNamed('/router/activity_prefecture_details'); + }, + child: Container( + margin: EdgeInsets.symmetric(horizontal: 5.w ), + padding: EdgeInsets.only(left: 12.w), + width: (MediaQuery.of(context).size.width - 42) / 2, + height: 195.h, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: Colors.white, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "回乡秒杀", + style: TextStyle( + fontSize: 15.sp, + fontWeight: MyFontWeight.medium, + color: Colors.black, + ), + ), + Text( + "超多好物,等你来秒", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF7B7B7B), + ), + ), + GestureDetector( + onTap: (){ + }, + child: Container( + height:20.h, + width: 60.w, + decoration: BoxDecoration( + color: Color(0xFF32A060), + borderRadius: BorderRadius.circular(11.5), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "10点场", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Colors.white, + ), + ), + Icon( + Icons.keyboard_arrow_right, + size: 16, + color: Colors.white, + ), + ], + ), + ), + ), + Padding(padding: EdgeInsets.only(bottom: 10.h),child: + Image.asset( + "assets/image/icon_story_td.png", + width: 87, + height: 87, + fit: BoxFit.cover, + ),) + ], + ), + ), + ), + Expanded( + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + GestureDetector( + onTap: () { + }, + child: Container( + margin: EdgeInsets.symmetric(horizontal: 5.w), + padding: EdgeInsets.only(left: 12.w,right: 11.w), + width: (MediaQuery.of(context).size.width - 42) / 2, + height: 195.h / 2, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: Colors.white, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded(child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "好价我砍", + style: TextStyle( + fontSize: 15.sp, + fontWeight: MyFontWeight.medium, + color: Colors.black, + ), + ), + Text( + "拉友同优", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF7B7B7B), + ), + ), + GestureDetector( + onTap: (){ + }, + child: Container( + height: 18.h, + width: 48.w, + decoration: BoxDecoration( + color: Color(0xFF32A060), + borderRadius: BorderRadius.circular(11.5), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "GO", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Colors.white, + ), + ), + Icon( + Icons.keyboard_arrow_right, + size: 16, + color: Colors.white, + ), + ], + ), + ), + ), + ], + ),), + Padding(padding: EdgeInsets.only(bottom: 10.h),child: + Image.asset( + "assets/image/icon_story_td.png", + width: 44, + height: 44, + fit: BoxFit.cover, + ),) + ], + ), + ), + ), + SizedBox( + height: 5, + ), + GestureDetector( + onTap: () { + }, + child: Container( + margin: EdgeInsets.symmetric(horizontal: 5.w), + padding: EdgeInsets.only(left: 12.w,right: 11.w), + width: (MediaQuery.of(context).size.width - 42) / 2, + height: 195.h / 2, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: Colors.white, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded(child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "拼团专场", + style: TextStyle( + fontSize: 15.sp, + fontWeight: MyFontWeight.medium, + color: Colors.black, + ), + ), + Text( + "优惠齐享", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF7B7B7B), + ), + ), + GestureDetector( + onTap: (){ + }, + child: Container( + height: 18.h, + width: 48.w, + decoration: BoxDecoration( + color: Color(0xFF32A060), + borderRadius: BorderRadius.circular(11.5), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "GO", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Colors.white, + ), + ), + Icon( + Icons.keyboard_arrow_right, + size: 16, + color: Colors.white, + ), + ], + ), + ), + ), + ], + ),), + Padding(padding: EdgeInsets.only(bottom: 10.h),child: + Image.asset( + "assets/image/icon_story_td.png", + width: 44, + height: 44, + fit: BoxFit.cover, + ),) + ], + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + SizedBox( + height: 28.h, + ), + ], + ); + } + +} diff --git a/lib/store/shopping/shopping_home/shopping_home_banner.dart b/lib/store/shopping/shopping_home/shopping_home_banner.dart new file mode 100644 index 00000000..9bc88b1c --- /dev/null +++ b/lib/store/shopping/shopping_home/shopping_home_banner.dart @@ -0,0 +1,120 @@ + +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:huixiang/retrofit/data/banner.dart'; +import 'package:huixiang/retrofit/data/base_data.dart'; +import 'package:huixiang/retrofit/data/page.dart'; +import 'package:huixiang/retrofit/retrofit_api.dart'; +import 'package:huixiang/view_widget/custom_image.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; + +class ShoppingHomeBanner extends StatefulWidget { + + final List bannerData; + final SwiperController controller; + + ShoppingHomeBanner(this.bannerData,this.controller); + + @override + State createState() { + return _ShoppingHomeBanner(); + } + +} + +class _ShoppingHomeBanner extends State { + ApiService apiService; + final RefreshController refreshController = RefreshController(); + List bannerData = []; + + + @override + Widget build(BuildContext context) { + return Container( + child: AspectRatio( + aspectRatio: 2.08, + child: Swiper( + viewportFraction: 0.88, + scale: 0.93, + pagination: SwiperPagination( + alignment: Alignment.bottomCenter, + builder: DotSwiperPaginationBuilder( + size: 8, + activeSize: 8, + space: 5, + activeColor: Colors.black, + color: Colors.black.withAlpha(76), + ), + ), + physics: BouncingScrollPhysics(), + itemBuilder: (context, position) { + return InkWell( + onTap: () { + bannerClick(widget.bannerData[position]); + }, + child: MImage( + (widget.bannerData != null && position < widget.bannerData.length) + ? widget.bannerData[position].imgUrl + : "", + fit: BoxFit.cover, + radius: BorderRadius.circular(8), + errorSrc: "assets/image/default_2_1.png", + fadeSrc: "assets/image/default_2_1.png", + ), + ); + }, + itemCount: (widget.bannerData != null && widget.bannerData.length > 0) + ? widget.bannerData.length + : 1), + ), + ); + } + + /// contentType 跳转类型(0:不跳转,1:积分商品,2:活动,3:文章,4:页面跳转,5:课程) + bannerClick(BannerData bannerData) async { + switch (bannerData.contentType) { + case 1: + Navigator.of(context).pushNamed('/router/integral_store_page', + arguments: {"goodsId": bannerData.content}); + break; + case 2: + Navigator.of(context) + .pushNamed('/router/web_page', arguments: { + "activityId": bannerData.content, + }); + break; + case 3: + Navigator.of(context) + .pushNamed('/router/web_page', arguments: { + "articleId": bannerData.content, + }); + break; + case 4: + String router = bannerData.content; + if (router.contains("?")) { + String params = router.substring(router.indexOf("?")); + params = params.replaceAll("?", ""); + Map map = jsonDecode(params); + Navigator.of(context).pushNamed(router, arguments: map); + } else { + Navigator.of(context).pushNamed(router); + } + break; + case 5: + Navigator.of(context) + .pushNamed('/router/class_details', arguments: { + "id": bannerData.content, + }); + break; + } + } +} + + + + + + + diff --git a/lib/store/shopping/shopping_home/shopping_home_page.dart b/lib/store/shopping/shopping_home/shopping_home_page.dart new file mode 100644 index 00000000..31c6c58e --- /dev/null +++ b/lib/store/shopping/shopping_home/shopping_home_page.dart @@ -0,0 +1,198 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:huixiang/main.dart'; +import 'package:huixiang/retrofit/data/store_info.dart'; +import 'package:huixiang/retrofit/retrofit_api.dart'; +import 'package:huixiang/store/shopping/shopping_home/recommend_goods_list_view.dart'; +import 'package:huixiang/store/shopping/shopping_home/shopping_acticvity.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/custom_image.dart'; +import 'package:huixiang/view_widget/my_appbar.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'classify_list.dart'; + +class ShoppingHomePage extends StatefulWidget { + final StoreInfo storeInfo; + + ShoppingHomePage(this.storeInfo); + + @override + State createState() { + return _ShoppingHomePage(); + } +} + +class _ShoppingHomePage extends State + with AutomaticKeepAliveClientMixin { + ApiService apiService; + + @override + void initState() { + super.initState(); + } + + final SwiperController controller = SwiperController(); + + @override + void dispose() { + super.dispose(); + if (refreshController != null) refreshController.dispose(); + } + + final RefreshController refreshController = RefreshController(); + + @override + Widget build(BuildContext context) { + super.build(context); + return Column( + children: [ + MyAppBar( + title: widget?.storeInfo?.storeName ?? "一心回乡商城", + titleColor: Colors.black, + leadingColor: Colors.black, + background: Colors.transparent, + ), + Expanded( + child: Container( + child: SmartRefresher( + controller: refreshController, + enablePullDown: true, + enablePullUp: false, + header: MyHeader(), + physics: BouncingScrollPhysics(), + onRefresh: () { + setState(() {}); + }, + child: SingleChildScrollView( + physics: NeverScrollableScrollPhysics(), + child: FutureBuilder( + // future: queryHome(), + builder: (context, snapshot) { + return Column( + children: [ + buildSearchItem(), + + buildSwiper(), + + ///分类导航栏 + // ShoppingTitleTab(), + + ///分类列表 + ClassifyList(), + + ///专区活动 + ShoppingActivity(), + + ///严选活动 + // ActivityBanner(), + + ///为你推荐 + RecommendGoodsListView(), + ], + ); + }, + ), + ), + ), + ), + ), + SizedBox( + height: 76.h, + ), + ], + ); + } + + Widget buildSearchItem() { + return Container( + height: 36.h, + margin: EdgeInsets.fromLTRB(16.w, 0, 16.w, 16.h), + padding: EdgeInsets.fromLTRB(12.w, 6.h, 0, 6.h), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(18), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(12), + offset: Offset(0, 3), + blurRadius: 14, + spreadRadius: 0, + ), + ], + ), + child: GestureDetector( + onTap: () { + Navigator.of(context).pushNamed('/router/search_page'); + }, + child: Row( + children: [ + Icon( + Icons.search, + size: 24, + color: Color(0xFFABACAB), + ), + SizedBox( + width: 3.w, + ), + Text( + "前进麦味", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Color(0xFF727272), + ), + ), + ], + ), + ), + ); + } + + Widget buildSwiper() { + return Container( + width: double.infinity, + height: 160.h, + margin: EdgeInsets.only(left: 16,right: 16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + ), + child: Swiper( + pagination: SwiperPagination( + alignment: Alignment.bottomCenter, + builder: DotSwiperPaginationBuilder( + size: 8.w, + activeSize: 8.w, + space: 5.w, + activeColor: Colors.white, + color: Colors.white.withAlpha(76), + ), + ), + itemBuilder: (context, position) { + return Container( + child: MImage( + (widget.storeInfo != null && + widget.storeInfo.bannerList != null && + position < widget.storeInfo.bannerList.length) + ? widget.storeInfo.bannerList[position].imgUrl + : "", + fit: BoxFit.cover, + radius: BorderRadius.circular(8), + errorSrc: "assets/image/default_2_1.png", + fadeSrc: "assets/image/default_2_1.png", + ), + ); + }, + itemCount: (widget.storeInfo != null && widget.storeInfo.bannerList != null) + ? widget.storeInfo.bannerList.length + : 1, + ), + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/store/shopping/shopping_home/shopping_title_tab.dart b/lib/store/shopping/shopping_home/shopping_title_tab.dart new file mode 100644 index 00000000..7a3c4a74 --- /dev/null +++ b/lib/store/shopping/shopping_home/shopping_title_tab.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; +import 'package:huixiang/generated/l10n.dart'; +import 'package:huixiang/retrofit/data/category_select_list.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/my_tab.dart'; + +class ShoppingTitleTab extends StatefulWidget { + final List classSelectList; + final Function notifyClassSelectList; + + ShoppingTitleTab(this.classSelectList,this.notifyClassSelectList); + + @override + State createState() { + return _ClassTitleTab(); + } +} + +class _ClassTitleTab extends State + with SingleTickerProviderStateMixin { + TabController tabController; + + @override + void initState() { + super.initState(); + + } + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.centerLeft, + child: DefaultTabController( + length:widget.classSelectList == null + ? 0 + : widget.classSelectList.length, + child: TabBar( + isScrollable: true, + //可滚动 + indicatorColor: Color(0xff39B54A), + labelColor: Color(0xff32A060), + labelStyle: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.bold, + ), + unselectedLabelStyle: TextStyle( + fontSize: 14.sp, + fontWeight: MyFontWeight.regular, + ), + controller: tabController, + //未选中文字颜色 + unselectedLabelColor: Color(0xff4D4D4D), + indicatorSize: TabBarIndicatorSize.label, + onTap: (index){ + widget.notifyClassSelectList(index); + }, + //指示器与文字等宽 + tabs:widget.classSelectList == null + ? [] + : widget.classSelectList + .map((e) => MyTab(text: e.name)) + .toList(), + ), + ), + ); + } + +} diff --git a/lib/store/shopping/shopping_mall_home.dart b/lib/store/shopping/shopping_mall_home.dart new file mode 100644 index 00000000..72becd83 --- /dev/null +++ b/lib/store/shopping/shopping_mall_home.dart @@ -0,0 +1,244 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:huixiang/generated/l10n.dart'; +import 'package:huixiang/main.dart'; +import 'package:huixiang/retrofit/data/activity.dart'; +import 'package:huixiang/retrofit/data/banner.dart'; +import 'package:huixiang/retrofit/data/base_data.dart'; +import 'package:huixiang/retrofit/data/brand.dart'; +import 'package:huixiang/retrofit/data/page.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/store/shopping/shopping_cart/shopping_cart_page.dart'; +import 'package:huixiang/store/shopping/shopping_home/shopping_home_page.dart'; +import 'package:huixiang/utils/event_type.dart'; +import 'package:huixiang/utils/font_weight.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class ShoppingMallHome extends StatefulWidget { + final arguments; + + ShoppingMallHome({this.arguments}); + + @override + State createState() { + return _ShoppingMallHome(); + } +} + +class _ShoppingMallHome extends State + with AutomaticKeepAliveClientMixin { + ApiService apiService; + MinApiService minService; + List brands = []; + List bannerData = []; + int choiceIndex = 0; + bool dialogShowing = false; + final RefreshController refreshController = RefreshController(); + final SwiperController controller = SwiperController(); + String storeId = ""; + String tenant = ""; + + ///小程序token + String minToken; + StoreInfo storeInfo; + List activitys; + + @override + void initState() { + super.initState(); + if (widget.arguments != null) choiceIndex = widget.arguments["type"]; + + tenant = widget.arguments["tenant"]; + storeId = widget.arguments["id"]; + + SharedPreferences.getInstance().then((value) { + minLogin(value); + queryStoreInfo(); + }); + } + + /// 小程序登录 + minLogin(SharedPreferences shared) async { + EasyLoading.show(status: S.of(context).zhengzaijiazai); + apiService = ApiService( + Dio(), + context: context, + token: shared.getString('token'), + showLoading: false, + ); + apiService.minLogin(storeId).catchError((onError) { + debugPrint(onError); + }).then((baseData) { + if (baseData != null && baseData.isSuccess) { + Map minStoreInfo = baseData.data; + minToken = minStoreInfo["token"]; + queryStoreInfo(); + SharedPreferences.getInstance().then( + (value) => { + value.setString('minToken', minToken), + value.setString('tenant', tenant), + value.setString('storeId', storeId), + }, + ); + minService = MinApiService( + Dio(), + context: context, + token: minToken, + tenant: tenant, + storeId: storeId, + showLoading: false, + ); + + // queryShopCar().then((value) { + // this.shopCarGoods = value; + // setState(() {}); + // }); + // if (tableId > 0) { + // getParentInfo(); + // } + EasyLoading.dismiss(); + } + }); + } + + /// 查询店铺信息 + queryStoreInfo() async { + BaseData baseData = + await apiService.queryStoreInfo(storeId).catchError((error) { + debugPrint(error); + }); + if (baseData != null && baseData.isSuccess) { + storeInfo = StoreInfo.fromJson(baseData.data); + activitys = storeInfo.informationVOPageVO.list + .map((e) => Activity.fromJson(e)) + .toList(); + if (mounted) { + setState(() {}); + } + } + EasyLoading.dismiss(); + } + + @override + void dispose() { + super.dispose(); + if (refreshController != null) refreshController.dispose(); + } + + @override + Widget build(BuildContext context) { + super.build(context); + return Stack( + children: [ + Container( + color: Color(0xFFF7F7F7), + ), + Stack( + children: [ + Container( + // padding: EdgeInsets.only(top: 40.h), + height: 260.h, + decoration: BoxDecoration( + gradient: new LinearGradient( + begin: Alignment.centerRight, + end: Alignment.centerLeft, + colors: [ + Color(0xFFE8F5E9), + Color(0xFFE5F7FF), + ]), + ), + ), + if (choiceIndex == 0) + ShoppingHomePage( + storeInfo, + ), + if (choiceIndex == 1) ShoppingCartPage(), + Align( + alignment: Alignment.bottomCenter, + child: Container( + color: Colors.white, + height: 83.h, + width: double.infinity, + padding: EdgeInsets.only(top: 10.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: GestureDetector( + onTap: () { + setState(() { + choiceIndex = 0; + }); + }, + child: Column( + children: [ + Image.asset( + choiceIndex == 0 + ? "assets/image/shopping_home.png" + : "assets/image/shopping_home_h.png", + width: 30, + height: 30, + ), + Text( + "首页", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.semi_bold, + color: choiceIndex == 0 + ? Color(0xFF4C4C4C) + : Color(0xFFC6C6C6), + ), + ), + ], + )), + ), + Expanded( + child: GestureDetector( + onTap: () { + setState(() { + choiceIndex = 1; + }); + }, + child: Column( + children: [ + Image.asset( + choiceIndex == 0 + ? "assets/image/shopping_cart_h.png" + : "assets/image/shopping_cart.png", + width: 30, + height: 30, + ), + Text( + "购物车", + style: TextStyle( + fontSize: 10.sp, + fontWeight: MyFontWeight.semi_bold, + color: choiceIndex == 0 + ? Color(0xFFC6C6C6) + : Color(0xFF4C4C4C), + ), + ), + ], + ), + )) + ], + ), + ), + ), + ], + ), + ], + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/store/store_order.dart b/lib/store/store_order.dart index 069bdc0c..1c744bd0 100644 --- a/lib/store/store_order.dart +++ b/lib/store/store_order.dart @@ -136,6 +136,7 @@ class _StoreOrderPage extends State }); } + ///会员信息 queryMemberInfo() async { BaseData baseData = await minService.memberInfo() .catchError((error){debugPrint(error);}); diff --git a/lib/store/store_view/product_sku.dart b/lib/store/store_view/product_sku.dart index c75e8a58..abea0f39 100644 --- a/lib/store/store_view/product_sku.dart +++ b/lib/store/store_view/product_sku.dart @@ -114,8 +114,8 @@ class _ProductSku extends State { children: [ MImage( widget.miNiDetail.imgs[0], - width: 70, - height: 70, + width: 75, + height: 75, fit: BoxFit.cover, errorSrc: "assets/image/default_1.png", fadeSrc: "assets/image/default_1.png", @@ -123,7 +123,7 @@ class _ProductSku extends State { SizedBox( width: 10, ), - Column( + Expanded(child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( @@ -139,6 +139,8 @@ class _ProductSku extends State { child: Text( ": " + (selectSkus.map((e) => "$e").toList().toString()), + maxLines: 1, + overflow: TextOverflow.ellipsis, style: TextStyle( color: Color(0xFF727272), fontSize: 11.sp, @@ -167,7 +169,7 @@ class _ProductSku extends State { ], ), ], - ), + )), Spacer(), InkWell( onTap: () { diff --git a/lib/store/store_view/store_order_list.dart b/lib/store/store_view/store_order_list.dart index ae7cf7e8..b087530b 100644 --- a/lib/store/store_view/store_order_list.dart +++ b/lib/store/store_view/store_order_list.dart @@ -21,7 +21,7 @@ class StoreOrderListPage extends StatefulWidget { final ScrollController controller; final String minToken; final String tenant; - final Function(String id,int count) queryMiNiDetail; + final Function(String id, int count) queryMiNiDetail; ShoppingCart shopCarGoods; @@ -31,8 +31,8 @@ class StoreOrderListPage extends StatefulWidget { this.storeInfo, this.shopCarGoods, this.controller, - this.minToken, - this.tenant, + this.minToken, + this.tenant, this.queryMiNiDetail, ); @@ -232,15 +232,15 @@ class _StoreOrderListPage extends State { } return InkWell( onTap: () { - widget.queryMiNiDetail(productListBeans[position].id,1); + widget.queryMiNiDetail(productListBeans[position].id, 1); }, child: ShopGoods( (ShoppingCartSkuItemListBean shoppingCartSkuItemListBean) { - widget.queryMiNiDetail(productListBeans[position].id,1); + widget.queryMiNiDetail(productListBeans[position].id, 1); }, (ShoppingCartSkuItemListBean shoppingCartSkuItemListBean) { - if(count > 0) - widget.queryMiNiDetail(productListBeans[position].id,-1); + if (count > 0) + widget.queryMiNiDetail(productListBeans[position].id, -1); }, productListBean: productListBeans[position], count: count, diff --git a/lib/union/union_page.dart b/lib/union/union_page.dart index 47d25624..557e20e5 100644 --- a/lib/union/union_page.dart +++ b/lib/union/union_page.dart @@ -13,6 +13,7 @@ import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/store.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/utils/location.dart'; import 'package:huixiang/view_widget/border_text.dart'; import 'package:huixiang/view_widget/classic_header.dart'; @@ -231,16 +232,64 @@ class _UnionPage extends State ), body: Column( children: [ - PreferredSize( - preferredSize: Size(double.infinity, 52.h), - child: Container( - padding: EdgeInsets.only(top:15.h), - color: Color(0xFFFAFAFA), - child: ItemTitle( - text: S.of(context).jingbilianmenghuiyuandian, - imgPath: "assets/image/icon_union_store.png", + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded(child:PreferredSize( + preferredSize: Size(double.infinity, 52.h), + child: Container( + padding: EdgeInsets.only(top:15.h), + color: Color(0xFFFAFAFA), + child: ItemTitle( + text: S.of(context).jingbilianmenghuiyuandian, + imgPath: "assets/image/icon_union_store.png", + ), + ), + )), + GestureDetector( + onTap: (){ + setState(() { + var storeName = storeList.firstWhere((x)=>x.storeName == "一心回乡商城"); + if(storeName == null) + return; + Navigator.of(context).pushNamed( + '/router/shopping_mall_home', + arguments: { + "type":0, + "id": storeName.id, + "tenant": storeName.tenantCode, + "storeName":storeName.storeName + }, + ); + }); + }, + child:Container( + margin: EdgeInsets.only(right: 18), + height: 25.h, + width: 102.w, + color: Colors.white, + child:Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "一心回乡商城", + style: TextStyle( + fontSize: 12.sp, + fontWeight: MyFontWeight.regular, + color: Colors.black, + ), + ), + Icon( + Icons.keyboard_arrow_right, + size: 16, + ), + ], + ), + ), ), - ), + ], ), buildItem(), ], @@ -525,9 +574,6 @@ class _UnionPage extends State ), ], ), - SizedBox( - height: 4.h, - ), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/view_widget/new_people_reward.dart b/lib/view_widget/new_people_reward.dart index 8a0a702a..38be0459 100644 --- a/lib/view_widget/new_people_reward.dart +++ b/lib/view_widget/new_people_reward.dart @@ -154,7 +154,7 @@ class _NewPeopleReward extends State { ), Expanded( child: Padding( - padding: EdgeInsets.only(top: 4, bottom: 4), + padding: EdgeInsets.only(top: 4, bottom: 4,left: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceBetween, diff --git a/lib/web/web_view/comment_list.dart b/lib/web/web_view/comment_list.dart index 156776d5..b78968b2 100644 --- a/lib/web/web_view/comment_list.dart +++ b/lib/web/web_view/comment_list.dart @@ -79,14 +79,6 @@ class CommentListState extends State { Container( decoration: BoxDecoration( color: Colors.white, - boxShadow: [ - BoxShadow( - color: Colors.black.withAlpha(12), - offset: Offset(0, 2), - blurRadius: 14, - spreadRadius: 0, - ), - ], ), child: Column( mainAxisAlignment: MainAxisAlignment.start, diff --git a/pubspec.lock b/pubspec.lock index 784ca8a7..45429d08 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -229,7 +229,7 @@ packages: name: flutter_html url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.0" + version: "2.2.1" flutter_layout_grid: dependency: transitive description: @@ -269,7 +269,7 @@ packages: name: flutter_screenutil url: "https://pub.flutter-io.cn" source: hosted - version: "5.0.1" + version: "5.0.1+2" flutter_smart_dialog: dependency: "direct main" description: @@ -329,6 +329,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "9.2.0" + gradient_widgets: + dependency: "direct main" + description: + name: gradient_widgets + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.6.0" graphs: dependency: transitive description: @@ -475,7 +482,7 @@ packages: name: path_provider_linux url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.2" + version: "2.1.4" path_provider_platform_interface: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index b82c67f6..aec2cefc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,6 +15,8 @@ dependencies: sdk: flutter fluwx: ^3.5.0 + gradient_widgets: ^0.6.0 + keframe: ^2.0.2 #滑动组件卡顿优化 tpns_flutter_plugin: @@ -89,6 +91,9 @@ dependencies: ai_decimal_accuracy: ^1.1.0 + + + dev_dependencies: flutter_test: sdk: flutter