bindbox-game/internal/api/admin/activities_admin.go
邹方成 642b3cf7dd
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 50s
build: 更新前端构建产物和资源文件
更新了前端构建产物包括JavaScript、CSS和HTML文件,主要涉及以下变更:

1. 新增了多个组件和工具函数,包括异常页面组件、iframe组件等
2. 更新了活动管理、产品管理、优惠券管理等业务模块
3. 优化了构建配置和依赖管理
4. 修复了一些样式和功能问题
5. 更新了测试相关文件

同时更新了部分后端服务接口和测试用例。这些变更主要是为了支持新功能和改进现有功能的用户体验。
2025-11-21 01:24:13 +08:00

274 lines
8.2 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 admin
import (
"net/http"
"strconv"
"time"
"bindbox-game/internal/code"
"bindbox-game/internal/pkg/core"
"bindbox-game/internal/pkg/validation"
activitysvc "bindbox-game/internal/service/activity"
)
type createActivityRequest struct {
Name string `json:"name" binding:"required"`
Banner string `json:"banner"`
ActivityCategoryID int64 `json:"activity_category_id" binding:"required"`
Status int32 `json:"status"`
PriceDraw int64 `json:"price_draw"`
IsBoss int32 `json:"is_boss"`
StartTime string `json:"start_time"`
EndTime string `json:"end_time"`
}
type createActivityResponse struct {
ID int64 `json:"id"`
Message string `json:"message"`
}
// CreateActivity 创建活动
// @Summary 创建活动
// @Description 创建活动配置基本信息与分类、Boss标签
// @Tags 管理端.活动
// @Accept json
// @Produce json
// @Param RequestBody body createActivityRequest true "请求参数"
// @Success 200 {object} simpleMessageResponse
// @Failure 400 {object} code.Failure
// @Router /api/admin/activities [post]
// @Security LoginVerifyToken
func (h *handler) CreateActivity() core.HandlerFunc {
return func(ctx core.Context) {
req := new(createActivityRequest)
res := new(createActivityResponse)
if err := ctx.ShouldBindJSON(req); err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, validation.Error(err)))
return
}
if req.ActivityCategoryID == 0 {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "活动分类ID不能为空"))
return
}
if ctx.SessionUserInfo().IsSuper != 1 {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.CreateActivityError, "禁止操作"))
return
}
var st, et *time.Time
if req.StartTime != "" {
if t, err := time.Parse(time.RFC3339, req.StartTime); err == nil {
st = &t
}
}
if req.EndTime != "" {
if t, err := time.Parse(time.RFC3339, req.EndTime); err == nil {
et = &t
}
}
item, err := h.activity.CreateActivity(ctx.RequestContext(), activitysvc.CreateActivityInput{
Name: req.Name,
Banner: req.Banner,
ActivityCategoryID: req.ActivityCategoryID,
Status: req.Status,
PriceDraw: req.PriceDraw,
IsBoss: req.IsBoss,
StartTime: st,
EndTime: et,
})
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.CreateActivityError, err.Error()))
return
}
res.ID = item.ID
res.Message = "操作成功"
ctx.Payload(res)
}
}
type modifyActivityRequest struct {
Name string `json:"name"`
Banner string `json:"banner"`
ActivityCategoryID int64 `json:"activity_category_id"`
Status int32 `json:"status"`
PriceDraw int64 `json:"price_draw"`
IsBoss int32 `json:"is_boss"`
StartTime string `json:"start_time"`
EndTime string `json:"end_time"`
}
// ModifyActivity 修改活动
// @Summary 修改活动
// @Description 修改活动基本信息、分类、Boss标签等
// @Tags 管理端.活动
// @Accept json
// @Produce json
// @Param activity_id path integer true "活动ID"
// @Param RequestBody body modifyActivityRequest true "请求参数"
// @Success 200 {object} simpleMessageResponse
// @Failure 400 {object} code.Failure
// @Router /api/admin/activities/{activity_id} [put]
// @Security LoginVerifyToken
func (h *handler) ModifyActivity() core.HandlerFunc {
return func(ctx core.Context) {
req := new(modifyActivityRequest)
res := new(simpleMessageResponse)
if err := ctx.ShouldBindJSON(req); err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, validation.Error(err)))
return
}
if ctx.SessionUserInfo().IsSuper != 1 {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ModifyActivityError, "禁止操作"))
return
}
id, err := strconv.ParseInt(ctx.Param("activity_id"), 10, 64)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "未传递活动ID"))
return
}
var st, et *time.Time
if req.StartTime != "" {
if t, err := time.Parse(time.RFC3339, req.StartTime); err == nil {
st = &t
}
}
if req.EndTime != "" {
if t, err := time.Parse(time.RFC3339, req.EndTime); err == nil {
et = &t
}
}
if err := h.activity.ModifyActivity(ctx.RequestContext(), id, activitysvc.ModifyActivityInput{
Name: req.Name,
Banner: req.Banner,
ActivityCategoryID: req.ActivityCategoryID,
Status: req.Status,
PriceDraw: req.PriceDraw,
IsBoss: req.IsBoss,
StartTime: st,
EndTime: et,
}); err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ModifyActivityError, err.Error()))
return
}
res.Message = "操作成功"
ctx.Payload(res)
}
}
// DeleteActivity 删除活动
// @Summary 删除活动
// @Description 删除指定活动
// @Tags 管理端.活动
// @Accept json
// @Produce json
// @Param activity_id path integer true "活动ID"
// @Success 200 {object} simpleMessageResponse
// @Failure 400 {object} code.Failure
// @Router /api/admin/activities/{activity_id} [delete]
// @Security LoginVerifyToken
func (h *handler) DeleteActivity() core.HandlerFunc {
return func(ctx core.Context) {
res := new(simpleMessageResponse)
if ctx.SessionUserInfo().IsSuper != 1 {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.DeleteActivityError, "禁止操作"))
return
}
id, err := strconv.ParseInt(ctx.Param("activity_id"), 10, 64)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "未传递活动ID"))
return
}
if err := h.activity.DeleteActivity(ctx.RequestContext(), id); err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.DeleteActivityError, err.Error()))
return
}
res.Message = "操作成功"
ctx.Payload(res)
}
}
// GetActivityDetail 查看活动详情
// @Summary 查看活动详情
// @Description 查看指定活动的详细信息
// @Tags 管理端.活动
// @Accept json
// @Produce json
// @Param activity_id path integer true "活动ID"
// @Success 200 {object} model.Activities
// @Failure 400 {object} code.Failure
// @Router /api/admin/activities/{activity_id} [get]
// @Security LoginVerifyToken
func (h *handler) GetActivityDetail() core.HandlerFunc {
return func(ctx core.Context) {
id, err := strconv.ParseInt(ctx.Param("activity_id"), 10, 64)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "未传递活动ID"))
return
}
item, err := h.activity.GetActivity(ctx.RequestContext(), id)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.GetActivityError, err.Error()))
return
}
ctx.Payload(item)
}
}
type copyActivityResponse struct {
NewActivityID int64 `json:"new_activity_id"`
Status string `json:"status"`
}
// CopyActivity 复制活动
// @Summary 复制活动
// @Description 根据活动ID深度复制期次与奖品生成新的活动
// @Tags 管理端.活动
// @Accept json
// @Produce json
// @Param activity_id path integer true "活动ID"
// @Success 200 {object} copyActivityResponse
// @Failure 400 {object} code.Failure
// @Router /api/admin/activities/{activity_id}/copy [post]
// @Security LoginVerifyToken
func (h *handler) CopyActivity() core.HandlerFunc {
return func(ctx core.Context) {
res := new(copyActivityResponse)
if ctx.SessionUserInfo().IsSuper != 1 {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.CreateActivityError, "禁止操作"))
return
}
id, err := strconv.ParseInt(ctx.Param("activity_id"), 10, 64)
if err != nil || id <= 0 {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "未传递活动ID"))
return
}
newID, err := h.activity.CopyActivity(ctx.RequestContext(), id)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.CreateActivityError, err.Error()))
return
}
res.NewActivityID = newID
res.Status = "success"
ctx.Payload(res)
}
}