1.用户查询接口
1.1 查询所有用户
请求路径:GET /users
接口描述:查询所有用户的基本信息及关联的角色、应用数据。
请求参数:无
响应数据:
{
"code": 1,
"msg": "success",
"data": [
{
"userId": "u001",
"account": "zhangwuji",
"userName": "张无忌",
"phone": "13812345678",
"organization": "明教",
"district": "光明顶",
"roles": [
{"roleId": "r001", "roleName": "管理员"}
],
"applications": [
{"appId": "a001", "appName": "无数据管理系统"}
],
"createdAt": "2023-10-01T10:00:00",
"updatedAt": "2023-10-01T10:00:00"
}
]
}
1.2 分页查询用户
请求路径:GET /users
接口描述:支持按姓名、账号分页查询用户。
请求参数:
参数名 | 类型 | 是否必须 | 示例 | 备注 |
---|---|---|---|---|
name | string | 否 | 张 | 用户姓名模糊查询 |
account | string | 否 | zhang | 账号模糊查询 |
page | number | 是 | 1 | 页码,默认1 |
pageSize | number | 是 | 10 | 每页条数,默认10 |
响应数据:
{
"code": 1,
"msg": "success",
"data": {
"total": 100,
"rows": [
{
"userId": "u001",
"account": "zhangwuji",
"userName": "张无忌",
"phone": "13812345678",
"createdAt": "2023-10-01T10:00:00"
}
]
}
}
1.3 根据ID查询用户详情
请求路径:GET /users/{userId}
接口描述:根据用户ID查询详细信息及关联的角色、应用。
请求参数:路径参数 userId
响应数据:
{
"code": 1,
"msg": "success",
"data": {
"userId": "u001",
"account": "zhangwuji",
"userName": "张无忌",
"phone": "13812345678",
"organization": "明教",
"district": "光明顶",
"roles": [
{"roleId": "r001", "roleName": "管理员"}
],
"applications": [
{"appId": "a001", "appName": "无数据管理系统"}
],
"createdAt": "2023-10-01T10:00:00",
"updatedAt": "2023-10-01T10:00:00"
}
}
2. 用户操作接口
2.1 新增用户
请求路径:POST /users
接口描述:新增用户并绑定角色和应用(需满足“绑定用户或角色必须且只能一个”的约束)。
请求参数(Body/JSON):
{
"account": "zhouzhiruo",
"password": "123456",
"userName": "周芷若",
"phone": "13987654321",
"organization": "峨眉派",
"district": "峨眉山",
"roleIds": ["r002"],
"appIds": []
}
字段名 类型 是否必须 备注
roleIds string[] 是 角色ID列表,与appIds二选一绑定
appIds string[] 是 应用ID列表,与roleIds二选一绑定
响应数据:
{
"code": 1,
"msg": "用户创建成功",
"data": null
}
2.2 修改用户信息
请求路径:PUT /users/{userId}
接口描述:修改用户基本信息及重新绑定角色/应用。
请求参数(Body/JSON):
{
"userName": "小昭",
"phone": "13512345678",
"organization": "波斯明教",
"roleIds": ["r003"],
"appIds": []
}
响应数据:
{
"code": 1,
"msg": "用户信息更新成功",
"data": null
}
2.3 删除用户
请求路径:DELETE /users/{userId}
接口描述:根据用户ID删除用户及关联的角色、应用绑定关系。
请求参数:路径参数 userId
响应数据:
{
"code": 1,
"msg": "用户删除成功",
"data": null
}
3. 角色查询接口
3.1 查询所有角色
请求路径:GET /roles
接口描述:查询所有角色及其关联的菜单权限信息。
请求参数:无
响应数据:
{
"code": 1,
"msg": "success",
"data": [
{
"roleId": "r001",
"roleName": "管理员",
"dataScope": "all",
"menus": [
{"menuId": "m001", "menuName": "用户管理", "children": [
{"menuId": "m00101", "menuName": "新增用户"},
{"menuId": "m00102", "menuName": "删除用户"}
]}
],
"remark": "系统最高权限角色",
"createTime": "2023-10-01T10:00:00"
}
]
}
3.2 分页查询角色
请求路径:GET /roles
接口描述:支持按角色名称分页查询角色列表。
请求参数:
参数名 类型 是否必须 示例 备注
roleName string 否 管理 角色名称模糊查询
page number 是 1 页码,默认1
pageSize number 是 10 每页条数,默认10
响应数据:
{
"code": 1,
"msg": "success",
"data": {
"total": 5,
"rows": [
{
"roleId": "r001",
"roleName": "管理员",
"dataScope": "all",
"createTime": "2023-10-01T10:00:00"
}
]
}
}
3.3 根据ID查询角色详情
请求路径:GET /roles/{roleId}
接口描述:根据角色ID查询角色详情及关联的菜单权限树。
请求参数:路径参数 roleId
响应数据:
{
"code": 1,
"msg": "success",
"data": {
"roleId": "r001",
"roleName": "管理员",
"dataScope": "all",
"menus": [
{"menuId": "m001", "menuName": "用户管理", "children": [
{"menuId": "m00101", "menuName": "新增用户"},
{"menuId": "m00102", "menuName": "删除用户"}
]}
],
"remark": "系统最高权限角色",
"createTime": "2023-10-01T10:00:00"
}
}
- 角色操作接口
4.1 新增角色
请求路径:POST /roles
接口描述:新增角色并绑定菜单权限(需校验角色名称唯一性)。
请求参数(Body/JSON):
{
"roleName": "数据管理员",
"dataScope": "all",
"remark": "负责数据治理",
"menuIds": ["m001", "m00101", "m00102"]
}
字段名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
menuIds | string[] | 必须 | 绑定的菜单ID列表(支持多级) |
响应数据:
{
"code": 1,
"msg": "角色创建成功",
"data": null
}
3.4 修改角色
请求路径:PUT /roles/{roleId}
接口描述:修改角色信息并重新绑定菜单权限。
请求参数(Body/JSON):
{
"roleName": "数据管理员(更新)",
"dataScope": "all",
"remark": "更新后的角色描述",
"menuIds": ["m001", "m00101", "m00103"]
}
响应数据:
{
"code": 1,
"msg": "角色信息更新成功",
"data": null
}
3.5 删除角色
请求路径:DELETE /roles/{roleId}
接口描述:根据角色ID删除角色及关联的权限绑定。
请求参数:路径参数 roleId
响应数据:
{
"code": 1,
"msg": "角色删除成功",
"data": null
}
接口设计说明
菜单权限绑定逻辑:
新增/修改角色时,通过 menuIds 传递完整的菜单ID列表(包括父菜单和子菜单),后端需覆盖原有权限。
菜单层级关系通过 sys_menu 表的 parent_id 字段维护,接口响应中自动构建树形结构。
数据权限扩展性:
dataScope 字段当前仅支持 all,未来可扩展为 partial 或其他类型,需同步更新枚举值。
参数校验规则:
角色名称 (roleName) 需全局唯一,提交时后端需校验。
菜单ID (menuIds) 必须存在于 sys_menu 表中,否则返回错误提示。
级联删除:
删除角色时,级联删除 sys_role_menu 表中的关联记录,确保数据一致性。
4. 应用查询接口
4.1 查询所有应用
请求路径:GET /applications
接口描述:查询所有应用的基本信息列表。
请求参数:无
响应数据:
{
"code": 1,
"msg": "success",
"data": [
{
"appId": "a001",
"appType": "平台应用",
"appName": "无数据管理系统",
"appIcon": "/icons/app001.png",
"appVersion": "1.0.0",
"appUrl": "https://app.example.com",
"appDescription": "数据治理核心平台",
"createdAt": "2023-10-01T10:00:00",
"updatedAt": "2023-10-01T10:00:00",
"appStatus": "01"
}
]
}
4.2 分页查询应用
请求路径:GET /applications
接口描述:支持按应用名称分页查询应用列表。
请求参数:
参数名 | 类型 | 是否必须 | 示例 | 备注 |
---|---|---|---|---|
appName | string | 否 | 数据 | 应用名称模糊查询 |
page | number | 是 | 1 | 页码,默认1 |
pageSize | number | 是 | 10 | 每页条数,默认10 |
响应数据:
{
"code": 1,
"msg": "success",
"data": {
"total": 5,
"rows": [
{
"appId": "a001",
"appName": "无数据管理系统",
"appType": "平台应用",
"appVersion": "1.0.0",
"createdAt": "2023-10-01T10:00:00",
"appStatus": "01"
}
]
}
}
4.3 根据ID查询应用详情
请求路径:GET /applications/{appId}
接口描述:根据应用ID查询应用的详细信息。
请求参数:路径参数 appId
响应数据:
{
"code": 1,
"msg": "success",
"data": {
"appId": "a001",
"appType": "平台应用",
"appName": "无数据管理系统",
"appIcon": "/icons/app001.png",
"appVersion": "1.0.0",
"appUrl": "https://app.example.com",
"appDescription": "数据治理核心平台",
"createdAt": "2023-10-01T10:00:00",
"updatedAt": "2023-10-01T10:00:00",
"appStatus": "01"
}
}
4.4 新增应用
请求路径:POST /applications
接口描述:创建新应用,需校验应用名称唯一性。
请求参数(Body/JSON):
{
"appType": "平台应用",
"appName": "数据监控系统",
"appIcon": "/icons/app002.png",
"appVersion": "2.0.0",
"appUrl": "https://monitor.example.com",
"appDescription": "实时数据监控平台",
"appStatus": "01"
}
字段名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
appType | string | 必须 | 枚举值:平台应用/三方应用 |
appName | string | 必须 | 全局唯一 |
appIcon | string | 否 | 图标路径或URL |
appVersion | string | 必须 | 版本号(如1.0.0) |
appUrl | string | 必须 | 应用访问地址 |
appDescription | string | 否 | 应用简介 |
响应数据:
{
"code": 1,
"msg": "应用创建成功",
"data": null
}
4.5 修改应用信息
请求路径:PUT /applications/{appId}
接口描述:根据应用ID更新应用信息。
请求参数(Body/JSON):
{
"appType": "三方应用",
"appName": "数据监控系统(更新)",
"appIcon": "/icons/app002_new.png",
"appVersion": "2.1.0",
"appUrl": "https://monitor-v2.example.com",
"appDescription": "优化后的监控平台",
"appStatus": "01"
}
响应数据:
{
"code": 1,
"msg": "应用信息更新成功",
"data": null
}
4.6 删除应用
请求路径:DELETE /applications/{appId}
接口描述:根据应用ID删除应用。
请求参数:路径参数 appId
响应数据:
{
"code": 1,
"msg": "应用删除成功",
"data": null
}
接口设计说明
唯一性校验:
appName 字段需全局唯一,新增和修改时后端需校验,若重复返回错误码 0 及提示信息。
枚举值约束:
appType 仅接受 平台应用 或 三方应用,其他值视为无效。
时间字段:
createdAt 和 updatedAt 由数据库自动生成,格式为 yyyy-MM-ddTHH:mm:ss。
扩展性:
若需支持更多应用类型,可扩展 appType 的枚举值,并同步更新接口文档。
安全性:
删除应用时需级联删除关联的 用户-应用绑定 记录(通过外键约束实现)。
5. 菜单查询接口
5.1 查询所有菜单(平铺结构)
请求路径:GET /menus
接口描述:获取所有菜单的平铺列表(非树形)。
请求参数:无
响应数据:
{
"code": 1,
"msg": "success",
"data": [
{
"menuId": "m001",
"menuName": "用户管理",
"parentId": "0",
"menuType": "1"
},
{
"menuId": "m00101",
"menuName": "新增用户",
"parentId": "m001",
"menuType": "2"
}
]
}
5.2 分页查询菜单
请求路径:GET /menus
接口描述:支持按菜单名称分页查询。
请求参数:
参数名 | 类型 | 是否必须 | 示例 | 备注 |
---|---|---|---|---|
menuName | string | 否 | 用户 | 菜单名称模糊查询 |
page | number | 是 | 1 | 页码,默认1 |
pageSize | number | 是 | 10 | 每页条数,默认10 |
响应数据:
{
"code": 1,
"msg": "success",
"data": {
"total": 20,
"rows": [
{
"menuId": "m001",
"menuName": "用户管理",
"parentId": "0",
"menuType": "1"
}
]
}
}
5.3 根据ID查询菜单详情
请求路径:GET /menus/{menuId}
接口描述:根据菜单ID查询菜单详细信息。
请求参数:路径参数 menuId
响应数据:
{
"code": 1,
"msg": "success",
"data": {
"menuId": "m001",
"menuName": "用户管理",
"parentId": "0",
"menuType": "1"
}
}
5.4 查询菜单树形结构
请求路径:GET /menus/tree
接口描述:以树形层级结构返回所有菜单。
请求参数:无
响应数据:
{
"code": 1,
"msg": "success",
"data": [
{
"menuId": "m001",
"menuName": "用户管理",
"menuType": "1",
"children": [
{
"menuId": "m00101",
"menuName": "新增用户",
"menuType": "2"
}
]
}
]
}
5.5 新增菜单
请求路径:POST /menus
接口描述:创建新菜单,需校验菜单名称唯一性及父菜单合法性。
请求参数(Body/JSON):
{
"menuName": "删除用户",
"parentId": "m001",
"menuType": "2"
}
字段名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
parentId | string | 是 | 父菜单ID(0表示根节点) |
menuName | string | 是 | 菜单名称(唯一) |
menuType | string | 是 | 类型:1(菜单)或 2(按钮) |
响应数据:
{
"code": 1,
"msg": "菜单创建成功",
"data": null
}
5.6 修改菜单信息
请求路径:PUT /menus/{menuId}
接口描述:根据菜单ID更新菜单信息。
请求参数(Body/JSON):
{
"menuName": "删除用户(更新)",
"parentId": "m001",
"menuType": "2"
}
响应数据:
{
"code": 1,
"msg": "菜单信息更新成功",
"data": null
}
5.7 删除菜单
请求路径:DELETE /menus/{menuId}
接口描述:根据菜单ID删除菜单(若存在子菜单则禁止删除)。
请求参数:路径参数 menuId
响应数据:
{
"code": 1,
"msg": "菜单删除成功",
"data": null
}
接口设计说明
树形结构生成:
树形接口通过递归查询 parentId 构建层级结构,确保前端可直接渲染树形组件。
参数校验规则:
menuType 必须为 1 或 2,按钮类型(2)不允许有子菜单。
parentId 必须存在且类型为菜单(1),根节点 parentId 设为 0。
级联删除限制:
若菜单包含子菜单,删除时返回错误码 0 及提示信息:“存在子菜单,禁止删除”。
唯一性约束:
menuName 全局唯一,新增/修改时校验重复性。
扩展性:
支持通过 menuType 扩展更多类型(如“接口”类型)。
6. 用户登录
6.1 用户登录
请求路径:POST /auth/login
接口描述:用户通过账号和密码登录系统,返回用户基本信息和访问令牌(Token)。
请求参数(Body/JSON):
{
"account": "zhangwuji",
"password": "123456"
}
字段名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
account | string | 必须 | 用户账号 |
password | string | 必须 密码(明文传输) |
响应数据:
{
"code": 1,
"msg": "登录成功",
"data": {
"userId": "u001",
"userName": "张无忌",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx"
}
}
字段名 | 类型 | 备注 |
---|---|---|
token | string | JWT令牌,用于后续接口鉴权 |
7. 文件上传
7.1 上传文件
请求路径:POST /files/upload
接口描述:上传文件到服务器,返回文件访问路径(需携带Token鉴权)。
请求头:
字段名 | 类型 | 是否必须 | 示例值 |
---|---|---|---|
Authorization | string | 必须 | Bearer eyJhbGciOiJIUzI1Ni… |
请求参数(Body/form-data):
字段名 类型 是否必须 备注
file file 必须 上传的文件
响应数据:
{
"code": 1,
"msg": "文件上传成功",
"data": {
"fileUrl": "https://example.com/files/20231001/xxxxx.png"
}
}
接口设计说明
登录接口
密码加密:
前端传输密码时需加密(如使用RSA公钥加密),后端解密后与数据库中的BCrypt哈希值匹配。
Token生成:
使用JWT生成令牌,包含用户ID和有效期(如24小时)。
密钥需存储在服务端安全配置中。
错误码示例:
code=0, msg=“账号或密码错误”
code=0, msg=“账号不存在”
文件上传接口
文件存储规则:
文件保存路径格式:/存储目录/日期/唯一文件名.扩展名(如/files/20231001/uuid_image.png)。
文件名使用UUID重命名,避免冲突。
安全校验:
限制文件类型(如仅允许图片、文档)。
限制文件大小(如最大10MB)。
访问路径:
返回完整URL,例如结合CDN或静态资源服务器地址。
注意事项
HTTPS:所有接口需通过HTTPS调用,确保传输安全。
Token有效期:建议前端在Token过期时自动跳转登录页。
文件清理:定期清理无效或过期文件,避免存储空间浪费。
错误处理:
文件上传失败时返回具体原因(如code=0, msg=“文件大小超过限制”)。
Token无效时返回 code=401, msg=“未授权”。