系列目录

系统需要越来越自动化,我们需要引入日志记录和异常捕获
管理员的操作记录需要被记录,看出哪些模块是频繁操作,分析哪些是不必要的功能,哪些是需要被优化的。
系统的异常需要被捕获,而不是将系统出错显示出来给用户就不了了知。我们需要异常日志不断改进系统。
我们老说用户,我们还没有用户权限的表,所以我们在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

有看过前面的童鞋,应该很熟悉这一步很机械化的创建了

  1. 创建数据表
  2. 更新到EF
  3. 创建BLL和DAL层
  4. 创建Model
  5. 创建爱你Controller
  6. 创建View
  7. 注入到容器
  8. 运行

你看了不累我都觉得累了,我们以后会讲用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)-系统日志和异常的处理①...相关推荐

  1. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②...

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理② 上一讲我们做了日志与异常的结果显示列表,这一节我们讲要把他应用系统中来. ...

  2. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(31)-MVC使用RDL报表

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(31)-MVC使用RDL报表 这次我们来演示MVC3怎么显示RDL报表,坑爹的微软把MVC升级到5都木有良 ...

  3. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码]...

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码] 文件上传这东西说到底有时候很痛,原来的asp.net服务器 ...

  4. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(39)-在线人数统计探讨

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(39)-在线人数统计探讨 系列目录 基于web的网站在线统计一直处于不是很精准的状态!基本上没有一种方法可 ...

  5. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析...

    构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入 ...

  6. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③

    构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③ 参考文章: (1)构建ASP.NET MVC4+EF5+EasyUI+Unity ...

  7. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(10)-系统菜单栏[附源码]

    构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(10)-系统菜单栏[附源码] 原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后 ...

  8. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】...

    构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-[过滤器+Cache] 原文:构建ASP.NET MVC4+EF5+EasyUI+ ...

  9. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单...

    构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单 原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后 ...

  10. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(36)-文章发布系统③-kindeditor使用...

    构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(36)-文章发布系统③-kindeditor使用 原文:构建ASP.NET MVC4+EF5+EasyUI+Un ...

最新文章

  1. WPF捕获全局未处理异常
  2. seaborn系列 (14) | 条形图barplot()
  3. 【视频基础】封装格式和编码格式
  4. codelite13 wxWidgets3 macos开发环境配置
  5. Spring Boot和Apache Camel
  6. 工作138:git使用
  7. 【Java】一例贯通Java基础语法
  8. 【转载】C++知识库内容精选 尽览所有核心技术点
  9. Zabbix 如何动态执行监控采集脚本
  10. JAVA 的StringBuffer类
  11. document.execCommand
  12. isdigit( )函数调用——python小练
  13. mysql mpm_mysql监控工具:zabbix+MPM(Performance Monitor for MySQL)
  14. QT 对话框不在任务栏显示
  15. Unity使用VS2019打开代码出现不兼容的解决方法
  16. 无法打开FTP在 windows资源管理器中打开FTP站点解决方法
  17. 吴恩达机器学习笔记-无监督学习
  18. 为什么重写equals方法,还必须要重写hashcode方法
  19. PMP|一文带你正确认识产品经理和项目经理的区别
  20. 【王道笔记-操作系统】第四章 文件管理

热门文章

  1. python队列实现_Python 数据结构之队列的实现
  2. arcgis合并tif影像_ARCGIS多种影像裁剪
  3. 中国人工智能论文首超美国,背后的秘密竟然是……
  4. 递归算法1加到100_「算法」北京大学算法基础—递归(1)
  5. thzthz.net forum.php,xthz画质修改器
  6. java word2007_Java解析word2007、Excel2003和Excel2007
  7. ddmmyy日期格式是多少_如何在Excel 2013/2016/2019中将mmddyyyy文本转换为普通日期格式...
  8. 《MFC游戏开发》笔记五 定时器和简单动画
  9. python中bd是什么属性_python数据类型及其特有方法
  10. 硬盘格式化了的数据找到方案