Browse Source

完善 还原功能

master
VIVIMAN 3 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. 启动、终止并设置 应用和数据库 服务",
"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

Loading…
Cancel
Save