Mock代理配置
Vite.config.ts中配置
ts
// 设置代理服务器
server: {
proxy: {
'/app-dev': {
target: 'http://jdgz.xwydl.com:8310',
// target: 'http://192.168.0.109:8310',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/app-dev/, ''),
},
'/app-prod': {
target: 'env.VITE_API_URL',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/app-dev/, ''),
},
'/mock': {
target: 'http://192.168.1.38:4060',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/mock/, '/mock/11'),
},
}
},新增工具类
mock-request.ts
ts
import axios, { type AxiosResponse } from 'axios';
import { ElMessage, ElMessageBox } from 'element-plus';
import pinia from '@/stores/index';
import { useUserInfoStore } from '../stores/userInfo';
/* 定义response对象的data接口 */
interface ResponseData<T> {
code: number;
data: T;
message: string;
}
// 配置新建一个 axios 实例
const service = axios.create({
baseURL: '/mock',
timeout: 50000,
});
// 添加请求拦截器
service.interceptors.request.use(
(config:any) => {
// 获取用户仓库
const userInfo = useUserInfoStore(pinia)
const token = userInfo.token
// 请求头中添加token
config.headers['X-Token'] = token
// 返回请求配置项
return config;
}
);
// 添加响应拦截器
service.interceptors.response.use(
/* 约束一下response */
async (response: AxiosResponse<ResponseData<any>>) => {
// 对响应数据简化数据
const res = response.data;
// 排除二进制响应
if(response.config.responseType== "arraybuffer"){
// 放行
return response;
}
/* 成功数据的code值为0 */
if (res.code !== 0) {
// 统一的错误提示
ElMessage({
message: (typeof res.data == 'string' && res.data) || res.message || 'Error',
type: 'error',
duration: 5 * 1000
})
// `token` 过期或者账号已在别处登录
if (response.status === 401) {
const storeUserInfo = useUserInfoStore(pinia)
await storeUserInfo.reset()
window.location.href = '/' // 去登录页
ElMessageBox.alert('你已被登出,请重新登录', '提示', {})
.then(() => { })
.catch(() => { })
}
return Promise.reject(service.interceptors.response);
} else {
return res.data; /* 返回成功响应数据中的data属性数据 */
}
},
(error) => {
// 对响应错误做点什么
if (error.message.indexOf('timeout') != -1) {
ElMessage.error('网络超时');
} else if (error.message == 'Network Error') {
ElMessage.error('网络连接错误');
} else {
if (error.response.data) ElMessage.error(error.response.statusText);
else ElMessage.error('接口路径找不到');
}
return Promise.reject(error);
}
);
export default service;在 api 中
device.ts
ts
import request from '@/utils/request' // 生产
import mockrequest from '@/utils/mock-request' // mock
enum API {
// 设备列表
DEVICELIST = "/api/core/device/list",
// 设备在线离线数量统计
DEVICECNT = "/api/core/device/dash/count",
// 设备告警日志(汇总前)
DEVICEALARMLOG = "/api/core/device/dash/alarm/info",
}
// get+query 形式
export const reqDeviceCnt = (params: any) => request.get<any, any>(API.DEVICECNT, { params })
// get+path拼接形式
export const reqDeviceInfo = (id: number) => request.get<any, any>(API.DEVICEINFO + `/${id}`)
// post + body形式
export const reqDeviceCreate= (data:any) => request.post<any,any>(API.DEVICECREATE,data)
// post + query形式
export const reqNBInit = (params: any) => request.post<any, any>(API.NBINIT, null, { params })
// post + body + 设置请求头 head
export const reqDeviceUploadFirm = (data: any) => request.post<any, any>(API.DEVICEUPLOADFIRM, data, {
headers: {
'Content-Type': 'multipart/form-data;charset=utf-8'
}
})
// get + quety + 设置响应头
export const reqDeviceDownFirm = (params: any) => request.get<any, any>(API.DEVICEDOWNFIRM, {
params,
responseType: 'blob'
})
// mock
export const reqNBInit = (params: any) => mockrequest.post<any, any>(API.NBINIT, null, { params })