日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

系统操作日志设计(二)

發布時間:2024/9/5 windows 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 系统操作日志设计(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一篇《系統操作日志設計》,已基本介紹了為什么要系統操作日志和設計系統操作日志部分內容,如不清楚系統操作日志的請點這里。 :)

????? 通了解《系統操作日志設計》,已基本明確我們不能通過clone的方式來做日志的設計,因為這樣不僅會造成的你數據庫表爆炸的情況,還大大的增加了工作量,減少了系統的可維護性。

????? 通過思考大概清楚系統操作日志的設計,以下是其UML圖:

?

通過上圖,我們可以了解知道該UML主要由三個表組成,其中一個主表LogSetting和兩個從表分別是LogOperation和LogSettingDetail。

那么怎么樣才能通過這樣的設計來現實我們的日志功能呢?

其實一開始我就覺得通過.net的反射功能可以很簡單、很方便的實現這個功能,所以我就順著一個思路來實現她;通過反射動態的獲取Model實體的屬性,然后再根據LogSettingDetail配置來匹配所要記錄的字段信息。

?

先來主要的代碼吧,發現將思想用文字表達出來還是較困難的,代碼比較直接:

代碼的實現

usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.WebParts;usingSystem.Web.UI.HtmlControls;usingBLL.Sys;usingSystem.Collections.Generic;usingSystem.Collections.Specialized;usingSystem.Text;usingSystem.Reflection;/// <summary> ///LogManager 的摘要說明/// </summary>public classLogManager<T>whereT :new() {#regionConstructor/// <summary>///日志管理構造函數/// </summary>publicLogManager(){tableName =typeof(T).Name;Model.Sys.LogSettingmodel = GetLogSetting(tableName);if(model !=null){businessName = model.BusinessName;logID = model.LogID;primaryKey = model.PrimaryKey;urlTemplate = model.UrlTemplate;deleteScriptTemplate = model.DeleteScriptTemplate;updateScriptTemplate = model.UpdateScriptTemplate;}else{throw newArgumentNullException("日志設置為空!");}}/// <summary>//////日志管理構造函數/// </summary>/// </summary>/// <param name="tableName">表名</param>/// <param name="businessName">業務名稱</param>publicLogManager(stringtableName,stringbusinessName){this.tableName = tableName;this.businessName = businessName;Model.Sys.LogSettingmodel = GetLogSetting(tableName, businessName);if(model !=null){logID = model.LogID;primaryKey = model.PrimaryKey;urlTemplate = model.UrlTemplate;deleteScriptTemplate = model.DeleteScriptTemplate;updateScriptTemplate = model.UpdateScriptTemplate;}else{throw newArgumentNullException("日志設置為空!");}}#endregion#regionPropertiesprivate intlogID;private stringtableName;private stringbusinessName;private stringprimaryKey;private stringurlTemplate;private stringdeleteScriptTemplate;private stringupdateScriptTemplate;/// <summary>///日志設置實體列表/// </summary>publicList<Model.Sys.LogSetting> LogSettingList{get{System.Web.Caching.Cachecache =HttpRuntime.Cache;List<Model.Sys.LogSetting> list = cache["LogSettingList"]asList<Model.Sys.LogSetting>;if(list !=null&& list.Count > 0){returnlist;}else{LogSettingbll =newLogSetting();list = bll.GetModelList(string.Empty);cache["LogSettingList"] = list;returnlist;}}set{System.Web.Caching.Cachecache =HttpRuntime.Cache;cache["LogSettingList"] =null;}}/// <summary>///日志設置明細/// </summary>publicList<Model.Sys.LogSettingDetail> LogSettingDetail{get{System.Web.Caching.Cachecache =HttpRuntime.Cache;List<Model.Sys.LogSettingDetail> list = cache["LogSettingDetail"]asList<Model.Sys.LogSettingDetail>;if(list !=null&& list.Count > 0){returnlist;}else{LogSettingDetailbll =newLogSettingDetail();list = bll.GetModelList(string.Empty);cache["LogSettingDetail"] = list;returnlist;}}set{System.Web.Caching.Cachecache =HttpRuntime.Cache;cache["LogSettingDetail"] =null;}}#endregion#regionMethod/// <summary>///通過logId獲取日志設置明細/// </summary>/// <param name="logId">日志設置編號</param>/// <returns></returns>privateList<Model.Sys.LogSettingDetail> GetLogSettingDetails(intlogId){if(logId == 0)throw newArgumentNullException("LogID為空");List<Model.Sys.LogSettingDetail> list =newList<Model.Sys.LogSettingDetail>();foreach(Model.Sys.LogSettingDetailvarinLogSettingDetail){if(var.LogID == logId)list.Add(var);}returnlist;}/// <summary>///通過tableName和businessName來獲取日志設置對象/// </summary>/// <param name="tableName"></param>/// <param name="businessName"></param>/// <returns></returns>privateModel.Sys.LogSettingGetLogSetting(stringtableName,stringbusinessName){foreach(Model.Sys.LogSettingvarinLogSettingList){if(var.TableName.Equals(tableName,StringComparison.InvariantCultureIgnoreCase) && var.BusinessName.Equals(businessName,StringComparison.InvariantCultureIgnoreCase))returnvar;}return null;}privateModel.Sys.LogSettingGetLogSetting(stringtableName){foreach(Model.Sys.LogSettingvarinLogSettingList){if(var.TableName.Equals(tableName,StringComparison.InvariantCultureIgnoreCase))returnvar;}return null;}/// <summary>///比較兩個實體,然后返回實體中每個屬性值不同的內容/// </summary>/// <param name="oldObj"></param>/// <param name="newObj"></param>/// <returns></returns>public stringCompare(T oldObj, T newObj){TypeobjTye =typeof(T);StringBuildersbResult =newStringBuilder();stringtableHeader ="<table class=/"GridView/" cellspacing=/"0/" rules=/"all/" border=/"1/" id=/"gv/" style=/"border-collapse:collapse;/">";tableHeader +="<tr><th scope=/"col/">序號</th><th scope=/"col/">字段</th><th scope=/"col/">名稱</th><th scope=/"col/">舊值</th><th scope=/"col/">新值</th></tr>";stringtableRow ="<tr class='{0}'><td>{1}</td><td>{2}</td><td>{3}</td><td>{4}</td><td>{5}</td></tr>";List<Model.Sys.LogSettingDetail> list = GetLogSettingDetails(logID);inti = 1;foreach(Model.Sys.LogSettingDetailvarinlist){PropertyInfoproperty = objTye.GetProperty(var.ColumnName);if(property !=null&& !property.IsSpecialName){objecto = property.GetValue(oldObj,null);objectn = property.GetValue(newObj,null);if(!IsEqual(property.PropertyType, o, n)){sbResult.AppendFormat(tableRow, i % 2 == 0 ?"odd":"even", i, var.ColumnName, var.ColumnText, o, n);i++;}}}sbResult.Append("</table>");#regionAdd Log Recordif(i > 1){Model.Sys.LogOperationoperModel =newModel.Sys.LogOperation();operModel.LogID = logID;operModel.OperationType = (int)OperationType.Update;operModel.Content = tableHeader + sbResult.ToString();operModel.CreateTime =DateTime.Now;if(HttpContext.Current !=null)operModel.CreateUser =HttpContext.Current.User.Identity.Name;if(!string.IsNullOrEmpty(primaryKey)){PropertyInfop = objTye.GetProperty(primaryKey);objecto = p.GetValue(newObj,null);if(o !=null){operModel.PrimaryKeyValue = o.ToString();if(urlTemplate.Contains("{0}"))operModel.Url =string.Format(urlTemplate, o.ToString());}}LogOperationoperBll =newLogOperation();operBll.Add(operModel);}#endregionreturntableHeader + sbResult.ToString();}/// <summary>///刪除實體操作,這里并不是真的刪除該實體,而是將刪除的操作記錄在日志中/// </summary>/// <param name="obj"></param>/// <returns></returns>public stringDelete(T obj){TypeobjTye =typeof(T);StringBuildersbResult =newStringBuilder();stringtableHeader ="<table class=/"GridView/" cellspacing=/"0/" rules=/"all/" border=/"1/" id=/"gv/" style=/"border-collapse:collapse;/">";tableHeader +="<tr><th scope=/"col/">序號</th><th scope=/"col/">字段</th><th scope=/"col/">名稱</th><th scope=/"col/">值</th></tr>";stringtableRow ="<tr class='{0}'><td>{1}</td><td>{2}</td><td>{3}</td><td>{4}</td></tr>";List<Model.Sys.LogSettingDetail> list = GetLogSettingDetails(logID);inti = 1;foreach(Model.Sys.LogSettingDetailvarinlist){PropertyInfoproperty = objTye.GetProperty(var.ColumnName);if(property !=null&& !property.IsSpecialName){objecto = property.GetValue(obj,null);sbResult.AppendFormat(tableRow, i % 2 == 0 ?"odd":"even", i, var.ColumnName, var.ColumnText, o);i++;}}sbResult.Append("</table>");#regionAdd Log Record Model.Sys.LogOperationoperModel =newModel.Sys.LogOperation();operModel.LogID = logID;operModel.OperationType = (int)OperationType.Delete;operModel.Content = tableHeader + sbResult.ToString();operModel.CreateTime =DateTime.Now;if(!string.IsNullOrEmpty(primaryKey)){PropertyInfop = objTye.GetProperty(primaryKey);objecto = p.GetValue(obj,null);if(o !=null){operModel.PrimaryKeyValue = o.ToString();if(urlTemplate.Contains("{0}"))operModel.Url =string.Format(urlTemplate, o.ToString());}}if(HttpContext.Current !=null)operModel.CreateUser =HttpContext.Current.User.Identity.Name;LogOperationoperBll =newLogOperation();operBll.Add(operModel);#endregionreturn string.Empty;}/// <summary>///添加實體,將添加的操作記錄在日志中/// </summary>/// <param name="obj"></param>/// <returns></returns>public stringAdd(T obj){TypeobjTye =typeof(T);StringBuildersbResult =newStringBuilder();stringtableHeader ="<table class=/"GridView/" cellspacing=/"0/" rules=/"all/" border=/"1/" id=/"gv/" style=/"border-collapse:collapse;/">";tableHeader +="<tr><th scope=/"col/">序號</th><th scope=/"col/">字段</th><th scope=/"col/">名稱</th><th scope=/"col/">值</th></tr>";stringtableRow ="<tr class='{0}'><td>{1}</td><td>{2}</td><td>{3}</td><td>{4}</td></tr>";List<Model.Sys.LogSettingDetail> list = GetLogSettingDetails(logID);inti = 1;foreach(Model.Sys.LogSettingDetailvarinlist){PropertyInfoproperty = objTye.GetProperty(var.ColumnName);if(property !=null&& !property.IsSpecialName){objecto = property.GetValue(obj,null);sbResult.AppendFormat(tableRow, i % 2 == 0 ?"odd":"even", i, var.ColumnName, var.ColumnText, o);i++;}}sbResult.Append("</table>");#regionAdd Log Record Model.Sys.LogOperationoperModel =newModel.Sys.LogOperation();operModel.LogID = logID;operModel.OperationType = (int)OperationType.Add;operModel.Content = tableHeader + sbResult.ToString();operModel.CreateTime =DateTime.Now;if(!string.IsNullOrEmpty(primaryKey)){PropertyInfop = objTye.GetProperty(primaryKey);objecto = p.GetValue(obj,null);if(o !=null){operModel.PrimaryKeyValue = o.ToString();if(urlTemplate.Contains("{0}"))operModel.Url =string.Format(urlTemplate, o.ToString());}}if(HttpContext.Current !=null)operModel.CreateUser =HttpContext.Current.User.Identity.Name;LogOperationoperBll =newLogOperation();operBll.Add(operModel);#endregionreturn string.Empty;}/// <summary>///復制一個對象/// </summary>/// <param name="obj"></param>/// <returns></returns>publicT Clone(T obj){TypeobjTye =typeof(T);T model =newT();PropertyInfo[] properties = objTye.GetProperties();foreach(PropertyInfopropertyinproperties){if(!property.IsSpecialName){objecto = property.GetValue(obj,null);property.SetValue(model, o,null);}}returnmodel;}private boolIsEqual(TypedataType,objectoldObj,objectnewObj){if(oldObj ==null&& newObj ==null)return true;if(dataType ==typeof(int)){return(int)oldObj == (int)newObj;}else if(dataType ==typeof(decimal)){return(decimal)oldObj == (decimal)newObj;}else if(dataType ==typeof(double)){return(double)oldObj == (double)newObj;}else if(dataType ==typeof(Guid)){return(Guid)oldObj == (Guid)newObj;}else if(dataType ==typeof(DateTime)){return(DateTime)oldObj == (DateTime)newObj;}elsereturnoldObj.Equals(newObj);}#regionScript. Excute//public int DeleteBusRecode(string primaryKeyValue)//{// if (string.IsNullOrEmpty(tableName))// throw new ArgumentException("tableName為空");// if(string.IsNullOrEmpty(primaryKey))// throw new ArgumentException("primaryKey為空");// if (string.IsNullOrEmpty(deleteScriptTemplate))// throw new ArgumentException("deleteScriptTemplate為空");// string strSql = string.Format(deleteScriptTemplate, primaryKeyValue);// Database db = DatabaseFactory.CreateDatabase();// return 0;//}#endregion#endregion}public enumOperationType{Select = 0,Add = 1,Update = 2,Delete = 3 }

?

使用的場景

Model文件:

publicclassEmployeeModel{publicintID{get;set;}publicstringName{get;set;}…} 下面介紹如何將系統操作日志集成到你的業務系統中 添加操作: EmployeeBll bll = new EmployeeBll(); EmployeeModel model = new EmployeeModel(); /* model 實體經過漫長的 賦值 后… */ bll.Add(model); //添加實體 //添加系統操作記錄 //日志LogManager<EmployeeModel> log =newLogManager<EmployeeModel>(); log.Add(model); ? 更新操作: EmployeeBll bll = new EmployeeBll(); EmployeeModel model = bll.GetModel(employeeID); LogManager<EmployeeModel> log =newLogManager<EmployeeModel>(); EmployeeModel modelOld = log.Clone(model); //克隆EmployeeModel實體對象,這個主要是在系統操作日志記錄時使用的 ? /* model 實體又經過漫長的 賦值 后… */ bll.Update(model); //更新實體 //將更新的內容寫入系統操作日志中 log.Compare(modelOld, model); //原來的實體和賦值后的實體對比,并將更新的內容寫入系統操作日志中 ? 刪除操作: 在GridView的RowDeleting事件中獲取要刪除的實體 EmployeeBll bll = new EmployeeBll(); EmployeeModel model = bll.GetModel(employeeID); bll.Delete(employeeID); LogManager<EmployeeModel> log =newLogManager<EmployeeModel>(); log.Delete(model); //實體的內容記錄到日志中 ? .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }?

?

總結:

大家可以看到代碼還是比較粗糙的,有不少的重復的代碼,下一節將會討論如何進行系統操作日志管理

另外如何大家有什么意見或想法請分享提出。

?

本節用到的知識點

1、泛型

2、反射

3、緩存

?

優點:

1、使用和集成方便,代碼量小;

2、大大提高工作效率,避免表爆炸;

?

缺點:

1、代碼有待優化;

2、可擴展性較差

?

?

轉載[http://samlin.cnblogs.com/]

轉載于:https://www.cnblogs.com/jackljf/archive/2010/07/20/3589396.html

總結

以上是生活随笔為你收集整理的系统操作日志设计(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。