大屏项目初始化
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import axios from 'axios'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import router from '@/router'
|
||||
|
||||
const service = axios.create({
|
||||
@@ -39,27 +39,32 @@ service.interceptors.response.use(
|
||||
(response) => {
|
||||
const res = response.data;
|
||||
|
||||
// 1. 处理登录失效
|
||||
if (response.config.responseType === 'blob') {
|
||||
return handleFileExport(response);
|
||||
}
|
||||
|
||||
if (res.code === 401) {
|
||||
handleLoginExpired();
|
||||
return Promise.reject(res);
|
||||
}
|
||||
|
||||
// 2. 处理业务成功
|
||||
if (res.code === 200) {
|
||||
return res.data;
|
||||
}
|
||||
|
||||
// 3. 处理其他业务错误(如500)
|
||||
ElMessage.error(res.msg || '请求失败');
|
||||
return Promise.reject(res);
|
||||
},
|
||||
(error) => {
|
||||
const requestUrl = error?.config?.url || '';
|
||||
const isWhite = WHITE_LIST.some(item => requestUrl.includes(item));
|
||||
|
||||
if (error.config?.responseType === 'blob') {
|
||||
handleFileExportError(error);
|
||||
return Promise.reject(error);
|
||||
}
|
||||
|
||||
if (isWhite) {
|
||||
const errMsg = error?.response?.data?.msg || '登录请求失败,请检查网络或账号信息';
|
||||
const errMsg = error?.response?.data?.msg || '登录请求失败,请检查网络或账号信息';
|
||||
ElMessage.error(errMsg);
|
||||
return Promise.reject(error);
|
||||
}
|
||||
@@ -70,7 +75,7 @@ service.interceptors.response.use(
|
||||
}
|
||||
|
||||
if (!error.response) {
|
||||
ElMessage.error('网络异常,请检查网络连接后重试');
|
||||
ElMessage.error('网络异常,请检查网络连接后重试');
|
||||
return Promise.reject(error);
|
||||
}
|
||||
|
||||
@@ -82,7 +87,79 @@ function handleLoginExpired() {
|
||||
localStorage.removeItem('token');
|
||||
if (router.currentRoute.path !== '/login') {
|
||||
router.push('/login').catch(() => {});
|
||||
ElMessage.error('登录已失效,请重新登录');
|
||||
ElMessage.error('登录已失效,请重新登录');
|
||||
}
|
||||
}
|
||||
|
||||
function handleFileExport(response) {
|
||||
const blob = response.data;
|
||||
const defaultFileName = 'file.xlsx';
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!blob || blob.size === 0) {
|
||||
ElMessage.error('文件大小异常,请稍后重试');
|
||||
reject(new Error('文件内容为空'));
|
||||
return;
|
||||
}
|
||||
const reader = new FileReader();
|
||||
reader.onerror = function() {
|
||||
reject(new Error('文件解析失败'));
|
||||
};
|
||||
reader.onload = function() {
|
||||
try {
|
||||
const res = JSON.parse(reader.result);
|
||||
ElMessage.error(res.msg || '文件下载失败');
|
||||
reject(res);
|
||||
} catch (e) {
|
||||
let fileName = defaultFileName;
|
||||
const disposition = response.headers['content-disposition'];
|
||||
if (disposition) {
|
||||
const match = disposition.match(/filename\*=UTF-8''(.+)/i);
|
||||
if (match && match[1]) {
|
||||
fileName = decodeURIComponent(match[1]);
|
||||
}
|
||||
}
|
||||
if (response.config.downloadFileName) {
|
||||
fileName = typeof response.config.downloadFileName === 'function'
|
||||
? response.config.downloadFileName(response)
|
||||
: response.config.downloadFileName;
|
||||
}
|
||||
|
||||
try {
|
||||
const url = window.URL.createObjectURL(blob);
|
||||
const link = document.createElement('a');
|
||||
link.target = '_blank';
|
||||
link.rel = 'noopener noreferrer';
|
||||
link.href = url;
|
||||
link.setAttribute('download', fileName);
|
||||
document.body.appendChild(link);
|
||||
const clickEvent = new MouseEvent('click', {
|
||||
bubbles: true,
|
||||
cancelable: true,
|
||||
view: window
|
||||
});
|
||||
link.dispatchEvent(clickEvent);
|
||||
setTimeout(() => {
|
||||
document.body.removeChild(link);
|
||||
window.URL.revokeObjectURL(url);
|
||||
}, 100);
|
||||
resolve(blob);
|
||||
} catch (downloadError) {
|
||||
ElMessage.error('文件下载失败,请手动重试');
|
||||
reject(downloadError);
|
||||
}
|
||||
}
|
||||
};
|
||||
reader.readAsText(blob);
|
||||
});
|
||||
}
|
||||
|
||||
function handleFileExportError(error) {
|
||||
if (error.response?.status === 401) {
|
||||
handleLoginExpired();
|
||||
} else if (error.message.includes('timeout')) {
|
||||
ElMessage.error('文件下载超时,请稍后重试');
|
||||
} else {
|
||||
ElMessage.error('文件下载失败,请稍后重试');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user