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

news2024/11/27 23:53:03

项目描述

临近学期结束,还是毕业设计,你还在做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;
其它软件:截图工具、常用浏览器;
以上是本系统的部分功能展示,如果你的选题正好相符,那么可以做毕业设计或课程设计使用。

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

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

相关文章

HashMap存值、取值及哈希碰撞原理分析

HashMap中的put()和get()的实现原理&#xff1a; map.put(k,v)实现原理 首先将k,v封装到Node对象当中&#xff08;节点&#xff09;。 然后它的底层会调用K的hashCode()方法得出hash值。 通过哈希表函数/哈希算法&#xff0c;将hash值转换成数组的下标&#xff0c;下标位置上…

纵行科技LPWAN2.0芯片产品ZT1826获“2023年度硬核芯”大奖

2023年10月30日&#xff0c;由深圳市芯师爷科技有限公司主办、慕尼黑华南电子展协办、深圳市半导体行业协会支持的“第五届硬核芯生态大会暨2023汽车芯片技术创新与应用论坛”在深圳国际会展中心1号馆圆满落幕。当晚&#xff0c;“2023年度硬核芯评选”获奖榜单同步揭晓并进行颁…

【C++心愿便利店】No.12---C++之探索string底层实现

文章目录 前言一、写实拷贝&#xff08;了解&#xff09;二、string类常用接口实现2.1 成员变量2.2 默认构造函数2.3 拷贝构造函数2.4 operator2.5 operator[]2.6 c_str2.7 size()2.8 capacity() 三、迭代器的实现3.1 begin()和end()3.2 范围for 四、string类增删查改4.1 reser…

四川芸鹰蓬飞商务信息咨询有限公司电商带货可信吗

今天&#xff0c;我们要向大家介绍的是四川芸鹰蓬飞商务信息咨询有限公司的电商带货服务&#xff0c;一个在电商领域独树一帜的服务项目。它的出现&#xff0c;不仅为电商行业注入了新的活力&#xff0c;也引领了行业发展的新趋势。 一、背景介绍 四川芸鹰蓬飞商务信息咨询有限…

mac 安装使用svn教程

mac 安装使用svn教程 一、安装Homebrew 要在Mac OS上安装SVN&#xff0c;首先需要安装Homebrew。Homebrew是一个流行的包管理器&#xff0c;因此我们将使用它来安装SVN。 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"…

电子印章怎么弄?三步教你电子印章在线生成免费教程!

在这个数字化快速发展的时代&#xff0c;电子印章已经成为日常商务活动中不可或缺的一部分。相对于传统的实体印章&#xff0c;电子印章具有更高的便捷性和安全性&#xff0c;更是无纸化办公中必不可少的一环。那么&#xff0c;电子印章怎么弄呢&#xff1f;跟着下面这三步来操…

Map and Set

map and set 文章目录 map and set前言搜索树<1> 操作-查找<2> 操作-插入<3> 操作-删除<4> 代码展示<5> 性能分析 Map 和 Set 概念及应用场景Map 和 Set 模型分析Map 的使用<1> Map常用方法说明<3> TreeMap 演示<2> Entry 内部…

[git] cherry pick 将某个分支的某次提交应用到当前分支

功能&#xff1a;将某个分支的某次提交应用到当前分支 应用场景&#xff1a; 在合并分支时&#xff0c;是将源分支的所有内容都合并到目标分支上&#xff0c;有的时候我们可能只需要合并源分支的某次或某几次的提交&#xff0c;这个时候我们就需要使用到git的cherry-pick操作…

超级APP,All in one APP

在信息化时代&#xff0c;企业需要处理的数据和使用的各种系统繁多复杂。然而&#xff0c;传统的应用往往孤立存在&#xff0c;导致数据无法流动和系统无法高效对接。WorkPlus作为一款超级APP&#xff0c;以其全面的功能和强大的集成能力&#xff0c;实现了数据到系统的全方位集…

GitHub Copilot Chat将于12月全面推出;DeepLearning.AI免费新课

&#x1f989; AI新闻 &#x1f680; GitHub Copilot Chat将于12月全面推出&#xff0c;提升开发者的生产力 摘要&#xff1a;GitHub宣布将于12月全面推出GitHub Copilot Chat&#xff0c;这是GitHub Copilot的一个新功能&#xff0c;旨在帮助开发者编写代码。它能够集成到开…

乐优商城(三)品牌管理

1. 品牌的新增 1.1 url 异步请求 点击品牌管理下的新增品牌&#xff0c;填写品牌信息后提交 2.打开浏览器控制台 由此可以得知&#xff1a; 请求方式&#xff1a;POST请求路径&#xff1a;/item/brand请求参数&#xff1a;{name: “测试品牌”, image: “”, cids: “76,32…

【Cocos新手进阶】父级预制体中的数据列表,在子预制体中的控制方法!

本篇文章主要讲解&#xff0c;cocos中在预制体操作过程中&#xff0c;父级预制体生成的数据列表中&#xff0c;绑定了子预制体中的事件&#xff0c;在子预制体的时间中如何控制上级列表的具体操作教程。 日期&#xff1a;2023年11月10日 作者&#xff1a;任聪聪 一、实际效果情…

矩阵起源加入 OpenCloudOS 操作系统开源社区,完成技术兼容互认证

近日&#xff0c;超融合异构云原生数据库 MatrixOne企业版软件 V1.0 完成了与 OpenCloudOS 的相互兼容认证&#xff0c;测试期间&#xff0c;整体运行稳定&#xff0c;在功能、性能及兼容性方面表现良好。 一、产品简介 矩阵起源 MatrixOrigin 致力于建设开放的技术开源社区和…

牛客网:NC69 链表中倒数最后k个结点

一、题目 函数原型&#xff1a; struct ListNode* FindKthToTail(struct ListNode* pHead, int k ) 二、思路 本题需要找到链表中的倒数第k个结点&#xff0c;有两种方法&#xff1a; 1.暴力解法&#xff1a;先遍历一次链表&#xff0c;计算出链表的长度&#xff1b;再遍历一次…

大厂面试题-MySQL索引的优点和缺点?

(图片)索引&#xff0c;是一种能够帮助MySQL高效从磁盘上检索数据的一种数据结构。在MySQL中的InnoDB引擎中&#xff0c;采用了B树的结构来实现索引和数据的存储 MySQL里面的索引的优点有很多&#xff1a; 1. 通过B树的结构来存储数据&#xff0c;可以大大减少数据检索时的磁…

【docker:容器提交成镜像】

容器创建部分请看&#xff1a;点击此处查看我的另一篇文章 容器提交为镜像 docker commit -a "sinwa lee" -m "首页变化" mynginx lxhnginx:1.0docker run -d -p 88:80 --name lxhnginx lxhnginx:1.0为啥没有变啊&#xff0c;首页&#xff1f; 镜像打包 …

CAN总线记录诊断助手 CAN记录仪

随着CAN总线的应用市场越来越多&#xff0c;不仅局限于汽车行业&#xff0c;工程车、特种车、消防、医疗等多行业都是以CAN总线通讯为主。总线的调试诊断也成为技术日常工作&#xff0c;有个好的工具能有效帮助发现问题、解决问题。 来可电子的CANLog-VCI是一款即插即用的CAN数…

从零开始:集成视频直播美颜SDK的步骤及注意事项

如果你是一位开发者&#xff0c;想要为你的视频直播应用添加美颜功能&#xff0c;那么你来对地方了。本文将从零开始&#xff0c;介绍集成视频直播美颜SDK的步骤及需要注意的事项&#xff0c;帮助你顺利实现这一技术目标。 步骤一&#xff1a;选择合适的美颜SDK 在开始之前&…

带有密码的Excel只读模式,如何取消?

Excel文件打开之后发现是只读模式&#xff0c;想要退出只读模式&#xff0c;但是只读模式是带有密码的&#xff0c;该如何取消带有密码的excel只读文件呢&#xff1f; 带有密码的只读模式&#xff0c;是设置了excel文件的修改权限&#xff0c;取消修改权限&#xff0c;我们需要…

银河麒麟操作系统安装_V4/V10系统详细使用教程

银河麒麟桌面操作系统V10是一款简单易用、稳定高效、安全创新的新一代图形化桌面操作系统产品。现已适配国产主流软硬件产品&#xff0c;同源支持飞腾、鲲鹏、海思麒麟、龙芯、申威、海光、兆芯等国产CPU和Intel、AMD平台&#xff0c;通过功耗管理、内核锁及页拷贝、网络、VFS、…