表单数据持久化

This commit is contained in:
2024-09-13 18:19:27 +08:00
parent 951572a1f5
commit 250ffb4e20
9 changed files with 186 additions and 86 deletions
+1
View File
@@ -4,3 +4,4 @@
/work_cation.iml /work_cation.iml
/work_cation_0.1.2.zip /work_cation_0.1.2.zip
/data.db /data.db
/data/
+10 -2
View File
@@ -3,17 +3,25 @@ package cfg
import ( import (
"fmt" "fmt"
"gopkg.in/ini.v1" "gopkg.in/ini.v1"
"os"
) )
type Config struct { type Config struct {
DbPath string `ini:"dbPath"` DbPath string `ini:"dbPath"`
CardDir string `ini:"cardDir"`
CardInfo string `ini:"cardInfo"`
} }
var T = Config{ var T = Config{
DbPath: "./data.db", DbPath: "./data/data.db",
CardDir: "./data",
CardInfo: "info.json",
} }
func init() { func init() {
defer func() {
_ = os.Mkdir(T.CardDir, os.ModeDir)
}()
cfg, err := ini.Load("conf.ini") cfg, err := ini.Load("conf.ini")
if err != nil { if err != nil {
fmt.Println("读取配置错误1", err) fmt.Println("读取配置错误1", err)
+1 -1
View File
@@ -4,8 +4,8 @@ import (
"gorm.io/gorm" "gorm.io/gorm"
"work_cation/cfg" "work_cation/cfg"
"work_cation/models" "work_cation/models"
"work_cation/models/repo"
"work_cation/pkg/gormx" "work_cation/pkg/gormx"
"work_cation/repo"
) )
var DB *gorm.DB var DB *gorm.DB
+51
View File
@@ -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
}
+113 -77
View File
@@ -1,97 +1,84 @@
package views package views
import ( import (
"errors"
"fmt" "fmt"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/data/binding"
"fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"regexp" "regexp"
"work_cation/global" "strings"
"work_cation/models" "work_cation/models"
"work_cation/models/repo"
"work_cation/pkg/utils" "work_cation/pkg/utils"
"work_cation/service"
) )
var erlangCard *models.ErlangCards
func CreateErlangCard(w fyne.Window) fyne.CanvasObject { func CreateErlangCard(w fyne.Window) fyne.CanvasObject {
if erlangCard == nil {
// user := repo.UserRepo.GetUserInfo(global.DB) erlangCard = &models.ErlangCards{
var erlangCard = models.ErlangCards{ UUID: utils.CreateUUID(),
UUID: utils.CreateUUID(), UserIp: utils.Get192Ip(),
UserIp: utils.Get192Ip(), }
} }
var (
// 基础表单
formBase = &widget.Form{}
// 变量表单
formVars = &widget.Form{}
)
var items = []*widget.FormItem{ formBase.AppendItem(&widget.FormItem{Text: "名称", Widget: newDefaultEntry(&erlangCard.Title)})
{Text: "名称", Widget: widget.NewEntry()}, formBase.AppendItem(&widget.FormItem{Text: "描述", Widget: newDefaultEntry(&erlangCard.Text)})
{Text: "描述", Widget: widget.NewEntry()}, formBase.AppendItem(&widget.FormItem{Text: "封面", Widget: newDefaultEntry(&erlangCard.Covers), HintText: "暂未支持可不填"})
{Text: "封面", Widget: widget.NewEntry(), HintText: "暂未支持可不填"}, formBase.AppendItem(&widget.FormItem{Text: "是否默认展示", Widget: newDefaultEntry(&erlangCard.IsShowOut)})
{Text: "是否默认展示", Widget: widget.NewEntry()}, formBase.AppendItem(&widget.FormItem{Text: "模版内容", Widget: newDefaultEntryCallback(&erlangCard.Template, func() { generateVariableForm1(erlangCard, formVars) })})
{Text: "模版内容", Widget: widget.NewEntry()},
// 刷新变量表单
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)
} }
erlCard.VarName = newVarList
var items2 []*widget.FormItem form2.Refresh()
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,
)))
} }
func countVarOccurrences(input string) int { func countVarOccurrences(input string) int {
@@ -99,3 +86,52 @@ func countVarOccurrences(input string) int {
matches := re.FindAllStringIndex(input, -1) matches := re.FindAllStringIndex(input, -1)
return len(matches) 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
}
+9 -5
View File
@@ -1,7 +1,6 @@
package views package views
import ( import (
"fmt"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/data/binding" "fyne.io/fyne/v2/data/binding"
@@ -11,8 +10,8 @@ import (
"strings" "strings"
"work_cation/global" "work_cation/global"
"work_cation/models" "work_cation/models"
"work_cation/models/repo"
"work_cation/pkg/utils" "work_cation/pkg/utils"
"work_cation/repo"
) )
func myCardsViews(w fyne.Window) fyne.CanvasObject { 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...))) 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 { if data == nil {
data = &models.ErlangCards{ data = &models.ErlangCards{
UUID: utils.CreateUUID(), UUID: utils.CreateUUID(),
@@ -37,8 +36,13 @@ func ErlangCardView(_ fyne.Window, data *models.ErlangCards) fyne.CanvasObject {
} }
} }
if len(data.VarName) == 0 { if len(data.VarName) == 0 {
return widget.NewCard(data.Title, data.Text, widget.NewButton(data.Template, func() { return widget.NewCard(data.Title, data.Text, widget.NewButton("复制", func() {
fmt.Print("复制:", data.UUID) err := clipboard.WriteAll(data.Template)
if err != nil {
dialog.ShowError(err, w)
return
}
dialog.NewInformation("复制脚本成功", data.Template, w).Show()
})) }))
} }
txtBound := binding.NewString() txtBound := binding.NewString()
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"work_cation/assets" "work_cation/assets"
"work_cation/global" "work_cation/global"
"work_cation/models/repo" "work_cation/repo"
) )
func UserViews(w fyne.Window) fyne.CanvasObject { func UserViews(w fyne.Window) fyne.CanvasObject {