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

项目描述

临近学期结束,还是毕业设计,你还在做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;
其它软件:截图工具、常用浏览器;
以上是本系统的部分功能展示,如果你的选题正好相符,那么可以做毕业设计或课程设计使用。

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

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

相关文章

StableDiffusion新版汉化

新旧版不同&#xff0c;这里以新版为例&#xff0c;用的是带链接&#xff0c;可以更新的方法。 步骤&#xff1a; 1.找到这个位置&#xff0c;依次点击&#xff0c;注意选项。 2.点击加载&#xff0c;等待刷新。 ctrlF搜索 zh_CN Localization 右边点击install&#xff0c…

[Linux 杂货铺] —— 权限(文件权限和目录配置)

目录 &#x1f308;前言 &#x1f4c1; 文件的属性 &#x1f4c1; 权限的概念 &#x1f4c2;拥有者和所属组&#xff08;角色&#xff09;&#xff1a; &#x1f4c2;用户&#xff08;具体的人&#xff09;&#xff1a; &#x1f4c1; 权限的管理 &#x1f4c2;1. chmod…

Object.defineProperty、Proxy、Reflect-个人总结

Object.defineProperty 前言 用于给一个对象添加或者修改一个属性&#xff0c;返回操作后的对象。 写法&#xff1a;Object.defineProperty(对象&#xff0c;属性&#xff0c;配置对象) 配置对象 通过对配置对象不同的配置&#xff0c;可以将属性分为数据属性和存取属性。 数据…

[Linux]HTTP状态响应码列举

1xx&#xff1a;信息响应类&#xff0c;表示接收到请求并且继续处理 2xx&#xff1a;处理成功响应类&#xff0c;表示动作被成功接收、理解和接受 3xx&#xff1a;重定向响应类&#xff0c;为了完成指定的动作&#xff0c;必须接受进一步处理 4xx&#xff1a;客户端错误&#x…

7.Feign远程调用

2.Feign远程调用 先来看我们以前利用RestTemplate发起远程调用的代码&#xff1a; 存在下面的问题&#xff1a; •代码可读性差&#xff0c;编程体验不统一 •参数复杂URL难以维护 Feign是一个声明式的http客户端&#xff0c;官方地址&#xff1a;https://github.com/OpenF…

RabbitMQ消息应答与发布

消息应答 RabbitMQ一旦向消费者发送了一个消息,便立即将该消息,标记为删除. 消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个很长的任务并仅仅执行了一半就突然挂掉了,在这种情况下,我们将丢失正在处理的消息,后续给消费者发送的消息也就无法接收到了. 为了…

【BIAI】Lecture 6 - Somatosensory systems

Lecture 6- Somatosensory systems 专业术语 somatosensory system 体感系统 Thermoreceptors 温度感受器 Photoreceptors 光感受器 Chemoreceptoprs 化学感受器 hairy skin 毛发皮肤 glabrous skin 光滑皮肤 sensory receptors 感觉受体 dermal 真皮的 epidermal 表皮的 axon…

外包干了2个多月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

创建高打开率邮件标题的技巧:吸引潜在客户的秘诀

邮件打开率是指什么&#xff1f; 邮件打开率是指打开邮件的人数占发送的收件人总人数的比例。 邮件的打开率是衡量营销效果如何的一个非常重要的指标&#xff0c;而邮件标题又是影响邮件打开率非常重要的因素之一。所以&#xff0c;我们要要重视邮件标题。那我们应该如何编辑…

《移动通信原理与应用》——QPSK调制解调仿真

目录 一、QPSK调制与解调流程图&#xff1a; 二、仿真运行结果&#xff1a; 三、MATLAB仿真代码&#xff1a; 一、QPSK调制与解调流程图&#xff1a; QPSK调制流程图&#xff1a; QPSK解调流程图&#xff1a; 二、仿真运行结果&#xff1a; 1、Figure1:为发送端比特流情…

深入了解WPF控件:常用属性与用法(七)

掌握WPF控件&#xff1a;熟练常用属性&#xff08;七&#xff09; Menu 用于为应用程序指定命令或选项的项列表。它允许用户通过选择不同的菜单项来执行不同的命令或操作。 每个 Menu 可以包含多个 MenuItem 控件。 每个 MenuItem 都可以调用命令或调用 Click 事件处理程序。…

竞赛保研 电影评论情感分析 - python 深度学习 情感分类

1 前言 &#x1f525;学长分享优质竞赛项目&#xff0c;今天要分享的是 &#x1f6a9; GRU的 电影评论情感分析 - python 深度学习 情感分类 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 这…

vue3-组件基础

什么是组件 组件允许我们将 UI 划分为独立的、可重用的部分&#xff0c;并且可以对每个部分进行处理。在实际应用中&#xff0c;组件常常被组织成层层嵌套的树状结构。 定义一个组件 我们一般会将 Vue 组件定义在一个单独的 .vue 文件中&#xff0c;这被叫做单文件组件 (简称…

【加速】Ubuntu 22.04 LTS Steam++ Watt Toolkit 加速 github

项目地址 SteamTools: &#x1f6e0;「Watt Toolkit」是一个开源跨平台的多功能 Steam 工具箱。 下载linux版本 wget https://gitee.com/rmbgame/SteamTools/releases/download/3.0.0-rc.3/Steam%20%20_v3.0.0-rc.3_linux_x64.tgz 解压到/opt/steam sudo mkdir /opt/steam…

【C语言】扫雷游戏完整代码实现

目录 1.game.h 2.game.c 3.progress.c 4.运行结果 1.game.h #define _CRT_SECURE_NO_WARNINGS#include <string.h> #include <stdio.h> #include <time.h> #include<stdlib.h>#define ROW 9 #define COL 9 #define ROWS 11 #define COLS 11 #defin…

ctfshow-反序列化(web271-web276)

目录 web271 web272-273 web274 web275 web276 为什么不用分析具体为什么能成功 ,后面会有几个专题 会对php框架进行更深入的了解 这里面会专门的研究 为什么能够实现RCE 前面作为初步的熟悉 首先知道一下他的框架 知道框架的风格 知道啥版本可以用什么来打 首先先不用太研…

CopyOnWriteArrayList源码

CopyOnWriteArrayList源码 介绍 CopyOnWriteArrayList底层采用数组对元素进行存储&#xff0c;采用写时复制技术:写的时候加锁&#xff0c;将原数组拷贝一份&#xff0c;对新数组进行操作&#xff0c;新数组长度为原数组长度1,写入完成后替换原数组&#xff0c;原数组使用vol…

【Linux】Vagrant搭建Linux环境

1. Vagrant Vagrant是一个基于Ruby的工具&#xff0c;用于创建和部署虚拟化开发环境。它使用Oracle的开源VirtualBox虚拟化系统&#xff0c;使用 Chef创建自动化虚拟环境。 1.1 安装Vagrant 从Vagrant官网下载安装包&#xff0c;执行安装。 1.2 安装VirtualBox 从官网下载…

【linux基础】linux root用户密码忘记解决方式

方式一&#xff1a;进入单用户模式 1.开启虚拟机的时候&#xff0c;按下“e”健进入用户引导界面 2.再按下“e”&#xff0c;进入内核的编辑 3.找到kernel开头的选项&#xff0c;再次按下“e” 4. 输入 5. 按下“b”&#xff0c;启动 6. 启动后&#xff0c;输入passwd&#xf…

Git的管理操作

目录 前言 认识工作区、暂存区、版本库 小结&#xff1a; 使用场景--1&#xff1a; git log&#xff1a; 查看.git文件&#xff1a; 使用场景--2&#xff1a; git status&#xff1a; git diff&#xff1a; 进行提交&#xff1a; 总结&#xff1a; 版本回退 退…