package models import ( "time" "gorm.io/gorm" ) // ========== 资产表模型 ========== // Asset 资产表模型 type Asset struct { ID int64 `gorm:"primaryKey;autoIncrement;column:id"` OwnerUID int64 `gorm:"not null;index:idx_assets_owner_star;column:owner_uid"` StarID int64 `gorm:"not null;index:idx_assets_owner_star;index:idx_assets_star_active;column:star_id"` Name string `gorm:"type:varchar(100);not null;column:name"` CoverURL string `gorm:"type:varchar(500);not null;column:cover_url"` MaterialURL *string `gorm:"type:varchar(500);column:material_url"` // 用户上传的素材URL(后续会定期清理) // 预留字段(后续功能扩展) Description *string `gorm:"type:text;column:description"` // 藏品描述(预留) Rarity *int32 `gorm:"column:rarity"` // 稀有度(预留) Tags StringArray `gorm:"type:jsonb;column:tags"` // 标签(预留,JSON数组) Visibility string `gorm:"type:varchar(20);default:'private';column:visibility"` // 可见性:private, friends, public(预留) // 状态字段 Status int32 `gorm:"not null;default:0;index:idx_assets_status;column:status"` // 0:Pending, 1:Active // 链上信息(目前模拟,后续引入区块链功能) TxHash *string `gorm:"type:varchar(100);index:idx_assets_tx_hash;column:tx_hash"` // Web3:交易哈希 BlockNumber *int64 `gorm:"column:block_number"` // 区块号 // 社交相关(与 Social Service 交互) LikeCount int32 `gorm:"not null;default:0;column:like_count"` // 点赞数 IsOriginal bool `gorm:"default:false;column:is_original"` // 是否自制藏品(用户自己上传素材) // 时间戳字段 CreatedAt int64 `gorm:"not null;index:idx_assets_created_at,sort:desc;column:created_at"` UpdatedAt int64 `gorm:"not null;column:updated_at"` MintedAt *int64 `gorm:"column:minted_at"` // 上链成功时间(毫秒时间戳) // 软删除 DeletedAt *int64 `gorm:"index:idx_assets_deleted_at;column:deleted_at"` // 软删除时间戳 IsActive bool `gorm:"default:true;not null;index:idx_assets_star_active;column:is_active"` // 关联关系 Owner User `gorm:"foreignKey:OwnerUID;references:ID;constraint:OnDelete:CASCADE"` Star Star `gorm:"foreignKey:StarID;references:StarID;constraint:OnDelete:CASCADE"` } // TableName 指定表名 func (Asset) TableName() string { return "assets" } // BeforeCreate 创建前钩子 func (a *Asset) BeforeCreate(tx *gorm.DB) error { now := time.Now().UnixMilli() a.CreatedAt = now a.UpdatedAt = now // 设置默认值 if a.Status == 0 { a.Status = AssetStatusPending } if a.Visibility == "" { a.Visibility = AssetVisibilityPrivate } if !a.IsActive { a.IsActive = true } return nil } // BeforeUpdate 更新前钩子 func (a *Asset) BeforeUpdate(tx *gorm.DB) error { a.UpdatedAt = time.Now().UnixMilli() return nil } // IsPending 检查资产是否为待处理状态 func (a *Asset) IsPending() bool { return a.Status == AssetStatusPending } // IsActiveStatus 检查资产是否已激活(状态为Active) func (a *Asset) IsActiveStatus() bool { return a.Status == AssetStatusActive } // 资产状态常量 const ( AssetStatusPending = 0 // 待处理(创建中) AssetStatusActive = 1 // 已激活(上链成功,目前模拟) // 预留:AssetStatusMinting = 2 // 上链中 // 预留:AssetStatusFailed = 3 // 上链失败 ) // 资产可见性常量 const ( AssetVisibilityPrivate = "private" // 私有(仅自己可见) AssetVisibilityFriends = "friends" // 好友可见(预留) AssetVisibilityPublic = "public" // 公开(预留) ) // ========== 铸造订单表模型 ========== // MintOrder 铸造订单表模型 type MintOrder struct { OrderID string `gorm:"primaryKey;type:varchar(100);column:order_id"` // 铸造订单号(UUID) UserID int64 `gorm:"not null;index:idx_mint_orders_user_star;column:user_id"` AssetID *int64 `gorm:"index:idx_mint_orders_asset;column:asset_id"` // 关联资产(生成后回填) StarID int64 `gorm:"not null;index:idx_mint_orders_user_star;column:star_id"` Status string `gorm:"type:varchar(20);not null;default:'PENDING';index:idx_mint_orders_status;column:status"` // PENDING/PROCESSING/SUCCESS/FAILED CostCrystal int64 `gorm:"default:0;column:cost_crystal"` // 消耗的水晶数量 ErrorMessage *string `gorm:"type:text;column:error_message"` // 错误信息(如果失败) RetryCount int32 `gorm:"default:0;column:retry_count"` // 重试次数 // 阶段一(预创建)保存的素材与元数据,用于“继续铸造/取消铸造”的流程 MaterialURL *string `gorm:"type:varchar(500);column:material_url"` // 用户上传的素材URL(阶段一写入) Name *string `gorm:"type:varchar(100);column:name"` // 藏品名称(阶段一写入,可选) Description *string `gorm:"type:text;column:description"` // 藏品描述(阶段一写入,可选) MaterialType *string `gorm:"type:varchar(50);column:material_type"` // 素材类型(可选) Event *string `gorm:"type:varchar(100);column:event"` // 藏品事件(可选) CreatedAt int64 `gorm:"not null;index:idx_mint_orders_created_at,sort:desc;column:created_at"` UpdatedAt int64 `gorm:"not null;column:updated_at"` MintedAt *int64 `gorm:"column:minted_at"` // 上链成功时间(用于 Task Service 事件) // 关联关系 User User `gorm:"foreignKey:UserID;references:ID;constraint:OnDelete:CASCADE"` Asset *Asset `gorm:"foreignKey:AssetID;references:ID;constraint:OnDelete:SET NULL"` Star Star `gorm:"foreignKey:StarID;references:StarID;constraint:OnDelete:CASCADE"` } // TableName 指定表名 func (MintOrder) TableName() string { return "mint_orders" } // BeforeCreate 创建前钩子 func (mo *MintOrder) BeforeCreate(tx *gorm.DB) error { now := time.Now().UnixMilli() mo.CreatedAt = now mo.UpdatedAt = now // 设置默认状态 if mo.Status == "" { mo.Status = MintOrderStatusPending } return nil } // BeforeUpdate 更新前钩子 func (mo *MintOrder) BeforeUpdate(tx *gorm.DB) error { mo.UpdatedAt = time.Now().UnixMilli() return nil } // IsPending 检查订单是否为待处理状态 func (mo *MintOrder) IsPending() bool { return mo.Status == MintOrderStatusPending } // IsProcessing 检查订单是否处理中 func (mo *MintOrder) IsProcessing() bool { return mo.Status == MintOrderStatusProcessing } // IsSuccess 检查订单是否成功 func (mo *MintOrder) IsSuccess() bool { return mo.Status == MintOrderStatusSuccess } // IsFailed 检查订单是否失败 func (mo *MintOrder) IsFailed() bool { return mo.Status == MintOrderStatusFailed } // 铸造订单状态常量 const ( MintOrderStatusPending = "PENDING" // 待处理 MintOrderStatusProcessing = "PROCESSING" // 处理中(上链中,目前模拟) MintOrderStatusSuccess = "SUCCESS" // 成功 MintOrderStatusFailed = "FAILED" // 失败 MintOrderStatusCancelled = "CANCELLED" // 已取消 ) // ========== 点赞记录表模型 ========== // AssetLike 点赞记录表模型 type AssetLike struct { ID int64 `gorm:"primaryKey;autoIncrement;column:id"` AssetID int64 `gorm:"not null;uniqueIndex:uk_asset_likes_user_asset;index:idx_asset_likes_asset;column:asset_id"` UserID int64 `gorm:"not null;uniqueIndex:uk_asset_likes_user_asset;index:idx_asset_likes_user_star;column:user_id"` StarID int64 `gorm:"not null;index:idx_asset_likes_user_star;column:star_id"` // 用于数据隔离和查询优化 CreatedAt int64 `gorm:"not null;index:idx_asset_likes_user_star,sort:desc;index:idx_asset_likes_asset,sort:desc;column:created_at"` // 关联关系 Asset Asset `gorm:"foreignKey:AssetID;references:ID;constraint:OnDelete:CASCADE"` User User `gorm:"foreignKey:UserID;references:ID;constraint:OnDelete:CASCADE"` Star Star `gorm:"foreignKey:StarID;references:StarID;constraint:OnDelete:CASCADE"` } // TableName 指定表名 func (AssetLike) TableName() string { return "asset_likes" } // BeforeCreate 创建前钩子 func (al *AssetLike) BeforeCreate(tx *gorm.DB) error { now := time.Now().UnixMilli() al.CreatedAt = now return nil }