feat: 添加版本号显示 优化代码
All checks were successful
构建上传工具 / build-tool (push) Successful in 1m40s

This commit is contained in:
2025-10-18 08:58:23 +08:00
parent ed220996a7
commit 19bee04ecb
2 changed files with 55 additions and 70 deletions

View File

@@ -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
View File

@@ -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 {