基于Springboot实现专业认证材料管理系统
一,项目简介
这是一个基于java的毕业设计项目,毕设课题为springboot框架的知识产权服务平台系统, 是一个采用b/s结构的javaweb项目, 开发工具eclipsei/eclipse, 项目框架jsp+springboot+mybatis, 知识产权服务平台系统采用mysql进行数据存储, 并基于mybatis进行了orm实体关系映射, 该知识产权服务平台系统系统通过模块化实现,支持多角色权限管理系统, 提升了管理效率, 知识产权服务平台系统参考文献可见附件中的毕业论文与毕设源码
该知识产权服务平台系统项目采用mvc设计模式, 其中知识产权服务平台系统的视图与知识产权服务平台系统业务逻辑进行了分层设计, 特别方便后续知识产权服务平台系统系统的开发
设计这种mvc的架构的好处是完全的可以将业务进行分层, 进行高内聚低耦合, 分为service层, dao层, controller层, 架构清晰
本项目主要基于Springboot 和ruoyi来开发一套专业认证材料管理系统,对各专业相关的文档材料进行管理,主要包含的功能模块有:
系统管理:用户管理、角色管理、菜单管理、操作日志
业务模块:专业管理、认证材料管理、相关网站管理
二,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
开发技术:Springboot+ruoyi+bootstrap
三,系统展示
用户登陆:
用户注册:
用户管理
角色管理
菜单管理
操作管理
专业管理
认证材料管理
相关网站
个人中心
修改密码
四,核心代码展示
package com.code.project.common;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.multipart.MultipartFile;import com.code.common.constant.Constants;import com.code.common.utils.StringUtils;import com.code.common.utils.file.FileUploadUtils;import com.code.common.utils.file.FileUtils;import com.code.common.utils.security.ShiroUtils;import com.code.framework.config.RuoYiConfig;import com.code.framework.config.ServerConfig;import com.code.framework.web.domain.AjaxResult;/ * 通用请求处理 * * @author ruoyi */@Controllerpublic class CommonController{ private static final Logger log = LoggerFactory.getLogger(CommonController.class); @Autowired private ServerConfig serverConfig; / * 通用下载请求 * * @param fileName 文件名称 * @param delete 是否删除 */ @GetMapping("common/download") public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) { try { if (!FileUtils.isValidFilename(fileName)) { throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); } String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); String filePath = System.getProperty("user.dir").replace('\\','/')+RuoYiConfig.getDownloadPath() + fileName; System.out.println(filePath); response.setCharacterEncoding("utf-8"); response.setContentType("multipart/form-data"); response.setHeader("Content-Disposition", "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, realFileName)); FileUtils.writeBytes(filePath, response.getOutputStream()); if (delete) { FileUtils.deleteFile(filePath); } } catch (Exception e) { log.error("下载文件失败", e); } } / * 通用上传请求 */ @PostMapping("/common/upload") @ResponseBody public AjaxResult uploadFile(MultipartFile file) throws Exception { try { // 上传文件路径 String filePath = System.getProperty("user.dir").replace('\\','/')+RuoYiConfig.getUploadPath(); System.out.println(filePath); // 上传并返回新文件名称 String fileName = FileUploadUtils.upload(filePath, file); String url = serverConfig.getUrl() + fileName; AjaxResult ajax = AjaxResult.success(); ajax.put("fileName", fileName); ajax.put("url", url); return ajax; } catch (Exception e) { return AjaxResult.error(e.getMessage()); } } / * 本地资源通用下载 */ @GetMapping("/common/download/resource") public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) throws Exception { // 本地资源路径 String localPath = System.getProperty("user.dir").replace('\\','/')+RuoYiConfig.getProfile(); // 数据库资源地址 String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); // 下载名称 String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); response.setCharacterEncoding("utf-8"); response.setContentType("multipart/form-data"); response.setHeader("Content-Disposition", "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, downloadName)); FileUtils.writeBytes(downloadPath, response.getOutputStream()); }}
package com.code.project.monitor.online.controller;import java.util.List;import org.apache.shiro.authz.annotation.RequiresPermissions;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.code.common.utils.security.ShiroUtils;import com.code.framework.aspectj.lang.annotation.Log;import com.code.framework.aspectj.lang.enums.BusinessType;import com.code.framework.shiro.session.OnlineSessionDAO;import com.code.framework.web.controller.BaseController;import com.code.framework.web.domain.AjaxResult;import com.code.framework.web.page.TableDataInfo;import com.code.project.monitor.online.domain.OnlineSession;import com.code.project.monitor.online.domain.UserOnline;import com.code.project.monitor.online.domain.OnlineSession.OnlineStatus;import com.code.project.monitor.online.service.IUserOnlineService;/ * 在线用户监控 * * @author ruoyi */@Controller@RequestMapping("/monitor/online")public class UserOnlineController extends BaseController{ private String prefix = "monitor/online"; @Autowired private IUserOnlineService userOnlineService; @Autowired private OnlineSessionDAO onlineSessionDAO; @RequiresPermissions("monitor:online:view") @GetMapping() public String online() { return prefix + "/online"; } @RequiresPermissions("monitor:online:list") @PostMapping("/list") @ResponseBody public TableDataInfo list(UserOnline userOnline) { startPage(); List list = userOnlineService.selectUserOnlineList(userOnline); return getDataTable(list); } @RequiresPermissions("monitor:online:batchForceLogout") @Log(title = "在线用户", businessType = BusinessType.FORCE) @PostMapping("/batchForceLogout") @ResponseBody public AjaxResult batchForceLogout(@RequestParam("ids[]") String[] ids) { for (String sessionId : ids) { UserOnline online = userOnlineService.selectOnlineById(sessionId); if (online == null) { return error("用户已下线"); } OnlineSession onlineSession = (OnlineSession) onlineSessionDAO.readSession(online.getSessionId()); if (onlineSession == null) { return error("用户已下线"); } if (sessionId.equals(ShiroUtils.getSessionId())) { return error("当前登陆用户无法强退"); } onlineSession.setStatus(OnlineStatus.off_line); onlineSessionDAO.update(onlineSession); online.setStatus(OnlineStatus.off_line); userOnlineService.saveOnline(online); } return success(); } @RequiresPermissions("monitor:online:forceLogout") @Log(title = "在线用户", businessType = BusinessType.FORCE) @PostMapping("/forceLogout") @ResponseBody public AjaxResult forceLogout(String sessionId) { UserOnline online = userOnlineService.selectOnlineById(sessionId); if (sessionId.equals(ShiroUtils.getSessionId())) { return error("当前登陆用户无法强退"); } if (online == null) { return error("用户已下线"); } OnlineSession onlineSession = (OnlineSession) onlineSessionDAO.readSession(online.getSessionId()); if (onlineSession == null) { return error("用户已下线"); } onlineSession.setStatus(OnlineStatus.off_line); onlineSessionDAO.update(onlineSession); online.setStatus(OnlineStatus.off_line); userOnlineService.saveOnline(online); return success(); }}
package com.code.project.monitor.server.controller;import org.apache.shiro.authz.annotation.RequiresPermissions;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import com.code.framework.web.controller.BaseController;import com.code.project.monitor.server.domain.Server;/ * 服务器监控 * * @author ruoyi */@Controller@RequestMapping("/monitor/server")public class ServerController extends BaseController{ private String prefix = "monitor/server"; @RequiresPermissions("monitor:server:view") @GetMapping() public String server(ModelMap mmap) throws Exception { Server server = new Server(); server.copyTo(); mmap.put("server", server); return prefix + "/server"; }}
五,项目总结
本项目界面简洁大方,功能完整,适合做课程设计和毕业设计使用,另外可以在此项目框架的基础上自行添加或修改相关的功能。