Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 25s
feat(admin): 新增工会管理功能 feat(activity): 添加活动管理相关服务 feat(user): 实现用户道具卡和积分管理 feat(guild): 新增工会成员管理功能 fix: 修复数据库连接配置 fix: 修正jwtoken导入路径 fix: 解决端口冲突问题 style: 统一代码格式和注释风格 style: 更新项目常量命名 docs: 添加项目框架和开发规范文档 docs: 更新接口文档注释 chore: 移除无用代码和文件 chore: 更新Makefile和配置文件 chore: 清理日志文件 test: 添加道具卡测试脚本
231 lines
6.8 KiB
Go
231 lines
6.8 KiB
Go
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)
|
||
}
|
||
}
|