QuestionController.java 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. package com.example.onlinejudge.controller;
  2. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  3. import com.example.onlinejudge.common.DeleteRequest;
  4. import com.example.onlinejudge.model.VO.QuestionVO;
  5. import com.example.onlinejudge.model.dto.question.*;
  6. import com.example.onlinejudge.model.entity.Question;
  7. import com.example.onlinejudge.model.entity.result.Result;
  8. import com.example.onlinejudge.model.entity.result.ResultCode;
  9. import com.example.onlinejudge.service.QuestionService;
  10. import com.example.onlinejudge.service.UserService;
  11. import com.google.gson.Gson;
  12. import io.swagger.annotations.ApiImplicitParam;
  13. import io.swagger.annotations.ApiImplicitParams;
  14. import io.swagger.annotations.ApiOperation;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.springframework.beans.BeanUtils;
  17. import org.springframework.web.bind.annotation.*;
  18. import javax.annotation.Resource;
  19. import javax.servlet.http.HttpServletRequest;
  20. import java.util.List;
  21. @RestController
  22. @RequestMapping("/question")
  23. @Slf4j
  24. public class QuestionController {
  25. @Resource
  26. private QuestionService questionService;
  27. @Resource
  28. private UserService userService;
  29. private final static Gson GSON = new Gson();
  30. // region 增删改查
  31. /**
  32. * 创建题目
  33. *
  34. * @param questionAddRequest
  35. * @param request
  36. * @return
  37. */
  38. @PostMapping("/add")
  39. public Result<Long> addQuestion(@RequestBody QuestionAddRequest questionAddRequest, HttpServletRequest request) {
  40. if (questionAddRequest == null) {
  41. return Result.error(ResultCode.PARAM_IS_BLANK);
  42. }
  43. Question question = new Question();
  44. BeanUtils.copyProperties(questionAddRequest, question);
  45. List<String> tags = questionAddRequest.getTags();
  46. if (tags != null) {
  47. question.setTags(GSON.toJson(tags));
  48. }
  49. List<JudgeCase> judgeCase = questionAddRequest.getJudgeCase();
  50. if (judgeCase != null) {
  51. question.setJudgeCase(GSON.toJson(judgeCase));
  52. }
  53. JudgeConfig judgeConfig = questionAddRequest.getJudgeConfig();
  54. if (judgeConfig != null) {
  55. question.setJudgeConfig(GSON.toJson(judgeConfig));
  56. }
  57. questionService.validQuestion(question, true);
  58. //TODO:记录谁创建了这个题目
  59. // User loginUser = userService.getLoginUser(request);
  60. // question.setUserId(loginUser.getId());
  61. boolean result = questionService.save(question);
  62. if(!result){
  63. return Result.error(ResultCode.PARAM_IS_INVALID);
  64. }
  65. // ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
  66. long newQuestionId = question.getId();
  67. return Result.success(newQuestionId);
  68. }
  69. /**
  70. * 删除
  71. *
  72. * @param deleteRequest
  73. * @param request
  74. * @return
  75. */
  76. @PostMapping("/delete")
  77. public Result<Boolean> deleteQuestion(@RequestBody DeleteRequest deleteRequest, HttpServletRequest request) {
  78. if (deleteRequest == null || deleteRequest.getId() <= 0) {
  79. return Result.error(ResultCode.PARAM_IS_BLANK);
  80. }
  81. long id = deleteRequest.getId();
  82. // 判断是否存在
  83. Question oldQuestion = questionService.getById(id);
  84. if(oldQuestion == null){
  85. return Result.error(ResultCode.PARAM_IS_INVALID);
  86. }
  87. //ThrowUtils.throwIf(oldQuestion == null, ErrorCode.NOT_FOUND_ERROR);
  88. // 仅本人或管理员可删除
  89. //TODO:判断是否是管理员
  90. if (false) {
  91. return Result.error(ResultCode.PERMISSION_DENIED);
  92. }
  93. boolean b = questionService.removeById(id);
  94. return Result.success(b);
  95. }
  96. /**
  97. * 根据 id 获取
  98. *
  99. * @param id
  100. * @return
  101. */
  102. @GetMapping("/get")
  103. public Result<Question> getQuestionById(long id, HttpServletRequest request) {
  104. if (id <= 0) {
  105. return Result.error(ResultCode.PARAM_IS_INVALID);
  106. }
  107. Question question = questionService.getById(id);
  108. if (question == null) {
  109. return Result.error(ResultCode.NOT_FOUND_ERROR);
  110. }
  111. //TODO:判断是否是管理员
  112. // User loginUser = userService.getLoginUser(request);
  113. // // 不是本人或管理员,不能直接获取所有信息
  114. // if (!question.getUserId().equals(loginUser.getId()) && !userService.isAdmin(loginUser)) {
  115. // throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
  116. // }
  117. return Result.success(question);
  118. }
  119. @ApiOperation(value = "根据id获取题目(封装类)")
  120. @ApiImplicitParams({
  121. @ApiImplicitParam(name = "id", value = "题目id", required = true, dataType = "long"),
  122. })
  123. @GetMapping("/get/vo")
  124. public Result<QuestionVO> getQuestionVOById(long id, HttpServletRequest request) {
  125. if (id <= 0) {
  126. return Result.error(ResultCode.PARAM_IS_INVALID);
  127. }
  128. Question question = questionService.getById(id);
  129. if (question == null) {
  130. return Result.error(ResultCode.NOT_FOUND_ERROR);
  131. }
  132. return Result.success(questionService.getQuestionVO(question, request));
  133. }
  134. @ApiOperation(value = "分页获取题目列表(封装类)")
  135. @ApiImplicitParams(
  136. @ApiImplicitParam(name = "questionQueryRequest", value = "查询条件", required = true, dataType = "QuestionQueryRequest")
  137. )
  138. @PostMapping("/list/page/vo")
  139. public Result<Page<QuestionVO>> listQuestionVOByPage(@RequestBody QuestionQueryRequest questionQueryRequest,
  140. HttpServletRequest request) {
  141. long current = questionQueryRequest.getCurrent();
  142. long size = questionQueryRequest.getPageSize();
  143. // 限制爬虫
  144. if(size > 20){
  145. return Result.error(ResultCode.PARAM_IS_INVALID);
  146. }
  147. //ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR);
  148. Page<Question> questionPage = questionService.page(new Page<>(current, size),
  149. questionService.getQueryWrapper(questionQueryRequest));
  150. return Result.success(questionService.getQuestionVOPage(questionPage, request));
  151. }
  152. @ApiOperation(value = "分页获取当前用户创建的题目列表(封装类)")
  153. @ApiImplicitParams(
  154. @ApiImplicitParam(name = "questionQueryRequest", value = "查询条件", required = true, dataType = "QuestionQueryRequest")
  155. )
  156. @PostMapping("/my/list/page/vo")
  157. public Result<Page<QuestionVO>> listMyQuestionVOByPage(@RequestBody QuestionQueryRequest questionQueryRequest,
  158. HttpServletRequest request) {
  159. if (questionQueryRequest == null) {
  160. return Result.error(ResultCode.PARAM_IS_BLANK);
  161. }
  162. // User loginUser = userService.getLoginUser(request);
  163. // questionQueryRequest.setUserId(loginUser.getId());
  164. long current = questionQueryRequest.getCurrent();
  165. long size = questionQueryRequest.getPageSize();
  166. // 限制爬虫
  167. if(size > 20){
  168. return Result.error(ResultCode.PARAM_IS_INVALID);
  169. }
  170. Page<Question> questionPage = questionService.page(new Page<>(current, size),
  171. questionService.getQueryWrapper(questionQueryRequest));
  172. return Result.success(questionService.getQuestionVOPage(questionPage, request));
  173. }
  174. @ApiOperation(value = "分页获取题目列表(仅管理员)")
  175. @ApiImplicitParams(
  176. @ApiImplicitParam(name = "questionQueryRequest", value = "查询条件", required = true, dataType = "QuestionQueryRequest")
  177. )
  178. @PostMapping("/list/page")
  179. public Result<Page<Question>> listQuestionByPage(@RequestBody QuestionQueryRequest questionQueryRequest,
  180. HttpServletRequest request) {
  181. long current = questionQueryRequest.getCurrent();
  182. long size = questionQueryRequest.getPageSize();
  183. Page<Question> questionPage = questionService.page(new Page<>(current, size),
  184. questionService.getQueryWrapper(questionQueryRequest));
  185. return Result.success(questionPage);
  186. }
  187. // endregion
  188. /**
  189. * 编辑(用户)
  190. *
  191. * @param questionEditRequest
  192. * @param request
  193. * @return
  194. */
  195. @PostMapping("/edit")
  196. public Result<Boolean> editQuestion(@RequestBody QuestionEditRequest questionEditRequest, HttpServletRequest request) {
  197. if (questionEditRequest == null || questionEditRequest.getId() <= 0) {
  198. return Result.error(ResultCode.PARAM_IS_BLANK);
  199. }
  200. Question question = new Question();
  201. BeanUtils.copyProperties(questionEditRequest, question);
  202. List<String> tags = questionEditRequest.getTags();
  203. if (tags != null) {
  204. question.setTags(GSON.toJson(tags));
  205. }
  206. List<JudgeCase> judgeCase = questionEditRequest.getJudgeCase();
  207. if (judgeCase != null) {
  208. question.setJudgeCase(GSON.toJson(judgeCase));
  209. }
  210. JudgeConfig judgeConfig = questionEditRequest.getJudgeConfig();
  211. if (judgeConfig != null) {
  212. question.setJudgeConfig(GSON.toJson(judgeConfig));
  213. }
  214. // 参数校验
  215. questionService.validQuestion(question, false);
  216. // User loginUser = userService.getLoginUser(request);
  217. // long id = questionEditRequest.getId();
  218. // 判断是否存在
  219. // Question oldQuestion = questionService.getById(id);
  220. // ThrowUtils.throwIf(oldQuestion == null, ErrorCode.NOT_FOUND_ERROR);
  221. // 仅本人或管理员可编辑
  222. // if (!oldQuestion.getUserId().equals(loginUser.getId()) && !userService.isAdmin(loginUser)) {
  223. // throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
  224. // }
  225. boolean result = questionService.updateById(question);
  226. return Result.success(result);
  227. }
  228. }