代码拉取完成,页面将自动刷新
package tool
import (
"gitee.com/liujinsuo/tool/s2m"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
type configTable struct {
ID uint `gorm:"primarykey"`
Type string `gorm:"column:type;uniqueIndex:idx_type_field;type:varchar(127);not null;default:'';comment:类型"`
Notes string `gorm:"column:notes;type:varchar(255);not null;default:'';comment:备注"`
Field string `gorm:"column:field;uniqueIndex:idx_type_field;type:varchar(128);not null;default:'';comment:字段名"` //字段名
Value string `gorm:"column:value;type:varchar(8192);not null;default:'';comment:值"` //值
}
type ConfigToMysqlTargetStruct interface {
Default() any
}
// MysqlSaveConfig 将程序得配置信息存储到mysql
type MysqlSaveConfig struct {
Type string //类型
TableNotes string //表注释
TableName string //表明
DB *gorm.DB
TargetStruct ConfigToMysqlTargetStruct
}
type MysqlSaveConfigWith2 interface {
Add(defaultVal any) error
Get(rt any) error
GetType() string
Set(filedName string, defaultVal any) error
}
type MysqlSaveConfigWith1 interface {
CreateTable() error
}
type MysqlSaveConfigNew interface {
With2(Type string, TargetStruct ConfigToMysqlTargetStruct) MysqlSaveConfigWith2
WithTableNotes(TableNotes string) MysqlSaveConfigWith1
}
func NewMysqlSaveConfig(TableName string, DB *gorm.DB) MysqlSaveConfigNew {
return &MysqlSaveConfig{
TableName: TableName,
DB: DB,
}
}
func (s *MysqlSaveConfig) With2(Type string, TargetStruct ConfigToMysqlTargetStruct) MysqlSaveConfigWith2 {
s.Type = Type
s.TargetStruct = TargetStruct
return s
}
func (s *MysqlSaveConfig) WithTableNotes(TableNotes string) MysqlSaveConfigWith1 {
s.TableNotes = TableNotes
return s
}
func (s *MysqlSaveConfig) GetType() string {
return s.Type
}
// Add 将结构体 configToMysql 写入mysql
func (s *MysqlSaveConfig) Add(defaultVal any) error {
//默认值转map
m := map[string]string{}
if err := s2m.StructToMap(defaultVal, m); err != nil {
return err
}
//获取备注信息
comments, err := GetStructTagName(defaultVal, "comment")
if err != nil {
return err
}
//拼接数据
addList := make([]configTable, 0)
for k, v := range m {
Notes, _ := comments[k]
addList = append(addList, configTable{
Type: s.Type,
Notes: Notes,
Field: k,
Value: v,
})
}
//添加到mysql
if err := s.DB.Table(s.TableName).Clauses(clause.OnConflict{
DoNothing: true, //冲突时什么也不做
}).Create(&addList).Error; err != nil {
return err
}
return nil
}
// Get 获取数据 赋值到结构体rt
func (s *MysqlSaveConfig) Get(rt any) error {
//获取所有数据
list := make([]configTable, 0)
if err := s.DB.Table(s.TableName).Where("type=?", s.Type).Find(&list).Error; err != nil {
return err
}
//转为map
m := map[string]string{}
for i := 0; i < len(list); i++ {
m[list[i].Field] = list[i].Value
}
//获取备注信息
comments, err := GetStructTagName(rt, "comment")
if err != nil {
return err
}
//检查是否缺少字段
for k, _ := range comments {
if _, ok := m[k]; ok == false { //缺少字段 添加默认值
if err := s.Add(s.TargetStruct.Default()); err != nil {
return err
} else {
return s.Get(rt) //递归调用
}
}
}
//map转结构体
if err := s2m.MapToStruct(m, rt); err != nil {
return err
}
return nil
}
// Set 强制更新指定的字段
func (s *MysqlSaveConfig) Set(filedName string, defaultVal any) error {
//默认值转map
m := map[string]string{}
if err := s2m.StructToMap(defaultVal, m); err != nil {
return err
}
//获取备注信息
comments, err := GetStructTagName(defaultVal, "comment")
if err != nil {
return err
}
//拼接数据
addList := make([]configTable, 0)
for k, v := range m {
if k == filedName {
Notes, _ := comments[k]
addList = append(addList, configTable{
Type: s.Type,
Notes: Notes,
Field: k,
Value: v,
})
}
}
//添加到mysql
if err := s.DB.Table(s.TableName).Clauses(clause.OnConflict{
UpdateAll: true, //冲突更新所有
}).Create(&addList).Error; err != nil {
return err
}
return nil
}
// CreateTable 创建表
func (s *MysqlSaveConfig) CreateTable() error {
mysqlDb := *s.DB
//自动迁移只会添加缺少的字段,不会删除/更改当前数据
if err := mysqlDb.Set("gorm:table_options", "ENGINE=InnoDB COMMENT='"+s.TableNotes+"'").
Table(s.TableName).
AutoMigrate(&configTable{}); err != nil {
return err
}
return nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。