视频演示 :

​java精品毕设【大学生学科竞赛项目管理系统---基于Springboot+Mybatis+layui】--附完整源码+论文​

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_毕业设计  

论文设计参考:

​一、 绪论 7​

​1.1 研究背景 7​

​1.2研究目标 7​

​1.3项目的可行性研究设计 8​

​二、 需求分析 8​

​2.1系统功能概述 8​

​2.2系统运行环境 8​

​2.3功能需求描述 9​

​三、 系统设计 9​

​3.1开发与设计的总体思想 9​

​3.2系统模块总体架构构图 9​

​3.3模块设计 10​

​3.4系统流程描述 10​

​3. 5项目源码架构 11​

​四、 系统实现 12​

​4.1 程序主要类 12​

​4.1.1用户实体类 13​

​4.1.2菜单类 14​

​4.1.3角色类 15​

​4.1.4项目申请类 16​

​4.1.4项目经费类 17​

​4.1.5项目公告类 17​

​4.2 主要框架和技术介绍 17​

​4.2.1 spring 18​

​4.2.2 SpringBoot简介 18​

​4.2.2 mybatis 18​

​4.2.2 jQuery 19​

​4.2.2 element UI 19​

​4.3系统功能主要实现模块截图 19​

​4.3.1登陆页面 19​

​4.3.2 主页面 21​

​4.3.4部分关键源码展示: 28​

​4.4数据库主要表设计 31​

​4.4.0数据库表ER图 32​

​4.4.1用户表设计 32​

​4.4.2角色表设计 32​

​4.4.3菜单表设计 33​

​4.4.4竞赛公告表设计 33​

​4.4.5竞赛项目表设计 33​

​4.4.6竞赛项目报名表设计 34​

​4.4.7竞赛项目经费表设计 34​

​4.4.8个人赛报名表设计 34​

​4.4.8团队赛报名表设计 35​

​4.4.6数据库sql文件 35​

​五.系统开发总结心得与体会 75​

​六、参考献文 76​

系统功能设计

(1)登录:输入账号密码和验证码登录;

(2)用户信息模块

(3)菜单模块

(4)角色模块

(5)项目竞赛活动申请模块

(6)项目竞赛经费申请模块

(7)项目竞赛活动管理审批模块

(8)项目个人赛报名模块

(9)项目团队赛报名模块

(10)项目结题统计模块

(11)通知公告模块

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_学生竞赛管理系统_02

主要功能截图: 

用户登录:输入帐号密码和验证码登录。登录后,根据用户权限显示不同的菜单,灵活控制角色。

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_java_03

管理员功能模块:用户管理、竞赛报名信息管理、经费申请信息和x审核信息管理、项目结题信息、管理角色管理、菜单管理、权限管理、、立项申请管理等具体模块管理

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_jquery_04

用户管理:用户列表显示,数据的添加,以及删除修改等。

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_学生竞赛管理系统_05

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_学生竞赛管理系统_06

角色管理:将角色与用户绑定,灵活控制角色菜单,显示菜单权限。可以创建多个角色

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_jquery_07

菜单消息管理:

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_毕业设计_08

系统日志监控:aop切面编程。实现日志记录操作。

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_springboot_09

业务模块功能

立项申请功能

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_jquery_10​​

立项审核:

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_java_11

活动经费、预算申请 

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_jquery_12

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_学生竞赛管理系统_13

立项申请个人赛以及团队赛管理,录入报名相关信息字段

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_springboot_14

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_springboot_15

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_毕业设计_16

项目结题管理信息:

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_springboot_17

项目完成之后、选择项目进行资金使用统计结题。录入金额

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_jquery_18

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_java_19

项目结题统计:

基于java实现学科竞赛管理系统【Springboot+mybatis+lyaui】_学生竞赛管理系统_20

数据库表设计: 

用户表:

CREATE TABLE `NewTable` (
`user_id` bigint(20) NOT NULL AUTO_INCREMENT ,
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名' ,
`salt` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '盐' ,
`email` varchar(1
`password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码' ,
00) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱' ,
`mobile` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号' ,
`status` tinyint(4) NULL DEFAULT NULL COMMENT '状态 0:禁用 1:正常' ,
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间' ,
PRIMARY KEY (`user_id`),
UNIQUE INDEX `username` (`username`) USING BTREE
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci
COMMENT='系统用户'
AUTO_INCREMENT=3
ROW_FORMAT=COMPACT

菜单表:

CREATE TABLE `NewTable` (
`menu_id` bigint(20) NOT NULL AUTO_INCREMENT ,
`parent_id` bigint(20) NULL DEFAULT NULL COMMENT '父菜单ID,一级菜单为0' ,
`name` varchar(50) SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单名称' ,
`url` varchar(200) SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单URL' ,
`perms` varchar(500) SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '授权(多个用逗号分隔,如:user:list,user:create)' ,
`type` int(11) NULL DEFAULT NULL COMMENT '类型 0:目录 1:菜单 2:按钮' ,
`icon` varchar(50) SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单图标' ,
`order_num` int(11) NULL DEFAULT NULL COMMENT '排序' ,
PRIMARY KEY (`menu_id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci
COMMENT='菜单管理'
AUTO_INCREMENT=69
ROW_FORMAT=COMPACT
;

立项申请:

CREATE TABLE `NewTable` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(255) SET utf8 COLLATE NULL NULL ,
`zsdw` varchar(255) SET utf8 COLLATE NULL ,
`type` varchar(255) SET utf8 COLLATE utf8_general_ci NULL NULL ,
`principal` varchar(255) SET utf8 COLLATE NULL DEFAULT NULL ,
`phone` varchar(255) SET utf8 COLLATE NULL NULL ,
`start_time` datetime NULL DEFAULT NULL ,
`ent_time` datetime NULL DEFAULT NULL ,
`majozhuban` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`sponsor` varchar(255) SET utf8 COLLATE utf8_general_ci NULL NULL ,
`undertaeker` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL NULL ,
`remark` varchar(255) SET utf8 COLLATE utf8_general_ci NULL NULL ,
`audit_stu` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
ROW_FORMAT=COMPACT
;

个人赛:

CREATE TABLE `NewTable` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`college` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`class_name` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`grade` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`major` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`email` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`phone` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`title` varchar(255) SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=12
ROW_FORMAT=COMPACT
;

经费申请:

CREATE TABLE `NewTable` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`zhuche` double NULL NULL ,
`rate` double NULL NULL ,
`train` double NULL NULL ,
`guidance` double NULL NULL ,
`haocai` double NULL NULL ,
`bonus` double NULL NULL ,
`other` double NULL ,
`total` double NULL NULL ,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=10
ROW_FORMAT=COMPACT
;

主要代码实现:

用户权限过滤:


@Bean("shiroFilter")
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
shiroFilter.setLoginUrl("/login.html");
shiroFilter.setUnauthorizedUrl("/");

filterMap.put("/statics/**", "anon");
filterMap.put("/login.html", "anon");
filterMap.put("/sys/login", "anon");
filterMap.put("/favicon.ico", "anon");
filterMap.put("/captcha.jpg", "anon");
filterMap.put("/**", "authc");
shiroFilter.setFilterChainDefinitionMap(filterMap);

Map<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/swagger/**", "anon");
filterMap.put("/v2/api-docs", "anon");
filterMap.put("/swagger-ui.html", "anon");
filterMap.put("/webjars/**", "anon");
filterMap.put("/swagger-resources/**", "anon");



return shiroFilter;
}

登录模块验证:

/**
* 登录
*/
@ResponseBody
@RequestMapping(value = "/sys/login")
public R login(String username, String password, String captcha) {
String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
if(!captcha.equalsIgnoreCase(kaptcha)){
return R.error("验证码不正确。。。。。。");
}

try{
Subject subject = ShiroUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);//md5+Jiayan
subject.login(token);
}catch (UnknownAccountException e) {
return R.error(e.getMessage());
}catch (IncorrectCredentialsException e) {
return R.error("账号或密码不正确。。。。");
}catch (LockedAccountException e) {
return R.error("账号已被锁定,请联系管理。。。员");
}catch (AuthenticationException e) {
return R.error("账户验证失败。。。。");
}

return R.ok();
}

统一异常处理:



/**
* 异常处理器
*
* @author Mark sunlightcs@gmail.com
*/
@RestControllerAdvice
public class RRExceptionHandler {
private Logger logger = LoggerFactory.getLogger(getClass());

/**
* 处理自定义异常
*/
@ExceptionHandler(RRException.class)
public R handleRRException(RRException e){
R r = new R();
r.put("code", e.getCode());
r.put("msg", e.getMessage());

return r;
}



@ExceptionHandler(AuthorizationException.class)
public R handleAuthorizationException(AuthorizationException e){
logger.error(e.getMessage(), e);
return R.error("没有权限,请联系管理员授权");
}

@ExceptionHandler(Exception.class)
public R handleException(Exception e){
logger.error(e.getMessage(), e);
return R.error();
}

@ExceptionHandler(DuplicateKeyException.class)
public R handleDuplicateKeyException(DuplicateKeyException e){
logger.error(e.getMessage(), e);
return R.error("数据库中已存在该记录");
}
}

分页查询 



package io.renren.common.utils;

import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.renren.common.xss.SQLFilter;
import org.apache.commons.lang.StringUtils;

import java.util.Map;

/**
* 查询参数
*
* @author Mark sunlightcs@gmail.com
*/
public class Query<T> {

public IPage<T> getPage(Map<String, Object> params) {
return this.getPage(params, null, false);
}

public IPage<T> getPage(Map<String, Object> params, String defaultOrderField, boolean isAsc) {
//分页参数
long curPage = 1;
long limit = 10;

//分页对象
Page<T> page = new Page<>(curPage, limit);

//分页参数
params.put(Constant.PAGE, page);

if(params.get(Constant.PAGE) != null){
curPage = Long.parseLong((String)params.get(Constant.PAGE));
}
if(params.get(Constant.LIMIT) != null){
limit = Long.parseLong((String)params.get(Constant.LIMIT));
}



//排序字段
//防止SQL注入(因为sidx、order是通过拼接SQL实现排序的,会有SQL注入风险)
String orderField = SQLFilter.sqlInject((String)params.get(Constant.ORDER_FIELD));
String order = (String)params.get(Constant.ORDER);

//前端字段排序
if(StringUtils.isNotEmpty(orderField) && StringUtils.isNotEmpty(order)){
if(Constant.ASC.equalsIgnoreCase(order)) {
return page.addOrder(OrderItem.asc(orderField));
}else {
return page.addOrder(OrderItem.desc(orderField));
}
}

//没有排序字段,则不排序
if(StringUtils.isBlank(defaultOrderField)){
return page;
}

//默认排序
if(isAsc) {
page.addOrder(OrderItem.asc(defaultOrderField));
}else {
page.addOrder(OrderItem.desc(defaultOrderField));
}

return page;
}
}