55 lines
1.7 KiB
Go
55 lines
1.7 KiB
Go
|
|
package handler
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"net/http"
|
|||
|
|
"time"
|
|||
|
|
|
|||
|
|
"soul-api/internal/database"
|
|||
|
|
"soul-api/internal/model"
|
|||
|
|
|
|||
|
|
"github.com/gin-gonic/gin"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// DBVipMembersList GET /api/db/vip-members 管理端 - VIP 成员列表(用于超级个体排序)
|
|||
|
|
// 与小程序端 VipMembers 的列表逻辑保持一致:仅列出仍在有效期内的 VIP 用户。
|
|||
|
|
func DBVipMembersList(c *gin.Context) {
|
|||
|
|
limit := 200
|
|||
|
|
if l := c.Query("limit"); l != "" {
|
|||
|
|
if n, err := parseInt(l); err == nil && n > 0 && n <= 500 {
|
|||
|
|
limit = n
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
db := database.DB()
|
|||
|
|
|
|||
|
|
// 与 VipMembers 一致:优先 users 表(is_vip=1 且 vip_expire_date>NOW),排序使用 vip_sort
|
|||
|
|
var users []model.User
|
|||
|
|
err := db.Table("users").
|
|||
|
|
Select("id", "nickname", "avatar", "vip_name", "vip_role", "vip_project", "vip_avatar", "vip_bio", "vip_activated_at", "vip_sort", "vip_expire_date", "is_vip", "phone", "wechat_id").
|
|||
|
|
Where("is_vip = 1 AND vip_expire_date > ?", time.Now()).
|
|||
|
|
Order("COALESCE(vip_sort, 999999) ASC, COALESCE(vip_activated_at, vip_expire_date) DESC").
|
|||
|
|
Limit(limit).
|
|||
|
|
Find(&users).Error
|
|||
|
|
|
|||
|
|
if err != nil || len(users) == 0 {
|
|||
|
|
// 兜底:从 orders 查,逻辑与 VipMembers 保持一致
|
|||
|
|
var userIDs []string
|
|||
|
|
db.Model(&model.Order{}).Select("DISTINCT user_id").
|
|||
|
|
Where("(status = ? OR status = ?) AND (product_type = ? OR product_type = ?)", "paid", "completed", "fullbook", "vip").
|
|||
|
|
Pluck("user_id", &userIDs)
|
|||
|
|
if len(userIDs) == 0 {
|
|||
|
|
c.JSON(http.StatusOK, gin.H{"success": true, "data": []interface{}{}, "total": 0})
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
db.Where("id IN ?", userIDs).Find(&users)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
list := make([]gin.H, 0, len(users))
|
|||
|
|
for i := range users {
|
|||
|
|
list = append(list, formatVipMember(&users[i], true))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
c.JSON(http.StatusOK, gin.H{"success": true, "data": list, "total": len(list)})
|
|||
|
|
}
|
|||
|
|
|