• 基于SSM+Vue+SpringCloud+MySQL的程序在线评测系统的设计与实现


    目 录
    摘 要 I
    Abstract II
    1 概述 1
    2 系统分析 2
    2.1可行性分析 2
    2.2系统功能分析 3
    2.3非功能需求 5
    2.4页面需求 6
    3 系统设计 7
    3.1主要技术简介 7
    3.2系统架构及结构设计 7
    3.3系统流程设计 9
    3.4数据结构设计 11
    4 系统实现 22
    4.1用户模块 22
    4.2题库模块 26
    4.3竞赛模块 32
    4.4教学模块 32
    4.5管理模块 33
    5 系统测试 36
    5.1测试目的及意义 36
    5.2主要测试用例 36
    总结 39
    参考文献 40
    致谢 41
    2 系统分析
    2.1可行性分析
    对程序在线评测系统进行初步调研后,分析论证了项目的必要性和可行性,避免在开发过程中出现错误。笔者从技术可行性、经济可行性和社会可行性三个方面进行了分析论证。
    2.1.1技术可行性分析
    技术可以行性分析可以分为两点:硬件分析和技术分析。本系统采用Spring Cloud搭建系统架构,Spring Cloud具有易于开发和维护的优点。服务采用Spring Boot搭建,可单独部署,单个服务可扩展为集群,集群间可根据并发量水平的扩展云主机。硬件上只需要适当的云主机即可部署项目,部署和运维成本较低。本系统采用Spring Boot、Spring Cloud等Spring衍生下的技术,百度、知网等知名文献网站均能找到相关教程,教程先进、完善,技术上也是满足要求的。
    2.1.2经济可行性分析
    对于一个基于微服务的程序在线评测系统的开发项目要在经济方面评价其是否合理,成本的预算是十分重要的,其影响到项目的可行性。本系统使用的所有开发工具皆为社区版,技术、数据库均为开源的、免费的,基本无资金投入,经济上是完全可行的。
    2.1.3社会可行性分析
    社会可行性分析可以分为两点:法律可行性分析和用户可行性分析。本系统采用Spring Boot搭建服务、Spring Cloud搭建微服务架构,以上2种技术均免费对所有人群开放的,且用户页面为自主设计,未对任何人进行技术盗窃,或是版权上的侵犯,法律上是可行的。OJ系统普遍存在于各大高校中,主要用户为大学计算机专业的学生和业余爱好者,拥有广大的受众,通过推广本系统竞赛和教学功能,用户量将会飞速上涨,用户可行性是完全没有问题的。
    本文转载自http://www.biyezuopin.vip/onews.asp?id=15614
    2.2系统功能分析
    2.2.1用户功能
    登录注册:用户进行程序在线评测、竞赛和参与教学的系统入口,也是用户系统的初始页面。
    找回密码:用户忘记密码时,可通过此入口找回密码。
    个人中心:用户登录系统后,可通过此入口查看和编辑个人资料,管理博客、收藏和评论。
    查看消息:用户登录系统后,可查看系统最新公告和个人消息。
    发布博客:用户登录系统后,可通过博客入口,发布个人题解和笔记。
    在线评测:用户登录系统后,可通过题库入口,进行程序在线评测,提高全国排名。
    参与竞赛:用户登录系统后,可通过竞赛入口,参与竞赛,提高竞赛排名。
    如图2-1所示,该图描述了用户可在本系统使用的功能。

    package com.ruoyi.project.demo.domain;
    
    import java.util.Date;
    import com.ruoyi.common.utils.DateUtils;
    import com.ruoyi.framework.aspectj.lang.annotation.Excel;
    import com.ruoyi.framework.aspectj.lang.annotation.Excel.Type;
    import com.ruoyi.framework.web.domain.BaseEntity;
    
    public class UserOperateModel extends BaseEntity
    {
        private static final long serialVersionUID = 1L;
    
        private int userId;
    
        @Excel(name = "用户编号")
        private String userCode;
    
        @Excel(name = "用户姓名")
        private String userName;
    
        @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
        private String userSex;
    
        @Excel(name = "用户手机")
        private String userPhone;
    
        @Excel(name = "用户邮箱")
        private String userEmail;
    
        @Excel(name = "用户余额")
        private double userBalance;
    
        @Excel(name = "用户状态", readConverterExp = "0=正常,1=停用")
        private String status;
    
        @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
        private Date createTime;
    
        public UserOperateModel()
        {
    
        }
    
        public UserOperateModel(int userId, String userCode, String userName, String userSex, String userPhone,
                String userEmail, double userBalance, String status)
        {
            this.userId = userId;
            this.userCode = userCode;
            this.userName = userName;
            this.userSex = userSex;
            this.userPhone = userPhone;
            this.userEmail = userEmail;
            this.userBalance = userBalance;
            this.status = status;
            this.createTime = DateUtils.getNowDate();
        }
    
        public int getUserId()
        {
            return userId;
        }
    
        public void setUserId(int userId)
        {
            this.userId = userId;
        }
    
        public String getUserCode()
        {
            return userCode;
        }
    
        public void setUserCode(String userCode)
        {
            this.userCode = userCode;
        }
    
        public String getUserName()
        {
            return userName;
        }
    
        public void setUserName(String userName)
        {
            this.userName = userName;
        }
    
        public String getUserSex()
        {
            return userSex;
        }
    
        public void setUserSex(String userSex)
        {
            this.userSex = userSex;
        }
    
        public String getUserPhone()
        {
            return userPhone;
        }
    
        public void setUserPhone(String userPhone)
        {
            this.userPhone = userPhone;
        }
    
        public String getUserEmail()
        {
            return userEmail;
        }
    
        public void setUserEmail(String userEmail)
        {
            this.userEmail = userEmail;
        }
    
        public double getUserBalance()
        {
            return userBalance;
        }
    
        public void setUserBalance(double userBalance)
        {
            this.userBalance = userBalance;
        }
    
        public String getStatus()
        {
            return status;
        }
    
        public void setStatus(String status)
        {
            this.status = status;
        }
    
        @Override
        public Date getCreateTime()
        {
            return createTime;
        }
    
        @Override
        public void setCreateTime(Date createTime)
        {
            this.createTime = createTime;
        }
    }
    
    • 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
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149

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

  • 相关阅读:
    企业如何实现安全可靠的云密码管理
    向量数据库库Milvus Cloud2.3 技术选型中性能、成本、扩展性是重点
    LeetCode LCP 06. 拿硬币【贪心,数学】简单
    软件安装(Tomcate,Mysql,lrzsz)
    [spark]排序
    120年奥运历史数据分析
    Java I/O模型发展以及Netty网络模型的设计思想
    python经典百题之特殊图形打印
    B+树的定义以及查找
    selenium WebDriver 中的几种等待--sleep(),implicitly_wait(),WebDriverWait()
  • 原文地址:https://blog.csdn.net/newlw/article/details/126686141