Files
st-react/server/api/v1/app/character.go
2026-02-27 23:15:30 +08:00

252 lines
7.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package app
import (
"encoding/json"
"strconv"
"git.echol.cn/loser/st/server/global"
"git.echol.cn/loser/st/server/model/app/request"
"git.echol.cn/loser/st/server/model/common"
commonResponse "git.echol.cn/loser/st/server/model/common/response"
"git.echol.cn/loser/st/server/service"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
type CharacterApi struct{}
// CreateCharacter
// @Tags AppCharacter
// @Summary 创建角色卡
// @Produce application/json
// @Param data body request.CreateCharacterRequest true "角色卡信息"
// @Success 200 {object} commonResponse.Response{data=response.CharacterResponse} "创建成功"
// @Router /app/character [post]
// @Security ApiKeyAuth
func (a *CharacterApi) CreateCharacter(c *gin.Context) {
userID := common.GetAppUserID(c)
var req request.CreateCharacterRequest
err := c.ShouldBindJSON(&req)
if err != nil {
commonResponse.FailWithMessage(err.Error(), c)
return
}
resp, err := service.ServiceGroupApp.AppServiceGroup.CharacterService.CreateCharacter(userID, &req)
if err != nil {
global.GVA_LOG.Error("创建角色卡失败", zap.Error(err))
commonResponse.FailWithMessage(err.Error(), c)
return
}
commonResponse.OkWithData(resp, c)
}
// GetCharacterList
// @Tags AppCharacter
// @Summary 获取角色卡列表
// @Produce application/json
// @Param page query int false "页码"
// @Param pageSize query int false "每页数量"
// @Param keyword query string false "关键词"
// @Param tag query string false "标签"
// @Param isPublic query bool false "是否公开"
// @Success 200 {object} commonResponse.Response{data=response.CharacterListResponse} "获取成功"
// @Router /app/character [get]
// @Security ApiKeyAuth
func (a *CharacterApi) GetCharacterList(c *gin.Context) {
userID := common.GetAppUserID(c)
var req request.GetCharacterListRequest
req.Page, _ = strconv.Atoi(c.DefaultQuery("page", "1"))
req.PageSize, _ = strconv.Atoi(c.DefaultQuery("pageSize", "20"))
req.Keyword = c.Query("keyword")
req.Tag = c.Query("tag")
if isPublicStr := c.Query("isPublic"); isPublicStr != "" {
isPublic := isPublicStr == "true"
req.IsPublic = &isPublic
}
// 参数验证
if req.Page < 1 {
req.Page = 1
}
if req.PageSize < 1 || req.PageSize > 100 {
req.PageSize = 20
}
resp, err := service.ServiceGroupApp.AppServiceGroup.CharacterService.GetCharacterList(userID, &req)
if err != nil {
global.GVA_LOG.Error("获取角色卡列表失败", zap.Error(err))
commonResponse.FailWithMessage(err.Error(), c)
return
}
commonResponse.OkWithDetailed(commonResponse.PageResult{
List: resp.List,
Total: resp.Total,
Page: resp.Page,
PageSize: resp.PageSize,
}, "获取成功", c)
}
// GetCharacterByID
// @Tags AppCharacter
// @Summary 获取角色卡详情
// @Produce application/json
// @Param id path int true "角色卡ID"
// @Success 200 {object} commonResponse.Response{data=response.CharacterResponse} "获取成功"
// @Router /app/character/:id [get]
// @Security ApiKeyAuth
func (a *CharacterApi) GetCharacterByID(c *gin.Context) {
userID := common.GetAppUserID(c)
characterID, err := strconv.ParseUint(c.Param("id"), 10, 32)
if err != nil {
commonResponse.FailWithMessage("无效的角色卡ID", c)
return
}
resp, err := service.ServiceGroupApp.AppServiceGroup.CharacterService.GetCharacterByID(userID, uint(characterID))
if err != nil {
global.GVA_LOG.Error("获取角色卡详情失败", zap.Error(err))
commonResponse.FailWithMessage(err.Error(), c)
return
}
commonResponse.OkWithData(resp, c)
}
// UpdateCharacter
// @Tags AppCharacter
// @Summary 更新角色卡
// @Produce application/json
// @Param id path int true "角色卡ID"
// @Param data body request.UpdateCharacterRequest true "角色卡信息"
// @Success 200 {object} commonResponse.Response{msg=string} "更新成功"
// @Router /app/character/:id [put]
// @Security ApiKeyAuth
func (a *CharacterApi) UpdateCharacter(c *gin.Context) {
userID := common.GetAppUserID(c)
characterID, err := strconv.ParseUint(c.Param("id"), 10, 32)
if err != nil {
commonResponse.FailWithMessage("无效的角色卡ID", c)
return
}
var req request.UpdateCharacterRequest
err = c.ShouldBindJSON(&req)
if err != nil {
commonResponse.FailWithMessage(err.Error(), c)
return
}
err = service.ServiceGroupApp.AppServiceGroup.CharacterService.UpdateCharacter(userID, uint(characterID), &req)
if err != nil {
global.GVA_LOG.Error("更新角色卡失败", zap.Error(err))
commonResponse.FailWithMessage(err.Error(), c)
return
}
commonResponse.OkWithMessage("更新成功", c)
}
// DeleteCharacter
// @Tags AppCharacter
// @Summary 删除角色卡
// @Produce application/json
// @Param id path int true "角色卡ID"
// @Success 200 {object} commonResponse.Response{msg=string} "删除成功"
// @Router /app/character/:id [delete]
// @Security ApiKeyAuth
func (a *CharacterApi) DeleteCharacter(c *gin.Context) {
userID := common.GetAppUserID(c)
characterID, err := strconv.ParseUint(c.Param("id"), 10, 32)
if err != nil {
commonResponse.FailWithMessage("无效的角色卡ID", c)
return
}
err = service.ServiceGroupApp.AppServiceGroup.CharacterService.DeleteCharacter(userID, uint(characterID))
if err != nil {
global.GVA_LOG.Error("删除角色卡失败", zap.Error(err))
commonResponse.FailWithMessage(err.Error(), c)
return
}
commonResponse.OkWithMessage("删除成功", c)
}
// UploadCharacter
// @Tags AppCharacter
// @Summary 上传角色卡文件PNG/JSON
// @Accept multipart/form-data
// @Produce application/json
// @Param file formData file true "角色卡文件"
// @Success 200 {object} commonResponse.Response{data=response.CharacterResponse} "上传成功"
// @Router /app/character/upload [post]
// @Security ApiKeyAuth
func (a *CharacterApi) UploadCharacter(c *gin.Context) {
userID := common.GetAppUserID(c)
file, err := c.FormFile("file")
if err != nil {
commonResponse.FailWithMessage("请选择文件", c)
return
}
// 根据文件类型选择导入方式
contentType := file.Header.Get("Content-Type")
var resp interface{}
if contentType == "image/png" || contentType == "image/x-png" {
resp, err = service.ServiceGroupApp.AppServiceGroup.CharacterService.ImportCharacterFromPNG(userID, file)
} else if contentType == "application/json" {
resp, err = service.ServiceGroupApp.AppServiceGroup.CharacterService.ImportCharacterFromJSON(userID, file)
} else {
commonResponse.FailWithMessage("不支持的文件类型,仅支持 PNG 和 JSON", c)
return
}
if err != nil {
global.GVA_LOG.Error("上传角色卡失败", zap.Error(err))
commonResponse.FailWithMessage(err.Error(), c)
return
}
commonResponse.OkWithData(resp, c)
}
// ExportCharacter
// @Tags AppCharacter
// @Summary 导出角色卡为 JSON
// @Produce application/json
// @Param id path int true "角色卡ID"
// @Success 200 {object} utils.CharacterCardV2 "导出成功"
// @Router /app/character/:id/export [get]
// @Security ApiKeyAuth
func (a *CharacterApi) ExportCharacter(c *gin.Context) {
userID := common.GetAppUserID(c)
characterID, err := strconv.ParseUint(c.Param("id"), 10, 32)
if err != nil {
commonResponse.FailWithMessage("无效的角色卡ID", c)
return
}
card, err := service.ServiceGroupApp.AppServiceGroup.CharacterService.ExportCharacterToJSON(userID, uint(characterID))
if err != nil {
global.GVA_LOG.Error("导出角色卡失败", zap.Error(err))
commonResponse.FailWithMessage(err.Error(), c)
return
}
// 设置下载响应头
c.Header("Content-Type", "application/json")
c.Header("Content-Disposition", "attachment; filename=character_"+c.Param("id")+".json")
// 直接返回 JSON
jsonData, _ := json.MarshalIndent(card, "", " ")
c.Data(200, "application/json", jsonData)
}