Files
nl-video-api/internal/service/vip_level.go
2025-08-03 00:11:15 +08:00

599 lines
15 KiB
Go
Raw Permalink 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 service
import (
"strconv"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gtime"
"nl-video-api/internal/dao"
"nl-video-api/internal/model/entity"
"nl-video-api/utility/response"
)
// VipLevelService VIP等级服务
type VipLevelService struct{}
var VipLevel = &VipLevelService{}
// GetList 获取VIP等级列表
func (s *VipLevelService) GetList(r *ghttp.Request) {
// 获取请求参数
pageStr := r.Get("page", "1").String()
pageSizeStr := r.Get("page_size", "10").String()
page, err := strconv.Atoi(pageStr)
if err != nil || page < 1 {
page = 1
}
pageSize, err := strconv.Atoi(pageSizeStr)
if err != nil || pageSize < 1 {
pageSize = 10
}
// 获取总数
total, err := dao.VipLevel.Ctx(r.Context()).Count()
if err != nil {
response.Error(r, response.CodeInternalError, "获取VIP等级总数失败")
return
}
// 获取VIP等级列表
var vipLevels []*entity.VipLevel
err = dao.VipLevel.Ctx(r.Context()).
Page(page, pageSize).
OrderAsc("level").
Scan(&vipLevels)
if err != nil {
response.Error(r, response.CodeInternalError, "获取VIP等级列表失败")
return
}
// 构建返回数据
var vipLevelItems []g.Map
for _, vipLevel := range vipLevels {
vipLevelItems = append(vipLevelItems, g.Map{
"id": vipLevel.Id,
"name": vipLevel.Name,
"level": vipLevel.Level,
"price": vipLevel.Price,
"duration": vipLevel.Duration,
"description": vipLevel.Description,
"privileges": vipLevel.Privileges,
"status": vipLevel.Status,
"created_at": vipLevel.CreatedAt.Unix(),
"updated_at": vipLevel.UpdatedAt.Unix(),
})
}
response.Success(r, g.Map{
"list": vipLevelItems,
"total": total,
"page": page,
"page_size": pageSize,
})
}
// GetDetail 获取VIP等级详情
func (s *VipLevelService) GetDetail(r *ghttp.Request) {
// 获取请求参数
idStr := r.Get("id").String()
if idStr == "" {
response.Error(r, response.CodeInvalidParam, "VIP等级ID不能为空")
return
}
id, err := strconv.Atoi(idStr)
if err != nil {
response.Error(r, response.CodeInvalidParam, "VIP等级ID格式错误")
return
}
// 获取VIP等级详情
var vipLevel entity.VipLevel
err = dao.VipLevel.Ctx(r.Context()).Where("id", id).Scan(&vipLevel)
if err != nil {
response.Error(r, response.CodeInternalError, "获取VIP等级详情失败")
return
}
if vipLevel.Id == 0 {
response.Error(r, response.CodeNotFound, "VIP等级不存在")
return
}
response.Success(r, g.Map{
"id": vipLevel.Id,
"name": vipLevel.Name,
"level": vipLevel.Level,
"price": vipLevel.Price,
"duration": vipLevel.Duration,
"description": vipLevel.Description,
"privileges": vipLevel.Privileges,
"status": vipLevel.Status,
"created_at": vipLevel.CreatedAt.Unix(),
"updated_at": vipLevel.UpdatedAt.Unix(),
})
}
// AdminGetList 管理员获取VIP等级列表
func (s *VipLevelService) AdminGetList(r *ghttp.Request) {
// 获取请求参数
keyword := r.Get("keyword").String()
statusStr := r.Get("status").String()
pageStr := r.Get("page", "1").String()
pageSizeStr := r.Get("page_size", "10").String()
page, err := strconv.Atoi(pageStr)
if err != nil || page < 1 {
page = 1
}
pageSize, err := strconv.Atoi(pageSizeStr)
if err != nil || pageSize < 1 {
pageSize = 10
}
// 构建查询条件
query := dao.VipLevel.Ctx(r.Context())
if keyword != "" {
query = query.Where("name LIKE ?", "%"+keyword+"%")
}
if statusStr != "" {
status, err := strconv.Atoi(statusStr)
if err == nil {
query = query.Where("status", status)
}
}
// 获取总数
total, err := query.Count()
if err != nil {
response.Error(r, response.CodeInternalError, "获取VIP等级总数失败")
return
}
// 获取VIP等级列表
var vipLevels []*entity.VipLevel
err = query.Page(page, pageSize).OrderAsc("level").Scan(&vipLevels)
if err != nil {
response.Error(r, response.CodeInternalError, "获取VIP等级列表失败")
return
}
// 构建返回数据
var vipLevelItems []g.Map
for _, vipLevel := range vipLevels {
vipLevelItems = append(vipLevelItems, g.Map{
"id": vipLevel.Id,
"name": vipLevel.Name,
"level": vipLevel.Level,
"price": vipLevel.Price,
"duration": vipLevel.Duration,
"description": vipLevel.Description,
"privileges": vipLevel.Privileges,
"status": vipLevel.Status,
"created_at": vipLevel.CreatedAt.Unix(),
"updated_at": vipLevel.UpdatedAt.Unix(),
})
}
response.Success(r, g.Map{
"list": vipLevelItems,
"total": total,
"page": page,
"page_size": pageSize,
})
}
// AdminCreate 管理员创建VIP等级
func (s *VipLevelService) AdminCreate(r *ghttp.Request) {
// 获取请求参数
name := r.Get("name").String()
levelStr := r.Get("level").String()
priceStr := r.Get("price").String()
durationStr := r.Get("duration").String()
description := r.Get("description").String()
privileges := r.Get("privileges").String()
statusStr := r.Get("status", "1").String()
if name == "" {
response.Error(r, response.CodeInvalidParam, "VIP等级名称不能为空")
return
}
level, err := strconv.Atoi(levelStr)
if err != nil {
response.Error(r, response.CodeInvalidParam, "VIP等级格式错误")
return
}
price, err := strconv.ParseFloat(priceStr, 64)
if err != nil {
response.Error(r, response.CodeInvalidParam, "价格格式错误")
return
}
duration, err := strconv.Atoi(durationStr)
if err != nil {
response.Error(r, response.CodeInvalidParam, "有效期格式错误")
return
}
status, err := strconv.Atoi(statusStr)
if err != nil {
status = 1
}
// 检查等级是否已存在
count, err := dao.VipLevel.Ctx(r.Context()).Where("level", level).Count()
if err != nil {
response.Error(r, response.CodeInternalError, "系统错误")
return
}
if count > 0 {
response.Error(r, response.CodeInvalidParam, "该等级已存在")
return
}
// 创建VIP等级
_, err = dao.VipLevel.Ctx(r.Context()).Data(g.Map{
"name": name,
"level": level,
"price": price,
"duration": duration,
"description": description,
"privileges": privileges,
"status": status,
"created_at": gtime.Now(),
"updated_at": gtime.Now(),
}).Insert()
if err != nil {
response.Error(r, response.CodeInternalError, "创建VIP等级失败")
return
}
response.Success(r, "创建成功")
}
// AdminUpdate 管理员更新VIP等级
func (s *VipLevelService) AdminUpdate(r *ghttp.Request) {
// 获取请求参数
idStr := r.Get("id").String()
name := r.Get("name").String()
levelStr := r.Get("level").String()
priceStr := r.Get("price").String()
durationStr := r.Get("duration").String()
description := r.Get("description").String()
privileges := r.Get("privileges").String()
statusStr := r.Get("status").String()
if idStr == "" {
response.Error(r, response.CodeInvalidParam, "VIP等级ID不能为空")
return
}
id, err := strconv.Atoi(idStr)
if err != nil {
response.Error(r, response.CodeInvalidParam, "VIP等级ID格式错误")
return
}
// 检查VIP等级是否存在
var existVipLevel entity.VipLevel
err = dao.VipLevel.Ctx(r.Context()).Where("id", id).Scan(&existVipLevel)
if err != nil {
response.Error(r, response.CodeInternalError, "系统错误")
return
}
if existVipLevel.Id == 0 {
response.Error(r, response.CodeNotFound, "VIP等级不存在")
return
}
// 构建更新数据
updateData := g.Map{
"updated_at": gtime.Now(),
}
if name != "" {
updateData["name"] = name
}
if levelStr != "" {
level, err := strconv.Atoi(levelStr)
if err != nil {
response.Error(r, response.CodeInvalidParam, "VIP等级格式错误")
return
}
// 检查等级是否已被其他记录使用
count, err := dao.VipLevel.Ctx(r.Context()).Where("level", level).Where("id !=", id).Count()
if err != nil {
response.Error(r, response.CodeInternalError, "系统错误")
return
}
if count > 0 {
response.Error(r, response.CodeInvalidParam, "该等级已存在")
return
}
updateData["level"] = level
}
if priceStr != "" {
price, err := strconv.ParseFloat(priceStr, 64)
if err != nil {
response.Error(r, response.CodeInvalidParam, "价格格式错误")
return
}
updateData["price"] = price
}
if durationStr != "" {
duration, err := strconv.Atoi(durationStr)
if err != nil {
response.Error(r, response.CodeInvalidParam, "有效期格式错误")
return
}
updateData["duration"] = duration
}
if description != "" {
updateData["description"] = description
}
if privileges != "" {
updateData["privileges"] = privileges
}
if statusStr != "" {
status, err := strconv.Atoi(statusStr)
if err != nil {
response.Error(r, response.CodeInvalidParam, "状态格式错误")
return
}
updateData["status"] = status
}
// 更新VIP等级
_, err = dao.VipLevel.Ctx(r.Context()).Where("id", id).Data(updateData).Update()
if err != nil {
response.Error(r, response.CodeInternalError, "更新VIP等级失败")
return
}
response.Success(r, "更新成功")
}
// AdminDelete 管理员删除VIP等级
func (s *VipLevelService) AdminDelete(r *ghttp.Request) {
// 获取请求参数
idStr := r.Get("id").String()
if idStr == "" {
response.Error(r, response.CodeInvalidParam, "VIP等级ID不能为空")
return
}
id, err := strconv.Atoi(idStr)
if err != nil {
response.Error(r, response.CodeInvalidParam, "VIP等级ID格式错误")
return
}
// 检查VIP等级是否存在
count, err := dao.VipLevel.Ctx(r.Context()).Where("id", id).Count()
if err != nil {
response.Error(r, response.CodeInternalError, "系统错误")
return
}
if count == 0 {
response.Error(r, response.CodeNotFound, "VIP等级不存在")
return
}
// 检查是否有用户正在使用该VIP等级
userCount, err := g.DB().Model("nl_user").Where("vip_level", id).Count()
if err != nil {
response.Error(r, response.CodeInternalError, "系统错误")
return
}
if userCount > 0 {
response.Error(r, response.CodeInvalidParam, "该VIP等级正在被用户使用无法删除")
return
}
// 删除VIP等级
_, err = dao.VipLevel.Ctx(r.Context()).Where("id", id).Delete()
if err != nil {
response.Error(r, response.CodeInternalError, "删除VIP等级失败")
return
}
response.Success(r, "删除成功")
}
// AdminBatchDelete 管理员批量删除VIP等级
func (s *VipLevelService) AdminBatchDelete(r *ghttp.Request) {
// 获取请求参数
var ids []int
err := r.Parse(&ids)
if err != nil {
response.Error(r, response.CodeInvalidParam, "参数格式错误")
return
}
if len(ids) == 0 {
response.Error(r, response.CodeInvalidParam, "请选择要删除的VIP等级")
return
}
// 检查是否有用户正在使用这些VIP等级
userCount, err := g.DB().Model("nl_user").WhereIn("vip_level", ids).Count()
if err != nil {
response.Error(r, response.CodeInternalError, "系统错误")
return
}
if userCount > 0 {
response.Error(r, response.CodeInvalidParam, "选中的VIP等级中有正在被用户使用的无法删除")
return
}
// 批量删除
_, err = dao.VipLevel.Ctx(r.Context()).WhereIn("id", ids).Delete()
if err != nil {
response.Error(r, response.CodeInternalError, "批量删除失败")
return
}
response.Success(r, "删除成功")
}
// AdminUpdateStatus 管理员更新VIP等级状态
func (s *VipLevelService) AdminUpdateStatus(r *ghttp.Request) {
// 获取请求参数
idStr := r.Get("id").String()
statusStr := r.Get("status").String()
if idStr == "" {
response.Error(r, response.CodeInvalidParam, "VIP等级ID不能为空")
return
}
if statusStr == "" {
response.Error(r, response.CodeInvalidParam, "状态不能为空")
return
}
id, err := strconv.Atoi(idStr)
if err != nil {
response.Error(r, response.CodeInvalidParam, "VIP等级ID格式错误")
return
}
status, err := strconv.Atoi(statusStr)
if err != nil {
response.Error(r, response.CodeInvalidParam, "状态格式错误")
return
}
// 检查VIP等级是否存在
count, err := dao.VipLevel.Ctx(r.Context()).Where("id", id).Count()
if err != nil {
response.Error(r, response.CodeInternalError, "系统错误")
return
}
if count == 0 {
response.Error(r, response.CodeNotFound, "VIP等级不存在")
return
}
// 更新状态
_, err = dao.VipLevel.Ctx(r.Context()).Where("id", id).Data(g.Map{
"status": status,
"updated_at": gtime.Now(),
}).Update()
if err != nil {
response.Error(r, response.CodeInternalError, "更新状态失败")
return
}
response.Success(r, "更新成功")
}
// GetActiveList 获取启用的VIP等级列表
func (s *VipLevelService) GetActiveList(r *ghttp.Request) {
// 获取启用的VIP等级列表
var vipLevels []*entity.VipLevel
err := dao.VipLevel.Ctx(r.Context()).
Where("status", 1).
OrderAsc("level").
Scan(&vipLevels)
if err != nil {
response.Error(r, response.CodeInternalError, "获取VIP等级列表失败")
return
}
// 构建返回数据
var vipLevelItems []g.Map
for _, vipLevel := range vipLevels {
vipLevelItems = append(vipLevelItems, g.Map{
"id": vipLevel.Id,
"name": vipLevel.Name,
"level": vipLevel.Level,
"price": vipLevel.Price,
"duration": vipLevel.Duration,
"description": vipLevel.Description,
"privileges": vipLevel.Privileges,
})
}
response.Success(r, vipLevelItems)
}
// GetUserVipInfo 获取用户VIP信息
func (s *VipLevelService) GetUserVipInfo(r *ghttp.Request) {
// 从上下文获取用户ID
userIdValue := r.Context().Value("user_id")
if userIdValue == nil {
response.Error(r, response.CodeUnauthorized, "请先登录")
return
}
userId := userIdValue.(uint)
// 获取用户信息
var user entity.NlUser
err := g.DB().Model("nl_user").Where("id", userId).Scan(&user)
if err != nil {
response.Error(r, response.CodeInternalError, "获取用户信息失败")
return
}
if user.Id == 0 {
response.Error(r, response.CodeNotFound, "用户不存在")
return
}
// 获取VIP等级信息
var vipLevel entity.VipLevel
if user.VipLevel > 0 {
dao.VipLevel.Ctx(r.Context()).Where("id", user.VipLevel).Scan(&vipLevel)
}
response.Success(r, g.Map{
"user_id": user.Id,
"vip_level_id": user.VipLevel,
"vip_level_name": vipLevel.Name,
"vip_expire_at": user.VipExpireTime,
"is_vip": user.VipLevel > 0 && user.VipExpireTime > int(gtime.Now().Unix()),
})
}
// GetAll 获取所有VIP等级
func (s *VipLevelService) GetAll(r *ghttp.Request) {
// 获取所有VIP等级列表
var vipLevels []*entity.VipLevel
err := dao.VipLevel.Ctx(r.Context()).
OrderAsc("level").
Scan(&vipLevels)
if err != nil {
response.Error(r, response.CodeInternalError, "获取VIP等级列表失败")
return
}
// 构建返回数据
var vipLevelItems []g.Map
for _, vipLevel := range vipLevels {
vipLevelItems = append(vipLevelItems, g.Map{
"id": vipLevel.Id,
"name": vipLevel.Name,
"level": vipLevel.Level,
"price": vipLevel.Price,
"duration": vipLevel.Duration,
"description": vipLevel.Description,
"privileges": vipLevel.Privileges,
"status": vipLevel.Status,
"created_at": vipLevel.CreatedAt.Unix(),
"updated_at": vipLevel.UpdatedAt.Unix(),
})
}
response.Success(r, vipLevelItems)
}