Initial commit
This commit is contained in:
313
server/internal/handler/points.go
Normal file
313
server/internal/handler/points.go
Normal file
@@ -0,0 +1,313 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"dianshang/internal/service"
|
||||
"dianshang/pkg/response"
|
||||
"dianshang/pkg/utils"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// PointsHandler 积分处理器
|
||||
type PointsHandler struct {
|
||||
pointsService *service.PointsService
|
||||
}
|
||||
|
||||
// NewPointsHandler 创建积分处理器
|
||||
func NewPointsHandler(pointsService *service.PointsService) *PointsHandler {
|
||||
return &PointsHandler{
|
||||
pointsService: pointsService,
|
||||
}
|
||||
}
|
||||
|
||||
// GetUserPoints 获取用户积分
|
||||
// @Summary 获取用户积分
|
||||
// @Description 获取当前用户的积分余额
|
||||
// @Tags 积分
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Success 200 {object} response.Response
|
||||
// @Router /api/points [get]
|
||||
func (h *PointsHandler) GetUserPoints(c *gin.Context) {
|
||||
userIDValue, exists := c.Get("user_id")
|
||||
if !exists {
|
||||
response.Unauthorized(c)
|
||||
return
|
||||
}
|
||||
userID := userIDValue.(uint)
|
||||
|
||||
points, err := h.pointsService.GetUserPoints(userID)
|
||||
if err != nil {
|
||||
response.ErrorWithMessage(c, response.ERROR, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
response.Success(c, gin.H{
|
||||
"points": points,
|
||||
})
|
||||
}
|
||||
|
||||
// GetPointsOverview 获取积分概览
|
||||
// @Summary 获取积分概览
|
||||
// @Description 获取用户积分概览信息,包括当前积分、总获得、总消费
|
||||
// @Tags 积分
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Success 200 {object} response.Response
|
||||
// @Router /api/points/overview [get]
|
||||
func (h *PointsHandler) GetPointsOverview(c *gin.Context) {
|
||||
userIDValue, exists := c.Get("user_id")
|
||||
if !exists {
|
||||
response.Unauthorized(c)
|
||||
return
|
||||
}
|
||||
userID := userIDValue.(uint)
|
||||
|
||||
overview, err := h.pointsService.GetPointsOverview(userID)
|
||||
if err != nil {
|
||||
response.ErrorWithMessage(c, response.ERROR, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
response.Success(c, overview)
|
||||
}
|
||||
|
||||
// GetPointsHistory 获取积分历史记录
|
||||
// @Summary 获取积分历史记录
|
||||
// @Description 获取用户的积分历史记录列表
|
||||
// @Tags 积分
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param page query int false "页码" default(1)
|
||||
// @Param page_size query int false "每页数量" default(20)
|
||||
// @Success 200 {object} response.Response
|
||||
// @Router /api/points/history [get]
|
||||
func (h *PointsHandler) GetPointsHistory(c *gin.Context) {
|
||||
userIDValue, exists := c.Get("user_id")
|
||||
if !exists {
|
||||
response.Unauthorized(c)
|
||||
return
|
||||
}
|
||||
userID := userIDValue.(uint)
|
||||
|
||||
page := utils.StringToInt(c.DefaultQuery("page", "1"))
|
||||
pageSize := utils.StringToInt(c.DefaultQuery("page_size", "20"))
|
||||
|
||||
histories, pagination, err := h.pointsService.GetPointsHistory(userID, page, pageSize)
|
||||
if err != nil {
|
||||
response.ErrorWithMessage(c, response.ERROR, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
response.Page(c, histories, pagination["total"].(int64), pagination["page"].(int), pagination["page_size"].(int))
|
||||
}
|
||||
|
||||
// GetPointsRules 获取积分规则列表
|
||||
// @Summary 获取积分规则列表
|
||||
// @Description 获取积分获得和消费规则列表
|
||||
// @Tags 积分
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Success 200 {object} response.Response
|
||||
// @Router /api/points/rules [get]
|
||||
func (h *PointsHandler) GetPointsRules(c *gin.Context) {
|
||||
rules, err := h.pointsService.GetPointsRules()
|
||||
if err != nil {
|
||||
response.ErrorWithMessage(c, response.ERROR, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
response.Success(c, rules)
|
||||
}
|
||||
|
||||
// GetPointsExchangeList 获取积分兑换商品列表
|
||||
// @Summary 获取积分兑换商品列表
|
||||
// @Description 获取可用积分兑换的商品列表
|
||||
// @Tags 积分
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Success 200 {object} response.Response
|
||||
// @Router /api/points/exchange [get]
|
||||
func (h *PointsHandler) GetPointsExchangeList(c *gin.Context) {
|
||||
exchanges, err := h.pointsService.GetPointsExchangeList()
|
||||
if err != nil {
|
||||
response.ErrorWithMessage(c, response.ERROR, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
response.Success(c, exchanges)
|
||||
}
|
||||
|
||||
// ExchangePoints 积分兑换
|
||||
// @Summary 积分兑换
|
||||
// @Description 使用积分兑换商品
|
||||
// @Tags 积分
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param id path int true "兑换商品ID"
|
||||
// @Success 200 {object} response.Response
|
||||
// @Router /api/points/exchange/{id} [post]
|
||||
func (h *PointsHandler) ExchangePoints(c *gin.Context) {
|
||||
userIDValue, exists := c.Get("user_id")
|
||||
if !exists {
|
||||
response.Unauthorized(c)
|
||||
return
|
||||
}
|
||||
userID := userIDValue.(uint)
|
||||
|
||||
exchangeID := utils.StringToUint(c.Param("id"))
|
||||
if exchangeID == 0 {
|
||||
response.BadRequest(c, "无效的兑换商品ID")
|
||||
return
|
||||
}
|
||||
|
||||
err := h.pointsService.ExchangePoints(userID, exchangeID)
|
||||
if err != nil {
|
||||
response.ErrorWithMessage(c, response.ERROR, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
response.SuccessWithMessage(c, "兑换成功", nil)
|
||||
}
|
||||
|
||||
// GetUserExchangeRecords 获取用户兑换记录
|
||||
// @Summary 获取用户兑换记录
|
||||
// @Description 获取用户的积分兑换记录列表
|
||||
// @Tags 积分
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param page query int false "页码" default(1)
|
||||
// @Param page_size query int false "每页数量" default(20)
|
||||
// @Success 200 {object} response.Response
|
||||
// @Router /api/points/exchange/records [get]
|
||||
func (h *PointsHandler) GetUserExchangeRecords(c *gin.Context) {
|
||||
userIDValue, exists := c.Get("user_id")
|
||||
if !exists {
|
||||
response.Unauthorized(c)
|
||||
return
|
||||
}
|
||||
userID := userIDValue.(uint)
|
||||
|
||||
page := utils.StringToInt(c.DefaultQuery("page", "1"))
|
||||
pageSize := utils.StringToInt(c.DefaultQuery("page_size", "20"))
|
||||
|
||||
records, pagination, err := h.pointsService.GetUserExchangeRecords(userID, page, pageSize)
|
||||
if err != nil {
|
||||
response.ErrorWithMessage(c, response.ERROR, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
response.Page(c, records, pagination["total"].(int64), pagination["page"].(int), pagination["page_size"].(int))
|
||||
}
|
||||
|
||||
// AddPointsRequest 添加积分请求结构
|
||||
type AddPointsRequest struct {
|
||||
Amount int `json:"amount" binding:"required,min=1"`
|
||||
Description string `json:"description" binding:"required"`
|
||||
OrderNo string `json:"order_no"`
|
||||
ProductName string `json:"product_name"`
|
||||
}
|
||||
|
||||
// AddPoints 添加积分(管理员接口)
|
||||
// @Summary 添加积分
|
||||
// @Description 管理员为用户添加积分
|
||||
// @Tags 积分
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param id path int true "用户ID"
|
||||
// @Param request body AddPointsRequest true "添加积分请求"
|
||||
// @Success 200 {object} response.Response
|
||||
// @Router /api/admin/points/add/{id} [post]
|
||||
func (h *PointsHandler) AddPoints(c *gin.Context) {
|
||||
userID := utils.StringToUint(c.Param("id"))
|
||||
if userID == 0 {
|
||||
response.BadRequest(c, "无效的用户ID")
|
||||
return
|
||||
}
|
||||
|
||||
var req AddPointsRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
response.BadRequest(c, "参数错误: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
err := h.pointsService.AddPoints(userID, req.Amount, req.Description, nil, req.OrderNo, req.ProductName)
|
||||
if err != nil {
|
||||
response.ErrorWithMessage(c, response.ERROR, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
response.SuccessWithMessage(c, "积分添加成功", nil)
|
||||
}
|
||||
|
||||
// DeductPointsRequest 扣减积分请求结构
|
||||
type DeductPointsRequest struct {
|
||||
Amount int `json:"amount" binding:"required,min=1"`
|
||||
Description string `json:"description" binding:"required"`
|
||||
OrderNo string `json:"order_no"`
|
||||
ProductName string `json:"product_name"`
|
||||
}
|
||||
|
||||
// DeductPoints 扣减积分(管理员接口)
|
||||
// @Summary 扣减积分
|
||||
// @Description 管理员为用户扣减积分
|
||||
// @Tags 积分
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param id path int true "用户ID"
|
||||
// @Param request body DeductPointsRequest true "扣减积分请求"
|
||||
// @Success 200 {object} response.Response
|
||||
// @Router /api/admin/points/deduct/{id} [post]
|
||||
func (h *PointsHandler) DeductPoints(c *gin.Context) {
|
||||
userID := utils.StringToUint(c.Param("id"))
|
||||
if userID == 0 {
|
||||
response.BadRequest(c, "无效的用户ID")
|
||||
return
|
||||
}
|
||||
|
||||
var req DeductPointsRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
response.BadRequest(c, "参数错误: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
err := h.pointsService.DeductPoints(userID, req.Amount, req.Description, nil, req.OrderNo, req.ProductName)
|
||||
if err != nil {
|
||||
response.ErrorWithMessage(c, response.ERROR, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
response.SuccessWithMessage(c, "积分扣减成功", nil)
|
||||
}
|
||||
|
||||
// DailyCheckin 每日签到
|
||||
// @Summary 每日签到
|
||||
// @Description 每日签到
|
||||
// @Tags 积分
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Success 200 {object} response.Response
|
||||
// @Router /api/points/exchange/records [get]
|
||||
func (h *PointsHandler) DailyCheckin(c *gin.Context) {
|
||||
userIDValue, exists := c.Get("user_id")
|
||||
if !exists {
|
||||
response.Unauthorized(c)
|
||||
return
|
||||
}
|
||||
userID := userIDValue.(uint)
|
||||
|
||||
awarded, err := h.pointsService.CheckAndGiveDailyLoginPoints(userID)
|
||||
if err != nil {
|
||||
response.ErrorWithMessage(c, response.ERROR, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
msg := "今日已领取,无需重复领取"
|
||||
if awarded {
|
||||
msg = "今日登录积分已发放"
|
||||
}
|
||||
|
||||
response.SuccessWithMessage(c, msg, gin.H{
|
||||
"awarded": awarded,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user