ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【原创】基于SpringBoot+Vue的网络安全课程学习网站(设计与实现)

【原创】基于SpringBoot+Vue的网络安全课程学习网站(设计与实现)

摘要:随着信息技术的发展,网络安全对于信息安全的发展有着非常重要的作用,因此,越来越多的计算机课程将Web安全课程作为重要的课程之一来教学。本课题通过Vue实现前后端分离的《Web安全》课程学习网站,通过Spring Boot框架实现后端开发;系统页面采用Element-Plus框架搭建,通过Axios实现前后端数据交互。系统支持用户和管理员使用,满足多种需求的在线课程学习。系统包含3种关于网络安全的学习途径,分别是在线的网络安全课程学习、模拟性的攻防演练、关于网络安全的在线练习测试功能。通过管理员角色,可将相关的网络安全课程资料发布,包括文本资料、教学视频以及资料文件下载,并可配置热门的网络攻防演练网站给用户使用。另外,也提供了题目及试卷管理,并可通过自动组卷减少试卷管理的负担。用户可在在线答题测试以后获取自己的试卷及错题信息方便回顾总结。除此以外,系统还提供可视化数据统计,方便管理员对系统有更直观的使用了解。通过智能化管理,能够让学生有一个身临其境的真实完整的网络安全课程学习过程,也有利于优化高校的专业设置,更好地提升网络信息安全教育质量,为社会培养更多优秀的网络信息安全人才。

关键词:在线答题;SpringBoot;MySQL;Vue

数据库表:16张

🍅文末获取联系🍅

作者介绍:专注计算机编程,个人开发,坚持原创,非工作室,源码全网唯一。

✅技术主流:SpringBoot + Vue 前后端分离,MySQL,可本地运行

✅配套资料:源码 + 数据库 + 实验报告/论文 + 答辩 PPT+部署演示+远程部署+问题解答

技术范围:SpringBoot、Vue、数据可视化、小程序、HLMT、Nodejs、uni-app、MySQL数据库、ElementUi等设计与开发。

适用范围:软件工程、软件技术、计算机科学与技术、大数据、云计算、JavaWeb开发、JavaEE、Java、Web应用开发、动态网页设计、小程序的毕设参考

参考论文:

功能展示

用户

管理员

数据库及架构

部分核心代码设计:

package com.java.controller; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.java.common.Constants; import com.java.common.Result; import com.java.entity.Account; import com.java.service.AdminService; import com.java.service.UserService; import com.java.utils.TokenUtils; import jakarta.annotation.Resource; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/web") public class WebController { @Resource private UserService userService; @Resource private AdminService adminService; private static final String FILE_UPLOAD_PATH = System.getProperty("user.dir") + File.separator + "/files/"; @Value("${ip:localhost}") String ip; @Value("${server.port}") String port; /** * 登录 */ @PostMapping("/login") public Result login(@RequestBody Account account){ if (StrUtil.isBlank(account.getUsername()) || StrUtil.isBlank(account.getPassword()) || StrUtil.isBlank(account.getRole())) { return Result.error(Constants.CODE_400,"参数错误"); } if(StrUtil.equals(account.getRole(),"ROLE_USER")){ account=userService.login(account); } if(StrUtil.equals(account.getRole(),"ROLE_ADMIN")){ account=adminService.login(account); } return Result.success(account); } /** * 注册 */ @PostMapping("/register") public Result register(@RequestBody Account account) { if (StrUtil.isBlank(account.getUsername()) || StrUtil.isBlank(account.getPassword()) || StrUtil.isBlank(account.getRole())) { return Result.error(Constants.CODE_400, "参数错误"); } if (StrUtil.equals(account.getRole(),"ROLE_USER")) { userService.register(account); } if (StrUtil.equals(account.getRole(),"ROLE_ADMIN")) { adminService.register(account); } return Result.success(); } /** * 修改密码 */ @PostMapping("/password") public Result updatePassword(@RequestBody Account account) { Account tokenaccount = TokenUtils.getCurrentUser(); account.setUsername(tokenaccount.getUsername()); if (StrUtil.equals(tokenaccount.getRole(),"ROLE_USER")) { userService.updatePassword(account); } if (StrUtil.equals(tokenaccount.getRole(),"ROLE_ADMIN")) { adminService.updatePassword(account); } return Result.success(); } /** * 获取用户信息 */ @GetMapping("/userInfo") public Result userInfo() { Account account = TokenUtils.getCurrentUser(); if (StrUtil.equals(account.getRole(),"ROLE_USER")) { return Result.success(userService.getById(account.getId())); } if (StrUtil.equals(account.getRole(),"ROLE_ADMIN")) { return Result.success(adminService.getById(account.getId())); } return Result.error(Constants.CODE_605,"获取用户信息失败"); } /** * wang-editor编辑器文件上传接口 * * @param file 前端传递过来的文件 */ @PostMapping("/wangeditor_upload") public Map<String, Object> wangeditor_upload(@RequestParam MultipartFile file) throws IOException { String originalFilename = file.getOriginalFilename(); String type = FileUtil.extName(originalFilename); // 定义一个文件唯一的标识码 String fileUUID = IdUtil.fastSimpleUUID() + StrUtil.DOT + type; File uploadFile = new File(FILE_UPLOAD_PATH + fileUUID); // 判断配置的文件目录是否存在,若不存在则创建一个新的文件目录 File parentFile = uploadFile.getParentFile(); if (!parentFile.exists()) { parentFile.mkdirs(); } // 文件保存到磁盘 file.transferTo(uploadFile); // 拼接文件地址 String url = "http://"+ip+":"+port+"/web/download/" + fileUUID; Map<String, Object> resMap = new HashMap<>(); // wangEditor上传图片成功后, 需要返回的参数 resMap.put("errno", 0); resMap.put("data", CollUtil.newArrayList(Dict.create().set("url", url))); return resMap; } /** * 文件上传接口 * * @param file 前端传递过来的文件 */ @PostMapping("/upload") public String upload(@RequestParam MultipartFile file) throws IOException { String originalFilename = file.getOriginalFilename(); String type = FileUtil.extName(originalFilename); // 定义一个文件唯一的标识码 String fileUUID = IdUtil.fastSimpleUUID() + StrUtil.DOT + type; File uploadFile = new File(FILE_UPLOAD_PATH + fileUUID); // 判断配置的文件目录是否存在,若不存在则创建一个新的文件目录 File parentFile = uploadFile.getParentFile(); if (!parentFile.exists()) { parentFile.mkdirs(); } // 文件保存到磁盘 file.transferTo(uploadFile); // 拼接文件地址 String url = "http://"+ip+":"+port+"/web/download/" + fileUUID; // 返回文件地址 return url; } /** * 文件下载/预览接口 * 视频、图片、音频使用 inline 便于页面内播放/展示;其他文件仍按附件下载 */ @GetMapping("/download/{fileUUID}") public void download(@PathVariable String fileUUID, HttpServletResponse response) throws IOException { File uploadFile = new File(FILE_UPLOAD_PATH + fileUUID); if (!uploadFile.exists()) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } String ext = FileUtil.extName(fileUUID).toLowerCase(); String contentType = resolveContentType(ext); boolean inline = isInlineMedia(ext); ServletOutputStream os = response.getOutputStream(); String disposition = inline ? "inline" : "attachment"; response.setHeader("Content-Disposition", disposition + ";filename=" + URLEncoder.encode(fileUUID, "UTF-8")); response.setContentType(contentType); try { os.write(FileUtil.readBytes(uploadFile)); } catch (Exception e) { System.err.println("文件下载失败,文件不存在"); } os.flush(); os.close(); } private boolean isInlineMedia(String ext) { return CollUtil.newArrayList( "mp4", "webm", "ogg", "mov", "avi", "m4v", "jpg", "jpeg", "png", "gif", "webp", "bmp", "svg", "mp3", "wav", "aac" ).contains(ext); } private String resolveContentType(String ext) { return switch (ext) { case "mp4", "m4v" -> "video/mp4"; case "webm" -> "video/webm"; case "ogg" -> "video/ogg"; case "mov" -> "video/quicktime"; case "avi" -> "video/x-msvideo"; case "jpg", "jpeg" -> "image/jpeg"; case "png" -> "image/png"; case "gif" -> "image/gif"; case "webp" -> "image/webp"; case "bmp" -> "image/bmp"; case "svg" -> "image/svg+xml"; case "mp3" -> "audio/mpeg"; case "wav" -> "audio/wav"; case "aac" -> "audio/aac"; case "pdf" -> "application/pdf"; default -> "application/octet-stream"; }; } }

获取联系

擅长:功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文降重、长期答辩答疑辅导、腾讯会议一对一专业讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路等。

项目功能完整,可在本地运行,并可远程调试,确保运行顺利!

获取联系方式👇🏻👇🏻👇🏻👇🏻

毕业设计获取https://blog.csdn.net/qq_59059632/article/details/163759879?spm=1011.2415.3001.5331

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进