73 lines
3.9 KiB
Go
73 lines
3.9 KiB
Go
package model
|
||
|
||
import (
|
||
"time"
|
||
|
||
"gorm.io/datatypes"
|
||
)
|
||
|
||
// User 用户模型
|
||
type User struct {
|
||
ID int64 `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
|
||
Username string `gorm:"column:username;type:varchar(255);not null;uniqueIndex" json:"username"`
|
||
Password string `gorm:"column:password;type:varchar(255);not null" json:"-"` // 密码不返回给前端
|
||
Email string `gorm:"column:email;type:varchar(255);not null;uniqueIndex" json:"email"`
|
||
Avatar string `gorm:"column:avatar;type:varchar(255);not null;default:''" json:"avatar"`
|
||
Points int `gorm:"column:points;type:integer;not null;default:0" json:"points"`
|
||
Role string `gorm:"column:role;type:varchar(50);not null;default:'user'" json:"role"`
|
||
Status int16 `gorm:"column:status;type:smallint;not null;default:1" json:"status"` // 1:正常, 0:禁用, -1:删除
|
||
Properties *datatypes.JSON `gorm:"column:properties;type:jsonb" json:"properties,omitempty"` // JSON数据,存储为PostgreSQL的JSONB类型
|
||
LastLoginAt *time.Time `gorm:"column:last_login_at;type:timestamp" json:"last_login_at,omitempty"`
|
||
CreatedAt time.Time `gorm:"column:created_at;type:timestamp;not null;default:CURRENT_TIMESTAMP" json:"created_at"`
|
||
UpdatedAt time.Time `gorm:"column:updated_at;type:timestamp;not null;default:CURRENT_TIMESTAMP" json:"updated_at"`
|
||
}
|
||
|
||
// TableName 指定表名
|
||
func (User) TableName() string {
|
||
return "user"
|
||
}
|
||
|
||
// UserPointLog 用户积分变更记录
|
||
type UserPointLog struct {
|
||
ID int64 `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
|
||
UserID int64 `gorm:"column:user_id;not null;index" json:"user_id"`
|
||
ChangeType string `gorm:"column:change_type;type:varchar(50);not null" json:"change_type"` // EARN, SPEND, ADMIN_ADJUST
|
||
Amount int `gorm:"column:amount;type:integer;not null" json:"amount"`
|
||
BalanceBefore int `gorm:"column:balance_before;type:integer;not null" json:"balance_before"`
|
||
BalanceAfter int `gorm:"column:balance_after;type:integer;not null" json:"balance_after"`
|
||
Reason string `gorm:"column:reason;type:varchar(255);not null" json:"reason"`
|
||
ReferenceType string `gorm:"column:reference_type;type:varchar(50)" json:"reference_type,omitempty"`
|
||
ReferenceID *int64 `gorm:"column:reference_id;type:bigint" json:"reference_id,omitempty"`
|
||
OperatorID *int64 `gorm:"column:operator_id;type:bigint" json:"operator_id,omitempty"`
|
||
CreatedAt time.Time `gorm:"column:created_at;type:timestamp;not null;default:CURRENT_TIMESTAMP;index:idx_point_logs_created_at,sort:desc" json:"created_at"`
|
||
|
||
// 关联
|
||
User *User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||
Operator *User `gorm:"foreignKey:OperatorID" json:"operator,omitempty"`
|
||
}
|
||
|
||
// TableName 指定表名
|
||
func (UserPointLog) TableName() string {
|
||
return "user_point_logs"
|
||
}
|
||
|
||
// UserLoginLog 用户登录日志
|
||
type UserLoginLog struct {
|
||
ID int64 `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
|
||
UserID int64 `gorm:"column:user_id;not null;index" json:"user_id"`
|
||
IPAddress string `gorm:"column:ip_address;type:inet;not null;index" json:"ip_address"`
|
||
UserAgent string `gorm:"column:user_agent;type:text" json:"user_agent,omitempty"`
|
||
LoginMethod string `gorm:"column:login_method;type:varchar(50);not null;default:'PASSWORD'" json:"login_method"`
|
||
IsSuccess bool `gorm:"column:is_success;not null;index" json:"is_success"`
|
||
FailureReason string `gorm:"column:failure_reason;type:varchar(255)" json:"failure_reason,omitempty"`
|
||
CreatedAt time.Time `gorm:"column:created_at;type:timestamp;not null;default:CURRENT_TIMESTAMP;index:idx_login_logs_created_at,sort:desc" json:"created_at"`
|
||
|
||
// 关联
|
||
User *User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
||
}
|
||
|
||
// TableName 指定表名
|
||
func (UserLoginLog) TableName() string {
|
||
return "user_login_logs"
|
||
}
|