package controller import ( "github.com/gin-gonic/gin" "knowledge/api/dao" "knowledge/api/dto" "knowledge/api/requests" "knowledge/api/responses" "knowledge/api/service" "knowledge/global" "knowledge/utils" "strconv" ) type Question struct{} // GetQuestionPage 获取题目列表-分页 func (r *Question) GetQuestionPage(c *gin.Context) { questionRequest := requests.QuestionRequest{} req := questionRequest.GetQuestionPage if err := c.ShouldBindJSON(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } if req.Page == 0 { req.Page = 1 } if req.PageSize == 0 { req.PageSize = 20 } questionDao := dao.QuestionDao{} question, total, err := questionDao.GetQuestionPageSearch(req, req.Page, req.PageSize) if err != nil { responses.FailWithMessage(err.Error(), c) return } // 处理返回值 g := dto.GetQuestionListDto(question) for _, v := range g { // 加载一级标签 if v.FirstLabelId != nil { labelDao := dao.LabelDao{} firstLabel, err := labelDao.GetLabelFirstById(*v.FirstLabelId) if err != nil { responses.FailWithMessage(err.Error(), c) return } v.LoadFirstLabel(firstLabel) } // 加载二级标签 if v.SecondLabelId != nil { labelDao := dao.LabelDao{} secondLabel, err := labelDao.GetLabelFirstById(*v.SecondLabelId) if err != nil { responses.FailWithMessage(err.Error(), c) return } v.LoadSecondLabel(secondLabel) } } result := make(map[string]interface{}) result["page"] = req.Page result["page_size"] = req.PageSize result["total"] = total result["data"] = g responses.OkWithData(result, c) } // GetQuestion 获取题目详情 func (r *Question) GetQuestion(c *gin.Context) { id := c.Param("question_id") if id == "" { responses.FailWithMessage("缺少参数", c) return } // 将 id 转换为 int64 类型 questionId, err := strconv.ParseInt(id, 10, 64) if err != nil { responses.Fail(c) return } // 业务处理 questionService := service.QuestionService{} g, err := questionService.GetQuestion(questionId) if err != nil { responses.FailWithMessage(err.Error(), c) return } responses.OkWithData(g, c) } // AddQuestion 新增题目 func (r *Question) AddQuestion(c *gin.Context) { questionRequest := requests.QuestionRequest{} req := questionRequest.AddQuestion if err := c.ShouldBindJSON(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } // 业务处理 questionService := service.QuestionService{} _, err := questionService.AddQuestion(req) if err != nil { responses.FailWithMessage(err.Error(), c) return } responses.Ok(c) } // AddQuestionTest 新增题目 func (r *Question) AddQuestionTest(c *gin.Context) { questionRequest := requests.QuestionRequest{} req := questionRequest.AddQuestionTest if err := c.ShouldBindJSON(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } // 业务处理 questionService := service.QuestionService{} _, err := questionService.AddQuestionTest(req) if err != nil { responses.FailWithMessage(err.Error(), c) return } responses.Ok(c) } // PutQuestion 修改题目 func (r *Question) PutQuestion(c *gin.Context) { couponRequest := requests.QuestionRequest{} req := couponRequest.PutQuestion if err := c.ShouldBindJSON(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } id := c.Param("question_id") if id == "" { responses.FailWithMessage("缺少参数", c) return } // 将 id 转换为 int64 类型 questionId, err := strconv.ParseInt(id, 10, 64) if err != nil { responses.Fail(c) return } // 业务处理 questionService := service.QuestionService{} _, err = questionService.PutQuestion(questionId, req) if err != nil { responses.FailWithMessage(err.Error(), c) return } responses.Ok(c) } // PutQuestionStatus 修改题目状态 func (b *Question) PutQuestionStatus(c *gin.Context) { questionRequest := requests.QuestionRequest{} req := questionRequest.PutQuestionStatus if err := c.ShouldBind(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } id := c.Param("question_id") if id == "" { responses.FailWithMessage("缺少参数", c) return } // 将 id 转换为 int64 类型 questionId, err := strconv.ParseInt(id, 10, 64) if err != nil { responses.Fail(c) return } // 获取基础分类数据 questionDao := dao.QuestionDao{} question, err := questionDao.GetQuestionById(questionId) if err != nil { responses.FailWithMessage("题目异常", c) return } // 检测状态 if question.QuestionStatus == req.QuestionStatus { responses.Ok(c) return } if req.QuestionStatus == 2 { // 检测题目关联的题库数量是否充足-减去对应数量后 questionQaService := service.QuestionQaService{} res, err := questionQaService.CheckQuestionRelationQaQuantitySub(question.QuestionId, 1) if res == false { responses.FailWithMessage(err.Error(), c) return } } // 开始事务 tx := global.Db.Begin() defer func() { if r := recover(); r != nil { tx.Rollback() } }() questionData := make(map[string]interface{}) questionData["question_status"] = req.QuestionStatus err = questionDao.EditQuestionById(tx, questionId, questionData) if err != nil { tx.Rollback() responses.FailWithMessage("操作失败", c) return } tx.Commit() responses.Ok(c) } // PutQuestionTest 修改题目 func (r *Question) PutQuestionTest(c *gin.Context) { couponRequest := requests.QuestionRequest{} req := couponRequest.PutQuestionTest if err := c.ShouldBindJSON(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } id := c.Param("question_id") if id == "" { responses.FailWithMessage("缺少参数", c) return } // 将 id 转换为 int64 类型 questionId, err := strconv.ParseInt(id, 10, 64) if err != nil { responses.Fail(c) return } // 业务处理 questionService := service.QuestionService{} _, err = questionService.PutQuestionTest(questionId, req) if err != nil { responses.FailWithMessage(err.Error(), c) return } responses.Ok(c) } // DeleteQuestion 删除题目 func (r *Question) DeleteQuestion(c *gin.Context) { questionRequest := requests.QuestionRequest{} req := questionRequest.DeleteQuestion if err := c.ShouldBindJSON(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } // 业务处理 questionService := service.QuestionService{} _, err := questionService.DeleteQuestion(req) if err != nil { responses.FailWithMessage(err.Error(), c) return } responses.Ok(c) } // GetQuestionCount 获取题目数量 func (r *Question) GetQuestionCount(c *gin.Context) { questionRequest := requests.QuestionRequest{} req := questionRequest.GetQuestionCount if err := c.ShouldBind(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } questionDao := dao.QuestionDao{} total, err := questionDao.GetQuestionCountSearch(req) if err != nil { responses.FailWithMessage(err.Error(), c) return } responses.OkWithData(total, c) }