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

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

本文正在参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。

java精品毕设【大学生学科竞赛项目管理系统.mp4】

​  

论文设计参考:

一、 绪论 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)通知公告模块

​​

主要功能截图: 

​​

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

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

​​

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

​​

​​

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

​​

菜单消息管理:

​​

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

​​

业务模块功能

立项申请功能

​​​

立项审核:

​​

活动经费、预算申请

​​

​​

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

​​

​​

​​

项目结题管理信息:

​​

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

​​

​​

项目结题统计:

​​

数据库表设计: 

用户表:

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;
    }
}
复制代码

好了,今天就到这儿吧,我是小奥、下期见~~

大家点赞、收藏、关注、评论啦 、

打卡 文章 更新 70/  100天

文章分类
后端