当前位置: 首页 > article >正文

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, "登录成功!");
    }

http://www.kler.cn/a/520162.html

相关文章:

  • 关于MySQL InnoDB存储引擎的一些认识
  • unity.NavMesh Agent
  • 智慧消防营区一体化安全管控 2024 年度深度剖析与展望
  • ComfyUI实现老照片修复——AI修复老照片(ComfyUI-ReActor / ReSwapper)解决天坑问题及加速pip下载
  • 在Windows系统中本地部署属于自己的大语言模型(Ollama + open-webui + deepseek-r1)
  • 2025_1_26 c++中关于构造和析构的顺序
  • 视频多模态模型——视频版ViT
  • C++小病毒-1.0勒索(更新次数:2)
  • WPF实战案例 | C# WPF实现大学选课系统
  • salesforce 可以 outbound profile 吗
  • Mac 上如何同时运行多个MySQL版本?
  • 基于微信小程序的停车场管理系统设计 停车场微信小程序的设计与实现 (源码+文档)
  • 2025年危化品经营单位生产管理人员考试真题附答案
  • 【Elasticsearch】doc_values 可以用于查询操作
  • Pyecharts之散点图的视觉扩展
  • C语言初阶力扣刷题——349. 两个数组的交集【难度:简单】
  • AJAX RSS Reader:技术解析与应用场景
  • ESMC-600M蛋白质语言模型本地部署攻略
  • 【C++高并发服务器WebServer】-2:exec函数簇、进程控制
  • 【2024年华为OD机试】(A卷,100分)- 货币单位换算 (JavaScriptJava PythonC/C++)
  • AI Agent的测试与监控:保障稳定性的实战经验
  • VSCode 中的 Git Graph扩展使用详解
  • MapReduce,Yarn,Spark理解与执行流程
  • 【Android】布局文件layout.xml文件使用控件属性android:layout_weight使布局较为美观,以RadioButton为例
  • 私有包上传maven私有仓库nexus-2.9.2
  • FreeRtos的使用教程