鉴权改为登录态回库校验,新增 tokenValidAfter 失效时间,支持密码变更与 seed 重置后旧 token 立即失效 患者字段由 idCardHash 统一迁移为 idCard,新增身份证标准化逻辑并同步 C 端生命周期查询参数 组织模块增加小组删除限制(有成员时返回 409)并补充中文错误消息 任务取消接口支持可选 reason 字段(先透传事件层) 补齐 Prisma 迁移、文档说明和 E2E 用例(含设备模块与 token 失效场景)
68 lines
2.0 KiB
JavaScript
68 lines
2.0 KiB
JavaScript
import axios from 'axios';
|
||
import { ElMessage } from 'element-plus';
|
||
import { useUserStore } from '../store/user';
|
||
import router from '../router';
|
||
|
||
const service = axios.create({
|
||
// 开发环境默认走 Vite /api 代理,生产环境可用环境变量覆盖。
|
||
baseURL: import.meta.env.VITE_API_BASE_URL || '/api',
|
||
timeout: 10000,
|
||
});
|
||
|
||
// 请求拦截:统一挂载 Bearer Token,避免各页面重复拼接鉴权头。
|
||
service.interceptors.request.use(
|
||
(config) => {
|
||
const userStore = useUserStore();
|
||
if (userStore.token) {
|
||
config.headers['Authorization'] = `Bearer ${userStore.token}`;
|
||
}
|
||
return config;
|
||
},
|
||
(error) => {
|
||
return Promise.reject(error);
|
||
},
|
||
);
|
||
|
||
// 响应拦截:对齐后端统一响应包裹 { code, msg, data }。
|
||
service.interceptors.response.use(
|
||
(response) => {
|
||
const res = response.data;
|
||
|
||
// 后端成功响应统一为 code=0;这里兼容少量 code=2xx 的历史结构。
|
||
if (res.code === 0 || (res.code >= 200 && res.code < 300)) {
|
||
return res.data;
|
||
} else {
|
||
ElMessage.error(res.msg || '请求失败');
|
||
return Promise.reject(new Error(res.msg || 'Error'));
|
||
}
|
||
},
|
||
(error) => {
|
||
const userStore = useUserStore();
|
||
let message = error.message;
|
||
|
||
if (error.response) {
|
||
const { status, data } = error.response;
|
||
message = data?.msg || message;
|
||
|
||
if (status === 401) {
|
||
// 401 统一视为登录态失效,先清理本地态再跳登录页。
|
||
userStore.logout();
|
||
router.push(
|
||
`/login?redirect=${encodeURIComponent(router.currentRoute.value.fullPath)}`,
|
||
);
|
||
ElMessage.error(message || '登录状态已过期,请重新登录');
|
||
return Promise.reject(new Error('Unauthorized'));
|
||
} else if (status === 403) {
|
||
ElMessage.error(message || '没有权限执行该操作');
|
||
} else {
|
||
ElMessage.error(message || '请求失败');
|
||
}
|
||
} else {
|
||
ElMessage.error(message || '网络连接异常');
|
||
}
|
||
return Promise.reject(error);
|
||
},
|
||
);
|
||
|
||
export default service;
|