request.ts 8.2 KB

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