From ea36f1c8edf199dcfe551c1cf50413c491724a86 Mon Sep 17 00:00:00 2001 From: Master Date: Thu, 1 Aug 2024 17:51:12 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B7=AE=E5=BC=82?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/Logging/SysLogDiffService.cs | 103 ++++++++++-------- Web/src/api-services/apis/sys-log-diff-api.ts | 85 +++++++++++++++ .../models/admin-result-sys-log-diff.ts | 69 ++++++++++++ Web/src/views/system/log/difflog/index.vue | 62 +++++++++++ 4 files changed, 273 insertions(+), 46 deletions(-) create mode 100644 Web/src/api-services/models/admin-result-sys-log-diff.ts diff --git a/Admin.NET/Admin.NET.Core/Service/Logging/SysLogDiffService.cs b/Admin.NET/Admin.NET.Core/Service/Logging/SysLogDiffService.cs index 755ded76..0afa7f79 100644 --- a/Admin.NET/Admin.NET.Core/Service/Logging/SysLogDiffService.cs +++ b/Admin.NET/Admin.NET.Core/Service/Logging/SysLogDiffService.cs @@ -1,47 +1,58 @@ -// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 -// -// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 -// -// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! - -namespace Admin.NET.Core.Service; - -/// -/// 系统差异日志服务 🧩 -/// -[ApiDescriptionSettings(Order = 330)] -public class SysLogDiffService : IDynamicApiController, ITransient -{ - private readonly SqlSugarRepository _sysLogDiffRep; - - public SysLogDiffService(SqlSugarRepository sysLogDiffRep) - { - _sysLogDiffRep = sysLogDiffRep; - } - - /// - /// 获取差异日志分页列表 🔖 - /// - /// - [SuppressMonitor] - [DisplayName("获取差异日志分页列表")] - public async Task> Page(PageLogInput input) - { - return await _sysLogDiffRep.AsQueryable() - .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()), u => u.CreateTime >= input.StartTime) - .WhereIF(!string.IsNullOrWhiteSpace(input.EndTime.ToString()), u => u.CreateTime <= input.EndTime) - .OrderBy(u => u.CreateTime, OrderByType.Desc) - .ToPagedListAsync(input.Page, input.PageSize); - } - - /// - /// 清空差异日志 🔖 - /// - /// - [ApiDescriptionSettings(Name = "Clear"), HttpPost] - [DisplayName("清空差异日志")] - public void Clear() - { - _sysLogDiffRep.AsSugarClient().DbMaintenance.TruncateTable(); - } +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统差异日志服务 🧩 +/// +[ApiDescriptionSettings(Order = 330)] +public class SysLogDiffService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysLogDiffRep; + + public SysLogDiffService(SqlSugarRepository sysLogDiffRep) + { + _sysLogDiffRep = sysLogDiffRep; + } + + /// + /// 获取差异日志分页列表 🔖 + /// + /// + [SuppressMonitor] + [DisplayName("获取差异日志分页列表")] + public async Task> Page(PageLogInput input) + { + return await _sysLogDiffRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()), u => u.CreateTime >= input.StartTime) + .WhereIF(!string.IsNullOrWhiteSpace(input.EndTime.ToString()), u => u.CreateTime <= input.EndTime) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 获取差异日志详情 🔖 + /// + /// + [SuppressMonitor] + [DisplayName("获取差异日志详情")] + public async Task GetDetail(long id) + { + return await _sysLogDiffRep.GetFirstAsync(u => u.Id == id); + } + + /// + /// 清空差异日志 🔖 + /// + /// + [ApiDescriptionSettings(Name = "Clear"), HttpPost] + [DisplayName("清空差异日志")] + public void Clear() + { + _sysLogDiffRep.AsSugarClient().DbMaintenance.TruncateTable(); + } } \ No newline at end of file diff --git a/Web/src/api-services/apis/sys-log-diff-api.ts b/Web/src/api-services/apis/sys-log-diff-api.ts index 11816f39..8b546c08 100644 --- a/Web/src/api-services/apis/sys-log-diff-api.ts +++ b/Web/src/api-services/apis/sys-log-diff-api.ts @@ -18,6 +18,7 @@ import { Configuration } from '../configuration'; // @ts-ignore import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from '../base'; import { AdminResultSqlSugarPagedListSysLogDiff } from '../models'; +import { AdminResultSysLogDiff } from '../models'; import { PageLogInput } from '../models'; /** * SysLogDiffApi - axios parameter creator @@ -68,6 +69,55 @@ export const SysLogDiffApiAxiosParamCreator = function (configuration?: Configur options: localVarRequestOptions, }; }, + /** + * + * @summary 获取差异日志详情 🔖 + * @param {number} id + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + apiSysLogDiffDetailIdGet: async (id: number, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + if (id === null || id === undefined) { + throw new RequiredError('id','Required parameter id was null or undefined when calling apiSysLogDiffDetailIdGet.'); + } + const localVarPath = `/api/sysLogDiff/detail/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, 'https://example.com'); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + const localVarRequestOptions :AxiosRequestConfig = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication Bearer required + // http bearer authentication required + if (configuration && configuration.accessToken) { + const accessToken = typeof configuration.accessToken === 'function' + ? await configuration.accessToken() + : await configuration.accessToken; + localVarHeaderParameter["Authorization"] = "Bearer " + accessToken; + } + + const query = new URLSearchParams(localVarUrlObj.search); + for (const key in localVarQueryParameter) { + query.set(key, localVarQueryParameter[key]); + } + for (const key in options.params) { + query.set(key, options.params[key]); + } + localVarUrlObj.search = (new URLSearchParams(query)).toString(); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash, + options: localVarRequestOptions, + }; + }, /** * * @summary 获取差异日志分页列表 🔖 @@ -138,6 +188,20 @@ export const SysLogDiffApiFp = function(configuration?: Configuration) { return axios.request(axiosRequestArgs); }; }, + /** + * + * @summary 获取差异日志详情 🔖 + * @param {number} id + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async apiSysLogDiffDetailIdGet(id: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise>> { + const localVarAxiosArgs = await SysLogDiffApiAxiosParamCreator(configuration).apiSysLogDiffDetailIdGet(id, options); + return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => { + const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url}; + return axios.request(axiosRequestArgs); + }; + }, /** * * @summary 获取差异日志分页列表 🔖 @@ -170,6 +234,16 @@ export const SysLogDiffApiFactory = function (configuration?: Configuration, bas async apiSysLogDiffClearPost(options?: AxiosRequestConfig): Promise> { return SysLogDiffApiFp(configuration).apiSysLogDiffClearPost(options).then((request) => request(axios, basePath)); }, + /** + * + * @summary 获取差异日志详情 🔖 + * @param {number} id + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async apiSysLogDiffDetailIdGet(id: number, options?: AxiosRequestConfig): Promise> { + return SysLogDiffApiFp(configuration).apiSysLogDiffDetailIdGet(id, options).then((request) => request(axios, basePath)); + }, /** * * @summary 获取差异日志分页列表 🔖 @@ -200,6 +274,17 @@ export class SysLogDiffApi extends BaseAPI { public async apiSysLogDiffClearPost(options?: AxiosRequestConfig) : Promise> { return SysLogDiffApiFp(this.configuration).apiSysLogDiffClearPost(options).then((request) => request(this.axios, this.basePath)); } + /** + * + * @summary 获取差异日志详情 🔖 + * @param {number} id + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof SysLogDiffApi + */ + public async apiSysLogDiffDetailIdGet(id: number, options?: AxiosRequestConfig) : Promise> { + return SysLogDiffApiFp(this.configuration).apiSysLogDiffDetailIdGet(id, options).then((request) => request(this.axios, this.basePath)); + } /** * * @summary 获取差异日志分页列表 🔖 diff --git a/Web/src/api-services/models/admin-result-sys-log-diff.ts b/Web/src/api-services/models/admin-result-sys-log-diff.ts new file mode 100644 index 00000000..2156e209 --- /dev/null +++ b/Web/src/api-services/models/admin-result-sys-log-diff.ts @@ -0,0 +1,69 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Admin.NET 通用权限开发平台 + * 让 .NET 开发更简单、更通用、更流行。整合最新技术,模块插件式开发,前后端分离,开箱即用。
👮不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by the swagger code generator program. + * https://github.com/swagger-api/swagger-codegen.git + * Do not edit the class manually. + */ + +import { SysLogDiff } from './sys-log-diff'; + /** + * 全局返回结果 + * + * @export + * @interface AdminResultSysLogDiff + */ +export interface AdminResultSysLogDiff { + + /** + * 状态码 + * + * @type {number} + * @memberof AdminResultSysLogDiff + */ + code?: number; + + /** + * 类型success、warning、error + * + * @type {string} + * @memberof AdminResultSysLogDiff + */ + type?: string | null; + + /** + * 错误信息 + * + * @type {string} + * @memberof AdminResultSysLogDiff + */ + message?: string | null; + + /** + * @type {SysLogDiff} + * @memberof AdminResultSysLogDiff + */ + result?: SysLogDiff; + + /** + * 附加数据 + * + * @type {any} + * @memberof AdminResultSysLogDiff + */ + extras?: any | null; + + /** + * 时间 + * + * @type {Date} + * @memberof AdminResultSysLogDiff + */ + time?: Date; +} diff --git a/Web/src/views/system/log/difflog/index.vue b/Web/src/views/system/log/difflog/index.vue index 64dc6f69..6a743749 100644 --- a/Web/src/views/system/log/difflog/index.vue +++ b/Web/src/views/system/log/difflog/index.vue @@ -39,8 +39,47 @@ + + + + + + + +
{{ state.detail.message }}
+
+
+ + + + + + + + + + + + + + + + + + + + +
+
@@ -68,6 +107,15 @@ const state = reactive({ pageSize: 50 as number, defaultSort: { field: 'id', order: 'desc', descStr: 'desc' }, }, + visible: false, + detail: { + message: '' as string | null | undefined, + sql: undefined, + parameters: undefined, + afterData: undefined, + beforeData: undefined, + }, + activeTab: 'message', }); // 本地存储参数 @@ -89,6 +137,7 @@ const options = useVxeTable( { field: 'afterData', title: '操作后记录', minWidth: 150, showOverflow: 'tooltip' }, { field: 'businessData', title: '业务对象', minWidth: 150, showOverflow: 'tooltip' }, { field: 'createTime', title: '操作时间', minWidth: 100, showOverflow: 'tooltip' }, + { title: '操作', fixed: 'right', width: 100, showOverflow: true, slots: { default: 'row_buttons' } }, ], }, // vxeGrid配置参数(此处可覆写任何参数),参考vxe-table官方文档 @@ -152,4 +201,17 @@ const handleClear = async () => { ElMessage.success('清空成功'); handleQuery(); }; + +// 查看详情 +const handleView = async ({ row }: any) => { + const { data } = await getAPI(SysLogDiffApi).apiSysLogDiffDetailIdGet(row.id); + state.activeTab = 'message'; + state.detail.message = data?.result?.diffType; + // 如果请求参数是JSON字符串,则尝试转为JSON对象 + state.detail.sql = StringToObj(data?.result?.sql); + state.detail.parameters = StringToObj(data?.result?.parameters); + state.detail.afterData = StringToObj(data?.result?.afterData); + state.detail.beforeData = StringToObj(data?.result?.beforeData); + state.visible = true; +}; From 8a455beaf2cc7465165bc73818e3cdd4a784c902 Mon Sep 17 00:00:00 2001 From: Master Date: Thu, 1 Aug 2024 17:55:05 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BC=BA=E5=B0=91?= =?UTF-8?q?=E7=9A=84=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Web/src/views/system/log/difflog/index.vue | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Web/src/views/system/log/difflog/index.vue b/Web/src/views/system/log/difflog/index.vue index 6a743749..ea22e620 100644 --- a/Web/src/views/system/log/difflog/index.vue +++ b/Web/src/views/system/log/difflog/index.vue @@ -88,10 +88,15 @@ import { onMounted, reactive, ref } from 'vue'; import { ElMessage } from 'element-plus'; import { useDateTimeShortCust } from '/@/hooks/dateTimeShortCust'; import { auth } from '/@/utils/authFunction'; + import { VxeGridInstance, VxeGridListeners, VxeGridPropTypes } from 'vxe-table'; import { useVxeTable } from '/@/hooks/useVxeTableOptionsHook'; import { Local } from '/@/utils/storage'; +import VueJsonPretty from 'vue-json-pretty'; +import 'vue-json-pretty/lib/styles.css'; +import { StringToObj } from '/@/utils/json-utils'; + import { getAPI } from '/@/utils/axios-utils'; import { SysLogDiffApi } from '/@/api-services/api'; import { SysLogDiff, PageLogInput } from '/@/api-services/models';