基于Spring Boot的简易教务管理系统

数据库设计

因为教务系统主要分成了学生端,教师端,管理员端,因此需要创建三个表student,teacher,admin,表示三种角色。

  • student表:
    在这里插入图片描述

  • teacher表:
    在这里插入图片描述

  • admin表:
    在这里插入图片描述
    但是需要获取这个学生的课表信息,因此还需要创建一个course表,表示课程信息:

  • course表:
    在这里插入图片描述
    此外,为了实现选课功能,我们需要保证那些课是需要选择的,所以,新建一个selectCourse表,用于存放开放选课的课程:

  • selectCourse表

在这里插入图片描述
在管理员添加、修改学生信息的时候,如果我们需要修改学生的学院的,我们需要给出一个下拉框,所以我们需要创建academy表,表示不同的学院信息,同理我们需要创建major表,表示不同的专业信息。

  • major表:
    在这里插入图片描述

  • academy表:
    在这里插入图片描述
    所以总的表有:
    在这里插入图片描述

页面的设计

登录界面

为了使thymeleaf发生渲染作用,那么我们需要在对应的类上面使用的是@Controller注解,并且对应的方法上面不可以使用@ResponseBody注解,而不是@RestController注解(因为@RestController = @Controller + @ResponseBody)。一旦使用了@RestController或者@Controller + @ResponseBody注解,那么没有办法实现thymeleaf的渲染作用。

同时,如何来到登录界面之后,我们提交应该怎样获取登录用户的对应信息呢?此时我们将根据@RequestParam()注解,从而获取对应的信息,其中括号中的参数是我们想要获取的信息,这个参数需要和我们在template中的index中的名字需要一致

@PostMapping("/user/login")
    public String login(@RequestParam("username")String username,
                        @RequestParam("password")String password,
                        @RequestParam("identity")String identity,
                        Model model, HttpSession session) {
        this.identity = identity;
        //需要获取这个登录的用户名以及密码以及所勾选的角色(利用@RequestParam()就可以获得对应的参属信息
        //登录成功之后,返回到主页面
        //定义一个sql语句,然后返回一个对象
        if(StringUtils.isEmpty(username)){
            model.addAttribute("name","用户名不可以为空");
            return "index";
        }
        if(StringUtils.isEmpty(password)){
            model.addAttribute("password","登录密码不可以为空");
            return "index";
        }

        String sql = "select password from " + identity + " where name = ?";
        try{
            String pass = jdbcTemplate.queryForObject(sql, String.class, new Object[]{username});
            if(!password.equals(pass)){
                model.addAttribute("password","用户密码错误");
                return "index";
            }else{
                //session对象设置loginUser(自定义的),并且它的值为username
                session.setAttribute("loginUser",username);
                return "redirect:/dashboard";
            }
        }catch (EmptyResultDataAccessException e){
            //学生为null,说明查无此人
            model.addAttribute("msg","查无此人,请重新输入");
            return "index";
        }

    }

但是看到上面的代码,为什么添加一个try-catch异常呢?代码并不会发生异常啊,然而,当我们输入的是表中不存在的数据的时候,本来需要返回查无此人的信息,但是如果没有try-catch,而仅仅靠if判断pass是否为空,从而得知当前的用户是否存在于数据库中是不可以,他会发生报错:`Incorrect result size: expected 1, actual 0`,这就是因为jdbcTemplate调用queryForObject的时候发生了报错。所以为了发生这样的错误,需要使用try-catch,一旦检测到适应空的数据,就会执行catch语句
在这里插入图片描述
但是有一个bug没有解决,就是如果没有点击单选按钮的时候,就会发生了报错,具体原因还没有知道,如果有大佬知道的话,请指教哈!!!

提取公共部分

因为我们设计一个学生端的时候,有很多个选项,这时候我们需要提取一些公共部分,例如头部导航栏和侧边栏,因此我们定义了commons类,用来存放公共部分,然后利用thymelefat中的fragment来定义公共部分的名字,然后再对应的页面中插入这个公共部分即可。

<!--利用th:fragment来定义头部导航栏-->
<nav class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0" th:fragment="topbar">
<!--利用th:fragment来定义侧边栏这个公共部分-->
<nav class="col-md-2 d-none d-md-block bg-light sidebar" th:fragment="sidebar">

这时候我们利用th:replace或者th:insert在对应的页面中插入公共部分内容:

<!--利用th:insert插入公共部分的时候,需要使用的符号是~,并且括号中是对应html文件中的名字为topbar的
公共部分.所以这里是将resources下面的common文件夹下面的commons.html中的topbar插入-->
<div th:insert="~{common/commons::topbar}"></div>
<div th:insert="~{common/commons::sidebar}"></div>

此外还可以传递参数,从而实现点击侧边栏的某一项的时候实现高亮:

<!--当前在course.html界面,也就是点击了课程管理界面,此时我们需要这一项实现高亮-->
<div th:insert="~{common/commons::sidebar(active = 'course.html')></div>

那么根据上面的代码,我们来到common文件夹下面的commons.html侧边栏中的课程管理这一个功能,然后加上这个修饰:th:class="@{active=='course.html' ? 'nav-link active' : 'nav-link'},即如下所示:

<a th:class="${active == 'course.html' ? 'nav-link active' : 'nav-link'}" th:href="@{/getCourse}">
    课程管理
</a>

个人信息的修改

对于个人信息的修改,我们首先需要获取这个人原本的信息,然后再对相应的信息进行修改,然后执行sql语句实现更新,所以我们通过url来到toUpdatePage这个方法中,通过执行sql语句,来获取当前登录用户原来的信息,然后将这些信息添加到model中,来到updateInformation.html界面,就会看到这个用户原来的信息表单,然后进行修改,点击提交之后,根据url来到updateInformation方法中,然后执行sql语句进行更新。值得注意的是,有可能会修改用户名字,所以需要通过session进行修改实现同步修改用户的名字。

@GetMapping("/updateInformation")
    public String toUpdatePage(Model model,HttpSession session){
        //获取当前需要修改的学生信息
        Object loginUser = session.getAttribute("loginUser");//获取当前登录的用户
        String sql = "select * from student where name = ?";
        Student student = jdbcTemplate.queryForObject(sql,new Object[]{loginUser},new StudentMapper());
        //System.out.println(student);//输出原来的学生信息
        model.addAttribute("student",student);//将当前需要修改的学生获取,然后将其添加到前端页面
        return "student/updateInformation";//来到template中的student包中的updateInformation.html
    }
    @PostMapping("/updateInformation")
    public String updateInformation(Student student2,HttpSession session){
        System.out.println(student2);//输出修改后的学生信息
        //修改信息的时候,为了避免修改了学生的姓名,所以需要将session中的loginUser一并修改
        String sql = "update student set " +
                "stu_id = ?," +
                "name = ?," +
                "gender = ?," +
                "birth = ?," +
                "nationality = ?," +
                "into_time = ?," +
                "school_year = ?," +
                "phone = ?," +
                "address = ? " +
                "where stu_id = ?";
        jdbcTemplate.update(sql,new Object[]{
                student2.getStu_id(),
                student2.getName(),
                student2.getGender(),
                student2.getBirth(),
                student2.getNationality(),
                student2.getInto_time(),
                student2.getSchool_year(),
                student2.getPhone(),
                student2.getAddress(),
                student2.getStu_id()
        });//调用update方法,可以执行增,删,改的操作
        //如果需要修改登录用户的名字,那么虽然数据库修改成功了,但是前端页面也需要修改,所以需要
        //修改session中的loginUser的值.
        session.setAttribute("loginUser",student2.getName());
        return "redirect:/person";//修改成功之后,重新返回到个人信息界面
    }

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

在这里插入图片描述
值得注意的是,修改出生日期的时候,如果没有再配置文件中配置日期的输入格式,那么默认是’yyyy/MM/dd’的格式,此时,如果输入的是’yyyy-MM-dd’的话,那么就会发生报错,提示日期的个数有问题,提示信息的重点在于:Field error in object ‘student’ on field ‘birth’: rejected value [2001-05-25]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'birth'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2001-05-25'; nested exception is java.lang.IllegalArgumentException],所以我们需要在配置文件中指定日期的输入格式:

spring:
  mvc:
    format:
       date: 

指定之后,从而指定了日期的输入格式为’yyyy-MM-dd’,如果我们输入的是’yyyy/MM/dd’同样会发生上面的错误。

但是有一个问题没有解决的是:如果修改的日期是为:‘2001-08-30’,那么最后返回到数据库中信息为’2001-08-29’,最终显示再页面中的也是’2001-08-29’,如果有大佬知道的话,请指教哈!!!

课表查询

对于一个学生来说,如果这个学生修了这门课,所以就会有这一门课的成绩,所以需要再score表中查询这个学生的课程。一开始由于表没有考虑到这一点,就设计了course表,并且course表中含有stu_id这个列,但是后面才意识到一个课程可能会有很多学生修,所以不可能course中设置stu_id,然后这个课程只能对应一个学生,因此需要设置score表,这个表中含有course_id以及stu_id,通过stu_id,就可以知道他修的课程了

成绩查询

如果这一门课程的成绩不合格,我们需要设置表格背景颜色为red,合格的话,则设置为blue.
在这里插入图片描述
一开始我是这样写的:

<tbody th:each="score:${scores}">
    <tr th:if="${score.get('goal') < 60}" style="background-color: red">
        <td th:text="${score.get('course_id')}"></td>
        <td th:text="${score.get('course_name')}"></td>
        <td th:text="${score.get('type') == 1 ? '必修' : '选修'}"></td>
        <td th:text="${score.get('credit')}"></td>
        <td th:text="${score.get('goal')}"></td>
    </tr>
    <tr th:if="${score.get('goal') >= 60}" style="background-color: lightblue">
        <td th:text="${score.get('course_id')}"></td>
        <td th:text="${score.get('course_name')}"></td>
        <td th:text="${score.get('type') == 1 ? '必修' : '选修'}"></td>
        <td th:text="${score.get('credit')}"></td>
        <td th:text="${score.get('goal')}"></td>
    </tr>
</tbody>

尽管也能够实现,如果th:if中的值是true,那么这一行是存在的,否则不会存在这一行,但是显然这样会有代码的冗余,那么我们需要怎样,才能够避免这种情况,后来才发现通过th:bgcolor来实现,
在tr中设计th:bgcolor="${score.get('goal') < 60 ? 'red' : 'lightblue'}",这样我们只要写一个<tr></tr>就可以实现我们的目的了,所以修改后的代码为:

<tr th:bgcolor="${score.get('goal') < 60 ? 'red' : 'lightblue'}">
	<td th:text="${score.get('course_id')}"></td>
	<td th:text="${score.get('course_name')}"></td>
	<td th:text="${score.get('type') == 1 ? '必修' : '选修'}"></td>
	<td th:text="${score.get('credit')}"></td>
	<td th:text="${score.get('goal')}"></td>
</tr>

源码地址:https://gitee.com/MyGit_Test/simple_teacing_system
项目有些简陋,而且也存在一些问题:

  • 例如教师端希望录入成绩的时候,如何实现表格编辑,尽管我是用vue中的v-model进行了绑定,但是修改一行的时候,就会其他行的这一列。
  • 管理员端修改学生的学院的时候,专业的下拉框并没有发生改变,我希望的是专业能够随着学院的改变而改变的,但是不知道怎样来实现这个目的。
  • 课表中并没有实现我们日常中的表格形式,并不直观。

如果有大佬的话,请指教哈!!!

一、项目简介 本项目是一套基于SpringBoot教务管理系统,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本、软件工具、项目说明等,该项目可以直接作为毕设使用。 项目都经过严格调试,确保可以运行! 二、技术实现 ​后台框架:SpringBoot数据库MySQL 开发环境:JDK、IDEA、Tomcat 三、系统功能 本教务管理系统共包含三种角色:学生、教师和管理员,系统分为前台界面和后台管理。 该系统共分为七个功能模块:系统管理,考试管理,学生信息管理,教师信息管理,基本信息管理,后台管理和学生成绩管理。 1.系统管理模块 实现用户信息的管理,包括用户密码更改和注销功能,以便用户更改其个人帐户。 2.考试管理模块 添加,修改和删除每个年级每个专业班提供的针对特定科目的考试。此外,可以统一管理每个学期每个阶段的考试,包括考试的具体时间和地点。 3.学生管理模块 学生管理是该系统的核心模块,可以添加,删除,修改和查询诸如年级,专业班级,姓名,年龄和入学课程之类的信息。学生管理部统一管理学生注册信息,对其进行快速调查,以提高工作效率。 4.教师管理模块 管理学校在职和退休教师的信息,添加,修改和删除教师学校,姓名,年龄和学科等信息,并加快学校和教职员工的统一管理。人员信息,您可以查找一下。 5.基本信息管理模块 添加,修改和删除学校中每个年级建立的现有年级,班级和课程信息。可以对每个年级每个专业班级中开设的课程进行集中管理,学校可以集中管理基本信息并进行快速调查。 6.后台管理模块 修改教师和学生的通知。可以通知每个老师和学生。 7.学生成绩管理模块 查询和管理参加每项考试的所有学生的成绩。学校评估循序渐进的教育质量,为学生评估工作提供参考。它为学校后续工作的发展提供了基础。达到开发教育书籍的主要目的。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值