namespace BlazorWebAppNet9Shared.Services;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System.ComponentModel.DataAnnotations;
///
/// TLog 日志服务:首次使用 自动创建 数据库和数据表。
/// 使用示例,第1步:Program.cs 中,注册服务,builder.Services.AddTLog();
/// 使用示例,第2步:TLog.Page(UserName, DisplayName, NavigationManager.ToBaseRelativePath(NavigationManager.Uri));
///
public static class TLog
{
private static DbContextOptions? contextOptions;
///
/// 注册 TLog 服务,示例:builder.Services.AddTLog();
///
///
///
///
///
public static IServiceCollection AddTLog(this IServiceCollection services, TLogDbType dbType = TLogDbType.Sqlite, string connectionString = "Data Source=SQLiteFileTLog.db")
{
switch (dbType)
{
case TLogDbType.SqlServer:
//注册 日志上下文
services.AddDbContext(options => options.UseSqlServer(connectionString));
//记录 DbContextOptions 其他方法使用
contextOptions = new DbContextOptionsBuilder().UseSqlServer(connectionString).Options;
break;
default:
services.AddDbContext(options => options.UseSqlite(connectionString));
contextOptions = new DbContextOptionsBuilder().UseSqlite(connectionString).Options;
break;
}
// 自动创建数据库和数据表:修改实体定义后,删除原有的数据库自动重新建立;或者根据实体定义手动修改数据库和数据表。
using var tLogDbContext = new TLogDbContext(contextOptions);
if (tLogDbContext.Database.EnsureCreated())
{
TLog.Info("初始化数据库:成功!");
TLog.Console("初始化数据库:成功!");
}
return services;
}
///
/// 等价:System.Console.WriteLine($"TLog————{输出信息}")
///
///
public static void Console(string? 输出信息)
{
System.Console.WriteLine($"TLog————{输出信息}");
}
///
/// 操作类型 = TLogOpStyle.其他信息
///
///
///
///
///
public static void Info(string 用户名, string 姓名, string 操作对象 = "", string 操作说明 = "")
{
using var tLogDbContext = new TLogDbContext(contextOptions!);
tLogDbContext.Add(new TLogEntity() { 操作类型 = TLogOpStyle.其他信息, 用户名 = 用户名, 姓名 = 姓名, 操作对象 = 操作对象, 操作说明 = 操作说明 });
tLogDbContext.SaveChanges();
tLogDbContext.Dispose();
}
///
/// 操作类型 = TLogOpStyle.其他信息
///
///
public static void Info(string 操作说明)
{
using var tLogDbContext = new TLogDbContext(contextOptions!);
tLogDbContext.Add(new TLogEntity() { 操作类型 = TLogOpStyle.其他信息, 用户名 = "用户名", 姓名 = "姓名", 操作对象 = "", 操作说明 = 操作说明 });
tLogDbContext.SaveChanges();
tLogDbContext.Dispose();
}
///
/// 操作类型 = TLogOpStyle.页面访问
///
///
///
///
public static void Page(string 用户名, string 姓名, string 操作对象)
{
using var tLogDbContext = new TLogDbContext(contextOptions!);
tLogDbContext.Add(new TLogEntity() { 操作类型 = TLogOpStyle.页面访问, 用户名 = 用户名, 姓名 = 姓名, 操作对象 = 操作对象 });
tLogDbContext.SaveChanges();
tLogDbContext.Dispose();
}
///
/// 操作类型 = TLogOpStyle.新建
///
///
///
///
///
///
public static void Create(string 用户名, string 姓名, string 操作对象, string 操作说明 = "", bool 操作结果 = true)
{
using var tLogDbContext = new TLogDbContext(contextOptions!);
tLogDbContext.Add(new TLogEntity() { 操作类型 = TLogOpStyle.新建, 用户名 = 用户名, 姓名 = 姓名, 操作对象 = 操作对象, 操作说明 = 操作说明, 操作结果 = 操作结果 });
tLogDbContext.SaveChanges();
tLogDbContext.Dispose();
}
///
/// 操作类型 = TLogOpStyle.删除
///
///
///
///
///
///
public static void Delete(string 用户名, string 姓名, string 操作对象, string 操作说明 = "", bool 操作结果 = true)
{
using var tLogDbContext = new TLogDbContext(contextOptions!);
tLogDbContext.Add(new TLogEntity() { 操作类型 = TLogOpStyle.删除, 用户名 = 用户名, 姓名 = 姓名, 操作对象 = 操作对象, 操作说明 = 操作说明, 操作结果 = 操作结果 });
tLogDbContext.SaveChanges();
tLogDbContext.Dispose();
}
///
/// 操作类型 = TLogOpStyle.编辑
///
///
///
///
///
///
public static void Update(string 用户名, string 姓名, string 操作对象, string 操作说明 = "", bool 操作结果 = true)
{
using var tLogDbContext = new TLogDbContext(contextOptions!);
tLogDbContext.Add(new TLogEntity() { 操作类型 = TLogOpStyle.编辑, 用户名 = 用户名, 姓名 = 姓名, 操作对象 = 操作对象, 操作说明 = 操作说明, 操作结果 = 操作结果 });
tLogDbContext.SaveChanges();
tLogDbContext.Dispose();
}
///
/// 操作类型 = TLogOpStyle.查询
///
///
///
///
///
///
public static void Read(string 用户名, string 姓名, string 操作对象, string 操作说明 = "", bool 操作结果 = true)
{
using var tLogDbContext = new TLogDbContext(contextOptions!);
tLogDbContext.Add(new TLogEntity() { 操作类型 = TLogOpStyle.查询, 用户名 = 用户名, 姓名 = 姓名, 操作对象 = 操作对象, 操作说明 = 操作说明, 操作结果 = 操作结果 });
tLogDbContext.SaveChanges();
tLogDbContext.Dispose();
}
}
///
/// 日志数据库上下文:建议使用独立数据库,与业务数据分开存放。
///
///
public class TLogDbContext(DbContextOptions options) : DbContext(options)
{
public DbSet TLogEntitys { get; set; }
}
///
/// 日志实体:后续可以根据需要增加,注意不要编辑、删除已有属性。
///
[Index(nameof(Id))]
[Index(nameof(时间))]
[Index(nameof(用户名))]
[Index(nameof(姓名))]
[Index(nameof(操作类型))]
[Index(nameof(操作对象))]
[Index(nameof(操作类型), nameof(操作对象))]
public class TLogEntity
{
[Key]
public long Id { get; set; }
public DateTime 时间 { get; set; } = DateTime.Now;
public required string 用户名 { get; set; }
public required string 姓名 { get; set; }
public TLogOpStyle 操作类型 { get; set; } = TLogOpStyle.页面访问;
public required string 操作对象 { get; set; }
public string 操作说明 { get; set; } = "";
public bool 操作结果 { get; set; } = true;
}
///
/// 日志类型:后续可以根据需要增加,注意不要编辑、删除已有类型。
///
public enum TLogOpStyle
{
///
/// 记录页面访问日志:Page
///
页面访问,
///
/// 增删改查CRUD:Create
///
新建,
///
/// 增删改查CRUD:Read
///
查询,
///
/// 增删改查CRUD:Update
///
编辑,
///
/// 增删改查CRUD:Delete
///
删除,
///
/// Information:Info
///
其他信息
}
///
/// 日志使用数据库类型:默认使用 Sqlite
///
public enum TLogDbType
{
///
/// 使用 SQL Server database
///
SqlServer,
///
/// 使用 SQLite database
///
Sqlite
}