From a9cf115812ded24d7ad22fb132b202feec4fb638 Mon Sep 17 00:00:00 2001 From: liliangjie123 <1206859171@qq.com> Date: Mon, 5 Sep 2022 00:49:10 +0800 Subject: [PATCH 1/3] v1.0.1 --- DataShowGUI.jar | Bin 65113949 -> 65115408 bytes pom.xml | 2 +- .../controller/ConnectionPoolController.java | 11 +- .../HandleDataSourceController.java | 13 ++- .../OpenGaussDataBaseController.java | 30 ++++- .../controller/UploadFileController.java | 32 +----- .../service/ConnectionPoolService.java | 3 +- .../service/ConnectionPoolServiceImpl.java | 34 ++++-- .../service/HandleDataSourceService.java | 4 +- .../service/HandleDataSourceServiceImpl.java | 7 +- .../service/OpenGaussDataBaseService.java | 2 +- .../service/OpenGaussDataBaseServiceImpl.java | 16 ++- .../com/huawei/datashow/util/MyException.java | 11 ++ .../com/huawei/datashow/util/SQLUtil.java | 11 +- .../datashow/util/fileUtils/CSVUtil.java | 2 + .../datashow/util/fileUtils/YAMLUtil.java | 12 +- .../css/addsourcedata/addsourcedata.css | 4 +- .../src/assets/css/datasource/datasource.css | 4 - .../css/dialog/dialog-form/dialog-form.css | 4 + .../vue/src/assets/css/echarts/echarts.css | 4 +- .../assets/css/uisourcedata/uisourcedata.css | 6 + .../vue/src/assets/database-2-line.svg | 1 + .../vue/src/assets/folder-upload-line.svg | 1 + .../vue/src/assets/language/local_en.json | 37 +++++-- .../vue/src/assets/language/local_zh.json | 39 +++++-- .../src/components/addsourcedata/index.vue | 32 ++---- .../vue/src/components/datasource/index.vue | 52 ++++++++- .../components/dialog/dialog-form/index.vue | 38 ++++++- .../vue/src/components/echarts/Pie.vue | 8 +- .../vue/src/components/echarts/Radar.vue | 8 +- .../vue/src/components/echarts/YBar.vue | 83 ++++++++------ .../components/echarts/mixin/normal/normal.js | 104 ++++++++++++++---- .../src/components/echarts/mixin/ybar/ybar.js | 65 ++++++++++- .../vue/src/components/echarts/normal.vue | 50 +++++++-- .../vue/src/components/login/index.vue | 70 +++++++----- .../src/components/processeddatas/index.vue | 3 +- .../vue/src/components/sourcedata/index.vue | 2 +- .../vue/src/components/uisourcedata/index.vue | 13 +++ .../index.vue | 35 +++++- .../src/components/uploadtxtfile/index.vue | 42 ------- .../components/uploadxlsorxlsxfile/index.vue | 29 +++++ .../huawei/datashow/vue/src/router/index.js | 11 +- .../huawei/datashow/vue/src/store/index.js | 4 + 43 files changed, 655 insertions(+), 284 deletions(-) create mode 100644 src/main/java/com/huawei/datashow/util/MyException.java create mode 100644 src/main/java/com/huawei/datashow/vue/src/assets/database-2-line.svg create mode 100644 src/main/java/com/huawei/datashow/vue/src/assets/folder-upload-line.svg rename src/main/java/com/huawei/datashow/vue/src/components/{uploadcsvfile => uploadcsvortxtfile}/index.vue (53%) delete mode 100644 src/main/java/com/huawei/datashow/vue/src/components/uploadtxtfile/index.vue diff --git a/DataShowGUI.jar b/DataShowGUI.jar index 0f7629ea09462234714661e01d004934bded9075..ff39467a3e0c13a4f22de7050af2971493814774 100644 GIT binary patch delta 36074 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 delta 34689 zcmZ7718^ll+bH1Jwr$(o*iJUK?QC?SjW@P!+qP{x8#}wf-n0ANTlfFJR6SLFPWMbs zbx+URGxJVdMJVxhPAD;wvK%-B1_%rc3`i;&xkl=pbS*E$zfwR+6Gfn7vm@wD132)D zRO3cau78D$Mo=N}6yP_gO`v3{AB~`>|L+s~zd}b7C~c}!6DZQZPk~Lq&HlCqe$D-_ z@Yn>(i~9Fpfc%d?%v9%QP#na+zXlEj1P0{qulc(PSt`nd3izGAl+>??B!*IKr=jd-=V4Iz zHh#SOC^4N7cLam;)_Sv>V*3sR$S=y7KeM+~);`EVJ+RTwR7^McZ`6nsHXj*v>Q>#P z^tq5eoSMzUGyh5sRW!-Y%)2i;TnI`kp-<`i%C)6L%=* z+L`qpfc`>JA6=d3itqaII%Z@vKMWD5xA1H4KuhvkDH|a4N2VtsQ`+Osm~5E77gSje z8U_~@Y&7vVa9~V8K|uchvGI2RHQGT%0U1Z$-CNK@)TAP10;C$4U3_;2mpQXY&s0(& zuQxp7n2N=iWbt-aBkcT*I~dHxm1T}77=%+TIGQX2D_Qk8`Ei>E0Tg+v1JD#RIvbR> z9uss0RQ-K8GoOr6TBsTk$a=#1kGCEyCLhy?Iv+#uMLi9EB+i*LvC;u9A9lsq=lINaO?lrj(; zcHz-lCkTaiwlUU|=)j(w@d*rj0`6$DFZV}jL6pmEC2EZmd%ay{KN%WeHA5yYLPZXc z1T7CojLs-5p{Y0XLHo5-*8Rrl0LvSG3;D@2VNF#-E-efXk3!;p>*9}qkOJ$4Z|USU z*o{&grT|5S@`1yR%6A(-!QF5Ue-kx)DPd7kv^RV~475()o(+baVFB8A>zjyv9d*Bq zSuA=LCaEiciJ*)S;1$KD*`zEd5-FttH^XoeH?tPbn0nEG+O{DDE z$%^nHJO}Nay%XWx;60Xv6;d4^j4KtOwCB~-eLq(k#Ntnv@n(oZbfrO zUB)7m^UozTT3NLX;EcF0Wc>JZ$ozNARXVzuHi5&P3;th2{=a4@7x19?lDgCDj*?qv zzYh-mcZx%_R(FDih5eg7z`4c>V{F06#?8xN-0CC-b_Na*Uzj7>)qi^#c;TT-@Q7Od zbsOhjrbsoDmsh&T{j=TOU5{`4d@AI;|7?{-sYAx45cQpa;<@^p$b^D2`u_DP8I&8B zOHJ5dkjCJfG52oDAtLiNW5Gz|%ytPscf#*|w-rO2w<*E_FC^XCEXlI=i&xwpuoq69 zj%umitSw*J_g3;Zc~1`3dkDB2FMo34#*zJ0mu=^ z3COvXchY6-U(jfUz;K0|`qwY0d#-X@|M~@3qD>9&a{KqG)w0`-8}wg`{2n)t|CI3h z+{EzywFMp>w7GvA_rXb8%QxH*oc=XzlXVYp_!pdjoBZDhw(hhKj@cU8?tTFJuLii= ze>J$dwa)wCh=3nSx@wCe7^8nS;bBQJVMyr8hP|y#Sq*M=ZU+=988s?q&NdSy!%JlB z(VzHV5q}{n+2&Lv(D$0G@ zu%{SBPC5)0Lrw<$G)!Y{G+3!-dMVBlUt~ljAJD*arl^#unQ* zE!>1(17e{|L92B*Q1mUf)ezI1m43OkyhrnNIpf)3UG`D#m-4^xJ;L^-haWRWB>N0? zTITnJZtT36fAqBy7W&uT2iQfBHah%*&q3$d#@s2|I{Y=E_8Eka&JPTSn_ias=U{ns%GeBt4?wBVVXw{ zF$%m`l^|Y^E=9vC=#JcOD(v<}K5}WNcH2PJR-aj)(EMpI$5m~vi&9q4QYu~(*^NWZ znW|;0ff@DH1P9i3BS)pizP{q?hyrG-vZgaim_MNY z7jm2@j}hZcMakzc80iR=#CgB_NS5&iSU3P*@bfDQd1S*23W+p^jm^emREIEPP=-Y( z#^xDB;}6DFyG@NXxa9Ze9pzN!A{d7}n-mim&vQw%9usu{*s{%Kh$y-Tj8IYIR*E4S z`f8qD%WJw@CqfXk1dHM+q$SQKv%IhA*x4V0h0B!Aoh#36g(eu z*8sfv;A^1@+D__dYme3w@|ThRNZb(hr?byb;*qh{r9e7WdbZ-Yfrl_z$B@zJEd$)Rfr!sRn(O@>Na5%fWz3y|G!|!TwGV}At zpKfo&zRtT@l4}XsVP6z?Y0iP6Z}C`Q($Ii7)Ol57=y{r`sMm05ZOnF(j6I0*94%+j zVO5luJrfkhuSh1)M5(K>6|Y}W2&Ex!oiTG^$U>63gi-qv8$J>X9?MCP4i?#bE%1qk zEnD|leHBAX)ddK}v4xlivCXcc*aQj>QUM*09z4V4#A>IJm zn7f*Hgpi+uCFXomm`hn9He|#^UALN|$9*kk#&Q-;7qYB>Y{ClqNzP{68)QB5 zK3FLBiwGE7l0AI$8)qSx*`9ZOcvhvjNjo3oWw*~NiHn*-P#TiJQ_U+uI3?Xq*K#5u z5Uw?xBe&j`l_<%svMvtwt|-NTfUp9n&bFm2eZ?Nb6-?Bu2KqFx znv1Z8tH;j5=DI81DKrL+kH>@6*o&d8P5eG(C;|~r(q>MX9rFZXJ5roJ3vWMZQk%q< zdAO>`StStdFdddZd-m(FGIiy%U9!C{p=eNrXqUXT0-p6Ct0LCy3zesOU5YDA-QprX zBkqZ{hvNc6DW?UmWaK^;R_6}jORaQ98K(ljw@Ki>^I+)#FXpZ}o!O6Qzx-&|ALVIV zUW7H;BCS%&jb`>!I#c`*ERXWEyOHI(EgVG$KGE^e``U9&25Z3$QisXEh#)(;@HrE> z7iEI64_`P1Vhi#71Blu7P=gS0ILwvr4F_XyO(C;e>0~g4=Wp4&%JxqIUJ+sTDl#UM z%pC7%DkB{oSmWluib6>VQW#Zm{fqZO1=_Bq-4SKtHO*p!S`e4_?KBNjzS_QW`VSUu zWQpSWN2PN5;!s>->aE=JTy(2-0f)A(ouCZF^oQ!z!27~FL^sApXnb0tbMFEv{U$O84{b* z%yHM}n{p;`?Mx8K@5<-V;eI==PjP{K^VOYkDj4Av%=MV4Bj4W?jmPhLTjB4@6k>Ix zz$&0JT}7*DGu}G(J}C%#8(i)#^DZg%j?C8Z?zEl3f)S`*3q9^iNoq6H9<06yr0e~& zDH~a6-c4(i!d71hFj@5uozNQZ%E{zl;=5j59&DO(F{E3}Hv{xFWwCqnIkx@0{QeX2 zTP7bh^^mts6ZZa63&D1hQu;HV|78A?cf$H+LgjM{W7oR&elergq<*a`qbkiZdi*SR zj<%8w2EuY#v{Va23S4wPo!K}v*;_Y#BDQAR3K#2AZp+gVfW;lz-c0RVEnQMq43)(*=&S9j_|B?q9C9t}oX zz?wL@j5FH(0N{@Noc+7#pj&|!mrVOmubZYgq<8ktdv&Y1(3w z@;7ukT5~M}%%y6Vb>W1R>!|cBRw(d-Y!Kh_$POML;r?bBX?Ww^te2YIEW(7 zZn7YLb}GU5jK5>rnE&x|7+|Yg>*+s#in2~T$aA$F3=sNBP?+67f5PTea2CalemVtV z>6?{aq^0IH_8{9n6JDX$E-HMTb;fLTLlHJ3CX~_kLRE0z7UU&2rd8y?DiyD8e zx~A0$ch)m2Ja=t497yk_MVKS@@LRVH$K6%$F2^S}>j{ z7yx)d24Ku>5}P)Le57lB{ZGqIV=*u6K zmp`m~Ie+r5d#&=fq{_+a8jIZoRjX<&NXtLzyfx>0BLjbsB^w?aecF{u;A1Z9J(dw9 z5gSR&ebZs$Y|M=huQje?gNu*o`CJKx-1^`{a;RxI6zA`!8QN~-6HGeL7TP**7_ddy zWMK~zPgj$f2#s<_5_YfFtdq_(@M3uc{0-sxRFr=rpg}tt)t{`%@<>+NI7-frWg*JqJK#;Pce?^!~9j zRtU+cJuTma4~gcr4h|a0%Nc-R(`$XET7NVOh{o4!rrJ9aDGYZ~_I!66-SYx(WI z2l2pb2r}vxDX}MAo80jBYf+HT(S5hes`0NjrJkMAy>K|f7kV#|VTLW{WZ|+sHM*0% zMLMDZ70kEWx=2$VrgEtx(Oea0!cdGX<$4(CqrgEpNp*&iLO97|=UjlsZ5lErFo>gj zsml5)_V^p98Y-&^$W-(8sjtagey!*-ar)ubh*N%;9X$btNE%$;ld|4=S92@1v z^pzu-tM9Sjj2Zbo{lw3=(bB}takaL#vPMCY0cqi}_= zb66Kr4>2N~R(S>OM<$^9qg&s?rEwmUytIH4mCHo;hnaehWm=7!5(i~n6J^#J;`1YZ zumuMW>w;tjH7m}gl9XwG_Iz6VcX7J4xq1yWcQD!3^c}Mz9|$as)=M_1XrrlcPiX#y zajULQhdZ;B0I8qWoZgILkyWCoLs{#*NH`3PTqSz86V)JsGl()Pok}Vil5L|1Y@po{UUbr= zxaZL*t-nTEwLt;7@wvm@euwE~1u zd~}_%K5J+$UV=r1u;c)7)QD$h{L|ww9he}q8n2vsQ=J!9wLAy9-L`;YfmuI>OM0|S z{c+-u!6pEA)8BUU+pjg+0)eo_mF7u=(sreOPfUT*Js-H9**G)XWYW8O+-6HuRGO8z zwJ(JF(J$%RMO9b3?Thjm@eC&KGL77ts2=`wSPher3<#c$er<)h+_qyj~2c z`ok~Z8g$k6Ve>C7)Zt^iD-7=5AtU}7l7ll?xn+LW9R%DageJb$hW^T z*9rp257K*S7+sg=Q5}zru(Pz|aY*VP{j#T)Mn~FL50OKs9H@qs@Z#7vM+u>$&7Cvj zpGg78qWh~%KMj;r%+vdp3Gf4?gD*P0be8sWl zDoJ{x(bLz+SUUv$t_d|66d8lxrW2BFF^{Vhm6R&m@8j_@h^(R1y3D7wy;Te_(jtJ2 zXtu0i#!v0q;6W*HOug>q8RM#dz(X_oTV2$44B~gfs-4rf&I_vZBu2x2js!*+?Od)HF*E1@C!%0m7)neBp_E%kn2C9?9}lh^GeeS1I(VCP5vogP zZ8@i}V?N?dk#V-;ECTrnDqj3g2^Hwdx>EZWRf16VFrVl&i0w9#%2X&W7uTrr=xvae zaus@eGU_21`nZzjV}+f1vBut|YAQy&u#n0w(D?iCX9w-ttb{x}rB=8$%ezYg_8I2BP*t|VaqV0dA^R;9x57_GF> z&ShdwZP@(DFr^98p|QgZgk^Jk!I^f#MqRT8O&!e-BW>wB*HcoP1a-!B=Jok*i{Z*g z`9%o@i<07GgC*S(+_9%<7Vca4N}Sfq&#F*JE={aZ-@>m$-n{%p8r8SZ?~N5qz3{Ej z@1U!MPQ)Xk+t|0UfV>S+3}z1`V;PBQmK0g>)SpE7x8~m3P`4Th4Iqa286~Md7bTry zz&DX%yII~e85WWQ066`qUGt*a8q9?KY)H@<6gw2dERI~r)f35`n4hqLe*Vs0m-i}5 zb6c)r{@aH2daII7Ip~{ixsBoRoWs#s+Ezy>nsYnTur~0JustS?lfXwP~9>*Hr38*?{Q69QEkRfdX$CUIseF30UrCYUy@mTCTYi z`fzW34zh7R4^t-2lJnxAViR1(uC(8&5ye$EqCspFGbUG8#S%{ik?!8C^p?S8LmEX# zrhr_NO#grgFw*<&iDu8Z<64oxw?=KlP9 zpeWU`cA*Fl0^)-G--~c2VUK@LaFJW_w%t>}{@qb)+;!IkzE2c^Hi#&s7l==}tw`ADlnBi|dCDlHexS)bGr~lO@01DM zdeH{%IdQy=cYVL-KQskk&6Iq)YgV*xH>iT;Hz+gIGZ~FcuXxa-#C``KHzUbzLL=m$K(mUVo(6kq!_nXOs~eroA!eG)*T!3`eya8@YT|ffsnFb zF|>7AvLZ`6F0o0>X`w8Rv#e+*k_D2?8gGuP3rmLgZLN;xChUtV9coNXp(gfX#K!%V zARt-wp?!eRvcbN(55kAs++G$kW03GJoU*mpP7UwMpwfcPuMyT#QWByh`VyA$D?bIT zO$_G>QTc4l>Fv07Za#TzYcsYhA~Rfcyh^yl0^vMWqgcvwd10i7@avcTBJq*c4MW*a zWiU&!6b{BG-gIz5Q_z0{U(V#wqUl0lQoyP#8w*mTf zZs!TbEq>iS72;``(rKCI9ykM}Sx{&L=HUcv@U3$YvXXoY2>bn+-Jxcxj2-_W{IqEu<-x3qdy5x!ys)NmXs zR^jz%ncvE|S%{y&G)5OL5$6D1X4Br4$)shxSg^(HUJ}tK4Q9s(RYHL>u1++Ll3hjcx#gO`pZ49!%iSdTg8V<+HO@6UZ zea?PYRL(`dA0)$UT#T|8(S8n%K~LzchF`P@$qwsf;NTIpNUd%0*(e0WGt%SlJoqE3 zJ*C!ESUh|};*w%~d^4Lg9y2p(_49#2*IH|(%dG{4n zaRrtaTE!G6{&G`oc)qBFpO^@H?f@70>8X*Nf><&g+5TQ)99JdY)|^WvY3KhOlC;1^ z45&93khn0N|DhRl+}{Q$UW(+f_Se*hWHVis6V@P_RJ2yaj)lrVl}XaG$>gK^l7sN< z*|%lp=pie8GHil68I2SYqT-x+*M@11L!DGj^wadDtMvY-oeFN~jy<4cyzYncn1`W0 z2MOly<^`S3bURfQCy8ZKqiXYt@ar`D$AM%7L-E}vdC~Dp0#QG}N#bbxjB2367?S|- z66aidf?H115?z@!Qa7*X+jo6SNlUURK5GNx7wN?Y5#hEw14jBH7Ytd=X?uiqoslLg z28(jNIBynQS0^kG=&pOPqbd3uktd7>=0h)}T`=DU4N=8m(D08)V^pbD9fmL9X846L zx2O!7mt9`$Q|?6okK6NdoL%rR@HeQtRGLq+Oelq~U}fu4)-b}>M_1E=wC8e8_rz%& z{?PYG1ML+D&TU8}mb;>D$9nuAvppjfqe*1~@+7W8BbB9Uv{A0`O zA9)LPc&Bt_Yr|`o2bvps&R6S^r7FtvkcQaNL0e4G>qwrW*Ftd9=vEA4_TC`BH1v6D zEMnPExF0MhAp{!%?7wVJnfrGs-?zUi&o$xSMLJ+OjH*ZC(WAH#h5$4~=Ru?4PcTj~ zIy;JDQfd(73~d)b3DF2 z9(tjNxZwNJ9Gr07_p2>xNvW>T56#{S>H?!K3PvOi;5~EL6QzovCsIK$;gZmhEK1T; z)QVv>Yr^;of^l6gZva6Z_Ikv7fmfq!^b51wJG79PcQ)&oZ>h>}oiei9|Y+l^8v(m@bOna^oxU#fn6&YK8K*_JY>+$v?0 zG2!^G4L}~^H5hx8pG%~$mt{3xotXcCT#&)E z%E4=^?~i>*jI#D!q&Rm+!BfOSO@rG4VtX0W1z=qgyfaJZ@v?_Ot<%yzbWJ|1MeP1A zPU#A-uqlh)I)6S}fRI}_sQZn{FQ2)Mvg+%(8w7;p!F-q#bWV-Tn92|;x#;H zqH&7D>OQ-Cd7;SKqcvpKRwoB|2x#bbsc{sKe3>0a3)*-4CfWQwf!w5ahV}tCOKwH` z3INXTkBz*_4*XI`SDqY$i|5W**B;FB<@XJRwTr5!S3!S!Y)x}C$}{)npZ?htt)$9V zFHQ^BtIW#d=#TX%e#12mS*RS5-NT{Tw3}`w&tEj^S8vvlrknAZDv%r=oStS3%9ltf z+nLIqes}x7*wa)#``G96egD~_Y*=5qmI^@qN%cDdxu6-w~P&V2sorOmr43sgEf=gtB;2gxaTC`8{2=tc$adjj+WOY7IRI;IA>O z-VNffhwi*%vHfK25gu+mbw)NY+U|+=`Nil*yfgB_6XN&I(5+?VB@*2)RuDkI<_s_h z$-V!eBlTS>P`jr@a3Q=ndypr{*325Dh+-W&7Kk)w`&Kr1GDkana$BEJxm1(tkzLLs zu(T!TSr&VpEYy*jF2Y5aSp4#3f2v3M=rT&)1bT~1Ynf$HwoPN8Ls=RueTG;3ish!q zn~WFt=3p|*nl8dzX6;i?7GTHBR0voJW4G;z&Q4YNli$O+N!4y)E3GyN=iZ4Y1rwk( zcs%5k5=zgZH-0GMfBA6OE24;Ox`G-x*Er`CB3A8Al;4C*=Db01An5hmOp_>7OGEEu zc>BiV>GtTxUaX`d=p^|Z_yD^G+WExa{bt;3QA046eDN;JPhPF1BTaMc973ud(ei-YW^kWo&KQ zT4AdkUSP8{+UX+$Z`G0V-@V`xpM@(FlzR+WP1a<7tmbJ+_$mo)EJasImkhA!y^#rx z&&CtGjwpTayAd{*W=v_pUC@9t#i@M@bV~@<$88?2DM*d*K7(y$Br|--9i7)S^l~ge zC1z?GptwH@tu>zVKb2`-e$n`5NB~D?1DykBD!gVp=FfeJLxbC9dcc$-A8oufB$%Y& zv}KvLLaP^H6w7Z+f7gNEqYfbCj~o~qYC!VIJI+tRWUSO#QMRD**$2I$I*|U|MgE)Y zI#fy^pY;_#Lv9xRVR6379I6ouf~|rMbrkpz2T8ZH^KIdRo#8`C2C5s>zX4Pcf6sYJ ziMuZhe~bt&`7EY*ctP=lfj1VHt(IW59`|H6!ze^$6gdRXE=@B>yB468rQq$^g6Gkw zSCnv0kG#uJyXZz4Ji1ZQHJ6`T*f$QssAP6;H8NvEY&N(6yUu4LpbEXf#LiqM{WopBv63K z1Pxc-80*0d`z*LBLEk_Oa&~OPD-dg)%V3avQxutX9fN6ZZN2|CQym;9-zValV8j3q zWBxUar}PUX6LJDoIcMAm<^p5~B%O7F1nUd_-($?Rj&NQb31FJDh`$z#aI&E2<2>)vq)^{mDqiq(c(wGF7om| zJ=gt1HT&=_p~}H}@7ZK__U7T6KiAva?(Qdu6XrCA;=UvrECYM{_z_kjCazB8E493k zxvIiG`<6xdh*|P7KihRl+z2A1?Ub;ki;`&euZ|$V8ypvgZ~sOr8xc%+IwR;84Uvs= z&dkumD%|Z7<94&9u~%_!{_Yx9mJ**8`^lX~sL-Jx>-1|Wu!HvZP>{QlZ8iuqn-cS_ z^DB<%>yDkXI7;2dOm9oEn~W-G$$9(Cm;jS%>zkxaLBCm+NyhEv?3QjV2b>NK4-Y*4 znL>I%>sp6=Xe5aBq*Em$GikD*qK=?C?>CO!!tWE7n;**135SOf?R1_j*9hQ|yjOjk zA!i8WRM9uy-eGu|Q_C$+rQYp@y1K`mKkN(7HSdwFo4An8#w42895&D3aH>1KA2v1o zxN(vemZ~wKDC-pt?@Ae}w<~LElzVFSANi61U!AWyHaV*qLDAda^C5bY(TaY0#8xcH zOJ*Y|y|77@r44IiI_@_`(q^f!PMbklLL9|*Q)51~RUDAH(B0FFd6gZ|`&Ji(2SuVK zI@ZzdnYE1^=d4@b!B7pv@isP>9iS4i&s*OYuNP8Ze8bNe-ZYfNa<07p!L3Qf@ znC>ggf&Ot^;A>IDO84Gf?i6^=D!Dr^&aJcDuF<(}IOqFJj}y$lxyHlNUn<_Zg$r#( zbCaJ;FM#*0*7a$|w>(F8iWDLxGwI?_FzFJCRf6^%IV?o+8W!KBs+QLyVZt={;&m;^ zFU7Hse}|;P88>?f<{a3{hw%BQ>7N?AThZI`za#6&?H(qyQQoQ^Q7(8AHB{U|3RbnpiUOJ9qpuY`o+%4X*S z*<8M=_)+pT?(XQt@hVPhbTuYe>A%BM3`>_V>nIPll!D9kl7H+`vaQz(jkHG#HLP>{ z@~)4Hdn}|%eHGfDq?@Fcxjvk>to=p9fap&`>{FZa3I2DoXCu(@i~=Y6IPeXF|DWCd z_gw>EE*Dp7T?;5=Zk+o*I8Lj@i#z{+COk!!q2U;MlI^M63mq|R# zsN{taPwBjZq#ukF#_!N_<1IX*Kto-^I24xjHgcQ+s&2PMS#P9}(Sw-%s^ z2T91KA3VX00E4b$DIqiBku`w<14%#SHJ08ZJ)~0$G&?R;p&) zap`pFu&q=Nm@*tiDtXSD=!#H2EVT|a*y$t%4LKYzfX9>V?+`Qja~l&Az0|{r=#t#j z5e!~q=|h*HrAN60JLb5Kgc7d8pR!3?C!Q6s%Ukp$t@+OC0i{w=bYPKh%OPxW(Xq6@ z!{z58Al{n83GkEMlcyPrN3+yveZ%OB!&6w?8L`wJDXY9MwLdkvq%g1Mkm4Os1rj8>nLI}46rgr)kUZza8Ji~l(z6!keFQywAY3v z(qy8*96WOP`s6MV!&kX`ozS36leyuYW*`z+v95u+$1ShTEf!Jc5??_~R>8_ylL7Wy z6WcO<=w>S8kLYmxOTf^XcLtStyKOpk4~s-y0~=qnl1v7 zDWJM$sCkN9pRCwz)?}j=Pd(*#sGV1{@GhP094k?)bVNl7`h7jrDojXD!+iyxlTj+O49pX*< z`k)7ixq$56r{P8Hx7!@-o2a%(r0hB2!`C5g)r_=YocCpxWym$(JKyAW646Df3WgW7`;^V!k0xc>;!>%R2@u4 zh*UizmCWX6oDyJw@&@}wZ8W+YHJn2Z+hwM|zZr|C;;souta6&{)=ga<-D|6!tSp=t zz!x>=hm_0L6?y*>6y{NsswN%GGzZjY@ykkB2irc{(_aZiZTkNtuV4^MZAnhCeiR6@ z6}$AHf05PWh$%?{4LRV4=Avwg z3og2}s3woQN7*%%?Jz=rdpqoDHC0$&at`X!!qGZKx*D8!ih6JH;zcKbybnP9O=LXH z;E6)w`D^U>dh%BTolAFo(=rXEIA%zB&Y$D)!f&8>bJEx2?U-pY3Tp#?%X#TV1We6w zNm13bbAtxnvRNZsGaccVhQ+(ji6{t{BsU`ZOtd=b3nZ~EYgt&jR#sx25)b@Q7L29Z z&CW>v$T*_Z^I(})u>G?X8{z<#mbjMm6Gruf>Z~(^2D*Y>ChyaHZpbxzm6~SSRTpot z)aSflwHgU(8Ls1aj^kCk2_O53TIT$%1gw{$VMV;>{K*2}#IECouhX=%q7t3i&v;*eYvMw;j@(3U4jY<`|JGYvNp>(6_Sq zUglJ{`Ig|qdvNb0Nbvxuu5G^L?+C91L0~vPB}yOa4&AVHL{v$|m`ITmm%{w%*;i>% zCglldr^J%xYTb~`+i?M~bgk&>G44@l9O4l?vKz(~j%hLX;n{glF%Zk^uoZ)-2u0{_ z0@-<@slj|h=tt(-JQJBSb^1&6nkw{F1vQiTM^%PFZE?Ab)CY+n7Z}z`YVEUg*8;ZW zOdcdPb*NfqDQ49AOOum$A-oBr=5@M6Ih`cfx<8JT3!56SX5Sar*@Izr(yE zvj^9ILRD%GvIh|$Tisp>T@)q99zOZ`NTG_XAP5dJ3Gy2!&X1%rVmc0y-@{6qJE~YU zt;Y_v)PH2r(SwQKK|g5@FZCC>YhXDQJYOsSo+UDMLA+{bvnyTmUH(07z?Nw0D&u^*W*yt~<= zE)Q$n3DNSfP_Ep10@LYoP)GMt?5Zf2waz4HY)+XiH<1DQ*j-x0OyEFvx!urYZ?N(l zl(d5C`SZ)g*U41#+;8Pe1}Cnb(8|c9@G|PN7$i8cnPqGEDls#3TC^W z8x6TFUW>A9K%bXEO1g$w%-k-b>6dIc`4e{v_6hZvCWdRb_|pvhG2+%@B_py<6!mzW zshTn=Qi+GLuZxJaW_AS_F&*caa^W>mauM2wj6%QaJb zq~}L8 z5voO_w)GB4dvDt+J&M0YI1eJ#PVhOFXH6Q^>YMSRb2XeXMXllIZ`Wmh{DhwfRxZDF z@ki>h;t0=5|gGGdBnfVs&&FP0!T{;wCjKkU&uqm^~VFb?xB@jRh zo-@D>2GITU?FA;f#l}yWPmCC>(odN5l}MxQ=a$P$F*5tBKh>S!kNq1g1W+vEUMOcp zXifRj$&@}^_F-p?UYZ$*)4<_eksfGLQ$)+YWu6$xGZ0TBFiUkX+($e_qB|Cz=2vhN zEfnh8YIx%cMABuEIg`+N7vw)Ly&%rUXj)%w!U51_H$i3~3wZA5aA@_mb?l&aRBpC? zKbOVQ9Ly?Vi8x`22GP5fSd5^s8%2q{Y6NkhYuIOAjC_$?8LzzbUfU<%~_TI>Fg)my4Ikq7<%oe!_*9{2#wT`hDe zj87~u{6R3hek@x|+vI>TljMrL@E|3(Zx;zeOib;ndlXf%08i%>wbLE`+9Xeniu7?RpD&I!4TubsNuB+qXsf_JNsGJg^|HSu^JZBY{KUA36PGXg{T}fP12Yai@BA^;unrLz z<2CjX+CrjNteHC!mgd|!I%QS-A!?Pn)ma0q=;PDJmuweP6%HqWn`x~TrDuaQk|mcp zQmj-9(TRj_QK9PQrZK|z?bM!{53)$awRc2ZXe^|tZ4vZ^Q+wS4~M(heB=j-9T zB}|KH3Pfl~QcA=Eu=mX?CI5aKwY(7ic(*wY1LVB7d`>=SG3VfpkvisqJa4#M*e;MF zFdXC~O^To%jf+O$d5AN~fyeIsyhV_Hqpqu%yc}3 zm_FSJ8a-QI@+=Bv_c8H&f=SD6_R@dJ2Ec!kAPKjCf48y%$n2~*k+tA&Tx#~4i?}>6 zseRpSyWmTD{#sQZ=5bixm|**ZU`p^rdU?V%-A%$^ZAz7&OB?n3a0a*g2T^_6ut0iU zqc3lI;VFt70#$gMpzxIjrnhxvdacJ#9gA)H0C@$Xv%C)J?Mu08PfPa}Q1&DfbdmxH)R_YkHq>50AO2#17fp;%O+p?~^bMQ@B24c4G z24qca>|K%1WuIvK$$d@e`er+LJVN4VF!~{J?x-yefB}y!$C}|M!s*n=mCVVE*Ayt$>V3>Rzx!ikMk`gFZKbKW#G8$VD}i+&{o`%c~G!N zb69bwXS(jxaq-*%1mx$YdUr5@m+n=R4JG-7{8l}UnY#zqzNL+ykGj24(Y7* z`e>NuZL*q}7I`A*(+YYoL@N@LMra1yJR%IHdA_O0gkenSEZo^F$l{HPD<|;$>iDuT z*nbE+?%S{~+;UU1a4 z%KsMnwNPMZ-7Xaa>$i)yOT)`d_S^l|>CQIb&)XX@2)viFBy28XK{&tID*?Q@Z=l4> zYePsUrSGtlN~?Jr6W@q0eU%qUbk!ul%J5gih7B}A6sKY9tAmtV@qxlUOJ~QV!t8g) z92B2e<9loBrV7f|B$Xc`HKF+}19XIVp`DzBS5AvD>TQjL5h<5H&u|^3QSo{heJcwM z+oi!@ZAO3AM4BZoV5Mr5UBZd^ds{^H>nXex;yR`sJEuZ38}68=AZ z-3L5Y;r~B=?%U4ZD^ardi0q7zY%&{C8A)U$gtzwch*aB~-*f8~zqyp#*gyMxq$#g3 zGh~X2Ov<|T5-HxZDYR77`tc8{rpGuD>CF|cUXR)Ms@{%_&4LPLiHS#2l{DnV*H$Ti zrSMrd#q#5hj^5Jy_MClj-cH32OO7T78BgXHtxG615_7`3Aj0jnet|*(Cp9!YyAm zyTopou0iWGZ?kal6t&ZI?wkkD3GVOgSH326F7J6dmi}$m7nLC8L`RiA>6aS@mlQu> z#>%YIc*Sqh>1{og;kdq=?}OG?+@@^uV;%dwZ?t2n_bBIN&0E~%U4LeGsO~EduVEwY z^O@=p?{BIabsv@VtkzvHE(9u;F^^dZ-0`&&Ep{SLMg(^0w%pbaIq~*TQ3sKgzo~G` zI`gC-X29i@hpPJ-ZUwy!A%FHEZ;^B=oIsfR>Rk$T)6(4!6!d!XReoves3tmkNt%p= zbEWn#JKc>}iTsxGfi(9=bl#8X{Xdw)zozBRm@j*AjLaF|Q@d#=O_I?RUL6eIDB~ih z@EPga_Cp8pzWqN3@wj*Up1^ejS0g^^VLw&Yn(Xmh?}65y;J~k) z`&-8gVWo+;%OY&`Xji4V{NYgvzhaN1FT-1peKZx*B-+(4mD>J%`|yakCvK+5o>j2* zN!X2)tp--76B}WDZKLzP?cXmODE{b{zUtC0&}!-F?`X)V5Y<=dHX-llsKvaIG$=+U z`rzQk#c_sUDGgyx#?Mkcf$9}9y0wMTwL5QWv3&2ucVZ7uI)CYLPU%Fsh2Y#Raku#c%+w~M+e0eb*zcwtS%#r|1>7IL zPN`mPyqoglyZ zT{@)XxJ0FLOCLU%t8tM#(eN&+YDBO7>bv|XzqUCu?FNg{_p$=cRvOLhHOIZsDz2as zuD!yLu;*Bv=h;M2<8jtF*|+kI$t%L&>4anM7X>PvJQ6p`v&_rl<@9yq;%>4qR=vo) zDvsEJ{O`#R-!0Q;PvwTCYnJjkDVFlFNeMaBXjl6VDZhWdV*a*ua_1z_NmU+25wuzh z(f;y3`^tDMukT6RH#nO4^8lqA^)5~3(BZws#bI+IYP&4D4PJz4#Jnpk9&dSLLCF{vSD`L6;R8v^a{}j;^fK&IQeV>r>rYo+)j{eZ#g~`JSY~ zmQR<(^va@#pT7N*z}uEy5;ZN`b~lVjKGV}v62VsjB~D({$E~_ysyzjRjmvo1#%@0f z@O*o*6{}*geuLzTOl;{pKmNJqV-EM97D%!1e+;{LM(3rxIO*<%{f_N^*#U6|Uti>3 zwK(*u_`&p>v*#awUbcV6d6|2Pt4W;O`0-4oM^v4a=Y@OL9x)HAMBbiNb>fJ<$3{KG zwvy`ZCNa=i*koOG94Bf#;u!V$;nb*Imca4uNet<=Ppi}-JV5(BBx?kz^ zf!NovA5NOm8-9`y3O9^YnWDXSp|i`P`(StD1u1o^L>C9nJW`okxK(+_o|Ba+Wd^@E z0?ia-&vse#?lOI#(_~tb#NOEG{6%@LG1}VFL+&Nla{39G^z4jJGsgy06P+p(u(AhP zQr#mS^!q4(ZuER@+ilxq!9F>ZlRMN>5ZkEj?%$g5e92^CBqgq@>#&j03JK4f`fVz_ z0>_uYn!#HeRQYB;vO+imcdM`Y?)`=XO128BRBhE4(~^Tu+p^RqdJQ&6GN)e|Q?zLI z$(TLPnz>Xe{FJ+fd}@8rOLM#KG1FnX$=XJY%YJg0#J| z=9o>9wOxeL?a{(|cae82kx$o_AM%AhE_r?Fa@|&O2VX=sujSTS0Iq4qwslToiAz_v zO+WDd)NyX7PQRhZ7bY5}?b%^`BO-U?#By>ci_cl<*j&eEWoJ)G+tcs_(g+UZWIu2q zE#%C|JlV#X;p(?%kC5V&&3=J`n+zPIi^4V8Z_S0(5~(k_?Gb4jToZ3H_sBJ>a@pqT zAK|77GZcSdC2!chA@?13Z4ZmRU(T_tOdrt!d-n(nGYacS6~cx4!1#XMNJ;-|PH-G6uv3$tvSbGrwr6h3YgGZnyEj zkoP z$0J5L%|?Pnar_F)-_zdGvL`WXG9PSLt3Ek!o$He0NEcnnyVQtUIx9D}u@j{~B+Hz9 zKBg8-?mj`f@8Q0UFRJ6}TnBN!UeQm_Rd;q6Rd=&aKh5u(h}+KhvQRv**?8@vLD_qY zUJmDWm!Ga#ShM+=`=%~jGWXY-6m!R=qL#k?On8`z`hc}6F>2~zgKnDmiLIoijz2H1(wY&2+tO#Syg%J8N_ zzVsO|FwtA-Oy{gr_lnELZD&*%@8n$XzKQ^phUG3fT>&ND< zYsK3}hh@ng48&ZgzAh6u-Web5&&?RuM*LQEdciU5BS#*1^PNve(k1EfxDtJ#)S$&SS)~a_EGLkyLb- z_04h-?v|Qp^7Z)Wo9h&9`eC{pJhx10&HESoBq*CahOUwP;*l-Tw`Lxyu)VA%TV!)J zaD-R?IIicYhvPN7x@`%HA4ay-``k?%8PlMULbCqY`<}Wr8Z{b`v)?+r_D&`(y}z^c*|fE_rj4ny&ab59?px_Q z1D9gm&s_*Jms=ey7gU>MnCf0j*9%=T86Tv%J)D?v#K0i=m|5#+il-SyCKny37ql=N zTslpnbQWjJv0}e_Y~eJ;2L3$s zdPAk6)P0$#+KsKLs4_cz0wa6=T*}13sO!fsP{+xtJYM5(b2%;JK3g0*JNPKut+tAa zhEcQeOHqzfCGptsGmC%&=at?X28Vw1aZ*mrOQAh@56AkVN_ZrcmDG5O`lUxgT*hf7 z7L^z$W|gQp=JfWBC$3A$4x)a%oySnZ-=Y2!Ok5Y1%W2scbgGu=Y z31X`8mNcsI)`OHRnyVxBcOCPT$PK)k#9wUN-IdmD5E7&sKSVwg=sP9q$F^#yJAY}y z-6l|F_Lv@SKGH|S{nM7uqh6_+- z<`|k%9#U3!tEZqe(6?}R$n#a{r?DeCU4d>mqi&5BTEt9FK>1mg@-j4 z*!$XJw4+w;1%JqYOs};#b-jE$q0c#5*cFy&W>5R@Uc>bjYc^7M%*fUq@8e? z^{ZbZZR_lnB+QpNmJk`&1g~~;UoAiP_Z7y?T6=TTW*u;6?l+3g+7uYk7sd*ZWZca= zyDUd@iY9e_RBv>Fb|FXMuGpqqp5*QE7pta&DwGQWoMOBTCJR(}N7*MflbAA6g`u<( z2XC6=ysQRk`nHE2I$f;0M#|WiYti8lB!}#9-J@uc_S_rRdzo=+;)e z#&p`>B5rylcJ~vFeP%T=ht(cy1n-uP98elfmn#Ww{(KU*eD40e=HceY9?JSZE}>B`?xT&XsYUWO^s~HiA&j);uktASnD**z3;E%R}i$MO|Hj=v*##DrPA?T?~3Z zpg&LbJb>gIeV$mpaQ`L&sOE6^#bW%vd6&+j*Mipl|Z-rK^8<){0sr;`Al1cSYMpn#GlS#XFvH=anIKRCA+ z%dW?%v0ykWP%9;?(70uUv0Td84r(r|Ji=0CtwUPG#~fv`RM=EJtQ*z*-SnrA_^-+5 z`-A4jQ=T17KDaPDX)r$8q#pWVTZ3ZH zlbf2`QfiF3o2Js=lbzKhQjNnSjJvii=m{N8n)h3sbT$qSa4vTgp1}nQUz5B!5PI{*C#KWgR%Ze&J6`cyaNe?YO-p@LWc2b_ z_5C}nLp{P*Etd3+1o$gAV>zGAYunx(-gHhEEuwT(a;-JU#+Fu88)}|$QaZb&f5D`B zGa+<1;|Rwi*QLW)_ zn~q9%SI^W>7hjmyHQI#SD+w|Qscs8D&)604DQTEs6ze=IaeJKKVv{q+^|Xn+58CuL zehxL-;$l@XuTG5=l=I9?PB@^uF_rmC#^7#OT5fsWICe3K)9`-5x^oY!u4_F*OnB4g zwX?bYKHV$kf;vxMi6`<3J{-bDjV)9b3ud3D6Wo87z(a|y{YaP>j16t~kGBzxn%nFB zGT8L`LU=@Nrfce=gTtYae$$FQrXL0=DZ6)>DyyXEl$^`hh`Hi;_|>D7L9xi!i}QzK z(^X|MlIRzeIW$w6fX0i6yb{4K1Tj5zP@+2g`@}9t8m#{ znmSPtXV2%K8#&`4XLpPFZOkW`rjkkFK&{8etwpEPsEnrU81M8sOk_0j$iSTx6b)N; z$>vN__a&~9T4@M18_f3X&lWs;ej4rSy964yMtr0=nq{$;-gc$5Qy~Mg z@rC-iR?-`Nk54Q6U#<`|w4qYE)b8a|9%5P~R&;e=zkrLz#d7YjK;et?KEj-bw6!w@ zHW_@hX9`_kzblUz=i-{5%M!30dTwtdt-4EjLGS(@%gMGep-ApF7R$N>H93pdhOk#in5p&@wjQh{Hb*We4btI<)-9q(+Hdv0&) ztPG`ASj@)GVVs*7;-k+z*Q*s2>W{0ca1!*&+r5|bP8&U|{K=1*8!cq*TRFum`|5K` ze%3h+m)g0L$YA>dbo9ucZ*^K zx^E|Vle4^*WU3{V^YkjZT2{zwaQv=ny-We)`bDb`l<)5mdt^GW)?Y&Swava$P2eQ=IYKzZLQ58CG(RQsKK#mHKn9SduAl`*7^7>q;* z)I_EkoR~7sFncg8*PEUD^39r@N(_!+^@^YB{k7g!9Ob1#$#)y+x|t++`XY+Ex&`q` z9Ad8PH-8wYlnU6s-zCJQcJpIChggYq>p3!(s}5fjGuA3eT7%01F+XA#1STr1m6j>V zYc8B-?LOUh;)rIl&dB;GXEcddhE{KaiJ}Mf!!7=~bLHRlG?cD?wevZTV%Zb|aLoW!*C>x+i`TXLUU2s;F^cO&Hp6?^O~cr&)O*=ATq|d{gLy0PFr(IlX7*lP(ln zPAV5B^@={q_r04n-$<`iGP+a0>yl9*hu{~on-O=0Pg0Ge3BFqMM!6ue9-u z#x;T2XmYQP>pIb^=!itTUaRIc*>4h=uG=^%85aw+oGY&*(bE0i@JMoFw&9ES%B&o{ zvS+55Ky!#^G4Dx{XOC<@x-r=d>wI3$RC)5K_X~l0&!_ISV+}DW=aN#)Z(j;h_eu1! z$i(V@uog8?q_eBTFSh87(X47AaAu`7!p=a zy*9Q?+Vt}o`YukJ%>Ec`I_w0!CJnG@2_SyeH`F{Bql*^?Q`EC!G zEqyk`7M;)?zj~RiTALN$`9z&BEL~K5PW#zX5LZ^7uyof<#gkQz-hnlcp*H)O@Nq+y zURmolM%K@BR%Qu_b6lc@=^-|^t6%ju{`?X!mRMU?{=8y9#KBt1oL;E4m1F;nn&*-o zF)JQq)pYXbj@<7IE+gpd%FT)s7C*ZeFLT%D=ou#S+E{(`OWx4LNP2gi6kiH82)VpECN^!6GRB#b#7<72ecJx5E2RC#}rcI!@D z{nXxS7h$nbXn9AyE%I0E$ITup{`$nwvC)HLSKTKLUhPZyF-`a|K}4OMt|MAfIrQ}t zb?jt}Sjn_u1*cN9Lv-b2G4j6Z;GUimGe}!!J!+j?>CvW{F_l{sIVljAl=?n3 z&TIcUzbX;Uu*aGb9ZvYKUwY zr$HSR;2wcjbP;aM);kt4kk{5v`3AGKHzBS)=3O{fjeio~%QU-Fdd5#9Pbu1ZV5Paf z>}Tln3VAkgBL3`(xQC3^w^0XM$@>Rh-aZI4SVR6p%paHJoXme;^hL$fXXsX#YVw4Crrd++m-IcEF3 z2*QDa)AN2RFJcyPQ@-k1G7p`M*;G`H9B_;KmPfTp`NY5fY}i8MV9)Ji+BOQ|`6mRd zaN65vU1rt?e66EPf{RTLM5W@bD38)yI-oCpy!vtTgr&XAF%EyO;mqvQ3})sc>8V|1 zF*w@vT)9|-g4?uLd=Af_wK3IA^Q@q0)XsN%+gcejt>`dyoQt$)#JO!3>$wX(Q>tN( zT$>!pDIE7L>hkl$0&#l6yH?-S#7KmR8W+BQ*C!)c6RYWv6Mlv3vc_#U^{=iQgZPP` zRaHN>6y8`IBNsQNT7MR3zOm01gPzmzNA_(FcmaYKRU{hWJ$bgy~8L|DlI zChfO4Q|V{j19RTyuQF2K)``d*FUs@8Yn<86Hf2+<7#nRLQzuF!dv$6G%eA%M(or~n zRWl3N!qa&)y0_# z`%>o(%%g{A<8)*P9ktVXlJ})%tI{0yZ_=x0P;%0?`xZpD^d^6Ikmh2&bl~&&Mln(=pF9-t6e;o?OV{3te+#|(+o3tPGCbo_plrn?FQK2-UCECe7 zTkZ5RHP+YT`RK2bIPmHh>$u|IEgw{V-F$R&S`kkzx#t~IptgI-@WAnXd50Rp9^-aS zQL2j{sEI<~onS%_arpOtwdigi$Iyr72v(XtOt9*JZ823yeHb##- zr=9N$OWT!L-%uQp9QCQn8-3^aD2Is{b2xt3S?m;Dhv};B?L~gZFE_cLTup9}`mwVr zN_4`-=F!<&h^KgNy0%awt2i zw%#Hg^@m)0vCD~Xp8rhSrQQ-JbHe*j_}%vO_dQp7UTt*>UK6y}VLx2MAMI6;znGqT z+p^kByvynW1v(B;K9g$rSVBR6rnp-$l+Wq)+op=@Ar=Q#Nwcw(-VCmCf$7NZm;>j; zamzg}^UD{$aF6JppRdB-9lq4l81<{$_U?7eD`gl?zOmq;J<#g-CTE85 zq>__Tp|fMgpNr%wChK~ecR;9wzebDfCQiEbN)5e4>&mIMohxk~kU!Fclhqgg`|{DN zNB58a>)VG!_%DZiH?Ya*@|#snUy+>xx0dfA5>#V}AGw#vi}%p;<-(_H`BITYLml0n zTO5RIbSE*Ccy%pbX8fdnZ5Jc{tSC#h3i@ZZ?Y7}@uuc@tn za_3=U&>!a@4OCsMrAfngYx{EIrpaPtbyhv^x6m^Ps8pYm3ODm=J|*k5(p2N`we@wSCMqS1BSLG3ebam~LzEp6=y+Fn>a`Ez??ZbGFxmNO+{vLlIz zY449Ct`~#x>=&xMJrf1l45u{Qe7=)d;3Nx z=qVJ=9H{GWIV+l=nti(SSh&T8Yl7+YoW|iZk!SiMNyg@-)0ZqVG|Iv!iFO^{mtYrv zI*sU~v64$-H(6DXZOmjw4x95ZE^^^lVnAhZQC1d{!wo|*B~{K}d-k**_?Y(O$kmpE zS(Dt)HO?3%qy}tv(YKEDUn&v0uJx>ewya9fF4Q|EBH~oAUnOr7DXkgH*E6jVr4PC9 zA1l>$2zWwbq5a@`Bs!<=u4**Q$4?uW>P9O^UhjC<*!F#TYq?Hst7rYVx47i<_o8v+V&n-^iXz8z7pLML z*6Wd0@zM(EQp`t)DH1T#x11gp?@6X^m@ye_d)QY-yDYAttZy85HT$|1miyGM-K*sm zyKJ6x9pX5o?fv=P$&da8cSxs;OR{kGwh3y=2d1+RMMsehhPd7EVKt>6on=cByrX%H zOfJjS%k3vuj~i9q`|Skwq8nWs3x`t04Nf}M)V6ceS{|-hRNm%{nI5NG3EX5_w9*Z? zr71K&=rMco<@WrW42duGJXH@;T(LTmEInSI%-K$L?LDirYvLsTH_`AnmJef#qHq_< zKIP>Eb?aTa?|VUzeTkSn>598V;*8QATB)s`y@Jk|AJUW}ix*YXuKo0k z$x5KZU*uL>EV)ICZe_{2E1lZyWy=e;7prXsbpgX-b%Td~Rz3Fpc{#-6d_iCGM{W+w zU+UXAIJCVdr#M$-P^yEr|H4fFv;F`3r=I8_dc4m`Jzo`EBUP&uJ<;TkjCYw8Q_()c z-t;#YC+Tu)2)#C#1C(Ec=ZBUQaJ{@I7}?6Vzfaz$lxCC`l*cHoC~YWDP})&CP&!ebqC7+CLg_~7LFq;5L+M8uKp8}N zjxvPu0_7#jFv=^G5tP>`qbP4s-lB}5jH67TOrlJoyhE8rd5s~5}*Qh0n`8uKnu_T^Z*0E2rvQ601LnhumS7<2fzt%0o=fDfCtzE@B)0m zUSJ=<59|j706{ zxB~bC0YD&d6$k=wz%?Kk2m!7Gp}-9w47dq|0}((Z5Cud7F+eO32gCyjKq7DpNCIvH zcK|$)45R?5KpKz^+yycK0+0!00ogzfkPGAi`M^EkK2QKW01AO3pcp6tN`W$<9C!#+ z0F^)$@Cc{|YJggx4yXqjfJUGRXa-t<$3QF420Q`UfexS(cnUlNx`1w=2j~U*fPP>A z7zCaJL%<8*B`^%U0!Dz>z$owrcngdH=H~>z73*ZKJ13bVUfEVBc_5%9=eqcW! z00;s?fG{8ehyr4OI3NK?0#bl9AOpw(a)3N=08juFfrEe&pbV%0s(>1x4rl;}08Ky( z&<1pX!+re1ug@Az!ktB2mk_s zt3VKd1FiwVKnQRh2nB8cVZcow9EboSfhZsvhyh}OI3ONK01|;)KoW2pxC7vUWFQ4d z1=4_Y;4Y8>5P(b|3&;j?fLtIC$OrBL_kjZ70Z<4O0mVQGPzsa*<-kLr0;mM4fJZg41z-_a0+xXfzzVPmtO4u5 zM_>ck1U>JA> zi~z5JQQ!^m78nD@feCCg+WcX|zQFO&=4#C;Y{kyau?ZJ+rm%`|gQ4d8s5Hg1^PFY^ z;Y}PdC*j_iDJ;kD3Xk-DEGyyEwJKr~!Z@ntBY~r?gbb-s)Nc3LDXh@n6^>8=51l0N zokM3!2nA?ZY^MR9H({QWuz`j}|8KnR?=dEiqc{m+sJ+DRS#sm5(6pbUiv6&Be1rbUu#4wzMlc+*|r-7+6%%!tOi+n&5y+*0k{I{`=HoLMN&;=Y`6@pKH4p9q9SbpWNV$8iE6wBNIUiJ$RD> zkE_04YT?CnXzL3nFsne zH~6I{2G3VX%z;0pg`wd3&$DqQ9KF2$XBq_2^JtdXW?c+H8a-QAMeKjZTNZbIh^Uhg zB|6pmkVx^Lc~oB@l%vjvcb5F?&SYMtAH?%bdWrr&OBxu1zY%0bM3k<8A(H-QDgqyO zy6hpuxlLjB>`bd1mAJ6jBT74qB#bw7r=|XXmTPbR9i|g{;zSnY^+f9bOz~|OK?=PT z!<}heLnSWkJti+$uHQ3ZA`GBP`kgn5XW8%2$2UYoKTXJpB>tI74SJ$^0|Z#^#;IyYad$Xco2q*TYIc=fcN}L_|rWME~<9U`Ky1)Xsxk z#delf0zIyk3uAYL5bO;fw4D#p&S(~bKN`i(3qKccnBC}~q7x+h(AA7e|186J%}z%_ z0zCGWj|v+9ej+7--ee2IjG?XnJ$~mA=sQn<<=FZ0=|<0j<-*i7{pn42X$rf0XI6hd z3`_H$S-tH1@1%AU;!zLkogRPRx&P2VJ^K3p+k=kq5%u^zb6PK$dDNS~#^TYv{ps=b z3yHs{`S%Sywf>o=%lO~DwkLe({@d&CTQutY)2nOouU-Ugw5ori*Ls;loZ3%bl0__wC>`{%KafzSB$$&$;2lia-DD&+^L;O$G3wqWx z-}hnD|G&w=7N&xf5bQsN72J8gJvremnu_qwy#Kia&Ocoi$o_Qs?+x3;DB<(9bH5Nm zxyv^U3uc(+??yYf%E{2+BPJuz+fQN1cINQ+W%5VeZLphO$$#eHaV2^G?}_90Mkh0)8&mxLlN;O@Mp#FUEwFgS61=Ba z6)WMyb+mhgvC<-BqJjxFGqV!vdGUhzmGp$&sE&#t9ty9TO0WvX$PlifK_Tqc$fKPJ z;Je;EV#P;}Kce~5dS$0|(2qxdzg%)`HRqp~Yk32v7DZo;?`>M)!qc!;GY|~JU_M1V zWA?Kz;U(CTSqal<@BsE)?FuxM-f1I*4Vw74GhKE*g@!e-HKl@ohUKaRiMe-rQ4!d~VaeqEmHvz~Lc_Y) z#;0n8tVs03MkqnUI@qXV>VJl*BVY&nk=uWUkE3BtOr8ND3l%J|1_OuxG^9n{wJ=|q z3FfF^fa$a#WTL_m>{+bGpB7m3@lwLhaCrWnHGJks3AU(GAA7&>=ATORw$c)wp-Odh zClLY_desKl1H6%cmi7V~K7`3SPAEeKOOkn!+r$JDsoTWrgkH2bR0J{`JTWu6dgMPJ zg@@+&|IUntpo~Vd{dtQX#h?{Il6wwMOrUnd6AKW2q6#6*_ez3LEZT)85fFJpOo)|y zL(E6WLlr`pA14X@s9=ay!F>6%I5p&7h&leOSgSag-dR>Uw7-fz+RTI)RH1><_a^kC zf)$C*Bt3>O$Qy%UBOHpK!pdS?%Lu-xa2Q)CW=o(?K>I%g5gA(yEnx=L3So!?2z02@ z5_@UWb!RjyVfBkEhJg@^YK1Uv^@JK!FeGu|iupZV5yDZ_k&2+2h!zC%>J{NQDj1MR z$ctkM45%p^p;$>A%RqR6s)aCA$%LOflUMn~xPK=%kRM*9`4|5^3u-`wC+s_3&~Y-}N} qZ**AF(apij%frFjS;FOvpNRn}y3U7)Xb}CCMcZ>`jVZKe^8W$EIjlke diff --git a/pom.xml b/pom.xml index 026908f..36308ec 100644 --- a/pom.xml +++ b/pom.xml @@ -134,7 +134,7 @@ spring-boot-maven-plugin 2.3.7.RELEASE - com.huawei.demo.DemoApplication + com.huawei.datashow.DemoApplication diff --git a/src/main/java/com/huawei/datashow/controller/ConnectionPoolController.java b/src/main/java/com/huawei/datashow/controller/ConnectionPoolController.java index 71de9ff..687d55e 100644 --- a/src/main/java/com/huawei/datashow/controller/ConnectionPoolController.java +++ b/src/main/java/com/huawei/datashow/controller/ConnectionPoolController.java @@ -2,6 +2,8 @@ package com.huawei.datashow.controller; import com.huawei.datashow.service.ConnectionPoolService; import com.huawei.datashow.bean.ConnectionPoolDTOBean; +import com.huawei.datashow.util.MyException; +import com.huawei.datashow.util.Result; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; @@ -28,9 +30,14 @@ public class ConnectionPoolController } @PostMapping("/addHikariCP") - public String addHikariCP(@Validated @RequestBody ConnectionPoolDTOBean dto) + public Result addHikariCP(@Validated @RequestBody ConnectionPoolDTOBean dto) { - return connectionPoolService.addHikariCP(dto); + try { + connectionPoolService.addHikariCP(dto); + return Result.OK("建立数据源连接成功!"); + } catch (MyException e) { + return Result.error(e.getMessage()); + } } @PostMapping("/removeHikariCP") diff --git a/src/main/java/com/huawei/datashow/controller/HandleDataSourceController.java b/src/main/java/com/huawei/datashow/controller/HandleDataSourceController.java index c39976d..2f93253 100644 --- a/src/main/java/com/huawei/datashow/controller/HandleDataSourceController.java +++ b/src/main/java/com/huawei/datashow/controller/HandleDataSourceController.java @@ -27,7 +27,7 @@ public class HandleDataSourceController { try { handleDataSourceServiceImpl.saveDataSource(pollName, sql, dataSourceName); return Result.OK("数据源保存成功"); - } catch (IOException e) { + } catch (Exception e) { e.printStackTrace(); return Result.error("数据源保存失败"); } @@ -85,6 +85,17 @@ public class HandleDataSourceController { } } + @GetMapping("/reload-data-source") + public Result reloadDataSource(@RequestParam("dataSourceName") String dataSourceName) { + try { + handleDataSourceServiceImpl.reloadDataSource(dataSourceName); + return Result.OK(); + } catch (IOException ioException) { + ioException.printStackTrace(); + return Result.error("接口调用失败"); + } + } + @GetMapping("/save-edit-data-source") public Result saveEditDataSource(@RequestParam("dataSourceName") String dataSourceName) { try { diff --git a/src/main/java/com/huawei/datashow/controller/OpenGaussDataBaseController.java b/src/main/java/com/huawei/datashow/controller/OpenGaussDataBaseController.java index 182c065..6c926b2 100644 --- a/src/main/java/com/huawei/datashow/controller/OpenGaussDataBaseController.java +++ b/src/main/java/com/huawei/datashow/controller/OpenGaussDataBaseController.java @@ -1,6 +1,9 @@ package com.huawei.datashow.controller; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import com.fasterxml.jackson.core.JsonProcessingException; +import com.huawei.datashow.bean.smbms_3DdataBean; +import com.huawei.datashow.mapper.OpenGaussDataBaseMapper; import com.huawei.datashow.service.OpenGaussDataBaseService; import com.huawei.datashow.util.SQLUtil; import org.springframework.beans.factory.annotation.Autowired; @@ -14,9 +17,12 @@ public class OpenGaussDataBaseController @Autowired private OpenGaussDataBaseService openGaussDataBaseServiceImpl; + @Autowired + private OpenGaussDataBaseMapper openGaussDataBaseMapper; + @GetMapping("/getSchema") public String getSchema(@RequestParam("pollName") String pollName, - @RequestParam("sql") String sql) throws JsonProcessingException { + @RequestParam("sql") String sql) throws Exception { return openGaussDataBaseServiceImpl.getSourceData(pollName, sql); } @@ -29,7 +35,7 @@ public class OpenGaussDataBaseController */ @GetMapping("/getTables") public String getTables(@RequestParam("pollName") String pollName, - @RequestParam("sql") String sql) throws JsonProcessingException { + @RequestParam("sql") String sql) throws Exception { return openGaussDataBaseServiceImpl.getSourceData(pollName, sql); } @@ -42,7 +48,7 @@ public class OpenGaussDataBaseController */ @GetMapping("/getSourceData") public String getSourceData(@RequestParam("pollName") String pollName, - @RequestParam("sql") String sql) throws JsonProcessingException { + @RequestParam("sql") String sql) throws Exception { return openGaussDataBaseServiceImpl.getSourceData(pollName,sql); } @@ -58,15 +64,29 @@ public class OpenGaussDataBaseController public String showSourceData(@RequestParam("pollName") String pollName, @RequestParam("sql") String sql, @RequestParam("startIndex") int startIndex, - @RequestParam("limit") int limit) throws JsonProcessingException { + @RequestParam("limit") int limit) throws Exception { String limitSql = SQLUtil.getLimitSql(sql, startIndex, limit); return openGaussDataBaseServiceImpl.getSourceData(pollName, limitSql); } @GetMapping("/getCount") public String getCount(@RequestParam("pollName") String pollName, - @RequestParam("sql") String sql) throws JsonProcessingException { + @RequestParam("sql") String sql) throws Exception { String countSql = SQLUtil.getCountSql(sql); return openGaussDataBaseServiceImpl.getSourceData(pollName, countSql); } + + @GetMapping("/insert") + public String insert(@RequestParam("pollName") String pollName) { + DynamicDataSourceContextHolder.push(pollName); + for (int i = 6126; i < 200000; i++) { + smbms_3DdataBean smbms_3DdataBean = new smbms_3DdataBean(); + smbms_3DdataBean.setId(i); + smbms_3DdataBean.setFailure_percent((float) Math.random()); + smbms_3DdataBean.setSuccess_percent((float) Math.random()); + smbms_3DdataBean.setUnknown_percent((float) Math.random()); + openGaussDataBaseMapper.insert(smbms_3DdataBean); + } + return "成功"; + } } diff --git a/src/main/java/com/huawei/datashow/controller/UploadFileController.java b/src/main/java/com/huawei/datashow/controller/UploadFileController.java index 78d4369..0ef2aba 100644 --- a/src/main/java/com/huawei/datashow/controller/UploadFileController.java +++ b/src/main/java/com/huawei/datashow/controller/UploadFileController.java @@ -27,11 +27,11 @@ public class UploadFileController return Result.OK(); } catch (IOException ioException) { ioException.printStackTrace(); - return Result.error("接口调用失败"); + return Result.error("已上传,但文件为空或格式不匹配,请删除并重新上传!"); } } - @PostMapping("/uploadCSVFile") + @PostMapping("/uploadCSVOrTxtFile") public Result uploadCSVFile(MultipartFile file) { try { @@ -39,33 +39,7 @@ public class UploadFileController return Result.OK(); } catch (IOException ioException) { ioException.printStackTrace(); - return Result.error("接口调用失败"); - } - } - - @PostMapping("/uploadTXTFile") - public String uploadTXTFile(MultipartFile file, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) - { - if (file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.')).equals(".txt")) - { - try - { - httpServletRequest.getRequestDispatcher("/uploadCSVFile").forward(httpServletRequest,httpServletResponse); - } - catch (ServletException servletException) - { - servletException.printStackTrace(); - return "fail"; - } - catch (IOException ioException) - { - return "fail"; - } - return "redirect"; - } - else - { - return "unfit"; + return Result.error("已上传,但上传文件为空或格式不匹配,请删除并重新上传!"); } } } diff --git a/src/main/java/com/huawei/datashow/service/ConnectionPoolService.java b/src/main/java/com/huawei/datashow/service/ConnectionPoolService.java index c08f181..b302e22 100644 --- a/src/main/java/com/huawei/datashow/service/ConnectionPoolService.java +++ b/src/main/java/com/huawei/datashow/service/ConnectionPoolService.java @@ -1,11 +1,12 @@ package com.huawei.datashow.service; import com.huawei.datashow.bean.ConnectionPoolDTOBean; +import com.huawei.datashow.util.MyException; public interface ConnectionPoolService { String getConnectionPoolsNow(); - String addHikariCP(ConnectionPoolDTOBean dto); + void addHikariCP(ConnectionPoolDTOBean dto) throws MyException; String removeHikariCP(String poolName); } diff --git a/src/main/java/com/huawei/datashow/service/ConnectionPoolServiceImpl.java b/src/main/java/com/huawei/datashow/service/ConnectionPoolServiceImpl.java index eab64b6..ef9fc4b 100644 --- a/src/main/java/com/huawei/datashow/service/ConnectionPoolServiceImpl.java +++ b/src/main/java/com/huawei/datashow/service/ConnectionPoolServiceImpl.java @@ -5,6 +5,7 @@ import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; import com.baomidou.dynamic.datasource.creator.HikariDataSourceCreator; import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; import com.huawei.datashow.bean.ConnectionPoolDTOBean; +import com.huawei.datashow.util.MyException; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -32,24 +33,39 @@ public class ConnectionPoolServiceImpl implements ConnectionPoolService } @Override - public String addHikariCP(ConnectionPoolDTOBean dto) - { + public void addHikariCP(ConnectionPoolDTOBean dto) throws MyException { DataSourceProperty dataSourceProperty = new DataSourceProperty(); BeanUtils.copyProperties(dto, dataSourceProperty); dataSourceProperty.setLazy(true); DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource; DataSource dataSource = hikariDataSourceCreator.createDataSource(dataSourceProperty); ds.addDataSource(dto.getPollName(), dataSource); - try - { + try { openGaussDataBaseService.getSourceData(dto.getPollName(),"select datname from pg_database"); } - catch(Exception e) - { - ds.getDataSources().remove(dto.getPollName()); - return "fail"; + catch (Exception e) { + String exception = e.toString(); + if (exception.contains("Invalid username/password")) { + throw new MyException("Invalid username/password\n 用户名或密码错误"); + } + else if (exception.contains("Forbid remote connection with initial user")) { + throw new MyException("Forbid remote connection with initial user\n 禁止使用数据库初始用户进行远程连接"); + } + else if (exception.contains("no pg_hba.conf entry")) { + throw new MyException("no pg_hba.conf entry for host\n 未配置openGauss远程访问白名单"); + } + else if (exception.contains("database") && exception.contains("does not exist")) { + throw new MyException("database does not exist\n 数据库不存在"); + } + else if (exception.contains("Check that the hostname and port are correct")) { + throw new MyException("Check that the hostname and port are correct and " + + "that the postmaster is accepting TCP/IP connections\n 请检查主机、端口号是否正确"); + } + else { + throw new MyException("请检查是否有非法输入,或联系开发者"); + } + } - return "success"; } @Override diff --git a/src/main/java/com/huawei/datashow/service/HandleDataSourceService.java b/src/main/java/com/huawei/datashow/service/HandleDataSourceService.java index 37c186f..1704621 100644 --- a/src/main/java/com/huawei/datashow/service/HandleDataSourceService.java +++ b/src/main/java/com/huawei/datashow/service/HandleDataSourceService.java @@ -15,7 +15,7 @@ public interface HandleDataSourceService { * @param dataSourceName * @return */ - public void saveDataSource(String pollName, String sql, String dataSourceName) throws IOException; + public void saveDataSource(String pollName, String sql, String dataSourceName) throws Exception; /** * Read source data from local file @@ -53,5 +53,7 @@ public interface HandleDataSourceService { */ public void editDataSource(String dataSourceName, DataSourceEditBean dataSourceEditBean) throws IOException; + public void reloadDataSource(String dataSourceName) throws IOException; + public void saveEditDataSource(String dataSourceName) throws IOException; } diff --git a/src/main/java/com/huawei/datashow/service/HandleDataSourceServiceImpl.java b/src/main/java/com/huawei/datashow/service/HandleDataSourceServiceImpl.java index 7be2d5e..a261a43 100644 --- a/src/main/java/com/huawei/datashow/service/HandleDataSourceServiceImpl.java +++ b/src/main/java/com/huawei/datashow/service/HandleDataSourceServiceImpl.java @@ -23,7 +23,7 @@ public class HandleDataSourceServiceImpl implements HandleDataSourceService{ OpenGaussDataBaseService openGaussDataBaseServiceImpl; @Override - public void saveDataSource(String pollName, String sql, String dataSourceName) throws IOException { + public void saveDataSource(String pollName, String sql, String dataSourceName) throws Exception { String countSql = SQLUtil.getCountSql(sql); List arrayList = JSON.parseObject(openGaussDataBaseServiceImpl.getSourceData(pollName, countSql), ArrayList.class); int count = (int) arrayList.get(0).get("count"); @@ -86,6 +86,11 @@ public class HandleDataSourceServiceImpl implements HandleDataSourceService{ YAMLUtil.writeYAMLFile(dataSourceName, dataSourceEditBean); } + @Override + public void reloadDataSource(String dataSourceName) throws IOException { + YAMLUtil.createYAMLFile(dataSourceName); + } + @Override public void saveEditDataSource(String dataSourceName) throws IOException { int rowCount = CSVUtil.getRowCount(dataSourceName); diff --git a/src/main/java/com/huawei/datashow/service/OpenGaussDataBaseService.java b/src/main/java/com/huawei/datashow/service/OpenGaussDataBaseService.java index 4557934..e8b63b2 100644 --- a/src/main/java/com/huawei/datashow/service/OpenGaussDataBaseService.java +++ b/src/main/java/com/huawei/datashow/service/OpenGaussDataBaseService.java @@ -13,5 +13,5 @@ public interface OpenGaussDataBaseService * @return * @throws JsonProcessingException */ - String getSourceData(String pollName, String sql) throws JsonProcessingException; + String getSourceData(String pollName, String sql) throws Exception; } diff --git a/src/main/java/com/huawei/datashow/service/OpenGaussDataBaseServiceImpl.java b/src/main/java/com/huawei/datashow/service/OpenGaussDataBaseServiceImpl.java index ff49856..9c8fd9a 100644 --- a/src/main/java/com/huawei/datashow/service/OpenGaussDataBaseServiceImpl.java +++ b/src/main/java/com/huawei/datashow/service/OpenGaussDataBaseServiceImpl.java @@ -26,12 +26,16 @@ public class OpenGaussDataBaseServiceImpl implements OpenGaussDataBaseService @Override - public String getSourceData(String pollName, String sql) - { + public String getSourceData(String pollName, String sql) { DynamicDataSourceContextHolder.push(pollName); - List data = openGaussDataBaseMapper.customSql(sql); - JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; - String json = JSON.toJSONString(data, filter, SerializerFeature.WriteDateUseDateFormat); - return json; + try { + List data = openGaussDataBaseMapper.customSql(sql); + JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + String json = JSON.toJSONString(data, filter, SerializerFeature.WriteDateUseDateFormat); + return json; + } + catch (Exception e) { + throw e; + } } } diff --git a/src/main/java/com/huawei/datashow/util/MyException.java b/src/main/java/com/huawei/datashow/util/MyException.java new file mode 100644 index 0000000..92b17e1 --- /dev/null +++ b/src/main/java/com/huawei/datashow/util/MyException.java @@ -0,0 +1,11 @@ +package com.huawei.datashow.util; + +public class MyException extends java.lang.Exception { + + private String message; + + public MyException(String message){ + super(message); + this.message = message; + } +} diff --git a/src/main/java/com/huawei/datashow/util/SQLUtil.java b/src/main/java/com/huawei/datashow/util/SQLUtil.java index 047ff8c..2b17f23 100644 --- a/src/main/java/com/huawei/datashow/util/SQLUtil.java +++ b/src/main/java/com/huawei/datashow/util/SQLUtil.java @@ -22,16 +22,7 @@ public class SQLUtil { * @return */ public static String getCountSql(String sql) { - String tableName = getColumnName(sql); - String countSql = sql.replace(tableName, "count(*)"); - - if (countSql.lastIndexOf("ORDER") != -1) { - countSql = countSql.substring(0, countSql.lastIndexOf("ORDER")); - } - - if (sql.lastIndexOf("GROUP") != -1) { - countSql = countSql.substring(0, countSql.lastIndexOf("GROUP")); - } + String countSql = "SELECT COUNT(*) FROM (" + sql + ")"; return countSql; } diff --git a/src/main/java/com/huawei/datashow/util/fileUtils/CSVUtil.java b/src/main/java/com/huawei/datashow/util/fileUtils/CSVUtil.java index 730d6f4..fc72c3a 100644 --- a/src/main/java/com/huawei/datashow/util/fileUtils/CSVUtil.java +++ b/src/main/java/com/huawei/datashow/util/fileUtils/CSVUtil.java @@ -121,6 +121,7 @@ public class CSVUtil { linkedHashMap.remove(columnName); } result.put("columnNames", linkedHashMap.keySet()); + in.close(); return JSON.toJSONString(result); } @@ -136,6 +137,7 @@ public class CSVUtil { while(br.readLine()!=null){ rowCount++; } + br.close(); return rowCount; } diff --git a/src/main/java/com/huawei/datashow/util/fileUtils/YAMLUtil.java b/src/main/java/com/huawei/datashow/util/fileUtils/YAMLUtil.java index 79f28ce..2f831dd 100644 --- a/src/main/java/com/huawei/datashow/util/fileUtils/YAMLUtil.java +++ b/src/main/java/com/huawei/datashow/util/fileUtils/YAMLUtil.java @@ -35,6 +35,7 @@ public class YAMLUtil { dataSourceEdit.put("deleteRowIndex", new ArrayList<>()); dataSourceEdit.put("deleteColumnName", new ArrayList<>()); yaml.dump(dataSourceEdit, fileWriter); + fileWriter.close(); } public static void writeYAMLFile(String fileName, DataSourceEditBean dataSourceEditBean) throws IOException { @@ -62,18 +63,23 @@ public class YAMLUtil { dataSourceEditBeanYaml.setDeleteRowIndex(deleteRowIndexYaml); dataSourceEditBeanYaml.setDeleteColumnName(deleteColumnNameYaml); + FileWriter fileWriter = new FileWriter(new File(getPath(fileName))); + Yaml yaml = getYaml(); - yaml.dump(dataSourceEditBeanYaml, new FileWriter(new File(getPath(fileName)))); + yaml.dump(dataSourceEditBeanYaml, fileWriter); + fileWriter.close(); } public static void removeYAMLFile(String fileName) throws IOException { Files.delete(Paths.get(getPath(fileName))); } - public static DataSourceEditBean readYAMLFile(String fileName) throws FileNotFoundException { + public static DataSourceEditBean readYAMLFile(String fileName) throws IOException { Yaml yaml = getYaml(); FileInputStream fileInputStream = new FileInputStream(new File(getPath(fileName))); - return yaml.loadAs(fileInputStream, DataSourceEditBean.class); + DataSourceEditBean dataSourceEditBean = yaml.loadAs(fileInputStream, DataSourceEditBean.class); + fileInputStream.close(); + return dataSourceEditBean; } } diff --git a/src/main/java/com/huawei/datashow/vue/src/assets/css/addsourcedata/addsourcedata.css b/src/main/java/com/huawei/datashow/vue/src/assets/css/addsourcedata/addsourcedata.css index 4b6d4ba..9a1309d 100644 --- a/src/main/java/com/huawei/datashow/vue/src/assets/css/addsourcedata/addsourcedata.css +++ b/src/main/java/com/huawei/datashow/vue/src/assets/css/addsourcedata/addsourcedata.css @@ -7,7 +7,7 @@ height: 100%; } -#img_opengauss{ +#img_database{ width: 300px; height: 300px; } @@ -44,7 +44,7 @@ } .image{ - margin-top:50% + margin-top:40% } .description{ diff --git a/src/main/java/com/huawei/datashow/vue/src/assets/css/datasource/datasource.css b/src/main/java/com/huawei/datashow/vue/src/assets/css/datasource/datasource.css index 9c96b67..d8f4820 100644 --- a/src/main/java/com/huawei/datashow/vue/src/assets/css/datasource/datasource.css +++ b/src/main/java/com/huawei/datashow/vue/src/assets/css/datasource/datasource.css @@ -1,7 +1,3 @@ -#table{ - height: 90%; -} - #footer{ text-align: right; font-size: 12px; diff --git a/src/main/java/com/huawei/datashow/vue/src/assets/css/dialog/dialog-form/dialog-form.css b/src/main/java/com/huawei/datashow/vue/src/assets/css/dialog/dialog-form/dialog-form.css index 7e19fd5..01baa89 100644 --- a/src/main/java/com/huawei/datashow/vue/src/assets/css/dialog/dialog-form/dialog-form.css +++ b/src/main/java/com/huawei/datashow/vue/src/assets/css/dialog/dialog-form/dialog-form.css @@ -1,3 +1,7 @@ .el-select { width: 100%; +} + +.el-checkbox { + margin-left: 20px; } \ No newline at end of file diff --git a/src/main/java/com/huawei/datashow/vue/src/assets/css/echarts/echarts.css b/src/main/java/com/huawei/datashow/vue/src/assets/css/echarts/echarts.css index 16fd1ce..74d725b 100644 --- a/src/main/java/com/huawei/datashow/vue/src/assets/css/echarts/echarts.css +++ b/src/main/java/com/huawei/datashow/vue/src/assets/css/echarts/echarts.css @@ -1,9 +1,9 @@ #echarts_container .el-aside { background-color:#EBEEF5 } -#echarts_container .scrollbar { +/* #echarts_container .scrollbar { height: 100% -} +} */ #echarts_container .el-form-item { margin-top:20px; margin-left:20px diff --git a/src/main/java/com/huawei/datashow/vue/src/assets/css/uisourcedata/uisourcedata.css b/src/main/java/com/huawei/datashow/vue/src/assets/css/uisourcedata/uisourcedata.css index 32fc6d6..e6dfce4 100644 --- a/src/main/java/com/huawei/datashow/vue/src/assets/css/uisourcedata/uisourcedata.css +++ b/src/main/java/com/huawei/datashow/vue/src/assets/css/uisourcedata/uisourcedata.css @@ -1,6 +1,12 @@ #scrollbar{ height: 100% } +#backButton{ + width: 100%; + border-radius: 0; + height:30px; + font-size: small; +} #aside{ background-color:#F2F6FC diff --git a/src/main/java/com/huawei/datashow/vue/src/assets/database-2-line.svg b/src/main/java/com/huawei/datashow/vue/src/assets/database-2-line.svg new file mode 100644 index 0000000..0eef615 --- /dev/null +++ b/src/main/java/com/huawei/datashow/vue/src/assets/database-2-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/java/com/huawei/datashow/vue/src/assets/folder-upload-line.svg b/src/main/java/com/huawei/datashow/vue/src/assets/folder-upload-line.svg new file mode 100644 index 0000000..9f205bc --- /dev/null +++ b/src/main/java/com/huawei/datashow/vue/src/assets/folder-upload-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/java/com/huawei/datashow/vue/src/assets/language/local_en.json b/src/main/java/com/huawei/datashow/vue/src/assets/language/local_en.json index 87da23a..0f53604 100644 --- a/src/main/java/com/huawei/datashow/vue/src/assets/language/local_en.json +++ b/src/main/java/com/huawei/datashow/vue/src/assets/language/local_en.json @@ -9,8 +9,7 @@ "button_toLogin":"Add database connection", "button_toUISourceData":"Select database connection", "button_toUploadXlsOrXlsxFile":"Import xls or xlsx file", - "button_toUploadCSVFile":"Import csv file", - "button_toUploadTxtFile":"Import txt file" + "button_toUploadCSVOrTXTFile":"Import csv or txt file" } }, "contextbutton": { @@ -23,12 +22,13 @@ "button": { "button_deleteSelection": "Delete the selected line", "button_preserve": "Save changes", - "button_deleteSourceData": "Remove data sources", + "button_reload": "Reload data source", + "button_deleteSourceData": "Remove data source", "button_fatherMethodHandelSelectDataIsActive": "Visualization" }, "message": { "deleteMessage":"Deleted data is selected, please do not delete it repeatedly", - "bigSizeMessage":"The amount of data is large and it takes a long time to save and modify. Do you want to execute it?" + "bigSizeMessage":"The amount of data is large and it takes a long time to save and modify!" } }, "dialog-form": { @@ -76,9 +76,17 @@ "axis_right":"Grid right distance", "axis_top":"Distance above grid", "axis_bottom":"Distance below the grid", + "xAxis_name":"xAxis name", + "xAxis_name_color":"Color of xAxis name", + "xAxis_name_size":"Font size of xAxis name", "xAxis_font_size":"Horizontal axis font size", "xAxis_label_distance":"Label interval", "xAxis_label_angel":"Label rotation angle", + "yAxis_name":"yAxis name", + "yAxis_max":"yAxis value Max", + "yAxis_min":"yAxis value Min", + "yAxis_name_color":"Color of yAxis name", + "yAxis_name_size":"Font size of yAxis name", "yAxis_font_size":"Vertical axis font size", "data_zoom":"Zoom control below", "echarts_text_label":"Graphic text label" @@ -155,6 +163,8 @@ "grid_right_distance": "Grid right distance", "grid_top_distance": "Distance above grid", "grid_bottom_distance": "Distance below the grid", + "xAxis_max":"xAxis value Max", + "xAxis_min":"xAxis value Min", "Horizontal_font_size": "Horizontal axis font size", "Tab_spacing": "Label interval", "Label_rotation_angle": "Label rotation angle", @@ -214,6 +224,14 @@ "hide": "hide", "open": "open", "close": "close", + "top_left": "upper left", + "top": "Directly above", + "top_right": "upper right", + "right": "right", + "bottom_right": "lower right", + "bottom": "Directly below", + "bottom_left": "lower left", + "left": "left", "horizontal_arrangement": "Horizontal arrangement", "vertical_arrangement": "Vertical arrangement" }, @@ -323,13 +341,15 @@ "uploadcsvfile": { "button": { "button_select_file": "Select file", - "button_submitUpload": "Upload to server" + "button_submitUpload": "Upload to server", + "button_back":"cancel" }, "div": { "make_sure": "Please make sure that the first line in the uploaded CSV file is the header!" }, "message": { - "file_num":"The current limit is 1 file!" + "file_num":"The current limit is 1 file!", + "upload_error":"Oversize!" } }, "uploadtxtfile": { @@ -364,8 +384,10 @@ "loading": { "text": "Loading" }, + "selectAll":"All", "show":"display", "hidden":"Don't show", + "operation":"operation", "remove":"delete", "submit":"Submit", "error": "error", @@ -373,5 +395,6 @@ "confirm" : "determine", "cancel": "cancel", "success":"success", - "fail":"fail" + "fail":"fail", + "back":"back" } \ No newline at end of file diff --git a/src/main/java/com/huawei/datashow/vue/src/assets/language/local_zh.json b/src/main/java/com/huawei/datashow/vue/src/assets/language/local_zh.json index 43e3bf8..873e833 100644 --- a/src/main/java/com/huawei/datashow/vue/src/assets/language/local_zh.json +++ b/src/main/java/com/huawei/datashow/vue/src/assets/language/local_zh.json @@ -1,7 +1,7 @@ { "addsourcedata": { "span": { - "span_opengauss":"从数据库中导入", + "span_opengauss":"从openGauss数据库中导入", "span_excel":"从外部文件导入", "span_txt":"从txt文件导入" }, @@ -9,8 +9,7 @@ "button_toLogin":"添加数据库连接", "button_toUISourceData":"选择数据库连接", "button_toUploadXlsOrXlsxFile":"导入xls或xlsx文件", - "button_toUploadCSVFile":"导入csv文件", - "button_toUploadTxtFile":"导入txt文件" + "button_toUploadCSVOrTXTFile":"导入csv或txt文件" } }, "contextbutton": { @@ -23,12 +22,13 @@ "button": { "button_deleteSelection": "删除所选行", "button_preserve": "保存修改", + "button_reload": "重新加载数据源", "button_deleteSourceData": "删除数据源", "button_fatherMethodHandelSelectDataIsActive": "可视化" }, "message": { "deleteMessage":"选择了已删除的数据,请勿重复删除", - "bigSizeMessage":"数据量较大,保存修改耗时较长,是否执行?" + "bigSizeMessage":"数据量较大,保存修改耗时较长!" } }, "dialog-form": { @@ -76,9 +76,17 @@ "axis_right":"网格右侧距离", "axis_top":"网格上侧距离", "axis_bottom":"网格下侧距离", + "xAxis_name":"横轴名称", + "xAxis_name_color":"横轴名称颜色", + "xAxis_name_size":"横轴名称大小", "xAxis_font_size":"横轴字体大小", "xAxis_label_distance":"标签间隔", "xAxis_label_angel":"标签旋转角度", + "yAxis_name":"纵轴名称", + "yAxis_max":"纵轴最大值", + "yAxis_min":"纵轴最小值", + "yAxis_name_color":"纵轴名称颜色", + "yAxis_name_size":"纵轴名称大小", "yAxis_font_size":"纵轴字体大小", "data_zoom":"下方缩放控件", "echarts_text_label":"图形文本标签" @@ -155,6 +163,8 @@ "grid_right_distance": "网格右侧距离", "grid_top_distance": "网格上侧距离", "grid_bottom_distance": "网格下侧距离", + "xAxis_max":"横轴最大值", + "xAxis_min":"横轴最小值", "Horizontal_font_size": "横轴字体大小", "Tab_spacing": "标签间隔", "Label_rotation_angle": "标签旋转角度", @@ -214,6 +224,14 @@ "hide": "隐藏", "open": "开启", "close": "关闭", + "top_left": "左上方", + "top": "正上方", + "top_right": "右上方", + "right": "右侧", + "bottom_right": "右下方", + "bottom": "正下方", + "bottom_left": "左下方", + "left": "左侧", "horizontal_arrangement": "水平排列", "vertical_arrangement": "垂直排列" }, @@ -266,7 +284,7 @@ }, "message": { "data_source_name": "请输入数据源名称(请避免与已有数据源名称重复且不包含'.')", - "wrong_data_source_name": "数据源名称为空或不合法!" + "wrong_data_source_name": "请检查数据源名称是否已存在或为空或不合法!" } }, "uisourcedata": { @@ -323,13 +341,15 @@ "uploadcsvfile": { "button": { "button_select_file": "选取文件", - "button_submitUpload": "上传到服务器" + "button_submitUpload": "上传到服务器", + "button_back":"取消上传" }, "div": { "make_sure": "请务必确认上传的CSV文件中的第一行是表头!" }, "message": { - "file_num":"当前限制选择1个文件!" + "file_num":"当前限制选择1个文件!", + "upload_error":"超出文件大小限制" } }, "uploadtxtfile": { @@ -364,8 +384,10 @@ "loading": { "text": "正在加载" }, + "selectAll":"全选", "show":"显示", "hidden":"不显示", + "operation":"操作", "remove":"删除", "submit":"提交", "error": "错误", @@ -373,5 +395,6 @@ "confirm" : "确定", "cancel": "取消", "success":"成功", - "fail":"失败" + "fail":"失败", + "back":"返回" } \ No newline at end of file diff --git a/src/main/java/com/huawei/datashow/vue/src/components/addsourcedata/index.vue b/src/main/java/com/huawei/datashow/vue/src/components/addsourcedata/index.vue index 966be5e..ca55941 100644 --- a/src/main/java/com/huawei/datashow/vue/src/components/addsourcedata/index.vue +++ b/src/main/java/com/huawei/datashow/vue/src/components/addsourcedata/index.vue @@ -1,9 +1,9 @@ @@ -61,12 +48,9 @@ import router from '@/router'; toUploadXlsOrXlsxFile(){ router.push('/home/processeddatas/uploadxlsorxlsxfile') }, - toUploadCSVFile(){ - router.push('/home/processeddatas/uploadcsvfile') - }, - toUploadTxtFile(){ - router.push('/home/processeddatas/uploadtxtfile') - }, + toUploadCSVOrTxtFile(){ + router.push('/home/processeddatas/uploadcsvortxtfile') + } } } diff --git a/src/main/java/com/huawei/datashow/vue/src/components/datasource/index.vue b/src/main/java/com/huawei/datashow/vue/src/components/datasource/index.vue index 0f811f4..1909459 100644 --- a/src/main/java/com/huawei/datashow/vue/src/components/datasource/index.vue +++ b/src/main/java/com/huawei/datashow/vue/src/components/datasource/index.vue @@ -13,8 +13,13 @@ :element-loading-text="$t('loading.text')" element-loading-spinner="el-icon-loading" element-loading-background="rgba(0, 0, 0, 0.8)"> - + + + + {{$t('datasource.button.button_deleteSelection')}} + + {{$t('datasource.button.button_reload')}} + import ContextButton from '@/components/contextbutton' import axios from 'axios' +import router from '@/router' export default { props:[ 'dataSourceName' ], @@ -146,12 +158,31 @@ import axios from 'axios' this.fetchDataSource() }, + async reload() { + this.dataSourceEdit.deleteColumnName = [] + this.dataSourceEdit.deleteRowIndex = [] + await axios({ + url:'/handle-data-source/reload-data-source', + method:"get", + params:{ + 'dataSourceName':this.dataSourceName + } + }).then( + response => { + this.showMessage(this.$t('success'), response.data.message, "success") + }, + error => { + this.showMessage(this.$t('fail'), response.data.message, "error") + }) + this.fetchDataSource() + }, + async preserve(){ if (this.count < 10000) { this.saveEdit(); return; } - this.$confirm(this.$t('bigSizeMessage'), this.$t('tips'), { + this.$confirm(this.$t('datasource.message.bigSizeMessage'), this.$t('tips'), { confirmButtonText: this.$t('confirm'), cancelButtonText: this.$t('cancel'), type: 'warning' @@ -177,7 +208,8 @@ import axios from 'axios' type: 'success' }) this.sourcedata = [] - this.$parent.$parent.$parent.fetchDataSourceList() + this.headers = [] + this.$parent.$parent.$parent.fetchDataSourceList() }, error => { this.$message({ @@ -227,6 +259,16 @@ import axios from 'axios' this.dataSourceEdit.deleteColumnName.push(this.currentColumn.property) this.removeRowAndColumn() }, + + deleteRow (index, row) { + if (JSON.stringify(row) == "{}") { + this.showMessage(this.$t('error'), this.$t('datasource.message.deleteMessage'), "error") + return + } + let rowIndexInDataSource = this.getRowIndexInDataSource(row) + this.dataSourceEdit.deleteRowIndex.push(rowIndexInDataSource) + this.removeRowAndColumn() + }, async fetchDataSource() { this.el_table_loading = true @@ -296,7 +338,9 @@ import axios from 'axios' }) this.fetchDataSource() this.fetchDataSourceSize() - this.$parent.$parent.$parent.el_aside_loading = false + this.$parent.$parent.$parent.el_aside_loading = false + this.dataSourceEdit.deleteColumnName = [] + this.dataSourceEdit.deleteRowIndex = [] }, // Get the index of row in data source diff --git a/src/main/java/com/huawei/datashow/vue/src/components/dialog/dialog-form/index.vue b/src/main/java/com/huawei/datashow/vue/src/components/dialog/dialog-form/index.vue index 7f50f9e..8eabf1a 100644 --- a/src/main/java/com/huawei/datashow/vue/src/components/dialog/dialog-form/index.vue +++ b/src/main/java/com/huawei/datashow/vue/src/components/dialog/dialog-form/index.vue @@ -14,6 +14,7 @@ + {{$t('selectAll')}} - + + {{$t('selectAll')}} + {{$t('selectAll')}} + {{$t('selectAll')}} {} ) - } + }, + form_y_options_selectAll(val) { + this.form.yOptions = [] + if (val) { + for (let i = 0; i < this.columnNames.length; i++) { + this.form.yOptions.push(this.columnNames[i]); + } + } + }, + combination_form_bar_y_options_selectAll(val) { + this.combinationForm.yOptions.bar_yOptions = [] + if (val) { + for (let i = 0; i < this.columnNames.length; i++) { + this.combinationForm.yOptions.bar_yOptions.push(this.columnNames[i]); + } + } + }, + combination_form_line_y_options_selectAll(val) { + this.combinationForm.yOptions.line_yOptions = [] + if (val) { + for (let i = 0; i < this.columnNames.length; i++) { + this.combinationForm.yOptions.line_yOptions.push(this.columnNames[i]); + } + } + }, }, }; diff --git a/src/main/java/com/huawei/datashow/vue/src/components/echarts/Pie.vue b/src/main/java/com/huawei/datashow/vue/src/components/echarts/Pie.vue index 7c080e7..3935882 100644 --- a/src/main/java/com/huawei/datashow/vue/src/components/echarts/Pie.vue +++ b/src/main/java/com/huawei/datashow/vue/src/components/echarts/Pie.vue @@ -4,7 +4,7 @@ - + @@ -14,7 +14,7 @@ - + @@ -102,7 +102,7 @@ - + - + diff --git a/src/main/java/com/huawei/datashow/vue/src/components/echarts/Radar.vue b/src/main/java/com/huawei/datashow/vue/src/components/echarts/Radar.vue index cbc9e0b..74e688c 100644 --- a/src/main/java/com/huawei/datashow/vue/src/components/echarts/Radar.vue +++ b/src/main/java/com/huawei/datashow/vue/src/components/echarts/Radar.vue @@ -4,7 +4,7 @@ - + @@ -13,7 +13,7 @@ - + - + - + diff --git a/src/main/java/com/huawei/datashow/vue/src/components/echarts/YBar.vue b/src/main/java/com/huawei/datashow/vue/src/components/echarts/YBar.vue index aca677e..ef8f9a3 100644 --- a/src/main/java/com/huawei/datashow/vue/src/components/echarts/YBar.vue +++ b/src/main/java/com/huawei/datashow/vue/src/components/echarts/YBar.vue @@ -2,9 +2,9 @@ - + - + @@ -14,15 +14,11 @@ - - + + - + @@ -108,8 +100,8 @@ - - + + - + - + + @change="handle_echarts_legend_orient"> - + - - - - + @@ -203,7 +184,27 @@ - + + + + + + + + + + + + + + + + + + + + + @@ -218,14 +219,26 @@ - + + + + + + + + + + + + + - + diff --git a/src/main/java/com/huawei/datashow/vue/src/components/echarts/mixin/normal/normal.js b/src/main/java/com/huawei/datashow/vue/src/components/echarts/mixin/normal/normal.js index 815bd5e..bfe1667 100644 --- a/src/main/java/com/huawei/datashow/vue/src/components/echarts/mixin/normal/normal.js +++ b/src/main/java/com/huawei/datashow/vue/src/components/echarts/mixin/normal/normal.js @@ -59,23 +59,33 @@ export const normal = { } }, tooltip: { - trigger: 'axis', - axisPointer: { type: 'cross' } + trigger: 'axis', + axisPointer: { type: 'cross' } }, boundaryGap:false, dataset:[], xAxis: { - type: 'category', - axisLabel:{ - fontSize:12, - interval:'auto', - rotate:0 - } + name: '', + nameTextStyle: { + color:'', + fontSize:12 + }, + type: 'category', + axisLabel:{ + fontSize:12, + interval:'auto', + rotate:0 + } }, yAxis: { - axisLabel:{ - fontSize:12, - } + name: '', + nameTextStyle: { + color:'', + fontSize:12 + }, + axisLabel:{ + fontSize:12, + }, }, series:[] }, @@ -115,13 +125,27 @@ export const normal = { echarts_grid_bottom:70, - + echarts_xAxis_name:'', + + echarts_xAxis_nameTextStyle_color:'#000000', + + echarts_xAxis_nameTextStyle_fontSize:12, + echarts_xAxis_axisLabel_fontSize:12, echarts_xAxis_axisLabel_interval:0, echarts_xAxis_axisLabel_rotate:0, - + + echarts_yAxis_max:0, + + echarts_yAxis_min:0, + + echarts_yAxis_name:'', + + echarts_yAxis_nameTextStyle_color:'#000000', + + echarts_yAxis_nameTextStyle_fontSize:12, echarts_yAxis_axisLabel_fontSize:12, @@ -143,12 +167,12 @@ export const normal = { } }, watch: { - datasets: { - handler: function() { - this.refreshEcharts() - }, - deep: true - } + datasets: { + handler: function() { + this.refreshEcharts() + }, + deep: true + } }, methods: { @@ -222,7 +246,6 @@ export const normal = { handle_echarts_series_name(){ - this.option.series = this.series myChart.setOption(this.option) }, @@ -306,6 +329,21 @@ export const normal = { this.option.grid.bottom = value myChart.setOption(this.option) }, + + handle_echarts_xAxis_name(value){ + this.option.xAxis.name = value + myChart.setOption(this.option) + }, + + handle_echarts_xAxis_nameTextStyle_color(){ + this.option.xAxis.nameTextStyle.color = this.echarts_xAxis_nameTextStyle_color + myChart.setOption(this.option) + }, + + handle_echarts_xAxis_nameTextStyle_fontSize(value){ + this.option.xAxis.nameTextStyle.fontSize = value + myChart.setOption(this.option) + }, handle_echarts_xAxis_axisLabel_fontSize(value){ @@ -323,7 +361,31 @@ export const normal = { myChart.setOption(this.option) }, - + handle_echarts_yAxis_max(value){ + this.option.yAxis.max = value + myChart.setOption(this.option) + }, + + handle_echarts_yAxis_min(value){ + this.option.yAxis.min = value + myChart.setOption(this.option) + }, + + handle_echarts_yAxis_name(value){ + this.option.yAxis.name = value + myChart.setOption(this.option) + }, + + handle_echarts_yAxis_nameTextStyle_color(){ + this.option.yAxis.nameTextStyle.color = this.echarts_yAxis_nameTextStyle_color + myChart.setOption(this.option) + }, + + handle_echarts_yAxis_nameTextStyle_fontSize(value){ + this.option.yAxis.nameTextStyle.fontSize = value + myChart.setOption(this.option) + }, + handle_echarts_yAxis_axisLabel_fontSize(value){ this.option.yAxis.axisLabel.fontSize = value myChart.setOption(this.option) diff --git a/src/main/java/com/huawei/datashow/vue/src/components/echarts/mixin/ybar/ybar.js b/src/main/java/com/huawei/datashow/vue/src/components/echarts/mixin/ybar/ybar.js index d090c73..cadbdd4 100644 --- a/src/main/java/com/huawei/datashow/vue/src/components/echarts/mixin/ybar/ybar.js +++ b/src/main/java/com/huawei/datashow/vue/src/components/echarts/mixin/ybar/ybar.js @@ -72,6 +72,11 @@ export const ybar = { dataset:[], xAxis: { + name: '', + nameTextStyle: { + color:'', + fontSize:12 + }, axisLabel:{ fontSize:12, interval:'auto', @@ -79,6 +84,11 @@ export const ybar = { } }, yAxis: { + name: '', + nameTextStyle: { + color:'', + fontSize:12 + }, type: 'category', axisLabel:{ fontSize:12, @@ -127,7 +137,16 @@ export const ybar = { echarts_grid_top:60, echarts_grid_bottom:70, + + echarts_xAxis_max:0, + + echarts_xAxis_min:0, + echarts_xAxis_name:'', + + echarts_xAxis_nameTextStyle_color:'#000000', + + echarts_xAxis_nameTextStyle_fontSize:12, echarts_xAxis_axisLabel_fontSize:12, @@ -135,10 +154,14 @@ export const ybar = { echarts_xAxis_axisLabel_rotate:0, + echarts_yAxis_name:'', + + echarts_yAxis_nameTextStyle_color:'#000000', + + echarts_yAxis_nameTextStyle_fontSize:12, echarts_yAxis_axisLabel_fontSize:12, - echarts_data_zoom_is_active:true, echarts_series_label_show:false, @@ -319,7 +342,31 @@ export const ybar = { this.option.grid.bottom = value myChart.setOption(this.option) }, + + handle_echarts_xAxis_max(value){ + this.option.xAxis.max = value + myChart.setOption(this.option) + }, + + handle_echarts_xAxis_min(value){ + this.option.xAxis.min = value + myChart.setOption(this.option) + }, + handle_echarts_xAxis_name(value){ + this.option.xAxis.name = value + myChart.setOption(this.option) + }, + + handle_echarts_xAxis_nameTextStyle_color(){ + this.option.xAxis.nameTextStyle.color = this.echarts_xAxis_nameTextStyle_color + myChart.setOption(this.option) + }, + + handle_echarts_xAxis_nameTextStyle_fontSize(value){ + this.option.xAxis.nameTextStyle.fontSize = value + myChart.setOption(this.option) + }, handle_echarts_xAxis_axisLabel_fontSize(value){ this.option.xAxis.axisLabel.fontSize = value @@ -335,8 +382,22 @@ export const ybar = { this.option.xAxis.axisLabel.rotate = value myChart.setOption(this.option) }, - + handle_echarts_yAxis_name(value){ + this.option.yAxis.name = value + myChart.setOption(this.option) + }, + + handle_echarts_yAxis_nameTextStyle_color(){ + this.option.yAxis.nameTextStyle.color = this.echarts_yAxis_nameTextStyle_color + myChart.setOption(this.option) + }, + + handle_echarts_yAxis_nameTextStyle_fontSize(value){ + this.option.yAxis.nameTextStyle.fontSize = value + myChart.setOption(this.option) + }, + handle_echarts_yAxis_axisLabel_fontSize(value){ this.option.yAxis.axisLabel.fontSize = value myChart.setOption(this.option) diff --git a/src/main/java/com/huawei/datashow/vue/src/components/echarts/normal.vue b/src/main/java/com/huawei/datashow/vue/src/components/echarts/normal.vue index 0bf10b1..fe9e2f2 100644 --- a/src/main/java/com/huawei/datashow/vue/src/components/echarts/normal.vue +++ b/src/main/java/com/huawei/datashow/vue/src/components/echarts/normal.vue @@ -1,12 +1,12 @@