一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户、某时间、对某表、某主键、某字段的修改(新旧值
一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户、某时间、对某表、某主键、某字段的修改(新旧值)。
特别适用于订单历史记录、重要财务记录、审批流记录
表设计:
namespace Business.OperateLog
{
/// <summary>
/// 公共系统操作日志记录类
/// 详细记录某用户、某时间、对某表、某主键、某字段的修改(新旧值)
/// </summary>
public class CommonOperateLog
{
/// <summary>
/// 操作表表名
/// </summary>
public string TableName { get; private set; } /// <summary>
/// 操作表主键
/// </summary>
public long TableKeyId { get; private set; } /// <summary>
/// 操作类型
/// </summary>
public OperateType Type { get; private set; } /// <summary>
/// 备注
/// </summary>
public string Remark { get;private set; } /// <summary>
/// 操作者id
/// </summary>
public long UserId { get; private set; } /// <summary>
/// 操作者姓名
/// </summary>
public string UserName { get; private set; } /// <summary>
/// 字段新旧值修改详细日志
/// </summary>
public List<FieldUpdateLogContent> FieldUpdateLogContents { get; private set; } /// <summary>
/// 构造
/// </summary>
public CommonOperateLog(string tableName, long tableKeyId, OperateType type, string remark = "", long userId = , string userName = "")
{
TableName = tableName;
TableKeyId = tableKeyId;
Type = type;
Remark = remark ?? string.Empty;
UserId = userId;
UserName = userName ?? string.Empty;
FieldUpdateLogContents = new List<FieldUpdateLogContent>();
} /// <summary>
/// 添加字段新旧值修改详细日志
/// </summary>
public List<FieldUpdateLogContent> AddLog(FieldUpdateLogContent log)
{
FieldUpdateLogContents.Add(log);
return FieldUpdateLogContents;
} /// <summary>
/// 保存修改历史
/// </summary>
public void SaveOperationLog()
{
ThreadPool.QueueUserWorkItem(t => //使用线程异步保存,加速执行速度
{
//插入操作日志表
var model = new OperationLogModel
{
TableName = TableName,
TableKeyId = TableKeyId,
Type = Type.GetHashCode(),
Content = JsonConvert.SerializeObject(FieldUpdateLogContents).AbbreviateString(),
Creator = CommonHelper.GetUserOperator(UserId.ToString(),UserName),
CreateTime = DateTime.Now,
IsDel = BooleanEnum.No.GetHashCode(),
Remark = Remark,
};
if (!CommonDAL.Add(model))
LogFactory.GetLogger("SkyLog").Error(new Exception("保存详细修改历史失败"), "保存详细修改历史失败", "SaveOperationLog", TableName,
null, "", "", TableKeyId.ToString());
});
}
} /// <summary>
/// 字段新旧值修改详细日志
/// </summary>
public class FieldUpdateLogContent
{
/// <summary>
/// 字段英文名,一般就是表的列名
/// </summary>
public string EnName { get; private set; } /// <summary>
/// 字段中文名,一般就是表的中文描述名
/// </summary>
public string CNName { get; private set; } /// <summary>
/// 旧值
/// </summary>
public string OldValue { get; private set; } /// <summary>
/// 新值
/// </summary>
public string NewValue { get; private set; } /// <summary>
/// 构造
/// </summary>
public FieldUpdateLogContent(string enName,string cnName,string oldValue,string newValue)
{
EnName = enName;
CNName = cnName;
OldValue = oldValue;
NewValue = newValue;
}
} /// <summary>
/// 操作类型
/// </summary>
public enum OperateType
{
[Description("新增")]
Add = , [Description("更新")]
Update = , [Description("逻辑删除")]
Remove = ,
}
}
表设计字段:
var model = new OperationLogModel
{
TableName = TableName,
TableKeyId = TableKeyId,
Type = Type.GetHashCode(),
Content = JsonConvert.SerializeObject(FieldUpdateLogContents).AbbreviateString(1990),
Creator = CommonHelper.GetUserOperator(UserId.ToString(),UserName),
CreateTime = DateTime.Now,
IsDel = BooleanEnum.No.GetHashCode(),
Remark = Remark,
};
调用:
public ContentResult OperateLog()
{
var operateLog = new CommonOperateLog("TableName", , OperateType.Add, "remark", CurrentUser.UserId, CurrentUser.UserName);
operateLog.AddLog(new FieldUpdateLogContent("Name", "学生姓名", "钮林华", "钮林华22"));
operateLog.AddLog(new FieldUpdateLogContent("CityId", "城市id", "", ""));
operateLog.SaveOperationLog();
return new ContentResult { Content = operateLog.ToJson() };
}
一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户、某时间、对某表、某主键、某字段的修改(新旧值的更多相关文章
- mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法
[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...
- 两种获取MySql数据库中所有表的主键和外键约束信息的Sql语句
最近在写Rafy底层的一些东西,在数据库方面把MySql数据库集成到里面去,里面有一个需求,需要获取非系统数据库,也就是我们自己建立的数据库中所有表的主键和外键元数据列表. 第一种方法:是网上的方法, ...
- hibernate中删除表遇到主键被外键引用违反完整约束条件不能删除的问题
MySQL在InnoDB中设置了foreign key关联,造成无法更新或删除数据.可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况. SET FOREIGN_KEY_CHECKS ...
- MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)
测试缘由 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了拿 ...
- 【数据库】Mysql中主键的几种表设计组合的实际应用效果
写在前面 前前后后忙忙碌碌,度过了新工作的三个月.博客许久未新,似乎对忙碌没有一点点防备.总结下来三个月不断的磨砺自己,努力从独乐乐转变到众乐乐,体会到不一样的是,连办公室的新玩意都能引起莫名的兴趣了 ...
- mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)
字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...
- 分库分表的 9种分布式主键ID 生成方案,挺全乎的
<sharding-jdbc 分库分表的 4种分片策略> 中我们介绍了 sharding-jdbc 4种分片策略的使用场景,可以满足基础的分片功能开发,这篇我们来看看分库分表后,应该如何为 ...
- Action的三种实现方式,struts.xml配置的详细解释及其简单执行过程(二)
勿以恶小而为之,勿以善小而不为--------------------------刘备 劝诸君,多行善事积福报,莫作恶 上一章简单介绍了Struts2的'两个蝴蝶飞,你好' (一),如果没有看过,请观 ...
- 【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)
原文网址:http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html android 最新 NDK r8 在w ...
随机推荐
- 第三部分:Android 应用程序接口指南---第二节:UI---第六章 对话框
第6章 对话框 一个对话框是一个小窗口,提示用户做出决定或输入额外的信息,一个对话框不填充屏幕并且通常用于在程序运行时中断,然后弹出通知提示用户,从而直接影响到正在运行的程序.图6-1就是对话框的外观 ...
- 【Java】Java Queue的简介
阻塞队列 阻塞队列有几个实现: ArrayBlockingQueue LinkedBlockingQueue PriorityBlockingQueue DelayQueue SynchronousQ ...
- java框架篇---hibernate主键生成策略
Hibernate主键生成策略 1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL ...
- java框架篇---hibernate(一对一)映射关系
对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,本质上就是将数据从 ...
- 【iCore4 双核心板_FPGA】例程四:Signal Tapll 实验——逻辑分析仪
实验现象: 三色led轮流闪烁,具体的逻辑分析仪使用教程请参考iCore3逻辑分析仪例程 核心代码: module signal_ctrl( input clk_25m, input rst_n, o ...
- 【iCore1S 双核心板_ARM】例程四:USART通信实验——通过命令控制LED
实验原理: 开发板上自带一片CH340芯片,完成本实验电脑需要安装CH340驱动, CH340的TXD连接STM32的GPIO(PB6),CH340的RXD连接STM32的 GPIO(PB7),通过串 ...
- 【emWin】例程三十一:窗口对象——Multipage
简介: ULTIPAGE 类似于笔记本中的分隔卡或文件柜中的标签.通过使用MULTIPAGE 小工具,应用程序可为窗口或对话框的相同区域定义多个页面.每个页面包含特定 类型的信息或用户选择相应页面时应 ...
- DBNull与Null的区别
Null是.net中无效的对象引用. DBNull是一个类.DBNull.Value是它唯一的实例.它指数据库中数据为空(<NULL>)时,在.net中的值. null表示一个对象的指向无 ...
- hdoj:2036
#include <iostream> using namespace std; struct Point { int x, y; }; Point a[]; int main() { i ...
- CentOS7主机名修改
1.命令行更改主机名,重启终端即生效. #hostnamectl --static set-hostname k8s-master