From 250ffb4e20177ede4bac3f591a4b500d237fad07 Mon Sep 17 00:00:00 2001 From: shine <1042864399@qq.com> Date: Fri, 13 Sep 2024 18:19:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A8=E5=8D=95=E6=95=B0=E6=8D=AE=E6=8C=81?= =?UTF-8?q?=E4=B9=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + cfg/config.go | 12 +- global/data.go | 2 +- {models/repo => repo}/erlangCard.go | 0 {models/repo => repo}/user.go | 0 service/erlangCard.go | 51 ++++++++ views/createErlangCard.go | 190 +++++++++++++++++----------- views/erlangCard.go | 14 +- views/userView.go | 2 +- 9 files changed, 186 insertions(+), 86 deletions(-) rename {models/repo => repo}/erlangCard.go (100%) rename {models/repo => repo}/user.go (100%) create mode 100644 service/erlangCard.go diff --git a/.gitignore b/.gitignore index 6db6d1e..d05806c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ /work_cation.iml /work_cation_0.1.2.zip /data.db +/data/ diff --git a/cfg/config.go b/cfg/config.go index 29241c4..bba3b30 100644 --- a/cfg/config.go +++ b/cfg/config.go @@ -3,17 +3,25 @@ package cfg import ( "fmt" "gopkg.in/ini.v1" + "os" ) type Config struct { - DbPath string `ini:"dbPath"` + DbPath string `ini:"dbPath"` + CardDir string `ini:"cardDir"` + CardInfo string `ini:"cardInfo"` } var T = Config{ - DbPath: "./data.db", + DbPath: "./data/data.db", + CardDir: "./data", + CardInfo: "info.json", } func init() { + defer func() { + _ = os.Mkdir(T.CardDir, os.ModeDir) + }() cfg, err := ini.Load("conf.ini") if err != nil { fmt.Println("读取配置错误1:", err) diff --git a/global/data.go b/global/data.go index 0f144a8..6daaff8 100644 --- a/global/data.go +++ b/global/data.go @@ -4,8 +4,8 @@ import ( "gorm.io/gorm" "work_cation/cfg" "work_cation/models" - "work_cation/models/repo" "work_cation/pkg/gormx" + "work_cation/repo" ) var DB *gorm.DB diff --git a/models/repo/erlangCard.go b/repo/erlangCard.go similarity index 100% rename from models/repo/erlangCard.go rename to repo/erlangCard.go diff --git a/models/repo/user.go b/repo/user.go similarity index 100% rename from models/repo/user.go rename to repo/user.go diff --git a/service/erlangCard.go b/service/erlangCard.go new file mode 100644 index 0000000..1ae9ddc --- /dev/null +++ b/service/erlangCard.go @@ -0,0 +1,51 @@ +package service + +import ( + "encoding/json" + "os" + "path/filepath" + "work_cation/cfg" + "work_cation/global" + "work_cation/models" + "work_cation/repo" +) + +type ErlangCardService struct{} + +var ErlangCard = &ErlangCardService{} + +func (*ErlangCardService) Create(erlangCard *models.ErlangCards) error { + err := os.Mkdir(filepath.Join(cfg.T.CardDir, erlangCard.UUID), os.ModeDir) + if err != nil { + return err + } + info, err := os.Create(filepath.Join(cfg.T.CardDir, erlangCard.UUID, cfg.T.CardInfo)) + if err != nil { + return err + } + jsonB, err := json.Marshal(erlangCard) + if err != nil { + return err + } + _, err = info.Write(jsonB) + if err != nil { + return err + } + err = repo.ErlangCardRepo.Create(global.DB, erlangCard) + if err != nil { + return err + } + return nil +} + +func (*ErlangCardService) GetInfoPath(erlangCard *models.ErlangCards) string { + return filepath.Join(cfg.T.CardDir, erlangCard.UUID, cfg.T.CardInfo) +} + +func (*ErlangCardService) GetImageDir(erlangCard *models.ErlangCards) []string { + var coverPaths []string + for _, cover := range erlangCard.Covers { + coverPaths = append(coverPaths, filepath.Join(cfg.T.CardDir, erlangCard.UUID, cover)) + } + return coverPaths +} diff --git a/views/createErlangCard.go b/views/createErlangCard.go index 65dca49..832c360 100644 --- a/views/createErlangCard.go +++ b/views/createErlangCard.go @@ -1,97 +1,84 @@ package views import ( - "errors" "fmt" "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/data/binding" "fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/widget" "regexp" - "work_cation/global" + "strings" "work_cation/models" - "work_cation/models/repo" "work_cation/pkg/utils" + "work_cation/service" ) +var erlangCard *models.ErlangCards + func CreateErlangCard(w fyne.Window) fyne.CanvasObject { - - // user := repo.UserRepo.GetUserInfo(global.DB) - var erlangCard = models.ErlangCards{ - UUID: utils.CreateUUID(), - UserIp: utils.Get192Ip(), + if erlangCard == nil { + erlangCard = &models.ErlangCards{ + UUID: utils.CreateUUID(), + UserIp: utils.Get192Ip(), + } } + var ( + // 基础表单 + formBase = &widget.Form{} + // 变量表单 + formVars = &widget.Form{} + ) - var items = []*widget.FormItem{ - {Text: "名称", Widget: widget.NewEntry()}, - {Text: "描述", Widget: widget.NewEntry()}, - {Text: "封面", Widget: widget.NewEntry(), HintText: "暂未支持可不填"}, - {Text: "是否默认展示", Widget: widget.NewEntry()}, - {Text: "模版内容", Widget: widget.NewEntry()}, + formBase.AppendItem(&widget.FormItem{Text: "名称", Widget: newDefaultEntry(&erlangCard.Title)}) + formBase.AppendItem(&widget.FormItem{Text: "描述", Widget: newDefaultEntry(&erlangCard.Text)}) + formBase.AppendItem(&widget.FormItem{Text: "封面", Widget: newDefaultEntry(&erlangCard.Covers), HintText: "暂未支持可不填"}) + formBase.AppendItem(&widget.FormItem{Text: "是否默认展示", Widget: newDefaultEntry(&erlangCard.IsShowOut)}) + formBase.AppendItem(&widget.FormItem{Text: "模版内容", Widget: newDefaultEntryCallback(&erlangCard.Template, func() { generateVariableForm1(erlangCard, formVars) })}) + + // 刷新变量表单 + generateVariableForm1(erlangCard, formVars) + + // 保存按钮 + buttonSave := widget.NewButton("保存", func() { + err := service.ErlangCard.Create(erlangCard) + if err != nil { + dialog.ShowError(err, w) + return + } + dialog.ShowInformation("ok", "创建成功", w) + // 更换 + erlangCard.UUID = utils.CreateUUID() + }) + + return container.NewBorder(container.NewHBox(widget.NewLabel("新建"), widget.NewSeparator()), + nil, nil, nil, container.NewScroll( + container.NewVBox( + formBase, + formVars, + buttonSave, + ))) +} + +// 刷新表单 +func generateVariableForm1(erlCard *models.ErlangCards, form2 *widget.Form) { + varSum := countVarOccurrences(erlCard.Template) + form2.Items = nil + var newVarList []string + for i := 0; i < varSum; i++ { + var item string + if i < len(erlCard.VarName) { // 如果有旧数据,则使用旧数据 + item = erlCard.VarName[i] + } + var index = i + newItem := &widget.FormItem{Text: fmt.Sprintf("变量%d", i+1), Widget: newDefaultEntryCallback(&item, func() { + erlCard.VarName[index] = item + })} + form2.AppendItem(newItem) + newVarList = append(newVarList, item) } - - var items2 []*widget.FormItem - form2 := &widget.Form{ - Items: items2, - SubmitText: "保存创建", - OnSubmit: func() { - for _, item := range items { - switch item.Text { - case "名称": - erlangCard.Title = item.Widget.(*widget.Entry).Text - case "描述": - erlangCard.Text = item.Widget.(*widget.Entry).Text - case "封面": - erlangCard.Covers = []string{item.Widget.(*widget.Entry).Text} - case "是否默认展示": - erlangCard.IsShowOut = item.Widget.(*widget.Entry).Text == "1" - case "模版内容": - erlangCard.Template = item.Widget.(*widget.Entry).Text - default: - - } - } - - if countVarOccurrences(erlangCard.Template) != len(items2) { - dialog.ShowError(errors.New("变量名数量异常"), w) - return - } - - for _, item2 := range items2 { - fmt.Println("key:", item2.Text, "value:", item2.Widget.(*widget.Entry).Text) - erlangCard.VarName = append(erlangCard.VarName, item2.Widget.(*widget.Entry).Text) - } - err := repo.ErlangCardRepo.Create(global.DB, &erlangCard) - if err != nil { - dialog.ShowError(err, w) - } - }, - } - - form := &widget.Form{ - Items: items, - SubmitText: "生成变量表单", - OnSubmit: func() { - for _, item := range items { - switch item.Text { - case "模版内容": - varSum := countVarOccurrences(item.Widget.(*widget.Entry).Text) - for i := 0; i < varSum; i++ { - newItem := &widget.FormItem{Text: fmt.Sprintf("变量%d", i+1), Widget: widget.NewEntry()} - items2 = append(items2, newItem) - form2.AppendItem(newItem) - } - default: - } - } - - }, - } - return container.NewBorder(widget.NewSeparator(), nil, nil, nil, container.NewScroll( - container.NewVBox( - form, - form2, - ))) + erlCard.VarName = newVarList + form2.Refresh() } func countVarOccurrences(input string) int { @@ -99,3 +86,52 @@ func countVarOccurrences(input string) int { matches := re.FindAllStringIndex(input, -1) return len(matches) } + +func newDefaultEntry(value any) *widget.Entry { + en := widget.NewEntry() + switch v := value.(type) { + case string: + en.SetText(v) + case bool: + if v { + en.SetText("1") + } else { + en.SetText("0") + } + case []string: + en.SetText(strings.Join(v, ",")) + + case *string: + data := binding.BindString(v) + en.Bind(data) + case *bool: + data := binding.NewString() + data.AddListener(binding.NewDataListener(func() { + s, err := data.Get() + if err != nil { + return + } + *v = s == "1" + })) + if *v { + data.Set("1") + } else { + data.Set("0") + } + en.Bind(data) + case *[]string: + data := binding.NewString() + data.Set(strings.Join(*v, ",")) + en.Bind(data) + default: + } + return en +} + +func newDefaultEntryCallback(value *string, callback func()) *widget.Entry { + en := widget.NewEntry() + data := binding.BindString(value) + en.Bind(data) + en.OnChanged = func(_ string) { callback() } + return en +} diff --git a/views/erlangCard.go b/views/erlangCard.go index a3f5bb4..b917542 100644 --- a/views/erlangCard.go +++ b/views/erlangCard.go @@ -1,7 +1,6 @@ package views import ( - "fmt" "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/data/binding" @@ -11,8 +10,8 @@ import ( "strings" "work_cation/global" "work_cation/models" - "work_cation/models/repo" "work_cation/pkg/utils" + "work_cation/repo" ) func myCardsViews(w fyne.Window) fyne.CanvasObject { @@ -26,7 +25,7 @@ func myCardsViews(w fyne.Window) fyne.CanvasObject { container.NewGridWrap(fyne.NewSize(200, 200), items...))) } -func ErlangCardView(_ fyne.Window, data *models.ErlangCards) fyne.CanvasObject { +func ErlangCardView(w fyne.Window, data *models.ErlangCards) fyne.CanvasObject { if data == nil { data = &models.ErlangCards{ UUID: utils.CreateUUID(), @@ -37,8 +36,13 @@ func ErlangCardView(_ fyne.Window, data *models.ErlangCards) fyne.CanvasObject { } } if len(data.VarName) == 0 { - return widget.NewCard(data.Title, data.Text, widget.NewButton(data.Template, func() { - fmt.Print("复制:", data.UUID) + return widget.NewCard(data.Title, data.Text, widget.NewButton("复制", func() { + err := clipboard.WriteAll(data.Template) + if err != nil { + dialog.ShowError(err, w) + return + } + dialog.NewInformation("复制脚本成功", data.Template, w).Show() })) } txtBound := binding.NewString() diff --git a/views/userView.go b/views/userView.go index 5b7a9e1..d8d0d46 100644 --- a/views/userView.go +++ b/views/userView.go @@ -7,7 +7,7 @@ import ( "fyne.io/fyne/v2/widget" "work_cation/assets" "work_cation/global" - "work_cation/models/repo" + "work_cation/repo" ) func UserViews(w fyne.Window) fyne.CanvasObject {