Browse Source

添加频繁提交检测

westt 2 years ago
parent
commit
9f6c6d807c

+ 5 - 3
src/main/java/com/example/onlinejudge/controller/JudgeController.java

@@ -24,10 +24,12 @@ public class JudgeController {
 
         return Result.success();
     }
-    @RequestMapping("/submitCode")
+    @PostMapping("/submitCode")
     public Result submitCode(@RequestParam("code") String code,
                              @RequestParam("questionId") String questionID,
-                             @RequestParam("language")String language) {
-        return questionService.receiveCode(Long.parseLong(questionID), code, language);
+                             @RequestParam("language")String language,
+                             @RequestParam(defaultValue = "", value = "userCases") String userCases,
+                             @RequestParam(value = "judgeMode") Integer judgeMode) {
+        return questionService.receiveCode(Long.parseLong(questionID), code, language, userCases, judgeMode);
     }
 }

+ 2 - 1
src/main/java/com/example/onlinejudge/controller/UserController.java

@@ -6,6 +6,7 @@ import com.example.onlinejudge.model.entity.result.Result;
 import com.example.onlinejudge.service.UserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
@@ -25,7 +26,7 @@ public class UserController {
      * @param password 用户密码
      * @return 用户bean
      */
-    @RequestMapping("/api/login/{username}/{password}")
+    @GetMapping("/api/login/{username}/{password}")
     @ResponseBody
     public Result login(@PathVariable("username") String username,
                         @PathVariable("password") String password) {

+ 14 - 0
src/main/java/com/example/onlinejudge/model/entity/QuestionSubmit.java

@@ -63,6 +63,20 @@ public class QuestionSubmit {
     private Date updateTime;
 
     /**
+     * 用户自测用例
+     */
+    private String userCases;
+
+    /**
+     * 用户自测用例的输出
+     */
+    private String output;
+    /**
+     * 判断模式 (0 - 系统用例判别 1 - 用户自测用例判别)
+     */
+    private Integer judgeMode;
+
+    /**
      * 是否删除
      */
     @TableLogic

+ 18 - 1
src/main/java/com/example/onlinejudge/service/QuestionService.java

@@ -3,5 +3,22 @@ package com.example.onlinejudge.service;
 import com.example.onlinejudge.model.entity.result.Result;
 
 public interface QuestionService {
-    Result receiveCode(Long questionID, String code, String language);
+    /**
+     * 接受用户提交的解决方案
+     * @param questionID 问题id
+     * @param code 用户提交的代码
+     * @param language 使用的语言
+     * @param userCases 用户自测用例
+     * @param judgeMode 判断模式
+     * @return
+     */
+    Result receiveCode(Long questionID, String code, String language, String userCases, Integer judgeMode);
+
+    /**
+     * 判断本次用户提交的解决方案是否合法
+     * @param userId 用户id
+     * @param questionID wentiid
+     * @return
+     */
+    boolean checkIsSubmitValid(Long userId, Long questionID);
 }

+ 46 - 3
src/main/java/com/example/onlinejudge/service/impl/QuestionServiceImpl.java

@@ -1,6 +1,7 @@
 package com.example.onlinejudge.service.impl;
 
 import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.example.onlinejudge.mapper.QuestionSubmitMapper;
 import com.example.onlinejudge.model.entity.QuestionSubmit;
 import com.example.onlinejudge.model.entity.result.Result;
@@ -20,10 +21,12 @@ public class QuestionServiceImpl implements QuestionService {
     private QuestionSubmitMapper questionSubmitMapper;
 
     @Override
-    public Result receiveCode(Long questionID, String code, String language) {
+    public Result receiveCode(Long questionID, String code, String language, String userCases, Integer judgeMode) {
         Long userID = StpUtil.getLoginIdAsLong();
         if (questionID == null)
-            return  Result.error(ResultCode.PARAM_IS_INVALID);
+            return Result.error(ResultCode.PARAM_IS_INVALID);
+        if (!checkIsSubmitValid(userID, questionID))
+            return Result.error(ResultCode.SYSTEM_ERROR.getCode(), "频繁提交,请稍后再试");
         String chooseLanguage;
         if ("java".equals(language) || "Java".equals(language) || "JAVA".equals(language)) {
             chooseLanguage = QuestionSubmitLanguageEnum.JAVA.getValue();
@@ -34,10 +37,50 @@ public class QuestionServiceImpl implements QuestionService {
         } else {
             chooseLanguage = QuestionSubmitLanguageEnum.JAVA.getValue();
         }
-        QuestionSubmit questionSubmit = new QuestionSubmit(null, chooseLanguage, code, JudgeInfoMessageEnum.WAITING.getValue(), 0, questionID, userID, new Date(), new Date(), 0);
+        QuestionSubmit questionSubmit;
+        if (judgeMode == 0) {
+            questionSubmit = new QuestionSubmit(
+                    null,
+                    chooseLanguage,
+                    code,
+                    JudgeInfoMessageEnum.WAITING.getValue(),
+                    0, questionID, userID,
+                    new Date(),
+                    new Date(),
+                    null,
+                    null,
+                    0,
+                    0);
+        } else {
+            questionSubmit = new QuestionSubmit(
+                    null,
+                    chooseLanguage,
+                    code,
+                    JudgeInfoMessageEnum.WAITING.getValue(),
+                    0, questionID, userID,
+                    new Date(),
+                    new Date(),
+                    userCases,
+                    null,
+                    1,
+                    0);
+        }
         questionSubmitMapper.insert(questionSubmit);
         System.out.println(questionSubmit);
         // TODO: 1.提交代码到判题系统 2.更改数据库刷新状态 3.返回判题信息
         return Result.success();
     }
+
+    @Override
+    public boolean checkIsSubmitValid(Long userId, Long questionID) {
+        QueryWrapper<QuestionSubmit> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", userId).orderByDesc("create_time").last("limit 1");
+        QuestionSubmit record = questionSubmitMapper.selectOne(queryWrapper);
+        System.out.println(record);
+        if (record == null) {
+            return true;
+        } else if (record.getStatus() == 0 || record.getStatus() == 1) {
+            return false;
+        } else return System.currentTimeMillis() - record.getCreateTime().getTime() >= 2000;
+    }
 }