refactor(utils): 修复密码哈希比较逻辑错误 feat(user): 新增按状态筛选优惠券接口 docs: 添加虚拟发货与任务中心相关文档 fix(wechat): 修正Code2Session上下文传递问题 test: 补充订单折扣与积分转换测试用例 build: 更新配置文件与构建脚本 style: 清理多余的空行与注释
220 lines
6.7 KiB
Go
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})
|
|
}
|
|
}
|