| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- /*
- * ajax请求
- *
- * @Author: 1024创新实验室-主任:卓大
- * @Date: 2022-09-06 20:46:03
- * @Wechat: zhuda1024
- * @Email: lab1024@163.com
- * @Copyright 1024创新实验室 ( https://1024lab.net ),Since 2012
- */
- import { message, Modal } from 'ant-design-vue';
- import axios from 'axios';
- import { localClear, localRead } from '../src/utils/local-util';
- import { decryptData, encryptData } from './encrypt';
- import { DATA_TYPE_ENUM } from '../src/constants/common-const';
- import _ from 'lodash';
- import LocalStorageKeyConst from '../src/constants/local-storage-key-const.js';
- // token的消息头
- const TOKEN_HEADER = 'x-access-token';
- import Vue from 'vue';
- // 创建axios对象
- const smartAxios = axios.create({
- baseURL: Vue.prototype.$config.api,
- });
- // 退出系统
- function logout() {
- localClear();
- location.href = '/';
- }
- // ================================= 请求拦截器 =================================
- smartAxios.interceptors.request.use(
- (config) => {
- // 在发送请求之前消息头加入token token
- const token = localRead(LocalStorageKeyConst.USER_TOKEN);
- if (token) {
- config.headers[TOKEN_HEADER] = token;
- } else {
- delete config.headers[TOKEN_HEADER];
- }
- return config;
- },
- (error) => {
- // 对请求错误做些什么
- return Promise.reject(error);
- }
- );
- // ================================= 响应拦截器 =================================
- // 添加响应拦截器
- smartAxios.interceptors.response.use(
- (response) => {
- // 根据content-type ,判断是否为 json 数据
- let contentType = response.headers['content-type'] ? response.headers['content-type'] : response.headers['Content-Type'];
- if (contentType.indexOf('application/json') === -1) {
- return Promise.resolve(response);
- }
- // 如果是json数据
- if (response.data && response.data instanceof Blob) {
- return Promise.reject(response.data);
- }
- // 如果是加密数据
- if (response.data.dataType === DATA_TYPE_ENUM.ENCRYPT.value) {
- response.data.encryptData = response.data.data;
- let decryptStr = decryptData(response.data.data);
- if (decryptStr) {
- response.data.data = JSON.parse(decryptStr);
- }
- }
- const res = response.data;
- if (res.code && res.code !== 1) {
- // `token` 过期或者账号已在别处登录
- if (res.code === 30007 || res.code === 30008) {
- message.destroy();
- message.error('您没有登录,请重新登录');
- setTimeout(logout, 300);
- return Promise.reject(response);
- }
- // 等保安全的登录提醒
- if (res.code === 30010 || res.code === 30011) {
- Modal.error({
- title: '重要提醒',
- content: res.msg,
- });
- return Promise.reject(response);
- }
- // 长时间未操作系统,需要重新登录
- if (res.code === 30012) {
- Modal.error({
- title: '重要提醒',
- content: res.msg,
- onOk: logout,
- });
- setTimeout(logout, 3000);
- return Promise.reject(response);
- }
- message.destroy();
- message.error(res.msg);
- return Promise.reject(response);
- } else {
- return Promise.resolve(res);
- }
- },
- (error) => {
- // 对响应错误做点什么
- if (error.message.indexOf('timeout') !== -1) {
- message.destroy();
- message.error('网络超时');
- } else if (error.message === 'Network Error') {
- message.destroy();
- message.error('网络连接错误');
- } else if (error.message.indexOf('Request') !== -1) {
- message.destroy();
- message.error('网络发生错误');
- }
- return Promise.reject(error);
- }
- );
- // ================================= 对外提供请求方法:通用请求,get, post, 下载download等 =================================
- /**
- * get请求
- */
- export const getRequest = (url, params) => {
- return request({ url, method: 'get', params });
- };
- /**
- * 通用请求封装
- * @param config
- */
- export const request = (config) => {
- return smartAxios.request(config);
- };
- /**
- * post请求
- */
- export const postRequest = (url, data) => {
- console.log(url)
- return request({
- data,
- url,
- method: 'post',
- });
- };
- /**
- * 删除请求
- */
- export const delRequest = (url, data) => {
- return request({
- data,
- url,
- method: 'delete',
- });
- };
- // ================================= 加密 =================================
- /**
- * 加密请求参数的post请求
- */
- export const postEncryptRequest = (url, data) => {
- return request({
- data: { encryptData: encryptData(data) },
- url,
- method: 'post',
- });
- };
- // ================================= 下载 =================================
- export const postDownload = function (url, data) {
- request({
- method: 'post',
- url,
- data,
- responseType: 'blob',
- })
- .then((data) => {
- handleDownloadData(data);
- })
- .catch((error) => {
- handleDownloadError(error);
- });
- };
- /**
- * 文件下载
- */
- export const getDownload = function (url, params) {
- request({
- method: 'get',
- url,
- params,
- responseType: 'blob',
- })
- .then((data) => {
- handleDownloadData(data);
- })
- .catch((error) => {
- handleDownloadError(error);
- });
- };
- function handleDownloadError(error) {
- if (error instanceof Blob) {
- const fileReader = new FileReader();
- fileReader.readAsText(error);
- fileReader.onload = () => {
- const msg = fileReader.result;
- const jsonMsg = JSON.parse(msg);
- message.destroy();
- message.error(jsonMsg.msg);
- };
- } else {
- message.destroy();
- message.error('网络发生错误', error);
- }
- }
- function handleDownloadData(response) {
- if (!response) {
- return;
- }
- // 获取返回类型
- let contentType = _.isUndefined(response.headers['content-type']) ? response.headers['Content-Type'] : response.headers['content-type'];
- // 构建下载数据
- let url = window.URL.createObjectURL(new Blob([response.data], { type: contentType }));
- let link = document.createElement('a');
- link.style.display = 'none';
- link.href = url;
- // 从消息头获取文件名
- let str = _.isUndefined(response.headers['content-disposition'])
- ? response.headers['Content-Disposition'].split(';')[1]
- : response.headers['content-disposition'].split(';')[1];
- let filename = _.isUndefined(str.split('fileName=')[1]) ? str.split('filename=')[1] : str.split('fileName=')[1];
- link.setAttribute('download', decodeURIComponent(filename));
- // 触发点击下载
- document.body.appendChild(link);
- link.click();
- // 下载完释放
- document.body.removeChild(link); // 下载完成移除元素
- window.URL.revokeObjectURL(url); // 释放掉blob对象
- }
|