From 2f29a6e81cac7bc3a4a61ca1f235dfcc0dffb066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E5=B8=86?= <201379873@qq.com> Date: Wed, 10 Apr 2024 22:40:29 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E4=B8=8B=E8=BD=BD=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis/system/log.ts | 8 ++++ src/hooks/index.ts | 1 + src/hooks/modules/useDownload.ts | 55 +++++++++++++++++++++++++++ src/utils/http.ts | 17 +++++++-- src/views/system/log/LoginLog.vue | 12 +++--- src/views/system/log/OperationLog.vue | 11 ++++-- 6 files changed, 92 insertions(+), 12 deletions(-) create mode 100644 src/hooks/modules/useDownload.ts diff --git a/src/apis/system/log.ts b/src/apis/system/log.ts index fa0e248..ce39036 100644 --- a/src/apis/system/log.ts +++ b/src/apis/system/log.ts @@ -12,3 +12,11 @@ export function listLog(query: System.LogQuery) { export function getLog(id: string) { return http.get(`${BASE_URL}/${id}`) } +/** @desc 导出日志列表 */ +export function exportLog(query: System.LogQuery) { + return http.download(`${BASE_URL}/export/login`, query) +} +/**@desc 导出操作日志 */ +export function exportOperateLog(query: System.LogQuery) { + return http.download(`${BASE_URL}/export/operation`, query) +} \ No newline at end of file diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 18cff06..1229f0d 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -7,3 +7,4 @@ export * from './modules/useForm' export * from './modules/useDevice' export * from './modules/useBreakpoint' export * from './modules/useBreakpointIndex' +export * from './modules/useDownload' diff --git a/src/hooks/modules/useDownload.ts b/src/hooks/modules/useDownload.ts new file mode 100644 index 0000000..12154b9 --- /dev/null +++ b/src/hooks/modules/useDownload.ts @@ -0,0 +1,55 @@ +import { Message, Notification } from '@arco-design/web-vue' +/** + * @description 接收数据流生成 blob,创建链接,下载文件 + * @param {Function} api 导出表格的api方法 (必传) + * @param {String} tempName 导出的文件名 (必传) + * @param {Object} params 导出的参数 (默认{}) + * @param {Boolean} isNotify 是否有导出消息提示 (默认为 true) + * @param {String} fileType 导出的文件格式 (默认为.xlsx) + * */ +interface NavigatorWithMsSaveOrOpenBlob extends Navigator { + msSaveOrOpenBlob(blob: Blob, fileName: string): void +} +export const useDownload = async ( + api: (param: any) => Promise, + tempName: string = '', + params: any = {}, + isNotify = true, + fileType = '.xlsx' +) => { + try { + const res = await api(params) + if (res.headers['content-disposition']) { + tempName = decodeURI(res.headers['content-disposition'].split(';')[1].split('=')[1]); + } else { + tempName = tempName ? tempName : new Date().getTime() + fileType + } + if (isNotify && !res?.code) { + Notification.warning({ + title: '温馨提示', + content: '如果数据庞大会导致下载缓慢哦,请您耐心等待!' + }) + } + if (res.status !== 200 || res.data === null || !(res.data instanceof Blob)) { + Message.error('导出失败,请稍后再试!') + return + } + const blob = new Blob([res.data]) + // 兼容 edge 不支持 createObjectURL 方法 + if ('msSaveOrOpenBlob' in (navigator as unknown as NavigatorWithMsSaveOrOpenBlob)) { + ; (window.navigator as unknown as NavigatorWithMsSaveOrOpenBlob).msSaveOrOpenBlob(blob, tempName + fileType) + } + const blobUrl = window.URL.createObjectURL(blob) + const exportFile = document.createElement('a') + exportFile.style.display = 'none' + exportFile.download = tempName + exportFile.href = blobUrl + document.body.appendChild(exportFile) + exportFile.click() + // 去除下载对 url 的影响 + document.body.removeChild(exportFile) + window.URL.revokeObjectURL(blobUrl) + } catch (error) { + console.log(error) + } +} diff --git a/src/utils/http.ts b/src/utils/http.ts index 2183c5e..7ed4fef 100644 --- a/src/utils/http.ts +++ b/src/utils/http.ts @@ -61,7 +61,9 @@ http.interceptors.response.use( (response: AxiosResponse) => { const { data } = response const { success, code, msg } = data - + if(response.request.responseType==='blob'){ + return response + } // 成功 if (success) { NProgress.done() @@ -122,6 +124,7 @@ const requestNative = (config: AxiosRequestConfig): Promise { http .request(config) + .then((res: AxiosResponse) => resolve(res)) .catch((err: { msg: string }) => reject(err)) }) } @@ -173,5 +176,13 @@ const del = (url: string, params?: object, config?: AxiosRequestConfig) ...config }) } - -export default { get, post, put, patch, del, request, requestNative } +const download = (url: string, params?: object, config?: AxiosRequestConfig): Promise => { + return requestNative({ + method: 'get', + url, + responseType: 'blob', + params, + ...config + }) +} +export default { get, post, put, patch, del, request, requestNative,download } diff --git a/src/views/system/log/LoginLog.vue b/src/views/system/log/LoginLog.vue index b78bbfa..ee2d443 100644 --- a/src/views/system/log/LoginLog.vue +++ b/src/views/system/log/LoginLog.vue @@ -22,7 +22,7 @@