|
@@ -1,167 +0,0 @@
|
|
|
-// eslint-disable-next-line import/no-cycle
|
|
|
-import compilationStore from '@/store/modules/compilation';
|
|
|
-import userStore from '@/store/modules/user';
|
|
|
-import { clearTab } from '@/store/clear';
|
|
|
-/**
|
|
|
- * axios封装
|
|
|
- * 请求拦截、响应拦截、错误统一处理
|
|
|
- */
|
|
|
-import { IResult, LoginType } from '@sc/types';
|
|
|
-import axios from 'axios';
|
|
|
-import { get as getCookie } from 'js-cookie';
|
|
|
-import router from '@/router';
|
|
|
-import { getShareLinkFromHref, isShareHref } from './share';
|
|
|
-// eslint-disable-next-line import/no-cycle
|
|
|
-import enterpriseStore from '@/store/modules/enterprise';
|
|
|
-
|
|
|
-/**
|
|
|
- * 请求失败后的错误统一处理
|
|
|
- * @param {Number} errno 请求失败的错误码
|
|
|
- * @param message 错误信息
|
|
|
- */
|
|
|
-const handleError = async (errno: number, message: string) => {
|
|
|
- // 状态码判断
|
|
|
- switch (errno) {
|
|
|
- // 401: 未登录状态,跳转登录页
|
|
|
- case 1009:
|
|
|
- await router.replace('/login');
|
|
|
- break;
|
|
|
- // 没有费用定额权限
|
|
|
- case 3005:
|
|
|
- if (userStore.loginType === LoginType.ENTERPRISE) {
|
|
|
- clearTab();
|
|
|
- await router.replace('/workbench');
|
|
|
- }
|
|
|
- break;
|
|
|
- // 分享链接失效
|
|
|
- case 4005:
|
|
|
- if (isShareHref()) window.location.reload();
|
|
|
- break;
|
|
|
- default:
|
|
|
- console.log(message);
|
|
|
- }
|
|
|
-};
|
|
|
-
|
|
|
-// 创建axios实例
|
|
|
-const instance = axios.create({ timeout: 1000 * 12, baseURL: process.env.VUE_APP_BASE_URL });
|
|
|
-// 设置post请求头
|
|
|
-// 暂时可不用
|
|
|
-// instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
|
-/**
|
|
|
- * 请求拦截器
|
|
|
- * 每次请求前,如果存在token则在请求头中携带token
|
|
|
- */
|
|
|
-instance.interceptors.request.use(
|
|
|
- config => {
|
|
|
- // 登录流程控制中,根据本地是否存在token判断用户的登录情况
|
|
|
- // 但是即使token存在,也有可能token是过期的,所以在每次的请求头中携带token
|
|
|
- // 后台根据携带的token判断用户的登录情况,并返回给我们对应的状态码
|
|
|
- // 而后我们可以在响应拦截器中,根据状态码进行一些统一的操作。
|
|
|
-
|
|
|
- // 分享链接,需要设置请求头,后端才可根据请求头进行校验等
|
|
|
- const shareLink = getShareLinkFromHref();
|
|
|
- if (shareLink) {
|
|
|
- config.headers['Share-Link'] = shareLink;
|
|
|
- // 分享链接的情况,请求头需要携带费用定额ID,因为现在后端大多数请求、获取数据库表依赖费用定额ID
|
|
|
- // 注意:后续可考虑将后端所有方法,不依赖session里的compilationID、userID,全通过token的方式,这样更好维护,不过代码改动量比较大
|
|
|
- if (compilationStore.compilationInfo.ID) {
|
|
|
- config.headers.Compilation = compilationStore.compilationInfo.ID;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const csrfToken = getCookie('csrfToken');
|
|
|
- // Cookies.get('csrfToken');
|
|
|
- if (csrfToken) config.headers.post['x-csrf-token'] = csrfToken;
|
|
|
-
|
|
|
- // 退出登录的时候将本地清空
|
|
|
- if (config.url?.startsWith('/user/logout')) {
|
|
|
- userStore.commitReset();
|
|
|
- enterpriseStore.commitReset();
|
|
|
- }
|
|
|
- return config;
|
|
|
- },
|
|
|
- error => Promise.reject(error)
|
|
|
-);
|
|
|
-
|
|
|
-// 响应拦截器
|
|
|
-instance.interceptors.response.use(
|
|
|
- // 请求成功
|
|
|
- res => (res.status === 200 ? Promise.resolve(res) : Promise.reject(res)),
|
|
|
- // 请求失败
|
|
|
- async error => {
|
|
|
- if (error.message && error.message.includes('timeout')) {
|
|
|
- return Promise.reject(new Error('请求超时,请稍后再试'));
|
|
|
- }
|
|
|
- const { response } = error;
|
|
|
- const {
|
|
|
- data: { errno, message },
|
|
|
- } = response;
|
|
|
- if (response) {
|
|
|
- await handleError(errno, message);
|
|
|
- return Promise.reject(response);
|
|
|
- }
|
|
|
- return Promise.reject(error);
|
|
|
- }
|
|
|
-);
|
|
|
-
|
|
|
-/**
|
|
|
- * get方法,对应get请求
|
|
|
- * @param {String} url [请求的url地址]
|
|
|
- * @param {Object} params [请求时携带的参数]
|
|
|
- * @param isPlain
|
|
|
- */
|
|
|
-export function get<T = any>(url: string, params?: any, isPlain = false): Promise<T> {
|
|
|
- return new Promise((resolve, reject) => {
|
|
|
- instance
|
|
|
- .get(url, {
|
|
|
- params,
|
|
|
- })
|
|
|
- .then(res => {
|
|
|
- const result: IResult<T> = res.data;
|
|
|
- if (result.errno > 0) {
|
|
|
- reject(result);
|
|
|
- } else {
|
|
|
- // 有些外部的请求返回的数据接口跟项目中的接口格式是不一样的,这个时候设置isPlain为true,直接返回响应数据
|
|
|
- resolve(isPlain ? (result as unknown as T) : result.data);
|
|
|
- }
|
|
|
- })
|
|
|
- .catch(err => {
|
|
|
- if (err instanceof Error) {
|
|
|
- reject(err);
|
|
|
- } else {
|
|
|
- reject(err.data);
|
|
|
- }
|
|
|
- });
|
|
|
- });
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * post方法,对应post请求
|
|
|
- * @param {String} url [请求的url地址]
|
|
|
- * @param {Object} params [请求时携带的参数]
|
|
|
- * @param isPlain
|
|
|
- */
|
|
|
-export function post<T = any>(url: string, params?: any, isPlain = false): Promise<T> {
|
|
|
- return new Promise((resolve, reject) => {
|
|
|
- instance
|
|
|
- .post(url, params)
|
|
|
- .then(res => {
|
|
|
- const result: IResult<T> = res.data;
|
|
|
- if (result.errno > 0) {
|
|
|
- reject(result);
|
|
|
- } else {
|
|
|
- // 有些外部的请求返回的数据接口跟项目中的接口格式是不一样的,这个时候设置isPlain为true,直接返回响应数据
|
|
|
- resolve(isPlain ? (result as any as T) : result.data);
|
|
|
- }
|
|
|
- })
|
|
|
- .catch(err => {
|
|
|
- if (err instanceof Error) {
|
|
|
- reject(err);
|
|
|
- } else {
|
|
|
- reject(err.data);
|
|
|
- }
|
|
|
- });
|
|
|
- });
|
|
|
-}
|
|
|
-
|
|
|
-// export default instance;
|