SpringBoot+Electron教务管理系统 附带详细运行指导视频

文章目录

  • 一、项目演示
  • 二、项目介绍
  • 三、运行截图
  • 四、主要代码
    • 1.查询课程表代码
    • 2.保存学生信息代码
    • 3.用户登录代码

一、项目演示

项目演示地址: 视频地址

二、项目介绍

项目描述:这是一个基于SpringBoot+Electron框架开发的教务管理系统。首先,这是一个前后端分离的项目,前端采用Vue+Electron框架,支持以Web界面访问,也支持以桌面应用的形式访问。然后这项目代码简洁规范,注释说明详细,易于理解和学习。其次,这项目功能丰富,具有一个教务管理系统该有的所有功能。

项目功能:此项目分为三个角色:学生老师管理员学生有管理个人信息、查看所有学期信息、查看个人课程和上课信息、查看个人成绩信息、查看公告信息和查看并支付个人缴费信息等等功能。老师有查看所有学生、老师和管理员信息、查看所有学院、专业和班级信息、查看所有学期信息、查看所有课程信息和查询上课信息、管理自己课程的成绩信息、查看公告信息和管理个人信息等等功能。管理员有管理所有学生、老师和管理员信息、管理所有学院、专业和班级信息、管理所有学期信息、管理所有课程信息和日程信息、查询上课信息、管理所有成绩信息、管理公告信息和管理所有缴费信息等等功能。

应用技术:SpringBoot + Electron + Vue3 + MySQL + MyBatis + Redis + ElementUI-Plus + Vite

运行环境:IntelliJ IDEA2019.3.5 + MySQL5.7(项目压缩包中自带) + Redis5.0.5(项目压缩包中自带) + JDK1.8 + Maven3.6.3(项目压缩包中自带)+ Node20.18.0(项目压缩包中自带)+ Visual Studio Code(项目压缩包中自带)

三、运行截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、主要代码

1.查询课程表代码

	@Override
    public ResponseDTO<List<CourseItemDTO>> getCourseTableList(CourseDTO courseDTO) {
        if(CommonUtil.isEmpty(courseDTO.getClassesId()) || CommonUtil.isEmpty(courseDTO.getSemesterId())) {
            return ResponseDTO.errorByMsg(CodeMsg.DATA_ERROR);
        }
        CourseClassesExample courseClassesExample = new CourseClassesExample();
        courseClassesExample.createCriteria().andClassesIdEqualTo(courseDTO.getClassesId());
        List<String> courseIdList = courseClassesMapper.selectByExample(courseClassesExample).stream().map(CourseClasses::getCourseId).collect(Collectors.toList());
        if(courseIdList.size() == 0) {
            return ResponseDTO.errorByMsg(CodeMsg.COURSE_CLASSES_EMPTY);
        }
        CourseExample courseExample = new CourseExample();
        courseExample.createCriteria().andIdIn(courseIdList).andSemesterIdEqualTo(courseDTO.getSemesterId());
        courseIdList = courseMapper.selectByExample(courseExample).stream().map(Course::getId).collect(Collectors.toList());
        if(courseIdList.size() == 0) {
            return ResponseDTO.errorByMsg(CodeMsg.COURSE_CLASSES_EMPTY);
        }
        CourseItemExample courseItemExample = new CourseItemExample();
        courseItemExample.createCriteria().andCourseIdIn(courseIdList);
        List<CourseItem> courseItemList = courseItemMapper.selectByExample(courseItemExample);
        List<CourseItemDTO> courseItemDTOList = CopyUtil.copyList(courseItemList, CourseItemDTO.class);
        for(CourseItemDTO courseItemDTO : courseItemDTOList) {
            Course course = courseMapper.selectByPrimaryKey(courseItemDTO.getCourseId());
            CourseDTO courseDTODB = CopyUtil.copy(Optional.ofNullable(course).orElse(new Course()), CourseDTO.class);
            Teacher teacher = teacherMapper.selectByPrimaryKey(courseDTODB.getTeacherId());
            courseDTODB.setTeacherDTO(CopyUtil.copy(Optional.ofNullable(teacher).orElse(new Teacher()), TeacherDTO.class));
            courseItemDTO.setCourseDTO(courseDTODB);
        }
        return ResponseDTO.success(courseItemDTOList);
    }

2.保存学生信息代码

	@Override
    public ResponseDTO<Boolean> saveStudent(StudentDTO studentDTO) {
        // 进行统一表单验证
        CodeMsg validate = ValidateEntityUtil.validate(studentDTO);
        if (!validate.getCode().equals(CodeMsg.SUCCESS.getCode())) {
            return ResponseDTO.errorByMsg(validate);
        }
        Student student = CopyUtil.copy(studentDTO, Student.class);
        if(CommonUtil.isEmpty(student.getId())) {
            // 添加操作
            // 判断学号/学工号是否存在
            if(isNoExist(student, "")){
                return ResponseDTO.errorByMsg(CodeMsg.NO_EXIST);
            }
            student.setId(UuidUtil.getShortUuid());
            if(studentMapper.insertSelective(student) == 0) {
                return ResponseDTO.errorByMsg(CodeMsg.USER_ADD_ERROR);
            }
        } else {
            // 修改操作
            // 判断学号/学工号是否存在
            if(isNoExist(student, student.getId())){
                return ResponseDTO.errorByMsg(CodeMsg.NO_EXIST);
            }
            ResponseDTO<UserDTO> loginUserResp = userService.getLoginUser(studentDTO.getToken());
            if(loginUserResp.getCode() != 0) {
                return ResponseDTO.errorByMsg(CodeMsg.USER_SESSION_EXPIRED);
            }
            if(studentMapper.updateByPrimaryKeySelective(student) == 0) {
                return ResponseDTO.errorByMsg(CodeMsg.USER_EDIT_ERROR);
            }
            UserDTO loginUserDTO = loginUserResp.getData();
            if(student.getId().equals(loginUserDTO.getId())) {
                // 如果是修改个人信息  则更新redis中数据
                loginUserDTO = CopyUtil.copy(studentMapper.selectByPrimaryKey(student.getId()), UserDTO.class);
                stringRedisTemplate.opsForValue().set("USER_" + studentDTO.getToken(), JSON.toJSONString(loginUserDTO), 3600, TimeUnit.SECONDS);
            }
        }
        return ResponseDTO.successByMsg(true, "保存成功!");
    }

3.用户登录代码

	@Override
    public ResponseDTO<UserDTO> login(UserDTO userDTO) {
        // 进行是否为空判断
        if(CommonUtil.isEmpty(userDTO.getNo())){
            return ResponseDTO.errorByMsg(CodeMsg.NO_EMPTY);
        }
        if(CommonUtil.isEmpty(userDTO.getPassword())){
            return ResponseDTO.errorByMsg(CodeMsg.PASSWORD_EMPTY);
        }
        if(userDTO.getRoleId() == null){
            return ResponseDTO.errorByMsg(CodeMsg.ROLE_EMPTY);
        }
        UserDTO loginUserDTO = new UserDTO();
        // 对比学号/学工号和密码是否正确
        if(RoleEnum.STUDENT.getCode().equals(userDTO.getRoleId())) {
            StudentExample studentExample = new StudentExample();
            studentExample.createCriteria().andNoEqualTo(userDTO.getNo()).andPasswordEqualTo(userDTO.getPassword());
            List<Student> studentList = studentMapper.selectByExample(studentExample);
            if(studentList == null || studentList.size() != 1){
                return ResponseDTO.errorByMsg(CodeMsg.NO_PASSWORD_ERROR);
            }
            loginUserDTO = CopyUtil.copy(studentList.get(0), UserDTO.class);
        } else if (RoleEnum.TEACHER.getCode().equals(userDTO.getRoleId())) {
            TeacherExample teacherExample = new TeacherExample();
            teacherExample.createCriteria().andNoEqualTo(userDTO.getNo()).andPasswordEqualTo(userDTO.getPassword());
            List<Teacher> teacherList = teacherMapper.selectByExample(teacherExample);
            if(teacherList == null || teacherList.size() != 1){
                return ResponseDTO.errorByMsg(CodeMsg.NO_PASSWORD_ERROR);
            }
            loginUserDTO = CopyUtil.copy(teacherList.get(0), UserDTO.class);
        } else if (RoleEnum.ADMIN.getCode().equals(userDTO.getRoleId())) {
            AdminExample adminExample = new AdminExample();
            adminExample.createCriteria().andNoEqualTo(userDTO.getNo()).andPasswordEqualTo(userDTO.getPassword());
            List<Admin> adminList = adminMapper.selectByExample(adminExample);
            if(adminList == null || adminList.size() != 1){
                return ResponseDTO.errorByMsg(CodeMsg.NO_PASSWORD_ERROR);
            }
            loginUserDTO = CopyUtil.copy(adminList.get(0), UserDTO.class);
        }
        loginUserDTO.setRoleId(userDTO.getRoleId());
        // 生成登录token并存入Redis中
        String token = UuidUtil.getShortUuid();
        loginUserDTO.setToken(token);
        //把token存入redis中 有效期1小时
        stringRedisTemplate.opsForValue().set("USER_" + token, JSON.toJSONString(loginUserDTO), 3600, TimeUnit.SECONDS);
        return ResponseDTO.successByMsg(loginUserDTO, "登录成功!");
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960165.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有限元分析学习——Anasys Workbanch第一阶段笔记(15)接触间隙处理与赫兹接触

目录 0 序言 1 接触的间隙处理 1.1 结果对比 1.2 处理方法 2 赫兹接触 0 序言 本章主要介绍间隙出现时的三种解决方法&#xff0c;齿轮点蚀/表面剥落涉及的赫兹接触的一些理论知识。 1 接触的间隙处理 在实际产品过程中&#xff0c;很多时候由于设计问题&#xff0c;原本…

go单元测试和基准测试

1、单元测试和基准测试 单元测试和基准测试代码开发中的重要环节&#xff0c;良好的单元测试和基准测试&#xff0c;能提升开发质量&#xff0c;对整体开发有非常重要的重要&#xff0c;下面介绍单元测试和基准测试的写法。 2、单元测试和基准测试写法 以排序基本排序算法&a…

自由窗口边框阴影描绘方案汇总-社群讨论学习

背景&#xff1a; 针对很多厂商的自由窗口都有内外阴影效果&#xff0c;针对这样一个需求其实不仔细看可能都看不出来&#xff0c;不过确实也是存在的这种阴影&#xff0c;这里我搞个明显一些的给大家看看&#xff1a; 针对这样一个需求&#xff0c;在我们vip学员群里进行了相…

应用层协议 HTTP 讲解实战:从0实现HTTP 服务器

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; HTTP 协议 &#x1f98b; 认识 URL&#x1f98b; urlencode 和 urldecode 二&#xff1a;&#x1f525; HTTP 协议请求与响应格式 &#x1f98b; HTTP 请求…

深入剖析 Adam 优化器:原理、优势与应用

在深度学习领域&#xff0c;优化器的选择对模型的训练效率和性能起着决定性作用。Adam优化器作为一种自适应优化算法&#xff0c;凭借其根据历史梯度信息动态调整学习率的特性&#xff0c;备受研究者和工程师的青睐。它巧妙融合了RMSProp和Momentum两种优化算法的理念&#xff…

ppp综合实验

IP地址 r1 r2 r3 r4 hdlc封装 pap认证 r2 r3 chap认证 r2 r4 MGRE 主认证 [r1]int Tunnel 0/0/0 [r1-Tunnel0/0/0]ip add 192.168.4.1 24 [r1-Tunnel0/0/0]tunnel-protocol gre p2mp [r1-Tunnel0/0/0]source 12.1.1.1 [r1-Tunnel0/0/0]nhrp entry multicast dynamic [r1-Tu…

C++——list的了解和使用

目录 引言 forward_list与list 标准库中的list 一、list的常用接口 1.list的迭代器 2.list的初始化 3.list的容量操作 4.list的访问操作 5.list的修改操作 6.list的其他操作 二、list与vector的对比 结束语 引言 本篇博客要介绍的是STL中的list。 求点赞收藏评论…

Elasticsearch+kibana安装(简单易上手)

下载ES( Download Elasticsearch | Elastic ) 将ES安装包解压缩 解压后目录如下: 修改ES服务端口&#xff08;可以不修改&#xff09; 启动ES 记住这些内容 验证ES是否启动成功 下载kibana( Download Kibana Free | Get Started Now | Elastic ) 解压后的kibana目…

Ansible自动化运维实战--script、unarchive和shell模块(6/8)

文章目录 一、script模块1.1、功能1.2、常用参数1.3、举例 二、unarchive模块2.1、功能2.2、常用参数2.3、举例 三、shell模块3.1、功能3.2、常用参数3.3、举例 一、script模块 1.1、功能 Ansible 的 script 模块允许你在远程主机上运行本地的脚本文件&#xff0c;其提供了一…

Unity Epplus读取excel表并存入So文件举例

目录 此篇需要你有一定的阅读代码的能力&#xff0c;不然点开了也不知道在做什么 这是读表工具 So文件这么写 使用 此篇需要你有一定的阅读代码的能力&#xff0c;不然点开了也不知道在做什么 在此之前你需要知道epplus是干什么的&#xff0c;然后知道其基本api&#xff0…

Java Web-Cookie与Session

会话跟踪技术 会话跟踪技术是一种在 Web 应用程序中跟踪用户会话状态的机制&#xff0c;它允许服务器在多个请求之间识别和关联属于同一用户的请求&#xff0c;以便在整个会话过程中保持用户相关的信息。以下是几种常见的会话跟踪技术&#xff1a; Cookie 概念&#xff1a;Cook…

Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题

一、整个前言 在基于 Ruoyi 框架进行系统开发的过程中&#xff0c;我们常常会遇到各种有趣且具有挑战性的问题。今天&#xff0c;我们就来深入探讨一个在实际开发中较为常见的问题&#xff1a;当连续快速发送 Post 请求时&#xff0c;前端会弹出 “数据正在处理&#xff0c;请…

YOLOv8改进,YOLOv8检测头融合DynamicHead,并添加小目标检测层(四头检测),适合目标检测、分割等,全网独发

摘要 作者提出一种新的检测头,称为“动态头”,旨在将尺度感知、空间感知和任务感知统一在一起。如果我们将骨干网络的输出(即检测头的输入)视为一个三维张量,其维度为级别 空间 通道,这样的统一检测头可以看作是一个注意力学习问题,直观的解决方案是对该张量进行全自…

C语言编译过程全面解析

今天是2025年1月26日&#xff0c;农历腊月二十七&#xff0c;一个距离新春佳节仅一步之遥的日子。城市的喧嚣中&#xff0c;年味已悄然弥漫——能在这个时候坚持上班的人&#xff0c;真可称为“牛人”了吧&#xff0c;哈哈。。。。 此刻&#xff0c;我在重新审视那些曾被遗忘的…

在php中怎么打开OpenSSL

&#xff08;点击即可进入聊天助手&#xff09; 背景 在使用php做一些项目时,有用到用户邮箱注册等,需要开启openssl的能力 在php系统中openssl默认是关闭状态的,在一些低版本php系统中,有的甚至需要在服务器终端后台,手动安装 要打开OpenSSL扩展&#xff0c;需要进行以下步骤 …

【数据分享】2014-2025年我国水系数据(免费获取/全国/分省)

水系数据是我们在各项研究中经常使用的数据&#xff01;水系数据虽然很常用&#xff0c;但是却基本没有能下载最近年份水系数据的网站&#xff0c;所以很多人不知道如何获得水系数据。 本次我们给大家分享的是2014-2025年的全国范围的水系数据&#xff0c;包括水系线数据和水系…

Office2021下载与安装保姆级教程【Office Tool Plus】

Office Tool Plus安装Office2021 下载Office Tool Plus安装OfficeⅠ. 清除旧版本Ⅱ. 配置安装参数Ⅲ. 安装许可证Ⅳ. 激发&#xff08;JH&#xff09;Office 本文介绍使用Office Tool Plus工具下载、安装、部署Office 2021全过程。 下载Office Tool Plus OfficeToolPlus是一个…

DeepSeek明确学术研究方向效果如何?

明确学术研究方向 在学术写作中&#xff0c;选择一个出色的研究主题至关重要&#xff0c;因为它直接关系到论文是否能登上高级别的学术期刊。不少学者在这个过程中走入了误区&#xff0c;他们往往将大把的时间花在写作本身&#xff0c;而忽略了对选题的深入思考&#xff0c;这…

Spring MVC 综合案例

目录 一. 加法计算器 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 3. 服务器端代码 4. 运行测试 二. 用户登录 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 (1) 登录界面接口 (2) 首页接口 3. 服务器端代码 4. 运行测试 三. 留言板 1. 准备…

基于OSAL的嵌入式裸机事件驱动框架——消息队列osal_msg

参考B站up主【架构分析】嵌入式祼机事件驱动框架 感谢大佬分享 消息队列 消息分为hdr和bdy&#xff0c;把消息的头dhr和内容bdy做了一个分离的设计 dhr包括指向下一个消息的指针next&#xff0c;len在创建消息的时候使用&#xff0c;dest_id即目标任务&#xff0c;将消息和任务…