主页UI编写
老规矩,底部有源码。接着奏,接着舞:
<div data-options="region:'north',border:false" style="height: 60px; background-color: #F5F5F5; padding: 10px; font-size: x-large;">
<img src="~/Content/images/Logo.png" /> 后台管理系统
<div style="position: absolute; right: 5px; top: 10px;">
欢迎您:<span style="color: #0082ff; ">@ViewBag.RealName</span> @ViewBag.TimeView @ViewBag.DayDate
</div>
<div style="position: absolute; right: 0px; bottom: 0px; ">
<a href="javascript:void(0);" class="easyui-linkbutton" data-options="plain:true,iconCls:'icon-set1'" onclick="changePwd('');">
修改密码
</a>
<a href="javascript:void(0);" class="easyui-linkbutton" data-options="plain:true,iconCls:'icon-stop'" onclick="loginOut();">
退出系统
</a>
</div>
</div>
<div data-options="region:'west',split:true,title:'功能导航'" style="width: 180px; background-color: white;">
<div id="RightAccordion" class="easyui-accordion">
</div>
</div>
<div data-options="region:'center'">
<div id="tabs" class="easyui-tabs" fit="true" border="false" >
<div id="home" title="我的主页" data-options="iconCls:'icon-house',closable:false" style="padding:10px">
欢迎来到后台管理系统。
</div>
</div>
</div>
效果:
配置日志(Log4net)
博主之前贴过log4net配置demo,这里温故而知新,再贴一次:
1.nueget安装Log4net.dll:
pm命令:Install-Package Newtonsoft.Json -Version 12.0.3
2.配置webconfig:
<log4net>
<!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
<!-- Set root logger level to ERROR and its appenders -->
<root>
<!--root 就相当于默认的日志对象配置,而logger是指定特定的日志配置。他们可以共存-->
<level value="ALL" />
<!--允许所有的日志级别输出-->
<appender-ref ref="SysAppender" />
</root>
<!-- Print only messages of level DEBUG or above in the packages -->
<logger name="WebLogger">
<!--日志类的名字-->
<level value="DEBUG" />
<!--定义记录的日志级别:调试级别-->
</logger>
<!--错误日志附加介质-->
<appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value="log4net/" />
<!--日志输出到exe程序这个相对目录下-->
<param name="AppendToFile" value="true" />
<!--输出的日志不会覆盖以前的信息-->
<param name="RollingStyle" value="Date" />
<!--文件创建的方式,这里是以Date方式创建-->
<param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" />
<!--日志文件名-->
<param name="StaticLogFileName" value="false" />
<!--是否使用静态文件名-->
<!--错误日志布局-->
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%m" />
<!--%m: 直接输出-->
<!--<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />-->
</layout>
</appender>
<!--信息日志附加介质-->
<appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%m" />
<!--输出到控制台-->
<!--<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />-->
</layout>
</appender>
</log4net>
3.添加日志消息类:
/// <summary>
/// 日志消息
/// </summary>
public class LogMessage
{
/// <summary>
/// 操作时间
/// </summary>
public DateTime OperationTime { get; set; }
/// <summary>
/// Url地址
/// </summary>
public string Url { get; set; }
/// <summary>
/// 类名
/// </summary>
public string Class { get; set; }
/// <summary>
/// IP
/// </summary>
public string Ip { get; set; }
/// <summary>
/// 主机
/// </summary>
public string Host { get; set; }
/// <summary>
/// 浏览器
/// </summary>
public string Browser { get; set; }
/// <summary>
/// 操作人
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 异常信息
/// </summary>
public string ExceptionInfo { get; set; }
/// <summary>
/// 异常来源
/// </summary>
public string ExceptionSource { get; set; }
/// <summary>
/// 异常信息备注
/// </summary>
public string ExceptionRemark { get; set; }
}
4.编写 自定义输出日志格式辅助类:
/// <summary>
/// 日志格式器
/// </summary>
public class LogFormat
{
/// <summary>
/// 生成错误
/// </summary>
/// <param name="logMessage">对象</param>
/// <returns></returns>
public string ErrorFormat(LogMessage logMessage)
{
StringBuilder strInfo = new StringBuilder();
strInfo.Append("1. 错误: >> 操作时间: " + logMessage.OperationTime + " 操作人: " + logMessage.UserName + " \r\n");
strInfo.Append("2. 地址: " + logMessage.Url + " \r\n");
strInfo.Append("3. 类名: " + logMessage.Class + " \r\n");
strInfo.Append("4. Ip : " + logMessage.Ip + " 主机: " + logMessage.Host + " 浏览器: " + logMessage.Browser + " \r\n");
strInfo.Append("5. 内容: " + logMessage.Content + "\r\n");
strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
return strInfo.ToString();
}
}
5.Global.asax注册log4net:
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(Server.MapPath("~/Web.config")));
6.编写过滤器:
public class HandlerErrorAttribute : HandleErrorAttribute
{
/// <summary>
/// 控制器方法中出现异常,会调用该方法捕获异常
/// </summary>
/// <param name="context">提供使用</param>
public override void OnException(ExceptionContext context)
{
WriteLog(context);
base.OnException(context);
context.ExceptionHandled = true;
context.HttpContext.Response.StatusCode = 500;
context.Result = new ContentResult { Content = new Result { type = false, msg = context.Exception.Message }.ToJson() };
}
/// <summary>
/// 写入日志(log4net)
/// </summary>
private void WriteLog(ExceptionContext context)
{
if (context == null)
return;
Exception Error = context.Exception;
LogMessage logMessage = new LogMessage();
logMessage.OperationTime = DateTime.Now;
logMessage.Url = HttpContext.Current.Request.RawUrl;
logMessage.Class = context.Controller.ToString();
logMessage.Ip = Net.Ip;
logMessage.Host = Net.Host;
logMessage.Browser = Net.Browser;
string s_accountId = AES.DecryptStr(CookiesHelper.GetCookieValue("UserID"));
int i_accountId = 0;
//判断是否有cookie
if (int.TryParse(s_accountId, out i_accountId))
{
EasyManageEntity.UserEntity m_account = new EasyManageBLL.UserBLL().GetUserById(i_accountId.ToString());
if (m_account != null)
{
logMessage.UserName = m_account.AccountName + "(" + m_account.RealName + ")";
}
else
{
CookiesHelper.AddCookie("UserID", System.DateTime.Now.AddDays(-1));
}
}
else
{
logMessage.UserName = "Error";
}
if (Error.InnerException == null)
{
logMessage.ExceptionInfo = Error.Message;
}
else
{
logMessage.ExceptionInfo = Error.InnerException.Message;
}
string strMessage = new LogFormat().ExceptionFormat(logMessage);
Log4NetHelp.Error(strMessage);
}
}
在FilterConfig中注册过滤器以后,控制器方法出现问题即可会生成日志文件:
大功告成,之前编写的登录验证过滤器有点问题,后续会修正。
源代码 提取码9khw