请求与登录状态
请求封装
src/utils/request.ts 创建统一 Axios 实例:
- 开发环境基础地址为
/api。 - 默认超时 10 秒。
- 数组查询参数使用同名参数重复提交。
- 空字符串、
null和undefined不进入查询字符串。 - JSON 默认使用
application/json;charset=utf-8。 FormData请求交给浏览器自动生成 multipart boundary。
Token 注入
除显式 skipAuth 的请求外,如果本地存在 Token,请求头会增加:
http
Authorization: Bearer <token>本地存储只用于保持页面会话,后端仍通过 JWT 和 Redis 服务端 Token 决定是否有效。
登录初始化
登录成功后不是立即只显示成功提示,而是继续获取:
mine:当前用户、角色和权限字符串。mineResources:当前用户资源树。
两者都成功后才完成认证上下文初始化。如果初始化失败,前端清除刚保存的 Token,避免同时出现“登录成功”和“认证失败”。
并发路由进入时复用同一个初始化 Promise,防止重复调用用户和资源接口。
401
HTTP 401 或业务码 401 会进入统一未认证处理。全局状态保证同一批并发失败只执行一次:
- 提示登录状态失效。
- 清除 Token 和权限状态。
- 清空页签。
- 跳转登录页。
登录页、首页和个人中心不依赖角色菜单权限。即使用户没有任何有效角色,也必须能够进入个人中心并退出登录。
403
403 表示已经登录但缺少接口权限:
- 不清除 Token。
- 不跳转登录页。
- 页面展示后端权限提示。
- 管理员检查对应
api:资源授权。
下载请求
文件下载返回 Blob,错误时后端可能返回 JSON。下载工具应先判断响应类型:
- 二进制:触发浏览器保存。
- JSON:解析业务码和 message。
- 401:进入统一登录失效。
- 403:提示权限不足。
预览接口与下载接口保持不同 Content-Disposition,不使用下载逻辑强行处理图片预览。
可选请求参数
页面需要正常调用的接口不要先用前端权限判断阻止请求;后端是最终鉴权边界。只有按钮、菜单等展示元素才根据视图权限隐藏或禁用。