request.ts 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. import axios from 'axios';
  2. import store from '@/store'
  3. import { getToken,getUserId,removeToken,removeUserId } from '@/utils/token';
  4. import { useUserStore } from '@/store/user'
  5. import { DES3 } from '@/utils/3des';
  6. import router from '@/router/index'
  7. import { message } from '../utils/message.js'
  8. import { Caegw_ProUrl,Caegw_LogUrl } from '@/settings' ;// 引入settings.js
  9. const requestList = []; // 请求列表
  10. const CancelToken = axios.CancelToken;
  11. let sources = {};
  12. let successCode = '000000000' | '0000000';//成功编码
  13. const userStore = useUserStore()
  14. //axios配置
  15. //全局的 axios 默认值:指定将被用在各个请求的配置默认值
  16. axios.defaults.timeout = 20000;//设置超时时间
  17. axios.defaults.baseURL = import.meta.env.VITE_BASE_URL;// `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  18. //axios.defaults.headers.common['Authorization'] = AUT202H_TOKEN;//根据项目需要配置
  19. //axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';//设置请求头的类型
  20. axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';//设置请求头的类型
  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 === '系统没有登录或会话超时!' || data.returnMsg === '用户验证失败!') {
  57. userStore.clearUserInfo();
  58. removeToken();
  59. removeUserId();
  60. router.replace({ path: '/login' });
  61. }
  62. return Promise.reject(data)
  63. }
  64. } else {
  65. return Promise.reject(res)
  66. }
  67. }, err => {
  68. const { res } = err;
  69. if (res) {
  70. // 请求已发出,但是不在2xx的范围
  71. requestList.length = 0;
  72. errorHandle(res.status, res.data.message);
  73. return Promise.reject(res);
  74. } else {
  75. console.log(err)
  76. if (err.message == '取消上传') {
  77. return Promise.reject('cancel')
  78. }
  79. // 处理断网的情况
  80. // eg:请求超时或断网时,更新network状态,可在app.vue中控制着一个全局的断网提示组件的显示隐藏
  81. if (err.message == '取消重复请求') {
  82. // console.log(err)
  83. } else {
  84. let error = err.message.indexOf('timeout') != -1 ? { returnMsg: '请求超时' } : { returnMsg: '网络通讯异常' };
  85. requestList.splice(requestList.findIndex(item => item === request), 1)
  86. return Promise.reject(error)
  87. }
  88. }
  89. });
  90. //完善请求url
  91. function getUrl(channelNo = 'service') {
  92. let url = ''
  93. if (channelNo == 'service') {
  94. url = '/TransServlet'
  95. } else if (channelNo == 'manager') {
  96. url = '/managersvr/TransServlet'
  97. }
  98. return url
  99. }
  100. //配置上行报文公共包头
  101. function getParams(params, channelNo) {
  102. // params['clientToken'] = "11112";
  103. params['clientToken'] = getToken()||"e47b87eec69545559d1e81e56626da68";
  104. let userId =getUserId() ||'5f06c8bc77234f969d13e160b54c27e3';
  105. // let userId = store.getters.userId;
  106. // if (userId) {
  107. params['userId'] = userId;
  108. // }
  109. params['channelNo'] = channelNo;
  110. return params;
  111. }
  112. // 请求
  113. const request = (params, channelNo = 'service', method = 'post') => {
  114. let url = getUrl(channelNo);//完善请求url
  115. params = getParams(params, channelNo);//配置上行报文公共包头
  116. return new Promise((resolve, reject) => {
  117. if (method == 'post') {//'http://192.168.131:8187/TransServlet'
  118. axios.post(url, params).then(res => {
  119. resolve(res)
  120. }).catch(err => {
  121. // Message.error(err.returnMsg)
  122. reject(err)
  123. })
  124. } else if (method == 'get') {
  125. axios.get(url, { params }).then(res => {
  126. resolve(res)
  127. }).catch(err => {
  128. // Message.error(err.returnMsg)
  129. reject(err)
  130. })
  131. }
  132. })
  133. }
  134. /**
  135. * 上传文件(支持 FormData)
  136. * @param {FormData} formData
  137. * @param {string} channelNo
  138. * @param {Function} onProgress 上传进度回调,可选
  139. */
  140. const uploadFile = (formData, channelNo = 'service', onProgress) => {
  141. // 自动加固定字段
  142. formData.append('clientToken', getToken() || 'e47b87eec69545559d1e81e56626da68')
  143. formData.append('userId', getUserId() || '5f06c8bc77234f969d13e160b54c27e3')
  144. formData.append('channelNo', channelNo)
  145. return axios.post(getUrl(channelNo), formData, {
  146. timeout: 60000,
  147. headers: { 'Content-Type': 'multipart/form-data' },
  148. onUploadProgress: e => {
  149. if (e.lengthComputable && typeof onProgress === 'function') {
  150. const percent = e.total ? Math.floor((e.loaded / e.total) * 100) : 0
  151. onProgress(percent)
  152. }
  153. }
  154. })
  155. .then(res => res)
  156. .catch(err => {
  157. if (err !== 'cancel') {
  158. message.error(err.returnMsg || '上传失败')
  159. }
  160. return Promise.reject(err)
  161. })
  162. }
  163. // 获取图片验证码
  164. const getCode = (channelNo = 'service') => {
  165. let rand = Math.random();
  166. let token = store.getters.token || getToken();
  167. return process.env.VUE_APP_BASE_API + getUrl(channelNo) + '?transCode=HM0000&randomKey=' + rand + '&clientToken=' + token;
  168. }
  169. // 获取图片Url
  170. const getImage = (id, channelNo = 'service') => {
  171. if (!id) return '';
  172. let token = getToken() || store.token;
  173. let userId = getUserId();
  174. return import.meta.env.VITE_BASE_URL + getUrl(channelNo) + "?transCode=B00022&clientToken=" + token + "&userId=" + userId + "&id=" + id;
  175. }
  176. //加密密码
  177. const enPassword = (password) => {
  178. let token = getToken() || store.token;
  179. return DES3.encrypt(token, password);
  180. }
  181. export {
  182. request,
  183. uploadFile,
  184. getCode,
  185. getImage,
  186. enPassword,
  187. sources
  188. }