本篇完成最后一個功能,操作日志的顯示。操作日志功能只能查看,不能做其他任何的操作。
先到主菜單中加入【操作日志】菜單項,如下圖:
...... <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