帮我写代码中文注释,并把写好注释的代码给我 package model import ( "database/sql/driver" "errors" "fmt" "math" "demo1/service/field/internal/pg" "encoding/json" "gorm.io/gorm" "gorm.io/gorm/schema" ) type Field struct { gorm.Model Uid uint gorm:"column:uid" json:"uid" Data JSONB gorm:"column:data" json:"data" } type JSONB json.RawMessage func (JSONB) GormDataType() string { return "jsonb" } func (JSONB) GormDBDataType(db *gorm.DB, field *schema.Field) string { switch db.Dialector.Name() { case "mysql": return "JSON" case "postgres": return "JSONB" } return "" } func (j JSONB) Value() (driver.Value, error) { if len(j) == 0 { return nil, nil } return string(j), nil } func (j *JSONB) Scan(value interface{}) error { if value == nil { *j = JSONB("null") return nil } var bytes []byte switch v := value.(type) { case []byte: if len(v) > 0 { bytes = make([]byte, len(v)) copy(bytes, v) } case string: bytes = []byte(v) default: return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value)) } result := json.RawMessage(bytes) *j = JSONB(result) return nil } func AddField(f *Field) error { if len(f.Data) == 0 { return errors.New("data is nil") } if err := checkUid(f.Uid); err != nil { return err } return pg.Client.Create(&f).Error } func Fields() ([]*Field, error) { fs := make([]*Field, 0) err := pg.Client.Find(&fs).Error return fs, err } func FieldsUid(uid uint) ([]*Field, error) { if err := checkUid(uid); err != nil { return nil, err } fs := make([]*Field, 0) err := pg.Client.Find(&fs, "uid = ?", uid).Error return fs, err } func FieldsLabel(label string) ([]*Field, error) { if err := checkLabel(label); err != nil { return nil, err } fs := make([]*Field, 0) err := pg.Client.Raw("select * from fields where data -> '__config__' ->> 'label' = ?; ", label).Scan(&fs).Error if err != nil { return nil, err } return fs, nil } func UpdateField(f *Field) error { if err := checkUid(f.Uid); err != nil { return err } newF := new(Field) if err := pg.Client.First(newF, "uid = ?", f.Uid).Error; err != nil { return errors.New("uid Data dont exist") } newF.Data = f.Data return pg.Client.Save(newF).Error } func DeleteField(f *Field) error { if err := checkUid(f.Uid); err != nil { return err } return pg.Client.Delete(f, "uid = ?", f.Uid).Error } func checkUid(uid uint) error { if uid < 0 || uid > math.MaxUint32 { return errors.New("uid dont conform to the rules") } return nil } func checkLabel(la string) error { if la == "" { return errors.New("label cant be nil") } return nil }
时间: 2024-04-18 09:32:15 浏览: 141
以下是代码中文注释的版本:
package model
import (
"database/sql/driver"
"encoding/json"
"errors"
"fmt"
"math"
"gorm.io/gorm"
"gorm.io/gorm/schema"
"demo1/service/field/internal/pg"
)
type Field struct {
gorm.Model
Uid uint `gorm:"column:uid" json:"uid"` // 字段UID
Data JSONB `gorm:"column:data" json:"data"` // 字段数据
}
type JSONB json.RawMessage
// GormDataType 返回字段类型的 GORM 数据类型
func (JSONB) GormDataType() string {
return "jsonb"
}
// GormDBDataType 返回字段类型的 GORM 数据库数据类型
func (JSONB) GormDBDataType(db *gorm.DB, field *schema.Field) string {
switch db.Dialector.Name() {
case "mysql":
return "JSON"
case "postgres":
return "JSONB"
}
return ""
}
// Value 将 JSONB 类型转换为 driver.Value
func (j JSONB) Value() (driver.Value, error) {
if len(j) == 0 {
return nil, nil
}
return string(j), nil
}
// Scan 将 value 转换为 JSONB 类型
func (j *JSONB) Scan(value interface{}) error {
if value == nil {
*j = JSONB("null")
return nil
}
var bytes []byte
switch v := value.(type) {
case []byte:
if len(v) > 0 {
bytes = make([]byte, len(v))
copy(bytes, v)
}
case string:
bytes = []byte(v)
default:
return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value))
}
result := json.RawMessage(bytes)
*j = JSONB(result)
return nil
}
// AddField 添加字段
func AddField(f *Field) error {
if len(f.Data) == 0 {
return errors.New("数据为空")
}
if err := checkUid(f.Uid); err != nil {
return err
}
return pg.Client.Create(&f).Error
}
// Fields 获取所有字段
func Fields() ([]*Field, error) {
fs := make([]*Field, 0)
err := pg.Client.Find(&fs).Error
return fs, err
}
// FieldsUid 根据 UID 获取字段
func FieldsUid(uid uint) ([]*Field, error) {
if err := checkUid(uid); err != nil {
return nil, err
}
fs := make([]*Field, 0)
err := pg.Client.Find(&fs, "uid = ?", uid).Error
return fs, err
}
// FieldsLabel 根据标签获取字段
func FieldsLabel(label string) ([]*Field, error) {
if err := checkLabel(label); err != nil {
return nil, err
}
fs := make([]*Field, 0)
err := pg.Client.Raw("select * from fields where data -> '__config__' ->> 'label' = ?; ", label).Scan(&fs).Error
if err != nil {
return nil, err
}
return fs, nil
}
// UpdateField 更新字段
func UpdateField(f *Field) error {
if err := checkUid(f.Uid); err != nil {
return err
}
newF := new(Field)
if err := pg.Client.First(newF, "uid = ?", f.Uid).Error; err != nil {
return errors.New("UID 对应的数据不存在")
}
newF.Data = f.Data
return pg.Client.Save(newF).Error
}
// DeleteField 删除字段
func DeleteField(f *Field) error {
if err := checkUid(f.Uid); err != nil {
return err
}
return pg.Client.Delete(f, "uid = ?", f.Uid).Error
}
// checkUid 检查 UID 是否符合规则
func checkUid(uid uint) error {
if uid < 0 || uid > math.MaxUint32 {
return errors.New("UID 不符合规则")
}
return nil
}
// checkLabel 检查标签是否为空
func checkLabel(la string) error {
if la == "" {
return errors.New("标签不能为空")
}
return nil
}
希望这可以帮助到你!
相关推荐
















