大屏项目初始化

This commit is contained in:
2026-03-08 16:52:55 +08:00
parent 444e65c524
commit 2c81b1478c
21 changed files with 424 additions and 75 deletions

View File

@@ -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('文件下载失败,请稍后重试');
}
}