From a825ccdadb0a73e3ad2862649e112c185d463339 Mon Sep 17 00:00:00 2001 From: Cxx0822 <1556464090@qq.com> Date: Mon, 1 Jun 2026 19:58:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=9B=B4=E6=96=B0=E5=9F=83=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Practice/Company/Learn.md | 13 ++++++- docs/Practice/images/aixuexi_arch.png | Bin 0 -> 35979 bytes docs/Web/MySQL/MyBatis.md | 53 ++++++++++++++++++++++---- 3 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 docs/Practice/images/aixuexi_arch.png diff --git a/docs/Practice/Company/Learn.md b/docs/Practice/Company/Learn.md index 3729e40..a4fb971 100644 --- a/docs/Practice/Company/Learn.md +++ b/docs/Practice/Company/Learn.md @@ -7,6 +7,7 @@   为解决企业内部线下培训成本高、进度难追踪的问题,开发了一套企业在线学习平台,用于员工课程学习、在线考试、培训计划管理与数据统计分析,已全面接入企业微信工作台。 # 二、系统架构 +![架构图](../images/aixuexi_arch.png) # 三、核心模块 ## 3.1 员工端 @@ -31,7 +32,15 @@ | **视频处理** | Java JAVE 2 (FFmpeg 封装,视频压缩转码) | | **运维** | Docker、Fluent Bit (日志采集)、OpenObserver (日志可视化) | -# 五、难点/亮点 +# 五、核心设计 +- 基于 Spring Boot 3 + MyBatis‑Plus 构建稳定的后端架构,通过 Sa‑Token 实现接口级鉴权,保障系统安全与权限可控。 +- 集成企业微信 SDK,实现企业微信工作台免登录认证;通过企业微信消息通知机制,自动推送学习任务与提醒。 +- 设计课程、学习计划与考试等核心业务模型,支持批量下发培训任务;实现随机组卷、自动阅卷与成绩统计,并自动提醒员工完成学习任务。 +- 基于 JAVE2(FFmpeg)实现视频自动压缩与转码,适配多终端播放;采用 AList 作为统一文件存储平台,集中管理音视频及课件资源。 +- 基于 Vue 3 + Element Plus + Pinia 构建管理员端与员工端页面,集成 vue‑office 实现多格式文档在线预览,集合ECharts实现多维度数据分析。 +- 使用 Docker 容器化部署,结合 Fluent Bit + OpenObserver 构建统一日志监控体系,提升系统可观测性与运维效率。 + +# 六、难点/亮点 ## 5.1 公网视频播放卡顿 * 问题   服务器公网带宽小,高清视频并发播放严重卡顿。 @@ -62,7 +71,7 @@ * 效果   培训通知实时触达,未读提醒显著提高培训完成率;管理员无需手动维护人员信息,降低了系统运维成本。 -# 六、成果 +# 七、成果 1. 平台全面替代线下培训,年度培训计划完成率由 60% 提升至 95% 以上,满足了企业合规培训要求。 2. 过视频压缩方案解决了公网带宽瓶颈,结合企业微信自动化通知,大幅降低人工催办成本,整体培训运营成本下降约 40%。 3. 实现了学习进度防作弊与学习记录全跟踪,为公司提供精准的数据统计报表,支撑人才盘点与绩效评估。 diff --git a/docs/Practice/images/aixuexi_arch.png b/docs/Practice/images/aixuexi_arch.png new file mode 100644 index 0000000000000000000000000000000000000000..3126b75e2eb9beed81ec0a88fcc307905a787681 GIT binary patch literal 35979 zcmcG#XH=72(>4qU3fQH0E>VymB^Z#5dfoR^zURmDzH7ZdvREYhoIQKa*>fCwW_IlLYlcU;g}GT+ zSdLyX(l=*eVaozOAkKrpH}_lTo&bMX(dLGiSW3G^XMum%Z|Rxpv9OdS9^U?&1Nfio zw$TkV3(K*O`yW=aZ}CkQmUzi4`g#^Y4h!|RB>B{xUepkjPcAz~b zEL}%ef+fzw{N=d~X->hh*Q^H$dCr`cHGfpadO(b7{1W|F-aDaWF8^=*7|Hj?&Obc$ z^xQ*~fs*sD*X7vCwRcJ2v2wHI5Aw;e^nZ%JI zRtcn^kqe%Vp=U7*b`QfTu_dZ7hH{FCyvU1VAsYIVMy`odVGz2mx1h1Y#`(IN`rIujb;)Xkg?O-y@KL+w)E{wA^eO^USBIvz=P zGHFTwvNI!vaQ}XBGMF;OU@UF7f28FWx$C5DITs!6Yfp5qU_78Lv_Qs+ehQe6%jb>- zfk?IaNEa!P94w(|NvlYFxEKkeb=OR5+B0%|;%^-9nlFKT8`-$uu$~i=fFZNvWJley z(vwvV3UJ&PSH##MmSrZ;tOsF{!3l;z84aF0e8!}_j|I{9>0+47*epT?q`>9Ax`Vovgn zLn2)o_qbH}1eN{DmGv@<^X_iMZ(W-8GjGJMdEB@@UiRG5$?Zjyo|uycR=|aw#_B~@ zKAE7!cYh#vE#O%FUE3d53l+oUc$S#X- zTh-aE({%R@TO9QNN$7%W`zp?0a_7&f?>UNlrB5LmD4xs90+Ww=K#h+|%?Jv^nv3(> z{>%bWHh4WAg+t+Lj@3C(S&OWj-Tc`i7f?$XB40oH)-is)X{0ZHgzwS`v!u($_pn=o zff5nR!;SPNde8daCP|CRN_B1kX5U^e3ZL^=&{_Q+X0+8N^Cf&ElQy2xzHt61IUAkh zxG_*ix0475rYFO78jsbALlYxTD;6Ohd1m%wz$i6U?WSc>k*>2}S3$?s9$;p;oK7k0 zad|)!xlG0N6ll>gXHSTt8)9y~B7GGaJsky8do;v$y@}Z)d)&qgZ}0?C>dnW(VB`I! z+14@JnnCsR%4sd@0@UOAc;@VF*%KClef1hG zUp~vsPWM+)v=$$gd%VLp9t?Ywgz~#aEaIqWT4lA@;J)zU}f#-^WSwH&~0<-g@*^bllbQ@G_MM@V_F64OD zX_T_LorkL*zHE{my(pO+>9U{ZX zus7POS%Js&lCB(PH#QC8(Bv>}nwEavURp6EcbdcIakQy>*-!HmZ|^L!x8Y5s9S#U` zeMnq@v-h^;Fj$}W8{NLxdOmUASfdAltrGpd^=3p}he>jl=4Z@>;LNs(2Z>)|tyuZh z_-FIp!50U(8qjRLycI2FY7Jx53B#E5#RR>$4{gttSw--5Pim;qjN$LD` zs_8b!J(%-RI;hjuWOhA0?DJ>kZ^%bZu=f_W?CfmgMp44iRZMN}y!R0bhe^0KTg71=588-GKB+^U*@ah3Ce9OsUX&NICJS4Nqs*02k`U+V(qIMkYkay=-0|q8kQz(es(9lRV;)IGz6vny^xy8U&ehsh+#7F< z-00b5?3Hxx&0u%PWM$+R-t>VTiCx;>{5QGCl_g4@nc7SvvpRA&dZ~F=Ws+8`rmC)* zHU0s{$UAW)qfR&KaZ_}ZvAUkh&`IudpyUHq1a0cuIO#TX=^6P44Z}t!rb0W9I-J)| zTsS^}DvJieZ#Pu51bpLaYU5#jBauE$co>8bsbHern{$h?~!0kuH%3PA$#1V&?b^kA;{_SUO3b zc$R)Im+kDr>|&h<4jFlP!+|K-s`9n=$CwGnyCbVihs&hLxsE)PnLDLi!wQP$BMk0r zIZ=WrR#aAepW)*GaCqd}-geQWy&d@8_f%!dM<+HKn{v*;i}+k~d=4EnHMV&TkL^!9 z#sH%1z2F4Qj3wa5Cr!6OBdedz9AtaQCemERdjtx5CBfKu)fZs(3P4%u&pQlZ_v!B7 zqy8tR)K9&Y%5aq>JzG4`3m#hsX$y zWV3+pHxqSq@?&4EaUBE6*pMxq61>qSF{*k@{+Q?(!N4JClR7k@CcB<7Ev_s=;n z9A8dk@$eCe&o$wPGlRN1Rk0ZmDr=vr^wBqkRo#<|I@9k;z8hRravi^D;Z(#gzi_E_?}#_RlVBiZ84;YP{nk&WH;058aTJZ6T{ ztl<(PIX+RDT)GpqUL1ws_%x?t1AQ%g3k1ut7HFs8yRxKu}DkYbhMt|RR_`Ma;PPiIY_G8jMe4@NcDu1iAzu?XrkkP8btr47R zU@UyxX^GKgYTX?S<5?W7`NPY+_V1?-xZR&;h1MThxE+DM_Zq62q24JVeVhTy>U217 zD15MdvxdS+qPTFL#40~6vpa|=o;tALWC?zh&k(|@S9M=@eTM#;;YG+jf-c1|>NrG2 z98CiOgFME}u>C^IhnW7Au|XM@%klUyzZ$zJo;mT8$H@Oio;`i4hhDssr143-qTP>R zWqOk1;tvj~?${_K6_dB5&iCt17hV&k+6WE{C z5zIqM_j~nWN}2NauGZ(2I&$^}elIC9QE*S`S-q2M`*pUVIgkKQfp1Yp78D`aB z+mPM!BMe_>GGB*jy7~8eCBN%Jrkz>2O3rL%E^DVNgs}Hddo!Aqv#p|+`}81SQMk*}A2gSu(cSoE%PkqheSI3XA(FB^}#+Uk~m-8C*aIQ~-h?A(( z^0?TVcsK|6ZjH%(nb?f>jE5ES=%S)0Wug{vh%7-JK|a)Z(*>M@Wl^`wzA%jsX&eSCDY50HobIA4MvS9U*V$?0c5 z%(}XwWs$a&S21@5c4lb4iRr(H%mts$F6V4bDvCwuWXCoUaxGuJP0XB@J>x_V@tzyh zhW`cCne*311Z;Fp#@2>_jK#gLr=g`4u{7a*Ulo?}f{>!PG}TABOj0nUX!cdxVB1S4 z9)J?RruV=D2ieQ!-0$;q6))EDd4-Y!+DKyuOGOR~(+U{H6d|b)7|(@=bj5=PN-@MD z%(!k@xxK=8KL=2hxF1%6(4ydba?kvchTCgg6`)r)}YtUnVd-#5AN3wp97p zeIfw{0Fs;6$tG~zgigkqg@D@w1g?fCjMrZH%+2Pkm?5V`w+{^*%}hURw7kQ4|MUF1 zCbozJFfjUk{NF#6ZuGXbkF*q}gmA|;O$DImxm*t-XZb|as~G+LUJzE4tdvPa=YhTu za%+yWxx1BgEvWiT0;XT>AJ1pMXZiZm{PE9&AW3f_Ni}J5fAFcd_;QuAnh;v=+lkDC2XTMCq$u#7IV0s zfQx4&3!KP-pMn`;&O+fu8(LD_IihlfXm2B0nDb^wOW|ATeCpkJFuAF0IUL}snE;+f z3FdR2;1-9z_lb=;9SzAn(1c|?iGKFJg&@4Z2*zLZr%Xxp@K6%H66v}Byv{KY^ORq&LO}*2K zXpCja0yh4SPp~6jGv}^-5kzZ>ifjRP3?;)DPSbg3IKP88W|5|fPOEu74ktLX*qc1Z zR9Z7s0IZu)E$h`33|ZBGJ?$gL`*p*jM$`l)nU5)X7tE&0niU1;nPBj~5R;@4fQldG zCc{uZJR)5OdPAu=?0l~$pMyxrtGScNA=*CaPawzx}BiGwv$Ga;2x_%)|^-bx=> zkRPz1jS;smEZiR8+j9yz8UY2!!1+so-;g52JgY&W2elQBR3TL7DK%ALbeI>!>Y=WI zlIKpz(fZbs#a99A;!DkP1F&O0A;RxJN0oMXCh&}VG}YYx=@{8jgO$V@6DbTF*1>j)JWcw)YsZQ=-PR)bwX7&OYTKc%5upW zcR?eePu9DyM%;wa3M+?3r}jk1CiFuitId6IIZTZN;B_%Y$r)E7RC#VHJcxAK;Sw=L zbwAjhgzlZ?ys5y!+*H(S&6onR0;fi;$LxlF%L#fWgemBxK8hRu@y~C{S*q#b`&tQv z#JHo~JNHQ>S9S;Z_gCA}!Kps+HE=ITS1Is3DjvKZhbbK817?Z`&qS2qSWxW+uygSHMT=0h}W)MAN?X6bUn(!OdEEzzRF>{BMtsqSa zxOl&KwPC*lY6!;2A91s>rNsG5B+{nZQDakUZeyOEV{W;;BBq{KgUuGFmculIO+qKc zO+zs^M7olJMS9CBQo=QJ6J-+J6UTAxB(Ntg*xU<3l&2chB$64+)8GZaP{@Lct2YEr z8I7OuB-O7udz#dQks>;?5y!ja6YmkD{34aPtRS zvHm|Q`t##5WwzZ|1c^l}B|XMvoxEm#I_Vuo$lU7@+pjFBs}w_EVd(oDTQ)6a%H`qn z^o)jjzmAP|RPn_^iwGYr*)*ZiFSenWQG}o=IB>ug*5 z0@yZp$Zf69*3LX40k1mr{R_r5cLK3hEFcPFyeyoX-sZo7a7RX1kajJ`)XPEg0>c_9ox5l80u_N8gw`Hi3_&rUO&(J46tal^O!QV_)}xOf@HZ6tt`isS0;>m^&aFtw=?7Bo7%0(j!VUTsBSQ#lB^I z+?#y3q?nuYq{flZvAs`^v{(E!)*=gLOtp^*RmqaaT)UgvK{f2VV4R3G1Dghb%AIXe6)OQQxHgt;PAV0kYFAe{Ra;~l z3YqpzhB3Ox-m*(L&(>jL`yZQucv9C3> znDpCF9zUBahDL-SUmj!ed?CQ`Ei`gKeoC;B1>%wbvf*j>+DLcmWHU{@K6|HO4bMW zMa`2+U9k+U_pdIjZ~a*kKU3@<{z5bS8ra6?c()sb<^~C}Aipj2u}sx2dNrV)R>inw zk(#E0Y~9!0=C$qI&V&nTk5JZfHxAc^+PvH9EvgZGL{{;1WtEw)<2aP~M|}_un)T%p zbrt%6f&mRX0%W4WpJ}->CpbLNh3})Kq}q@v0eIDr1!IIu-MRIeRE~E=xxLeT>P#~% zv-6g?j*9Ac!FG3K=5J3D?kdhvy%l+elx~?iy1xnf1x+mqXchc5USCLpvTp=bv%;x# z;^rWDBYu4O0;mwlbi+GX$ca@Zq|RG-uZ*P@Qi6c(C3pBPTniUlGSK6BnnH22>k4Dn{B9=`|dhaqnu#9`lHXdcUF7t;8tvcV>krM-1`&Lab0dV9&q*hj1J^4C86( z$w;u-GLGBQ!k2@+Ey{Ms{wIN7Dtp;^tIawS&%v?irxo^8T1A`1Zr}enw7wUjqM9|7 z21GgX{~KuWzk_48-kJ=}fy@Z*<6oA{Ti8&UJ{B1sEUoF2SnvnoptZe_ncQD7;hLjv zApk4^Xo~>Qwnl9G{%+8QY(0P?BmY7$0Ga_*{0)oyxZ4RBVISE3w_pEshUn}Jy&)gS z-pMj|Lzo3@U`B7*_$qwRAk1(mELx98PfHsT|4?rm*b`(v?i;8*wj9`D~|EcdcQRJY7J zlR2%egN1E|3E-HsKptCs#JQuw-pB8=X_}TVNGYdqg~U}vp*ElNBh?+3@)ir z>Ht?y4FhL$(f>N+-?ZsJ%b)lcX*&Gr_ly%XTE7u?{9lxbRUHd_lf1PZCOnJ&O_-o? zfB=of5xsd6t;9m-88w!Mj!`pqOO`hZ5-U_f>Pr042{jc7BeZ38zov2s$92>2fAca6NNRh6rs_y&8K3((qR~%2O zR3l6UtLhG@*qM6at*%no-6CHpjJk>;O7 zROzD?L9&XCb$C>>7<@8*xf4m2yN_WVSBUibyEEb_E-`o3C-~CAw$*nP4!qRRfD|31 ztD;y*56z*-l35cDPEBKs3IsQ{q^W<`OdLMv`0nvQ$Gm$*PD%%PCuxBQ_#hxZ3cu1O zYHurn^nL{t3d1U;{e1l$)t5_#QN}eU6A~qj6$!O0$YGDU%}RP|>D^GOO>nC7jX~sC z&fT=3q^-J^6#vY(lO4&WS1uD*h<66GNss_}#rmOv`6MKj>`(kXPoOVE(d?DTcvkYz zRZ<4xE|(XCCI|l^Ztkgb0S|RC8{C~xP5ac#FKLh47(ESI!Z|Pj&SPMCEp7|RB;Kje zUUFXy$lsobFnj*w73gSXUv=O9tG-~r#BT;l{%xbQ`L!~Mc)#Y2NU;}bG>myfx7#+S|r#)CXXFqIWG0`(V))N3rnV+s& z?@QXOJ6k%L<2fQH(T^+zk#@F)kOeO+H!anjv5x-o?T844VZtMeYJ;o9I)~@-fE`t{ z#PGE^cVjFLkEsOCnu?}B)XGNrZvghVioLo|s!|&tCcI^NF=t~RvSUHA!q$nW`fm>G zTB@64=Qq3m!W(yFQPM3+tr}7fZ4 zIbW`JY@z!?W~-z2xBnH*a*Pd6W9pZ_3A&d2=uq*W*)VoGlxhF59xToyRYq&Z-O-(i z21r>CF0IZLX`A1&lH{E-e+4;~1{krr6zys2VLxwK3%Q8had=*`HZ){}#kRVwRoS`+ zM_#irkwBIn26S&#U{2KY#XAS}l5w2&%7Kz!u|u0;NFl>Cb13_en$R3(KFrOaIilLP_-H$XA4lusub9Md^5he z!mMS}6ZMIh%Sf1|#-@eM2m70G}`~Q6rnzFxH+JAvM z0LQ35U<^!8!@Ao0E^ywzko0X&&m#b+;(rUd5`LLhhkAC$_@12VbsGxWIQ z=8kX1J>5v;j@qGhX4!2l_Bep`0;LXXYpfT1LL_sXf<)) zZ}w9^!N-tIocEXvY(;OK73RDy;%!gj*>$G>=2~^*j`MsK04D#MbTh6fU1v+K2SZhC zoJ<5-OiEmTj`IVw$NeU2)`#DED)PV;89bdh%|X#WOHs|Do!DvV?`Yihlz^m4>~0)B zkkxnL|Mv_*Cc{uEdmqd987M>aWn;uQgk$i=EPMd22+q#9o_pJp`4w0Pj6Y9yf<}I} zwXOWOvhBlDZ?0%#tBe0E#@_#)AL zB9t3ezLWfoPs3}JRzI&fc!+`>hY_|1mVJ;?hd=QeX3!q{BP_DABj(jTu#SDl)7Q+9 zOEMAPWolvcLy^A@Ni?hyed{4PWk0{5T>db*iR|9a*?P$n4EkMze^^Q5>LEA`J-4bh z^KAG>3g2ee3URA0;CW%GW2c1oy`3kP4p)&k$|@5))L+6#;}$g_$DL>H)Jls~KHGUC zfavtJ-L+I0J}p=Dw=g(qlA$%pI9)Kb9zMCQrM;T}$|(~6Wo)0N0ls3WoCS^2Pr)J! zu1Ha*B0NRPB+Rk~#=aOg?o7BPZ1)|9Usz>iNidt=k+zw*f3%ovTU}T+lp}!z{){zL z7L&&~RG0We8>=VBU_TB2u%F&dO~;R6T_M9tGnEuf#iL$PCbYA0JAIGd;a_%bNwoUY zK0nH`uSu85LL@)mmJI>0$hjtI!IRJN+scZD@dXjrE|b^KON>z8vigXZ`dPkcVQ1t+31k3)M)+Vo(WD6#XL3{m)|HOYW>D?SF40g zeI9Dm$$~nE6UFopsvMQ>7kP8*RJ+}&4PM?**JR~7b@KJyPBfZJIfYr>3C1DSy#{G^ z5=rZ}`qXgQ!s;r+0gW%_Wa~?Y5V0Fl!x&|pkzc5OO&EdbnNYUR_iABG9so!{j%CY_ zB7Qu|DgzH8G9@;mC4$@)R^xQ0|DqglO<7sm+g*yx9CE(8A8!jsQ>BEvpvllQgjT`o z*kc#Da{RV+X{DAGcMf;VsadG$>9#&c=EZK?htG7-7CS=u|8|oA(wHRC&@xq`W1kJT zu|ZnCFf=2oAR*oa|NPZ9JRMatw6@Ph)=RV3fGkic4+_;8R|c-W?A5G0Gjd~xUp+t; z9%@$8wa-fT14+V7NaiOg{na(J!@#LvuWGm0uR|fqv7Grzps{-(!OA0N;hM}FT{#T_ z0NNv#HeY1ul*_M2jI z>XuA^;rx~`ddYB(5%gTjY>b8|1MhxMXucbd0mH%91N7rFL8P7yk(p<6(<0%6qgVd~ zI;s&Iax%Hr(DGXLSh~$DqP9wl?QHbwyk(4ekM2a zwU|9xo}di&21O>=tSWf>%I=5kpU@s$$Z$F3owT<;F(kdJI%WS*mPMT}3U~0OjbzNX zjI>SGiDEED-m}TIH2{CJUDjOtXY)d{dViK={enhKE7z~czU0(qe-EUp9D24l68D0F zWyDhtpw6cL^=Y|Xo6IptF!A7vx6#3kQpP=5DZ_+-o%}EifljQD{e3QbQ@J0X*Rp8L zkk!&jw^7jZfB)c9)?*9il2xU=MGnVLo*_A-&UdJ~1O+6tPbU{W)7k#0qbVeU)_7bl zkIRgVxG*$%`HzuYuHxFKJCg&iAbD~tGD^b>sBqb(Thy@K{MN+nw#2%TP{%OG7?DPf z(NiwGoX7_5JH-MJl*SFH;B0jVY7A&efJ1zn+$?uK&1Yv6E%XBE#Fsfe5u|R5P)|<) zx18s-4Tu>FbtZjpdADocQO-V9i1`#2&i4%#gv z(l^h*T>>eMf=9Q)NfF<&o>&7!nc1+sqt2Qv zp%L9)<%}x5EDpQS+BzbBoUJeyHWySD-mDEbB1BNUz5ZbUnt_yvwCA>pp7=$hUEUj>t*y2T43KnXX=0y$?ix7m`k>5n zt7S?Y6RJ8>d+K5N>iyIPO89`sExCWu2O(@ zMa~~@SXTQhG`arNEU^w3=b40sfQWqCHZQ&8&Vdvq4$qF!P_lx{&CeQ>Gq=#}*$Jpw zOH*=vTurr=SKXjC&1S;GD;_^q7x0gcHLzst_|zb1Pb2$^+)G|f5XNLp>gptBiEA@A zJ?z$;iM?TIkL^pB&rS$E#dsQ=P9v-_Q-%^S)g!cOagoH*-_i*TX5jAhw~LcZ*UXCm zR3(>8!e)*KlburT(JW59ZMo7@GZ*?}+lHnntNX#?27O9JIBD)v1U!XD{_}UXn?$*F zW<|yY1jEx9>@y908{lP!>wyl3CSVMQe=~tW<_B~#vmmgM`K#u1B5Sb~ezRY-@mC2c z>}$F~n+!bil*~b#s3sq~4Qq0pb%gKiHq?>B@Hq;;nTxBP)=11DKOVAcIhp!ploroF5!L7J;NgwW!nz;Zn0U-qL@h|A^l8`q^!Ol!6xpr9BsAX zH9bWwbsk;veVL(oHG~~&Ln??-T&K1)9FMuW796l>M9b{a@ytK+vNN}A`NtpPB_j9< z9=<%EI0N3@79a1m;Lg4C>{^6F6tCu44p~Xba~bE9e%;`hQE6Vb)iY@VU8RlSWmd-u zkJ2{=8mbHft~@uss-Qarp4M)(>#VVi$M>PP<0!!%BD@k7g@F?%yB5%2u2ZY6=Fr{p zxz+h-uNJM?ZA+oCPl3aK9uFP(ZE@4Du`>ew^Js?>6ojxBC}vvFw^EV32TB%@Yi9y^JYe&HceA){e1VERePMpHRnjsnkm&*;*S={_t%}z zxSVHB(;!z6LRC7;%pz>>O(kcwRa@%mU8rciHtpgk23vk!AGgU3c5ns(g2MVk>mQ7rU<%4xSjLMcqFU5{X*ia4Jel0_Z}gtCVh-ST zavBbD1KAv=E(1# z<`|(EjNz@Dxd1;Vw80fpAHL{}?0X#Ehq`f4()F2B@?K+QpDn2eb)${-*a3oWA<#6Q zow()>Rx-zLBT}QBE$q6sZ$_;!lC5%DjQYK6$E@j`ByOPMlfg zy?E%#Nm3%eOw8@`9|OB}4!gv=e-uqXdvec+2UM8mT%R!O>`kr{y*DDG)vA&j;Pnd7 z;25AmQ3z$^Uir2;+@zn!B-5x;sN=ES-V`=cIg9xIFtfXy&qCqB`*yzyBa^0OS@>5x zU9Q5d`Ta%irh2Q3isx&u_E2dD{ZZZVCL>05fAL>e72$8;f69f@ASd7(X6k{KL~<(% zXpr<*ie(N4c6PYSqbLpZsD%tg|L`3#Q#NTmOcejp5LY+!Qzh-dOsSMv@0R_RTIP*?+zo=xfh_5?MaVsm~m+j+BL$Y|uJG~Ennhtb7 zb$r~u*>FGhxKGxZ`raqP%BA%sH8L4d}PLIT9U_xst3vH zy$*8@KPY)1Nmq~M^ZYdg=`qZKd18aNIW5E>pW_HG#N9UV=irBf)0OZT`7E@L$12^5z6{t`t@t$BL6)mK67p6AH53iard2yX=*;^x={dk-GFL9qRV1mJls<(qaf#S5 z6)lb*vjZCTo!Zoiwj=ote$~cf3Gv{ZLtN-2tUo z%@?n7g(>Ihv9i-#)E@{6C5(;ytYiROLP9l{BUa)8hkbX8t&VNtN6+q$MZt=5@e{H< zuU}9I8MfkTd!AS)LDZ%aIm0s%{?)uw5)KD}RWn4LJN}V$TB}tg*ZI`FnT!fqU^z*z zdo`7mA0@f*8bBUC#o(UGVqDDvj1E*jXlj0KIdk_IHe!BsN^+Yzxv}|?oXcoMZ%8e^ z*A7mCYr^+Z6~mOY7=)gV>uIWA5sspS|9pL;i`ga<$Ass^x;z%DIdVOHTQJ$;k)ZCj zx$U<1SD+b-w$-D95=s9);+AmipI)j7p-%CKC*C~n?MLVrbg)~l-W0Y4TGN$K;RObz zD(QUc$7naGhr<&=q(j3V6<^wd^@nPuTQmH44~U7(Z}ab)@O5t;>+gFSv)mB&!3+i7 z>lV_7;w{7bRy`uFJe(xO!H=Wu%a*#p%mPoMbFV=WiSt$u)2 zh=1d1l;P3y?*44!(DzTja37&`1dPZ$Un?fx9fT2f`G0I#2G=UosuKO>S9VHlsfKsL z{nfqCMbS$<^Q+MN*YVCBRC>gB0CI?97HJn3T$3=PxZu8MKBJTHTOh&aGN@thH$7p_AasGyPlGsNL&$R@z=;FbPoLx zt=zjKhJ8%SM-T6w3-K_cx|}QWYzi*XnF`jo0d7^T|DCI*+HFWH-YJ>~?u{%0o0}Cf zYPfj9fRNCqQiHOI(BftIYjAghG3EI@=LXik{Fp$qbT!X|xhIoDf?t$;70naS#ef-3 z3drRWL*OCQ`RiFI)bnAWt#RU%YSz7TK`pUus(LT8Iwy?(yh}OL3=JP~>(*s0 z&syQm7#ltV2-N0Cw(1{@;Jc2mD7gN5dSlSIHt6VlAhj zG=_Ry+;s}&6pOkH7OcFJ)>d{3?`5}5&X-_{Dw5ul7$tONB15(H=RFiEd%He&3=kvj zjAM$Lu8E$(#X{mP1?g_|-k_;%XJ`S^`#kI3 zEzR6VyOVDd#5xl47%m#QjbB688{$eow(Vat3B9l$nFCyPqWwq+pFU;*BLHptTA6iL zrb1g~U;1u`iOGmihicYMNV(cSLYvEtQGacEN`w}*EADPuiAT&~)D`Ld*r4@q0@|yo z$~}T_GWk=)ax7feJi zwGgp;)BVi((BkuxdhU@s!<)kjL-T-FtsQ(LRNn-&BJ?!HyBrvdQBLWC>lD$errVu{ zXu2V*(`k&>9Lr%{*YW_2TjD$V@xYj~O(_owC{k_Zc{>v%Z4TE%2$au(&aUE+{g%=#P)srdIO_ zHd0Q+m=sjG7>7>U2iP3UsueWlFYvexvbGA=RpQX{E@rC&yN2F`fHja251CtTIZx_r zm5ep*y;=l1^SYlaD;G2u3?VEtJ%L_XxIG>4MJ<3FaY(^HSr@gwWp8nZ$c4ZzMhrt~ zAhiA9Uq^AHAvSs}GSkkea(^Y|c2wn#d2_gy-MZr<%q*>! zd77C%Q@at7(Y&~d24Wci$;L`%@=_0ErQlo2o`T)hKBj7}VGlklKgpQ%ib7iHklOEd zSj0_KWU==Fefg+P7pD{(m@(<$YBSu``zoUu49)H4L0D-qKW<+NQ;+Ta zD9ZEh=B7>IiQ;V1z5R!8z&`I=?47V_1WzoFnzF>+M8EGIb+UB2`qUNLMJd##O(Wlp z<<>a#)I~ui@#9?eh1GGVUe2l`vRl(F6-FHvl-swYuBy|_IZXOEr=gz((MMJe>m|Y! zF4vk^M0nRx=k4RAXzvjQ-%TJnQ1Nz7y4amBVUMg~ld=&#k4;<>-0ejA7|9dqun9mB z)*#H=wZ!trz0+R@uZUs(hYo-9y!_)zPkSxaa_uZ1Ce;o^dtFO~YvtJ=DFF^^0|7oK zyU`@iTk$s@N|9U1FC5A#`0LY&x18$4VJ&vT5JAA~D2vd?oMVCp8OrH=DVT@JAw=-?&+Q_p z1hN?l#j#*stsD|oO=S6K8eH zi8~%FP72^m;_!D$$87pnuv2_Znu;^Z=aAHuV3U$g7X=`j1t}6iyZ&#k5zzKl@j5Fj z{&VhUsX;)NpsNM-Ua%iU8WA*=n@PC~LJKAN5$W+zp!w+{3(1D_ny%!am>R3%K?}MO zDMlJ$ukz8@O4pyJ9wY5pjNXb9)T@YroZNqi-qlqbU0(VU7$13T7=T;iZ30 zfR843=n^`0Ohv4dhWO>+M!vpg-@T@bx%Avfkm^zoHHgY4n0`>Kv1>Oxu7q$o8a>AN#C>vj;$P}VxEQBi z(?~4^XH{qgIIJu5Fc>AnKvG{$@5CTa3+If2cECW-iUkZ2yjSB#S&be zuH9?LEz*T<2MW_ETiee@GPdemB;SNQEW2e%0%xVsm_mc|K+lohbvaY)Ng>UcGlBDY z64r^WW$XGpz$FP!#)e1=Qk#qv>Gd+tt=Q<$4Fy7)LNL&>%S=(p1T#f6OQ?_ZlE{dW!fv*Ns<+vef8?0_vS#e-BqA7s|ctmTvU5FlfI!(T$9V6 z^r&VIw==fG=2n^R@zQyq@F$k_mbHuBd`c*2z48;d!0018{uOlE@-;`Gr$hdvqn_5H zj*h@i>Lok{rCIdpMAN{cY!jK5avi?`W0P1yCET3BE(mXiVn7JOd%r zbyat;K^v_;{cg1w^ogp$uok!}ippBt4d&ngNwtx3g>QO65^-*vr=>hnMTm_lbu9LU zBa=X-O2oY}b$_mPXY+u2udEgt8PwVyLJ+h4*{w@{YiWb?*+~&EP2%LIfeip` zs1z7lpXd+Psuo(8qVyw-Oq@DpUQ;A3;eW02<{8I*Qh*zvYGi?nb^=XXqi=30u2uE_ zcv&|1UHRpO^SZtb%$X^b$ovh1 zMn^(V*vy4Epdr~(Vzuu={Yn8)`$CkR#NE(}{VCLChR$r%kdEF-j99@bns3^S0mX@@ z{e_fxFH(sXt!DH1P}V&&b<2h-)vP7-I?&<`>r+N%=A^AlJ;pw__~m(p_1Ulio?vCT zy>0IGW>cu>>g(R0aV@S~Q)T)7x|fl{PxO@1-3M9`EF>KI ziaZnVm1tu(dAv0To83-{;QTsu{LgfS`(M%VJNn~-`@qf87kC|K;qlXWr1YByKq+U% zHn+o*`$CCzliHJuqWd~|;GmV0#{0b_>?e(ic8{E#N%DU$*04xtzH%s0jK;V+R=YwN zFaIjENR4%u@;?8fosgzRZZq0_5pwlKSLf{T4p;^|`iv@FrxTp|{%DO4 zg;{60!n4CiYI1-jqdx_^Y4n?Sii|oSLc18-J3oel4wU8N)tZ2$4`ya7XUMH}!N|n7 zB>jkG)+SV5SIY$#`@J%+XXH_xn;AT~>?p;($t*(DaK-N$4dHI&LI)>N zjDj7_L($eY_1Y3UJl=C?XW1G5mCB9BKV&eh_VXj@Wsdp~o}V;rbDN*Hu1sAaqio&J zrKRE_v2~C8@`u*4#!$KaGIr#11trG=>i=2;<7e_IWN==?3}W2e1gBMn&OVn|l0k-& zHDwbjttH&E@9e0Zpq_0YP=17xB}BewfRahyibKL9jB(JHb~4HRj0VXl%fK(}S3aj& z;m2$a0R8hBVPH-RytFirCF>(Dv3oX0SfGh0;G|$Et7bu&MM4Kj*0!NQ#qi0nU0>zn z!-x7_J}^oQ?@`@}ZHsd~^8{5Q`egM4^{>J!^%26eA9Hk&5nPp+nfA<&AoS6Q_I`;i&(H=L8J+S(mPTm2m}yAC(@+|3L;&Eh!~_O z7Fr-89Vto(B?yT0E?XcFN~B5MpoAn;+4K%)g8tg`KJ`5Bb)B;>_g@Jsvu0+kxo7V0 z=X;Z^+}@VibA`^4rOyzfYbuBvlqK~_8+WwQW?E=X1>CxXqes%HkfvH&dX$wQ==i(L1)ac^gMV4y!3?s+JaDCNJ|@}p?#*+x&NlVuYHF`}r9>rJO|1GO(DiKd?U&vUu1PCSG>KBlpVck9 z7rjK8ROf2`+hR`oHM1Rz{$XUrBf9P}Lc&~HE3s^ZCs{=~;A(-lS=RkR10 zw$83YG)$!m-w+o3l#hH(Oqe3)zXb0BeT~Bh8Xt{lK?dHj-%Xq-(r?EEygtgCyqr(R z^xVbmiEhHTYIE8n*p)tgu;5DnwE#6g#@Xet&Gh8~UoZE@!1f)UVYQ-@v1~axxplZj zownuf1oJ%N%AsOMNj|qu#HPra)@D+fY=xKjhX zKa_cZb=;*|@Ypi1*0Nn1ic@qQ&NOXEcwC?rS(*)0f(#&?iJBOE5mmgL``4Di&n z9jQ01RfWFn(nJPnn%(NsCH_^MIK*xCp&rP~JfziGQuvZ%A$A9ze*aP@cqIl(iQ%4^ zG+8-!)D+fmyog7>R4P}(}`na_b%5Y6s|B>NwDs+*rt! z3ypZL=?6CpH0%i!3vej~IgNB@YqvDFI}9sVU5X0F{a-2`v4_(8fN)*8QMpWBA>-Jc zdLc5NxG#YGnzp38YLU{GiLX&k$b;lAo>7m7#rC*U2qemb+MXqo6ee2p%hUyTS5iXId*Ya$X`&r#)zHKVkN#vv*vg*&H zg_A=2(NTFBo#jm1Z;>M{eof=rC;R>(Q=eV|;ZZ9M9Qj_(JY|U16&i^F_Ti7@llKp1k0t&>IF5I||7U~)3dqVH_Wv2P z@SEZMzX(L^jn(cmAvB6(@7#YA1_2xhyMuYdFL7q`hv0q6)B$CA_}`;SI(XNi2WhCt zTEw30>p_+ycUJ0+XbMk+KMgPqIu0aoNB`fWBdapW&iu7zr~CkC?tlUvbhS9XYdhOh zfzb&)PmNHs{(?E`TepUnI)WY8)Rnq8Y|s*MmqdCbfW;HdtvY2v`}Khk7qkmza!)$&P3NOn zM#n&(P7}ClboY4Rt~-97nBZwjvPA9Be5%Q-A5oy=IriXp#f zTl3mbl^ny9w<`R366O&zn6NV!+hxX(~i9)Zbn z<@ql{+79%_+g}s9Qi}Em55l@o2M1__RQ@tDtCHh4R1G?Jgz?v84FLSx{UiUu^IIUF z?CHN+8zQx{d!=3dUA?`XZ7{%xev6)$H%DlLR0@kZaGyp~&$j73NaxY}t*<7lqGw9> z`R-ra?cX|blb=8=ije)iv;7-$0x&BH0 zfVwPP;8a(S>29fa`aDK&s}y&oJbwhN1C)CoyFN7W7dn$2BeOj6WhK<~*3=6nkr)7N z7@2ICD4C=e=0bKpK1w%i4X8tV*MG8$#+D>n#LfJ@r99lK%kNLuGSU&#RGvg{X1b13 z>0YlHiRIht{kcfLoCNl1KQKHylM%HuX19j@=dQ zn-R4Eaa-^ErKI5jihmdnK0Z^D=WzWa&AEY!myAh`$UmxCKNDWvsA0augr*^CZIgFtG9?(x6l*|$CeI- zpBH(aMTjix>E;ed!|q1iJ;<>ncbemBxx1XK@koJOTu}bEX#~Y>yN(xso3g+ZnN@e% z?Lc>hfI^dEeA}f}0S~;KNH*C|B8#>f)AYf989J9EU@yXWgf<0uU+W(}p|h30oMU^{ zsJ2GFV2B_r^r%6mAt z-^MJwDD&GaLZ40Bo$7`ZgT+Y8Q)a%JrrU6Kh`Lq8Anrb#wxr2bd-H>> z)p+9zJDJ2TTSn3RFrt$npt>NnX7?rXE9nfTy6Z4Dr)K%8N>0P3O9`5hvFavd*szNW zQ58)XyXNo|lCWiQy>$Zvyvr5;->{t;_s6pEr6S)UdyItilk_PVV9b~ z2Sz!P)?47(&lVbs>;v8PG|AFJWN+bw=-8}ni1>T?t(2MET};qo%5@uuj+LCp9(_j~ z`-GOG%N(k42d9Hp#K^JP3L+Reqf{r>6~(~Vp;%|3glI)W0J8Bp-Vm$B{(2S^le_MA zyN%=NK2M;x+{G?Nvpr`-ntgrmuOMT|7n3d{%GPG#qcvo0>?WyZGG3L3wzt!%Oy_6) zAo_7_bERALMs2P)-+2kB+5Mkh#jCSR!gV2`OYQ_`W7{2FNaTg?aYcJn0KdI6|O<{`dY2-P(c zuB$Rx#*)^lTJVJmV{T}Qo#b=eE|*Ro;hnjk-ap@&F6s|y zpW;4y;Dul1_EF&=m>JTnQofWn6y{?(%XdnhjmnPC<_Gr4_W{QIidjKZER66j*Bdie zQsR`Z)ilpUO>fo|*i7>e^G1p{dYu{m!JdzdvadFBl}e9^Isibitn1`YM)^t!&K;`g z{_GGT)(H-wh)zcw!qg9dWRBUB zzuzZO_vDxwGLyHZBRwR}9k-2h7Lyb{^jh?R>l-RD-dlBx1M8V9&-RYVEI`QX&pbEy z82NLQ-%j{qX=J~x@GV?-rf7b4?&1WIe0J_nsGF6E{N}d}xYW(Y+&(-BD)0+2E#4u1Wm-PanS(*Oj;!*wMn*Qc7 zSF=jXiv5t<8z$uVZ^)OP@6Sbb$GjMG8^;w0~026the5Q`r1s;UL04x z2*6}deHUPTS4oI?*4TLN5Q8eq>`_KSgnF<)_S*e~lAK&{n`!b^_eH>aB+@x^9_RK4 zy{4bsg`B>^9M^1P$$s3Gp)|SdZDah065n*b6+3>(NmN*(kkP9EiB&?sVs~Bldi&H3 z9S0%Kh?`PT<+uxRZN^reXke1DXO-Va?JGT8z)9$r;;dIZ)tf!d(C27JK38wXa1Lq; z56D!KKGnEnRx9E%7wUnjF@IX;8@pJN8rOr9$@%Bbzkf+^L;JOw*&xma+vTn2l7D!T z)klZNxf(a@ie9eNB=3C4-4;pBCH9*Z^1!xYm-QAYgn+vIUf;?+@BoQCx0;dw#uLBR zW93N0-CXYp;z@qJNwAKNsJ4*f#z>78Ke5BV7Y#t|y!j`_jJBtudB7+q{1eIb|7E1H{tqJTUxTCHGpF>| z?&3d+zIHz4{ld23pMRm&<_}KweVzp|8Hn?^4u0Ek-AM)w6IVQkoLCT znivj-kF>u5)}O#3_t*aC-&||y_>H(g)8AAZYqoSU7+v9hw%Qt2gjs13tCoDSNriv9 zwb&k_e)H#-8L_hY#Q>W+^nPHQ5Wn{q=e)B2N}ioWo2H~kP{iT`QHOfey^`w4DZ zO-f2Od-g1NK_qX{(-1KKF-1tG;Eq=-?3^^;rwq*de zm?-RNTDhAH!gGlq_fym$E5}3W2zk7O@b$M-VAla3LAaN6>8C?Zil|U6ri=~ITjjLv z+Z(k1_@D22+^JEwpfQiu9?S@6w5hK_Q1JKvnp;EY93(x|T!97@;en(9Y5^48Wo3Hh$` zIim2v(ct`Qw{8*Ur41zi&(34-7Mx<1i?xTYG$&%d53GwSBu5fi^S8~FOp$=_94YSF zt}WkNUQh~}P2Zl8sW&z|Wk1@oT6^uH86A1$r0?AE4~Kejr^x5zf+$G3!-ox~@t=;@ zfPA;ZeGYu{X&?g`m-Q@nj&s3Y>ulS~FOg7u(-rHrP2kz7#>3~9EaO6gmOS@r+~o3> zMeJ+8t=3|AV8jN)1D~o8{TBjiu7;R@oq!|H_|weIMnt0`c_z-mm`l5@(peHF$jdc6 z;M}h%8YOs}i$sM6%nXWcBnhDInT`?(KIr2Ok+;ncU%yDF5oe+PG@o9uBv|lS<;tPY z><+7+i@a2`Ws`@Z(zQ3FJ>?A2S)@H_{vTYx+iZV3>oo5osL#@we0;yI@>$)x_M1D^bm5GRyPES zZ`|dce}>3TNd5Y^HaV1_cGp8*kF^_>w2Y6h>Cy1*kmK~0Gv%DEr2B6@=!J(fj|EbM z`(4y8cNC)3pfkP4zXHNkASyD!YYo=34EULeV}iF8)q#*r@tNG>K=WPKw+~gA4rk7B zi)Ir==UFcvJ?oFVdi(ndqxvUb1_QdbXVH%kki*vW7t*ViC~;BKrJa1&2EXNDY}2Hh zQQrqDfD@Mx)fvWI9GW}PdRHz%xe4{={e%fz+AQR%=1)wqtKSD)cA6baL{fN|S$I|Dzd%C(c4s?Ww(2>y%0b%;t+|&J>GLUsgeY z4|lMFR*-osdofq-fc9qWF(ojqw`h{$sQYsAmw4=+Whx&I_O}StW|+hKOAFm1Og&M1 z(B|7?BUJ01#C#)HE7kQ!7m?HJga6!A%xKYMjO{!5W*fXfQM7mFHT`-vF3vUJm^uNb zvJ7&`lTL#%c7q@N&;zZJ`pw7mYo=6%iBKdRuEd60 z5!#tg6TyY-3!MXioD%|=PkoKxi!pL_Wfz~iru)ZPT<-9ldv`3z(>KcIG(DH8dd!T; zpU>7p`>O~RYLO4-@@7uuKLnZ^MFm6BKm`w&UQT+LjlZ!V6fqYBUaiK2=sQxAbusl_ z+iu&%8#NhUQ#}GBKV3<2+m1Sf%@sN!e)Nz|@Q|sc1h1LxiN2}Bcj)(dl* zj*Br2gy!>L&6O;PB}PKU_F z6u6DDb`P?wPKtbP7PrmVZ&}!n+eUT1bhEmJM-i^YrSG2zQEds#{W$-Ik>~83c^ioi z*MSGJNSU)8IcdhVp2hdYP>3iLp@Ymnxnc8gSGv{}8iWreoV_-foj>YZFw~E1^v)0+ zBaIT=hQYAAyU2+t*6ofQJR-b{3jg^*2Tg5n6jX_4*4a;Q@*y z^yQi3KR2#Uaph&7W14Qet>ugsy5R4tI!HbLF|}>=yYhYV)GKMHJNMoFIrhRUrw7(u zmF6G{1tB2NX#EC@5lXgWEF?lypJ_Bmq}#D5I?5e8UL-zwA4=&e7&=h45*w>#kW7fm zxUIr)p_;(=j+xQA;i2gILcog3Ikn1ygHP_2U#gxUhr2(p5wU$%W_Z-4v`L| zIfN`YK!PUfI%B2jh+<8ZC99Y)uF}2(O`vh z>nvPa!RCya7<^9#^QEV2!J@vq`DGCJG*#%r@thJKAjY4`K&r$YiHe*j4LoK9OZfPN zP=fB48x*KZqw3T|n{%^{!No4R!&v<1>t7#>zYRV(L8mnwdzk(>sA6&Usow$7BVYY( z56w=mGfAA{(t>j?{&Azh_j{taAXma>Z+;r=C}FDlW9odPON@f|XMuo;6qNMRol~;Z zaeq_smLICY%&T=R5C>5_+l0PUC|W{{f^C4yst(x4ro=A+3#ga-unf zBk5!G<7?vY+!e&bB`z{IKZ?3wwgV|LQdFo5cOb2TQ0(+mo%X^y2U|lo4wKb526w#w zdl{asNFhw_JDtz`IZR*2|5R$Qe5P>fJNCz8$h)=M>WL<{2PCB!`IduoS#wehQ@ffP z*q78pwHhh(1ey8P=iiv?ZGsHlZJ48|1I{pTKzr@>dFkiuUsKrZf~d-& z_ljk3xVLB4OZDMn$5nO#t`K$f* zhVGg5FxzyeyN%MRX6Z|*^YRMZsiVqZCnwc#hLW9}*svYWbyp)#ITXe$dQEq;aEG!5 zW3Gt6+pPYS!*tz!DwR7QxK@1{td8Zjvj#I)$2K}YENbJw%jzK^cK9E~#!~a~nn6u< zH7~GRBUTn`U#acaDHbU)?UkNETfLi;2D?yy5incZ<|({;JG~@h z4CMSf#Kj2S)OUwPzXV?%Dr=O6vGIDHZurE8f+h7(zwH9!1U#hUQQGt5?7k7F`!N<_ z4?6GGZplFnjsU)uA(6TPV`{nUH~vB9*$%A4!kj+xHM`ch@1 zHH)C!QwV|>NMn z2;20TxU2B%`6OW?$dxi*l1)5$hsgLwb#v3k1Fwv2@&+Xn4CpPk?WlYwUI$~?naGqw zyOm@gL%xQcw1+cUU#x7)hp5t$jYt}uqQ%!Q8qxd6G_EXGF=TYZwA(isVaqp%SGD*M zwKI4v=zN%6a!C|M85~N_pVQ}s3on^mdu=(vY|_F^=*o_b+c*>@V3O-#Y=;kZv_`QT zvbNrH1cL3n)Nxn0PQT&7Dsi3YWgW(3d1|`a z;h*9>$ObMQ1MFKi0JRH>`i=|~-){iJ?bXXK60f7u(s)I034X*0^$f@)`vr5%h)HRKCd0E&&IJpG%d6#2=GO+ue#{z&=Z& zt2u|3hZ#L4-cc`1FLbqL`ce{WmcD;Ta5wx|V@Lj<$!<=aOc%@9Aw_v(gY@hHfcgrx6IrSE?Jqgyn{E&Q3*FofN#AveyvtD8HE zWL&$mI*cBBxodlkXY*?aH@c|IHfU!BKi@#*w!#pTo+OI2ES-sNwrQUVRmw-=2HsWL zly>EzL1Jh1aV>NyiCCj;X$alKKsO%;T5_S6_)kB)l{uPXnpTJC3yde2^P(B(w!3_G zA}920(>>*h<;HoZy{lF?&KV)?!pT}Ut!OuS|3&-wh(&uB9WefUb%Ttv_)ciUn^!Sr zqMYuBESDMx0(EO4u@qei+(FNNlzTczv5P3xe1~S9p{0==HhVRgSlG@VUJL>on+;H} zX#%dA<(NAgdinCg_Bf>-hAZO5a=O z*(2dU1x-oqU_<6N(&mvL_AK_M?E=U*<0kv%QCXcv_UZHMUx3L%VTy@lKl7MQm4bq6 zeIFH)j~_v*^4dS89KFnd(I&yvyGM*?Z;afAmLGPN$`&(l^}yh2OtCtMHmUub9OotG z5Tg%^VpcvGmtqf?4o!NZpXL%|o;g&nIE7w*Qt96r0q4#G zrCs|BQx${l<}hZzLL#PXq7QOFD<Z!B_MzShH}p@q_{_*TB)Idh7;u zGd7r{R$TWDL(jNtK=Cx_{HeCA%Vx-ZIkpfoc4ci(g2UkRU3&#m{X25jo40NF{(|@7 z9?SZ#7spegnx*jv7av=3T(|7Tm}&`X4i9GDja*e3dx@Y__?wSOga>BXY^UWUBVvE( zh$DfR06&MdC)qCfo5poz7V4Nl^^lTHfgP|I?;`gZrL{7#Shl_)i&T+#b6U>QLa_di z_>Bln64rmNEwjn)dl*c%oF^M|U@Qp(g-`AI^=(^S;1uhpgY(VErMicYJ`6|m)y=2r#M{R!LaD)Ogd zvjSscPkB8H-#OyN)x0WNI=vD*Y!8)uDqP+K5j7wQM!A*waGzoO3gm8(dv73;CL$z` z=wsMOXD%Z-mrSSU{CxaN&AwlOIdl8gaL|?~lxA+SPV#(YA{jByy=4*JFKlZ^n6Ux` z{|9(l;KnP(M&Ea*2lkxyX47lki_d$;HSnqE_QS~Dfj~N}kvbBnH<+jgRAok8Ldd|J z`bBxCI#Kw-wTus|W`er?ro+Z=)!8G41y@Sz%V_89l`;z=8TxE4GOq!smQ+Nrfn5`| z-^y2>c7-NX#@oJ4Y<=wCLLCN6P(WHxK}bL#hjw8v$B0)$OLqqMbB1TnuI~7b1*{cu zH}FwRLUvs5sCzL*KTKhNC>+vqP()Ij>$#tX&lzM9H#O5A`1_EGjFfj{bFK=crk7!H z_X}%lfkC2PL4+y-s$Jwc7&RuedTe;%JYM=mON57G6G^Y+!Z3>3$4q4pBf$uGhnmI` z|GI^N2{VtVoIdKp3dB=t;GSVjLBLLyj7Q52bIK?Ay;k(S(D~0R8)8A^!kQ0lzFTj> zsbQV)LN9fr+E{Q6#BiHNaL1M{hQ04R%J)qKI}ONF>s%34{tRiKnmMh9B77jenzsU+ zu)x$RV9epkf?rMwLE8&THG-A}g#q0$h7j;a*=CBHA&<_4%YEvGzEVG2v#BIyY$%E_ z1?&QiN9M`-AUV3wfr+FXX;IctxF-`cl(6xFVDl**Fnf|G%!Z6xw7s{d6_pB8xZBE5 zf`3_)Wn#C-)pi{(-hLofv8s8dD?{!3dW)9oVg;Q@A}mI2uqH>7>4o>_F8fPG`JY+J zjg(pOVaOEBYOze^uMMBOCsMS$~fDvIFTS$)w%iq%~cNFZHcq2ZHf6 zqm_cjEcGErxA>;qo(9hj&W&e_%WS8!t{IgHX(K))$Wdf^`BJkJ{4g11d%I(MTZLR# zd9LlWuXX#9TZM`rx#}u_(7c$9VfWoGEH!i!&9ScQDw;nj)V$^X$JUlC^sY7BDg zv{WCdzS>M0lj-+0vywluyo0bEDV)BQS4-Idfmx#$aitUSavN8V>58@AGwU~Zsa1|` zD^(Ub2Y?^{-p_oLquOzGk`z!h>@ck1`gCZ%O}kx9d?S(PzN?^AA}D;jr&m z@6Z6X6q9z+cAw!0Y+>u& z-yO}&mGoH*jzzy5FS;@6>4NjT;Zx%r<>PUNdLC~u$`h@BDu{y~am-IQtRYhh8QvPW zGE60qRw_4b;KC#uEhY1|7u{?dTQk*o)$5t~0L`5%qmM~(B;!{KI$vydzXYwH<_Y@7 zY@}*i_&7B;JH1Uaw&`e3GjvmHZ*qZ{t&_sJadwAsv#xS1&r1!GWD6W!%~IV;`;~cE zc37znX--A;X98aLoN=j49kH`C<0&y+G06)othF6A23G!<$}=+e2Gt0$*RKgKStgZi zZ`#b^JUEnTeCe|&&NWhz!ywbcI(PgMoBup|2R7_H?NqTSRvH@2q<)@X5E>(v@$|FM zvsV}2D~n_`DH+G{ps&AvmWT$UVj1e~ck154W8^}_iv5FY3n@51Ba>Y+EUi$RE8@8=u=OCYqEj(m?d4=ixRgCUL$YXL{?kIXO2-j+Grcwzo63 zw~n(8VClfxK0`H)$>UEn9XLSc4{6Mi(EH z@}4t#EC(I#2&1lW{W+v8L=inT(`Jkv~Q1PMZQ7H~TjQ=mMj7lyln$8QWIRFrkmV0Pf~a#;C-9mFQerzpx^Q@R;%| zD{xcJu1J@UGbd{qkfq+!#5gA|{g=pY$9mfVrdlQ9RG0JaHv~pUP2hD|@F$f3(ucollhYzf3Dx6rsTEzn1#rp?yc}2eB5ohqu|Q*`4kKfQuheq^H>}a zY0xP}H|24Ceg)#V`g1A%lIB8nr}V>;L79l64&8}0{mIcqWhh|ihMgsk3gR3yFFQ`S z*xft%g`+M17#>yl(Hh3I^!DV(>1nF`;Cn0?Z}b!Ltt~1$EkM{Lv;N1FiirZZDnY2tFLR7%c#y#(4{yogu?CShD=M}mxk4x zZBJsf(Z_3+c9V9KCr2LR*6*^9T}k1QdoiD$-FY>k%QxI5IzBg3qPsX+-~z@nNvHcU zA-V@-QYwICfxA_F=V!v+dYr|0P3~t?dj*I3sBNDxY$k$~%bR78b^23AuE~XIt=!u9 z-av&=KU~uAjLMv5WvX?|KIjIf+u_h7r;+hvak?3T?d z>Ep%yGSO$pvK<#izqHg%Pbh1iUwNn+>y`uuB|-FP{k1oC-L4zWb4*6&uMmc{)^XqtW4DwGdK8iw_|KO)kJw5q-DTA>xc#cC zFGep4VNjhE-v#szzb;!gyW~8e8R!kpJCZAL1?^<{xzQLJK1rMG3^3SfzOcavid1rk zyBwl2S12{nl5j_1DMpXeV8)o%tg>lDt@k(P2IpOXlwLxSmp7|~7DclC-j%t_rPDA! zntVlBxVHbt2JvXqr=ey=g1alU98(3qSE3M0Lw#w2Sw;2>`_!exCKn>%B$of6DEMj? zir`XzmRwwkG9Dcy|Grd>`sIgy;p=xNRBygob{6F8jYRqr^cTaBC~_P(`dU(aC90*u z9Eqs>_RFN7p#lONochoRpp%Vo+e%6A-<=5B86|lZ9t7tG=!T$E;|WpTnn{r)3D3DlzHW+)cQ#L3f?(*=!1SUxgr+FxcPw?`Z!)`lPVt&6B6_k{xZZ;K^= zUKR+a9XgK*p2FbA+Vj&i7Z05+w)h7Oe3#U}iCNHqYd<+sb~vccWx57c2?}9e(SV=h z8(f~EUJ%3N*2Ei~Q~5H`78BhuWesF3?UkQzPlwqbLa?P@v>(teL}e|Gn{Ot)=7RGvb{V5WZ|Fvs8q!0}hvpbei2)NQ$RCKVQJM@n{; zN&Q#MQkU1mQ~3_}X-XXG`?XkOIFlonqntHdVnt7tosgo%IbpD)f$n6u{8=d^R|pG? zW!&W~)ZmgNW=*4=;3)mu;zE9~65kX?kSO(8=gKWU4Aed;3@Vi$(ln-h{QRqgnc3Tp z?W8z59`{L^E`7Xvn5Xk_4T9d3`r;b%@K{=k86U z%4t!)`%}4&r)dLsZH3>&RPaV&nRSq)wvT;s8fwuG^y2HWtEU~>SAZ+Zi!=@MSH?%A zv#&YI6&Jn0B({ZuzJS3m6~AwM_zS9iQ39aa`!l&Y()W<=a=sdrk223|$LQxdI{1>? zS_FVT31L^`pKPh@GP}e2ctz91MIoVi76=ATEeA5+nk;W1c_xLz<{Ixa>XR* zRj5$XrpE(Ytk|u>zKy}on{}HTaEJCXP|_G>n*`tC;Eg+&c5^ycAl+=^2~ZIwF8#r* z-#*@(eknX?>5WjlpKEJ&P!T?H_zMi-aF<;xO~d$Ac7jYYAUIXLe<|q^Hj+ECn!OS5 zE1)nNs5bCwQpC|;ROkE=<0EqMP)^z?G4FBkI{akg>^S*jivQl?WY8;T30eb%c4am9 zYnyStiNto0_lLr8+bI+UVE_|}595NcMC5j*{P7zBDAwF43|z@OZMQYl&kc33%pt5j z_>BnIm~eyX(oFe8-0vm-zg^_NDw_76!3zGMygd5(SDGeljbR29oP+-oq5by>85(Hu zZ|bgCkm}$6s_2%md(r@aD;8fae%Ot8O8aKiY1*%#0n$*=yst(3KP$cbUF`NhsSNj@ z-Q=&DF#loMxoVCMc>T)k!uNZ2lOedEvS38c5enDnzq+J5E61Z>;TPGt`|*tf3DkJfWMH5BJukb5HCCe3cPr%3S z78BbdO`rJ4#ojyeG-&PrxcuhNNWpj0vefdH4J6cV7*)iO=Ux;qTj8?48 z(^RjdD+aV|O)-A$Jif(YL!lzXOT|~*j4b8CXACT}<1X}dlQz%6On~m%yc5)m!qtf8 zH>G^i19}$g@B{XDuZktONn@jB5(p89w@*0QytYy9PGoNhn4Hzmvq*8Y7nY7_8WHZ^b5P^xN z$_@z>xqK{etElkTu{`qZ7C0Q&vYR!~BMAiQ)-Ie|vLfSFDIZ^eQMzewBfC0TemY?C znv}7s@M1bR&$stPMn=5_4%L75bdxErpo9Ct?M%yhT5OpO^#~cV4MzCq;#do9Ge5C>WBo!x$+Uz3803NrZ7A7IDeu-l+A8Xr zohgXWU*9k+B$Q4|(#D?><+hnGf8PPsG2Qo;ZzxF*l=mR>0yl+UgukgCdZzkHa!z?Z zt+d74A)-EcJ}i7(7Rg1J4Klo{2fE{a}O0~bLGQ_EkE zmziQEL_kC0+1nPfUU~IDq3<ES*OE>KEq7*%?_+YRNhTYrezOR0YZ%Z1A%>B*9d| zQjV*|=A~^;%0hR-D4(3P73dx{SV6$#qK?%f%e^K-|*MC<+rC@%@8FnM?6rsln z7QO`zot?54*BW6vsP#ipc`h;M3N2a zP!-$rWGg9mTcxPW|E%C^x>p-Lym{B-N-8FsJz_hAGa_q*(d-7fZ0xZXabeW=bF89# zO&+mp32*ir=(r-)`0@%=z<$IveeP!bvT`R!HB#RK!51|%$`0xh!l*pu*4p{|e*j(@ z7*cW(2E21WpzIvwu%c2?$k??fb2!F8 zeh%1;CA_qSve2pEVwBk=bJpXlx!mCmMc%)EJ;6JbTMxXqP+eXf>)|`G_>0MI zavTXIeYk!%DP0mQU8U)h2`Zl1SnPreG$@KT!`5KTw~_^cYx9aF`PQ2t-%Mqi`PSb-%dr=C{WV z{w|zk=?ig71Dz4dF8Q0G3x9GV@@rgEB756Ffjrw$dD^slXoHv5QvRTSo5;Sp=#2Jy zjrS=u{5Gjrbr*Hd%#q3+)VYuW-bdM&lZAicw-d97`iA{=s(CfGR->L+58y``bN5VA zVwW(i^@T3-l9pF=KY#YAIs8)?grKdYnqkX$#_VHG_YE^N5p}K{&=37B;58`F?9CN} zf=GN2FOi0mxX9O4zQu@QS_5m;!?*Yx^5vUxe*X6|76VObw5bH}dC1ZdpnF>Of#eP_v#CHkChT4&Gjw3FWlGeHL=8 zmA+LWefFB%bF(wX5GJ-;)6L3QrU84uc2MmSle?Ul-e!*UkNWtcMzOr|k$Cat9=O#5 z`FQz9(!tYhHK8Ujq?h4E>X5(NM|qPc;Tc) zGVY)p*z7-iOF1JA!zjLTs6hjtgn6gZ#V0FSQC)7blt_0tZ5=xfY7AbbmadlO6J4v{ zENZnm?H7506tE9abk!f4#+q%|6vjp2YRm&nOE0Y~7DR&w!#a|j-^kvrNFe3@`Y6{` zYnptE54=#LlnOYmX8Y%stk_eSwA%!?nK)_!;W? zHd=?0O!0ujh?t7bNy+vPCGEtGe5C7Yim0$(f{t zE=|Wp>;R#0Fa9O#lgh+;T0ebUYnpIS`;XZQwnYh1S|3Xi(qBtK5VH6@XE>+ zgKV4cr_=MlbK#yrLau;{yrjm<_@|&UT^9&@PX3B+nz~8JK6O@mS``H6^9Mmnl149# zfO<*)n;7=L2=D&q7bnwhi0cK2R#BDEea!pNFE--8UvUuJ*1sD ``` -  其中``也可以使用嵌套查询: +  对应的数据结构为: +```java +public class Blog { + private Integer id; + private String title; + private Author author; // 一对一 + private List posts; // 一对多 +} + +public class Author { + private Integer id; + private String username; + private String password; + private String email; + private String bio; + private String favouriteSection; +} + +public class Post { + private Integer id; + private String subject; + private Author author; // 一对一 + private List comments; // 一对多 + private List tags; // 一对多 +} + +public class Comment { + private Integer id; +} + +public class Tag { + private Integer id; +} +``` + +  其中``也可以使用嵌套查询,例如``: ```xml - + @@ -281,11 +318,6 @@ public interface UserMapper { - - - ```   如果需要传递参数,可以在``添加`column`属性: @@ -304,7 +336,12 @@ public interface UserMapper { + 映射语句文件中的所有 select 语句的结果将会被缓存。 + 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。 -+ 一级缓存和二级缓存区别在于一级缓存只针对一次SqlSession,二级缓存针对全局范围。 ++ 一级缓存和二级缓存区别在于一级缓存只针对一次SqlSession,二级缓存针对全局范围。 + +::: tip +一级缓存作用于service里面的同一个方法(一个方法就是一个SqlSession),多次查询时,直接返回缓存数据,如果是同一个service里面的不同方法,就是多个SqlSession,一级缓存会失效。 +二级缓存作用于同一个mapper,即使是不同的service的不同方法,只要是同一个mapper,都可以使用二级缓存。 +::: ## 4.6 动态SQL + if :是/否