From e9bf0c44055c30fe39ae708c8a1f00d6345463be Mon Sep 17 00:00:00 2001 From: "gao.zhiyuan" Date: Thu, 15 Sep 2022 17:54:49 +0800 Subject: [PATCH 01/10] DurationCalc --- api/app/lib/controllers/alarm/app.js | 10 +++++----- api/app/lib/controllers/organization/index.js | 9 ++++++--- api/app/lib/controllers/project/bind.js | 2 +- api/app/lib/controllers/project/index.js | 6 +++--- api/app/lib/controllers/push/config.js | 6 +++--- api/app/lib/middlewares/duration-calc.js | 14 ++++++++++++++ api/app/lib/routes/organization/index.js | 1 - 7 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 api/app/lib/middlewares/duration-calc.js diff --git a/api/app/lib/controllers/alarm/app.js b/api/app/lib/controllers/alarm/app.js index 58fe6e8..3313e79 100644 --- a/api/app/lib/controllers/alarm/app.js +++ b/api/app/lib/controllers/alarm/app.js @@ -89,7 +89,7 @@ async function inspectionList (ctx) { ctx.status = 200; ctx.body = inspectionRes } catch (error) { - ctx.fs.logger.error(`path: ${ctx.path}, error: error`); + ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined @@ -114,7 +114,7 @@ async function notedInspection (ctx) { ctx.status = 204; } catch (error) { - ctx.fs.logger.error(`path: ${ctx.path}, error: error`); + ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined @@ -159,7 +159,7 @@ async function apiError (ctx) { ctx.status = 200; } catch (error) { - ctx.fs.logger.error(`path: ${ctx.path}, error: error`); + ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined @@ -176,7 +176,7 @@ async function apiErrorList (ctx) { ctx.status = 200; ctx.body = [] } catch (error) { - ctx.fs.logger.error(`path: ${ctx.path}, error: error`); + ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined @@ -199,7 +199,7 @@ async function confirmApiError (ctx) { ctx.status = 204; } catch (error) { - ctx.fs.logger.error(`path: ${ctx.path}, error: error`); + ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined diff --git a/api/app/lib/controllers/organization/index.js b/api/app/lib/controllers/organization/index.js index f8c4ba7..fbda0d1 100644 --- a/api/app/lib/controllers/organization/index.js +++ b/api/app/lib/controllers/organization/index.js @@ -5,13 +5,16 @@ async function allDeps (ctx) { try { const models = ctx.fs.dc.models; const { redis } = ctx.app - + const start = moment() let depRes = await redis.get('allDepartments') + console.log(`DurationCalc: 1 用时 ${moment().diff(start, 'milliseconds')}`); if (depRes) { depRes = JSON.parse(depRes) + console.log(`DurationCalc: 2 用时 ${moment().diff(start, 'milliseconds')}`); depRes = depRes.departments + console.log(`DurationCalc: 3 用时 ${moment().diff(start, 'milliseconds')}`); } - + console.log(`DurationCalc: 4 用时 ${moment().diff(start, 'milliseconds')}`); ctx.status = 200; ctx.body = depRes || [] } catch (error) { @@ -147,7 +150,7 @@ async function delAdmin (ctx) { ctx.status = 204; } catch (error) { - ctx.fs.logger.error(`path: ${ctx.path}, error: error`); + ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined diff --git a/api/app/lib/controllers/project/bind.js b/api/app/lib/controllers/project/bind.js index f11651e..f6a4bbd 100644 --- a/api/app/lib/controllers/project/bind.js +++ b/api/app/lib/controllers/project/bind.js @@ -9,7 +9,7 @@ async function bindAnxin2pep (ctx) { ctx.status = 20; } catch (error) { - ctx.fs.logger.error(`path: ${ctx.path}, error: error`); + ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined diff --git a/api/app/lib/controllers/project/index.js b/api/app/lib/controllers/project/index.js index 70af536..88f62b0 100644 --- a/api/app/lib/controllers/project/index.js +++ b/api/app/lib/controllers/project/index.js @@ -12,7 +12,7 @@ async function appList (ctx) { ctx.status = 200; ctx.body = appRes } catch (error) { - ctx.fs.logger.error(`path: ${ctx.path}, error: error`); + ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined @@ -30,7 +30,7 @@ async function projectAnxincloud (ctx) { ctx.status = 200; ctx.body = projectRes } catch (error) { - ctx.fs.logger.error(`path: ${ctx.path}, error: error`); + ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined @@ -48,7 +48,7 @@ async function projectPManage (ctx) { ctx.status = 200; ctx.body = projectRes } catch (error) { - ctx.fs.logger.error(`path: ${ctx.path}, error: error`); + ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined diff --git a/api/app/lib/controllers/push/config.js b/api/app/lib/controllers/push/config.js index 2af88bb..3cbcdb0 100644 --- a/api/app/lib/controllers/push/config.js +++ b/api/app/lib/controllers/push/config.js @@ -37,7 +37,7 @@ async function list (ctx) { ctx.status = 200; ctx.body = listRes } catch (error) { - ctx.fs.logger.error(`path: ${ctx.path}, error: error`); + ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined @@ -68,7 +68,7 @@ async function edit (ctx) { ctx.status = 204; } catch (error) { - ctx.fs.logger.error(`path: ${ctx.path}, error: error`); + ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined @@ -100,7 +100,7 @@ async function state (ctx) { ctx.status = 204; } catch (error) { - ctx.fs.logger.error(`path: ${ctx.path}, error: error`); + ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: typeof error == 'string' ? error : undefined diff --git a/api/app/lib/middlewares/duration-calc.js b/api/app/lib/middlewares/duration-calc.js new file mode 100644 index 0000000..bd338c0 --- /dev/null +++ b/api/app/lib/middlewares/duration-calc.js @@ -0,0 +1,14 @@ +'use strict'; +const moment = require('moment'); + +async function factory (ctx, next) { + try { + const start = moment() + await next() + ctx.fs.logger.log(`DurationCalc: ${ctx.path} 用时 ${moment().diff(start, 'milliseconds')}`); + } catch (error) { + ctx.fs.logger.error(`DurationCalc, error: ${error}`); + } +} + +module.exports = factory; \ No newline at end of file diff --git a/api/app/lib/routes/organization/index.js b/api/app/lib/routes/organization/index.js index 48e17e6..4b26221 100644 --- a/api/app/lib/routes/organization/index.js +++ b/api/app/lib/routes/organization/index.js @@ -1,5 +1,4 @@ 'use strict'; - const organization = require('../../controllers/organization'); module.exports = function (app, router, opts) { From b9d921cdbbe8bf97d4a94f82db6f9590b9c9ee21 Mon Sep 17 00:00:00 2001 From: deartibers <947466799@qq.com> Date: Thu, 15 Sep 2022 17:56:05 +0800 Subject: [PATCH 02/10] wenti xiugai --- .../assets/images/install/table_question.png | Bin 789 -> 19568 bytes .../install/components/adminModal.jsx | 2 +- .../install/components/memberModal.jsx | 2 +- .../src/sections/install/containers/roles.jsx | 43 ++++++----- .../sections/install/containers/system.jsx | 67 ++++++++++++------ 5 files changed, 73 insertions(+), 41 deletions(-) diff --git a/web/client/assets/images/install/table_question.png b/web/client/assets/images/install/table_question.png index 5e3f55d0065ed36ae024e7cea40acc1f59762e4c..cfb8f766752243a0baab7619d11cda5a238535b7 100644 GIT binary patch literal 19568 zcmYhjby$?&_XWy~BMx9NfOHIvG)U*rAT81&(I0cQBY8x$w-U8ML_{YKm0&ZfxjSIxCVe#+ABcSAHy-lv`p2Lvh9K=5R zb>q3))w`yR#{Pr!)y(AA8-hlEI zr5zQL;itj!3o*>6@hFAJfH$?B=#blZX-tMiDQXiBOF3e}KuO3D1p+LJ7jOx+8)D6a z!@Sk8It;LkdC@QleS4pgzpl9itFck|K4}e9LF#}+==@jd{b@CVG$|GR*h+F}*(D%3 zGzc&jrzkt-OVC=RXhN!}1GPwW3_SZ)Yl`Q&*(>_7vlN~4Z@Un2;$X%Ek*5hFn2}>7 zVNC^ARaVl7A~iOK?$mUqMI|jPh1{1^m43*CXt&0A6?Op^UsaJVSO`xzDo^-i;D??e zwMo-WF$f1O0-VEZ_=F$7X5!KC2rlL?bapLJW8l^lU6CI1hls~TIN;}EUGFba6Aj14?qA{G<<(lJi%>KK4P+u~n&uWdvH-YE5 zFJK`VC}`3rPt&c*jpQk73;u{2TDJvGF2>X?_&K;#q0peVt%_k@f*>o;;kHVFW1p4o zK4Zf{pVHD_o6=u1o?+mTBdZr3wCyrB5l)-Si1frjr$1d)L&=5ykYi(FodfDLOxC1Vx2@XAaj z*gvv9X6Hkh#g5=jvBU!pyZ~Ld>U3^$6hWrL^{}gD&2tC*AyjXW)k)qP1ytkXI#0{q z*^wHBrO}~TLs``@{!(;w*>n?$^;O!7suha@zNC+T%RlseXO73Y09)M2e?a@2b;d3) z650BO{QVO`u37)&+egoPlHT5+fv_;Y>SC!Ra7tM(8bS?ewWjQ}4mtbOHCaCA35M9) zb{D~gCw#Kc)$X}m&gz%VWT|u)Ove;9`hb}?D6Oe1Uc6DPYlnqdIH|~6 z#bTsMkGZMtszv4%f?R|4yhL8hu13)1jNvk=H`XI%fD>QCx1=!w6U`Df=BU=Xz+r)1 z5P(2y(Q`YWxvf~xK2?>xz`|shu&gM31b*woXWIToB3DCu#~uql3*Mhv{g z_~1JmC4%x*-C^)8c4&J5MB}l5h8V`)I^8q0kP+u^mi%vDNQ_E%hrvHQJ-{6ZTO;hcj)9d zwD7EMRmoP`%rnYXddwZYAnst23VoaPp%94p@YU?O{nNty{NK@LK;!Inz|($82;XgFe@RtmkY*223ikBzU(>0 zg;82VqmgE9&a-MS45Oat~{9T~{@JuN*2w%VrKlgIf>?US(rj(QX)=1D~H!ARru6@UpjmQ7?Ol z-eqUwNhQ&MK2;CICb;_I;G;fQugo_S0^Z68Gk}UZmA0lWH8>ra$#PS{KPNa7<1G!T zpE)b_pGp&q3Q!pEfSMoqp2TbPP_>Jd8=wH!;OyDxgBAJ`{a^EuvtoI31VfWPp{z)K zrt^%PYKk{O??*3>Mh0l-$;kdenB>AKxn{p}WI!=Nu~?W&k9=7=)0Cgc6K20^rvRaS zWlX+oY6}FNB&hQIGGm05K|yOwOf;opHdi!Z;#MD%sNmUg2HWo31^rT@xO_qEXy&fhp$&7FD4sB2#E;LdM+;*A~4CL0tO&P zvf}f=F0zIrTR$M^vVy`lN>I>x>T2cacm1=RlHcPo@zQ|BTXi5h%Xmq#)gwA01Z2<9 zdZH|qriS~tiLvSl^$A0fz{*u%nB~~%js4%FCSRzMgDx`yNBsozPaJy8j0(aM{K$ca z2tXjj;?`lq-#KrRW1^9CIC1G~Ye%XmmWCM&@e~hN#6j>G#3+Qa(|4%gh&jvpT2%HZ z?zPT0A~3)sLSS&AA4XW(T}tVX1H`^ge8AY9B}$#|Wr>wfhow6ZY9r;`^SXpp@Sb4(11cI9OfO#D*3( z-2qrCLIMnafwHfdR=f1e4IHy1iyFYTh(&^uw>*rQOaYFhY3+c+eS!pRKgII!$RcR2 z`QUU>`EzRu^&PL&DYCFZAExSMHTuNKNgRup3H0{nkco&y*h*nzhZ^2&c!rfR&+uKD>e+cSZ=E7V%%gYhlsb9K;qOrHSIp@o`3qSf`}to=d79bMeekPsv#l&*O3c2Kyo-;Lr76LXEKjbcI7 z2|td~8}dqq!oV8bm;LVhe5VV~^e<9yOnjzf_b;t$)6g7Ra3n<*aa3xop4n+yF$+8v z{TfcEYjP^8bOW4zo^Yh>4cKv%ON-ai5<@zld_6v^x)y2!ZfGI}=_nFCPQM$Iy2J(%VJdME)*t%5 zJP*-OMC6ya=GHGu_Ly1u%Lc!NgMrtgfcs!mn_dIEWMx>-chIEQWBSQ4NQxoJhSU!q zkIN#W&na9_Hclg7kDyqhNt<}v_TZaQc;lc0@kksY2nJ75aC^nNqgGWJlYo*dE1yvv zTG&nVu~};KS1179nuD_Xip2?a0YRiVI)&4lVCuAXnOj7%=w;U1aNrG?z9DGPZz7au z886*UlJyZ?_OOhb^2H*zj>p-b9zF*#zzlBaZnnq_$zunIt1llLFOR}dc1%n{aESid z;05-4vL30G->iGen4*oKVLI?LF!{LK4Go{PQ)d35GqS^KB@$Z zkJ)r6{}w=i7Sagi%{>~#N^ye(JP&5?=M=FA?lUj})9?lK5kCY50jgmhq{n~`cW4Cg zLJ9)`Ak}T^homtSghzG)S19wK>TDZuJUvqUw;l+HW?xKi##FM~q7f;l69b0kMxct^ z0kIPf>?fS1ZFZznvdgLn`Cpe-l04e>pE;+{zhh=v4Jf60x|Z*DyU=?&e!`IA z5m*rgLYKgqXV$>oXMzyBWIg%xsogJ=7k-&h>83o2bb z9H?9ScrhYeI>i&~!4tb;NYyNid7z2<=BfZ(pmv9l-Yj;lSdIF(ELkuG7dfq0@qFDD z3*5Ejjp*Q3YFqMM^J%{99k5Suusfzf8fA4`!$%|OWYYcS^Xz+;!+{%1cy2_7Obp9E z`}feGJR!3u67K8YOObMC&dAKDk=G(e5)Y2CdkT7S{q#rE^+}()Fo>WA5ztUKS`vUe zbXvfC`4H3J1N9PE3eRxqqfAuCDR%V0&3rVQQq-58C$NwN#72VsGf5}Q@tc_H!$B1- z4zu}s8LJ;(KDw^pSUnu{84Nb4|) zQ8lFC0ZLx9MD4O2<%3lyLYT!Dt9=Kx7cyLw7y9`)cc(bo#%9nfBUK^Ki{@0ymm>Vc zi01Wu2Hr^}Yx!ob7_IIK4jhw?#rU6rW0Hk&*|p4*A=5PA4T`LguJkQy=ADJ|_bpwA zB?)Tz@6-qcPC7GUiSCkpHZicU8Pwl)|9(s?X>%2<BxTQyA&Sw<;r$_Qa^Hisa7mqTP4g#}eqV}_#yGQ3 zX6`Baj}@|zX4$ z|9VeAZV%CAv)Z90ExgiPsW9d992snLj5&L$FqU6mkd@Q^o2)ULLI5_jkF(H4ow3Dq zvZPa=tcd+4NriT@b)46-woZu%w3J5fxHY)w_iEmT&Ds7{Z3wi|V)gLG!=h%y$epY1 z=N{Jf*?XSbl^1rOtZBF=}36gF&UZjyC^W|a>Bguo?y2HMlH_6mWF z{I1%dW&DDT`E!%E)CPIYa|<>uAxSGaX>WzB3Q78YZTk!V>-m``F1X`_k2$6z1C|{S zB9;osd@hoSfsExT`_gM})PJ1ep(^5^May}_~ z&(5LPOYWx1wcFfyUu2U?-Y&Bo;^e(eN`a5ux9j$#bS8tTvO^@|8TOWzT43uVb*isI zUXIPXlTlC9Z&n#u%yz>c%Noa7Ws)HRK*B5CZcdaJo@6^=)%NdAE zhR;IcaC)%(%3O&n*|xpdOlO1?2s4LWGIj@mVAlMs*D~h>jE<#f3yiglU6-AgVlY@u zPnfITs;eW|J!_DT?#FM6w|T~gsuF3cKJH8<-tfI@`|v4&QjKA(T;2sbnXgo_a30 zy5Q+hv(MdD%e5{D>8=sb29Nh>3xay-8wq3LiX@ec+mj*d^J8AC*8bX&rcZNT zqiv>gZbYw_@UaUYpIWE5T2FAlK5`KO=V@M-dF*OjiTPxjTP8Jc=_;eZG`n*F(h;v{56ft+94fdNg= zeHOG16n+gR&kPd;?Y9K?QafiV4zpG1>+dxNhhW3rr-Y~D6>mCoB2?xh>T1-w(O^A|POX+eB(|R{_rZipFH{_3ggx7!}RLex25<7JpicFjT?IH3sSr zRpWD0Zvw-p)L^O6vCUjD-xr2IDf}yjj^3fR3XVWT9MdHbu&9Y?uLDIJLfPf_KSvXZ zOJ5PDHTjBn1XL+=Q>{yhwhI77l6|n>Cd63uj@kgfz~-&-;1EPwph#I43uZa~YMYK% z%~0=Z>hlcnboOK0pz!?9d|%y$D6$%@Pfs!YNy~O*d|e9jE6V0qTrEw1{n2zO+>JVd z*%8-m9Z06UUj?&&&~zL}wGAI<8+0V~tx`Ns=Yeyw4Z0<3a~rL_T<}%2PO_YPN_XUr z)=@hTz%wvs>JS|S4KoR-%;pqT>QM*^vSxo<$aC~>LNcV?9kR|S9OH2#5+!`pVI*2_dbg=RNKG^t}ZJk>np>(s0*YAGO`U zZ919iq?W*ankiZmg@i*e6QhZG4c(2w>}^xe!pBOMuF%C6jErl#WWv6ldNWSSGu;(? z@{U7RLksh5-J1=h+{POciwD}O%N?tq9yjv;9Ase!^`6Y3B-cQv2qIi@eLHv(YmYlY zV_Gy_m5yrbX9H(Fy)(A;cP?`$u@fQ|ZiY2j7)3aB^Y;O%Y8PM!00m1csiW4B;+S`X z2wmzPl&ha8)ORf>AIDC--5Lp<866F69f_$(G3u1Eh$InQD;3ftDFX89Rg@~KMI3P| zb*)kCvTjBPkGkA(P)2QBLiu1!tYK=E*{aQaqq1CB2aob)F2hYGFE;4LNo6{R;l6Q8 z3_DOf`(}L%py~mGg@{u|404nVj_Cf>5;s zAXE6X-SvlJifHag-;idR(r&~$#$Dn2f&AawvXNHDRX;$6JU zqJDv_qL*nkqnk1$~#69 z3p)s)i*_PS_P4@y&~3+#E?V1zKQ0+3f9df4J(%n!zdPROnv?sMG&^>pZFIOMgYM(a z-m+>#)VoYBEVqX$C!>MsL(iIEO1NCOW3so`VLMAyv(K%pwlG@^!Q~_pxp@cSZEr!F zaQFxowf-Zvw*A|l`-R!0MVptP4-1raPk-!5gfCN(eF8LWOo)8 zel=gSG!~ay{9&vPQ?O}wq3nmwvK#f20R_RX-S1d)KQ}a}6`n)W<7`y?dSv(t#q49v zaUQmJl|#fe=cWE+o4+Wk8wh@=lQuQpO}CwAUJl<`n}i>HWfOE0yWV$=GIz|?BzwHi zP&_?(m_6~js5QnAz~GN5S=papXiD481Tw>8y+{@}j6|RLckxEG+LoG6T?T$i_qMDa zh!=c%-zQwT*v8w?!up3q%Bv`jKPHjZxp_BntGGMWo@KDTu0h|^+`f1J>L}}gNxZdP zsNL$IS&8DgE}|kKU(9gan;)m(If>(9Jb8<}4WUs%>?`g);VP4#3)O>DmhW{6M;S2o zkN5YyEf3C~JuzRS#A=}Kwsfs&@|g(xJdnprLk&NoSPk!cL0$g~LiJ}u6xN?JNu3RM zUdLav?;l%vOUf#H#_9e2NRf=>mH+G!fq$lN4}J_ zx7RivYdbzOReM3Br0aXvESIYN;!&?Yk};RgxsC`HW^jw`y+VzLhAeON$o$dHtoj8p z&avfaRoQ+mxxgRWdc30IuGr9gJ7?14z0#~wC@EM&ejpyNbD*zi62d)-pVHN!n<+fc zpQ{)gBt}t{z23MX{QG`p1tXNZ&^*?PKnD5JsKiyq3pUOI?^`LH^TguOIVH$FNS9em zCGaQXYG?S`T&n1qayP4f!22EjGD_b)_B@709Y6iYk%d#k6Se!!O`e{XHxPWk&4Kmt zbNoVYQ1aW~xK*R7^nns4R+5V|vawp8C(;L|5ek+gT}EVj*UJeKlHKnE?(graH#nzG z%(*6^3&Lk^a~P=^7YFJe@+7-O?o=r-DVe*9Dj(rhsI?%Cai9A#o+`bfVmEpXmd!tH zwtqKFCDwrLd9qf1AMRz|Zj3NDn&)9Ln&J||^d65kL3%&Zh-Pn;a?xxZTO?Fcp zkjQN4Y^CZ5T2BXc4ah0MUzwBRhkoA1#E4I166ppEDryyXRp8(*doHz-9=# zcwKvhzxjG0eOjF{Hre#1rEKUO0(QbQ_GC73lzpg70i`m@W?a!<(pz)(4**Zv3+>=} z2RM7&Q9}*BNoIf648#6?y4>2pua7hJCxk;GJt0z`&wB1hXSc;uYdv z^|2=cBW1q7$3uR*_-HqM@3)<5wh6F3`VIndt1TCw9Pj7Vmm!U>N&*J9IC!6J8#>4K z%CNCrn?AiO6xs0VY3ZH2#pBDpo>l+sfO;#NoKA+C?Cnwy3pyqqU$7A>e%7 zk7Pt&g&7CJE7i#h-6O&^aJk)8!Zs0Wlx_H}W z09nf*Px?y!oJxty@nTGVS-1E^;WqGo|Ni=5{iRP{jXuNG^>IL)ELmOkZRu&`t+?u6 zyV3DA#jU->8*}kiYOA)i&xOMuZo#f_SsM^u3L|y zJ{C)}uJFn`*kki+#oO(=JCzfm#GI2a_o)f4r8l{^TLqa*pQnQF^uxrXN^Di=H_CLb zF0M4UO~r7Zk=tcBM>}FjCzJ|P%}+%mdcSX>5qo=Wt}tN>?wvk8S!lLhxLRx3VwsUn zy5GT@3%dE~F|zl0Ai`tK*n;BQJMD#cQs29?x}Fc)WXeD3?f^BVP1oH&Qm4LuJB*pBr6I6Fz_+cYxH@z7 z#^B(6{`v2y^cx*Sg{L6gUM0;TpXpfzDVp!)xicB3w^IKh;2PuS8`1Sbjb}@9QU%{P zRH;x}Qpf5(==i7m5M1DO!6o0*6n)2-B-XUsDg2WV#Q6y|H4)jPM&8|U`V%bLJ(W^} zqzSQ_`*Hi4S=O9Kv{Y#mC|;#^yligkb7K2Zg{sIEo1XT>lta9|2lj>!5bRzA(RDUq z)?HxogC(rrhd+_}uGSky@^`@K8WF*j!zljIVCOr?f zto}ihe!GMuKjC<|)LG|7(cSaRcRMFhX9s0;%qoF`d-Z2?87)j}w59V+=5sQP4M`; zk+?(=ClNM#&ZE)lG;Ku1(HK12(uvfpIvwp@Gw-tEA)BF5lf##M&+X5X4QM8+#qTog zx+|n6`jLzT3WyGc)h~D%0EoHHa4nodKuY!4Knv{4OKDmwj$5dXBq7r|ZEeo2y7yQw zNYv-Q+WI9x<8sh1X0jQtt+dR!FZ1}t=33OvrsyL6dVb5f;{#ZbyZ9WrbCyxdycL73 ziuPCFKo~{mg3kD*U?@SezB2z)XJi*pRdQN>$*`5^Wo-X??MAizi-KW;rj=?n!V^2( ze(jpf8zy(g8I-wGEfU^mBo7uCzE%{ZGzIS8+8Q2ezN(Zpt6jS6*BfW(&Z4@Wi$y;e z>nFP$`GgE+YPGVxoCdSoyP;#^7pp*5yK;c(D5Dk+iaSfr)J0w&s!D>Om98PqWgS{= zqQU;(yPcADsijMw+| zTIhFyeR#fWVIT8)wxadNx(khG&P&f4-fU!)eYisMdsIe{WyRFF4_dK&zpJ>;wKSdN zk4Du9L$*HZAyIYJIV1pOlWI)TXSI#cm--9wGp~(iSYyw)>kQ2$KW8c)IU1sDn>rcogIAU zyo|fb60lEB_-_4gONFbmKE`GU^(N{;R;iQt>o39qEMXF(Z4ut26H5kwttZrFw}HN{ z&Xy!oQi`QD1HX^P8+IZ|CdX(mM?WF^t56*!t%NAy*q-gJA6?URVu^rzoTz@4isc6F zWbEDL)GsyTssMXMp73ox#ovvXxwuE`$fUM zFPW-RKeKU9&tQF?@r~&XuuB;3S5*3ZSeU=LdrrNN(vhoC!B6M3oOY6E>K^7_(fAu! zFPgZF-P5G3zR-rm^YEr+aY1wBcO&}MP+($ljCs*b zqKkTO@h-L3{n6D%jQ@}Qlq$=JdGFp#1)#F*k@bls|FiLv**jRlruP|O8z0OLBb>zD ztLGq<^Mq<=^~lGjaoEPQ2xyR#AMT2T)R%D+?4MC*r74b&FafrSBc6bd_qQ^<|3oL$ zY%gvz;(ds36O;F;(wP#Zb>EP_L*X!SB%rxS@wH#061~C%K!0p-djmC>-qr6s#RgqJ zo3B#dQ8v?&N5f+oc_f=$b#X(PsHO*O|5Y{BiV0X$;O7)&$DO{eu61-JHLzFr-Xe$n zJ~syUE|i|JiX>>PXKZ5s=1^1rvq%igV)Et8?P9yy)qHcgF+bk%m-dbObUSUqY8LFS z_bcGBgkih?D#J*d-j~3_31PMQu4C&5LgPkS;o8!_dO9Bu+RVCIs4m=V-zUJDd%q4r zW;J?Q*;>d@)_ed~iFoTz2(t|dUJZT2LgfRdE17q=Ih&Js*SOiLkb4uWuZ!l{8~s@r zhd6O_J0T62rDoBCKC~}RZapG>V?#KmsoMS?UqvBWuF-MYXxv};shJvS-(OBKwfB5f zuO|B3ly=2iw;)`C+>4QVdn-=}d*5$O(c(sV?-$v7tnfmXw$gQr22NUnAqH}5CsOeu!%9^_yZ?PxM0?I_9=n9vxAHcFs=xR zX}$1eV!1kJX_%iX^EC_2{BzrF;o|bq;8a#QUt+9S647cef%q2RFo7<0$QOgGm_I!8 z!qfNGT`)0{@U0sJFWuwf+@IFHI6GjK6~GBr0FL}?<4YU=4rf6I#MhIaXRxwozJE}; zY;UJz(rs-gc=G*|W9Wt6HWiQAP7blE$l-)3K*ZIuE7^OI11tYC3+j&$4Tm$=wsgm< zpS-Ep8m2TCd#XI-Y5j-nNR5OSfB7S!2`!N5-|DTTLlEbY=`PFCb(o+kG>!<@29w!& zx6R+pgC(r}THT6{U#h7s)aM+|EbwWrXdcZP)%|*9Kw%&TerOF|(>NP9LhSFs*2}l z_gCCnxxqud2_abO)bws(BOEOa(&70bJA@cvV6|Yvl)sSRu+nM0e696LS7zN;TW|hq z*QZ&)rQ?mgN)aI@4<$U%6)DU7Y#>$!I4s_xS^B|}&-626_|7U6K8X?duaT0poOh16 z+IqX~n7-4X0BCLIu=J8gz)0TL=f2`kbkX}_o5R|qttp)Ek@n1g_-pWfM&0O1}(aj-BBS+cTLES4e-J@XYh5-?WCTprqR3IZn+s zWLs}#5XFo#d)urR4nqNAkoQ6oSB-~`=%YgL=MT(tuRS&}?lrFV^a|Gz_Ld@uX=&+V zxk|V!7l{Ibm)vf|)?=Q%(sISAFtXvrR(jji?=;(`KcO zm2Yo(yVls^dX!HnGtRv|>)qT+ov(Sg6cw_a^6D+W>$9F1nXg#V=D2?hG+h?1XE;7> z89SqKh>9Sa9u8O;r|-#rMC`mr*@i9Fif)21p%$;MU5|?X z-JVk2g6&R@vV#RC-TNMTxnQcig7*Tc$;d;Cq$5&nf+*P7=kNeq z)#2B6oze}!0lLs~3z&F;JQ9A0`k1J`Q9e^UGllNlP0Zo1@`<&|_By^AWh|U{Bi3i* zKyQ^ysQ*&8?_DOsk=Z5@(aRKI6RN-C5hTpL&3P+LC~-tES#N+m@gsp`=(e-PrKrLf zj8j?u5R~n%M-`xD%3YG8^PiB;(D3>%GGh`^Cs)D@#5Ybt1)ScOv0n-WB@F@%dK!Gb!Q5t-RvQU;7RWYQK!x9M4GG z=b9mL$De30B7TyC^C`24h565$Nn2``MU-d@{DR3c^*K`cwo~>iDr^uD(>g&`nHUWh zB$I=F6tv(OY$dh6^A`4t&#U?62{W&$`=Oromlw-urPkL0Gcjg9={$X6cxN<)vOJXc z&+UGdS4S2IQ4>A)ZBg9f`&%+n%yb%@Fgm<_SL3qbRlB5N&Qmw4L7~I~3W6VvwqRpg zZ0WJE5H9L~?MZ1ouV?<67FGPYF?KFn>K{_zkG+(EhJHSZ|&jL_?jGZj9rZr@{Uh}l+_Q-?O;v{U8z;x9yf80Wk2PdWfF+q8P@u`2-TnCBn-8P?Z18Qc$v z$&nFBPk)EDepxDxS*YJxrj?7qQRiD1x?j4Ja7-X$ zW|NV_2~t6$Dm!N#^VkK-$+OO%!?e8dkJscOLlOpiV_vUOztBXorbHg8O;px|&3}NCxrsQ~4u zKwrIP1lUn<*Kx+RmRmTSpjo@M&U}F*8w(30h$i6eb#3EAoOu+TA>^}d*_J|yVdLfe z=PjiXd_jEC^nu!yah{$D?HOfTEPAvA)N3dj=T`UO{ci~gPcK4SR4=UOSCjb@RG31L zTmRQ+0PUdXE%{+{K1KqV0*s3J&C{_17;kroKhjxAcb38nPc4t%7YIix3hmIsE1vZn zPCD~mEWsxK4Qch(ipj_#%6NT=t~f0(?`++LjKoubnxgpNaI@ZrU@6rT%l8-b|C%V{ zic+>4Pfs&cGaOhMi!ZOMGuda(#t%XB1PSVoqfXMQ_oINpSe5%VjgL6o7))A?@}p_Z z6a%{Pl;E)|iq6w%%x6?!E~>Iq#Yf(5G7g?TO)CA~rUwj)EiDI@O}8<^6qtM<8gkp! zRDzf3(~4M8WfP$8^2;l^}lI z;}jW)6Z}6y!T;Bi2Z%6-AYY-)y1F^^F~sr<7ns@saCzv=e9P5iK`(&ufe8cAlt}8$ zBsgO9e95!MG@cSSPNIPU#Hf!uCHw8P&uo*wo6-ZIK8MFP5x@G*R;(w?Hw0RHK`}sZ z+QPr~gY3PsVo^xaDAhHl27B>&M6NrH?ss*`n1S29eeF}$D*BNyp36_6t*(M)LtamE zZl>h)QH@E-;;~cYAdGJo3pcJ5x8|C&ZA@3?DAR|`@QmgyuLnqj0+Sb{7G5_`jfWe} zsQ*IRQ+idwj0RT5?7MPLeC71k?`ymsfxvy+-4v<5Qllo&CI*2#9ntx_9rv%QO-$@ymt=8-#PNPz_WL)Kn+rIsKE^MrX0yo zjcCN+Ze^n3te=e~(tOw|t=h`;5)C6KCpujmNgguPZ$inh-CTyGTQIpOdAw1a-VqEe z1KrnPs7GDG*X<<7exy`=-nI7U!4!ZCkb_|`gI&y{#{1i?*-Vxk2Fh<$9^&EVF{l5~ ziIdsDA$HG}3L(xufTrg?{!=iHKib&NyJ|06$xnQd7VKAX)=mKS_l>#@+X&G~Un=Jb|b0I)bQlFwiiMPg{P z+OG0?ROv20?~vMo<9=re{7wqc=ub6bs8ca{hOdHS<^YfvVB~7L@Yjl8iC=s3l z`h)M8un0R$5Dn@Q*&!}2`>RGNjlNB}h4^SU{wGU0??@B?LzeJR@_e{JzFz)12ecdQ z4tIbhUH|3njyNb!APQQD3cb8rka%lE{6~h{ogT>l(0ow`asLqHGl0_kJ1Zp4&mE%i z52%MFBk6tsv;@Cn@ly&4S@G6J2*5AYbN=MVTrB4ov+Jrz-#FaJLB}qIZLmvq)OgI& zvG^0{e3Fv`#o)4n#Lr@4T%Y>Jv^;bBA|IRdP7q7zV@@^Q<-DpBZaryPuhazuV$a|( zrY1oPS3&=iqgGGvdBEWh)re|6C^7$Ys)(&ZHkwU_>*HiIqJRI;z3nLHgpi2*k4%$; z9sQ7(FR3gJ_CsWYVjzDnPWKw-Jls-=w1Dmh9jtQ7>7u#b28^7Z+?`#v-3y$z-H|}j zph+rXeK4CwXGLhAPv0FsE8urv8KzEX>>E~1J@A~gn^A2fb!N&!7HjX?x`4d zbbUi~-d1!Hv+Y+6e8E6~%?MBdxj>)s$W7mQ)5!op`u_%nY;TPIy+FJ*2O_Zhdf;py zgZk>%V{!A6P39hOEpuv-C|bq?5&D6Tm;y;6^UdYe;JHg1#P->K|vkw=^K>s)6l*9&xz)ZGJUfF&4)@4o%tOBr9Bjo=Etene#AylatzjdP@4;hI% zBUb)r2N;51D6#RGx5vcc+ei>CJai)bCVR1#>fIBL$Olg$AdCp)lI3b%=~LR#zmHdk zRAqQ{9c6(jGvj}+NJ>Na|91V`6juh=PC+=w?I8DQF1Q4 zB#D=dl>6)aXod2pv*gM@nxA-U0E9<7$ZftX)kBg7t}@l2teY%TEHC$wTuJ)jeqTF) zL@T?D<-qpC2cBl$_qzuop3G~%1w}ezOp!ABJS6EaGMX0HF+gK&!08)>s7yx!%@bC?w1 z!T6#Z-{@a|=pd_!|9OxC$VS)>qf?Ts$380WFryV$+61xTj^rr_GiDeo5opb?dFP0W z#CCJ4$h2SF^|gUCE&TrWQnrA?A~~C9yBZ6 zV}+(7FhmY#B^VHX!K?mGBG%~yob&N3*TKj*ay=!y^Ay z-UYWuy`{1RTs~!Yn~4uF&Y9B22oFUTgD>l!>P!|cXGp-6(Uz8nL;f>g4@uguazua5 z)`2RxfOt;Fp)ud=D)`B~m$i&cITtJz7-y3ELa+4F`(yb4uF%jwei89|K8^?|zT{%4 zo_tDE+QizrP4UW=1?*pwLOL*gy8ks*k$CK<&@>hJ{ew_v^@|trWZLmlHAR3P)w_6O z!RbdqB#vMK_pKDr+HPOSMul}+ZjF(xstz~Soa>)x$jbH^^HYJty}|`-Wu%RE2)<+> z=^`JfRmW7EU`pU#%l|;JokiRge53kCl%Kqb8>P&;JWEy9ms%T=XP;Vm(OCb{sw_s7 zABbIBep#$5>K_}Pvj?nHXzo*hSa_GDBBBJ5_!1*J zy?7>deH%R_W~t-n5OOs_NV5U~8K=!EaueV$S-Eu=tme~4?OQ3L#ohM`oD?4~Wz!TO z1C0dNnKw+V<~AekhN9Pqo)AP#JdLx0`I@28*=l=T*d26N>9M}xRQT}TYgeC3P|DUc z@J)D^gd76F>(GeNh9C92iBL0ahcTv)=t`65XR-OVAK<$=pUaY8)K6P${ zt$4R&U3}0|;`VDC^kQG4JCbZJRZW;d?}__a{Vl#^^dH?)l)UW!M%<)*8o6Db%AOXN zNZQE_!nMqsnK(pvEk2;FGK){I2Iq*U|3?&!N13Ju<56T;u?cfB>$b=&2$Ieoh)qw!7ruPJGERl2MIn>%hJ6TMGv$vt7tw=; z=Gz5I^PdS+;b8{;qdkwytMV9!Ljw?tKg^rD_2yr1rCr+m9{GhYQUOxKlbPzzFwD%(N+@c4jwalT41{b9PH3$u|MmW3|NCoF=Ky{XtY86?{ zXBi#L%rBN3O6*K8j8SsDGO^2V`M4#M;F;`)BKVVCf`ATMjK(?y`?ILq$o56fQeC*( zc7WyZU+C2y7Vk}bjrNP8{`Jm&ZIOhPsKS+2(=nGMqQZ-L_a{?jR*7p}`bL!AinHEe zdLmmP0Ez6E=+xpsOW9OINj(G9lWzWSJ*+=?R&Qz{aH3 zp2@ZmA0$~j-tYh8{9N&6U%DtfmkgN&@KGSy8_et9f*!XiHOQdM%p_BlwI&iLvr`LR>3Z?umG7VB{x z-069UU@7ll1(t@8Lz6_x^o#Z~H;6bI-#?iFq2vum95g`A;2PtR&qT4a&O$WpCaYa{ z_VzP8;fk|NzFG=A7x;giBW_vxb*yN6ZNa~B^WaFx50o69U9o@3;9sZ`WX81(D!LKT z<2++Y&A4_tMw3^Jcr8|fAM+@tP^B?ZcOm@Ax1|Gy>a@n@ZUVEI(c1L+-drk)gan`6amh2?EFWL z=+azxO7B>4*==DaLL6z(0C9uPST7rrnW}Pf7VDx}%?#n)BkbbLQbfg}bO8eqAB(sKTdQm^(y48-=6Pds8zwpozt~YMOge=dC z%x9tN-UM!SG=g)e*v;MWAde{92R;R1`$nVDSyCv@j~^y#u@o_2tpCe_mFqAEbF(bb z)-~n_nco0<`z$y|DYe!K(psPV65jd23*7fdlf~4zE>C->R!GbE$BNQv*AqvVCNW!W zbCIbbuFD6K=fD6#%KxXOsY@1lYc)xmWyO`oRlPUZD{rJa9ro`3m-9bm--Z_H6Ff0# zy->aw6YdbDN#^x9#t0ET0F;CD7xK|COOqs=R6!_RR8`5rLgNB;?_txjfT$slrt0-t zEPz5--x=JFux#0@@~oQe-b4Q>dPw!o)l$+!IU!$c1dYv!q?acug*$c=iX3OKOa zo%o-2*W7slMaq_5e7T~`ZswO7kMo&RwO{Ppl(?RyWytbJOGNAB8DqxQv67xWz)2IzP~@klxWd0DF~ zM9zul9TjJJHIj}%@t<;0ldAW>nil!~|D=no_w+o~0QnyCAHkpyU7!c@P}U+mz!WYN zv`tDLQZw#l!GM&>=Un$Ofpul4#N@xqTp0_~4iiwPnOF^z+L!?HHEPQ>9-Z^gJD^D_ z9q2#VCq>o^kT=*jfh=iDW5(>LItmasZo8W-x%bTCnCeNX;HSs}9m*gST7(|)*Y~Bn zPT-q)KtyL;ybC-0v4c`4@(t7MU!#K12LCkwxIM&CGpiScVPBq!q??|vqepwt=}C%N z`%v}p0XCBZ5;gR$F3$jfP#(xS^Hyy475oiag^)F9|1F?hV^W2oCjjof#>D)H!dMIC zRgasY{Z7VSUW%mSrEi$vZ9&(`ah%xuc=}dBymbJQgby(aE3WSsz^OdL#SBCM@^QK5 z7_E!|2i{-!Kwt2VJgbs!=_hT^al$vl;V+WAEO7LT-sb1f9zY*!x@tKZ7V#6948vP_ zg0(M*0V&XKMyaEB_Iz_Cwx2XDto)i<{t^ayghsc#Bq}sdSk>K1=j6CY47$8ipaQg$ z-J12f`l}&Oo?ztB?>=fq`=9CE=Mv5dNY54;@cXAsMf@8ZDeTnX6l^8j0dgOcbIzzt z2PdG)g$$)p=P(wHF*K*#8-IR8Vc-bvE3CKkG2Eyr9#R)EMGp}bo2I4kC;bX&egheOOMDtZ3BZp3Ps6Vz^`F(EA*&t^eQp$Nd5L4$?>_6j;fR9r0IFU5cYqRh&mlvq@+Bqcl1*gI zxLvS$$w|Pb^8ab$Ov94e_Am~J2TVl3vCIU-fgBRWn^OsjBx>eRMh-cVnrXo?EgK9` zPiRV{rebL2P-KafmZmoknwjQsEVC>dic;x)CQ< zA;~W`sSo>S-#)K9LBEWuw})+jI`AmxLBUyPyJ$ywSwXcBX(08;jfJ!YJndF8-KPx`f*}qI#NnomcjCUJY+NEkpiUft@-1GPMgP8*SXfz#or+ymKl)5wb9O@XH zRDAWpd}LyI&cKklBrr`~p<t*gmy_1!q)0p=;R zRP4ixJ8{|)&R$a3$4xL?>KMp4!pIJ&yY#Xjj`<4EbAWkf3w&plT!{Jeh9ct_}>} zjR=Fi5C)pB4f3=}Z!6}@ZvBa{DLLGTnVg>V4Vs`n2Ac-&1w)lPr)Zc;4*M}|Vxh-^3<+Hxkj0e9K4be^Rbl|F#_GeD^`fpnm$LbcQ@Wr22<%+x^*_`Anl=8O%Ayro zcbVFR*IGKjKn{_+X?;HbCi3#Kp7wI(Q0&pUljWbA2~bJ{^YMD4#rIj_%r#tQx(0h91y#Uf- ztJkcf0iX{4!B$_~6vycw*#owkXI%za{4I(cXHX|44lhX!477xjnRS3DQjxF@B5z^v zPLZhvc}QbF5YXeN(&n!;vR$g(Uatr*G?SL_E9x+bd6ZAJE>h92C|r9b#iJk}`Nj`) zl2K(Um{ZfmhhuA8FO~yn%1t3^r30vLh-R?mji^FFq#iULiF85bH+Flxqr}7TO`otp zsXQ)T-gz2yL}xue9Y~{kQ>=d)(sEE*d!(#Os5c#XYUC;`0F!NA+FO0ewgpl59k5!4 ztNTr{Bh`?Sfl0$hz%N>qjV%BYj3Mjh9H?ur)R^bej`Ss6DvwwIj2LrZeO*1cZsC`C z&G<+sPYydBJk194vHqAUv8}%*>>DIIqh&U?>Zy!HlS7_H6ZbH%T1P7*KQ;TnYRq<} zdhAHlwq8}Xj5Vh@Jbkb1U#0yGmB5b4u})>)Eg*6d2a+o-BUC{Dy;t6P{W;JbFuB{s zb(~bw6X`^Z+HcLa-NUSIB?%r=Z|4GSH-KF#^R8^EBMaVW(&yk3?cfP>4F(>_TO|bl zgOl9}gUb(lgg8-ulY+s6+lPqW=IDE!5fl+aghKE9z_2{Y0~i*-Jf>Sh`~< z*raV~@THwZmFj~kw*0OR+{~;Bz1`Lt|4>-V=ye4PkcQ4SJ2iILxQl1ZGS_aT*?XwO`|A6x-tusGy28f{!5HG-|RBC^*PrG z5FN@Zs_v-C6=5XrhIzPfey8%;@NKl!+9?D;*TgTL8NH0-I6djWqSu=ow}4*Z@oN22 zR~liXM+}RlF#GH0KNZW8!uMRgD(}+2hbahlUVs=ny5-zDu;qbA91b&tolwx9eV!K( zE!7|$Zd;1jp#FU*3`OTI>M&w;-TD!4q`Y>;0Pw#DAI)^Iw5 zEdTrg52YL_nln`bI27jwnY0xLCuMK`zVM~^wxh7i5!uZH zeXO~=@_Y55*MQD1^C_N_ZJ@cP^8Dz;uX2*Gi`4gX$g_#<0lSfs#~nw?6&jP>WLl=X z-~U0O?q4`O6BWl{nS%Asa7i`?ut9Ix|3Idy$SU&LRvRM&QD@TTZo4r2nU4fR|- zE%Iv8&i^W-^WhAg0?sWDc~s?j?9 z)$=HFTjt)y+P}_mdT-os_s+~EdB@<4>;C$-_LX}tsSoL;zYFhwZBmwP;w&DQ94QOV ov6RuZAB?Qm{t&rZpY;*`-Rv&Dj7@D|q9Nd7`2;fLUNM5d0m~y)G5`Po literal 789 zcmV+w1M2*VP)Px%&q+ilOHo#YHO|f$5mFHJ(1TFD_y-7r5B&iV zB>e$B1QtP$y;R^^4?&R;?#$kuO|nuc!YJP~LL+r|=foY|8h3T(YO(iW9_F5NzH`p~ z&JTjd$!6c2V)nb3{j(r6F;k;bBjPDAz7dI6L}Dw29G{|Pg8Zv?EY zLxgF9xNKR*%dnjl5iWy0V@BP-fQ3K{1aTn@`Ufyb<3b_(uaQ-ykT8u+b?I_?{{lL> zVVyT4;42fo4M@U#f`R>U*-&q4+wG?V9raOcgzrC!R-{Qv@HN{s2g7oXlwDk++W@yj z>I-pIu{Qv8Tsam){h9hYVHk!nDW%-boH(;o2Bp`gY5wp$uVt~od4PAWSq_A8+cH~8 z6?MrkdQsj9q8`g?zhBAVFcULwt_RHbqUxPZ?K!0Hbw< zEMcs}GLK3r4;D-K811;|C&!V`88{c6f9ebFeZI3A3vJ8Xlh5aOEG(A3N7*6Z1v#!9 zXU5?;rmb;bB8WcQHtxD^?xN59G!l?7K^Z4E3-H$U0upEhpkCWHhDS$7>*s#X4*{@a zm_D~5Kq4C6+pz0=DwUe|Jg=cpJ@qe?3NH3tzLft*mvz zyC6cwab0KBHW0KnrJ&cmmrWB**=gfI;AqzS0_I@9i9O-w9Vly#CxGSz)gN1GJd5vj zYPf1V1%T@tz{TZ=l5vr#2EXb6R*E%UG0L9Sbcrg1)^tq_ze&v&;YuR>&sG07G%tB* TWmO){00000NkvXXu0mjf=z?hZ diff --git a/web/client/src/sections/install/components/adminModal.jsx b/web/client/src/sections/install/components/adminModal.jsx index 98a7b8c..b219735 100644 --- a/web/client/src/sections/install/components/adminModal.jsx +++ b/web/client/src/sections/install/components/adminModal.jsx @@ -77,7 +77,7 @@ function adminModal (props) {
-
成员成为管理员后拥有平台所有权限和项目,不再拥有成员角色。
+
成员成为管理员后,拥有平台所有权限和项目,成员的普通角色会被禁用。
-
成员成为管理员后拥有平台所有权限和项目,不再拥有成员角色。
+
成员成为管理员后,拥有平台所有权限和项目,成员的普通角色会被禁用。
{ title: (
数据分析师 - +
@@ -103,7 +103,7 @@ const Roles = (props) => { title: (
售后运维 - +
@@ -135,8 +135,8 @@ const Roles = (props) => { }, { title: (
- 资源管理员 - + 资源管理者 +
@@ -169,7 +169,7 @@ const Roles = (props) => { title: (
客户服务 - +
@@ -209,11 +209,12 @@ const Roles = (props) => { {row?.disabled ? ( ) : ( { }) }} > - + )} +
+ +
+ 111 +
+ + + ) } function mapStateToProps (state) { - const { auth, global, members, webSocket } = state; - return { - // loading: members.isRequesting, - // user: auth.user, - // actions: global.actions, - // members: members.data, - // socket: webSocket.socket - }; + const { auth, global, members } = state; + return { + // loading: members.isRequesting, + user: auth.user, + actions: global.actions, + // members: members.data, + }; } export default connect(mapStateToProps)(Example); From a33a14757212bf6289461271c8f742a9ad01eef0 Mon Sep 17 00:00:00 2001 From: deartibers <947466799@qq.com> Date: Thu, 15 Sep 2022 18:23:50 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E8=AF=AD=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/sections/install/actions/roles.js | 10 ++++++-- .../install/components/adminModal.jsx | 8 +++---- .../install/components/memberModal.jsx | 23 +++++++++++++------ .../src/sections/install/containers/roles.jsx | 7 +++--- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/web/client/src/sections/install/actions/roles.js b/web/client/src/sections/install/actions/roles.js index 20c078d..3ff9be4 100644 --- a/web/client/src/sections/install/actions/roles.js +++ b/web/client/src/sections/install/actions/roles.js @@ -27,8 +27,10 @@ export function getOrganizationUser (query) {//获取成员列表 } export function putOrganizationUser (data) {//更新成员状态 let pomsUserId = '' + let msg = '' if (data) { pomsUserId = data.pomsUserId + msg=data.msg } return (dispatch) => basicAction({ @@ -37,12 +39,16 @@ export function putOrganizationUser (data) {//更新成员状态 data, actionType: "PUT_ORGANIZATIONUSER", url: `${ApiTable.putOrganizationUser.replace("{pomsUserId}", pomsUserId)}`, - msg: { option: "更新成员状态" }, //更新成员状态 + msg: { option: msg }, //更新成员状态 reducer: {}, }); } export function postOrganizationUser (data) {//添加/编辑成员 + let msg = '' + if (data) { + msg=data.msg + } return (dispatch) => basicAction({ type: "post", @@ -50,7 +56,7 @@ export function postOrganizationUser (data) {//添加/编辑成员 data, actionType: "POST_ORGANIZATION_USER", url: `${ApiTable.postOrganizationUser}`, - msg: { option: "添加/编辑成员" }, //添加/编辑成员 + msg: { option: msg }, //添加/编辑成员 reducer: { name: "" }, }); } diff --git a/web/client/src/sections/install/components/adminModal.jsx b/web/client/src/sections/install/components/adminModal.jsx index b219735..a6a8729 100644 --- a/web/client/src/sections/install/components/adminModal.jsx +++ b/web/client/src/sections/install/components/adminModal.jsx @@ -43,16 +43,16 @@ function adminModal (props) { .then((values) => { if (adminEdit) { dispatch(install.deteleOrganizationAdmin(editObj.id)).then( - dispatch(install.postOrganizationUser({ role: ['admin'], pepUserId: values.pepUserId })).then((res) => {//获取项企(PEP)全部部门及其下用户 - if(res.success){ + dispatch(install.postOrganizationUser({ role: ['admin'], pepUserId: values.pepUserId, msg: '修改管理员' })).then((res) => {//获取项企(PEP)全部部门及其下用户 + if (res.success) { close(); } }) ) } else { - dispatch(install.postOrganizationUser({ role: ['admin'], pepUserId: values.pepUserId })).then((res) => {//获取项企(PEP)全部部门及其下用户 - if(res.success){ + dispatch(install.postOrganizationUser({ role: ['admin'], pepUserId: values.pepUserId, msg: '新增管理员' })).then((res) => {//获取项企(PEP)全部部门及其下用户 + if (res.success) { close(); } }) diff --git a/web/client/src/sections/install/components/memberModal.jsx b/web/client/src/sections/install/components/memberModal.jsx index c3e9393..f5542d0 100644 --- a/web/client/src/sections/install/components/memberModal.jsx +++ b/web/client/src/sections/install/components/memberModal.jsx @@ -57,15 +57,24 @@ function memberModal (props) { form.current .validate() .then((values) => { - let roleArr=JSON.parse(JSON.stringify(values.role)) + let roleArr = JSON.parse(JSON.stringify(values.role)) if (roleArr.indexOf('admin') != -1) { - roleArr.splice(roleArr.indexOf('admin'),1) + roleArr.splice(roleArr.indexOf('admin'), 1) + } + if (memberEdit) { + dispatch(install.postOrganizationUser({ role: roleArr, pepUserId: values.pepUserId, msg: '修改成员' })).then((res) => {//获取项企(PEP)全部部门及其下用户 + if (res.success) { + close(); + } + }) + } + else{ + dispatch(install.postOrganizationUser({ role: roleArr, pepUserId: values.pepUserId, msg: '新增成员' })).then((res) => {//获取项企(PEP)全部部门及其下用户 + if (res.success) { + close(); + } + }) } - dispatch(install.postOrganizationUser({ role: roleArr, pepUserId: values.pepUserId })).then((res) => {//获取项企(PEP)全部部门及其下用户 - if(res.success){ - close(); - } - }) }) } function handleCancel () { diff --git a/web/client/src/sections/install/containers/roles.jsx b/web/client/src/sections/install/containers/roles.jsx index 84f175c..b391a03 100644 --- a/web/client/src/sections/install/containers/roles.jsx +++ b/web/client/src/sections/install/containers/roles.jsx @@ -211,7 +211,7 @@ const Roles = (props) => { theme="borderless" style={{ color: '#F31C1C' }} onClick={() => { - dispatch(install.putOrganizationUser({ pomsUserId: row?.id, disabled: !row?.disabled })).then(() => getUserList()) + dispatch(install.putOrganizationUser({ pomsUserId: row?.id, disabled: !row?.disabled,msg:'更新成员状态' })).then(() => getUserList()) }} > 已禁用 @@ -223,7 +223,7 @@ const Roles = (props) => { showArrow={true} position="topRight" onConfirm={() => { - dispatch(install.putOrganizationUser({ pomsUserId: row?.id, disabled: !row?.disabled })).then(() => { + dispatch(install.putOrganizationUser({ pomsUserId: row?.id, disabled: !row?.disabled,msg:'更新成员状态' })).then(() => { getUserList(); }) }} @@ -247,7 +247,7 @@ const Roles = (props) => { showArrow={true} position="topRight" onConfirm={() => { - dispatch(install.putOrganizationUser({ pomsUserId: row?.id, deleted: true })).then(() => { + dispatch(install.putOrganizationUser({ pomsUserId: row?.id, deleted: true,msg:'删除成员' })).then(() => { if (page.current > 0 && mylimits.current < 2) { setQuery({ limit: 10, page: page.current - 1 }) } else { @@ -276,7 +276,6 @@ const Roles = (props) => { dispatch(install.getOrganizationDeps()).then((res) => {//获取项企(PEP)全部部门及其下用户 setPepList(res.payload.data) }) - getUserList() }, []) function getUserList () { let searchData = { ...query, role: roleChoose } From b9d0d1620c9245f7a309989de0f779679fbc74b4 Mon Sep 17 00:00:00 2001 From: "gao.zhiyuan" Date: Thu, 15 Sep 2022 19:20:41 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E5=88=A4?= =?UTF-8?q?=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/lib/controllers/organization/index.js | 2 +- api/app/lib/controllers/project/index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/app/lib/controllers/organization/index.js b/api/app/lib/controllers/organization/index.js index fbda0d1..c06b9e2 100644 --- a/api/app/lib/controllers/organization/index.js +++ b/api/app/lib/controllers/organization/index.js @@ -80,7 +80,7 @@ async function editUser (ctx) { ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { - + message: typeof error == 'string' ? error : undefined } } } diff --git a/api/app/lib/controllers/project/index.js b/api/app/lib/controllers/project/index.js index 88f62b0..85062af 100644 --- a/api/app/lib/controllers/project/index.js +++ b/api/app/lib/controllers/project/index.js @@ -43,7 +43,7 @@ async function projectPManage (ctx) { const models = ctx.fs.dc.models; const { clickHouse } = ctx.app.fs - const projectRes = await clickHouse.projectManage.query(`SELECT * FROM t_project WHERE project_state = 4 ORDER BY id DESC`).toPromise() + const projectRes = await clickHouse.projectManage.query(`SELECT id, project_name FROM t_pim_project WHERE isdelete=0 ORDER BY id DESC`).toPromise() ctx.status = 200; ctx.body = projectRes From fd708308a6a1ec97929ea7a20da2a97775e4c753 Mon Sep 17 00:00:00 2001 From: "gao.zhiyuan" Date: Thu, 15 Sep 2022 19:24:22 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E7=AE=A1=E7=90=86&=E6=88=90=E5=91=98?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/lib/controllers/organization/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/app/lib/controllers/organization/index.js b/api/app/lib/controllers/organization/index.js index c06b9e2..e832813 100644 --- a/api/app/lib/controllers/organization/index.js +++ b/api/app/lib/controllers/organization/index.js @@ -96,7 +96,7 @@ async function putUser (ctx) { } }) - if (existUserRes && existUserRes.role.includes('admin') && !disabled) { + if (existUserRes && existUserRes.role.includes('admin') && disabled == false) { throw '成员不能既是管理员又是普通成员' } From 5e35bfb2627b06d545ef905fedc63faf6eca0b63 Mon Sep 17 00:00:00 2001 From: deartibers <947466799@qq.com> Date: Thu, 15 Sep 2022 19:24:31 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/client/src/sections/install/containers/roles.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/client/src/sections/install/containers/roles.jsx b/web/client/src/sections/install/containers/roles.jsx index b391a03..070b1f2 100644 --- a/web/client/src/sections/install/containers/roles.jsx +++ b/web/client/src/sections/install/containers/roles.jsx @@ -339,7 +339,7 @@ const Roles = (props) => {
3?'none':'flex' }}> { idx > 2 ? ( From 580d7a999843adc4654203cf6477109b98089ef9 Mon Sep 17 00:00:00 2001 From: "gao.zhiyuan" Date: Thu, 15 Sep 2022 19:55:38 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E7=A6=81=E7=94=A8=E6=88=90=E5=91=98?= =?UTF-8?q?=E7=A6=81=E6=AD=A2=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/.vscode/launch.json | 1 + api/app/lib/controllers/auth/index.js | 2 +- api/app/lib/controllers/organization/index.js | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/api/.vscode/launch.json b/api/.vscode/launch.json index 8903b20..7bac2dd 100644 --- a/api/.vscode/launch.json +++ b/api/.vscode/launch.json @@ -29,6 +29,7 @@ // "--qndmn http://resources.anxinyun.cn", "--qndmn http://rhvqdivo5.hn-bkt.clouddn.com", "--clickHouseUrl http://10.8.30.71", + // "--clickHouseUrl https://clickhouse01.anxinyun.cn/play", "--clickHousePort 30123", "--clickHouseAnxincloud anxinyun", "--clickHousePepEmis pepca", diff --git a/api/app/lib/controllers/auth/index.js b/api/app/lib/controllers/auth/index.js index d038b79..bd67e02 100644 --- a/api/app/lib/controllers/auth/index.js +++ b/api/app/lib/controllers/auth/index.js @@ -29,7 +29,7 @@ async function login (ctx, next) { if (!pomsRegisterRes) { throw '你还不是飞尚运维中台成员,请联系管理员添加权限' } else if ( - pomsRegisterRes.disable && (!pomsRegisterRes.role || !pomsRegisterRes.role.includes('admin')) + pomsRegisterRes.disabled && !pomsRegisterRes.role.includes('admin') ) { throw '当前账号已禁用' } diff --git a/api/app/lib/controllers/organization/index.js b/api/app/lib/controllers/organization/index.js index e832813..87c22c2 100644 --- a/api/app/lib/controllers/organization/index.js +++ b/api/app/lib/controllers/organization/index.js @@ -29,14 +29,14 @@ async function allDeps (ctx) { async function editUser (ctx) { try { const models = ctx.fs.dc.models; - const { pepUserId, role = [], correlationProject = [] } = ctx.request.body + const { pomsUserId, pepUserId, role = [], correlationProject = [] } = ctx.request.body const existUserRes = await models.User.findOne({ where: { pepUserId } }) - if (existUserRes && !existUserRes.deleted && !pepUserId) { + if (existUserRes && !existUserRes.deleted && !pomsUserId) { // 新增已存在未删除 throw '人员账号已添加' } From 543a79cc26b4b7a51a688bd142ee4748023b9414 Mon Sep 17 00:00:00 2001 From: deartibers <947466799@qq.com> Date: Thu, 15 Sep 2022 20:02:16 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/client/src/sections/install/components/memberModal.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/client/src/sections/install/components/memberModal.jsx b/web/client/src/sections/install/components/memberModal.jsx index f5542d0..e020ff3 100644 --- a/web/client/src/sections/install/components/memberModal.jsx +++ b/web/client/src/sections/install/components/memberModal.jsx @@ -62,7 +62,7 @@ function memberModal (props) { roleArr.splice(roleArr.indexOf('admin'), 1) } if (memberEdit) { - dispatch(install.postOrganizationUser({ role: roleArr, pepUserId: values.pepUserId, msg: '修改成员' })).then((res) => {//获取项企(PEP)全部部门及其下用户 + dispatch(install.postOrganizationUser({ role: roleArr,pomsUserId: editObj.id, pepUserId: values.pepUserId, msg: '修改成员' })).then((res) => {//获取项企(PEP)全部部门及其下用户 if (res.success) { close(); } From 8a82fc82bc024bf9be8304ab2da0df4eb905e8a6 Mon Sep 17 00:00:00 2001 From: deartibers <947466799@qq.com> Date: Thu, 15 Sep 2022 20:07:26 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E8=AF=AD=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/client/src/sections/install/actions/roles.js | 12 +++++++++--- .../src/sections/install/components/adminModal.jsx | 2 +- web/client/src/sections/install/containers/roles.jsx | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/web/client/src/sections/install/actions/roles.js b/web/client/src/sections/install/actions/roles.js index 3ff9be4..6081910 100644 --- a/web/client/src/sections/install/actions/roles.js +++ b/web/client/src/sections/install/actions/roles.js @@ -60,14 +60,20 @@ export function postOrganizationUser (data) {//添加/编辑成员 reducer: { name: "" }, }); } -export function deteleOrganizationAdmin(orgId) { +export function deteleOrganizationAdmin(data) { + let pomsUserId = '' + let msg = '' + if (data) { + pomsUserId = data.id + msg=data.msg + } return (dispatch) => basicAction({ type: "del", dispatch: dispatch, actionType: "DEL_ORGANIZATION_ADMIN", - url: `${ApiTable.deteleOrganizationAdmin.replace("{pomsUserId}", orgId)}`, - msg: { option: "删除管理员" }, //删除管理员 + url: `${ApiTable.deteleOrganizationAdmin.replace("{pomsUserId}", pomsUserId)}`, + msg: { option: msg }, //删除管理员 reducer: {}, }); } \ No newline at end of file diff --git a/web/client/src/sections/install/components/adminModal.jsx b/web/client/src/sections/install/components/adminModal.jsx index a6a8729..6a03bf5 100644 --- a/web/client/src/sections/install/components/adminModal.jsx +++ b/web/client/src/sections/install/components/adminModal.jsx @@ -42,7 +42,7 @@ function adminModal (props) { .validate() .then((values) => { if (adminEdit) { - dispatch(install.deteleOrganizationAdmin(editObj.id)).then( + dispatch(install.deteleOrganizationAdmin({id:editObj.id,msg:''})).then( dispatch(install.postOrganizationUser({ role: ['admin'], pepUserId: values.pepUserId, msg: '修改管理员' })).then((res) => {//获取项企(PEP)全部部门及其下用户 if (res.success) { close(); diff --git a/web/client/src/sections/install/containers/roles.jsx b/web/client/src/sections/install/containers/roles.jsx index 070b1f2..81fdcbc 100644 --- a/web/client/src/sections/install/containers/roles.jsx +++ b/web/client/src/sections/install/containers/roles.jsx @@ -400,7 +400,7 @@ const Roles = (props) => { showArrow={true} position="topRight" onConfirm={() => { - dispatch(install.deteleOrganizationAdmin(item?.id)).then(() => getUserList()) + dispatch(install.deteleOrganizationAdmin({id:item.id,msg:'删除管理员'})).then(() => getUserList()) }} >
From cb329979b777589ed9b4edb03e2949704bd215de Mon Sep 17 00:00:00 2001 From: deartibers <947466799@qq.com> Date: Thu, 15 Sep 2022 20:46:20 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/sections/install/containers/roles.jsx | 14 +++++++------- web/client/src/sections/install/style.less | 7 +++++++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/web/client/src/sections/install/containers/roles.jsx b/web/client/src/sections/install/containers/roles.jsx index 81fdcbc..1688a12 100644 --- a/web/client/src/sections/install/containers/roles.jsx +++ b/web/client/src/sections/install/containers/roles.jsx @@ -37,7 +37,7 @@ const Roles = (props) => {
{ row.departments.length > 1 ? ( - +
+{row.departments.length - 1}
@@ -103,7 +103,7 @@ const Roles = (props) => { title: (
售后运维 - +
@@ -136,7 +136,7 @@ const Roles = (props) => { title: (
资源管理者 - +
@@ -169,7 +169,7 @@ const Roles = (props) => { title: (
客户服务 - +
@@ -321,8 +321,8 @@ const Roles = (props) => { { roleAssignment.map((item, index) => { return ( -
@@ -343,7 +343,7 @@ const Roles = (props) => { }}> { idx > 2 ? ( - +
...
diff --git a/web/client/src/sections/install/style.less b/web/client/src/sections/install/style.less index 3c0376c..af16fde 100644 --- a/web/client/src/sections/install/style.less +++ b/web/client/src/sections/install/style.less @@ -14,3 +14,10 @@ } } } +.adminTop{ + box-shadow: 0px 0px 12px 2px rgba(220,222,224,0.2); + transition: box-shadow 0.5s ease; +} +.adminTop:hover{ + box-shadow: 0px 0px 12px 2px rgba(130, 131, 133,0.5); +} \ No newline at end of file