竹简文档

模型基类

GORM 实体基类与软删除实现

模型基类

Bamboo Base 提供 GORM 实体基类,包含常用的字段和钩子方法。

BaseEntity - 基础实体

BaseEntity 是所有实体的基础结构体,包含通用字段:

type BaseEntity struct {
    // 主键 ID(雪花算法生成)
    ID snowflake.SnowflakeID `json:"id" gorm:"primaryKey"`

    // 创建时间
    CreatedAt time.Time `json:"createdAt" gorm:"autoCreateTime"`

    // 更新时间
    UpdatedAt time.Time `json:"updatedAt" gorm:"autoUpdateTime"`
}

使用示例

type User struct {
    BaseEntity              // 嵌入基础实体
    Username   string       `json:"username" gorm:"uniqueIndex;size:50"`
    Email      string       `json:"email" gorm:"size:100"`
    Password   string       `json:"-" gorm:"size:255"`
}

// 自动迁移
db.AutoMigrate(&User{})

BaseEntitySoftDelete - 软删除实体

BaseEntitySoftDelete 在基础实体上增加了软删除功能:

type BaseEntitySoftDelete struct {
    BaseEntity

    // 删除时间(非空表示已删除)
    DeletedAt gorm.DeletedAt `json:"deletedAt,omitempty" gorm:"index"`
}

使用示例

type Article struct {
    BaseEntitySoftDelete     // 嵌入软删除实体
    Title                string `json:"title"`
    Content              string `json:"content"`
    AuthorID             int64  `json:"authorId"`
}

// 自动迁移
db.AutoMigrate(&Article{})

软删除操作

// 软删除(设置 DeletedAt)
db.Delete(&article)

// 查询(自动排除已删除记录)
db.Find(&articles)

// 查询包含已删除记录
db.Unscoped().Find(&articles)

// 永久删除
db.Unscoped().Delete(&article)

GORM 钩子方法

BeforeCreate - 创建前钩子

自动设置 ID 和时间戳:

func (e *BaseEntity) BeforeCreate(tx *gorm.DB) error {
    if e.ID == 0 {
        e.ID = web.Register.SnowflakeNode.Generate()
    }
    return nil
}

BeforeUpdate - 更新前钩子

自动更新更新时间:

func (e *BaseEntity) BeforeUpdate(tx *gorm.DB) error {
    e.UpdatedAt = time.Now()
    return nil
}

GeneProvider 接口

实现 GeneProvider 接口可以让实体指定自己的业务基因:

type GeneProvider interface {
    Gene() int64
}

实现示例

const GeneUser = 1

type User struct {
    BaseEntity
    Username string `json:"username"`
}

// 实现 GeneProvider 接口
func (User) Gene() int64 {
    return GeneUser
}

// 自定义 BeforeCreate 使用业务基因
func (u *User) BeforeCreate(tx *gorm.DB) error {
    if u.ID == 0 {
        u.ID = web.Register.SnowflakeNode.GenerateWithGene(u.Gene())
    }
    return nil
}

完整模型示例

用户模型

type User struct {
    BaseEntitySoftDelete
    Username string `json:"username" gorm:"uniqueIndex;size:50;not null"`
    Email    string `json:"email" gorm:"size:100;not null"`
    Password string `json:"-" gorm:"size:255;not null"`
    Avatar   string `json:"avatar" gorm:"size:255"`
    Status   int    `json:"status" gorm:"default:1"`
}

func (User) TableName() string {
    return "users"
}

func (User) Gene() int64 {
    return 1
}

订单模型

type Order struct {
    BaseEntitySoftDelete
    OrderNo     string  `json:"orderNo" gorm:"uniqueIndex;size:32"`
    UserID      int64   `json:"userId" gorm:"index"`
    TotalAmount float64 `json:"totalAmount" gorm:"type:decimal(10,2)"`
    Status      int     `json:"status" gorm:"default:0"`
}

func (Order) TableName() string {
    return "orders"
}

func (Order) Gene() int64 {
    return 2
}

数据库迁移

func MigrateDB(db *gorm.DB) error {
    return db.AutoMigrate(
        &User{},
        &Order{},
        &Article{},
    )
}

下一步

On this page