1. //全局配制写法
  2. /*axios全局配置*/
  3. axios.defaults.withCredentials = true; //跨域类型时是否在请求中协带cookie
  4. axios.defaults.baseURL = '/api/';//地址
  5. axios.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8';//请求头根据自定义需求
  6. axios.defaults.timeout = 8000;///默认请求超时时间
  7. Vue.prototype.$axios = axios;
  1. request.js
  2. //针对axios封装的ajax请求工具类
  3. import axios from 'axios'
  4. import qs from 'qs'
  5. import {Message} from 'element-ui'
  6. // 先导入vuex,因为要使用到里面的状态对象
  7. // vuex的路径根据自己的路径去写
  8. import store from '@/store/index';
  9. const service=axios.create({
  10. baseURL:process.env.APP_BASE_API, //环境设置
  11. timeout:5000,
  12. //请求头设置
  13. headers: {
  14. "accept": "application/json",
  15. 'Content-Type': 'application/json',
  16. },
  17. //`paramsSerializer` 是一个负责 `params` 序列化的函数
  18. paramsSerializer: function(params){
  19. return qs.stringify(params, {arrayFormat:'brackets'})
  20. }
  21. })
  22. //请求拦截器
  23. service.interceptors.request.use(
  24. config=>{
  25. // 每次发送请求之前判断是否存在token
  26. // 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况
  27. // 即使本地存在token,token也有可能是过期的,所以在响应拦截器中要对返回状态进行判断
  28. const token = store.state.token;
  29. token && (config.headers.Authorization = token);
  30. // config.headers['token']='' //没有登陆界面时,可以不携带token
  31. return config
  32. },
  33. error=>{
  34. return Promise.reject(error)
  35. }
  36. )
  37. //响应拦截器
  38. service.interceptors.response.use(
  39. response=>{
  40. // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据,否则的话抛出错误
  41. if (response.status === 200) {
  42. return Promise.resolve(response);
  43. } else {
  44. return Promise.reject(response);
  45. }
  46. },
  47. // 服务器状态码不是2开头的的情况
  48. // 这里可以跟后台开发人员协商好统一的错误状态码
  49. // 然后根据返回的状态码进行一些操作,例如登录过期提示,错误提示等
  50. // 下面列举几个常见的操作,其他需求可自行扩展
  51. error=>{
  52. if (error.response.status) {
  53. switch (error.response.status) {
  54. // 401: 未登录
  55. // 未登录则跳转登录页面,并携带当前页面的路径
  56. // 在登录成功后返回当前页面,这一步需要在登录页操作。
  57. case 401:
  58. router.replace({
  59. path: '/login',
  60. query: {
  61. redirect: router.currentRoute.fullPath
  62. }
  63. });
  64. break;
  65. // 403 token过期
  66. // 登录过期对用户进行提示
  67. // 清除本地token和清空vuex中token对象
  68. // 跳转登录页面
  69. case 403:
  70. Message({
  71. message: '登录过期,请重新登录',
  72. type:"waring"
  73. duration: 1000,
  74. });
  75. // 清除token
  76. localStorage.removeItem('token');
  77. store.commit('loginSuccess', null);
  78. // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
  79. setTimeout(() => {
  80. router.replace({
  81. path: '/login',
  82. query: {
  83. redirect: router.currentRoute.fullPath
  84. }
  85. });
  86. }, 1000);
  87. break;
  88. // 404请求不存在
  89. case 404:
  90. Message({
  91. message: '网络请求不存在',
  92. type:'waring',
  93. duration: 2*1000,
  94. });
  95. break;
  96. // 其他错误,直接抛出错误提示
  97. default:
  98. Message({
  99. message: error.response.data.message,
  100. type:'error',
  101. duration: 2*1000,
  102. });
  103. }
  104. return Promise.reject(error.response);
  105. }
  106. }
  107. )
  108. export default service

环境配置

在根目录下新建:.env.development ,开发环境的配置文件,输入如下代码:

  1. VUE_APP_ENV ='development'
  2. VUE_APP_API_BASE='/api'

在根目录下新建:.env.production ,生产环境的配置文件,输入如下代码:

  1. VUE_APP_ENV ='production'
  2. VUE_APP_API_BASE='/'

封装get和post方法

在api文件夹下新建一个如user.js文件,封装get和post请求方式,如下:

  1. //先导入封装的axios文件
  2. import request from '@/utils/request'
  3. export function postUserData(data){ //这里方法与后台Controller方法名一致就可以
  4. return request({
  5. url:'请求地址',
  6. method:'post', //post请求方式
  7. data
  8. })
  9. }
  10. export function getUserData(data){
  11. return request({
  12. url:'请求地址',
  13. method:'get', //get请求方式
  14. data
  15. })
  16. }
  1. import axios from 'axios'
  2. import qs from 'qs'
  3. import router from '../router/index'
  4. import store from '../store/index'
  5. import { Message } from 'element-ui';
  6. import NProgress from 'nprogress'
  7. import 'nprogress/nprogress.css'
  8. /* 设置请求超时的时间 */
  9. axios.defaults.timeout = 10000;
  10. //设置请求头
  11. axios.defaults.headers.post['Content-Type'] = 'application/json';
  12. //携带cookie
  13. axios.defaults.withCredentials = true;
  14. const http = axios.create({
  15. baseURL: '',
  16. withCredentials: true, // 跨域类型时是否在请求中协带cookie
  17. paramsSerializer: function(params){
  18. return qs.stringify(params, {arrayFormat:'brackets'})
  19. }
  20. })
  21. //使用 NProgress 进度条
  22. http.interceptors.request.use(config => {
  23. //判断token是否带有内容,若有则在请求头添加Authorization
  24. let _obj = sessionStorage.getItem("t")
  25. var _token =''
  26. if(_obj !== null && _obj !== 'undefined'){
  27. let _nt = new Date().getTime()
  28. let obj = JSON.parse(_obj)
  29. //后端设置token时效7200s
  30. if(_nt - Number(obj._lt) > 7190000){
  31. sessionStorage.clear()
  32. }else{
  33. _token = obj._t
  34. }
  35. }
  36. if(_token){
  37. config.headers.common['Authorization'] = "Bearer " + _token
  38. }
  39. // 展示进度条
  40. NProgress.start()
  41. // 最后必须返回config
  42. return config
  43. },function (error) {
  44. router.push('/login')
  45. return Promise.reject(error)
  46. })
  47. http.interceptors.response.use(config => {
  48. // 关闭进度条
  49. NProgress.done()
  50. // 最后必须返回config
  51. return config
  52. },function (error) {
  53. // 对响应错误做点什么
  54. if(error.message.includes('timeout of')){
  55. Message.warning("网络超时,请检查网络! ")
  56. }
  57. if (error.response) {
  58. switch (error.response.status) {
  59. // 403过期——返回登录页 401未认证————返回上一页
  60. case 403:
  61. Message.warning("访问权限超时,请重新登录!")
  62. sessionStorage.clear()
  63. router.push('/login')
  64. break;
  65. case 401:
  66. Message.warning("该账号对此页面没有访问权限!")
  67. router.go(-1)
  68. // 关闭进度条
  69. NProgress.done()
  70. // 最后必须返回config
  71. return config
  72. }
  73. }
  74. return Promise.reject(error)
  75. })
  76. /**
  77. * get方法,对应get请求
  78. * @param {String} url [请求的url地址]
  79. * @param {Object} params [请求时携带的参数]
  80. */
  81. export function axiosGet(url, params) {
  82. return new Promise((resolve, reject) => {
  83. http.get(url, {
  84. params: params
  85. }).then(res => {
  86. if(res.data.code == 9990){
  87. router.push('/login')
  88. }
  89. resolve(res.data);
  90. }).catch(err => {
  91. if(res.data.code == 9990){
  92. router.push('/login')
  93. }
  94. reject(err.data)
  95. })
  96. });
  97. }
  98. /**
  99. * post方法,对应post请求
  100. * @param {String} url [请求的url地址]
  101. * @param {Object} params [请求时携带的参数]
  102. */
  103. export function axiosPost(url, params) {
  104. return new Promise((resolve, reject) => {
  105. http.post(url, params)
  106. .then(res => {
  107. if(res.data.code == 9990){
  108. router.push('/login')
  109. }
  110. resolve(res.data);
  111. })
  112. .catch(err => {
  113. if(res.data.code == 9990){
  114. router.push('/login')
  115. }
  116. reject(err.data)
  117. })
  118. });
  119. }