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.查询课程表代码
@Overridepublic 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.保存学生信息代码
@Overridepublic 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.用户登录代码
@Overridepublic 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, "登录成功!");}
相关文章:

SpringBoot+Electron教务管理系统 附带详细运行指导视频
文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.查询课程表代码2.保存学生信息代码3.用户登录代码 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SpringBootElectron框架开发的教务管理系统。首先ÿ…...

操作系统(Linux Kernel 0.11Linux Kernel 0.12)解读整理——内核初始化(main init)之控制台工作
前言 在 Linux 内核中,字符设备主要包括控制终端设备和串行终端设备,对这些设备的输入输出涉及控制台驱动程序,这包括键盘中断驱动程序 keyboard.S 和控制台显示驱动程序 console.c,还有终端驱动程序与上层程序之间的接口部分。 终端驱动程序…...
Autogen_core: Message and Communication
目录 完整代码代码解释1. 消息的数据类:2. 创建代理人(MyAgent):3. 创建和运行代理人的运行时环境:4. 根据发送者路由消息的代理(RoutedBySenderAgent):5. 创建和运行带路由的代理&a…...
ComfyUI工作流教程、软件使用、开发指导、模型下载
在人工智能和设计技术迅速发展的今天,AI赋能的工作流已成为创意设计与生产的重要工具。无论是图片处理、服装试穿,还是室内设计与3D建模,这些智能化的解决方案极大地提高了效率和创作质量。 为了帮助设计师、开发者以及AI技术爱好者更好地利用这些工具,我们整理了一份详尽…...

零基础Vue学习1——Vue学习前环境准备
目录 环境准备 创建Vue项目 项目目录说明 后续开发过程中常用命令 环境准备 安装开发工具:vscode、webstorm、idea都可以安装node:V22以上版本即可安装pnpm 不知道怎么安装的可以私信我教你方法 创建Vue项目 本地新建一个文件夹,之后在文件夹下打开…...

定西市建筑房屋轮廓数据shp格式gis无偏移坐标(字段有高度和楼层)内容测评
定西市建筑房屋轮廓数据是GIS(Geographic Information System,地理信息系统)领域的重要资源,用于城市规划、土地管理、环境保护等多个方面。这份2022年的数据集采用shp(Shapefile)格式,这是一种…...

汉语向编程指南
汉语向编程指南 一、引言王阳明代数与流形学习理论慢道缓行理性人类型指标系统为己之学与意气实体过程晏殊几何学半可分离相如矩阵与生成气质邻域镶嵌气度曲面细分生成气质邻域镶嵌气度曲面细分社会科学概论琴生生物机械科技工业研究所软凝聚态物理开发工具包琴生生物机械 报告…...
Writing an Efficient Vulkan Renderer
本文出自GPU Zen 2。 Vulkan 是一个新的显式跨平台图形 API。它引入了许多新概念,即使是经验丰富的图形程序员也可能不熟悉。Vulkan 的主要目标是性能——然而,获得良好的性能需要深入了解这些概念及其高效应用方法,以及特定驱动程序实现的实…...
AI常见的算法
人工智能(AI)中常见的算法分为多个领域,如机器学习、深度学习、强化学习、自然语言处理和计算机视觉等。以下是一些常见的算法及其用途: 1. 机器学习 (Machine Learning) 监督学习 (Supervised Learning) 线性回归 (Linear Regr…...

LibreChat
文章目录 一、关于 LibreChat✨特点 二、使用LibreChat🪶多合一AI对话 一、关于 LibreChat LibreChat 是增强的ChatGPT克隆:Features Agents, Anthropic, AWS, OpenAI, Assistants API, Azure, Groq, o1, GPT-4o, Mistral, OpenRouter, Vertex AI, Gemi…...

Spring Boot 日志:项目的“行车记录仪”
一、什么是Spring Boot日志 (一)日志引入 在正式介绍日志之前,我们先来看看上篇文章中(Spring Boot 配置文件)中的验证码功能的一个代码片段: 这是一段校验用户输入的验证码是否正确的后端代码,…...

Spring Boot 实现文件上传和下载
文章目录 Spring Boot 实现文件上传和下载一、引言二、文件上传1、配置Spring Boot项目2、创建文件上传控制器3、配置文件上传大小限制 三、文件下载1、创建文件下载控制器 四、使用示例1、文件上传2、文件下载 五、总结 Spring Boot 实现文件上传和下载 一、引言 在现代Web应…...

慕课:若鱼1919的视频课程:Java秒杀系统方案优化 高性能高并发实战,启动文档
代码: Javahhhh/miaosha191: 运行成功了慕课若鱼1919的视频课程:Java秒杀系统方案优化 高性能高并发实战https://github.com/Javahhhh/miaosha191 https://github.com/Javahhhh/miaosha191 miaosha项目启动文档 需安装的配置环境: VMwar…...

React第二十七章(Suspense)
Suspense Suspense 是一种异步渲染机制,其核心理念是在组件加载或数据获取过程中,先展示一个占位符(loading state),从而实现更自然流畅的用户界面更新体验。 应用场景 异步组件加载:通过代码分包实现组件…...
虚幻基础08:组件接口
能帮到你的话,就给个赞吧 😘 文章目录 作用 作用 组件接口:可以直接调用对方的组件接口,而无需转换为actor。 实现对象间的通知。 A 通知 B 做什么。...

iPhone SE(第三代) 设备详情图
目录 产品宣传图内部图——后设备详细信息 产品宣传图 内部图——后 设备详细信息 信息收集于HubWeb.cn...

2025苹果CMS v10短剧模板源码
文件不到70kb,加载非常快 无配置,没有详情页,上传就可以直接使用 使用教程:上传到网站template目录并解压、进入网站后台选择模板 注意:默认调用ID为1的数据和扩展分类,建议新建站使用 源码下载…...

2007-2020年各省国内专利申请授权量数据
2007-2020年各省国内专利申请授权量数据 1、时间:2007-2020年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区名称、年份、国内专利申请授权量(项) 4、范围:31省 5、指标解释:专利是专利权的简称&…...
第一天-嵌入式应用开发介绍
首先,我们来介绍一下嵌入式的发展路线,虽然嵌入式的知识点众多,但是总体上来说,嵌入式分为以下两条主要路线: 单片机开发ArmLinux开发 当然,还有其他的一些例如FPGA这种的我们就不计算在内了,F…...
约瑟夫问题(信息学奥赛一本通-2037)
【题目描述】 N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M 的人出圈;…输出依次出圈的人的编号。 【输入】 输入N和M。 【输出】 输出一行,依次出圈的人的编号。 【输入样…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...