基于SpringBoot的教务管理系统设计与实现(源码+调试)

news2024/11/25 4:58:05

项目描述

临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SpringBoot的教务管理系统设计与实现。

功能需求

本教务管理系统通过分析和确定系统的角色和功能划分,按照业务合理区分为不同的菜单功能模块。从教学业务以及学校管理人员的角度出发,对每个功能的需求实现点进行人性化详细的构思。本系统未做完善的用户体系,只是简单的分为了4个用户分别为:

  1. 系统管理员:顶层管理员,是教务人员的上级,只管理教务中公共基础的数据,例如:角色管理,权限管理等,如果需要配置角色权限,请登录该用户。
  2. 教务人员:学院级别,每个学院的教务管理员管理自己学院下的相关信息。
  3. 教师
  4. 学生
    具体功能可以根据角色权限配置菜单按钮。
部分效果图

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

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

部分代码
   @GetMapping("/data")
    @ResponseBody
    public Map<String, Object> mainData() {
        Map<String, Object> map = new ConcurrentHashMap<>();
        MemoryMXBean mem = ManagementFactory.getMemoryMXBean();
        MemoryUsage nonHeapMemoryUsage = mem.getNonHeapMemoryUsage();
        MemoryUsage heapMemoryUsage = mem.getHeapMemoryUsage();
        //初始的总内存
        long init = heapMemoryUsage.getInit();
        //最大可用内存
        long max = heapMemoryUsage.getMax();
        //已使用的内存
        long used = heapMemoryUsage.getUsed();
        long total = heapMemoryUsage.getCommitted();
        long max1 = nonHeapMemoryUsage.getMax() / 1024 / 1024;
        long free = (nonHeapMemoryUsage.getCommitted() - nonHeapMemoryUsage.getUsed()) / 1024 / 1024;
        long used1 = nonHeapMemoryUsage.getUsed() / 1024 / 1024;
        long total1 = nonHeapMemoryUsage.getCommitted() / 1024 / 1024;
        long totalMemory = total / 1024 / 1024;
        long freeMemory = (total - used) / 1024 / 1024;
        long maxMemory = max / 1024 / 1024;
        long UsedMemory = used / 1024 / 1024;
        map.put("totalMemory", totalMemory);
        map.put("freeMemory", freeMemory);
        map.put("maxMemory", maxMemory);
        map.put("UsedMemory", UsedMemory);
        map.put("nontotalMemory", total1);
        map.put("nonfreeMemory", free);
        map.put("nonmaxMemory", max1);
        map.put("nonUsedMemory", used1);
        return map;
    }

    @GetMapping("/page/{page}")
    public String page(@PathVariable("page") String page) {
        return "/web/" + page;
    }

    @GetMapping("/page/{category}/{page}")
    public String page(@PathVariable("category") String category, @PathVariable("page") String page) {
        return "/web/" + category + "/" + page;
    }

    @GetMapping("/findStudentPanel")
    public ResponseEntity findStudentPanel() {
        DecimalFormat df = new DecimalFormat(".0");
        TStudent student = (TStudent) getRealm();
        TClasses classes = classesService.findById(student.getClassesId());
        TSpecialty specialty = specialtyService.findById(classes.getSpecialtyId());
        List<CourseDTO> list = scoreService.findCourseByStudent(student.getId());
        StudentPanel studentPanel = new StudentPanel();
        studentPanel.setCourseNum(list.size());
        studentPanel.setStudent(student);
        studentPanel.setSpecialty(specialty);
        // 成绩能力模型
        int tongshi = 0;
        int zhuanye = 0;
        int shijian = 0;
        int gonggong = 0;
        int xueke = 0;
        for (CourseDTO courseDTO : list) {
            studentPanel.setTotalTime(studentPanel.getTotalTime() + courseDTO.getTotalTime());
            if (courseDTO.getScore() >= 60) {
                // 合格率
                studentPanel.setPassNum(studentPanel.getPassNum() + 1);
            }
            if (courseDTO.getSystemId().equals("1")) {
                gonggong += 1;
                studentPanel.setGonggong(studentPanel.getGonggong() + courseDTO.getScore());
            }
            if (courseDTO.getSystemId().equals("2")) {
                zhuanye += 1;
                studentPanel.setZhuanye(studentPanel.getZhuanye() + courseDTO.getScore());
            }
            if (courseDTO.getSystemId().equals("4")) {
                tongshi += 1;
                studentPanel.setTongshi(studentPanel.getTongshi() + courseDTO.getScore());
            }
            if (courseDTO.getSystemId().equals("5")) {
                shijian += 1;
                studentPanel.setShijan(studentPanel.getShijan() + courseDTO.getScore());
            }
            if (courseDTO.getSystemId().equals("6")) {
                xueke += 1;
                studentPanel.setXueke(studentPanel.getXueke() + courseDTO.getScore());
            }
        }
        // 缺勤次数
        studentPanel.setDisciplinary(student.getAbsent());
        // 合格率
        studentPanel.setEligiableRate(studentPanel.getPassNum() == 0 ? 0 : Double.valueOf(df.format(studentPanel.getPassNum() / (studentPanel.getCourseNum() * 1.0) * 100)));
        // 到课率
        studentPanel.setUpCourseRate(studentPanel.getDisciplinary() == 0 ? 0 : Double.valueOf(df.format(100.0 - studentPanel.getDisciplinary() / (studentPanel.getTotalTime() / 2.0) * 100)));
        // 成绩能力模型
        studentPanel.setGonggongRate(studentPanel.getGonggong() == 0 ? 0 : Double.valueOf(df.format(studentPanel.getGonggong() / (gonggong * 100.0) * 100)));
        studentPanel.setZhuanyeRate(studentPanel.getZhuanye() == 0 ? 0 : Double.valueOf(df.format(studentPanel.getZhuanye() / (zhuanye * 100.0) * 100)));
        studentPanel.setTongshiRate(studentPanel.getTongshi() == 0 ? 0 : Double.valueOf(df.format(studentPanel.getTongshi() / (tongshi * 100.0) * 100)));
        studentPanel.setXuekeRate(studentPanel.getXueke() == 0 ? 0 : Double.valueOf(df.format(studentPanel.getXueke() / (xueke * 100.0) * 100)));
        studentPanel.setShijanRate(studentPanel.getShijan() == 0 ? 0 : Double.valueOf(df.format(studentPanel.getShijan() / (shijian * 100.0) * 100)));
        // 统计缺勤
        int[][] absentCount = absentService.countStudentAbsent(getUserId());
        studentPanel.setAbsentCount(absentCount);
        return ResponseEntity.ok(studentPanel);
    }

    @GetMapping("/findUserPanel")
    public ResponseEntity findUserPanel() {
        JWPanel jwPanel = new JWPanel();
        // 统计最近7天缺勤
        int[][] absentCount = absentService.countStudentByJW(getRealm());
        jwPanel.setAbsentCount(absentCount);
        // 统计在校人数
        List<Integer> countGrade = studentService.countPeople(getRealm());
        jwPanel.setCountGrade(countGrade);
        // 统计缺课课时
        int[] courseDTOList = courseService.countDownCourseRate(getRealm(), absentCount);
        jwPanel.setDownCourseRate(courseDTOList);
        // 统计旷课时段
        int[] list = teacherCourseService.countDownCourseSection(getRealm(), absentCount);
        jwPanel.setDownCourseSectionRate(list);
        // 通知公告
        List moticeLists = userNoticeService.findNoticeByJW(getRealm());
        jwPanel.setNoticeList(moticeLists);
        return ResponseEntity.ok(jwPanel);
    }

    @GetMapping("/findTeacherPanel")
    public ResponseEntity findTeacherPanel(String teamId) {
        TeacherPanel teacherPanel = new TeacherPanel();
        // 通知公告
        List moticeLists = userNoticeService.findNoticeByTeacher(getRealm());
        teacherPanel.setNoticeList(moticeLists);
        // 教学完成进度
        TeacherSchedule teacherSchedule = teacherCourseService.countTeacherSchedule(getRealm(), teamId);
        // 缺课情况
        List<CourseDTO> list = teacherCourseService.countAbsent(getRealm(), teamId);
        teacherPanel.setCourseList(list);
        teacherPanel.setTeacherSchedule(teacherSchedule);
        return ResponseEntity.ok(teacherPanel);
    }
安装部署需求

前后端分离,idea运行启动

系统部署

系统开发后,在生产环境配置项目运行环境,具体步骤如下:
安装linux或者windows10操作系统;
安装JDK1.8并配置环境变量;
安装node14并配置环境变量;
安装MySQL5.7版本以上版本数据库,创建数据库并执行脚本创建表;
在idea中运行打包;

本项目用到的技术和框架

1.开发语言:Java
2.开发模式:B/S
3.数据库:MySQL5.7
4.框架:SpringBoot+vue

本项目中的关键点

此系统的开发采用java语言开发,基于B/S结构,这些开发环境使系统更加完善。使用到的工具和技术都是开源免费的。

环境工具

开发工具 IDEA
语言 JDK1.8 、SpringBoot、vue
硬件:笔记本电脑;
软件:Tomcat8.0 Web服务器、Navicat数据库客户端、MySQL;
操作系统:Windows 10;
其它软件:截图工具、常用浏览器;
以上是本系统的部分功能展示,如果你的选题正好相符,那么可以做毕业设计或课程设计使用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

finalshell连接linux的kali系统

kali的ssh服务似乎是默认关闭的&#xff0c;笔者在玩CentOS系统时可以直接用finalshell完成连接&#xff0c;但kali不行&#xff0c;需要先手动开启ssh服务。 开启kali的ssh服务 输入【ssh start】命令开启ssh服务&#xff0c;可以用【ssh status】命令查看ssh状态&#xff0c…

【Linux】vim 操作指令详解

Linux 1 what is vim &#xff1f;2 vim基本概念3 vim的基本操作 &#xff01;3.1 vim的快捷方式3.1.1 复制与粘贴3.1.2 撤销与剪切3.1.3 字符操作 3.2 vim的光标操作3.3 vim的文件操作 总结Thanks♪(&#xff65;ω&#xff65;)&#xff89;感谢阅读下一篇文章见&#xff01;…

API协议设计的十种技术

文章目录 前言一、REST二、GraphQL三、gRPC&#xff08;google Remote Procedure Calls&#xff09;四、Webhooks五、服务端的事件发送——SSE&#xff08;Server-sent Events&#xff09;六、EDI&#xff08;Electronic Data Interchange&#xff09;七、面向API 的事件驱动设…

【.NET Core】深入理解异步编程模型(APM)

【.NET Core】深入理解异步编程模型&#xff08;APM&#xff09; 文章目录 【.NET Core】深入理解异步编程模型&#xff08;APM&#xff09;一、APM概述二、IAsyncResult接口2.1 BeginInvoke2.2 EndInvoke2.3 IAsyncResult属性2.4 IAsyncResult异步演示 三、通过结束异步操作来…

【Linux】yum本地配置

配置将来是在干什么&#xff1f; yum会根据/etc/yum.repos.d/该路径下面的配置文件&#xff0c;来构成自己的下载路径&#xff0c;&#xff08;根据OS版本&#xff0c;根据你要下载的软件&#xff09;&#xff0c;yum帮助我们下载&#xff0c;安装 一般的机器&#xff0c;内置…

Operation

contents 服务器一、相关概念1.1 云服务器与实例1.2 关于域名解析延时与80端口1.3 关于备案1.4 关于SSL证书1.5 关于SSL证书的签发1.6 关于SSL证书的部署1.7 关于LNMP和LAMP1.8 关于bt面板 二、单服务器单一级域名多网站2.1 创建多个二级域名2.2 解析二级域名绑定到服务器上2.3…

【QML COOK】- 011-动画插值设置

QML中内置了一些动画插值类型。不同的插值类型可以通过Animation的easing属性设置。具体可见&#xff1a;PropertyAnimation QML Type | Qt Quick 6.6.1 1. 创建工程在Main.qml&#xff0c;中编写如下代码 import QtQuickWindow {width: 1000height: 100visible: truetitle: …

数字人直播系统跟无人直播系统的区别是什么?如何选择呢?

有媒体预测&#xff0c;未来几年&#xff0c;数字人工智能将呈现爆发式的增长&#xff0c;数字人系统将广泛应用于各个行业&#xff0c;比如数字人直播&#xff0c;数字人短视频播报&#xff0c;数字人制作的海报宣传等等&#xff0c;当然&#xff0c;这其中应用最广的当属数字…

Python实现离散选择Logit模型(Logit算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 Logit模型&#xff08;Logit model&#xff0c;也译作“评定模型”&#xff0c;“分类评定模型”&…

从想象到现实:Midjourney的AI图像生成之旅

从想象到现实&#xff1a;Midjourney的AI图像生成之旅 继ChatGPT之后&#xff0c;Midjourney作为AI艺术的璀璨明珠&#xff0c;吸引了全球范围内的广泛关注。这款工具通过先进的AI技术&#xff0c;将用户输入的文字描述转化为精美绝伦的图像。无论是风景画、肖像画还是抽象艺术…

CentOS7的安装配置

一. CentOS7的安装【在虚拟机中】 首先创建一个虚拟机&#xff0c; 这个没什么好说的&#xff0c;基本上都是下一下一步安装。 注意它的存放位置最好不要放在C盘&#xff0c; 以及开始创建时选择”稍后安装操作系统“ 创建完成后再配置镜像文件 开启虚拟机&#xff0c;继续下…

【K8S】Kubernetes 中滚动发布由浅入深实战

目录 一、Kubernetes中滚动发布的需求背景1.1 滚动发布1.2 滚动发布、蓝绿发布、金丝雀发布的区别 二、Kubernetes中实现滚动发布2.1 定义Kubernetes中的版本2.2 创建 Deployment 资源对象2.2.1 在 Yaml 中定义 Deployment 资源对象2.2.2 执行命令创建 Deployment 资源对象 三、…

三、MySQL之创建和管理表

一、基础知识 1.1 一条数据存储的过程 存储数据是处理数据的第一步 。只有正确地把数据存储起来,我们才能进行有效的处理和分析。否则,只 能是一团乱麻,无从下手。 在 MySQL 中, 一个完整的数据存储过程总共有 4 步,分别是创建数据库、确认字段、创建数据表、插入数据。 …

基于SpringBoot Vue航空机票预订系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

【Linux与windows的文件互相传输】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 关于 rzsz 注意事项 查看软件包 使用命令 下载到本地&#xff08;使用sz的命令&#xff09; 本地文件上传到Linux中&#xff08;使用rz命令&#xff09; 方法一…

无刷电机学习-方波电调 程序篇1(AM32)

一、AM32简介 AM32 固件专为 ARM 处理器设计&#xff0c;用于控制无刷电机 (BLDC)。该固件旨在安全、快速、平滑、快速启动和线性油门。它适用于多种车辆类型和飞行控制器。 AM32具有以下特点&#xff1a; 可通过 betaflight 直通、单线串行或 arduino 升级固件伺服 PWM、Dsh…

Druid集群搭建手册

1. Java环境安装和配置 建议使用JDK1.8。可以参考《Linux安装JDK完整步骤》。 2. 创建用户 创建druid用户&#xff0c;用来管理druid相关的服务。执行命令&#xff1a; useradd druid #创建用户 passwd druid #设置druid用户密码 3. Zookeeper安装和配置 Druid的服务套…

MySQL---多表分组查询综合练习

创建dept表 CREATE TABLE dept ( deptno INT(2) NOT NULL COMMENT 部门编号, dname VARCHAR (15) COMMENT 部门名称, loc VARCHAR (20) COMMENT 地理位置 ); 添加dept表主键 mysql> alter table dept add primary key(deptno); Query OK, 0 rows affected (0.02 s…

【手撕C语言 第六集】函数(上)

文章目录 一、函数是什么&#xff1f;二、C语言中函数的分类&#xff1a;1.库函数1.1 如何学会使用库函数&#xff1f; 2. 自定义函数 三、函数的参数1.实际参数&#xff08;实参&#xff09;&#xff1a;2.形式参数&#xff08;形参&#xff09;&#xff1a; 四、函数的调用&a…

深度学习-循环神经网络-RNN实现股价预测-LSTM自动生成文本

序列模型(Sequence Model) 基于文本内容及其前后信息进行预测 基于目标不同时刻状态进行预测 基于数据历史信息进行预测 序列模型:输入或者输出中包含有序列数据的模型 突出数据的前后序列关系 两大特点: 输入(输出)元素之间是具有顺序关系。不同的顺序,得到的结果应…