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

1032 lines
20 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`
---
## 10. 业务规则说明
> 以下业务规则来源于墨刀原型批注,接口开发时需遵守
### 10.1 学校管理
| 规则编号 | 规则描述 |
|:------:|--------|
| SCH-01 | 学校编码自动生成格式SCH + 年份 + 4位序号 |
| SCH-02 | 新增学校时所属地区从列表页选择的区域层级树带入,也可手动调整 |
| SCH-03 | 所属地区/学校编码/学校名称为必填 |
| SCH-04 | 学校下新增年级为选择挂载模式,非新建年级,支持多选 |
| SCH-05 | 年级下新增班级为选择挂载模式,非新建班级,支持多选 |
| SCH-06 | 删除时检查是否有子级或被学生信息引用,有则不允许删除 |
| SCH-07 | 所有删除操作均为软删除 |
### 10.2 会员管理
| 规则编号 | 规则描述 |
|:------:|--------|
| MEM-01 | 会员编号自动生成格式JS + 时间戳 |
| MEM-02 | 昵称未填写时自动生成 |
| MEM-03 | 出生日期和性别为选填 |
| MEM-04 | 身份类型为"教师"时,必须填写区域/学校/年级/班级 |
| MEM-05 | 身份类型为"教师"时,只能绑定同校学生 |
| MEM-06 | 身份类型为"家长"时,不显示区域信息,可绑定任意学生 |
| MEM-07 | 重置密码后弹窗显示新密码,提供复制功能 |
| MEM-08 | 删除会员需popconfirm确认如绑定学生则不允许删除 |
| MEM-09 | 禁用会员后无法登录任何端 |
| MEM-10 | 支持三种登录方式:手机号+验证码、手机号+密码、微信登录 |
### 10.3 学生管理
| 规则编号 | 规则描述 |
|:------:|--------|
| STU-01 | 学号不允许重复,可为空 |
| STU-02 | 出生日期和性别可为空 |
| STU-03 | 学校信息(区域/学校/年级/班级)为必填 |
| STU-04 | 学生必须归属于某个会员 |
**批量导入规则:**
| 规则编号 | 规则描述 |
|:------:|--------|
| IMP-01 | 模板字段:姓名(必填)、学号(必填)、用户手机号(必填)、区域(必填)、学校(必填)、年级(必填)、班级(必填)、性别(选填)、出生年月(选填) |
| IMP-02 | 导入时校验必填字段和区域/学校/年级/班级数据一致性 |
| IMP-03 | 用户手机号已存在则挂载到已有用户 |
| IMP-04 | 用户手机号不存在则自动创建家长用户初始密码123456 |
### 10.4 应用管理
| 规则编号 | 规则描述 |
|:------:|--------|
| APP-01 | 应用编码自动生成格式YY + 6位序号 |
| APP-02 | 应用密钥AppSecret自动生成32位随机字符串 |
| APP-03 | 重置密钥后弹窗显示新密钥,提供复制功能 |
| APP-04 | 删除应用需popconfirm确认 |
| APP-05 | 禁用应用后无法调用任何API |
### 10.5 区域管理
| 规则编号 | 规则描述 |
|:------:|--------|
| REG-01 | 区域名称必填 |
| REG-02 | 区域编码自动生成 |
| REG-03 | 新增下级时默认所属父级为选择的区域 |
| REG-04 | 删除区域前检查是否有子级或被引用 |
---
*文档结束*