request.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import axios from 'axios'
  2. import { MessageBox, Message } from 'element-ui'
  3. import store from '@/store'
  4. import { geteSessionStorage } from '@/utils/auth'
  5. import qs from 'qs'
  6. import router from '@/router'
  7. declare module 'axios' {
  8. export interface AxiosRequestConfig {
  9. /**
  10. * 是否上传静态文件
  11. */
  12. file?: boolean
  13. }
  14. export interface AxiosResponse<T = any> {
  15. result: T
  16. code: number
  17. message: string
  18. }
  19. export interface AxiosInstance {
  20. <T = any>(config: AxiosRequestConfig): Promise<T>
  21. request<T = any>(config: AxiosRequestConfig): Promise<T>
  22. get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T>
  23. delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T>
  24. head<T = any>(url: string, config?: AxiosRequestConfig): Promise<T>
  25. post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>
  26. put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>
  27. patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>
  28. }
  29. }
  30. // 创建axios实例
  31. // export const IP = 'http://192.168.2.235:7081' // 开发2
  32. export const IP = 'https://yeepms.yeec.com.cn/gis-api' // 开发2
  33. // 暴露IP地址
  34. export const baseAddress = IP
  35. const service = axios.create({
  36. baseURL: IP,
  37. withCredentials: true, // 跨域请求时发送cookiesokies
  38. timeout: 30000 // 请求超时
  39. })
  40. let requestTimes = 0
  41. // 请求拦截器
  42. service.interceptors.request.use(
  43. (config) => {
  44. if (config.method === 'post' && config.url === '/auth/oauth/login') {
  45. // 请求为post 使用qs转换数据
  46. // if (config.method === 'post') { // 请求为post 使用qs转换数据
  47. config.data = qs.stringify(config.data)
  48. config.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
  49. } else {
  50. config.headers.post['Content-Type'] = 'application/json;charset=UTF-8'
  51. }
  52. if (config.file) {
  53. config.headers.post['Content-Type'] = 'multipart/form-data'
  54. }
  55. // 在发出请求前做点什么
  56. if (store.getters.token) {
  57. config.headers['Authorization'] = 'bearer ' + geteSessionStorage('token')
  58. }
  59. return config
  60. },
  61. (error) => {
  62. // 处理请求错误
  63. console.log(error)
  64. return Promise.reject(error)
  65. }
  66. )
  67. // 响应拦截器
  68. service.interceptors.response.use(
  69. /**
  70. * 如果您想要获取诸如头或状态之类的http信息
  71. * return response => response
  72. */
  73. /**
  74. * 通过自定义代码确定请求状态
  75. */
  76. (response) => {
  77. const res = response.data
  78. // 如果直接返回字符串(请求的图片 直接返回base64
  79. if (typeof res === 'string') return res
  80. // 下载文件 后端返回二进制流 直接返回data
  81. if (res instanceof ArrayBuffer) return res
  82. // 下载文件 后端返回二进制流 直接返回data
  83. if (res instanceof Blob) return res
  84. // 如果自定义代码是-1,则判断为错误。
  85. if (res.code === -1) {
  86. if (!res.message || res.message.length < 100) {
  87. Message({
  88. message: res.message || 'Error',
  89. type: 'error',
  90. duration: 2 * 1000
  91. })
  92. } else {
  93. Message({
  94. message: '系统错误',
  95. type: 'error',
  96. duration: 2 * 1000
  97. })
  98. }
  99. } else if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
  100. // to re-login
  101. MessageBox.confirm('您已注销,您可以取消以停留在此页,或重新登录', '确认注销', {
  102. confirmButtonText: '确定',
  103. cancelButtonText: '取消',
  104. type: 'warning'
  105. }).then(() => {
  106. store.dispatch('user/resetToken').then(() => {
  107. location.reload()
  108. })
  109. })
  110. } else {
  111. requestTimes = 0
  112. return res
  113. }
  114. return Promise.reject(new Error(res.message || 'Error')).catch((err) => {
  115. console.log(err)
  116. })
  117. },
  118. (error) => {
  119. function clearSession() {
  120. return new Promise((resolve) => {
  121. sessionStorage.clear()
  122. resolve(1)
  123. })
  124. }
  125. if (error.response.data.code === 401) {
  126. if (requestTimes === 0) {
  127. requestTimes = 1
  128. MessageBox.confirm('登录失效,请重新登录!', '提示', {
  129. confirmButtonText: '确定',
  130. showCancelButton: false,
  131. showClose: false,
  132. closeOnPressEscape: false,
  133. closeOnClickModal: false
  134. }).then(async () => {
  135. const result = await clearSession()
  136. if (result === 1) {
  137. requestTimes = 0
  138. router.replace('/login')
  139. }
  140. })
  141. }
  142. } else {
  143. Message({
  144. message: error.message,
  145. type: 'error',
  146. duration: 5 * 1000
  147. })
  148. }
  149. }
  150. )
  151. // 森鑫炬接口
  152. export function getSXJList(data) {
  153. return service({
  154. url: '/gis/sxjDocking/send',
  155. method: 'post',
  156. data
  157. })
  158. }
  159. export default service