基于Spring+SpringMVC+MyBatis的教务管理系统设计与实现

教务系统项目策划书
1.引言
1.1编写目的
教务管理系统是完成学生管理、用户管理、校建管理、课程管理、教师管理、成绩管理、校内新闻、选课管理和教评管理九大管理模块,由教务工作人员系统给管理员、教师、以及学生多用户角色,各用户依据自己角色的不同而操作不同的功能模块,教务工作人员分别通过学生管理、用户管理、校建管理、课程管理、教师管理、成绩管理、校内新闻、选课管理和教评管理来进行这些模块的管理, 包括这些模块的添加、 修改、删除以及对课程的选择、学生信息的查询,教务工作人员同时通过教师该平台辅助讲师对整个教学过程的品质管理,提供教学的跟踪功能。
1.2 背景
开发的软件系统名称:教务管理系统;
本项目的开发者:17Java05第二小组;
使用技术:spring+springMVC+myBatis 与微信小程序开发
安全框架:shiro
集成日志:log4j
前端框架:layUI
运行环境和工具
编译器:IntelliJ IDEA
项目构建工具:Maven
数据库:MySQL
JDK版本:jdk1.8
Tomcat版本:Tomcat8.x
1.3定义
教务管理系统是一个基于网络的在线管理平台 , 帮助学校管理教务系统,用一个帐号解决学校教务教学管理,灵活的定制符合学校自己实际情况的教务系统。
2.可行性研究的前提
随着计算机应用的日益普及和深化,网上办公已经成为一种趋势。本项目要开发的事基于局域网和互联网的网上教务系统。
开发的系统要求界面友好,方便直观。既要方便管理员的维护。也要方便学生网上选课。退课,查询选课结果等功能。同时方便教师进行学生成绩的输入,学生信息管理等。
3.功能介绍
教务管理系统分为微信小程序和3个子系统,3个子系统分别是管理员系统、教师系统和学生系统,分别对应拥有不同权限的角色:管理员、教师和学生;
(1)管理员系统:管理员可以管理课程、管理教师、管理学生、发布校园公告、校建管理、教评问题管理、分配权限等功能;
(2)教师系统:教师登录教师系统,可以查看自己所教授的课程信息、查看某门课程所选学生信息、给学生打分以及修改自己的登录密码;
(3)学生系统:学生根据姓名和密码登录自己的学生系统,可以查看所有的课程信息、查看已选课程、查看已修课程、选课以及退课等操作。
(4)微信小程序:主要实现了学生的成绩查询、学生信息查询、网上教评、学生选课、退课等功能。
4.模块说明
4.1、小程序模块
4.1.1、小程序登录:调用在idea封装的登录接口;
4.1.2、小程序查看成绩:用js通过学生入学时间来判断学期,然后按学期进行条件查询;
4.1.3、小程序退选课程:先查学生所选的课程,以及是否没成绩,如果没成绩,可以退课;
4.1.4、小程序我的信息:根据学生的学号来查询学生自身的信息;
4.1.5、微信小程序校园公告:查询出校园要发布的公告,显示出来。
微信小程序课表查询:根据登录学生的学号和学生所在的班级,查询出他所选的课程以及课程上课地点和上课时间。
4.1.6、微信小程序选课:查询出学生所有可以选的网上课程和课程的所有信息,显示出来,点击选择按钮进行选择,如果人数没满,则成为自己的课程。
4.1.7、微信小程序掌上教评:根据所登录学生的学号和班级查询出所教他所有课程的教师,只能对这些教师进行教评。教评获得的分数将插入对应教师的成绩和教评记录表。
4.2、PC端模块
4.2.1、权限管理:查询所有权限,可以添加一个新的权限,拥有不同权限资源,也可以通过权限的id修改权限所拥有的不同权限资源。
4.2.2、角色管理:查询所有角色信息,可以添加一个新的角色,查询所有的权限,返回list集合,遍历在页面的权限分配上,分配不同权限,也可以修改角色所拥有的权限。
4.2.3、用户管理:查询所有用户信息,可以添加一个新用户,查询所有的角色,返回list集合,遍历在页面的角色分配上,不同用户分配不同角色,也可以修改该用户的角色。
4.2.4、学生成绩查询:管理员查询所有学生,通过系部、专业、年级、班级、学期进行分类查询。
4.2.5、教师成绩查询:管理员查询教评总成绩和教评总人数,通过查询计算,获得所需要的教师成绩。
4.2.6、教师查询学生成绩:通过教师登录工号,查询教师所教的班级及学生的成绩。
4.2.7、新闻发布:学校的新闻以及公告可以通过此功能实现,通常是教学方面的新闻,发布时可自定义发布人。新闻的编辑采用目前最为流行的笔记记录语言:Markdown,可直接使用该语言进行图文编排。发布后即可在官网首页看到。
4.2.8、新闻管理:新闻管理主要用来管理已经发布的新闻,包括编辑和删除操作,通常用来修改错别字或修改发布部门(人)。
4.2.9、学校建设:主要建设系部、专业、年级、班级,并且必须按照该顺序进行建设。
4.2.10、学生教评:学生教评是学生对教师一个学期的评价,给教师评分。
4.2.11、教师授课:实现对每个教师所授课程的管理,保证了每个教师的课不冲突、不重复。
4.2.12、学生信息查询、修改:管理员可对所有学生信息进行查询以及修改,教师可对所教学生信息进行查询及修改。
4.2.13、教师信息查询、修改:管理员可对所有教师信息进行查询修改。
4.2.14、学生退学情况查询:对已退学的学生进行查询,可查看学生信息、退学时间及退学原因等。
4.2.15、学生、教师录入:管理员可以进行教师录入和学生录入,教师无法录入教师,只能录入学生。
4.2.16、学生个人成绩查询:学生登录账号,根据学号查询该生所有成绩。
4.2.17、学生选课管理:查询出所有学生和该学生所选的课程,可以搜索单个学生或者有下拉框进行条件查询。可以对学生所选的课程进行强制退课和强制换课处理,必修不可使用该功能。
4.2.18、学生退课:根据所登录学生的学号查询出他所选的所有选修课程,在学校规定的时间内可以进行退课处理。过了学校规定时间不可进行退课。
4.2.19、课程管理:管理员可以进行对课程的增删改查。
4.2.20、学生成绩录入:先查出学生所选课程,然后根据学期录入。
4.2.21、学生成绩修改:查出该学生所录入的最大学期成绩,然后根据课程编号修改。
5.结论
本系统具有方便快捷等优势。投资回报利益大,使教务管理实现电子化,符合社会信息化发展的需要,技术,经济,操作,法律方面都是可行的。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8">
    <title>新职教务管理系统</title>
    <script type="text/javascript" th:src="@{/static/js/jquery-3.1.1.js}"></script>
    <script type="text/javascript" th:src="@{/static/layui/layui.js}"></script>
    <script type="text/javascript" th:src="@{/static/js/marked.js}"></script>
    <link rel="stylesheet" type="text/css" th:href="@{/static/layui/css/layui.css}"/>
    <link rel="stylesheet" type="text/css" th:href="@{/static/css/index.css}"/>
    <link rel="stylesheet" type="text/css" th:href="@{/static/css/github-markdown.css}"/>

</head>
<body>
<div id="totop">
    <i class="layui-icon">&#xe619;</i>
</div>
<div id="title">
    <span id="welcome">欢迎来到教务管理系统</span>
    <span id="toptime"></span>
</div>
<div id="logobg">
    <div id="logo"></div>
</div>

<blockquote style="margin: 15px;background-color:#FFFFFF;" class="layui-elem-quote"><i class="layui-icon">&#xe67a;</i>
    新版教务管理系统将于2019年11月11日启用。
</blockquote>

<div class="layui-row">
    <div class="layui-col-xs12 layui-col-sm4 layui-col-md4">

        <div class="layui-card">
            <div class="layui-card-header">用户登录</div>
            <div class="layui-card-body">
                <form class="layui-form" th:action="@{/admin/login}">
                    <div class="layui-form-item">
                        <input class="layui-input" name="username" placeholder="学号 / 工号 / 用户名" lay-verify="required" type="text" autocomplete="off">
                    </div>
                    <div class="layui-form-item">
                        <input class="layui-input" name="password" placeholder="密码" lay-verify="required" type="password" autocomplete="off">
                    </div>

                    <div class="layui-row">
                        <div class="layui-col-xs9">
                            <div class="layui-form-item form_code">
                                <input class="layui-input" name="code" placeholder="验证码" lay-verify="required" type="text" autocomplete="off">

                            </div>
                        </div>
                        <div class="layui-col-xs3">
                            <div class="code"><img th:src="@{/getCaptcha}" width="116" height="36" th:id="randImage"></div>
                        </div>
                    </div>



                    <div class="layui-form-item" style="display: none;">
                        <input type="checkbox" name="rememberMe" lay-skin="primary" title="记住帐号?">
                    </div>
                    <button class="layui-btn layui-btn-fluid login_btn" lay-submit lay-filter="login">登录</button>
                </form>
            </div>
        </div>


        <div class="layui-card">
            <div class="layui-card-header">作息时间</div>
            <div class="layui-card-body" id="scheduleTable">
                <!--<div id="scheduleTable">-->

                <!--</div>-->
            </div>
        </div>


    </div>
    <div class="layui-col-xs12 layui-col-sm8 layui-col-md8">

        <div class="layui-card">
            <div class="layui-card-header">通知公告</div>
            <div class="layui-card-body">
                <ul id="newslist" class="layui-timeline markdown-body"></ul>
            </div>
        </div>

    </div>


</div>


</body>
<script type="text/javascript" th:src="@{/static/layui/layui.js}"></script>
</html>
<script>
    layui.use(['form','layer'],function(){
        var form = layui.form,
            layer = parent.layer === undefined ? layui.layer : parent.layer;
        $ = layui.jquery;

        //登录按钮事件
        form.on("submit(login)", function(data){
            var loadIndex = layer.load(2, {shade: [0.3, '#333']});
            if($('form').find('input[type="checkbox"]')[0].checked){
                data.field.rememberMe = true;
            }else{
                data.field.rememberMe = false;
            }
            $.post(data.form.action, data.field, function(res) {
                layer.close(loadIndex);
                if(res.success){
                    location.href="/"+res.url;
                }else{
                    layer.msg(res.message);
                    $("#randImage").click();
                }
            });
            return false;
        });

        $("#randImage").click(function () {
            this.src = "/getCaptcha?t=" + Math.random();
        });
    });

    layui.use(['form', 'layedit', 'laydate'], function () {
        var form = layui.form
            , layer = layui.layer;


        //监听提交
        form.on('submit(demo1)', function (data) {
            layer.alert(JSON.stringify(data.field), {
                title: '最终的提交信息'
            })
            return false;
        });

    });
    /**
     * 时间显示
     */
    setInterval(function () {
            $('#toptime'
            ).text('今天是' + getDate());
        },
        1000
    )

    function getDate() {
        var myDate = new Date();
        var year = myDate.getFullYear();
        var month = myDate.getMonth() + 1;
        var date = myDate.getDate();
        var h = myDate.getHours();
        var m = myDate.getMinutes();
        var s = myDate.getSeconds();
        var now = year + '年' + conver(month) + "月" + conver(date) + "日 " + conver(h) + ':' + conver(m) + ":" + conver(s);
        return now;
    }

    function conver(s) {
        return s < 10 ? '0' + s : s;
    }

    layui.use(['flow', 'element'], function () {
        var $ = layui.jquery; //不用额外加载jQuery,flow模块本身是有依赖jQuery的,直接用即可。
        var flow = layui.flow;
        flow.load({
            elem: '#newslist' //指定列表容器
            , isAuto: false
            , done: function (page, next) { //到达临界点(默认滚动触发),触发下一页
                var lis = [];
                //以jQuery的Ajax请求为例,请求下一页数据(注意:page是从2开始返回)
                $.get('/newslist?page=' + page, function (res) {
                    //假设你的列表返回在data集合中
                    layui.each(res.data, function (index, item) {
                        lis.push('<li class="layui-timeline-item"><i class="layui-icon layui-timeline-axis">&#xe63f;</i><div class="layui-timeline-content layui-text"><h1 style="color: #ca006f;" class="layui-timeline-title">'+ item.ntitle +'</h1><h4>'+ fDate(item.ntime) + ' - '+item.nauthor +'</h4><p>'+ marked(item.ncontent) +'</p></div></li>');

                    });
                    next(lis.join(''), page < res.pages);
                });
            }
        });
    });


    /**
     * 转换时间格式
     */
    function fDate(date) {
        var d = new Date(date);
        var month = (d.getMonth() + 1) < 10 ? '0' + (d.getMonth() + 1) : (d.getMonth() + 1);
        var day = d.getDate() < 10 ? '0' + d.getDate() : d.getDate();
        var hours = d.getHours() < 10 ? '0' + d.getHours() : d.getHours();
        var min = d.getMinutes() < 10 ? '0' + d.getMinutes() : d.getMinutes();
        var sec = d.getSeconds() < 10 ? '0' + d.getSeconds() : d.getSeconds();
        var times = d.getFullYear() + '-' + month + '-' + day + ' ' + hours + ':' + min + ':' + sec;
        return times
    }

    /**
     * 返回顶部
     */
    $("#totop").on('click', function () {
        document.body.scrollTop = 0;
        document.documentElement.scrollTop = 0;
    });

    /**
     * 加载作息时间表
     */
    layui.use('table', function () {
        var table = layui.table;

        table.render({
            elem: '#scheduleTable'
            , url: '/schedulelist'
            , size: 'sm'
            , cols: [
                [
                    {field: 'schid', title: '序号', width: 50}
                    , {field: 'timeinterval', title: '时段', width: 60}
                    , {field: 'schname', title: '节序', width: 80}
                    , {field: 'summer', title: '夏季时间'}
                    , {field: 'winter', title: '冬季时间'}
                ]
            ]
        });
    });
</script>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shejizuopin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值