From 74d50146e349223ad9beed8dc77edf3169fbe260 Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Tue, 31 Mar 2026 10:37:00 +0800 Subject: [PATCH] perf: update audit report --- .../ListTable/TableAction/ExportDialog.vue | 59 +++++++++++++-- .../ListTable/TableAction/ImExportDialog.vue | 5 ++ .../Table/ListTable/TableAction/RightSide.vue | 71 ++++++++++++++++++- src/views/audits/JobExecutionLogList.vue | 1 + src/views/audits/JobPeriodTaskList.vue | 1 + src/views/audits/LoginLog/LoginLogList.vue | 1 + .../audits/OperateLog/OperateLogList.vue | 6 +- src/views/audits/PasswordChangeLogList.vue | 6 +- src/views/sessions/FTPLogList.vue | 6 +- src/views/sessions/SessionList/BaseList.vue | 1 + src/views/tickets/BaseTicketList.vue | 1 + 11 files changed, 147 insertions(+), 11 deletions(-) diff --git a/src/components/Table/ListTable/TableAction/ExportDialog.vue b/src/components/Table/ListTable/TableAction/ExportDialog.vue index b6bfd44dd..03a3cc451 100644 --- a/src/components/Table/ListTable/TableAction/ExportDialog.vue +++ b/src/components/Table/ListTable/TableAction/ExportDialog.vue @@ -3,7 +3,7 @@ - + [] + }, + extraQuery: { + type: Object, + default: () => ({}) } }, data() { @@ -137,6 +165,9 @@ export default { tableHasQuery() { return Object.keys(this.tableQuery).length > 0 }, + iDialogTitle() { + return this.dialogTitle || this.$tc('Export') + }, exportOptions() { return [ { @@ -156,7 +187,10 @@ export default { } ] }, - exportTypeOptions() { + iExportTypeOptions() { + if (this.fileTypeOptions.length > 0) { + return this.fileTypeOptions + } return [ { label: 'CSV', @@ -172,10 +206,10 @@ export default { } }, beforeDestroy() { - this.$eventBus.$off('showExportDialog', this.showExportDialogHandler) + this.$eventBus.$off(this.triggerEvent, this.showExportDialogHandler) }, mounted() { - this.$eventBus.$on('showExportDialog', this.showExportDialogHandler) + this.$eventBus.$on(this.triggerEvent, this.showExportDialogHandler) }, methods: { showExportDialogHandler({ selectedRows, url, name }) { @@ -184,6 +218,9 @@ export default { } }, showExportDialog() { + this.exportTypeOption = this.fixedExportType || this.defaultExportType + this.exportOption = 'all' + if (!this.mfaVerifyRequired) { this.exportDialogShow = true @@ -199,6 +236,13 @@ export default { } this.$axios.get('/api/v1/authentication/confirm/check/?confirm_type=mfa').then(() => { this.exportDialogShow = true + if (this.hasSelected) { + this.exportOption = 'selected' + } + + if (this.tableHasQuery) { + this.exportOption = 'filtered' + } }) }, downloadCsv(url) { @@ -216,7 +260,8 @@ export default { const spm = await createSourceIdCache(resources) query['spm'] = spm.spm } - query['format'] = exportTypeOption + Object.assign(query, this.extraQuery) + query['format'] = exportTypeOption || this.fixedExportType || this.defaultExportType const queryStr = (url.indexOf('?') > -1 ? '&' : '?') + queryUtil.stringify(query, '=', '&') diff --git a/src/components/Table/ListTable/TableAction/ImExportDialog.vue b/src/components/Table/ListTable/TableAction/ImExportDialog.vue index 0bb410c25..009f12ae5 100644 --- a/src/components/Table/ListTable/TableAction/ImExportDialog.vue +++ b/src/components/Table/ListTable/TableAction/ImExportDialog.vue @@ -1,6 +1,7 @@ @@ -24,6 +25,10 @@ export default { type: Object, default: () => ({}) }, + reportExportOptions: { + type: Object, + default: () => ({}) + }, importOptions: { type: Object, default: () => ({}) diff --git a/src/components/Table/ListTable/TableAction/RightSide.vue b/src/components/Table/ListTable/TableAction/RightSide.vue index 92975c31f..b5ebf371c 100644 --- a/src/components/Table/ListTable/TableAction/RightSide.vue +++ b/src/components/Table/ListTable/TableAction/RightSide.vue @@ -4,6 +4,7 @@ ({}) + }, + handleReportExportClick: { + type: Function, + default: function({ selectedRows }) { + const url = this.iReportExportOptions.url + const triggerEvent = this.iReportExportOptions.triggerEvent || 'showReportExportDialog' + this.dialogExportVisible = true + this.$nextTick(() => { + this.$eventBus.$emit(triggerEvent, { selectedRows, url, name: this.name }) + }) + } + }, hasImport: defaultTrue, importOptions: { type: Object, @@ -133,9 +151,16 @@ export default { name: 'actionExport', icon: 'download', tip: this.$t('Export'), - has: this.hasExport, + has: this.showLegacyExport.bind(this), callback: this.handleExportClick.bind(this) }, + { + name: 'actionReportExport', + icon: 'fa-file-excel-o', + tip: this.$t('ReportExport'), + has: this.showReportExport.bind(this), + callback: this.handleReportExportClick.bind(this) + }, { name: 'actionRefresh', icon: 'refresh', @@ -179,9 +204,53 @@ export default { url: this.tableUrl, ...this.exportOptions } + }, + iReportExportOptions() { + const reportExportOptions = this.reportExportOptions || {} + const { + extraQuery = {}, + fileTypeOptions, + ...restReportExportOptions + } = reportExportOptions + + return { + url: this.tableUrl, + triggerEvent: 'showReportExportDialog', + dialogTitle: this.$t('ReportExport'), + fixedExportType: 'xlsx', + showFileType: false, + ...restReportExportOptions, + extraQuery: { + export_mode: 'report', + ...extraQuery + }, + fileTypeOptions: fileTypeOptions || [ + { + label: 'Excel', + value: 'xlsx', + can: true + } + ] + } } }, methods: { + getActionVisibility(value, args) { + if (typeof value === 'function') { + return value(args) + } + return value + }, + showLegacyExport(args) { + const reportExportVisibility = this.getActionVisibility(this.hasReportExport, args) + if (reportExportVisibility) { + return false + } + return this.getActionVisibility(this.hasExport, args) + }, + showReportExport(args) { + return this.getActionVisibility(this.hasReportExport, args) + }, handleFilterClick() { this.$emit('update:quick-filter-expand', !this.quickFilterExpand) }, diff --git a/src/views/audits/JobExecutionLogList.vue b/src/views/audits/JobExecutionLogList.vue index cbb989536..3c9d3d01f 100644 --- a/src/views/audits/JobExecutionLogList.vue +++ b/src/views/audits/JobExecutionLogList.vue @@ -95,6 +95,7 @@ export default { }, headerActions: { hasLeftActions: false, + hasReportExport: true, hasDatePicker: true, hasImport: false, searchConfig: { diff --git a/src/views/audits/JobPeriodTaskList.vue b/src/views/audits/JobPeriodTaskList.vue index f6a88e05c..ffca0da7d 100644 --- a/src/views/audits/JobPeriodTaskList.vue +++ b/src/views/audits/JobPeriodTaskList.vue @@ -73,6 +73,7 @@ export default { }, headerActions: { hasLeftActions: false, + hasReportExport: true, hasImport: false } } diff --git a/src/views/audits/LoginLog/LoginLogList.vue b/src/views/audits/LoginLog/LoginLogList.vue index 3ac0bb89b..661bc009a 100644 --- a/src/views/audits/LoginLog/LoginLogList.vue +++ b/src/views/audits/LoginLog/LoginLogList.vue @@ -36,6 +36,7 @@ export default { headerActions: { hasLeftActions: false, hasImport: false, + hasReportExport: true, hasDatePicker: true, searchConfig: { getUrlQuery: true diff --git a/src/views/audits/OperateLog/OperateLogList.vue b/src/views/audits/OperateLog/OperateLogList.vue index d6421194d..f1180e6c6 100644 --- a/src/views/audits/OperateLog/OperateLogList.vue +++ b/src/views/audits/OperateLog/OperateLogList.vue @@ -72,7 +72,11 @@ export default { headerActions: { hasLeftActions: false, hasImport: false, - hasDatePicker: true + hasReportExport: true, + hasDatePicker: true, + searchConfig: { + getUrlQuery: true + } } } } diff --git a/src/views/audits/PasswordChangeLogList.vue b/src/views/audits/PasswordChangeLogList.vue index 836052ad3..e39b79ae7 100644 --- a/src/views/audits/PasswordChangeLogList.vue +++ b/src/views/audits/PasswordChangeLogList.vue @@ -26,7 +26,11 @@ export default { headerActions: { hasLeftActions: false, hasImport: false, - hasDatePicker: true + hasReportExport: true, + hasDatePicker: true, + searchConfig: { + getUrlQuery: true + } } } } diff --git a/src/views/sessions/FTPLogList.vue b/src/views/sessions/FTPLogList.vue index 84ee1484d..9da7d9803 100644 --- a/src/views/sessions/FTPLogList.vue +++ b/src/views/sessions/FTPLogList.vue @@ -69,7 +69,11 @@ export default { headerActions: { hasLeftActions: false, hasImport: false, - hasDatePicker: true + hasReportExport: true, + hasDatePicker: true, + searchConfig: { + getUrlQuery: true + } } } } diff --git a/src/views/sessions/SessionList/BaseList.vue b/src/views/sessions/SessionList/BaseList.vue index 1ec9edeb3..fed9792c0 100644 --- a/src/views/sessions/SessionList/BaseList.vue +++ b/src/views/sessions/SessionList/BaseList.vue @@ -182,6 +182,7 @@ export default { headerActions: { hasLeftActions: false, hasImport: false, + hasReportExport: true, hasDatePicker: true, searchConfig: { getUrlQuery: false, diff --git a/src/views/tickets/BaseTicketList.vue b/src/views/tickets/BaseTicketList.vue index 42aefc643..2da7e2e45 100644 --- a/src/views/tickets/BaseTicketList.vue +++ b/src/views/tickets/BaseTicketList.vue @@ -193,6 +193,7 @@ export default { }, defaultTicketActions: { hasImport: false, + hasReportExport: true, hasMoreActions: false, hasLeftActions: true, canCreate: this.$hasPerm('tickets.view_ticket'),