CheckIn 是一个Web入群测试系统,用于为需要入群门槛的群聊提供入群测试,以保证群内成员的水平合格。
- 记录
-
- 答题记录
将会记录每一次的答题情况
- QQ号码
由答题者输入,不会被校验是否存在及是否为所有者本人- 头像
根据QQ号获取- 生成时间
- 过期时间
- 提交时间
- 抽取到的题目
- 提交的数据
- 分数
- 结果
-
- 请求记录
将记录每一个请求
- Request headers
- Request attributes
- Response headers
- SessionID
- IP地址
支持IPV4和IPV6- 潜在的异常信息和堆栈
- 自定义首页及结果内容
支持Markdown
- 分区题库
简单易用,功能强大
支持自定义题目内容限制(字数、图片、选项等)
题目内容支持Markdown
支持单个拖拽、批量操作
题目分区为多对多关系
目前提供选择题、题组。
- 填空题
- 动态生成试题
根据用户选择分区、必选分区(可配置选择范围)动态生成试题
可配置抽取策略以及补全策略
可配置必选分区、可选分区
可配置某些分区的特殊限制
可配置用户注册策略
- 自动校验
根据答题者的答案自动校验,无需人工干预,可自定义任意多个等级配置不同返回信息。
可配置评分方式
- 多用户和权限控制
支持多用户,可自由添加和删除用户。供群友共同贡献题库
可通过用户组控制用户权限
包括但不限于
- 删改自己或他人的题目
- 添加分区
- 修改设置
- 用户管理
- QBot API
可使用QBot接入RestAPI以实现自动进群审核
- 动态生成答题,隐藏题目id,防止刷题,爆破题库
- 分区答题,自由度高
- 多用户支持,权限控制细化,更改冲突提醒,共建题库
- 多分数级别支持,划分层次
- 设置多样,后台管理页面配置简易,可自定义程度高
- 后台管理页面通信采用 WebSocket ,实时数据更新
- 响应式前端设计,适配各种尺寸的设备
- SpringBoot 和 Spring系列框架等
后端 - VUE 等
前端
无需任何操作,直接使用如下命令运行
java -jar checkIn-x.x.x.jar预期行为:将会在内存中创建临时数据库,关闭服务器后销毁
若需体验常规存储模式(文件模式)请参考下文搭建教程中的更换数据库步骤
可在下方 Api 及端点处找到管理入口
初始用户super admin 或 10000
密码114514
- 连接MYSQL并创建
check_in数据库 - 在jar包所在位置下创建application.properties并填入以下内容
由于添加了 demo 支持,需要手动指定数据库提供方及url
spring.datasource.url=jdbc:mysql://localhost:3306/check_in?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=[your username]
spring.datasource.password=[your password]如何更换 数据库名 或 数据库服务器
更改application.properties中的
spring.datasource.urleg.
spring.datasource.url=jdbc:mysql://localhost:3306/checkIn?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai内嵌支持的数据库
MySQL
spring.datasource.url=jdbc:mysql://localhost:3306/check_in?characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=falseH2Database (文件模式)
spring.datasource.url=jdbc:h2:file:./check_in;MODE=MySQL spring.datasource.username=root spring.datasource.password=root
- 运行jar包,将会自动生成数据库及初始数据
需要Java21
注意:此时需要命令行主目录在jar包所在目录下
以cmd为例,若jar包在C:\checkIn\checkIn-x.x.x.jar下,则需要在cmd中输入
cd C:\checkIn\或者参考网上其他修改springboot properties配置目录的方法
java -jar checkIn-x.x.x.jar
初始用户super admin
密码114514
- 答题
8080:/checkIn/exam/ - 管理
8080:/checkIn/manage/8080:/checkIn/login/ - QBot API
8080:/checkIn/api/qualify/
QBot API
POSTHeaders
Token: 在高级设置中生成的json web token
Body
{ "qq": 123456789 }response
失败示例(用户未答题)
{ "result": "examData not found", "type": "error" }成功示例1(答题通过)
{ "examData": { "id": "4fb9ec45-bffa-402e-92ff-078b993eb303", "qqNumber": 10001, "questionAmount": 10, "status": "SUBMITTED", "examResult": { "qq": 10001, "score": 100.0, "correctCount": 10, "halfCorrectCount": 0, "wrongCount": 0, "questionCount": 10, "message": "[markdown text1]", "level": "通过", "levelId": "6aa0dad5-10c5-4d50-9d03-bff7ff669e02", "colorHex": "#67C23A", "examDataId": "4fb9ec45-bffa-402e-92ff-078b993eb303", "showCreatingAccountGuide": false, "signUpCompletingType": null }, "generateTime": "2025-02-11 23:03:45", "submitTime": "2025-02-11 23:03:58", "expireTime": "2025-02-18 23:03:45" }, "level": "通过", "levelId": "6aa0dad5-10c5-4d50-9d03-bff7ff669e02", "type": "success" }成功示例2(答题未通过)
{ "examData": { "id": "9e2b4566-33c5-4279-9b76-0140926f5cab", "qqNumber": 10002, "questionAmount": 10, "status": "SUBMITTED", "examResult": { "qq": 10002, "score": 0.0, "correctCount": 0, "halfCorrectCount": 0, "wrongCount": 10, "questionCount": 10, "message": "[markdown text2]", "level": "未通过", "levelId": "3325af76-e7e4-4c8f-a981-8f4c35e8261b", "colorHex": "#F56C6C", "examDataId": "9e2b4566-33c5-4279-9b76-0140926f5cab", "showCreatingAccountGuide": false, "signUpCompletingType": null }, "generateTime": "2025-02-11 23:05:54", "submitTime": "2025-02-11 23:06:03", "expireTime": "2025-02-18 23:05:54" }, "level": "未通过", "levelId": "3325af76-e7e4-4c8f-a981-8f4c35e8261b", "type": "success" }部分字段说明
- type:
"success"|"error"对于成功获取到记录时
部分由于内部数据结构而在某些情况下值相同的字段
- examData.qqNumber, examData.examResult.qq:
均为 QQ 号,在获取未完成的测试记录时examData.examResult.qq 为 -1- examData.questionAmount, examData.examResult.questionCount:
均为抽取题目数量,在获取未完成的测试记录时 examData.examResult.questionCount 为 -1- examData.id, examData.result.examDataId:
均为答题记录的内部 id, 在获取未完成的测试记录时 examData.result.examDataId 为 null- level, examData.result.level:
均与评级设置中的不同等级名称对应,在获取未完成的测试记录时为 null- levelId, examData.result.levelId:
均与评级设置中的不同等级 id 对应,机器人判断应优先使用该字段,在获取未完成的测试记录时为 null一些枚举类字段
- examData.status:
"ONGOING"(进行中) | "SUBMITTED"(已提交) | "MANUAL_INVALIDED"(已手动无效) | "EXPIRED"(已过期(7d)) | "SIGN_UP_COMPLETED(已注册完成,需在评级设置中设置注册方式)"- examData.examResult.signUpCompletingType:
"USER_EXISTS"(用户已存在) | "INCOMPLETED"(未完成) | "INSPECT_REQUIRED"(需通过Qualify API审查,但 Qualify API 被调用时状态变更为 COMPLETED,因此一般无法出现) | "COMPLETED(完成)"
如何修改默认的8080端口
在application.properties中添加
server.port=[your port]