%zrPabgqKvq=rEZKOO*g zCUI^ZR)msnK}Q?Ro(iX(oE&TmOq(qB$tN@86-yLrWo*h{VrOGHWAeUrH#j)xgQ-m> zTJSnv?GKPaA!g!lVCP2L`{YB$tI?FMdF5Tkte4VQ<8GGK1@F2dC%~_M1Xbq`TSu%2 z#R4l(fO$q*w&c>ZEFs)Vw0AC|%pA~%vD5kCl~%(m&*MhBEP>nX%g#@WdJDI-cA6i) zoRAQha@EMjgb2@IWz7R0&bChl4w)9b>dLgXa~TDsf-AliTIEMLSE*?1+%sdONGfJC zjBQtZi40ZZp4J}T?JOqIbfJ~EX)cehR{%Ryv3O&KBb^k4uJFbivsl3nxK zn(2C6-uD)^JQKhh4iEvhpn?`neM4zbdp)*^RNQKU{KEYXoH=&Mf&z+y0^2#4IWg8! zXNPc~!e`KWsvOu~K&N{#x 1YrIYGZnoBad?J>BPksxq|yNYLNQQ>vhvllWtyO8I;3>3eogROEZn&Wy?@B15yD zD~PLs27zcVtU@m)>8p}NTC7&i%)MR1PVTzKRf@V2!*T?1r5Nf&n>YxD&b>Kxc<{;d z^5)_W9N;oV-Rc2n2~O*s?`ejzpFK>zWdF{EN&=m%2xiJfZCl8w7BdYepn`Nw&YDe2 zy6TGo6$%pAxQwI7sFe(zk)yFPSf{a4`J5^QgRUuX@%q*AD)A)W6Pf&D9*S8mgM)tg zg3R!3@qF6QEfuTPJZ15!P>;STu!1nN9Zwr0qeBN-Fz7k9UK%W>FS@ g%2#v-Pw0Yik zZ+!#w--o>J@i0dp@qXhETmj}u-jXDKitxn6#wh1=Q8l# rdV*RqU5;7evjnh=0(mxdC4()td`gp!J6( zB7YcKg0PNfnU33=n3wZB>3n_#;7{PPh` s9}ZZFcAL$bv!2%`hD;oZa$Dk ?w&NK1qDl92y9UqlJ8Dr;@f1Fr`VIy9?#8}H&4y}Gz~_ ~IAKFsrH(E$KWb)v^x= zbzAKM*rFd3&FRRq)~YP2H6_1Vpj^5DEOb*{!nwZ!xIu>9+M-=9iFn=Xp%HgUT%AaW z&4t9MF0Eb#`o0Li!r&)tF}pgsCoNd^0}x>xYkEZs5Wz2 rJttp*jZSL4PgjoaK89R8ivZ8Us6d>AIih%Yc=pOG z=>3&y*}O6s4(1hJ)<)&$0h8xXTB=B!{Wh;w(@C3y?3@I=Bs$!V`OpSep}-cgk08JV zj8SD>%%p3qgF8!S6TwVst&27Ub!ygqX61YFw}!XntsUUhp9Ox*bJmtA Q5=V$S}Re_A>%ZDG=i7S1Kv;2@T)I7i#@19}aTlY*KfqN7tUhpR;a9$7{F zR=%dLB`L1Dbz*kK+rkt>x=Ilm2_)sjT0|34n)OVrH)T^a@#H!_JLqcMda !!$Y`h;1xS=?e(Rt%5Wp?&CBBLNx3%;!Gs*a@bYDL5qij^vokw~~& z6qn@f`P3(W=$$9q3Z48cJ<9IME@DylF{E|Uup`u4`hCIs{UT9O_C^fwP?9N2(M0zc zL(99_^t0*vv`z=&=G1lR&7m_-UW+{XeXMd7z75-99HRZinWm?B 1trLVh3KyT0{e zr#f*fnuB5+7UPJlm=e+?-SQH@0y(JN?mZ>2mfrTvf=9&Dojz3$ytg!iIo){mRw*1M z+svGc;&`pKFd(;u5Lm$@nT-)er{&L )ZP$-J 6L>M=v0FvtP^b+B)`jebqD_0I7JguEchA- kkn4toya2&s3xuY)i5zR!*xq&z=-}&r&4kjU~*)WfqJEKz!_%)|hoY z!K5V&Y_gdyh;z0IW$%p9S2aZW WcM2xJ|q(#rL!H75;;KtGnU1*43DWS9`(Q Qyqq&(o|^k&>=4`LVs^MO3slfU|K% ~Bq;8e Yoqz z3sfr&3t>1&@JVODJaZw{?lCL2z=PE97sbQnQT1Tw`$*~efZ$#HDJhMO_Q~?haERX* ztcuRDg(_wjbgA}AURg3}lXnc-xdTWq$}3&gQjzpN;xCHANYu-caKBA+ts>gZD>1Fh z5qwQ-)0M9HniJ@s7=H4?zqy5*tx^t$cT9pf1*2&Vh!VJ5Ht1r}CtsgS=^T|;v%vfb zpve!-Ll(rfmL6Zct;f*iZ$`iYFIgET{QNndA9zKlLN{SSM@=ZYqOoomp4x;{(}rdi zRl{{k`A~^VSf1SeXtglRtr}<2eA4s_c{MK3X))^dnwQD`!9rb {pCsrZ9Q)>M|Y8Y2{n-)6kZHLOMXuRpRgduOR9|)ZZfigbNob=K?_Vp<@~xW zNBmyaHj%F@pG<{H@1&n?uc@_jA&r%<2H 27Q1 nnZeH&itXK2vI+AJmfG?UY@nweHwhB5VwsjsUhB;3}4=c@$5 zguely7r;)}qRCI($HUIq$38CtQhG=_7ri=4BUgKX+M_`(DrMEKA#u1WqS@GEv=q$5 z1*VnAwZqj@v_ !2FbQcuZMKV%{7*eTTL^CXGhG^i*(d4o0|HU?Wy`O(CnY(m9VQ zTqvBvaGzXW)=)(`%6*48RweeAC+lpNq_yS6v9H;5I|g3jDeK1Vpg#|@kZVS*kpG-6 zX=)!A8>99@hO8qfYryPTN@`ch(%w=A+XhD>VQW(#ilI-uz#2*x8m&z3#z?F{K#-h2 z)jcd0TI a96vzy{<@E}qn0p2qT&JQZ#kTXd<69Xg)`kk)JbgHc(;iIv9Fmf~Lj(&4^-^7Jz) zgO xAevhlT*^;XOfdm (3tmgH_h=x%mO zb3zkvIu=K7A1I#lg(Cx}OgO;E6HYOFN-S3?Z9YnfX}@7hw|5;{-NfE!79Bo&+(IX| zHRzg8%)@E%wujE^1CUVyIp}RNlh4ehrH;thHDVzKaNLd6*Y|?^S|GE;ng}byqNE7F zK3leho=}OsU{$LrbK%gwEfS4ufn!qbB+QLxZ*qNSw2^upkH8>uoHdm}2$uLLa9#?2 zJ_u!{>>JpR2N#w=TXl`dwx A4X^KUM!?(WK5Ql7B!ZBD?IdT7FIYW8A|CMx9WU7T#edBpBx!hs43P8*{w zYGuh$pEz}e$updSS^@Y@CHtWSL}xvW10o6Jx+T=x@);VvI}Kgu_taB8r^vw3MdCnM z^jL*~0K+B*x18OTgJ#pE-2PVuFYJtDb;f E$4znJ#jO$~UT%->x!S88x%9hGZ_K1YH4`UX6n!kCu9B=Qe$lR>nhUn`v zDF o%A>zqB_0+O2ha#?Dk*g;Pe{SV*iD+ca?jnM^VQ zorI5@R-tIFuv;$%`gi5G&-cKCJC6Xx{S=NSbIJZo%JW) uEwaFSb~_{`m=? ziDnUd6899fE1apYQF!$wgTm54xyS)Aa|&US34Pm_#}{r#B6B@n>&7i!1`XLh;Y`^Q){GiMCX8e0tkP;I}!JKkeUe$90THq z5aL()708_bwLHJakH0MYn;7dm!+$HHzT;5=`$8Z7&hR_fqeAL?dxTAZ4j=Uxze7AK zroOjF#1-i9F9pZ%V2=u_@9hyr44SBa!3@6ZsUAn?->>aaQS}2W^AGGF%7Neg{G-C^ z2ZhhSQT(}e@H-li_x?sx^ADOo^;iFWEsqMU@9l9MHvhr!XNBc=Ry-=QesJJ}Dm8ya z%b)tJ|2E)Jq4fhS`A_g)neulgkp4*mc)Sds-?041x8M1`Pk?_@aQ#V{=hqD4`$^CB zcj)6h{#8Wu1L_Kj=$|9&u~zk$r07?oUnMC&h#a7QCHf=G{-;R!cY(^U?7!|q|6rd1 zMf%TX{=xp=yVAds|GF3UgS-kf+5SQPXLvsj2j~)h+8O(m`qwJ%4{8;V`+lbWT}}5_ z-d~H0KX@@g^WtaTKPSSYy+4&2e iO4@psyPy9fQCJthCY(*C$3Dab&90u=zj0=?8gN8S{VXa5grlGn2U literal 0 HcmV?d00001 diff --git a/bwie-auth/target/classes/bootstrap.yml b/bwie-auth/target/classes/bootstrap.yml new file mode 100644 index 0000000..c08a8be --- /dev/null +++ b/bwie-auth/target/classes/bootstrap.yml @@ -0,0 +1,30 @@ +# Tomcat +server: + port: 9001 +# Spring +spring: + main: + allow-circular-references: true + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + application: + # 应用名称 + name: bwie-auth + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 111.229.36.192:8848 + config: + # 配置中心地址 + server-addr: 111.229.36.192:8848 + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + diff --git a/bwie-auth/target/classes/com/bwie/auth/AuthApp.class b/bwie-auth/target/classes/com/bwie/auth/AuthApp.class new file mode 100644 index 0000000000000000000000000000000000000000..1969bb22f4f3a91338a378309d9f1ab7e7a82b1d GIT binary patch literal 791 zcmZ`%O>Yx15Pi (yGxj|D&CK)s{PpbzfJb=HLmLMHZUs2(;Wq9BxXaLas nH^#3mK_R9NNrt6 5Y^rIK7!Zox-nM$2VH zbcIlwVSo5Oz7QV;&xOwT#95`Ys7@zrMg+SXV1}I+(k;yFwXmX)PFgzHo0!U`@?80n z!d0GAPt9=nrqWIoa;i#2C62T *W-8+ko&3L)=iRYf~(%26?F~<3dO=|R9WtEkD zQXhFn05y=Sv?icN9&aQ_b5qT@SxP;ZD%1SA_TrrT^*C2jyD|#VLBO!LQ6cK_Us(d& z3vnMue?hO33z<5GlmB*cRrgxW^q{sP>677_^5a~TWwb%; IplK0p4$nOKc0aQTEbpQYW literal 0 HcmV?d00001 diff --git a/bwie-auth/target/classes/com/bwie/auth/config/ConfirmCallbackConfig.class b/bwie-auth/target/classes/com/bwie/auth/config/ConfirmCallbackConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..b70cddb5a8d94d480683ac09e707f829d82eb73d GIT binary patch literal 2283 zcmbtWTT@$A7+pIggoMLItW^-((u*b`aIB@a5=4Qvwl=f~h}u5wgiSa!IVYZTB4r$B z>{}najBlOljF+j;TJ1#bbo>GS4q^1E|G;tWlgOo{6m=N(_50TPuKVP-zwZ7DU 5miWlNIhM_o)<3&B3h~p$)(jvoJB-4VCR=kYSC|-% s(}Q_(31 z^kp5lV9K)0FDjEK1 jMitj92u9_!o^N3|z{wQ5aB e%*;1yg_=|MFUa$)0gr3~ege(?wGJhr57DyS^i~ q%7BC+c~NH zMQ46W>KgHt%Q&}; Jd>n{z_RfSf#RKE8EW) z*o!9(bm8$R&KP(NXQMc0;B}mjB5Pn07Ytm)R1|L*n8u8OS$)!p#~6;a>h-m2-`&4= z^ZgI*-}`9w)6f3=@Y?G2?|;90YwhE2*1otK+^pWZ{l}ee_5CMbu73X2+Krk*6mJ@s z!&@|V_k|S2+XmhNBiOl-x{J9bmVf{YpkV&X9y|O%6q)sHC&oF}m^)FFo~M|QWB-AM zt>h_P<(qp$;OuS+eA~P5pv^&94?o(fhjofTYeD(b%CES#nin{lNH#2=pzmt$R9$wm z)+%h;frrvJQm8SWUT?%bWZcMSy;%j~G^ f7~0Gq zlxe1xz#Xj5ppT!rcCg+NLXYleeknux8Q|F-uA4bO!8y#CF9gS@xHCBm&XLql5VyGq zp_`)?1|fPl8Z`ktjb82qo}qFmP(Hy~%f(W65K2|iv;h$36{yler45i+9poQ-_630Z zai9+PH6o-2(!Dp4>aQYPMPxW!TQpY@t)gW(@&jUB@$N`>c;FYbMxZ&H0;Bg*8+eW$ zCeVf?nfv)S81Ro0w+;IkrGvchWt0warRCFgoAl~1jsy;+@how)2Wes*Bz`hr5&cMU z(bhysPzJmOee7S4XJ4StkaQV8qwPn;w0ZpQbF9U*lVEA?LKs+2%OLls`5&ib2Y=6; HYL5L4D6WJr literal 0 HcmV?d00001 diff --git a/bwie-auth/target/classes/com/bwie/auth/config/ReturnCallbackConfig.class b/bwie-auth/target/classes/com/bwie/auth/config/ReturnCallbackConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..5bdde91add99e9f142a88ceee46a477b3fb78999 GIT binary patch literal 1929 zcmbVNT~ixX7=BJjNV058#rlCCEm*J#*siwJRzs^8TU#5nLm4i-J6R54X|fx4PXxws zroHn*{Q=fdr{kR$jvs@SVf+F9j>6~_|G@D%yFlm=7{-g7bKW=a`#kU0Is4bYtA7F* zL&d@oyqrf5PFpCTXig(Jj9PdFXDpnBV@|J{<+UE1!}%=6EL_0rSzOHGl0a8Is0j>K zg0SYurgZ0(Lru-|Yi1u?a4M8kSQ0oI%4*fq)2h*|ORWSh#7 MsY zanngm9XAM-GxeAof%>OfzV;ew#*4gaT}}9Ypr!T#KN7gq5wohKA31Z<)j_!I$Q=h~ zqNRgHFI2OH?H>1hPhVk5h2o4rx*W_h$li+Qs}EX@stTti*#!D3fh+4XGW3kRrA+I2 zkMyGzH)uH3MNc`hrRSM|Kj+n)DWzMXUzYWHRl0Y|v675wLnts%S&*N|rQLDe3L;Ij zNQW&~)3P^=5!CFYiXvHK6z2*ZGmWd4l 3?TfhJPqld}ASzNL47T(Tc!p1u&+j!S3S5eO5nvM5xU7&dA=4Eli#{0O*0+|Gz zy5zinSY1#q`&r(%$or4=P*S{Tdq&vuJsSIl@2jv}mr s~Co>oh2=1D_yz{4hxQDGQ_0yhhL!FOqr=_nmWW3K9{gLo&U&qsiq zc?O$2umWSd`Qs@mCDlA2`Vt2D;2!~BXQc3)xoG?>q|EK3?n$1zxgY1A=FW@B^%+VI zcfma~@;k)OJf!d}S7Qu9^mDZn1A;zJN#F%Kr()-e+>Kp+ 7R?yW3u=p3~lA}`_ zB)#P1iR`!b^|=w3mVTaLf{AFwiLGxRYNV2Gg(Gp`}CoQ|1H zaE3Vv*PKpZfME_&n-LVipkCT3z+jvKbLi`N2>Vy04TIQKgkE&v6m= KA6#jZy*agO@XiU@?1Qb^h$0!;Vq9O@i*aZSYF6K77JFtVx%sMkGu`D0- zAyug|@gb#ER`L*^Qss-9q)IU{dC%_<#6OYB*E7RjTy7@Ws-3=_KIi++IeohS`up)8 z06K7?4(st=EgH}p#Yx$os>f-Zk)OUg#F3~+KL+H&U_IW)P#uPGHi{8B7>(isx%{CV zd=$mU5uB^TC-^ji&jhNn*0?}Z+_J}2EvKb2y2_bx!yK1w$AlW^NVhu$>b1O^8P@HK zMoJfGiKnbdH92MIs+?CHe?jdo3USZIp}grDllrLP7|E>OZJL&=xrSvr0*5@CPR^#S zF aNBM*`) 1Qn$})L@3Y@w^CYmRI?2^ z4kp8H#vtUKFOW`IrfXZ-tZsX}dkRC^i#ocQ_Kob1c_`JaMz0RLl5l5 y3M@)|0r&Sfmq10*SyZ6+IETA;BAX%RhZ61tnQ(u11xv8&tUabQ8$Pw7cDX_)C! zuMb*|o6vGO37L>CYS}y?t);(xa_VId tsnR zmWDm@G%r^D7CM5=0=KxmQ^6Lzso+&?5a^ow_TkKpThH%apSySU*^gIu&)s`C`{3Hh zQ2fZ{E5Ts)*7VHpH;Ut#8`oxU-sf1sX1o!>=L)`nrXUF|f|P TTGY|+vZmiOW d1v zdfL9C+eu*6c;TuV89FVnp4nW~7F-#u0TlDAISaqUr)7<#mehD(I_`wSOXSS(K>xgP z#kJ(n-!0HudJFk7yoDC9(zwi9K%lQwRe-KUQ=oh$Gx92KD);mPF9{z1f($zqw 5`W_Yr6;K7L2+tX%A*O*)cC^kqs!aN>vxpm>B(x2 z!&oh)MZVF{#0TJdz8I^pNfrq9AdfKk5M!@~?Iv%I2mgh+YK~b~_-&+w%2u$g-t`dT z0XrdV fRTvM ziXFt-MyxUHq_$m@BDPjf9q@{`D6sn+goAeM;e158LS;vQRg2uDgUHC!?EzPo=eR21 zxPWMpqa;{G&>&z*u!RJ-ky;Dqwi9$K3GN`lRuYVr5KI&ZCa@3tJr2zQ!4B$?p=zT{ z3 BdG`2byn#? zW49HW7=y7Q tJWrUHt|gs|LI11() U>`m;wwqG|DL! zFUVcWB=K?C`$$F^`>o-py}`#k(UX9!uZq*uU!;%zEZvrFcq6Tn?4HFJx+b$BHC4n8 zHhjz`@fLQ;j#NndemVjUeq|3Mll9Ofr2D=F^TzW?k# bfPkIL!7|B zYw=t^&cao2N1>Y&AYg_M5P&EMn1upgMSd#^nB!97H3Rcd=DN(#1zwd~5GgFelK=1f Umvhicey`@x3V&Vo&=l6*0kF8r(EtDd literal 0 HcmV?d00001 diff --git a/bwie-auth/target/classes/com/bwie/auth/service/AuthService.class b/bwie-auth/target/classes/com/bwie/auth/service/AuthService.class new file mode 100644 index 0000000000000000000000000000000000000000..b3824a3def3a5319a01c0a44892e61d611cc5a7d GIT binary patch literal 556 zcmb_Z%TB{E5FEEnUla)Z0OD3I_yD&eB!t8Pm4_Pf0dBISt`fUAPJ80VIPd{{6k-!9 zK&p^9aIn0)GdpX~zP-P^0yxEf2Vn<$0^Nd4a%mG1I2n%TYN=$VOe!Pqv`I%t G09C8D1Q*S?R#H$(>cYyEg;a~ o4Fk=VKoc#_1I_}0Ho&D0x=dJ?dW`h>G_b|c0NWf3?9`Rr4~S}|ZvX%Q literal 0 HcmV?d00001 diff --git a/bwie-auth/target/classes/com/bwie/auth/service/AuthServiceimpl.class b/bwie-auth/target/classes/com/bwie/auth/service/AuthServiceimpl.class new file mode 100644 index 0000000000000000000000000000000000000000..68fa29e78f6da718a90cafb1471c163c41c33a2c GIT binary patch literal 6722 zcmb_g349dQ8UMeKWHy@t!V=KPjR8VJ91s*u5Dk}r2}F{hqLofIlVo6bXPuel(4wVQ zt5vI|R;#tGz17y@)g>TWdswTrr}nV5w;;5&_g%I9znR%9y8-R5*(@B6;@egE%x z- RRwj3V{VZVGlATRfa@hA>fPzm`r zwF-~nak=Oh6g&~e0$dZq7v=p+^73V=;#Z`0PljMs GB6Q_=K$jbsJI%*Nht*O~>qw8EuJ#60!B^-e>+AVuPbCR~180fe4xUt=`w`#qH zo^Z5&J?dKaPEF4;Xl*Ii+HTrLAH|O5&2+krcrvEDhQPv-qWW}K*E~usYT1UiA)kp- zs=Ca9gzlznO1S9FOIYHepvCmWfY#+oD_V<3mU5jjw%*%ox;b@EE4i2+zbvWwq=CK# zY!p amTwZOZpxu-qLq>9IM(7UL>X3+bA{KqHeb;c6kr zNc8zjENm!7Wo}Lo)sI^Vy2(k!T)If!D4-%aXeBWT+K@%t-9r+38PDJFcK|iJ8EZ zBEmi^uA4qoTyJ8b**lXN)0Y-87O1+UXgXi6^#15BSC4M((32jP3Vz6HLRWSe?x5Az zsms834V&mz#H;}`A+WAtB$+`1YVDFRlVr!oQuPD}^a9OqN<2d)>V=9TfjrOH$xw>M zbTdwk$NQd5xn@jTtviD>Qo7Eywi>jfddqf~{!B92>BwWO>XT?|bL5nAX0hyJC*1np zEk@LBUE0dZE3oVT3gU=fW-NI26(}#gUT!A(ErDqb#qP-u5P|R($4U@ZRuERCZMqo? zLVHfhyvb$5GRumwR&p(cIg~VI^48^nW*Y;>4y{vn8C{ZUTuhJm_UZMR%&ea;(Ah9@ zCGtvUhv7K-fYCbl4boAWxX&W1MXCDkRk;G$#9-x)sFC!x1qCngy~|43QDc>7Q|++o za*BjNptR-=jWsNn>8k|=sa3@Wbg9^ZoeF-W;>UPVV8Y?+Z#aC{fkQX%JAC)SLkDj@ zdg~oW_U>hFs`v>usp!P{3Vy2MXY%Fe_=UivY?%!TR-P9HX5{2uciYkXZalJg_se(h zerf2YBUeB6($ImI?>(Sm9o7rXA1)@!>~Qsj>u4LiYTt4G`6(l1EYA#c_mB?T?8KeT z+ Du#2}}sdx#86dYFZGLEP?ieD@Ejf&sm6%}i7o`T=0 z_&xrh;EyW)gg;YQE};B9Ou=7N{1ty=Fdo^v@9@L-9J=;K6@Qlk{(*mT$H u~Vf`p@=e7j1uJnCk$73 zS;~y{$r9f%vgmGEk@AF(_A26LuTVKHs;Cf^icnM$5><)_tD;({su(TC2s8~B8u-0b z; ff z?vq&>J``=t^xud%-NyDMo5vaFd(BZ$sRYzszh-UJV=|E0iEJWfhHYDPUwwAvV>B|{ zRr<|D-?Gg9uM8OO3buIywXC$c& *|J$p7mmm^atFs;X1Z@PY_~1Z*Tt+BxVS`-FE- k*`l0wtuu3 z$vwwmV?fd-hIqbDf A`)^f ze=SLD@Z1zN+F~)D!b)h97l9f5iiZeSGDWxw1Oz(fQD?L+9uk
X{{b&3vz9!>&?KCcWHhE@4?QN3eYmp=tT7Yjf%W!px=)w+2u?%|n?p68~~)4j5bI`}Yo7M38TmZKaQqvz(^ zHX`V2k0Z^m5r!)@85V3Azq5+)EawIuC^*YyJv-cs!wbtSY5sA)7O>%90<1Q4Z!<5z zHls{l3}vwmlSv+Ty^~3GQnwu= -Rz@ki(;d!B;jpi|?gv=nQ zipl9NC9b>CLD`-ZV7Giwx4Yz5l0;NC*SYxcm+SDE$nUp1d7^` Ewk_0b@5$9r@&Me9~X?*u43E4J0quW3evN zHCh$1fQ?}hKBeqo(LFXDX7Eel3J9!3IX^D4b>;JFK2`F*Mt*OU2MLs+olj-x7&gaK zP7ys%Q^UrjES}1E?WPoscb*zh(YO!dK~HQCuaXFugpItaJ^?Pkg?!`ZI&9+NlKE+> zDHUyNY)YdnjZt@^DpEd#iU%4WL1oi^C{%J@8lfjpwXXRoPKJZY>d5G(0~iCOF?I+w z4^T)s *&sYZX{Kq;z#i*X5+n~Yg_3ofOC z^_YUqcq>Lhr$lLlKiA8-s5eqJ?lnwS(5JvaKSwIq6Y?f7fI+g+Lh(G2sN&cQ(!z12 zjO6e!?2M!_UUKe7Z5f`xgqHF;;xq9MLUDqGqOP2?C#F#+kvmC_3}I3llOt0iQ`4B% zQt>FJU$hT1S}N-*BPZ8Yq)~rCUF8sFwJ3yGN`DlyNiZieH;qO)-I^AP6MqWK|c z`!T T`00JjYV~#Iwg(M>Ow;}J%{`T)Y8z!bjlfgYN01uiTx4}^F=tD z@plemsf~y)Cw?nnGCp@OLU%I?Z{X}6M&?1r -0xY6M5*a^+mj=kFjBIHgk8f!9 zY%e2a7~45Eilh99LU~fZZr(@n9*Ha&!dV^j7(z?aIC}`^ eU7Xb zB0;`XQme~x1*vlxP!pC_pA2%b6;xi + + diff --git a/bwie-common/src/main/java/com/bwie/common/config/RedisConfig.java b/bwie-common/src/main/java/com/bwie/common/config/RedisConfig.java new file mode 100644 index 0000000..b62e4b1 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/config/RedisConfig.java @@ -0,0 +1,40 @@ +package com.bwie.common.config; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +public class RedisConfig { + + @Bean + public RedisTemplate+ +day4-zy +com.bwie +1.0-SNAPSHOT +4.0.0 + +bwie-common + ++ + + ++ + +org.springframework.cloud +spring-cloud-starter-bootstrap ++ + +com.alibaba.cloud +spring-cloud-starter-alibaba-nacos-discovery ++ + +com.alibaba.cloud +spring-cloud-starter-alibaba-nacos-config ++ + +com.alibaba.cloud +spring-cloud-starter-alibaba-sentinel ++ + +org.springframework.cloud +spring-cloud-starter-loadbalancer ++ + +org.springframework.cloud +spring-cloud-starter-openfeign ++ + +io.jsonwebtoken +jjwt +0.9.1 ++ + +com.alibaba +fastjson +1.2.80 ++ + +org.springframework.boot +spring-boot-starter-data-redis ++ + +org.springframework.boot +spring-boot-starter-validation ++ + +org.apache.commons +commons-lang3 ++ + +org.projectlombok +lombok ++ + +cn.hutool +hutool-all +5.8.3 ++ + +com.aliyun +dysmsapi20170525 +2.0.1 ++ + +com.aliyun.oss +aliyun-sdk-oss +3.12.0 ++ + +org.springframework.boot +spring-boot-starter-amqp ++ +com.github.tobato +fastdfs-client +1.26.5 +redisTemplate(RedisConnectionFactory factory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(factory); + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new + Jackson2JsonRedisSerializer(Object.class); + ObjectMapper om = new ObjectMapper(); + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + jackson2JsonRedisSerializer.setObjectMapper(om); + + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + // key采用String的序列化方式 + template.setKeySerializer(stringRedisSerializer); + // hash的key也采用String的序列化方式 + template.setHashKeySerializer(stringRedisSerializer); + // value序列化方式采用jackson + template.setValueSerializer(jackson2JsonRedisSerializer); + // hash的value序列化方式采用jackson + template.setHashValueSerializer(jackson2JsonRedisSerializer); + template.afterPropertiesSet(); + + return template; + } +} diff --git a/bwie-common/src/main/java/com/bwie/common/constants/Constants.java b/bwie-common/src/main/java/com/bwie/common/constants/Constants.java new file mode 100644 index 0000000..2fdc9fe --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/constants/Constants.java @@ -0,0 +1,18 @@ +package com.bwie.common.constants; + +/** + * @description: 系统常量 + * @author DongZl + */ +public class Constants { + /** + * 成功标记 + */ + public static final Integer SUCCESS = 200; + public static final String SUCCESS_MSG = "操作成功"; + /** + * 失败标记 + */ + public static final Integer ERROR = 500; + public static final String ERROR_MSG = "操作异常"; +} diff --git a/bwie-common/src/main/java/com/bwie/common/constants/JwtConstants.java b/bwie-common/src/main/java/com/bwie/common/constants/JwtConstants.java new file mode 100644 index 0000000..03692c1 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/constants/JwtConstants.java @@ -0,0 +1,29 @@ +package com.bwie.common.constants; + +/** + * @author DongZl + * @description: Jwt常量 + */ +public class JwtConstants { + + /** + * 用户ID字段 + */ + public static final String DETAILS_USER_ID = "user_id"; + + /** + * 用户名字段 + */ + public static final String DETAILS_USERNAME = "username"; + + /** + * 用户标识 + */ + public static final String USER_KEY = "user_key"; + + /** + * 令牌秘钥 + */ + public final static String SECRET = "abcdefghijklmnopqrstuvwxyz"; + +} diff --git a/bwie-common/src/main/java/com/bwie/common/constants/RabbitMQQueueConstants.java b/bwie-common/src/main/java/com/bwie/common/constants/RabbitMQQueueConstants.java new file mode 100644 index 0000000..b054d9c --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/constants/RabbitMQQueueConstants.java @@ -0,0 +1,25 @@ +package com.bwie.common.constants; + +/** + * @ClassName: + * @Description: RabbitMQ 队列名称常量 + * @Author: zhuwenqiang + * @Date: 2023/9/19 + */ +public class RabbitMQQueueConstants { + + /** + * 短信队列名称 + */ + public static final String SENS_SMS_QUEUE = "send_sms_queue"; + + /** + * 登录日志队列名称 + */ + public static final String LONG_LOG_QUEUE = "long_log_queue"; + + /** + * 添加入库队列名称 + */ + public static final String ADD_RECEIPT_QUEUE = "add_receipt_queue"; +} diff --git a/bwie-common/src/main/java/com/bwie/common/constants/RabbitName.java b/bwie-common/src/main/java/com/bwie/common/constants/RabbitName.java new file mode 100644 index 0000000..e0d4956 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/constants/RabbitName.java @@ -0,0 +1,5 @@ +package com.bwie.common.constants; + +public class RabbitName { + public static final String RabbitConName = "rabbit"; +} diff --git a/bwie-common/src/main/java/com/bwie/common/constants/TokenConstants.java b/bwie-common/src/main/java/com/bwie/common/constants/TokenConstants.java new file mode 100644 index 0000000..1871fb7 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/constants/TokenConstants.java @@ -0,0 +1,24 @@ +package com.bwie.common.constants; + +/** + * @author DongZl + * @description: 令牌常量 + */ +public class TokenConstants { + /** + * 缓存有效期,默认720(分钟) + */ + public final static long EXPIRATION = 720; + /** + * 缓存刷新时间,默认120(分钟) + */ + public final static long REFRESH_TIME = 120; + /** + * 权限缓存前缀 + */ + public final static String LOGIN_TOKEN_KEY = "login_tokens:"; + /** + * token标识 + */ + public static final String TOKEN = "token"; +} diff --git a/bwie-common/src/main/java/com/bwie/common/domain/New.java b/bwie-common/src/main/java/com/bwie/common/domain/New.java new file mode 100644 index 0000000..1e40b92 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/domain/New.java @@ -0,0 +1,18 @@ +package com.bwie.common.domain; + +import lombok.Data; + +import java.util.Date; + +@Data +public class New { + private String id; + private String newBt; + private String newZw; + private String newZz; + private Date newDate; + private Integer createId; + private Integer typeId; + private String typeName; + private String userName; +} diff --git a/bwie-common/src/main/java/com/bwie/common/domain/User.java b/bwie-common/src/main/java/com/bwie/common/domain/User.java new file mode 100644 index 0000000..6783eb9 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/domain/User.java @@ -0,0 +1,12 @@ +package com.bwie.common.domain; + +import lombok.Data; + +@Data +public class User { + private Integer userId; + private String userName; + private String userPwd; + private String phone; + private Integer role; +} diff --git a/bwie-common/src/main/java/com/bwie/common/domain/request/LoginRequest.java b/bwie-common/src/main/java/com/bwie/common/domain/request/LoginRequest.java new file mode 100644 index 0000000..36c8497 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/domain/request/LoginRequest.java @@ -0,0 +1,9 @@ +package com.bwie.common.domain.request; + +import lombok.Data; + +@Data +public class LoginRequest { + private String phone; + private String code; +} diff --git a/bwie-common/src/main/java/com/bwie/common/domain/request/NewRequest.java b/bwie-common/src/main/java/com/bwie/common/domain/request/NewRequest.java new file mode 100644 index 0000000..7e15d88 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/domain/request/NewRequest.java @@ -0,0 +1,15 @@ +package com.bwie.common.domain.request; + +import lombok.Data; + +import java.util.Date; + +@Data +public class NewRequest { + private String newZz; + private Date beginTime; + private Date endTime; + private Integer pageNum=1; + private Integer pageSize=3; + private Integer createId; +} diff --git a/bwie-common/src/main/java/com/bwie/common/domain/response/JwtResponse.java b/bwie-common/src/main/java/com/bwie/common/domain/response/JwtResponse.java new file mode 100644 index 0000000..df20d8a --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/domain/response/JwtResponse.java @@ -0,0 +1,9 @@ +package com.bwie.common.domain.response; + +import lombok.Data; + +@Data +public class JwtResponse { + private String token; + private String time; +} diff --git a/bwie-common/src/main/java/com/bwie/common/domain/response/NewResponse.java b/bwie-common/src/main/java/com/bwie/common/domain/response/NewResponse.java new file mode 100644 index 0000000..22fe490 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/domain/response/NewResponse.java @@ -0,0 +1,8 @@ +package com.bwie.common.domain.response; + +import com.bwie.common.domain.New; + +public class NewResponse extends New { + private String userName; + private String typeName; +} diff --git a/bwie-common/src/main/java/com/bwie/common/result/PageResult.java b/bwie-common/src/main/java/com/bwie/common/result/PageResult.java new file mode 100644 index 0000000..85ecdda --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/result/PageResult.java @@ -0,0 +1,34 @@ +package com.bwie.common.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author DongZl + * @description: 列表返回结果集 + */ +@Data +public class PageResult implements Serializable { + /** + * 总条数 + */ + private long total; + /** + * 结果集合 + */ + private List list; + public PageResult() { + } + public PageResult(long total, List list) { + this.total = total; + this.list = list; + } + public static PageResult toPageResult(long total, List list){ + return new PageResult(total , list); + } + public static Result > toResult(long total, List list){ + return Result.success(PageResult.toPageResult(total,list)); + } +} diff --git a/bwie-common/src/main/java/com/bwie/common/result/Result.java b/bwie-common/src/main/java/com/bwie/common/result/Result.java new file mode 100644 index 0000000..30b1e73 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/result/Result.java @@ -0,0 +1,76 @@ +package com.bwie.common.result; + +import com.bwie.common.constants.Constants; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author DongZl + * @description: 响应信息主体 + */ +@Data +public class Result implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * 成功 + */ + public static final int SUCCESS = Constants.SUCCESS; + /** + * 失败 + */ + public static final int FAIL = Constants.ERROR; + /** + * 返回状态码 + */ + private int code; + /** + * 响应信息 + */ + private String msg; + /** + * 响应数据 + */ + private T data; + + public static Result success() { + return restResult(null, SUCCESS, Constants.SUCCESS_MSG); + } + + public static Result success(T data) { + return restResult(data, SUCCESS, Constants.SUCCESS_MSG); + } + + public static Result success(T data, String msg) { + return restResult(data, SUCCESS, msg); + } + + public static Result error() { + return restResult(null, FAIL, Constants.ERROR_MSG); + } + + public static Result error(String msg) { + return restResult(null, FAIL, msg); + } + + public static Result error(T data) { + return restResult(data, FAIL, Constants.ERROR_MSG); + } + + public static Result error(T data, String msg) { + return restResult(data, FAIL, msg); + } + + public static Result error(int code, String msg) { + return restResult(null, code, msg); + } + + private static Result restResult(T data, int code, String msg) { + Result apiResult = new Result<>(); + apiResult.setCode(code); + apiResult.setData(data); + apiResult.setMsg(msg); + return apiResult; + } +} diff --git a/bwie-common/src/main/java/com/bwie/common/utils/FastUtil.java b/bwie-common/src/main/java/com/bwie/common/utils/FastUtil.java new file mode 100644 index 0000000..94b1722 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/utils/FastUtil.java @@ -0,0 +1,55 @@ +package com.bwie.common.utils; + +import org.springframework.stereotype.Component; +import com.github.tobato.fastdfs.domain.fdfs.StorePath; +import com.github.tobato.fastdfs.service.FastFileStorageClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; + +/** + * @BelongsProject: 0107day02 + * @BelongsPackage: com.bw.config + * @Author: zhupengfei + * @CreateTime: 2023-02-01 08:52 + */ +@Component +public class FastUtil { + private static final Logger log = LoggerFactory.getLogger(FastUtil.class); + + @Resource + private FastFileStorageClient storageClient ; + + /** + * 上传文件 + */ + public String upload(MultipartFile multipartFile) throws Exception{ + String originalFilename = multipartFile.getOriginalFilename(). + substring(multipartFile.getOriginalFilename(). + lastIndexOf(".") + 1); + StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage( + multipartFile.getInputStream(), + multipartFile.getSize(),originalFilename , null); + return storePath.getFullPath() ; + } + /** + * 删除文件 + */ + public String deleteFile(String fileUrl) { + if (StringUtils.isEmpty(fileUrl)) { + log.info("fileUrl == >>文件路径为空..."); + return "文件路径不能为空"; + } + try { + StorePath storePath = StorePath.parseFromUrl(fileUrl); + storageClient.deleteFile(storePath.getGroup(), storePath.getPath()); + } catch (Exception e) { + log.error(e.getMessage()); + } + return "删除成功"; + } + +} diff --git a/bwie-common/src/main/java/com/bwie/common/utils/JwtUtils.java b/bwie-common/src/main/java/com/bwie/common/utils/JwtUtils.java new file mode 100644 index 0000000..f560aa9 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/utils/JwtUtils.java @@ -0,0 +1,109 @@ +package com.bwie.common.utils; + +import com.bwie.common.constants.JwtConstants; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.Map; + +/** + * @description: Jwt工具类 + * @author DongZl + */ +public class JwtUtils { + + /** + * 秘钥 + */ + public static String secret = JwtConstants.SECRET; + + /** + * 从数据声明生成令牌 + * + * @param claims 数据声明 + * @return 令牌 + */ + public static String createToken(Map claims){ + String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact(); + return token; + } + + /** + * 从令牌中获取数据声明 + * + * @param token 令牌 + * @return 数据声明 + */ + public static Claims parseToken(String token){ + return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + } + /** + * 根据令牌获取用户标识 + * + * @param token 令牌 + * @return 用户ID + */ + public static String getUserKey(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.USER_KEY); + } + /** + * 根据令牌获取用户标识 + * + * @param claims 身份信息 + * @return 用户ID + */ + public static String getUserKey(Claims claims){ + return getValue(claims, JwtConstants.USER_KEY); + } + /** + * 根据令牌获取用户ID + * + * @param token 令牌 + * @return 用户ID + */ + public static String getUserId(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.DETAILS_USER_ID); + } + /** + * 根据身份信息获取用户ID + * + * @param claims 身份信息 + * @return 用户ID + */ + public static String getUserId(Claims claims){ + return getValue(claims, JwtConstants.DETAILS_USER_ID); + } + /** + * 根据令牌获取用户名 + * + * @param token 令牌 + * @return 用户名 + */ + public static String getUserName(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.DETAILS_USERNAME); + } + /** + * 根据身份信息获取用户名 + * + * @param claims 身份信息 + * @return 用户名 + */ + public static String getUserName(Claims claims){ + return getValue(claims, JwtConstants.DETAILS_USERNAME); + } + /** + * 根据身份信息获取键值 + * + * @param claims 身份信息 + * @param key 键 + * @return 值 + */ + public static String getValue(Claims claims, String key){ + Object obj = claims.get(key); + return obj == null ? "" : obj.toString(); + } +} diff --git a/bwie-common/src/main/java/com/bwie/common/utils/OssUtil.java b/bwie-common/src/main/java/com/bwie/common/utils/OssUtil.java new file mode 100644 index 0000000..9c1383f --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/utils/OssUtil.java @@ -0,0 +1,153 @@ +package com.bwie.common.utils; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.model.GetObjectRequest; +import com.aliyun.oss.model.PutObjectRequest; +import lombok.extern.log4j.Log4j2; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * Oss服务调用 + */ +@Log4j2 +public class OssUtil { + + /** + * Endpoint 存储对象概述 阿里云主账号AccessKey,accessKeySecret拥有所有API的访问权限 访问路径前缀 存储对象概述 + */ + private static String endPoint = "oss-cn-shanghai.aliyuncs.com"; + private static String accessKeyId = "LTAI5tD2tppzLQ4Rb6yKYyph"; + private static String accessKeySecret = "KEKNKwVvDq7PZLjE63NPBouqHXox4Q"; + private static String accessPre = "https://dzlmuyu.oss-cn-shanghai.aliyuncs.com/"; + + /** + * bucket名称 + * @return + */ + private static String bucketName = "dzlmuyu"; + + private static OSS ossClient ; + + static { + ossClient = new OSSClientBuilder().build( + endPoint, + accessKeyId, + accessKeySecret); + log.info("oss服务连接成功!"); + } + + /** + * 默认路径上传本地文件 + * @param filePath + */ + public static String uploadFile(String filePath){ + return uploadFileForBucket(bucketName,getOssFilePath(filePath) ,filePath); + } + + /** + * 默认路径上传multipartFile文件 + * @param multipartFile + */ + public static String uploadMultipartFile(MultipartFile multipartFile) { + return uploadMultipartFile(bucketName,getOssFilePath(multipartFile.getOriginalFilename()),multipartFile); + } + /** + * 上传 multipartFile 类型文件 + * @param bucketName + * @param ossPath + * @param multipartFile + */ + public static String uploadMultipartFile(String bucketName , String ossPath , MultipartFile multipartFile){ + InputStream inputStream = null; + try { + inputStream = multipartFile.getInputStream(); + } catch (IOException e) { + e.printStackTrace(); + } + uploadFileInputStreamForBucket(bucketName, ossPath, inputStream); + return accessPre+ossPath; + } + + /** + * 使用File上传PutObject上传文件 ** 程序默认使用次方法上传 + * @param bucketName 实例名称 + * @param ossPath oss存储路径 + * @param filePath 本地文件路径 + */ + public static String uploadFileForBucket(String bucketName , String ossPath , String filePath) { + // 创建PutObjectRequest对象。 + PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, ossPath, new File(filePath)); + + // 上传 + ossClient.putObject(putObjectRequest); + return accessPre+ossPath; + } + + /** + * 使用文件流上传到指定的bucket实例 + * @param bucketName 实例名称 + * @param ossPath oss存储路径 + * @param filePath 本地文件路径 + */ + public static String uploadFileInputStreamForBucket(String bucketName , String ossPath , String filePath){ + + // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。 + InputStream inputStream = null; + try { + inputStream = new FileInputStream(filePath); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。 + uploadFileInputStreamForBucket(bucketName, ossPath, inputStream); + return accessPre+ossPath; + } + + public static void uploadFileInputStreamForBucket(String bucketName , String ossPath , InputStream inputStream ){ + ossClient.putObject(bucketName, ossPath, inputStream); + } + + /** + * 下载 + * @param ossFilePath + * @param filePath + */ + public static void downloadFile(String ossFilePath , String filePath ){ + downloadFileForBucket(bucketName , ossFilePath , filePath); + } + /** + * 下载 + * @param bucketName 实例名称 + * @param ossFilePath oss存储路径 + * @param filePath 本地文件路径 + */ + public static void downloadFileForBucket(String bucketName , String ossFilePath , String filePath ){ + ossClient.getObject(new GetObjectRequest(bucketName, ossFilePath), new File(filePath)); + } + + /** + * + * @return + */ + public static String getOssDefaultPath(){ + LocalDateTime now = LocalDateTime.now(); + String url = + now.getYear()+"/"+ + now.getMonth()+"/"+ + now.getDayOfMonth()+"/"+ + now.getHour()+"/"+ + now.getMinute()+"/"; + return url; + } + + public static String getOssFilePath(String filePath){ + String fileSuf = filePath.substring(filePath.indexOf(".") + 1); + return getOssDefaultPath() + UUID.randomUUID().toString() + "." + fileSuf; + } + +} diff --git a/bwie-common/src/main/java/com/bwie/common/utils/StringUtils.java b/bwie-common/src/main/java/com/bwie/common/utils/StringUtils.java new file mode 100644 index 0000000..93c47fd --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/utils/StringUtils.java @@ -0,0 +1,68 @@ +package com.bwie.common.utils; + +import org.springframework.util.AntPathMatcher; + +import java.util.Collection; +import java.util.List; + +/** + * @author DongZl + * @description: 字符串处理工具类 + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils { + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) { + return object == null; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection> coll) { + return isNull(coll) || coll.isEmpty(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) { + if (isEmpty(str) || isEmpty(strs)) { + return false; + } + for (String pattern : strs) { + if (isMatch(pattern, str)) + { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } +} diff --git a/bwie-common/src/main/java/com/bwie/common/utils/TelSmsUtils.java b/bwie-common/src/main/java/com/bwie/common/utils/TelSmsUtils.java new file mode 100644 index 0000000..36a1207 --- /dev/null +++ b/bwie-common/src/main/java/com/bwie/common/utils/TelSmsUtils.java @@ -0,0 +1,88 @@ +package com.bwie.common.utils; + +import com.alibaba.fastjson.JSONObject; +import com.aliyun.dysmsapi20170525.Client; +import com.aliyun.dysmsapi20170525.models.SendSmsRequest; +import com.aliyun.dysmsapi20170525.models.SendSmsResponse; +import com.aliyun.teaopenapi.models.Config; +import lombok.extern.log4j.Log4j2; + +import java.util.HashMap; +import java.util.Map; + +/** + * 短信工具类 + */ +@Log4j2 +public class TelSmsUtils { + + /** + * 阿里云主账号AccessKey,accessKeySecret拥有所有API的访问权限 + */ + private static String accessKeyId = "LTAI5tQYiKvBrFCLCdJViegZ"; + private static String accessKeySecret = "pzGYeyC6BuXrdIW8f8ueLbdgHSb8MW"; + private static String templateCode = "SMS10001"; + /** + * 短信访问域名 + */ + private static String endpoint = "dysmsapi.aliyuncs.com"; + /** + * 短信签名 + */ + private static String signName = "登录验证"; + + /** + * 实例化短信对象 + */ + private static Client client; + + static { + log.info("初始化短信服务开始"); + long startTime = System.currentTimeMillis(); + try { + client = initClient(); + log.info("初始化短信成功:{}",signName); + } catch (Exception e) { + e.printStackTrace(); + } + log.info("初始化短信服务结束:耗时:{}MS",(System.currentTimeMillis()-startTime)); + } + /** + * 初始化短信对象 + * @return + * @throws Exception + */ + private static Client initClient() throws Exception{ + Config config = new Config() + // 您的AccessKey ID + .setAccessKeyId(accessKeyId) + // 您的AccessKey Secret + .setAccessKeySecret(accessKeySecret); + // 访问的域名 + config.endpoint = endpoint; + return new Client(config); + } + + /** + * 发送单条短信 + * @param phone + * @param sendDataMap + */ + public static String sendSms(String phone , Map sendDataMap){ + SendSmsRequest sendSmsRequest = new SendSmsRequest() + .setPhoneNumbers(phone) + .setSignName(signName) + .setTemplateCode(templateCode) + .setTemplateParam(JSONObject.toJSONString(sendDataMap)); + SendSmsResponse sendSmsResponse = null; + try { + log.info("发送短信验证码:消息内容是:【{}】", JSONObject.toJSONString(sendDataMap)); + sendSmsResponse = client.sendSms(sendSmsRequest); + } catch (Exception e) { + log.error("短信发送异常,手机号:【{}】,短信内容:【{}】,异常信息:【{}】", phone, sendDataMap, e); + } + return JSONObject.toJSONString(sendSmsResponse.getBody()); + } + + +} diff --git a/bwie-common/target/bwie-common-1.0-SNAPSHOT.jar b/bwie-common/target/bwie-common-1.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..11c492730e5411878f6a3f8889a81f9a0bc32c37 GIT binary patch literal 26659 zcma%j1CXW5vTje?wr$(fwr$(iG^VF*+qP}n-P5*h`}H|{-*fLi@7(>~iufZc{>WTa zt1|1WuQDr_oFou1G5`QLIKX|nt*Xv&v4{@<06^N;^Ys=$T3CsnMqEaOPMTjvTtrw= ziB?+VR(gC)N|J_l21b&Ga&mmCPJ#Y6)7JjYIL)y5g!BZJIQ2KklR%@yy?hM{;sn#e z6Vk)OgM&kTa{h%Xtg}OO__J-i-m!h9)Ref~(}dUxEUoBN=-7s>eFs_zX=-ul8Ryb^ zg)3=l$qB_P32FuKVG8M~aYgzCCcu`TNl*ZCUjv5x8Zf{=2mCe0e|;dnTK^jGe~aCH z{jPt>d^Lc-9z$Dey8m6`A7Atj2?JMi DxFt{*B&$>deU2THpNdMu_(xI{Q<}!Pwr}*wN{4dc^-bWk)+(8^^z!%KtQ8 z2V+NPtH0|K^*?m!>|}2BKPToNPW>hJuMgZ;>t8-%t?y#|KPTkhh0*_S;V(1O{+nC; zyB6`^X#GQ#=6|@#A1m)49%>O#T*&$5nySzM0OVia@Gt-SQ~FO=Q7|?#cNF}m+t3 GO;au5N;9BGF@$&qIWYWDsimgt;-d&Z6zT1qNhp)W)KU QW`-Rl%*Q45bW16X?LY z$c$#ciK0)qvo0@#_EkZcm!E3=TgChwKKPHTF71XU$0hZ&j759Owh5mDl>n}NlXj!9 z!Wbn+Vg9@@0h^Wq<4U^{@ZUY#%57(M>bK-~RiCn&nQ7jh1qWhnlnd6Ig&GAoLkU_S zkMkRus7X%}*BTmc!@pAz)(FanOEqsH4JK7sq8hOmH7S|<-fwqU+AT75NTfY~viG?S z3Dd_65ccJ{&R)gOTmw=Xa0Jf4%KY>tK^l8n=q?R$wn~12O#{tLd;0c0^$CJbsvUU# zWE&*PFN7PCG*kkdL_#87nV_nvOBVywlR(yqaQ;TSo~Z*GsE_8HU30s$YJRsUskVS6 zktb=C{Bbtm*OgaNBT4e4$-MG%jpb}NYM+tj_j%~!R3|2$dDyHjsD$&(x%-yE#rr}#cWD(BxO*|((-gpEOoief3l9Dv?Wy4cD z8;VB*8{VYCcOI$`M*yTU@9pBGE%c8E^#N`;v!a0GybLR4hP4awc3wPrKzGUq4ch{x zRitGHWo#d&dwJq OFJ0VqomRo zsGlX8S$jeCwPr@lF6(PxuYx|E61AFCblXI+CVc>SyGWQAyaT4-6sD+ra( (#4A z1$zBD8&a}H?*V9XdZu2pLABGG>&$C#jjDe%^DK-5htEJMmmWI)^u_i3j`NB3kNxkz z@dw25#;Noh06-WZ006~*#-BfToiFtHqxA;>MaWCbBFQ83BzccJB`d5@%JIQVh@bW@ zH^)_*Pe&uCI@N13;$#}99!oK1EObyA8W`*>^l$2EEurgMzu_e6Zl&67%1J;_ryE@i zxj(KuZu0ohdS`xf3$%t2r?yn Jm9HaagjnwpnIwYG-gLrWqtM| z$1H4%L*K>I+expJc(2f6oZhaTH7UQWa}kP$&Pu~Zw|EJk_yIG*!!J6ty}isJE_%(L zn{17we>8!VK<7RRgh0`e+kWY?QRr&aqD5f#sd1mRqC4gpJv@j^CQ7b!*?ZBf!`Z)w zfAMiid*(6xl;49pq1CX>kagnj)t5$xy>? EYjTw1=-muCtuLFln5q4?hOvJ z_icjrq$09f@R#?;^X}#x-Qnf;2wu;O{5;)Dkv;-~AEqPaJ$$s4AA!|!8&zvWK&)!D z#9
QaxA`c!@L2j6BCQ0TQDEBW2&b5R1tHH%iv2_i<437V0 zaO%G`xP+_I|7CMYIv{!EkIF{Q(!1?t4`S9|0n1AWA-~1s5|S+p=GRhmoL5u0#`6Zc zYGc)&zIn&9GX<+_tT}dGuHEwDW!YW=JXGuOfl9hlAIck&<6xcV%@r jr=2?%E7q(@reXrp7Qpw|;mwb IW2%a1 z_F--Vl^D4VM=!5j&>Lat$jZGJD&?ZIBwnqqIS6TO*0s!ScZNSlF<@ wQ!40ZrXFhkQtcJ1MEPw%LCw9V(rj~+7uFDtXg7ors~S~x-nwjS32 zDLai%@|t2N06B|PN9r0wfEqWzD23Xi*LQ7_YDscOfq)|g{kAxk+M7!c_BI~_6|rjI zpG@n&S0^|-rl8uFu?W75#rn6#QqVUrFn5xcmv=UHHvTuWCCHD-0P@3^$FSWzgrv8Z zfGwiiVj=-iF{tyYZMCLold>D7%zGWVx-(vHfj!9&>O>FsgasX6lq$(C-g$a=_y9EX z5kJFfL8#MdcWsXwNZn70%-w6J_L>j6X3gYE>4dV!S9w(_w^4%YqQ7ZYQ_J3>#!& zM(8wIV{|;!GK6so-WSf-f_f-+wc%AB0R`SAC^5F1h+*SIVZ=(?5~7a=D&=BLSZ~9% zoQJyAAKJN&dtvP2F=Frz|J+`)Yi}{>63dZictkEJDB#1gTTRq2+Kdt+R*?a!&0y;o zcI~eSr?YsY;fl!8?>Mjh}jH`Y7aF0-cS z02bLL;Pt)_au0s%yOS3yS?^6PC`Rey-V9dlq0(RQ+{d(DU=zx9IQ6#=DCT78ArN#b zi*Rv;?s*pOfu}uVayD&YwOF24V38G2@y?_XRt^? MO$Y~-!G_W@tg})l+zTn zS(>}ySE&klAfsAkDQI2va%`m0zSmHcs_wIU$x?@|J9me3$deE)V(yGY3O`~3=wlEF z9}$g@fLH8)Au&P{XrA)D-UnN1D>{pf;6}$MNrMHJsyPHR$z*v2`RiQ1%+aAMf6XK8 zm*3O=?OZC^S{mE@o4-fM{o(HiG~f8I0;b#qVJ`;a(2)dDh2f#Cf-{F{W$f%yq?d%> zX=F)p-vDI2V`^Oa2h!rCWL2dLX6G-ns%!yZYtn?!vFxn|YlOv47F8P_O5`nBAe{Kc zRI&Fx3U68qc@X4*$?o{Y8tyGLFVi2xR| tdbLHJgJIoSF|0e zy|{^pHZq(b3Pd(B%op;IG1-VjubFVx=b;aEiZ6+6QXE~ < z1g^U>{m*Pi6IqbGqLNIxfJ!_vtDK_P?WgtO2sSw2`F(AX(>HY~cf!#Q>|*U9kMY`v z*_nds)?&VsEpjty{PZ ;nF!4ycz?dK$x#&j^Vi%eXXIwIo9CHX(MW!C; zk3>wPAu5R(#GN2#$_oYu1Js9+L~Qg2&~Nf}K#>!UH=uyT1y|<2?nY|whT96r4b2VJ zn`~)fi_nO~Emp{QU4QjD9OpUATwQ ldXBKk0h&O_70pdU4C~A=bbvBV3n 5u@to*hgz@x4)1kkT2HIr2vIg2@xYE{n&5XRH5@SI{j+fCb|E^HQa#}I4vaC}y zqmeF`-Pqoc$HSqcc01$@!Wl7i$|K9q-&*m2Ie}Rf9mlYF4K6J|?Ld8`RCY+?frDt) zA*u>&O`lvsr-*IXaOzC_8 IA%s2B*pL?L<5I?-OQb-Y|K&TP|K_G_&Rd+ z_Wr=CV{WUZEBTm)r4{laJ=2zM@n8W{C!*V-OSEyzB4sKKlb6Ry~Nnvb(Ir z!4$Ql*Ukco(M<+&HxCoF9!&`b62izcg@3=0hMKtWjf@@$%w`2~#S4#!{)mTCfY%1o zg{Rq@d^ovHDm u-p<))^=W^WqeFsrWr(dz_teO^| zfkBmqyFgA8nhQcQ{mZ`rpNB|dApCqK+ vm%VbW_@I 5>3wR!+&B}+ss@b+TmZ<&sAcx2hhV)i-ggC3{ z(%Qg*b@S>Vgb3MkeNC>O>SqLJ>xvnzUDGl0kNg^X^Igcw*@v=MA!Sk^H+`C4r@(c9 z4%Yr-aK%ieufGV9Y*ijd7-b MeOydj{16vnwBv5*M329YEZ0Ou5TI~DyRo>iA}#GP`Ke&ISv%84iL zG 5|LDV)d(T;WAy)sSqk=tNfAc5Gf;yj1%j95-4Pn4AGJGH3RCa zfs|4AJ~<$CsOZL3vb0>lFmO^c8YV{4v{bG1v=QFCh$3Y#6+jA-x)z7c*fAGvcpYs> zxW^SMXySrdiwLKVKp;yNq~wZOiwUQWLQupIhpez_F6K?^PcS4r{KKA { z_asU~)ohbWWpAic_u^yAgw5{M%1G;OR7Jp+6iN&>rjH+LG6%-URlT^bj99~9q2E+1 zYUi;NSXRc!wS_0;acD>>n>`XLwvVV8J!3A=8RTbJ%B<=lM{>*Q7&EM-lpHE3HCJoY zj9v)^8042Hl$Q@Ou)}UT$q)AobNOAfM;o`GtBbe7K+^@JnD QXahyh}G4F(pP3hr{D`&*>o6=Xa_85Q FA)nwq8K5h4$RX%FTkfa>av zVh|l3)V*RpfY`rc;|>84a9`OWaq|a7ju?DIq9kvc$#aR3lP{SLGYOFsZwcCXgAp*^ zhqf6M7Vz7Hpf;?sc>{CDnNX!KH%$3}-bXo0oPPW4&7LtWnPGZ!KHSXUDoONYQo6XZ zWNYTMaC26od;^-9cbC(`dAW+KO1^U>ZVGu()!(r*QP7I!2?!x+#TChMKzVrrb>U&A zs1y!_AlqdE)x{J?(NdPP5G(nn?8L%vPEY`%G%^oT5EPFqXS@g>kDwsJ2h&=ZJs!;n zWHCGeNr|Pf{1elKhF_h)7{Wr<0jp{(_K8JmH_I(~CHf<(`};IWeD2^Ymq%`dZGnmw zinS;3_aUO(h^bwW@(|XGZ3s`k`fJ7CdQqXQ9|#?43&L2Rk+_j~$kuPFFWl|aE6J%e z2_nawG)BeC$N`vup$-||l&M8-`rsDT@Mer@NuDXFnql$pWu0o9?bydi;F|+Wy+S%8 z>6d1tF)^2o^_Q9Jfl-8OV%uOfjY&fGI>LKFwYJ5fxgD*MfC_CqsNUc@If=Uu?QfE2 zyq}2av(i}2DYm#U1w4po7+oSeh`Sw#Nf=!!1|Hs*RO^KHk=LihxO$#t{etD2bl3E| ztHV}X_wSoo*FFlgL7Q24h^26!aDUyz 4DnNT84W=Vz>a4PAZv<-H~{N8ESC^OC5X)Ar98J#9;7pd zHz+(lof`neW<)V?ozQ-^D-3RhQBKoAn-eu~qti3zhy63>h0NR6&F>%3Ta=g-)Y*yt zfvs8#(B(yDY gy0GP?LAbnd*d4l*1=ZTXM^0)@R|%_*A@XA6hYKXf4mFiPE%X;xR`oxr&s zvXL0`uN+h~S0B^T@&(h6xcv0l@X^_3^BgC-;pis4xjw2l9WI(3;GslOI;rUl^&!Sk z8P)2e2Xgt2ea43cP!4Izx55J)5i=5wq}xgCEIfeOf^3>-oHe*T1auH|o2~%x9I*G5 zM|?6CsnnVynXp&tciJmDx-Q+Uy=Ch_y~a^kDtDcEgF$#R(S6#h1k{b=;1xhCi<--3 zAvHRlfOohOTv9Cwod}2KL$9dZ5>&)MB2j#zmYNg?2FG{mn8J4F1`ft|7OO|8)wLAS z3|(sOfDG!~>4Gri8-x_V`OTAiF0ssQHj=%J-nwv8csz_$a7LntIB#S%{2CQ0y@9m3 zsNW&aEsw7IX6dF=_jkZsR}hJD6I*`QkJ=`WnakGL0hGngiO>&Xm`Kx&vBb<7%j{4v zf+bHKxAe1%a~V}VG0Z*+z#`4!XmtzUBb;p^dNJH|L~wiABiHx>#ss#tE5(S3#&MA3 z0*{vK2+z`g_Cf$9n5wbbrT8dv_Z`ENk{M`aqo;Z@#h|k-DU=pTqQHI%>v;7lk#&X9 z?RDhu?T3YRW`9qv92+S(wOnaMv?tNNloMdm=KLv-LGZlX8Y>g$n~o|hML{h{RR_|B znTa_Qd~4kqK^1=5Jh+77A{{fpLbAlc=q?IDI^Yg)&VhqDfbh$LFZfW(qb5px2=T7Q zFg>s1%mDLMJF7jx`XT=9<~zat2-3K5Il{qyfH@ =^j*@uAZl!6Dhyv37#< zF5X|)Jiu^=jRYtFfX`P(gzo>n=D!I1Ust@!x+9V@@~3s3t~jgt%B%qJe%Um$bOq-Ev`=Vvxf{%i|+g(c#)_o9pZ9_svgWJuu#IJ)TJ+`ha8lUh-;=u> @+B=0}L ()p%r}mOv8k{7z z^V+~B5^@sDk3C_Ciayf`D3eCB#KPKLmjb!elQ{Uy>O#nZyZ{VIfnI{~ +fVx|wqn3QTOD9Qw+GOn+Cg>z4yLxr~m;}C!I1Ss@uP!YtR@RIUx z=w=cN+}h>zw~&^P$~)$o*<0_ot8<&EKytgH8UJXNOPFR#r<*b&JAhJ2Oiyv3;8M?I zfGV&W;QVf?e12BU;?r;65=k+J>x`+BZ~|+wj6c}vu~@;9*mVhR4{A|yYgE4A^%|Rh z|B**KvJ9Ac{^-JA<-yWWl$g}d6^CAPc6_s!tj=Icy;>@_DdH@iVO=uF$U&=ckEU^t zvJwMX94DANPm-YWo={pJWm2;uceou=r?PQz%1gmdNrw^(6*D^eP_LX*`aI3aQ`6sH zYkSc%SrxTtZ`wof8)Xmi1PX!Qjs?eA&J`6cT6Sgv_Ds`$^j7ISQ8g=S)#PI>n1hN~ zOjU6WpT{;4)Xi`>gSBifGE{t4@b}|VOis+V74)0=P~{A&mHtvT?1y{QhlZSm(8#B; zxzmCpm*p8S`N1*AgmxCSEzKFNq*qp6FralYOShr!Hn*v6R4bP00TUor%q9N`P|oH2 zYGr}P(5hHpQ~U02BDde&-VZLdO<@y$OEy~s+*Z>}q6h3UVruKfCti*LJH$}A1({4F z8W(I=yu8_Y!&X msQ_84$MlOl8(26Ztkk?p8&bzsaRu?#F1q zbr_?K@1#3FLF>lmY@L>;*3~J6_-|xGwONgvH&*%Twy{6%84`7zo*w(< Q8b^^+&rxbZ^1s{u!AQDpXgZBFv zn3iPfgXm{9GLL_9ThCX=#88~w6nGw#%nco=rc=BAC64;7$HLH#nBGlPuX+I;8wQ%R z02DX~(=VcXE5o E&bDWeNq}z#%_{K$X;3+khm8FtKML zI|=s!ince3Hlb0k9*X;fLaArPLLmtc>5O=3#)t{v^$T&`07AOEw_jI>asp61--)
n&A#f@`7J zprxn>@^fy%L3YTSs=MW6!6EcW&Mph- krXbWDLdl!&k1QK5s zc0x@B8gLB#i43P;A?GNA5`DsN0VA=;{LLIUe?B`gofd!H&*@tQ6zZU(44BOrfoDJ* zyKwU_ItVUd9FZ%KOtjvm@G&=ja6`Jn>s xI@8 HQIMUDSoRP@g)1z))d1>-;3 z|3yVLZLx&Wc?>T-7AFgxwa6+6XnZ$3D|{Q{SH!cE?htnrNR&z33=FGwtk2i=s*ZiO z!J?D6e*#wmBmPPvyl1;&a?7VNHCg;87qvVXcja;H%s8a;`9SF=vC5|p(m=#KaZqQi zj@{{`Op?vNR1B#UcUtd`KvpPDX{LB&L28m(OT3EoZ3Fb!`tHK*J3dJCiq*DK(~)ta zGVR!r(fSj$Sz8pp=FG#Uni75r4R_X~&vwScsqa4hhu=lx+z&llS8Vk@+m(zUm#Kuq z;bIW$COWxgvzPUg2c*RkL?^GRm9HfEsqzmQpT)-)8RvKLY7G5GR@d|`{(o>$DI(Kh z@PVnbD8s|sAVHEtr#^@k@6*opx;B}uyW!!Zs2iloMWD91tl A%#iu-J^JD?NWKlo8rDR6+JdQwli%KWYgjUeO7B*=~)7+)pwU- zmVl(X)-Ly^8WGNZh!fT$VBkCv52Z!ux2v7ArhPaM>BB@SuozzaD-d@ys9Uw_=pF_r zb!;T^_b3GQ;+^mS;q-btja)^ b+k84u z1pmFb8c7Q&2Z5tf#ecJRbu9pSOYSBr*z0?Ym6S9u3kwHtij|DCH<)C2> `cD9Z$E}A%wOP!)j@@y?c^0{MUXPXqd$-np@*(Laj z>fzaShgC1q!tP%g2^{jnn3kpD2F%1^g=ze}r*yBLAY9&GeQwM_dd~?X&Mj~p*Tm6- zmH~41VVTN1_%0*5FWCvp)LzC5Sd(2=Gu+dbP*xLLxIC9Hf18y~nRs?aPb!4mm$5D> znt8m-zMpR&1Ql9qYZIByj?jOk2Hlh*kTgq*cu=`9{^VF8;N2%i6_06t P4=Qmek^E{IpckgPu~Ln0G^N{#-s$kua_zq~zj`Qx9!`G7+YI z=LDR6j5kiwaocbuMQw9AFqbqb9z{<+`{}gKOtw5WK{2Sm+d%f>VKVc$ARdMY!%7-y zV9jR2wdS&s> a8A2)3#?NJ3 zgz?|zTl$98S0{|Kr4q-DVz$&L%!+W9E-w5gW?JFCOJ5vvTy6bz;he k&54| zw)KXW0x0U!yzFlX{p8rq&i6CMG^Yy$PiL^XPr?Hxd~$ &0ATX#1`)yk&ghjLjUE0>Hz|KXr84}-!baNSX}@!7eIZ(UJs+)% zcD9xQSwLewNpwDeIS@sYO*)Coshi@D3|=Av|E&OCf@`2*$!NZxRNn*wf(Wm{UVyet z CA(LR{Fi|p{E0b7e z{8;aQbTy1 wf#3XFW)8tTQ zbqHS0HNRF`XOmFYLgj4VvXpwRb6vIhof|QgZ|%^H<7~4BvX aIQz^&u<>0^7ns4h?blDlhzw`+q_x51XRT%v=j zzaZh%WrikPD*>N_i)$~fm@ZPYwq(ZsE1s{?B%K4($e@46Y3fF58wcLr4(+kxo!JWw zzH<}OsC@>b{~$_qf$^?wFw+pqW>Nt& ?$ zW4bzNF+PM-3l*kRk9BU;I@IR!oSbXrXgPd1Dm!t)js#qsh%}L2CU2PsLkZ5(u&+`< zf3UC6A!)QrD<^Cdv*&Y9ahdt$>k28Mmb?H0ZK)d52j@|hVDAQ02o~QB#LB)|!jjJ& zY`!hXxp-`8QNJRwG#;Fxze-40*Vyw9q0VE61%ZqbWrE2W8&jU&&qBp@Yv #kV8V>GL*+ZpF8AZh>lN=|wEPXEQZ;@DOy5KZmY5Fzj_nxW}MFSjAV;dmZ%& z@_xXK5Fz?=Qws3n;VNuc4ojI1hl4*0xQQ885rA BM~A8 z#9z#&;?KR;%v5C$uNrm s^8kfH$Xb2F}5HG_aW~wq)KQWIGZ$^#G%Yi85BlJVuX$&O(;N!pYC{ z <)cAY;WqTA0Fd6e%aUVgpCDilM@u^n(_mu@A0zwa89^f%J# zKXglp{-y32%H*%4WCvslF{22CbqIdk90BDPAP21r|H(}NBz>|EB4Ga}wOJYFFV!wV zmc=hI_bCz;cnpRq0gZ|;OdVUFzMdhHVH!A^RG>D9UJJRO6fl_=nG$hIQ zW!wY`2Fklyx2$i+bh)QSFVyPE@kRZ7*fOXR%&;B~R!}Q$NF9rX{piD1Vq=}chXmJB zCOQbDB=i(CiiA~=ahS=!6HCadAmUJyne{obH#R^nQ@wTMJ%4d%5w`t`Vvr>lfO&?u z4Sv8C40&4Hn2SHkHM?Yd-=+ up zp8ZB9K~|B=$=al8fy|O?-r763$92Y4eMM)R)ghme2Bd0`G$C}1^A;&~%(a>>!6G*b zYqS4DsVnHXYat2q%I??oH@HW7-lJ{y+d2O OkQ@!e+WV#!(3y90J{7;Exqtms$) zzqtdE?EQrhrv5ojm+B$>Xt$jJxGfOgpPj%V62B{o{rSX{cF>+svdeiK4agePKp|Lo zOs9BFA2cj=2Yudd=cWKeYA^)hQ1hm1h{qhzZ3mjGhHqS;FSk mgWA&rggDz+n~+J#1P6%Zt2YUx*p6|ihvjB^UVN;n(N)6!{{ zfp{P;D@; %u45ivAh$GQ(`ip2{Lu5ekVMw{GyYWb-;lTKc6Rd=o zX2YRhoT|mWZCpK8<@<4z#`tYX(A=w-tOl?%b&JZyLVCk-15Xz;w#n$Y`Tz!jD3h)7 z&Bq&qYf=bLmz%py;GS8~XeogJ+58z+C_tL=2o2YOGe%So4yGqvOwme{VA u@rz zx7J_hHrdaS&c;9*m2}0anXf+MG*3}3F5QZWps1rjDvexCAQ^McxJCzY<5^zGYGwed z`cz| h>uo@)-qGka+RnX@euRPE4`<&cn3Eav}19ThGP(3mUNB4F$S@ z={Hlo)F-0M7V)EE8+TEQ (`s(?z%=^7V_(aV!I@GOxlf)%i=+mL88DFR8G-yRwM zJNKa_q!6`ywtJ!(xJNe+Zi5WSS=RkEwJ;ZDE-b5KKK74(Sp2B;|D38VIw8)f2D4BZAG~*`_Z>g`tQh zeclg!6Sn}OqS6;i9&cqIp{-Za_DV06_`WfEZ}tjY+9j#3AG+I~iFtQCQBagtD#oOH zEF&3(%?FY7{wF*L3OqA>;1s~(VLe%}{m0(l=t}RZ-16}81=~{XY~g*3WX?Icw7;M3 zru^cPVAoxhbh=S2s(&B3U~Q&@F6i>hv4weueAh(psmRgIo`NZ|40elR&h2~qyk|S1 za0!U2Ver}`fF-`)oN>lF5L2ky{^_c_X&~1j+*1svqFVhELh7bH?G@SUo60S_P9fd! zIPo -XKS@_};T8U*=wu^S>gT!qbaJ*h%@cIhT zoJd9yfBlH|KC?@b<0uuG508@R=O7dT0ybXOG#SZ{xsL1WH@^1IFkiZ^R)Wl>WP-~4 zYxtO_X=|Za5txIBk&O-owo-Bs4nf;3#wnP|-_#WVK|Ipd;+gl?j>#nYhG5(B!fq?4 zuiZr6*3hI 4?60apG9KOxxt3JcTdu{()h(TY$J%RHpynu=X06_G=WAb0{SmoFi zYaZn@f;%rJ-rj(!(Qk)u$6rCTwj4BV0!zFd9)zyPVXYP!eN6GkFKP_)e#C{@h}l9b z8p+X{2+xrqfv{l;YuQ(j$?Z%0HyBU7;||-*y%_G^K`^}Mj@OGHmm8a3msT#)raGSw zeE^_$GU%P+o!ANDiHLc7cSQx=q=t66d8a0j*0@I|6cMm{+;wi5*{1Ansb$|{(+-=T zQRtpoB)jyFn>fAE_|YbVuDBn&4i5t0Kj3@u)Z5{EvzmPv!U1$bw~X6+XUjN0%6I7? zS0q$sSRKPuYK+isOy`gw 5tEB7zc3!-=#ucJQYUk6HKKm`H09LCT;t3XzRdBY{U0SM9jDzCRIK4c{+EO`J*= zcARh^2Zyw={go p{kT zkh=BsF<8n+nD4BW@QWe~-~!xqNvo+$1kR@A<>j0|!!{F@>${I#|K#c nk^Dlv;pgxZjV#M1+?Qsa$CWfkLmZ2 zwJ^o7M-GgV2jAkd)wgS)O2XaD&Thklk$4r!(driBCyecqpgOY_F@uS6w#0TB>TZN7 z3rcN~7_2<6PXeYs-xtuPx}5F )@r4Q9I6 zn}@n(ubF_viJ|X^jJL?xP4rN{v(blf0GZk)`M$cbM}>dGa)f+fA)Oeh&Commz^aVW z@g@?5X%Ad%arXni 8D`p;O%XL z%X1gw2&|L@-|zhf&KCV<_yP@)jm9vE7;A`alOs8rNl5AeiCNJlKMZsvl*~J1L-=em zi!BoNlpR8j#~0G5<@>_+(cVMz8?*%M*}-*#@?l-%)O{2Ao*OIV$76%r!vKRdakk z`p<3734nW|yDAFipH57aYvJN-j=#Z*;p)=-qmsP03&ymGJF5FlRk=TUaecObUM=e0 zx^qe6Jr)RsfqId*%m|Lyr$?)S5tHa|pe3yWW?HlTK!+GR8ossF Q!?);I`!?VFy(~ItP7Y3Ly>ApQ+tCU|K1)e+`OIi2_iRX z8gtH|=Y%k!PHEj~RFO7&g<`B(H@y}KZs*%9h#52g4MWc~x>T&vXc#VaOg=*1`fx1r z-IYROdoydIxamwW7y{27ip%L!z%@&&Q~5MqzGsA`7K2varFX9EeicCqqAMb9V;O^P zMA8Hnb%hIb1U6pT7 ROK2Qap{%`p8Egtg7FTgEj@qD zT~vZMB&1xzJ9pV9cb);NT$Ar vCAhX32zo5|^>dU43__w4p&<}8Bkgwwq$yWjAKg#6(y~yp4 z>OB#CM^wNxc~f806wfg=Yb?1PJVbJ#mrmWYP1wnlvG|CjW-}anW*^ znRK}3c#-mco3-lt4ZA-9Idf1CD)34Iv8vDxx{88vEu6N!vY#k4ym5 ?_nxB zn0aea8ja(X%mq~!b0}=}*c`?nDwByrT8mH<(>H5;dSg%J?lb9Z f681PyZsOSHf| z@_?aNog_tAm0V69(i1oVUl-3*vgdCrV)s)USK8|3%@;!E%PC1@Q?|oHZ}%usxQFVs z@`|6VCj1{tVxHTnRmWyH3HmUq>_(OF1& %BJ=%kYOi;d2defMVCwP`#kvF`b?-MuPw-bYLL3NI2s`>8vw6x1>MG8G@R z=6yLE4TA#VoIHcg1x^?BPKF7p@&HP9F|6j~g~W%TsbT6kX}cG;j_epJdgkN@ML8Sw z%DN*dA2NG-GIMfXH@)32Cwu+Ux~SLRcQz_kecnCWy0SLBaK1g6wc_%8zVsaW^lNZZ zHWwSh&T$@~aQu`6Ogq&|iX1z6Gu)TaZGGw6T=Z`Dxlb#o>O@<5*z~H{M#9P3VM4vn z*&JCbAD>I88T2M@j)f*ubvF9ZYICoNmjqG2)X#E&y7y)jQz2g!HK@d->cBsrOT?qH z_zX&j;W(BMjcCpZn85;{Xj;xLmmxA=?yN2XwCCR~`RN#JFEc=7FrIUktcm{6$HbJ* zH>0D+s*TniGJj &N6g0#U?rC)EbdTnFcu`(1)7+&iBbiqP}Za=zR zFcga7I?Z?aY$m|-vc5Imu$KGie{*AhdRD|2`I3pm^BL1RXLQaMYveuTRizL~g 2V?}!(an6_?Y1J*?TYBs_F zsKDBILmYe);vVeaF^R35qW(z#b*UP15 Wi?I8Q<#QX?%kS#F=(C>BkCc4To NefF*moC%+)-DZxhzqP1EmKcUbbXaF#3lm!i3CcxpCbdEH%q z&6ki;j8?jQ)e3V${T+;crAGgOqK<#UsIsQwstWvv5m2mk46q=DJy3zTL^y#wK8ZC@ z0ZgGee&BSf U_*R9aPzLmT1o3&>RB`Y*{Tp)|XYF3MXk-Q!Oq^BYPft^s`i1wZ6r1OjJ?? z6y{LX7cVEyUO~?(FQje2YDT93%ggb2tyZ2S{ cyw{r$4zM9wmy6p=c%RBr)w z^yryAqoNXYk7NQ>p_<5fJ(a;ttK>AHsYSXaiPfsw7^Yd8x8Nk}I_yDh8&5rN$qw9> z_@UdJb1`sQx|=Cv#JXO>n89RKu(P6~NN4AhKn(}pra9Yzqw0!#90XV>a2cqEeF`h~ z&^9a(W8nMVK*(cVy^$Xb5pC8~mI|Xm>pE~2V_QGE7Pb-~VR-{;k3ygPs8k_w*{z#V ztKI)7q%Y3ommhg}9+-Cw2c3xINA~O%#y{c)rYiJ?zbnd(aIF*=`U_lI1fey2Ol)LH zR9pljFdVX!Pzr-ZjnV42Fn8Sc&sjs}HBpSZW^vm&9gI}#mP`xxcFtNdEW-6{cwT}a z;}aMtK%q{yP~ZOCt Y>nR2Kbvt9nAqwjS@gkKM#(sod%gabQP@WCi z9vX#@6S3#$IxQkzJNn-GHagw+u;nt=z42O{>v<7B&nNd_T4p6@8mm!{IZi0Uz5)R4 z$Jdp7H5hPFXQ*g#JNuOaqfVhzhLX|kg5*5TNw-I6>@c6!3u$-Ub36joCXCn)Qk9CP zYBga&=apG1j`jT?3N-7~(E+8Bndi6NKkksQ^Rg&OkjpeRNX(@7rFYrSkyA@-rn8=5 zdZ9Fg==pa6zPJB$?Xd`@(u?ipqgS Z`HVp>7hu2`hEMsQ6 z|BXOw!-M*5CPXw?P@p?2I;)ApWjEcB!sg-kF!JLyD#!tJ`gJ^$DEjyWF&*yqEJpg} zoOS5r8b{V1KrJ3&OsBNTO7|h)Rm;zoWb?jz^9?T1IZ=xcVdz_JbJ&3Cam1YY4fDyM z8EnX$mTS^f*Vb97!09y-fgc@n?MNa_7y`G)X=bxiBz&dQ*v7z&Ohf3AdWH{lVk0rS z_>&)@O)HA6fDp>CyvLi6-ODGmvgRQY$AX?hD|n8OF+TLfJ31=;ghhN1W8`ZEvc0qB z_A+*r{ogrWAm8cSFtVPRq;|>HhW0=I`DY#fUB&49`=$Np>yJAmzh3>P$jcw}Pu9`# zzu8}f>a!2hBEn~-m72H?7LknMF9KkC#)p-DJ`Rbn8XW8~uqA96@wkTi#sx7Abq)P9 zTyud{Vt8=#w7b!ndg-~gej8&h8Ns p&Gw0^8&o@9I`L|n z8&i2;E$(9deT0+lHOPk@Sn&jJv%JMsug?P?*ngt)f`ER#1oVCW})guHtL8r+jq zvToP 7OtX$Uo}g2Xf-as5VN=_; z<)2VCo-wa *bNQ&d13mhc}V1RZ{wSQu0RG+{zHpK6T5Z$Uv*6rphBMk__d;OoEW DK z&H^f`t!=;xBB^vs2#82`Bi)@MT|;+=bV&@|pmcY4NOvfL)R3amF_a*D!{_zl9rb?y ze-^BnHEX@k+2_pcea_kYeII(4BQV GQ%W-Vud(B8hs;33PrmHbNILbWA6JBf+ z#b9w2b{SOaXhSKX)y7tJ%YfP(A8O1dZxLkxfyhx(8gmVTnFM9zTb~+N<^7js0UB(e z+D3Q!fzm+NW_XD +DwQ4X^zpZgQ3r_8l;TXwi6=~ByZ^%lU&cx4rejJSF ziTPwcfl#_eofj}psTwjGGe*yHLM)8 ZS1MX!eK>K&tX%rg|~C@rE@UQZv$|QrmUmKtmMso ~4stYm5Nx0%aqdGz|st>T)0|}xa zs>hFIKFJjoG8Ym;7H;>mkvhc*g0s|6V2+M&Ozu=`8yu;BH18`+)<(YEe5xZ>O7}j& zqs=;* 2qEVbzha8Zvgu=rPJ#vWbx zO?wZFl<#qSmSh{!E>E8V0~S|YFjnwz_B{~2J4gn`-8SoA@=KnwT#_x*xfc7>8tGXv zs->dD=68jvnamK$OidUg!jDtvIc1y(%-zp+YetWZguBl{{AH1A7Q{h-D$UuyI9*#` z<5Cy-fM lJh_*N`88Qg%GWrd=pLaMZ=-mEuwk^RIjbs1x^eQs zXhOE|)04959l^(sE<@X+lfm1wvAAWgJ&x0#y>4^fZ?r(wZgSsA_HGr4jBl4dh1bb7 zh?AwJ!KqFt;l(6fG`cq?yFMTOyjT25<^;K5NQKsLOYfP_2!>`nSA~Pr2}a!;#!VL+ zA;h=qJyN`KyT}LYer4Kof-lYq+=D=&LYjq1TMdoOW(ztsV;mg3V0F8}HlMN$IGl@8 zjyUO<#Sq{DzX~{TV-Kb1zJKhrew26KVXLxhVr?KuKuUrst~EJ}rJf48V0caJO( }n#;|Ez`Z|rq~ zaisCP1t$$29?491I59_V9aAWOlYGpBY)h&QSSLtiKKndTXWZn6Aw`=bUK+yC)rX!z zNBGI3#D$6}ka#PhaB5Xsz_830o?MDq^1|j~O?PsP9v#iK3pL-b{H%!3H1BaU4&ivE zuUE%be!4Z;l&xZZbRu&73`xzoakEY3xmt7nP^3E|jPBfI-8-2)oeZyNZ;Vc4R@;XH z+XfC3!S_925i>BgCq2f2T@*d3E?NB-l)$c!=|bq=uysefO#9zN*> q=YRE<57{S0 FktGVX zHI_dHv&~Tn9^=lfQVTEu?IVIAoLnXb`s2GFjZr!&1Kop#T7@$~c}rQQYdsmXg#I2| zc%}{pQTm)lEL&u V*$nBE0e*QS2cRkxZULxzs)1R?;4=A31i(QDitDL ziJI6S(D$Gn`(33RsbsZt3O*$&>eXl^5q4dd!tTj=(Yp^CFKh@deXI_#IDz>UbU+P) zijMhM6SrNv&~r?#iK6;qqbKYuHJEhGI!#O~lRHc-U4_(V8+oMi8K7xK-|e=!$K#*p zn0#NgX=73ywVJ_{;cro9ABP*Ba}xAbvH)8#)t}1o9Luhb(Ax^Yy~`O9i4H3wEbjMt z?>J0jS`&oS<=*7Mu8&)%ba^KEHC)mV4E2D=6PHvQ2FZd&gDg}1E^XlZjgqpXy_vPi zPtSNjRjccw3@_{Ifx6V((p(@8T0u*Vq%KZqC|j)pHC0N0P!#^RrC}@e)IcMS9cvLU zq>I~a;4l)bB9`#Qw0)aXh6m!FJKOA*vz$rEX%5F*T%WkcxK1eBuf82h-`ZV?2xMxp z(Z@ THW_1zN=0M(rJR?t=#IBRoT?m}IU+gHJplTfg@hd^h^0xuiAfF8-8d@}55 zUL?=CWj?%dNy1bTtI|oGC%%ht?<+i%G8pW(nFPD+FI9^UUj(=A6{ks+x=w)fh9klU z#&^?YVmd}d?IbkfO1Qi#d^%=e%ied1P7P8%MOSz86o!p;iq%n3?Y?7tRV_7}ZO^<= z@tzQY3yVguVOxX mz z71Jj9bh3A@p|IOTDvfo&5r|ZjW0{=?n(w5vcwjjZ Th@7x!xtO?#h=b>QpK63p9I>{j{w3-aXxq@hX%y z6=g%@9a^d p5*U>IR}{Y2+zbk~?pMkTy_B|NyNkmZ3dhb^%g>rwb)Eq;8WPGZVW zrB59=(>tytA_ZH8TvwlzoZ Zrz}YF2^$Ig$3w&&?2)l{b zTdQM(GTkbuiEFkW5HrnuzMDC!q`memDuwzO1l6A@M0MOqAbmOK{=fBS6@aC()qkIT ze$3gZU3n;f#J-wm-InbPOxPoO@RBr#&T958wNS7>!UuLU-$?_fe(RVy@Dv3H$irW) z*K)xTfvP}x@=cVdp@VXUCr&6}Zugu+EA(>ByJGtgl*2YtMCWn9>o&%>dv@$K>Ne(f zwO>AVbvJ{k{)K5LB0m4Yn?Ot*%K++vq>L3mDFms*n72kKXG_9Ly%nfPaxeL{Eh7;& z+yry)#2-I|6;^ou#^VjF10wB*74pZlX>t2m@C=CS1*i -x8PCH!Y1;y