topfans/backend/pkg/models/user.go
2026-05-14 15:59:07 +08:00

211 lines
7.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package models
import (
"database/sql/driver"
"encoding/json"
"errors"
"time"
"gorm.io/gorm"
)
// User 用户表模型
type User struct {
ID int64 `gorm:"primaryKey;autoIncrement;column:id"`
Mobile string `gorm:"type:varchar(11);uniqueIndex:uk_users_mobile;not null;column:mobile"`
PasswordHash string `gorm:"type:varchar(255);not null;column:password_hash"`
AccessToken *string `gorm:"type:text;column:access_token"`
TokenExpiresAt *int64 `gorm:"column:token_expires_at"`
AvatarURL *string `gorm:"type:varchar(500);column:avatar_url"`
GlobalWalletAddr *string `gorm:"type:varchar(100);column:global_wallet_address"`
IsActive bool `gorm:"default:true;not null;column:is_active"`
CreatedAt int64 `gorm:"not null;column:created_at"`
UpdatedAt int64 `gorm:"not null;column:updated_at"`
DeletedAt *int64 `gorm:"column:deleted_at"` // 软删除
// 关联关系
FanProfiles []FanProfile `gorm:"foreignKey:UserID;references:ID"`
}
// TableName 指定表名
func (User) TableName() string {
return "users"
}
// BeforeCreate 创建前钩子
func (u *User) BeforeCreate(tx *gorm.DB) error {
now := time.Now().UnixMilli()
u.CreatedAt = now
u.UpdatedAt = now
return nil
}
// BeforeUpdate 更新前钩子
func (u *User) BeforeUpdate(tx *gorm.DB) error {
u.UpdatedAt = time.Now().UnixMilli()
return nil
}
// FanProfile 粉丝档案表模型
type FanProfile struct {
ID int64 `gorm:"primaryKey;autoIncrement;column:id"`
UserID int64 `gorm:"not null;uniqueIndex:uk_fan_profiles_user_star;column:user_id"`
StarID int64 `gorm:"not null;uniqueIndex:uk_fan_profiles_user_star;uniqueIndex:uk_fan_profiles_star_nickname;column:star_id"`
Nickname string `gorm:"type:varchar(50);not null;uniqueIndex:uk_fan_profiles_star_nickname;column:nickname"`
Level int32 `gorm:"default:1;not null;column:level"`
Times int32 `gorm:"default:1;not null;column:times"` // 剩余铸造次数
Social int32 `gorm:"default:0;not null;column:social"` // 好友个数
CoinBalance int64 `gorm:"default:0;not null;column:coin_balance"`
CrystalBalance int64 `gorm:"default:0;not null;column:crystal_balance"`
Tags StringArray `gorm:"type:jsonb;column:tags"`
AvatarURL *string `gorm:"type:varchar(500);column:avatar_url"`
// 新增字段
StarbookLimit int32 `gorm:"default:3;not null;column:starbook_limit"`
SlotLimit int32 `gorm:"default:3;not null;column:slot_limit"`
AssetsCount int32 `gorm:"default:0;not null;column:assets_count"`
LikeBetCount int32 `gorm:"default:0;not null;column:like_bet_count"` // 点赞押注次数
ChainAddress *string `gorm:"type:varchar(100);column:chain_address"`
IsActive bool `gorm:"default:true;not null;column:is_active"`
CreatedAt int64 `gorm:"not null;column:created_at"`
UpdatedAt int64 `gorm:"not null;column:updated_at"`
// 关联关系
User User `gorm:"foreignKey:UserID;references:ID"`
Star Star `gorm:"foreignKey:StarID;references:StarID"`
}
// TableName 指定表名
func (FanProfile) TableName() string {
return "fan_profiles"
}
// BeforeCreate 创建前钩子
func (fp *FanProfile) BeforeCreate(tx *gorm.DB) error {
now := time.Now().UnixMilli()
fp.CreatedAt = now
fp.UpdatedAt = now
// 设置默认值
if fp.StarbookLimit == 0 {
fp.StarbookLimit = 3
}
if fp.SlotLimit == 0 {
fp.SlotLimit = 3
}
return nil
}
// BeforeUpdate 更新前钩子
func (fp *FanProfile) BeforeUpdate(tx *gorm.DB) error {
fp.UpdatedAt = time.Now().UnixMilli()
return nil
}
// Star 明星信息表模型
type Star struct {
StarID int64 `gorm:"primaryKey;autoIncrement;column:star_id"`
Name string `gorm:"type:varchar(100);not null;column:name"`
Tag *string `gorm:"type:varchar(100);column:tag"` // 新增:昵称标签
NameEn *string `gorm:"type:varchar(100);column:name_en"`
PicURL *string `gorm:"type:varchar(500);column:pic_url"`
Description *string `gorm:"type:text;column:description"`
IdentityID string `gorm:"type:varchar(50);uniqueIndex:uk_stars_identity_id;not null;column:identity_id"`
IsActive bool `gorm:"default:true;not null;column:is_active"`
CreatedAt int64 `gorm:"not null;column:created_at"`
UpdatedAt int64 `gorm:"not null;column:updated_at"`
}
// BeforeCreate 创建前钩子
func (s *Star) BeforeCreate(tx *gorm.DB) error {
now := time.Now().UnixMilli()
s.CreatedAt = now
s.UpdatedAt = now
return nil
}
// BeforeUpdate 更新前钩子
func (s *Star) BeforeUpdate(tx *gorm.DB) error {
s.UpdatedAt = time.Now().UnixMilli()
return nil
}
// TableName 指定表名
func (Star) TableName() string {
return "stars"
}
// GetDisplayName 获取显示名称优先使用tag
func (s *Star) GetDisplayName() string {
if s.Tag != nil && *s.Tag != "" {
return *s.Tag
}
return s.Name
}
// StringArray JSONB数组类型用于tags字段
type StringArray []string
// Value 实现 driver.Valuer 接口
func (sa StringArray) Value() (driver.Value, error) {
if sa == nil {
return nil, nil
}
return json.Marshal(sa)
}
// Scan 实现 sql.Scanner 接口
func (sa *StringArray) Scan(value interface{}) error {
if value == nil {
*sa = nil
return nil
}
bytes, ok := value.([]byte)
if !ok {
return errors.New("failed to unmarshal StringArray value")
}
return json.Unmarshal(bytes, sa)
}
// CrystalTransactionRecord 水晶交易流水表
type CrystalTransactionRecord struct {
ID int64 `gorm:"primaryKey;autoIncrement;column:id"`
UserID int64 `gorm:"not null;index:ix_crystal_tx_user_star;column:user_id"`
StarID int64 `gorm:"not null;index:ix_crystal_tx_user_star;column:star_id"`
ChangeType string `gorm:"type:varchar(30);not null;index:ix_crystal_tx_change_type;column:change_type"` // task_reward/mint_cost/mint_reward/exhibition_revenue/level_up_bonus/manual_adjust
Delta int64 `gorm:"not null;column:delta"` // 正数=收入,负数=消耗
BalanceBefore int64 `gorm:"not null;column:balance_before"` // 变化前余额快照
BalanceAfter int64 `gorm:"not null;column:balance_after"` // 变化后余额快照
SourceID string `gorm:"type:varchar(100);column:source_id"` // 关联业务ID
Description string `gorm:"type:varchar(255);column:description"` // 可读描述
CreatedAt int64 `gorm:"not null;index:ix_crystal_tx_created;column:created_at"`
}
// TableName 指定表名
func (CrystalTransactionRecord) TableName() string {
return "crystal_transaction_records"
}
// CoinTransactionRecord 游戏币交易流水表(预留)
type CoinTransactionRecord struct {
ID int64 `gorm:"primaryKey;autoIncrement;column:id"`
UserID int64 `gorm:"not null;index:ix_coin_tx_user_star;column:user_id"`
StarID int64 `gorm:"not null;index:ix_coin_tx_user_star;column:star_id"`
ChangeType string `gorm:"type:varchar(30);not null;column:change_type"`
Delta int64 `gorm:"not null;column:delta"`
BalanceBefore int64 `gorm:"not null;column:balance_before"`
BalanceAfter int64 `gorm:"not null;column:balance_after"`
SourceID string `gorm:"type:varchar(100);column:source_id"`
Description string `gorm:"type:varchar(255);column:description"`
CreatedAt int64 `gorm:"not null;index:ix_coin_tx_created;column:created_at"`
}
// TableName 指定表名
func (CoinTransactionRecord) TableName() string {
return "coin_transaction_records"
}