表单数据持久化
This commit is contained in:
@@ -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/
|
||||||
|
|||||||
+9
-1
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
+103
-67
@@ -1,101 +1,137 @@
|
|||||||
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"
|
||||||
)
|
)
|
||||||
|
|
||||||
func CreateErlangCard(w fyne.Window) fyne.CanvasObject {
|
var erlangCard *models.ErlangCards
|
||||||
|
|
||||||
// user := repo.UserRepo.GetUserInfo(global.DB)
|
func CreateErlangCard(w fyne.Window) fyne.CanvasObject {
|
||||||
var erlangCard = models.ErlangCards{
|
if erlangCard == nil {
|
||||||
|
erlangCard = &models.ErlangCards{
|
||||||
UUID: utils.CreateUUID(),
|
UUID: utils.CreateUUID(),
|
||||||
UserIp: utils.Get192Ip(),
|
UserIp: utils.Get192Ip(),
|
||||||
}
|
}
|
||||||
|
|
||||||
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()},
|
|
||||||
}
|
}
|
||||||
|
var (
|
||||||
|
// 基础表单
|
||||||
|
formBase = &widget.Form{}
|
||||||
|
// 变量表单
|
||||||
|
formVars = &widget.Form{}
|
||||||
|
)
|
||||||
|
|
||||||
var items2 []*widget.FormItem
|
formBase.AppendItem(&widget.FormItem{Text: "名称", Widget: newDefaultEntry(&erlangCard.Title)})
|
||||||
form2 := &widget.Form{
|
formBase.AppendItem(&widget.FormItem{Text: "描述", Widget: newDefaultEntry(&erlangCard.Text)})
|
||||||
Items: items2,
|
formBase.AppendItem(&widget.FormItem{Text: "封面", Widget: newDefaultEntry(&erlangCard.Covers), HintText: "暂未支持可不填"})
|
||||||
SubmitText: "保存创建",
|
formBase.AppendItem(&widget.FormItem{Text: "是否默认展示", Widget: newDefaultEntry(&erlangCard.IsShowOut)})
|
||||||
OnSubmit: func() {
|
formBase.AppendItem(&widget.FormItem{Text: "模版内容", Widget: newDefaultEntryCallback(&erlangCard.Template, func() { generateVariableForm1(erlangCard, formVars) })})
|
||||||
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:
|
|
||||||
|
|
||||||
}
|
// 刷新变量表单
|
||||||
}
|
generateVariableForm1(erlangCard, formVars)
|
||||||
|
|
||||||
if countVarOccurrences(erlangCard.Template) != len(items2) {
|
// 保存按钮
|
||||||
dialog.ShowError(errors.New("变量名数量异常"), w)
|
buttonSave := widget.NewButton("保存", func() {
|
||||||
return
|
err := service.ErlangCard.Create(erlangCard)
|
||||||
}
|
|
||||||
|
|
||||||
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 {
|
if err != nil {
|
||||||
dialog.ShowError(err, w)
|
dialog.ShowError(err, w)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
},
|
dialog.ShowInformation("ok", "创建成功", w)
|
||||||
}
|
// 更换
|
||||||
|
erlangCard.UUID = utils.CreateUUID()
|
||||||
|
})
|
||||||
|
|
||||||
form := &widget.Form{
|
return container.NewBorder(container.NewHBox(widget.NewLabel("新建"), widget.NewSeparator()),
|
||||||
Items: items,
|
nil, nil, nil, container.NewScroll(
|
||||||
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(
|
container.NewVBox(
|
||||||
form,
|
formBase,
|
||||||
form2,
|
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
|
||||||
|
form2.Refresh()
|
||||||
|
}
|
||||||
|
|
||||||
func countVarOccurrences(input string) int {
|
func countVarOccurrences(input string) int {
|
||||||
re := regexp.MustCompile(`\$var`)
|
re := regexp.MustCompile(`\$var`)
|
||||||
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
@@ -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
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user