forked from go/golangs_learn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
432 lines
11 KiB
432 lines
11 KiB
package main
|
|
|
|
import (
|
|
"github.com/lxn/walk"
|
|
. "github.com/lxn/walk/declarative"
|
|
"github.com/lxn/win"
|
|
"log"
|
|
"os"
|
|
)
|
|
|
|
// 初始始化窗体
|
|
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: reDbIndex,
|
|
},
|
|
Action{
|
|
Text: "数据备份",
|
|
OnTriggered: dbBak,
|
|
},
|
|
Action{
|
|
Text: "数据还原",
|
|
OnTriggered: reDbBak,
|
|
},
|
|
Action{
|
|
Text: "退出",
|
|
OnTriggered: func() {
|
|
OnExit()
|
|
},
|
|
},
|
|
},
|
|
},
|
|
Menu{
|
|
Text: "&设置",
|
|
Items: []MenuItem{
|
|
Separator{},
|
|
Action{
|
|
Text: "设置数据库内存",
|
|
OnTriggered: setDbSize,
|
|
},
|
|
Action{
|
|
Text: "设置应用内存",
|
|
OnTriggered: setServerSize,
|
|
},
|
|
},
|
|
},
|
|
Menu{
|
|
Text: "&表册",
|
|
// Image: "./image/shezhi.png",
|
|
Items: []MenuItem{
|
|
Separator{},
|
|
Action{
|
|
// Image: "./image/shujuku.png",
|
|
Text: "按照职务输出生成(可能人员重复)",
|
|
OnTriggered: getMcByA0281,
|
|
},
|
|
Action{
|
|
// Image: "./image/yingyong.png",
|
|
Text: "按照主职务生成(可能人员丢失)",
|
|
OnTriggered: getMcByA0279,
|
|
},
|
|
},
|
|
},
|
|
Menu{
|
|
Text: "&帮助",
|
|
Items: []MenuItem{
|
|
Action{
|
|
Text: "关于",
|
|
OnTriggered: app.aboutactionTriggered,
|
|
},
|
|
/*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() {
|
|
OnExit()
|
|
},
|
|
},
|
|
},
|
|
}},
|
|
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
|
|
}
|
|
|
|
//数据库配置结构
|
|
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: 160},
|
|
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: 270},
|
|
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)
|
|
}
|
|
|
|
//数据还原设置
|
|
type DbBakSetings struct {
|
|
fileEdit *walk.TextEdit
|
|
fileName string
|
|
}
|
|
|
|
// 运行 数据还原设置 Dialog
|
|
func (mw *myApp) RunDbBakSetingDialog(owner walk.Form, confirmCall func(*DbBakSetings)) {
|
|
var seting *DbBakSetings
|
|
var dlg *walk.Dialog
|
|
var db *walk.DataBinder
|
|
var acceptPB, cancelPB *walk.PushButton
|
|
|
|
seting = new(DbBakSetings)
|
|
seting.fileName = ""
|
|
|
|
_, _ = 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{
|
|
GroupBox{
|
|
Layout: HBox{},
|
|
Children: []Widget{
|
|
Label{Text: `请输入还原文件名称(如:2022122235133):`},
|
|
TextEdit{AssignTo: &seting.fileEdit},
|
|
},
|
|
},
|
|
GroupBox{
|
|
Layout: HBox{},
|
|
Children: []Widget{
|
|
|
|
Label{Text: `说明:
|
|
1. 需要您选择还原的文件,并且在触发“恢复”时,先提示是否进行备份(选择是/否),按照选择文件进行解压覆盖;
|
|
2. 请自行检查备份包的大小是否正常,通常包大于400M;
|
|
3. 备份时,请确保服务正常启动!`},
|
|
},
|
|
},
|
|
Composite{
|
|
Layout: HBox{},
|
|
Children: []Widget{
|
|
HSpacer{},
|
|
PushButton{
|
|
AssignTo: &acceptPB,
|
|
Text: "恢复",
|
|
OnClicked: func() {
|
|
if err := db.Submit(); err != nil {
|
|
showMsg("【异常】选择恢复文件时,发生异常!")
|
|
log.Fatal(err)
|
|
return
|
|
}
|
|
|
|
Info.Println(path + `\` + seting.fileEdit.Text() + `.gz`)
|
|
_, err := os.OpenFile(path+`\`+seting.fileEdit.Text()+`.gz`, os.O_RDWR, 0666)
|
|
if err != nil {
|
|
walk.MsgBox(app.mw, "错误", "无法打开文件。", walk.MsgBoxIconWarning)
|
|
return
|
|
}
|
|
seting.fileName = seting.fileEdit.Text()
|
|
|
|
// 关闭页面
|
|
dlg.Cancel()
|
|
|
|
// DB 回调函数
|
|
confirmCall(seting)
|
|
},
|
|
},
|
|
PushButton{
|
|
AssignTo: &cancelPB,
|
|
Text: "取消",
|
|
OnClicked: func() {
|
|
dlg.Cancel()
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}.Run(owner)
|
|
}
|
|
|