EL 6ec2d0b0e0 新增 B 端设备模块(后端 CRUD、分页筛选、权限隔离)并接入前端设备管理页面与路由菜单
鉴权改为登录态回库校验,新增 tokenValidAfter 失效时间,支持密码变更与 seed 重置后旧 token 立即失效
患者字段由 idCardHash 统一迁移为 idCard,新增身份证标准化逻辑并同步 C 端生命周期查询参数
组织模块增加小组删除限制(有成员时返回 409)并补充中文错误消息
任务取消接口支持可选 reason 字段(先透传事件层)
补齐 Prisma 迁移、文档说明和 E2E 用例(含设备模块与 token 失效场景)
2026-03-18 20:23:55 +08:00

68 lines
2.0 KiB
JavaScript
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.

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;