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

962 lines
17 KiB
Markdown
Raw Normal View History

# 盘古用户平台 - 接口设计文档
---
| 文档信息 | 内容 |
|---------|------|
| **文档版本** | 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`
---
*文档结束*