- 后端新增批量创建二维码接口 POST /admin/chats/qrcodes/batch - 前端二维码管理页支持多图拖拽批量上传 - 注册 qrcode 图片压缩场景(maxSide=2560, quality=0.95) - 后端 normalizeScene 注册 qrcode scene - 增强 AuthImage 组件支持 el-image 大图预览(previewSrcList) - 修复 WithdrawalDetailDialog 提现凭证图片 401 问题 - 删除重复的 components/AuthImage.vue,统一使用共享组件 - 提交3剩余: 会话列表群类型图标、发布成功跳群、管理端路由等
130 lines
3.4 KiB
Go
130 lines
3.4 KiB
Go
package chat
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// CreateQrCodeHandler 创建二维码
|
|
func (h *Handler) CreateQrCodeHandler(c *gin.Context) {
|
|
var req CreateQrCodeRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
adminID := c.GetUint64("admin_id")
|
|
qrcode, err := h.service.repo.CreateQrCode(c.Request.Context(), adminID, req)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"data": qrcode})
|
|
}
|
|
|
|
// BatchCreateQrCodeHandler 批量创建二维码
|
|
func (h *Handler) BatchCreateQrCodeHandler(c *gin.Context) {
|
|
var req BatchCreateQrCodeRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
adminID := c.GetUint64("admin_id")
|
|
qrcodes, err := h.service.repo.BatchCreateQrCode(c.Request.Context(), adminID, req)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"data": qrcodes})
|
|
}
|
|
|
|
// ListQrCodesHandler 列表查询二维码
|
|
func (h *Handler) ListQrCodesHandler(c *gin.Context) {
|
|
var req QrCodeListRequest
|
|
if err := c.ShouldBindQuery(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
qrcodes, total, err := h.service.repo.ListQrCodes(c.Request.Context(), req)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"data": qrcodes,
|
|
"pagination": gin.H{
|
|
"total": total,
|
|
"page": req.Page,
|
|
"limit": req.Limit,
|
|
},
|
|
})
|
|
}
|
|
|
|
// GetQrCodeStatsHandler 获取二维码统计
|
|
func (h *Handler) GetQrCodeStatsHandler(c *gin.Context) {
|
|
stats, err := h.service.repo.GetQrCodeStats(c.Request.Context())
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"data": stats})
|
|
}
|
|
|
|
// UpdateQrCodeHandler 更新二维码
|
|
func (h *Handler) UpdateQrCodeHandler(c *gin.Context) {
|
|
id, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "无效的ID"})
|
|
return
|
|
}
|
|
|
|
var req UpdateQrCodeRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
if err := h.service.repo.UpdateQrCode(c.Request.Context(), id, req); err != nil {
|
|
if err == ErrQrCodeNotFound {
|
|
c.JSON(http.StatusNotFound, gin.H{"error": "二维码不存在"})
|
|
return
|
|
}
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": "更新成功"})
|
|
}
|
|
|
|
// DeleteQrCodeHandler 删除二维码
|
|
func (h *Handler) DeleteQrCodeHandler(c *gin.Context) {
|
|
id, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "无效的ID"})
|
|
return
|
|
}
|
|
|
|
if err := h.service.repo.DeleteQrCode(c.Request.Context(), id); err != nil {
|
|
if err == ErrQrCodeNotFound {
|
|
c.JSON(http.StatusNotFound, gin.H{"error": "二维码不存在"})
|
|
return
|
|
}
|
|
if err == ErrQrCodeCannotDelete {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "已使用的二维码不能删除"})
|
|
return
|
|
}
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": "删除成功"})
|
|
}
|