From bfc286d77aeadc98d76b4636199ce9aa39d85114 Mon Sep 17 00:00:00 2001 From: Kagol Date: Tue, 8 Apr 2025 14:41:00 +0800 Subject: [PATCH] docs: remove tiny-pro backend docs --- docs/imgs/TinyPro.png | Bin 79976 -> 0 bytes ...45\345\217\243\346\226\207\346\241\243.md" | 3427 ----------------- ...76\350\256\241\346\226\207\346\241\243.md" | 93 - 3 files changed, 3520 deletions(-) delete mode 100644 docs/imgs/TinyPro.png delete mode 100644 "docs/\346\216\245\345\217\243\346\226\207\346\241\243.md" delete mode 100644 "docs/\350\256\276\350\256\241\346\226\207\346\241\243.md" diff --git a/docs/imgs/TinyPro.png b/docs/imgs/TinyPro.png deleted file mode 100644 index 6daf040810cb93a6a13c8e81c179606cfe621652..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79976 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 CeefCp diff --git "a/docs/\346\216\245\345\217\243\346\226\207\346\241\243.md" "b/docs/\346\216\245\345\217\243\346\226\207\346\241\243.md" deleted file mode 100644 index 37cb861b..00000000 --- "a/docs/\346\216\245\345\217\243\346\226\207\346\241\243.md" +++ /dev/null @@ -1,3427 +0,0 @@ ---- -title: ospp-latest v1.0.0 -language_tabs: - - shell: Shell - - http: HTTP - - javascript: JavaScript - - ruby: Ruby - - python: Python - - php: PHP - - java: Java - - go: Go -toc_footers: [] -includes: [] -search: true -code_clipboard: true -highlight_theme: darkula -headingLevel: 2 -generator: "@tarslib/widdershins v4.0.17" - ---- - -# ospp-latest - -> v1.0.0 - -Base URLs: - -# Auth - -## POST 登录接口 - -POST /auth/login - -> Body 请求参数 - -```json -{ - "email": "j.nschfnp@qq.com", - "password": "ut sed veniam" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|body|body|object| 否 |none| -|» email|body|string| 是 |none| -|» password|body|string| 否 |none| - -> 返回示例 - -> 201 Response - -```json -{ - "token": "string" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|成功|Inline| - -### 返回数据结构 - -状态码 **201** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» token|string|true|none|经过加盐处理的AccessToken|none| - -## POST 登出 - -POST /auth/logout - -> Body 请求参数 - -```json -{ - "token": "string" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|body|body|object| 否 ||none| -|» token|body|string| 是 | 登录时返回的token|none| - -> 返回示例 - -> 200 Response - -```json -{} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -# i18 - -## POST 创建一个国际化词条 - -POST /i18 - -> Body 请求参数 - -```json -{ - "lang": 0, - "key": "string", - "content": "string" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|body|body|object| 否 ||none| -|» lang|body|number| 是 ||语言ID| -|» key|body|string| 是 ||词条键| -|» content|body|string| 是 ||词条内容| - -> 返回示例 - -> 200 Response - -```json -{ - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - { - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - null - ] - }, - "key": "string", - "content": "string" - } - ] - }, - "key": "string", - "content": "string" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[I18](#schemai18)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## GET 获取国际化字段 - -GET /i18 - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|page|query|number| 否 ||页码.| -|limit|query|number| 否 ||获取数量| -|all|query|number| 否 ||是否全部获取, 如果不未0则忽略page与limit, 返回所有的国际化字段| -|key|query|string| 否 ||国际化字段的键, 如果设定则表示按照键来模糊查找| -|content|query|string| 否 ||国际化字段的值, 如果设定则表示按照值来模糊查找| - -> 返回示例 - -> 200 Response - -```json -{ - "items": [ - { - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - { - "id": null, - "lang": null, - "key": null, - "content": null - } - ] - }, - "key": "string", - "content": "string" - } - ], - "meta": { - "itemCount": 0, - "totalItems": 0, - "itemsPerPage": 0, - "currentPage": 0 - }, - "links": { - "first": "string", - "previous": "string", - "next": "string", - "last": "string" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» items|[[I18](#schemai18)]|true|none||none| -|»» id|number|true|none|国际化字段的自增id|none| -|»» lang|[Lang](#schemalang)|true|none|国际化字段对应的语言信息|none| -|»»» id|number|true|none|语言ID|none| -|»»» name|string|true|none|语言名|none| -|»»» i18|[[I18](#schemai18)]|true|none|对应的国际化词条|none| -|»»»» id|number|true|none|国际化字段的自增id|none| -|»»»» lang|[Lang](#schemalang)|true|none|国际化字段对应的语言信息|none| -|»»»» key|string|true|none|国际化字段的键|none| -|»»»» content|string|true|none|国际化字段的实际内容|none| -|»» key|string|true|none|国际化字段的键|none| -|»» content|string|true|none|国际化字段的实际内容|none| -|» meta|[PaginationMeta](#schemapaginationmeta)|true|none||none| -|»» itemCount|number|false|none||none| -|»» totalItems|number|false|none||none| -|»» itemsPerPage|number|false|none||none| -|»» currentPage|number|false|none||none| -|» links|[PaginationLinks](#schemapaginationlinks)|true|none||none| -|»» first|string|false|none||none| -|»» previous|string|false|none||none| -|»» next|string|false|none||none| -|»» last|string|false|none||none| - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## GET 获取国际化表 - -GET /i18/format - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|lang|query|string| 否 ||语言名| - -> 返回示例 - -> 200 Response - -```json -{ - "[lang-name]": { - "[key]": "string" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **200** - -*Record>* - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» [lang-name]|object|true|none||none| -|»» [key]|string|true|none||none| - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## GET 根据国际化字段ID获取某一个国际化字段 - -GET /i18/{id} - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|id|path|integer| 是 ||国际化字段ID| - -> 返回示例 - -> 200 Response - -```json -{ - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - { - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - null - ] - }, - "key": "string", - "content": "string" - } - ] - }, - "key": "string", - "content": "string" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[I18](#schemai18)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## PATCH 修改一个国际化字段 - -PATCH /i18/{id} - -> Body 请求参数 - -```json -{ - "lang": 0, - "key": "string", - "content": "string" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|id|path|string| 是 ||国际化字段ID| -|body|body|object| 否 ||none| -|» lang|body|number| 否 ||语言名| -|» key|body|string| 否 ||国际化字段键| -|» content|body|string| 否 ||国际化字段值| - -> 返回示例 - -> 200 Response - -```json -{ - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - { - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - null - ] - }, - "key": "string", - "content": "string" - } - ] - }, - "key": "string", - "content": "string" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[I18](#schemai18)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## DELETE 删除一个国际化字段 - -DELETE /i18/{id} - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|id|path|integer| 是 ||国际化字段ID| - -> 返回示例 - -> 200 Response - -```json -{ - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - { - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - null - ] - }, - "key": "string", - "content": "string" - } - ] - }, - "key": "string", - "content": "string" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[I18](#schemai18)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -# user - -## POST 新建一个用户 - -POST /user/reg - -> Body 请求参数 - -```json -{ - "name": "string", - "email": "string", - "password": "string", - "roleIds": [ - 0 - ], - "department": "string", - "employeeType": "string", - "probationStart": "string", - "probationEnd": "string", - "probationDuration": "string", - "protocolStart": "string", - "protocolEnd": "string", - "address": "string", - "status": 0 -} -``` - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|body|body|object| 否 ||none| -|» name|body|string| 是 | 用户昵称|none| -|» email|body|string| 是 | 用户Email|登录使用| -|» password|body|string| 是 | 用户密码|none| -|» roleIds|body|[number]| 是 | 用户角色ID数组|none| -|» department|body|string| 否 | 遗留未知字段|1.1.0以前的遗留字段| -|» employeeType|body|string| 否 | 遗留未知字段|1.1.0以前的遗留字段| -|» probationStart|body|string| 否 | 遗留未知字段|1.1.0以前的遗留字段| -|» probationEnd|body|string| 否 | 遗留未知字段|1.1.0以前的遗留字段| -|» probationDuration|body|string| 否 | 遗留未知字段|1.1.0以前的遗留字段| -|» protocolStart|body|string| 否 | 遗留未知字段|1.1.0以前的遗留字段| -|» protocolEnd|body|string| 否 | 遗留未知字段|1.1.0以前的遗留字段| -|» address|body|string| 否 | 遗留未知字段|1.1.0以前的遗留字段| -|» status|body|number| 否 | 帐号状态|none| - -> 返回示例 - -> 200 Response - -```json -{ - "id": "string", - "name": "string", - "email": "string", - "password": "string", - "role": [ - { - "id": "string", - "name": "string", - "permission": [ - { - "id": 0, - "desc": "string", - "name": "string" - } - ], - "menus": [ - { - "id": 0, - "name": "string", - "order": 0, - "parentId": 0, - "menuType": "string", - "icon": "string", - "component": "string", - "path": "string", - "locale": "string" - } - ] - } - ], - "department": "string", - "employeeType": "string", - "probationENd": "string", - "robationDuration": "string", - "protocolStart": "string", - "protocolEnd": "string", - "address": "string", - "status": 0, - "createTime": "string", - "updateTime": "string", - "create_time": "string", - "salt": "string", - "update_time": "string" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[User](#schemauser)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## GET 获取用户信息 - -GET /user/info/{email} - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|email|path|string| 是 ||用户邮箱| - -> 返回示例 - -> 200 Response - -```json -{ - "id": "string", - "name": "string", - "email": "string", - "password": "string", - "role": [ - { - "id": "string", - "name": "string", - "permission": [ - { - "id": 0, - "desc": "string", - "name": "string" - } - ], - "menus": [ - { - "id": 0, - "name": "string", - "order": 0, - "parentId": 0, - "menuType": "string", - "icon": "string", - "component": "string", - "path": "string", - "locale": "string" - } - ] - } - ], - "department": "string", - "employeeType": "string", - "probationENd": "string", - "robationDuration": "string", - "protocolStart": "string", - "protocolEnd": "string", - "address": "string", - "status": 0, - "createTime": "string", - "updateTime": "string", - "create_time": "string", - "salt": "string", - "update_time": "string" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[User](#schemauser)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## DELETE 删除一个用户 - -DELETE /user/{email} - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|email|path|string| 是 ||用户邮箱| - -> 返回示例 - -> 200 Response - -```json -{ - "id": "string", - "name": "string", - "email": "string", - "password": "string", - "role": [ - { - "id": "string", - "name": "string", - "permission": [ - { - "id": 0, - "desc": "string", - "name": "string" - } - ], - "menus": [ - { - "id": 0, - "name": "string", - "order": 0, - "parentId": 0, - "menuType": "string", - "icon": "string", - "component": "string", - "path": "string", - "locale": "string" - } - ] - } - ], - "department": "string", - "employeeType": "string", - "probationENd": "string", - "robationDuration": "string", - "protocolStart": "string", - "protocolEnd": "string", - "address": "string", - "status": 0, - "createTime": "string", - "updateTime": "string", - "create_time": "string", - "salt": "string", - "update_time": "string" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[User](#schemauser)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## PATCH 修改一个用户 - -PATCH /user/update - -如果修改了角色, 必须将该用户踢下线 (在redis中删除该用户的token) - -> Body 请求参数 - -```json -{ - "oldPassword": "string", - "newPassword": "string", - "email": "string", - "roleIds": [ - 0 - ], - "department": "string", - "employeeType": "string", - "probationStar": "string", - "probationEnd": "string", - "probationDuration": "string", - "protocolStart": "string", - "protocolEnd": "string", - "address": "string", - "status": 0, - "name": "string" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|body|body|object| 否 ||none| -|» oldPassword|body|string| 否 | 旧密码|none| -|» newPassword|body|string| 否 | 新密码|none| -|» email|body|string| 是 | 邮箱|none| -|» roleIds|body|[number]| 是 | 角色ID|none| -|» department|body|string| 是 ||none| -|» employeeType|body|string| 是 ||none| -|» probationStar|body|string| 是 ||none| -|» probationEnd|body|string| 是 ||none| -|» probationDuration|body|string| 是 ||none| -|» protocolStart|body|string| 是 ||none| -|» protocolEnd|body|string| 是 ||none| -|» address|body|string| 是 ||none| -|» status|body|number| 是 | 状态|none| -|» name|body|string| 是 | 用户名|none| - -> 返回示例 - -> 200 Response - -```json -{ - "id": "string", - "name": "string", - "email": "string", - "password": "string", - "role": [ - { - "id": "string", - "name": "string", - "permission": [ - { - "id": 0, - "desc": "string", - "name": "string" - } - ], - "menus": [ - { - "id": 0, - "name": "string", - "order": 0, - "parentId": 0, - "menuType": "string", - "icon": "string", - "component": "string", - "path": "string", - "locale": "string" - } - ] - } - ], - "department": "string", - "employeeType": "string", - "probationENd": "string", - "robationDuration": "string", - "protocolStart": "string", - "protocolEnd": "string", - "address": "string", - "status": 0, - "createTime": "string", - "updateTime": "string", - "create_time": "string", - "salt": "string", - "update_time": "string" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[User](#schemauser)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## GET 获取用户列表 - -GET /user - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|name|query|string| 否 ||模糊查找的用户名| -|role|query|string| 否 ||用逗号分隔| -|email|query|string| 否 ||模糊查找的邮箱| - -> 返回示例 - -> 200 Response - -```json -{ - "items": [ - { - "id": "string", - "name": "string", - "email": "string", - "password": "string", - "role": [ - { - "id": "string", - "name": "string", - "permission": [ - {} - ], - "menus": [ - {} - ] - } - ], - "department": "string", - "employeeType": "string", - "probationENd": "string", - "robationDuration": "string", - "protocolStart": "string", - "protocolEnd": "string", - "address": "string", - "status": 0, - "createTime": "string", - "updateTime": "string", - "create_time": "string", - "salt": "string", - "update_time": "string" - } - ], - "meta": { - "itemCount": 0, - "totalItems": 0, - "itemsPerPage": 0, - "currentPage": 0 - }, - "links": { - "first": "string", - "previous": "string", - "next": "string", - "last": "string" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» items|[[User](#schemauser)]|true|none||none| -|»» id|string|true|none|数据库自增id|none| -|»» name|string|true|none|用户名|none| -|»» email|string|true|none||登录邮箱| -|»» password|string|true|none|密码|none| -|»» role|[[Role](#schemarole)]|true|none|角色|none| -|»»» id|string|true|none|角色id|none| -|»»» name|string|true|none|角色名|none| -|»»» permission|[[Permission](#schemapermission)]|true|none|权限|none| -|»»»» id|number|true|none|权限ID|none| -|»»»» desc|string|true|none|权限介绍|none| -|»»»» name|string|true|none|权限键|none| -|»»» menus|[[Menu](#schemamenu)]|true|none|菜单|none| -|»»»» id|number|true|none|菜单id|none| -|»»»» name|string|true|none|菜单名|none| -|»»»» order|number|true|none|排序|none| -|»»»» parentId|number|false|none|父级id|none| -|»»»» menuType|string|true|none|保留字段|none| -|»»»» icon|string|false|none|图标名|none| -|»»»» component|string|true|none|组件名|none| -|»»»» path|string|true|none|路由路径|none| -|»»»» locale|string|true|none|国际化键|none| -|»» department|string|true|none||1.1.0以前的遗留字段| -|»» employeeType|string|true|none||1.1.0以前的遗留字段| -|»» probationENd|string|true|none||1.1.0以前的遗留字段| -|»» robationDuration|string|true|none||1.1.0以前的遗留字段| -|»» protocolStart|string|true|none||1.1.0以前的遗留字段| -|»» protocolEnd|string|true|none||1.1.0以前的遗留字段| -|»» address|string|true|none||1.1.0以前的遗留字段| -|»» status|number|true|none|帐号状态|none| -|»» createTime|string|true|none||none| -|»» updateTime|string|true|none||none| -|»» create_time|string|true|none||none| -|»» salt|string|true|none|bcrypt盐|none| -|»» update_time|string|true|none||none| -|» meta|[PaginationMeta](#schemapaginationmeta)|true|none||none| -|»» itemCount|number|false|none||none| -|»» totalItems|number|false|none||none| -|»» itemsPerPage|number|false|none||none| -|»» currentPage|number|false|none||none| -|» links|[PaginationLinks](#schemapaginationlinks)|true|none||none| -|»» first|string|false|none||none| -|»» previous|string|false|none||none| -|»» next|string|false|none||none| -|»» last|string|false|none||none| - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## PATCH 强制修改一个用户的密码 - -PATCH /user/admin/updatePwd - -> 返回示例 - -> 200 Response - -```json -{ - "email": "string", - "newPassword": "string", - "confirmPassword": "string" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» email|string|true|none||强制修改密码的邮箱| -|» newPassword|string|true|none||新密码| -|» confirmPassword|string|true|none||确认新密码| - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## PATCH 修改自身密码 - -PATCH /user/updatePwd - -> Body 请求参数 - -```json -{ - "email": "string", - "token": "string", - "newPassword": "string", - "oldPassword": "string" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|body|body|object| 否 ||none| -|» email|body|string| 是 ||要修改用户的邮箱名| -|» token|body|string| 是 ||用户token| -|» newPassword|body|string| 是 ||新密码| -|» oldPassword|body|string| 是 ||旧密码| - -> 返回示例 - -> 200 Response - -```json -{} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -# role - -## POST 新增一个角色 - -POST /role - -> Body 请求参数 - -```json -{ - "name": "string", - "permissionIds": [ - 0 - ], - "menuIds": [ - 0 - ] -} -``` - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|body|body|object| 否 ||none| -|» name|body|string| 是 | 角色名|none| -|» permissionIds|body|[number]| 是 | 权限id数组|none| -|» menuIds|body|[number]| 是 | 菜单id数组|none| - -> 返回示例 - -> 200 Response - -```json -{ - "id": "string", - "name": "string", - "permission": [ - { - "id": 0, - "desc": "string", - "name": "string" - } - ], - "menus": [ - { - "id": 0, - "name": "string", - "order": 0, - "parentId": 0, - "menuType": "string", - "icon": "string", - "component": "string", - "path": "string", - "locale": "string" - } - ] -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[Role](#schemarole)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## GET 查找所有角色 - -GET /role - -> 返回示例 - -> 200 Response - -```json -[ - { - "id": "string", - "name": "string", - "permission": [ - { - "id": 0, - "desc": "string", - "name": "string" - } - ], - "menus": [ - { - "id": 0, - "name": "string", - "order": 0, - "parentId": 0, - "menuType": "string", - "icon": "string", - "component": "string", - "path": "string", - "locale": "string" - } - ] - } -] -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|*anonymous*|[[Role](#schemarole)]|false|none||none| -|» id|string|true|none|角色id|none| -|» name|string|true|none|角色名|none| -|» permission|[[Permission](#schemapermission)]|true|none|权限|none| -|»» id|number|true|none|权限ID|none| -|»» desc|string|true|none|权限介绍|none| -|»» name|string|true|none|权限键|none| -|» menus|[[Menu](#schemamenu)]|true|none|菜单|none| -|»» id|number|true|none|菜单id|none| -|»» name|string|true|none|菜单名|none| -|»» order|number|true|none|排序|none| -|»» parentId|number|false|none|父级id|none| -|»» menuType|string|true|none|保留字段|none| -|»» icon|string|false|none|图标名|none| -|»» component|string|true|none|组件名|none| -|»» path|string|true|none|路由路径|none| -|»» locale|string|true|none|国际化键|none| - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## PATCH 修改一个角色 - -PATCH /role - -> Body 请求参数 - -```json -{ - "id": 0, - "name": "string", - "permissionIds": [ - 0 - ], - "menuIds": [ - 0 - ] -} -``` - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|body|body|object| 否 ||none| -|» id|body|number| 是 | 角色id|none| -|» name|body|string| 否 | 角色名|none| -|» permissionIds|body|[number]| 否 | 角色权限id列表|none| -|» menuIds|body|[number]| 否 | 角色菜单列表|none| - -> 返回示例 - -> 200 Response - -```json -{ - "id": "string", - "name": "string", - "permission": [ - { - "id": 0, - "desc": "string", - "name": "string" - } - ], - "menus": [ - { - "id": 0, - "name": "string", - "order": 0, - "parentId": 0, - "menuType": "string", - "icon": "string", - "component": "string", - "path": "string", - "locale": "string" - } - ] -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[Role](#schemarole)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## GET 获取角色列表的详细信息 - -GET /role/detail - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|page|query|integer| 否 ||页数| -|limit|query|integer| 否 ||获取数量| -|name|query|string| 否 ||角色名| - -> 返回示例 - -> 200 Response - -```json -{ - "roleInfo": { - "items": [ - { - "id": "string", - "name": "string", - "permission": [ - { - "id": null, - "desc": null, - "name": null - } - ], - "menus": [ - { - "id": null, - "name": null, - "order": null, - "parentId": null, - "menuType": null, - "icon": null, - "component": null, - "path": null, - "locale": null - } - ] - } - ], - "meta": { - "itemCount": 0, - "totalItems": 0, - "itemsPerPage": 0, - "currentPage": 0 - }, - "links": { - "first": "string", - "previous": "string", - "next": "string", - "last": "string" - } - }, - "menuTree": [ - { - "id": 0, - "label": "string", - "children": [ - { - "id": null, - "label": "string", - "children": [ - {} - ], - "url": "string", - "component": "string", - "customIcon": "string", - "menuType": "string", - "parentId": "string", - "order": 0, - "locale": "string" - } - ], - "url": "string", - "component": "string", - "customIcon": "string", - "menuType": "string", - "parentId": "string", - "order": 0, - "locale": "string" - } - ] -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» roleInfo|object|true|none||none| -|»» items|[[Role](#schemarole)]|true|none||none| -|»»» id|string|true|none|角色id|none| -|»»» name|string|true|none|角色名|none| -|»»» permission|[[Permission](#schemapermission)]|true|none|权限|none| -|»»»» id|number|true|none|权限ID|none| -|»»»» desc|string|true|none|权限介绍|none| -|»»»» name|string|true|none|权限键|none| -|»»» menus|[[Menu](#schemamenu)]|true|none|菜单|none| -|»»»» id|number|true|none|菜单id|none| -|»»»» name|string|true|none|菜单名|none| -|»»»» order|number|true|none|排序|none| -|»»»» parentId|number|false|none|父级id|none| -|»»»» menuType|string|true|none|保留字段|none| -|»»»» icon|string|false|none|图标名|none| -|»»»» component|string|true|none|组件名|none| -|»»»» path|string|true|none|路由路径|none| -|»»»» locale|string|true|none|国际化键|none| -|»» meta|[PaginationMeta](#schemapaginationmeta)|true|none||none| -|»»» itemCount|number|false|none||none| -|»»» totalItems|number|false|none||none| -|»»» itemsPerPage|number|false|none||none| -|»»» currentPage|number|false|none||none| -|»» links|[PaginationLinks](#schemapaginationlinks)|true|none||none| -|»»» first|string|false|none||none| -|»»» previous|string|false|none||none| -|»»» next|string|false|none||none| -|»»» last|string|false|none||none| -|» menuTree|[[ITreeNodeData](#schemaitreenodedata)]|true|none||none| -|»» id|any|true|none|id|none| - -*anyOf* - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|»»» *anonymous*|number|false|none||none| - -*or* - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|»»» *anonymous*|string|false|none||none| - -*continued* - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|»» label|string|true|none|展示的标签|none| -|»» children|[[ITreeNodeData](#schemaitreenodedata)]|false|none|子集菜单|none| -|»»» id|any|true|none|id|none| -|»»» label|string|true|none|展示的标签|none| -|»»» children|[[ITreeNodeData](#schemaitreenodedata)]|false|none|子集菜单|none| -|»»» url|string|true|none|访问路由|none| -|»»» component|string|true|none|组件|none| -|»»» customIcon|string|true|none|图标名|none| -|»»» menuType|string|true|none|保留字段|none| -|»»» parentId|string|true|none|父级id|none| -|»»» order|integer|true|none|排序|none| -|»»» locale|string|true|none|国际化键|none| -|»» url|string|true|none|访问路由|none| -|»» component|string|true|none|组件|none| -|»» customIcon|string|true|none|图标名|none| -|»» menuType|string|true|none|保留字段|none| -|»» parentId|string|true|none|父级id|none| -|»» order|integer|true|none|排序|none| -|»» locale|string|true|none|国际化键|none| - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## DELETE 删除一个角色 - -DELETE /role/{id} - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|id|path|number| 是 ||角色id| - -> 返回示例 - -> 200 Response - -```json -{ - "id": "string", - "name": "string", - "permission": [ - { - "id": 0, - "desc": "string", - "name": "string" - } - ], - "menus": [ - { - "id": 0, - "name": "string", - "order": 0, - "parentId": 0, - "menuType": "string", - "icon": "string", - "component": "string", - "path": "string", - "locale": "string" - } - ] -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[Role](#schemarole)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## GET 获取一个角色的详细信息 - -GET /role/info/{id} - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|id|path|integer| 是 ||角色id| - -> 返回示例 - -> 200 Response - -```json -{ - "id": "string", - "name": "string", - "permission": [ - { - "id": 0, - "desc": "string", - "name": "string" - } - ], - "menus": [ - { - "id": 0, - "name": "string", - "order": 0, - "parentId": 0, - "menuType": "string", - "icon": "string", - "component": "string", - "path": "string", - "locale": "string" - } - ] -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[Role](#schemarole)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -# permission - -## POST 创建权限 - -POST /permission - -> Body 请求参数 - -```json -{ - "name": "string", - "desc": "string" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|body|body|object| 否 ||none| -|» name|body|string| 是 | 权限键|none| -|» desc|body|string| 是 | 权限简介|none| - -> 返回示例 - -> 200 Response - -```json -{ - "id": 0, - "desc": "string", - "name": "string" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[Permission](#schemapermission)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## PATCH 修改权限 - -PATCH /permission - -> Body 请求参数 - -```json -{ - "name": "string", - "desc": "string", - "id": 0 -} -``` - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|body|body|[UpdatePermissionDTO](#schemaupdatepermissiondto)| 否 ||none| - -> 返回示例 - -> 200 Response - -```json -{} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## GET 获取权限 - -GET /permission - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|page|query|string| 否 ||页数| -|limit|query|string| 否 ||如果为0则查找所有| -|name|query|string| 否 ||权限名,where子句格式| - -> 返回示例 - -> 200 Response - -```json -{ - "items": [ - { - "id": 0, - "desc": "string", - "name": "string" - } - ], - "meta": { - "itemCount": 0, - "totalItems": 0, - "itemsPerPage": 0, - "currentPage": 0 - }, - "links": { - "first": "string", - "previous": "string", - "next": "string", - "last": "string" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» items|[[Permission](#schemapermission)]|true|none||none| -|»» id|number|true|none|权限ID|none| -|»» desc|string|true|none|权限介绍|none| -|»» name|string|true|none|权限键|none| -|» meta|[PaginationMeta](#schemapaginationmeta)|true|none||none| -|»» itemCount|number|false|none||none| -|»» totalItems|number|false|none||none| -|»» itemsPerPage|number|false|none||none| -|»» currentPage|number|false|none||none| -|» links|[PaginationLinks](#schemapaginationlinks)|true|none||none| -|»» first|string|false|none||none| -|»» previous|string|false|none||none| -|»» next|string|false|none||none| -|»» last|string|false|none||none| - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## DELETE 删除权限 - -DELETE /permission/{id} - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|id|path|integer| 是 ||权限id| - -> 返回示例 - -> 200 Response - -```json -[ - { - "id": 0, - "desc": "string", - "name": "string" - } -] -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» id|number|true|none|权限ID|none| -|» desc|string|true|none|权限介绍|none| -|» name|string|true|none|权限键|none| - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -# menu - -## GET 获取用户菜单 - -GET /menu/role/{email} - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|email|path|string| 是 ||用户email| - -> 返回示例 - -> 200 Response - -```json -[ - { - "id": 0, - "label": "string", - "children": [ - { - "id": 0, - "label": "string", - "children": [ - { - "id": null, - "label": "string", - "children": [ - null - ], - "url": "string", - "component": "string", - "customIcon": "string", - "menuType": "string", - "parentId": "string", - "order": 0, - "locale": "string" - } - ], - "url": "string", - "component": "string", - "customIcon": "string", - "menuType": "string", - "parentId": "string", - "order": 0, - "locale": "string" - } - ], - "url": "string", - "component": "string", - "customIcon": "string", - "menuType": "string", - "parentId": "string", - "order": 0, - "locale": "string" - } -] -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|*anonymous*|[[ITreeNodeData](#schemaitreenodedata)]|false|none||none| -|» id|any|true|none|id|none| - -*anyOf* - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|»» *anonymous*|number|false|none||none| - -*or* - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|»» *anonymous*|string|false|none||none| - -*continued* - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» label|string|true|none|展示的标签|none| -|» children|[[ITreeNodeData](#schemaitreenodedata)]|false|none|子集菜单|none| -|»» id|any|true|none|id|none| -|»» label|string|true|none|展示的标签|none| -|»» children|[[ITreeNodeData](#schemaitreenodedata)]|false|none|子集菜单|none| -|»» url|string|true|none|访问路由|none| -|»» component|string|true|none|组件|none| -|»» customIcon|string|true|none|图标名|none| -|»» menuType|string|true|none|保留字段|none| -|»» parentId|string|true|none|父级id|none| -|»» order|integer|true|none|排序|none| -|»» locale|string|true|none|国际化键|none| -|» url|string|true|none|访问路由|none| -|» component|string|true|none|组件|none| -|» customIcon|string|true|none|图标名|none| -|» menuType|string|true|none|保留字段|none| -|» parentId|string|true|none|父级id|none| -|» order|integer|true|none|排序|none| -|» locale|string|true|none|国际化键|none| - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## GET 获取菜单树 - -GET /menu - -获取所有的菜单,并根绝parentId建立一个菜单树 - -> 返回示例 - -> 200 Response - -```json -[ - { - "id": 0, - "label": "string", - "children": [ - { - "id": 0, - "label": "string", - "children": [ - { - "id": null, - "label": "string", - "children": [ - null - ], - "url": "string", - "component": "string", - "customIcon": "string", - "menuType": "string", - "parentId": "string", - "order": 0, - "locale": "string" - } - ], - "url": "string", - "component": "string", - "customIcon": "string", - "menuType": "string", - "parentId": "string", - "order": 0, - "locale": "string" - } - ], - "url": "string", - "component": "string", - "customIcon": "string", - "menuType": "string", - "parentId": "string", - "order": 0, - "locale": "string" - } -] -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|*anonymous*|[[ITreeNodeData](#schemaitreenodedata)]|false|none||none| -|» id|any|true|none|id|none| - -*anyOf* - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|»» *anonymous*|number|false|none||none| - -*or* - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|»» *anonymous*|string|false|none||none| - -*continued* - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» label|string|true|none|展示的标签|none| -|» children|[[ITreeNodeData](#schemaitreenodedata)]|false|none|子集菜单|none| -|»» id|any|true|none|id|none| -|»» label|string|true|none|展示的标签|none| -|»» children|[[ITreeNodeData](#schemaitreenodedata)]|false|none|子集菜单|none| -|»» url|string|true|none|访问路由|none| -|»» component|string|true|none|组件|none| -|»» customIcon|string|true|none|图标名|none| -|»» menuType|string|true|none|保留字段|none| -|»» parentId|string|true|none|父级id|none| -|»» order|integer|true|none|排序|none| -|»» locale|string|true|none|国际化键|none| -|» url|string|true|none|访问路由|none| -|» component|string|true|none|组件|none| -|» customIcon|string|true|none|图标名|none| -|» menuType|string|true|none|保留字段|none| -|» parentId|string|true|none|父级id|none| -|» order|integer|true|none|排序|none| -|» locale|string|true|none|国际化键|none| - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## POST 新增一个菜单 - -POST /menu - -> Body 请求参数 - -```json -{ - "order": 0, - "menuType": "string", - "name": "string", - "path": "string", - "component": "string", - "icon": "string", - "locale": "string", - "parentId": 0 -} -``` - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|body|body|object| 否 ||none| -|» order|body|number| 是 ||none| -|» menuType|body|string| 是 ||none| -|» name|body|string| 是 ||none| -|» path|body|string| 是 ||none| -|» component|body|string| 是 ||none| -|» icon|body|string| 是 ||none| -|» locale|body|string| 是 ||none| -|» parentId|body|number¦null| 否 ||none| - -> 返回示例 - -> 200 Response - -```json -{ - "id": 0, - "name": "string", - "order": 0, - "parentId": 0, - "menuType": "string", - "icon": "string", - "component": "string", - "path": "string", - "locale": "string" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[Menu](#schemamenu)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## PATCH 修改一个菜单 - -PATCH /menu - -> Body 请求参数 - -```json -{ - "order": 0, - "menuType": "string", - "name": "string", - "path": "string", - "component": "string", - "icon": "string", - "locale": "string", - "parentId": 0, - "id": 0 -} -``` - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|body|body|[UpdateMenuDTO](#schemaupdatemenudto)| 否 ||none| - -> 返回示例 - -> 200 Response - -```json -true -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|boolean| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## DELETE 删除一个菜单 - -DELETE /menu - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|id|query|integer| 否 ||菜单Id| -|parentId|query|integer| 否 ||父级菜单ID| - -> 返回示例 - -> 200 Response - -```json -{ - "id": 0, - "name": "string", - "order": 0, - "parentId": 0, - "menuType": "string", - "icon": "string", - "component": "string", - "path": "string", - "locale": "string" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[Menu](#schemamenu)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -# mock - -## GET GET 的mock方法 - -GET /mock - -> 返回示例 - -> 200 Response - -```json -"string" -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|string| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## POST POST的mock方法 - -POST /mock - -> 返回示例 - -> 200 Response - -```json -"string" -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|string| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -# lang - -## GET 获取所有语言 - -GET /lang - -> 返回示例 - -> 200 Response - -```json -[ - { - "id": 0, - "name": "string", - "i18": [ - { - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - {} - ] - }, - "key": "string", - "content": "string" - } - ] - } -] -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|Inline| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|*anonymous*|[[Lang](#schemalang)]|false|none||none| -|» 国际化字段对应的语言信息|[Lang](#schemalang)|false|none|国际化字段对应的语言信息|none| -|»» id|number|true|none|语言ID|none| -|»» name|string|true|none|语言名|none| -|»» i18|[[I18](#schemai18)]|true|none|对应的国际化词条|none| -|»»» id|number|true|none|国际化字段的自增id|none| -|»»» lang|[Lang](#schemalang)|true|none|国际化字段对应的语言信息|none| -|»»»» id|number|true|none|语言ID|none| -|»»»» name|string|true|none|语言名|none| -|»»»» i18|[[I18](#schemai18)]|true|none|对应的国际化词条|none| -|»»» key|string|true|none|国际化字段的键|none| -|»»» content|string|true|none|国际化字段的实际内容|none| - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## POST 增加一个语言 - -POST /lang - -> Body 请求参数 - -```json -{ - "name": "string" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|body|body|[CreateLang](#schemacreatelang)| 否 ||none| - -> 返回示例 - -> 200 Response - -```json -{ - "id": 0, - "name": "string", - "i18": [ - { - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - { - "id": null, - "lang": null, - "key": null, - "content": null - } - ] - }, - "key": "string", - "content": "string" - } - ] -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[Lang](#schemalang)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## PACH 修改一个语言 - -PACH /lang/{id} - -> Body 请求参数 - -```json -{ - "name": "string" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|id|path|string| 是 ||语言ID| -|body|body|[UpdateLang](#schemaupdatelang)| 否 ||none| - -> 返回示例 - -> 200 Response - -```json -{ - "id": 0, - "name": "string", - "i18": [ - { - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - { - "id": null, - "lang": null, - "key": null, - "content": null - } - ] - }, - "key": "string", - "content": "string" - } - ] -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[Lang](#schemalang)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -## DELETE 删除一个语言 - -DELETE /lang/{id} - -### 请求参数 - -|名称|位置|类型|必选|中文名|说明| -|---|---|---|---|---|---| -|id|path|number| 是 ||语言ID| - -> 返回示例 - -> 200 Response - -```json -{ - "id": 0, - "name": "string", - "i18": [ - { - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - { - "id": null, - "lang": null, - "key": null, - "content": null - } - ] - }, - "key": "string", - "content": "string" - } - ] -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|成功|[Lang](#schemalang)| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|401 未登录|Inline| -|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|403 权限不足|Inline| - -### 返回数据结构 - -状态码 **401** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|true|none||none| -|» message|string|true|none||none| - -状态码 **403** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» statusCode|number|false|none||none| -|» message|string|false|none||none| - -# 数据模型 - -

UpdateLang

- -
- - - - -```json -{ - "name": "string" -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|name|string|false|none|语言名|none| - -

CreateLang

- - - - - - -```json -{ - "name": "string" -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|name|string|true|none|语言名|none| - -

UpdateMenuDTO

- - - - - - -```json -{ - "order": 0, - "menuType": "string", - "name": "string", - "path": "string", - "component": "string", - "icon": "string", - "locale": "string", - "parentId": 0, - "id": 0 -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|order|number|true|none|序号|none| -|menuType|string|true|none|菜单类型|none| -|name|string|true|none|菜单键 |唯一| -|path|string|true|none|菜单路径|none| -|component|string|true|none|组件|none| -|icon|string|true|none|图标名|none| -|locale|string|true|none|国际化字段|展示用| -|parentId|number¦null|false|none|父级id|none| -|id|number|true|none|菜单id|none| - -

CreateMenuDTO

- - - - - - -```json -{ - "order": 0, - "menuType": "string", - "name": "string", - "path": "string", - "component": "string", - "icon": "string", - "locale": "string", - "parentId": 0 -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|order|number|true|none|序号|none| -|menuType|string|true|none|菜单类型|none| -|name|string|true|none|菜单键 |唯一| -|path|string|true|none|菜单路径|none| -|component|string|true|none|组件|none| -|icon|string|true|none|图标名|none| -|locale|string|true|none|国际化字段|展示用| -|parentId|number¦null|false|none|父级id|none| - -

UpdatePermissionDTO

- - - - - - -```json -{ - "name": "string", - "desc": "string", - "id": 0 -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|name|string|false|none|权限键|none| -|desc|string|false|none|权限介绍|none| -|id|integer|true|none|权限id|none| - -

CreatePermissionDTO

- - - - - - -```json -{ - "name": "string", - "desc": "string" -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|name|string|true|none|权限键|none| -|desc|string|true|none|权限介绍|none| - -

ITreeNodeData

- - - - - - -```json -{ - "id": 0, - "label": "string", - "children": [ - { - "id": 0, - "label": "string", - "children": [ - { - "id": null, - "label": "string", - "children": [ - {} - ], - "url": "string", - "component": "string", - "customIcon": "string", - "menuType": "string", - "parentId": "string", - "order": 0, - "locale": "string" - } - ], - "url": "string", - "component": "string", - "customIcon": "string", - "menuType": "string", - "parentId": "string", - "order": 0, - "locale": "string" - } - ], - "url": "string", - "component": "string", - "customIcon": "string", - "menuType": "string", - "parentId": "string", - "order": 0, - "locale": "string" -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|id|any|true|none|id|none| - -anyOf - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» *anonymous*|number|false|none||none| - -or - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» *anonymous*|string|false|none||none| - -continued - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|label|string|true|none|展示的标签|none| -|children|[[ITreeNodeData](#schemaitreenodedata)]|false|none|子集菜单|none| -|url|string|true|none|访问路由|none| -|component|string|true|none|组件|none| -|customIcon|string|true|none|图标名|none| -|menuType|string|true|none|保留字段|none| -|parentId|string|true|none|父级id|none| -|order|integer|true|none|排序|none| -|locale|string|true|none|国际化键|none| - -

User

- - - - - - -```json -{ - "id": "string", - "name": "string", - "email": "string", - "password": "string", - "role": [ - { - "id": "string", - "name": "string", - "permission": [ - { - "id": 0, - "desc": "string", - "name": "string" - } - ], - "menus": [ - { - "id": 0, - "name": "string", - "order": 0, - "parentId": 0, - "menuType": "string", - "icon": "string", - "component": "string", - "path": "string", - "locale": "string" - } - ] - } - ], - "department": "string", - "employeeType": "string", - "probationENd": "string", - "robationDuration": "string", - "protocolStart": "string", - "protocolEnd": "string", - "address": "string", - "status": 0, - "createTime": "string", - "updateTime": "string", - "create_time": "string", - "salt": "string", - "update_time": "string" -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|id|string|true|none|数据库自增id|none| -|name|string|true|none|用户名|none| -|email|string|true|none||登录邮箱| -|password|string|true|none|密码|none| -|role|[[Role](#schemarole)]|true|none|角色|none| -|department|string|true|none||1.1.0以前的遗留字段| -|employeeType|string|true|none||1.1.0以前的遗留字段| -|probationENd|string|true|none||1.1.0以前的遗留字段| -|robationDuration|string|true|none||1.1.0以前的遗留字段| -|protocolStart|string|true|none||1.1.0以前的遗留字段| -|protocolEnd|string|true|none||1.1.0以前的遗留字段| -|address|string|true|none||1.1.0以前的遗留字段| -|status|number|true|none|帐号状态|none| -|createTime|string|true|none||none| -|updateTime|string|true|none||none| -|create_time|string|true|none||none| -|salt|string|true|none|bcrypt盐|none| -|update_time|string|true|none||none| - -

Role

- - - - - - -```json -{ - "id": "string", - "name": "string", - "permission": [ - { - "id": 0, - "desc": "string", - "name": "string" - } - ], - "menus": [ - { - "id": 0, - "name": "string", - "order": 0, - "parentId": 0, - "menuType": "string", - "icon": "string", - "component": "string", - "path": "string", - "locale": "string" - } - ] -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|id|string|true|none|角色id|none| -|name|string|true|none|角色名|none| -|permission|[[Permission](#schemapermission)]|true|none|权限|none| -|menus|[[Menu](#schemamenu)]|true|none|菜单|none| - -

Menu

- - - - - - -```json -{ - "id": 0, - "name": "string", - "order": 0, - "parentId": 0, - "menuType": "string", - "icon": "string", - "component": "string", - "path": "string", - "locale": "string" -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|id|number|true|none|菜单id|none| -|name|string|true|none|菜单名|none| -|order|number|true|none|排序|none| -|parentId|number|false|none|父级id|none| -|menuType|string|true|none|保留字段|none| -|icon|string|false|none|图标名|none| -|component|string|true|none|组件名|none| -|path|string|true|none|路由路径|none| -|locale|string|true|none|国际化键|none| - -

Permission

- - - - - - -```json -{ - "id": 0, - "desc": "string", - "name": "string" -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|id|number|true|none|权限ID|none| -|desc|string|true|none|权限介绍|none| -|name|string|true|none|权限键|none| - -

PaginationOptionsRoutingLabels

- - - - - - -```json -{ - "limitLabel": "string", - "pageLabel": "string" -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|limitLabel|string|true|none||none| -|pageLabel|string|true|none||none| - - - - - - - - -```json -{ - "first": "string", - "previous": "string", - "next": "string", - "last": "string" -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|first|string|false|none||none| -|previous|string|false|none||none| -|next|string|false|none||none| -|last|string|false|none||none| - -

PaginationMeta

- - - - - - -```json -{ - "itemCount": 0, - "totalItems": 0, - "itemsPerPage": 0, - "currentPage": 0 -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|itemCount|number|false|none||none| -|totalItems|number|false|none||none| -|itemsPerPage|number|false|none||none| -|currentPage|number|false|none||none| - -

I18

- - - - - - -```json -{ - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - { - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - null - ] - }, - "key": "string", - "content": "string" - } - ] - }, - "key": "string", - "content": "string" -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|id|number|true|none|国际化字段的自增id|none| -|lang|[Lang](#schemalang)|true|none|国际化字段对应的语言信息|none| -|key|string|true|none|国际化字段的键|none| -|content|string|true|none|国际化字段的实际内容|none| - -

Lang

- - - - - - -```json -{ - "id": 0, - "name": "string", - "i18": [ - { - "id": 0, - "lang": { - "id": 0, - "name": "string", - "i18": [ - { - "id": null, - "lang": null, - "key": null, - "content": null - } - ] - }, - "key": "string", - "content": "string" - } - ] -} - -``` - -### 属性 - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|id|number|true|none|语言ID|none| -|name|string|true|none|语言名|none| -|i18|[[I18](#schemai18)]|true|none|对应的国际化词条|none| - diff --git "a/docs/\350\256\276\350\256\241\346\226\207\346\241\243.md" "b/docs/\350\256\276\350\256\241\346\226\207\346\241\243.md" deleted file mode 100644 index 4b8aaa5e..00000000 --- "a/docs/\350\256\276\350\256\241\346\226\207\346\241\243.md" +++ /dev/null @@ -1,93 +0,0 @@ -# TinyPro 接口文档 - -本文档旨在捋清TinyPro后端设计架构。 - -## 表设计 - -![](./imgs/TinyPro.png) - -## 专用术语 - -- 公开接口: 一个不需要Token的接口, 一般是登录接口. -- 非公开接口: 一个需要Token的接口, 当Token过期时必须返回401响应码. 错误报文格式请参考[异常格式](#异常格式) -- 保护接口: 一个需要相应权限的接口, 会从Token中读取用户Email, 如果Token过期则**必须**返回401响应码,如果用户**没有**相应的权限,**必须**返回一个403响应码,错误报文格式请参考[异常格式](#异常格式) - -## 请求示意图 - -### 公开接口请求示意图 - -```mermaid -sequenceDiagram - User->>+Server: 发送请求 - Server->>Server: 是公开接口 - Server->>Server: 处理请求 - Server-->>-User: 返回响应 -``` - -### 非公开接口请求示意图 - -#### 正常响应 - -如果用户Token合法且未过期则不会返回异常 - -```mermaid -sequenceDiagram - User->>+Server: 发送请求 - Server->>Server: 不是公开接口 - Server->>+AuthGuard: 用户Token - AuthGuard->>AuthGuard: Token合法 - AuthGuard->>AuthGuard: Token在Redis中未过期 - AuthGuard->>-Server: 放行 - Server->>Server: 处理请求 - Server-->>-User: 返回响应 -``` - -#### 异常响应 - -如果Token过期或异常则会返回异常响应 - -```mermaid -sequenceDiagram - User->>+Server: 发送请求 - Server->>Server: 不是公开接口 - Server->>+AuthGuard: 用户Token - AuthGuard->>AuthGuard: Token不合法 - AuthGuard-->> -User: 401 Token不合法 - - User->>+Server: 发送请求 - Server->>Server: 不是公开接口 - Server->>+AuthGuard: 用户Token - AuthGuard->>AuthGuard: Token合法 - AuthGuard->>AuthGuard: Token过期 - AuthGuard-->> -User: 401 登陆过期 -``` - -### 保护接口 - -#### 正常响应 - -```mermaid -sequenceDiagram - User->>+Server: 发送请求 - Server->>Server: 不是公开接口 - Server->>AuthGuard: Token - AuthGuard-->>Server: Token合法且未过期 - Server->>PermissionGuard: 是保护接口 - PermissionGuard->>PermissionGuard: 未设定权限或拥有相应权限 - PermissionGuard -->> Server: 放行 - Server ->> Server: 逻辑处理 - Server ->> -User: 响应 -``` - -#### 异常响应 - -```mermaid -sequenceDiagram - User->>+Server: 发送请求 - Server->>Server: 不是公开接口 - Server->>AuthGuard: Token - AuthGuard-->>Server: Token合法且未过期 - Server->>PermissionGuard: 是保护接口 - PermissionGuard->>PermissionGuard: 未拥有权限 - PermissionGuard-->>User: 权限不足 -```