|
@@ -0,0 +1,128 @@
|
|
|
+/* eslint-disable require-atomic-updates */
|
|
|
+/* eslint-disable no-console */
|
|
|
+/* eslint-disable no-param-reassign */
|
|
|
+
|
|
|
+import _ from 'lodash';
|
|
|
+import Axios from 'axios';
|
|
|
+import { Util, Error } from 'naf-core';
|
|
|
+
|
|
|
+const { trimData, isNullOrUndefined } = Util;
|
|
|
+const { ErrorCode } = Error;
|
|
|
+
|
|
|
+let currentRequests = 0;
|
|
|
+
|
|
|
+export default class AxiosWrapper {
|
|
|
+ constructor({ baseUrl = '', unwrap = true } = {}) {
|
|
|
+ this.baseUrl = baseUrl;
|
|
|
+ this.unwrap = unwrap;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 替换uri中的参数变量
|
|
|
+ static merge(uri, query = {}) {
|
|
|
+ if (!uri.includes(':')) {
|
|
|
+ return uri;
|
|
|
+ }
|
|
|
+ const keys = [];
|
|
|
+ const regexp = /\/:([a-z0-9_]+)/gi;
|
|
|
+ let res;
|
|
|
+ // eslint-disable-next-line no-cond-assign
|
|
|
+ while ((res = regexp.exec(uri)) != null) {
|
|
|
+ keys.push(res[1]);
|
|
|
+ }
|
|
|
+ keys.forEach((key) => {
|
|
|
+ if (!isNullOrUndefined(query[key])) {
|
|
|
+ uri = uri.replace(`:${key}`, query[key]);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return uri;
|
|
|
+ }
|
|
|
+
|
|
|
+ $get(uri, query, options) {
|
|
|
+ return this.$request(uri, null, query, options);
|
|
|
+ }
|
|
|
+
|
|
|
+ $delete(uri, query, options = {}) {
|
|
|
+ return this.$request(uri, null, query, { ...options, method: 'delete' });
|
|
|
+ }
|
|
|
+
|
|
|
+ $post(uri, data = {}, query, options) {
|
|
|
+ return this.$request(uri, data, query, options);
|
|
|
+ }
|
|
|
+
|
|
|
+ async $request(uri, data, query, options) {
|
|
|
+ // 过滤key:''的情况
|
|
|
+ query = _.pickBy(query, (val) => val !== '');
|
|
|
+ if (!uri) console.error('uri不能为空');
|
|
|
+ if (_.isObject(query) && _.isObject(options)) {
|
|
|
+ const params = query.params ? query.params : query;
|
|
|
+ options = { ...options, params };
|
|
|
+ } else if (_.isObject(query) && !query.params) {
|
|
|
+ options = { params: query };
|
|
|
+ } else if (_.isObject(query) && query.params) {
|
|
|
+ options = query;
|
|
|
+ }
|
|
|
+ if (!options) options = {};
|
|
|
+ if (options.params) options.params = trimData(options.params);
|
|
|
+ const url = AxiosWrapper.merge(uri, options.params);
|
|
|
+
|
|
|
+ currentRequests += 1;
|
|
|
+ // const loadingInstance = Loading.service({ spinner: 'el-icon-loading', background: 'rgba(0, 0, 0, 0.5)' });
|
|
|
+
|
|
|
+ try {
|
|
|
+ const axios = Axios.create({
|
|
|
+ baseURL: this.baseUrl,
|
|
|
+ });
|
|
|
+ const user = localStorage.getItem('user');
|
|
|
+ if (user) {
|
|
|
+ axios.defaults.headers.common.Authorization = encodeURI(user);
|
|
|
+ }
|
|
|
+ let res = await axios.request({
|
|
|
+ method: isNullOrUndefined(data) ? 'get' : 'post',
|
|
|
+ url,
|
|
|
+ data,
|
|
|
+ responseType: 'json',
|
|
|
+ ...options,
|
|
|
+ });
|
|
|
+ res = res.data || {};
|
|
|
+ const { errcode, errmsg, details } = res;
|
|
|
+ if (errcode) {
|
|
|
+ console.warn(`[${uri}] fail: ${errcode}-${errmsg} ${details}`);
|
|
|
+ return res;
|
|
|
+ }
|
|
|
+ // unwrap data
|
|
|
+ if (this.unwrap) {
|
|
|
+ // res = _.omit(res, ['errcode', 'errmsg', 'details']);
|
|
|
+ const keys = Object.keys(res);
|
|
|
+ if (keys.length === 1 && keys.includes('data')) {
|
|
|
+ res = res.data;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return res;
|
|
|
+ } catch (err) {
|
|
|
+ let errmsg = '接口请求失败,请稍后重试';
|
|
|
+ if (err.response) {
|
|
|
+ const { status, data = {} } = err.response;
|
|
|
+ if (status === 401) errmsg = '用户认证失败,请重新登录';
|
|
|
+ if (status === 403) errmsg = '当前用户不允许执行该操作';
|
|
|
+ if (status === 400 && data.errcode) {
|
|
|
+ const { errcode, errmsg, details } = data;
|
|
|
+ console.warn(`[${uri}] fail: ${errcode}-${errmsg} ${details}`);
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+ if (data && data.error) {
|
|
|
+ const { status, error, message } = data;
|
|
|
+ console.warn(`[${uri}] fail: ${status}: ${error}-${message}`);
|
|
|
+ return { errcode: status || ErrorCode.SERVICE_FAULT, errmsg: error, details: message };
|
|
|
+ }
|
|
|
+ }
|
|
|
+ console.error(`[AxiosWrapper] 接口请求失败: ${err.config && err.config.url} - ${err.message}`);
|
|
|
+ return { errcode: ErrorCode.SERVICE_FAULT, errmsg, details: err.message };
|
|
|
+ } finally {
|
|
|
+ currentRequests -= 1;
|
|
|
+ if (currentRequests <= 0) {
|
|
|
+ currentRequests = 0;
|
|
|
+ // loadingInstance.close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|