Files
hzdyjs/docs/development/API.md
T

772 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# API 接口文档
## 文档说明
本文档记录项目所有的 API 接口信息,包括请求方式、参数说明、响应格式等。所有接口遵循 RESTful 设计规范。
### 基础信息
- **基础路径**: `/api`
- **响应格式**: JSON
- **字符编码**: UTF-8
- **权限认证**: Sa-Token + JWT
- **版本**: v1.0
### 统一响应格式
```json
{
"code": 200,
"msg": "操作成功",
"data": {}
}
```
#### 状态码说明
| 状态码 | 说明 | 备注 |
| ------ | ---------- | ---------------------- |
| 200 | 成功 | 请求成功 |
| 400 | 参数错误 | 请求参数格式或内容错误 |
| 401 | 未认证 | 需要登录 |
| 403 | 无权限 | 无访问权限 |
| 404 | 不存在 | 请求的资源不存在 |
| 500 | 服务器错误 | 内部服务器错误 |
---
## 1. 问卷管理 API
### 1.1 问卷基础管理
#### 查询问卷列表
**接口地址**: `GET /hq/satSurvey/list`
**接口描述**: 分页查询问卷列表,支持权限过滤
**权限要求**: `hq:satSurvey:list`
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 |
| ----------- | ------ | ---- | --------------------- |
| pageNum | int | 否 | 页码,默认 1 |
| pageSize | int | 否 | 页大小,默认 10 |
| surveyCode | string | 否 | 问卷编号 |
| surveyTitle | string | 否 | 问卷标题 |
| targetGroup | string | 否 | 目标群体 |
| status | string | 否 | 问卷状态 |
| isPublished | int | 否 | 是否发布(1 是 0 否) |
**响应示例**:
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"total": 100,
"rows": [
{
"id": 1,
"surveyCode": "SURVEY001",
"surveyTitle": "满意度调查",
"surveyDesc": "学生满意度调查",
"targetGroup": "1",
"startTime": "2025-01-01 00:00:00",
"endTime": "2025-01-31 23:59:59",
"isAnonymous": 1,
"isPublished": 1,
"status": "1"
}
]
}
}
```
#### 获取问卷详情
**接口地址**: `GET /hq/satSurvey/{id}`
**接口描述**: 根据 ID 获取问卷详细信息
**权限要求**: `hq:satSurvey:query`
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ---- | ---- | ------- |
| id | long | 是 | 问卷 ID |
**响应示例**:
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"id": 1,
"surveyCode": "SURVEY001",
"surveyTitle": "满意度调查",
"surveyDesc": "学生满意度调查",
"surveyInstruction": "请认真填写",
"targetGroup": "1",
"startTime": "2025-01-01 00:00:00",
"endTime": "2025-01-31 23:59:59",
"maxSubmitTimes": 1,
"isAnonymous": 1,
"isPublished": 1,
"status": "1",
"remark": ""
}
}
```
#### 新增问卷
**接口地址**: `POST /hq/satSurvey`
**接口描述**: 创建新的问卷
**权限要求**: `hq:satSurvey:add`
**请求参数**:
```json
{
"surveyCode": "SURVEY001",
"surveyTitle": "满意度调查",
"surveyDesc": "学生满意度调查",
"surveyInstruction": "请认真填写",
"targetGroup": "1",
"startTime": "2025-01-01 00:00:00",
"endTime": "2025-01-31 23:59:59",
"maxSubmitTimes": 1,
"isAnonymous": 1,
"remark": ""
}
```
#### 修改问卷
**接口地址**: `PUT /hq/satSurvey`
**接口描述**: 修改问卷信息
**权限要求**: `hq:satSurvey:edit`
#### 删除问卷
**接口地址**: `DELETE /hq/satSurvey/{ids}`
**接口描述**: 批量删除问卷
**权限要求**: `hq:satSurvey:remove`
#### 发布问卷
**接口地址**: `PUT /hq/satSurvey/{id}/publish`
**接口描述**: 发布问卷,将状态改为进行中
**权限要求**: `hq:satSurvey:publish`
#### 撤销发布问卷
**接口地址**: `PUT /hq/satSurvey/{id}/unpublish`
**接口描述**: 撤销发布问卷,将状态改为草稿
**权限要求**: `hq:satSurvey:unpublish`
### 1.2 问卷题目管理
#### 获取问卷题目列表
**接口地址**: `GET /hq/satSurvey/{surveyId}/questions`
**接口描述**: 获取问卷关联的题目列表,包含题目详细信息和选项
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ---- | ---- | ------- |
| surveyId | long | 是 | 问卷 ID |
**响应示例**:
```json
{
"code": 200,
"msg": "查询成功",
"data": [
{
"id": 1,
"surveyId": 1,
"questionId": 1,
"sortOrder": 1,
"weight": 1,
"isRequired": 1,
"questionTitle": "您对服务质量的评价?",
"questionType": "1",
"questionDesc": "请选择一个选项",
"options": [
{
"id": 1,
"questionId": 1,
"optionValue": "A",
"optionText": "非常满意",
"optionScore": 5,
"sortOrder": 1
}
]
}
]
}
```
#### 更新问卷题目关联
**接口地址**: `PUT /hq/satSurvey/{surveyId}/questions`
**接口描述**: 批量更新问卷题目关联关系
**权限要求**: `hq:satSurvey:question`
---
## 2. 答题 API(新增)
### 2.1 答题提交
#### 提交问卷答案
**接口地址**: `POST /hq/satSurvey/answer/submit`
**接口描述**: 提交问卷答案,正式提交后不可修改
**权限要求**: 需要登录
**请求参数**:
```json
{
"surveyId": 1,
"startTime": "2025-01-26T14:00:00.000Z",
"endTime": "2025-01-26T14:15:00.000Z",
"isAnonymous": 1,
"answers": [
{
"questionId": 1,
"questionType": "1",
"answerValue": "A",
"options": [
{
"optionId": 1,
"optionValue": "A",
"optionText": "非常满意",
"isSelected": true
}
]
},
{
"questionId": 2,
"questionType": "2",
"answerValue": "A,C,D",
"options": [
{
"optionId": 2,
"optionValue": "A",
"optionText": "选项A",
"isSelected": true
},
{
"optionId": 4,
"optionValue": "C",
"optionText": "选项C",
"isSelected": true
}
]
},
{
"questionId": 3,
"questionType": "3",
"answerValue": "这是我的意见和建议内容",
"options": []
}
],
"remark": ""
}
```
**参数说明**:
| 参数名 | 类型 | 必填 | 说明 |
| ----------- | ------ | ---- | ----------------------------- |
| surveyId | long | 是 | 问卷 ID |
| startTime | string | 是 | 答题开始时间(ISO 8601 格式) |
| endTime | string | 是 | 答题结束时间(ISO 8601 格式) |
| isAnonymous | int | 是 | 是否匿名(1 是 0 否) |
| answers | array | 是 | 答案列表 |
| remark | string | 否 | 备注 |
**answers 中每项参数**:
| 参数名 | 类型 | 必填 | 说明 |
| ------------ | ------ | ---- | ------------------------------------------------ |
| questionId | long | 是 | 题目 ID |
| questionType | string | 是 | 题目类型(1 单选题 2 多选题 3 问答题) |
| answerValue | string | 是 | 答案值(单选存选项值,多选逗号分隔,问答存文本) |
| options | array | 否 | 选项详情(单选题和多选题需要) |
**响应示例**:
```json
{
"code": 200,
"msg": "答题提交成功",
"data": {
"id": 1001,
"surveyId": 1,
"userId": 1,
"userType": "student",
"submitTime": "2025-01-26T14:15:00.000Z",
"totalScore": 0,
"avgScore": 0,
"remark": ""
}
}
```
**多次提交功能说明**(v1.0.3 新增,v1.0.4 优化):
系统支持问卷多次提交功能,提交次数限制由问卷的 `max_submit_times` 字段控制:
1. **提交次数规则**:
- `max_submit_times = 0`: 不限制提交次数,用户可以无限次提交
- `max_submit_times = 1`: 最多提交 1 次(默认行为,向后兼容)
- `max_submit_times = N`: 最多提交 N 次
2. **数据存储策略**(v1.0.4 重要更新):
- **软删除历史数据**: 用户提交新答案时,系统会自动将之前的答题记录标记为已删除(deleted=1)
- **保持数据完整性**: 历史数据完整保留用于审计,但业务查询只返回最新有效数据
- **关联删除**: 通过 record_id 关联,确保 hq_sat_record、hq_sat_detail、hq_sat_answer 三表数据状态同步
3. **数据状态管理**:
- `deleted = 0`: 有效数据,正常业务查询可见
- `deleted = 1`: 历史数据,仅审计查询可见
- 用户每次只能看到最新的有效答题记录
4. **处理流程**:
```
用户提交新答案 → 标记历史数据为删除 → 保存新答题数据 → 返回最新记录
```
5. **错误处理**:
```json
{
"code": 500,
"msg": "您已达到该问卷的最大提交次数限制(3次)",
"data": null
}
```
6. **使用场景**:
- **单次提交**: 正式考试、重要调研等
- **多次提交**: 练习测试、阶段性评估等
- **无限提交**: 学习练习、反馈收集等
7. **业务优势**:
- ✅ **用户体验**: 查看答题记录始终是最新版本
- ✅ **数据审计**: 历史记录完整保留,支持数据回溯
- ✅ **查询性能**: 业务查询只涉及有效数据,提高效率
- ✅ **数据一致性**: 避免多版本数据混乱问题
**数据保存说明**:
此接口在保存答题记录时,会同时保存详细的答案信息到两个表:
1. **hq_sat_detail 表**:保存答题概要信息
- 记录答题记录 ID、题目 ID、答案分数等基础信息
- remark 字段存储答案内容的摘要信息
2. **hq_sat_answer 表**:保存具体的答案详情(v1.0.1 新增,v1.0.2 修复)
- **单选题**:为选中的选项创建一条记录,包含选项 ID、选项标识(A/B/C/D)、选项文本、真实分值
- **多选题**:为每个选中的选项创建一条记录,使用选项标识区分不同选项
- **问答题**:创建一条记录,选项相关字段为 NULL,答案值存储用户输入的文本内容
**hq_sat_answer 表数据示例**(v1.0.2 修复后):
```sql
-- 单选题答案记录(用户选择"非常满意"选项)
INSERT INTO hq_sat_answer VALUES (
1, '000000', 1001, NOW(), 1, NOW(), 0, -- 基础字段
123, 1, '1', 1, 'A', '非常满意', 'A', 5, NULL -- 答案字段
);
-- 多选题答案记录(用户选中A、C两个选项)
INSERT INTO hq_sat_answer VALUES
(2, '000000', 1001, NOW(), 1, NOW(), 0, 123, 2, '2', 1, 'A', '非常满意', 'A,C', 5, NULL),
(3, '000000', 1001, NOW(), 1, NOW(), 0, 123, 2, '2', 3, 'C', '一般', 'A,C', 1, NULL);
-- 问答题答案记录
INSERT INTO hq_sat_answer VALUES (
4, '000000', 1001, NOW(), 1, NOW(), 0, -- 基础字段
123, 3, '3', NULL, NULL, NULL, '这是我的意见和建议', 0, NULL -- 答案字段
);
```
**字段说明**(修复后):
- `option_value`: 存储选项标识(A、B、C、D),便于统计分析
- `answer_score`: 存储真实分值(从 hq_sat_option 表查询获得)
- `answer_value`: 单选题存选项标识,多选题存逗号分隔的多个标识,问答题存文本
#### 保存问卷答案草稿
**接口地址**: `POST /hq/satSurvey/answer/draft`
**接口描述**: 保存问卷答案草稿,可多次保存和修改
**权限要求**: 需要登录
**请求参数**: 同提交问卷答案
**响应示例**: 同提交问卷答案
### 2.2 答题状态查询
#### 检查用户是否已答过问卷
**接口地址**: `GET /hq/satSurvey/{surveyId}/answered`
**接口描述**: 检查当前用户是否已经答过指定问卷(v1.0.3 更新:支持多次提交检查)
**权限要求**: 需要登录
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ---- | ---- | ------- |
| surveyId | long | 是 | 问卷 ID |
**响应示例**:
```json
{
"code": 200,
"msg": "查询成功",
"data": true
}
```
**响应说明**(v1.0.3 更新):
- `data` 为 `true` 表示用户已答过该问卷(至少提交过 1 次)
- `data` 为 `false` 表示用户未答过该问卷
**多次提交支持**:
此接口仅返回用户是否有答题记录,不考虑提交次数限制。要检查是否还能继续提交,请参考以下逻辑:
- 如果 `max_submit_times = 0`:始终可以提交
- 如果 `max_submit_times > 0`:需要检查用户提交次数是否小于此限制
- 具体的提交限制检查由"提交问卷答案"接口在提交时进行
#### 获取用户问卷答题记录
**接口地址**: `GET /hq/satSurvey/{surveyId}/answer`
**接口描述**: 获取当前用户对指定问卷的答题记录(v1.0.5 重大更新:优化数据源,支持前端答案回显)
**权限要求**: 需要登录
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ---- | ---- | ------- |
| surveyId | long | 是 | 问卷 ID |
**响应示例**:
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"id": 1001,
"surveyId": 1,
"userId": 1,
"userType": "student",
"submitTime": "2025-01-26T14:15:00.000Z",
"totalScore": 0,
"avgScore": 0,
"remark": "ANSWERS_DATA:[{\"questionId\":1,\"questionType\":\"1\",\"answerValue\":\"A\"},{\"questionId\":2,\"questionType\":\"2\",\"answerValue\":\"A,C\"}]"
}
}
```
**返回数据说明**(v1.0.5 重大更新):
- 此接口只返回用户最新的有效答题记录(deleted=0)
- 如果用户进行了多次提交,历史记录已被软删除,查询不到
- 返回的是用户最后一次提交的完整答题信息
- 历史记录完整保留在数据库中,仅用于审计目的
**v1.0.5 新增功能 - 答案回显数据**:
为支持前端答题界面的历史答案回显功能,此接口现在会在 `remark` 字段中包含格式化的答案数据:
1. **数据格式**: `ANSWERS_DATA:[答案JSON数组]`
2. **数据来源**: 直接从 `hq_sat_answer` 表查询,比 v1.0.4 之前的 `remark` 解析更准确
3. **答案结构**:
```json
[
{
"questionId": 1,
"questionType": "1",
"answerValue": "A"
},
{
"questionId": 2,
"questionType": "2",
"answerValue": "A,C"
},
{
"questionId": 3,
"questionType": "3",
"answerValue": "用户输入的文本内容"
}
]
```
**前端答案回显逻辑**:
- **单选题** (`questionType = "1"`): `answerValue` 直接设置到单选控件(如 "A")
- **多选题** (`questionType = "2"`): `answerValue` 按逗号分割成数组(如 ["A", "C"])
- **问答题** (`questionType = "3"`): `answerValue` 直接设置到文本框
**使用场景**:
- ✅ **首次答题**: 返回 404,前端正常显示空表单
- ✅ **重新答题**: 返回历史答案,前端自动回显到表单
- ✅ **多次修改**: 基于上次答案继续编辑,提升用户体验
---
## 3. 题目管理 API
### 3.1 题目基础管理
#### 查询题目列表
**接口地址**: `GET /hq/satQuestion/list`
**权限要求**: `hq:satQuestion:list`
#### 获取题目选项
**接口地址**: `GET /hq/satQuestion/{questionId}/options`
**接口描述**: 获取指定题目的所有选项
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
| ---------- | ---- | ---- | ------- |
| questionId | long | 是 | 题目 ID |
**响应示例**:
```json
{
"code": 200,
"msg": "查询成功",
"data": [
{
"id": 1,
"questionId": 1,
"optionValue": "A",
"optionText": "非常满意",
"optionScore": 5,
"sortOrder": 1
},
{
"id": 2,
"questionId": 1,
"optionValue": "B",
"optionText": "满意",
"optionScore": 4,
"sortOrder": 2
}
]
}
```
---
## 4. 答题记录管理 API
### 4.1 答题记录查询
#### 查询答题记录列表
**接口地址**: `GET /hq/satRecord/list`
**权限要求**: `hq:satRecord:list`
#### 获取答题记录详情
**接口地址**: `GET /hq/satRecord/{id}`
**权限要求**: `hq:satRecord:query`
---
## 5. 错误码说明
### 业务错误码
| 错误码 | 说明 | 解决方案 |
| ------ | ------------------ | ------------------------ |
| 40001 | 问卷不存在 | 检查问卷 ID 是否正确 |
| 40002 | 问卷未在进行中状态 | 等待问卷开始或联系管理员 |
| 40003 | 您已经答过这份问卷 | 不能重复答题 |
| 40004 | 答题记录保存失败 | 重新提交或联系技术支持 |
| 40005 | 题目类型不支持 | 检查题目类型是否正确 |
---
## 6. 数据字典
### 6.1 问卷状态
| 值 | 说明 | 备注 |
| --- | ------ | -------------- |
| 0 | 草稿 | 未发布状态 |
| 1 | 进行中 | 已发布,可答题 |
| 2 | 已结束 | 超过结束时间 |
### 6.2 目标群体
| 值 | 说明 | 备注 |
| --- | ------ | ---------- |
| 1 | 学生 | 在校学生 |
| 2 | 教职工 | 教师和职工 |
| 3 | 全体 | 所有人员 |
### 6.4 用户类型
| 值 | 说明 | 备注 |
| --- | ---------- | --------------------------------------------------------- |
| 1 | 学生 | student、学生、stu 等角色映射为此值 |
| 2 | 教师 | teacher、老师、教师、教职工、tea 等角色映射为此值 |
| 3 | 超级管理员 | admin、管理员、超级管理员、administrator 等角色映射为此值 |
### 6.3 题目类型
| 值 | 说明 | 备注 |
| --- | ------ | ---------------- |
| 1 | 单选题 | 只能选择一个选项 |
| 2 | 多选题 | 可以选择多个选项 |
| 3 | 问答题 | 文本输入 |
---
## 7. 版本更新记录
### v1.0.5 (2025-01-26)
- 🚀 **重大更新**:实现答题界面历史答案回显功能,提升多次答题用户体验
- 🔧 **数据源优化**:`GET /hq/satSurvey/{surveyId}/answer` 接口改用 hq_sat_answer 表直接查询
- 📊 新增 `getAnswersFromSatAnswerTable()` 方法,提供更准确的答案数据聚合
- ✨ 前端新增 `loadPreviousAnswers()` 方法,支持三种题型的智能答案回显
- 🎯 智能用户体验:只在成功加载历史答案时显示提示,异常时优雅降级
- 🛡️ 错误处理优化:404 错误不显示提示,历史答案加载失败不阻断答题流程
### v1.0.4 (2025-01-26)
- 🔄 **重要优化**:多次提交时实现历史数据软删除,确保用户只有一份有效答题记录
- 🗃️ 保留历史数据用于审计,但业务查询只返回最新有效数据
- ⚡ 优化查询性能,提交次数统计和答题记录查询只涉及有效数据
- 🛡️ 增强数据一致性,通过 record_id 关联确保三表数据状态同步
### v1.0.3 (2025-01-26)
- 🚀 **新功能**:实现问卷多次提交功能,支持根据 max_submit_times 设置控制提交次数
- 📊 优化提交次数检查逻辑,支持 0=无限制、N=最大 N 次的灵活配置
- ✅ 保留完整的答题历史记录,每次提交创建新的答题记录
- 🎯 增强用户体验,提供详细的提交次数限制提示信息
### v1.0.2 (2025-01-26)
- 🔧 **重要修复**:修复单选题和多选题答案未记录到 hq_sat_answer 表的问题
- 🎯 修复前端选项绑定使用分值导致的数据类型不匹配问题
- ✅ 优化答案保存逻辑,正确存储选项标识(A、B、C、D)和分值
- 📊 增强答案数据查询,支持选项分值自动计算
- 🐛 修复多选题答案保存逻辑错误
### v1.0.1 (2025-01-26)
- 🔧 修复答题提交时 user_type 字段长度问题
- ✅ 新增用户角色到数字编码的转换逻辑
- 📚 新增用户类型数据字典说明
- 🆕 新增答案详情记录功能,同时保存到 hq_sat_answer 表
- 📝 完善提交问卷答案接口的数据保存说明
### v1.0.0 (2025-01-26)
- ✅ 新增答题提交 API
- ✅ 新增答题状态查询 API
- ✅ 完善问卷管理 API
- ✅ 新增题目选项查询 API
- ✅ 建立完整的 API 文档体系
---
## 8. 开发说明
### 8.1 接口测试
推荐使用以下工具进行接口测试:
- **Postman**: 图形化接口测试工具
- **Apifox**: 国产 API 管理工具
- **curl**: 命令行工具
### 8.2 认证方式
所有需要权限的接口都需要在请求头中携带认证信息:
```http
Authorization: Bearer {token}
```
### 8.3 时间格式
所有时间字段统一使用 ISO 8601 格式:
```
2025-01-26T14:15:00.000Z
```
### 8.4 分页参数
所有分页接口统一使用以下参数:
- `pageNum`: 页码,从 1 开始
- `pageSize`: 页大小,默认 10
---
## 联系方式
如有 API 相关问题,请联系开发团队或查看项目仓库的 Issues。