完成查重算法对数据库的修改操作,定义当最相似的文章相似度大于0.3后就存入数据库。

开始做异步。
This commit is contained in:
musteven 2025-04-20 14:30:03 +08:00
parent 3794933261
commit 621b40fb5e
8 changed files with 70 additions and 14 deletions

View File

@ -134,10 +134,13 @@ const checkPlagiarism = async () => {
try{ try{
// 获取文件名 // 获取文件名
const attachment = props.attachment; const attachment = props.attachment;
const submitReport = {//只需要附件信息 const adminuserId =props.adminuserId;
const problemId = ProblemId;
const submitReport = {
adminuserId,
problemId,
attachment attachment
}; };
console.log(submitReport);
// 调用查重接口 // 调用查重接口
const res = await api.runPlagiarism(submitReport); const res = await api.runPlagiarism(submitReport);

View File

@ -9,11 +9,13 @@ import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import com.example.aes.global.model.DecodeToken;
import com.example.aes.global.model.RespBean; import com.example.aes.global.model.RespBean;
import com.example.aes.problem.model.PMScoringRubric; import com.example.aes.problem.model.PMScoringRubric;
import com.example.aes.problem.model.PlagiarismResult; import com.example.aes.problem.model.PlagiarismResult;
import com.example.aes.problem.model.SubmitReport; import com.example.aes.problem.model.SubmitReport;
import com.example.aes.problem.service.PlagiarismServiceI; import com.example.aes.problem.service.PlagiarismServiceI;
import com.example.aes.problem.service.ProblemServiceI;
import com.hankcs.hanlp.HanLP; import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.seg.common.Term; import com.hankcs.hanlp.seg.common.Term;
import com.hankcs.hanlp.tokenizer.IndexTokenizer; import com.hankcs.hanlp.tokenizer.IndexTokenizer;
@ -35,6 +37,8 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
@RestController @RestController
@RequestMapping("/plagiarism") @RequestMapping("/plagiarism")
@Transactional @Transactional
@ -43,8 +47,15 @@ public class PlagiarismController {
@Autowired @Autowired
private PlagiarismServiceI plagiarismServiceI; private PlagiarismServiceI plagiarismServiceI;
@Autowired
private ProblemServiceI problemServiceI;
@PostMapping("/runPlagiarism") @PostMapping("/runPlagiarism")
public RespBean runPlagiarism(@RequestBody SubmitReport submitReport) { public RespBean runPlagiarism(@RequestBody SubmitReport submitReport, HttpServletRequest request) {
DecodeToken decodeToken = new DecodeToken(request);
String UserId = decodeToken.getUserId();
int userId = Integer.parseInt(UserId);
submitReport.setStudentId(userId);
// 构建文件路径 // 构建文件路径
String uploadDirectory = System.getProperty("user.dir") + File.separator + "upload"; String uploadDirectory = System.getProperty("user.dir") + File.separator + "upload";
Path filePath = Paths.get(uploadDirectory,submitReport.getAttachment()); Path filePath = Paths.get(uploadDirectory,submitReport.getAttachment());
@ -53,12 +64,20 @@ public class PlagiarismController {
if (!Files.exists(filePath)) { if (!Files.exists(filePath)) {
return RespBean.error("文件不存在"); return RespBean.error("文件不存在");
} }
// 调用Service层进行查重 // 调用Service层进行查重
PlagiarismResult result = plagiarismServiceI.checkPlagiarism(filePath.toString(), uploadDirectory); PlagiarismResult result = plagiarismServiceI.checkPlagiarism(filePath.toString(), uploadDirectory);
submitReport.setSimilardocs(result.getArticleName());
submitReport.setSimularity(result.getSimilarity());
if(result.getSimilarity()>0.3){//如果文章相似度大于0.3,判定为疑似抄袭并保存到数据库中
submitReport.setPlagiarismStatus("疑似抄袭");
}
boolean saveresult = problemServiceI.savePlagiarismResultToProps(submitReport);
// 返回查重结果 // 返回查重结果
if (result != null) { if (result != null) {
return RespBean.ok("查重成功",result); return RespBean.ok("查重成功",saveresult);
} else { } else {
return RespBean.error("查重失败"); return RespBean.error("查重失败");
} }

View File

@ -25,4 +25,5 @@ public interface SubmitReportDaoI extends BaseDaoI<SubmitReport> {
public boolean updateReportSubmittedForSubmission(SubmitReport submitReport); public boolean updateReportSubmittedForSubmission(SubmitReport submitReport);
public boolean withdrawReportSubmitted(SubmitReport submitReport); public boolean withdrawReportSubmitted(SubmitReport submitReport);
public String getReportSubmittedStatus(SubmitReport submitReport); public String getReportSubmittedStatus(SubmitReport submitReport);
public boolean savePlagiarismResult(SubmitReport submitReport);
} }

View File

@ -377,4 +377,31 @@ public class SubmitReportDaoImpl extends BaseDaoImpl<SubmitReport> implements Su
} }
return submissionStatus; return submissionStatus;
} }
@Override
public boolean savePlagiarismResult(SubmitReport submitReport) {
Session session = this.getCurrentSession();
try {
String hql = "UPDATE SubmitReport SET plagiarismStatus = :plagiarismStatus, " +
"simularity = :simularity, " +
"similardocs = :similardocs " +
"WHERE problemId = :problemId " +
"AND adminuserId = :adminuserId " +
"AND studentId = :studentId";
Query query = session.createQuery(hql);
query.setParameter("plagiarismStatus", submitReport.getPlagiarismStatus());
query.setParameter("simularity", submitReport.getSimularity());
query.setParameter("similardocs", submitReport.getSimilardocs());
query.setParameter("problemId", submitReport.getProblemId());
query.setParameter("adminuserId", submitReport.getAdminuserId());
query.setParameter("studentId", submitReport.getStudentId());
int result = query.executeUpdate();
return result > 0;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
} }

View File

@ -6,9 +6,9 @@ import lombok.Data;
public class PlagiarismResult {//用于存放查重算法的结果(最大值) public class PlagiarismResult {//用于存放查重算法的结果(最大值)
private String articleName; private String articleName;
private double similarity; private Float similarity;
public PlagiarismResult(String articleName, double similarity) { public PlagiarismResult(String articleName, Float similarity) {
this.articleName = articleName; this.articleName = articleName;
this.similarity = similarity; this.similarity = similarity;
} }

View File

@ -39,7 +39,7 @@ public class PlagiarismServiceImpl implements PlagiarismServiceI {
// 读取upload目录下的所有文件 // 读取upload目录下的所有文件
List<Path> filePaths = listFilesInDirectory(uploadDirectory); List<Path> filePaths = listFilesInDirectory(uploadDirectory);
double highestSimilarity = 0.0; Float highestSimilarity = (float)0.0;
String similarFileName = ""; String similarFileName = "";
// 遍历每个文件 // 遍历每个文件
@ -105,7 +105,7 @@ public class PlagiarismServiceImpl implements PlagiarismServiceI {
} }
// 计算整体相似度 // 计算整体相似度
double similarity = totalSimilarityChars / totalChars; Float similarity = (float)totalSimilarityChars / totalChars;
if (similarity > highestSimilarity) { if (similarity > highestSimilarity) {
highestSimilarity = similarity; highestSimilarity = similarity;
similarFileName = path.getFileName().toString(); similarFileName = path.getFileName().toString();

View File

@ -516,6 +516,11 @@ public int redoReport(PMReviewMessage pmReviewMessage){
return studentSubmitDao.getReportSubmittedStatus(submitReport); return studentSubmitDao.getReportSubmittedStatus(submitReport);
} }
@Override
public boolean savePlagiarismResultToProps(SubmitReport submitReport) {
return studentSubmitDao.savePlagiarismResult(submitReport);
}
@Override @Override
public int editPostProblem(int classId, public int editPostProblem(int classId,
int problemId,LocalDateTime startTime,LocalDateTime endTime,boolean allow){ int problemId,LocalDateTime startTime,LocalDateTime endTime,boolean allow){

View File

@ -56,10 +56,11 @@ public interface ProblemServiceI {
public List<Float> findScoreList(PMStudentSubmit pmStudentSubmit); public List<Float> findScoreList(PMStudentSubmit pmStudentSubmit);
public int findNextId(int problemId); public int findNextId(int problemId);
boolean saveSubmitInfoToProps(SubmitReport submitReport);//学生保存报告(保存,之前未保存过) public boolean saveSubmitInfoToProps(SubmitReport submitReport);//学生保存报告(保存,之前未保存过)
boolean findReportSubmitted(SubmitReport submitReport);//查询该学生之前是否已经提交过该问题的报告 public boolean findReportSubmitted(SubmitReport submitReport);//查询该学生之前是否已经提交过该问题的报告
boolean updateSubmitInfoToProps(SubmitReport submitReport);//学生更新报告信息(保存,之前保存过) public boolean updateSubmitInfoToProps(SubmitReport submitReport);//学生更新报告信息(保存,之前保存过)
boolean updateSubmitInfoForSubmission(SubmitReport submitReport);//学生提交报告 public boolean updateSubmitInfoForSubmission(SubmitReport submitReport);//学生提交报告
boolean withdrawSubmitInfo(SubmitReport submitReport);//学生撤回报告 public boolean withdrawSubmitInfo(SubmitReport submitReport);//学生撤回报告
String findReportSubmittedStatus(SubmitReport submitReport);//查询该学生之前已经提交过该问题的报告状态 public String findReportSubmittedStatus(SubmitReport submitReport);//查询该学生之前已经提交过该问题的报告状态
public boolean savePlagiarismResultToProps(SubmitReport submitReport);//保存查重信息
} }