减少冗余代码
This commit is contained in:
49
src/utils/format.js
Normal file
49
src/utils/format.js
Normal file
@@ -0,0 +1,49 @@
|
||||
/**
|
||||
* 补全 URL 协议头,防止无效跳转
|
||||
*/
|
||||
export function formatUrl(url) {
|
||||
if (!url || typeof url !== 'string') return '#'
|
||||
if (url.startsWith('http://') || url.startsWith('https://')) return url
|
||||
return `http://${url}`
|
||||
}
|
||||
|
||||
/**
|
||||
* 将日期字符串或时间戳转换为 YYYY-MM-DD 格式
|
||||
*/
|
||||
export function formatDate(time) {
|
||||
if (!time || time === '0') return '-'
|
||||
|
||||
if (typeof time === 'string' && time.includes('-')) {
|
||||
return time.slice(0, 10)
|
||||
}
|
||||
|
||||
const timestamp = Number(time)
|
||||
if (!isNaN(timestamp) && timestamp > 0) {
|
||||
const date = new Date(timestamp * 1000)
|
||||
if (!isNaN(date.getTime())) {
|
||||
const y = date.getFullYear()
|
||||
const m = (date.getMonth() + 1).toString().padStart(2, '0')
|
||||
const d = date.getDate().toString().padStart(2, '0')
|
||||
return `${y}-${m}-${d}`
|
||||
}
|
||||
}
|
||||
|
||||
return '-'
|
||||
}
|
||||
|
||||
/**
|
||||
* 将时间转换为 MM-DD HH:mm 格式
|
||||
*/
|
||||
export function formatDateTime(time) {
|
||||
if (!time) return '-'
|
||||
if (typeof time === 'string' && time.includes('-')) return time
|
||||
|
||||
const date = new Date(time)
|
||||
if (isNaN(date.getTime())) return '-'
|
||||
|
||||
const m = (date.getMonth() + 1).toString().padStart(2, '0')
|
||||
const d = date.getDate().toString().padStart(2, '0')
|
||||
const h = date.getHours().toString().padStart(2, '0')
|
||||
const i = date.getMinutes().toString().padStart(2, '0')
|
||||
return `${m}-${d} ${h}:${i}`
|
||||
}
|
||||
@@ -1,72 +1,52 @@
|
||||
import axios from 'axios'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import router from '@/router'
|
||||
import router, { resetRouter } from '@/router'
|
||||
|
||||
const service = axios.create({
|
||||
baseURL: '/api',
|
||||
timeout: 10000
|
||||
})
|
||||
|
||||
// 标记位,防止重复弹窗
|
||||
let isRelogging = false
|
||||
|
||||
// 请求拦截器
|
||||
service.interceptors.request.use(
|
||||
config => {
|
||||
// 自动获取 Token(兼顾两种存储方式)
|
||||
const token = localStorage.getItem('token') || sessionStorage.getItem('token')
|
||||
if (token) {
|
||||
config.headers['Authorization'] = `Bearer ${token}`
|
||||
}
|
||||
return config
|
||||
},
|
||||
error => Promise.reject(error)
|
||||
)
|
||||
function createService(basePath) {
|
||||
const service = axios.create({
|
||||
baseURL: `/api/${basePath}`,
|
||||
timeout: 10000,
|
||||
withCredentials: true,
|
||||
})
|
||||
|
||||
// 响应拦截器
|
||||
service.interceptors.response.use(
|
||||
|
||||
// 接口请求返回状态码是200,进入第一个
|
||||
response => {
|
||||
const token = response.headers['Authorization'];
|
||||
if (token) {
|
||||
localStorage.setItem('token', token);
|
||||
}
|
||||
return response.data;
|
||||
},
|
||||
error => {
|
||||
const resData = error.response?.data;
|
||||
const status = error.response?.status;
|
||||
console.log("返回状态码", status);
|
||||
service.interceptors.response.use(
|
||||
response => response.data,
|
||||
|
||||
|
||||
// 1. 判定是否为 Token 相关的认证错误
|
||||
// 包含 500 状态码且消息含有 token 字样(如 decode 失败、过期等)
|
||||
if (status === 401) {
|
||||
error => {
|
||||
const resData = error.response?.data
|
||||
const status = error.response?.status
|
||||
|
||||
if (!isRelogging) {
|
||||
isRelogging = true; // 锁定
|
||||
// session过期处理
|
||||
if (status === 401) {
|
||||
if (!isRelogging) {
|
||||
isRelogging = true
|
||||
|
||||
localStorage.removeItem('token');
|
||||
// 清除用户信息,防止 UserView.vue 的 computed 报错
|
||||
localStorage.removeItem('user_info');
|
||||
resetRouter()
|
||||
|
||||
ElMessage.error('登录已失效,请重新登录');
|
||||
ElMessage.error('登录已过期,请重新登录')
|
||||
|
||||
router.push('/login').then(() => {
|
||||
// 2. 延迟解锁,确保页面跳转期间的所有并发请求都已返回并被此拦截器捕获
|
||||
setTimeout(() => {
|
||||
isRelogging = false;
|
||||
}, 3000);
|
||||
});
|
||||
router.push({
|
||||
name: 'login',
|
||||
query: { redirect: router.currentRoute.value.fullPath }
|
||||
}).finally(() => {
|
||||
isRelogging = false
|
||||
})
|
||||
}
|
||||
return new Promise(() => { })
|
||||
}
|
||||
|
||||
return new Promise(() => { });
|
||||
const msg = resData?.message || '服务器响应异常'
|
||||
ElMessage.error(msg)
|
||||
return Promise.reject(error)
|
||||
}
|
||||
)
|
||||
|
||||
const msg = resData?.message || '服务器响应异常';
|
||||
ElMessage.error(msg);
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
export default service
|
||||
return service
|
||||
}
|
||||
|
||||
export const adminRequest = createService('admin')
|
||||
export const indexRequest = createService('index')
|
||||
export default adminRequest
|
||||
Reference in New Issue
Block a user