构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(11)-系统日志和异常的处理①...
系列目录
系统需要越来越自动化,我们需要引入日志记录和异常捕获
管理员的操作记录需要被记录,看出哪些模块是频繁操作,分析哪些是不必要的功能,哪些是需要被优化的。
系统的异常需要被捕获,而不是将系统出错显示出来给用户就不了了知。我们需要异常日志不断改进系统。
我们老说用户,我们还没有用户权限的表,所以我们在Home中先加入一个虚拟用户吧!
首先我们创建一个用户类AccountModel放在App.Models下的Sys文件夹下
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceApp.Models.Sys {public classAccountModel{public string Id { get; set; }public string TrueName { get; set; }} }
AccountModel.cs
在HomeController或者AccountController插入代码
AccountModel account = newAccountModel(); account.Id= "admin"; account.TrueName= "admin"; Session["Account"] = account;
下面将带来系统日志的记录,主要记录管理员的增、删、改等操作的成功与失败的异常记录
日志插件有著名的log4net,可以输出多种格式,如文本,xml,数据库等,我们没有必要做到这么强大,我们只做符合系统的就可以了,记录到数据库,方便做统计等操
作,我们何时何地记录日志?
- 在Controller层做记录;
- 当用户的操作成功时记录;
- 当用户的操作失败时记录;
首先创建数据库存放表:SysLog
USEDBGO/****** Object: Table [dbo].[SysLog] Script Date: 11/20/2013 21:13:38 ******/ SET ANSI_NULLS ON GOSET QUOTED_IDENTIFIER ON GOSET ANSI_PADDING ON GOCREATE TABLE [dbo].[SysLog]([Id] [varchar](50) NOT NULL, --GUID[Operator] [varchar](50) NULL,--操作人[Message] [varchar](500) NULL,--操作信息[Result] [varchar](20) NULL,--结果[Type] [varchar](20) NULL,--操作类型[Module] [varchar](20) NULL,--操作模块[CreateTime] [datetime] NULL,--操作事件CONSTRAINT [PK_SysLog] PRIMARY KEY CLUSTERED([Id] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY])ON [PRIMARY]GOSET ANSI_PADDING OFF GO
SysLogSQL
EF更新模型,创建SysLogModel类放在App.Models下的Sys文件夹下
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.ComponentModel.DataAnnotations;namespaceApp.Models.Sys {public classSysLogModel{[Display(Name= "ID")]public string Id { get; set; }[Display(Name= "操作人")]public string Operator { get; set; }[Display(Name= "信息")]public string Message { get; set; }[Display(Name= "结果")]public string Result { get; set; }[Display(Name= "类型")]public string Type { get; set; }[Display(Name= "模块")]public string Module { get; set; }[Display(Name= "创建时间")]public DateTime? CreateTime { get; set; }} }
SysLogModel.cs
创建SysLog的BLL层和DAL层
usingSystem;usingApp.Models;usingSystem.Linq;namespaceApp.IDAL {public interfaceISysLogRepository{intCreate(SysLog entity);void Delete(DBContainer db, string[] deleteCollection);IQueryable<SysLog>GetList(DBContainer db);SysLog GetById(stringid);} }
ISysLogRepository
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingApp.Models;usingApp.IDAL;namespaceApp.DAL {public classSysLogRepository:IDisposable, ISysLogRepository{/// <summary>///获取集合/// </summary>/// <param name="db">数据库</param>/// <returns>集合</returns>public IQueryable<SysLog>GetList(DBContainer db){IQueryable<SysLog> list =db.SysLog.AsQueryable();returnlist;}/// <summary>///创建一个对象/// </summary>/// <param name="db">数据库</param>/// <param name="entity">实体</param>public intCreate(SysLog entity){using (DBContainer db = newDBContainer()){db.SysLog.AddObject(entity);returndb.SaveChanges();}}/// <summary>///删除对象集合/// </summary>/// <param name="db">数据库</param>/// <param name="deleteCollection">集合</param>public void Delete(DBContainer db, string[] deleteCollection){IQueryable<SysLog> collection = from f indb.SysLogwheredeleteCollection.Contains(f.Id)selectf;foreach (var deleteItem incollection){db.SysLog.DeleteObject(deleteItem);}}/// <summary>///根据ID获取一个实体/// </summary>/// <param name="id"></param>/// <returns></returns>public SysLog GetById(stringid){using (DBContainer db = newDBContainer()){return db.SysLog.SingleOrDefault(a => a.Id ==id);}}public voidDispose(){ }} }
SysLogRepository
usingSystem;usingSystem.Collections.Generic;usingApp.Common;usingApp.Models;namespaceApp.IBLL {public interfaceISysLogBLL{List<SysLog> GetList(ref GridPager pager,stringqueryStr);SysLog GetById(stringid);} }
ISysLogBLL
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingMicrosoft.Practices.Unity;usingApp.IDAL;usingApp.Common;usingApp.Models.Sys;usingApp.Models;usingApp.IBLL;namespaceApp.BLL {public classSysLogBLL: ISysLogBLL{[Dependency]public ISysLogRepository logRepository { get; set; }public List<SysLog> GetList(ref GridPager pager, stringqueryStr){DBContainer db= newDBContainer();List<SysLog> query = null;IQueryable<SysLog> list =logRepository.GetList(db);if (!string.IsNullOrWhiteSpace(queryStr)){list= list.Where(a => a.Message.Contains(queryStr) ||a.Module.Contains(queryStr));pager.totalRows=list.Count();}else{pager.totalRows=list.Count();}if (pager.order == "desc"){query= list.OrderByDescending(c => c.CreateTime).Skip((pager.page - 1) *pager.rows).Take(pager.rows).ToList();}else{query= list.OrderBy(c => c.CreateTime).Skip((pager.page - 1) *pager.rows).Take(pager.rows).ToList();}returnquery;}public SysLog GetById(stringid){returnlogRepository.GetById(id);}} }
SysLogBLL
创建SysLog的Controller
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;usingApp.Common;usingApp.Models;usingMicrosoft.Practices.Unity;usingApp.IBLL;usingApp.Models.Sys;namespaceApp.Admin.Controllers {public classSysLogController : Controller{////GET: /SysLog/ [Dependency]public ISysLogBLL logBLL { get; set; }publicActionResult Index(){returnView();}public JsonResult GetList(GridPager pager, stringqueryStr){List<SysLog> list = logBLL.GetList(refpager, queryStr);var json = new{total=pager.totalRows,rows= (from r inlistselect newSysLogModel(){Id=r.Id,Operator=r.Operator,Message=r.Message,Result=r.Result,Type=r.Type,Module=r.Module,CreateTime=r.CreateTime}).ToArray()};returnJson(json);}#region 详细public ActionResult Details(stringid){SysLog entity=logBLL.GetById(id);SysLogModel info= newSysLogModel(){Id=entity.Id,Operator=entity.Operator,Message=entity.Message,Result=entity.Result,Type=entity.Type,Module=entity.Module,CreateTime=entity.CreateTime,};returnView(info);}#endregion} }
SysLogController.cs
创建SysLog的Index视图和Details视图,我们暂时提示Index和Details,删除功能童鞋们自己扩展,我们有样例程序SysSample嘛,什么都是必然的了
@using App.Admin; @using App.Common; @using App.Models.Sys;@{ViewBag.Title= "Index";Layout= "~/Views/Shared/_Index_Layout.cshtml";}<script src="~/Scripts/jquery.easyui.plus.js"></script> <div class="mvctool"> <input id="txtQuery" type="text" class="searchText"/> <a id="btnQuery" style="float: left;" class="l-btn l-btn-plain"><span class="l-btn-left"><span class="l-btn-text icon-search" style="padding-left: 20px;">查询</span></span></a><div class="datagrid-btn-separator"></div> <a id="btnDetails" style="float: left;" class="l-btn l-btn-plain"><span class="l-btn-left"><span class="l-btn-text icon-details" style="padding-left: 20px;">详细</span></span></a><div class="datagrid-btn-separator"></div> <a id="btnDelete" style="float: left;" class="l-btn l-btn-plain"><span class="l-btn-left"><span class="l-btn-text icon-remove" style="padding-left: 20px;">删除</span></span></a> </div><table id="List"></table> <div id="Pager"></div> <div id="modalwindow" class="easyui-window" data-options="modal:true,closed:true,minimizable:false,shadow:false"></div>@*Jqgrid*@<script type="text/javascript">//ifram 返回 function frameReturnByClose() {$("#modalwindow").window('close');}function frameReturnByReload(flag) {if(flag)$("#List").datagrid('load');else$("#List").datagrid('reload');}function frameReturnByMes(mes) {$.messageBox5s('提示', mes);}$(function () {$('#List').datagrid({url:'/SysLog/GetList',width: $(window).width()- 10,methord:'post',height: $(window).height()- 35,fitColumns:true,sortName:'Id',sortOrder:'desc',idField:'Id',pageSize:15,pageList: [15, 20, 30, 40, 50],pagination:true,striped:true, //奇偶行是否区分singleSelect: true,//单选模式 columns: [[{ field:'Id', title: 'ID', width: 40, hidden: true},{ field:'Operator', title: '操作人', width: 40},{ field:'Message', title: '信息', width: 280},{ field:'Result', title: '结果', width: 40, align: 'center'},{ field:'Type', title: '类型', width: 40, align: 'center'},{ field:'Module', title: '模块', width: 60, align: 'center'},{ field:'CreateTime', title: '添加时间', width: 65, align: 'center'}]]});});</script>@*operation*@<script type="text/javascript">$(function () {$("#btnDetails").click(function () {var row = $('#List').datagrid('getSelected');if (row != null) {$("#modalwindow").html("<iframe width='100%' height='98%' frameborder='0' src='/SysLog/Details?id=" + row.Id + "'></iframe>");$("#modalwindow").window({ title: '详细', width: 500, height: 400, iconCls: 'icon-details' }).window('open');}else { $.messageBox5s('提示', '请选择要操作的行!'); }});$("#btnQuery").click(function () {var queryStr = $("#txtQuery").val();//如果查询条件为空默认查询全部if (queryStr == null) {queryStr= "%";}$('#List').datagrid({ url: '/SysLog/GetList?queryStr=' +encodeURI(queryStr)});});});</script>
Index.cshtml
@model App.Models.Sys.SysLogModel @using App.Common; @using App.Admin; @using App.Models.Sys; @{ViewBag.Title= "Details";Layout= "~/Views/Shared/_Index_LayoutEdit.cshtml";}<script type="text/javascript">$(function () {$("#btnReturn").click(function () {window.parent.frameReturnByClose();});});</script> <div class="mvctool bgb"><a id="btnReturn" style="float: left;" class="l-btn l-btn-plain"><span class="l-btn-left"><span class="l-btn-text icon-return" style="padding-left: 20px;">返回</span></span></a> </div>@using (Html.BeginForm()) {<table class="form_table setinput355"><tbody><tr><th>@Html.LabelFor(model=>model.Operator)</th><td>@Html.EditorFor(model=>model.Operator)</td></tr><tr><th>@Html.LabelFor(model=>model.Message)</th><td>@Html.TextAreaFor(model=> model.Message, new { @style="height:100px;"})</td></tr><tr><th>@Html.LabelFor(model=>model.Result)</th><td>@Html.EditorFor(model=>model.Result)</td></tr><tr><th>@Html.LabelFor(model=>model.Type)</th><td>@Html.EditorFor(model=>model.Type)</td></tr><tr><th>@Html.LabelFor(model=>model.Module)</th><td>@Html.EditorFor(model=>model.Module)</td></tr><tr><th>@Html.LabelFor(model=>model.CreateTime)</th><td>@Html.TextBoxFor(model=>model.CreateTime)</td></tr></tbody></table>}
Details.cshtml
有看过前面的童鞋,应该很熟悉这一步很机械化的创建了
- 创建数据表
- 更新到EF
- 创建BLL和DAL层
- 创建Model
- 创建爱你Controller
- 创建View
- 注入到容器
- 运行
你看了不累我都觉得累了,我们以后会讲用T4,我们自动生成
预览下效果,你会发现我们的左边的菜单栏可以点出来了。oh yeh...(别忘记注入)
分页和详细都没有问题了。
接下来是是异常的捕获,我们在何时处理异常?我们没有处理的异常该怎么办?我们处理异常时出现异常怎么又怎么办?反正我是要捕获到这异常了...、
我们一般先对数据进行判断避免捕获异常,因为try catch会降低程序的性能,我们一般在业务层捕获异常,处理逻辑容易导致异常
- 处理异常出错,我们将输出文本格式,来记录异常
- 我们将写全局异常捕获来拦截异常
- 你觉得我们的系统后盾还不够强大吗?
创建异常存放数据表SysException
USEDBGO/****** Object: Table [dbo].[SysException] Script Date: 11/20/2013 21:17:44 ******/ SET ANSI_NULLS ON GOSET QUOTED_IDENTIFIER ON GOSET ANSI_PADDING ON GOCREATE TABLE [dbo].[SysException]([Id] [varchar](50) NOT NULL, --GUID[HelpLink] [varchar](500) NULL,--帮助链接[Message] [varchar](500) NULL,--异常信息[Source] [varchar](500) NULL,--来源[StackTrace] [text] NULL,--堆栈[TargetSite] [varchar](500) NULL,--目标页[Data] [varchar](500) NULL,--程序集[CreateTime] [datetime] NULL,--发生时间CONSTRAINT [PK_SysException] PRIMARY KEY CLUSTERED([Id] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY])ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOSET ANSI_PADDING OFF GO
SysExceptionSQL
EF更新模型,创建SysExceptionModel类放在App.Models下的Sys文件夹下
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.ComponentModel.DataAnnotations;namespaceApp.Models.Sys {/// <summary>///异常处理类/// </summary>public classSysExceptionModel{[Display(Name= "ID")]public string Id { get; set; }[Display(Name= "帮助链接")]public string HelpLink { get; set; }[Display(Name= "错误信息")]public string Message { get; set; }[Display(Name= "来源")]public string Source { get; set; }[Display(Name= "堆栈")]public string StackTrace { get; set; }[Display(Name= "目标页")]public string TargetSite { get; set; }[Display(Name= "程序集")]public string Data { get; set; }[Display(Name= "发生时间")]public DateTime? CreateTime { get; set; }} }
SysExceptionModel.cs
创建SysException的BLL层和DAL层
usingSystem;usingApp.Models;usingSystem.Linq;namespaceApp.IDAL {public interfaceISysExceptionRepository{intCreate(SysException entity);IQueryable<SysException>GetList(DBContainer db);SysException GetById(stringid);} }
ISysExceptionRepository
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingApp.Models;usingApp.IDAL;namespaceApp.DAL {public classSysExceptionRepository:IDisposable, ISysExceptionRepository{/// <summary>///获取集合/// </summary>/// <param name="db">数据库</param>/// <returns>集合</returns>public IQueryable<SysException>GetList(DBContainer db){IQueryable<SysException> list =db.SysException.AsQueryable();returnlist;}/// <summary>///创建一个对象/// </summary>/// <param name="db">数据库</param>/// <param name="entity">实体</param>public intCreate( SysException entity){using (DBContainer db = newDBContainer()){db.SysException.AddObject(entity);returndb.SaveChanges();}}/// <summary>///根据ID获取一个实体/// </summary>/// <param name="id"></param>/// <returns></returns>public SysException GetById(stringid){using (DBContainer db = newDBContainer()){return db.SysException.SingleOrDefault(a => a.Id ==id);}}public voidDispose(){ }} }
SysExceptionRepository
usingSystem;usingSystem.Collections.Generic;usingApp.Common;usingApp.Models;namespaceApp.IBLL {public interfaceISysExceptionBLL{List<SysException> GetList(ref GridPager pager,stringqueryStr);SysException GetById(stringid);} }
ISysExceptionBLL
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingMicrosoft.Practices.Unity;usingApp.IDAL;usingApp.Common;usingApp.Models.Sys;usingApp.Models;usingApp.IBLL;namespaceApp.BLL {public classSysExceptionBLL: ISysExceptionBLL{[Dependency]public ISysExceptionRepository exceptionRepository { get; set; }public List<SysException> GetList(ref GridPager pager, stringqueryStr){DBContainer db= newDBContainer();List<SysException> query = null;IQueryable<SysException> list =exceptionRepository.GetList(db);if (!string.IsNullOrWhiteSpace(queryStr)){list= list.Where(a =>a.Message.Contains(queryStr));pager.totalRows=list.Count();}else{pager.totalRows=list.Count();}if (pager.order == "desc"){query= list.OrderByDescending(c => c.CreateTime).Skip((pager.page - 1) *pager.rows).Take(pager.rows).ToList();}else{query= list.OrderBy(c => c.CreateTime).Skip((pager.page - 1) *pager.rows).Take(pager.rows).ToList();}returnquery;}public SysException GetById(stringid){returnexceptionRepository.GetById(id);}} }
SysExceptionBLL
创建SysException的Controller
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;usingSystem.Reflection;usingSystem.Text;usingApp.Common;usingApp.Models;usingApp.IBLL;usingApp.Models.Sys;usingMicrosoft.Practices.Unity;namespaceApp.Admin.Controllers {public classSysExceptionController : Controller{////GET: /SysException/ [Dependency]public ISysExceptionBLL exceptionBLL { get; set; }publicActionResult Index(){returnView();}public JsonResult GetList(GridPager pager, stringqueryStr){List<SysException> list = exceptionBLL.GetList(refpager, queryStr);var json = new{total=pager.totalRows,rows= (from r inlistselect newSysException(){Id=r.Id,HelpLink=r.HelpLink,Message=r.Message,Source=r.Source,StackTrace=r.StackTrace,TargetSite=r.TargetSite,Data=r.Data,CreateTime=r.CreateTime}).ToArray()};returnJson(json);}#region 详细public ActionResult Details(stringid){SysException entity=exceptionBLL.GetById(id);SysExceptionModel info= newSysExceptionModel(){Id=entity.Id,HelpLink=entity.HelpLink,Message=entity.Message,Source=entity.Source,StackTrace=entity.StackTrace,TargetSite=entity.TargetSite,Data=entity.Data,CreateTime=entity.CreateTime,};returnView(info);}#endregion}}
SysExceptionController
创建SysException的Index视图和Details视图
@using App.Admin; @using App.Common; @using App.Models.Sys;@{ViewBag.Title= "Index";Layout= "~/Views/Shared/_Index_Layout.cshtml";}<script src="~/Scripts/jquery.easyui.plus.js"></script> <div class="mvctool"> <input id="txtQuery" type="text" class="searchText"/> <a id="btnQuery" style="float: left;" class="l-btn l-btn-plain"><span class="l-btn-left"><span class="l-btn-text icon-search" style="padding-left: 20px;">查询</span></span></a><div class="datagrid-btn-separator"></div> <a id="btnDetails" style="float: left;" class="l-btn l-btn-plain"><span class="l-btn-left"><span class="l-btn-text icon-details" style="padding-left: 20px;">详细</span></span></a><div class="datagrid-btn-separator"></div> <a id="btnDelete" style="float: left;" class="l-btn l-btn-plain"><span class="l-btn-left"><span class="l-btn-text icon-remove" style="padding-left: 20px;">删除</span></span></a> </div><table id="List"></table> <div id="Pager"></div> <div id="modalwindow" class="easyui-window" data-options="modal:true,closed:true,minimizable:false,shadow:false"></div>@*Jqgrid*@<script type="text/javascript">$(function () {$('#List').datagrid({url:'/SysException/GetList',width: $(window).width()- 10,methord:'post',height: $(window).height()- 35,fitColumns:true,sortName:'Id',sortOrder:'desc',idField:'Id',pageSize:15,pageList: [15, 20, 30, 40, 50],pagination:true,striped:true, //奇偶行是否区分singleSelect: true,//单选模式 columns: [[{ field:'Id', title: 'ID', width: 40, hidden: true},{ field:'HelpLink', title: '帮助链接', width: 40},{ field:'Message', title: '异常信息', width: 200},{ field:'Source', title: '来源', width: 140},{ field:'StackTrace', title: '堆栈', width: 40, align: 'center'},{ field:'TargetSite', title: '目标页', width: 40, align: 'center'},{ field:'Data', title: '程序集', width: 60, align: 'center'},{ field:'CreateTime', title: '发生时间', width: 65, align: 'center'}]]});});</script>@*operation*@<script type="text/javascript">//ifram 返回 function frameReturnByClose() {$("#modalwindow").window('close');}$(function () {$("#btnDetails").click(function () {var row = $('#List').datagrid('getSelected');if (row != null) {$("#modalwindow").html("<iframe width='100%' height='98%' frameborder='0' src='/SysException/Details?id=" + row.Id + "'></iframe>");$("#modalwindow").window({ title: '详细', width: 700, height: 400, iconCls: 'icon-details' }).window('open');}else { $.messageBox5s('提示', '请选择要操作的行!'); }});$("#btnQuery").click(function () {var queryStr = $("#txtQuery").val();//如果查询条件为空默认查询全部if (queryStr == null) {queryStr= "%";}$('#List').datagrid({ url: '/SysException/GetList?queryStr=' +encodeURI(queryStr) });});});</script>
Index
@model App.Models.Sys.SysExceptionModel @using App.Admin; @using App.Common;@using App.Models.Sys; @{ViewBag.Title= "Details";Layout= "~/Views/Shared/_Index_LayoutEdit.cshtml"; }<script type="text/javascript">$(function () {$("#btnReturn").click(function () {window.parent.frameReturnByClose();});});</script> <div class="mvctool bgb"><a id="btnReturn" style="float: left;" class="l-btn l-btn-plain"><span class="l-btn-left"><span class="l-btn-text icon-return" style="padding-left: 20px;">返回</span></span></a> </div>@using (Html.BeginForm()) {<div id="ErrMesList"><div id="ErrMesListContent">@Html.ValidationSummary(false)</div></div><table class="form_table setinput355"><tbody><tr><th>@Html.LabelFor(model=>model.HelpLink)</th><td>@Html.EditorFor(model=>model.HelpLink)</td></tr><tr><th>@Html.LabelFor(model=>model.Message)</th><td>@Html.TextAreaFor(model=> model.Message, new { @style = "height:100px;width:550px"})</td></tr><tr><th>@Html.LabelFor(model=>model.Source)</th><td>@Html.EditorFor(model=>model.Source)</td></tr><tr><th>@Html.LabelFor(model=>model.StackTrace)</th><td>@Html.TextAreaFor(model=> model.StackTrace, new { @style = "height:100px;width:550px"})</td></tr><tr><th>@Html.LabelFor(model=>model.TargetSite)</th><td>@Html.TextAreaFor(model=> model.TargetSite, new { @style = "height:100px;width:550px"})</td></tr><tr><th>@Html.LabelFor(model=>model.Data)</th><td>@Html.EditorFor(model=>model.Data)</td></tr><tr><th>@Html.LabelFor(model=>model.CreateTime)</th><td>@Html.TextBoxFor(model=>model.CreateTime)</td></tr></tbody></table>}
Details
被忘记注入到容器。预览一下
由于时间关系,把异常和日志的应用放到一下讲吧。
然后我认为无目的的提供源码对园友的帮助是不大的,只能说你拥有一套源码,无论多漂亮都好,你自己不思考不动手,东西永远还是别人做出来的,真正遇到问题,是难解决,或者解决不了的,然而系统,我并没有完完全全把所有代码放出来,但是复杂的逻辑或者重点我都放出来了,正如上面,日志和异常的删除功能我没有放出源代码,就希望大家一起来完善这个强大的系统。
我希望大家如果有时间跟着来做,你肯定会受益匪浅
转载于:https://www.cnblogs.com/ymnets/p/3424976.html
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(11)-系统日志和异常的处理①...相关推荐
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②...
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理② 上一讲我们做了日志与异常的结果显示列表,这一节我们讲要把他应用系统中来. ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(31)-MVC使用RDL报表
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(31)-MVC使用RDL报表 这次我们来演示MVC3怎么显示RDL报表,坑爹的微软把MVC升级到5都木有良 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码]...
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码] 文件上传这东西说到底有时候很痛,原来的asp.net服务器 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(39)-在线人数统计探讨
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(39)-在线人数统计探讨 系列目录 基于web的网站在线统计一直处于不是很精准的状态!基本上没有一种方法可 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析...
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③ 参考文章: (1)构建ASP.NET MVC4+EF5+EasyUI+Unity ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(10)-系统菜单栏[附源码]
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(10)-系统菜单栏[附源码] 原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】...
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-[过滤器+Cache] 原文:构建ASP.NET MVC4+EF5+EasyUI+ ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单...
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单 原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(36)-文章发布系统③-kindeditor使用...
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(36)-文章发布系统③-kindeditor使用 原文:构建ASP.NET MVC4+EF5+EasyUI+Un ...
最新文章
- WPF捕获全局未处理异常
- seaborn系列 (14) | 条形图barplot()
- 【视频基础】封装格式和编码格式
- codelite13 wxWidgets3 macos开发环境配置
- Spring Boot和Apache Camel
- 工作138:git使用
- 【Java】一例贯通Java基础语法
- 【转载】C++知识库内容精选 尽览所有核心技术点
- Zabbix 如何动态执行监控采集脚本
- JAVA 的StringBuffer类
- document.execCommand
- isdigit( )函数调用——python小练
- mysql mpm_mysql监控工具:zabbix+MPM(Performance Monitor for MySQL)
- QT 对话框不在任务栏显示
- Unity使用VS2019打开代码出现不兼容的解决方法
- 无法打开FTP在 windows资源管理器中打开FTP站点解决方法
- 吴恩达机器学习笔记-无监督学习
- 为什么重写equals方法,还必须要重写hashcode方法
- PMP|一文带你正确认识产品经理和项目经理的区别
- 【王道笔记-操作系统】第四章 文件管理
热门文章
- python队列实现_Python 数据结构之队列的实现
- arcgis合并tif影像_ARCGIS多种影像裁剪
- 中国人工智能论文首超美国,背后的秘密竟然是……
- 递归算法1加到100_「算法」北京大学算法基础—递归(1)
- thzthz.net forum.php,xthz画质修改器
- java word2007_Java解析word2007、Excel2003和Excel2007
- ddmmyy日期格式是多少_如何在Excel 2013/2016/2019中将mmddyyyy文本转换为普通日期格式...
- 《MFC游戏开发》笔记五 定时器和简单动画
- python中bd是什么属性_python数据类型及其特有方法
- 硬盘格式化了的数据找到方案