From 76cbba7f4ffa110693d627b7a4a7eee5489eef95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=92=E6=AD=A6?= Date: Thu, 24 Mar 2022 19:49:02 +0800 Subject: [PATCH 1/5] update Grouper GUI --- README.md | 4 +-- app/uper.go | 23 +++++++++------- conf/start.go => cli/main.go | 47 ++++++++++++++++++++------------ Makefile => cmd/Makefile | 0 build_win.sh => cmd/build_win.sh | 0 main.go => cmd/main.go | 0 conf/json.go | 9 ++---- uper.yaml | 25 ----------------- 8 files changed, 48 insertions(+), 60 deletions(-) rename conf/start.go => cli/main.go (51%) rename Makefile => cmd/Makefile (100%) rename build_win.sh => cmd/build_win.sh (100%) rename main.go => cmd/main.go (100%) delete mode 100644 uper.yaml diff --git a/README.md b/README.md index 8d36f1d..8ca51e8 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,8 @@ 一个将本地某个指定的文件夹上传到云oss存储的服务, 特别是我在使用Axure制作PRD文档之后,需要将其与团队共享。 -这虽然有很多方法,比如:Axure自带的云、国内的pmdaniu、axurehub等; -或者你可以改用墨刀、xiaopiao、mastergo等原型设计共享工具; +这虽然有很多方法,比如:Axure自带的云、国内的pmDaNiu、AxureHub等; +或者你可以改用墨刀、xiaopiu、MasterGo等原型设计共享工具; 甚至你可以使用一些协同设计工具,说实话我不太喜欢那些在浏览器就能运行的设计工具, 他们很方便很轻量,但是我想说"有了在线PS工具,为什么你还要下载客户端"? 除了习惯已经养成外,web工具缺乏桌面程序的厚重,小手一抖返回上一页了over。 diff --git a/app/uper.go b/app/uper.go index 258618a..7dbb8cc 100644 --- a/app/uper.go +++ b/app/uper.go @@ -14,13 +14,20 @@ import ( // CliUper 是CLI版 // --------------------------------------------- func CliUper(project conf.Project, upServer any) { + // 声明进度条 + var bar tool.Bar // 执行上传 + var ts int num, addr := Grouper(project, upServer, func(n1, n2 int) { - var bar tool.Bar // 声明进度条 - bar.NewOption(0, int64(n2)) // 创建进度条 - bar.Play(int64(n1)) // 进度值 - bar.Finish() // 结束进度条 + if ts == 0 { + bar.NewOption(0, int64(n2)) // 创建进度条 + bar.Play(int64(n1)) // 进度值 + } else { + bar.Play(int64(n1)) // 进度值 + } + ts++ // 更新被调用次数 }) + bar.Finish() // 结束进度条 // 执行结束 fmt.Printf("🪖 报告长官, %v 个文件上传成功,访问地址为:%v/\n", num, addr) fmt.Println("ps: 如果您上传的并非网页文件或图片,可能无法访问哟~") @@ -35,11 +42,11 @@ func CliUper(project conf.Project, upServer any) { // --------------------------------------------- func Grouper(project conf.Project, upServer any, f func(n1, n2 int)) (num int, addr string) { dirPth, name := project.LocalFile, project.Name - newPathList := tool.GetFileList(dirPth) // 遍历本地指定的文件夹 文件路径列表 + newPathList := tool.GetFileList(dirPth) // 遍历本地指定的文件夹,文件路径列表 fmt.Println("扫描完成,开始上传:") var wg sync.WaitGroup // 初始化并发池 - var total int // 文件总数 + var total int // 已上传的文件总数 var domain string // 查看地址的域名 switch project.UpType { case "阿里云OSS": @@ -145,7 +152,3 @@ func view(name, domain string) (addr string) { return domain + name } } - -func ProgressBar(n1, n2 int) (value float32) { - return float32(n1 / n2) -} diff --git a/conf/start.go b/cli/main.go similarity index 51% rename from conf/start.go rename to cli/main.go index 3de075b..8209cd5 100644 --- a/conf/start.go +++ b/cli/main.go @@ -1,22 +1,21 @@ -package conf +package main import ( "flag" "fmt" + "grouper/app" + "grouper/conf" "grouper/tool" "os" + "strings" ) -// --------------------------------------------- -// 启动信息 -// --------------------------------------------- - // P N 启动参数 -var P = flag.String("p", ".", "path 文件夹的路径,需为绝对路径,默认当前目录") -var N = flag.String("n", "", "name 项目名称,请使用小写字母开头不含特殊符号") +var P = flag.String("p", ".", "path 指定上传文件夹的路径,需为绝对路径,默认当前目录") +var N = flag.String("n", "", "name 项目名称,请使用小写字母开头不含特殊符号,默认为文件夹名") -// 初始化 -func init() { +// StartInit 初始化 +func main() { var printVersion bool // 是否输出版本信息 flag.BoolVar(&printVersion, "v", false, "显示出版本信息") flag.BoolVar(&printVersion, "version", false, "显示出版本信息") @@ -30,17 +29,31 @@ func init() { fmt.Println("感谢Star 🌟 欢迎Fork 👏") os.Exit(0) // 退出程序 } -} -// CheckStartup 检查启动参数 -func CheckStartup() (path, name string) { - p := *P - if p[len(p)-1:] != "/" { + // 规范路径 + path := *P + if path[len(path)-1:] != "/" { path = fmt.Sprintf("%v/%v", *P, *N) // 本地路径 } else { path = fmt.Sprintf("%v%v", *P, *N) // 本地路径 } - name = *N // 文件名,云端&云端 - tool.NameStyle(*N, path) // 检查命名是否符合规范,文件夹是否存在 - return path, name + // 规范名称 + name := *N + if name == "" { + arr := strings.Split(path, "/") + name = arr[len(arr)-2 : len(arr)-1][0] + } + tool.NameStyle(name, path) // 检查命名是否符合规范,文件夹是否存在 + // 遍历文件并上传 + pj := conf.Project{ + Name: name, + UpType: "阿里云OSS", + LocalFile: path, + } + ups := conf.DataInfo.UpService.AliyunOss + + // fmt.Println(pj) + // fmt.Println(ups) + + app.CliUper(pj, ups) } diff --git a/Makefile b/cmd/Makefile similarity index 100% rename from Makefile rename to cmd/Makefile diff --git a/build_win.sh b/cmd/build_win.sh similarity index 100% rename from build_win.sh rename to cmd/build_win.sh diff --git a/main.go b/cmd/main.go similarity index 100% rename from main.go rename to cmd/main.go diff --git a/conf/json.go b/conf/json.go index 4b42725..5142afa 100644 --- a/conf/json.go +++ b/conf/json.go @@ -67,10 +67,12 @@ type Data struct { // 读取配置 // --------------------------------------------- +var jsonFile = "grouper.json" // 配置文件路径 + // ReadData 读取配置 func ReadData() *Data { // 读取json文件 todo 根据系统不同,如果没有则自动创建至特定目录 - jsonData, err := ioutil.ReadFile("app/grouper.json") + jsonData, err := ioutil.ReadFile(jsonFile) if err != nil { fmt.Println("打开配置文件报错:", err) } @@ -86,7 +88,6 @@ func ReadData() *Data { // UpdateAliyunOss 更新阿里云OSS配置 func (ali *AliyunOss) UpdateAliyunOss() { - jsonFile := "app/grouper.json" DataInfo.UpService.AliyunOss = *ali data, err := json.MarshalIndent(DataInfo, "", " ") if err != nil { @@ -100,7 +101,6 @@ func (ali *AliyunOss) UpdateAliyunOss() { // UpdateTencentCos 更新腾讯云COS配置 func (ten *TencentCos) UpdateTencentCos() { - jsonFile := "app/grouper.json" DataInfo.UpService.TencentCos = *ten data, err := json.MarshalIndent(DataInfo, "", " ") if err != nil { @@ -114,7 +114,6 @@ func (ten *TencentCos) UpdateTencentCos() { // UpdateQiniuOss 更新七牛云OSS配置 func (qin *QiniuOss) UpdateQiniuOss() { - jsonFile := "app/grouper.json" DataInfo.UpService.QiniuOss = *qin data, err := json.MarshalIndent(DataInfo, "", " ") if err != nil { @@ -128,7 +127,6 @@ func (qin *QiniuOss) UpdateQiniuOss() { // AddOneProject 添加一个项目 func (p *Project) AddOneProject() { - jsonFile := "app/grouper.json" if p.UpType == "" { p.UpType = "阿里云OSS" // 默认选择 } @@ -145,7 +143,6 @@ func (p *Project) AddOneProject() { // UpdateOneProject 更新一个项目 func (p *Project) UpdateOneProject() { - jsonFile := "app/grouper.json" for i := 0; i < len(DataInfo.Projects); i++ { fmt.Println(i, DataInfo.Projects[i]) if DataInfo.Projects[i].Name == p.Name { diff --git a/uper.yaml b/uper.yaml deleted file mode 100644 index a8ee1a4..0000000 --- a/uper.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# 配置文件 -# 默认使用腾讯云cos,对于较多文件的并发上传更加友好(如果你的原型文件非常大,建议选择) -# --------------------------------------------- -up_type: "tencent" # 上传服务类型(必须配置),只接受:tencent alioss qiniu 中的一个 -root_visit: "https://xxx.com" # 访问地址 - -# 腾讯云对象储存cos配置(默认使用) -tencent_cos: - bucket_name: "" # 桶名 - cos_region: "" # 区域 - secret_id: "" # id - secret_key: "" # key - -# 阿里云对象储存oss配置(可不配置) -aliyun_oss: - endpoint: "" # 地域节点地址 - key_id: "" # oss的key - key_secret: "" # oss的secret - bucket_name: "" # 存储桶的名字 - -# 七牛云对象储存oss配置(还没有完成,暂时不可用) -qiniu_oss: - access_key: "" # ak - secret_key: "" # sk - bucket_name: "" # 桶名 From 3e137169a2ad6117ede722ea52e89c295912d297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=92=E6=AD=A6?= Date: Thu, 24 Mar 2022 20:25:35 +0800 Subject: [PATCH 2/5] update Grouper GUI --- app/uper.go | 18 +++++++++++------- aui/gui.go | 1 + cli/main.go | 5 +---- cmd/main.go | 3 --- conf/json.go | 2 +- tool/style.go | 2 +- tool/tool.go | 6 +++--- 7 files changed, 18 insertions(+), 19 deletions(-) diff --git a/app/uper.go b/app/uper.go index 7dbb8cc..b3a8a8d 100644 --- a/app/uper.go +++ b/app/uper.go @@ -31,10 +31,14 @@ func CliUper(project conf.Project, upServer any) { // 执行结束 fmt.Printf("🪖 报告长官, %v 个文件上传成功,访问地址为:%v/\n", num, addr) fmt.Println("ps: 如果您上传的并非网页文件或图片,可能无法访问哟~") - // 准备退出 - time.Sleep(3 * time.Second) - for { - tool.GoodBye() + // 结束退出 + if !tool.IsOsWindows() { + return + } else { + time.Sleep(3 * time.Second) + for { + tool.GoodBye() + } } } @@ -54,7 +58,7 @@ func Grouper(project conf.Project, upServer any, f func(n1, n2 int)) (num int, a bkt := osser.AliyunGetBucket(ali) // 获取阿里云oss桶 p, _ := ants.NewPoolWithFunc(totalPool(len(newPathList)), func(i interface{}) { newPath := i.(string) - couldFile, localFile := name+newPath[len(dirPth):], newPath + couldFile, localFile := name+"/"+newPath[len(dirPth):], newPath bkt.AliyunGoUpload(couldFile, localFile) // 开始上传 wg.Done() }) // 并发任务 @@ -73,7 +77,7 @@ func Grouper(project conf.Project, upServer any, f func(n1, n2 int)) (num int, a cos := osser.CosClient(tx) // 腾讯云cos句柄 p, _ := ants.NewPoolWithFunc(totalPool(len(newPathList)), func(i interface{}) { newPath := i.(string) - couldFile, localFile := name+newPath[len(dirPth):], newPath + couldFile, localFile := name+"/"+newPath[len(dirPth):], newPath cos.Upload(couldFile, localFile) // 开始上传 wg.Done() }) // 并发任务 @@ -92,7 +96,7 @@ func Grouper(project conf.Project, upServer any, f func(n1, n2 int)) (num int, a upt := osser.QiniuGetUpToken(qin) // 获取七牛云上传Token p, _ := ants.NewPoolWithFunc(totalPool(len(newPathList)), func(i interface{}) { newPath := i.(string) - couldFile, localFile := name+newPath[len(dirPth):], newPath + couldFile, localFile := name+"/"+newPath[len(dirPth):], newPath upt.QiniuGoUpload(couldFile, localFile) // 开始上传 wg.Done() }) // 并发任务 diff --git a/aui/gui.go b/aui/gui.go index ea05814..c80a17c 100644 --- a/aui/gui.go +++ b/aui/gui.go @@ -102,4 +102,5 @@ func Loop() { cyclicUpdate() // 重新读取 isCyclic = false // 读取完成 } + g.Update() } diff --git a/cli/main.go b/cli/main.go index 8209cd5..53daa13 100644 --- a/cli/main.go +++ b/cli/main.go @@ -51,9 +51,6 @@ func main() { LocalFile: path, } ups := conf.DataInfo.UpService.AliyunOss - - // fmt.Println(pj) - // fmt.Println(ups) - + // 开始上传 app.CliUper(pj, ups) } diff --git a/cmd/main.go b/cmd/main.go index aa0a185..992556b 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -7,9 +7,6 @@ import ( // 程序入口 func main() { - // 启动 - // app.Uper() - // GUI // g.MasterWindowFlagsNotResizable // MasterWindowFlagsMaximized wnd := g.NewMasterWindow("Grouper 🐟", 730, 600, g.MasterWindowFlagsNotResizable) // wnd.SetDropCallback(onDrop) diff --git a/conf/json.go b/conf/json.go index 5142afa..675bedb 100644 --- a/conf/json.go +++ b/conf/json.go @@ -67,7 +67,7 @@ type Data struct { // 读取配置 // --------------------------------------------- -var jsonFile = "grouper.json" // 配置文件路径 +var jsonFile = "../conf/grouper.json" // 配置文件路径 // ReadData 读取配置 func ReadData() *Data { diff --git a/tool/style.go b/tool/style.go index d59712e..3c95f9a 100644 --- a/tool/style.go +++ b/tool/style.go @@ -50,6 +50,6 @@ func NameStyle(name string, path string) { // 判断文件或文件夹是否存在 _, err := os.Stat(path) if err != nil { - log.Fatalln("😭 文件或文件夹不存在!") + log.Fatalln("😭 文件夹不存在!") } } diff --git a/tool/tool.go b/tool/tool.go index 7df107a..9badf0b 100644 --- a/tool/tool.go +++ b/tool/tool.go @@ -53,7 +53,7 @@ func iterateOverFiles(path string, up func(newPath string)) { func GoodBye() { fmt.Println("⚠ 按回车或回复任意,退出程序。") reader := bufio.NewReader(os.Stdin) // 读取命令行 - osWin := isOsWindows() // 当前系统是否为windows + osWin := IsOsWindows() // 当前系统是否为windows _ = readInput(reader, osWin) // 按 CTRL+C 或输入 exit 以退出程序 // t := strings.Split(text, " ") @@ -67,8 +67,8 @@ func GoodBye() { } } -// 获取当前计算机系统类型,是否为Windows -func isOsWindows() bool { +// IsOsWindows 获取当前计算机系统类型,是否为Windows +func IsOsWindows() bool { // runtime.GOARCH 返回当前的系统架构;runtime.GOOS 返回当前的操作系统。 sysType := runtime.GOOS // fmt.Println(fmt.Sprintf("您的系统是%v,采用%v架构", runtime.GOOS, runtime.GOARCH)) From 36b38ddded23d6eea9a2475601ae308affab87b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=92=E6=AD=A6?= Date: Thu, 24 Mar 2022 23:50:43 +0800 Subject: [PATCH 3/5] update Grouper GUI --- app/uper.go | 6 +++--- aui/gui.go | 5 ++--- aui/window.go | 46 +++++++++++++++++++++++++----------------- cli/main.go | 4 +++- conf/json.go | 56 ++++++++++++++++++++------------------------------- 5 files changed, 58 insertions(+), 59 deletions(-) diff --git a/app/uper.go b/app/uper.go index b3a8a8d..4172c40 100644 --- a/app/uper.go +++ b/app/uper.go @@ -58,7 +58,7 @@ func Grouper(project conf.Project, upServer any, f func(n1, n2 int)) (num int, a bkt := osser.AliyunGetBucket(ali) // 获取阿里云oss桶 p, _ := ants.NewPoolWithFunc(totalPool(len(newPathList)), func(i interface{}) { newPath := i.(string) - couldFile, localFile := name+"/"+newPath[len(dirPth):], newPath + couldFile, localFile := name+newPath[len(dirPth):], newPath bkt.AliyunGoUpload(couldFile, localFile) // 开始上传 wg.Done() }) // 并发任务 @@ -77,7 +77,7 @@ func Grouper(project conf.Project, upServer any, f func(n1, n2 int)) (num int, a cos := osser.CosClient(tx) // 腾讯云cos句柄 p, _ := ants.NewPoolWithFunc(totalPool(len(newPathList)), func(i interface{}) { newPath := i.(string) - couldFile, localFile := name+"/"+newPath[len(dirPth):], newPath + couldFile, localFile := name+newPath[len(dirPth):], newPath cos.Upload(couldFile, localFile) // 开始上传 wg.Done() }) // 并发任务 @@ -96,7 +96,7 @@ func Grouper(project conf.Project, upServer any, f func(n1, n2 int)) (num int, a upt := osser.QiniuGetUpToken(qin) // 获取七牛云上传Token p, _ := ants.NewPoolWithFunc(totalPool(len(newPathList)), func(i interface{}) { newPath := i.(string) - couldFile, localFile := name+"/"+newPath[len(dirPth):], newPath + couldFile, localFile := name+newPath[len(dirPth):], newPath upt.QiniuGoUpload(couldFile, localFile) // 开始上传 wg.Done() }) // 并发任务 diff --git a/aui/gui.go b/aui/gui.go index c80a17c..b710647 100644 --- a/aui/gui.go +++ b/aui/gui.go @@ -61,9 +61,9 @@ func Loop() { isCyclic = true // 重新读取配置信息 } - // 修改项目 + // 编辑项目 if isFixProject { - g.Window("修改项目").IsOpen(&isFixProject).Flags(g.WindowFlagsNone).Pos(320, 30).Size(400, 200).Layout( + g.Window("编辑项目").IsOpen(&isFixProject).Flags(g.WindowFlagsNone).Pos(320, 30).Size(400, 200).Layout( fixOldProject(&oldProject)..., ) isCyclic = true // 重新读取配置信息 @@ -102,5 +102,4 @@ func Loop() { cyclicUpdate() // 重新读取 isCyclic = false // 读取完成 } - g.Update() } diff --git a/aui/window.go b/aui/window.go index 7df7573..fabe528 100644 --- a/aui/window.go +++ b/aui/window.go @@ -18,15 +18,15 @@ func initProjectItems() (projectsWidget []g.Widget) { return projectsWidget } -// 项目列表 todo 拷贝链接 +// 项目列表 func projectList(p *conf.Project) *g.TreeNodeWidget { return g.TreeNode(p.Name).Flags(g.TreeNodeFlagsCollapsingHeader).Layout( g.Label(fmt.Sprintf("项目名称:%v", p.Name)), g.Label(fmt.Sprintf("上传服务:%v", p.UpType)), g.Label(fmt.Sprintf("浏览地址:%v", addr(p.Name, p.UpType))).Wrapped(true), g.Row( - g.Button("拷链").Size(60, 25), - g.Button("修改").Size(60, 25).OnClick(func() { + // g.Button("拷链").Size(60, 25), + g.Button("编辑").Size(60, 25).OnClick(func() { oldProject = *p // 修改项目参数传递 if !isFixProject { isFixProject = !isFixProject @@ -68,8 +68,8 @@ func projectList(p *conf.Project) *g.TreeNodeWidget { // 修改项目 func fixOldProject(old *conf.Project) []g.Widget { return []g.Widget{ - g.Label("当前项目的名字(唯一且不可修改)"), - g.InputText(&old.Name).Size(g.Auto).Flags(g.InputTextFlagsReadOnly), + g.Label(fmt.Sprintf("项目名称:%v", old.Name)), // g.InputText(&old.Name).Size(g.Auto).Flags(g.InputTextFlagsReadOnly), + g.Dummy(0, 1), // 间隙、空隙 g.Label("选择上传服务(一定要设置对应的资料哦)"), g.Combo("", upType[upTypeSelected], upType, &upTypeSelected).Size(g.Auto).OnChange(func() { old.UpType = upType[upTypeSelected] @@ -77,18 +77,28 @@ func fixOldProject(old *conf.Project) []g.Widget { }), g.Label("文件夹路径(文件夹)"), g.InputText(&old.LocalFile).Size(g.Auto), - g.Align(g.AlignCenter).To( - g.Row( - g.Button("确定").Size(60, 25).OnClick(func() { - fmt.Println("修改项目: ", old) - old.UpdateOneProject() - g.Msgbox("修改完成", "项目重组生态格局").Buttons(g.MsgboxButtonsOk).ResultCallback(func(result g.DialogResult) { - if result { - isFixProject = false // 关闭修改项目的窗口 - } - }) - }), - ), + g.Dummy(0, 3), // 间隙、空隙 + g.Row( + g.Button("删除").Size(60, 25).OnClick(func() { + g.Msgbox("删除项目", "快速沉淀,适度倾斜资源").Buttons(g.MsgboxButtonsOkCancel).ResultCallback(func(result g.DialogResult) { + if result { + old.DeleteOneProject() // 删除 + isCyclic = true // 重新读取配置信息 + isFixProject = false // 关闭项目窗口 + } + }) + }), + g.Button("取消").Size(60, 25).OnClick(func() { + isFixProject = false // 关闭项目窗口 + }), + g.Button("确定").Size(60, 25).OnClick(func() { + old.UpdateOneProject() // 修改一个项目 + g.Msgbox("修改完成", "项目重组生态格局").Buttons(g.MsgboxButtonsOk).ResultCallback(func(result g.DialogResult) { + if result { + isFixProject = false // 关闭修改项目的窗口 + } + }) + }), ), } } @@ -96,7 +106,7 @@ func fixOldProject(old *conf.Project) []g.Widget { // 添加一个项目 todo 增加对项目名称的判断限制 func addOneProject(one *conf.Project) []g.Widget { return []g.Widget{ - g.Label("输入你项目的名字(唯一且非中文)"), + g.Label("输入你项目的名字(唯一且非中文,设保存后不可更改)"), g.InputText(&one.Name).Size(g.Auto), g.Label("选择上传服务(一定要设置对应的资料哦)"), g.Combo("", upType[upTypeSelected], upType, &upTypeSelected).Size(g.Auto).OnChange(func() { diff --git a/cli/main.go b/cli/main.go index 53daa13..bb34eea 100644 --- a/cli/main.go +++ b/cli/main.go @@ -40,8 +40,10 @@ func main() { // 规范名称 name := *N if name == "" { + // 没有名字则拆分链接最后一个单词 arr := strings.Split(path, "/") - name = arr[len(arr)-2 : len(arr)-1][0] + // 为名字加上斜杠用以命名上传后的文件夹 + name = arr[len(arr)-2 : len(arr)-1][0] + "/" } tool.NameStyle(name, path) // 检查命名是否符合规范,文件夹是否存在 // 遍历文件并上传 diff --git a/conf/json.go b/conf/json.go index 675bedb..f3a89bd 100644 --- a/conf/json.go +++ b/conf/json.go @@ -89,40 +89,19 @@ func ReadData() *Data { // UpdateAliyunOss 更新阿里云OSS配置 func (ali *AliyunOss) UpdateAliyunOss() { DataInfo.UpService.AliyunOss = *ali - data, err := json.MarshalIndent(DataInfo, "", " ") - if err != nil { - fmt.Println("错误:", err) - } - err = ioutil.WriteFile(jsonFile, data, 0777) - if err != nil { - fmt.Println("错误:", err) - } + resetJsonFile() } // UpdateTencentCos 更新腾讯云COS配置 func (ten *TencentCos) UpdateTencentCos() { DataInfo.UpService.TencentCos = *ten - data, err := json.MarshalIndent(DataInfo, "", " ") - if err != nil { - fmt.Println("错误:", err) - } - err = ioutil.WriteFile(jsonFile, data, 0777) - if err != nil { - fmt.Println("错误:", err) - } + resetJsonFile() } // UpdateQiniuOss 更新七牛云OSS配置 func (qin *QiniuOss) UpdateQiniuOss() { DataInfo.UpService.QiniuOss = *qin - data, err := json.MarshalIndent(DataInfo, "", " ") - if err != nil { - fmt.Println("错误:", err) - } - err = ioutil.WriteFile(jsonFile, data, 0777) - if err != nil { - fmt.Println("错误:", err) - } + resetJsonFile() } // AddOneProject 添加一个项目 @@ -131,25 +110,34 @@ func (p *Project) AddOneProject() { p.UpType = "阿里云OSS" // 默认选择 } DataInfo.Projects = append(DataInfo.Projects, *p) - data, err := json.MarshalIndent(DataInfo, "", " ") - if err != nil { - fmt.Println("错误:", err) - } - err = ioutil.WriteFile(jsonFile, data, 0777) - if err != nil { - fmt.Println("错误:", err) - } + resetJsonFile() } // UpdateOneProject 更新一个项目 func (p *Project) UpdateOneProject() { for i := 0; i < len(DataInfo.Projects); i++ { - fmt.Println(i, DataInfo.Projects[i]) if DataInfo.Projects[i].Name == p.Name { DataInfo.Projects[i] = *p - fmt.Println("找到了:", p.Name) } } + resetJsonFile() +} + +func (p *Project) DeleteOneProject() { + var num int + for i := 0; i < len(DataInfo.Projects); i++ { + if DataInfo.Projects[i].Name == p.Name { + num = i + fmt.Println(p.Name) + } + } + DataInfo.Projects = append(DataInfo.Projects[:num], DataInfo.Projects[num+1:]...) + fmt.Println(DataInfo.Projects) + resetJsonFile() +} + +// 重置配置文件 +func resetJsonFile() { data, err := json.MarshalIndent(DataInfo, "", " ") if err != nil { fmt.Println("错误:", err) From 9e2d53f58865f259dcbbaa456469b10e6a530950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=92=E6=AD=A6?= Date: Fri, 25 Mar 2022 11:47:04 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E4=B8=BA=E7=A9=BA?= =?UTF-8?q?=E6=97=B6=E4=B8=8A=E4=BC=A0=E4=BC=9A=E6=8A=A5=E9=94=99=E7=9A=84?= =?UTF-8?q?BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aui/variable.go | 25 +++++++++++++++++- aui/window.go | 6 +++++ cli/main.go | 14 +++++----- cmd/Makefile | 2 +- cmd/build_win.sh | 4 +-- conf/json.go | 67 +++++++++++++++++++++++++++++++++++++++++++----- 6 files changed, 101 insertions(+), 17 deletions(-) diff --git a/aui/variable.go b/aui/variable.go index d496754..70c96ca 100644 --- a/aui/variable.go +++ b/aui/variable.go @@ -80,7 +80,7 @@ func addr(name string, upType string) (addr string) { } } -// 服务 +// 上传服务,绑定对应的配置 func upServer(upType string) any { switch upType { case "阿里云OSS": @@ -94,6 +94,29 @@ func upServer(upType string) any { } } +// 点击上传时,判断对应配置是否完整 +func checkupServerConfig(upType string) (isComplete bool) { + switch upType { + case "阿里云OSS": + if ali.KeyID == "" || ali.KeySecret == "" || ali.Endpoint == "" || ali.BucketName == "" { + return false + } + return true + case "腾讯云COS": + if ten.BucketName == "" || ten.SecretID == "" || ten.SecretKey == "" || ten.CosRegion == "" { + return false + } + return true + case "七牛云OSS": + if qin.BucketName == "" || qin.AccessKey == "" || qin.SecretKey == "" { + return false + } + return true + default: + return false + } +} + // 更新文本信息 // wnd.SetDropCallback(onDrop) // func onDrop(names []string) { diff --git a/aui/window.go b/aui/window.go index fabe528..e940f70 100644 --- a/aui/window.go +++ b/aui/window.go @@ -40,7 +40,13 @@ func projectList(p *conf.Project) *g.TreeNodeWidget { } // 一个新的上传任务 g.Msgbox("上传项目", "开始打通领域闭环!").Buttons(g.MsgboxButtonsOkCancel).ResultCallback(func(result g.DialogResult) { + // 点击了"OK" if result { + // 判断配置文件数据是否完整,如果不完整则提示 + if !checkupServerConfig(p.UpType) { + g.Msgbox("对应上传服务的配置不完整", "犹豫就会败北,现在就去【设置】中配置").Buttons(g.MsgboxButtonsOk) + return // 从此处返回,防止程序崩溃报错 + } // 通过回调获悉,开始上传 fmt.Println("开始上传……") var wg sync.WaitGroup diff --git a/cli/main.go b/cli/main.go index bb34eea..30e97f4 100644 --- a/cli/main.go +++ b/cli/main.go @@ -3,7 +3,6 @@ package main import ( "flag" "fmt" - "grouper/app" "grouper/conf" "grouper/tool" "os" @@ -40,19 +39,20 @@ func main() { // 规范名称 name := *N if name == "" { - // 没有名字则拆分链接最后一个单词 arr := strings.Split(path, "/") - // 为名字加上斜杠用以命名上传后的文件夹 - name = arr[len(arr)-2 : len(arr)-1][0] + "/" - } + name = arr[len(arr)-2 : len(arr)-1][0] + } // 没有名字则拆分链接最后一个单词 tool.NameStyle(name, path) // 检查命名是否符合规范,文件夹是否存在 + name += "/" // 为名字加上斜杠用以命名上传后的文件夹 // 遍历文件并上传 pj := conf.Project{ Name: name, UpType: "阿里云OSS", LocalFile: path, } - ups := conf.DataInfo.UpService.AliyunOss + upload := conf.DataInfo.UpService.AliyunOss + fmt.Println(pj) + fmt.Println(upload) // 开始上传 - app.CliUper(pj, ups) + // app.CliUper(pj, upload) } diff --git a/cmd/Makefile b/cmd/Makefile index 35e310b..196347b 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -2,7 +2,7 @@ all: default: go build -o main main.go - appify -name "grouper" -icon resource/app.png main + appify -name "grouper" -icon ../resource/app.png main rm -rf main windows: diff --git a/cmd/build_win.sh b/cmd/build_win.sh index a4bcacf..28729f6 100755 --- a/cmd/build_win.sh +++ b/cmd/build_win.sh @@ -1,6 +1,6 @@ cat > grouper.rc << EOL -id ICON "resource/app.ico" -GLFW_ICON ICON "resource/app.ico" +id ICON "../resource/app.ico" +GLFW_ICON ICON "../resource/app.ico" EOL #x86_64-w64-mingw32-windres grouper.rc -O coff -o grouper.syso diff --git a/conf/json.go b/conf/json.go index f3a89bd..cbabab3 100644 --- a/conf/json.go +++ b/conf/json.go @@ -4,16 +4,26 @@ import ( "encoding/json" "fmt" "io/ioutil" + "log" + "os" + "os/user" ) // --------------------------------------------- // 初始化 // --------------------------------------------- -var DataInfo *Data +var jsonFile string // 配置文件路径 +var DataInfo *Data // 配置信息 func init() { - DataInfo = ReadData() + // 获取用户主目录 u.HomeDir + u, err := user.Current() + if err != nil { + log.Fatal(err) + } + jsonFile = u.HomeDir + "/.grouper.json" + DataInfo = ReadData() // 初始化配置信息 } // --------------------------------------------- @@ -67,18 +77,62 @@ type Data struct { // 读取配置 // --------------------------------------------- -var jsonFile = "../conf/grouper.json" // 配置文件路径 - // ReadData 读取配置 func ReadData() *Data { - // 读取json文件 todo 根据系统不同,如果没有则自动创建至特定目录 + // 判断是否存在配置文件 + _, err := os.Stat(jsonFile) + // 如果不存在则写入后再读取 + if os.IsNotExist(err) { + dataBytes := `{ + "projects": [ + { + "name": "test1", + "up_type": "阿里云OSS", + "local_file": "/您的主目录/您的子目录/同名文件夹test1" + }, + { + "name": "test2", + "up_type": "阿里云OSS", + "local_file": "/您的主目录/您的子目录/同名文件夹test2" + } + ], + "up_service": { + "tencent_cos": { + "bucket_name": "", + "cos_region": "", + "secret_id": "", + "secret_key": "", + "domain": "" + }, + "aliyun_oss": { + "endpoint": "", + "key_id": "", + "key_secret": "", + "bucket_name": "", + "domain": "" + }, + "qiniu_oss": { + "access_key": "", + "secret_key": "", + "bucket_name": "", + "domain": "" + } + } + }` + // fmt.Println("dataBytes:", dataBytes) + _ = ioutil.WriteFile(jsonFile, []byte(dataBytes), 0666) + } + // 否则直接读取json文件 jsonData, err := ioutil.ReadFile(jsonFile) if err != nil { - fmt.Println("打开配置文件报错:", err) + log.Fatal("打开配置文件报错:", err) } // 绑定到结构体 var info Data err = json.Unmarshal(jsonData, &info) + if err != nil { + log.Fatal("数据错误:", err) + } return &info } @@ -123,6 +177,7 @@ func (p *Project) UpdateOneProject() { resetJsonFile() } +// DeleteOneProject 删除一个项目 func (p *Project) DeleteOneProject() { var num int for i := 0; i < len(DataInfo.Projects); i++ { From 5f90d46ddcd64047bb9cf3964b686c2443f04bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=92=E6=AD=A6?= Date: Fri, 25 Mar 2022 11:50:48 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aui/gui.go | 3 ++- cli/main.go | 2 +- conf/json.go | 5 +++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/aui/gui.go b/aui/gui.go index b710647..9973364 100644 --- a/aui/gui.go +++ b/aui/gui.go @@ -3,6 +3,7 @@ package aui import ( "fmt" g "github.com/AllenDang/giu" + "grouper/conf" "os" ) @@ -33,7 +34,7 @@ func Loop() { ), g.Menu("开发者").Layout( g.Label("产品:Grouper"), - g.Label("版本:v1.0.0-beta"), + g.Label(fmt.Sprintf("版本:%s\n", conf.Version)), g.Label("Github:https://github.com/xiwuou/grouper"), g.Separator(), // 分割线 g.Label("开发者:習武"), diff --git a/cli/main.go b/cli/main.go index 30e97f4..174adeb 100644 --- a/cli/main.go +++ b/cli/main.go @@ -21,7 +21,7 @@ func main() { // 解析命令行参数 flag.Parse() if printVersion { - fmt.Println("版本号:v1.0-20210311") + fmt.Printf("版本号:%s\n", conf.Version) fmt.Println("开发者:習武(公众号:逆天思维产品汪)") fmt.Println("使用说明:xxx.xxx") fmt.Println("Github地址:https://github.com/xiwuou/uper") diff --git a/conf/json.go b/conf/json.go index cbabab3..7fbc878 100644 --- a/conf/json.go +++ b/conf/json.go @@ -13,8 +13,9 @@ import ( // 初始化 // --------------------------------------------- -var jsonFile string // 配置文件路径 -var DataInfo *Data // 配置信息 +var jsonFile string // 配置文件路径 +var DataInfo *Data // 配置信息 +const Version = "v1.0-beta" // 版本信息 func init() { // 获取用户主目录 u.HomeDir