一种历史详细记录表,完整实现: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. vertx插件使用vertx-maven-plugin

    http://search.maven.org http://search.maven.org/#artifactdetails%7Cio.fabric8%7Cvertx-maven-plugin%7 ...

  2. 最简单的基于FFmpeg的AVfilter样例(水印叠加)

    ===================================================== 最简单的基于FFmpeg的AVfilter样例系列文章: 最简单的基于FFmpeg的AVfi ...

  3. [Big Data - Suro] Netflix开源数据流管理器Suro

    Netflix近日开源了一个叫做Suro的工具,公司可以利用它来做数据源主机到目标主机的实时定向.它不只在Netflix的数据管道上扮演重要角色,大规模下的应用场景同样令人印象深刻. Netflix各 ...

  4. ElasticSearch性能优化策略【转】

    ElasticSearch性能优化主要分为4个方面的优化. 一.服务器部署 二.服务器配置 三.数据结构优化 四.运行期优化 一.服务器部署 1.增加1-2台服务器,用于负载均衡节点 elasticS ...

  5. iOS利用Application Loader打包提交到App Store时遇到错误The filename 未命名.ipa in the package contains an invalid character(s). The valid characters are:A-Z ,a-z,0-9,dash,period,underscore,but the name cannot start w

    iOS利用Application Loader打包提交到App Store时遇到错误: The filename 未命名.ipa in the package contains an invalid ...

  6. Oracle同一个用户下启动多个数据库实例

     oracle@yingxiang-testServer1 oradata]$ export ORACLE_SID=APPDB[oracle@yingxiang-testServer1 oradata ...

  7. 安装oracle遇到的故障

    安装oracle遇到的故障 安装oracle遇到的故障总结 os:centos4.7(64位)db版本:oracle10.0.2.1(64位) 这次安装oracle又遇到点小问题,每次都是遇到点小问题 ...

  8. Android Launcher分析和修改10——HotSeat深入进阶

    前面已经写过Hotseat分析的文章,主要是讲解如何在Launcher里面配置以及修改Hotseat的参数.今天主要是讲解一下如何在Hotseat里面的Item显示名称.这个小问题昨天折腾了半天,最后 ...

  9. 【iCore1S 双核心板_ARM】例程十一:RTC实时时钟实验——显示时间和日期

    实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ RTC_DateTypeDef sDate; RTC_TimeTypeDef sTime; u ...

  10. 【WPF】图片按钮的单击与双击事件

    需求:ListBox中的Item是按钮图片,要求单击和双击时触发不同的事件. XAML中需要引入System.Windows.Interactivity.dll xmlns:i="clr-n ...