pangu-user-platform/docs/04-接口文档/接口设计文档_v1.0.md

962 lines
17 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.

# 盘古用户平台 - 接口设计文档
---
| 文档信息 | 内容 |
|---------|------|
| **文档版本** | V1.0 |
| **项目名称** | 盘古用户平台Pangu User Platform |
| **编写团队** | pangu |
| **创建日期** | 2026-01-31 |
| **接口基础路径** | `/api` (管理端) `/app` (移动端) `/open` (开放API) |
---
## 1. 接口规范
### 1.1 请求规范
**请求头Header**
| Header | 必填 | 说明 |
|--------|:----:|------|
| Authorization | 是 | Bearer {token},登录接口除外 |
| Content-Type | 是 | application/json |
**请求方法**
| 方法 | 用途 |
|-----|------|
| GET | 查询数据 |
| POST | 新增数据 |
| PUT | 修改数据 |
| DELETE | 删除数据 |
### 1.2 响应规范
**统一响应格式**
```json
{
"code": 200,
"msg": "操作成功",
"data": {}
}
```
**分页响应格式**
```json
{
"code": 200,
"msg": "查询成功",
"total": 100,
"rows": []
}
```
### 1.3 错误码定义
| 错误码 | 说明 |
|-------|------|
| 200 | 成功 |
| 400 | 请求参数错误 |
| 401 | 未登录或Token过期 |
| 403 | 无权限访问 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
---
## 2. 认证接口
### 2.1 后台登录
**接口地址**`POST /api/login`
**请求参数**
```json
{
"username": "admin",
"password": "admin123",
"code": "1234",
"uuid": "xxx-xxx-xxx"
}
```
| 参数 | 类型 | 必填 | 说明 |
|-----|------|:----:|------|
| username | string | 是 | 用户名 |
| password | string | 是 | 密码 |
| code | string | 是 | 验证码 |
| uuid | string | 是 | 验证码唯一标识 |
**响应结果**
```json
{
"code": 200,
"msg": "操作成功",
"token": "eyJhbGciOiJIUzUxMiJ9..."
}
```
### 2.2 获取验证码
**接口地址**`GET /api/captchaImage`
**响应结果**
```json
{
"code": 200,
"msg": "操作成功",
"img": "data:image/png;base64,...",
"uuid": "xxx-xxx-xxx"
}
```
### 2.3 会员登录(验证码)
**接口地址**`POST /app/login/sms`
**请求参数**
```json
{
"phone": "13812345678",
"code": "123456"
}
```
| 参数 | 类型 | 必填 | 说明 |
|-----|------|:----:|------|
| phone | string | 是 | 手机号 |
| code | string | 是 | 短信验证码 |
**响应结果**
```json
{
"code": 200,
"msg": "登录成功",
"data": {
"token": "eyJhbGciOiJIUzUxMiJ9...",
"memberId": 1,
"memberCode": "JS123456789",
"phone": "138****5678",
"nickname": "用户昵称",
"avatar": "https://...",
"identityType": "1"
}
}
```
### 2.4 发送短信验证码
**接口地址**`POST /app/sms/send`
**请求参数**
```json
{
"phone": "13812345678",
"type": "login"
}
```
| 参数 | 类型 | 必填 | 说明 |
|-----|------|:----:|------|
| phone | string | 是 | 手机号 |
| type | string | 是 | 验证码类型login/register |
**响应结果**
```json
{
"code": 200,
"msg": "验证码已发送"
}
```
### 2.5 会员登录(密码)
**接口地址**`POST /app/login/password`
**请求参数**
```json
{
"phone": "13812345678",
"password": "123456"
}
```
### 2.6 会员登录(微信)
**接口地址**`POST /app/login/wechat`
**请求参数**
```json
{
"code": "wx_login_code"
}
```
| 参数 | 类型 | 必填 | 说明 |
|-----|------|:----:|------|
| code | string | 是 | 微信登录code |
---
## 3. 学校管理接口
### 3.1 查询学校树
**接口地址**`GET /api/school/tree`
**请求参数**
| 参数 | 类型 | 必填 | 说明 |
|-----|------|:----:|------|
| regionId | long | 否 | 区域ID |
**响应结果**
```json
{
"code": 200,
"msg": "查询成功",
"data": [
{
"schoolId": 1,
"schoolCode": "SCH001",
"schoolName": "武汉市第一中学",
"regionPath": "湖北省-武汉市-武昌区",
"children": [
{
"id": 1,
"gradeId": 7,
"gradeName": "七年级",
"children": [
{
"id": 1,
"classId": 1,
"className": "1班"
}
]
}
]
}
]
}
```
### 3.2 查询学校列表
**接口地址**`GET /api/school/list`
**请求参数**
| 参数 | 类型 | 必填 | 说明 |
|-----|------|:----:|------|
| schoolName | string | 否 | 学校名称(模糊查询)|
| regionId | long | 否 | 区域ID |
| status | string | 否 | 状态 |
| pageNum | int | 是 | 页码 |
| pageSize | int | 是 | 每页条数 |
**响应结果**
```json
{
"code": 200,
"msg": "查询成功",
"total": 100,
"rows": [
{
"schoolId": 1,
"schoolCode": "SCH001",
"schoolName": "武汉市第一中学",
"schoolType": "02",
"regionId": 111,
"regionPath": "湖北省-武汉市-武昌区",
"status": "0",
"createTime": "2026-01-01 10:00:00",
"createBy": "admin"
}
]
}
```
### 3.3 新增学校
**接口地址**`POST /api/school`
**请求参数**
```json
{
"schoolName": "武汉市第一中学",
"schoolType": "02",
"regionId": 111,
"address": "武昌区xxx路xxx号",
"contactPerson": "张老师",
"contactPhone": "13812345678",
"status": "0"
}
```
### 3.4 修改学校
**接口地址**`PUT /api/school`
**请求参数**
```json
{
"schoolId": 1,
"schoolName": "武汉市第一中学",
"schoolType": "02",
"regionId": 111,
"status": "0"
}
```
### 3.5 删除学校
**接口地址**`DELETE /api/school/{schoolId}`
### 3.6 为学校挂载年级
**接口地址**`POST /api/school/bindGrades`
**请求参数**
```json
{
"schoolId": 1,
"gradeIds": [7, 8, 9]
}
```
### 3.7 为年级挂载班级
**接口地址**`POST /api/school/bindClasses`
**请求参数**
```json
{
"schoolGradeId": 1,
"classIds": [1, 2, 3]
}
```
---
## 4. 会员管理接口
### 4.1 查询会员列表
**接口地址**`GET /api/member/list`
**请求参数**
| 参数 | 类型 | 必填 | 说明 |
|-----|------|:----:|------|
| phone | string | 否 | 手机号 |
| nickname | string | 否 | 昵称 |
| identityType | string | 否 | 身份类型1家长 2教师|
| status | string | 否 | 状态 |
| beginTime | string | 否 | 注册开始时间 |
| endTime | string | 否 | 注册结束时间 |
| pageNum | int | 是 | 页码 |
| pageSize | int | 是 | 每页条数 |
**响应结果**
```json
{
"code": 200,
"msg": "查询成功",
"total": 100,
"rows": [
{
"memberId": 1,
"memberCode": "JS123456789",
"phone": "138****5678",
"nickname": "用户昵称",
"gender": "1",
"birthday": "1990-01-01",
"identityType": "1",
"registerSource": "1",
"registerTime": "2026-01-01 10:00:00",
"status": "0"
}
]
}
```
### 4.2 获取会员详情
**接口地址**`GET /api/member/{memberId}`
**响应结果**
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"memberId": 1,
"memberCode": "JS123456789",
"phone": "13812345678",
"nickname": "用户昵称",
"gender": "1",
"birthday": "1990-01-01",
"identityType": "2",
"regionId": 111,
"schoolId": 1,
"schoolGradeId": 1,
"schoolClassId": 1,
"students": [
{
"studentId": 1,
"studentName": "张三",
"studentNo": "2026001",
"schoolName": "武汉市第一中学",
"gradeName": "七年级",
"className": "1班"
}
]
}
}
```
### 4.3 新增会员
**接口地址**`POST /api/member`
**请求参数**
```json
{
"phone": "13812345678",
"nickname": "用户昵称",
"gender": "1",
"birthday": "1990-01-01",
"identityType": "2",
"regionId": 111,
"schoolId": 1,
"schoolGradeId": 1,
"schoolClassId": 1,
"status": "0"
}
```
### 4.4 修改会员
**接口地址**`PUT /api/member`
### 4.5 删除会员
**接口地址**`DELETE /api/member/{memberId}`
### 4.6 重置密码
**接口地址**`PUT /api/member/resetPwd/{memberId}`
**响应结果**
```json
{
"code": 200,
"msg": "密码重置成功",
"data": {
"password": "abc123"
}
}
```
### 4.7 绑定学生
**接口地址**`POST /api/member/bindStudent`
**请求参数**
```json
{
"memberId": 1,
"studentId": 1
}
```
### 4.8 解绑学生
**接口地址**`DELETE /api/member/unbindStudent/{memberId}/{studentId}`
---
## 5. 学生管理接口
### 5.1 查询学生列表
**接口地址**`GET /api/student/list`
**请求参数**
| 参数 | 类型 | 必填 | 说明 |
|-----|------|:----:|------|
| studentName | string | 否 | 学生姓名 |
| studentNo | string | 否 | 学号 |
| gender | string | 否 | 性别 |
| schoolId | long | 否 | 学校ID |
| schoolGradeId | long | 否 | 学校年级ID |
| schoolClassId | long | 否 | 学校班级ID |
| subjectId | long | 否 | 学科ID |
| memberPhone | string | 否 | 归属用户手机号 |
| pageNum | int | 是 | 页码 |
| pageSize | int | 是 | 每页条数 |
**响应结果**
```json
{
"code": 200,
"msg": "查询成功",
"total": 100,
"rows": [
{
"studentId": 1,
"studentName": "张三",
"studentNo": "2026001",
"gender": "1",
"birthday": "2015-01",
"regionPath": "湖北省-武汉市-武昌区",
"schoolName": "武汉市第一中学",
"gradeName": "七年级",
"className": "1班",
"subjectName": "语文",
"memberNickname": "张三爸爸",
"memberPhone": "138****5678"
}
]
}
```
### 5.2 获取学生详情
**接口地址**`GET /api/student/{studentId}`
### 5.3 新增学生
**接口地址**`POST /api/student`
**请求参数**
```json
{
"studentName": "张三",
"studentNo": "2026001",
"gender": "1",
"birthday": "2015-01",
"regionId": 111,
"schoolId": 1,
"schoolGradeId": 1,
"schoolClassId": 1,
"subjectId": 1,
"memberId": 1
}
```
### 5.4 修改学生
**接口地址**`PUT /api/student`
### 5.5 删除学生
**接口地址**`DELETE /api/student/{studentId}`
### 5.6 批量导入学生
**接口地址**`POST /api/student/import`
**请求方式**`multipart/form-data`
**请求参数**
| 参数 | 类型 | 必填 | 说明 |
|-----|------|:----:|------|
| file | file | 是 | Excel文件 |
**响应结果**
```json
{
"code": 200,
"msg": "导入成功",
"data": {
"successCount": 98,
"failCount": 2,
"failList": [
{"row": 5, "reason": "学号已存在"},
{"row": 10, "reason": "学校信息不匹配"}
]
}
}
```
### 5.7 下载导入模板
**接口地址**`GET /api/student/template`
**响应**Excel文件下载
---
## 6. 应用管理接口
### 6.1 查询应用列表
**接口地址**`GET /api/application/list`
**请求参数**
| 参数 | 类型 | 必填 | 说明 |
|-----|------|:----:|------|
| appName | string | 否 | 应用名称 |
| appCode | string | 否 | 应用编码 |
| status | string | 否 | 状态 |
| pageNum | int | 是 | 页码 |
| pageSize | int | 是 | 每页条数 |
### 6.2 获取应用详情
**接口地址**`GET /api/application/{appId}`
**响应结果**
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"appId": 1,
"appCode": "YY000001",
"appName": "AI智慧平台",
"appSecret": "********************************",
"status": "0",
"apis": [
{
"apiCode": "STUDENT_LIST",
"apiName": "查询学生信息",
"apiPath": "/open/student/list"
}
]
}
}
```
### 6.3 新增应用
**接口地址**`POST /api/application`
**请求参数**
```json
{
"appName": "AI智慧平台",
"appDesc": "AI教育智慧平台",
"contactPerson": "张经理",
"contactPhone": "13812345678",
"status": "0",
"apiCodes": ["STUDENT_LIST", "SCHOOL_LIST", "GRADE_LIST"]
}
```
### 6.4 修改应用
**接口地址**`PUT /api/application`
### 6.5 删除应用
**接口地址**`DELETE /api/application/{appId}`
### 6.6 重置密钥
**接口地址**`PUT /api/application/resetSecret/{appId}`
**响应结果**
```json
{
"code": 200,
"msg": "密钥重置成功",
"data": {
"appSecret": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
}
}
```
### 6.7 获取API接口列表
**接口地址**`GET /api/application/apiList`
**响应结果**
```json
{
"code": 200,
"msg": "查询成功",
"data": [
{
"apiCode": "STUDENT_LIST",
"apiName": "查询学生信息",
"apiPath": "/open/student/list",
"apiMethod": "GET"
}
]
}
```
---
## 7. 基础数据接口
### 7.1 区域管理
#### 获取区域树
**接口地址**`GET /api/region/tree`
#### 新增区域
**接口地址**`POST /api/region`
#### 修改区域
**接口地址**`PUT /api/region`
#### 删除区域
**接口地址**`DELETE /api/region/{regionId}`
### 7.2 年级管理
#### 查询年级列表
**接口地址**`GET /api/grade/list`
#### 新增年级
**接口地址**`POST /api/grade`
#### 修改年级
**接口地址**`PUT /api/grade`
#### 删除年级
**接口地址**`DELETE /api/grade/{gradeId}`
### 7.3 班级管理
#### 查询班级列表
**接口地址**`GET /api/class/list`
#### 新增班级
**接口地址**`POST /api/class`
#### 修改班级
**接口地址**`PUT /api/class`
#### 删除班级
**接口地址**`DELETE /api/class/{classId}`
### 7.4 学科管理
#### 查询学科列表
**接口地址**`GET /api/subject/list`
#### 新增学科
**接口地址**`POST /api/subject`
#### 修改学科
**接口地址**`PUT /api/subject`
#### 删除学科
**接口地址**`DELETE /api/subject/{subjectId}`
---
## 8. 开放API接口
> 供第三方应用调用需要AppId + AppSecret签名认证
### 8.1 签名规则
**请求头**
| Header | 必填 | 说明 |
|--------|:----:|------|
| X-App-Id | 是 | 应用编码 |
| X-Timestamp | 是 | 时间戳(毫秒)|
| X-Sign | 是 | 签名 |
**签名算法**
```
1. 将所有请求参数按参数名ASCII升序排序
2. 拼接成 key1=value1&key2=value2 格式
3. 末尾追加 &appSecret=xxx
4. 对整个字符串进行MD5加密32位大写
```
**示例**
```
请求参数pageNum=1&pageSize=10&schoolId=1
拼接后pageNum=1&pageSize=10&schoolId=1&appSecret=abc123
MD5签名E5D7C6B5A4F3E2D1C0B9A8F7E6D5C4B3
```
### 8.2 查询学生列表
**接口地址**`GET /open/student/list`
**请求参数**
| 参数 | 类型 | 必填 | 说明 |
|-----|------|:----:|------|
| schoolId | long | 否 | 学校ID |
| gradeId | long | 否 | 年级ID |
| classId | long | 否 | 班级ID |
| pageNum | int | 是 | 页码 |
| pageSize | int | 是 | 每页条数 |
### 8.3 查询学校列表
**接口地址**`GET /open/school/list`
**请求参数**
| 参数 | 类型 | 必填 | 说明 |
|-----|------|:----:|------|
| regionId | long | 否 | 区域ID |
| pageNum | int | 是 | 页码 |
| pageSize | int | 是 | 每页条数 |
### 8.4 查询年级列表
**接口地址**`GET /open/grade/list`
### 8.5 查询班级列表
**接口地址**`GET /open/class/list`
### 8.6 查询区域树
**接口地址**`GET /open/region/tree`
### 8.7 查询会员列表
**接口地址**`GET /open/member/list`
**请求参数**
| 参数 | 类型 | 必填 | 说明 |
|-----|------|:----:|------|
| phone | string | 否 | 手机号 |
| schoolId | long | 否 | 学校ID |
| pageNum | int | 是 | 页码 |
| pageSize | int | 是 | 每页条数 |
---
## 9. 移动端接口
### 9.1 获取当前用户信息
**接口地址**`GET /app/member/info`
**响应结果**
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"memberId": 1,
"memberCode": "JS123456789",
"phone": "138****5678",
"nickname": "用户昵称",
"avatar": "https://...",
"gender": "1",
"identityType": "1",
"students": [
{
"studentId": 1,
"studentName": "张三",
"schoolName": "武汉市第一中学",
"gradeName": "七年级",
"className": "1班"
}
]
}
}
```
### 9.2 修改个人信息
**接口地址**`PUT /app/member/info`
**请求参数**
```json
{
"nickname": "新昵称",
"avatar": "https://...",
"gender": "1"
}
```
### 9.3 修改密码
**接口地址**`PUT /app/member/updatePwd`
**请求参数**
```json
{
"oldPassword": "123456",
"newPassword": "654321"
}
```
### 9.4 获取我的学生列表
**接口地址**`GET /app/student/myList`
### 9.5 获取学校列表
**接口地址**`GET /app/school/list`
### 9.6 获取区域树
**接口地址**`GET /app/region/tree`
---
*文档结束*