• 【开源】基于Vue.js的中小学教师课程排课系统


    在这里插入图片描述
    项目编号: S 053 ,文末获取源码。 \color{red}{项目编号:S053,文末获取源码。} 项目编号:S053,文末获取源码。



    一、摘要

    1.1 项目介绍

    基于JAVA+Vue+SpringBoot+MySQL的中小学教师课程排课系统,包含了课程档案模块、课位档案模块、排课申请模块、排课结果模块,可以实现教师的个性化排课需求,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,中小学教师课程排课系统基于角色的访问控制,给教务管理员、教师角色使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求。

    1.2 项目录屏

    源码下载


    二、功能模块

    本文的目的是设计和实施中小学教师课程排课系统,这个系统有助于教师更有效地组织课程,该系统采用基于Java的架构,结合Vue和Spring Boot等技术,实现自动化排课和智能课程排位功能,通过分析学生和教师的需求,我们设计了一个完整的课程排课算法,我们还为教师提供了易于使用的用户界面和操作指南,使他们可以轻松使用该系统。最后,我们对该系统进行了测试和评估,表明该系统能够有效地满足教师的教学需求,提高教学效率和质量。

    在这里插入图片描述

    中小学教师课程排课系统的功能性需求主要包含角色管理、课程档案、排课位置和排课申请这四大模块,系统是基于浏览器运行的web管理后端,其中各个模块详细说明如下:

    2.1 角色管理模块

    中小学教师课程排课系统需要角色管理模块,主要原因如下,在使用中小学教师课程排课系统时,教师和管理员有不同的操作权限和功能要求。通过角色管理模块,您可以将用户分为两个角色,即教师和管理员,并为每个角色设置适当的权限。不同的老师负责不同的班级和科目,中小学教师课程排课系统需要在上课课位分不同的老师,角色管理模块允许按班级和科目对教师进行分类,以帮助您更准确、更高效地教学,角色管理模块允许为教师和管理员管理用户信息,如添加、修改和删除帐户信息,使系统维护和管理更容易,角色管理器模块还具有安全和隐私角色,可以限制未经授权的用户访问课程系统中的数据和功能。这对于保护学校及其学生的隐私非常重要。因此,角色管理模块是中小学教师课程教学体系中不可或缺的一部分,可以优化系统的运行和管理效率,提高系统的安全性和保密性,确保教育工作的顺利开展。

    2.2 课程档案模块

    以下是中小学教师课程排课系统中需要课程模块的一些原因,第一是课程模块存储和管理学校的所有课程信息,包括材料、课程和课程目标,并为课程工作提供必要的参考和支持,课程档案模块可以对课程进行分类,使教师更容易搜索、选择和安排课程,避免重复和不必要的错误。第二是课程档案模块记录课程历史数据,分析过去的课堂表现,为未来的教育改进提供经验和参考,课程档案模块实现了教材的共享和联合编辑,促进了教育资源的共享和优化,课程档案模块与教师信息模块和班级信息模块等其他模块协作,交换信息,促进教育资源的优化,实现数据共享,提高教学效率和质量,因此,课程档案模块是中小学教师课程排课系统的重要组成部分。

    2.3 排课位置模块

    中小学教师课程排课系统之所以需要课程定位模块,是因为排课位置模块应有效考虑教室、场所等资源的使用,使课程更加科学,具体来说,排课位置模块可以实现以下功能。排课位置模块可以确定教室的使用,排课位置模块可以自动确定每个教室在不同时间的使用,并将这些信息与课程数据相结合,为每节课进行适当的教学,可以指定一个教室,排课位置模块可以优化课堂的利用率,中小学教师课程排课系统应充分考虑课位的利用效率,避免部分排课位置的浪费,排课位置模块根据教室的大小和设施,智能匹配班级要求,从而提高教室的利用率,排课位置模块可以调整位置,排课位置模块也可以调整位置。这意味着,如果一个排课位置不可用,系统可以自动调整其他位置以替换该位置,从而维持课程的正常进程,如上所述,在中小学教师课程排课系统中,排课位置模块的主要目的是通过更有效地利用教室和场所等资源来提高排课的效率和质量。

    2.4 排课申请模块

    中小学教师课程排课系统需要排课申请模块,学校根据学科、班级和教师的不同有不同的需求,可能会要求调整或增加课程,排课申请模块能够协调和处理这些需求,排课申请模块可以减少教师之间的冲突和纠纷,在排课申请过程中,适当的审查流程和确认程序可以减少错误和误解的发生。通过排课申请模块,管理员可以更好地理解和掌握各种课程情况,从而优化和调整整体课程进度,提高课程提案的可行性和效率。排课申请模块记录并显示历史申请记录,方便后续数据分析和统计工作,这将有助于学校领导制定更合理的教育管理政策和措施。如上所述,排课申请模块是中小学教师课程排课系统的组成部分,这促进了教师和管理者之间的沟通与合作,提高了排课的实用性和效率,为后续的数据分析和统计工作提供了重要依据。


    三、系统设计

    3.1 用例设计

    在这里插入图片描述

    3.2 数据库设计

    3.2.1 角色表

    在这里插入图片描述

    3.2.2 课程表

    在这里插入图片描述

    3.2.3 排课位置表

    在这里插入图片描述

    3.2.4 排课申请表

    在这里插入图片描述


    四、系统展示

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


    五、核心代码

    5.1 查询课程

    @RequestMapping(value = "/getByPage", method = RequestMethod.GET)
    @ApiOperation(value = "查询课程")
    public Result<IPage<Curriculum>> getByPage(@ModelAttribute Curriculum curriculum ,@ModelAttribute PageVo page){
        QueryWrapper<Curriculum> qw = new QueryWrapper<>();
        if(!ZwzNullUtils.isNull(curriculum.getTitle())) {
            qw.like("title",curriculum.getTitle());
        }
        if(!ZwzNullUtils.isNull(curriculum.getStatus())) {
            qw.like("status",curriculum.getStatus());
        }
        IPage<Curriculum> data = iCurriculumService.page(PageUtil.initMpPage(page),qw);
        return new ResultUtil<IPage<Curriculum>>().setData(data);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    5.2 新增课程

    @RequestMapping(value = "/insert", method = RequestMethod.POST)
    @ApiOperation(value = "新增课程")
    public Result<Curriculum> insert(Curriculum curriculum){
        iCurriculumService.saveOrUpdate(curriculum);
        return new ResultUtil<Curriculum>().setData(curriculum);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    5.3 查询全部排课

    @RequestMapping(value = "/getCardList", method = RequestMethod.GET)
    @ApiOperation(value = "查询全部排课")
    public Result<List<TeachingScheduleVo>> getCardList(){
        List<TeachingScheduleVo> ans = new ArrayList<>();
        QueryWrapper<TeachingSchedule> qw1 = new QueryWrapper<>();
        qw1.eq("x",1);
        qw1.orderByAsc("y");
        ans.add(new TeachingScheduleVo(1,iTeachingScheduleService.list(qw1)));
        QueryWrapper<TeachingSchedule> qw2 = new QueryWrapper<>();
        qw2.eq("x",2);
        qw2.orderByAsc("y");
        ans.add(new TeachingScheduleVo(2,iTeachingScheduleService.list(qw2)));
        QueryWrapper<TeachingSchedule> qw3 = new QueryWrapper<>();
        qw3.eq("x",3);
        qw3.orderByAsc("y");
        ans.add(new TeachingScheduleVo(3,iTeachingScheduleService.list(qw3)));
        QueryWrapper<TeachingSchedule> qw4 = new QueryWrapper<>();
        qw4.eq("x",4);
        qw4.orderByAsc("y");
        ans.add(new TeachingScheduleVo(4,iTeachingScheduleService.list(qw4)));
        QueryWrapper<TeachingSchedule> qw5 = new QueryWrapper<>();
        qw5.eq("x",5);
        qw5.orderByAsc("y");
        ans.add(new TeachingScheduleVo(5,iTeachingScheduleService.list(qw5)));
        QueryWrapper<TeachingSchedule> qw6 = new QueryWrapper<>();
        qw6.eq("x",6);
        qw6.orderByAsc("y");
        ans.add(new TeachingScheduleVo(6,iTeachingScheduleService.list(qw6)));
        QueryWrapper<TeachingSchedule> qw7 = new QueryWrapper<>();
        qw7.eq("x",7);
        qw7.orderByAsc("y");
        ans.add(new TeachingScheduleVo(7,iTeachingScheduleService.list(qw7)));
        return new ResultUtil<List<TeachingScheduleVo>>().setData(ans);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    5.4 查询排课申请

    @RequestMapping(value = "/getByPage", method = RequestMethod.GET)
    @ApiOperation(value = "查询排课申请")
    public Result<IPage<TeachingApply>> getByPage(@ModelAttribute TeachingApply teachingApply ,@ModelAttribute PageVo page){
        QueryWrapper<TeachingApply> qw = new QueryWrapper<>();
        User currUser = securityUtil.getCurrUser();
        QueryWrapper<User> userQw = new QueryWrapper<>();
        userQw.eq("id",currUser.getId());
        userQw.inSql("id","SELECT user_id FROM a_user_role WHERE del_flag = 0 AND role_id = '496138616573952'");
        if(iUserService.count(userQw) < 1L) {
            qw.eq("user_id",currUser.getId());
        }
        if(!ZwzNullUtils.isNull(teachingApply.getUserName())) {
            qw.like("user_name",teachingApply.getUserName());
        }
        if(!ZwzNullUtils.isNull(teachingApply.getCurriculumName())) {
            qw.like("curriculum_name",teachingApply.getCurriculumName());
        }
        if(!ZwzNullUtils.isNull(teachingApply.getScheduleName())) {
            qw.like("schedule_name",teachingApply.getScheduleName());
        }
        IPage<TeachingApply> data = iTeachingApplyService.page(PageUtil.initMpPage(page),qw);
        return new ResultUtil<IPage<TeachingApply>>().setData(data);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    5.5 自动排课算法

    @RequestMapping(value = "/work", method = RequestMethod.GET)
    @ApiOperation(value = "自动排课")
    public Result<Object> work(){
        List<TeachingApply> applyList = iTeachingApplyService.list();
        List<TeachingApplyVo> ans = new ArrayList<>();
        // 分离用户的排课申请
        for (TeachingApply a : applyList) {
            boolean flag = true;
            for (TeachingApplyVo vo : ans) {
                if(Objects.equals(a.getUserId(),vo.getUserId())) {
                    vo.getList().add(a);
                    flag = false;
                    break;
                }
            }
            if(flag) {
                TeachingApplyVo vo = new TeachingApplyVo();
                vo.setUserId(a.getUserId());
                vo.setUserName(a.getUserName());
                List<TeachingApply> aList = new ArrayList<>();
                aList.add(a);
                vo.setList(aList);
                vo.setFlag(0);
                ans.add(vo);
            }
        }
        // 课位初始化
        List<TeachingSchedule> scheduleList = iTeachingScheduleService.list();
        for (TeachingSchedule s : scheduleList) {
            s.setCurId("");
            s.setCurName("");
            s.setTeacherName("");
        }
        // 根据排课申请数量升序排列,尽可能满足多的教师完成排课
        Collections.sort(ans, new Comparator<TeachingApplyVo>() {
            @Override
            public int compare(TeachingApplyVo o1, TeachingApplyVo o2) {
                return o1.getList().size() - o2.getList().size();
            }
        });
        for(int i = 0; i < ans.size(); i ++) {
            List<TeachingSchedule> tempList = new ArrayList<>();
            for (TeachingSchedule s : scheduleList) {
                tempList.add(s);
            }
            // 判断能否满足排课
            boolean flagSum = true;
            for (TeachingApply a : ans.get(i).getList()) {
                boolean flag = true;
                for (TeachingSchedule teachingSchedule : tempList) {
                    if(Objects.equals(a.getScheduleId(),teachingSchedule.getId()) && ZwzNullUtils.isNull(teachingSchedule.getCurId())) {
                        // 排课成功
                        teachingSchedule.setCurId(a.getCurriculumId());
                        teachingSchedule.setCurName(a.getCurriculumName());
                        teachingSchedule.setTeacherName(a.getUserName());
                        a.setStatus("排课成功");
                        flag = false;
                        break;
                    }
                }
                if(flag) {
                    // 排课失败,下一位
                    flagSum = false;
                    break;
                }
            }
            if(flagSum) {
                // 如果全部课程可以排课,则保存
                scheduleList = new ArrayList<>();
                for (TeachingSchedule vo : tempList) {
                    scheduleList.add(vo);
                }
                ans.get(i).setFlag(1);
            } else {
                // 否则不保存
            }
        }
        // 未完成排课的,按顺序能排上的排上
        for (TeachingApplyVo vo : ans) {
            if(Objects.equals(1,vo.getFlag())) {
                continue;
            }
            for (TeachingApply a : vo.getList()) {
                for (TeachingSchedule teachingSchedule : scheduleList) {
                    if(Objects.equals(a.getScheduleId(),teachingSchedule.getId()) && ZwzNullUtils.isNull(teachingSchedule.getCurId())) {
                        // 补排课成功
                        teachingSchedule.setCurId(a.getCurriculumId());
                        teachingSchedule.setCurName(a.getCurriculumName());
                        teachingSchedule.setTeacherName(a.getUserName());
                        a.setStatus("排课成功");
                        break;
                    }
                }
            }
        }
        // 保存排课数据
        for (TeachingSchedule teachingSchedule : scheduleList) {
            iTeachingScheduleService.saveOrUpdate(teachingSchedule);
        }
        // 保存申请数据
        for (TeachingApplyVo vo : ans) {
            for (TeachingApply a : vo.getList()) {
                if(!Objects.equals("排课成功",a.getStatus())) {
                    a.setStatus("排课失败");
                }
                iTeachingApplyService.saveOrUpdate(a);
            }
        }
        return ResultUtil.success();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110

    六、免责说明

    • 本项目仅供个人学习使用,商用授权请联系博主,否则后果自负。
    • 博主拥有本软件构建后的应用系统全部内容所有权及独立的知识产权,拥有最终解释权。
    • 如有问题,欢迎在仓库 Issue 留言,看到后会第一时间回复,相关意见会酌情考虑,但没有一定被采纳的承诺或保证。

    下载本系统代码或使用本系统的用户,必须同意以下内容,否则请勿下载!

    1. 出于自愿而使用/开发本软件,了解使用本软件的风险,且同意自己承担使用本软件的风险。
    2. 利用本软件构建的网站的任何信息内容以及导致的任何版权纠纷和法律争议及后果和博主无关,博主对此不承担任何责任。
    3. 在任何情况下,对于因使用或无法使用本软件而导致的任何难以合理预估的损失(包括但不仅限于商业利润损失、业务中断与业务信息丢失),博主概不承担任何责任。
    4. 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。
  • 相关阅读:
    为什么yolov8val的dfl_loss一直上升呢
    音视频 fmpeg命令裁剪和合并视频
    进程与线程的区别
    (附源码)php单招志愿采集系统 毕业设计 091409
    OCR是什么意思,有哪些好用的OCR识别软件?
    MySQL日志及执行计划
    AOSP——Android.mk解析
    申请知识产权需要什么条件?
    Avue和Element-UI动态三级表头
    Ansible安装管理和模块的使用
  • 原文地址:https://blog.csdn.net/2301_77899321/article/details/134499420