本篇完成最后一个功能,操作日志的显示。操作日志功能只能查看,不能做其他任何的操作。
先到主菜单中加入【操作日志】菜单项,如下图:
...... <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/Auth/DeptList">【部门管理】</a> </li> <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/Auth/UserList">【用户管理】</a> </li> <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/Auth/AuthSetting">【权限设置】</a> </li> <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/Auth/LogList">【操作日志】</a> </li> ......
然后到/Auth目录下新增 LogList.cshtml 文件,如下图:
LogList.cshtml 文件中代码如下:
@page @model AuthManagement.Pages.Auth.LogListModel @{ ViewData["Title"] = "操作日志"; } <table style="border-collapse:collapse;border:solid 1px #c0c0c0;font-size:14px;" border="1" width="60%"> <tr style="background-color:#e0e0e0;font-size:16px;"> <td>表名</td> <td>操作人</td> <td>操作时间</td> <td>操作</td> </tr> @foreach (TLog log in Model.LogList) { <tr> <td>@log.TableName</td> <td>@log.UserName</td> <td>@log.LogTime.ToString("yyyy-MM-dd")</td> <td><a href="/Auth/LogDetail?batno=@log.BatchNo" target="_blank">详情</a></td><!--传 batno 可以一次抓到关联的2笔数据--> </tr> } </table>
LogList.cshtml.cs 文件代码如下:
namespace AuthManagement.Pages.Auth { public class LogListModel : PageModel { private readonly AuthDbContext _context; //构造函数中对 AuthDbContext 做依赖注入 public LogListModel(AuthDbContext context) { _context = context; } public List<TLog> LogList { get; private set; }//定义传递给页面的属性 private void InitLogList() //给属性赋值 { //取出最近3天的数据,列表页不显示 table_data 字段的数据,因为数据太长了, //我们在每行末尾加一个详情的连接打开单独的页面去看。 //用 Select 取 TLog 中的 UserName,TableName,LogTime,BatchNo 这3个字段并赋值,然后用 Distinct()去掉重复值 LogList = _context.TLogs.Where<TLog>(x => x.LogTime > DateTime.Now.AddDays(-3).Date) .Select(x=>new TLog { UserName = x.UserName, TableName = x.TableName, LogTime = x.LogTime, BatchNo=x.BatchNo }) .Distinct().ToList<TLog>(); } public void OnGet() { InitLogList(); } } }
编译并运行项目,得到结果如下:
在 /Auth 目录下新增 LogDetail.cshtml 文件显示要查看的那2笔数据,代码如下:
@page @model AuthManagement.Pages.Auth.LogDetailModel @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>操作日志明细</title> </head> <body> @foreach (TLog log in Model.LogDetails) { <textarea cols="40" rows="10" style="overflow:scroll;resize:both;"> @log.TableData </textarea><br /><br /> } </body> </html>
对应的LogDetail.cshtml.cs 文件代码如下:
using System.Collections.Generic; using System.Linq; using AuthManagement.DbUtil.Entity; using Microsoft.AspNetCore.Mvc.RazorPages; namespace AuthManagement.Pages.Auth { public class LogDetailModel : PageModel { private readonly AuthDbContext _context; //构造函数中对 AuthDbContext 做依赖注入 public LogDetailModel(AuthDbContext context) { _context = context; } public List<TLog> LogDetails { get; private set; }//定义传递给页面的属性 public void OnGet() { string batNo = Request.Query["batno"]; //用lambda表达式以 BatchNo 为条件查询,并将结果转化为泛型 List<TLog> LogDetails = _context.TLogs.Where<TLog>(x => x.BatchNo == batNo).ToList<TLog>(); } } }
编译后运行画面如下:
实际项目中可以对此JSON数据做进一步的格式化,便于我们发现修改前后数据变化的差异。
注意:在 LogList.cshtml 和 LogDetail.cshtml 这两个文件中我们遍历 List 的时候都用到了 TLog 这个对象,
一般来说要在页面顶部引用其名称空间 : @using AuthManagement.DbUtil.Entity ,
因为这个名称空间在几乎所有的页面都会用到,这里我们将其放在通用的引用文件 /Shared/_ViewImports.cshtml 中,如下图:
代码如下(见红色部分):
@using AuthManagement @using AuthManagement.DbUtil.Entity @namespace AuthManagement.Pages @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers