This commit is contained in:
yml2213
2026-07-23 13:03:47 +08:00
commit 2a67d074a4
12 changed files with 999 additions and 0 deletions
+236
View File
@@ -0,0 +1,236 @@
package app
import (
"context"
"fmt"
"io"
"os"
"strings"
"time"
"fyne.io/fyne/v2"
fyneapp "fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/widget"
"updata_hfb/internal/hfb"
)
const sampleText = `上号方式:QQ扫码
哈夫币纯币:156
段位:铂金
等级:60
保险格数:9
每日消耗:10
体力:7
负重:7
AWM子弹数量:80
6头数量:13
6甲数量:12
皮肤:暗星
绝密KD0.2
押金:350
号主在线时间:11:00 至 00:00
封禁记录:无
常用地区:海南
回收比例:1:47.0
回收租金:332
联系电话:15203616450`
func Run() {
a := fyneapp.NewWithID("com.hfb.updata")
w := a.NewWindow("哈夫币外部上传")
w.Resize(fyne.NewSize(920, 760))
serverEntry := widget.NewEntry()
serverEntry.SetText(envDefault("HFB_SERVER", "http://127.0.0.1:8080"))
serverEntry.SetPlaceHolder("例如:http://127.0.0.1:8080")
uploaderEntry := widget.NewEntry()
uploaderEntry.SetText(strings.TrimSpace(os.Getenv("HFB_UPLOADER_NAME")))
uploaderEntry.SetPlaceHolder("后台上传管理员名称")
secretEntry := widget.NewEntry()
secretEntry.Password = true
secretEntry.SetText(strings.TrimSpace(os.Getenv("HFB_UPLOAD_SECRET")))
secretEntry.SetPlaceHolder("未配置密钥可留空")
timeoutEntry := widget.NewEntry()
timeoutEntry.SetText("15s")
timeoutEntry.SetPlaceHolder("例如:15s")
dataEntry := widget.NewMultiLineEntry()
dataEntry.Wrapping = fyne.TextWrapWord
dataEntry.SetMinRowsVisible(18)
dataEntry.SetPlaceHolder(sampleText)
resultEntry := widget.NewMultiLineEntry()
resultEntry.Wrapping = fyne.TextWrapWord
resultEntry.SetMinRowsVisible(8)
resultEntry.Disable()
statusLabel := widget.NewLabel("准备就绪")
setResult := func(text string) {
resultEntry.Enable()
resultEntry.SetText(text)
resultEntry.Disable()
}
setBusy := func(uploadBtn *widget.Button, previewBtn *widget.Button, busy bool) {
if busy {
uploadBtn.Disable()
previewBtn.Disable()
statusLabel.SetText("正在上传,请稍等...")
return
}
uploadBtn.Enable()
previewBtn.Enable()
}
var uploadBtn *widget.Button
var previewBtn *widget.Button
loadBtn := widget.NewButton("打开文件", func() {
dialog.ShowFileOpen(func(reader fyne.URIReadCloser, err error) {
if err != nil {
dialog.ShowError(fmt.Errorf("打开文件失败:%w", err), w)
return
}
if reader == nil {
return
}
defer reader.Close()
content, err := io.ReadAll(reader)
if err != nil {
dialog.ShowError(fmt.Errorf("读取文件失败:%w", err), w)
return
}
dataEntry.SetText(string(content))
statusLabel.SetText("已载入文件")
}, w)
})
sampleBtn := widget.NewButton("填入示例", func() {
dataEntry.SetText(sampleText)
statusLabel.SetText("已填入示例数据")
})
clearBtn := widget.NewButton("清空", func() {
dataEntry.SetText("")
setResult("")
statusLabel.SetText("已清空")
})
previewBtn = widget.NewButton("预览 JSON", func() {
req, err := buildRequest(uploaderEntry.Text, dataEntry.Text)
if err != nil {
statusLabel.SetText("解析失败")
dialog.ShowError(err, w)
return
}
out, err := hfb.MarshalPretty(req)
if err != nil {
statusLabel.SetText("生成 JSON 失败")
dialog.ShowError(err, w)
return
}
setResult(string(out))
statusLabel.SetText("预览已生成")
})
uploadBtn = widget.NewButton("上传", func() {
timeout, err := time.ParseDuration(strings.TrimSpace(timeoutEntry.Text))
if err != nil || timeout <= 0 {
dialog.ShowError(fmt.Errorf("请求超时时间不正确:%s", timeoutEntry.Text), w)
return
}
req, err := buildRequest(uploaderEntry.Text, dataEntry.Text)
if err != nil {
statusLabel.SetText("解析失败")
dialog.ShowError(err, w)
return
}
server := strings.TrimSpace(serverEntry.Text)
secret := strings.TrimSpace(secretEntry.Text)
setBusy(uploadBtn, previewBtn, true)
setResult("")
go func() {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
resp, err := hfb.Client{
Server: server,
Secret: secret,
Timeout: timeout,
}.Upload(ctx, req)
fyne.Do(func() {
setBusy(uploadBtn, previewBtn, false)
if err != nil {
statusLabel.SetText("上传失败")
setResult(err.Error())
dialog.ShowError(err, w)
return
}
statusLabel.SetText("上传成功")
setResult(resp)
dialog.ShowInformation("上传成功", "数据已经提交到服务器。", w)
})
}()
})
uploadBtn.Importance = widget.HighImportance
form := widget.NewForm(
widget.NewFormItem("服务器", serverEntry),
widget.NewFormItem("上传人", uploaderEntry),
widget.NewFormItem("上传密钥", secretEntry),
widget.NewFormItem("超时时间", timeoutEntry),
)
toolbar := container.NewHBox(loadBtn, sampleBtn, clearBtn, previewBtn, uploadBtn)
content := container.NewBorder(
nil,
container.NewVBox(statusLabel),
nil,
nil,
container.NewVScroll(container.NewVBox(
widget.NewLabel("连接配置"),
form,
toolbar,
widget.NewLabel("账号数据"),
dataEntry,
widget.NewLabel("结果"),
resultEntry,
)),
)
w.SetContent(content)
w.ShowAndRun()
}
func buildRequest(uploaderName string, rawText string) (hfb.ExternalUploadRequest, error) {
if strings.TrimSpace(rawText) == "" {
return hfb.ExternalUploadRequest{}, fmt.Errorf("账号数据不能为空")
}
parsed, err := hfb.ParseUploadText(rawText)
if err != nil {
return hfb.ExternalUploadRequest{}, err
}
name := strings.TrimSpace(uploaderName)
if name == "" {
name = parsed.UploaderName
}
if name == "" {
return hfb.ExternalUploadRequest{}, fmt.Errorf("缺少上传人名称:请在“上传人”里填写,或在文本中增加“上传人:姓名”")
}
return hfb.NewExternalUploadRequest(name, parsed.Account, time.Now()), nil
}
func envDefault(key string, fallback string) string {
value := strings.TrimSpace(os.Getenv(key))
if value == "" {
return fallback
}
return value
}