2023-07-06 20:59:22 +08:00
|
|
|
|
import router from '../router';
|
2021-06-07 17:22:07 +08:00
|
|
|
|
import config from './config';
|
2023-10-19 19:00:23 +08:00
|
|
|
|
import { getClientId, getToken } from './utils/storage';
|
2021-06-07 17:22:07 +08:00
|
|
|
|
import { templateResolve } from './utils/string';
|
|
|
|
|
|
import { ElMessage } from 'element-plus';
|
2023-12-07 01:07:34 +08:00
|
|
|
|
import axios from 'axios';
|
2024-01-05 12:09:12 +08:00
|
|
|
|
import { useApiFetch } from '../hooks/useRequest';
|
2023-12-11 01:00:09 +08:00
|
|
|
|
import Api from './Api';
|
2021-06-07 17:22:07 +08:00
|
|
|
|
|
2023-12-09 16:17:26 +08:00
|
|
|
|
export default {
|
|
|
|
|
|
request,
|
2023-12-11 01:00:09 +08:00
|
|
|
|
xhrReq,
|
2023-12-09 16:17:26 +08:00
|
|
|
|
get,
|
|
|
|
|
|
post,
|
|
|
|
|
|
put,
|
|
|
|
|
|
del,
|
|
|
|
|
|
getApiUrl,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2021-06-07 17:22:07 +08:00
|
|
|
|
export interface Result {
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 响应码
|
|
|
|
|
|
*/
|
|
|
|
|
|
code: number;
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 响应消息
|
|
|
|
|
|
*/
|
|
|
|
|
|
msg: string;
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 数据
|
|
|
|
|
|
*/
|
|
|
|
|
|
data?: any;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-11 01:00:09 +08:00
|
|
|
|
export enum ResultEnum {
|
2023-08-16 17:37:33 +08:00
|
|
|
|
SUCCESS = 200,
|
|
|
|
|
|
ERROR = 400,
|
|
|
|
|
|
PARAM_ERROR = 405,
|
|
|
|
|
|
SERVER_ERROR = 500,
|
|
|
|
|
|
NO_PERMISSION = 501,
|
2024-05-13 19:55:43 +08:00
|
|
|
|
ACCESS_TOKEN_INVALID = 502, // accessToken失效
|
2023-08-16 17:37:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-11 01:00:09 +08:00
|
|
|
|
export const baseUrl: string = config.baseApiUrl;
|
2023-12-09 16:17:26 +08:00
|
|
|
|
// const baseUrl: string = 'http://localhost:18888/api';
|
2023-10-10 17:39:46 +08:00
|
|
|
|
// const baseWsUrl: string = config.baseWsUrl;
|
2021-06-07 17:22:07 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 通知错误消息
|
|
|
|
|
|
* @param msg 错误消息
|
|
|
|
|
|
*/
|
|
|
|
|
|
function notifyErrorMsg(msg: string) {
|
|
|
|
|
|
// 危险通知
|
|
|
|
|
|
ElMessage.error(msg);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// create an axios instance
|
2023-12-09 16:17:26 +08:00
|
|
|
|
const axiosInst = axios.create({
|
2021-06-07 17:22:07 +08:00
|
|
|
|
baseURL: baseUrl, // url = base url + request url
|
2023-10-10 17:39:46 +08:00
|
|
|
|
timeout: 60000, // request timeout
|
2023-07-06 20:59:22 +08:00
|
|
|
|
});
|
2021-06-07 17:22:07 +08:00
|
|
|
|
|
|
|
|
|
|
// request interceptor
|
2023-12-09 16:17:26 +08:00
|
|
|
|
axiosInst.interceptors.request.use(
|
2022-04-12 17:14:44 +08:00
|
|
|
|
(config: any) => {
|
2021-06-07 17:22:07 +08:00
|
|
|
|
// do something before request is sent
|
2023-09-16 17:07:48 +08:00
|
|
|
|
const token = getToken();
|
2021-06-07 17:22:07 +08:00
|
|
|
|
if (token) {
|
|
|
|
|
|
// 设置token
|
2023-07-06 20:59:22 +08:00
|
|
|
|
config.headers['Authorization'] = token;
|
2023-10-19 19:00:23 +08:00
|
|
|
|
config.headers['ClientId'] = getClientId();
|
2021-06-07 17:22:07 +08:00
|
|
|
|
}
|
2023-07-06 20:59:22 +08:00
|
|
|
|
return config;
|
2021-06-07 17:22:07 +08:00
|
|
|
|
},
|
2023-07-06 20:59:22 +08:00
|
|
|
|
(error) => {
|
|
|
|
|
|
return Promise.reject(error);
|
2021-06-07 17:22:07 +08:00
|
|
|
|
}
|
2023-07-06 20:59:22 +08:00
|
|
|
|
);
|
2021-06-07 17:22:07 +08:00
|
|
|
|
|
|
|
|
|
|
// response interceptor
|
2023-12-09 16:17:26 +08:00
|
|
|
|
axiosInst.interceptors.response.use(
|
|
|
|
|
|
(response) => response,
|
2021-06-07 17:22:07 +08:00
|
|
|
|
(e: any) => {
|
2023-08-16 17:37:33 +08:00
|
|
|
|
const rejectPromise = Promise.reject(e);
|
|
|
|
|
|
|
2023-12-07 01:07:34 +08:00
|
|
|
|
if (axios.isCancel(e)) {
|
|
|
|
|
|
console.log('请求已取消');
|
|
|
|
|
|
return rejectPromise;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-16 17:37:33 +08:00
|
|
|
|
const statusCode = e.response?.status;
|
|
|
|
|
|
if (statusCode == 500) {
|
|
|
|
|
|
notifyErrorMsg('服务器未知异常');
|
|
|
|
|
|
return rejectPromise;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (statusCode == 404) {
|
|
|
|
|
|
notifyErrorMsg('请求接口未找到');
|
|
|
|
|
|
return rejectPromise;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-07 17:22:07 +08:00
|
|
|
|
if (e.message) {
|
|
|
|
|
|
// 对响应错误做点什么
|
|
|
|
|
|
if (e.message.indexOf('timeout') != -1) {
|
2023-08-16 17:37:33 +08:00
|
|
|
|
notifyErrorMsg('网络请求超时');
|
|
|
|
|
|
return rejectPromise;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (e.message == 'Network Error') {
|
2021-06-07 17:22:07 +08:00
|
|
|
|
notifyErrorMsg('网络连接错误');
|
2023-08-16 17:37:33 +08:00
|
|
|
|
return rejectPromise;
|
2021-06-07 17:22:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-16 17:37:33 +08:00
|
|
|
|
notifyErrorMsg('网络请求错误');
|
|
|
|
|
|
return rejectPromise;
|
2021-06-07 17:22:07 +08:00
|
|
|
|
}
|
2023-07-06 20:59:22 +08:00
|
|
|
|
);
|
2021-06-07 17:22:07 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
2023-12-11 01:00:09 +08:00
|
|
|
|
* xhr请求url
|
2023-07-06 20:59:22 +08:00
|
|
|
|
*
|
2023-12-11 01:00:09 +08:00
|
|
|
|
* @param method 请求方法
|
|
|
|
|
|
* @param url url
|
|
|
|
|
|
* @param params 参数
|
|
|
|
|
|
* @param options 可选
|
|
|
|
|
|
* @returns
|
2021-06-07 17:22:07 +08:00
|
|
|
|
*/
|
2023-12-11 01:00:09 +08:00
|
|
|
|
export function xhrReq(method: string, url: string, params: any = null, options: any = {}) {
|
2023-12-09 16:17:26 +08:00
|
|
|
|
if (!url) {
|
|
|
|
|
|
throw new Error('请求url不能为空');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-07 17:22:07 +08:00
|
|
|
|
// 简单判断该url是否是restful风格
|
2023-07-06 20:59:22 +08:00
|
|
|
|
if (url.indexOf('{') != -1) {
|
2021-06-07 17:22:07 +08:00
|
|
|
|
url = templateResolve(url, params);
|
|
|
|
|
|
}
|
2023-12-09 16:17:26 +08:00
|
|
|
|
|
|
|
|
|
|
const req: any = {
|
2021-06-07 17:22:07 +08:00
|
|
|
|
method,
|
2023-12-09 16:17:26 +08:00
|
|
|
|
url,
|
2023-07-06 20:59:22 +08:00
|
|
|
|
...options,
|
2021-06-07 17:22:07 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// post和put使用json格式传参
|
2023-04-13 20:11:22 +08:00
|
|
|
|
if (method === 'post' || method === 'put') {
|
2023-12-09 16:17:26 +08:00
|
|
|
|
req.data = params;
|
2021-06-07 17:22:07 +08:00
|
|
|
|
} else {
|
2023-12-09 16:17:26 +08:00
|
|
|
|
req.params = params;
|
2021-06-07 17:22:07 +08:00
|
|
|
|
}
|
2023-12-09 16:17:26 +08:00
|
|
|
|
|
|
|
|
|
|
return axiosInst
|
|
|
|
|
|
.request(req)
|
|
|
|
|
|
.then((response) => {
|
|
|
|
|
|
// 获取请求返回结果
|
|
|
|
|
|
const result: Result = response.data;
|
|
|
|
|
|
return parseResult(result);
|
|
|
|
|
|
})
|
2023-07-06 20:59:22 +08:00
|
|
|
|
.catch((e) => {
|
2021-06-07 17:22:07 +08:00
|
|
|
|
return Promise.reject(e);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-11 01:00:09 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* fetch请求url
|
|
|
|
|
|
*
|
|
|
|
|
|
* 该方法已处理请求结果中code != 200的message提示,如需其他错误处理(取消加载状态,重置对象状态等等),可catch继续处理
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param {Object} method 请求方法(GET,POST,PUT,DELTE等)
|
|
|
|
|
|
* @param {Object} uri uri
|
|
|
|
|
|
* @param {Object} params 参数
|
|
|
|
|
|
*/
|
|
|
|
|
|
async function request(method: string, url: string, params: any = null, options: any = {}): Promise<any> {
|
|
|
|
|
|
const { execute, data } = useApiFetch(Api.create(url, method), params, options);
|
|
|
|
|
|
await execute();
|
|
|
|
|
|
return data.value;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-07 17:22:07 +08:00
|
|
|
|
/**
|
2023-07-06 20:59:22 +08:00
|
|
|
|
* get请求uri
|
|
|
|
|
|
* 该方法已处理请求结果中code != 200的message提示,如需其他错误处理(取消加载状态,重置对象状态等等),可catch继续处理
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param {Object} url uri
|
|
|
|
|
|
* @param {Object} params 参数
|
2021-06-07 17:22:07 +08:00
|
|
|
|
*/
|
2023-12-09 16:17:26 +08:00
|
|
|
|
function get(url: string, params: any = null, options: any = {}): Promise<any> {
|
|
|
|
|
|
return request('get', url, params, options);
|
2021-06-07 17:22:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-09 16:17:26 +08:00
|
|
|
|
function post(url: string, params: any = null, options: any = {}): Promise<any> {
|
|
|
|
|
|
return request('post', url, params, options);
|
2023-07-06 20:59:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-09 16:17:26 +08:00
|
|
|
|
function put(url: string, params: any = null, options: any = {}): Promise<any> {
|
|
|
|
|
|
return request('put', url, params, options);
|
2023-07-06 20:59:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-09 16:17:26 +08:00
|
|
|
|
function del(url: string, params: any = null, options: any = {}): Promise<any> {
|
|
|
|
|
|
return request('delete', url, params, options);
|
2021-06-07 17:22:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function getApiUrl(url: string) {
|
|
|
|
|
|
// 只是返回api地址而不做请求,用在上传组件之类的
|
2023-10-18 15:24:29 +08:00
|
|
|
|
return baseUrl + url + '?' + joinClientParams();
|
2021-06-07 17:22:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 19:00:23 +08:00
|
|
|
|
// 组装客户端参数,包括 token 和 clientId
|
|
|
|
|
|
export function joinClientParams(): string {
|
|
|
|
|
|
return `token=${getToken()}&clientId=${getClientId()}`;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-21 22:27:42 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 获取文件url地址
|
|
|
|
|
|
* @param key 文件key
|
|
|
|
|
|
* @returns 文件url
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function getFileUrl(key: string) {
|
|
|
|
|
|
return `${baseUrl}/sys/files/${key}`;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取系统文件上传url
|
|
|
|
|
|
* @param key 文件key
|
|
|
|
|
|
* @returns 文件上传url
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function getUploadFileUrl(key: string = '') {
|
|
|
|
|
|
return `${baseUrl}/sys/files/upload?token=${getToken()}&fileKey=${key}`;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 下载文件
|
|
|
|
|
|
* @param key 文件key
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function downloadFile(key: string) {
|
|
|
|
|
|
const a = document.createElement('a');
|
|
|
|
|
|
a.setAttribute('href', `${getFileUrl(key)}`);
|
|
|
|
|
|
a.setAttribute('target', '_blank');
|
|
|
|
|
|
a.click();
|
|
|
|
|
|
a.remove();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-12-09 16:17:26 +08:00
|
|
|
|
function parseResult(result: Result) {
|
|
|
|
|
|
if (result.code === ResultEnum.SUCCESS) {
|
|
|
|
|
|
return result.data;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 如果提示没有权限,则移除token,使其重新登录
|
|
|
|
|
|
if (result.code === ResultEnum.NO_PERMISSION) {
|
|
|
|
|
|
router.push({
|
|
|
|
|
|
path: '/401',
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 如果返回的code不为成功,则会返回对应的错误msg,则直接统一通知即可。忽略登录超时或没有权限的提示(直接跳转至401页面)
|
|
|
|
|
|
if (result.msg && result?.code != ResultEnum.NO_PERMISSION) {
|
|
|
|
|
|
notifyErrorMsg(result.msg);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return Promise.reject(result);
|
|
|
|
|
|
}
|