基于java实现学科竞赛管理系统【Springboot+mybatis+layui】
博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域
作者主页 央顺技术团队
Java毕设项目精品实战案例《1000套》
欢迎点赞 收藏 ⭐留言
文末获取源码联系方式
文章目录
- 基于java实现学科竞赛管理系统【Springboot+mybatis+layui】
- 系统功能设计
- 主要功能截图:
- 管理员功能模块:用户管理、竞赛报名信息管理、经费申请信息和x审核信息管理、项目结题信息、管理角色管理、菜单管理、权限管理、、立项申请管理等具体模块管理
- 用户管理:用户列表显示,数据的添加,以及删除修改等。
- 角色管理:将角色与用户绑定,灵活控制角色菜单,显示菜单权限。可以创建多个角色
- 菜单消息管理:
- 系统日志监控:aop切面编程。实现日志记录操作。
- 业务模块功能
- 立项审核:
- 活动经费、预算申请
- 立项申请个人赛以及团队赛管理,录入报名相关信息字段
- 项目结题管理信息:
- 项目完成之后、选择项目进行资金使用统计结题。录入金额
- 项目结题统计:
- 数据库表设计:
- 用户表:
- 菜单表:
- 立项申请:
- 个人赛:
- 经费申请:
- 主要代码实现:
- 用户权限过滤:
- 登录模块验证:
- 统一异常处理:
- 分页查询
- 获取源码:
系统功能设计
(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+Jiayansubject.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;}
}
获取源码:
大家点赞、收藏、关注、评论啦
🍅查看下方微信号获取联系方式 📝
🚀🚀🚀精彩系列推荐
Java毕设项目精品实战案例《1000套》
精彩专栏推荐订阅:在下方专栏