一、文档背景

大二下学期某个课程的模拟答辩。

二、小组安排

表2-1 小组成员与职责
成员职责
博主组长、项目部署、项目测试、文档编写
***后端测试、本地部署
***前端测试、本地部署

三、项目背景

当今社会,随着教育水平的提高和教育资源的广泛普及,考试成为了人们测量学习成果和能力的重要方式之一。而电子化考试系统的出现,则为传统考试方式的提升带来了新的机遇和挑战。电子化考试系统是指通过计算机技术和网络技术等手段来组织和实施考试活动的系统。它的出现极大的提高了考试活动的效率和便利性,对于解决考试过程中存在的一些问题具有显著作用,它具有以下优点:

1.方便的考试流程

电子化考试系统的实现,可以大大减轻教育管理和组织部门的工作压力。学生可自行缴纳考试费并进行在线注册,组织者可自动统计报名人数,考试时间、地点,安排座位等,这样不仅减轻了组织者的负担,也为学生提供了更便捷的报名、考试流程,同时阳光操作,也减少了人为操作失误。

2.保障考试公平性

考试过程中,学生作答信息可实时上传至服务器,组织者只需输入相应代码或密码即可得到考生试卷。这种检查考生答案的方式极大地减少了人为误判,可以降低误判率,提高考试的安全性。

3.标准化的评估标准

在传统考试方式中,标准化与否通常需要检查评卷教师的专业水平和评分的客观性。而在电子化考试系统中,传输输入信息后均需数字化评分(根据答案的准确率、速度、排版等指标),标记人为操作减少了,评卷的结果更加公正合理,减少了因人而异的成绩评定情况。

4.大数据分析

电子化考试系统可以快速记录学生参加考试的数据,统计学生的考试成绩和考试时间等信息。这些数据可以被用来分析学生学习和考试过程中的种种问题和痛点,之后有针对性地做出改进,调整教学方式,更好的满足学生需求。

总之,电子化考试系统是科技进步带来的一种方式,它既提高了考试效率,改善了考试体验,又增强了考试结果的公正性。未来,带着便利和优化的特点,电子化考试必将成为教育考试领域趋势。

在此背景下,学之思开源考试系统应运而生。

四、项目信息

1.学生系统功能

表4-1 学生系统功能
模块介绍
登录用户名、密码
注册年级、用户名、密码
任务中心管理员发布的年级任务,每个学生只能做一次
考试题干支持文本、图片、数学公式、表格等,学生答题支持:文本
固定试卷可重复练习、自行批改的试卷
时段试卷在时间限制内,可重复练习、自行批改的试卷
考试记录查看答卷记录和试卷信息
错题本答错题目会自动进入错题本,显示题目基本信息
个人信息显示学生个人资料
更新信息修改个人资料、头像
个人动态显示用户最近的个人动态
消息中心用于接收管理员发送的消息

image-20230520203020242

图4-1 学生用例图

2.管理系统功能

表4-2 管理系统功能
模块介绍
登录用户名、密码
主页试卷总数、题目总数、用户活跃度、题目月数量
学生列表显示系统所有的学生,新增、修改、删除、禁用
管理员列表显示系统所有的管理员,新增、修改、删除、禁用
学科列表学科查询、修改、删除
学科创编创建学科
试卷列表试卷查询、修改、删除
试卷创编创建的试卷为时段试卷、固定试卷、任务试卷
题目列表题目查询、修改、删除
题目创建题目支持单选题、多选题、判断题、填空题、简答题,题干支持文本、图片、表格、数学公式
任务列表任务查询、修改、删除
消息列表显示已发送的消息,消息已读人数等信息
消息发送发送消息给多个用户
用户日志显示所有用户日志
个人资料显示管理员用户名、真实姓名
时间线显示管理员创建时间
修改资料修改姓名、手机号

image-20230520200927468

图4-2 管理员用例图

3.数据库ER图

图4-3 数据库ER图

五、项目依赖

1.软件

1.1运行环境

表5-1 运行环境
环境版本
操作系统Windows / Linux(centos7.6)
NodeJs14
Jdk1.8
Mysql8.0
docker24.0.1

1.2后端系统

  • spring-boot 2.1.6.RELEASE
  • spring-boot-security 用户登录验证
  • undertow web容器
  • mysql 最流行的开源数据库
  • mybatis 数据库中间件
  • hikari 速度最快的数据库连接池
  • 七牛云存储 分布式文件存储中心

1.3前端系统

  • vue 采用新版,使用了vue-cli4搭建的系统,减少大量配置文件
  • element-ui 最流行的vue UI框架
  • vue-element-admin 深度定制版
  • echarts 图表统计
  • ueditor 题目编辑器

2.硬件

  • 最低配置1C+2G
  • 推荐配置2C+4G

六、项目部署

1.前言必看

集成部署:将打包的前端文件放在后端static下面(部署快)。

前后分离:各自部署(好维护)。

2.依赖部署

2.1安装docker

# 安装必要的一些系统工具 
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 
# 添加软件源信息 
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
# 更新并安装 Docker-CE 
sudo yum makecache fast 
sudo yum -y install docker-ce 
# 开启Docker服务 
sudo service docker start 

sudo mkdir -p /etc/docker 
sudo tee /etc/docker/daemon.json <<-'EOF' 
{ 
 "registry-mirrors": ["https://lz5xr9iw.mirror.aliyuncs.com"] 
} 
EOF 
sudo service docker start 
docker info

2.2创建网络

docker network create --driver bridge --subnet=172.18.0.0/16 --gateway=172.18.0.1 mynet

2.3安装MySQL

docker pull mysql:8.0.21;
docker run \
-dp 3306:3306 \
--restart=always \
--privileged=true \
--name mysql-8.0.21 \
--network=mynet \
--ip 172.18.0.21 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ="Asia/Shanghai" \
-v /opt/docker-mysql/conf:/etc/mysql/conf.d \
-v /opt/docker-mysql/data:/var/lib/mysql \
mysql:8.0.21;

2.4安装nginx

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum -y install nginx
systemctl start nginx
systemctl enable nginx

2.5创建数据库

1.SQL文件下载

点击查看SQL下载地址或下载SQL文件

2.Navicat创建

image-20230517215413451

图6-1 Navicat创建数据库
3.datagrip创建

image-20230517215223283

图6-2 datagrip创建数据库

2.6数据库设计

1.试卷表
  • 表名:t_exam_paper
  • 字段注释:
表6-1 试卷表
字段名类型注释
idint
namevarchar试卷名称
subject_idint学科
paper_typeint试卷类型( 1.固定试卷 4.时段试卷 6.任务试卷 )
grade_levelint年级
scoreint试卷总分(千分制)
question_countint题目数量
suggest_timeint建议时长(分钟)
limit_start_timedatetime时段试卷 开始时间
limit_end_timedatetime时段试卷 结束时间
frame_text_content_idint试卷框架 内容为JSON
create_userint
create_timedatetime
deletedbit
task_exam_idint
2.试卷答案表
  • 表名:t_exam_paper_answer
  • 字段注释:
表6-2 试卷答案表
字段名类型注释
idint
exam_paper_idint
paper_namevarchar试卷名称
paper_typeint试卷类型( 1.固定试卷 4.时段试卷 6.任务试卷 )
subject_idint学科
system_scoreint系统判定得分
user_scoreint最终得分(千分制)
paper_scoreint试卷总分
question_correctint做对题目数量
question_countint题目总数量
do_timeint做题时间(秒)
statusint试卷状态(1待判分 2完成)
create_userint学生
create_timedatetime提交时间
task_exam_idint
3.试卷题目答案表
  • 表名:t_exam_paper_question_customer_answer
  • 字段注释:
表6-3 试卷题目答案表
字段名类型注释
idint
question_idint题目Id
exam_paper_idint答案Id
exam_paper_answer_idint
question_typeint题型
subject_idint学科
customer_scoreint得分
question_scoreint题目原始分数
question_text_content_idint问题内容
answervarchar做题答案
text_content_idint做题内容
do_rightbit是否正确
create_userint做题人
create_timedatetime
item_orderint
4.消息表
  • 表名:t_message
  • 字段注释:
表6-4 消息表
字段名类型注释
idint
titlevarchar标题
contentvarchar内容
create_timedatetime
send_user_idint发送者用户ID
send_user_namevarchar发送者用户名
send_real_namevarchar发送者真实姓名
receive_user_countint接收人数
read_countint已读人数
5.用户消息表
  • 表名:t_message_user
  • 字段注释:
表6-5 用户消息表
字段名类型注释
idint
message_idint消息内容ID
receive_user_idint接收人ID
receive_user_namevarchar接收人用户名
receive_real_namevarchar接收人真实姓名
readedbit是否已读
create_timedatetime
read_timedatetime阅读时间
6.题目表
  • 表名:t_question
  • 字段注释:
表6-6 题目表
字段名类型注释
idint
question_typeint1.单选题 2.多选题 3.判断题 4.填空题 5.简答题
subject_idint学科
scoreint题目总分(千分制)
grade_levelint级别
difficultint题目难度
correcttext正确答案
info_text_content_idint题目 填空、 题干、解析、答案等信息
create_userint创建人
statusint1.正常
create_timedatetime创建时间
deletedbit
7.学科表
  • 表名:t_subject
  • 字段注释:
表6-7 学科表
字段名类型注释
idint
namevarchar语文 数学 英语 等
levelint年级 (1-12) 小学 初中 高中 大学
level_namevarchar一年级、二年级等
item_orderint排序
deletedbit
8.任务表
  • 表名:t_task_exam
  • 字段注释:
表6-8 任务表
字段名类型注释
idint
titlevarchar
grade_levelint级别
frame_text_content_idint任务框架 内容为JSON
create_userint
create_timedatetime
deletedbit
create_user_namevarchar
9.用户任务表
  • 表名:t_task_exam_customer_answer
  • 字段注释:
表6-9 用户任务表
字段名类型注释
idint
task_exam_idint
create_userint
create_timedatetime
text_content_idint任务完成情况(Json)
10.文本表
  • 表名:t_text_content
  • 字段注释:
表6-10 文本表
字段名类型注释
idint
contenttext
create_timedatetime
11.用户表
  • 表名:t_user
  • 字段注释:
表6-11 用户表
字段名类型注释
idint
user_uuidvarchar
user_namevarchar用户名
passwordvarchar
real_namevarchar真实姓名
ageint
sexint1.男 2女
birth_daydatetime
user_levelint学生年级(1-12)
phonevarchar
roleint1.学生 3.管理员
statusint1.启用 2禁用
image_pathvarchar头像地址
create_timedatetime
modify_timedatetime
last_active_timedatetime
deletedbit是否删除
wx_open_idvarchar微信openId
12.用户日志表
  • 表名:t_user_event_log
  • 字段注释:
表6-12 用户日志表
字段名类型注释
idint
user_idint用户id
user_namevarchar用户名
real_namevarchar真实姓名
contenttext内容
create_timedatetime时间
13.用户Token表
  • 表名:t_user_token
  • 字段注释:
表6-13 用户Token表
字段名类型注释
idint
tokenvarchar
user_idint用户Id
wx_open_idvarchar微信openId
create_timedatetime
end_timedatetime
user_namevarchar用户名

3.集成部署

3.1前端打包

1.打包项目

分别在\source\vue\xzs-student目录和source\vue\xzs-admin目录,执行前端打包命令

npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/
npm install --registry https://registry.npm.taobao.org
npm run build

打包后的目录为student和admin,如下图所示:

image-20230517133049856

图6-3 admin打包后的位置

image-20230517133156501

图6-4 student打包后的位置

3.2后端打包

1.导入前端

将前端打包好的文件放到\source\xzs\src\main\resources\static下,如下图所示:

image-20230517134820541

图6-5 前端admin和studnet在后端的存放位置
2.修改数据库

修改配置文件中的数据库地址,默认运行的是 application-prod.yml,所以只修改它,如下图所示:

image-20230517131933699

图6-6 修改数据库配置
3.打包项目

将项目打包成jar包

image-20230517130330192

图6-7 后端打包成jar包

3.3服务器

1.上传

将上面打包的项目文件上传到服务器

2.编写Dockerfile

这个Dockerfile要放在“/**/”下面。

如:我将项目文件放在了"/huaweiCloud"下面,则Dockerfile就要放在“/huaweiCloud/”下面。

FROM openjdk:8-jre-alpine
ENV LANG en_US.UTF-8
RUN set -xe && apk --no-cache add ttf-dejavu fontconfig
VOLUME /tmp
ADD xzs-3.9.0.jar app.jar
EXPOSE 8089
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
3.构建镜像
docker build -t xzs-3.9.0:2 ./
4.构建容器
docker run -d \
-p 8089:8089 \
--restart=always \
--privileged=true \
--name xzs-3.9.0 \
--network=mynet \
--ip 172.18.0.12 \
-e TZ="Asia/Shanghai" \
-e XZS_MYSQL_DB_NAME="xzs" \
-e XZS_MYSQL_DB_PORT="3306" \
-e XZS_MYSQL_HOST="172.18.0.21" \
-e XZS_MYSQL_USER="root" \
-e XZS_MYSQL_PASSWORD="123456" \
xzs-3.9.0:2;
5.查看容器是否运行
docker ps
6.访问地址
  • 教师端访问地址htpp://IP:8089/admin
  • 学生端访问地址htpp://IP:8089/student

4.前后分离

4.1后端打包

1.删掉前端目录

将“\source\xzs\src\main\resources\static”中的static删掉

image-20230517145650650

图6-8 删掉static目录
2.打包后端

将后端打包成jar包

image-20230517130330192

图6-9 将后端打包成jar包

4.2前端打包

1.打包项目

分别在\source\vue\xzs-student目录和source\vue\xzs-admin目录,执行前端打包命令

npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/
npm install --registry https://registry.npm.taobao.org
npm run build

打包后的目录为student和admin,如下图所示:

image-20230517133049856

图6-10 admin存放位置

image-20230517133156501

图6-11 student存放位置

4.3服务器

1.上传前后端项目文件

先打包下面三个文件,然后再上传服务器。

admin和student存放位置在上一步中。

image-20230517151523912

图6-12 上传打包好的项目文件
2.创建目录

创建/usr/local/xzs/web/目录,然后将打包后的student、admin放到此目录下

image-20230517152406308

图6-13 创建目录
3.配置nginx

先删除下列文件中的所有内容。

vi /etc/nginx/conf.d/default.conf

然后添加下面的内容。

server {
    listen      8001;
    server_name xzs;
    location / {
        root /usr/local/xzs/web/;
        index index.html;
    }
    location /api/ {
       proxy_pass  http://localhost:8000;
    }
}
4.构建镜像

编写Dockerfile。

Dockerfile要放在jar包存放处。

FROM openjdk:8-jre-alpine
ENV LANG en_US.UTF-8
RUN set -xe && apk --no-cache add ttf-dejavu fontconfig
VOLUME /tmp
ADD xzs-3.9.0.jar app.jar
EXPOSE 8090
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

构建镜像

docker build -t xzs-3.9.0:1.1 ./
5.构建容器
docker run -d \
-p 8090:8090 \
--restart=always \
--privileged=true \
--name xzs-3.9.1 \
--network=mynet \
--ip 172.18.0.13 \
-e TZ="Asia/Shanghai" \
-e XZS_MYSQL_DB_NAME="xzs" \
-e XZS_MYSQL_DB_PORT="3306" \
-e XZS_MYSQL_HOST="172.18.0.10" \
-e XZS_MYSQL_USER="root" \
-e XZS_MYSQL_PASSWORD="123456" \
-v /huaweiCloud:/xzs/ \
xzs-3.9.0:1.1;
6.访问地址
  • 教师端访问地址htpp://IP:8001/admin
  • 学生端访问地址htpp://IP:8001/student

七、集成测试

1.学生端

点击查看学生端访问地址或访问学生端 测试账户:张三 密码:123456 亦可自行注册。

image-20230517163015376

图7-1 学生端登陆界面

image-20230517163050728

图7-2 学生端功能界面

2.管理员端

点击查看管理员端访问地址或访问管理员端 测试账户:admin 密码:123456

image-20230517163256230

图7-3 管理员端功能界面