3`Ku^VsTyG3LagOLy&%kZ3CW#MRW+bo`1tC Xe`Mw$ATi*Y5_x1bV+$D0x_4MN(34}oTAMP-jc5> zR`@R<1+2h}4#^fkzov>s)K#=BJnhN@FZXOQ9d@9VjQOD(zJfl8u}Id{n32E%uC}-r z&5qUxOL~{9&$TZhT8HtTKaXq}`o)*V&V2@l+^6BZ-0-Ud+t=SCcQTp#uCb$*mevYa zN@SE*>K@|JZd-4upoDdyO~loa(UGcCIcBR7LS^Ig#1tQzl@YAH`&!~kQ>Nj1HLs^w z9g|v(k`GZDNnx^NkPKB6;6k}Upsc2G(d0E>l=&4X=Gy8ml$EZ*sfq{dvlh6tbXJg~ z881R0l8lBSSBclilcI5{y&-E9ZKn+V+;fI5pFym`1Fa3GkGmi2Kyv*3*WdME7y%jI zPgbTr-#2}<*u>uJ>DQe4fHOCC4*MH^P6oCaNzy3!+ybZ>yi`UItl y@IA;)`%Yil^E ^C(h3K=QQ3v4jdG z8aDM5D&!y6!Inv}R%kQ=s0CYXxlWrJFjzpDxbV_eRRCS30QRgZS2PJkHAXL$#>Arc zq%~1=EsZ7N>vcoog+ePNh45hEDUAQItH*8CEznqF^eW_(vqK6%+Y1G37&7aI=+KhI z0p($83b1t<2^A}&AY03FMPU_ $K`q+~rdgg*(_V*zK_X}AUCt%m?gx_)Q#Mgh= z9^DU69*rz5ug&^1e+BquY+0V975ccZBpD86)L>hza}FRV3Ti +5kp*!QO zS{QFl+cdC3)JzGsCsN+R%NoPiD R_EZH3oy2wUo4ieY!t0L?guxP|f$%|rh&HILy#+E+&>Np%| z KqKOt D`?X9k3*S0O2x@8$)Q}fMs1|2Bekuh4CUb7|=YY z`x@ZB(TUj)g DPE!av870IDlqzRUTlqTXV>J4s=q5URxo0{Dnih8Ne3b!zNr_UZUfp zC3<%kTW5Vut6>G+;t-enGoqu4?a;`&f)7q~D&-zKYv_ZmI{2fGC(axC LRiS> z0A# z&e2~`(6}B(SR~kLfK*dPF(}bn(gJCrKYXubH)hLUVBv(&XOYQLe0LE_z9_IQ(q`Zp zw<1yGG^a)lvWEo4j(QMSTaF=wa*SOR57y@sfpYRPa(^Fxu?x1bFH6SI<)sPj94^s& zyCYiW*ZH8HeM@#5duuZoq0pJy>OBk;JWUB~eF1T@Lcjd-m`<;Auhwr<^B$~^+5YYK zEj@X`&{G%NyxR!lfAc-uAmP)*;%5kvEKiKv75L;M{?f`TcV=`Cxw*-s5V O z+54bi_ J;yb*Mvl284tSK`mm})$)tdJE9 zzN=57uZU`G<)Y`BmEqW9-x<_#YBhgWLT4Bn<0$bWGj@r_0NY1jIHcP+tFiE`jtpI# zEYbbLCAxjk?I?D#+PzsPbD?2_h8I#9&3OR=;6Acx=+iHZnvDq|OzTGLvk?5@>tFef zp~ue={mhGfuzlk_BK(WKE9!vp0pPl;e!}sYPhNoSnbDQo)_KJI(coQCJVji{?~-g{ zwxVtf6u@kKa|qzj0S^LPNw`F!w1Co9)m89@!ID7}gp}7)#VC!@D~wA5gWhWkpkGsk zMu4R<0*&GIthg2a`gJ)frPR=QU>V%@3$VRY0o&NOvy%~>8!yw%y)kX$q%0t96i0yW z1E0N+dpZ&t&ps%G2;vZ$Wnc}@D|+*D&yDEv>9A8QP45bxEsm)C;Wh86{;N;<5yZGH ze!u&G=x@I7dlcigFr>KV2w;mGWB@LHp4}vR^c>OF{*2zcSC8k4>RuST8go>hZPJTu zn;OB&j7C$}5GB_tuezM1;EUQ##t`&GR(DPsM+MZ-MI&6AGEG<2G|pm2=fjc*jK!AC z)pi!5rE#$w`=Thr`NWj&AlS t-JSc>nU7miB|U>f^i~Y$sz+0|&U_Cw7=!I8F4(DNEPyTe`mO!w(9vYr7xqS$L`V zex*_q!M5rxC0}X;uxKSTpe$LC+JIDUi7(`;5hyNBUqh1oLQ=p&e})LM##m|jl_f{! z{6jdA08TuBJfutb{INcXX_b@S#5^;um`vtMiwhJED6?C~ds& z(0tMe7S5JJN(H{UfP)@p6MAnqYz_#bZTE;~_wse*2BwmC$>tU4f=vv#PAGcGZ3qFo z#{8%6-y! (gST5bTKY$2Dy9|i*A;# z-kZ_Zo-~jQJaFT CnJpec-=iVp=PZw?BNC$&{Bg3Kw6Mvk>cFU$Y%GQjrYv&SB6 z4bd|z6FQj9=!VNq2oS}_xWe<-049d$(s-HP+Gzm|zdbh_)73k(UfhyHjn;q` H{s>b^qKVDbeL~$nCXs^=_Rm9nn z;{W0s-pfTf%tSu+v>_~XIlhLM@dG6Kvw!em2kt4KSqs;OC!TE#E5u{~w^+JHbm^>h z=kvb5m5=B4h9}`gG$t9+_%MPNY&GR1;mTuBY8T7aL19{dJW8Ge*?iDWW6(5Zs +Hw@{|xMS+}IIW8&i@-or+XO8K9 z$g}#?sbvSY@ws(0r8oDEXb%WO0Nd`B*^%InE=}A sxKw zRF8KGUP!aO^Baa kx z`Z~tpdmrPrhzrAW1!Wp h`7 zq%$j!Eh{On7HkVhqOmj@;&d=uVXaDF(wcXEa(q$s z^MLJGEM z16PS(JDk$n`$x{;jh(9&j7Atc; Dqx0Ikb;;i)FX=N6r3*(+?)jv*im+ z_~Xnv(P(V*@!SH9OFDyi=?j+(J^jdtcJ_%75{O{>=vluw#oJH4T6m~``~7aH00!u> z^F)uGGj3rkeP?&y(w~2`4QEGAp5O4ZnFefGc0!b$SeDBY# M#~TA20DTgb|| z6mAMH{dhdvf@0+?emXc!nU0K0idl3?x-Dw}!^eY|Lgx@h1EhgIBEByI3?#r gK$ zSKI)U&TSGM9EUtqV0R_%$SD dAA4UVhBb@zl@*jDszDA-DPBY5!IaY}tukxUu&i zeiUv>2!$h9BP{TlPZ$@&ZR!Za{mQqk^Pn4>X}xEQcB6O8Q^8#RZ7|r87LGj$U~a7X ze(xM%>#wDw^yURoIU~Zh6zhVmM#&c?fSP&=3fg&9vcQ6pmn?Ovev&s8%l8&y+!y`9 zR(U0XXi}xNt}H1sFAp|oS{hf%Y55QpBjpeNM##YLB9cAn?s>$rMbXkYTQ2z!XX*a* zQzLi!*u5Q(6Tr%2vh?2MnDzrme){Z$)+hcj?d{_k?M;c!E*aXNSvs@i7suY;KXxAM z#ibFwwtGZJ*3!AjnC>1n$KTSa2Ys+@4uA=Ohw1mZ4WfH{Gj|nxCb-ZgIbxj~hF*Q# z&
?_hdJ2Bi) 1h>{YEGw9ySzrl*I+I26*EPi7mV}I?S*eSJWe(dwbW?EgW%KnFw_Vl<2T~tyv&r zEolX-s5^@S(i4Df=T%vk{OAR1RR-MFTk58O@d}f0!oPqNupY@yX!vSC$^|*chj=x) z>q2Bl2f;afgaRLO3K*uv@MIr5J94|Aa8FfSVUJ+@?s!TE!L$AN=`mee@m}oF%+j4h zOP5ziboXfHHZ+`?7`nPQrF+LSdURz(|Fn1PhJI!;qU~cJ-^H`(z}DB3yKaVioR}4y zTC)ytw{VPO=D}r|KlS*CE}Zh7tlxkT>W*ieBNc1xr{p}{D>%K*!ZhvjOaqJDRYR}6 zW9h9M-Uy)}a&15UTsUZ)b?f$hOaJ@3q3ys{c+G@#hN)m-P|qW$ zh&ERJriiV|NozGnuphGxn4ke%O&M-2dVG^WS);rakgN^7qr3{B)d7L$b_=-C-u4G7 z;Ccu6i)9n*siAMyFlQR*eI%8U43&b$9c;|1dHW&HIOts7C>u|Ja{vG!07*naR0>?w zs5oz|Y;H*E((oZSO!O7;%oiUuw6kw$AD0TU1tRASTB0Lk31EwZyyB*Yr`8NTyFPNO z`Y40C9voX*8{@VHL+|WiL5=9_#L&C@K7M<8JaVCh=s|AY_h5_u$7n;GqNko{qz>Y_ zOB26X6nAQ2=74eFc7?q|KMp<>kK>4BgI5Ufj$>`S>F_}sR_Od~5n8eI-79{h17-uC z{iNpr-@1$6|Ht232lx$ETJNR9xQ#|(`!0YNAR8A@W8N*xzl}8Mh#vEzVbBp;Fk?#} zY|m&f7@1U5OLCm`Y^(CB6~IL5vVtlpum(sgO0EUlrkO
n z3|X(XUEk`&V f*HP zV?);tyf3>sHne8}wjqqLz3e>OEZ7CG?0K2N+s09dFFoe72>`Or5QOjeI}XDGLPGul zc37z5pLg01F w(gMZ;Jg 9)^t z?#GGaXK!97cg+n}{y+9K(GwQ}kcXgq8($7*CxrXSQm{Qbw)Ee=MxEVcD1+Qy^a208 zN9&JYjImq?uK1kmS@_KDD`5!BLlm+9_$ $vmvy}-E z7H3=)3LZ!cp3O>{(z}fioogEXdH#~2k35c8rg6#q4#Yy>lzX+=MXDes@6wF68|%cv zQ5oR9xMFC3YU!DEL%UO=>jzjbu(XCeT!Wy5f7UZ#+fLIN7~-~CgBuTs9zX9lBp{rS z^I+3hZwi3m6FghDYb@hEqtd_lrlori+H)L!{$+nqOq{XA^KJbMAl|~8pRWA%cP!n& z-DFJda9Wt#O~w|=dRYk>&o;^y7BG7cGg#b6!Sla(#>csDJP2{_L}2osEl2uHds)=Z zm77D!HQsb1i)ot@C@%tVHA>#0AM>JyrhqYE($eKb 6>r1oWUD71 H+QX@*)({S^=t^o0;ded!6~LKeJ_04{jP-X69`N9L3mnG0Y3I!gfy zbVHu6-%S?dx8)PTcsK!Vf(}jWHZdZRBi!rfzatal;%Q6w4}FfV<7N?T1D7RP7FX4i z3bOS{Wfldb3jhL@f`^z>3j{#}Ge|!KEULH>6yijNZ%!cXyfy$xbKuEYgjI1UT#ZIU z=-0Lv`4NfM@<&5IUgnox9=Rj^A{IvHtBHqZR_jwBMlWJMX#}+UWa$Is*A{gnUS)1+ z1Ltu^qa2P}G?Rk{lh(IaXmsRnh)g|I#8#iV=;N~So-q#XInTD~YbY4aLIkMh{bV5x zpy$Aoh`#)FOQ$!CJC6XjDa3OM+6A%JxNNK%+E_t|gcGA5PCyEnGkUBTE`mf@q5)jC zScdp5it^Bcdo=(vTEH jn>b$C%qUWA-QD7h9$ z^C2JRK`1si2yMm6@>_RV2cm+MP$z!Ai1@B#&?;kUUM<^ Iet zmqO01bIUvwObpR@iGywMY%^f{$!A$ymJz8FW=O`A%SJ$7B(RNMH9#F>=>lvwHtfB` z;LW;m !U%H#Zh?Xs2jtT)j_BM*n^xq`I0yjCSNogkaS3z_pbRCB zpnH3SExqj%>9ab*tqlPY!|M9d^1iqENRx|UgpBv~spmY{mQtOxF xJiRRfbn4kB zeQ?EcWg38QZ{7thFpD^U%BOav&-Htj{@1rTfw1wTn*!!Rw|=;I-0qF>lorVvW0V-8 z7$S<`i?xQQE)ZS0CxLBHh$^ONyfaCGGm57H+N{1-ysCx`5?}}*8ilxm*=!twPp3lT0=)IV2Fq+81xOmnt z5WaI0$B8WvY^%DV0o#WN1R5nDTE+zfs_v+l>aKU2d0`PDf&vg^@kioCzKh+eG{$O< za80^VK?9_kGW`jK^TF7d!ryb8mB7I^;vZs!n`?ft>A`+E&o(M5-b-V)4bWw>8E~rB z*4WZL2fDcUk=*v(*gjxsWqGfW&y9O)WB^tnh8i&5{r&P|9%KQy@WPOV(8~>GMxoQ! z R9}g&sv0L;t z>){5S1^Ds>vQ*@Gn1$05<<6b*JMV68`>YF$dwo*^+kxIv)q#-eI)RdFy{e9rnMEST zBf%TeDY;i-UsbFyBP2?|jS!LTngpU6V^*=48X9-XNPwL5C$}R^%`bsh9rAbh&Oujk zRzgOGdtl4P1@OWOJiJ`D${)cg%?jWk$iocLn@qO#x@xea3NhWWrTe((5cB1Rf0ovk z_h>XTw7R!U ?mI+R=L5-4Y6 JbB^MXV&nuEi#oRfSU!|WbE*A z0bpA@-izd3YvUDFVzxXKk$SxN8=mgbnx!3__i7Q>v~*@VqospMXG207PmG>z1lve^ zq=22-@PF|vh3L)YvJvoIOq~+JHhQv|RJ8am53zJYEg|m~aa){|kUj@Tmj3Hk`zc_^ zN i&usWgLI1B VITM_YOZfo&DTGSjPUqYugR(t2mTF-YE- z!duEKI$msJf~pM;3dbu7PPJPSFXrGu =mQO@)1EgZ4jRSvf9I6-#9LUs`<04(=BYhdeW8*ZW9So2 jEo(*`mpZnroWfNT6VM&g;=a4P? z6QJY~0yUnix{PRr;zf{=00nn%fOq@QXAgxjb=qCP>;d_YF4QOpmx>pnfXeOo^8izR zWz;CNg&&$QLQWA8I)Uei8xD}8n_E2UEs}+8y$;Bd*e
WI_vXgoSu7@1t(=3NfRxpHB9o*$#Xmuxcb>(kbb zr9b-zmUS6)3)h@u9F1q298MF{*I)oa%b3B?7>;mn8x9h`^ML4sBraP6+y-nF&Vy43 zQJ$qTa{%rTPe}s?nlc?vP67gvD89DVdy9~tq51&&X#ls{wTHwDEx)jD-5n|;(YNSU z_eFal;e@!P?z$#hl&ohvpw9@Q0KlNUxFoTYkDFUaOBT%{Pys+DxKyz)Rp)>a+rZ4? z`OCiDaL1(Npt++K0lEM!q`Sq;g(jrHc270g32F90#w+Ii?iiEMqc)SGJuBhthH(Zf z_x$&-S(gdIS%_IwoB{A1WpSYl{RO~cj0iI{y8^Ax)Ii8!?||st+wJWXO7-_K+s}Pr z&x%6IYJBKQo@qd%z?w2W5LLt!RbZf?cs`WC#DsZERf*S>llV0U&=&DS;#cN-7rzWj zqVif5-avzq5-+L(tPCZv{uIGh>PNzQETZ9+Tlf2mXsPFydbPnBcQ?cGsd+E;DgZUw z!C9|(4{1so&$j7q7#9pBKo=Pcol71WkUBC2(CUmKSs-&>cM`MBmG1&Ft|_-}Dv#^V zQw;m&Tb5pbH}pF68M6swy>xez0bGr{Ck;Rw_aMdg-DzIo5Ok!JIRNjgt!SjYXS*n{ zWde92k4jSBisESjw^L4XUNoMUs8}fQAzha<2aswE=pw-uIgfD%kQ!_ifZLrx6y!fU zSkIppPy)Y7mNphQL?`uZc`uz2TJvCg`#wv(3T|mH6CpW!U *vB&PECG0XM?^bpBL`ocYj|An)U#mQSwQpNYzwxY0r60A$P!Z4 z;>D7v@5Yv;uY9Wuw($Pl)?MsGLkxG-{~L`>o97&8?c%bycWi~|z1!Xh<{nY?!%Gd= zE+j;dC__=EHCACxz#Rml3gvC;TLj=X3G+>uJy3$V*P$KJ`5F*zC=PQ@Q0`0yBtw-! zXuJZiHpa(VfU7$P;_PdYTXzFG_~Dgf?D%$(U>hlbywLSk??vHa$e0D-Kq+@VZs;b$ z5wXYaCj( zX^0<70NJ=u=EevR_7wwc0lF?TgYPC|N^pMNXE7kl0zw##OiX7(QF!d|{I72jUAxoY z%AAr#1Gp{NhR%pDeOOAKK?n_a_g>S0fmB8$iYL7u47eB7uUxE$y;AL(1l$@L&uR2B z7~90ouqq72ua(K^c;g+F03dumgns#|0)LbTiUVxVtl=WZLdTTy!|4&>9iRbk72voX zk8mu+Y+(~n-mURPkP0{40)TKe55OaOhbh>0a!Lgndx7s4LJSz^$D$uwyWvdSBtDDR znm#5Q9vs-BTJEv;K4a(GI$E@MlEru7tzyhy`+?t0hVTHwB>>RPHSfi`^MhI6U~AyT z;uJD0SiW=1r@Uz&iOn6b9U`QQRPwn%w7~4_#}Z%&RMIH9rc7Mv78lASgT@SFCFI;u z1`UmiWRU1r;6>*(_6PDEU2H6ZV-|J$BHmOX@k^5WitKb+4MAXEU4aOe=oeoa(b+ZA zi{<65iB5IX*5I*WLFe{1(Js5uw&Oj9d$-(OULj=(fP;_(Zl~pkSo2;i!m~|B1+Yci z=-<8FaOOe+x((aIV6!Q1(P(5gLBtcme8z*n?SXs7coiEQ;AP`ra(oAXb+ZJ%h=^kg zCLUyQoZ{Oze741qM KS|FtKv1mj1VGRLm8851<&=RScuPNNXC<6~ zei|^z(dBdqA!K>F2wrF;zgMQ^kMCFbyUDr5XL-~1VSsI<6{hJ}kh-}=bcl0Slb9_$ zODyQPt*Ij)Yjih9@FyAjPe0?s2yr^CA)mBp9Gk-o1_#C Wzb4iXG@b#-5 zZm`XJoxi)+<-~=y2&xUhaxf0Sj~Fh}xUjGY4;XRsd7daeHQKG=Yy>QjMfnm59SWSd z+#G;A7bsUc+WG23QgUP@wAY-+Ml(vRG-}muFN($)W0S?IjFhG{=2-|?{g?P43SNLp zO}U~#1-GY}g48d96vGG#W1Um*(hxvHoVNgv4e{4_egW!0Ocv94B--EGDKI1vHx9NM zvT2NLYDh7y$HElixy@;4Y5ErnDMZuO8G-x0dqs{1UmvsOyW0TN+3W_EjRDUah5!Z$ z=NP2nm7$<3(QdrP!8Qnm^pd!XiB<5>!64Is76^JeQ0VL+P!@^j4?*sqIK@~ykbYVk z7t2YYtf5N*P|{c3N&SVqNLN+@TWuLdx#(c@m5TAFv#6Qx96Z}a#%wE2Xs4_2VzD50 zaO{Bvy}PmH&tG7975U+@Pv`P%Q#7q0Q>0qliH1HSo{JcF6QAW97?PN@1Ku=Gx3l3P zWGV!Pc06JpG6-6STw8dv@M5prEQeQyf^ALYTxwniY=ewxW4DV`@}iR=c}q$q7jx4; zOeJr;Rt~y-#1nBl6sUq|KhZ%{J}ob_MyM$lt{TaKt+uX)-4ee<;>p0?h7#(V8$__x z0)N68%@E=%h|9v8MNBu|*;NAE)Tn)Yo-o3IF{R^xkw70|c;S8H5S%tVkZkG*15CpX z{_p;YV72YPF)oWU9^Sg%#$|`lxdy f->At?S3EUML_P=SLtZV3v8K8pF#W*iK5F4DSNh&Cv7;vH(8F^ zM$fjW6N*0P6j}QkyxZ#mY+W9yJANxXLM3y9trBoc%_Fu9(8a O-H8aAR-}Y$b1rF;MJeye6aM zM9iV&bAxi>#X(B05H4|65Efp1x!8I^MI|6*o!8K%%CAN6LIb!++F!|^L)ws}V#TA$ zlIg4jT!|>|`?#c$FC0Bv#3QBZv lV?%1&h7xgqV@g$vS8^JH%6?dF&N&S;UL6_~qiV2~k808_2L+eei0LR@Mhw zrDv-lq8QuFa5X!42?#VwUXdUz;CAq_!UPQvxb8F!M+oV6QmktcfGg3r!t5UDGrUMY zLK+ixFy$T%jXPwMFh$ZP>HCIJtntwW*bt#+(IEXCEO!==SFgmm{#7k +oS#n6m5ek)TY~ZX3*j9JSl ?7x}q=Y=EC$ zo=*W&gRMe#a)Z_Y0S8;eYcVaaJq`H`(Z@~_Mo^APGX~yY802`G*X;-0MKovfItPhk zlZ>JBo0ewQ(2uSa(%wD C6r?4Zk#AlFFgMPARrP2IGNTTk#2<%z>>EL)#`aybwFoFMyqfFdW!)fg>p6?Y}WQ z0Y@XA*|6@Y&Nr_cceqaREDK(}7I)_8bEF*)A>gwz*ggcn)e2y*T;WAcIZc_KKue%3 z2$mKwT2N+QRO)6)1})JF4VY@m6qP*lvX;gvU8?tvDYU&Yeien#l#z0Kr4+EAG|v`5 z1hCZ@e2l#Wwh9&m&q9Yt3Op`WgdJW8jR17r#hKw82*jta-ZJ#gO&fN=4QS;d0dCZ0 z^wI5@3+=3KWKzGpYbNHGHwDDug#vSfZHDXFx+GApcrl$ YygAS%KL&933}OV1*wWIB@S*d*(yMX-VsTNI=VJcNDTJRA8%; z3ndU#8K@a}rc8D=Kd0xlaIh66HV8& %aTko zY6>Bp4{W*OwuUjcy&?5%#V#p;Nx+64ETv%UZhw%{zd}bpnu*zp;ybj1eHTIjt%V}S zpC*QFw%Cd0pB&H%IfShGIapHfKXPm1k(HtHvS%CmFLojn&?vbUFp9z|f${()&rwPP zxRIreqf;TdM#)tdK?a%8&`(pQ3I=o1xYzCgqvuwjmotF70HAGDQ557_GI)1$gFoA% ztuW`=R%KWb^B3haDUgCKVwn6G%La=wbXW-3iWa7Y#Q9OSeRKafg6%+%<&8_Seu9o7 zd=SrOh_=9k?H}yzlc8*~hzJ<0!;1o3EnsB%J3z^c0 pbYr{yv7B?42840o7e|BJ-^=wlVEiXEE=>0GN zmwUCWvDMA#f%)7Q_Fp5iuk@HMd96(1MR}G$Su^NNnYls =L`(dbV?dY(f4M>MHgPM> ~pOeR2Pf$=cs78Fi63Qrvb< zAT2r>$rl<$*D7yQt} `)*Z<(~6UI#c5r@0?`Vp?!sCq#UA*NX5n?#rs zf}{ilkv^`RLTY4T_d=pMD?zMF1GrL|1ci&BoEiHfK^ZH~@Nzo`s$>LS3&<)^7K~z> zqN9u1Rz*Z1J30Lx0=7v1lIVvvB(PPAy6>(quBwsO0vZwJJ=@p;We6eD-#OXR^t>0V zZ2@DpdV2aZuKt>LyAUO31FH^b4lvayc~%Yz9nmVV25>cH`e#TKL{geTgh7e|qXAqd z_*FxjD2Rp^Lkt=gd2lpd?NRefB#aCe9#DdT4CpeKXR83FdBGMtp|OF?;L=0f_11Ht zx;0B+t07xcqoS~)hzPr7u>J7?E;cbBCB4pAm;e9*8%ab#R4w<|5q;@D{@d~Ixv{_c z#qTaZZD05@5q-8-_$L7l0`dJ^$%_t24G1b6*C?+RFdE$y#7DE6Ogz|!VYJ4eRlSUd zX!LqGBN#ozaMzZ~UYg3FDZ>o`KMULn6blW;Zr8xJim7v=PVO~?5pLcln(h*D+XNpE zfIGv7h4x;pq<*!InTUUF0mZl!MXC+D)UP`{^{WK3iYTlk>&l@Qy;?GV_4cy){D1x} zbJ#TH0GD3;BeM2)I`&Wrwpzi`06~?>5^+8RAngE^AUWd9zyU$5ky9}vC`w*@C^XJ@ zuPd4Ykk-L1;6tdx-84J#=aTYA3$|LrC!duNJK)0!Rj^GKN;-dLc&U<=jPfr{Ety@S zBO^*w!nqhKHK8N?t4{4ZPrv_3FzspefS>c?q}`ywobW=-o=^11H?n z@IuRnte~8L#?7k*e%APav?lyRTsMM~25>cH#v?2k8~QM?1oUnc0U(Eg>5 z7&^B;a(8RFG6O<}J);pmh<(LRj4_TAh9>8$EpJ=e+x9Q7o+8>ML$~fGxt>HcjiCj` zI}O-Y9jSB>!<|V5oOO#dn;HVm+i#UlOWLA@J3 { + // console.log(8888) + this.setData({ + chartData: this.getLineConfig(), //客流趋势分析数据 + chartDatastop: this.getStopTimeConfig(), + selectName: wx.getStorageSync('accountName') + }) + }, 1000) + if (typeof this.getTabBar === 'function' && this.getTabBar()) { + this.getTabBar().setData({ + // 当前页面的 tabBar 索引 + curClick:1 + }) + } + } + }, + data: { + currentTime: moment().format("YYYY-MM-DD"), + types: 1, //选中的时间类型 + trendtypes: 1, //选中的业态趋势类型 + chartData: {}, //客流趋势分析数据 + chartDatastop: {}, //停留时长统计 + show: false, //显示日期自定义选择 + minDate: new Date(2022, 0, 1).getTime(), //自定义时间的开始日期 + maxDate: new Date(2022, 11, 31).getTime(), //自定义时间的结束日期 + // maxDate: new Date(2025, 11, 31).getTime(), //自定义时间的结束日期 + rankData: [{ + name: '我婆婆呃呃呃', + value: 2000, + percentage: 80 + }, { + name: '我婆婆呃呃呃', + value: 2000, + percentage: 80 + }, { + name: '我婆婆呃呃呃', + value: 2000, + percentage: 80 + }], + indexVal: 'PassengerFlow', + indexList: [{ + name: '客流量', + val: 'PassengerFlow' + }, { + name: '过店人次', + val: 'Exposure' + }, { + name: '进店率', + val: 'IntoStoreRate' + }, { + name: '顾客人数', + val: 'CustomerNum' + }, { + name: '平均停留时间', + val: 'AvgResidenceTime' + }, { + name: '深逛人数', + val: 'DeepShoppingNum' + }, { + name: '深逛率', + val: 'DeepShoppingRate' + }, { + name: '集客力', + val: 'PerAreaValue' + }], + }, + methods: { + // 关闭自定义日期选择 + onClose() { + this.setData({ + show: false + }); + }, + // 点击指标 + clickIndex(event) { + this.setData({ + indexVal: event.target.dataset.val + }); + }, + // 点击自定义日期选择器的确定 + onConfirm(event) { + const [start, end] = event.detail; + let startDate = moment(start).format("YYYY-MM-DD") + let endDate = moment(end).format("YYYY-MM-DD") + this.setData({ + show: false, + currentTime: startDate + '至' + endDate + }, () => { + this.loadData() + }); + }, + // 点击时间选择类型触发 + ClickTab(e) { + let dateType = e.target.dataset.type, + time + switch (dateType) { + case '1': + time = moment().format("YYYY-MM-DD") + break; + case '2': + time = moment().subtract(1, "days").format("YYYY-MM-DD") + break; + case '3': + time = moment().subtract(6, "days").format("YYYY-MM-DD") + '至' + moment().format("YYYY-MM-DD") + break; + case '4': + time = moment().subtract(29, "days").format("YYYY-MM-DD") + '至' + moment().format("YYYY-MM-DD") + break; + + default: + this.setData({ + show: true, + types: e.target.dataset.type, + }) + break; + } + if (dateType != 5) { + this.setData({ + types: e.target.dataset.type, + currentTime: time + }, () => { + this.loadData() + }) + } + + }, + // 获取卡片数据 + getCardList() { + // console.log(this.data.currentTime,this.data.selectId,this.data.selectName) + let startTime = this.data.currentTime, + endTime = this.data.currentTime + if (this.data.currentTime.includes('至')) { + let timeArr = this.data.currentTime.split('至') + startTime = timeArr[0] + endTime = timeArr[1] + } + console.log(startTime, endTime) + getCardData().then(res => {}) + }, + // 获取业态客流趋势 + getTrendList() { + getTrendData().then(res => {}) + }, + // 获取停留时长统计 + getStopTimeList() { + getStopTimeData().then(res => {}) + }, + // 获取所有数据 + loadData() { + this.getCardList() + this.getTrendList() + this.getStopTimeList() + }, + //点击业态客流趋势top5中的tab触发 + ClickPassageFlow(e) { + this.setData({ + trendtypes: e.target.dataset.type + }, () => { + this.getTrendList() + }) + }, + // 返回趋势图配置项 + getLineConfig(res) { + // let xasix = res.xaxis.data + // let legendList = res.series.map(item => item.name) + // let seriesList = res.series + // if (seriesList.length < 1) { + // return { + // title: { + // text: '暂无数据', + // x: 'center', + // y: 'center', + // textStyle: { + // fontSize: 16, + // fontWeight: 'normal', + // } + // } + // } + // } + return { + grid: { + top: 30, + right: 20, + bottom: 20, + left: 5, + containLabel: true + }, + tooltip: { + trigger: 'axis', + axisPointer: { + type: "line", + lineStyle: { + color: "#444", + }, + }, + formatter: function (params) { + let html = '' + params.forEach(item => { + html += item.axisValue + '\n' + item.seriesName + ': ' + item.value + }) + return html + } + }, + xAxis: { + axisLabel: { + color: '#8C8D95' + }, + boundaryGap: false, + axisTick: { + show: true + }, + axisLine: { + lineStyle: { + color: 'rgba(140,141,149,0.35)', + width: 1 + } + }, + data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + yAxis: { + type: 'value', + axisLabel: { + color: '#8C8D95', + formatter: function (value, index) { + if (value >= 10000 && value < 1000000) { + value = value / 10000 + "万"; + } else if (value >= 1000000) { + value = value / 1000000 + "百万"; + } + return value; + }, + }, + axisTick: { + show: true, + + }, + axisLine: { + show: false, + + }, + splitLine: { + show: false + } + }, + color: ['#FD8C5E', '#6FD3FF', '#BC7FF8', '#4F75FF', '#FF9AC1'], + // series:seriesList.map(item=>({...item,symbol: 'none',smooth: true,})) + series: [{ + name: '客流量', + smooth: true, + lineStyle: { + color: '#34BFFF' + }, + areaStyle: { + // 区域颜色 + color: { + type: 'linear', + x: 0, //右 + y: 0, //下 + x2: 0, //左 + y2: 1, //上 + colorStops: [{ + offset: 0.1, + color: '#EAF3FF' // 0% 处的颜色 + }, + { + offset: 1, + color: '#FFFFFF' // 100% 处的颜色 + } + ] + }, + }, + data: [820, 932, 901, 934, 1290, 1330, 1320], + type: "line", + symbol: "none", + showSymbol: false, + symbolSize: 20, + }] + } + }, + // 返回停留时长配置 + getStopTimeConfig(confingData) { + let data_sample = [ + ["type", "停留时长", ''], + ["进样", 50, 200], + ["离心", 10, 200], + ["去盖", 30, 200], + ["侧轨", 15, 200], + ["侧轨1", 15, 200], + ["侧轨2", 15, 200], + ["侧轨3", 15, 200], + ["出样", 18, 200] + ]; + // let data_sample = []; + // confingData.xaxis.data.forEach((item, i) => { + // let arr = []; + // arr[0] = item; + // arr[1] = confingData.series[0].data[i]; + // arr[2] = 100; + // data_sample.push(arr); + // }); + // data_sample.unshift(["type", confingData.title, ""]); + return { + color: ["#33CCFF", "#CCEEFF"], + legend: { + show: false + }, + grid: { + left: "3%", + right: "4%", + bottom: "3%", + top: "10px", + containLabel: true + }, + xAxis: { + type: "value", + // boundaryGap: [0, 0.01], + axisLine: { + show: false + }, + splitLine: { + show: false + }, + axisTick: { + show: false + }, + axisLabel: { + show: false + } + }, + yAxis: { + type: "category", + inverse: true, + axisLine: { + show: false + }, + splitLine: { + show: false + }, + axisTick: { + show: false + } + }, + dataset: { + source: data_sample + }, + series: [{ + name: "停留时长", + type: "bar", + barWidth: "40%", + label: { + show: true, + formatter: function (params) { + return params.data[1] + "%"; + }, + position: ["102%", "0%"] + }, + itemStyle: { + color: "#679BFF" + }, + z: 3 //让实时在总计上面 + }, + { + name: "", + type: "bar", + barWidth: "40%", + itemStyle: { + color: "#F5F7F9" + }, + barGap: "-100%" + } + ] + }; + + }, + } +}) \ No newline at end of file diff --git a/miniProject/index/index.json b/miniProject/index/index.json new file mode 100644 index 0000000..0b32e48 --- /dev/null +++ b/miniProject/index/index.json @@ -0,0 +1,14 @@ +{ + "usingComponents": { + "navbar": "/components/navbar/index", + "basic":"/components/echart/basic/index", + "van-calendar": "@vant/weapp/calendar/index", + "van-progress": "@vant/weapp/progress/index", + "van-button": "@vant/weapp/button/index", + "van-grid": "@vant/weapp/grid/index", + "van-grid-item": "@vant/weapp/grid-item/index" + }, + "navigationBarTitleText": "", + "navigationBarBackgroundColor": "#0268FF", + "navigationBarTextStyle": "white" + } \ No newline at end of file diff --git a/miniProject/pages/accountHome/index.wxml b/miniProject/index/index.wxml similarity index 90% rename from miniProject/pages/accountHome/index.wxml rename to miniProject/index/index.wxml index 2bff116..cc989b1 100644 --- a/miniProject/pages/accountHome/index.wxml +++ b/miniProject/index/index.wxml @@ -4,7 +4,7 @@ - + {{selectName}} 开业门店总数:254个 @@ -19,28 +19,28 @@自定义 - + {{currentTime}} - + 路过客流量 35480 - + 客流量 35480 - + 顾客人数 35480 - diff --git a/miniProject/pages/accountHome/index.wxss b/miniProject/index/index.wxss similarity index 94% rename from miniProject/pages/accountHome/index.wxss rename to miniProject/index/index.wxss index 6cd2c2a..f63a365 100644 --- a/miniProject/pages/accountHome/index.wxss +++ b/miniProject/index/index.wxss @@ -1,245 +1,245 @@ -/* pages/homes/index.wxss */ -.container{ - height: 100%; -} -.contianer_shop { - width: 100%; - height: 168rpx; - position: relative; - margin-top: 20rpx; -} - -.images { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} - -.shop_name { - padding: 30rpx 0 10rpx 28rpx; - font-size: 40rpx; - font-family: PingFangSC-Medium, PingFang SC; - font-weight: 500; - color: #FFFFFF; - line-height: 56rpx; - position: absolute; -} -.shop_time { - position: absolute; - top: 90rpx; - margin-left: 28rpx; - font-size: 28rpx; - font-family: PingFangSC-Regular, PingFang SC; - font-weight: 400; - color: rgba(255, 255, 255, 0.65); -} - -.tab_tll { - padding: 0 10rpx; - width: 100%; - margin-top: 30rpx; -} - -.tab_tll .text_tltle { - font-size: 28rpx; - font-family: PingFangSC-Regular, PingFang SC; - font-weight: 400; - margin-right: 30rpx; -} - -.actives { - color: #000000; - border-bottom: 4px solid #447BFF; -} - -.defaults { - color: rgba(0, 0, 0, 0.65); -} - -.time_input { - margin-top: 30rpx; - width: 100%; - height: 80rpx; - background-color: rgba(131, 164, 255, 0.39); - border-radius: 40rpx; - display: flex; - align-items: center; - padding: 0 0 0 50rpx; -} - -.card { - width: 100%; - margin-top: 30rpx; - display: flex; - flex-wrap: wrap; - justify-content: space-between; -} -.card_passage { - width: 48%; - height: 148rpx; - position: relative; - padding: 20rpx 20rpx 0; - font-size: 40rpx; - font-family: PingFangSC-Medium, PingFang SC; - font-weight: 500; - color: #FFFFFF; -} -.cardName{ - position: absolute; - font-size: 28rpx; -} -.cardNum{ - position: absolute; - top: 65rpx; -} -.card>view:nth-child(n+3) { - margin-top: 30rpx; -} -.card_image { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 148rpx; -} -.keliuliang { - width: 100%; - padding: 20rpx; - border-radius: 20rpx; - background-color: #fff; - margin-top: 30rpx; -} - -.keliuliang>text { - height: 44rpx; - line-height: 44rpx; - display: flex; - align-items: center; -} - -.keliuliang>text::before { - content: ''; - width: 6rpx; - height: 30rpx; - margin-right: 10rpx; - background: #5889FF; - border-radius: 3rpx; -} - -.title_chart { - font-size: 32rpx; - font-family: PingFangSC-Medium, PingFang SC; - font-weight: 500; - color: rgba(0, 0, 0, 0.85); - -} - -.stome_time { - margin-top: 20rpx; - font-size: 28rpx; - font-family: PingFangSC-Regular, PingFang SC; - font-weight: 400; - color: rgba(0, 0, 0, 0.65); -} - -.stome_time text { - font-size: 30rpx; - font-family: PingFangSC-Regular, PingFang SC; - font-weight: 400; - color: #5A95EC; -} - -.indexList .desc_content { - padding: 0 !important; - border: 2rpx solid #DCDFE6; - border-radius: 100rpx; -} - -.indexList .desc_info { - height: 50rpx; - margin-bottom: 10rpx; - border-radius: 100rpx; -} - -.indexList .desc_info:nth-child(4) { - margin-right: 0 !important; -} - -.indexList .desc_text { - margin-bottom: 8px; - font-size: 24rpx; -} - -.indexList .desc_content_active { - padding: 0 !important; - /* border: 2rpx solid#447BFF; */ - background-color: #447BFF; - - border-radius: 100rpx; -} - -.indexList .desc_text_active { - margin-bottom: 8px; - font-size: 25rpx; - color: #fff; -} - -.van-hairline--surround::after { - border: none -} - -.van-hairline--bottom::after, -.van-hairline--left::after, -.van-hairline--right::after, -.van-hairline--surround::after, -.van-hairline--top-bottom::after, -.van-hairline--top::after, -.van-hairline::after { - border: none !important -} - -.list { - position: relative; - padding-top: 20rpx; -} - -.list .item { - position: relative; - padding: 10rpx 0; - border-bottom: 1rpx solid #fafafa; -} - -.list .item .info { - display: flex; - justify-content: space-between; - font-size: 24rpx; -} - -.list .item .shopName { - color: rgba(0, 0, 0, 0.85); -} - -.list .item .shopName .idx { - margin-right: 5rpx; -} - -.list .item .progress { - padding: 10rpx 0rpx; - display: flex; - align-items: center; -} - -.list .item .progress .bar { - width: 100%; - position: relative; -} - -.list .item .num { - color: #4C83FF; - /* width:100rpx; */ - text-align: right; - font-size: 28rpx; - font-weight: 900; +/* pages/homes/index.wxss */ +.container{ + height: 100%; +} +.contianer_shop { + width: 100%; + height: 168rpx; + position: relative; + margin-top: 20rpx; +} + +.images { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.shop_name { + padding: 30rpx 0 10rpx 28rpx; + font-size: 40rpx; + font-family: PingFangSC-Medium, PingFang SC; + font-weight: 500; + color: #FFFFFF; + line-height: 56rpx; + position: absolute; +} +.shop_time { + position: absolute; + top: 90rpx; + margin-left: 28rpx; + font-size: 28rpx; + font-family: PingFangSC-Regular, PingFang SC; + font-weight: 400; + color: rgba(255, 255, 255, 0.65); +} + +.tab_tll { + padding: 0 10rpx; + width: 100%; + margin-top: 30rpx; +} + +.tab_tll .text_tltle { + font-size: 28rpx; + font-family: PingFangSC-Regular, PingFang SC; + font-weight: 400; + margin-right: 30rpx; +} + +.actives { + color: #000000; + border-bottom: 4px solid #447BFF; +} + +.defaults { + color: rgba(0, 0, 0, 0.65); +} + +.time_input { + margin-top: 30rpx; + width: 100%; + height: 80rpx; + background-color: rgba(131, 164, 255, 0.39); + border-radius: 40rpx; + display: flex; + align-items: center; + padding: 0 0 0 50rpx; +} + +.card { + width: 100%; + margin-top: 30rpx; + display: flex; + flex-wrap: wrap; + justify-content: space-between; +} +.card_passage { + width: 48%; + height: 148rpx; + position: relative; + padding: 20rpx 20rpx 0; + font-size: 40rpx; + font-family: PingFangSC-Medium, PingFang SC; + font-weight: 500; + color: #FFFFFF; +} +.cardName{ + position: absolute; + font-size: 28rpx; +} +.cardNum{ + position: absolute; + top: 65rpx; +} +.card>view:nth-child(n+3) { + margin-top: 30rpx; +} +.card_image { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 148rpx; +} +.keliuliang { + width: 100%; + padding: 20rpx; + border-radius: 20rpx; + background-color: #fff; + margin-top: 30rpx; +} + +.keliuliang>text { + height: 44rpx; + line-height: 44rpx; + display: flex; + align-items: center; +} + +.keliuliang>text::before { + content: ''; + width: 6rpx; + height: 30rpx; + margin-right: 10rpx; + background: #5889FF; + border-radius: 3rpx; +} + +.title_chart { + font-size: 32rpx; + font-family: PingFangSC-Medium, PingFang SC; + font-weight: 500; + color: rgba(0, 0, 0, 0.85); + +} + +.stome_time { + margin-top: 20rpx; + font-size: 28rpx; + font-family: PingFangSC-Regular, PingFang SC; + font-weight: 400; + color: rgba(0, 0, 0, 0.65); +} + +.stome_time text { + font-size: 30rpx; + font-family: PingFangSC-Regular, PingFang SC; + font-weight: 400; + color: #5A95EC; +} + +.indexList .desc_content { + padding: 0 !important; + border: 2rpx solid #DCDFE6; + border-radius: 100rpx; +} + +.indexList .desc_info { + height: 50rpx; + margin-bottom: 10rpx; + border-radius: 100rpx; +} + +.indexList .desc_info:nth-child(4) { + margin-right: 0 !important; +} + +.indexList .desc_text { + margin-bottom: 8px; + font-size: 24rpx; +} + +.indexList .desc_content_active { + padding: 0 !important; + /* border: 2rpx solid#447BFF; */ + background-color: #447BFF; + + border-radius: 100rpx; +} + +.indexList .desc_text_active { + margin-bottom: 8px; + font-size: 25rpx; + color: #fff; +} + +.van-hairline--surround::after { + border: none +} + +.van-hairline--bottom::after, +.van-hairline--left::after, +.van-hairline--right::after, +.van-hairline--surround::after, +.van-hairline--top-bottom::after, +.van-hairline--top::after, +.van-hairline::after { + border: none !important +} + +.list { + position: relative; + padding-top: 20rpx; +} + +.list .item { + position: relative; + padding: 10rpx 0; + border-bottom: 1rpx solid #fafafa; +} + +.list .item .info { + display: flex; + justify-content: space-between; + font-size: 24rpx; +} + +.list .item .shopName { + color: rgba(0, 0, 0, 0.85); +} + +.list .item .shopName .idx { + margin-right: 5rpx; +} + +.list .item .progress { + padding: 10rpx 0rpx; + display: flex; + align-items: center; +} + +.list .item .progress .bar { + width: 100%; + position: relative; +} + +.list .item .num { + color: #4C83FF; + /* width:100rpx; */ + text-align: right; + font-size: 28rpx; + font-weight: 900; } \ No newline at end of file diff --git a/miniProject/index/index2.js b/miniProject/index/index2.js new file mode 100644 index 0000000..ff7a81a --- /dev/null +++ b/miniProject/index/index2.js @@ -0,0 +1,12 @@ +Component({ + pageLifetimes: { + show() { + if (typeof this.getTabBar === 'function' && this.getTabBar()) { + this.getTabBar().setData({ + // 当前页面的 tabBar 索引 + curClick: 2 + }) + } + } + } +}) diff --git a/miniProject/index/index2.json b/miniProject/index/index2.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/miniProject/index/index2.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/miniProject/index/index2.wxml b/miniProject/index/index2.wxml new file mode 100644 index 0000000..1bdbf75 --- /dev/null +++ b/miniProject/index/index2.wxml @@ -0,0 +1 @@ ++ 进店率 35480 接口 \ No newline at end of file diff --git a/miniProject/index/index2.wxss b/miniProject/index/index2.wxss new file mode 100644 index 0000000..57edf0e --- /dev/null +++ b/miniProject/index/index2.wxss @@ -0,0 +1,5 @@ +.intro { + margin: 30px; + text-align: center; + padding-top: 60px +} \ No newline at end of file diff --git a/miniProject/index/me.js b/miniProject/index/me.js new file mode 100644 index 0000000..f23c939 --- /dev/null +++ b/miniProject/index/me.js @@ -0,0 +1,145 @@ +// index/me.js +const App = getApp(); +import basicApi from '../api/basic.js' +Component({ + /** + * 组件的属性列表 + */ + properties: { + + }, + + /** + * 组件的初始数据 + */ + data: { + navHeight: App.globalData.navHeight, + windowHeight: App.globalData.windowHeight, + accountName: '', + name: '', + menuItems: [{ + name: '切换服务器地址', + icon: 'position', + }], + userForm: {}, + rolesList: [] + }, + pageLifetimes: { + show() { + const name = wx.getStorageSync('name'); + const accountName = wx.getStorageSync('accountName'); + this.setData({ + name: name, + accountName: accountName + }) + this.getUserInfo() + if (typeof this.getTabBar === 'function' && this.getTabBar()) { + this.getTabBar().setData({ + // 当前页面的 tabBar 索引 + curClick: 3 + }) + } + } + }, + /** + * 组件的方法列表 + */ + methods: { + All(e) { + console.log(e) + }, + inputBlur(e) { + this.data.userForm.realName = e.detail + }, + inputBlur2(e) { + this.data.userForm.tel = e.detail + }, + inputBlur3(e) { + this.data.userForm.email = e.detail + }, + getUserInfo() { + basicApi.singleUser(wx.getStorageSync('uid')).then(res => { + this.getRolePermission(res.data) + }) + }, + getRolePermission(resData) { + basicApi.getPermission(resData.unid).then(res => { + let roles = [] + res.roles.forEach(item => { + roles.push(item.name) + }) + resData.roles = roles.toString() + this.setData({ + userForm: resData + }) + }) + }, + onSubmit(e) { + basicApi.editUserInfo({ + userId: this.data.userForm.id, + email: this.data.userForm.email, + loginName: this.data.userForm.loginName, + realName: this.data.userForm.realName, + tel: this.data.userForm.tel, + }).then(res => { + if (res.code == 200) { + wx.showToast({ + title: '修改成功', + icon: 'success' + }) + this.getUserInfo() + } + }) + }, + undatePwd() { + wx.navigateTo({ + url: '/pages/editPwd/editPwd' + }) + }, + logout: () => { + wx.getStorageInfo({ + success: (res) => { + res.keys.forEach(item => { + if (item !== 'name' && item !== 'password' && item !== 'requestUrl' && item !== 'baseUrl' && item !== 'deploymentType') { + wx.removeStorage({ + key: item, + success: function (res) {} + }) + } + }) + } + }) + + wx.reLaunch({ + url: '/pages/login/index' + }) + }, + + goOtherPage: async function (e) { + const { + value + } = e.target.dataset + if (value.name === '切换服务器地址') { + await wx.setStorage({ + data: 'success', + key: 'modalShow', + }) + wx.getStorageInfo({ + success: (res) => { + res.keys.forEach(item => { + if (item !== 'name' && item !== 'password' && item !== 'requestUrl' && item !== 'baseUrl' && item !== 'deploymentType' && item !== 'modalShow') { + wx.removeStorage({ + key: item, + success: function (res) {} + }) + } + }) + } + }) + wx.reLaunch({ + url: '/pages/login/index' + }) + } + } + } +}) \ No newline at end of file diff --git a/miniProject/index/me.json b/miniProject/index/me.json new file mode 100644 index 0000000..a505145 --- /dev/null +++ b/miniProject/index/me.json @@ -0,0 +1,8 @@ +{ + "usingComponents": { + "navbar": "/components/navbar/index" + }, + "navigationBarTitleText": "", + "navigationBarBackgroundColor": "#0268FF", + "navigationBarTextStyle": "white" + } \ No newline at end of file diff --git a/miniProject/index/me.wxml b/miniProject/index/me.wxml new file mode 100644 index 0000000..4696ec9 --- /dev/null +++ b/miniProject/index/me.wxml @@ -0,0 +1,38 @@ ++ \ No newline at end of file diff --git a/miniProject/index/me.wxss b/miniProject/index/me.wxss new file mode 100644 index 0000000..4e31089 --- /dev/null +++ b/miniProject/index/me.wxss @@ -0,0 +1,104 @@ +/* pages/me/index.wxss */ +.header { + width: 100%; + height: 224rpx; + background-color: #fff; + border-radius: 16rpx; + box-sizing: border-box; + margin-top: 30rpx; + padding: 12rpx 0rpx 0 50rpx; + display: flex; + align-items: center; +} + +.header .avatar { + width: 160rpx; + height: 160rpx; + border-radius: 50%; + margin-right: 32rpx; +} + +.header .name { + font-family: PingFangSC-Medium, PingFang SC; + color: #000; +} + +.header .username { + font-weight: 500; + font-size: 40rpx; + line-height: 40rpx; + margin-bottom: 12rpx; +} + +.header .company { + box-sizing: border-box; + height: 40rpx; + line-height: 40rpx; + color: rgba(0, 0, 0, 0.55); + font-size: 28rpx; +} + +.btn { + margin-top: 30rpx; +} + +.zong-content { + padding: 10rpx 0; + width: 100%; + height: 324rpx; + margin-top: 24rpx; + border-radius: 16rpx; + background-color: #fff; +} + +.label { + color: rgba(0, 0, 0, 0.9) !important; + font-size: 28rpx; + height: 66rpx; + line-height: 66rpx; + /* padding: 5px; */ +} + +.input { + color: rgba(0, 0, 0, 0.7) !important; + font-size: 28rpx; +} +.editClass{ + color: #597BFF; + font-size: 32rpx !important; + font-weight: 600 !important; + right: 25rpx; +} +.vanField .van-field__body{ + height: 66rpx; + line-height: 66rpx; +} + +.items{ + margin-top: 24rpx; + border-radius: 16rpx; + background-color: #fff; + padding: 5px 10rpx 5rpx 23rpx; +} +.items .item { + width: 100%; + height: 100rpx; + display: flex; + align-items: center; + color: rgba(0,0,0,0.9); + font-size: 28rpx; + box-sizing: border-box; + padding: 0 23rpx 0 17rpx; + position: relative; + border-bottom: 1rpx solid #E1E1E1; +} +.items .logout{ + border-width: 0; +} +.items .item .arrow { + position: absolute; + right: 38rpx; + color: rgba(0, 0, 0, .2); + width: 24rpx; + height: 24rpx; +} \ No newline at end of file diff --git a/miniProject/pages/accountHome/index.js b/miniProject/pages/accountHome/index.js deleted file mode 100644 index 775aaff..0000000 --- a/miniProject/pages/accountHome/index.js +++ /dev/null @@ -1,460 +0,0 @@ -// pages/homes/index.js -const App = getApp(); -import moment from 'moment' -import { - getMalls, -} from "../../api/login"; -import { - getCardData, - getTrendData, - getStopTimeData, - getAgeSexData, - getShopDetailData -} from '../../api/shop' -Page({ - - /** - * 页面的初始数据 - */ - data: { - navHeight: App.globalData.navHeight, - windowHeight: App.globalData.windowHeight, - currentTime: moment().format("YYYY-MM-DD"), - types: 1, //选中的时间类型 - trendtypes: 1, //选中的业态趋势类型 - chartData: {}, //客流趋势分析数据 - chartDatastop: {}, //停留时长统计 - show: false, //显示日期自定义选择 - minDate: new Date(2022, 0, 1).getTime(), //自定义时间的开始日期 - maxDate: new Date(2022, 11, 31).getTime(), //自定义时间的结束日期 - // maxDate: new Date(2025, 11, 31).getTime(), //自定义时间的结束日期 - rankData: [{name:'我婆婆呃呃呃',value:2000,percentage:80},{name:'我婆婆呃呃呃',value:2000,percentage:80},{name:'我婆婆呃呃呃',value:2000,percentage:80}], - indexVal:'PassengerFlow', - indexList: [{ - name: '客流量', - val: 'PassengerFlow' - }, { - name: '过店人次', - val: 'Exposure' - }, { - name: '进店率', - val: 'IntoStoreRate' - }, { - name: '顾客人数', - val: 'CustomerNum' - },{ - name: '平均停留时间', - val: 'AvgResidenceTime' - }, { - name: '深逛人数', - val: 'DeepShoppingNum' - }, { - name: '深逛率', - val: 'DeepShoppingRate' - }, { - name: '集客力', - val: 'PerAreaValue' - }], - }, - onShow:function(){ - this.activeTabBar(1) - }, - activeTabBar(currentMenu) { - if (typeof this.getTabBar === 'function' && this.getTabBar()) { - this.getTabBar().setData({ - // 当前页面的 tabBar 索引 - curClick: currentMenu - }) - } -}, - // 关闭自定义日期选择 - onClose() { - this.setData({ - show: false - }); - }, - // 点击指标 - clickIndex(event){ - this.setData({ - indexVal:event.target.dataset.val - }); - }, - // 点击自定义日期选择器的确定 - onConfirm(event) { - const [start, end] = event.detail; - let startDate = moment(start).format("YYYY-MM-DD") - let endDate = moment(end).format("YYYY-MM-DD") - this.setData({ - show: false, - currentTime: startDate + '至' + endDate - },()=>{ - this.loadData() - }); - }, - // 点击时间选择类型触发 - ClickTab(e) { - let dateType = e.target.dataset.type, - time - switch (dateType) { - case '1': - time = moment().format("YYYY-MM-DD") - break; - case '2': - time = moment().subtract(1, "days").format("YYYY-MM-DD") - break; - case '3': - time = moment().subtract(6, "days").format("YYYY-MM-DD") + '至' + moment().format("YYYY-MM-DD") - break; - case '4': - time = moment().subtract(29, "days").format("YYYY-MM-DD") + '至' + moment().format("YYYY-MM-DD") - break; - - default: - this.setData({ - show: true, - types: e.target.dataset.type, - }) - break; - } - if (dateType != 5) { - this.setData({ - types: e.target.dataset.type, - currentTime: time - },()=>{ - this.loadData() - }) - } - - }, - // 获取卡片数据 - getCardList() { - // console.log(this.data.currentTime,this.data.selectId,this.data.selectName) - let startTime=this.data.currentTime,endTime=this.data.currentTime - if (this.data.currentTime.includes('至')) { - let timeArr=this.data.currentTime.split('至') - startTime=timeArr[0] - endTime=timeArr[1] - } - console.log(startTime,endTime) - getCardData().then(res => {}) - }, - // 获取业态客流趋势 - getTrendList() { - getTrendData().then(res => {}) - }, - // 获取停留时长统计 - getStopTimeList() { - getStopTimeData().then(res => {}) - }, - // 获取所有数据 - loadData() { - this.getCardList() - this.getTrendList() - this.getStopTimeList() - }, - //点击业态客流趋势top5中的tab触发 - ClickPassageFlow(e) { - this.setData({ - trendtypes: e.target.dataset.type - },()=>{ - this.getTrendList() - }) - }, - // 返回趋势图配置项 - getLineConfig(res) { - // let xasix = res.xaxis.data - // let legendList = res.series.map(item => item.name) - // let seriesList = res.series - // if (seriesList.length < 1) { - // return { - // title: { - // text: '暂无数据', - // x: 'center', - // y: 'center', - // textStyle: { - // fontSize: 16, - // fontWeight: 'normal', - // } - // } - // } - // } - return { - grid: { - top: 30, - right: 20, - bottom: 20, - left: 5, - containLabel: true - }, - tooltip: { - trigger: 'axis', - axisPointer: { - type: "line", - lineStyle: { - color: "#444", - }, - }, - formatter: function (params) { - let html = '' - params.forEach(item => { - html += item.axisValue + '\n' + item.seriesName + ': ' + item.value - }) - return html - } - }, - xAxis: { - axisLabel: { - color: '#8C8D95' - }, - boundaryGap: false, - axisTick: { - show: true - }, - axisLine: { - lineStyle: { - color: 'rgba(140,141,149,0.35)', - width: 1 - } - }, - data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] - }, - yAxis: { - type: 'value', - axisLabel: { - color: '#8C8D95', - formatter: function (value, index) { - if (value >= 10000 && value < 1000000) { - value = value / 10000 + "万"; - } else if (value >= 1000000) { - value = value / 1000000 + "百万"; - } - return value; - }, - }, - axisTick: { - show: true, - - }, - axisLine: { - show: false, - - }, - splitLine: { - show: false - } - }, - color: ['#FD8C5E', '#6FD3FF', '#BC7FF8', '#4F75FF', '#FF9AC1'], - // series:seriesList.map(item=>({...item,symbol: 'none',smooth: true,})) - series: [{ - name: '客流量', - smooth: true, - lineStyle: { - color: '#34BFFF' - }, - areaStyle: { - // 区域颜色 - color: { - type: 'linear', - x: 0, //右 - y: 0, //下 - x2: 0, //左 - y2: 1, //上 - colorStops: [{ - offset: 0.1, - color: '#EAF3FF' // 0% 处的颜色 - }, - { - offset: 1, - color: '#FFFFFF' // 100% 处的颜色 - } - ] - }, - }, - data: [820, 932, 901, 934, 1290, 1330, 1320], - type: "line", - symbol: "none", - showSymbol: false, - symbolSize: 20, - }] - } - }, - // 返回停留时长配置 - getStopTimeConfig(confingData) { - let data_sample = [ - ["type", "停留时长", ''], - ["进样", 50, 200], - ["离心", 10, 200], - ["去盖", 30, 200], - ["侧轨", 15, 200], - ["侧轨1", 15, 200], - ["侧轨2", 15, 200], - ["侧轨3", 15, 200], - ["出样", 18, 200] - ]; - // let data_sample = []; - // confingData.xaxis.data.forEach((item, i) => { - // let arr = []; - // arr[0] = item; - // arr[1] = confingData.series[0].data[i]; - // arr[2] = 100; - // data_sample.push(arr); - // }); - // data_sample.unshift(["type", confingData.title, ""]); - return { - color: ["#33CCFF", "#CCEEFF"], - legend: { - show: false - }, - grid: { - left: "3%", - right: "4%", - bottom: "3%", - top: "10px", - containLabel: true - }, - xAxis: { - type: "value", - // boundaryGap: [0, 0.01], - axisLine: { - show: false - }, - splitLine: { - show: false - }, - axisTick: { - show: false - }, - axisLabel: { - show: false - } - }, - yAxis: { - type: "category", - inverse: true, - axisLine: { - show: false - }, - splitLine: { - show: false - }, - axisTick: { - show: false - } - }, - dataset: { - source: data_sample - }, - series: [{ - name: "停留时长", - type: "bar", - barWidth: "40%", - label: { - show: true, - formatter: function (params) { - return params.data[1] + "%"; - }, - position: ["102%", "0%"] - }, - itemStyle: { - color: "#679BFF" - }, - z: 3 //让实时在总计上面 - }, - { - name: "", - type: "bar", - barWidth: "40%", - itemStyle: { - color: "#F5F7F9" - }, - barGap: "-100%" - } - ] - }; - - }, - /** - * 生命周期函数--监听页面加载 - */ - onLoad: function (options) { - - }, - - /** - * 生命周期函数--监听页面初次渲染完成 - */ - onReady: function () { - // getMalls({ - // url: '/report/malls', - // accountId: wx.getStorageSync('accountId') - // }).then((res) => { - // this.setData({ - // shopList: res.data, - // selectName: res.data[0] && res.data[0].name, - // selectId: res.data[0] && res.data[0].id, - // columnsListName: res.data && res.data.map(item => item.name) - // }, () => { - // wx.setStorageSync('shopName', res.data[0] && res.data[0].name) - // this.loadData() - // }) - // }) - }, - - /** - * 生命周期函数--监听页面显示 - */ - onShow: function () { - setTimeout(() => { - // console.log(8888) - this.setData({ - chartData:this.getLineConfig() , //客流趋势分析数据 - chartDatastop: this.getStopTimeConfig(), - selectName:wx.getStorageSync('accountName') - }) - }, 2000) - // if (wx.getStorageSync('shopName')&&this.data.shopList.length>0) { - // let selectId = this.data.shopList.find(item => item.name == wx.getStorageSync('shopName')).id - // this.setData({ - // selectName: wx.getStorageSync('shopName'), - // selectId - // }, () => { - // this.loadData() - // }) - - // } - }, - - /** - * 生命周期函数--监听页面隐藏 - */ - onHide: function () { - - }, - - /** - * 生命周期函数--监听页面卸载 - */ - onUnload: function () { - }, - - /** - * 页面相关事件处理函数--监听用户下拉动作 - */ - onPullDownRefresh: function () { - - }, - - /** - * 页面上拉触底事件的处理函数 - */ - onReachBottom: function () { - - }, - - /** - * 用户点击右上角分享 - */ - onShareAppMessage: function () { - - } -}) \ No newline at end of file diff --git a/miniProject/pages/accountHome/index.json b/miniProject/pages/accountHome/index.json deleted file mode 100644 index bc293c1..0000000 --- a/miniProject/pages/accountHome/index.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "usingComponents": { - "navbar": "/components/navbar/index", - "basic":"/components/echart/basic/index", - "van-calendar": "@vant/weapp/calendar/index", - "van-progress": "@vant/weapp/progress/index", - "van-button": "@vant/weapp/button/index", - "van-grid": "@vant/weapp/grid/index", - "van-grid-item": "@vant/weapp/grid-item/index" - }, - "navigationBarTitleText": "", - "navigationBarBackgroundColor": "#0268FF", - "navigationBarTextStyle": "white" -} \ No newline at end of file diff --git a/miniProject/pages/login/index.js b/miniProject/pages/login/index.js index 584fc56..9d91f75 100644 --- a/miniProject/pages/login/index.js +++ b/miniProject/pages/login/index.js @@ -44,9 +44,11 @@ Page({ } const modalShow = wx.getStorageSync('modalShow'); if (atoken) { - wx.reLaunch({ - url: '/pages/index/index', - }) + if(wx.getStorageSync('userrole_type')==3){ + wx.reLaunch({ url: '/index/index2' }) + }else{ + wx.reLaunch({ url: '/index/index' }) + } } else { if (!deploymentType || deploymentType === '') { this.setData({ modalShow: true }) @@ -132,9 +134,9 @@ Page({ //wx.setStorage({ data: datas, key: 'accountList' }) wx.setStorage({ data: datas[0].name, key: 'accountName' }) if(res.data.user.type==3){ - wx.reLaunch({ url: '/pages/home/index' }) + wx.reLaunch({ url: '/index/index2' }) }else{ - wx.reLaunch({ url: '/pages/index/index' }) + wx.reLaunch({ url: '/index/index' }) } } diff --git a/miniProject/pages/me/index.js b/miniProject/pages/me/index.js index b6afa84..23bbc9b 100644 --- a/miniProject/pages/me/index.js +++ b/miniProject/pages/me/index.js @@ -11,11 +11,7 @@ Page({ { name: '切换服务器地址', icon: 'position', - }, - // { - // name: '修改密码', - // icon: 'password' - // } + } ], userForm:{}, rolesList:[] diff --git a/miniProject/pages/me/index.wxml b/miniProject/pages/me/index.wxml index a752798..e9ee755 100644 --- a/miniProject/pages/me/index.wxml +++ b/miniProject/pages/me/index.wxml @@ -1,5 +1,5 @@ -+ ++ + + ++ ++ + +{{name}} +{{accountName}} ++ ++ ++ ++ + + + ++ +修改密码 ++ + + +退出登录 ++ + +提交 +- + + diff --git a/miniProject/pages/me/index.wxss b/miniProject/pages/me/index.wxss index ca283b9..4e31089 100644 --- a/miniProject/pages/me/index.wxss +++ b/miniProject/pages/me/index.wxss @@ -5,7 +5,7 @@ background-color: #fff; border-radius: 16rpx; box-sizing: border-box; - margin-top: 40rpx; + margin-top: 30rpx; padding: 12rpx 0rpx 0 50rpx; display: flex; align-items: center; diff --git a/miniProject/project.config.json b/miniProject/project.config.json index adca09d..9fcfa33 100644 --- a/miniProject/project.config.json +++ b/miniProject/project.config.json @@ -1,94 +1,73 @@ { - "description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", - "packOptions": { - "ignore": [], - "include": [] - }, - "setting": { - "urlCheck": true, - "es6": true, - "enhance": true, - "postcss": true, - "preloadBackgroundData": false, - "minified": true, - "newFeature": false, - "coverView": true, - "nodeModules": true, - "autoAudits": true, - "showShadowRootInWxmlPanel": true, - "scopeDataCheck": false, - "uglifyFileName": false, - "checkInvalidKey": true, - "checkSiteMap": true, - "uploadWithSourceMap": true, - "compileHotReLoad": false, - "babelSetting": { - "ignore": [], - "disablePlugins": [], - "outputPath": "" - }, - "useIsolateContext": false, - "useCompilerModule": false, - "userConfirmedUseCompilerModuleSwitch": false, - "lazyloadPlaceholderEnable": false, - "useMultiFrameRuntime": true, - "useApiHook": true, - "useApiHostProcess": true, - "userConfirmedBundleSwitch": false, - "packNpmManually": false, - "packNpmRelationList": [], - "minifyWXSS": true, - "disableUseStrict": false, - "minifyWXML": true, - "showES6CompileOption": false, - "useCompilerPlugins": false, - "ignoreDevUnusedFiles": false, - "ignoreUploadUnusedFiles": false, - "useStaticServer": true, - "condition": false - }, - "compileType": "miniprogram", - "libVersion": "2.14.4", - "appid": "wx220b5d2dbb82ce64", - "projectname": "miniProject", - "cloudfunctionTemplateRoot": "cloudfunctionTemplate/", - "editorSetting": { - "tabIndent": "insertSpaces", - "tabSize": 4 - }, - "simulatorType": "wechat", - "simulatorPluginLibVersion": {}, - "condition": { - "search": { - "current": -1, - "list": [] - }, - "conversation": { - "current": -1, - "list": [] - }, - "plugin": { - "current": -1, - "list": [] - }, - "game": { - "current": -1, - "list": [] - }, - "gamePlugin": { - "current": -1, - "list": [] - }, - "miniprogram": { - "current": -1, - "list": [ - { - "id": -1, - "name": "pages/accountHome/index", - "pathName": "pages/accountHome/index", - "scene": null - } - ] - } - } + "description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "packOptions": { + "ignore": [], + "include": [] + }, + "setting": { + "urlCheck": true, + "es6": true, + "enhance": true, + "postcss": true, + "preloadBackgroundData": false, + "minified": true, + "newFeature": false, + "coverView": true, + "nodeModules": true, + "autoAudits": true, + "showShadowRootInWxmlPanel": true, + "scopeDataCheck": false, + "uglifyFileName": false, + "checkInvalidKey": true, + "checkSiteMap": true, + "uploadWithSourceMap": true, + "compileHotReLoad": false, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "useIsolateContext": false, + "useCompilerModule": false, + "userConfirmedUseCompilerModuleSwitch": false, + "lazyloadPlaceholderEnable": false, + "useMultiFrameRuntime": true, + "useApiHook": true, + "useApiHostProcess": true, + "userConfirmedBundleSwitch": false, + "packNpmManually": false, + "packNpmRelationList": [], + "minifyWXSS": true, + "disableUseStrict": false, + "minifyWXML": true, + "showES6CompileOption": false, + "useCompilerPlugins": false, + "ignoreDevUnusedFiles": false, + "ignoreUploadUnusedFiles": false, + "useStaticServer": true, + "condition": false + }, + "compileType": "miniprogram", + "libVersion": "2.14.4", + "appid": "wx220b5d2dbb82ce64", + "projectname": "miniProject", + "cloudfunctionTemplateRoot": "cloudfunctionTemplate/", + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 4 + }, + "simulatorType": "wechat", + "simulatorPluginLibVersion": {}, + "condition": { + "miniprogram": { + "list": [ + { + "name": "pages/accountHome/index", + "pathName": "pages/accountHome/index", + "query": "", + "scene": null + } + ] + } + } } \ No newline at end of file