http.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. /* eslint-disable */
  2. import axios from 'axios' // 引用axios
  3. import base from "../common/base";
  4. import {
  5. getToken, getAdminToken
  6. } from '@/utils/auth'
  7. import store from '@/store'
  8. import router from '@/router'
  9. import { Loading, Message } from 'element-ui';
  10. const service1 = axios.create({
  11. timeout: 120000 * 10
  12. });
  13. const service2 = axios.create({
  14. timeout: 120000 * 10
  15. });
  16. var loading = null; // loading
  17. /**
  18. * @param {Boolean} showLoading 是否显示loading
  19. * @param {string} loadingText 文案
  20. */
  21. function showLoading(config) {
  22. let data = config.method == 'get' ? config.params : config.data;
  23. if (data && data.showLoading) {
  24. loading = Loading.service({
  25. lock: true,
  26. text: data.loadingText || 'Loading...',
  27. spinner: 'el-icon-loading',
  28. background: 'rgba(0, 0, 0, 0.7)'
  29. });
  30. delete data.showLoading;
  31. if (data.loadingText) delete data.loadingText;
  32. }
  33. }
  34. function hideLoading() {
  35. if (loading) loading.close();
  36. }
  37. // axios 配置
  38. // axios.defaults.timeout = 120000 //设置接口响应时间
  39. service1.interceptors.request.use(
  40. config => {
  41. showLoading(config) // loading start
  42. // do something before request is sent
  43. if (store.getters.token) {
  44. config.headers['Authorization'] = getToken()
  45. }
  46. // 设置请求头
  47. // if(!config.headers["content-type"]) { // 如果没有设置请求头
  48. // if(config.method === 'post') {
  49. // config.headers["content-type"] = "application/x-www-form-urlencoded"; // post 请求
  50. // config.data = qs.stringify(config.data); // 序列化,比如表单数据
  51. // } else {
  52. // config.headers["content-type"] = "application/json"; // 默认类型
  53. // }
  54. // }
  55. return config
  56. }
  57. )
  58. service2.interceptors.request.use(
  59. config => {
  60. showLoading(config); // loading start
  61. if (store.getters.adminToken) {
  62. config.headers['Authorization'] = getAdminToken();
  63. }
  64. return config;
  65. }
  66. );
  67. // // response interceptor
  68. service1.interceptors.response.use(
  69. response => {
  70. hideLoading(); // loading end
  71. const res = response
  72. if (res.config.responseType == "blob") {
  73. return res;
  74. }
  75. // if the custom code is not 20000, it is judged as an error.
  76. if (res.data.code) {
  77. if (res.data.code >= 400) {
  78. // Message({message: res.data.msg,type: 'warning'})
  79. }
  80. if (res.data.code == 500) {
  81. // Message({message: res.data.msg,type: 'warning'})
  82. }
  83. if (res.data.code === 401) {
  84. notifyPadAppLogout();// 通知App壳端退出登录(仅APP环境生效)
  85. //未登录 跳转到登录页
  86. let url=process.env.VUE_APP_BASE+'/marking/#/login';//退出到考阅登录页
  87. window.location.href = url;
  88. }
  89. return Promise.resolve(res)
  90. } else {
  91. return Promise.reject(res)
  92. }
  93. },
  94. error => {
  95. console.log('err----' + error) // for debug
  96. if (error.response.status == 500) {
  97. Message({
  98. message: '网络请求超时,请重试!',
  99. type: 'warning'
  100. })
  101. }
  102. return Promise.reject(error)
  103. }
  104. )
  105. service2.interceptors.response.use(
  106. response => {
  107. hideLoading(); // loading end
  108. const res = response
  109. if (res.config.responseType == "blob") {
  110. return res;
  111. }
  112. // if the custom code is not 20000, it is judged as an error.
  113. if (res.data.code) {
  114. if (res.data.code >= 400) {
  115. Message(
  116. {
  117. message: res.data.msg,
  118. type: 'warning',
  119. duration: 5,
  120. })
  121. }
  122. if (res.data.code === 401) {
  123. store.dispatch("adminUser/adminLogout").then(() => {
  124. // router.push('/login')
  125. }).catch(err => {
  126. console.log(err)
  127. })
  128. }
  129. return Promise.resolve(res)
  130. } else {
  131. return Promise.reject(res)
  132. }
  133. },
  134. error => {
  135. console.log('err----' + error) // for debug
  136. if (error.response.status == 500) {
  137. Message({
  138. message: '网络请求超时,请重试!',
  139. type: 'warning'
  140. })
  141. }
  142. return Promise.reject(error)
  143. }
  144. )
  145. export { service1, service2 };
  146. /**
  147. * fetch 请求方法
  148. * @param url
  149. * @param params
  150. * @returns {Promise}
  151. */
  152. export function get(url, params = {}, useService1 = false,loginUrl) {
  153. const service = useService1 ? service2 : service1;
  154. return new Promise((resolve, reject) => {
  155. service.get(url, {
  156. params: {
  157. ...params
  158. }
  159. })
  160. .then(response => {
  161. resolve(response.data)
  162. })
  163. .catch(err => {
  164. reject(err)
  165. })
  166. })
  167. }
  168. export function downLoadByBlob(url, params = {}, useService1 = false) {
  169. const service = useService1 ? service2 : service1;
  170. return service({
  171. method: 'GET',
  172. url: url,
  173. responseType: 'blob',
  174. params,
  175. headers: {
  176. 'Accept': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/octet-stream'
  177. },
  178. })
  179. }
  180. /**
  181. * post 请求方法
  182. * @param url
  183. * @param data
  184. * @returns {Promise}
  185. */
  186. export function post(url, data = {}, useService1 = false, loginUrl) {
  187. const service = useService1 ? service2 : service1;
  188. return new Promise((resolve, reject) => {
  189. service.post(url, data, loginUrl).then(
  190. response => {
  191. resolve(response.data)
  192. },
  193. err => {
  194. reject(err)
  195. }
  196. )
  197. })
  198. }
  199. /**
  200. * 上传文件方法 (FormData)
  201. * @param url 请求地址
  202. * @param formData FormData对象
  203. * @param useService1 是否使用service2
  204. * @returns {Promise}
  205. */
  206. export function upload(url, formData, useService1 = false) {
  207. const service = useService1 ? service2 : service1;
  208. // 设置上传文件的headers
  209. const config = {
  210. headers: {
  211. 'Content-Type': 'multipart/form-data'
  212. }
  213. };
  214. return new Promise((resolve, reject) => {
  215. service.post(url, formData, config)
  216. .then(response => {
  217. resolve(response.data);
  218. })
  219. .catch(err => {
  220. reject(err);
  221. });
  222. });
  223. }
  224. /**
  225. * patch 方法封装
  226. * @param url
  227. * @param data
  228. * @returns {Promise}
  229. */
  230. export function patch(url, data = {}, useService1 = false) {
  231. const service = useService1 ? service2 : service1;
  232. return new Promise((resolve, reject) => {
  233. service.patch(url, data).then(
  234. response => {
  235. resolve(response.data)
  236. },
  237. err => {
  238. reject(err)
  239. }
  240. )
  241. })
  242. }
  243. /**
  244. * put 方法封装
  245. * @param url
  246. * @param data
  247. * @returns {Promise}
  248. */
  249. export function put(url, data = {}, useService1 = false) {
  250. const service = useService1 ? service2 : service1;
  251. return new Promise((resolve, reject) => {
  252. service.put(url, data).then(
  253. response => {
  254. resolve(response.data)
  255. },
  256. err => {
  257. reject(err)
  258. }
  259. )
  260. })
  261. }
  262. /**
  263. * delete 方法封装
  264. * @param url
  265. * @param params
  266. * @returns {Promise}
  267. */
  268. export function deleteRequest(url, params = {}, type, useService1 = false) {
  269. const service = useService1 ? service2 : service1;
  270. return new Promise((resolve, reject) => {
  271. if (type == 'arr') {
  272. service.delete(url, {
  273. data: {
  274. ...params
  275. }
  276. }).then(
  277. response => {
  278. resolve(response.data)
  279. },
  280. err => {
  281. reject(err)
  282. }
  283. )
  284. } else if (type == 'array') {
  285. service.delete(url, {
  286. data: [...params]
  287. }).then(
  288. response => {
  289. resolve(response.data)
  290. },
  291. err => {
  292. reject(err)
  293. }
  294. )
  295. } else {
  296. service.delete(url, {
  297. params: {
  298. ...params
  299. }
  300. }).then(
  301. response => {
  302. resolve(response.data)
  303. },
  304. err => {
  305. reject(err)
  306. }
  307. )
  308. }
  309. })
  310. }
  311. //通知App(pad)端退出登录:
  312. //H5环境:web端处于markPaper-pad H5的iframe中,通过postMessage通知父页面退出登录
  313. function notifyPadAppLogout() {
  314. try {
  315. if (window.plus && plus.webview) {
  316. if (window.uni) {
  317. PadLogoutSendMsg()
  318. } else {
  319. // 等待JS桥准备完成再发消息,防止路由守卫触发太早uni不存在
  320. document.addEventListener('UniAppJSBridgeReady', PadLogoutSendMsg, {once:true})
  321. }
  322. } else {
  323. // H5:通知父级iframe页面(markPaper-pad H5)退出登录
  324. // const baseUrl = process.env.NODE_ENV === 'development' ? '*' : process.env.VUE_APP_BASE;
  325. window.parent.postMessage({ type: 'logout' }, '*');
  326. }
  327. } catch (e) {
  328. console.error('通知App端退出登录失败', e);
  329. }
  330. }
  331. //通知App端退出登录
  332. function PadLogoutSendMsg() {
  333. uni.postMessage({
  334. data: {type: 'logout'}
  335. })
  336. }