request.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import axios from 'axios';
  2. import { ElNotification, ElMessageBox } from 'element-plus';
  3. import sysConfig from "@/config";
  4. import tool from '@/utils/tool';
  5. import router from '@/router';
  6. axios.defaults.baseURL = ''
  7. axios.defaults.timeout = sysConfig.TIMEOUT
  8. // HTTP request 拦截器
  9. axios.interceptors.request.use(
  10. (config) => {
  11. let token = tool.cookie.get("TOKEN");
  12. if(token){
  13. config.headers[sysConfig.TOKEN_NAME] = sysConfig.TOKEN_PREFIX + token
  14. }
  15. if(!sysConfig.REQUEST_CACHE && config.method == 'get'){
  16. config.params = config.params || {};
  17. config.params['_'] = new Date().getTime();
  18. }
  19. var typeName = "web";
  20. let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
  21. if(flag){
  22. typeName = "wap";
  23. }
  24. config.headers["api-type"] = typeName
  25. Object.assign(config.headers, sysConfig.HEADERS)
  26. return config;
  27. },
  28. (error) => {
  29. return Promise.reject(error);
  30. }
  31. );
  32. //FIX 多个API同时401时疯狂弹窗BUG
  33. let MessageBox_401_show = false
  34. // HTTP response 拦截器
  35. axios.interceptors.response.use(
  36. (response) => {
  37. return response;
  38. },
  39. (error) => {
  40. if (error.response) {
  41. if (error.response.status == 404) {
  42. ElNotification.error({
  43. title: '请求错误',
  44. message: "Status:404,正在请求不存在的服务器记录!"
  45. });
  46. } else if (error.response.status == 500) {
  47. ElNotification.error({
  48. title: '请求错误',
  49. message: error.response.data.message || "Status:500,服务器发生错误!"
  50. });
  51. } else if (error.response.status == 401) {
  52. if(!MessageBox_401_show){
  53. MessageBox_401_show = true
  54. ElMessageBox.confirm('当前用户已被登出或无权限访问当前资源,请尝试重新登录后再操作。', '无权限访问', {
  55. type: 'error',
  56. closeOnClickModal: false,
  57. center: true,
  58. confirmButtonText: '重新登录',
  59. beforeClose: (action, instance, done) => {
  60. MessageBox_401_show = false
  61. done()
  62. }
  63. }).then(() => {
  64. router.replace({path: '/login'});
  65. }).catch(() => {})
  66. }
  67. } else {
  68. ElNotification.error({
  69. title: '请求错误',
  70. message: error.message || `Status:${error.response.status},未知错误!`
  71. });
  72. }
  73. } else {
  74. ElNotification.error({
  75. title: '请求错误',
  76. message: "请求服务器无响应!"
  77. });
  78. }
  79. return Promise.reject(error.response);
  80. }
  81. );
  82. var http = {
  83. /** get 请求
  84. * @param {string} url 接口地址
  85. * @param {object} params 请求参数
  86. * @param {object} config 参数
  87. */
  88. get: function(url, params={}, config={}) {
  89. return new Promise((resolve, reject) => {
  90. axios({
  91. method: 'get',
  92. url: url,
  93. params: params,
  94. ...config
  95. }).then((response) => {
  96. resolve(response.data);
  97. }).catch((error) => {
  98. reject(error);
  99. })
  100. })
  101. },
  102. /** post 请求
  103. * @param {string} url 接口地址
  104. * @param {object} data 请求参数
  105. * @param {object} config 参数
  106. */
  107. post: function(url, data={}, config={}) {
  108. return new Promise((resolve, reject) => {
  109. axios({
  110. method: 'post',
  111. url: url,
  112. data: data,
  113. ...config
  114. }).then((response) => {
  115. resolve(response.data);
  116. }).catch((error) => {
  117. reject(error);
  118. })
  119. })
  120. },
  121. /** put 请求
  122. * @param {string} url 接口地址
  123. * @param {object} data 请求参数
  124. * @param {object} config 参数
  125. */
  126. put: function(url, data={}, config={}) {
  127. return new Promise((resolve, reject) => {
  128. axios({
  129. method: 'put',
  130. url: url,
  131. data: data,
  132. ...config
  133. }).then((response) => {
  134. resolve(response.data);
  135. }).catch((error) => {
  136. reject(error);
  137. })
  138. })
  139. },
  140. /** patch 请求
  141. * @param {string} url 接口地址
  142. * @param {object} data 请求参数
  143. * @param {object} config 参数
  144. */
  145. patch: function(url, data={}, config={}) {
  146. return new Promise((resolve, reject) => {
  147. axios({
  148. method: 'patch',
  149. url: url,
  150. data: data,
  151. ...config
  152. }).then((response) => {
  153. resolve(response.data);
  154. }).catch((error) => {
  155. reject(error);
  156. })
  157. })
  158. },
  159. /** delete 请求
  160. * @param {string} url 接口地址
  161. * @param {object} data 请求参数
  162. * @param {object} config 参数
  163. */
  164. delete: function(url, data={}, config={}) {
  165. return new Promise((resolve, reject) => {
  166. axios({
  167. method: 'delete',
  168. url: url,
  169. data: data,
  170. ...config
  171. }).then((response) => {
  172. resolve(response.data);
  173. }).catch((error) => {
  174. reject(error);
  175. })
  176. })
  177. },
  178. /** jsonp 请求
  179. * @param {string} url 接口地址
  180. * @param {string} name JSONP回调函数名称
  181. */
  182. jsonp: function(url, name='jsonp'){
  183. return new Promise((resolve) => {
  184. var script = document.createElement('script')
  185. var _id = `jsonp${Math.ceil(Math.random() * 1000000)}`
  186. script.id = _id
  187. script.type = 'text/javascript'
  188. script.src = url
  189. window[name] =(response) => {
  190. resolve(response)
  191. document.getElementsByTagName('head')[0].removeChild(script)
  192. try {
  193. delete window[name];
  194. }catch(e){
  195. window[name] = undefined;
  196. }
  197. }
  198. document.getElementsByTagName('head')[0].appendChild(script)
  199. })
  200. }
  201. }
  202. export default http;