【Java】高校防诈骗宣传平台 SpringBoot+Vue框架 计算机毕业设计项目 Idea+Navicat+MySQL安装 附源码+文档+讲解

72 阅读6分钟

一、个人简介

💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长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

💕💕文末获取源码联系计算机编程果茶熊