基于Java+SpringBoot+Vue前后端分离学生管理系统设计与实现

news2024/9/24 15:24:49

博主介绍:✌全网粉丝3W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌

博主作品:《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦

🍅文末关注公众号获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟
 

 ✨【微服务】Nacos为什么丢弃短连接(http)而选择拥抱长连接(gRPC)

目录

一、前言

二、系统设计

1、系统运行环境

2、系统架构设计

三、系统需求简介

四、功能截图

1、登录界面

2、管理员

2.1、系统管理

2.2、教师管理

2.3、学生管理

2.4、年级管理

2.5、班级管理

2、教师

2.1、教师管理

2.2、学生管理

2.3、班级管理

3、学生

3.1、学生信息

3.2、学生班级

五、实现代码

1、班级控制器

2、班级mapper

六、获取源码


一、前言

    学生管理系统(Student Management System),以下简称SMS,是针对学校人事处的大量业务处理工作而开发的管理软件,是典型的管理信息系统(Management Information System)。它是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,它能够为用户提供充足的信息和快捷的查询手段。能有效的帮助学校和老师掌握学生的情况,为学生提供成绩跟课程方面的查询。在传统模式下利用人工进行学生信息管理,存在着较多的缺点,如:效率底,保密性差,时间一长将产生大量的文件和数据,更不便于查找,更新,维护等。诸如这些情况,令学校管理者对学生的信息管理带来了很大困难,严重影响了教育工作者的工作效率。随着科学技术的不断提高,计算机科学日渐成熟, 使用日趋成熟的计算机技术来代替传统的人工模式,来实现学生信息的现代化管理,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对学生信息进行管理,具有着手工管理所无法比拟的优点.例如:检索迅速、查找方便、易修改、可靠性高、存储量大、数据处理快捷、保密性好、寿命长、成本低、便于打印等。这些优点能够极大地提高学生管理的效率,也是学校的科学化、正规化管理,与世界接轨的重要条件。用计算机制作的学生信息管理系统还可以通过功能强大的Internet网及时的向学生的家长传递该生在校的最新成绩,有助于学校与家长的信息互动,为更好地把握学校的教育方针起到了一定的促进作用!因此,开发这样一套管理软件成为很有必要的事情。
 

二、系统设计

1、系统运行环境

开发系统:Windows10左右

架构模式:MVC/前后端分离

JDK版本:Java JDK1.8

开发工具:IDEA

数据库版本: mysql5.7

数据库可视化工具: SQL yog或Navicat for MySQL

服务器:SpringBoot自带 apache tomcat

主要技术:Java、SpringBoot2、MyBatis-plus、MySQL、Shiro、Html、Vue、Elementui等
 

2、系统架构设计

 

三、系统需求简介

1.1 系统的主要功能

学生信息管理系统具有以下功能:

学籍管理:对学生的信息档案进行管理,主要包括学生档案信息的修改、删除、添加、档案查询及档案输出等,其中档案查询可以根据学号、姓名查询需要的信息;档案输出可以输出学生档案、成绩、课程表等。学生档案记录主要包括:学号、姓名、出生日期、年龄、性别、政治面貌、入学时间、个人简介、照片、家庭住址、邮编、所在系别以及所学专业等字段。

成绩管理:对学生的成绩进行管理,主要就是成绩查询,成绩查询可以按学号、姓名进行查询。成绩记录主要包括:学期、学号、姓名、课程号以及成绩字段等。

课程管理:学生可以通过该模块进行课程表查看、打印课程表。

选修课选择:对学生报选修课进行管理,学生可以对自己喜爱的课程进行选择。

系统维护:教师对学生的密码进行管理,主要包括增加新用户和用户修改。其中用户修改可以实现对学生的密码修改和学生用户名的删去。

系统辅助工具:通过该模块用户可以打开一些辅助工具,如记事本和记事本。

退出系统:离开本学生信息管理系统。

1.2 设计方法概述

本学生信息管理系统是采用面向对象的程序设计思想进行编制的,整个系统由若干个表单、类、报表以及一个主菜单组成,有项目管理器统一管理全部程序的编写和调试。用户可以通过主菜单或总表单调用系统的各项功能。

1、面向对象设计不再是单纯的从代码的第一行一直编到最后一行,而是考虑如何创建类和对象,利用类和对象来简化程序设计,并提供代码的封装和可重用性,便于程序的维护与扩展。

2、所谓的对象是一种抽象的名称,用来对应实现世界存在的“东西”。一个窗口、一个按钮、一个菜单都可视为一个对象,而按钮对象、菜单对象、又会出现在窗口对象中,因此按钮对象、菜单对象便是窗口的组件之一。对象内部的数据是不能随意更改的,必须由外部向其传递信息,再由对象按其方法加以处理。用户无需知道其任何细节,操作是封闭的,对象之间能通过函数调用相互通信。

3、类可视为一个产品模具、一个模块。在面向对象设计中,类是对象的原型,是对象的制作器。类的概念是面向对象程序设计最重要的特征。所谓类,是指由数据结构及其相关操作所形成的集合,描述该类任一对象的共同的行为特征,是对一组性质相同的对象的程序描述,概括了对象的共同性质和数据。

4、面向对象设计的核心是类的设计。

5、设计的学生信息管理系统也是建立在一系列类基础之上的,其编程的思想是:先根据一定的需要创建一系列的子类或直接调用PB提供的基类,编制程序时,由这些类派生出相应的对象,所派生出的对象继承了其父类所有的功能,而且具有很好的封装性,这样就可利用派生出的对象像搭积木一样来设计自己的程序。打个比方,就比如要制造一台机器,首先要制造各种零件的模具,然后用制造好的模具生产出所需的零件,所有这些做完后,剩下的就只是如何把这些零件组装起来,这样一台机器就很容易制造出来了。实际编程也是如此。每个表单都是由一定数量的对象按某一种方式组合在一起的,程序编制的核心是类的设计。

1.3 学生信息管理系统的现状分析

1.3.1 学生信息管理系统应用的现状

随着我国国民经济建设的蓬勃发展和社会主义市场经济体制的迅速完善,各个行业都在积极使用现代化的手段,不断改善服务质量,提高工作效率,这些都在很大程度上给企业提出越来越严峻的挑战,对企业体系无论是在行政职能、企业管理水平以及优质服务上都提出更高的要求。建设一个科学高效的信息管理系统是解决这一问题的必由之路。而各大高校对学生信息管理也面临着同样严峻的形势。学生信息管理作为高校内部的一种学生基本档案管理也是如此,由于高校的在校人数较多,每一位学生的具体实际情况也不尽相同,如果没有一个完整的管理系统去完成,将使工作变得复杂冗烦,并且对于工作的效率也将使一个致命的打击,使无论如何也无法适应现代社需要的。

1.3.2 管理系统开发的目的

为了适应现代化社会的发展,管理系统就应运而生了,目的很简单就使为使现代管理中排除复杂和不准确性,并且适应现代发展。系统开发后,可以对工资进行管理、查询、打印等一系列的功能的实现。便于工作效率的提高。

四、功能截图

1、登录界面

 

2、管理员

2.1、系统管理

 

2.2、教师管理

1)教师信息

 

2)任课班级

 

2.3、学生管理

1)学生信息

 

2)学生班级

 

2.4、年级管理

 

2.5、班级管理

 

2、教师

2.1、教师管理

 

2.2、学生管理

 

2.3、班级管理

 

3、学生

3.1、学生信息

 

3.2、学生班级

 

五、实现代码

1、班级控制器

@RestController
@RequestMapping("/clazz")
public class ClazzController {

    //日志记录器
    private static final Logger logger= LoggerFactory.getLogger(ClazzController.class);

    @Autowired
    ClazzServiceImpl clazzService;


    /**
    *@description:获取班级的分页数据
    *@param  msg
    *@return
    *@Author CeaM
    *@date 2022/11/17--15:20
    */
    @RequestMapping(value = "/getPage",method = RequestMethod.POST)
    public BaseResponse<Map> getPage(@RequestBody JSONObject msg){
        System.out.println("-------------------"+msg.toJSONString());
        //每页显示数据
        Integer pagesize = Integer.valueOf(msg.getString("pagesize"));
        //当前页
        Integer currentPage= Integer.valueOf(msg.getString("currentPage"));
        //班级名称、班级编号
        String cno = msg.getString("cno");
        String name = msg.getString("name");
        PageInfo<Clazz> pageInfo = clazzService.getPageClazz(cno,name,pagesize,currentPage);
        logger.info("pageInfo:"+pageInfo);
        //存储返回的结果,线程安全的map集合
        Map<String,Object> map = new LinkedHashMap<>();
        map.put("clazz",pageInfo.getList());
        map.put("total",pageInfo.getTotal());
        return new BaseResponse<Map>(true,"班级级信息",map,20000);
    }

    /**
    *@description: 添加班级信息
    *@param  clazz 班级信息
    *@return
    *@Author CeaM
    *@date 2022/11/18--9:59
    */
    @RequestMapping(value = "insertClazz",method = RequestMethod.POST)
    public BaseResponse<String> insertClazz (@RequestBody Clazz clazz){
        //新添加的班级,id自增、默认未删除、班级人数为0
        clazz.setId(null);
        clazz.setIsdelete(0);
        clazz.setNumber(0);
        Integer res = clazzService.InsertClazz(clazz);
        //结果描述
        String msg = null;
        Boolean result = null;
        if(res > 0){
            msg = "添加成功";
            result = true;
        }else if (res == -1){
            msg = "班级已存在";
            result = false;
        }else if (res == 0){
            msg = "添加失败";
            result = false;
        }
        return new BaseResponse<String>(result,msg,"",20000);
    }

    /**
    *@description:更新班级信息
    *@param
    *@return
    *@Author CeaM
    *@date 2022/11/18--10:44
    */
    @RequestMapping(value = "updateClazz",method = RequestMethod.POST)
    public BaseResponse<String> updateClazz(@RequestBody Clazz clazz){
        Integer res = clazzService.updateClazz(clazz);
        Boolean result = null;
        String msg = null;
        if (res > 0){
            result = true;
            msg = "信息更新成功";
        }else {
            result =false;
            msg = "信息更新失败";
        }
        return new BaseResponse<String>(result,msg,"",20000);
    }

    /**
    *@description:删除班级信息,实际是更改isdelete状态为1
    *@param clazz
    *@return
    *@Author CeaM
    *@date 2022/11/18--11:15
    */
    @RequestMapping(value = "/deleteClazz",method = RequestMethod.POST)
    public BaseResponse<String> deleteClazz(@RequestBody Clazz clazz){
        //设置该班级信息为删除状态,进行后续状态修改操作
        clazz.setIsdelete(1);
        Map<String,Object> map = clazzService.deleteClazz(clazz);
        return new BaseResponse<String>((Boolean) map.get("success"),(String) map.get("msg"),"",20000);
    }

    /**
    *@description:将数据导出为excel文件,导出班级信息
    *@param  msg List的JSON数据
    *@return
    *@Author CeaM
    *@date 2022/11/18--11:25
    */
    @RequestMapping("/download")
    public void exportExcel(@RequestBody List<Clazz> msg, HttpServletResponse response) throws IOException {
        String nowtime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        String fileName = URLEncoder.encode("班级信息-"+nowtime, "UTF-8");
        /**setContentType是用来区分数据类型的
         * {".xls", "application/vnd.ms-excel" },
         * {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
         */
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");

        //下载文件的默认名称,前端会根据res.headers["content-disposition"].split("=")[1]获取文件名
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
        //设置不缓存
        response.addHeader("Pargam", "no-cache");
        response.addHeader("Cache-Control", "no-cache");
        EasyExcel.write(response.getOutputStream(), Clazz.class).sheet("班级信息").doWrite(msg);
    }
}

2、班级mapper

@Repository
public interface ClazzMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(Clazz record);

    Clazz selectByPrimaryKey(Integer id);

    List<Clazz> selectAll();

    int updateByPrimaryKey(Clazz record);

    /**
     * 根据班级编号、班级名称动态获取数据,已过滤isdelete为1的数据
     * @param cno
     * @param name
     * @return
     */
    List<Clazz> getClazz(@Param("cno") String cno, @Param("name") String name);

    /**
     * 根据班级编号、班级名称动态获取数据,包括isdelete为1的数据
     * @param cno
     * @param name
     * @return
     */
    List<Clazz> getClazzAll(@Param("cno") String cno, @Param("name") String name);

    /**
     * 根据班级编号更改,整个数据进行修改
     * @param clazz
     * @return
     */
    Integer updateByCno(Clazz clazz);


    /**
     * 根据班级编号 OR 班级名称更改,整个数据进行修改
     * @param clazz
     * @return
     */
    Integer updateByCnoOrName(Clazz clazz);

    /**
     * 根据班级编号和名称删除班级信息,实际是更改isdelete = 1;或者用于班级信息的状态更改
     * @param clazz
     * @return
     */
    Integer deleteClazz(Clazz clazz);

    /**
     * 更新班级的总人数
     * @param cno 班级编码
     * @param number 总人数
     * @return
     */
    Integer updateClazzNumber(@Param("cno")String cno,@Param("number")Integer number);
}

六、获取源码

 大家点赞收藏关注评论啦 、关注下方公众号获取联系方式👇🏻👇🏻

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

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

相关文章

2023年二月份图形化二级打卡试题

活动时间 从2023年 2月1日至1月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; &#xff08;1&#xff09;小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 &#xff08;2&#xff09;小朋友做完题目后&…

数组中和为0的三个数

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意: 答案中不可以包含重复的三元组。 示例 1: 输入: num…

了解SLI、SLO和SLA

了解SLI、SLO和SLA 概念解释 服务水平指标(SLI) SLI代表目前服务的状态&#xff0c;例如可以是最基本的接口成功率、p99响应时间&#xff0c;也可以是一些业务指标&#xff0c;例如用户投诉率之类的。是可量化&#xff0c;是可确定的。 服务水平目标(SLO) SLO是目标&#x…

【树】哈夫曼树和哈夫曼编码

哈夫曼&#xff08;Huffman&#xff09;树&#xff0c;又称最优树&#xff0c;是一类带权路径长度最短的树。最优二叉树&#xff08;哈夫曼树&#xff09;路径&#xff1a;从树中一个结点到另一个结点之间的分支构成这两个结点之间的路。路径长度:路径上的分支数目&#xff1b;…

mysql分组排序取组内第一的数据行获取分组后,组内排名第一或最后的数据行。

前言&#xff1a; group by函数后取到的是分组中的第一条数据&#xff0c;但是我们有时候需要取出各分组的最新一条&#xff0c;该怎么实现呢&#xff1f; 本文提供两种实现方式。 一、准备数据 DROP TABLE IF EXISTS tb_dept; CREATE TABLE tb_dept (id bigint(20) UNSIG…

chat聊天系统消息消费时遇到的问题及优化思路

前言 之前有段工作经历涉及到了chat相关&#xff0c;而消息的发送 -> 存储 -> 消费是由不同的团队负责的&#xff0c;因此消息如何再多个团队之间流通、以及通过什么介质传递都是需要考虑的问题。 之前我负责过一些消息消费的相关工作&#xff0c;消息发送团队将消息推…

【Linux】简介磁盘|inode|动静态库

目录一.简介磁盘1.磁盘的物理结构&#xff1a;2.磁盘存储方式&#xff1a;3.磁盘的逻辑抽象&#xff1a;二.inode&&文件系统1.inode文件属性&#xff08;inode&#xff09;内容&#xff08;data block&#xff09;为什么删除一个文件相比于写一个文件要快得多&#xff…

若依配置教程(二)集成积木报表JimuReport

积木报表配置官网 在搭建好若依环境成功运行以后&#xff0c;我们先在这个系统中加一个小功能&#xff1a;JimuReport积木报表&#xff0c;以下步骤&#xff0c;我们按照官网教程&#xff0c;详细配置一下&#xff1a; 1.在ruoyi-admin文件夹下的pom.xml加入jar包依赖&#x…

MLP多层感知机理解

目录 .1简介 .2例子 2.1模型 2.2 实例 2.2.1 问题描述 2.2.2 数学过程 .3 代码 3.1 问题描述 3.2 代码 references&#xff1a; .1简介 多层感知机是全连接的 可以把低维的向量映射到高维度 MLP整个模型就是这样子的&#xff0c;上面说的这个三层的MLP用公式总结起来…

C 语言零基础入门教程(二十)

C 预处理器 C 预处理器不是编译器的组成部分&#xff0c;但是它是编译过程中一个单独的步骤。简言之&#xff0c;C 预处理器只不过是一个文本替换工具而已&#xff0c;它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器&#xff08;C Preprocessor&#x…

练手好福利!20个Python实战项目含源代码【2023最新】

高效学习源代码的步骤&#xff1a;1.运行程序&#xff0c;观察表现2.运行源码&#xff0c;断点调试&#xff0c;从头跟一边源码的执行流程&#xff0c;注意函数堆栈3.画类图、流程图&#xff0c;先把遇到的重要类记录下来&#xff0c;表明各个类的关系4.记录问题&#xff0c;把…

Unity XR

一、几个Unity XR Interaction Toolkit学习地址 1.B站视频 https://www.bilibili.com/video/BV11q4y1b74z/?spm_id_from333.999.0.0&vd_source8125d294022d2e63a58dfd228a7fcf63 https://www.bilibili.com/video/BV13b4y177J4/?spm_id_from333.999.0.0&vd_source8…

【对象的比较】java代码实现,详解对象的比较,Comparable接口和Comparator比较器

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#xff0c;&#x1f49e;&#x1f49e;&#x1f49e;今天的我们要学习的知识点是java对象的比较&#xff0c;不是大家现实生活中对象的比较&#xff0c;是java中new一个对象的那个对象&#xff0c;对象的比较到底是什么意思呢&…

24.网络编程(二)

目录 三.TCP通信 3.1 TCP协议特点 3.2 TCP协议通信场景 3.3 TCP通信模型演示 3.4 Socket 3.5 ServerSocket 3.6 注意事项 3.7 案例 3.7.1 TCP通信—单发单收 3.7.2 TCP通信—多发多收 3.7.3 TCP通信—同时接收多个客户端的消息。 3.7.4 TCP通信—使用线程池优化&am…

工业相机和镜头

工业相机和镜头镜头型号数据电源接口定焦镜头的调焦景深景深大小光圈相机、镜头选取参考镜头型号、数据电源接口、定焦镜头的调焦、景深、景深大小、光圈、相机、镜头选取 镜头型号 C&#xff0c;CS系列&#xff1a;相机镜头的C、CS接口非常相似&#xff0c;它们的接口直径、螺…

检索业务:基本数据渲染和排错

采用标签显示商品的数据 <div class"rig_tab"><div th:each"product:${result.getProducts()}"><div class"ico"><i class"iconfont icon-weiguanzhu"></i><a href"/static/search/#">…

5、数据的重构

目录 一、为什么进行数据重构 二、如何进行数据重构 一、为什么进行数据重构 进行数据分析时&#xff0c;有可能会发现数据的结构并不适合直接进行数据分析操作&#xff0c;如下面数据&#xff0c;但通过复制-粘贴-转置等方法操作又太繁琐&#xff0c;数据量小还行&#xff…

C++ 图进阶系列之 kruskal 和 Prim 算法_图向最小生成树的华丽转身

1. 前言 树和图形状相似&#xff0c;也有差异性。树中添加一条或多条边&#xff0c;可成图。图中减小一条或多条边&#xff0c;可成树。形态的变化由数据之间的逻辑关系决定。 图用来描述数据之间多对多关系。树用来描述数据之间一对多关系。 思考如下问题&#xff1f; 如果…

esp32 烧录协议

esp32的rom固化了出场固件。进入烧录模式后&#xff0c;esp32串口输出&#xff1a;给esp32烧录固件的时候&#xff0c;需要和rom的bootloder进行通讯。通讯时&#xff0c;使用 SLIP 数据包帧进行双向数据传输。每个 SLIP 数据包都以 0xC0 开始和结束。 在数据包中&#xff0c;所…

9、Servlet——Request对象

目录 一、get请求和post请求的区别 二、Request对象的应用 1、request主要方法 2、request获取数据 3、设置请求的编码格式 三、解决get请求收参乱码问题 四、解决post请求中文乱码问题 一、get请求和post请求的区别 在Servlet中用来处理客户端请求需要用doGet()方法或…