SurveyKing(卷王)部署实战:从Docker到在线考试系统搭建
2026/8/30 1:38:21 网站建设 项目流程

先聊一个实际场景:很多团队在内部培训考核、校园课程测验、企业满意度调研、社区活动报名收集时,都需要一套“能发问卷、能组织考试、能刷题练习”的系统。如果直接用商业化 SaaS,要么按人数收费,要么数据不在自己手里,要么无法二次开发和定制。如果从零开发问卷和考试模块,后端表单设计、题目管理、成绩统计、防作弊、权限控制,一套下来工作量非常大。

SurveyKing(项目也叫“卷王”)正是为了解决这些问题而开源的一套问卷考试系统。它把问卷调查、在线考试、题库刷题、智能组卷等常见功能整合在一起,部署之后可以直接在浏览器中使用。本文会从零开始,完整讲解 SurveyKing 的安装部署、环境配置、初始化数据、系统使用、常见报错排查和项目落地建议。

本文适合以下读者:

  • 想要快速搭建内部考试平台的运维或后端开发;
  • 学校、培训机构需要自建在线考试系统的技术负责人;
  • 对 Spring Boot + Vue 前后端分离项目感兴趣,想找一个完整开源项目来实操的开发者;
  • 想基于开源系统做二次开发,但不知道怎么部署和改配置的初学者。

读完本文,你将掌握 SurveyKing 的本地部署流程、Docker 部署方式、管理员初始化、问卷创建、考试发布、刷题模式配置,以及 AI 智能试卷的使用思路。

1. SurveyKing(卷王):功能和架构速览

1.1 什么是 SurveyKing

SurveyKing 是一套基于开源技术栈的问卷考试系统,核心功能覆盖三个典型场景:问卷收集、在线考试、题库刷题。它不是一个简单的“问卷表单生成器”,而是把题目管理、答卷收集、自动阅卷、成绩统计、错题记录、智能组卷等完整闭环都做了进去。

从使用者的角度来说,系统分为两类角色:

  • 管理员/出题人:创建题目、组织试卷、发布考试、查看统计结果。
  • 参与者/考生:填写问卷、参加考试、刷题练习、查看自己的成绩和错题。

从系统模块的角度来看,它包含:

  • 问卷模块:支持单选、多选、填空、评分、矩阵等题型,适合做调研和满意度收集。
  • 考试模块:支持定时发布、限时作答、自动计分、切屏检测、成绩导出等功能。
  • 刷题模块:把题库拆成专项练习和随机练习,用户答题后可以查看解析和错题记录。
  • AI 智能试卷:基于大模型能力,根据题目数量和知识点要求自动生成试卷,减少出题人的工作量。

1.2 技术架构

SurveyKing 本身是典型的前后端分离项目,这一点对开发者也很有参考价值。通常包含:

  • 后端:Spring Boot、MyBatis/JPA 等 Java 生态技术栈;
  • 前端:Vue + Element UI / Ant Design Vue 这类后台管理框架;
  • 数据库:MySQL,存储题目、试卷、答卷、用户等数据;
  • 缓存:Redis,用于会话管理、验证码、热点数据缓存;
  • 权限认证:基于 JWT 的 Token 机制。

这种架构的好处是前后端职责清晰,后端只提供 API,前端负责页面交互,后续如果要扩展小程序端、移动端 H5,可以复用同一套后端接口。

1.3 为什么推荐自建这类系统

在企业内部或教育场景中,自建问卷考试系统有几个实际优势:

  • 数据私有化:问卷结果、考试成绩都存自己的服务器,不依赖外部 SaaS;
  • 可以二次开发:开源项目自带源码,可以改 Logo、加登录方式、对接统一身份认证;
  • 按需扩展:如果只做问卷调查,可以关闭考试模块;如果要万人同时在线考试,可以扩展部署;
  • 学习价值:如果你是 Java 后端开发者,SurveyKing 是一个很好的全栈实战项目,可以学到权限管理、导入导出、统计报表、数据库设计等知识。

2. 环境准备与部署方式选择

2.1 部署方式对比

SurveyKing 的部署方式主要有三种:

部署方式适合场景难度说明
Docker Compose 部署快速体验、生产方式一条命令拉起前后端和依赖服务
手动编译部署已有服务器环境、二次开发需要自己安装 Java、Node.js、MySQL、Redis
本地 IDE 启动学习源码、调试功能前后端分开启动,适合开发调试

如果你是第一次接触这个项目,想快速看效果,建议优先使用 Docker Compose。如果你想改代码、学原理,建议使用本地编译部署。

2.2 编译部署所需环境

如果选择手动编译或本地调试,需要准备以下环境:

  • JDK 1.8 或 JDK 11 及以上版本;
  • Maven 3.6 以上;
  • Node.js 14 及以上版本(前端构建用);
  • MySQL 5.7 或 8.0;
  • Redis 5.x 及以上版本。

不同的开源版本对 JDK、MySQL 版本要求可能不同,建议先看项目 README 和 pom 文件中的版本声明。这里不写死具体版本号,因为 SurveyKing 版本迭代较快,以你拉取代码时的实际要求为准。

2.3 服务器要求

如果是生产环境使用,建议服务器配置不低于:

  • CPU:2 核;
  • 内存:4 GB;
  • 硬盘:40 GB;
  • 系统:CentOS 7.x / Ubuntu 20.04 及以上。

如果只是本地体验,Windows / macOS 上都可运行,内存 8 GB 的电脑足够。

2.4 域名和端口规划

默认情况下后端 API 服务、前端页面都通过 Nginx 或 Spring Boot 的端口暴露。建议提前规划:

  • 前端页面端口:比如 8080;
  • 后端 API 端口:比如 8081;
  • 如果使用 https,提前准备好域名和 SSL 证书。

3. 手动部署:从源码开始安装 SurveyKing

3.1 获取源码与项目结构

首先需要把源码拉到本地。方式很简单:

git clone https://gitee.com/vvkeeper/surveyking.git cd surveyking

进入项目后,目录结构大致如下:

surveyking/ ├── backend/ # 后端 Spring Boot 项目 │ ├── src/main/java # Java 源码 │ ├── src/main/resources # 配置文件 │ └── pom.xml # Maven 依赖 ├── frontend/ # 前端 Vue 项目 │ ├── src/ │ └── package.json ├── docker-compose.yml # Docker 编排文件 └── README.md

建议先查看README.md,因为每次版本更新后,部署步骤可能会有调整。

3.2 初始化数据库

SurveyKing 启动时需要 MySQL 数据库。我们可以先创建一个数据库,再执行源码中提供的初始化 SQL。

CREATE DATABASE `surveyking` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

创建完成后,在backend/src/main/resources下查看 SQL 初始化脚本,一般会有类似db.sqlinit.sql的文件。执行方式如下:

mysql -uroot -p surveyking < backend/src/main/resources/db.sql

注意:数据库字符集建议使用utf8mb4,否则遇到 emoji 表情或生僻字可能出现乱码。

3.3 修改后端配置

后端启动前需要修改数据库和 Redis 连接配置。在backend/src/main/resources/application.ymlapplication.properties中,配置类似下面内容:

spring: datasource: url: jdbc:mysql://localhost:3306/surveyking?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: your_password redis: host: localhost port: 6379 password:

这里需要根据自己的实际环境修改数据库地址、用户名、密码和 Redis 密码。

3.4 启动后端

后端是标准 Spring Boot 项目,可以直接使用 Maven 打包启动:

cd backend mvn clean package -DskipTests java -jar target/surveyking-backend-*.jar

如果 Maven 命令执行较慢,可以配置阿里云 Maven 镜像。启动成功后,看到类似Started SurveykingApplication的日志,就说明后端启动成功。

3.5 构建并启动前端

前端是 Vue 项目,先安装依赖,再构建静态文件:

cd frontend npm install npm run build

构建完成后,dist目录中就是打包好的前端静态文件。我们可以用 Nginx 来托管这些静态文件,并将/api请求代理到后端服务。

Nginx 配置示例:

server { listen 8080; server_name localhost; root /path/to/surveyking/frontend/dist; index index.html; location / { try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

这里假设后端运行在8081端口。配置完成后重启 Nginx,通过http://服务器IP:8080就能访问系统首页。

4. Docker Compose 一键部署(推荐)

对于不想折腾 Java 和 Node 环境的同学,Docker Compose 是最省事的方式。源码中通常已经提供docker-compose.yml文件,我们只需要准备 MySQL、Redis 和应用三个服务。

4.1 编写 Docker Compose 文件

如果源码目录中已有现成的docker-compose.yml,可以直接按 README 启动。如果没有,可以参考下面的思路:

version: '3' services: mysql: image: mysql:8.0 container_name: surveyking-mysql environment: MYSQL_ROOT_PASSWORD: root123456 MYSQL_DATABASE: surveyking ports: - "3306:3306" volumes: - mysql-data:/var/lib/mysql command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci redis: image: redis:7 container_name: surveyking-redis ports: - "6379:6379" surveyking: image: your-registry/surveyking:latest container_name: surveyking-app depends_on: - mysql - redis ports: - "8080:8080" environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/surveyking?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: root123456 SPRING_REDIS_HOST: redis SPRING_REDIS_PORT: 6379 volumes: mysql-data:

如果官方没有提供可直接使用的镜像,可以先在本地把后端代码打成 Docker 镜像,再用 Compose 启动。GitHub/Gitee 仓库中一般会有 Dockerfile,构建命令通常是:

docker build -t surveyking:latest .

4.2 启动服务

在包含docker-compose.yml的目录下执行:

docker-compose up -d

等待镜像拉取和容器启动完成后,用下面命令查看容器状态:

docker-compose ps

如果三个服务都处于Up状态,说明部署成功。此时访问http://服务器IP:8080即可看到系统页面。

4.3 查看日志

如果启动过程中出现问题,可以使用日志排查:

docker-compose logs -f surveyking

这种方式的优势在于不污染宿主机环境,后续升级版本时只需要替换镜像并重新创建容器即可。

5. 数据库初始化与管理员账号设置

5.1 首次启动的自动建表

SurveyKing 通常在启动时会自动创建数据库表,所以第 3 节中的手动db.sql执行可以省略。但如果你使用的是旧版本,或者需要手动维护数据库,建议执行源码中的初始化脚本。

5.2 管理员账号初始化

系统首次启动后,需要初始化管理员账号。不同版本管理后台的入口可能不同,常见的方式有两种:

  • 通过命令行参数传入初始管理员账号;
  • 通过页面注册第一个账号,并自动赋予管理员权限;
  • 通过 SQL 脚本插入管理员数据。

部署完成后,建议第一时间进入系统,找到“系统设置”或“用户管理”,修改默认管理员密码。如果默认账号是admin/admin123这类常见密码,一定要在生产环境中改掉,避免被扫描器攻击。

5.3 数据库备份策略

数据库中的试卷、问卷、用户数据都是核心资产,建议开启 MySQL 定时备份。一个简单的每日备份脚本思路如下:

#!/bin/bash backup_dir="/data/backup/surveyking" mkdir -p $backup_dir mysqldump -uroot -p你的密码 surveyking > $backup_dir/surveyking_$(date +%Y%m%d).sql find $backup_dir -type f -mtime +7 -exec rm -f {} \;

将脚本加入 crontab 后,可以每天凌晨执行一次。生产环境的备份策略建议遵循“本地备份 + 异地备份”双副本原则。

6. 系统使用实战:问卷、考试、刷题与 AI 智能试卷

6.1 创建问卷收集

登录系统管理后台后,在“问卷管理”或“问卷列表”中点击“创建问卷”。

创建问卷时需要配置以下信息:

  • 问卷标题:建议写成“XX部门员工满意度调查”这类清晰标题;
  • 问卷说明:填写给参与者的引导语;
  • 匿名设置:如果需要匿名收集,开启匿名提交;
  • 截止时间:设置收集截止日期;
  • 题型选择:单选、多选、单选下拉、评分、矩阵、填空等。

问卷编辑器中,每个题目可以设置:

  • 是否必填;
  • 选项随机顺序;
  • 逻辑跳转;
  • 分值(如果用于打分)。

保存并发布后,系统会生成一个问卷链接或二维码。参与者打开链接即可填写,不需要注册系统账号。

6.2 创建并发布在线考试

在线考试模块比问卷更严格,适合用来做正式考核。

发布一场在线考试的基本流程为:

  1. 创建题库:先把题目录入题库,或者从 Excel 模板批量导入;
  2. 创建试卷:从题库中随机抽题,或手动挑选题目;
  3. 设置考试参数:考试时长、及格分数、是否允许查看答案、是否开启切屏检测;
  4. 发布考试:选择考试时间范围,生成考试链接;
  5. 考生答卷:考生在浏览器中作答;
  6. 自动阅卷:客观题系统自动判分,主观题由管理员人工评阅。

在实际使用中,建议先创建一份“测试试卷”,用自己账号模拟一次完整考试流程,确认切屏检测、倒计时交卷等逻辑符合预期后再正式发布。

6.3 题库维护与批量导入

对于有大量题目的培训机构,手工录题效率太低。SurveyKing 通常支持 Excel 模板导入,一般步骤如下:

  1. 下载系统提供的导入模板;
  2. 按模板填写题干、选项、正确答案、解析、所属知识点;
  3. 在题目列表中点击“批量导入”;
  4. 上传模板文件,系统校验并导入。

导入时要注意模板不能随意修改列名,多选题答案格式一般使用 A,B,C 这种分隔符。如果导入失败,通常会返回具体行号的错误提示,按提示修正后重新上传即可。

6.4 刷题模式配置

刷题模块面向“平时练习”场景,与正式考试的区别在于:刷题可以即时查看解析和答案,适合学生自主巩固知识。

常用配置包括:

  • 专项刷题:按知识点、章节出题;
  • 随机练习:每次随机抽取一定数量的题目;
  • 错题本:自动收集做错的题目,方便反复强化;
  • 练习模式答题:一题一题作答,提交后立刻显示解析。

刷题功能在“题库练习”或“学习中心”中配置。管理员只需保证题库数据完整,并设置好题目的知识点分类即可。

6.5 AI 智能试卷:思路与配置

AI 智能试卷是 SurveyKing 比较吸引人的功能。它的核心价值在于:出题人只需要输入考试主题、题目数量和题型分布,AI 就能结合大模型生成一套包含题干、选项和答案的试卷,供后续人工校对和发布。

使用 AI 智能试卷前,通常需要做以下准备:

  • 检查当前版本是否包含 AI 试卷入口;
  • 配置大模型 API Key,不同的版本可能对接不同的模型服务提供商;
  • 准备足够的题库数据或知识库上下文,方便 AI 生成符合要求的题目;
  • 在系统设置中填写模型接口地址、Token 等信息。

如果版本没有内置 AI 生成能力,也可以自己二次开发:调用大模型 API,把题目要求作为提示词,让模型生成 JSON 结构的数据,再通过后端接口自动导入题库。这个思路不依赖具体的实现类,实施起来更灵活。

无论使用哪种方式,AI 生成的题目都建议人工审校。因为模型生成的题目可能存在知识点错误、选项重复、答案不准确的问题,不能直接用于正式考试。

7. 常见问题与排查思路

7.1 高频问题表

下面整理部署和使用过程中比较常见的几类问题:

问题现象常见原因解决思路
后端启动失败,提示数据库连接失败数据库地址或密码错误检查 application.yml 中的配置,确认 MySQL 可远程访问
页面能访问,但登录接口报 401Redis 未启动或 Token 校验失败确认 Redis 进程存在,检查前后端 API 地址是否一致
中文乱码数据库字符集不对创建数据库时使用 utf8mb4,检查 serverTimezone 配置
上传 Excel 后题目导入失败模板列名不符合要求重新下载最新模板,保持列名和格式不变
部署后刷新页面 404前端 history 路由未配置 try_filesNginx 配置try_files $uri $uri/ /index.html;
容器启动后立刻退出环境变量或依赖服务未就绪查看日志,确认 MySQL、Redis 连接是否正常
考试过程中切屏被强制交卷开启了切屏检测在新 tab 打开文档不会有问题,但正式考试应关闭无关页面

7.2 端口被占用

启动后端或前端时,如果提示端口被占用,先找出占用进程:

lsof -i:8080

在 Linux 上也可以使用:

netstat -tunlp | grep 8080

确认占用进程后,要么关闭进程,要么修改应用配置文件中的端口。

7.3 前后端联调时接口 404

前端页面能打开,但点击登录提示接口不存在。这种问题通常是:

  • 前端请求的 API 前缀和后端服务的 context-path 不一致;
  • Nginx 没有正确代理/api路径;
  • 后端启动失败,接口服务根本没起来。

建议先用 curl 直接测试后端接口:

curl http://127.0.0.1:8081/api/health

如果后端接口正常,再去排查 Nginx 代理配置。

7.4 部署到 Nginx 后刷新 404

这个问题在前端路由中非常经典。Vue 的 history 模式在刷新时会向服务器请求当前路径,而服务器上并没有对应的物理文件,导致 404。解决办法就是添加try_files配置,让所有未匹配路径都落到index.html

8. 最佳实践与工程建议

8.1 运维层面的建议

  • 生产环境一定要开启 HTTPS。考试/问卷场景会收集用户数据,明文传输存在窃听风险;
  • 数据库、Redis 密码不要使用简单密码,避免使用默认密码;
  • 定时备份数据库,并在另一台服务器或对象存储保存备份文件;
  • 部署到 Docker 时,不要用 root 用户运行容器,尽量使用专用用户;
  • Nginx 开启 Gzip 压缩,可以提高前端资源加载速度;
  • 如果参与人数较多,考试当天提前压测,确认服务器带宽和数据库连接池足够。

8.2 业务使用层面的建议

  • 正式考试前,先创建一份模拟试卷完整走一遍,检查计分逻辑和交卷流程;
  • 问卷收集如果涉及多个渠道,可以在标题或 URL 上带渠道参数,方便统计来源;
  • 题库导入后,安排专人抽查题目答案的正确性;
  • 考生答案的查看权限要严格控制,避免成绩泄露;
  • 对于主观题,人工评阅后要支持成绩复核流程。

8.3 二次开发层面的建议

  • 如果需要对接公司内部用户体系,可以新增一个登录接口,复用 JWT 生成逻辑;
  • 如果要做数据大屏,可以写定时任务把答卷数据统计结果汇总到独立表,减少对主库的压力;
  • 前后端分离的项目,建议统一使用 API 文档工具(如 Knife4j、Swagger)维护接口文档;
  • 修改代码时,不要直接改application.yml里的生产配置,推荐使用环境变量或配置中心。

8.4 安全加固清单

最后列出安全方面的自查项:

  • 修改默认管理员账号密码;
  • 关闭不必要的服务器对外端口;
  • 使用数据库最小权限账号;
  • 为 Redis 设置密码并禁止外网访问;
  • 定期更新 SurveyKing 版本,关注官方安全公告。

9. 总结与下一步学习方向

至此,我们从零走通了 SurveyKing 的完整安装与使用流程:先了解了系统定位和技术架构,接着完成了手动编译部署和 Docker 部署两种方式,然后学习了数据库初始化、管理员设置、问卷创建、在线考试、题库刷题和 AI 智能试卷的使用思路,最后整理了高频报错和工程落地建议。

如果你部署成功,那么下一步可以这样继续深入:

  • 仔细读一遍后端controllerservice层的代码,理解 JWT 登录和创建试卷的完整流程;
  • 尝试新增一种题型,从前端表单到后端存储完整实现一次;
  • 尝试对接企业微信或钉钉的扫码登录;
  • 尝试用 Nginx 部署 HTTPS,配置域名和自动续期证书;
  • 尝试写一个简单的数据导出脚本,把考试结果定时同步到公司内部系统。

SurveyKing 这类开源系统最大的价值,不只是“能用”,而是“可以学到一套完整的企业级全栈思路”。如果你正在学习 Spring Boot 和 Vue 项目,把它当作实战项目来拆解,收获会很大。

如果在部署过程中还有其他问题,欢迎在评论区描述你的部署方式和日志截图,可以一起交流排查经验。实测通过的部署流程别忘了收藏备用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询