# 考试模块 API 接口文档 > 基础路径:`/api` > > 需登录接口需在请求头携带 `Token` --- ## 1. 分类管理 ### 1.1 获取分类树 - **URL**: `/api/category/tree` - **方法**: GET - **是否需要登录**: 否 **返回示例**: ```json { "code": 1, "msg": "success", "data": [ { "id": 1, "title": "考试分类", "pid": 0, "children": [] } ] } ``` --- ## 2. 属性管理 ### 2.1 获取属性树 - **URL**: `/api/attribute/tree` - **方法**: GET - **是否需要登录**: 否 **返回示例**: ```json { "code": 1, "msg": "success", "data": [ { "id": 1, "title": "难度", "pid": 0, "children": [ { "id": 2, "title": "简单", "pid": 1 } ] } ] } ``` --- ## 3. 系统配置 ### 3.1 获取配置 - **URL**: `/api/config/get` - **方法**: GET - **是否需要登录**: 否 **返回示例**: ```json { "code": 1, "msg": "SUCCESS", "data": { "status": 1, "close_desc": "", "thumb": "300*300", "sale_btn": { "before": "购买", "after": "已购买" }, "show": {} } } ``` --- ## 4. 试卷管理 ### 4.1 试卷列表 - **URL**: `/api/paper/lists` - **方法**: GET - **是否需要登录**: 否 **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | keyword | string | 否 | - | 搜索关键词 | | category_id | int | 否 | 0 | 分类ID | | attribute_ids | string | 否 | - | 属性ID,多个逗号分隔 | | author_id | int | 否 | 0 | 作者ID | | rows | int | 否 | 20 | 每页数量 | | order_field | string | 否 | id | 排序字段 | | order_type | string | 否 | desc | 排序方式(asc/desc) | **返回示例**: ```json { "code": 1, "msg": "success", "data": { "total": 100, "per_page": 20, "current_page": 1, "last_page": 5, "data": [ { "id": 1, "title": "PHP基础考试", "description": "PHP基础知识测试", "cover": "/attachment/cover.jpg", "category_id": 1, "price": "9.90", "sales_method": "free", "sales": 128, "views": 500, "favorites": 30 } ] } } ``` ### 4.2 试卷详情 - **URL**: `/api/paper/detail` - **方法**: GET - **是否需要登录**: 否 **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | id | int | 是 | 0 | 试卷ID | **返回示例**: ```json { "code": 1, "msg": "success", "data": { "id": 1, "title": "PHP基础考试", "description": "PHP基础知识测试", "cover": "/attachment/cover.jpg", "content": "HTML内容", "category_id": 1, "price": "9.90", "sales_method": "free", "exam_support": 1, "test_support": 1, "total": 100, "pass": 60, "exam_time": 90, "sales": 128, "views": 501, "favorites": 30 } } ``` ### 4.3 试卷试题列表 - **URL**: `/api/paper/questions` - **方法**: GET - **是否需要登录**: 否 **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | paper_id | int | 是 | 0 | 试卷ID | | page | int | 否 | 1 | 页码 | **返回示例**: ```json { "code": 1, "msg": "success", "data": { "total": 50, "per_page": 10, "current_page": 1, "data": [ { "id": 1, "paper_id": 1, "question_id": 10, "question_type": 1, "sort": 0, "index": 1, "question": { "id": 10, "type": 1, "question": "PHP的全称是?", "options": [ { "option": "A", "description": "PHP Hypertext Preprocessor" }, { "option": "B", "description": "Personal Home Page" } ] } } ] } } ``` --- ## 5. 考试流程(需登录) ### 5.1 查询是否重复考试 - **URL**: `/api/paper/retest` - **方法**: GET - **是否需要登录**: **是** **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | paper_id | int | 是 | 0 | 试卷ID | **返回示例**: ```json // 未参加过 { "code": 1, "msg": "未参加过考试" } // 已参加过 { "code": 0, "msg": "参加过考试" } ``` ### 5.2 开始答题 - **URL**: `/api/paper/test` - **方法**: GET - **是否需要登录**: **是** **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | paper_id | int | 是 | 0 | 试卷ID | **返回示例**: ```json { "code": 1, "msg": "SUCCESS", "data": [ { "id": 1, "paper_id": 1, "question_id": 10, "question_type": 1, "sort": 0, "index": 1, "question": { "id": 10, "type": 1, "question": "PHP的全称是?", "options": [ { "option": "A", "description": "PHP Hypertext Preprocessor" }, { "option": "B", "description": "Personal Home Page" } ] } } ] } ``` ### 5.3 交卷 - **URL**: `/api/paper/submit` - **方法**: POST - **是否需要登录**: **是** **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | paper_id | int | 是 | 0 | 试卷ID | | answer | string | 是 | - | 答案JSON字符串 | | total_time | int | 是 | - | 用时总秒数 | **answer JSON 结构**: ```json [ { "qid": 10, "answer": "A" }, { "qid": 11, "answer": "B,C" } ] ``` **返回示例**: ```json { "code": 1, "msg": "交卷成功!", "data": { "paper_id": 1, "pass": 60, "score": 85, "total_time": "0:12:30", "tip": "恭喜你,通过考试", "evaluation_status": 1 } } ``` > `evaluation_status`: 0=等待判卷(人工),1=已判卷(自动) > > `tip`: 根据分数和及格线自动生成,人工判卷时提示"请等待老师判卷" ### 5.4 试题答题记录 - **URL**: `/api/paper/question` - **方法**: POST - **是否需要登录**: **是** **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | paper_id | int | 是 | 0 | 试卷ID | | question_id | int | 是 | 0 | 试题ID | | answer | string | 是 | - | 答案JSON字符串 | **返回示例**: ```json { "code": 1, "msg": "答题记录成功!" } ``` ### 5.5 考试结果详情 - **URL**: `/api/paper/record` - **方法**: GET - **是否需要登录**: 否 **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | id | int | 是 | 0 | 考试记录ID | **返回示例**: ```json { "code": 1, "msg": "获取成功!", "data": { "id": 1, "paper_id": 1, "uid": 100, "score": 85, "total_time": 750, "evaluation_status": 1, "status": 0, "answer_list": [ { "qid": 10, "answer": "A", "result": 1, "index": 1, "question": { "id": 10, "type": 1, "question": "PHP的全称是?", "answer": "A", "options": [ { "option": "A", "description": "PHP Hypertext Preprocessor" }, { "option": "B", "description": "Personal Home Page" } ] } } ] } } ``` ### 5.6 错题本 - **URL**: `/api/paper/wrong` - **方法**: GET - **是否需要登录**: **是** **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | paper_id | int | 是 | 0 | 试卷ID | **返回示例**: ```json { "code": 1, "msg": "获取成功!", "data": [ { "id": 1, "paper_id": 1, "question_id": 11, "answer": "B", "result": 0, "question": { "id": 11, "type": 1, "question": "PHP中哪个函数用于输出?", "answer": "A", "options": [ { "option": "A", "description": "echo" }, { "option": "B", "description": "print_r" } ] } } ] } ``` ### 5.7 心跳接口 - **URL**: `/api/paper/beat` - **方法**: GET - **是否需要登录**: 否 **返回示例**: ```json { "code": 1, "msg": "SUCCESS" } ``` --- ## 6. 收藏管理(需登录) ### 6.1 收藏/取消收藏 - **URL**: `/api/favorites/edit` - **方法**: POST - **是否需要登录**: **是** **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | info_id | int | 是 | - | 试卷ID | | info_type | string | 是 | - | 信息类型(如 `paper`) | **返回示例**: ```json // 收藏成功 { "code": 1, "msg": "收藏成功" } // 取消收藏成功 { "code": 1, "msg": "取消成功" } ``` --- ## 7. 我的订单(需登录) ### 7.1 我的订单列表 - **URL**: `/api/my/lists` - **方法**: GET - **是否需要登录**: **是** **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | rows | int | 否 | 20 | 每页数量 | | keyword | string | 否 | - | 搜索关键词 | | order_field | string | 否 | id | 排序字段 | | order_type | string | 否 | desc | 排序方式(asc/desc) | **返回示例**: ```json { "code": 1, "msg": "success", "data": { "total": 5, "per_page": 20, "current_page": 1, "data": [ { "id": 100, "order_no": "2026032212000001", "order_info_type": "paper", "order_info_id": 1, "products_title": "PHP基础考试", "paid": 1, "paid_fee": 990, "paid_time": "2026-03-22 12:00:00", "status": 4 } ] } } ``` --- ## 8. 订单操作(需登录) ### 8.1 取消订单 - **URL**: `/api/orders/cancel` - **方法**: POST - **是否需要登录**: **是** **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | id | int | 是 | - | 订单ID | **返回示例**: ```json { "code": 1, "msg": "订单取消成功!", "data": { ... } } ``` > 仅未支付的订单可取消 ### 8.2 删除订单 - **URL**: `/api/orders/delete` - **方法**: POST - **是否需要登录**: **是** **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | id | int | 是 | - | 订单ID | **返回示例**: ```json { "code": 1, "msg": "订单删除成功!", "data": { ... } } ``` > 仅未支付的订单可删除 ### 8.3 退款申请 - **URL**: `/api/orders/refund` - **方法**: POST - **是否需要登录**: **是** **请求参数**: | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | id | int | 是 | - | 订单ID | **返回示例**: ```json { "code": 1, "msg": "退款申请成功!", "data": { ... } } ``` > 已支付且状态 <= 4 的订单可申请退款 --- ## 附录 ### 通用返回格式 ```json { "code": 1, // 1=成功,0=失败 "msg": "success", "data": {} } ``` ### 试题类型(type) | 值 | 类型 | |----|------| | 1 | 单选题 | | 2 | 多选题 | | 3 | 判断题 | | 4 | 填空题 | | 5 | 主观题 | ### 销售方式(sales_method) | 值 | 方式 | |----|------| | free | 免费 | | pay | 付费 | | score | 积分兑换 | | password | 密码访问 |