286 lines
6.8 KiB
Go
286 lines
6.8 KiB
Go
package handler
|
|
|
|
import (
|
|
"dd_fiber_api/internal/question/service"
|
|
"strconv"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
// PaperHandler 试卷处理器
|
|
type PaperHandler struct {
|
|
paperService *service.PaperService
|
|
}
|
|
|
|
// NewPaperHandler 创建试卷处理器
|
|
func NewPaperHandler(paperService *service.PaperService) *PaperHandler {
|
|
return &PaperHandler{
|
|
paperService: paperService,
|
|
}
|
|
}
|
|
|
|
// CreatePaper 创建试卷
|
|
func (h *PaperHandler) CreatePaper(c *fiber.Ctx) error {
|
|
var req service.CreatePaperRequest
|
|
if err := c.BodyParser(&req); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": "请求参数解析失败: " + err.Error(),
|
|
})
|
|
}
|
|
|
|
paper, err := h.paperService.CreatePaper(&req)
|
|
if err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": err.Error(),
|
|
})
|
|
}
|
|
|
|
return c.JSON(fiber.Map{
|
|
"success": true,
|
|
"message": "创建成功",
|
|
"paper": paper,
|
|
})
|
|
}
|
|
|
|
// GetPaper 获取试卷
|
|
func (h *PaperHandler) GetPaper(c *fiber.Ctx) error {
|
|
id := c.Query("id")
|
|
if id == "" {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": "试卷ID不能为空",
|
|
})
|
|
}
|
|
|
|
paper, err := h.paperService.GetPaper(id)
|
|
if err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": err.Error(),
|
|
})
|
|
}
|
|
|
|
return c.JSON(fiber.Map{
|
|
"success": true,
|
|
"message": "获取成功",
|
|
"paper": paper,
|
|
})
|
|
}
|
|
|
|
// SearchPapers 搜索试卷
|
|
func (h *PaperHandler) SearchPapers(c *fiber.Ctx) error {
|
|
query := c.Query("query", "")
|
|
pageStr := c.Query("page", "1")
|
|
pageSizeStr := c.Query("page_size", "10")
|
|
|
|
page, _ := strconv.ParseInt(pageStr, 10, 32)
|
|
pageSize, _ := strconv.ParseInt(pageSizeStr, 10, 32)
|
|
|
|
papers, total, err := h.paperService.SearchPapers(query, int32(page), int32(pageSize))
|
|
if err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": err.Error(),
|
|
})
|
|
}
|
|
|
|
return c.JSON(fiber.Map{
|
|
"success": true,
|
|
"message": "搜索成功",
|
|
"papers": papers,
|
|
"total": total,
|
|
"page": page,
|
|
"page_size": pageSize,
|
|
})
|
|
}
|
|
|
|
// UpdatePaper 更新试卷
|
|
func (h *PaperHandler) UpdatePaper(c *fiber.Ctx) error {
|
|
var req service.UpdatePaperRequest
|
|
if err := c.BodyParser(&req); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": "请求参数解析失败: " + err.Error(),
|
|
})
|
|
}
|
|
|
|
if req.Id == "" {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": "试卷ID不能为空",
|
|
})
|
|
}
|
|
|
|
err := h.paperService.UpdatePaper(&req)
|
|
if err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": err.Error(),
|
|
})
|
|
}
|
|
|
|
return c.JSON(fiber.Map{
|
|
"success": true,
|
|
"message": "更新成功",
|
|
})
|
|
}
|
|
|
|
// DeletePaper 删除试卷
|
|
func (h *PaperHandler) DeletePaper(c *fiber.Ctx) error {
|
|
id := c.Query("id")
|
|
if id == "" {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": "试卷ID不能为空",
|
|
})
|
|
}
|
|
|
|
err := h.paperService.DeletePaper(id)
|
|
if err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": err.Error(),
|
|
})
|
|
}
|
|
|
|
return c.JSON(fiber.Map{
|
|
"success": true,
|
|
"message": "删除成功",
|
|
})
|
|
}
|
|
|
|
// BatchDeletePapers 批量删除试卷
|
|
func (h *PaperHandler) BatchDeletePapers(c *fiber.Ctx) error {
|
|
var req struct {
|
|
PaperIds []string `json:"paper_ids"`
|
|
}
|
|
if err := c.BodyParser(&req); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": "请求参数解析失败: " + err.Error(),
|
|
})
|
|
}
|
|
|
|
if len(req.PaperIds) == 0 {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": "试卷ID列表不能为空",
|
|
})
|
|
}
|
|
|
|
deletedCount, failedIDs, err := h.paperService.BatchDeletePapers(req.PaperIds)
|
|
if err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": err.Error(),
|
|
})
|
|
}
|
|
|
|
return c.JSON(fiber.Map{
|
|
"success": true,
|
|
"message": "批量删除完成",
|
|
"deleted_count": deletedCount,
|
|
"failed_paper_ids": failedIDs,
|
|
})
|
|
}
|
|
|
|
// AddQuestionToPaper 添加题目到试卷
|
|
func (h *PaperHandler) AddQuestionToPaper(c *fiber.Ctx) error {
|
|
var req struct {
|
|
PaperId string `json:"paper_id"`
|
|
QuestionIds []string `json:"question_ids"`
|
|
}
|
|
if err := c.BodyParser(&req); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": "请求参数解析失败: " + err.Error(),
|
|
})
|
|
}
|
|
|
|
if req.PaperId == "" {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": "试卷ID不能为空",
|
|
})
|
|
}
|
|
|
|
addedCount, failedIDs, err := h.paperService.AddQuestionToPaper(req.PaperId, req.QuestionIds)
|
|
if err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": err.Error(),
|
|
})
|
|
}
|
|
|
|
return c.JSON(fiber.Map{
|
|
"success": true,
|
|
"message": "添加题目完成",
|
|
"added_count": addedCount,
|
|
"failed_question_ids": failedIDs,
|
|
})
|
|
}
|
|
|
|
// RemoveQuestionFromPaper 从试卷移除题目
|
|
func (h *PaperHandler) RemoveQuestionFromPaper(c *fiber.Ctx) error {
|
|
var req struct {
|
|
PaperId string `json:"paper_id"`
|
|
QuestionIds []string `json:"question_ids"`
|
|
}
|
|
if err := c.BodyParser(&req); err != nil {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": "请求参数解析失败: " + err.Error(),
|
|
})
|
|
}
|
|
|
|
if req.PaperId == "" {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": "试卷ID不能为空",
|
|
})
|
|
}
|
|
|
|
removedCount, failedIDs, err := h.paperService.RemoveQuestionFromPaper(req.PaperId, req.QuestionIds)
|
|
if err != nil {
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": err.Error(),
|
|
})
|
|
}
|
|
|
|
return c.JSON(fiber.Map{
|
|
"success": true,
|
|
"message": "移除题目完成",
|
|
"removed_count": removedCount,
|
|
"failed_question_ids": failedIDs,
|
|
})
|
|
}
|
|
|
|
// GetPaperWithAnswers 获取试卷及题目详情(包含答案和解析,用于答题结果页面)
|
|
func (h *PaperHandler) GetPaperWithAnswers(c *fiber.Ctx) error {
|
|
id := c.Query("id")
|
|
if id == "" {
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": "试卷ID不能为空",
|
|
})
|
|
}
|
|
|
|
paper, err := h.paperService.GetPaperWithAnswers(id)
|
|
if err != nil {
|
|
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
|
|
"success": false,
|
|
"message": err.Error(),
|
|
})
|
|
}
|
|
|
|
return c.JSON(fiber.Map{
|
|
"success": true,
|
|
"message": "获取成功",
|
|
"paper": paper,
|
|
"data": paper, // 兼容前端可能使用的 data 字段
|
|
})
|
|
}
|