package models import ( "encoding/json" "gorm.io/gorm" ) type ModuleConfig struct { BaseModel UserId uint `gorm:"index" json:"userId"` Name string `gorm:"type:varchar(255)" json:"name"` ValueJson string `gorm:"type:text" json:"-"` Value map[string]interface{} `gorm:"-" json:"value"` } func (m *ModuleConfig) GetConfigByUserIdAndName(db *gorm.DB, userId uint, name string) (map[string]interface{}, error) { cfg := ModuleConfig{} if err := db.First(&cfg, "user_id=? AND name=?", userId, name).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, nil } else { return nil, err } } // 处理字段 if err := json.Unmarshal([]byte(cfg.ValueJson), &cfg.Value); err != nil { cfg.Value = nil } return cfg.Value, nil } func (m *ModuleConfig) Save(db *gorm.DB) error { // 处理字段 if jb, err := json.Marshal(m.Value); err != nil { m.ValueJson = "{}" } else { m.ValueJson = string(jb) } // 保存操作 if err := db.First(&ModuleConfig{}, "user_id=? AND name=?", m.UserId, m.Name).Error; err != nil { if err == gorm.ErrRecordNotFound { // 新增 if err := db.Create(&m).Error; err != nil { return err } } else { return err } } else { // 修改 if err := db.Select("Name", "UserId", "ValueJson").Where("user_id=? AND name=?", m.UserId, m.Name).Updates(&m).Error; err != nil { return err } } return nil }