Browse Source

完成新前端4类日志管理页面对接

zuohuaijun 3 năm trước cách đây
mục cha
commit
3d29cadbbd

+ 3 - 3
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -27,14 +27,14 @@
     <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.6.3" />
     <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.6.3" />
     <PackageReference Include="Furion.Pure" Version="4.6.3" />
-    <PackageReference Include="Magicodes.IE.Excel" Version="2.6.4" />
-    <PackageReference Include="Magicodes.IE.Pdf" Version="2.6.4" />
+    <PackageReference Include="Magicodes.IE.Excel" Version="2.6.7" />
+    <PackageReference Include="Magicodes.IE.Pdf" Version="2.6.7" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.10" />
     <PackageReference Include="NEST" Version="7.17.4" />
     <PackageReference Include="NETCore.MailKit" Version="2.1.0" />
     <PackageReference Include="NewLife.Redis" Version="5.0.2022.901" />
     <PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.8" />
-    <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.17.0" />
+    <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.18.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="2.13.1" />
     <PackageReference Include="SqlSugarCore" Version="5.1.3.25" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.20" />

+ 32 - 2
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -757,7 +757,7 @@
         </member>
         <member name="P:Admin.NET.Core.SysLogEx.LogName">
             <summary>
-            日志名称
+            记录器类别名称
             </summary>
         </member>
         <member name="P:Admin.NET.Core.SysLogEx.LogLevel">
@@ -780,6 +780,21 @@
             异常对象
             </summary>
         </member>
+        <member name="P:Admin.NET.Core.SysLogEx.State">
+            <summary>
+            当前状态值
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysLogEx.LogDateTime">
+            <summary>
+            日志记录时间
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysLogEx.ThreadId">
+            <summary>
+            线程Id
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.SysLogOp">
             <summary>
             系统操作日志表
@@ -787,7 +802,7 @@
         </member>
         <member name="P:Admin.NET.Core.SysLogOp.LogName">
             <summary>
-            日志名称
+            记录器类别名称
             </summary>
         </member>
         <member name="P:Admin.NET.Core.SysLogOp.LogLevel">
@@ -810,6 +825,21 @@
             异常对象
             </summary>
         </member>
+        <member name="P:Admin.NET.Core.SysLogOp.State">
+            <summary>
+            当前状态值
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysLogOp.LogDateTime">
+            <summary>
+            日志记录时间
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysLogOp.ThreadId">
+            <summary>
+            线程Id
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.SysLogVis">
             <summary>
             系统访问日志表

+ 20 - 2
Admin.NET/Admin.NET.Core/Entity/SysLogEx.cs

@@ -7,9 +7,9 @@
 public class SysLogEx : EntityBase
 {
     /// <summary>
-    /// 日志名称
+    /// 记录器类别名称
     /// </summary>
-    [SugarColumn(ColumnDescription = "日志名称", Length = 256)]
+    [SugarColumn(ColumnDescription = "记录器类别名称", Length = 256)]
     [MaxLength(256)]
     public string LogName { get; set; }
 
@@ -37,4 +37,22 @@ public class SysLogEx : EntityBase
     /// </summary>
     [SugarColumn(ColumnDescription = "异常对象", ColumnDataType = "longtext,text,clob")]
     public string Exception { get; set; }
+
+    /// <summary>
+    /// 当前状态值
+    /// </summary>
+    [SugarColumn(ColumnDescription = "当前状态值", ColumnDataType = "longtext,text,clob")]
+    public string State { get; set; }
+
+    /// <summary>
+    /// 日志记录时间
+    /// </summary>
+    [SugarColumn(ColumnDescription = "日志记录时间")]
+    public DateTime LogDateTime { get; set; }
+
+    /// <summary>
+    /// 线程Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "线程Id")]
+    public int ThreadId { get; set; }
 }

+ 20 - 2
Admin.NET/Admin.NET.Core/Entity/SysLogOp.cs

@@ -7,9 +7,9 @@
 public class SysLogOp : EntityBase
 {
     /// <summary>
-    /// 日志名称
+    /// 记录器类别名称
     /// </summary>
-    [SugarColumn(ColumnDescription = "日志名称", Length = 256)]
+    [SugarColumn(ColumnDescription = "记录器类别名称", Length = 256)]
     [MaxLength(256)]
     public string LogName { get; set; }
 
@@ -37,4 +37,22 @@ public class SysLogOp : EntityBase
     /// </summary>
     [SugarColumn(ColumnDescription = "异常对象", ColumnDataType = "longtext,text,clob")]
     public string Exception { get; set; }
+
+    /// <summary>
+    /// 当前状态值
+    /// </summary>
+    [SugarColumn(ColumnDescription = "当前状态值", ColumnDataType = "longtext,text,clob")]
+    public string State { get; set; }
+
+    /// <summary>
+    /// 日志记录时间
+    /// </summary>
+    [SugarColumn(ColumnDescription = "日志记录时间")]
+    public DateTime LogDateTime { get; set; }
+
+    /// <summary>
+    /// 线程Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "线程Id")]
+    public int ThreadId { get; set; }
 }

+ 5 - 5
Admin.NET/Admin.NET.Core/Enum/LoginTypeEnum.cs

@@ -9,29 +9,29 @@ public enum LoginTypeEnum
     /// 登录
     /// </summary>
     [Description("登录")]
-    Login,
+    Login = 1,
 
     /// <summary>
     /// 退出
     /// </summary>
     [Description("退出")]
-    Logout,
+    Logout = 2,
 
     /// <summary>
     /// 注册
     /// </summary>
     [Description("注册")]
-    Register,
+    Register = 3,
 
     /// <summary>
     /// 改密
     /// </summary>
     [Description("改密")]
-    Change_password,
+    Change_password = 4,
 
     /// <summary>
     /// 三方授权登陆
     /// </summary>
     [Description("授权登陆")]
-    Authorized_login
+    Authorized_login = 5
 }

+ 1 - 1
Admin.NET/Admin.NET.Core/SeedData/SysMenuSeedData.cs

@@ -119,7 +119,7 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
             new SysMenu{ Id=252885263004030, Pid=252885263004000, Title="异常日志", Path="/log/exlog", Name="sysExlog", Component="/system/log/exlog/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=102 },
             new SysMenu{ Id=252885263004031, Pid=252885263004030, Title="日志查询", Permission="sysExlog:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
             new SysMenu{ Id=252885263004032, Pid=252885263004030, Title="日志清空", Permission="sysExlog:clear", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
-            new SysMenu{ Id=252885263004035, Pid=252885263004000, Title="差异日志", Path="/log/difflog", Name="sysDifflog", Component="/system/log/difflog/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
+            new SysMenu{ Id=252885263004035, Pid=252885263004000, Title="差异日志", Path="/log/difflog", Name="sysDifflog", Component="/system/log/difflog/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=103 },
             new SysMenu{ Id=252885263004036, Pid=252885263004035, Title="日志查询", Permission="sysDifflog:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
             new SysMenu{ Id=252885263004037, Pid=252885263004035, Title="日志清空", Permission="sysDifflog:clear", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
 

+ 2 - 2
Admin.NET/Admin.NET.Core/Service/Logging/SysLogDiffService.cs

@@ -23,8 +23,8 @@ public class SysLogDiffService : IDynamicApiController, ITransient
     {
         return await _sysLogDiffRep.AsQueryable()
             .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()),
-                        u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
-            .OrderBy(u => u.CreateTime, SqlSugar.OrderByType.Desc)
+                u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
+            .OrderBy(u => u.CreateTime, OrderByType.Desc)
             .ToPagedListAsync(input.Page, input.PageSize);
     }
 

+ 2 - 2
Admin.NET/Admin.NET.Core/Service/Logging/SysLogExService.cs

@@ -23,8 +23,8 @@ public class SysLogExService : IDynamicApiController, ITransient
     {
         return await _sysLogExRep.AsQueryable()
             .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()),
-                        u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
-            .OrderBy(u => u.CreateTime, SqlSugar.OrderByType.Desc)
+                u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
+            .OrderBy(u => u.CreateTime, OrderByType.Desc)
             .ToPagedListAsync(input.Page, input.PageSize);
     }
 

+ 2 - 2
Admin.NET/Admin.NET.Core/Service/Logging/SysLogOpService.cs

@@ -23,8 +23,8 @@ public class SysLogOpService : IDynamicApiController, ITransient
     {
         return await _sysLogOpRep.AsQueryable()
             .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()),
-                        u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
-            .OrderBy(u => u.CreateTime, SqlSugar.OrderByType.Desc)
+                u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
+            .OrderBy(u => u.CreateTime, OrderByType.Desc)
             .ToPagedListAsync(input.Page, input.PageSize);
     }
 

+ 2 - 2
Admin.NET/Admin.NET.Core/Service/Logging/SysLogVisService.cs

@@ -23,8 +23,8 @@ public class SysLogVisService : IDynamicApiController, ITransient
     {
         return await _sysLogVisRep.AsQueryable()
             .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()),
-                        u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
-            .OrderBy(u => u.CreateTime, SqlSugar.OrderByType.Desc)
+                u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
+            .OrderBy(u => u.CreateTime, OrderByType.Desc)
             .ToPagedListAsync(input.Page, input.PageSize);
     }
 

+ 2 - 2
Admin.NET/Admin.NET.Web.Entry/appsettings.Development.json

@@ -17,7 +17,7 @@
             "MaxRollingFiles": 30 // 只保留30个文件
         },
         "Database": {
-            "Enabled": false, // 启用数据库日志
+            "Enabled": true, // 启用数据库日志
             "MinimumLevel": "Information"
         },
         "ElasticSearch": {
@@ -31,7 +31,7 @@
             "ExcludeOfMethods": [], // 排除特定方法,当GlobalEnabled=true有效
             "BahLogLevel": "Information", // Oops.Oh 和 Oops.Bah 业务日志输出级别
             "WithReturnValue": true, // 配置是否包含返回值,默认true
-            "ReturnValueThreshold": 0, // 配置返回值字符串阈值,默认0全量输出
+            "ReturnValueThreshold": 500, // 配置返回值字符串阈值,默认0全量输出
             "JsonBehavior": "None" // 配置Json输出行为,默认 None
         }
     },

+ 2 - 2
Admin.NET/Admin.NET.Web.Entry/appsettings.json

@@ -17,7 +17,7 @@
             "MaxRollingFiles": 30 // 只保留30个文件
         },
         "Database": {
-            "Enabled": false, // 启用数据库日志
+            "Enabled": true, // 启用数据库日志
             "MinimumLevel": "Information"
         },
         "ElasticSearch": {
@@ -31,7 +31,7 @@
             "ExcludeOfMethods": [], // 排除特定方法,当GlobalEnabled=true有效
             "BahLogLevel": "Information", // Oops.Oh 和 Oops.Bah 业务日志输出级别
             "WithReturnValue": true, // 配置是否包含返回值,默认true
-            "ReturnValueThreshold": 0, // 配置返回值字符串阈值,默认0全量输出
+            "ReturnValueThreshold": 500, // 配置返回值字符串阈值,默认0全量输出
             "JsonBehavior": "None" // 配置Json输出行为,默认 None
         }
     },

+ 150 - 0
vue-next-admin/src/views/system/log/difflog/index.vue

@@ -0,0 +1,150 @@
+<template>
+	<div class="sys-difflog-container">
+		<el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
+			<el-form :model="queryParams" ref="queryForm" :inline="true">
+				<el-form-item label="开始时间" prop="name">
+					<el-date-picker v-model="queryParams.startTime" type="datetime" placeholder="开始时间"
+						:shortcuts="shortcuts" />
+				</el-form-item>
+				<el-form-item label="结束时间" prop="code">
+					<el-date-picker v-model="queryParams.endTime" type="datetime" placeholder="结束时间"
+						:shortcuts="shortcuts" />
+				</el-form-item>
+				<el-form-item>
+					<el-button icon="ele-Refresh" @click="resetQuery">
+						重置
+					</el-button>
+					<el-button type="primary" icon="ele-Search" @click="handleQuery">
+						查询
+					</el-button>
+				</el-form-item>
+			</el-form>
+		</el-card>
+
+		<el-card shadow="hover" style="margin-top: 5px;">
+			<el-table :data="logData" style="width: 100%" v-loading="loading" border>
+				<el-table-column type="index" label="序号" width="55" align="center" />
+				<el-table-column prop="diffType" label="差异操作" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="sql" label="Sql语句" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="parameters" label="参数" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="duration" label="耗时(ms)" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="message" label="日志消息" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="beforeData" label="操作前记录" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="afterData" label="操作后记录" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="businessData" label="业务对象" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="createTime" label="操作时间" align="center" show-overflow-tooltip></el-table-column>
+			</el-table>
+			<el-pagination v-model:currentPage="tableParams.page" v-model:page-size="tableParams.pageSize"
+				:total="tableParams.total" :page-sizes="[10, 20, 50, 100]" small background
+				@size-change="handleSizeChange" @current-change="handleCurrentChange"
+				layout="total, sizes, prev, pager, next, jumper" />
+		</el-card>
+	</div>
+</template>
+
+<script lang="ts">
+import { toRefs, reactive, onMounted, defineComponent } from 'vue';
+import { ElMessage } from 'element-plus';
+
+import { getAPI } from '/@/utils/axios-utils';
+import { SysLogDiffApi } from '/@/api-services';
+
+export default defineComponent({
+	name: 'sysDiffLog',
+	components: {},
+	setup() {
+		const state = reactive({
+			loading: true,
+			queryParams: {
+				startTime: undefined,
+				endTime: undefined,
+			},
+			tableParams: {
+				page: 1,
+				pageSize: 10,
+				total: 0 as any,
+			},
+			logData: [] as any,
+		});
+		onMounted(async () => {
+			handleQuery();
+		});
+		// 查询操作
+		const handleQuery = async () => {
+			if (state.queryParams.startTime == null)
+				state.queryParams.startTime = undefined;
+			if (state.queryParams.endTime == null)
+				state.queryParams.endTime = undefined;
+			state.loading = true;
+			var res = await getAPI(SysLogDiffApi).sysLogDiffPageGet(state.queryParams.startTime, state.queryParams.endTime,
+				state.tableParams.page, state.tableParams.pageSize);
+			state.logData = res.data.result?.items;
+			state.tableParams.total = res.data.result?.total;
+			state.loading = false;
+		};
+		// 重置操作
+		const resetQuery = () => {
+			state.queryParams.startTime = undefined;
+			state.queryParams.endTime = undefined;
+			handleQuery();
+		};
+		// 清空日志
+		const clearLog = async () => {
+			state.loading = true;
+			await getAPI(SysLogDiffApi).sysLogDiffClearPost();
+			state.loading = false;
+
+			ElMessage.success('清空成功');
+			handleQuery();
+		};
+		// 分页改变
+		const handleSizeChange = (val: number) => {
+			state.tableParams.pageSize = val;
+			handleQuery();
+		};
+		// 分页改变
+		const handleCurrentChange = (val: number) => {
+			state.tableParams.page = val;
+			handleQuery();
+		};
+		const shortcuts = [
+			{
+				text: '今天',
+				value: new Date(),
+			},
+			{
+				text: '昨天',
+				value: () => {
+					const date = new Date()
+					date.setTime(date.getTime() - 3600 * 1000 * 24)
+					return date
+				},
+			},
+			{
+				text: '上周',
+				value: () => {
+					const date = new Date()
+					date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)
+					return date
+				},
+			},
+		]
+		return {
+			handleQuery,
+			resetQuery,
+			clearLog,
+			shortcuts,
+			handleSizeChange,
+			handleCurrentChange,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+
+<style lang="scss">
+.el-popper {
+	//font-size: 14px;
+	max-width: 60%;
+}
+</style>

+ 151 - 0
vue-next-admin/src/views/system/log/exlog/index.vue

@@ -0,0 +1,151 @@
+<template>
+	<div class="sys-exlog-container">
+		<el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
+			<el-form :model="queryParams" ref="queryForm" :inline="true">
+				<el-form-item label="开始时间" prop="name">
+					<el-date-picker v-model="queryParams.startTime" type="datetime" placeholder="开始时间"
+						:shortcuts="shortcuts" />
+				</el-form-item>
+				<el-form-item label="结束时间" prop="code">
+					<el-date-picker v-model="queryParams.endTime" type="datetime" placeholder="结束时间"
+						:shortcuts="shortcuts" />
+				</el-form-item>
+				<el-form-item>
+					<el-button icon="ele-Refresh" @click="resetQuery">
+						重置
+					</el-button>
+					<el-button type="primary" icon="ele-Search" @click="handleQuery">
+						查询
+					</el-button>
+				</el-form-item>
+			</el-form>
+		</el-card>
+
+		<el-card shadow="hover" style="margin-top: 5px;">
+			<el-table :data="logData" style="width: 100%" v-loading="loading" border>
+				<el-table-column type="index" label="序号" width="55" align="center" />
+				<el-table-column prop="logName" label="记录器类别名称" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="logLevel" label="日志级别" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="eventId" label="事件Id" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="message" label="日志消息" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="exception" label="异常对象" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="state" label="当前状态值" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="threadId" label="线程Id" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="logDateTime" label="日志记录时间" align="center" show-overflow-tooltip>
+				</el-table-column>
+				<el-table-column prop="createTime" label="操作时间" align="center" show-overflow-tooltip></el-table-column>
+			</el-table>
+			<el-pagination v-model:currentPage="tableParams.page" v-model:page-size="tableParams.pageSize"
+				:total="tableParams.total" :page-sizes="[10, 20, 50, 100]" small background
+				@size-change="handleSizeChange" @current-change="handleCurrentChange"
+				layout="total, sizes, prev, pager, next, jumper" />
+		</el-card>
+	</div>
+</template>
+
+<script lang="ts">
+import { toRefs, reactive, onMounted, defineComponent } from 'vue';
+import { ElMessage } from 'element-plus';
+
+import { getAPI } from '/@/utils/axios-utils';
+import { SysLogExApi } from '/@/api-services';
+
+export default defineComponent({
+	name: 'sysExLog',
+	components: {},
+	setup() {
+		const state = reactive({
+			loading: true,
+			queryParams: {
+				startTime: undefined,
+				endTime: undefined,
+			},
+			tableParams: {
+				page: 1,
+				pageSize: 10,
+				total: 0 as any,
+			},
+			logData: [] as any,
+		});
+		onMounted(async () => {
+			handleQuery();
+		});
+		// 查询操作
+		const handleQuery = async () => {
+			if (state.queryParams.startTime == null)
+				state.queryParams.startTime = undefined;
+			if (state.queryParams.endTime == null)
+				state.queryParams.endTime = undefined;
+			state.loading = true;
+			var res = await getAPI(SysLogExApi).sysLogExPageGet(state.queryParams.startTime, state.queryParams.endTime,
+				state.tableParams.page, state.tableParams.pageSize);
+			state.logData = res.data.result?.items;
+			state.tableParams.total = res.data.result?.total;
+			state.loading = false;
+		};
+		// 重置操作
+		const resetQuery = () => {
+			state.queryParams.startTime = undefined;
+			state.queryParams.endTime = undefined;
+			handleQuery();
+		};
+		// 清空日志
+		const clearLog = async () => {
+			state.loading = true;
+			await getAPI(SysLogExApi).sysLogExClearPost();
+			state.loading = false;
+
+			ElMessage.success('清空成功');
+			handleQuery();
+		};
+		// 分页改变
+		const handleSizeChange = (val: number) => {
+			state.tableParams.pageSize = val;
+			handleQuery();
+		};
+		// 分页改变
+		const handleCurrentChange = (val: number) => {
+			state.tableParams.page = val;
+			handleQuery();
+		};
+		const shortcuts = [
+			{
+				text: '今天',
+				value: new Date(),
+			},
+			{
+				text: '昨天',
+				value: () => {
+					const date = new Date()
+					date.setTime(date.getTime() - 3600 * 1000 * 24)
+					return date
+				},
+			},
+			{
+				text: '上周',
+				value: () => {
+					const date = new Date()
+					date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)
+					return date
+				},
+			},
+		]
+		return {
+			handleQuery,
+			resetQuery,
+			clearLog,
+			shortcuts,
+			handleSizeChange,
+			handleCurrentChange,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+
+<style lang="scss">
+.el-popper {
+	//font-size: 14px;
+	max-width: 60%;
+}
+</style>

+ 151 - 0
vue-next-admin/src/views/system/log/oplog/index.vue

@@ -0,0 +1,151 @@
+<template>
+	<div class="sys-oplog-container">
+		<el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
+			<el-form :model="queryParams" ref="queryForm" :inline="true">
+				<el-form-item label="开始时间" prop="name">
+					<el-date-picker v-model="queryParams.startTime" type="datetime" placeholder="开始时间"
+						:shortcuts="shortcuts" />
+				</el-form-item>
+				<el-form-item label="结束时间" prop="code">
+					<el-date-picker v-model="queryParams.endTime" type="datetime" placeholder="结束时间"
+						:shortcuts="shortcuts" />
+				</el-form-item>
+				<el-form-item>
+					<el-button icon="ele-Refresh" @click="resetQuery">
+						重置
+					</el-button>
+					<el-button type="primary" icon="ele-Search" @click="handleQuery">
+						查询
+					</el-button>
+				</el-form-item>
+			</el-form>
+		</el-card>
+
+		<el-card shadow="hover" style="margin-top: 5px;">
+			<el-table :data="logData" style="width: 100%" v-loading="loading" border>
+				<el-table-column type="index" label="序号" width="55" align="center" />
+				<el-table-column prop="logName" label="记录器类别名称" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="logLevel" label="日志级别" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="eventId" label="事件Id" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="message" label="日志消息" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="exception" label="异常对象" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="state" label="当前状态值" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="threadId" label="线程Id" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="logDateTime" label="日志记录时间" align="center" show-overflow-tooltip>
+				</el-table-column>
+				<el-table-column prop="createTime" label="操作时间" align="center" show-overflow-tooltip></el-table-column>
+			</el-table>
+			<el-pagination v-model:currentPage="tableParams.page" v-model:page-size="tableParams.pageSize"
+				:total="tableParams.total" :page-sizes="[10, 20, 50, 100]" small background
+				@size-change="handleSizeChange" @current-change="handleCurrentChange"
+				layout="total, sizes, prev, pager, next, jumper" />
+		</el-card>
+	</div>
+</template>
+
+<script lang="ts">
+import { toRefs, reactive, onMounted, defineComponent } from 'vue';
+import { ElMessage } from 'element-plus';
+
+import { getAPI } from '/@/utils/axios-utils';
+import { SysLogOpApi } from '/@/api-services';
+
+export default defineComponent({
+	name: 'sysOpLog',
+	components: {},
+	setup() {
+		const state = reactive({
+			loading: true,
+			queryParams: {
+				startTime: undefined,
+				endTime: undefined,
+			},
+			tableParams: {
+				page: 1,
+				pageSize: 10,
+				total: 0 as any,
+			},
+			logData: [] as any,
+		});
+		onMounted(async () => {
+			handleQuery();
+		});
+		// 查询操作
+		const handleQuery = async () => {
+			if (state.queryParams.startTime == null)
+				state.queryParams.startTime = undefined;
+			if (state.queryParams.endTime == null)
+				state.queryParams.endTime = undefined;
+			state.loading = true;
+			var res = await getAPI(SysLogOpApi).sysLogOpPageGet(state.queryParams.startTime, state.queryParams.endTime,
+				state.tableParams.page, state.tableParams.pageSize);
+			state.logData = res.data.result?.items;
+			state.tableParams.total = res.data.result?.total;
+			state.loading = false;
+		};
+		// 重置操作
+		const resetQuery = () => {
+			state.queryParams.startTime = undefined;
+			state.queryParams.endTime = undefined;
+			handleQuery();
+		};
+		// 清空日志
+		const clearLog = async () => {
+			state.loading = true;
+			await getAPI(SysLogOpApi).sysLogOpClearPost();
+			state.loading = false;
+
+			ElMessage.success('清空成功');
+			handleQuery();
+		};
+		// 分页改变
+		const handleSizeChange = (val: number) => {
+			state.tableParams.pageSize = val;
+			handleQuery();
+		};
+		// 分页改变
+		const handleCurrentChange = (val: number) => {
+			state.tableParams.page = val;
+			handleQuery();
+		};
+		const shortcuts = [
+			{
+				text: '今天',
+				value: new Date(),
+			},
+			{
+				text: '昨天',
+				value: () => {
+					const date = new Date()
+					date.setTime(date.getTime() - 3600 * 1000 * 24)
+					return date
+				},
+			},
+			{
+				text: '上周',
+				value: () => {
+					const date = new Date()
+					date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)
+					return date
+				},
+			},
+		]
+		return {
+			handleQuery,
+			resetQuery,
+			clearLog,
+			shortcuts,
+			handleSizeChange,
+			handleCurrentChange,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+
+<style lang="scss">
+.el-popper {
+	//font-size: 14px;
+	max-width: 60%;
+}
+</style>

+ 153 - 0
vue-next-admin/src/views/system/log/vislog/index.vue

@@ -0,0 +1,153 @@
+<template>
+	<div class="sys-vislog-container">
+		<el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
+			<el-form :model="queryParams" ref="queryForm" :inline="true">
+				<el-form-item label="开始时间" prop="name">
+					<el-date-picker v-model="queryParams.startTime" type="datetime" placeholder="开始时间"
+						:shortcuts="shortcuts" />
+				</el-form-item>
+				<el-form-item label="结束时间" prop="code">
+					<el-date-picker v-model="queryParams.endTime" type="datetime" placeholder="结束时间"
+						:shortcuts="shortcuts" />
+				</el-form-item>
+				<el-form-item>
+					<el-button icon="ele-Refresh" @click="resetQuery">
+						重置
+					</el-button>
+					<el-button type="primary" icon="ele-Search" @click="handleQuery">
+						查询
+					</el-button>
+				</el-form-item>
+			</el-form>
+		</el-card>
+
+		<el-card shadow="hover" style="margin-top: 5px;">
+			<el-table :data="logData" style="width: 100%" v-loading="loading" border>
+				<el-table-column type="index" label="序号" width="55" align="center" />
+				<el-table-column prop="userName" label="账号名称" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="realName" label="真实姓名" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="success" label="状态" width="70" show-overflow-tooltip>
+					<template #default="scope">
+						<el-tag type="success" v-if="scope.row.success === 1">成功</el-tag>
+						<el-tag type="danger" v-else>失败</el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column prop="ip" label="IP地址" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="browser" label="浏览器" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="os" label="操作系统" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="visType" label="类型" width="70" align="center" show-overflow-tooltip>
+					<template #default="scope">
+						<el-tag type="success" v-if="scope.row.visType === 1">登录</el-tag>
+						<el-tag type="danger" v-else>退出</el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column prop="location" label="地址" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="createTime" label="操作时间" align="center" show-overflow-tooltip></el-table-column>
+			</el-table>
+			<el-pagination v-model:currentPage="tableParams.page" v-model:page-size="tableParams.pageSize"
+				:total="tableParams.total" :page-sizes="[10, 20, 50, 100]" small background
+				@size-change="handleSizeChange" @current-change="handleCurrentChange"
+				layout="total, sizes, prev, pager, next, jumper" />
+		</el-card>
+	</div>
+</template>
+
+<script lang="ts">
+import { toRefs, reactive, onMounted, defineComponent } from 'vue';
+import { ElMessage } from 'element-plus';
+
+import { getAPI } from '/@/utils/axios-utils';
+import { SysLogVisApi } from '/@/api-services';
+
+export default defineComponent({
+	name: 'sysVisLog',
+	components: {},
+	setup() {
+		const state = reactive({
+			loading: true,
+			queryParams: {
+				startTime: undefined,
+				endTime: undefined,
+			},
+			tableParams: {
+				page: 1,
+				pageSize: 10,
+				total: 0 as any,
+			},
+			logData: [] as any,
+		});
+		onMounted(async () => {
+			handleQuery();
+		});
+		// 查询操作
+		const handleQuery = async () => {
+			if (state.queryParams.startTime == null)
+				state.queryParams.startTime = undefined;
+			if (state.queryParams.endTime == null)
+				state.queryParams.endTime = undefined;
+			state.loading = true;
+			var res = await getAPI(SysLogVisApi).sysLogVisPageGet(state.queryParams.startTime, state.queryParams.endTime,
+				state.tableParams.page, state.tableParams.pageSize);
+			state.logData = res.data.result?.items;
+			state.tableParams.total = res.data.result?.total;
+			state.loading = false;
+		};
+		// 重置操作
+		const resetQuery = () => {
+			state.queryParams.startTime = undefined;
+			state.queryParams.endTime = undefined;
+			handleQuery();
+		};
+		// 清空日志
+		const clearLog = async () => {
+			state.loading = true;
+			await getAPI(SysLogVisApi).sysLogVisClearPost();
+			state.loading = false;
+
+			ElMessage.success('清空成功');
+			handleQuery();
+		};
+		// 分页改变
+		const handleSizeChange = (val: number) => {
+			state.tableParams.pageSize = val;
+			handleQuery();
+		};
+		// 分页改变
+		const handleCurrentChange = (val: number) => {
+			state.tableParams.page = val;
+			handleQuery();
+		};
+		const shortcuts = [
+			{
+				text: '今天',
+				value: new Date(),
+			},
+			{
+				text: '昨天',
+				value: () => {
+					const date = new Date()
+					date.setTime(date.getTime() - 3600 * 1000 * 24)
+					return date
+				},
+			},
+			{
+				text: '上周',
+				value: () => {
+					const date = new Date()
+					date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)
+					return date
+				},
+			},
+		]
+		return {
+			handleQuery,
+			resetQuery,
+			clearLog,
+			shortcuts,
+			handleSizeChange,
+			handleCurrentChange,
+			...toRefs(state),
+		};
+	},
+});
+</script>