一种历史详细记录表,完整实现: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 ...
随机推荐
- [svc]二三层数据格式&&三层数据如何匹配路由
网络知识拾遗 tcpip的4&7层模型 PDU数据包在不同层的不同称呼 物理层(一层)PDU指数据位(Bit). 数据链路层(二层)PDU指数据帧(Frame). 网络层(三层)PDU指数据包 ...
- CSA Enterprise Architecture图
https://research.cloudsecurityalliance.org/tci/index.php/explore/
- sql in not in 案例用 exists not exists 代替
from AppStoke B WHERE B.Opencode=A.Code) in用extist代替 select distinct * from Stoke where Code not in ...
- hdoj:2044
#include <iostream> using namespace std; long long fib(int n) { ; ; ) ; ) { long long f2 = f0 ...
- 解决Android8.0之后开启service时报错IllegalStateException: Not allowed to start service Intent ...
项目测试时发现的,在双击返回键关闭应用后(并未杀死后台)重新打开APP,其他手机都OK,但是8.0的手机会出现较频繁的crash.检查代码,问题锁定在重新开启应用时的startService()上. ...
- java对象与map对象相互转换
/** * 使用org.apache.commons.beanutils进行转换 */ class A { public static Object mapToObject(Map<String ...
- Ubuntu下搜狗输入法只显示黑框,不显示输入的汉字选项
1. cd ~/.config 2.删除三个文件夹: SogouPY, SogouPY.users, sogou-qimpanel 然后重启输入法
- [原]VS2012编译GLEW 1.11
1.到http://glew.sourceforge.net/下载源代码 2.使用vs2012打开build下vc6的glew.dsw ,自动生成2012工程(一路点确定)特别注意:不要使用build ...
- [Bayes] Latent Gaussian Process Models
比较难理解,通过做题来入门. 目的:简单的了解下相关概念. 基础 热身 目的:找x到y的映射关系. 假设:Q latent functions {fi} fj 作为先验,跟x没什么直接关系,x只是作为 ...
- opencv各种绘图 直线 矩形 圆 椭圆
画图函数 (1)直线cvLine函数 其结构 void cvLine(//画直线 CvArr* array,//画布图像 CvPoint pt1,//起始点 CvPoint pt2,//终点 CvSc ...