From 9afac81d92f56bfb96745af50f7795800dc24284 Mon Sep 17 00:00:00 2001
From: musteven <1009173794@qq.com>
Date: Sun, 13 Apr 2025 22:00:19 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=88=90=E7=BB=A9?=
=?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=95=8C=E9=9D=A2=E5=BD=93=E6=97=A0=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E6=97=B6=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF=E7=9A=84?=
=?UTF-8?q?bug=E3=80=81=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90=E4=BA=86?=
=?UTF-8?q?=E4=B8=8A=E4=BC=A0=E9=99=84=E4=BB=B6=E7=9A=84=E5=8A=9F=E8=83=BD?=
=?UTF-8?q?=E3=80=81=E8=B0=83=E6=95=B4=E4=BA=86=E6=8A=A5=E5=91=8A=E6=8F=90?=
=?UTF-8?q?=E4=BA=A4=E7=95=8C=E9=9D=A2=E7=9A=84=E9=83=A8=E5=88=86=E6=9F=A5?=
=?UTF-8?q?=E8=AF=A2=E9=80=BB=E8=BE=91=E3=80=82=20=E5=86=99=E4=BA=86?=
=?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=9A=82=E6=97=B6=E6=97=A0=E7=94=A8=E7=9A=84?=
=?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=96=B9=E6=B3=95=EF=BC=8C=E5=8F=AF=E4=BB=A5?=
=?UTF-8?q?=E5=90=8E=E7=BB=AD=E6=9F=A5=E7=9C=8B=E6=98=AF=E5=90=A6=E4=BD=BF?=
=?UTF-8?q?=E7=94=A8=E3=80=82=20=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?=
=?UTF-8?q?=E6=96=B9=E6=B3=95=E9=83=A8=E5=88=86=E5=86=99=E7=9A=84=E5=90=8E?=
=?UTF-8?q?=E7=AB=AF=E6=8E=A5=E5=8F=A3=E8=B2=8C=E4=BC=BC=E6=94=AF=E6=8C=81?=
=?UTF-8?q?=E5=9C=A8=E6=9C=AC=E5=9C=B0=E6=96=87=E4=BB=B6=EF=BC=88AUTO-SCOR?=
=?UTF-8?q?E=EF=BC=89=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90=E4=B8=80?=
=?UTF-8?q?=E4=B8=AAupload=E6=96=87=E4=BB=B6=E5=B9=B6=E4=B8=8A=E4=BC=A0?=
=?UTF-8?q?=E7=9B=B8=E5=BA=94=E6=96=87=E4=BB=B6=EF=BC=8C=E5=8F=AF=E4=BB=A5?=
=?UTF-8?q?=E5=90=8E=E7=BB=AD=E8=B0=83=E6=95=B4=E4=B8=8B=E8=BD=BD=E4=BD=8D?=
=?UTF-8?q?=E7=BD=AE=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
AES-front/src/api/user.js | 17 ++-
.../report-submit/components/leftparts.vue | 141 ++++++++++++++++--
.../components/report-actions.vue | 6 +-
.../report-submit/components/rightparts.vue | 2 +-
.../src/views/user/report-submit/index.vue | 55 ++-----
.../score-rank/components/personal-rank.vue | 15 +-
.../problem/controller/ProblemController.java | 17 ++-
.../controller/DownLoadFileController.java | 28 ++++
.../importClassStudentsFileController.java | 92 +++++++++++-
upload/t1_20250413215728.txt | 4 +
10 files changed, 307 insertions(+), 70 deletions(-)
create mode 100644 upload/t1_20250413215728.txt
diff --git a/AES-front/src/api/user.js b/AES-front/src/api/user.js
index 4638c04..ccb2a3d 100644
--- a/AES-front/src/api/user.js
+++ b/AES-front/src/api/user.js
@@ -34,6 +34,21 @@ export default {
getPostProblemInfo:(config) => request.get('/problem/getPostProblemInfo', config),//»ñȡµ±ǰ±¨¸沼ÖÃÐÅϢ
- findProblemById1:(config)=>request.get('/problem/findProblemById1',config)//»ñȡµ±ǰ±¨¸æ¾ßÌåÐÅϢ
+ findProblemById1:(config)=>request.get('/problem/findProblemById1',config),//»ñȡµ±ǰ±¨¸æ¾ßÌåÐÅϢ
+ getSubmitReport:(config) => request.get('/problem/getSubmitReport', config),//»ñȡѧÉúÒÑÉϴ«±¨¸æÐÅϢ
+
+ //Îļþ´¦Àí²¿·Ö
+ uploadFiles: (data) =>
+ request({
+ url: '/importClassStudentsFile/uploadFiles',
+ method: 'post',
+ data: data,
+ }), //ѧÉúÉϴ«Îļþ
+
+ downloadFile: (fileName) =>
+ request({
+ url: `/downloadFile/downloadFile/${fileName}`,
+ method: 'get',
+ }), // ÎļþÏÂÔØ
}
diff --git a/AES-front/src/views/user/report-submit/components/leftparts.vue b/AES-front/src/views/user/report-submit/components/leftparts.vue
index 6635036..18fae11 100644
--- a/AES-front/src/views/user/report-submit/components/leftparts.vue
+++ b/AES-front/src/views/user/report-submit/components/leftparts.vue
@@ -12,29 +12,59 @@
-
- 上传附件
-
+
+ 上传附件
+
+
+
+
+
+
+ 将文件拖到此处,或点击上传
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AES-front/src/views/user/report-submit/components/report-actions.vue b/AES-front/src/views/user/report-submit/components/report-actions.vue
index 0ab4a4e..0e18981 100644
--- a/AES-front/src/views/user/report-submit/components/report-actions.vue
+++ b/AES-front/src/views/user/report-submit/components/report-actions.vue
@@ -1,8 +1,8 @@
- 保存
- 保存并提交
- 申请撤回
+ 保存
+ 保存并提交
+ 申请撤回
diff --git a/AES-front/src/views/user/report-submit/components/rightparts.vue b/AES-front/src/views/user/report-submit/components/rightparts.vue
index b8f0c42..ceb56ef 100644
--- a/AES-front/src/views/user/report-submit/components/rightparts.vue
+++ b/AES-front/src/views/user/report-submit/components/rightparts.vue
@@ -27,7 +27,7 @@ const plagiarismStatus = ref(0); // 初始化抄袭状态
const getJudgeInfo = async () => {
// 查询批阅相关信息
try {
- const res = await api.getStudentRank({ params: { examId } });
+ const res = await api.getSubmitReport({ params: { examId } });
comment.value = res.data.comment; // 更新教师评语
plagiarismStatus.value = res.data.plagiarismStatus; // 更新抄袭状态
} catch (error) {
diff --git a/AES-front/src/views/user/report-submit/index.vue b/AES-front/src/views/user/report-submit/index.vue
index a566ff2..fcc365c 100644
--- a/AES-front/src/views/user/report-submit/index.vue
+++ b/AES-front/src/views/user/report-submit/index.vue
@@ -14,21 +14,20 @@
-
diff --git a/AES-front/src/views/user/score-rank/components/personal-rank.vue b/AES-front/src/views/user/score-rank/components/personal-rank.vue
index 96bc2cf..aa77a88 100644
--- a/AES-front/src/views/user/score-rank/components/personal-rank.vue
+++ b/AES-front/src/views/user/score-rank/components/personal-rank.vue
@@ -20,7 +20,7 @@ const examId = route.params.examId;
const classId = route.params.classId;
const title = ref(""); // 从API获取的作业名称
const score = ref(0); // 个人得分
-const rank = ref(0); // 个人排名
+const rank = ref("-"); // 个人排名,默认为 "-"
const totalStudents = ref(0); // 班级总人数
const paginationReactive = reactive({
@@ -53,18 +53,20 @@ const queryExamScores = async () => {
const res = await api.getStudentRank({
params: { examId }
});
+ title.value = res.data.title; // 更新作业名称
+ score.value = res.data.score; // 更新个人得分
+ rank.value = res.data.rank || "-"; // 更新个人排名,如果rank为空则显示 "-"
+};
+
+const queryClassStudents = async () => {
//查询班级总人数
const res1 = await api.getClassStudents({
params: { classId }
});
-
- title.value = res.data.title; // 更新作业名称
- score.value = res.data.score; // 更新个人得分
- rank.value = res.data.rank; // 更新个人排名
+ console.log(res1);
totalStudents.value = res1.data;// 更新班级总人数
};
-
// 行键函数
const rowKey = (rowData) => {
return rowData.id;
@@ -73,6 +75,7 @@ const rowKey = (rowData) => {
// 生命周期钩子
onMounted(() => {
queryExamScores(); // 挂载时查询成绩
+ queryClassStudents();// 同时查询班级人数
});
diff --git a/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java b/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java
index 344fff7..2258548 100644
--- a/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java
+++ b/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java
@@ -359,7 +359,22 @@ public class ProblemController {
if (ureportsubmitted != null) {
return RespBean.ok("查询成绩排名成功!", ureportsubmitted);
} else {
- return RespBean.error("查询成绩排名失败!");
+ return RespBean.error("尚未提交作业!暂时无法查看排名!");
+ }
+ }
+
+ //根据作业id和学生id获取学生当前报告成绩排名,与上一方法基本类似,处理空搜索时的输出
+ @GetMapping("/getSubmitReport")
+ public RespBean getSubmitReport(Integer examId, HttpServletRequest request) {
+ DecodeToken decodeToken = new DecodeToken(request);
+ String UserId = decodeToken.getUserId();
+ int userId = Integer.parseInt(UserId);
+ UReportSubmitted ureportsubmitted =
+ problemServiceI.findScoreAndRankByIds(examId, userId);
+ if (ureportsubmitted != null) {
+ return RespBean.ok("查询成绩排名成功!", ureportsubmitted);
+ } else {
+ return RespBean.ok("尚未提交作业!");
}
}
diff --git a/AES/src/main/java/com/example/aes/user/controller/DownLoadFileController.java b/AES/src/main/java/com/example/aes/user/controller/DownLoadFileController.java
index 0295b1a..1fe0aa4 100644
--- a/AES/src/main/java/com/example/aes/user/controller/DownLoadFileController.java
+++ b/AES/src/main/java/com/example/aes/user/controller/DownLoadFileController.java
@@ -2,10 +2,15 @@ package com.example.aes.user.controller;
import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.resource.UrlResource;
import com.example.aes.global.model.RespBean;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
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.RestController;
@@ -13,6 +18,8 @@ import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@@ -139,4 +146,25 @@ public class DownLoadFileController {
}
}
+ // 提供文件下载的方法
+ @GetMapping("/downloadFile/{fileName:.+}")
+ public ResponseEntity downloadFile(@PathVariable String fileName) {
+ try {
+ String root = System.getProperty("user.dir") + File.separator + "upload";
+ Path filePath = Paths.get(root).toAbsolutePath().normalize().resolve(fileName);
+ javax.annotation.Resource resource = (javax.annotation.Resource) new UrlResource(filePath.toUri());
+ String contentType = "application/octet-stream";
+ return ResponseEntity.ok()
+ .contentType(MediaType.parseMediaType(contentType))
+ .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.name() + "\"")
+ .body(resource);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return ResponseEntity.badRequest()
+ .body(null);
+ }
+ }
+
+
+
}
diff --git a/AES/src/main/java/com/example/aes/user/controller/importClassStudentsFileController.java b/AES/src/main/java/com/example/aes/user/controller/importClassStudentsFileController.java
index 1a26ad4..30ef793 100644
--- a/AES/src/main/java/com/example/aes/user/controller/importClassStudentsFileController.java
+++ b/AES/src/main/java/com/example/aes/user/controller/importClassStudentsFileController.java
@@ -1,6 +1,7 @@
package com.example.aes.user.controller;
import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.resource.UrlResource;
import com.example.aes.global.model.RespBean;
import com.example.aes.user.dao.AdminusersDaoI;
import com.example.aes.user.dao.ClassesDaoI;
@@ -11,19 +12,21 @@ import com.example.aes.user.model.PMUser;
import com.example.aes.user.model.Users;
import com.example.aes.user.service.UserServiceI;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
import java.io.*;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
@RestController
@@ -374,4 +377,79 @@ public class importClassStudentsFileController{
return true;
}
+ @PostMapping("/uploadFiles") // 学生上传文件并提供其URL
+ public ResponseEntity