一种历史详细记录表,完整实现: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 详细记录某用户、某时间、对某表、某主键、某字段的修改(新旧值的更多相关文章

  1. mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

    [CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...

  2. 两种获取MySql数据库中所有表的主键和外键约束信息的Sql语句

    最近在写Rafy底层的一些东西,在数据库方面把MySql数据库集成到里面去,里面有一个需求,需要获取非系统数据库,也就是我们自己建立的数据库中所有表的主键和外键元数据列表. 第一种方法:是网上的方法, ...

  3. hibernate中删除表遇到主键被外键引用违反完整约束条件不能删除的问题

    MySQL在InnoDB中设置了foreign key关联,造成无法更新或删除数据.可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况.  SET FOREIGN_KEY_CHECKS ...

  4. MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)

    测试缘由 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了拿 ...

  5. 【数据库】Mysql中主键的几种表设计组合的实际应用效果

    写在前面 前前后后忙忙碌碌,度过了新工作的三个月.博客许久未新,似乎对忙碌没有一点点防备.总结下来三个月不断的磨砺自己,努力从独乐乐转变到众乐乐,体会到不一样的是,连办公室的新玩意都能引起莫名的兴趣了 ...

  6. mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)

    字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...

  7. 分库分表的 9种分布式主键ID 生成方案,挺全乎的

    <sharding-jdbc 分库分表的 4种分片策略> 中我们介绍了 sharding-jdbc 4种分片策略的使用场景,可以满足基础的分片功能开发,这篇我们来看看分库分表后,应该如何为 ...

  8. Action的三种实现方式,struts.xml配置的详细解释及其简单执行过程(二)

    勿以恶小而为之,勿以善小而不为--------------------------刘备 劝诸君,多行善事积福报,莫作恶 上一章简单介绍了Struts2的'两个蝴蝶飞,你好' (一),如果没有看过,请观 ...

  9. 【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)

    原文网址:http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html android 最新 NDK r8 在w ...

随机推荐

  1. python + django + dwebsocket 实现简单的聊天室

    使用库dwebsocket,具体参考此处 views.py: from dwebsocket.decorators import accept_websocket,require_websocket ...

  2. THE OVERARCHING PROCESS OF TEST DESIGN

    THE OVERARCHING PROCESS OF TEST DESIGN -Test note of “Essential Software Test Design” 2015-08-27 Con ...

  3. cad巧用插件自定义填充图形

    很多同志如果遇到奇葩的填充图案,怎么办,找不到合适的,自己辛苦画了一遍,想把它作为自己的自定义的图案,怎么办呢. 今天老王给你您介绍个好用的插件. 首先在命令行输入命令  ap 弹出加载对话框 打开窗 ...

  4. 【九天教您南方cass 9.1】 14 坐标数据的纠正

    同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程 我是本节课主讲老师九天. 我们讲课的教程附件也是共享的,请注意索取 在测量空间中. 九天老师的联系方式  点击直接请教九天老师吧! ...

  5. 【Git】简单使用

    [Git & Github] 首先不能混淆两者的概念.git是一个类似于svn的版本管理工具.其可以在本地建立起针对一个项目的众多维度的版本管理体系,提升了开发的效率. 相对的,我们如果想要和 ...

  6. Java——安全地停止线程

    错误用例 下面用例中,一个正在sleep的线程,在调用interrupt后,wait方法检查到isInterrupted()为true,抛出异常, 而catch到异常后没有处理.一个抛出了Interr ...

  7. Sql Server 数据类型与 C# 数据类型对照

    Sql Server 数据类型与 C# 数据类型对照 已验证类型(Sql Server 2012 & Visual Studio 2013) Sql Server C# 简写 bigint S ...

  8. Ubuntu下安装和使用zookeeper和kafka

    1.在清华镜像站下载kafka_2.10-0.10.0.0.tgz 和 zookeeper-3.4.10.tar.gz 分别解压到/usr/local目录下 2.进入zookeeper目录,在conf ...

  9. C#操作Word Aspose.Words组件介绍及使用—基本介绍与DOM概述

    1.基本介绍 Aspose.Words是一个商业.NET类库,可以使得应用程序处理大量的文件任务.Aspose.Words支持Doc,Docx,RTF,HTML,OpenDocument,PDF,XP ...

  10. php文件缓存方法总结

    为大家分享很全的php文件缓存,供大家参考,具体内容如下 <?php class cache {  private static $_instance = null;    protected ...