一、个人简介
💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 计算机毕业设计选题 💕💕文末获取源码联系计算机编程果茶熊
二、系统介绍
开发语言:Java+Python 数据库:MySQL 系统架构:B/S 后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django 前端:Vue+HTML+CSS+JavaScript+jQuery
高校防诈骗宣传平台是一款面向高校师生的反诈骗教育与宣传系统,采用Spring Boot作为后端技术框架,结合Vue前端与MySQL数据库构建而成。系统以提升高校群体的防诈骗意识和识别能力为核心目标,通过诈骗类型管理模块对各类诈骗手段进行分类整理,包括网络兼职诈骗、刷单诈骗、冒充熟人诈骗、校园贷诈骗等常见类型。平台设置了知识分类管理与科普知识管理功能,管理员可以按照不同主题发布防诈骗知识文章、安全提示、预防措施等科普内容,用户通过学习进度管理模块记录自己的学习轨迹和完成情况。诈骗案例管理模块收录了真实的诈骗案例,通过案例剖析帮助用户了解诈骗分子的作案手法和话术套路,增强实战识别能力。反诈测试管理功能提供在线答题测验,配合试题管理模块构建题库,用户可以通过测试检验自己的防诈骗知识掌握程度,系统自动生成测试成绩和错题分析。交流论坛管理与论坛分类管理为用户搭建了互动交流空间,师生可以在论坛中分享防诈骗经验、讨论可疑情况、提醒他人注意安全,举报记录管理允许用户举报可疑信息或不当内容,留言板管理则为用户提供向平台管理员咨询和反馈的渠道,形成了集知识学习、案例教育、能力测试、互动交流于一体的综合性反诈骗宣传教育平台。
三、视频解说
四、部分功能展示
五、部分代码展示
/**
* 反诈测试管理 - 生成并提交测试
* 根据用户选择的诈骗类型和难度级别生成测试题目,处理用户答题并自动评分
*/
@PostMapping("/generateTest")
public Result generateTest(@RequestParam String fraudTypes, @RequestParam Integer difficulty,
@RequestParam Integer questionCount, HttpSession session) {
User currentUser = (User) session.getAttribute("user");
if (currentUser == null) {
return Result.error("用户未登录");
}
// 参数校验
if (questionCount < 5 || questionCount > 50) {
return Result.error("题目数量应在5-50之间");
}
if (difficulty < 1 || difficulty > 3) {
return Result.error("难度级别错误");
}
// 解析诈骗类型
String[] fraudTypeArray = fraudTypes.split(",");
if (fraudTypeArray.length == 0) {
return Result.error("请至少选择一个诈骗类型");
}
// 检查用户是否有未完成的测试
QueryWrapper<AntiScamTest> unfinishedWrapper = new QueryWrapper<>();
unfinishedWrapper.eq("user_id", currentUser.getId())
.eq("test_status", 0); // 0进行中
AntiScamTest unfinishedTest = antiScamTestMapper.selectOne(unfinishedWrapper);
if (unfinishedTest != null) {
return Result.error("您有未完成的测试,请先完成或放弃后再生成新测试");
}
// 从题库中按类型和难度抽取题目
List<Question> selectedQuestions = new ArrayList<>();
int questionsPerType = questionCount / fraudTypeArray.length;
int remainingQuestions = questionCount % fraudTypeArray.length;
for (int i = 0; i < fraudTypeArray.length; i++) {
String fraudType = fraudTypeArray[i].trim();
int currentTypeCount = questionsPerType + (i < remainingQuestions ? 1 : 0);
QueryWrapper<Question> questionWrapper = new QueryWrapper<>();
questionWrapper.eq("fraud_type", fraudType)
.eq("difficulty", difficulty)
.eq("status", 1) // 已启用
.orderByAsc("RAND()") // 随机排序
.last("LIMIT " + currentTypeCount);
List<Question> typeQuestions = questionMapper.selectList(questionWrapper);
if (typeQuestions.size() < currentTypeCount) {
return Result.error("诈骗类型[" + fraudType + "]的题目数量不足,请减少题目数量或选择其他类型");
}
selectedQuestions.addAll(typeQuestions);
}
// 创建测试记录
AntiScamTest test = new AntiScamTest();
test.setUserId(currentUser.getId());
test.setUserName(currentUser.getUsername());
test.setFraudTypes(fraudTypes);
test.setDifficulty(difficulty);
test.setQuestionCount(questionCount);
test.setTestStatus(0); // 进行中
test.setCreateTime(new Date());
test.setTestNo("TEST" + System.currentTimeMillis() + RandomUtil.randomNumbers(4));
test.setTimeLimit(questionCount * 2); // 每题2分钟
int insertResult = antiScamTestMapper.insert(test);
if (insertResult > 0) {
// 保存测试题目关联
for (int i = 0; i < selectedQuestions.size(); i++) {
Question question = selectedQuestions.get(i);
TestQuestion testQuestion = new TestQuestion();
testQuestion.setTestId(test.getId());
testQuestion.setQuestionId(question.getId());
testQuestion.setQuestionOrder(i + 1);
testQuestion.setScore(difficulty == 1 ? 2 : (difficulty == 2 ? 3 : 5)); // 根据难度设置分值
testQuestionMapper.insert(testQuestion);
}
// 组装返回数据
Map<String, Object> resultData = new HashMap<>();
resultData.put("testId", test.getId());
resultData.put("testNo", test.getTestNo());
resultData.put("questions", selectedQuestions);
resultData.put("timeLimit", test.getTimeLimit());
return Result.success("测试生成成功", resultData);
}
return Result.error("生成测试失败");
}
/**
* 反诈测试管理 - 提交测试答案并评分
* 处理用户提交的测试答案,自动评分并生成成绩报告和错题分析
*/
@PostMapping("/submitTest")
public Result submitTest(@RequestParam Long testId, @RequestBody Map<Long, String> answers, HttpSession session) {
User currentUser = (User) session.getAttribute("user");
if (currentUser == null) {
return Result.error("用户未登录");
}
// 查询测试记录
AntiScamTest test = antiScamTestMapper.selectById(testId);
if (test == null) {
return Result.error("测试不存在");
}
if (!test.getUserId().equals(currentUser.getId())) {
return Result.error("无权操作该测试");
}
if (test.getTestStatus() != 0) {
return Result.error("测试已结束,无法重复提交");
}
// 检查是否超时
long createTime = test.getCreateTime().getTime();
long currentTime = System.currentTimeMillis();
long elapsedMinutes = (currentTime - createTime) / (60 * 1000);
if (elapsedMinutes > test.getTimeLimit()) {
test.setTestStatus(2); // 已超时
test.setSubmitTime(new Date());
antiScamTestMapper.updateById(test);
return Result.error("测试已超时,成绩无效");
}
// 查询测试题目
QueryWrapper<TestQuestion> tqWrapper = new QueryWrapper<>();
tqWrapper.eq("test_id", testId).orderByAsc("question_order");
List<TestQuestion> testQuestions = testQuestionMapper.selectList(tqWrapper);
if (answers.size() != testQuestions.size()) {
return Result.error("请完成所有题目后再提交");
}
// 评分处理
int totalScore = 0;
int correctCount = 0;
List<Map<String, Object>> wrongQuestions = new ArrayList<>();
for (TestQuestion tq : testQuestions) {
Question question = questionMapper.selectById(tq.getQuestionId());
String userAnswer = answers.get(tq.getQuestionId());
if (userAnswer == null || userAnswer.trim().isEmpty()) {
// 未作答
Map<String, Object> wrongInfo = new HashMap<>();
wrongInfo.put("questionId", question.getId());
wrongInfo.put("questionContent", question.getContent());
wrongInfo.put("userAnswer", "未作答");
wrongInfo.put("correctAnswer", question.getCorrectAnswer());
wrongInfo.put("analysis", question.getAnalysis());
wrongQuestions.add(wrongInfo);
continue;
}
// 判断答案正确性
boolean isCorrect = false;
if (question.getQuestionType() == 1) {
// 单选题或判断题,精确匹配
isCorrect = userAnswer.equalsIgnoreCase(question.getCorrectAnswer().trim());
} else if (question.getQuestionType() == 2) {
// 多选题,需要选项完全匹配
String[] userOptions = userAnswer.split(",");
String[] correctOptions = question.getCorrectAnswer().split(",");
Arrays.sort(userOptions);
Arrays.sort(correctOptions);
isCorrect = Arrays.equals(userOptions, correctOptions);
}
if (isCorrect) {
totalScore += tq.getScore();
correctCount++;
} else {
Map<String, Object> wrongInfo = new HashMap<>();
wrongInfo.put("questionId", question.getId());
wrongInfo.put("questionContent", question.getContent());
wrongInfo.put("userAnswer", userAnswer);
wrongInfo.put("correctAnswer", question.getCorrectAnswer());
wrongInfo.put("analysis", question.getAnalysis());
wrongInfo.put("fraudType", question.getFraudType());
wrongQuestions.add(wrongInfo);
}
// 保存用户答题记录
UserAnswer userAnswerRecord = new UserAnswer();
userAnswerRecord.setTestId(testId);
userAnswerRecord.setUserId(currentUser.getId());
userAnswerRecord.setQuestionId(question.getId());
userAnswerRecord.setUserAnswer(userAnswer);
userAnswerRecord.setCorrectAnswer(question.getCorrectAnswer());
userAnswerRecord.setIsCorrect(isCorrect ? 1 : 0);
userAnswerRecord.setScore(isCorrect ? tq.getScore() : 0);
userAnswerMapper.insert(userAnswerRecord);
}
// 计算总分和正确率
int maxTotalScore = testQuestions.stream().mapToInt(TestQuestion::getScore).sum();
double accuracy = (double) correctCount / testQuestions.size() * 100;
// 更新测试记录
test.setTestStatus(1); // 已完成
test.setSubmitTime(new Date());
test.setTotalScore(totalScore);
test.setMaxScore(maxTotalScore);
test.setCorrectCount(correctCount);
test.setWrongCount(testQuestions.size() - correctCount);
test.setAccuracy(new BigDecimal(accuracy).setScale(2, RoundingMode.HALF_UP));
test.setUsedTime((int) elapsedMinutes);
antiScamTestMapper.updateById(test);
// 更新用户学习统计
UserStatistics statistics = userStatisticsMapper.selectOne(new QueryWrapper<UserStatistics>().eq("user_id", currentUser.getId()));
if (statistics == null) {
statistics = new UserStatistics();
statistics.setUserId(currentUser.getId());
statistics.setTestCount(1);
statistics.setTotalScore(totalScore);
statistics.setBestScore(totalScore);
userStatisticsMapper.insert(statistics);
} else {
statistics.setTestCount(statistics.getTestCount() + 1);
statistics.setTotalScore(statistics.getTotalScore() + totalScore);
if (totalScore > statistics.getBestScore()) {
statistics.setBestScore(totalScore);
}
userStatisticsMapper.updateById(statistics);
}
// 生成成绩报告
Map<String, Object> reportData = new HashMap<>();
reportData.put("testNo", test.getTestNo());
reportData.put("score", totalScore);
reportData.put("maxScore", maxTotalScore);
reportData.put("accuracy", accuracy);
reportData.put("correctCount", correctCount);
reportData.put("wrongCount", testQuestions.size() - correctCount);
reportData.put("wrongQuestions", wrongQuestions);
reportData.put("usedTime", elapsedMinutes);
// 生成评价
String evaluation;
if (accuracy >= 90) {
evaluation = "优秀!您的防诈骗意识很强,继续保持警惕";
} else if (accuracy >= 80) {
evaluation = "良好!基本掌握了防诈骗知识,建议复习错题巩固";
} else if (accuracy >= 60) {
evaluation = "及格!还需要加强学习,特别注意错题涉及的诈骗类型";
} else {
evaluation = "不及格!防诈骗意识较弱,请认真学习科普知识和案例";
}
reportData.put("evaluation", evaluation);
return Result.success("测试提交成功", reportData);
}
六、部分文档展示
七、END
💕💕文末获取源码联系计算机编程果茶熊