From e20a15f0f7fc5c080b78c22eedc3a43d8f49ca46 Mon Sep 17 00:00:00 2001 From: VIVIMAN Date: Sun, 9 Jan 2022 11:33:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=9B=BE=E6=A0=87=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- golang_learn/data_func/go_to_int/main.go | 10 + .../data_func/go_to_windows/image/bangzhu.png | Bin 0 -> 761 bytes .../data_func/go_to_windows/image/beifen.png | Bin 0 -> 1143 bytes .../data_func/go_to_windows/image/guanyu.png | Bin 0 -> 400 bytes .../go_to_windows/image/huanyuan.png | Bin 0 -> 1161 bytes .../data_func/go_to_windows/image/media.png | Bin 0 -> 344 bytes .../go_to_windows/image/qinghuancun.png | Bin 0 -> 1274 bytes .../data_func/go_to_windows/image/shezhi.png | Bin 0 -> 267 bytes .../data_func/go_to_windows/image/shujuku.png | Bin 0 -> 777 bytes .../data_func/go_to_windows/image/tuichu.png | Bin 0 -> 15639 bytes .../data_func/go_to_windows/image/yaoqiu.png | Bin 0 -> 15723 bytes .../go_to_windows/image/yingyong.png | Bin 0 -> 714 bytes golang_learn/data_func/go_to_windows/main.go | 600 ++++++++++++------ 13 files changed, 429 insertions(+), 181 deletions(-) create mode 100644 golang_learn/data_func/go_to_int/main.go create mode 100644 golang_learn/data_func/go_to_windows/image/bangzhu.png create mode 100644 golang_learn/data_func/go_to_windows/image/beifen.png create mode 100644 golang_learn/data_func/go_to_windows/image/guanyu.png create mode 100644 golang_learn/data_func/go_to_windows/image/huanyuan.png create mode 100644 golang_learn/data_func/go_to_windows/image/media.png create mode 100644 golang_learn/data_func/go_to_windows/image/qinghuancun.png create mode 100644 golang_learn/data_func/go_to_windows/image/shezhi.png create mode 100644 golang_learn/data_func/go_to_windows/image/shujuku.png create mode 100644 golang_learn/data_func/go_to_windows/image/tuichu.png create mode 100644 golang_learn/data_func/go_to_windows/image/yaoqiu.png create mode 100644 golang_learn/data_func/go_to_windows/image/yingyong.png diff --git a/golang_learn/data_func/go_to_int/main.go b/golang_learn/data_func/go_to_int/main.go new file mode 100644 index 0000000..3209e36 --- /dev/null +++ b/golang_learn/data_func/go_to_int/main.go @@ -0,0 +1,10 @@ +package main + +import ( + "fmt" + "log" +) + +func main() { + log.Print(fmt.Sprintf("%d", 55)) +} diff --git a/golang_learn/data_func/go_to_windows/image/bangzhu.png b/golang_learn/data_func/go_to_windows/image/bangzhu.png new file mode 100644 index 0000000000000000000000000000000000000000..723c404a958b001ba12c30407dc2314ae81410d6 GIT binary patch literal 761 zcmVR+YLf&;Ka{(Y7A^YOg|-N+phX*N;Ud&U3l%DdeimW`_Jb1+ z<=BAJj5#x8Z^oJTI_J(0S_dwdbI$jD_nhwl>$|U{f`!{E`4n2I8pOGl0VZ#% zl%rQqH6gK_!}zBJzC_bl&N`?t1$Ni?aI`UiK!po^gVR_@W|RmEXe{8Omv5ihhj-yL z9=?oV|299q^&Up-UW>Zf=Q!sX$M{m^8u#3Fya5xlNleWp;WjngY;Qm?w1~Q%AYRQZ zDqk9!$}^7f%u@okZJ({(T#5JJ(^RgDj-izMMk5HUljwgjuY76fD$h8^Gp|rRgq%xe z;h`63+At~7(mSOFXj1G}TfGusvfEG{gYnEOwhtt&9Hev=yV4Ye&33o!D;gOBv8fX`z<*9rtp(~!$i1;i^1(Mk+Qqf4leI#r?53^X+d7ZIOd+5<^G ze*unjo^gz4o)U;ZJJ<7hW&sxU<)N3{Gz*gkCe6Z3_-3EuoM#;4nWqGJsJY0S?(vBk zWULi<-3Gh__R-KT42IRsKF2xFIL0#%#a&_ZuRnC9Q{Qr+zj^Og?5wYb-)ok4A@w_p z&}~ErS`py000000NkvXXu0mjf=X+i@ literal 0 HcmV?d00001 diff --git a/golang_learn/data_func/go_to_windows/image/beifen.png b/golang_learn/data_func/go_to_windows/image/beifen.png new file mode 100644 index 0000000000000000000000000000000000000000..a77566e2d2a67547b6b7f8753dbf0d06b6aca33a GIT binary patch literal 1143 zcmaJ>TWAzl7@oR`2^$x;Xsz`^PG&_L>F&(zW}M8BG1=_wnl0V1Y!;F}NS&QINv7GE zGtQj2lRRm}8!9NM_z)zb6h!c?P}+hP;zJtrK@>#LhX}pAsClr25=hT%vat`{4$PeM zAO7$AZ{L}7`Tj$p;Eo_gQK4*~Qt(&uhMPB%@1tAqMY4Q`(?fUw4daUHKq{%D5(HUO z9f1X?>JvxjU>8LN_8P?@Je2!N(vTTbeV>?T+5}BeUEQ9oYGV+C5*#rsnST4zeHs|L zOb_xoHfN{csL?m+z=6sBqBc3Ei8|eV5OjGGAuu6UfoGO2SMp@K$}5q*f6UOJ>Vn5) zdNrw`Tppy50|6g95Y5`^ zjboW6nXZ;#+UvBIyVfSsFve4DhKsR&Nj1k@?*Cm)bKTp;1^6M~|0H&c6E-M-y9PcVG%Oue-1aIamy@!Vi&aa5Sw*G^ zOUy8IDa9-4gxJY;3S0-rrN!Q)l1L>oNiLb@dWFt-4XYq++=LdcVf7DKt}fP>gK3k< z3UrKPP|rBX1l6)7qi!xjx-Q=uR4mhV}dR~j3_%NrLuW=@~qez~RLzWqG-1b-}l^2^q# zX?FJ?(|48IbZaKR|IFzNp>WHVn|}r);@1K2fU+(g(ud=R=lx$nHr=n>>pe2{4^^3Q AG5`Po literal 0 HcmV?d00001 diff --git a/golang_learn/data_func/go_to_windows/image/guanyu.png b/golang_learn/data_func/go_to_windows/image/guanyu.png new file mode 100644 index 0000000000000000000000000000000000000000..3235487c896cc25c5fa1693121caedfde71c7a9c GIT binary patch literal 400 zcmV;B0dM|^P)QMwTaNRfu!7^Zre={fT7-i8(5+T=%#fkol3JFD<>PkxO7R1Kdp%`V#U9D8%rR6owR@W+y-`4GR^L14P=KCT~f~ zBUNnOy)TG}gK=jhVG=@GyDQ4c0lk6ciSK$Dy6UY0Aok()nW3KdhPDsp?Rptbb3lJ! z$4SOcUFwykG{|2q1HAwYZC*t|sU!CNjzv5ecSW8(32ib=Ohg zsP)zXN{?8yalbwFKoy{}jpEjy8;PDX@Qrk1g_R*Z@tCBTsa9@jm;kuSz|JOmn3t?9 u4?c#;C6Eb1zZfR07%Ya#`*xUqGucO9FV7L00_n>D0000c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#7M#1QqR!L zz|zP>N5ROz&|KfZT;I@G*TB%qz|6|nQUMB-fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7KMf<|~|UP^v> zu_jo#udkJ7UU5lcUUI6Zi>(sS0KLr26e|l0GgAXY3pYzM6Bk26S4&G5LklM$WoqJN z>SSta4%6$BpIn-onpXnTn*!HsX@FBNC?(_;0Bv?jEy^rQO>ryA&s6~X*eVmZTU>CO z2i2Q`(=8URIQ8lS9itD5SEP7`2>}xihzU=%Kn^_Jr{)0@dl4{IpT6&$3d|AzJY5_^ zDsCnH`TyU(x$2hnx7nLp>WmgJF4(~_;ZfoNmi3LV_8YBQx-XTz=pIv{NI-({tY@1Y zyd->;)dh?hH`*v)NwZf-mo#JEu%k`TV=qHe@dQqu0Ny|a<^^mAMZBEm^07N?{oi<{ zoNdKdo(P@~jad!h zFu%O);2Y(zjb%bC*Veau0@lnQ1?S9aoFUq=bip5chd&ah>KKk_H&m$Goju`K$Gk+% zK!9_Gga$*%#WOsFVdQ&MBb@08tcpvj6}9 literal 0 HcmV?d00001 diff --git a/golang_learn/data_func/go_to_windows/image/media.png b/golang_learn/data_func/go_to_windows/image/media.png new file mode 100644 index 0000000000000000000000000000000000000000..51863c69f7f22b5daa48515de45514697a394f90 GIT binary patch literal 344 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 Hu0mjflC)gi literal 0 HcmV?d00001 diff --git a/golang_learn/data_func/go_to_windows/image/tuichu.png b/golang_learn/data_func/go_to_windows/image/tuichu.png new file mode 100644 index 0000000000000000000000000000000000000000..58c2879796af63f6e18f1e5fa82e09af4bd656b8 GIT binary patch literal 15639 zcmeI3Z)_7~9LEopKMqGgkRgksbWt($dUtKF?QU(6t(zNJ=NMybz5uRwPq%aJUFqG{ zZc!kB1V#)7V<3bWVn`%H6e22#FHjKU8v`m4qbUAKOvD$85R{OJ&-L%^Y4?Z$V@RH6 zYx{e?&-eG-eV*s}-Sx$7>+E>4vSNM(MNyS)t)VXXIm7&)HU+*fXr(`eANM9&`*ez$ zKHL1CMD5u-kD?kjE8V?DZ@68Mw75f*wFq#e;|bWCqWp`~2~ipZhAjg66*XZ0^}XYE zn<5A7EBP=RPBei5rFAq3mXCIHOQVBQy=-3`tnjA=m>>=e(Uy+KR9#31?3ug*{BAZg zc3Y;4F&MBfF$c8uhC6LdS`yfJ2Tw~Z=eBw49URZOecaaXM+(gVsk>Lrl}E zUYkvl&l3W=lvEOiqNz4BuNcvWjDX#44peyM&MTfM45aEgc90^I784BTV3~3zSt@uE zL&;d?&}4}LF%So;p+g^6)|VL23{4-RdSd*3LNJ$Q8lQLEE?iXWwG|P{KT6z{1l+dKbv?M$%5On#Oa?KW3W|0YPs&0s?1lmGD*x*nUS%`uNV8sZay^>d? zot)cC`@9jB27JWpW}V)8w_DCY42P}ulGGth8ZtLZF0~9(OKy&j%92D!M30A#@@|&) z0k=duJyKNk`CM*3BIQ$C>?Nt6N-D6(i7`tb^XUKW5M|Po4ArXWaA}TMmMmPjnKHH< ztR3H)7h+1L93{l04$RFKu;+JMp?($0lj+H9T0xY|LKc+Fy#OHKajnI}DmZgCrE~&s zj&e4?#Xj*EsR5wkHdHoMrq{$tbS-M6#3WeK57)#$Z1Zfw@eVYzpD}BGO!*JyKo^H^ zZ3aXhZjvbQ(k>QmA(nNEw2$Y!G$+eGkLYtbJw8~6ZgB?8t82a-{Vy|6T)WbMsP+Rn z$mCBd-*6{Q+RfFyTbVTE8gge(T6X`9FM|2nU0O8#=1qeD3ohLJVy4h>ex{_YxLmUR zd(FZb8_M+eI$8K)IP*PcwaTcq4{x=~sI}-^p(;kunHvphwz$kYo9wlBIlKu6K@ZQn zct3+SqmE7`4Pw0^1zsd|v-ETBoCg)k8v72T=(w1PDGPxbS=smEb~v;6s87&j(QnE(8cZB)IT=5S8FUfZ#)d z3(p5p2`&T(J|wvCd=Qo3LV(~yf(y?FQ3);t2tFjZ@O%)J;6i}lLxKy>2T=(w1PDGP zxbS=smEb~v;6s87&j(QnE(8cZB)IT=5S8FUfZ#)d3(p5p2`&T(J|wvCd=Qo3LV(~y zf(y?FQ3);t2tLH(swh5M3sm?#Z3;d(`@_Du4e+5`o7CDBrl`?}DQd$ein?|Ke*R2R zLo7vITtiX9Zi=eXcCJ3vLQ#_{+d@ma(_iiVZ1K{&#hH_TTm50<(K*%Cm+q=*Jk&Ei zTsyY!$js*UUp7|tetvz|<^wOkF!=h0cRZ_3&Yre$#pW;DPt31vt-0^n%h8$(QgrDz z>bXVpt{;4H{|Mi9`Qq{C+xDFPNUwYKlyy5=_FtZLX6w@neq6Zw#EdVF%zb-D zp4#;2uKm}zt6bIDYRA`o*RGtanVQ(b9BTP?Eb!M8%Guf*HPrp9 X+r!iT+;qi!bh)j$BlJe&nvH)0)@Ta| literal 0 HcmV?d00001 diff --git a/golang_learn/data_func/go_to_windows/image/yaoqiu.png b/golang_learn/data_func/go_to_windows/image/yaoqiu.png new file mode 100644 index 0000000000000000000000000000000000000000..f4fa45bbe2ffc3e881c6e0d8158b1f9fdb5be359 GIT binary patch literal 15723 zcmeI3du$X%9LERWlt)w$Dj{^n=pE3NP9#xp00MKk{(5r7c9ja36 zyio{q;bcARQXBhHu)VK2BKLL6e#JRASQbc&C_w_6k|UjnYlfJvb!PI4=)2X-IvtrV zW_PV~o;9E&8g6ye>nZ3ETmmC=yw_3Vcku%6_3>2>H^+Ne&cpH^hIfmcU*rWx?&S=Y zp>Khd5)<1(3v$DusMgtKnn{smdwY9by&jjI>STGp-_LSx*6n6c55`!jnNph3j9J+v z`8*+L$SE~xs=DT|@=6_gk6G(T8)m}_gdm5sq|=D3 zOhUE|8hTGkh7Bvwsmv;M_NE#uPR_7QmNM$G!?Zez%~GkCPyn5)Sf7HDsiz{k z9uH<$S!*7lqrTp8&5f$2=)Fc|fW>W zNwPh$9ARBiV=G7GKvqHI{q`KTo_G$lbri{z&M1q$uPu)vi!nWwkj$W(kUAlo)H(xf zvC-DEu%N_xJ+7zFVZop$z?N#ZxiX7PY|;!<(qz~a3Ze#=sw$$Fhl--OWu{t+`52+v z%P~Hv2n=7t)%fLVk5A!a8HnMq-9939NSAx8jgm{Ppwuz1ms5D3pYizwo^iXqGUM}m zP*|-%R6_)B2k*_Nw%JFdZb_-A$VqWqAM5D<=@2E-j2Nm>HPF&rXr;bzKMJG^~( zYhH+}nR1krQUCjMrdXA=&0;F$xgRrBNOe=rAzwBjsh zz~8}h?&=Okh)EnH2xy)A6>l{YgAnqPTk-p#oS)&dm;tYlFGv5&3>4R{+$Cw9Pzkd6 zlgc-oOOtkHb?`Zu#;x#%Dm5OPRyk@;XM#f1SOhZGl?52jLF7!Yzuagq68D#e8XA%_$f znGdE?To@2?NO6(*U@FCh0U?JJ7nu*HQd}4ia!7HJ`Cux=g#jUl6c?EfrczuO5OPRy zk@;XM#f1SOhZGl?52jLF7!Yzuagq68D#e8XA%_$fnGdE?To@2?NO6(*U@FCh0U?JJ z7nu*HQd}4ia!7HJ`Cux=g#jUl6c?EfrczuO5OPRyk@;XM#f1SOhZGl?52jLF7!Yzu zagq68D#e8XA%{dPii9gZj4*>LV z0Q`6>0OA$^uGAm8W#<9_#z;+}d6D$cs*hj4Epq+jok#ZG{K*BAE2hkx!VguPyx@&B zFMZtpsB`M(x}n8&Y_u#@H*ML4YwsU3>AY9EzO8(w?F87rP`a$K)3Nr_wb2LeKKNep z)ED3H>3;mh&kyXqYT`YQT|3Y>b>QWV55IEiiVr_p#Q!V|HOo~4CueWn2iPMsyIuRr zWFwHt*iX1rN+va>KE2R=xk_S8~(Q5|!o~ZEc*!0C#`$R74cb5PlKk0=FqeA HZ@ud;TvIr- literal 0 HcmV?d00001 diff --git a/golang_learn/data_func/go_to_windows/image/yingyong.png b/golang_learn/data_func/go_to_windows/image/yingyong.png new file mode 100644 index 0000000000000000000000000000000000000000..cfc2702acd7b7c84be4d84363e6845d4be5614ba GIT binary patch literal 714 zcmV;*0yX`KP)KTsd(L2%Nfb28ake(Nc)gcnjiHl06Vi5zr`8 z(3F?(m8sa))$`m0WS?l=+qJX%?3~|q&b{3f0P254(UJXrb9jGiI#k0{pbFjlDki*T zsNK65bM9bxejAF{MGVvdfg*Ucf>99P^0^-hR9&S2%@qIt{DU3aL~IrBX@O zh{xkltJMZF!Qku$_KzEIr<%^br7DT7!cwWkIkl(KYIP_Ui*UJIkjv$u`d_XSfR}Cb z{UM9R0=L_ZLZJY?UJqxoLZsE{kj-XUkQPFr5LDmuPuODtfppV3xYCS`Mgz%Y5)8w@ z@Angkj%{{2orpvt5Q#*37I1~SZ(2p|=nR#EQ|#1EP^{GPb@v#bw+~@78VP`#hFgbg zG?`3@Mxz`6VzKxVB{AfpV(m)(_QW!7K24!#B!TNn23O@VNMzIK?d?U6)DE-R43$cS wYY%A%1cIMD9`7A_#BRT>L?Qv7&&S{SUnp5P#YQSqod5s;07*qoM6N<$f_olE%m4rY literal 0 HcmV?d00001 diff --git a/golang_learn/data_func/go_to_windows/main.go b/golang_learn/data_func/go_to_windows/main.go index 54e54f6..6bdbcc4 100644 --- a/golang_learn/data_func/go_to_windows/main.go +++ b/golang_learn/data_func/go_to_windows/main.go @@ -5,6 +5,7 @@ package main import ( "archive/zip" + "bufio" "fmt" "github.com/lxn/walk" . "github.com/lxn/walk/declarative" @@ -12,6 +13,7 @@ import ( "golang.org/x/sys/windows" "golang.org/x/sys/windows/registry" "io" + "log" "os" "os/exec" "path/filepath" @@ -56,11 +58,11 @@ var path string func init() { app.title = "公务员管理系统-运行监控" service1 = myService{ - text: "数据存储库", + text: "⚡数据存储库", serviceName: "GWY20_Mysql", } service3 = myService{ - text: "公务员系统", + text: "⚡公务员系统", serviceName: "GWY20_Tomcat", } path, _ = os.Getwd() @@ -103,6 +105,170 @@ func main() { app.mw.Run() } +// 初始始化窗体 +func getWindows() error { + icon, _ := walk.NewIconFromResourceId(3) + err := MainWindow{ + Visible: false, + AssignTo: &app.mw, + Title: app.title, + Size: Size{Width: 500, Height: 360}, + Font: Font{Family: "微软雅黑", PointSize: 9}, + Icon: icon, + Layout: VBox{}, + MenuItems: []MenuItem{ + Menu{ + Text: "&编辑", + // Image: "./image//media.png", + Items: []MenuItem{ + Separator{}, + Action{ + // Image: "./image//qinghuancun.png", + Text: "清除缓存", + OnTriggered: clearAll, + }, + Action{ + // Image: "./image//beifen.png", + Text: "数据备份", + OnTriggered: dbBak, + }, + Action{ + // Image: "./image//huanyuan.png", + Text: "数据还原", + OnTriggered: reDbBak, + }, + Action{ + // Image: "./image//tuichu.png", + Text: "退出", + OnTriggered: func() { + walk.App().Exit(0) + }, + }, + }, + }, + Menu{ + Text: "&设置", + // Image: "./image//shezhi.png", + Items: []MenuItem{ + Separator{}, + Action{ + // Image: "./image//shujuku.png", + Text: "设置数据库内存", + OnTriggered: setDbSize, + }, + Action{ + // Image: "./image//yingyong.png", + Text: "设置应用内存", + OnTriggered: setServerSize, + }, + }, + }, + Menu{ + Text: "&帮助", + // Image: "./image//bangzhu.png", + Items: []MenuItem{ + Action{ + // Image: "./image//guanyu.png", + Text: "关于", + OnTriggered: app.aboutactionTriggered, + }, + Action{ + // Image: "./image//yaoqiu.png", + Text: "要求", + OnTriggered: app.aboutactionTriggered, + }, + }, + }, + }, + Children: []Widget{GroupBox{ + Title: "基础服务状态", + Layout: Grid{Columns: 3}, + Children: []Widget{ + Label{Text: service1.text, MinSize: Size{Width: 220, Height: 30}, TextColor: walk.RGB(255, 255, 0)}, + Label{AssignTo: &service1.labelState, Text: "正在运行", MinSize: Size{Width: 80, Height: 30}}, + Composite{ + Layout: HBox{}, + MaxSize: Size{Width: 198, Height: 30}, + Children: []Widget{ + PushButton{ + AssignTo: &service1.btnRegister, + MaxSize: Size{Width: 60, Height: 30}, + Text: "注册表", + }, + PushButton{ + AssignTo: &service1.btnStop, + MaxSize: Size{Width: 60, Height: 30}, + Text: "停止", + }, + PushButton{ + AssignTo: &service1.btnStart, + MaxSize: Size{Width: 60, Height: 30}, + Text: "启动", + }, + }, + }, + }, + }, GroupBox{ + Title: "业务服务状态", + Layout: Grid{Columns: 3}, + Children: []Widget{ + Label{Text: service3.text, MinSize: Size{Width: 220, Height: 30}}, + Label{AssignTo: &service3.labelState, Text: "正在运行", MinSize: Size{Width: 80, Height: 30}}, + Composite{ + Layout: HBox{}, + MaxSize: Size{Width: 198, Height: 30}, + Children: []Widget{ + PushButton{ + AssignTo: &service3.btnRegister, + MaxSize: Size{Width: 60, Height: 30}, + Text: "注册表", + }, + PushButton{ + AssignTo: &service3.btnStop, + MaxSize: Size{Width: 60, Height: 30}, + Text: "停止", + }, + PushButton{ + AssignTo: &service3.btnStart, + MaxSize: Size{Width: 60, Height: 30}, + Text: "启动", + }, + }, + }, + }, + }, TextEdit{AssignTo: &app.msg, VScroll: true, ReadOnly: true}, Composite{ + Layout: HBox{}, + Children: []Widget{ + PushButton{ + MinSize: Size{Width: 200, Height: 30}, + Text: "打开windows服务管理程序", + OnClicked: openServices, + }, + HSpacer{}, + PushButton{ + MinSize: Size{Width: 140, Height: 30}, + Text: "关闭本监控窗口", + OnClicked: func() { + walk.App().Exit(0) + }, + }, + }, + }}, + OnSizeChanged: func() { + _ = app.mw.SetSize(walk.Size(Size{Width: 500, Height: 360})) + }, + }.Create() + winLong := win.GetWindowLong(app.mw.Handle(), win.GWL_STYLE) + // 不能调整窗口大小,禁用最大化按钮 + win.SetWindowLong(app.mw.Handle(), win.GWL_STYLE, winLong & ^win.WS_SIZEBOX & ^win.WS_MAXIMIZEBOX & ^win.WS_SIZEBOX) + // 设置窗体生成在屏幕的正中间,并处理高分屏的情况 + // 窗体横坐标 = ( 屏幕宽度 - 窗体宽度 ) / 2 + // 窗体纵坐标 = ( 屏幕高度 - 窗体高度 ) / 2 + _ = app.mw.SetX((int(win.GetSystemMetrics(0)) - app.mw.Width()) / 2 / app.mw.DPI() * 96) + _ = app.mw.SetY((int(win.GetSystemMetrics(1)) - app.mw.Height()) / 2 / app.mw.DPI() * 96) + return err +} + // setServiceState 设置 服务状态描述和按钮状态 func setServiceState(service myService, msg string, btnStartStatus, btnStopStatus, btnRegisterStatus bool) { _ = service.labelState.SetText(msg) @@ -158,7 +324,7 @@ func registerService(service myService) { `NT Authority\LocalService`, `GWY20_Tomcat`, fmt.Sprintf(`%s\tomcat8\bin\Tomcat8.exe //RS//GWY20_Tomcat`, path)) - registerJava(service.serviceName, path) + registerJava(service.serviceName, path, 128, 256, 512, 512) registerLog(service.serviceName, path) registerState(service.serviceName, `SOFTWARE\WOW6432Node\Apache Software Foundation\Procrun 2.0\GWY20_Tomcat\Parameters\Start`, @@ -179,7 +345,7 @@ func startService(service myService) { } showMsg(service.serviceName + " 服务开始启动......") err = s.StartService() - time.Sleep(40 * time.Second) + time.Sleep(15 * time.Second) if err != nil { showMsg(service.serviceName + " 服务启动失败!") } else { @@ -209,152 +375,6 @@ func showMsg(msg string) { app.msg.AppendText("\r\n") } -// 初始始化窗体 -func getWindows() error { - icon, _ := walk.NewIconFromResourceId(3) - err := MainWindow{ - Visible: false, - AssignTo: &app.mw, - Title: app.title, - Size: Size{Width: 500, Height: 360}, - Font: Font{Family: "微软雅黑", PointSize: 9}, - Icon: icon, - Layout: VBox{}, - MenuItems: []MenuItem{ - Menu{ - Text: "&编辑", - Items: []MenuItem{ - Separator{}, - Action{ - Text: "清除缓存", - OnTriggered: clearAll, - }, - Action{ - Text: "退出", - OnTriggered: func() { - walk.App().Exit(0) - }, - }, - }, - }, - Menu{ - Text: "&设置", - Items: []MenuItem{ - Separator{}, - Action{ - Text: "设置数据库内存", - OnTriggered: setDbSize, - }, - Action{ - Text: "设置应用内存", - OnTriggered: setServerSize, - }, - }, - }, - Menu{ - Text: "&帮助", - Items: []MenuItem{ - Action{ - Text: "关于", - OnTriggered: app.aboutactionTriggered, - }, - }, - }, - }, - Children: []Widget{ - GroupBox{ - Title: "基础服务状态", - Layout: Grid{Columns: 3}, - Children: []Widget{ - Label{Text: service1.text, MinSize: Size{Width: 220, Height: 30}, TextColor: walk.RGB(255, 255, 0)}, - Label{AssignTo: &service1.labelState, Text: "正在运行", MinSize: Size{Width: 80, Height: 30}}, - Composite{ - Layout: HBox{}, - MaxSize: Size{Width: 198, Height: 30}, - Children: []Widget{ - PushButton{ - AssignTo: &service1.btnRegister, - MaxSize: Size{Width: 60, Height: 30}, - Text: "注册表", - }, - PushButton{ - AssignTo: &service1.btnStop, - MaxSize: Size{Width: 60, Height: 30}, - Text: "停止", - }, - PushButton{ - AssignTo: &service1.btnStart, - MaxSize: Size{Width: 60, Height: 30}, - Text: "启动", - }, - }, - }, - }, - }, - GroupBox{ - Title: "业务服务状态", - Layout: Grid{Columns: 3}, - Children: []Widget{ - Label{Text: service3.text, MinSize: Size{Width: 220, Height: 30}}, - Label{AssignTo: &service3.labelState, Text: "正在运行", MinSize: Size{Width: 80, Height: 30}}, - Composite{ - Layout: HBox{}, - MaxSize: Size{Width: 198, Height: 30}, - Children: []Widget{ - PushButton{ - AssignTo: &service3.btnRegister, - MaxSize: Size{Width: 60, Height: 30}, - Text: "注册表", - }, - PushButton{ - AssignTo: &service3.btnStop, - MaxSize: Size{Width: 60, Height: 30}, - Text: "停止", - }, - PushButton{ - AssignTo: &service3.btnStart, - MaxSize: Size{Width: 60, Height: 30}, - Text: "启动", - }, - }, - }, - }, - }, - TextEdit{AssignTo: &app.msg, VScroll: true, ReadOnly: true}, - Composite{ - Layout: HBox{}, - Children: []Widget{ - PushButton{ - MinSize: Size{Width: 200, Height: 30}, - Text: "打开windows服务管理程序", - OnClicked: openServices, - }, - HSpacer{}, - PushButton{ - MinSize: Size{Width: 140, Height: 30}, - Text: "关闭本监控窗口", - OnClicked: func() { - walk.App().Exit(0) - }, - }, - }, - }, - }, - OnSizeChanged: func() { - _ = app.mw.SetSize(walk.Size(Size{Width: 500, Height: 360})) - }, - }.Create() - winLong := win.GetWindowLong(app.mw.Handle(), win.GWL_STYLE) - // 不能调整窗口大小,禁用最大化按钮 - win.SetWindowLong(app.mw.Handle(), win.GWL_STYLE, winLong & ^win.WS_SIZEBOX & ^win.WS_MAXIMIZEBOX & ^win.WS_SIZEBOX) - // 设置窗体生成在屏幕的正中间,并处理高分屏的情况 - // 窗体横坐标 = ( 屏幕宽度 - 窗体宽度 ) / 2 - // 窗体纵坐标 = ( 屏幕高度 - 窗体高度 ) / 2 - _ = app.mw.SetX((int(win.GetSystemMetrics(0)) - app.mw.Width()) / 2 / app.mw.DPI() * 96) - _ = app.mw.SetY((int(win.GetSystemMetrics(1)) - app.mw.Height()) / 2 / app.mw.DPI() * 96) - return err -} - /* 注册服务部分 */ // registerWindows 【1】修改注册表 func registerWindows(serviceName, regStr, objectName, displayName, imagePath string) { @@ -382,7 +402,7 @@ func registerWindows(serviceName, regStr, objectName, displayName, imagePath str } // registerJava 【2】修改注册表 -func registerJava(serviceName, path string) { +func registerJava(serviceName, path string, permSize, maxPermSize, xms, xmx int) { key, exists, _ := registry.CreateKey(registry.LOCAL_MACHINE, `SOFTWARE\WOW6432Node\Apache Software Foundation\Procrun 2.0\GWY20_Tomcat\Parameters\Java`, registry.ALL_ACCESS) defer key.Close() @@ -398,12 +418,12 @@ func registerJava(serviceName, path string) { `-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager`, fmt.Sprintf(`-Djava.util.logging.config.file=%s\tomcat8\conf\logging.properties`, path), `-Dfile.encoding=GBK`, - `-XX:PermSize=128m`, - `-XX:MaxPermSize=256m`, + fmt.Sprintf(`-XX:PermSize=%dm`, permSize), + fmt.Sprintf(`-XX:MaxPermSize=%dm`, maxPermSize), }) _ = key.SetStringValue(`Classpath`, fmt.Sprintf(`%s\tomcat8\bin\bootstrap.jar;%s\tomcat8\bin\tomcat-juli.jar`, path, path)) - _ = key.SetDWordValue(`JvmMs`, uint32(512)) - _ = key.SetDWordValue(`JvmMx`, uint32(512)) + _ = key.SetDWordValue(`JvmMs`, uint32(xms)) + _ = key.SetDWordValue(`JvmMx`, uint32(xmx)) } // registerLog 【3】修改注册表 @@ -448,29 +468,31 @@ func Unzip(zipFile string, destDir string) error { if f.FileInfo().IsDir() { _ = os.MkdirAll(fpath, os.ModePerm) } else { - if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil { - return err - } + return runUnzip(fpath, f) + } + } + return nil +} - inFile, err := f.Open() - if err != nil { - return err - } - defer inFile.Close() +func runUnzip(fpath string, f *zip.File) error { + if err := os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil { + return err + } - outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) - if err != nil { - return err - } - defer outFile.Close() + inFile, err := f.Open() + if err != nil { + return err + } + defer inFile.Close() - _, err = io.Copy(outFile, inFile) - if err != nil { - return err - } - } + outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) + if err != nil { + return err } - return nil + defer outFile.Close() + + _, err = io.Copy(outFile, inFile) + return err } // openServices 打开本地 服务 @@ -509,21 +531,237 @@ func clearAll() { // setDbSize 显示设置数据库内存大小界面,等待保存 func setDbSize() { - + app.RunDbSetingDialog(app.mw, func(setings *DbSetings) { + // 停服务 + stopService(service1) + // 设置修改参数 + setDbIni(setings.InnodbBufferPoolSize) + // 起服务 + startService(service1) + showMsg("数据库内存调整完毕!") + }) } -// doSetDbSize 设置数据库内存大小,重启MySQL服务 -func doSetDbSize() { - stopService(service1) +func setDbIni(innodbBufferPoolSize int) { + //读写方式打开文件 + myIniFile := fmt.Sprintf(`%s/mysql/my.ini`, path) + file, err := os.OpenFile(myIniFile, os.O_RDWR, 0666) + if err != nil { + showMsg("【异常】打开文件发生错误!" + myIniFile) + log.Fatal("打开文件异常:", err) + return + } + //defer关闭文件 + defer file.Close() + + //读取文件内容到io中 + reader := bufio.NewReader(file) + pos := int64(0) + innodbBufferPoolSizeStr := []byte(fmt.Sprintf(`innodb_buffer_pool_size=%dM`, innodbBufferPoolSize)) + for { + //读取每一行内容 + line, err := reader.ReadString('\n') + if err != nil { + //读到末尾 + if err == io.EOF { + showMsg("打开读取文件完毕!") + break + } else { + showMsg("【异常】读取文件发生错误:" + line) + log.Fatal("读取文件异常:", err) + return + } + } + + //根据关键词覆盖当前行 + if strings.Contains(line, "innodb_buffer_pool_size") { + _, _ = file.WriteAt(innodbBufferPoolSizeStr, pos) + } + + //每一行读取完后记录位置 + pos += int64(len(line)) + } } // setServerSize 显示设置应用内存大小界面,等待保存 func setServerSize() { + app.RunAppSetingDialog(app.mw, func(setings *AppSetings) { + // 停服务 + stopService(service3) + // 设置数据库内存大小 + //registerJava(service3.serviceName, path, 129, 259, 500, 500) + registerJava(service3.serviceName, path, setings.PermSize, setings.MaxPermSize, setings.Xms, setings.Xmx) + // 起服务 + startService(service3) + showMsg("应用内存调整完毕!") + }) +} +// dbBak 数据备份功能 +func dbBak() { + showMsg("【待完善】数据备份!") } -// doSetServerSize 设置应用内存大小,重启应用服务 -func doSetServerSize() { - stopService(service3) +// reDbBak 备份数据还原 +func reDbBak() { + showMsg("【待完善】备份数据还原!") +} +//数据库配置结构 +type DbSetings struct { + InnodbBufferPoolSize int // 数据库缓存大小 +} + +// 运行 数据库设置 Dialog +func (mw *myApp) RunDbSetingDialog(owner walk.Form, confirmCall func(*DbSetings)) { + var seting *DbSetings + var dlg *walk.Dialog + var db *walk.DataBinder + var acceptPB, cancelPB *walk.PushButton + + seting = new(DbSetings) + // 设置预定值 + seting.InnodbBufferPoolSize = 512 + + _, _ = Dialog{ + AssignTo: &dlg, + Title: "数据源内存设置", + Font: Font{Family: "微软雅黑", PointSize: 9}, + DefaultButton: &acceptPB, + CancelButton: &cancelPB, + DataBinder: DataBinder{ + AssignTo: &db, + Name: "setings", + DataSource: seting, + ErrorPresenter: ToolTipErrorPresenter{}, + }, + MinSize: Size{Width: 450, Height: 220}, + Layout: VBox{}, + Children: []Widget{ + Composite{ + Layout: Grid{Columns: 2}, + Children: []Widget{ + Label{Text: `      数据库内存:`}, + NumberEdit{Value: Bind("InnodbBufferPoolSize", Range{Min: 64, Max: 10240}), Suffix: " M", Decimals: 0}, + }, + }, + Composite{ + Layout: HBox{}, + Children: []Widget{ + HSpacer{}, + PushButton{ + AssignTo: &acceptPB, + Text: "保存", + OnClicked: func() { + if err := db.Submit(); err != nil { + showMsg("【异常】处理设置数据库内存时,发生异常!") + log.Fatal(err) + return + } + + // 关闭页面 + dlg.Cancel() + + // 应用 回调函数 + confirmCall(seting) + }, + }, + PushButton{ + AssignTo: &cancelPB, + Text: "取消", + OnClicked: func() { + dlg.Cancel() + }, + }, + }, + }, + }, + }.Run(owner) +} + +//应用配置结构 +type AppSetings struct { + PermSize int // 非堆区初始内存分配大小 + MaxPermSize int // 非堆区分配的内存的最大上限 + Xms int // 堆区内存初始内存分配的大小 + Xmx int // 堆区内存可被分配的最大上限 +} + +// 运行 应用设置 Dialog +func (mw *myApp) RunAppSetingDialog(owner walk.Form, confirmCall func(*AppSetings)) { + var seting *AppSetings + var dlg *walk.Dialog + var db *walk.DataBinder + var acceptPB, cancelPB *walk.PushButton + + seting = new(AppSetings) + // 设置预定值 + seting.PermSize = 128 + seting.MaxPermSize = 256 + seting.Xmx = 512 + seting.Xms = 512 + + _, _ = Dialog{ + AssignTo: &dlg, + Title: "应用内存设置", + Font: Font{Family: "微软雅黑", PointSize: 9}, + DefaultButton: &acceptPB, + CancelButton: &cancelPB, + DataBinder: DataBinder{ + AssignTo: &db, + Name: "setings", + DataSource: seting, + ErrorPresenter: ToolTipErrorPresenter{}, + }, + MinSize: Size{Width: 450, Height: 320}, + Layout: VBox{}, + Children: []Widget{ + Composite{ + Layout: Grid{Columns: 2}, + Children: []Widget{ + Label{Text: `  PermSize(非堆区)初始内存分配大小:`}, + NumberEdit{Value: Bind("PermSize", Range{Min: 64, Max: 10240}), Suffix: " m", Decimals: 0}, + + Label{Text: `MaxPermSize(非堆区)最大内存分配上限:`}, + NumberEdit{Value: Bind("MaxPermSize", Range{Min: 64, Max: 10240}), Suffix: " m", Decimals: 0}, + + Label{Text: `      Xms(堆区)初始内存分配大小:`}, + NumberEdit{Value: Bind("Xms", Range{Min: 64, Max: 10240}), Suffix: " m", Decimals: 0}, + + Label{Text: `      Xmx(堆区)最大内存分配上限:`}, + NumberEdit{Value: Bind("Xmx", Range{Min: 64, Max: 10240}), Suffix: " m", Decimals: 0}, + }, + }, + Composite{ + Layout: HBox{}, + Children: []Widget{ + HSpacer{}, + PushButton{ + AssignTo: &acceptPB, + Text: "保存", + OnClicked: func() { + if err := db.Submit(); err != nil { + showMsg("【异常】处理设置数据库内存时,发生异常!") + log.Fatal(err) + return + } + + // 关闭页面 + dlg.Cancel() + + // DB 回调函数 + confirmCall(seting) + }, + }, + PushButton{ + AssignTo: &cancelPB, + Text: "取消", + OnClicked: func() { + dlg.Cancel() + }, + }, + }, + }, + }, + }.Run(owner) }