Springboot+Spring Security+OAuth2+redis+mybatis-plus+mysql+vue+elementui实现请假考勤系统
项目功能完整,后续可能将不断升级。关注作者,及时了解更多好项目!作者主页也有更多好项目分享!获取源码或如需帮助,可通过博客后面名片+作者即可!其他作品集合《vue+element实现电商商城礼品代发网,商品、订单管理》《vue+vant2完美实现香奈儿移动端商城网站》《vue+elementui实现联想购物商城,样式美观大方》《vue+elementui实现英雄联盟道具城》《vue+element
目录
2.前端使用webstorm开发,当然其他开发工具都有可以(vscode/Hbuilder等):
一、在线预览
项目在线访问预览地址:点击访问
项目包含管理后台前端、以及后端实现,即是两个前端项目加后端实现,数据库采用mysql,使用redis缓存,spring oauth2、security、token登录等。管理后台前端采用vue+element实现。后端使用Springboot+Spring Security+OAuth2+redis+mybatis-plus+mysql。
二、项目设计实现
1.登录
分为三种角色登录:辅导员、教师、学生
辅导员权限最大,拥有系统全部权限,其次是教师,拥有授课班级和学生相关的全部权限和其他数据的预览功能,最后是学生,只拥有个人数据的操作权限和其他数据的预览功能。
2.欢迎页
3.课程管理
辅导员和教师拥有操作权限,学生只有预览权限。
4.班级管理
辅导员拥有全部权限,教师只拥有所授课班级权限,学生只拥有预览权限。
5.签到管理
辅导员拥有全部权限,教师只能添加所授课程排班的签到和只能对自己的签到进行管理,学生只能对本班的签到进行查看。
6.签到记录详情
辅导员拥有全部权限,教师只能对自己所属排班进行管理,学生只能对自己的记录进行签到和查看全部签到记录。
7.请假管理
请假只能由学生进行添加,辅导员拥有除了新增权限外的所有权限,教师只能对所授课班级学生的请假记录进行管理,学生只能对自己的请假记录进行管理和查看。
学生申请请假,对应教师或辅导员可进行审核。
8.学生管理
辅导员拥有全部权限,教师只能对自己所授课班级进行学生管理,学生只能对自己的记录进行管理。
9.教师管理
辅导员拥有全部权限,教师只能对自己的记录进行管理,学生只能查看本班级对应的授课老师记录。
10.辅导员管理
辅导员拥有全部权限,辅导员类似于超级管理员,教师和学生都只拥有查看权限。
11.请假controller层实现
package com.product.controller;
import com.product.entity.LeaveManagement;
import com.product.entity.base.Result;
import com.product.entity.base.ResultPage;
import com.product.entity.req.LeaveManagementPageReq;
import com.product.entity.vo.LeaveManagementVO;
import com.product.service.LeaveManagementService;
import com.product.util.JwtUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author hjf
* @date 2023-10-23 10:27
* @describe 请假
*/
@Api(tags = "请假")
@Slf4j
@RestController
@RequestMapping("/leaveManagement")
public class LeaveManagementController {
@Resource
private LeaveManagementService leaveManagementService;
@ApiOperation(value = "添加或更新")
@PostMapping("/add")
public Result<?> add(@RequestBody LeaveManagement leaveManagement) {
return leaveManagementService.add(JwtUtil.getUserId(),leaveManagement);
}
@ApiOperation("分页")
@PostMapping("/getPage")
public ResultPage<LeaveManagementVO> getPage(@RequestBody LeaveManagementPageReq pageQuery) {
return leaveManagementService.getPage(pageQuery);
}
@PostMapping("/del")
@ApiOperation(value = "删除", notes = "删除")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "所操作的记录ID,英文逗号分割", required = true, dataType = "String", paramType = "query")
})
public Result<?> del(
@RequestParam(value = "ids") String ids
) {
return leaveManagementService.del(JwtUtil.getUserId(), ids);
}
@PostMapping("/updateStatus")
@ApiOperation(value = "更新状态", notes = "更新状态")
@ApiImplicitParams({
@ApiImplicitParam(name = "status", value = "状态", required = true, dataType = "Integer", paramType = "query"),
@ApiImplicitParam(name = "ids", value = "所操作的记录ID,英文逗号分割", required = true, dataType = "String", paramType = "query")
})
public Result<?> updateStatus(
@RequestParam(value = "status") Integer status,
@RequestParam(value = "ids") String ids
) {
return leaveManagementService.updateStatus(JwtUtil.getUserId(), status, ids);
}
@PostMapping("/getDetailById")
@ApiOperation(value = "详情", notes = "详情")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "主键", required = true, dataType = "Long", paramType = "query")
})
public Result<LeaveManagement> getDetailById(
@RequestParam(value = "id") Long id
) {
return leaveManagementService.getDetailById(id);
}
}
12.课程service层实现
package com.product.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.product.entity.Course;
import com.product.entity.base.PageQuery;
import com.product.entity.base.Result;
import com.product.entity.base.ResultPage;
import com.product.enumerate.YesOrNo;
import com.product.mapper.CourseMapper;
import com.product.service.CourseService;
import com.product.util.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* @author hjf
* @date 2023-10-23 9:23
* @describe 课程
*/
@Slf4j
@Service
public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> implements CourseService {
/**
* 添加或更新
*
* @param course 课程
*/
@Override
public Result<?> add(Long userId,Course course) {
course.setCourseName(course.getCourseName().trim());
LocalDateTime now = LocalDateTime.now();
course.setUpdateSystemTime(now);
course.setUpdateSystemAdminId(userId);
if(course.getId() == null) {//添加
course.setCreateSystemTime(now);
course.setCreateSystemAdminId(JwtUtil.getUserId());
save(course);
}else{//更新
updateById(course);
}
return Result.OKMsg("保存成功");
}
@Override
public Result<List<Course>> listAll(){
List<Course> courses = list(Wrappers.<Course>lambdaQuery()
.eq(Course::getStatus,YesOrNo.NO.getValue())
.orderByDesc(Course::getCreateSystemTime)
);
return Result.OK(courses);
}
/**
* 分页
*/
@Override
public ResultPage<Course> getPage(PageQuery pageQuery) {
LambdaQueryWrapper<Course> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(pageQuery.getKeyWord()),Course::getCourseName,pageQuery.getKeyWord());
queryWrapper.orderByDesc(Course::getCreateSystemTime);
Page<Course> page = page(pageQuery.build(), queryWrapper);
return ResultPage.OK(page.getTotal(), page.getCurrent(), page.getSize(), page.getRecords());
}
/**
* 删除
*
* @param userId 用户ID
* @param ids 所操作记录
*/
@Override
public Result<?> del(Long userId, String ids) {
String[] idsArr = ids.split(",");
List<Long> idsList = new ArrayList<>();
for(String str : idsArr){
idsList.add(Long.parseLong(str));
}
boolean change = remove(Wrappers.<Course>lambdaQuery().in(Course::getId,idsList));
if(change){
return Result.OKMsg("删除成功");
}else{
return Result.failMsg("删除失败,请重试");
}
}
/**
* 更新状态
*
* @param userId 用户ID
* @param ids 所操作记录
* @return
*/
@Override
public Result<?> updateStatus(Long userId,Integer status, String ids) {
String[] idsArr = ids.split(",");
List<Long> idsList = new ArrayList<>();
for(String str : idsArr){
idsList.add(Long.parseLong(str));
}
lambdaUpdate().in(Course::getId,idsList).set(Course::getStatus,YesOrNo.valueOf(status).getValue()).set(Course::getUpdateSystemAdminId,userId).set(Course::getUpdateSystemTime,LocalDateTime.now()).update();
String msg = "启用成功";
if(Objects.equals(status,YesOrNo.YES.getValue())){
msg = "禁用成功";
}
return Result.OKMsg(msg);
}
/**
* 详情
*
* @param id 主键
*/
@Override
public Result<Course> getDetailById(Long id){
Course course = getById(id);
return Result.OK(course);
}
}
三、数据库设计实现
-- 系统管理员
CREATE TABLE `admin` (
`id` bigint NOT NULL COMMENT '主键',
`username` varchar(60) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '登录密码',
`real_name` varchar(32) DEFAULT NULL COMMENT '姓名',
`class_id` bigint DEFAULT NULL COMMENT '所属班级(学生)',
`admin_no` varchar(255) DEFAULT NULL COMMENT '编号',
`gender` tinyint(1) DEFAULT 0 COMMENT '用户性别 0保密 1男 2女',
`avatar` varchar(300) DEFAULT NULL COMMENT '头像',
`phone` varchar(20) DEFAULT NULL COMMENT '手机',
`email` varchar(60) DEFAULT NULL COMMENT '邮箱',
`remark` varchar(200) DEFAULT NULL COMMENT '备注',
`admin_type` tinyint(1) DEFAULT '0' COMMENT '管理员类型: 0辅导员 1教师 2学生',
`status` tinyint(1) DEFAULT 0 COMMENT '是否禁用 0否 1是',
`deleted` tinyint(1) DEFAULT 0 COMMENT '逻辑删除标记 是否已删除: 0否 1是',
`create_system_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_system_admin_id` bigint DEFAULT NULL COMMENT '创建人ID',
`update_system_time` datetime DEFAULT NULL COMMENT '更新时间',
`update_system_admin_id` bigint DEFAULT NULL COMMENT '修改人ID',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `admin_key_username` (`username`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统管理员';
-- 班级管理
CREATE TABLE `classes` (
`id` bigint NOT NULL COMMENT '主键',
`class_no` varchar(255) DEFAULT NULL COMMENT '班级编号',
`class_name` varchar(255) NOT NULL COMMENT '班级名称',
`sort` int NOT NULL DEFAULT 0 COMMENT '排序,越小越靠前',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`status` tinyint(1) DEFAULT 0 COMMENT '是否禁用 0否 1是',
`deleted` tinyint(1) DEFAULT 0 COMMENT '逻辑删除标记 是否已删除: 0否 1是',
`create_system_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_system_admin_id` bigint DEFAULT NULL COMMENT '创建人ID',
`update_system_time` datetime DEFAULT NULL COMMENT '更新时间',
`update_system_admin_id` bigint DEFAULT NULL COMMENT '修改人ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班级管理';
-- 课程管理
CREATE TABLE `course` (
`id` bigint NOT NULL COMMENT '主键',
`course_no` varchar(255) DEFAULT NULL COMMENT '课程编号',
`course_name` varchar(255) NOT NULL COMMENT '课程名称',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`status` tinyint(1) DEFAULT 0 COMMENT '是否禁用 0否 1是',
`deleted` tinyint(1) DEFAULT 0 COMMENT '逻辑删除标记 是否已删除: 0否 1是',
`create_system_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_system_admin_id` bigint DEFAULT NULL COMMENT '创建人ID',
`update_system_time` datetime DEFAULT NULL COMMENT '更新时间',
`update_system_admin_id` bigint DEFAULT NULL COMMENT '修改人ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程管理';
-- 教程编排管理
CREATE TABLE `teacher_scheduling` (
`id` bigint NOT NULL COMMENT '主键',
`admin_id` bigint NOT NULL COMMENT '教师',
`class_id` bigint NOT NULL COMMENT '所属班级',
`course_id` bigint NOT NULL COMMENT '所授课程',
`week` tinyint(1) DEFAULT 0 COMMENT '星期 1星期一 2星期二 3星期三 4星期四 5星期五 6星期六 7星期日',
`start_time` time DEFAULT NULL COMMENT '上课开始时间',
`end_time` time DEFAULT NULL COMMENT '下课开始时间',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`status` tinyint(1) DEFAULT 0 COMMENT '是否禁用 0否 1是',
`deleted` tinyint(1) DEFAULT 0 COMMENT '逻辑删除标记 是否已删除: 0否 1是',
`create_system_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_system_admin_id` bigint DEFAULT NULL COMMENT '创建人ID',
`update_system_time` datetime DEFAULT NULL COMMENT '更新时间',
`update_system_admin_id` bigint DEFAULT NULL COMMENT '修改人ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程管理';
-- 请假管理
CREATE TABLE `leave_management` (
`id` bigint NOT NULL COMMENT '主键',
`class_id` bigint NOT NULL COMMENT '所属班级',
`admin_id` bigint NOT NULL COMMENT '学生',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`start_time` datetime NOT NULL COMMENT '请假开始时间',
`end_time` datetime NOT NULL COMMENT '请假结束时间',
`status` tinyint(1) DEFAULT 0 COMMENT '审核状态 0待审核 1审核通过 2审核不通过',
`deleted` tinyint(1) DEFAULT 0 COMMENT '逻辑删除标记 是否已删除: 0否 1是',
`create_system_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_system_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_system_admin_id` bigint DEFAULT NULL COMMENT '创建人ID',
`update_system_admin_id` bigint DEFAULT NULL COMMENT '修改人ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='请假管理';
-- 签到管理
CREATE TABLE `sign` (
`id` bigint NOT NULL COMMENT '主键',
`scheduling_id` bigint NOT NULL COMMENT '所属考勤排班',
`admin_id` bigint NOT NULL COMMENT '老师',
`class_id` bigint NOT NULL COMMENT '所属班级',
`course_id` bigint NOT NULL COMMENT '课程',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`start_time` datetime NOT NULL COMMENT '签到开始时间',
`end_time` datetime NOT NULL COMMENT '签到结束时间',
`status` tinyint(1) DEFAULT 0 COMMENT '签到状态 0待开始 1进行中 2已结束',
`deleted` tinyint(1) DEFAULT 0 COMMENT '逻辑删除标记 是否已删除: 0否 1是',
`create_system_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_system_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_system_admin_id` bigint DEFAULT NULL COMMENT '创建人ID',
`update_system_admin_id` bigint DEFAULT NULL COMMENT '修改人ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='签到管理';
-- 签到记录
CREATE TABLE `sign_record` (
`id` bigint NOT NULL COMMENT '主键',
`sign_id` bigint NOT NULL COMMENT '所属签到',
`admin_id` bigint NOT NULL COMMENT '学生',
`class_id` bigint NOT NULL COMMENT '所属班级',
`course_id` bigint NOT NULL COMMENT '课程',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`status` tinyint(1) DEFAULT 0 COMMENT '签到状态 0待签到 1已签到',
`deleted` tinyint(1) DEFAULT 0 COMMENT '逻辑删除标记 是否已删除: 0否 1是',
`create_system_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_system_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_system_admin_id` bigint DEFAULT NULL COMMENT '创建人ID',
`update_system_admin_id` bigint DEFAULT NULL COMMENT '修改人ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='签到记录';
-- 请假管理
CREATE TABLE `leave_management` (
`id` bigint NOT NULL COMMENT '主键',
`class_id` bigint NOT NULL COMMENT '所属班级',
`admin_id` bigint NOT NULL COMMENT '学生',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`start_time` datetime NOT NULL COMMENT '请假开始时间',
`end_time` datetime NOT NULL COMMENT '请假结束时间',
`status` tinyint(1) DEFAULT 0 COMMENT '审核状态 0待审核 1审核通过 2审核不通过',
`deleted` tinyint(1) DEFAULT 0 COMMENT '逻辑删除标记 是否已删除: 0否 1是',
`create_system_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_system_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_system_admin_id` bigint DEFAULT NULL COMMENT '创建人ID',
`update_system_admin_id` bigint DEFAULT NULL COMMENT '修改人ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='请假管理';
四、项目结构图
1.后端使用idea开发:
2.前端使用webstorm开发,当然其他开发工具都有可以(vscode/Hbuilder等):
3.项目本地文档访问:
访问地址格式:后端项目地址+后端项目端口号+/doc.html
如:http://localhost:9003/doc.html
4.项目端口号、数据库访问等配置
5.静态资源访问、文件上传配置
五、总结
项目功能完整,后续可能将不断升级。
关注作者,及时了解更多好项目!
作者主页也有更多好项目分享!
获取源码或如需帮助,可通过博客后面名片+作者即可!
其他作品集合
- 《vue+element实现电商商城礼品代发网,商品、订单管理》
- 《vue+vant2完美实现香奈儿移动端商城网站》
- 《vue+elementui实现联想购物商城,样式美观大方》
- 《vue+elementui实现英雄联盟道具城》
- 《vue+elementui实现app布局小米商城,样式美观大方,功能完整》
- 《vue完美模拟pc版快手,实现短视频,含短视频详情播放》
- 《vue+element实现美观大方好看的音乐网站,仿照咪咕音乐网》
- 《vue实现功能完整的购物商城,商品零食、电商通用商城》
- 《vue+element实现蔬菜、水果、电商商城》
- 《vue+element简单实现电商商城网站,模仿小米电商商城》
- 《vue实现美观大方的动漫、cos、帖子类型网站》
- 《vue实现好看的相册、图片网站》
- 《高度仿PC版《微信读书》,好看的小说、读书网站》
- 《vue+element实现非常好看的鲜花网站商城,页面完整,样式美观》
- 《vue+elementui+springboot前后端分离实现通用商城管理后台》
- 《微信小程序日记、微信小程序个人空间、个人日记》
- 《vue+element模仿腾讯视频电影网站》
- 《vue+element高度仿照QQ音乐,完美实现PC端QQ音乐》
- 《vue+element详细完整实现个人博客、个人网站》
- 《vue+elementui+springboot前后端分离实现学校帖子网站,学校大作业》
- 《vue+elementui实现U袋网-完整版》
- 《vue+element+electron仿微信实现》
- 《vue+element模仿电商商城,前后端分离实现,下单微信扫码支付》
- 《electron+vue+elementui实现类似QQ窗口靠边自动边缘隐藏》
- 《微信小程序仿唯聚时代,微信小程序商城》
- 《jquery+bootstrap完整丰富样式开发框架源码,各种现成样式简单易用》
- 《html+css响应式旅游主题网站模板,旅游网站,企业文化新闻类网站》
- 《css+html各种动态、动画、3D相册等7件套》
- 《仿华为电商商城,官网,华为超级新品日demo,大屏霸气且简洁》
- 《vue+element简单实现商城网站首页,模仿电商商城》
- 《vue+elementui实现非常好看的博客、网站首页,网站模板》
- 《elementui+vue实现经典管理系统布局框架,拿来即用》
- 《简系统登录页模板html+vue+elementui》
- 《vue+elementui完美实现博客、网站、个人网站,高仿“张凯博客”》
- 《vue+elementui完美实现后台管理系统的左、右、顶部菜单布局》
- 《html5+css3实现3D正方体动画相册2种+3D旋转木马立体动画相册+表白文字加动画爱心+炫酷万花筒五件套含音乐》
- 《后端使用springboot+maven+shiro+mybatis+mysql,前端使用H-ui.admin_v3.1.3.1,快速实现管理后台功能》
- 《springboot+thymeleaf+maven+html+css实现精美大方好看官网模板完整源码》
- 《html+css实现好友列表,类似QQ群聊成员列表》

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)