zoukankan      html  css  js  c++  java
  • 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.2) 登录功能的实现,接口注入、log4net的使用

    索引

    【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 目录索引

    简述

    前两天事情比较多,耽误更新了,希望大家多多包涵,今天我们继续做我们的登录功能

    项目准备

    我们用的工具是:VS 2013 + SqlServer 2012 + IIS7.5

    希望大家对ASP.NET MVC有一个初步的理解,理论性的东西我们不做过多解释,有些地方不理解也没关系,会用就行了,用的多了,用的久了,自然就理解了。

    项目开始

    一、Spring容器的配置注入

    前一篇,我们新建了几个Xml配置文件,并且我们创建了用户接口和实现类,今天,首先呢,我们来注入Service,我们之前在Service类库下面新建了个文件夹Config并且添加了两个嵌入资源ComService.xml和Service.xml。

    我们之前讲过,Com呢表示我们一些通用的东西,就像我们的通用类库叫Common,这只是个人的命名习惯,并非MVC要求我们。因为我们创建的用户表是管理员表,所以我把这个配置放到Service.xml里,我们来修改一下Service.xml

    代码:

    1 <?xml version="1.0" encoding="utf-8" ?>
    2 <objects xmlns="http://www.springframework.net">
    3   <description>Spring注入Service,容器指向本层层封装的接口,舍弃Dao层,减少代码量</description>
    4   <!--系统管理begin-->
    5   <!--用户管理-->
    6   <object id="Service.User" type="Service.ServiceImp.UserManage,Service" singleton="false">
    7   </object>
    8   <!--系统管理end-->
    9 </objects>
    View Code

    二、Log4net

    我们在此插入一段,了解一下log4net记录日志,这个后面我们很多地方都要用到。

    log4net是一个功能著名的开源日志记录组件。利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中。并且我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。大部分的日志记录都是记录到文件,我们主要记录到数据库,这比较有利于我们的管理员查看日志事件。

    1、安装log4net

    安装方式一:http://logging.apache.org/log4net/

    安装方式二(推荐):通过NuGet安装log4net  命令:Install-Package log4net

    2、在项目的程序集信息描述文件中,设置Log4net的可记录属性

    [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

    3、在程序根目录添加log4net的配置文件 log4net.config

    我把配置代码贴给大家:

      1 <?xml version="1.0" encoding="utf-8"?>
      2 <configuration>
      3   <configSections>
      4     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
      5   </configSections>
      6   <log4net>
      7     <root>
      8       <level value="ALL"/>
      9     </root>
     10     <logger name="dblog" additivity="false">
     11       <level value="ALL"/>
     12       <appender-ref ref="SqlServerAppender" />
     13     </logger>
     14     <!--Oracle数据库-->
     15     <appender name="OracleAppender" type="log4net.Appender.AdoNetAppender">
     16       <!-- Oracle数据源-->
     17       <connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
     18       <!-- Oracle连接字符串-->
     19       <connectionString value="DATA SOURCE=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.206)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)));PASSWORD=watdb;PERSIST SECURITY INFO=True;USER ID=watdb;"/>
     20       <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,Message,Exception,ClientUser,ClientIP,RequestUrl,Action)VALUES(:Dates,:Levels,:Logger,:Message,:Exception,:ClientUser,:ClientIP,:RequestUrl,:Action)"/>
     21       <!--  
     22              设置缓存区大小  
     23              1表明有一条日志就要写入  
     24              如果10就表示日志到达10条时一起写入  
     25              -->
     26       <bufferSize value="0"/>
     27       <parameter>
     28         <parameterName value=":Dates" />
     29         <dbType value="DateTime" />
     30         <layout type="log4net.Layout.RawTimeStampLayout"/>
     31       </parameter>
     32       <parameter>
     33         <parameterName value=":Levels" />
     34         <dbType value="String" />
     35         <size value="50" />
     36         <layout type="log4net.Layout.PatternLayout">
     37           <conversionPattern value="%level" />
     38         </layout>
     39       </parameter>
     40       <parameter>
     41         <parameterName value=":Logger" />
     42         <dbType value="String" />
     43         <size value="200" />
     44         <layout type="log4net.Layout.PatternLayout">
     45           <conversionPattern value="%logger" />
     46         </layout>
     47       </parameter>
     48       <parameter>
     49         <parameterName value=":Message" />
     50         <dbType value="String" />
     51         <size value="4000" />
     52         <layout type="log4net.Layout.PatternLayout">
     53           <conversionPattern value="%message" />
     54         </layout>
     55       </parameter>
     56       <parameter>
     57         <parameterName value=":Exception" />
     58         <dbType value="String" />
     59         <size value="4000" />
     60         <layout type="log4net.Layout.PatternLayout">
     61           <conversionPattern value="%exception" />
     62         </layout>
     63       </parameter>
     64       <!--DIY-->
     65       <parameter>
     66         <parameterName value=":ClientUser" />
     67         <dbType value="String" />
     68         <size value="100" />
     69         <layout type="log4net.Layout.PatternLayout">
     70           <conversionPattern value="%property{ClientUser}" />
     71         </layout>
     72       </parameter>
     73       <parameter>
     74         <parameterName value=":ClientIP" />
     75         <dbType value="String" />
     76         <size value="20" />
     77         <layout type="log4net.Layout.PatternLayout">
     78           <conversionPattern value="%property{ClientIP}" />
     79         </layout>
     80       </parameter>
     81       <parameter>
     82         <parameterName value=":RequestUrl" />
     83         <dbType value="String" />
     84         <size value="500" />
     85         <layout type="log4net.Layout.PatternLayout">
     86           <conversionPattern value="%property{RequestUrl}" />
     87         </layout>
     88       </parameter>
     89       <parameter>
     90         <parameterName value=":Action" />
     91         <dbType value="String" />
     92         <size value="20" />
     93         <layout type="log4net.Layout.PatternLayout">
     94           <conversionPattern value="%property{Action}" />
     95         </layout>
     96       </parameter>
     97     </appender>
     98     <!--Sqlite数据库-->
     99     <appender name="SqliteAppender" type="log4net.Appender.AdoNetAppender">
    100       <bufferSize value="0" />
    101       <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.98.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    102       <connectionString value="Data Source=|DataDirectory|test.db;Version=3;" />
    103       <commandText value="INSERT INTO Log (Date, Level, Logger, ClientUser,ClientIP, RequestUrl,Action, Message, Exception) VALUES (@Date, @Level, @Logger,@ClientUser,@ClientIP, @RequestUrl,@Action, @Message, @Exception)" />
    104       <parameter>
    105         <parameterName value="@Date" />
    106         <dbType value="DateTime" />
    107         <layout type="log4net.Layout.RawTimeStampLayout" />
    108       </parameter>
    109       <parameter>
    110         <parameterName value="@Level" />
    111         <dbType value="String" />
    112         <layout type="log4net.Layout.PatternLayout">
    113           <conversionPattern value="%level" />
    114         </layout>
    115       </parameter>
    116       <parameter>
    117         <parameterName value="@Logger" />
    118         <dbType value="String" />
    119         <layout type="log4net.Layout.PatternLayout">
    120           <conversionPattern value="%logger" />
    121         </layout>
    122       </parameter>
    123       <parameter>
    124         <parameterName value="@ClientUser" />
    125         <dbType value="String" />
    126         <layout type="log4net.Layout.PatternLayout">
    127           <conversionPattern value="%property{ClientUser}" />
    128         </layout>
    129       </parameter>
    130       <parameter>
    131         <parameterName value="@ClientIP" />
    132         <dbType value="String" />
    133         <layout type="log4net.Layout.PatternLayout">
    134           <conversionPattern value="%property{ClientIP}" />
    135         </layout>
    136       </parameter>
    137       <parameter>
    138         <parameterName value="@RequestUrl" />
    139         <dbType value="String" />
    140         <layout type="log4net.Layout.PatternLayout">
    141           <conversionPattern value="%property{RequestUrl}" />
    142         </layout>
    143       </parameter>
    144       <parameter>
    145         <parameterName value="@Action" />
    146         <dbType value="String" />
    147         <layout type="log4net.Layout.PatternLayout">
    148           <conversionPattern value="%property{Action}" />
    149         </layout>
    150       </parameter>
    151       <parameter>
    152         <parameterName value="@Message" />
    153         <dbType value="String" />
    154         <layout type="log4net.Layout.PatternLayout">
    155           <conversionPattern value="%message" />
    156         </layout>
    157       </parameter>
    158       <parameter>
    159         <parameterName value="@Exception" />
    160         <dbType value="String" />
    161         <layout type="log4net.Layout.PatternLayout">
    162           <conversionPattern value="%exception" />
    163         </layout>
    164       </parameter>
    165     </appender>
    166     <!--SqlServer数据库-->
    167     <appender name="SqlServerAppender" type="log4net.Appender.AdoNetAppender">
    168       <!-- SqlServer数据源-->
    169       <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    170       <!-- SqlServer连接字符串-->
    171       <connectionString value="data source=.;initial catalog=wkmvc_db;integrated security=false;persist security info=True;User ID=sa_wkmvc;Password=123456" />
    172       <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,ClientUser,ClientIP,RequestUrl,Action,Message,Exception)VALUES(@Dates,@Levels,@Logger,@ClientUser,@ClientIP,@RequestUrl,@Action,@Message,@Exception)"/>
    173       <!--  
    174              设置缓存区大小  
    175              1表明有一条日志就要写入  
    176              如果10就表示日志到达10条时一起写入  
    177              -->
    178       <bufferSize value="0"/>
    179       <parameter>
    180         <parameterName value="@Dates" />
    181         <dbType value="DateTime" />
    182         <layout type="log4net.Layout.RawTimeStampLayout" />
    183       </parameter>
    184       <parameter>
    185         <parameterName value="@Levels" />
    186         <dbType value="String" />
    187         <size value="50" />
    188         <layout type="log4net.Layout.PatternLayout">
    189           <conversionPattern value="%level" />
    190         </layout>
    191       </parameter>
    192       <parameter>
    193         <parameterName value="@Logger" />
    194         <dbType value="String" />
    195         <size value="255" />
    196         <layout type="log4net.Layout.PatternLayout">
    197           <conversionPattern value="%logger" />
    198         </layout>
    199       </parameter>
    200       <parameter>
    201         <parameterName value="@Message" />
    202         <dbType value="String" />
    203         <size value="4000" />
    204         <layout type="log4net.Layout.PatternLayout">
    205           <conversionPattern value="%message" />
    206         </layout>
    207       </parameter>
    208       <parameter>
    209         <parameterName value="@Exception" />
    210         <dbType value="String" />
    211         <size value="2000" />
    212         <layout type="log4net.Layout.ExceptionLayout" />
    213       </parameter>
    214       <!--DIY-->
    215       <parameter>
    216         <parameterName value="@ClientUser" />
    217         <dbType value="String" />
    218         <size value="100" />
    219         <layout type="log4net.Layout.PatternLayout" >
    220           <param name="ConversionPattern" value="%property{ClientUser}"/>
    221         </layout>
    222       </parameter>
    223       <parameter>
    224         <parameterName value="@ClientIP" />
    225         <dbType value="String" />
    226         <size value="100" />
    227         <layout type="log4net.Layout.PatternLayout" >
    228           <param name="ConversionPattern" value="%property{ClientIP}"/>
    229         </layout>
    230       </parameter>
    231       <parameter>
    232         <parameterName value="@RequestUrl" />
    233         <dbType value="String" />
    234         <size value="500" />
    235         <layout type="log4net.Layout.PatternLayout" >
    236           <param name="ConversionPattern" value="%property{RequestUrl}"/>
    237         </layout>
    238       </parameter>
    239       <parameter>
    240         <parameterName value="@Action" />
    241         <dbType value="String" />
    242         <size value="100" />
    243         <layout type="log4net.Layout.PatternLayout" >
    244           <param name="ConversionPattern" value="%property{Action}"/>
    245         </layout>
    246       </parameter>
    247     </appender>
    248     <!--记录到文件-->
    249     <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
    250       <param name="File" value="datalog" />
    251       <param name="AppendToFile" value="true" />
    252       <param name="RollingStyle" value="Date" />
    253       <param name="DatePattern" value="\yyyy\MM-dd-HH\&quot;SQL_&quot;yyyy-MM-dd&quot;.log&quot;" />
    254       <param name="StaticLogFileName" value="false" />
    255       <layout type="log4net.Layout.PatternLayout,log4net">
    256         <param name="ConversionPattern" value="%d - %m%n" />
    257         <param name="Header" value="&#xD;&#xA;----------------------begin--------------------------&#xD;&#xA;" />
    258         <param name="Footer" value="&#xD;&#xA;----------------------end--------------------------&#xD;&#xA;" />
    259       </layout>
    260     </appender>
    261   </log4net>
    262   <!--必须指定框架,否则不执行,新版本默认支持4.0,可修改源文件,项目属性设定为.NET FRAMEWORK2.0后,打开重新编译,去掉其中的.NET 4.0编译导致错误环节,如此只能使用在.net 2.0框架-->
    263   <startup>
    264     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    265   </startup>
    266 </configuration>
    267 <!--
    268    调用实例
    269    log4net.ILog log = log4net.LogManager.GetLogger("Filelog");
    270    log.Info(Message);
    271    
    272     %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
    273 
    274     %n(new line):换行
    275 
    276     %d(datetime):输出当前语句运行的时刻
    277 
    278     %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
    279 
    280     %t(thread id):当前语句所在的线程ID
    281 
    282     %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
    283 
    284     %c(class):当前日志对象的名称
    285     
    286     %L:输出语句所在的行号
    287 
    288     %F:输出语句所在的文件名
    289 
    290     %-数字:表示该项的最小长度,如果不够,则用空格填充
    291 
    292     例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出:
    293 
    294     176 [main] INFO  org.foo.Bar - Located nearest gas station.
    295     -->
    View Code

    4、上面的代码中,我们配置日志记录到了数据库的日志表 SYS_LOG

    我们在数据库中新建这个日志表:

    数据库名:wkmvc_db
    表名:SYS_LOG
     
    序号 列名 数据类型 长度 小数位 标识 主键 外键 允许空 默认值 说明
    1 ID int 4 0     主键ID
    2 DATES datetime 8 3         创建时间
    3 LEVELS nvarchar 20 0         日志等级
    4 LOGGER nvarchar 200 0         日志调用
    5 CLIENTUSER nvarchar 100 0         使用用户
    6 CLIENTIP nvarchar 20 0         访问IP
    7 REQUESTURL nvarchar 500 0         访问来源
    8 ACTION nvarchar 20 0         操作动作
    9 MESSAGE nvarchar 4000 0         消息
    10 EXCEPTION nvarchar 4000 0         异常消息

    T-SQL:

     1 USE [wkmvc_db]
     2 GO
     3 /****** Object:  Table [dbo].[SYS_LOG]    Script Date: 2016/5/16 9:06:19 ******/
     4 SET ANSI_NULLS ON
     5 GO
     6 SET QUOTED_IDENTIFIER ON
     7 GO
     8 CREATE TABLE [dbo].[SYS_LOG](
     9     [ID] [int] IDENTITY(1,1) NOT NULL,
    10     [DATES] [datetime] NULL,
    11     [LEVELS] [nvarchar](20) NULL,
    12     [LOGGER] [nvarchar](200) NULL,
    13     [CLIENTUSER] [nvarchar](100) NULL,
    14     [CLIENTIP] [nvarchar](20) NULL,
    15     [REQUESTURL] [nvarchar](500) NULL,
    16     [ACTION] [nvarchar](20) NULL,
    17     [MESSAGE] [nvarchar](4000) NULL,
    18     [EXCEPTION] [nvarchar](4000) NULL,
    19  CONSTRAINT [PK_SYS_LOG] PRIMARY KEY CLUSTERED 
    20 (
    21     [ID] ASC
    22 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    23 ) ON [PRIMARY]
    24 
    25 GO
    26 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'主键ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'ID'
    27 GO
    28 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'DATES'
    29 GO
    30 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志等级' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'LEVELS'
    31 GO
    32 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志调用' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'LOGGER'
    33 GO
    34 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'使用用户' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'CLIENTUSER'
    35 GO
    36 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'访问IP' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'CLIENTIP'
    37 GO
    38 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'访问来源' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'REQUESTURL'
    39 GO
    40 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'操作动作' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'ACTION'
    41 GO
    42 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'消息' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'MESSAGE'
    43 GO
    44 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'异常消息' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'EXCEPTION'
    45 GO
    View Code

    三、新建用户登录控制器 AccountController

    在/Areas/SysManage/Controllers 下新建AccountController控制器

    个人习惯,我们分块控制器的代码,便于收缩、管理 用#region #endregion,#region是c#预处理器指令,是一个分块预处理命令,它主要用于编辑代码的分段,在编译时会被自动删除。

    先贴一下这个代码:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 using System.Web.Mvc;
     6 
     7 namespace WebPage.Areas.SysManage.Controllers
     8 {
     9     public class AccountController : Controller
    10     {
    11         #region 声明容器
    12         #endregion
    13 
    14         #region 基本视图
    15         public ActionResult Index()
    16         {
    17             return View();
    18         }
    19         #endregion
    20 
    21         #region 帮助方法
    22         #endregion
    23     }
    24 }
    View Code

    我们上一篇,在Config文件夹下面建立了三个xml文件,并且在Web.Config里面配置了指向,我们在Controllers.xml里配置一下接口的指向

    代码:

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <objects xmlns="http://www.springframework.net">
     3   <description>Spring注入控制器,容器指向Service层封装的接口</description>
     4   <!--系统管理 Begin-->
     5   <!--登录控制器-->
     6   <object type="WebPage.Areas.SysManage.Controllers.AccountController,WebPage" singleton="false">
     7     <property name="UserManage" ref="Service.User"/>
     8   </object>
     9   <!--系统管理 end-->
    10 </objects>
    View Code

    OK,我们再回到我们的AccountController

    我们添加一下解决方案的引用

    我们在声明容器里声明一下UserManage

    我们在基本视图里,为Index添加一个视图:(这里面没有验证,大家不要急,我们后面慢慢修改这个页面,我们先实现基本功能)

     1 @model Domain.SYS_USER
     2 <!DOCTYPE html>
     3 <html>
     4 <head>
     5     <meta charset="utf-8">
     6     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
     7     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     8     <title>后台登录</title>
     9 </head>
    10 <body>
    11     <div >
    12         <div>
    13             @using (Ajax.BeginForm("login", null, new AjaxOptions()
    14                         {
    15                             HttpMethod = "Post",
    16                             OnBegin = "dig.Loading",
    17                             OnSuccess = "dig.Success",
    18                             OnFailure = "dig.Failure",
    19                             OnComplete = "dig.Complete"
    20                         }, new { @class = "form-signin" }))
    21             {
    22                 @Html.AntiForgeryToken()
    23                 @Html.TextBoxFor(model => model.ACCOUNT,
    24                                                         new
    25                                                         {
    26                                                             @class = "form-control",
    27                                                             @placeholder = "登录用户名",
    28                                                             @maxlength = 15,
    29                                                             @required = "required"
    30                                                         })
    31                 @Html.PasswordFor(model => model.PASSWORD,
    32                                                         new
    33                                                         {
    34                                                             @class = "form-control",
    35                                                             @placeholder = "登录密码",
    36                                                             @maxlength = 12,
    37                                                             @required = "required"
    38                                                         })                     
    39                 <button type="submit" id="login-button"></button>
    40             }
    41            
    42         </div>
    43      
    44     </div>
    45 
    46    
    47     <script type="text/javascript" src="/Content/js/jquery.min.js"></script>
    48     <script type="text/javascript" src="/Content/js/jquery.unobtrusive-ajax.min.js"></script>
    49     <script type="text/javascript">       
    50         var dig = {
    51             Loading: function () {
    52                 $("#login-button").attr("disabled", "disabled");;
    53             },
    54             Success: function (result) {
    55                 if (result.Status == "y") {
    56                     alert(result.Msg)
    57                 } else {
    58                    alert(result.Msg);
    59                     dig.Complete();
    60                 }
    61             },
    62             Failure: function () {
    63                 alert(result.Msg);
    64                 dig.Complete();
    65             },
    66             Complete: function () {
    67                 $("#login-button").attr("disabled", false);
    68             },
    69             ErrorMsg: function (msg) {
    70                 alert(msg);
    71             }
    72         };
    73     </script>
    74 
    75 </body>
    76 </html>
    View Code

     我们新建一个登陆验证的方法 Login

     1         /// <summary>
     2         /// 登录验证
     3         /// add yuangang by 2016-05-16
     4         /// </summary>
     5         [ValidateAntiForgeryToken]
     6         public ActionResult Login(Domain.SYS_USER item)
     7         {
     8             var json = new JsonHelper() { Msg = "登录成功", Status = "n" };
     9             try
    10             {
    11                 //调用登录验证接口 返回用户实体类
    12                 var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim());
    13                 if (users != null)
    14                 {
    15                     //是否锁定
    16                     if (users.ISCANLOGIN == 1)
    17                     {
    18                         json.Msg = "用户已锁定,禁止登录,请联系管理员进行解锁";
    19                         return Json(json);
    20                     }
    21                     json.Status = "y";
    22 
    23                 }
    24                 else
    25                 {
    26                     json.Msg = "用户名或密码不正确";
    27                 }
    28 
    29             }
    30             catch (Exception e)
    31             {
    32                 json.Msg = e.Message;
    33             }
    34             return Json(json, JsonRequestBehavior.AllowGet);
    35         }
    View Code

    重新生成一下解决方案,我们来测试一下

    咦~~报错了~~~(不要担心报错,报错是我们DeBug并且梳理流程的好机会哈~)

    我们先来研究一下这个错误:

    捕捉到 System.NullReferenceException
    HResult=-2147467261
    Message=未将对象引用设置到对象的实例。
    Source=WebPage
    StackTrace:
    在 WebPage.Areas.SysManage.Controllers.AccountController.Login(SYS_USER item) 位置 e:Visual Studio 2013BlogDemoswkmvcWebPageAreasSysManageControllersAccountController.cs:行号 37

    这是什么错误呢,错误在这一行 var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim()); 这应该是UserManage 未将对象引用设置到对象的实例,我们分析,有可能是我们声明的容器出错了。

    但是,我们的声明和注入貌似没有什么问题啊,那是怎么回事呢,我们看一下 我们Web.Config里的配置

    我们还没有添加Spring.net组件啊~~~

    添加一下,NetGet包 

    还有Common.Logging

    我们的Spring有几个dll 分别是Spring.Core、Common.Logging、Spring.Web.Mvc(我们这里用的是Spring.Web.Mvc5)

    检查一下,这几个dll是否引用了

    现在运行一下,是不是还是报错呢~~还是为将对象设置引用到实例~~怎么回事呢?好像忘了些什么,仅仅只是配置配好了,spring.net的容器还没有接管这一切……在这我们只需要让Global.asax文件的MvcApplication类继承于Spring.Web.Mvc.SpringMvcApplication类即可,根据需要override相关方就可以了

    OK!运行正常~~~~

    可能出现的问题:

    或:

    解决:

    我们添加Microsoft.AspNet.WebApi(如果存在就更新一下)

    或通过NuGet 程序包管理器控制台添加:

    Install-Package Microsoft.AspNet.WebApi

    Update-Package Microsoft.AspNet.WebApi -reinstall(存在)

    原因:我们新建的是一个空的MVC项目,缺少引用

     

    四、使用Log4net

    我们添加一下log4net的类库 【C#公共帮助类】 Log4net 帮助类

    我们在AccountController控制器中声明一下

    我们修改一下 登录验证方法Login

    代码:

     1 using Common;
     2 using Service.IService;
     3 using System;
     4 using System.Collections.Generic;
     5 using System.Linq;
     6 using System.Web;
     7 using System.Web.Mvc;
     8 
     9 namespace WebPage.Areas.SysManage.Controllers
    10 {
    11     public class AccountController : Controller
    12     {
    13         #region 声明容器
    14         /// <summary>
    15         /// 用户管理
    16         /// add yuangang by 2016-05-16
    17         /// </summary>
    18         IUserManage UserManage { get; set; }
    19         /// <summary>
    20         /// 日志记录
    21         /// </summary>
    22         log4net.Ext.IExtLog log = log4net.Ext.ExtLogManager.GetLogger("dblog");
    23         #endregion
    24 
    25         #region 基本视图
    26         public ActionResult Index()
    27         {
    28             return View();
    29         }
    30         /// <summary>
    31         /// 登录验证
    32         /// add yuangang by 2016-05-16
    33         /// </summary>
    34         [ValidateAntiForgeryToken]
    35         public ActionResult Login(Domain.SYS_USER item)
    36         {
    37             var json = new JsonHelper() { Msg = "登录成功", Status = "n" };
    38             try
    39             {
    40                 //调用登录验证接口 返回用户实体类
    41                 var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim());
    42                 if (users != null)
    43                 {
    44                     //是否锁定
    45                     if (users.ISCANLOGIN == 1)
    46                     {
    47                         json.Msg = "用户已锁定,禁止登录,请联系管理员进行解锁";
    48                         log.Warn(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
    49                         return Json(json);
    50                     }
    51                     json.Status = "y";
    52                     log.Info(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
    53 
    54                 }
    55                 else
    56                 {
    57                     json.Msg = "用户名或密码不正确";
    58                     log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
    59                 }
    60 
    61             }
    62             catch (Exception e)
    63             {
    64                 json.Msg = e.Message;
    65                 log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);
    66             }
    67             return Json(json, JsonRequestBehavior.AllowGet);
    68         }
    69         #endregion
    70 
    71         #region 帮助方法
    72         #endregion
    73     }
    74 }
    View Code

    今天就先写到这,下一篇,我们继续完善这个登录功能~~~好累~~~

    你们先自己做一下,遇到问题百度也好,留言也好,咱们解决一下。稍后我把这一部分的Demo 提供一下下载。

    原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com

  • 相关阅读:
    u-boot器件驱动模型(Device&Drivers)之uclass (转)
    u-boot下的DM驱动模型 阶梯状 (转)
    u-boot-2018.09 DTS上 I2C节点的解析 (转)
    [uboot] (番外篇)uboot串口&console&stdio设备工作流程 (转)
    [uboot] (番外篇)uboot 驱动模型(转)重要
    u-boot DM初始化流程
    【u-boot】u-boot中initf_dm()函数执行流程(转)
    【u-boot】u-boot对设备树的节点解析(转)
    BeanPostProcessor
    一些压力测试结果(Mysql,Zookeeper,Redis,Mongodb)
  • 原文地址:https://www.cnblogs.com/yuangang/p/5497140.html
Copyright © 2011-2022 走看看