From d5667573faab67538e7f0dda7df315c6604c462f Mon Sep 17 00:00:00 2001 From: wzclm <2855471171@qq.com> Date: Thu, 20 Feb 2025 23:14:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=B3=BB=E7=BB=9F=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E7=9A=84=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/logs/index.js | 37 +++ src/api/roles/index.js | 0 src/utils/request.js | 57 ++-- src/utils/sort.js | 40 +++ src/views/system/data/index.vue | 2 +- src/views/system/devices/index.vue | 2 +- src/views/system/logs/index.vue | 346 ++++++++++++++++++++----- src/views/system/permissions/index.vue | 2 +- 8 files changed, 397 insertions(+), 89 deletions(-) create mode 100644 src/api/logs/index.js create mode 100644 src/api/roles/index.js create mode 100644 src/utils/sort.js diff --git a/src/api/logs/index.js b/src/api/logs/index.js new file mode 100644 index 0000000..42accbb --- /dev/null +++ b/src/api/logs/index.js @@ -0,0 +1,37 @@ +import request from '@/utils/request' + +/** + * 获取系统日志列表 + * @param {Object} params - 查询参数 + * @param {Array} [params.dateRange] - 时间范围 + * @param {string} [params.type] - 日志类型 + * @param {string} [params.user] - 操作人 + * @param {string} [params.status] - 状态 + * @returns {Promise} 返回日志列表数据 + */ +export function getLogList(params) { + return request.get('/api/logs') +} + +/** + * 导出日志 + * @returns {Promise} 返回二进制文件流 + */ +export function exportLogs() { + return request.get('/api/logs/export', { + responseType: 'arraybuffer', + headers: { + 'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + } + }) +} + +/** + * 清理过期日志 + * @param {Object} params - 清理参数 + * @param {number} [params.days=30] - 保留最近多少天的日志,默认30天 + * @returns {Promise} 返回清理结果 + */ +export function cleanupLogs(params = { days: 30 }) { + return request.post('/api/logs/cleanup', params) +} diff --git a/src/api/roles/index.js b/src/api/roles/index.js new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/request.js b/src/utils/request.js index 7152e57..3b8e0ce 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -36,30 +36,35 @@ service.interceptors.request.use( // 响应拦截器 service.interceptors.response.use( (response) => { - const res = response.data + // 如果是二进制数据,直接返回 + if (response.config.responseType === 'arraybuffer' || response.config.responseType === 'blob') { + return response.data; + } + + const res = response.data; // 如果响应成功 if (res.success) { - return res + return res; } // 处理特定错误码 switch (res.code) { case 401: - handleUnauthorized() - break + handleUnauthorized(); + break; case 403: - ElMessage.error('没有权限访问该资源') - break + ElMessage.error('没有权限访问该资源'); + break; case 500: - console.error('服务器错误详情:', res) - ElMessage.error(res.message || '服务器错误,请稍后重试') - break + console.error('服务器错误详情:', res); + ElMessage.error(res.message || '服务器错误,请稍后重试'); + break; default: - ElMessage.error(res.message || '请求失败') + ElMessage.error(res.message || '请求失败'); } - return Promise.reject(new Error(res.message || '请求失败')) + return Promise.reject(new Error(res.message || '请求失败')); }, (error) => { console.error('响应错误详情:', { @@ -73,36 +78,36 @@ service.interceptors.response.use( headers: error.config?.headers, params: error.config?.params } - }) + }); // 处理网络错误 if (!error.response) { - ElMessage.error('网络错误,请检查您的网络连接') - return Promise.reject(error) + ElMessage.error('网络错误,请检查您的网络连接'); + return Promise.reject(error); } // 处理HTTP状态码错误 - const status = error.response.status + const status = error.response.status; switch (status) { case 401: - handleUnauthorized() - break + handleUnauthorized(); + break; case 403: - ElMessage.error('没有权限访问该资源') - break + ElMessage.error('没有权限访问该资源'); + break; case 404: - ElMessage.error('请求的资源不存在') - break + ElMessage.error('请求的资源不存在'); + break; case 500: - ElMessage.error('服务器错误,请稍后重试') - break + ElMessage.error('服务器错误,请稍后重试'); + break; default: - ElMessage.error(`请求失败:${error.message}`) + ElMessage.error(`请求失败:${error.message}`); } - return Promise.reject(error) + return Promise.reject(error); } -) +); // 处理未授权情况 const handleUnauthorized = () => { diff --git a/src/utils/sort.js b/src/utils/sort.js new file mode 100644 index 0000000..88bf2dc --- /dev/null +++ b/src/utils/sort.js @@ -0,0 +1,40 @@ +/** + * 对数组按照指定字段进行排序 + * @param {Array} array - 要排序的数组 + * @param {string} field - 排序字段 + * @param {string} [order='asc'] - 排序方式:'asc' 升序,'desc' 降序 + * @returns {Array} 排序后的新数组 + */ +export function sortArrayByField(array, field, order = 'asc') { + if (!Array.isArray(array) || array.length === 0) { + return array; + } + + const sortedArray = [...array].sort((a, b) => { + let valueA = a[field]; + let valueB = b[field]; + + // 处理日期类型 + if (field.includes('time') || field.includes('date') || field.includes('at')) { + valueA = new Date(valueA).getTime(); + valueB = new Date(valueB).getTime(); + } + // 处理数字类型 + else if (typeof valueA === 'number' && typeof valueB === 'number') { + return order === 'asc' ? valueA - valueB : valueB - valueA; + } + // 处理字符串类型 + else { + valueA = String(valueA).toLowerCase(); + valueB = String(valueB).toLowerCase(); + } + + if (order === 'asc') { + return valueA > valueB ? 1 : -1; + } else { + return valueA < valueB ? 1 : -1; + } + }); + + return sortedArray; +} \ No newline at end of file diff --git a/src/views/system/data/index.vue b/src/views/system/data/index.vue index dd1815b..418f6ef 100644 --- a/src/views/system/data/index.vue +++ b/src/views/system/data/index.vue @@ -237,7 +237,7 @@ const icons = {