package model import ( "errors" "one-api/common" ) // PurchasedServer 已购服务器表 type PurchasedServer struct { Id int `json:"id"` UserId int `json:"user_id" gorm:"index"` // 用户ID ServerId int `json:"server_id" gorm:"index"` // 服务器配置ID ServerTitle string `json:"server_title" gorm:"type:varchar(255)"` // 服务器标题(冗余字段,防止配置被删除) ServerConfig string `json:"server_config" gorm:"type:text"` // 服务器配置(冗余字段) Price float64 `json:"price"` // 购买价格 Duration int `json:"duration"` // 购买时长(天) PurchaseTime int64 `json:"purchase_time" gorm:"bigint;index"` // 购买时间 ExpireTime int64 `json:"expire_time" gorm:"bigint;index"` // 到期时间 Status int `json:"status" gorm:"default:1"` // 状态:1-正常,2-已过期 TradeNo string `json:"trade_no" gorm:"type:varchar(255);index"` // 交易单号 } func (ps *PurchasedServer) Insert() error { return DB.Create(ps).Error } func (ps *PurchasedServer) Update() error { return DB.Save(ps).Error } func GetPurchasedServerById(id int) (*PurchasedServer, error) { if id == 0 { return nil, errors.New("id 为空") } ps := PurchasedServer{Id: id} err := DB.First(&ps, "id = ?", id).Error return &ps, err } func GetPurchasedServerByTradeNo(tradeNo string) (*PurchasedServer, error) { var ps PurchasedServer err := DB.Where("trade_no = ?", tradeNo).First(&ps).Error if err != nil { return nil, err } return &ps, nil } func GetAllPurchasedServers(pageInfo *common.PageInfo) (servers []*PurchasedServer, total int64, err error) { tx := DB.Begin() if tx.Error != nil { return nil, 0, tx.Error } defer func() { if r := recover(); r != nil { tx.Rollback() } }() err = tx.Model(&PurchasedServer{}).Count(&total).Error if err != nil { tx.Rollback() return nil, 0, err } err = tx.Order("id desc").Limit(pageInfo.GetPageSize()).Offset(pageInfo.GetStartIdx()).Find(&servers).Error if err != nil { tx.Rollback() return nil, 0, err } if err = tx.Commit().Error; err != nil { return nil, 0, err } return servers, total, nil } func GetUserPurchasedServers(userId int, pageInfo *common.PageInfo) (servers []*PurchasedServer, total int64, err error) { tx := DB.Begin() if tx.Error != nil { return nil, 0, tx.Error } defer func() { if r := recover(); r != nil { tx.Rollback() } }() err = tx.Model(&PurchasedServer{}).Where("user_id = ?", userId).Count(&total).Error if err != nil { tx.Rollback() return nil, 0, err } err = tx.Where("user_id = ?", userId).Order("id desc").Limit(pageInfo.GetPageSize()).Offset(pageInfo.GetStartIdx()).Find(&servers).Error if err != nil { tx.Rollback() return nil, 0, err } if err = tx.Commit().Error; err != nil { return nil, 0, err } return servers, total, nil } func SearchPurchasedServers(keyword string, startIdx int, num int) (servers []*PurchasedServer, total int64, err error) { tx := DB.Begin() if tx.Error != nil { return nil, 0, tx.Error } defer func() { if r := recover(); r != nil { tx.Rollback() } }() query := tx.Model(&PurchasedServer{}) if keyword != "" { // 支持按用户ID、服务器标题搜索 query = query.Where("server_title LIKE ? OR user_id = ?", "%"+keyword+"%", keyword) } err = query.Count(&total).Error if err != nil { tx.Rollback() return nil, 0, err } err = query.Order("id desc").Limit(num).Offset(startIdx).Find(&servers).Error if err != nil { tx.Rollback() return nil, 0, err } if err = tx.Commit().Error; err != nil { return nil, 0, err } return servers, total, nil } func DeletePurchasedServerById(id int) error { if id == 0 { return errors.New("id 为空") } return DB.Delete(&PurchasedServer{}, "id = ?", id).Error } // UpdateExpiredServers 更新过期服务器状态 func UpdateExpiredServers() error { now := common.GetTimestamp() return DB.Model(&PurchasedServer{}). Where("expire_time < ? AND status = ?", now, 1). Update("status", 2).Error }