From d62876d53574eae2480c350a5251e0bb777e279e Mon Sep 17 00:00:00 2001 From: zhanghua <314079846@qq.com> Date: 星期四, 03 十一月 2022 17:55:27 +0800 Subject: [PATCH] http 请求重新封装 --- src/api/intelligentPatrol/statistics.js | 22 - src/http/index.js | 218 +++++++++++++++++++++++++++ src/http/interceptor-handler.js | 106 +++++++++++++ src/utils/loading.js | 47 +++++ src/http/url-recorder.js | 54 ++++++ 5 files changed, 432 insertions(+), 15 deletions(-) diff --git a/src/api/intelligentPatrol/statistics.js b/src/api/intelligentPatrol/statistics.js index 2ba6fd0..d230be2 100644 --- a/src/api/intelligentPatrol/statistics.js +++ b/src/api/intelligentPatrol/statistics.js @@ -1,21 +1,13 @@ -import axios from "axios"; -import { - getToken -} from '@/utils/helper' +import http from '@/http' + + const baseUrl = '/sccg/intelligentPatrol/statistics' -const token = { - 'Authorization': getToken() -} + export default { // 鎸夎繚瑙勭被鍨嬬粺璁� - searchByType: (data) => axios({ - method: 'get', - url: baseUrl + '/unlawful/type', - headers: { - ...token - }, - params: data - }), + searchByType: (params) => { + return http.get('/sccg/intelligentPatrol/statistics/unlawful/type', params); + }, // 鎸夌偣浣嶇粺璁� searchByPoint: (data) => axios({ method: 'get', diff --git a/src/http/index.js b/src/http/index.js new file mode 100644 index 0000000..05bdd7e --- /dev/null +++ b/src/http/index.js @@ -0,0 +1,218 @@ +import axios from 'axios' +import { + handleResponseSuccess, + handleResponseFail, + handleRequest +} from './interceptor-handler' +import { + showFullScreenLoading +} from '../utils/loading' +// import { getStorage } from '@utils/storage' + +// URL 璁板綍鍣� +import urlRecorder from './url-recorder' + +const axiosInstance = axios.create({ + // baseURL: `${process.env.VUE_APP_API_BASE_URL}`, + timeout: 1000 * 60 * 5 +}) + +axiosInstance.interceptors.request.use(handleRequest) +axiosInstance.interceptors.response.use(handleResponseSuccess, handleResponseFail) +/** + * 鍦� get 璇锋眰鐨� url 鍚庨潰鍔犱釜闅忔満鍙傛暟锛屼互闃叉祻瑙堝櫒缂撳瓨璇锋眰 + * @param {string} url + * @return {string} + */ +function addVersion(url) { + return url.includes('?') ? `${url}&v=${Date.now()}` : `${url}?v=${Date.now()}` +} + +export default { + // 榛樿鐨勫紓甯稿鐞嗘柟娉曪紝浼氫紶鍏ュ畬鏁寸殑data瀵硅薄锛屽彲浠ュ湪杩欓噷寮规彁绀烘 + defaultErrorHandler: null, + /** + * 閫氳繃get鍙戦�佸苟鎺ユ敹json鏍煎紡鐨勬暟鎹紙get鍙戠殑鏈潵灏辨槸json鏍煎紡锛夈�� + * 骞剁粺涓�澶勭悊甯歌鐨勯敊璇� + * @param {string} url + * @param {object?} params={} + * @param {boolean?} throwError 鏄惁涓嶄娇鐢ㄩ粯璁ょ殑寮傚父澶勭悊鏂规硶锛岃�屾妸寮傚父鎶涘嚭鏉� + * @param {int?} timeout 瓒呮椂鏃堕棿锛岄粯璁�10绉� + * @return {Promise} 杩斿洖涓�涓猵romise瀵硅薄銆傚叾涓璽hen鏂规硶浼犻�掑洖鍖呬腑鐨刣ata鏁版嵁锛沜atch浜嬩欢鍒欎紶閫掓暣涓洖鍖咃紝鍏跺弬鏁颁负{data:{},status{code:123,message:'xxx'}} + */ + get(url, params = {}, throwError, timeout) { + const config = { + method: 'GET', + url: addVersion(url), + params, + errorHandler: (!throwError && this.defaultErrorHandler) || null, + // headers: { 'Content-Type': 'application/json', token: thisToken }, + headers: { + 'Content-Type': 'application/json' + }, + withCredentials: this.withCredentials, + timeout: timeout + } + if (params.showLoading === undefined) { + showFullScreenLoading() + } + return axiosInstance(config) + }, + + /** + * 閫氳繃post鍙戦�佹暟鎹紝浣垮悗绔洿鎺ユ敹鍒癹son鏍煎紡鐨勬暟鎹�傚苟缁熶竴澶勭悊甯歌鐨勯敊璇� + * @param {string} url + * @param {object?} data={} + * @param {boolean?} throwError 鏄惁涓嶄娇鐢ㄩ粯璁ょ殑寮傚父澶勭悊鏂规硶锛岃�屾妸寮傚父鎶涘嚭鏉� + * @param {int?} timeout 瓒呮椂鏃堕棿锛岄粯璁�10绉� + * @return {Promise} 杩斿洖涓�涓猵romise瀵硅薄銆傚叾涓璽hen鏂规硶浼犻�掑洖鍖呬腑鐨刣ata鏁版嵁锛沜atch浜嬩欢鍒欎紶閫掓暣涓洖鍖咃紝鍏跺弬鏁颁负{data:{},status{code:123,message:'xxx'}} + */ + post(url, data = {}, throwError) { + const config = { + method: 'POST', + url, + data: JSON.stringify(data), + errorHandler: (!throwError && this.defaultErrorHandler) || null, + headers: { + 'Content-Type': 'application/json' + }, + withCredentials: this.withCredentials + } + urlRecorder.add(config) + if (data.showLoading === undefined) { + showFullScreenLoading() + } + return axiosInstance(config) + }, + // PUT鏇存柊鏁版嵁 + put(url, data = {}, throwError) { + const config = { + method: 'PUT', + url, + data: JSON.stringify(data), + errorHandler: (!throwError && this.defaultErrorHandler) || null, + headers: { + 'Content-Type': 'application/json' + }, + withCredentials: this.withCredentials + } + urlRecorder.add(config) + if (data.showLoading === undefined) { + showFullScreenLoading() + } + return axiosInstance(config) + }, + // DELETE鏇存柊鏁版嵁 + delete(url, data = {}, throwError) { + const config = { + method: 'delete', + url, + data: JSON.stringify(data), + errorHandler: (!throwError && this.defaultErrorHandler) || null, + headers: { + 'Content-Type': 'application/json' + }, + withCredentials: this.withCredentials + } + urlRecorder.add(config) + if (data.showLoading === undefined) { + showFullScreenLoading() + } + return axiosInstance(config) + }, + /** + * 閫氳繃琛ㄥ崟get涓嬭浇鏂囦欢銆傚苟缁熶竴澶勭悊甯歌鐨勯敊璇� + * @param {string} url + * @param {String} fileName 鏂囦欢鍚� + * @param {Object?} data 涓婁紶杩涘害鍥炶皟锛屽弬鏁颁负event + * @param {Function?} throwError 鏄惁涓嶄娇鐢ㄩ粯璁ょ殑寮傚父澶勭悊鏂规硶锛岃�屾妸寮傚父鎶涘嚭鏉� + * @return {Promise} 杩斿洖涓�涓猵romise瀵硅薄 + */ + downloadFile(url, params, data = {}, throwError) { + const { + fileName, + type + } = params + return axiosInstance({ + method: 'GET', + url, + responseType: 'arraybuffer', + data: JSON.stringify(data), + errorHandler: (!throwError && this.defaultErrorHandler) || null, + timeout: 50000, + headers: { + 'Content-Type': 'application/json' + } + }).then(response => { + const blob = new Blob([response], { + type + }) // 涓嶅吋瀹箃ype + // 鍒╃敤a鏍囩瀹炵幇涓嬭浇 + const link = document.createElement('a') + link.style.display = 'none' + link.setAttribute('type', MimeType) // 骞朵笉鏀寔 + const downUrl = window.URL.createObjectURL(blob) + link.href = downUrl + // 娣诲姞鍒版祻瑙堝櫒涓轰簡鍏煎 firefox + document.body.appendChild(link) + // 涓轰簡鍏煎qq娴忚鍣紝fileName涓繀椤诲姞涓婃枃浠跺悗缂� + link.download = fileName + link.click() + document.body.removeChild(link) + }) + }, + /** + * 閫氳繃a鏍囩鎵撳紑鏂囦欢 + * @param {string} url + */ + downloadFileByA(url) { + // const {fileName} = params + // 鍒╃敤a鏍囩瀹炵幇涓嬭浇 + const link = document.createElement('a') + link.style.display = 'none' + link.href = `${process.env.VUE_APP_DOWN_FILE}${url}` + // 娣诲姞鍒版祻瑙堝櫒涓轰簡鍏煎 firefox + document.body.appendChild(link) + // 涓轰簡鍏煎qq娴忚鍣紝fileName涓繀椤诲姞涓婃枃浠跺悗缂� + // link.download = fileName + link.click() + document.body.removeChild(link) + return Promise.resolve() + }, + /** + * 閫氳繃a鏍囩涓嬭浇鏂囦欢 + * @param {string} url + */ + downloadFileByAtag(url) { + // 鍒╃敤a鏍囩瀹炵幇涓嬭浇 + const link = document.createElement('a') + link.download = url + link.target = '_blank' + link.style.display = 'none' + link.href = url + document.body.appendChild(link) + link.click() + document.body.removeChild(link) + return Promise.resolve() + }, + /** + * 閫氳繃琛ㄥ崟post涓婁紶鏂囦欢骞舵帴鏀秊son鏍煎紡鐨勬暟鎹�傚苟缁熶竴澶勭悊甯歌鐨勯敊璇� + * @param {string} url + * @param {FormData|object} formElem FormData瀵硅薄锛屾垨form Dom鍏冪礌锛屽叾涓渶瑕佸惈鏈変竴涓猲ame涓篺iles鐨勯�夋嫨鏂囦欢鐨刬nput鍏冪礌 + * @param {Function?} onUploadProgress 涓婁紶杩涘害鍥炶皟锛屽弬鏁颁负event + * @param {boolean?} throwError 鏄惁涓嶄娇鐢ㄩ粯璁ょ殑寮傚父澶勭悊鏂规硶锛岃�屾妸寮傚父鎶涘嚭鏉� + * @param {int?} timeout 瓒呮椂鏃堕棿锛岄粯璁�50绉� + * @return {Promise} 杩斿洖涓�涓猵romise瀵硅薄銆傚叾涓璽hen鏂规硶浼犻�掑洖鍖呬腑鐨刣ata鏁版嵁锛沜atch浜嬩欢鍒欎紶閫掓暣涓洖鍖咃紝鍏跺弬鏁颁负{data:{},status{code:123,message:'xxx'}} + */ + uploadFile(url, formElem, onUploadProgress, throwError) { + return axiosInstance({ + method: 'POST', + url, + data: formElem instanceof FormData ? formElem : new FormData(formElem), + onUploadProgress, + errorHandler: (!throwError && this.defaultErrorHandler) || null, + timeout: 500000, + enableRepeat: true + }) + } +} \ No newline at end of file diff --git a/src/http/interceptor-handler.js b/src/http/interceptor-handler.js new file mode 100644 index 0000000..b3e2e32 --- /dev/null +++ b/src/http/interceptor-handler.js @@ -0,0 +1,106 @@ +// URL 璁板綍鍣� +import Vue from 'vue' +import urlRecorder from './url-recorder' +import { + tryHideFullScreenLoading +} from '../utils/loading' +/** + * 瀵规垚鍔熻繑鍥炵殑璇锋眰鍥炲寘杩涜鏁版嵁棰勫鐞� + * @param response + * @returns {Promise} + */ +export function handleResponseSuccess(response) { + debugger + tryHideFullScreenLoading() + urlRecorder.remove(response.config) + const result = response.data + + // return result.content + if (result.code === 200) { + return result.data || result.content + } else if (result.code && result.code !== 0) { + return handleError(response.config, result) + } else if (result === '') { + Vue.prototype.$message({ + type: 'error', + message: '鏈嶅姟鍐呴儴閿欒' + }) + return result + } else { + // 鏉ヨ嚜鍏跺畠鏈嶅姟鍣ㄧ殑璇锋眰 + return result + } +} + +/** + * 瀵瑰彂閫佸け璐ョ殑璇锋眰杩涜鏁版嵁棰勫鐞嗭紝灏唀rror瀵硅薄灏佽涓虹粺涓�鐨勫舰寮� + * @param error + * @returns {Promise} + */ +export function handleResponseFail(error) { + tryHideFullScreenLoading() + urlRecorder.remove(error.config) + let result + if (error.response) { + // 璇锋眰宸插彂閫侊紝鍝嶅簲涓繑鍥炰簡闈�2xx鐨勯敊璇爜锛屽寘鎷�304绛� + result = { + data: error.response.data, + msg: error.response.statusText + } + } else if (error.request) { + // 璇锋眰娌℃湁鍙戦�佹垚鍔熸椂鐨勯敊璇� + result = { + data: error.request, + msg: error.message + } + } else { + // 璁剧疆璇锋眰鏃跺嚭閿� + result = { + msg: error.message + } + } + + return handleError(error.config, result) +} + +/** + * 缁熶竴鐨勫紓甯稿璞″皝瑁呴�昏緫锛屽湪杩欓噷鎶涘嚭寮傚父 + * @param {object} requestConfig 鍙戣姹傛椂浼犲叆axios鐨勯厤缃俊鎭璞� + * @param {object|Error} result 璇锋眰鍥炲寘瀵硅薄锛屾垨寮傚父淇℃伅 + * @param {object} result.content + * @param {number} result.code + * @param {string} result.msg + * @returns {Promise} + */ +export function handleError(requestConfig, result) { + // 蹇呴』鏄疎rror瀵硅薄锛屽惁鍒檛hrow鏃秜uex瑕佹姤warning + // let err + // if (result instanceof Error) { + // err = result + // } else { + // err = new Error(result.msg) + // err.content = result.content + // err.code = result.code + // err.msg = result.msg + // } + if (requestConfig && requestConfig.errorHandler) { + result.url = requestConfig.url + requestConfig.errorHandler(result) + result.processed = true + } + return Promise.reject(result) +} + +/** + * 璇锋眰鎷︽埅鍣紝娣诲姞鐢ㄦ埛token + */ +export function handleRequest(config) { + + const token = sessionStorage.getItem('token'); + const tokenHead = sessionStorage.getItem('tokenHead'); + if (token && tokenHead) { + // 杩欓噷缁忓父鎼厤token浣跨敤锛屽皢token鍊奸厤缃埌tokenkey涓紝灏唗okenkey鏀惧湪璇锋眰澶翠腑 + config.headers['Authorization'] = tokenHead + token + } + return config +} \ No newline at end of file diff --git a/src/http/url-recorder.js b/src/http/url-recorder.js new file mode 100644 index 0000000..a79d433 --- /dev/null +++ b/src/http/url-recorder.js @@ -0,0 +1,54 @@ +// 璁板綍姝e湪鍙戦�佷腑鐨勮姹傦紝浠ュ垽鏂槸鍚﹂噸澶嶅彂鍖� +export default { + // 姝e湪杩涜涓殑璇锋眰鍒楄〃 + urlList: [], + + /** + * 娣诲姞涓�涓柊鐨勮姹傝褰曪紝濡傛灉宸茬粡瀛樺湪杩涜涓殑璇锋眰浜嗭紝灏辨姏鍑哄紓甯� + * @param {string} config + * @param {string} config.url 璇锋眰鍦板潃 + * @param {string} config.enableRepeat 鍏佽鍚屾椂鍙戦�佸涓浉鍚岃姹� + * @return {Promise} + */ + add(config) { + // 鍏佽鍚屾椂鍙戦�佸涓浉鍚岃姹� + // 姣斿鎵归噺涓婁紶鍥剧墖鐨勬椂鍊� + if (config.enableRepeat) return Promise.resolve() + + const url = config.url + + // 濡傛灉璇锋眰杩樺湪闃熷垪閲岋紝璇存槑杩樺湪澶勭悊锛屾病鏈夊洖鍖� + if (this.urlList.includes(url)) { + const errorMessage = `璇锋眰 ${url} 姝e湪澶勭悊锛岃绋嶅悗鍐嶈瘯锛乣 + console.error(errorMessage) + const error = { + status: { + code: 1007, // 涓存椂鍐欑殑 + debugMessage: url, + // eslint-disable-next-line no-use-before-define + message: error.message + } + } + return Promise.reject(error) + } + + // 杩欓噷娌℃湁鍓嶇紑锛屼絾鏄痳emove涓湁 + this.urlList.push(`${process.env.VUE_APP_API_BASE_URL}${url}`) + + return Promise.resolve() + }, + /** + * 鍒犻櫎涓�涓鍦ㄨ繘琛岀殑璇锋眰璁板綍 + * @param {string} config + * @param {string} config.url 璇锋眰鍦板潃 + */ + remove(config) { + // 鍏佽鍚屾椂鍙戦�佸涓浉鍚岃姹� + if (config.enableRepeat) return + + const index = this.urlList.indexOf(config.url) + if (index >= 0) { + this.urlList.splice(index, 1) + } + } +} diff --git a/src/utils/loading.js b/src/utils/loading.js new file mode 100644 index 0000000..bc6af53 --- /dev/null +++ b/src/utils/loading.js @@ -0,0 +1,47 @@ +import { Loading } from 'element-ui' + +/** 瀹氫箟loading鍙橀噺 */ +let loading + +/** 浣跨敤Element loading-start 鏂规硶 */ +function startLoading() { + loading = Loading.service({ + lock: true, + text: '鍔犺浇涓�︹��', + background: 'rgba(0, 0, 0, 0.7)' + }) +} + +/** 浣跨敤Element loading-close 鏂规硶 */ +function endLoading() { + loading.close() +} + +/** + * 閭d箞 showFullScreenLoading() tryHideFullScreenLoading() 瑕佸共鐨勪簨鍎垮氨鏄皢鍚屼竴鏃跺埢鐨勮姹傚悎骞躲�� + * 澹版槑涓�涓彉閲� needLoadingRequestCount锛屾瘡娆¤皟鐢╯howFullScreenLoading鏂规硶 needLoadingRequestCount + 1銆� + * 璋冪敤tryHideFullScreenLoading()鏂规硶锛宯eedLoadingRequestCount - 1銆俷eedLoadingRequestCount涓� 0 鏃讹紝缁撴潫 loading銆� + */ +let needLoadingRequestCount = 0 + +/** 鏄剧ずLoading */ +export function showFullScreenLoading() { + if (needLoadingRequestCount === 0) { + startLoading() + } + needLoadingRequestCount++ +} + +/** 闅愯棌Loading */ +export function tryHideFullScreenLoading() { + if (needLoadingRequestCount <= 0) return + needLoadingRequestCount-- + if (needLoadingRequestCount === 0) { + endLoading() + } +} + +export default { + showFullScreenLoading, + tryHideFullScreenLoading +} -- Gitblit v1.8.0