先聊一个实际场景:很多团队在内部培训考核、校园课程测验、企业满意度调研、社区活动报名收集时,都需要一套“能发问卷、能组织考试、能刷题练习”的系统。如果直接用商业化 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.sql或init.sql的文件。执行方式如下:
mysql -uroot -p surveyking < backend/src/main/resources/db.sql注意:数据库字符集建议使用utf8mb4,否则遇到 emoji 表情或生僻字可能出现乱码。
3.3 修改后端配置
后端启动前需要修改数据库和 Redis 连接配置。在backend/src/main/resources/application.yml或application.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 创建并发布在线考试
在线考试模块比问卷更严格,适合用来做正式考核。
发布一场在线考试的基本流程为:
- 创建题库:先把题目录入题库,或者从 Excel 模板批量导入;
- 创建试卷:从题库中随机抽题,或手动挑选题目;
- 设置考试参数:考试时长、及格分数、是否允许查看答案、是否开启切屏检测;
- 发布考试:选择考试时间范围,生成考试链接;
- 考生答卷:考生在浏览器中作答;
- 自动阅卷:客观题系统自动判分,主观题由管理员人工评阅。
在实际使用中,建议先创建一份“测试试卷”,用自己账号模拟一次完整考试流程,确认切屏检测、倒计时交卷等逻辑符合预期后再正式发布。
6.3 题库维护与批量导入
对于有大量题目的培训机构,手工录题效率太低。SurveyKing 通常支持 Excel 模板导入,一般步骤如下:
- 下载系统提供的导入模板;
- 按模板填写题干、选项、正确答案、解析、所属知识点;
- 在题目列表中点击“批量导入”;
- 上传模板文件,系统校验并导入。
导入时要注意模板不能随意修改列名,多选题答案格式一般使用 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 可远程访问 |
| 页面能访问,但登录接口报 401 | Redis 未启动或 Token 校验失败 | 确认 Redis 进程存在,检查前后端 API 地址是否一致 |
| 中文乱码 | 数据库字符集不对 | 创建数据库时使用 utf8mb4,检查 serverTimezone 配置 |
| 上传 Excel 后题目导入失败 | 模板列名不符合要求 | 重新下载最新模板,保持列名和格式不变 |
| 部署后刷新页面 404 | 前端 history 路由未配置 try_files | Nginx 配置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 智能试卷的使用思路,最后整理了高频报错和工程落地建议。
如果你部署成功,那么下一步可以这样继续深入:
- 仔细读一遍后端
controller、service层的代码,理解 JWT 登录和创建试卷的完整流程; - 尝试新增一种题型,从前端表单到后端存储完整实现一次;
- 尝试对接企业微信或钉钉的扫码登录;
- 尝试用 Nginx 部署 HTTPS,配置域名和自动续期证书;
- 尝试写一个简单的数据导出脚本,把考试结果定时同步到公司内部系统。
SurveyKing 这类开源系统最大的价值,不只是“能用”,而是“可以学到一套完整的企业级全栈思路”。如果你正在学习 Spring Boot 和 Vue 项目,把它当作实战项目来拆解,收获会很大。
如果在部署过程中还有其他问题,欢迎在评论区描述你的部署方式和日志截图,可以一起交流排查经验。实测通过的部署流程别忘了收藏备用。