笔试系统

获取试卷列表

GET /open_api/v1/exams

请求参数:

参数名 必填 参数类型 描述
search string 搜索关键字
page Integer 页数
per_page Integer 分页大小,默认25,最大50

返回结果(data中的内容):

参数名 必填 参数类型 描述
count Integer 试卷总数
exams Array 试卷数组
id Integer 试卷ID
creator_name String 试卷创建人名称
name String 试卷名称
questions_count Integer 题目数
duration Integer 试卷限时,单位分钟,0为不限
total_score Integer 试卷总分

例:

{
  "errcode": 0,
  "errmsg": "成功",
  "data": {
    "count": 2,
    "exams": [
      {
        "id": 1,
        "name": "测试试卷一",
        "creator_name": "李四",
        "questions_count": 5,
        "duration": 30,
        "total_score": 100
      },
      {
        "id": 2,
        "name": "测试试卷二",
        "creator_name": "王五",
        "questions_count": 10,
        "duration": 60,
        "total_score": 100
      }
    ]
  }
}

删除试卷

DELETE /open_api/v1/exams/:id

返回结果:

例:

{
  "errcode": 0,
  "errmsg": "成功"
}

获取试卷批量发放链接

GET /open_api/v1/exams/:id/exam_link

请求参数:

参数名 必填 参数类型 描述
user_id Integer 试卷发放人ID

返回结果:

例:

{
  "errcode": 0,
  "errmsg": "成功",
  "data": {
    "url": "https://www.showmebug.com/xxx"
  }
}

更新试卷批量发放链接

PATCH /open_api/v1/exams/:id/exam_link

注:更新链接会导致之前的链接失效

请求参数:

参数名 必填 参数类型 描述
user_id Integer 试卷发放人ID

返回结果:

例:

{
  "errcode": 0,
  "errmsg": "成功",
  "data": {
    "url": "https://www.showmebug.com/xxx"
  }
}

获取笔试题目列表

GET /open_api/v1/written_questions

请求参数:

参数名 必填 参数类型 描述
search string 搜索关键字
question_type string 题目类型:'choice' 选择题,'essay' 问答题,'programming' 编程题,'video' 音视频题,'drawing' 架构绘图题
tag_name string 知识标签名
page Integer 页数
per_page Integer 分页大小,默认25,最大50

返回结果(data中的内容):

参数名 必填 参数类型 描述
count Integer 题目总数
questions Array 题目数组
id Integer 题目ID
creator_name String 题目创建人名称
title String 题目标题备注
question_type String 题目类型
description String 题目内容
key String 题目考点、备注、参考答案,仅面试官查看(为编程题且测试用例不为空时,需要传入正确的代码答案)
suggested_score String 建议分值|
difficulty String 难度
content_json Json 题目内容
skill_dimension_id Integer 维度ID
testcase_mode Boolean 是否为测试用例模式
knowledge_tags Array 题目标签数组
id Integer 标签ID
name String 标签名
verbose_name String 标签全称

例:

{
  "errcode": 0,
  "errmsg": "成功",
  "data": {
    "count": 2,
    "questions": [
      {
        "id": 1,
        "title": "测试编程题 - 五",
        "creator_name": "李四",
        "question_type": "programming",
        "description": "冒泡排序:从当前元素起,向后依次比较每一对相邻元素,若逆序则交换",
        "key": null,
        "suggested_score": 10,
        "difficulty": "easy",
        "skill_dimension_id": 1,
        "content_json": {}
      },
      {
        "id": 2,
        "title": "测试选择题",
        "creator_name": "王五",
        "question_type": "choice",
        "description": "这是一个选择题的题目内容",
        "key": null,
        "suggested_score": 20,
        "difficulty": "hard",
        "skill_dimension_id": 1,
        "content_json": {
          "options": [
            {
              "content": "选项一",
              "correctly": true
            },
            {
              "content": "选项二",
              "correctly": false
            }
          ]
        },
        "knowledge_tags": [
          {
            "id": 1,
            "name": "JS",
            "verbose_name": "JavaScript"
          }
        ]
      }
    ]
  }
}

笔试题目详情

GET /open_api/v1/written_questions/:id

返回结果(data中的内容):

参数名 必填 参数类型 描述
id Integer 试题ID
title String 题目标题备注
creator_name String 题目创建人,默认为管理员
question_type String 题目类型:'choice' 选择题,'essay' 问答题,'programming' 编程题,'video' 音视频题
description String 题目内容,支持Markdown格式
key String 题目考点、备注、参考答案,仅面试官查看(为编程题且测试用例不为空时,需要传入正确的代码答案)
suggested_score Integer 建议分值
content_json Object 题目详细信息,根据题目类型需要不同数据,见详细说明
difficulty String 难度
skill_dimension_id Integer 维度ID(通过api:GET /open_api/v1/skill_dimensions 可获取)
created_at Datetime 视频结束时间,格式ISO8601
updated_at Datetime 视频结束时间,格式ISO8601
testcase_mode Boolean 是否为测试用例模式
knowledge_tags Array 题目标签数组
id Integer 标签ID
name String 标签名
verbose_name String 标签全称

例:

{
    "errcode": 0,
    "errmsg": "请求成功",
    "data": {
        "id": 1,
        "question_type": "choice",
        "title": "示例单选题",
        "description": "这是一道示例用的单选选择题",
        "key": null,
        "suggested_score": 10,
        "content_json": {
            "options": [
                {
                    "content": "选项一",
                    "correctly": true
                },
                {
                    "content": "选项二",
                    "correctly": false
                }
            ]
        },
        "difficulty": "unknown",
        "creator_name": "王五",
        "created_at": "2021-07-01T20:41:38+08:00",
        "updated_at": "2021-08-01T20:40:00+08:00",
        "knowledge_tags": [
            {
                "id": 1,
                "name": "JS",
                "verbose_name": "JavaScript"
            }
        ]
    }
}

创建笔试题目

POST /open_api/v1/written_questions

请求参数:

参数名 必填 参数类型 描述
creator_id Integer 题目创建人,默认为管理员
question_type String 题目类型:'choice' 选择题,'essay' 问答题,'programming' 编程题,'video' 音视频题
description String 题目内容,支持Markdown格式
title String 题目标题备注
key String 题目考点、备注、参考答案,仅面试官查看(为编程题且测试用例不为空时,需要传入正确的代码答案)
suggested_score Integer 建议分值
content_json Object 题目详细信息,根据题目类型需要不同数据,见详细说明
skill_dimension_id Integer 维度ID
difficulty String 难度 ["unknown", "easy", "normal", "hard"]
knowledge_tag_ids Array(元素为String类型) 标签名数组(元素为标签全名)

content_json 结构说明

question_type 为 choice 选择题时,content_json 结构如下所示

{
  // 选择题选项,最少需要2个,最多为16个
  "options": [
    {
      "content": "这是选项A", // 选项内容
      "correctly": true  // 是否为正确答案
    },
    {
      "content": "这是选项B",
      "correctly": true
    },
    {
      "content": "这是选项C",
      "correctly": false
    }
  ]
}

knowledge_tag_ids 结构说明

knowledge_tag_ids是一个数组,里面的元素皆为String类型的标签全名。举例如下:

["JavaScript", "Sql", "数据结构"]

question_type 为 programming 编程题时, content_json 结构如下所示

{
  "language": "java", // 编程语言,为空时不限语言
  "code_content": "public class ShowMeBug {}", // 默认代码片段
  "unit_content": "public class ShowMeBugTest {}" // 测试用例代码,为空时为普通编程题
}

question_type 为 video 音视频题时, content_json 结构如下所示

{
  "video_duration": 5, // 最大录制时长, 支持的范围 3, 5, 15 分钟
  "video_category": "video" // 录制类型, video 音视频 | audio 仅音频
}

返回结果(data中的内容):

参数名 必填 参数类型 描述
id Integer 题目ID
question_type String 题目类型
description String 题目内容
title String 题目标题备注
key String 题目考点、备注、参考答案,仅面试官查看(为编程题且测试用例不为空时,需要传入正确的代码答案)
suggested_score Integer 建议分值
content_json Object 题目详细信息,根据题目类型需要不同数据,见详细说明
skill_dimension_id Integer 维度ID
difficulty String 难度
creator_id Integer 创建人ID
creator_name String 创建人名称
created_at String 创建时间,ISO8601格式
updated_at String 更新时间,ISO8601格式
knowledge_tags Array 标签名数组
id Integer 标签ID
name String 标签名
verbose_name String 标签全名

例:

{
    "errcode": 0,
    "errmsg": "请求成功",
    "data": {
        "id": 148,
        "question_type": "choice",
        "title": null,
        "description": "to be or not to be",
        "key": null,
        "suggested_score": 10,
        "content_json": {
            "options": [
                {
                    "content": "这是选项A",
                    "correctly": true
                },
                {
                    "content": "这是选项B",
                    "correctly": true
                }
            ]
        },
        "difficulty": "easy",
        "creator_name": "王五",
        "created_at": "2021-08-23T15:16:39+08:00",
        "updated_at": "2021-08-23T15:16:39+08:00",
        "knowledge_tags": [
            {
                "id": 1,
                "name": "JS",
                "verbose_name": "JavaScript"
            }
        ],
        "skill_dimension_id": 1
    }
}

批量创建笔试题目

POST /open_api/v1/batch_written_questions

请求参数:

参数名 必填 参数类型 描述
creator_id Integer 题目创建人,默认为管理员
written_questions Array 题目列表,最大长度为100
question_type String 题目类型:'choice' 选择题,'essay' 问答题,'programming' 编程题,'video' 音视频题
description String 题目内容,支持Markdown格式
title String 题目标题备注
key String 题目考点、备注、参考答案,仅面试官查看(为编程题且测试用例不为空时,需要传入正确的代码答案)
suggested_score Integer 建议分值
content_json Object 题目详细信息,根据题目类型需要不同数据,见详细说明
skill_dimension_id Integer 维度ID
difficulty String 难度 ["unknown", "easy", "normal", "hard"]
knowledge_tag_ids Array(元素为String类型) 标签名数组(元素为标签全名)

返回结果(data中的内容):

参数名 必填 参数类型 描述
success_count Boolean 创建成功数量
fail_count String 失败数量
written_questions Array 题目数组
success Boolean 是否创建成功
message String 失败原因
written_question Object 题目信息,成功时与创建题目返回一致,失败时为传入题目参数

例:

{
    "errcode": 0,
    "errmsg": "请求成功",
    "data": {
        "success_count": 2,
        "fail_count": 0,
        "written_questions": [
            {
                "success": true,
                "message": null,
                "written_question": {
                    "id": 1,
                    "question_type": "choice",
                    "title": null,
                    "description": "test",
                    "key": null,
                    "suggested_score": 10,
                    "content_json": {
                        "options": [
                            {
                                "content": "这是选项A",
                                "correctly": true
                            },
                            {
                                "content": "这是选项B",
                                "correctly": true
                            }
                        ]
                    },
                    "difficulty": "easy",
                    "creator_name": "王五",
                    "created_at": "2021-08-23T15:29:53+08:00",
                    "updated_at": "2021-08-23T15:29:53+08:00",
                    "knowledge_tags": [
                        {
                            "id": 1,
                            "name": "JS",
                            "verbose_name": "JavaScript"
                        }
                    ],
                    "skill_dimension_id": 1
                }
            },
            {
                "success": true,
                "message": null,
                "written_question": {
                    "id": 2,
                    "question_type": "choice",
                    "title": null,
                    "description": "to be or not to be",
                    "key": null,
                    "suggested_score": 10,
                    "content_json": {
                        "options": [
                            {
                                "content": "这是选项C",
                                "correctly": true
                            },
                            {
                                "content": "这是选项D",
                                "correctly": true
                            }
                        ]
                    },
                    "difficulty": "easy",
                    "creator_name": "王五",
                    "created_at": "2021-08-23T15:29:53+08:00",
                    "updated_at": "2021-08-23T15:29:53+08:00",
                    "knowledge_tags": [
                        {
                            "id": 1,
                            "name": "JS",
                            "verbose_name": "JavaScript"
                        }
                    ],
                    "skill_dimension_id": 1
                }
            }
        ]
    }
}

删除笔试题目

DELETE /open_api/v1/written_questions/:id

返回结果:

例:

{
  "errcode": 0,
  "errmsg": "成功"
}

创建笔试

POST /open_api/v1/written_pads

请求参数:

参数名 必填 参数类型 描述
exam_id Integer 试卷ID
name String 候选人名称

返回结果(data中的内容):

参数名 必填 参数类型 描述
uid String 笔试UID
url String 候选人笔试地址
interviewer_url String 面试官监考地址

例:

{
  "errcode": 0,
  "errmsg": "成功",
  "data": {
    "uid": "ABSDHF",
    "url": "https://www.showmebug.com/xxxxxxxx",
    "interviewer_url": "https://www.showmebug.com/xxxxxxxx"
  }
}

批量创建笔试

POST /open_api/v1/batch_written_pads

请求参数:

参数名 参数名 必填 参数类型 描述
exam_id Integer 试卷ID
user_id Integer 创建人ID
candidates Array[] 候选人数组,最多为50个
name String 候选人名称
uid String 候选人uid

返回结果(data中的内容):

参数名 参数名 必填 参数类型 描述
written_pads Array[] 笔试数组
uid String 笔试UID
url String 候选人笔试地址
interviewer_url String 面试官监考地址
candidate_uid String 候选人uid
candidate_name String 候选人名称

例:

{
  "errcode": 0,
  "errmsg": "成功",
  "data": {
    "written_pads": [
      {
        "uid": "ABSDHF",
        "url": "https://www.showmebug.com/xxxxxxxx",
        "interviewer_url": "https://www.showmebug.com/xxxxxxxx",
        "candidate_uid": "C001",
        "candidate_name": "李四"
      }
    ]
  }
}

获取笔试列表

GET /open_api/v1/written_pads

请求参数:

参数名 必填 参数类型 描述
search String 搜索关键字,笔试板名称
creator_id Integer 发卷人ID
exam_id Integer 试卷ID
status String 笔试状态:write_opened 未开始,write_started 笔试中,write_submitted 已提交,write_abondoned 已放弃,write_ended 已完成
created_time_start Datetime 创建时间,时间段开始时间
created_time_end Datetime 创建时间,时间段结束时间
submitted_time_start Datetime 提交时间,时间段开始时间
submitted_time_end Datetime 提交时间,时间段结束时间
review_time_start Datetime 完成评卷时间,时间段开始时间
review_time_end Datetime 完成评卷时间,时间段结束时间
page Integer 页数
per_page Integer 分页大小,默认25,最大50

返回结果(data中的内容):

参数名 必填 参数类型 描述
count Integer 笔试总数
written_pads Array 笔试数组
id Integer 笔试ID
number String 笔试唯一编号,uid
name String 笔试板名称
status String 笔试状态
creator_id Integer 发卷人ID
creator_name String 发卷人名称
exam_id Integer 试卷ID
exam_name String 试卷名称
total_score Integer 试卷总分
score Integer 候选人得分
duration Integer 笔试时长,单位秒
switch_screen_count Integer 切屏次数
switch_screen_time_seconds Integer 切屏总时长,单位秒
evaluation String 面试官评价
exam_started_at Datetime 笔试开始时间,格式ISO8601
created_at Datetime 创建时间,格式ISO8601
write_started_at Datetime 开始时间,格式ISO8601
write_submitted_at Datetime 提交时间,格式ISO8601
write_abondoned_at Datetime 放弃时间,格式ISO8601
write_review_at Datetime 评卷时间,格式ISO8601
pad Object 笔试对应面试板
id Integer 面试ID
number String 面试唯一编号,uid
status String 面试状态,interview_drafted 未开始,interview_opened 进行中,interview_ended 已结束

例:

{
  "errcode": 0,
  "errmsg": "成功",
  "data": {
    "count": 2,
    "written_pads": [
      {
        "id": 1,
        "number": "ABCDEF",
        "name": "李某",
        "status": "write_ended",
        "creator_id": 1,
        "creator_name": "李四",
        "exam_id": 1,
        "exam_name": "测试卷一",
        "total_score": 100,
        "score": 80,
        "duration": 1800,
        "switch_screen_count": 1,
        "switch_screen_time_seconds": 5,
        "evaluation": "还不错,可以继续",
        "exam_started_at": "2020-10-01T16:30:00+08:00",
        "created_at": "2020-10-01T16:00:00+08:00",
        "write_started_at": "2020-10-01T17:00:00+08:00",
        "write_submitted_at": "2020-10-01T17:30:00+08:00",
        "write_abondoned_at": null,
        "write_review_at": "2020-10-01T19:00:00+08:00",
        "pad": {
          "id": 1,
          "number": "KASDJF",
          "status": "interview_drafted"
        }
      },
      {
        "id": 2,
        "number": "ABCDEG",
        "name": "王某",
        "status": "write_abondoned",
        "creator_id": 1,
        "creator_name": "李四",
        "exam_id": 1,
        "exam_name": "测试卷一",
        "total_score": 100,
        "score": null,
        "duration": 900,
        "switch_screen_count": 5,
        "switch_screen_time_seconds": 60,
        "evaluation": null,
        "exam_started_at": "2020-10-01T16:30:00+08:00",
        "created_at": "2020-10-01T16:00:00+08:00",
        "write_started_at": "2020-10-01T17:00:00+08:00",
        "write_submitted_at": null,
        "write_abondoned_at": "2020-10-01T17:15:00+08:00",
        "write_review_at": null
      }
    ]
  }
}

笔试详情

GET /open_api/v1/written_pads/:uid

返回结果(data中的内容):

参数名 参数类型 描述
id Integer 笔试ID
number String 笔试唯一编号,uid
name String 笔试板名称
status String 笔试状态
creator_id Integer 发卷人ID
creator_name String 发卷人名称
exam_id Integer 试卷ID
exam_name String 试卷名称
total_score Integer 试卷总分
score Integer 候选人得分
duration Integer 笔试时长,单位秒
switch_screen_count Integer 切屏次数
switch_screen_time_seconds Integer 切屏总时长,单位秒
evaluation String 面试官评价
exam_started_at Datetime 笔试开始时间,格式ISO8601
created_at Datetime 创建时间,格式ISO8601
write_started_at Datetime 开始时间,格式ISO8601
write_submitted_at Datetime 提交时间,格式ISO8601
write_abondoned_at Datetime 放弃时间,格式ISO8601
pad Object 笔试对应面试板
id Integer 面试ID
number String 面试唯一编号,uid
status String 面试状态,interview_drafted 未开始,interview_opened 进行中,interview_ended 已结束
questions Array 笔试题目数组
id Integer 题目ID
question_type String 题目类型,choice 选择题,essay 问答题,programming 编程题,video 音视频题
title String 题目标题
description String 题目内容
key String 参考答案
position Integer 题目位置
score Integer 题目总分
system_score Integer 系统评分
interviewer_score Integer 面试官评分
actual_score Integer 实际得分
candidate_skipped Boolean 是否跳过答题
candidate_answer String 候选人答案,音视频题时为视频ID
write_started_at Datetime 开始答题时间,格式ISO8601
write_ended_at Datetime 完成答题时间,格式ISO8601
testcase_mode Boolean 是否为自动判题编程题,仅编程题返回
content_json Object 题目内容,根据题目类型返回不同,见详细说明
videos Array 摄像头监控视频数组
id Integer 视频ID
started_at Datetime 视频开始时间,格式ISO8601
ended_at Datetime 视频结束时间,格式ISO8601

content_json 结构说明

question_type 为 choice 选择题时,content_json 结构如下所示

{
  "answer": [0, 1], // 候选人答案
  "options": [
    {
      "content": "这是选项A", // 选项内容
      "correctly": true,  // 是否为正确答案
    },
    {
      "content": "这是选项B",
      "correctly": true,
    },
    {
      "content": "这是选项C",
    },
  ]
}

question_type 为 programming 编程题时, content_json 结构如下所示

{
  "language": "java", // 编程语言,为空时不限语言
  "code_content": "public class ShowMeBug {}", // 默认代码片段
  "unit_content": "public class ShowMeBugTest {}", // 测试用例代码
  "answer": "public class ShowMeBug {}", // 候选人答案
  "answer_language_type": "java", // 候选人答题语言
  "testcase_running_status": "success" //测试用例运行状态 none drafted running success fail
}

question_type 为 video 音视频题时, content_json 结构如下所示

{
  "video_duration": 5, // 最大录制时长
  "video_category": "video" // 录制类型, video 音视频 | audio 仅音频
}

例:

{
  "errcode": 0,
  "errmsg": "成功",
  "data": {
    "id": 1,
    "number": "ABCDEF",
    "name": "李某",
    "status": "write_ended",
    "creator_id": 1,
    "creator_name": "李四",
    "exam_id": 1,
    "exam_name": "测试卷一",
    "total_score": 100,
    "score": 80,
    "duration": 1800,
    "switch_screen_count": 1,
    "switch_screen_time_seconds": 5,
    "evaluation": "还不错,可以继续",
    "exam_started_at": "2020-10-01T16:30:00+08:00",
    "created_at": "2020-10-01T16:00:00+08:00",
    "write_started_at": "2020-10-01T17:00:00+08:00",
    "write_submitted_at": "2020-10-01T17:30:00+08:00",
    "write_abondoned_at": null,
    "write_review_at": "2020-10-01T19:00:00+08:00",
    "pad": {
      "id": 1,
      "number": "ABCDEF",
      "status": "interview_ended"
    },
    "questions": [
      {
        "id": 1348,
        "question_type": "programming",
        "title": "不限题",
        "description": "元素按从大到小的顺序",
        "key": "",
        "position": 1,
        "score": 20,
        "system_score": null,
        "interviewer_score": 10,
        "actual_score": 10,
        "candidate_skipped": false,
        "candidate_answer": "% // ## 请在下方进行输入 ( 支持Markdown、插入公式,点击上方按钮“环境说明”查看详情 )\n\n% // 必须定义一个 包名为 `main` 的包,并实现 `main()` 函数。\n% package main\n% import \"fmt\"\n\n% func main() {\n%   fmt.Println(\"Hello, world\")\n% }\n\n% 必须将 Module 声明为`showmebug`,然后为它定义并导出一个 start 方法\n-module(showmebug).\n-export([start/0]).\n\nstart() ->\n  say_hello(3).\n\nsay_hello(0) ->\n  0;\nsay_hello(N) ->\n  io:format(\"Hello, World~n\"),\n  say_hello(N - 1).\n",
        "content_json": {
          "answer": "% // ## 请在下方进行输入 ( 支持Markdown、插入公式,点击上方按钮“环境说明”查看详情 )\n\n% // 必须定义一个 包名为 `main` 的包,并实现 `main()` 函数。\n% package main\n% import \"fmt\"\n\n% func main() {\n%   fmt.Println(\"Hello, world\")\n% }\n\n% 必须将 Module 声明为`showmebug`,然后为它定义并导出一个 start 方法\n-module(showmebug).\n-export([start/0]).\n\nstart() ->\n  say_hello(3).\n\nsay_hello(0) ->\n  0;\nsay_hello(N) ->\n  io:format(\"Hello, World~n\"),\n  say_hello(N - 1).\n",
          "language": "",
          "code_content": "",
          "unit_content": "",
          "answer_language_type": "erlang",
          "testcase_running_status": "none"
        },
        "write_started_at": "2020-10-01T17:00:00+08:00",
        "write_ended_at": "2020-10-01T17:10:00+08:00",
        "testcase_mode": false
      },
    ],
    "videos": [
      {
        "id": 1001,
        "started_at": "2020-10-01T17:00:00+08:00",
        "ended_at": "2020-10-01T17:10:00+08:00"
      }
    ]
  }
}

删除笔试

DELETE /open_api/v1/written_pads/:uid

返回结果:

例:

{
  "errcode": 0,
  "errmsg": "成功"
}

获取视频播放地址

GET /open_api/v1/videos/:id

返回结果:

例:

{
  "errcode": 0,
  "errmsg": "成功",
  "data": {
    "url": "www.showmebug.com/xxxx/videos/xxxx.m3u8?_utoken=xxxxxxx",
    "expire_in": 7200
  }
}

获取笔试题能力维度列表

GET /open_api/v1/skill_dimensions

请求参数:

参数名 必填 参数类型 描述
page Integer 页数
per_page Integer 分页大小,默认25,最大50

返回结果(data中的内容):

参数名 必填 参数类型 描述
count Integer 能力维度总数
skill_dimensions Array 能力维度数组
id Integer 能力维度ID
name String 能力维度名称

例:

{
  "errcode": 0,
  "errmsg": "成功",
  "data": {
    "count": 2,
    "skill_dimensions": [
      {
        "id": 1,
        "name": "能力维度一"
      },
      {
        "id": 2,
        "name": "能力维度二"
      }
    ]
  }
}

条 "" 的搜索结果

    没有 "" 的搜索结果