基于SSM的在线作业管理系统 -octopus-master(源码+调试)

项目描述

临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问题,今天给大家介绍一篇基于SSM的在线作业管理系统设计与实现。

功能需求

本在线作业管理系统通过分析和确定系统的角色和功能划分,按照业务合理区分为不同的菜单功能模块。从用户角度出发,对每个功能的需求实现点进行人性化详细的构思。对每个功能的细节点进行分析设计整合完成整个在作业系统的设计。
这两类的主要功能如下:
根管理员端:1)管理注册学生。2)管理注册教师。3)管理题库。4)管理课程。5)管理公告。6)管理班级。7)修改密码。等等

教师端:1)管理题库:题库类型包括选择题 判断题和简答题,题库中的题目对应不同的课程;
2)作业管理:从题库中搜索选择对应课程的题目发布作业
3)统计成绩:汇总班级成绩且导出成绩表;
4)发布公告:向学生发送公告。
5)个人信息修改、登录密码修改

学生端:1)查看公告;
2)查看个人课程,个人可以自己报名选择课程
3)个人信息修改、登录密码修改
4)在线完成作业,可查看成绩和答案。
等等具体以图片中的功能为主

部分效果图

在这里插入图片描述

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

部分代码

@Controller
public class StudentExamController {
    int tihao = 0;
    @Autowired
    private StudentExamService studentExamService;
    @Autowired
    private ManagerScoreService managerScoreService;

    @RequestMapping(value = "/toStudentExam.action")
    public String handlerExam(Integer id, String user_sno, HttpServletRequest request) {
        ArrayList<Question> listAll = new ArrayList<Question>();
        Paper paper = studentExamService.findPaperById(id);
        int numSing = 0;
        int numMuti = 0;
        int numJud = 0;
        int numFill = 0;
        int numEss = 0;
        int time = 0;
        numSing = paper.getQty_sing();
        numMuti = paper.getQty_muti();
        numJud = paper.getQty_jud();
        numFill = paper.getQty_fill();
        numEss = paper.getQty_ess();
        time = paper.getQty_time();
//        将每种题目按照题目类型存储
        LinkedList<Question> listSing = new LinkedList<Question>();
        LinkedList<Question> listMuti = new LinkedList<Question>();
        LinkedList<Question> listJud = new LinkedList<Question>();
        LinkedList<Question> listFill = new LinkedList<Question>();
        LinkedList<Question> listEss = new LinkedList<Question>();
        List<Question> questions = studentExamService.findQuestion();
        for (Question question : questions) {
            switch (question.getType()) {
                case "单选题":
                    listSing.add(question);
                    break;
                case "多选题":
                    listMuti.add(question);
                    break;
                case "判断题":
                    listJud.add(question);
                    break;
                case "填空题":
                    listFill.add(question);
                    break;
                default:
                    listEss.add(question);
                    break;
            }
        }
//        System.out.println("单:" + listSing.size());
//        System.out.println("多:" + listMuti.size());
//        System.out.println("判:" + listJud.size());
//        System.out.println("简:" + listEss.size());
//        System.out.println("填:" + listFill.size());
        listAll.addAll(randomQue(listSing, numSing));
        listAll.addAll(randomQue(listMuti, numMuti));
        listAll.addAll(randomQue(listJud, numJud));
        listAll.addAll(randomQue(listFill, numFill));
        listAll.addAll(randomQue(listEss, numEss));
//        System.out.println("全:" + listAll.size());
        tihao = 0;
        HttpSession session = request.getSession();
        //判断用户参加考试的次数
        User user = (User) session.getAttribute("USER_SESSION");
        user_sno = user.getSno();
        Score score = new Score();
        score.setUser_sno(user_sno);
        score.setPaper_id(id);
        Integer number = Integer.valueOf(0);
        number = studentExamService.examCount(score);
        session.setAttribute("paper",paper);
        session.setAttribute("number", number);
        session.setAttribute("examTime", time);
        session.setAttribute("ques", listAll);
        return "Student/student_exam_info";
    }

    public ArrayList<Question> randomQue(LinkedList<Question> list, int count) {
        ArrayList<Question> listA = new ArrayList<Question>();
        while (list.size() > 0 && count > 0) {
            count--;
            int m = (int) (Math.random() * list.size());
            Question question = list.get(m);
            list.remove(m);
            tihao++;
            question.setId(String.valueOf(tihao));
            String selectString = question.getSel();
            if (selectString != null) {
                String[] temp = selectString.split("\\@");
                question.setOptions(temp);
            }
            listA.add(question);
        }
        return listA;
    }

    @RequestMapping(value = "/calScore.action")
    public String calScore(HttpServletRequest request) {
        HttpSession session = request.getSession();
        Score userScore = new Score();
        ArrayList<Question> questions = (ArrayList<Question>) session.getAttribute("ques");
        User user = (User) session.getAttribute("USER_SESSION");
        Paper paper = (Paper) session.getAttribute("paper");
        String stuAnsArr[] = null;
        double score = 0;
        double score_muti = 0;
        double score_sing = 0;
        double score_jud = 0;
        double score_fill = 0;
        double score_ess = 0;
        for (int i = 0; i < questions.size(); ++i) {
            Question question = questions.get(i);
            stuAnsArr = request.getParameterValues(question.getId());
            if (!question.getType().equals("简答题")) {
                if (stuAnsArr != null) {
                    String stuAns = "";
                    for (int j = 0; j < stuAnsArr.length; j++) {
                        stuAns += stuAnsArr[j];
                    }
                    //System.out.println(stuAns);
                    if (stuAns.equalsIgnoreCase(question.getAnswer())) {
                        switch (question.getType()) {
                            case "单选题":
                                score_sing += question.getScore();
                                score += score_sing;
                                break;
                            case "多选题":
                                score_muti += question.getScore();
                                score += score_muti;
                                break;
                            case "判断题":
                                score_jud += question.getScore();
                                score += score_jud;
                                break;
                            case "填空题":
                                score_fill += question.getScore();
                                score += score_fill;
                                break;
                            default:
                                break;
                        }
                    }
                }
            } else {
                //简答题的判断方法
                //拆分正确答案中的关键词
                String[] KEY_WORD = question.getAnswer().split("\\@");
                //获取简答题分值
                Integer totalScore = question.getScore();
                //每个的分点的细分
                int singleScore = 0;
                String stuAns = "";
                if (stuAnsArr != null) {
                    for (int j = 0; j < stuAnsArr.length; j++) {
                        //组装学生答案
                        stuAns += stuAnsArr[j];
                    }
                }
                // 使用contains方法
                //如果关键词存在
                if (KEY_WORD != null) {
                    //按照关键词数量细分分值
                    singleScore = totalScore / KEY_WORD.length;
                    for (int j = 0; j < KEY_WORD.length; j++) {
                        //判断考生答案中是否出现关键词
                        if (stuAns.contains(KEY_WORD[j])) {
                            //System.out.println(stuAns + "包含关键词:" + KEY_WORD[j]);
                            score_ess += singleScore;
                            score += score_ess;
                        } else {
                            System.out.println("不包含关键词:" + KEY_WORD[j]);
                        }
                    }
                }
            }
        }
        userScore.setUser_sno(user.getSno());
        userScore.setPaper_id(paper.getId());
        userScore.setScore_sing(score_sing);
        userScore.setScore_muti(score_muti);
        userScore.setScore_jud(score_jud);
        userScore.setScore_fill(score_fill);
        userScore.setScore_ess(score_ess);
        userScore.setScore(score);
        session.setAttribute("score",userScore);
        int rows = managerScoreService.createScore(userScore);
        if (rows > 0){

            return "Student/student_exam_after";
        }
        else{
            return "Student/student_exam";
        }

    }
}


安装部署需求

IDEA运行启动

系统部署

系统开发后,在生产环境配置项目运行环境,具体步骤如下:
安装linux或者windows10操作系统;
安装JDK1.8并配置环境变量;
安装MySQL5.7版本以上版本数据库,创建数据库并执行脚本创建表;
在IDEA中配置运行;

本项目用到的技术和框架

1.开发语言:Java
2.开发模式:B/S
3.数据库:MySQL5.7
4.框架:SSM

本项目中的关键点

此系统的开发采用java语言开发,基于B/S结构,这些开发环境使系统更加完善。使用到的工具和技术都是开源免费的。

环境工具

开发工具 Eclipse
语言 JDK1.8 、java
硬件:笔记本电脑;
软件:Tomcat8.0 Web服务器、Navicat数据库客户端、MySQL;
操作系统:Windows 10;
其它软件:截图工具、常用浏览器;
以上是本系统的部分功能展示,如果你的选题正好相符,那么可以做毕业设计或课程设计使用。

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

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

相关文章

虚幻5 删除C盘缓存及修改缓存路径

一.修改C盘缓存 C盘缓存路径为&#xff1a; C:\Users\xx(这里是你的用户名)\AppData\Local\UnrealEngine\Common\DerivedDataCache 注意&#xff0c;如果没有AppData文件夹&#xff0c;请依次点击查看-勾选显示隐藏的项目&#xff0c;即可 可删除里面的所有文件即可 二.修改…

leetcode 刷题 - 有效三角形个数 - 长度最小的子数组 - 无重复字符的最长子串

l611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09; 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1:输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3示…

【Git】Git的GUI图形化工具ssh协议IDEA集成Git

一、GIT的GUI图形化工具 1、介绍 Git自带的GUI工具&#xff0c;主界面中各个按钮的意思基本与界面文字一致&#xff0c;与git的命令差别不大。在了解自己所做的操作情况下&#xff0c;各个功能点开看下就知道是怎么操作的。即使不了解&#xff0c;只要不做push操作&#xff0c;…

天翼云江西分公司副总经理彭越华一行莅临拓世科技集团指导考察,共绘蓝图开启智能新篇章

世界经济脉络在数字化的浪潮中迎来了新的生机&#xff0c;企业的成长轨迹正在智能化的力量下重新塑造。天翼云科技有限公司江西分公司副总经理彭越华一行的到访&#xff0c;为拓世科技集团带来了新的发展机遇。这场深入的交流&#xff0c;不仅预示着在科技创新和数字化转型的征…

【漏洞复现】BYTEVALUE智能流控路由器存在命令执行

【漏洞介绍】 百为智能流控路由器 /goform/webRead/open 路由的 ?path 参数存在有回显的命令注入漏洞。攻击者可通过该漏洞在服务器端执行命令&#xff0c;写入后门&#xff0c;获取服务器权限&#xff0c;从而获取路由器权限。 【指纹】 title”BYTEVALUE 智能流控路由器”…

Electron-vue出现GET http://localhost:9080/__webpack_hmr net::ERR_ABORTED解决方案

GET http://localhost:9080/__webpack_hmr net::ERR_ABORTED解决方案 使用版本解决方案解决总结 使用版本 以下是我解决此问题时使用的electron和vue等的一些版本信息 【附】经过测试 electron 的版本为 13.1.4 时也能解决 解决方案 将项目下的 .electron-vue/dev-runner.js…

Node版本管理工具——Nvm

文章目录 前言基础常识彼此之间的关系 一、安装 nvm&#xff1f;查看是否安装成功 二、配置下载源三、nvm常用命令 前言 nvm 全名 node.js version management&#xff0c;顾名思义是一个nodejs的版本管理工具。通过它可以安装和切换不同版本的nodejs。 基础常识 node&#x…

Java时间工具类:ZTDateTimeUtil

目录 1.返回指定格式的当前时间,Date-->FormatString,Date类型转Strig 2.返回固定格式的Date类型时间Date---》ToString---》ToDate,Date类型格式化成Date 3.字符串转日期 String格式化成String 4.两时间关系判断构件 5.Date转换为字符串:Date格式化成String 6.String类…

【canvas】在Vue3+ts中实现 canva内的矩形拖动操作。

前言 canvas内的显示内容如何拖动&#xff1f; 这里提供一个 canvas内矩形移动的解决思路。 描述 如何选中canvas里的某部分矩形内容&#xff0c;然后进行拖动&#xff1f; 我的解决思路&#xff1a; **画布搭建。**用一个div将canvas元素包裹&#xff0c;设置宽高&#xf…

净利暴跌9成,主力业务下滑,这家全球知名CIS供应商如何“翻身”?

消费电子寒冬对上游供应链的影响还在持续。 近日&#xff0c;全球知名的CMOS图像传感器&#xff08;CIS&#xff09;供应商格科微发布三季报显示&#xff0c;前三季度共实现营业收入32.45亿元&#xff0c;同比下降29.01%&#xff1b;实现净利润4972.57万元&#xff0c;同比下降…

国际阿里云:无法ping通ECS实例公网IP的排查方法!!!

无法ping通ECS实例的原因较多&#xff0c;您可以参考本文进行排查。 问题现象 本地客户端无法ping通目标ECS实例公网IP&#xff0c;例如&#xff1a; 本地客户端为Linux系统&#xff0c;ping目标ECS实例公网IP时无响应&#xff0c;如下所示&#xff1a; 本地客户端为Windo…

双网卡多网卡时win11如何设置网卡优先级

背景&#xff1a; 电脑需要同时使用多个网卡&#xff0c;一个用于被远程、另一个用于打开网页。 电脑打开网页时&#xff0c;走的是哪个网卡&#xff0c;是根据网卡优先级来的。 打开控制面板、网络和Internet、网络和共享中心 点击左侧 更改适配器设置。我这里可见两个网卡…

云栖大会-简单易用的智能云网络

云布道师 10 月 31 日&#xff0c;杭州云栖大会&#xff0c;在阿里云网络技术分论坛&#xff0c;阿里云网络产品线负责人祝顺民带来《Leadership&#xff1a;简单易用的智能云网络——阿里云网络持续演进之路》的主题演讲&#xff0c;全面阐释阿里云飞天洛神云网络&#xff08;…

NodeJs - 单线程模型和高并发处理原理

NodeJs - 单线程模型和高并发处理原理 前言一. NodeJs 线程模型1.1 NodeJs 模型分析1.2 NodeJs处理事件请求的流程1.3 NodeJs 和传统 Server 的对比 二. Cluster 模块利用多核CPU处理三. 总结 前言 我们都知道JavaScript是单线程的处理。但是我们在Node开发、Egg开发下&#x…

(动手学习深度学习)第7章 残差网络---ResNet

目录 ResNet总结 ResNet代码实现ResNet的梯度计算 ResNet 总结 残差块使得很深的网络更加容易训练 甚至可以训练一千层的网络 残差网络对随后的深层神经网络设计产生了深远影响&#xff0c;无论是卷积类网络还是全连接类网络。 ResNet代码实现 导入相关库 import torch fro…

【优选算法系列】【专题二滑动窗口】第二节.1004. 最大连续1的个数 III和1658. 将 x 减到 0 的最小操作数

文章目录 前言一、最大连续1的个数 III 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写二、将 x 减到 0 的最小操作数 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写总结 前言 一、最大连…

Centos配置邮件发送

在CentOS Linux上配置邮件发送 在这个指南中&#xff0c;我们将讨论如何配置CentOS Linux系统以通过外部邮件服务器发送电子邮件&#xff0c;使用自己的邮件账户进行发送。 第一步&#xff1a;开启SMTP授权码 首先&#xff0c;我们以QQ邮箱为例&#xff0c;需要开启SMTP授权…

state 和 props 有什么区别?

一、state 一个组件的显示形态可以由数据状态和外部参数所决定&#xff0c;而数据状态就是 state&#xff0c;一般在 constructor 中初始化 当需要修改里面的值的状态需要通过调用 setState 来改变&#xff0c;从而达到更新组件内部数据的作用&#xff0c;并且重新调用组件 r…

滚珠螺杆的精度和使用场景之间的关系?

滚珠螺杆的精度和使用场景之间有着密切的关系&#xff0c;不同精度的滚珠螺杆被应用于不同的机械设备和制造工艺中&#xff0c;以满足不同的精度要求和生产效率。 在机床加工行业中&#xff0c;高精度的滚珠螺杆被广泛应用于数控机床、加工中心和磨床等高精度加工设备中。这些设…

WebGL-Vue3-TS-Threejs:基础练习 / Javascript 3D library / demo

一、理解Three.js Three.js是一个用于WebGL渲染的JavaScript库。它提供了一组工具和类&#xff0c;用于创建和渲染3D图形和动画。简单理解&#xff08;并不十分准确&#xff09;&#xff0c;Three.js之于WebGL&#xff0c;好比&#xff0c;jQuery.js之于JavaScript。 OpenGL …