一种历史详细记录表,完整实现: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 ...
随机推荐
- 判断一棵二叉树是否为AVL树
思路:AVL树是高度平衡的二叉搜索树,这里为了清晰说明,分别判断是否为搜索树,是否为平衡树. struct TreeNode { struct TreeNode *left; struct TreeN ...
- ios开发:一个音乐播放器的设计与实现
github地址:https://github.com/wzpziyi1/MusicPlauer 这个Demo,关于歌曲播放的主要功能都实现了的.下一曲.上一曲,暂停,根据歌曲的播放进度动态滚动歌词, ...
- mxnet:背景介绍
学习的过程 使用mxnet作为教程的深度学习库,重点介绍高层抽象包gluon 双轨学习法,既教授大家从零实现,也教授大家使用gluon实现模型:前者为了理解深度学习的底层设计,后者将大家从繁琐的模型设 ...
- 【iCore4 双核心板_FPGA】例程十五:基于单口RAM的ARM+FPGA数据存取实验
实验现象: 写RAM命令格式:write:地址(0-255),数据(0-65535)\cr\lf 读RAM命令格式:read:地址(0-255)\cr\lf 核心代码: int main(void) ...
- Java知多少(67)面向字符的输入流
字符流是针对字符数据的特点进行过优化的,因而提供一些面向字符的有用特性,字符流的源或目标通常是文本文件. Reader和Writer是java.io包中所有字符流的父类.由于它们都是抽象类,所以应使用 ...
- Foxpro数据库连接错误解决方法--【VFP DBF文件不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器】
直接访问vfp dbf文件时报错: 错误描述: 'd:\vfpData\test.dbf'不是一个有效的路径. 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器. 解决办法:Data Sour ...
- c#扩展函数
分页 public static class IEnumerableExt { public static (IEnumerable<T> dataAfterPaging, Pageinf ...
- postman中 form-data、x-www-form-urlencoded、raw、binary的区别--转
原文地址:http://blog.csdn.net/ye1992/article/details/49998511 1.form-data: 就是http请求中的multipart/form-dat ...
- 大杂烩 -- equals、hashCode联系与区别
基础大杂烩 -- 目录 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Equals 1.默认情况(没有覆盖equals方 ...
- windows系统下,express构建的node项目中,如何用debug控制调试日志
debug是一款控制日志输出的库,可以在开发调试环境下打开日志输出,生产环境下关闭日志输出.这样比console.log方便多了,console.log只有注释掉才能不输出. debug库还可以根据d ...