bindbox-game/internal/api/admin/matching_cards_admin.go
邹方成 45815bfb7d chore: 清理无用文件与优化代码结构
refactor(utils): 修复密码哈希比较逻辑错误
feat(user): 新增按状态筛选优惠券接口
docs: 添加虚拟发货与任务中心相关文档
fix(wechat): 修正Code2Session上下文传递问题
test: 补充订单折扣与积分转换测试用例
build: 更新配置文件与构建脚本
style: 清理多余的空行与注释
2025-12-18 17:35:55 +08:00

220 lines
6.7 KiB
Go

package admin
import (
"bindbox-game/internal/code"
"bindbox-game/internal/pkg/core"
"bindbox-game/internal/pkg/validation"
"bindbox-game/internal/repository/mysql/model"
"net/http"
"time"
)
// ========== 对对碰卡牌类型管理 ==========
type matchingCardTypeRequest struct {
Code string `json:"code" binding:"required"`
Name string `json:"name" binding:"required"`
ImageURL string `json:"image_url"`
Quantity int32 `json:"quantity"`
Sort int32 `json:"sort"`
Status int32 `json:"status"`
}
type matchingCardTypeResponse struct {
ID int64 `json:"id"`
Code string `json:"code"`
Name string `json:"name"`
ImageURL string `json:"image_url"`
Quantity int32 `json:"quantity"`
Sort int32 `json:"sort"`
Status int32 `json:"status"`
CreatedAt string `json:"created_at"`
}
type listMatchingCardTypesResponse struct {
List []matchingCardTypeResponse `json:"list"`
Total int64 `json:"total"`
}
// ListMatchingCardTypes 列出对对碰卡牌类型
// @Summary 列出对对碰卡牌类型
// @Description 获取所有卡牌类型配置
// @Tags 管理端.对对碰
// @Accept json
// @Produce json
// @Security AdminAuth
// @Success 200 {object} listMatchingCardTypesResponse
// @Failure 400 {object} code.Failure
// @Router /api/admin/matching_card_types [get]
func (h *handler) ListMatchingCardTypes() core.HandlerFunc {
return func(ctx core.Context) {
items, err := h.readDB.MatchingCardTypes.WithContext(ctx.RequestContext()).Order(h.readDB.MatchingCardTypes.Sort.Asc(), h.readDB.MatchingCardTypes.ID.Asc()).Find()
if err != nil {
ctx.AbortWithError(core.Error(http.StatusInternalServerError, code.ParamBindError, err.Error()))
return
}
list := make([]matchingCardTypeResponse, len(items))
for i, item := range items {
list[i] = matchingCardTypeResponse{
ID: item.ID,
Code: item.Code,
Name: item.Name,
ImageURL: item.ImageURL,
Quantity: item.Quantity,
Sort: item.Sort,
Status: item.Status,
CreatedAt: item.CreatedAt.Format("2006-01-02 15:04:05"),
}
}
ctx.Payload(&listMatchingCardTypesResponse{List: list, Total: int64(len(list))})
}
}
// CreateMatchingCardType 创建卡牌类型
// @Summary 创建卡牌类型
// @Description 创建新的卡牌类型
// @Tags 管理端.对对碰
// @Accept json
// @Produce json
// @Security AdminAuth
// @Param RequestBody body matchingCardTypeRequest true "请求参数"
// @Success 200 {object} matchingCardTypeResponse
// @Failure 400 {object} code.Failure
// @Router /api/admin/matching_card_types [post]
func (h *handler) CreateMatchingCardType() core.HandlerFunc {
return func(ctx core.Context) {
req := new(matchingCardTypeRequest)
if err := ctx.ShouldBindJSON(req); err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, validation.Error(err)))
return
}
if req.Quantity <= 0 {
req.Quantity = 9
}
if req.Status == 0 {
req.Status = 1
}
item := &model.MatchingCardTypes{
Code: req.Code,
Name: req.Name,
ImageURL: req.ImageURL,
Quantity: req.Quantity,
Sort: req.Sort,
Status: req.Status,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
if err := h.writeDB.MatchingCardTypes.WithContext(ctx.RequestContext()).Create(item); err != nil {
ctx.AbortWithError(core.Error(http.StatusInternalServerError, code.ParamBindError, err.Error()))
return
}
ctx.Payload(&matchingCardTypeResponse{
ID: item.ID,
Code: item.Code,
Name: item.Name,
ImageURL: item.ImageURL,
Quantity: item.Quantity,
Sort: item.Sort,
Status: item.Status,
})
}
}
// ModifyMatchingCardType 修改卡牌类型
// @Summary 修改卡牌类型
// @Description 修改已有的卡牌类型
// @Tags 管理端.对对碰
// @Accept json
// @Produce json
// @Security AdminAuth
// @Param id path int true "卡牌类型ID"
// @Param RequestBody body matchingCardTypeRequest true "请求参数"
// @Success 200 {object} matchingCardTypeResponse
// @Failure 400 {object} code.Failure
// @Router /api/admin/matching_card_types/{id} [put]
func (h *handler) ModifyMatchingCardType() core.HandlerFunc {
return func(ctx core.Context) {
idStr := ctx.Param("id")
var id int64
for i := 0; i < len(idStr); i++ {
c := idStr[i]
if c < '0' || c > '9' {
break
}
id = id*10 + int64(c-'0')
}
if id <= 0 {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "invalid id"))
return
}
req := new(matchingCardTypeRequest)
if err := ctx.ShouldBindJSON(req); err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, validation.Error(err)))
return
}
updates := map[string]any{
"code": req.Code,
"name": req.Name,
"image_url": req.ImageURL,
"quantity": req.Quantity,
"sort": req.Sort,
"status": req.Status,
"updated_at": time.Now(),
}
_, err := h.writeDB.MatchingCardTypes.WithContext(ctx.RequestContext()).Where(h.writeDB.MatchingCardTypes.ID.Eq(id)).Updates(updates)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusInternalServerError, code.ParamBindError, err.Error()))
return
}
item, _ := h.readDB.MatchingCardTypes.WithContext(ctx.RequestContext()).Where(h.readDB.MatchingCardTypes.ID.Eq(id)).First()
if item == nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "not found"))
return
}
ctx.Payload(&matchingCardTypeResponse{
ID: item.ID,
Code: item.Code,
Name: item.Name,
ImageURL: item.ImageURL,
Quantity: item.Quantity,
Sort: item.Sort,
Status: item.Status,
})
}
}
// DeleteMatchingCardType 删除卡牌类型
// @Summary 删除卡牌类型
// @Description 删除指定的卡牌类型
// @Tags 管理端.对对碰
// @Accept json
// @Produce json
// @Security AdminAuth
// @Param id path int true "卡牌类型ID"
// @Success 200 {object} map[string]any
// @Failure 400 {object} code.Failure
// @Router /api/admin/matching_card_types/{id} [delete]
func (h *handler) DeleteMatchingCardType() core.HandlerFunc {
return func(ctx core.Context) {
idStr := ctx.Param("id")
var id int64
for i := 0; i < len(idStr); i++ {
c := idStr[i]
if c < '0' || c > '9' {
break
}
id = id*10 + int64(c-'0')
}
if id <= 0 {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "invalid id"))
return
}
_, err := h.writeDB.MatchingCardTypes.WithContext(ctx.RequestContext()).Where(h.writeDB.MatchingCardTypes.ID.Eq(id)).Delete()
if err != nil {
ctx.AbortWithError(core.Error(http.StatusInternalServerError, code.ParamBindError, err.Error()))
return
}
ctx.Payload(map[string]any{"deleted": true})
}
}