78{)JAG>^^LH^t<&$jlsI22X)hP_-Z@8LICbATBQcoPj=qyoS9 zk$vP%6jpxkH`7BXtc*WLjKxLL0|6c%ejvc>4|Bd+&gb1=$pJQKz&0A#oC7T6sL0t) z0~e~m@BS)s`&6-E!5@7;nwUbxerI6pqB1J(b$Q%j9tq~I4e;I#rW{~K0q*7ARD{%3 zV17e^3jEHEXWqnd_;+sf*sx&Yj{r!;#%uqhXCOQ{9v||1HlVft6@DgQg95BBwg!xr z{?~y~j&jcGVr#%??SB>6x(&Ciw|Yp1+^58{G{1p2O>~+8(qGTMb43-QqM~GTmg_ zVsz)P%llQ{ufE9j{xX%_=q}x`!EpQ0bYx&8)*TxiZ;B5Mc|4rk ET*jPF~6ptlcZSCEzw%x6_9Iq)X zEiX6R-YArzH8C6?LvPY&ojMn3^Q^S3u8z)@o%Nl)t{u(2uJx!80(5sOmaKGLA4v`# ziX_)?Zg({ 6n`W!HmoQ%+0`8%ja9m$C{Y@HQ|#WEh{lH|b0WzuDzZB^78y%p=V@|mPex SqG%B>tIW&DK-*I$D#*a1MzfqU9G9KvE0DK$D*<0siPzD zbgVxzkxmG9zvSwEPWt9%7{mV%+RAchD_`oiQXN=tD&0{ 1QLnH+w=;=daD!qdpmS#)RT^M3ND7oJ*zi cskGJbA5KYbxDbMr)ysiLs$LYMbP9^)12b!qT!b!)-f+R!O#!_f_haNH)rCP;eQ! zQ0lK}ByC#+pZFyQsoNe&u_HE_O`yH52nFqlj7%s(*T9B8895jzlWm&q?2^rUq9F9hy^Rg0H3R(&tLGzopHx$H}FZ=5m}o#|0S| zA;;$bjN|S<$}Ov| y_PtljqPM z7eUu~`tmvj_3&_wTTu57%T>L4rKxm-lXi+E{=x6dZ*i?CEOj~!x2+I-gSX*7m)a+I z(;N>Iob*cPMZCW;5mlV>)aT9CSOoQOvnNgUUUW@FcQHBq{pEFS_3Fwi`I4Lh@p}bc z|8EWRZH9f0-S7Cd f7MiLIK4BRSvp|j> zt3aR557t;VzFE93bI;WD{m*Cac>MB1Pa0E`sdQ{KJSbc(!^zla;`*4FaJBGs1?R4D zqvtdNVGmv~qt@;AMh~pU8E~`=){+c9eB eU zo_JJ4ABje1W52Env-33eH6r_CPhEQM2@N~yHzp@% FoDsUO%fAe 4ZPg+4#HY>See}aw|hex9S*Q zo_X A~1wLm@xSL1Z}PdcvgchS{lxJp!4FTH%r zGnXHDM(ye->ISG?y@=}SMVOxI>Lr9;?P`Hu;c6;*UnwT1x_U7oSG!su&$^n*y?-I* zrn Jm&(b@f6*uXeRSuW&V$yl*}xr@Gon$knbE$g{4da_^sqxv8#R zAabi*EpRJcO=X`fM(kNvFV~#FO9;El)dKk(U0ow|{V_svIQ}j=oW&KRI(+`6r~mxY zS6);*Jc(|})DCx09qz#NREN(a^lFC-^a_Vl$@}b>oa*pmLauhWK%R9tm3zMpb5kA8 zirgxP3*1VFQ`xV#BKEAqmuMXBAnYoK3*>Wf_;@TaJ`zje ne+h^{3 zX8Mj-)!v>!<05KrTd3Z)V0x;zZG>L!ZGm3lZ7O-68Ix1JZ6)MtZwusEZ&SJV7h-Oz zw~It>mA3_MrMIc 5cjD?u!9r8H8Fk9gQi$jt zthB{qMt1@7J(#&SK7Ho4=|^9o_;Ppx#S;&u)8nadUEMGWAH`}16Qgy5gJUt&|4+v1 zCgXiO@=?9ASvX70sw@g;UOGQ>{;|xfPi0QMO35ajNQ~6sw}Bh;ut@S ApOU!)Ye *G)d6`2N3 =pno0|PRdA+Ys9;_G@A6;HKasyVKR@r?yszbT E7@@`@aV fJE}%g->!8 7W}m(0MfIMjdp6 z23kymZqPx)8YoMHhIP=82Acbth-3=spg|3kEMcl04nokN4jRxv$ %*$NP~KGP)-9i(V(0T>efJW zpR`e3-8yKU2AX@A3PJ01&{`2{6hA$*0@v!GH5w>KgVyMv>org^VJt_JSg(Vw(?IKJ zxvtYe*J_}(H0W9#v|0nLp+T#4&@~$9dKz?%4!T+cT}Oki) =Qg$9~?lpD3-6*_382D*xtYo!jlTm!A5L6_^GE)8@g4eHWCD>Tp* zG-!nmx=aJjJ^YDeTBd`RYoN<%xt8moOEplm+_lG3ljC?@s)H`kKr3j_B|7M04Rjd| zx>yG-(?D|%9U_^^bkIc_=u%p)i*(RZ4Ri?&TB?IC)Ib;0pbK?Srv_R^gF1E41sZ7X zVK*ex0v)tO1EqFqOLWlr8Ys0>J6{K#r-4#Cwexh)VhxnqsV&w)Sq+rhsbzIghXzXR z)H-xfy9P?_)Y^4Wn+8hl)Y^1Vs|HH#)LM1WA`O( gZ8BwRt+I1d%?eom!&~ zYS0vz+Nm|@pwbwJlq;=Mi|_xJSl<4G_x}hCFHis!00lq+PyiGF1weuS3 3V<% z#LlDCb)}9?9?(JeYoOGz$^AO$J`I#QHn~p+?bAT1W0QS4Xs-rJ9h>acLHBB))UnCE zI_Mq^lsY!KM+fcEK&fMsJv!)a4U{@IxmySA) ; zx=RD4j!o{;K|3^1>eyt54%)7PQpYCSb 8*4!TtXrH)N*)j_vtpwzL+Ejnnk z21*^9Y}P@WG*If;WRnissDaYPCh`5h$$pSwZ)TS{&O6rGe~b)xfdZfaC;$q80-yjW z01AKtpa3WU3Vdt@qP6IOZNp~$4AA$FUB1vz%*{M>KJ&UX`AK>PeFU$n6(1WykE4ro zmr3gEh#2SMd|?mz;rd{$Kj4iH*5F(=(Q 6lcd? f%HXuEkjdXj#;dEHt`GStv!N=J03LSW|gg zyK{-4X+Y9+y_kbaQz?Tv2#T7}sF+;VQM8GOcKiEGzV#quueIIan6@6Y-SDxSH~>Ha zPyiGF1wa8%02BZPKmkxdRA6dRp%ZoRo%1S|uReL?q!s^)7Vr{ z$^7L59qnD+gM*wWQ0qqjIJYZv+o_q??``R*i;TzXglX7l-uVrc_*-R|d -dy^iehNGf$Kk&L2k=!e3*K0n$PmlpP|3=c&{Qn4FR zGPE*FOEgs(-gjVqC7#?b8aLihIfz$Y3!_Cs*H@;}k@N&gluk~>)>n?kQmM!=+E*#w zrQC5kbLV4-A1!MfsSJ-zjEvkU&!+IWIB(b&2z&Y3K*-Dag1(dPf(1kxrmk9{%=`b> z|F;Y&GyU>cFFkkvbS`BCJ-X3qtaYu4Vf?wT$mK$XOUB2BD~k@yt;p)a?vvmLvPI@x z9zN_1g*mR)?+f{TKK^8FzEEVQLQ~}b@tsJ6zR0pG|3eFme&vm;4S3z?sU1IBg1HcD zj0+q%Sthr>_b>l-9Q}ZtR^wR;j2aN~F8;kawAT117Fx}s)te86eZg8T$cNm)5GwwF zRQweu3lznFoc}m_PnDXoM`7bhPA0l|{+C}zZS6BZ3O~sahZgV69&y5PsyyT}&)qij z_{k4nJ2&&~bHBZC*YvCBGj~3odGduz-+k)07f#M{5b^ IM@_wF|$SeGuiUP#~1?Hx}kgM1 z8A)u@jf9jNZw5c(k)&KDS3sL#j! z$p5?=^>O>doVS(_1^j+LH{{HbB8-r9S9v;6{V|d;kse4=vE=Q}@@wsjJYe-JY=5 zSL^rl-hhW6D$(b&W>xId=YxKy2ZiB$wE^@4x9Ep%hvw_^aeeb2-~80|L8oee7{_1z zo&fUD&^&!Ui(aWUUWI%-T-Y0|^?5yBd>Sp*=Tq`;MOULfZVsQWd7m3a)Phk~&S$f9 z^(oHV^6CBKL+4OjA5SR2aYGI{7y0Z~^qU_yd}`Iu6VF_j_tyG6o{%>X7_#f~x%j#Z z2h~5#wG_pvePK6`gT7uL=jK9u%qHg}T@)_9zUY^q(mNy{boB7GKHeSjg@&whHj-=? zFI*b9D%C*`ihEI`_PV{iXQ(JgK9e^XuZC>sn(eMdam!F35Ik96DK?ehKGm??r@DCI z`U8S){9HR#azvAaXfvnpp1$Mjmu@~q!k?G#d+5@0&ndfHL{@j0L)Ti~?Fst4CkxCu z%8~rOAgt#zF9%=icYD!gG8ikAb(fpbg~g{nz3%9-3ZV~!e*N3y_nj;-<*4q$VnO!L zvbsVs_+V{-3kHG#&rpF}-E4C x z_P;GuH}kzWGOs>bGyUodnMYpwxSe;D6(9C_@xv4$H|OVlzPM4J)nDEI^Q)AV7xfI# z6#-qaeO! f=Xk<#zvB+a4URDchZiUS z3V;Hj04M+ofC8WZC;$q80-(U3x&lJ9S&XH*L_-L8RS<)OrIrzc#E!~ELkRFJ6%8Q@ zvxFEVR Xb3}O7SRyKsm!7wj24OU z`wPO5j!E1j46Km2|3xxPAjbU3P)Ht0Mg}X4s7czK7r%4Uc{CV< Mj)>^FIpx$Gu!wLZLfV6N5rNFH@_S*?#G&HW1 mxXE zK|qbJ(qei_QK>on8D0-C*J^!Y$!1-xkEEjsI_qkE9eA}sGb61>SW;p(TMX!!6c_tn zKP{{iICJ*Q%<0?2ZMlE=PjDV`QB*vjG0A$x-#YYtt+)?9Kmkwy6aWQ40Z;%G00lq+ RPyiGF1wa8%;0vz6{|{yh7 xzluV69GA^DeWef)98kdV< zj9+3H#v}e2(dRDoSBU *8I0_2akdTYzp}rzw^;wy`cR46^1gZ6 zyv_9AP4^aUDl!&i3tltsFSxznc7`$hmvX1ma9cbR861u8O~+IC&)C@2T;J2|>ZxyN zZFW`Sq{ |xvNPwVO#w$+LRd2D3Tge@kmA}RwBlvLT<9DCxQ85C{qS~Qy|-tvBc1nP&2Vg zGLmefB3sf;@zHoDj@mMqP*$cVJ{}p* s6V$ zBcqvI2HvmS?%M1++!9TW9~PQ}jP^uy 1o^IT~+^k55XUi`2f9lIQ79oIQ^sxPUy#pMH0`s_Pb;${SZ0n8bK2ej c01~}=PbJHSI`L+rgfOMJxj(nC)FD)xBuc$EG$_maPspNg3+7Tpio^BwS z)qPOtK5`%ZEJ(k8p{aa}lcpr@Qv)1+w@gPD6yw9vscJz*oQD6*Y6Wr9JoUp_FQ*>f z-ZM3!J3is`#$-%!NK>oc8A-+S9x^@)?x-&{mG7;ixubgm?HaAg;Q^1^!@1GF0Zx~+ zVEPDKTwYgaxb-H%QMwGegi^H&b=zfs4km_$Q-yT=)ShTi&8~2UAo~nHN=aPu&e9f7 zrz7}mBps_gKA-YfjL&3B59$dNXCK|hE7a@5oSs~+>Uzg~z2(+>OGsj;kJxG65;7>g zAtX5H-V(NhxAG1qu(xdU^_EBPEg{K1eZ)%hmXJZ|Eg`{1_m;37yhZg^$vnNqg>>E` zN!IBj7K*n>28FjsLJ8GdWIK3^=B@Rn%MBy&xQ&e7il UVMo|l#{*{O|LB= z*A>eI^`vy^vrw&~l>7md%yR*OS@I-*nsr@oyj*YGi>}1WSEIMZrFQgQV6S0VgMHRs zQ`|@XSq`FPc!2_-04M+ofC8Yv2Uo!Sv L z&>V)R#vQ8Rco!E6yWQx&Cdm`#_}UQf=RH9#f?xZF+K=r&o~jS_v^F*F9339*YmadI z)4eC69W{IUeIo g$0l3)k6z!ur>CRavwiZpIrnr7%TxS{+~6|Y;Ib;I!Eb*r^Mh$cgE<%H4|5((gM(pT zD9ndy13{h-guJ+b{!~*-`!3EsJk+yeCpS6T+7oEl)4OYA`1;-*nd>{c(!uLSyzY@$ zV6eWcy?%dcc<1%ehL+UzogJZg?0Dx`dtgs`qQ55^JHE4ZVyM;A+tT4Z-gP{-Yv*J? z8aD6Wd!nzky{;`?=Rdx6tI#6Us9akELGn-7g5Gj%HT}?pW?u#8R^YZ)Figc7#>_Cz zMTH&B$hk9r{Kf1;4=t1(iki%aIiIe{g4=7kfH&k01~Tz<#_Q|h8wV#dP3fk6HLX2; zV~vx$Cifj3IqFLs9pL+$kHt>x-yRut_qTb*cgOZ0ney%%Iy%|kz4Js }HjN!gp;8qV$Vc)~uvvT1^Y zJzSXg*ZM==K cc53*%G^RyJ4hf8Hu(a#DF+TrliGUBO+8MB(^=S5{HA zDHQZ`f@GnF)`sg^GRL}i@{`Sz-KmlIp5r5-{l~kH4;=0FGzYtOOit|#B)dF;@!nl~ z())LLqxEB{gu5l$8SU)t-QC! #b{Ji4!K|IzK8M@IHc zwgmZ9R}a5)*Dw++iX`*Of_Xw{Z$N+cBg_C1tlrEBf-OUWt>MfSCbeQ{heyo_g?+02 zPm)4muctN`aEH8nG#W~GU)Q*6e9uVVSa18u{(=guVD5NAx}1e!EU3>FA4ML?NhtI- zkLrlx$7OPXu*X*$;Cvj<`EYOZ3^w=dZN5Hz%)2|-Qa{*u{6uC~)A8%myLNNF_(Vgp z=U9FE*hp7@?{HIlbF$I5D{!J=S90gr)X|QvW4rc`)ig~tH1&>jY#&KYC6Ufe!+kp< zBlYQyE??(x 3d-j!5EhlpI#XO~Ig#7kURjG}gcx3@c5maKzHE6@LmU zVka@ES68g5G6op4^QXT#@dZ>=_Q|JbzW!kL*)xkIVvi5^NT2^?0Q-PJy%^POnb?c* zkq^C`7tdcDL_QEOoV&*DadF c5Axm SW3HA4kH}Ub- z*2a;pXtXuDyM7>*$m}>$lZ?i?n@_a5_YaTNXF8kR9s4GBCH$G4Bhiq1SNudIv2$PG zL`z?nw`b7T8wpNK4IXtj*7t1>`u7ZX?Ku+cY)b?;)d%Xi{m0QkE&Iah*$3a4E;m+? zcB9To_CKNB7S3dL{_6Op3k{_P-0qjZF!%iZL~GmzB&aWpc5d;+BsPl=`@C3wk3Yb9 zINXa)9BK7LhCAE)cf^|deA|ci4DH>O3h_sd4( C zJOB1Rv$e1pA3RBTd+^HJ%T8s?GZ|4xL~b6;EhJ> H!-z4r-}T!Ol80sC`?{TFtY{W<$J@!x|&pN2P302BZPKmkwy z6aWQ40Z;%G00lq+PyiJ8#1%N8ETLbD8Wf|{Hm5kFj%TB;k*1vSefGRGVOD4>Fd3vt zsRF?e=Xs3Q0+U6Y{$OzYzmQ$Tuy3<>u^sFp>+_fUhcd$p6aWQ40Z;%G00lq+PyiGF z1^)dMDBNQ*F(_DxBF^vrA~HQ)YH*hQ-7o7=+&a%)2Ivj|9))V%wE;J}p`&oI41MRu z$G>ANHA+zF+CmC=i+3cE+mC!6c9HR$8mPf(I`I1!8cLZfL#H%Q#%b!iuJ XMX=(eW@G@%-8xtK~!qF z2Fl2OeftVf<`)X+y9RZs-+dAFD!EILwz|WfV67*F*M&c>fhtSA0(8h^MtxXN_{?|z zz9H9#^`)V^Jls4gjn_bAWhs!*suGh>L1|CHeO2suSJ+cRg$n4!XH#dfEac+3K)P8% zC{=Sm1n>5T3Up9Lgcz>`HHuIy3o7l;-a-{tmzuk|M7l8p-F^`8215o76!jKOsT61c z$Nvl2A4~E7A3J`3xqm1#yg&g^02BZPKmkwy6aWQ40Z;%G00lsS&z=H?0%;ZvFNgmv znvoLb#a1HY&qc$q0vT_K2D2O)FC#;kjY5l5m}f-8uoM{&i3VN{#(YtlKEg5fVbNf0 z$mn;zO{RFP$Uw1t!C>&E_%+B7reV;s9u&(b2A(Kk)*(ZfD#7vp3ejLl{Qsx#+Y@LK z#Y95>WWqv>{|g2q$N%x9f*k+ t !61FM)u^qd-|%usHT?mL)$?(x|(w`K2rK#s5rkC1Sq<^Sjw z08h}5;@$Z-g?KLHA0C~GMPg%#add;iA6GDq_2`ne%)G+leEa GWfaIzTLC+(Pf`b%?nz9jJKA1;6&ut2iS-uKMxS8gSln^6r{ z5x#QcDv8gicAB0{@JPX|oDEMp7};48|Nk-jWA;0r≺V0tG+;PyiGF1wa8%02BZP zKmkwy6aWQ2;|kcFZ(nE#qF6pz|1VCj;9u%nC#?gK 2R zdEoQcdN|(i_2c-zf&CY>{{Pd{K&S~Q01AKtpa3WU3V;Hj04M+ofC8WZC;$q4bOo#h zCW|z2K;r)|FzgE-ofjBD0Z;%G00lq+PyiGF1wa8%02BZPKmkzT<58ep2>w?yOd|>Y zKl2t2{(Dg5Ul;u6cn 7W2801AKtpa3WU3V;Hj z04M+ofC8Uu1*G^to;o1$|Cbo{rO$Pfp>d!9C;$q80-yjW01AKtpa3WU3V;Hjz-LT> zR_XEo;u8SA(I7klfXnmvf8G}i`GRggHU1xh=l_4kybsj{1wa8%02BZPKmkwy6aWQ4 z0Z;%G00ri&fE547GY2^S&y>y=3Hd+)PyiGF1wa8%02BZPKmkwy6aWQ40Z`zxr~qF7 z57+;nMbAN <(z6aWQ40Z;%G00lq+PyiGF1weuMD^P^88rXlufQ{_GvWpx)b3EdR zIyTtfx4&dRZokTIuzlb51zV@hY5lqNQESXvUGhIm&Xt@f*;-<>{J?UzWshaC`ESgR znd9b-#lI>3X7N<<)x`y-cTD$~x=iIozbJaVXsBpY;Xf6=TzGxqw!*@KcMHB)&|R>^ z_)Fsx#$n@T!#^8dG2CFd#!$rkkU7nS8cR$j6SIY3%#8C_$1nZ)bZI^QywFfuAbu_p zRx@zufrp%n^MyU0Fc+*1__$Dm4tk9ST26!3>!8~-(8V<9H9F|k8mN;7-KK+X)j$`~ zpjYdlS81SSH0V|xbc+VMkOsX<2MueW3uw?SI%r4(Eu}%jI%rS>Wogim4jRxv9W-cA z2lZ>9b{aIGgZea38x88$LA@HNl?L_cpu7fJLW6pBP>%*`p+R{al+!@XG^j@hb!(u- zG$^No)@h(78q}?W)@q bvo!;4YZmD zt dpsO^{wKS+p2VJRwuAxC! z>7Xk#&`KI~r4G7W16@snuFyf3X`n6|bh!??R0CZ_gD%rSD>TrRH0V+tbcqJKf(EV7 zLCZDJ $kd^O+B8t=$keWbS~XDW z$ke8TmS~{Vk*QS&wP>K!k!gtzYSuuhBU6hGTC9OmN2X>S)TDt@N2bL(Xpsg=9hsVR z&_WHAIx;QNL8U85X~;z#nHK7x5=8o>j!X-5P=ltz)RC!C2Nf=X(WS3cDs^Ov9tohj zYDPEqYf8;CGDVmCn;LQa|Dbg*!~P39%l@4GG5a0%9Q!r)LH2I;CN{;!+5PNp_G*@6 z*RthoiR1T ySqwx?}h zvE5_4*_O5q+4^j)wrw_#t;)8 x3)Zh%zihqJ`k$;x>maH) zyg&g^02BZPKmkwy6aWQ4f&XX)Yy~D^)Q_T9{Rb6B-vNcOzh7bO>r)uL`xVCCeF~$e zS7CJTRTy183S&>V!szT$7#({QMti5iXzNfIt?de9cbmf4)v7RBb}NjXyA;Nb7KO2W zr^0C7p)i`ZD~!fwh0)NYFzOo>#x)HJV_Ut#xcVA}v2~lmxaw+!v1O~m2w$ZzLR%C@ zFsv{FA%)=&DhyvhVR-!tgZC*6k5^%EyuxsM6h (%Ma2rE(4;U5iWG*iP+=Gf6b54y*8k(+ zI$r-@7-1a7-!g?K*`GRIaNJ}*V{ftkt@WW2x8?ofD$}oxzja(?c*(&sw-kK4@cqK~ zsfSiWhPvqr8ww-Fboq)EhFdpfB7>vxuH )a@91&0?`>^$b#}G1)pzx|b~pFAHlrLkdoCBwAtd7h@+3E=;*m^z zZ#tfmcx43H)RP#CSGr;-QwDt_MH0efEHN~d7uhCkq9R+;P4UrqCXSjin8+w7d*b7f z@r wp{cy0!f@*$K`xSuyf0KsMH1&J6v^Bk!R@;)l8PRQq&D#WYDIlM1LACU z9qvfQ;;Ht@vBR#!cm~;B@v%s1 bA=w43Dx%B>sO1VN$B96drm$>9U*cMNxBf|;@d3-+PA*t^R9Z~5e zJ%OT^>NZ}XULU3#yIj@w6yqv)It_P>2vXxc1pgT&L2td*P>i?Vxhns5veyec*8KK( zbr qZ Ep>1>NwK=i~G8! zdvr%eGr0`H4la|p(C*R_O^zQHj;Y9KPec`a4$6$un#UrEQT6VGVH3F|lCM4%OQG(X zOU9K!IXjOe$K$zFlDTC(lS;-WqnQLQU8+9%?OKeO&mN7kHN_{;!BVb!cl?BK2&k@i zn9BFo8JNU)EPf(=4DIRhfyiVgDcA$bJ=u+S{Q=d^FC?+kN9?r2g^)o<;*feb>Akw` zaJa~O) HZ?&aB!+zI2_>9H~urJ1;t6ShF2Z{sP`P9(`$C}ynFE{a6rWSa_#`H zINsoWFLywZdogZkV=|`OVdlF}L^6@?XmSGK(NV9u-ZtM|!K2?5ge3d)5i4z15Hcvc zx{zQ~drr4qcB6DYk`71Ok=!5LnG@ZVI==%K7t(o)Bw44ASSa2i85G_i2_;l-k?r6u z+JS4m$yC0@NjuHp{dj=G@5Sh9=!bZ~bIb8h;Sp}rB2)Rc3R)}3k!ye>pJnx>^X#Bx zP^~_*3gherb%mz##uc>k@KKp4Cw(iLURzKsTr4h=hl@Cew7pQ>f2Cx(+g|xxp}F3Y z248uSKkCSlIY0=s#Tu^X!x$AzNS!WE9REn*9nTw79Y ztTI;>+f3P_DZ}#x-AqeCCHq(GU*)-ycRY!1)km*_ZsX6eV@_4bj_FLMGq@1^xmNEO zoIFp*V3s@{zzlhkKdNJJX}atG4|DlL^%>qEox-&jB; jB zf|AgGv&tbT!G#W{mX?^SwWEE9Jh_4nI+om#L)ex}!Y6uH6Pm;BX=!W5$+-(XIcM(l zqRJ@`1zZg+Js2uoJm!F8PSDj`-_^LYz6-4xK$9jYqjY+4wX_RBa$1qI39~V{(jD#H zJze!E6Jp#k(79VRgTA39R&6h--m=nE-ce1{4 u8%BL?O(!~n{*}^ETBVq zo=B5?NYIX4q(g(M1L1ikBsM h()5cY%S!YXcm9ueg;h z7tV8c7=$i>)9~LCwcBx0B|fscT>79MI-H?ooJDv3%55S8Ml{Psk~-t5u|ztJx{~gk zC}xPH;<@M=Ny{C BdO(2 dXdle)#1yXMCiA-Jhzwgi83qN~d#`2xh#^<~8n2~~F>@e&8`_Ve*- zwPOAMX7*nlf9eR>e`deY?m~Cuw^;wddfMtK`Kyxsmj7#c#8PkmwRz0U7N0BbHT}*s zZCYFOPSHq_t?+DNsNk0cHy5lne$BYuFlV^auz~qWo|%Gwhot=*7MrTfjHy%nBo7i` z%F4`Uivg7{E{fPRbM~q1n`dXAdwllHZDLxU1rotpf51DM97g|R1M3m9!6!bN05`?V zC>S?pPfyR>|3dbT$1Xkiq%l2}&cw&UD3mso7!If6W6A5{VljDFSE6EKht}Z&I9dVK zq=5I{d~W8xZ)pmM#}b(<(I2eB^mR1)4TOH?%P(Y~ctk@ViN&tOe(hS!&ePb}i|mg+ zHTV1z8unxO&~YXHsWph-B8%g!Fk6s6dC8ya2>;x3-=2NrIkots=!#clr+FC5M_d&n z*g9g>2@%3Wm6!EPRrcAl*;B8n9Uns@Vzt}zt`@~^Kd>6p*U*$(OX$^Z7w8pEr;_)( zF!?4L`5Hp5cDg{Gb2*j!;3~{b?NF5>x60)Lx6 ld%6O#(_Ous zu&Z1xkk7-_I3NC#_G|oIboCP4B&w^IUApC&OJ|=^yE=v@Sk gvUFrytJVbHCcvV`$i^c6HvB$AYUDVtT5porGTP zYJpziYASjE0!&VI^& cC|pBb2XLwU@7LNy1Go{R=HZ>R=S$XKE)#ToU2!B4&Vz3 zyUNu9`8-`+BV0^kgyeAiU39nuH;n4=1#?e-Y3|OK)DBOfs}8lp^RA&59B#+-REL)m zdbPs^dWFNO %cKcFEiLyXb8TZWYzrw%PlhnYrUtwYMixfKTo1yi36aZ<{ea z)!SA=ulBY;ukbdNyuTQeQ@ve6$kpB!$aCJNavwBdZmPE}BDc!h0=LrJRQ7ZcV$XS7 zJ3ccLc9pjU@_Be0=fi)JtMPZ@>PX>Y(+V@X@Dd&m$CS5NR9AJyeTkXJZ<~4Km3&X| zK)xKFOvK_xGMR~VxUOy(-3A!1jV8zHqS5g<8vm!_byJD{-36#!xgwn9>I+BH?78!^ z=O4|!`c(GRtCV6g$>eAqejD6lRFN%Pp(ZOLWU~+5JM+b-DP&{G@kAz>suMq>9R?L; z#WFQzp-3rQ*itCPVQ+d04M3|m;PwBt_CNVV*Z-p;-~|eR0-yjW01AKtpa3WU3V;Hj z04Okj1*A3H=z(yYy#5~ fx87_JK zKQdOy>;I9lQeOX$j1}_we`G9|*Z(79nY{iV8B68$|H!D2*Z(79iM;+F8Rhc&e`G9{ z*Z(8KDX;%W#v*zBKQhYX_5a9ND6juV#sYc$KQcni8Rm%|3WO`^NpVcfB%m^U3TTXXhS&MvQ9;DF-a2ruF#> z2;&0K!!A+-8MJzoMn3aL_q_MU!?Q1*&pz@6Lat01FjHzD!sO%0Od=Y;LhUcz{FT{9 zpHkLdnR2MO)U+vI?SqN}E?0k%Oi_Pj%6?O+X>~sO0H&Xc<2KNgAtKK_@O<{n*Oao8 zlmkT++5MRLXmW61IF+27ppn0K{(SbX$Fq0bHhcb7Lat0XSXgSR&R1=pM1J`mL%5Wh zD^m^^l$yAF>|UaIYAiB35KE-- FgbUB34|uC1yrQ!SVkR_NKh? ze_SNIKmkwy6aWQ40Z;%G00lq+PyiGF1wa8%;3F%bxTj-_GX5V{#{Wag_ 5;uAOe@%*$Z;xlu{ne1JU4n;=O`nhnoTQP<0;lsQ;> }f)ztdhN=pwzyrDhvroP__syrc9CKzlt}J?{kXYF(Vl%19dDWHo z*1G-fpoiz9q)<}VSY&)So*G<=;saH3jXAm0K3rotW;OHLsoAf;jvgd4bI)_3T%BE< zFYNJzIpKjc2bGyf=!%qautHsi?1ufSGG_046nWvj^Ix5P>|~Hq#vx@UQby+z#IDd> zX5Xh`&t7=_(# PXYdqG)Zd#uYMayMh%*YqO{RG<)w|R9(sD zRtJTxO~Xbay0q5E$mVW43iX!BYHpHyQY&U7p xfk7I zu)boMp0-6rOWM}dyuE&JYY&AtCJG?%?nAd0ROj5C>!3R&UJ{0$`O0+m %$+?=Rheuif$~mt|3F^G zMit}C1K*x~@^!kr!e+wQf$kZo%2&q*%qRujXCD3ry4QoY+Ygc$JIU07ZV{-;?XIij zM%OC|vrnC)Hkh!X94+{UfP7TfD5+-edzIc&A^4AS;Q0S?$NhQZ|7?nlv-{cI?A0vC zu4T*F636cy|K#|4$4?yZIxaY#cRYcB@B#%u0Z;%G00lq+PyiGF1wa8%02BZPKCA+Y zsQ3Zp`u~3A`u{%V`v3jP_5b^n>;HR|>;LyE*Z=n@*Z+4b*Z+4Z*Z=QPuK({;uK({) zuK#aWuK#aSuK#aUuK(YyT>rmIx&FUJ8UNp@jQ{UY#{ah~ &hya zM*K@{=1tCb2LJjS#!`m!@WOv`ua-Mh!|^UI5O({*?oh4A h`f z{+S1#L-*Ze?|lG0{hxL(Nw~mfTA)Q=eI)hX>#t|;dT8$DTW4NBL&X~NV7I2@mmdGt z>_gAZo PrRhn8~6^$q7?)~a}uYcjv{cqBcIR0PA{#cIxf5u!4)ddAW z0Z;%G00lq+PyiGF1wa8%02BZP{_qq~+&8gJ8UMdp8UNp^jQ?LHJpbRmonc>K6Ktj9 zZyjH8^g0&W|IB_DN`x0E01AKtpa3WU3V;Hj04M+ofC8X^MuCPB2Yy1kNfUvM&wcX= z^w9fDw>)#{>@(ssajvCBVjC=ZIbzw@rn3*fK2HvFUXJM8n`dUve^bSAh+2>0yc~mh z+Ct|r<>iRXy!?f^=kK3qJ&N*j9L}Q$y&i>mIR<7QyDxkC-ucy|xxj&cutDqFYiC}3 zbndA)XKp@^pY3t_HPO8XX|gsO^U@redG*EY!{_Er({4a5T2Nt@p2{E <(z6aWQ40Z;%G00lq+PyiGF z1wet1UjaqLKCWE @a|N_q^8zipeFLs}+28%L z-l+8$syWBk27I}i8}p$JS44|7H{?SzS3pZO$MJs)d$+v)pZyMdj{O?@AbU4^lcrCC z2?~G$pa3WU3V;Hj04M+ofC8WZC;$q80v}oduQb0y;{QJ)(={aiPYeTz{}Y2D@&6x@ zxe*foCx(H<|B1nn`2UZ(g^36f|0jll#Q%xG;P}7IzLsIX$KJ-aur|k^JHF)D>sVs{ z8~Y>n2-*NIPyiGF1wa8%02BZPKmkwy6aWSOfE3tbvzbsxeG6%_^Ww9qhm55Lapkr2 zxlLYe?QwA^s_qSYxmw=CZ?Wb9OAnTpz*}kH5*7HT@7qV;LSf~f{^QIL3M=E!QDbR| zbVGp0hi?e*`oo;Bmh*YHSn_}k8nBH9Hs=8gB`Qj`)4;_l@Vmc=+&*1uSoCkc?@dml zYQHl$eo+|}_qsgpFpmUt*9Lg+7E>NDqX74DZz)3RDlosLNCkf9#>d~nark#`^w_Xq z;*S7G)yB{MNB2N@a6CTb_iRDW{#W>!fDH<;y4o5rdi1{zj7pSCR##gCM$i6Nfvr0m zP!D_idzl~P6AXdTjUS;fAF2%oJX_Gi|8-z==YkB@m8<~c_`i*f=Z*ifDYOAzpa3WU z3V;Hj04M+ofC8WZC;$q80-yjWFh2!^RsQ0%kxgMRR>2Ubbx8c57zPsmCk8{}|Kc Dm_&+g(_&-z1Fzi$8Yx8Ri c&`JjmFMZifA-!|Slx9 }`O(Y{C7EmNYOe2TcJ Gpd9D-J6c5DqYt_Qqd!k)CSJ&uEup}b>(ujCZmx| zA~~MR#rt)cS|(_l8&b*Rsxs8*jx-I3s@Ikt&TZAytuYmkWa6ayqsj4MMYYMMp2S$Z z(iKCQGU%IPb6YZ&7@Eq9B%7$np7?lVJcFI5DX}9Ji>KNr$0}Wk@r l>UBm^5wxF6we#i8)D=%pj%ISX5S8k{`guHfZQ5um-&R5Ep^eG$ zp# E8G$wBJAM{?|r zPvtUb&nrSjdn2Qh3X;5eNFSEU;r_!NET2p&@ySGS7W!CETh( MWRE6McDP8(ptM<2)EPI@sYH2RV+4G!`aTW3;|3~b1|6XoccR9CoB}d~; z@d@M>>D!v=i7Mh2UT}+)E`3(2-6AJT!`I8Z1!vErKdypq@bvk03L4?z7Pp|`9hR$l z{aRD`7ANfxN&JJ~SKs1VQ(W$J8g5%7_y(upKbP7kIBA}{3C?=C<09VPn2ae7dFtb4 zYdnHRxVeL-dMi37qN|uZ{{H;Bwt9W#<$OsFf%ttDe*WJE<|hpMJbRF39e?Tw*neif z(eAQ+*VbbF2kU98r{u3n_FMk1 k*^DCov)}bXP}?abx!M^vwM) zWbb(F(t}SL(^Kh8d@LLlPS)X6d@OlgTr6fCrI^^Eb+`bIRzNi=;Jr7Wo4M~>ngZgn zMCMBL2dglB9gThip`ZEk3)v?g(a=X?u`97(yB4$aH1_o(`=d|IJ^zG;9SvJkQ&-}j zT7&p4vN+BPvjzE+m;AYo@XtN>?b$b;Q;R>ENK4w#JdEWdu8I+C9kJ?!3)@4Lm-S0k z_Sv)9Q?IEVA4^0tYPYYZx&6RuOkYD&ZY`l#yIr7HIGsw~@51DpXyj`Mx!UOhdCuij z?t`l^H?>1mirgxf3*1VFQ`yri5xYf}#px6rUMD$xHDM<^u;_4sd>-z``Gh~w+4#HY z>J_+2axc^Fg7~dFURz9o3!++2))|X0=>f3RPz31n4IeB zm4saFYJoiGYAW}^rI?%Q>J=il%GCn5($!S Ls{IR97#%bjvfB&OW1dbqtL{)UGb4y1E?GQ(e83(5qc7&?{U`CGTI1$*HccAmnOS z3* T<%aa aqCvq}tUBsjgm#>8Y-E5_+|(1$u?6spS0&FgexLiwL>e)dG3W z)l}|-rI?%Q>N1gA1rzb6pPq%u3oJ C5 z;R1Qi;Z*K}R?JOxxI^StIb7gYI-JUWT?t~(IeeMM;da8Va=1V~4~I|0lM|!yG|n!0 z8-EwQZNaUgdfPU8-!n6JysGy0B$}2{d)rLiz0H`O>TN5bS9@EaS9qIB-d~K#sopLj z Rh^Wi_q)%ZJc zb);~yX@wbGc%dgTqN}>{7K`etuDCBT^Z0EukGw+hRPPMg#EbL*qln6 *v@YSHk;ur1GoWctE;4W-=dgXgnvNY~=xm?w;;-xK4B@u6gH z%r4}vQx9<5-mu$S%LRh5Xbmo9E3FhaDP@KXee;wej({&;$VvNVRElMbRLbhr!W89J zG(|~(VkttTAx|M>BrIgzL}^H_;kj=yk*Y42Bo2-@;YNp~>L6!G0Scjv+L=GP=e;)` z7O#V(`Xtc}Cx}SC780^ Xy?WF)MD ze)~FfKnLy9K*>5-%@sI?_UoYgHBe30$d%fsgYMHnYiSkUuY>k#pfxn;J{@$g2CC6K zSK(eAv_}Kg^qw4auMXO+fo`N#xJL)=(m< 7Y9`&{Z^Oiw?R&16@gj?$klIYoIG=&>cExvj& q-1>FTpjK4HKVH`GY zHvF^U6~hgNYYauq4^cHjjk=c9Yg)2|(vnbv4tk9Snl~_ky;iS-Zqq;)(@MQY2fbPY zb<&{QbkMCD=pq{QY8~_{4YZ5~-Kv9b(LnP~>SLL%(m}%-=mJ`)TXfKn23kskhIP=O z2FlW)AssZJfjVf=pbqNSK=V$8W0?Xvs80hWzq*p=Q0dn}y&9;MR$-qG%4?wHhhp-S z>eWF#8mNU Oi?#2VJj$ zQU}T#bkKDgD0QH`UI(qxK&b=ebvo!;4U{@iuF^r*XrR=A@>(6VQUj$9l-KB>t2I#S zK)F%}b!ni~f%0k{bd?559VokW(3Kh}b)dXT2VJ3oQU}T_b #` z%XQGD8Yp$3yi5nJ&_JmJ<)u345)G6(P_EEH%QaByKzWG{x>y6H4wTDvP^Sh;9Vjo> zK^JMDw1INSse_hjpwyA+A{}(021*^7mg%4iG*IfubfFGfs)15RrVDgXRs*GuOiOi8 zhXzU=nX)>lT?3_#OdUF?O#`KlOzk?TRRg7tOl>-7i3Um?nOb#Fiv~&^nU?6FW(|}& zGPUTS#TqDeWNOwyO&Tb5WLm6)7HOc=k*P@sE!04%Bhw-sRGO2NhFsK KAOMjcd`RK0+I!0=bcFQHHB$kd>LHlW`+BoGNo8JW8A^}oq}m|<^b zS31r+Hrc wq#(LOx!w2r-000F*0Z;%G00lq+PyiGF1wa8& zf$1g1PBg%GE?BjC{mGG&R{Ses=w)_ZJb!U?x|9)@VL$VD_K(kYc69edqnsyD>qh@L zw<~+wso6K~ZRxCwOeE@rb %<>t!qM0BJwT$z30 z^z4IgAbTQ`P9IOEVkiy$P?*=}M`;P^!M>H@p~z@Dek00;9*xoxOIL;u9NJuoSJ#Wi zjW<+A@sroW=pmt-E7O@sW)fw}q$cB=E63vLbYvK9s}!$N?l_aZ>rupy9%~$_43AHa zj@~HWOXqQM-mota_VTrXkeBlXeJ9;Ti- T zP-SM7rpo{08xa(9)mB+{<-co%(XYI5wE?di-BIXAk6 ~ZMfy}3P3*iV(aT=x0fW* WI|2I2>zQPL>00lq+PyiGF z1wa8%02BZPKmkwy6aWQ2r3%;zOlYA2nK>&W2APv8L=`R+62uwDV$l#LK1}%j{{`lk z4eVyeci9IVefIxmKWh86t>5~;tan-0l$ +=SNO7-QG{jTKW zXpfu2PetT?ZWK`q##p(WZ9-2mJAYkTupI@!KB8_u6xPM<@q_{#H{_5@k%Ha7F8Rmr zH+&4GAk}zpt {qVyRMvzZ@6$!{iC!7#i@N^H;;q9ULWV?LVVmNms2mQcJYlR zKmUl{A?0{*Jlw~-L%z_ERW3%7?c#;G!H=am=*O(Qs8f60UfwfQlBb-h8;l=^Y;JU$ zKrM<}h5~`$$s$XssSNL>!}4Bw@xpb71l{=g?xu1?lZ0rqXYQG~ QeQhkagr zGeyYF`FWo&VbmA(C%6CPV=Bt)$F1`5fuN5IGDC%W`CdPB)cBG2QsgEs> #y!Yp9R8FrTaIs0SwJM203YwUyU-Rw 2bEXS@zS>Oc VTO`KsF9=gQCUJ`}u|neh7s)h%81pAnAq6BG znXE7(XW5(=zj4!fG#P{A|4ixU&3(`wPyiGF1wa8%02BZPKmkwy6aWQ40Z;%G$fJM( mrEz)EAqf-!1wa8%02BZPKmkwy6aWQ40Z;%G00lk=3jF_mBO3?+ diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Enum/HubTypeEnum.cs b/Yi.Framework.Net6/Yi.Framework.Common/Enum/HubTypeEnum.cs index d78a7844..e31558f2 100644 --- a/Yi.Framework.Net6/Yi.Framework.Common/Enum/HubTypeEnum.cs +++ b/Yi.Framework.Net6/Yi.Framework.Common/Enum/HubTypeEnum.cs @@ -8,7 +8,14 @@ namespace Yi.Framework.Common.Enum { public enum HubTypeEnum { + /// + /// 在线总数 + /// onlineNum, + ///+ /// 强制退出 + /// + forceOut } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/SeedData/MenuSeed.cs b/Yi.Framework.Net6/Yi.Framework.Model/SeedData/MenuSeed.cs index 19c53633..dae1310f 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/SeedData/MenuSeed.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/SeedData/MenuSeed.cs @@ -45,6 +45,29 @@ namespace Yi.Framework.Model.SeedData }; Entitys.Add(monitoring); + + //在线用户 + MenuEntity online = new MenuEntity() + { + Id = SnowFlakeSingle.Instance.NextId(), + MenuName = "在线用户", + PermissionCode = "monitor:online:list", + MenuType = MenuTypeEnum.Menu.GetHashCode(), + Router = "online", + IsShow = true, + IsLink = false, + IsCache = true, + Component = "monitor/online/index", + MenuIcon = "online", + OrderNum = 100, + ParentId = monitoring.Id, + IsDeleted = false + }; + Entitys.Add(online); + + + + //系统工具 MenuEntity tool = new MenuEntity() { diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/MainHub.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/MainHub.cs index 0fac1551..d1baf01f 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/MainHub.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/MainHub.cs @@ -13,6 +13,9 @@ namespace Yi.Framework.WebCore.SignalRHub { public class MainHub : Hub { + public static readonly ListclientUsers = new(); + + private HttpContext _httpContext; private ILogger _logger; public MainHub(IHttpContextAccessor httpContextAccessor,ILogger logger) @@ -21,7 +24,7 @@ namespace Yi.Framework.WebCore.SignalRHub _logger = logger; } - private static readonly List clientUsers = new(); + /// /// 成功连接 @@ -30,17 +33,19 @@ namespace Yi.Framework.WebCore.SignalRHub public override Task OnConnectedAsync() { var name = _httpContext.GetUserNameInfo(); - var ip = _httpContext.GetClientIp(); - var ip_info = IpTool.Search(ip); - - var loginUser = _httpContext.GetUserEntityInfo(out _); + var loginUser = _httpContext.GetLoginLogInfo(); var user = clientUsers.Any(u => u.ConnnectionId == Context.ConnectionId); //判断用户是否存在,否则添加集合 if (!user && Context.User.Identity.IsAuthenticated) { - OnlineUser users = new(Context.ConnectionId, name, loginUser.Id, ip) + OnlineUser users = new(Context.ConnectionId) { - Location = ip_info.City + Browser= loginUser.Browser, + LoginLocation = loginUser.LoginLocation, + Ipaddr= loginUser.LoginIp, + LoginTime=DateTime.Now, + Os=loginUser.Os, + UserName= name }; clientUsers.Add(users); _logger.LogInformation($"{DateTime.Now}:{name},{Context.ConnectionId}连接服务端success,当前已连接{clientUsers.Count}个"); @@ -67,7 +72,7 @@ namespace Yi.Framework.WebCore.SignalRHub clientUsers.Remove(user); Clients.All.SendAsync(HubTypeEnum.onlineNum.ToString(), clientUsers.Count); //Clients.All.SendAsync(HubsConstant.OnlineUser, clientUsers); - _logger.LogInformation($"用户{user?.Name}离开了,当前已连接{clientUsers.Count}个"); + _logger.LogInformation($"用户{user?.UserName}离开了,当前已连接{clientUsers.Count}个"); } return base.OnDisconnectedAsync(exception); } diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/OnlineUser.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/OnlineUser.cs index d9ce0cc1..8b3259d2 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/OnlineUser.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/OnlineUser.cs @@ -6,26 +6,32 @@ namespace Yi.Framework.WebCore.SignalRHub { public class OnlineUser { + + public OnlineUser() + { + + } + public OnlineUser(string connnectionId) + { + this.ConnnectionId = connnectionId; + } + /// /// 客户端连接Id /// - public string ConnnectionId { get; set; } + public string ConnnectionId { get; } ////// 用户id /// - public long? Userid { get; set; } - public string Name { get; set; } + public long? UserId { get; set; } + public string UserName { get; set; } public DateTime LoginTime { get; set; } - public string UserIP { get; set; } - public string Location { get; set; } + public string Ipaddr { get; set; } + public string LoginLocation { get; set; } + + public string Os { get; set; } + public string Browser { get; set; } + - public OnlineUser(string clientid, string name, long? userid, string userip) - { - ConnnectionId = clientid; - Name = name; - LoginTime = DateTime.Now; - Userid = userid; - UserIP = userip; - } } } diff --git a/Yi.Vue3.X.RuoYi/src/App.vue b/Yi.Vue3.X.RuoYi/src/App.vue index 70ffc223..584591d6 100644 --- a/Yi.Vue3.X.RuoYi/src/App.vue +++ b/Yi.Vue3.X.RuoYi/src/App.vue @@ -5,6 +5,11 @@ diff --git a/Yi.Vue3.X.RuoYi/src/api/monitor/online.js b/Yi.Vue3.X.RuoYi/src/api/monitor/online.js index bd221378..434aadc4 100644 --- a/Yi.Vue3.X.RuoYi/src/api/monitor/online.js +++ b/Yi.Vue3.X.RuoYi/src/api/monitor/online.js @@ -3,7 +3,7 @@ import request from '@/utils/request' // 查询在线用户列表 export function list(query) { return request({ - url: '/monitor/online/list', + url: '/online/pageList', method: 'get', params: query }) @@ -12,7 +12,7 @@ export function list(query) { // 强退用户 export function forceLogout(tokenId) { return request({ - url: '/monitor/online/' + tokenId, + url: '/online/ForceOut/' + tokenId, method: 'delete' }) } diff --git a/Yi.Vue3.X.RuoYi/src/utils/signalR.js b/Yi.Vue3.X.RuoYi/src/utils/signalR.js index 38d100bc..77019867 100644 --- a/Yi.Vue3.X.RuoYi/src/utils/signalR.js +++ b/Yi.Vue3.X.RuoYi/src/utils/signalR.js @@ -2,7 +2,8 @@ import * as signalR from '@microsoft/signalr' import useSocketStore from '@/store/modules/socket' import { getToken } from '@/utils/auth' - +import useUserStore from '@/store/modules/user' +import { ElMessage } from 'element-plus' export default { // signalR对象 @@ -36,6 +37,12 @@ export default { * 调用 this.signalR.start().then(async () => { await this.SR.invoke("method")}) * @returns */ +async close(){ + var that = this; + await this.SR.stop(); +}, + + async start() { var that = this; @@ -62,6 +69,12 @@ export default { const socketStore = useSocketStore(); socketStore.setOnlineNum(data) }); + connection.on("forceOut", (msg) => { + useUserStore().logOut().then(() => { + ElMessage.error(msg); + location.href = '/index'; + }) + }); // connection.on("onlineNum", (data) => { // store.dispatch("socket/changeOnlineNum", data); // }); diff --git a/Yi.Vue3.X.RuoYi/src/views/monitor/online/index.vue b/Yi.Vue3.X.RuoYi/src/views/monitor/online/index.vue index 2ee7b7e5..a031b24e 100644 --- a/Yi.Vue3.X.RuoYi/src/views/monitor/online/index.vue +++ b/Yi.Vue3.X.RuoYi/src/views/monitor/online/index.vue @@ -1,10 +1,10 @@@@ -68,10 +67,12 @@ const { proxy } = getCurrentInstance(); const onlineList = ref([]); const loading = ref(true); const total = ref(0); -const pageNum = ref(1); -const pageSize = ref(10); +// const pageNum = ref(1); +// const pageSize = ref(10); const queryParams = ref({ + pageNum: 1, + pageSize: 10, ipaddr: undefined, userName: undefined }); @@ -80,14 +81,14 @@ const queryParams = ref({ function getList() { loading.value = true; initData(queryParams.value).then(response => { - onlineList.value = response.rows; - total.value = response.total; + onlineList.value = response.data.data; + total.value = response.data.total; loading.value = false; }); } /** 搜索按钮操作 */ function handleQuery() { - pageNum.value = 1; + queryParams.value.pageNum = 1; getList(); } /** 重置按钮操作 */ @@ -98,7 +99,7 @@ function resetQuery() { /** 强退按钮操作 */ function handleForceLogout(row) { proxy.$modal.confirm('是否确认强退名称为"' + row.userName + '"的用户?').then(function () { - return forceLogout(row.tokenId); + return forceLogout(row.connnectionId); }).then(() => { getList(); proxy.$modal.msgSuccess("删除成功");- + @@ -24,17 +24,16 @@ - - {{ (pageNum - 1) * pageSize + scope.$index + 1 }} + {{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }} -+ - @@ -56,7 +55,7 @@ +