This commit is contained in:
@@ -42,7 +42,7 @@ jobs:
|
|||||||
go env -w GOARCH=amd64
|
go env -w GOARCH=amd64
|
||||||
go env -w GOOS=windows
|
go env -w GOOS=windows
|
||||||
go mod tidy
|
go mod tidy
|
||||||
go build -ldflags="-s -w -H windowsgui" -o 上传工具.exe
|
go build -ldflags="-s -w -H windowsgui -X 'main.version=$(TZ=Asia/Shanghai date +"%m%d%H%M")'" -o 上传工具.exe
|
||||||
|
|
||||||
- name: 上传构建文件
|
- name: 上传构建文件
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
|
|||||||
123
main.go
123
main.go
@@ -23,41 +23,55 @@ import (
|
|||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
)
|
)
|
||||||
|
|
||||||
var isRun = false
|
var (
|
||||||
var logText = widget.NewMultiLineEntry()
|
version = "dev"
|
||||||
var ctx, cancel = context.WithCancel(context.Background())
|
isRun = false
|
||||||
|
logText = widget.NewMultiLineEntry()
|
||||||
|
ctx, cancel = context.WithCancel(context.Background())
|
||||||
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
//初始化配置
|
||||||
config.InitConfig()
|
config.InitConfig()
|
||||||
|
|
||||||
myApp := app.New()
|
a := app.New()
|
||||||
myWindow := myApp.NewWindow("抖音数据上传工具")
|
newWindow := a.NewWindow("抖音数据上传工具 - 版本" + version)
|
||||||
myWindow.Resize(fyne.NewSize(930, 600))
|
newWindow.Resize(fyne.NewSize(930, 600))
|
||||||
|
|
||||||
logText.Scroll = container.ScrollVerticalOnly
|
logText.Scroll = container.ScrollVerticalOnly
|
||||||
|
|
||||||
// 创建界面组件
|
// URL输入组件
|
||||||
urlEntry := widget.NewEntry()
|
urlEntry := widget.NewEntry()
|
||||||
urlEntry.SetPlaceHolder("http://127.0.0.1:8080")
|
urlEntry.SetPlaceHolder("http://127.0.0.1:8080")
|
||||||
urlEntry.Text = config.APPConfig.Url
|
urlEntry.Text = config.APPConfig.Url
|
||||||
urlEntry.OnChanged = func(s string) {
|
urlEntry.OnChanged = func(s string) {
|
||||||
config.WriteConfig("url", urlEntry.Text)
|
config.WriteConfig("url", urlEntry.Text)
|
||||||
}
|
}
|
||||||
|
//Token输入组件
|
||||||
tokenEntry := widget.NewEntry()
|
tokenEntry := widget.NewEntry()
|
||||||
tokenEntry.SetPlaceHolder("请输入Token")
|
tokenEntry.SetPlaceHolder("请输入Token")
|
||||||
tokenEntry.Text = config.APPConfig.Token
|
tokenEntry.Text = config.APPConfig.Token
|
||||||
tokenEntry.OnChanged = func(s string) {
|
tokenEntry.OnChanged = func(s string) {
|
||||||
config.WriteConfig("token", tokenEntry.Text)
|
config.WriteConfig("token", tokenEntry.Text)
|
||||||
}
|
}
|
||||||
|
//目录选择输入组件
|
||||||
selectedDirLabel := widget.NewEntry()
|
selectedDirLabel := widget.NewEntry()
|
||||||
selectedDirLabel.SetPlaceHolder("未选择目录(默认为程序运行目录)")
|
selectedDirLabel.SetPlaceHolder("未选择目录(默认为程序运行目录)")
|
||||||
selectedDirLabel.Text = config.APPConfig.LookingPath
|
selectedDirLabel.Text = config.APPConfig.LookingPath
|
||||||
selectedDirLabel.OnChanged = func(s string) {
|
selectedDirLabel.OnChanged = func(s string) {
|
||||||
config.WriteConfig("looking-path", selectedDirLabel.Text)
|
config.WriteConfig("looking-path", selectedDirLabel.Text)
|
||||||
}
|
}
|
||||||
|
//目录选择按钮
|
||||||
|
selectDirBtn := widget.NewButton("选择检测目录", func() {
|
||||||
|
// 调用CGO实现的Windows原生对话框
|
||||||
|
selectedPath := folder.OpenFolderDialog()
|
||||||
|
if selectedPath == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
selectedDirLabel.SetText(selectedPath)
|
||||||
|
config.WriteConfig("looking-path", selectedPath)
|
||||||
|
})
|
||||||
|
//上传线程数输入组件
|
||||||
threadCountLabel := widget.NewEntry()
|
threadCountLabel := widget.NewEntry()
|
||||||
threadCountLabel.SetPlaceHolder("10")
|
threadCountLabel.SetPlaceHolder("10")
|
||||||
threadCountLabel.Text = strconv.Itoa(config.APPConfig.ThreadCount)
|
threadCountLabel.Text = strconv.Itoa(config.APPConfig.ThreadCount)
|
||||||
@@ -68,7 +82,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
config.WriteConfig("thread-count", i)
|
config.WriteConfig("thread-count", i)
|
||||||
}
|
}
|
||||||
|
//同时处理文件数输入组件
|
||||||
handleFileCountLabel := widget.NewEntry()
|
handleFileCountLabel := widget.NewEntry()
|
||||||
handleFileCountLabel.SetPlaceHolder("50")
|
handleFileCountLabel.SetPlaceHolder("50")
|
||||||
handleFileCountLabel.Text = strconv.Itoa(config.APPConfig.HandleFileCount)
|
handleFileCountLabel.Text = strconv.Itoa(config.APPConfig.HandleFileCount)
|
||||||
@@ -80,24 +94,13 @@ func main() {
|
|||||||
config.WriteConfig("handle-file-count", i)
|
config.WriteConfig("handle-file-count", i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//是否启动程序时启动上传程序组件
|
||||||
isRunOnStartWidget := widget.NewCheck("启动程序时启动上传程序", func(b bool) {
|
isRunOnStartWidget := widget.NewCheck("启动程序时启动上传程序", func(b bool) {
|
||||||
config.WriteConfig("is-run-on-start", b)
|
config.WriteConfig("is-run-on-start", b)
|
||||||
})
|
})
|
||||||
isRunOnStartWidget.Checked = config.APPConfig.IsRunOnStart
|
isRunOnStartWidget.Checked = config.APPConfig.IsRunOnStart
|
||||||
|
//开始运行按钮
|
||||||
// 使用Windows原生目录选择按钮
|
startRun := func() {
|
||||||
selectDirBtn := widget.NewButton("选择检测目录", func() {
|
|
||||||
// 调用CGO实现的Windows原生对话框
|
|
||||||
selectedPath := folder.OpenFolderDialog()
|
|
||||||
if selectedPath == "" {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
selectedDirLabel.SetText(selectedPath)
|
|
||||||
config.WriteConfig("looking-path", selectedPath)
|
|
||||||
})
|
|
||||||
|
|
||||||
// 开始运行按钮
|
|
||||||
startBtn := widget.NewButton("开始运行", func() {
|
|
||||||
s := "==============================="
|
s := "==============================="
|
||||||
|
|
||||||
AddLog(s)
|
AddLog(s)
|
||||||
@@ -114,32 +117,14 @@ func main() {
|
|||||||
|
|
||||||
isRun = true
|
isRun = true
|
||||||
go StartLooking(ctx, config.APPConfig.LookingPath)
|
go StartLooking(ctx, config.APPConfig.LookingPath)
|
||||||
})
|
}
|
||||||
|
startBtn := widget.NewButton("开始运行", startRun)
|
||||||
|
//停止运行按钮
|
||||||
stopBtn := widget.NewButton("停止运行", func() {
|
stopBtn := widget.NewButton("停止运行", func() {
|
||||||
cancel()
|
cancel()
|
||||||
ctx, cancel = context.WithCancel(context.Background())
|
ctx, cancel = context.WithCancel(context.Background())
|
||||||
isRun = false
|
isRun = false
|
||||||
})
|
})
|
||||||
|
|
||||||
// 按钮状态同步
|
|
||||||
go func() {
|
|
||||||
for {
|
|
||||||
if isRun && (!startBtn.Disabled() || stopBtn.Disabled()) {
|
|
||||||
fyne.Do(func() {
|
|
||||||
startBtn.Disable()
|
|
||||||
stopBtn.Enable()
|
|
||||||
})
|
|
||||||
} else if !isRun && (startBtn.Disabled() || !stopBtn.Disabled()) {
|
|
||||||
fyne.Do(func() {
|
|
||||||
startBtn.Enable()
|
|
||||||
stopBtn.Disable()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
time.Sleep(100 * time.Microsecond)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
// 清除日志按钮
|
// 清除日志按钮
|
||||||
clearLogBtn := widget.NewButton("清除日志", func() {
|
clearLogBtn := widget.NewButton("清除日志", func() {
|
||||||
logText.SetText("")
|
logText.SetText("")
|
||||||
@@ -188,36 +173,39 @@ func main() {
|
|||||||
nil, nil, nil,
|
nil, nil, nil,
|
||||||
container.NewScroll(logText),
|
container.NewScroll(logText),
|
||||||
)
|
)
|
||||||
|
|
||||||
// 使用HSplit容器创建可调整大小的左右分割布局
|
// 使用HSplit容器创建可调整大小的左右分割布局
|
||||||
splitContainer := container.NewHSplit(leftPanel, rightPanel)
|
splitContainer := container.NewHSplit(leftPanel, rightPanel)
|
||||||
splitContainer.SetOffset(0.35) // 左侧占35%宽度
|
splitContainer.SetOffset(0.35) // 左侧占35%宽度
|
||||||
|
|
||||||
|
// 按钮状态同步
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
if isRun && (!startBtn.Disabled() || stopBtn.Disabled()) {
|
||||||
|
fyne.Do(func() {
|
||||||
|
startBtn.Disable()
|
||||||
|
stopBtn.Enable()
|
||||||
|
})
|
||||||
|
} else if !isRun && (startBtn.Disabled() || !stopBtn.Disabled()) {
|
||||||
|
fyne.Do(func() {
|
||||||
|
startBtn.Enable()
|
||||||
|
stopBtn.Disable()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
time.Sleep(100 * time.Microsecond)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
//在程序启动时运行上传程序
|
||||||
go func() {
|
go func() {
|
||||||
if !config.APPConfig.IsRunOnStart {
|
if !config.APPConfig.IsRunOnStart {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
s := "==============================="
|
startRun()
|
||||||
|
|
||||||
AddLog(s)
|
|
||||||
if strings.TrimSpace(tokenEntry.Text) == "" {
|
|
||||||
AddLog("错误:请输入Token")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
AddLog(fmt.Sprintf("服务器地址:%s", config.APPConfig.Url))
|
|
||||||
AddLog(fmt.Sprintf("Token:%s", config.APPConfig.Token))
|
|
||||||
AddLog(fmt.Sprintf("检测目录:%s", config.APPConfig.LookingPath))
|
|
||||||
AddLog(fmt.Sprintf("同时处理文件数:%v", config.APPConfig.HandleFileCount))
|
|
||||||
AddLog(fmt.Sprintf("单文件上传线程:%v", config.APPConfig.ThreadCount))
|
|
||||||
AddLog(s)
|
|
||||||
|
|
||||||
isRun = true
|
|
||||||
go StartLooking(ctx, config.APPConfig.LookingPath)
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
myWindow.SetContent(splitContainer)
|
newWindow.SetContent(splitContainer)
|
||||||
myWindow.ShowAndRun()
|
newWindow.ShowAndRun()
|
||||||
}
|
}
|
||||||
|
|
||||||
func AddLog(message string) {
|
func AddLog(message string) {
|
||||||
@@ -228,10 +216,7 @@ func AddLog(message string) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// 上传数据代码
|
// 上传数据代码
|
||||||
//
|
|
||||||
|
|
||||||
var httpClient = &http.Client{
|
var httpClient = &http.Client{
|
||||||
Transport: &http.Transport{
|
Transport: &http.Transport{
|
||||||
MaxIdleConns: 200,
|
MaxIdleConns: 200,
|
||||||
@@ -338,7 +323,7 @@ func StartLooking(ctx context.Context, lookingPath string) {
|
|||||||
AddLog("所有任务执行完成!")
|
AddLog("所有任务执行完成!")
|
||||||
}
|
}
|
||||||
|
|
||||||
AddLog(fmt.Sprintf("上传完成,耗时:%s", time.Since(start)))
|
AddLog(fmt.Sprintf("上传完成,耗时:%s", time.Since(start).String()))
|
||||||
}
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
|
|||||||
Reference in New Issue
Block a user