Browse Source

完善 还原功能

master
VIVIMAN 4 years ago
parent
commit
a837d29731
  1. 219
      golang_learn/data_func/go_to_windows/main.go

219
golang_learn/data_func/go_to_windows/main.go

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

Loading…
Cancel
Save