request.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. import axios from 'axios';
  2. import store from '@/store'
  3. import { MessageBox } from 'element-ui'
  4. import { getToken } from '@/utils/token'
  5. import { getLoginUrl } from '@/utils/loginurl'
  6. import { DES3 } from '@/utils/3des'
  7. import router from '@/router/index'
  8. import { ElMessage } from '../utils/message.js'
  9. import { Caegw_ProUrl,Caegw_LogUrl } from '@/settings' ;// 引入settings.js
  10. let Message = new ElMessage()
  11. const requestList = []; // 请求列表
  12. const CancelToken = axios.CancelToken;
  13. let sources = {};
  14. let successCode = '000000000' | '0000000';//成功编码
  15. //axios配置
  16. //全局的 axios 默认值:指定将被用在各个请求的配置默认值
  17. axios.defaults.timeout = 20000;//设置超时时间
  18. axios.defaults.baseURL = process.env.VUE_APP_BASE_API;// `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  19. //axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;//根据项目需要配置
  20. axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';//设置请求头的类型
  21. // 添加请求拦截器
  22. axios.interceptors.request.use(config => {
  23. const request = JSON.stringify(config.url) + (!!config.data ? JSON.stringify(config.data) : JSON.stringify(config.params))
  24. config.cancelToken = new CancelToken((cancel) => {
  25. sources[request] = cancel
  26. })
  27. //判断请求是否已存在请求列表,避免重复请求,将当前请求添加进请求列表数组;
  28. if (requestList.includes(request)) {
  29. // console.log(request)
  30. // sources[request]('取消重复请求')
  31. // requestList.splice(requestList.findIndex(item => item === request), 1)
  32. requestList.push(request)
  33. } else {
  34. requestList.push(request)
  35. }
  36. //因本项目部分请求需要重复获取所以不用去重
  37. // requestList.push(request)
  38. // 登录控制中根据本地是否存在token判断用户的登录情况,
  39. // 但即使token存在,也有可能token是过期的,所以在每次的请求头中携带token,
  40. // 后台根据携带的token判断用户的登录情况,并返回给我们对应的状态码,
  41. // 而后我们可以在响应拦截器中,根据状态码进行一些统一的操作。
  42. //本项目不用请求头判断而是在报文体中发送token
  43. // let token = store.getters.token || getToken();
  44. // token && (config.headers.Authorization = token);
  45. return config;
  46. }, error => Promise.reject(error));
  47. // 添加响应拦截器
  48. axios.interceptors.response.use(res => {
  49. const request = JSON.stringify(res.config.url) + (!!res.config.data ? JSON.stringify(res.config.data) : JSON.stringify(res.config.params))
  50. requestList.splice(requestList.findIndex(item => item === request), 1)
  51. if (res.status === 200) {
  52. let { data } = res
  53. if (data.returnCode == successCode) {
  54. return Promise.resolve(data)
  55. } else {
  56. if (data.returnMsg === '系统没有登录或会话超时!') {
  57. store.dispatch('user/changeState', {
  58. key: 'token',
  59. value: ''
  60. })
  61. store.dispatch('user/changeState', {
  62. key: 'name',
  63. value: ''
  64. })
  65. store.dispatch('user/changeState', {
  66. key: 'userId',
  67. value: ''
  68. })
  69. store.dispatch('user/changeState', {
  70. key: 'loginStatus',
  71. value: false
  72. })
  73. MessageBox.confirm('系统没有登录或会话超时, 是否登录?', '提示', {
  74. confirmButtonText: '登录',
  75. cancelButtonText: '取消',
  76. type: 'warning'
  77. })
  78. .then(() => {
  79. MessageBox.close()
  80. // window.location.hash = "/login/index";
  81. // window.location.href = "#/login/index";
  82. // router.replace(`/login/index`)
  83. // this.$router.replace('/login/index')
  84. let logUrl = getLoginUrl();
  85. // console.log(logUrl);
  86. window.location.href=logUrl
  87. })
  88. .catch(() => {
  89. Message.info('已取消!')
  90. MessageBox.close()
  91. })
  92. }
  93. return Promise.reject(data)
  94. }
  95. } else {
  96. return Promise.reject(res)
  97. }
  98. }, err => {
  99. const { res } = err;
  100. if (res) {
  101. // 请求已发出,但是不在2xx的范围
  102. requestList.length = 0;
  103. errorHandle(res.status, res.data.message);
  104. return Promise.reject(res);
  105. } else {
  106. console.log(err)
  107. if (err.message == '取消上传') {
  108. return Promise.reject('cancel')
  109. }
  110. // 处理断网的情况
  111. // eg:请求超时或断网时,更新network状态,可在app.vue中控制着一个全局的断网提示组件的显示隐藏
  112. if (err.message == '取消重复请求') {
  113. // console.log(err)
  114. } else {
  115. let error = err.message.indexOf('timeout') != -1 ? { returnMsg: '请求超时' } : { returnMsg: '网络通讯异常' };
  116. requestList.splice(requestList.findIndex(item => item === request), 1)
  117. return Promise.reject(error)
  118. }
  119. }
  120. });
  121. //完善请求url
  122. function getUrl(channelNo = 'service') {
  123. let url = ''
  124. if (channelNo == 'service') {
  125. url = '/TransServlet'
  126. } else if (channelNo == 'manager') {
  127. url = '/managersvr/TransServlet'
  128. }
  129. return url
  130. }
  131. //配置上行报文公共包头
  132. function getParams(params, channelNo) {
  133. params['clientToken'] = store.getters.token || getToken();
  134. let userId = store.getters.userId;
  135. if (userId) {
  136. params['userId'] = userId;
  137. }
  138. params['channelNo'] = channelNo;
  139. return params;
  140. }
  141. // 请求
  142. const request = (params, channelNo = 'service', method = 'post') => {
  143. let url = getUrl(channelNo);//完善请求url
  144. params = getParams(params, channelNo);//配置上行报文公共包头
  145. return new Promise((resolve, reject) => {
  146. if (method == 'post') {
  147. axios.post(url, params).then(res => {
  148. resolve(res)
  149. }).catch(err => {
  150. Message.error(err.returnMsg)
  151. reject(err)
  152. })
  153. } else if (method == 'get') {
  154. axios.get(url, { params }).then(res => {
  155. resolve(res)
  156. }).catch(err => {
  157. Message.error(err.returnMsg)
  158. reject(err)
  159. })
  160. }
  161. })
  162. }
  163. // 文件上传
  164. const uploadFile = (params, channelNo = 'service', callback1) => {
  165. let config = {
  166. timeout: 70000,
  167. headers: { "Content-Type": "multipart/form-data" },
  168. onUploadProgress: progressEvent => {
  169. //属性lengthComputable主要表明总共需要完成的工作量和已经完成的工作是否可以被测量,如果lengthComputable为false,就获取不到progress.total和progress.loaded
  170. if (progressEvent.lengthComputable) {
  171. let loaded = progressEvent.loaded
  172. let total = progressEvent.total
  173. // let progress = Math.floor((loaded / total) * 100) > 1 ? Math.floor((loaded / total) * 100) : 1;
  174. // console.log('上传进度 ' + progress + '%');
  175. // callback1(progress)
  176. }
  177. }
  178. }
  179. let url = getUrl(channelNo);//完善请求url
  180. params.append("clientToken", store.getters.token || getToken());
  181. params.append("userId", store.getters.userId);
  182. params.append("channelNo", channelNo);//配置上行报文公共包头
  183. return new Promise((resolve, reject) => {
  184. axios.post(url, params, config).then(res => {
  185. resolve(res)
  186. }).catch(err => {
  187. if (err != 'cancel') {
  188. Message.error(err.returnMsg)
  189. }
  190. reject(err)
  191. })
  192. })
  193. }
  194. // 获取图片验证码
  195. const getCode = (channelNo = 'service') => {
  196. let rand = Math.random();
  197. let token = store.getters.token || getToken();
  198. return process.env.VUE_APP_BASE_API + getUrl(channelNo) + '?transCode=HM0000&randomKey=' + rand + '&clientToken=' + token;
  199. }
  200. // 获取图片Url
  201. const getImage = (id, channelNo = 'service') => {
  202. let token = store.getters.token || getToken();
  203. return process.env.VUE_APP_BASE_API + getUrl(channelNo) + "?transCode=B00022&clientToken=" + token + "&id=" + id;
  204. }
  205. //加密密码
  206. const enPassword = (password) => {
  207. let token = store.getters.token || getToken();
  208. return DES3.encrypt(token, password);
  209. }
  210. export {
  211. request,
  212. uploadFile,
  213. getCode,
  214. getImage,
  215. enPassword,
  216. sources
  217. }