2021-01-08 15:37:32 +08:00
|
|
|
|
package model
|
2020-09-01 10:34:11 +08:00
|
|
|
|
|
|
|
|
|
|
import (
|
2024-04-06 18:19:17 +08:00
|
|
|
|
"database/sql/driver"
|
|
|
|
|
|
"encoding/json"
|
2020-09-01 10:34:11 +08:00
|
|
|
|
"time"
|
2024-10-16 17:24:50 +08:00
|
|
|
|
|
|
|
|
|
|
"github.com/may-fly/cast"
|
2020-09-01 10:34:11 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
2024-01-05 22:16:38 +08:00
|
|
|
|
type IdGenType int
|
|
|
|
|
|
|
2023-07-20 22:41:13 +08:00
|
|
|
|
const (
|
2023-12-05 23:03:51 +08:00
|
|
|
|
IdColumn = "id"
|
|
|
|
|
|
DeletedColumn = "is_deleted" // 删除字段
|
|
|
|
|
|
DeleteTimeColumn = "delete_time"
|
2024-04-29 12:29:56 +08:00
|
|
|
|
ModifierColumn = "modifier"
|
|
|
|
|
|
ModifierIdColumn = "modifier_id"
|
|
|
|
|
|
UpdateTimeColumn = "update_time"
|
2023-12-05 23:03:51 +08:00
|
|
|
|
|
|
|
|
|
|
ModelDeleted int8 = 1
|
|
|
|
|
|
ModelUndeleted int8 = 0
|
2024-01-05 22:16:38 +08:00
|
|
|
|
|
|
|
|
|
|
IdGenTypeNone IdGenType = 0 // 数据库处理
|
|
|
|
|
|
IdGenTypeTimestamp IdGenType = 1 // 当前时间戳
|
2023-07-20 22:41:13 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
2023-11-07 21:05:21 +08:00
|
|
|
|
// 实体接口
|
|
|
|
|
|
type ModelI interface {
|
2024-04-09 12:55:51 +08:00
|
|
|
|
// SetId 设置id
|
|
|
|
|
|
SetId(id uint64)
|
2023-11-07 21:05:21 +08:00
|
|
|
|
|
2024-04-09 12:55:51 +08:00
|
|
|
|
// IsCreate 是否为新建该实体模型, 默认 id == 0 为新建
|
2024-01-07 21:46:25 +08:00
|
|
|
|
IsCreate() bool
|
2024-01-05 22:16:38 +08:00
|
|
|
|
|
2024-04-09 12:55:51 +08:00
|
|
|
|
// FillBaseInfo 使用当前登录账号信息赋值实体结构体的基础信息
|
2023-11-07 21:05:21 +08:00
|
|
|
|
//
|
2024-01-09 17:31:21 +08:00
|
|
|
|
// 如创建时间,修改时间,创建者,修改者信息等
|
|
|
|
|
|
FillBaseInfo(idGenType IdGenType, account *LoginAccount)
|
2024-10-16 17:24:50 +08:00
|
|
|
|
|
|
|
|
|
|
// LogicDelete 是否为逻辑删除
|
|
|
|
|
|
LogicDelete() bool
|
2024-01-05 22:16:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type IdModel struct {
|
|
|
|
|
|
Id uint64 `json:"id"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-04-09 12:55:51 +08:00
|
|
|
|
func (m *IdModel) SetId(id uint64) {
|
|
|
|
|
|
m.Id = id
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-07 21:46:25 +08:00
|
|
|
|
func (m *IdModel) IsCreate() bool {
|
|
|
|
|
|
return m.Id == 0
|
|
|
|
|
|
}
|
2024-01-05 22:16:38 +08:00
|
|
|
|
|
2024-01-09 17:31:21 +08:00
|
|
|
|
func (m *IdModel) FillBaseInfo(idGenType IdGenType, account *LoginAccount) {
|
2024-01-05 22:16:38 +08:00
|
|
|
|
// 存在id,则赋值
|
2024-01-07 21:46:25 +08:00
|
|
|
|
if !m.IsCreate() {
|
2024-01-05 22:16:38 +08:00
|
|
|
|
return
|
|
|
|
|
|
}
|
2024-04-09 12:55:51 +08:00
|
|
|
|
m.SetId(GetIdByGenType(idGenType))
|
2023-11-07 21:05:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-16 17:24:50 +08:00
|
|
|
|
func (m *IdModel) LogicDelete() bool {
|
|
|
|
|
|
return false
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-07-20 22:41:13 +08:00
|
|
|
|
// 含有删除字段模型
|
|
|
|
|
|
type DeletedModel struct {
|
2024-01-05 22:16:38 +08:00
|
|
|
|
IdModel
|
2023-07-22 00:48:41 +08:00
|
|
|
|
IsDeleted int8 `json:"-" gorm:"column:is_deleted;default:0"`
|
2023-07-20 22:41:13 +08:00
|
|
|
|
DeleteTime *time.Time `json:"-"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-09 17:31:21 +08:00
|
|
|
|
func (m *DeletedModel) FillBaseInfo(idGenType IdGenType, account *LoginAccount) {
|
2024-01-05 22:16:38 +08:00
|
|
|
|
if m.Id == 0 {
|
2024-01-09 17:31:21 +08:00
|
|
|
|
m.IdModel.FillBaseInfo(idGenType, account)
|
2023-11-07 21:05:21 +08:00
|
|
|
|
m.IsDeleted = ModelUndeleted
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-16 17:24:50 +08:00
|
|
|
|
func (m *DeletedModel) LogicDelete() bool {
|
|
|
|
|
|
return true
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// CreateModelNLD 含有创建等信息,但不包含逻辑删除信息
|
|
|
|
|
|
type CreateModelNLD struct {
|
|
|
|
|
|
IdModel
|
|
|
|
|
|
CreateTime *time.Time `json:"createTime"`
|
|
|
|
|
|
CreatorId uint64 `json:"creatorId"`
|
|
|
|
|
|
Creator string `json:"creator"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (m *CreateModelNLD) FillBaseInfo(idGenType IdGenType, account *LoginAccount) {
|
|
|
|
|
|
if !m.IsCreate() {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m.IdModel.FillBaseInfo(idGenType, account)
|
|
|
|
|
|
nowTime := time.Now()
|
|
|
|
|
|
m.CreateTime = &nowTime
|
|
|
|
|
|
if account != nil {
|
|
|
|
|
|
m.CreatorId = account.Id
|
|
|
|
|
|
m.Creator = account.Username
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-05 22:16:38 +08:00
|
|
|
|
// 含有删除、创建字段模型
|
|
|
|
|
|
type CreateModel struct {
|
|
|
|
|
|
DeletedModel
|
|
|
|
|
|
CreateTime *time.Time `json:"createTime"`
|
|
|
|
|
|
CreatorId uint64 `json:"creatorId"`
|
|
|
|
|
|
Creator string `json:"creator"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-09 21:37:56 +08:00
|
|
|
|
func (m *CreateModel) FillBaseInfo(idGenType IdGenType, account *LoginAccount) {
|
2024-01-07 21:46:25 +08:00
|
|
|
|
if !m.IsCreate() {
|
2024-01-05 22:16:38 +08:00
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-09 17:31:21 +08:00
|
|
|
|
m.DeletedModel.FillBaseInfo(idGenType, account)
|
2024-01-05 22:16:38 +08:00
|
|
|
|
nowTime := time.Now()
|
|
|
|
|
|
m.CreateTime = &nowTime
|
|
|
|
|
|
if account != nil {
|
|
|
|
|
|
m.CreatorId = account.Id
|
|
|
|
|
|
m.Creator = account.Username
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-16 17:24:50 +08:00
|
|
|
|
// 基础实体模型,数据表最基础字段,不包含逻辑删除
|
|
|
|
|
|
type ModelNLD struct {
|
|
|
|
|
|
CreateModelNLD
|
|
|
|
|
|
|
|
|
|
|
|
UpdateTime *time.Time `json:"updateTime"`
|
|
|
|
|
|
ModifierId uint64 `json:"modifierId"`
|
|
|
|
|
|
Modifier string `json:"modifier"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 设置基础信息. 如创建时间,修改时间,创建者,修改者信息
|
|
|
|
|
|
func (m *ModelNLD) FillBaseInfo(idGenType IdGenType, account *LoginAccount) {
|
|
|
|
|
|
nowTime := time.Now()
|
|
|
|
|
|
isCreate := m.IsCreate()
|
|
|
|
|
|
if isCreate {
|
|
|
|
|
|
m.CreateTime = &nowTime
|
|
|
|
|
|
m.IdModel.FillBaseInfo(idGenType, account)
|
|
|
|
|
|
}
|
|
|
|
|
|
m.UpdateTime = &nowTime
|
|
|
|
|
|
|
|
|
|
|
|
if account == nil {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
id := account.Id
|
|
|
|
|
|
name := account.Username
|
|
|
|
|
|
if isCreate {
|
|
|
|
|
|
m.CreatorId = id
|
|
|
|
|
|
m.Creator = name
|
|
|
|
|
|
}
|
|
|
|
|
|
m.Modifier = name
|
|
|
|
|
|
m.ModifierId = id
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-05 22:16:38 +08:00
|
|
|
|
// 基础实体模型,数据表最基础字段,尽量每张表都包含这些字段
|
2023-07-20 22:41:13 +08:00
|
|
|
|
type Model struct {
|
2024-04-28 23:45:57 +08:00
|
|
|
|
CreateModel
|
2023-07-20 22:41:13 +08:00
|
|
|
|
|
2021-04-16 15:10:07 +08:00
|
|
|
|
UpdateTime *time.Time `json:"updateTime"`
|
|
|
|
|
|
ModifierId uint64 `json:"modifierId"`
|
|
|
|
|
|
Modifier string `json:"modifier"`
|
2021-01-08 15:37:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 设置基础信息. 如创建时间,修改时间,创建者,修改者信息
|
2024-01-09 21:37:56 +08:00
|
|
|
|
func (m *Model) FillBaseInfo(idGenType IdGenType, account *LoginAccount) {
|
2021-01-08 15:37:32 +08:00
|
|
|
|
nowTime := time.Now()
|
2024-01-07 21:46:25 +08:00
|
|
|
|
isCreate := m.IsCreate()
|
2021-01-08 15:37:32 +08:00
|
|
|
|
if isCreate {
|
2023-07-20 22:41:13 +08:00
|
|
|
|
m.IsDeleted = ModelUndeleted
|
2021-01-08 15:37:32 +08:00
|
|
|
|
m.CreateTime = &nowTime
|
2024-01-09 17:31:21 +08:00
|
|
|
|
m.IdModel.FillBaseInfo(idGenType, account)
|
2021-01-08 15:37:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
m.UpdateTime = &nowTime
|
|
|
|
|
|
|
|
|
|
|
|
if account == nil {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
id := account.Id
|
|
|
|
|
|
name := account.Username
|
|
|
|
|
|
if isCreate {
|
|
|
|
|
|
m.CreatorId = id
|
|
|
|
|
|
m.Creator = name
|
|
|
|
|
|
}
|
|
|
|
|
|
m.Modifier = name
|
|
|
|
|
|
m.ModifierId = id
|
2020-09-01 10:34:11 +08:00
|
|
|
|
}
|
2024-01-05 22:16:38 +08:00
|
|
|
|
|
|
|
|
|
|
// 根据id生成类型,生成id
|
|
|
|
|
|
func GetIdByGenType(genType IdGenType) uint64 {
|
|
|
|
|
|
if genType == IdGenTypeTimestamp {
|
|
|
|
|
|
return uint64(time.Now().Unix())
|
|
|
|
|
|
}
|
|
|
|
|
|
return 0
|
|
|
|
|
|
}
|
2024-04-06 18:19:17 +08:00
|
|
|
|
|
|
|
|
|
|
type Map[K comparable, V any] map[K]V
|
|
|
|
|
|
|
|
|
|
|
|
func (m *Map[K, V]) Scan(value any) error {
|
|
|
|
|
|
return json.Unmarshal(value.([]byte), m)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (m Map[K, V]) Value() (driver.Value, error) {
|
|
|
|
|
|
return json.Marshal(m)
|
|
|
|
|
|
}
|
2024-04-27 01:35:21 +08:00
|
|
|
|
|
|
|
|
|
|
type Slice[T int | string | Map[string, any]] []T
|
|
|
|
|
|
|
|
|
|
|
|
func (s *Slice[T]) Scan(value any) error {
|
|
|
|
|
|
return json.Unmarshal(value.([]byte), s)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (s Slice[T]) Value() (driver.Value, error) {
|
|
|
|
|
|
return json.Marshal(s)
|
|
|
|
|
|
}
|
2024-10-16 17:24:50 +08:00
|
|
|
|
|
|
|
|
|
|
// 带有额外其他信息字段的结构体
|
|
|
|
|
|
type ExtraData struct {
|
|
|
|
|
|
Extra Map[string, any] `json:"extra"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// SetExtraValue 设置额外信息字段值
|
|
|
|
|
|
func (m *ExtraData) SetExtraValue(key string, val any) {
|
|
|
|
|
|
if m.Extra != nil {
|
|
|
|
|
|
m.Extra[key] = val
|
|
|
|
|
|
} else {
|
|
|
|
|
|
m.Extra = Map[string, any]{key: val}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetExtraString 获取额外信息中的string类型字段值
|
|
|
|
|
|
func (e ExtraData) GetExtraString(key string) string {
|
|
|
|
|
|
if e.Extra == nil {
|
|
|
|
|
|
return ""
|
|
|
|
|
|
}
|
|
|
|
|
|
return cast.ToString(e.Extra[key])
|
|
|
|
|
|
}
|