|
|
@ -35,14 +35,15 @@ func (mw *myApp) aboutactionTriggered() { |
|
|
|
"1. 启动、终止并设置 应用和数据库 服务", |
|
|
|
"2. 清除 浏览器和应用 缓存", |
|
|
|
"3. 设置 应用和数据库 内存大小", |
|
|
|
"4. 实现 数据备份 压缩备份脚本与备份照片", |
|
|
|
"5. 实现 数据还原 执行还原脚本与还原照片", |
|
|
|
"4. 实现 数据备份 压缩备份库文件与备份照片", |
|
|
|
"5. 实现 数据还原 执行还原库文件与还原照片", |
|
|
|
fmt.Sprintf("版本:%s", version)}, "\n"), |
|
|
|
walk.MsgBoxIconQuestion) |
|
|
|
} |
|
|
|
|
|
|
|
type myApp struct { |
|
|
|
title string |
|
|
|
name string |
|
|
|
msg *walk.TextEdit |
|
|
|
mw *walk.MainWindow |
|
|
|
} |
|
|
@ -80,6 +81,7 @@ var tableNameTj = []string{ |
|
|
|
// init 初始化
|
|
|
|
func init() { |
|
|
|
app.title = "公务员管理系统-运行监控" |
|
|
|
app.name = "网新" |
|
|
|
service1 = myService{ |
|
|
|
text: "⚡数据存储库", |
|
|
|
serviceName: "GWY20_Mysql", |
|
|
@ -95,6 +97,10 @@ func init() { |
|
|
|
func main() { |
|
|
|
_ = getWindows() |
|
|
|
|
|
|
|
runMain() |
|
|
|
} |
|
|
|
|
|
|
|
func runMain() { |
|
|
|
if e := HasHzb(); e != nil { |
|
|
|
walk.MsgBox(app.mw, "错误", "请先下载并安装 组工 软件,才可以正常使用软件!", walk.MsgBoxIconWarning) |
|
|
|
_ = OpenUrl("https://www.12371.cn/zgrjxz/gwywx/") |
|
|
@ -107,8 +113,8 @@ func main() { |
|
|
|
} |
|
|
|
|
|
|
|
walk.App().SetProductName(app.title) |
|
|
|
walk.App().SetOrganizationName("网新") |
|
|
|
walk.App().SetProductName("网新") |
|
|
|
walk.App().SetOrganizationName(app.name) |
|
|
|
walk.App().SetProductName(app.name) |
|
|
|
|
|
|
|
showMsg(fmt.Sprintf(" 当前获取的目录为:%s", path)) |
|
|
|
|
|
|
@ -167,11 +173,11 @@ func getWindows() error { |
|
|
|
Text: "数据备份", |
|
|
|
OnTriggered: dbBak, |
|
|
|
}, |
|
|
|
Action{ |
|
|
|
/*Action{ |
|
|
|
// Image: "./image//huanyuan.png",
|
|
|
|
Text: "数据还原", |
|
|
|
OnTriggered: reDbBak, |
|
|
|
}, |
|
|
|
},*/ |
|
|
|
Action{ |
|
|
|
// Image: "./image//tuichu.png",
|
|
|
|
Text: "退出", |
|
|
@ -380,7 +386,7 @@ func startService(service myService) { |
|
|
|
} |
|
|
|
showMsg(service.serviceName + " 服务开始启动......") |
|
|
|
err = s.StartService() |
|
|
|
time.Sleep(15 * time.Second) |
|
|
|
// time.Sleep(15 * time.Second)
|
|
|
|
if err != nil { |
|
|
|
showMsg(service.serviceName + " 服务启动失败!") |
|
|
|
} else { |
|
|
@ -636,50 +642,76 @@ func setServerSize() { |
|
|
|
func dbBak() { |
|
|
|
// 判断 mysql 服务应用启动
|
|
|
|
if service1.btnStart.Enabled() { |
|
|
|
walk.MsgBox(app.mw, "错误", "数据库服务未启动,进行数据库服务启动!", walk.MsgBoxIconWarning) |
|
|
|
walk.MsgBox(app.mw, "错误", "数据库服务未启动,即将进行数据库服务启动!", walk.MsgBoxIconWarning) |
|
|
|
startService(service1) |
|
|
|
} |
|
|
|
|
|
|
|
db, _ := sql.Open("mysql", "root:admin@tcp(127.0.0.1:35017)/hy_qggwy?charset=utf8") |
|
|
|
showMsg("连接数据库成功!") |
|
|
|
time.Sleep(time.Second) |
|
|
|
|
|
|
|
// 创建临时文件夹
|
|
|
|
dir := time.Now().Format("2006102150405") |
|
|
|
if err := os.MkdirAll(dir, os.ModePerm); err != nil { |
|
|
|
showMsg("创建临时目录时发生异常!") |
|
|
|
} |
|
|
|
// 判断 mysql 服务应用启动
|
|
|
|
if !service1.btnStart.Enabled() { |
|
|
|
db, _ := sql.Open("mysql", "root:admin@tcp(127.0.0.1:35017)/hy_qggwy?charset=utf8") |
|
|
|
showMsg("连接数据库成功!\n备份操作可能需要相当长时间...") |
|
|
|
|
|
|
|
// 【压缩data方式】创建临时文件夹
|
|
|
|
dir := time.Now().Format("2006102150405") |
|
|
|
if err := os.MkdirAll(dir, os.ModePerm); err != nil { |
|
|
|
showMsg("创建临时目录时发生异常!\n请重试!") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
// 统计库部分
|
|
|
|
for i := 0; i < len(tableNameTj); i++ { |
|
|
|
QuerySQL(db, dir, "select * from "+tableNameTj[i], tableNameTj[i], []string{}) |
|
|
|
} |
|
|
|
// 【sql方式】统计库部分
|
|
|
|
/* for i := 0; i < len(tableNameTj); i++ { |
|
|
|
QuerySQL(db, dir, "select * from "+tableNameTj[i], tableNameTj[i], []string{}) |
|
|
|
}*/ |
|
|
|
|
|
|
|
// 基础库部分
|
|
|
|
QuerySQL(db, dir, "select * from a01 where STATUS=1", "a01", []string{"A0155", "JSNLSJ", "TBSJ", "XGSJ"}) |
|
|
|
for i := 0; i < len(tableName); i++ { |
|
|
|
QuerySQL(db, dir, "select * from "+tableName[i]+" where a0000 in (select a0000 from a01 where status=1)", tableName[i], []string{}) |
|
|
|
} |
|
|
|
QuerySQL(db, dir, "select * from b01", "b01", []string{}) |
|
|
|
// 【sql方式】基础库部分
|
|
|
|
/* QuerySQL(db, dir, "select * from a01 where STATUS=1", "a01", []string{"A0155", "JSNLSJ", "TBSJ", "XGSJ"}) |
|
|
|
for i := 0; i < len(tableName); i++ { |
|
|
|
QuerySQL(db, dir, "select * from "+tableName[i]+" where a0000 in (select a0000 from a01 where status=1)", tableName[i], []string{}) |
|
|
|
} |
|
|
|
QuerySQL(db, dir, "select * from b01", "b01", []string{})*/ |
|
|
|
|
|
|
|
// 处理照片信息
|
|
|
|
copyFileByA57(db, dir) |
|
|
|
|
|
|
|
// 关闭服务
|
|
|
|
stopService(service1) |
|
|
|
|
|
|
|
time.Sleep(time.Second) |
|
|
|
|
|
|
|
// 处理照片信息
|
|
|
|
copyFileByA57(db, dir) |
|
|
|
// 备份压缩文件
|
|
|
|
Zip("./mysql/data", fmt.Sprintf("./%s/data.gz", dir)) |
|
|
|
|
|
|
|
dirName := fmt.Sprintf("./%s/", dir) |
|
|
|
fileName := fmt.Sprintf("%s.gz", dir) |
|
|
|
// 进行压缩操作 并 删除压缩前目录
|
|
|
|
Zip(dirName, fileName) |
|
|
|
if err := os.RemoveAll(dir); err != nil { |
|
|
|
showMsg("删除历史目录时发生异常!") |
|
|
|
dirName := fmt.Sprintf("./%s/", dir) |
|
|
|
fileName := fmt.Sprintf("%s.gz", dir) |
|
|
|
// 进行压缩操作 并 删除压缩前目录
|
|
|
|
Zip(dirName, fileName) |
|
|
|
if err := os.RemoveAll(dir); err != nil { |
|
|
|
showMsg("删除历史目录时发生异常!") |
|
|
|
} |
|
|
|
|
|
|
|
time.Sleep(time.Second) |
|
|
|
// 启动服务
|
|
|
|
startService(service1) |
|
|
|
showMsg("已完成数据备份!") |
|
|
|
showMsg(fmt.Sprintf(`⭐数据备份:%s`, fileName)) |
|
|
|
} else { |
|
|
|
showMsg("无法正常启动数据库!") |
|
|
|
} |
|
|
|
showMsg("已完成数据备份!") |
|
|
|
showMsg(fmt.Sprintf(`⭐数据备份:%s`, fileName)) |
|
|
|
} |
|
|
|
|
|
|
|
// reDbBak 备份数据还原
|
|
|
|
func reDbBak() { |
|
|
|
// 执行还原操作
|
|
|
|
// runSQL("mysqlPath", "sqlPath")
|
|
|
|
showMsg("【待完善】备份数据还原!") |
|
|
|
app.RunDbBakSetingDialog(app.mw, func(setings *DbBakSetings) { |
|
|
|
// 停服务
|
|
|
|
//stopService(service1)
|
|
|
|
|
|
|
|
// 起服务
|
|
|
|
//startService(service1)
|
|
|
|
// 执行还原操作
|
|
|
|
showMsg("已完成备份数据还原!") |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
//数据库配置结构
|
|
|
@ -710,7 +742,7 @@ func (mw *myApp) RunDbSetingDialog(owner walk.Form, confirmCall func(*DbSetings) |
|
|
|
DataSource: seting, |
|
|
|
ErrorPresenter: ToolTipErrorPresenter{}, |
|
|
|
}, |
|
|
|
MinSize: Size{Width: 450, Height: 220}, |
|
|
|
MinSize: Size{Width: 450, Height: 160}, |
|
|
|
Layout: VBox{}, |
|
|
|
Children: []Widget{ |
|
|
|
Composite{ |
|
|
@ -788,7 +820,7 @@ func (mw *myApp) RunAppSetingDialog(owner walk.Form, confirmCall func(*AppSeting |
|
|
|
DataSource: seting, |
|
|
|
ErrorPresenter: ToolTipErrorPresenter{}, |
|
|
|
}, |
|
|
|
MinSize: Size{Width: 450, Height: 320}, |
|
|
|
MinSize: Size{Width: 450, Height: 270}, |
|
|
|
Layout: VBox{}, |
|
|
|
Children: []Widget{ |
|
|
|
Composite{ |
|
|
@ -841,14 +873,98 @@ func (mw *myApp) RunAppSetingDialog(owner walk.Form, confirmCall func(*AppSeting |
|
|
|
}.Run(owner) |
|
|
|
} |
|
|
|
|
|
|
|
// runSQL 执行sql脚本
|
|
|
|
func runSQL(mysqlPath, sqlPath string) { |
|
|
|
log.Print("调用执行对应的SQL脚本:", sqlPath) |
|
|
|
c := exec.Command("cmd", "/C", mysqlPath+"mysql -uroot -padmin hy_qggwy < "+sqlPath) |
|
|
|
if err := c.Run(); err != nil { |
|
|
|
log.Print("【不影响执行】执行时发生异常!异常为:", err) |
|
|
|
//数据还原设置
|
|
|
|
type DbBakSetings struct { |
|
|
|
*walk.MainWindow |
|
|
|
searchBox *walk.LineEdit |
|
|
|
path 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) |
|
|
|
// 设置预定值
|
|
|
|
|
|
|
|
_, _ = 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{ |
|
|
|
LineEdit{ |
|
|
|
ReadOnly: true, |
|
|
|
AssignTo: &seting.searchBox, |
|
|
|
}, |
|
|
|
PushButton{ |
|
|
|
Text: "选择", |
|
|
|
OnClicked: seting.selectFile, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
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) |
|
|
|
} |
|
|
|
|
|
|
|
func (mw *DbBakSetings) selectFile() { |
|
|
|
|
|
|
|
dlg := new(walk.FileDialog) |
|
|
|
dlg.Title = "选择还原文件(格式:gz)" |
|
|
|
dlg.Filter = "可执行文件 (*.gz)|*.gz" |
|
|
|
|
|
|
|
mw.searchBox.SetText("") //通过重定向变量设置TextEdit的Text
|
|
|
|
if ok, err := dlg.ShowOpen(mw); err != nil { |
|
|
|
showMsg("【异常】选择打开文件!") |
|
|
|
} else if !ok { |
|
|
|
showMsg("Cancel\n") |
|
|
|
} |
|
|
|
log.Print("预置脚本数据成功!") |
|
|
|
mw.searchBox.SetText(mw.path) |
|
|
|
} |
|
|
|
|
|
|
|
// QuerySQL 获取表数据
|
|
|
@ -955,7 +1071,7 @@ func CopyFile(src, des string) (w int64, err error) { |
|
|
|
} |
|
|
|
|
|
|
|
// Zip 打包成zip文件
|
|
|
|
func Zip(srcDir string, zipFileName string) { |
|
|
|
func Zip(srcDir, zipFileName string) { |
|
|
|
|
|
|
|
// 预防:旧文件无法覆盖
|
|
|
|
_ = os.RemoveAll(zipFileName) |
|
|
@ -1019,7 +1135,7 @@ func OpenUrl(url string) error { |
|
|
|
return c.Start() |
|
|
|
} |
|
|
|
|
|
|
|
// hasHzb 判断软件是否安装
|
|
|
|
// HasHzb 判断软件是否安装
|
|
|
|
func HasHzb() error { |
|
|
|
key2020, err2020 := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\全国公务员管理信息系统2020版`, registry.QUERY_VALUE) |
|
|
|
defer key2020.Close() |
|
|
@ -1034,7 +1150,7 @@ func HasHzb() error { |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
// inHzb 判断当前软件是否在正确的位置
|
|
|
|
// InHzb 判断当前软件是否在正确的位置
|
|
|
|
func InHzb() error { |
|
|
|
pwd, _ := os.Getwd() |
|
|
|
// 判断依据 为是否存在 360se6、tools、Tomcat8 和 mysql 目录下
|
|
|
@ -1048,10 +1164,11 @@ func InHzb() error { |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
// Contains 列表是否包含某值
|
|
|
|
func Contains(array []fs.FileInfo, val string) (index int) { |
|
|
|
index = -1 |
|
|
|
for i := range array { |
|
|
|
// fmt.Println(array[i].Name()) //打印当前文件或目录下的文件或目录名
|
|
|
|
// log.Println(array[i].Name()) //打印当前文件或目录下的文件或目录名
|
|
|
|
if array[i].Name() == val { |
|
|
|
index = i |
|
|
|
return |
|
|
|