.net5 core Razor项目实战系列之十一:操作日志查询功能的实现

本篇完成最后一个功能,操作日志的显示。操作日志功能只能查看,不能做其他任何的操作。

先到主菜单中加入【操作日志】菜单项,如下图:

......

<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 文件,如下图:

.net5 core Razor项目实战系列之十一:操作日志查询功能的实现

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();
        }
    }
}

编译并运行项目,得到结果如下:

.net5 core Razor项目实战系列之十一:操作日志查询功能的实现

在 /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>();
        }
    }
}

编译后运行画面如下:

.net5 core Razor项目实战系列之十一:操作日志查询功能的实现

实际项目中可以对此JSON数据做进一步的格式化,便于我们发现修改前后数据变化的差异。

注意:在 LogList.cshtml 和 LogDetail.cshtml 这两个文件中我们遍历 List 的时候都用到了 TLog 这个对象,

一般来说要在页面顶部引用其名称空间 : @using AuthManagement.DbUtil.Entity ,

因为这个名称空间在几乎所有的页面都会用到,这里我们将其放在通用的引用文件 /Shared/_ViewImports.cshtml 中,如下图:

.net5 core Razor项目实战系列之十一:操作日志查询功能的实现

代码如下(见红色部分):

@using AuthManagement
@using AuthManagement.DbUtil.Entity
@namespace AuthManagement.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

 

上一篇:CodeGo.net>如何在ASP.Net MVC中使布尔HTML5属性“有条件”?


下一篇:Razor 是什么?