• 从零开始编写自己的C#框架(15)——Web层后端登陆功能


    对于一个后端管理系统,最重要内容之一的就是登陆页了,无论是安全验证、用户在线记录、相关日志记录、单用户或多用户使用帐号控制等,都是在这个页面进行处理的。

      1、在解决方案中创建一个Web项目,并将它设置为启动项

      

      2、添加引用

      

      

      

      3、添加WebManage文件夹与Login.aspx文件

      

      

      4、添加登陆页面HTML代码  

     1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="Solution.Web.Managers.WebManage.Login" %>
     2 
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     4 <html xmlns="http://www.w3.org/1999/xhtml">
     5 <head id="Head1" runat="server">
     6     <title>从零开始编写自己的C#框架——后端管理系统</title>
     7     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     8     <link rel="stylesheet" href="Css/login.css" />
     9     <script type="text/javascript">
    10         function Random(n) { return (Math.floor(Math.random() * n)); };
    11 
    12         function AjaxRnd() { return new Date().getTime() + '' + Random(10000); };
    13 
    14         function ShowKey() {
    15             document.getElementById("img_verifycode").src = "Base/Vcode.ashx?a=" + AjaxRnd();
    16         };
    17     </script>
    18 </head>
    19 <body>
    20     <!--CENTER开始-->
    21     <div class="login-container">
    22         <form id="form1" runat="server">
    23         <div class="login-header">
    24             <h3>
    25                 Login</h3>
    26         </div>
    27         <div id="login-content" class="clearfix">
    28             <div>
    29                 <label>
    30                     用户名</label>
    31                 <div>
    32                     <asp:TextBox runat="server" ID="txtusername" CssClass="input w92" />
    33                 </div>
    34                 <label>
    35                     密码</label>
    36                 <div>
    37                     <asp:TextBox runat="server" ID="txtpass" CssClass="input w92" TextMode="Password" />
    38                 </div>
    39                 <label>
    40                     验证码</label>
    41                 <div>
    42                     <asp:TextBox runat="server" ID="txtcode" CssClass="input w100 fl" />
    43                     <asp:Image ID="img_verifycode" runat="server" onclick="ShowKey();" ToolTip="更换验证码"
    44                         ImageUrl="Base/Vcode.ashx" />
    45                     <div class="fc"></div>
    46                 </div>
    47             </div>
    48             <div>
    49                 <asp:Button ID="BtnLogin" CssClass="btn" runat="server" OnClick="BtnLogin_Click"
    50                     Text="登陆" />
    51             </div>
    52         </div>
    53         </form>
    54     </div>
    55     <!--CENTER结束-->
    56 </body>
    57 </html>
    View Code

      css样式在本文后面的解决方案中有

      浏览一下效果

      

      5、后端管理系统登陆验证流程图

      我们根据下面的流程图来编写登陆页代码

      6、添加在线列表数据表并修改管事员表相关字段

      执行下面SQL语句

      1 /****** Object:  Table [dbo].[Manager]    Script Date: 2014/6/4 22:27:52  ******/
      2 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Manager]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
      3 drop table [dbo].[Manager]
      4 GO
      5 
      6 /****** Object:  Table [dbo].[Manager]    Script Date: 2014/6/4 22:27:52   ******/
      7 CREATE TABLE [dbo].[Manager] (
      8   [Id] [int] IDENTITY (1, 1) NOT NULL,
      9   [LoginName] [nvarchar] (20) NOT NULL,
     10   [LoginPass] [nvarchar] (32) NOT NULL,
     11   [LoginTime] [datetime] NOT NULL,
     12   [LoginIp] [nvarchar] (30) NOT NULL,
     13   [LoginCount] [int] NOT NULL,
     14   [CreateTime] [datetime] NOT NULL,
     15   [UpdateTime] [datetime] NOT NULL,
     16   [IsMultiUser] [tinyint] NOT NULL,
     17   [Branch_Id] [int] NOT NULL,
     18   [Branch_Code] [nvarchar] (20) NOT NULL,
     19   [Branch_Name] [nvarchar] (25) NOT NULL,
     20   [Position_Id] [nvarchar] (100) NOT NULL,
     21   [Position_Name] [nvarchar] (30) NOT NULL,
     22   [IsWork] [tinyint] NOT NULL,
     23   [IsEnable] [tinyint] NOT NULL,
     24   [CName] [nvarchar] (20) NOT NULL,
     25   [EName] [nvarchar] (50) NOT NULL,
     26   [PhotoImg] [nvarchar] (250) NOT NULL,
     27   [Sex] [nvarchar] (4) NOT NULL,
     28   [Birthday] [nvarchar] (20) NOT NULL,
     29   [NativePlace] [nvarchar] (100) NOT NULL,
     30   [NationalName] [nvarchar] (50) NOT NULL,
     31   [Record] [nvarchar] (25) NOT NULL,
     32   [GraduateCollege] [nvarchar] (30) NOT NULL,
     33   [GraduateSpecialty] [nvarchar] (50) NOT NULL,
     34   [Tel] [nvarchar] (30) NOT NULL,
     35   [Mobile] [nvarchar] (30) NOT NULL,
     36   [Email] [nvarchar] (50) NOT NULL,
     37   [Qq] [nvarchar] (30) NOT NULL,
     38   [Msn] [nvarchar] (30) NOT NULL,
     39   [Address] [nvarchar] (100) NOT NULL,
     40   [Content] [ntext] NOT NULL,
     41   [Manager_Id] [int] NOT NULL,
     42   [Manager_CName] [nvarchar] (20) NOT NULL
     43 ) ON [PRIMARY]
     44 GO
     45 
     46 ALTER TABLE [dbo].[Manager] WITH NOCHECK ADD
     47   CONSTRAINT [PK_Manager] PRIMARY KEY  CLUSTERED
     48 (
     49  [Id]
     50 )  ON [PRIMARY]
     51 GO
     52 
     53 ALTER TABLE [dbo].[Manager] ADD
     54   CONSTRAINT [DF_Manager_LoginName] DEFAULT ('') FOR [LoginName],
     55   CONSTRAINT [DF_Manager_LoginPass] DEFAULT ('') FOR [LoginPass],
     56   CONSTRAINT [DF_Manager_LoginTime] DEFAULT (getdate()) FOR [LoginTime],
     57   CONSTRAINT [DF_Manager_LoginIp] DEFAULT ('') FOR [LoginIp],
     58   CONSTRAINT [DF_Manager_LoginCount] DEFAULT (0) FOR [LoginCount],
     59   CONSTRAINT [DF_Manager_CreateTime] DEFAULT (getdate()) FOR [CreateTime],
     60   CONSTRAINT [DF_Manager_UpdateTime] DEFAULT (getdate()) FOR [UpdateTime],
     61   CONSTRAINT [DF_Manager_IsMultiUser] DEFAULT (0) FOR [IsMultiUser],
     62   CONSTRAINT [DF_Manager_Branch_Id] DEFAULT (0) FOR [Branch_Id],
     63   CONSTRAINT [DF_Manager_Branch_Code] DEFAULT ('') FOR [Branch_Code],
     64   CONSTRAINT [DF_Manager_Branch_Name] DEFAULT ('') FOR [Branch_Name],
     65   CONSTRAINT [DF_Manager_Position_Id] DEFAULT ('') FOR [Position_Id],
     66   CONSTRAINT [DF_Manager_Position_Name] DEFAULT ('') FOR [Position_Name],
     67   CONSTRAINT [DF_Manager_IsWork] DEFAULT (0) FOR [IsWork],
     68   CONSTRAINT [DF_Manager_IsEnable] DEFAULT (1) FOR [IsEnable],
     69   CONSTRAINT [DF_Manager_CName] DEFAULT ('') FOR [CName],
     70   CONSTRAINT [DF_Manager_EName] DEFAULT ('') FOR [EName],
     71   CONSTRAINT [DF_Manager_PhotoImg] DEFAULT ('') FOR [PhotoImg],
     72   CONSTRAINT [DF_Manager_Sex] DEFAULT ('') FOR [Sex],
     73   CONSTRAINT [DF_Manager_Birthday] DEFAULT ('') FOR [Birthday],
     74   CONSTRAINT [DF_Manager_NativePlace] DEFAULT ('') FOR [NativePlace],
     75   CONSTRAINT [DF_Manager_NationalName] DEFAULT ('') FOR [NationalName],
     76   CONSTRAINT [DF_Manager_Record] DEFAULT ('') FOR [Record],
     77   CONSTRAINT [DF_Manager_GraduateCollege] DEFAULT ('') FOR [GraduateCollege],
     78   CONSTRAINT [DF_Manager_GraduateSpecialty] DEFAULT ('') FOR [GraduateSpecialty],
     79   CONSTRAINT [DF_Manager_Tel] DEFAULT ('') FOR [Tel],
     80   CONSTRAINT [DF_Manager_Mobile] DEFAULT ('') FOR [Mobile],
     81   CONSTRAINT [DF_Manager_Email] DEFAULT ('') FOR [Email],
     82   CONSTRAINT [DF_Manager_Qq] DEFAULT ('') FOR [Qq],
     83   CONSTRAINT [DF_Manager_Msn] DEFAULT ('') FOR [Msn],
     84   CONSTRAINT [DF_Manager_Address] DEFAULT ('') FOR [Address],
     85   CONSTRAINT [DF_Manager_Content] DEFAULT ('') FOR [Content],
     86   CONSTRAINT [DF_Manager_Manager_Id] DEFAULT (0) FOR [Manager_Id],
     87   CONSTRAINT [DF_Manager_Manager_CName] DEFAULT ('') FOR [Manager_CName] 
     88 GO
     89 
     90 CREATE  INDEX [IX_Manager__LoginName] ON [dbo].[Manager]([LoginName]) ON [PRIMARY]
     91 GO
     92 
     93 CREATE  INDEX [IX_Manager__LoginTime] ON [dbo].[Manager]([LoginTime]) ON [PRIMARY]
     94 GO
     95 
     96 CREATE  INDEX [IX_Manager__CreateTime] ON [dbo].[Manager]([CreateTime]) ON [PRIMARY]
     97 GO
     98 
     99 CREATE  INDEX [IX_Manager__UpdateTime] ON [dbo].[Manager]([UpdateTime]) ON [PRIMARY]
    100 GO
    101 
    102 CREATE  INDEX [IX_Manager__Branch_Id] ON [dbo].[Manager]([Branch_Id]) ON [PRIMARY]
    103 GO
    104 
    105 CREATE  INDEX [IX_Manager__Branch_Code] ON [dbo].[Manager]([Branch_Code]) ON [PRIMARY]
    106 GO
    107 
    108 CREATE  INDEX [IX_Manager__Position_Id] ON [dbo].[Manager]([Position_Id]) ON [PRIMARY]
    109 GO
    110 
    111 CREATE  INDEX [IX_Manager__IsWork] ON [dbo].[Manager]([IsWork]) ON [PRIMARY]
    112 GO
    113 
    114 CREATE  INDEX [IX_Manager__IsEnable] ON [dbo].[Manager]([IsEnable]) ON [PRIMARY]
    115 GO
    116 
    117 CREATE  INDEX [IX_Manager__CName] ON [dbo].[Manager]([CName]) ON [PRIMARY]
    118 GO
    119 
    120 CREATE  INDEX [IX_Manager__EName] ON [dbo].[Manager]([EName]) ON [PRIMARY]
    121 GO
    122 
    123 CREATE  INDEX [IX_Manager__Sex] ON [dbo].[Manager]([Sex]) ON [PRIMARY]
    124 GO
    125 
    126 exec sp_addextendedproperty N'MS_Description', N'主键Id', N'user', N'dbo', N'table', N'Manager', N'column', N'Id'
    127 GO
    128 
    129 exec sp_addextendedproperty N'MS_Description', N'登陆账号', N'user', N'dbo', N'table', N'Manager', N'column', N'LoginName'
    130 GO
    131 
    132 exec sp_addextendedproperty N'MS_Description', N'登陆密码', N'user', N'dbo', N'table', N'Manager', N'column', N'LoginPass'
    133 GO
    134 
    135 exec sp_addextendedproperty N'MS_Description', N'最后登陆时间', N'user', N'dbo', N'table', N'Manager', N'column', N'LoginTime'
    136 GO
    137 
    138 exec sp_addextendedproperty N'MS_Description', N'最后登陆IP', N'user', N'dbo', N'table', N'Manager', N'column', N'LoginIp'
    139 GO
    140 
    141 exec sp_addextendedproperty N'MS_Description', N'登陆次数', N'user', N'dbo', N'table', N'Manager', N'column', N'LoginCount'
    142 GO
    143 
    144 exec sp_addextendedproperty N'MS_Description', N'注册时间', N'user', N'dbo', N'table', N'Manager', N'column', N'CreateTime'
    145 GO
    146 
    147 exec sp_addextendedproperty N'MS_Description', N'资料最后修改日期', N'user', N'dbo', N'table', N'Manager', N'column', N'UpdateTime'
    148 GO
    149 
    150 exec sp_addextendedproperty N'MS_Description', N'是否允许同一帐号多人使用,0=只能单个在线,1=可以多人同时在线', N'user', N'dbo', N'table', N'Manager', N'column', N'IsMultiUser'
    151 GO
    152 
    153 exec sp_addextendedproperty N'MS_Description', N'所属部门ID', N'user', N'dbo', N'table', N'Manager', N'column', N'Branch_Id'
    154 GO
    155 
    156 exec sp_addextendedproperty N'MS_Description', N'所属部门编号,用户只能正式归属于一个部门', N'user', N'dbo', N'table', N'Manager', N'column', N'Branch_Code'
    157 GO
    158 
    159 exec sp_addextendedproperty N'MS_Description', N'部门名称', N'user', N'dbo', N'table', N'Manager', N'column', N'Branch_Name'
    160 GO
    161 
    162 exec sp_addextendedproperty N'MS_Description', N'用户职位ID', N'user', N'dbo', N'table', N'Manager', N'column', N'Position_Id'
    163 GO
    164 
    165 exec sp_addextendedproperty N'MS_Description', N'职位名称', N'user', N'dbo', N'table', N'Manager', N'column', N'Position_Name'
    166 GO
    167 
    168 exec sp_addextendedproperty N'MS_Description', N'0=离职,1=就职', N'user', N'dbo', N'table', N'Manager', N'column', N'IsWork'
    169 GO
    170 
    171 exec sp_addextendedproperty N'MS_Description', N'账号是否启用,1=true(启用),0=false(禁用)', N'user', N'dbo', N'table', N'Manager', N'column', N'IsEnable'
    172 GO
    173 
    174 exec sp_addextendedproperty N'MS_Description', N'用户中文名称', N'user', N'dbo', N'table', N'Manager', N'column', N'CName'
    175 GO
    176 
    177 exec sp_addextendedproperty N'MS_Description', N'用户英文名称', N'user', N'dbo', N'table', N'Manager', N'column', N'EName'
    178 GO
    179 
    180 exec sp_addextendedproperty N'MS_Description', N'头像图片路径', N'user', N'dbo', N'table', N'Manager', N'column', N'PhotoImg'
    181 GO
    182 
    183 exec sp_addextendedproperty N'MS_Description', N'性别(0=未知,1=男,2=女)', N'user', N'dbo', N'table', N'Manager', N'column', N'Sex'
    184 GO
    185 
    186 exec sp_addextendedproperty N'MS_Description', N'出生日期', N'user', N'dbo', N'table', N'Manager', N'column', N'Birthday'
    187 GO
    188 
    189 exec sp_addextendedproperty N'MS_Description', N'籍贯', N'user', N'dbo', N'table', N'Manager', N'column', N'NativePlace'
    190 GO
    191 
    192 exec sp_addextendedproperty N'MS_Description', N'民族', N'user', N'dbo', N'table', N'Manager', N'column', N'NationalName'
    193 GO
    194 
    195 exec sp_addextendedproperty N'MS_Description', N'个人--学历', N'user', N'dbo', N'table', N'Manager', N'column', N'Record'
    196 GO
    197 
    198 exec sp_addextendedproperty N'MS_Description', N'毕业学校', N'user', N'dbo', N'table', N'Manager', N'column', N'GraduateCollege'
    199 GO
    200 
    201 exec sp_addextendedproperty N'MS_Description', N'毕业专业', N'user', N'dbo', N'table', N'Manager', N'column', N'GraduateSpecialty'
    202 GO
    203 
    204 exec sp_addextendedproperty N'MS_Description', N'个人--联系电话', N'user', N'dbo', N'table', N'Manager', N'column', N'Tel'
    205 GO
    206 
    207 exec sp_addextendedproperty N'MS_Description', N'个人--移动电话', N'user', N'dbo', N'table', N'Manager', N'column', N'Mobile'
    208 GO
    209 
    210 exec sp_addextendedproperty N'MS_Description', N'个人--联系邮箱', N'user', N'dbo', N'table', N'Manager', N'column', N'Email'
    211 GO
    212 
    213 exec sp_addextendedproperty N'MS_Description', N'个人--QQ', N'user', N'dbo', N'table', N'Manager', N'column', N'Qq'
    214 GO
    215 
    216 exec sp_addextendedproperty N'MS_Description', N'个人--Msn', N'user', N'dbo', N'table', N'Manager', N'column', N'Msn'
    217 GO
    218 
    219 exec sp_addextendedproperty N'MS_Description', N'个人--通讯地址', N'user', N'dbo', N'table', N'Manager', N'column', N'Address'
    220 GO
    221 
    222 exec sp_addextendedproperty N'MS_Description', N'备注', N'user', N'dbo', N'table', N'Manager', N'column', N'Content'
    223 GO
    224 
    225 exec sp_addextendedproperty N'MS_Description', N'修改人员id', N'user', N'dbo', N'table', N'Manager', N'column', N'Manager_Id'
    226 GO
    227 
    228 exec sp_addextendedproperty N'MS_Description', N'修改人中文名称', N'user', N'dbo', N'table', N'Manager', N'column', N'Manager_CName'
    229 GO
    230 
    231 /****** Object:  Table [dbo].[OnlineUsers]    Script Date: 2014/6/4 22:27:52  ******/
    232 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[OnlineUsers]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    233 drop table [dbo].[OnlineUsers]
    234 GO
    235 
    236 /****** Object:  Table [dbo].[OnlineUsers]    Script Date: 2014/6/4 22:27:52   ******/
    237 CREATE TABLE [dbo].[OnlineUsers] (
    238   [Id] [int] IDENTITY (1, 1) NOT NULL,
    239   [UserHashKey] [nvarchar] (50) NOT NULL,
    240   [Manager_Id] [int] NOT NULL,
    241   [Manager_LoginName] [nvarchar] (20) NOT NULL,
    242   [Manager_LoginPass] [nvarchar] (32) NOT NULL,
    243   [Manager_CName] [nvarchar] (20) NOT NULL,
    244   [LoginTime] [datetime] NOT NULL,
    245   [LoginIp] [nvarchar] (30) NOT NULL,
    246   [UserKey] [nvarchar] (32) NOT NULL,
    247   [Md5] [nvarchar] (32) NOT NULL,
    248   [UpdateTime] [datetime] NOT NULL,
    249   [Sex] [nvarchar] (4) NOT NULL,
    250   [Branch_Id] [int] NOT NULL,
    251   [Branch_Code] [nvarchar] (20) NOT NULL,
    252   [Branch_Name] [nvarchar] (25) NOT NULL,
    253   [Position_Id] [nvarchar] (100) NOT NULL,
    254   [Position_Name] [nvarchar] (30) NOT NULL,
    255   [CurrentPage] [nvarchar] (100) NOT NULL,
    256   [CurrentPageTitle] [nvarchar] (250) NOT NULL,
    257   [SessionId] [nvarchar] (100) NOT NULL,
    258   [UserAgent] [nvarchar] (1000) NOT NULL,
    259   [OperatingSystem] [nvarchar] (50) NOT NULL,
    260   [TerminalType] [int] NOT NULL,
    261   [BrowserName] [nvarchar] (50) NOT NULL,
    262   [BrowserVersion] [nvarchar] (10) NOT NULL
    263 ) ON [PRIMARY]
    264 GO
    265 
    266 ALTER TABLE [dbo].[OnlineUsers] WITH NOCHECK ADD
    267   CONSTRAINT [PK_OnlineUsers] PRIMARY KEY  CLUSTERED
    268 (
    269  [Id]
    270 )  ON [PRIMARY]
    271 GO
    272 
    273 ALTER TABLE [dbo].[OnlineUsers] ADD
    274   CONSTRAINT [DF_OnlineUsers_UserHashKey] DEFAULT ('') FOR [UserHashKey],
    275   CONSTRAINT [DF_OnlineUsers_Manager_Id] DEFAULT (0) FOR [Manager_Id],
    276   CONSTRAINT [DF_OnlineUsers_Manager_LoginName] DEFAULT ('') FOR [Manager_LoginName],
    277   CONSTRAINT [DF_OnlineUsers_Manager_LoginPass] DEFAULT ('') FOR [Manager_LoginPass],
    278   CONSTRAINT [DF_OnlineUsers_Manager_CName] DEFAULT ('') FOR [Manager_CName],
    279   CONSTRAINT [DF_OnlineUsers_LoginTime] DEFAULT (getdate()) FOR [LoginTime],
    280   CONSTRAINT [DF_OnlineUsers_LoginIp] DEFAULT ('') FOR [LoginIp],
    281   CONSTRAINT [DF_OnlineUsers_UserKey] DEFAULT ('') FOR [UserKey],
    282   CONSTRAINT [DF_OnlineUsers_Md5] DEFAULT ('') FOR [Md5],
    283   CONSTRAINT [DF_OnlineUsers_UpdateTime] DEFAULT (getdate()) FOR [UpdateTime],
    284   CONSTRAINT [DF_OnlineUsers_Sex] DEFAULT ('') FOR [Sex],
    285   CONSTRAINT [DF_OnlineUsers_Branch_Id] DEFAULT (0) FOR [Branch_Id],
    286   CONSTRAINT [DF_OnlineUsers_Branch_Code] DEFAULT ('') FOR [Branch_Code],
    287   CONSTRAINT [DF_OnlineUsers_Branch_Name] DEFAULT ('') FOR [Branch_Name],
    288   CONSTRAINT [DF_OnlineUsers_Position_Id] DEFAULT ('') FOR [Position_Id],
    289   CONSTRAINT [DF_OnlineUsers_Position_Name] DEFAULT ('') FOR [Position_Name],
    290   CONSTRAINT [DF_OnlineUsers_CurrentPage] DEFAULT ('') FOR [CurrentPage],
    291   CONSTRAINT [DF_OnlineUsers_CurrentPageTitle] DEFAULT ('') FOR [CurrentPageTitle],
    292   CONSTRAINT [DF_OnlineUsers_SessionId] DEFAULT ('') FOR [SessionId],
    293   CONSTRAINT [DF_OnlineUsers_UserAgent] DEFAULT ('') FOR [UserAgent],
    294   CONSTRAINT [DF_OnlineUsers_OperatingSystem] DEFAULT ('') FOR [OperatingSystem],
    295   CONSTRAINT [DF_OnlineUsers_TerminalType] DEFAULT (0) FOR [TerminalType],
    296   CONSTRAINT [DF_OnlineUsers_BrowserName] DEFAULT ('') FOR [BrowserName],
    297   CONSTRAINT [DF_OnlineUsers_BrowserVersion] DEFAULT ('') FOR [BrowserVersion] 
    298 GO
    299 
    300 CREATE  INDEX [IX_OnlineUsers__Manager_Id] ON [dbo].[OnlineUsers]([Manager_Id]) ON [PRIMARY]
    301 GO
    302 
    303 CREATE  INDEX [IX_OnlineUsers__Manager_LoginName] ON [dbo].[OnlineUsers]([Manager_LoginName]) ON [PRIMARY]
    304 GO
    305 
    306 CREATE  INDEX [IX_OnlineUsers__Manager_CName] ON [dbo].[OnlineUsers]([Manager_CName]) ON [PRIMARY]
    307 GO
    308 
    309 CREATE  INDEX [IX_OnlineUsers__LoginTime] ON [dbo].[OnlineUsers]([LoginTime]) ON [PRIMARY]
    310 GO
    311 
    312 CREATE  INDEX [IX_OnlineUsers__UpdateTime] ON [dbo].[OnlineUsers]([UpdateTime]) ON [PRIMARY]
    313 GO
    314 
    315 CREATE  INDEX [IX_OnlineUsers__Branch_Id] ON [dbo].[OnlineUsers]([Branch_Id]) ON [PRIMARY]
    316 GO
    317 
    318 CREATE  INDEX [IX_OnlineUsers__Branch_Code] ON [dbo].[OnlineUsers]([Branch_Code]) ON [PRIMARY]
    319 GO
    320 
    321 CREATE  INDEX [IX_OnlineUsers__Position_Id] ON [dbo].[OnlineUsers]([Position_Id]) ON [PRIMARY]
    322 GO
    323 
    324 exec sp_addextendedproperty N'MS_Description', N'主键Id', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Id'
    325 GO
    326 
    327 exec sp_addextendedproperty N'MS_Description', N'在线用户列表中的HashTable Key值', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'UserHashKey'
    328 GO
    329 
    330 exec sp_addextendedproperty N'MS_Description', N'用户Id', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Manager_Id'
    331 GO
    332 
    333 exec sp_addextendedproperty N'MS_Description', N'登陆账号', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Manager_LoginName'
    334 GO
    335 
    336 exec sp_addextendedproperty N'MS_Description', N'登陆密码', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Manager_LoginPass'
    337 GO
    338 
    339 exec sp_addextendedproperty N'MS_Description', N'用户中文名称', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Manager_CName'
    340 GO
    341 
    342 exec sp_addextendedproperty N'MS_Description', N'登陆时间', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'LoginTime'
    343 GO
    344 
    345 exec sp_addextendedproperty N'MS_Description', N'登陆IP', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'LoginIp'
    346 GO
    347 
    348 exec sp_addextendedproperty N'MS_Description', N'用户密钥', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'UserKey'
    349 GO
    350 
    351 exec sp_addextendedproperty N'MS_Description', N'Md5(密钥+登陆帐号+密码+IP+密钥.Substring(6,8))', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Md5'
    352 GO
    353 
    354 exec sp_addextendedproperty N'MS_Description', N'最后在线时间', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'UpdateTime'
    355 GO
    356 
    357 exec sp_addextendedproperty N'MS_Description', N'性别(0=未知,1=男,2=女)', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Sex'
    358 GO
    359 
    360 exec sp_addextendedproperty N'MS_Description', N'所属部门ID', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Branch_Id'
    361 GO
    362 
    363 exec sp_addextendedproperty N'MS_Description', N'所属部门编号,用户只能正式归属于一个部门', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Branch_Code'
    364 GO
    365 
    366 exec sp_addextendedproperty N'MS_Description', N'部门名称', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Branch_Name'
    367 GO
    368 
    369 exec sp_addextendedproperty N'MS_Description', N'用户职位ID', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Position_Id'
    370 GO
    371 
    372 exec sp_addextendedproperty N'MS_Description', N'职位名称', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Position_Name'
    373 GO
    374 
    375 exec sp_addextendedproperty N'MS_Description', N'用户当前所在页面Url', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'CurrentPage'
    376 GO
    377 
    378 exec sp_addextendedproperty N'MS_Description', N'用户当前所在页面名称', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'CurrentPageTitle'
    379 GO
    380 
    381 exec sp_addextendedproperty N'MS_Description', N'用户SessionId', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'SessionId'
    382 GO
    383 
    384 exec sp_addextendedproperty N'MS_Description', N'客户端UA', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'UserAgent'
    385 GO
    386 
    387 exec sp_addextendedproperty N'MS_Description', N'操作系统', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'OperatingSystem'
    388 GO
    389 
    390 exec sp_addextendedproperty N'MS_Description', N'终端类型(0=非移动设备,1=移动设备)', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'TerminalType'
    391 GO
    392 
    393 exec sp_addextendedproperty N'MS_Description', N'浏览器名称', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'BrowserName'
    394 GO
    395 
    396 exec sp_addextendedproperty N'MS_Description', N'浏览器的版本', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'BrowserVersion'
    397 GO
    View Code

      7、添加后端相关表默认记录

     1 --添加部门记录
     2 INSERT INTO Branch (Code, Name, Notes, ParentId, Sort, Depth, Manager_Id, Manager_CName) 
     3     VALUES ('01', 'XX公司', '', 0, 1, 0, 1, 'admin')
     4 GO
     5 
     6 --添加职位记录
     7 INSERT INTO Position (Name, Branch_Id, Branch_Code, Branch_Name, PagePower, ControlPower, IsSetBranchPower, SetBranchCode, Manager_Id, Manager_CName) 
     8     VALUES ('软件开发工程师', 1, '01', 'XX公司', '', '', 1, '01', 1, 'admin')
     9 GO
    10 
    11 --添加管理员
    12 INSERT INTO Manager (LoginName, LoginPass, LoginIp, LoginCount, Branch_Id, Branch_Code, Branch_Name, Position_Id, Position_Name, IsWork, IsEnable, CName, EName, Sex, Manager_Id, Manager_CName) 
    13     VALUES ('admin', 'c3284d0f94606de1fd2af172aba15bf3', '127.0.0.1', 0, 1, '01', 'XX公司', '1', '软件开发工程师', 1, 1, 'admin', 'admin', '', 1, 'admin')
    14 GO
    View Code

      8、运行T4模板,为新加的表与修改的字段生成DAL层与BLL层代码

      

      9、登陆页cs文件代码(根据上面的流程图+代码中详细注释,大家应该很容易看明白)

      1 using System;
      2 using System.Collections;
      3 using System.Web;
      4 using System.Web.Caching;
      5 using DotNet.Utilities;
      6 using Solution.DataAccess.DataModel;
      7 using Solution.Logic.Managers;
      8 
      9 namespace Solution.Web.Managers.WebManage
     10 {
     11     public partial class Login : System.Web.UI.Page
     12     {
     13         protected void Page_Load(object sender, EventArgs e)
     14         {
     15             if (!IsPostBack)
     16             {
     17 
     18                 //进入登陆页面时判断是否是后台直接点击退出的,是的话加退出记录
     19                 LoginLogBll.GetInstence().UserExit();
     20 
     21                 #region 初始化用户Session变量
     22                 //在线用户生成的session标识
     23                 Session["UserHashKey"] = null;
     24                 //当前用户可访问的页面
     25                 Session["PagePower"] = null;
     26                 //当前用户页面中可使用的按钮控件
     27                 Session["ControlPower"] = null;
     28                 #endregion
     29             }
     30         }
     31 
     32         /// <summary>登录</summary>
     33         /// <param name="sender"></param>
     34         /// <param name="e"></param>
     35         protected void BtnLogin_Click(object sender, EventArgs e)
     36         {
     37             var ip = IpHelper.GetUserIp();
     38 
     39             #region 获取用户输入的参数,并进行数据初步处理
     40             //获取用户名,并进行危险字符过滤
     41             var username = StringHelper.Left(txtusername.Text, 50);
     42             //获取用户密码
     43             var userpass = txtpass.Text;
     44             //获取验证码
     45             var strCode = StringHelper.Left(txtcode.Text, 5);
     46             #endregion
     47 
     48             #region 初步验证
     49             //开发测试使用,不用每次都输入帐号与密码
     50             //username = "admin";
     51             //userpass = "admin";
     52             //strCode = "12345";
     53 
     54             //用户名验证
     55             if (string.IsNullOrEmpty(username.Trim()))
     56             {
     57                 txtusername.Focus();
     58                 JsHelper.Alert("用户名不能为空,请仔细检查您输入的用户名!");
     59                 return;
     60             }
     61             //密码验证
     62             if (string.IsNullOrEmpty(userpass.Trim()))
     63             {
     64                 txtpass.Focus();
     65                 JsHelper.Alert("密码不能为空,请仔细检查您输入的密码!");
     66                 return;
     67             }
     68 
     69             //验证码验证
     70             if (string.IsNullOrEmpty(strCode))
     71             {
     72                 txtcode.Focus();
     73                 JsHelper.Alert("验证码不能为空!");
     74                 return;
     75             }
     76             //判断验证码是否正确
     77             if (Session["vcode"] == null || !Session["vcode"].ToString().Equals(strCode, StringComparison.InvariantCultureIgnoreCase))
     78             {
     79                 SessionHelper.RemoveSession("vcode");
     80                 txtpass.Focus();
     81                 JsHelper.Alert("验证码错误!");
     82                 return;
     83             }
     84             else
     85             {
     86                 //验证码正确,删除验证码Session
     87                 SessionHelper.RemoveSession("vcode");
     88             }
     89             #endregion
     90 
     91             #region 数据库验证
     92 
     93             //通过用户给的用户名获取相关实体类
     94             var userinfo = Manager.SingleOrDefault(x => x.LoginName == username);
     95 
     96             //判断用户是否存在
     97             if (userinfo == null)
     98             {
     99                 LoginLogBll.GetInstence().Save(0, "账号【" + username + "】不存在,登录失败!");
    100                 txtusername.Focus();
    101                 JsHelper.Alert("用户名不存在,请仔细检查您输入的用户名!");
    102                 return;
    103             }
    104 
    105             //密码不匹配
    106             if (!userinfo.LoginPass.Equals(Encrypt.Md5(Encrypt.Md5(userpass))))
    107             {
    108                 LoginLogBll.GetInstence().Save(userinfo.Id, "账号【" + userinfo.LoginName + "】的用户【" + userinfo.CName + "】登录失败!登录密码错误。");
    109                 txtpass.Focus();
    110                 JsHelper.Alert("您输入的用户密码错误!");
    111                 return;
    112             }
    113 
    114             if (userinfo.IsWork == 0)
    115             {
    116                 //添加用户登陆日志
    117                 LoginLogBll.GetInstence().Save(userinfo.Id, "离职用户登录失败!用户【" + userinfo.CName + "】试图登录系统");
    118                 JsHelper.Alert("您已经没有权限登录本系统!");
    119                 return;
    120             }
    121 
    122             //判断当前账号是否被启用
    123             if (userinfo.IsEnable == 0)
    124             {
    125                 //添加登录日志记录
    126                 LoginLogBll.GetInstence().Save(userinfo.Id, "账号【" + userinfo.LoginName + "】的用户【" + userinfo.CName + "】登录失败!用户账号被禁用。");
    127 
    128                 JsHelper.Alert("当前账号未被启用,请联系管理人员激活!");
    129                 return;
    130             }
    131 
    132             #endregion
    133 
    134             #region 存储在线用户资料
    135 
    136             #region 获取用户操作权限
    137 
    138             if (string.IsNullOrEmpty(userinfo.Position_Id))
    139             {
    140                 Session["PagePower"] = "";
    141                 Session["ControlPower"] = "";
    142 
    143                 LoginLogBll.GetInstence().Save(0, "账号【" + username + "】未绑定职位,请管理员进行配置!");
    144                 JsHelper.Alert("您的账号未绑定职位,请与管理员联系!");
    145                 return;
    146             }
    147             else
    148             {
    149                 //获取用户权限并存储到用户Session里
    150                 PositionBll.GetInstence().SetUserPower(userinfo.Position_Id);
    151             }
    152 
    153             #endregion
    154 
    155             #region 当前用户在线信息
    156             //当前时间
    157             var localTime = DateTime.Now.ToLocalTime();
    158             //创建客户端信息获取实体
    159             var clientHelper = new ClientHelper(Request);
    160 
    161             //创建在线用户实体
    162             var onlineUser = new Solution.DataAccess.Model.OnlineUsers();
    163             //当前用户的Id编号
    164             onlineUser.Manager_Id = userinfo.Id;
    165             onlineUser.Manager_LoginName = userinfo.LoginName;
    166             onlineUser.Manager_LoginPass = userinfo.LoginPass;
    167             onlineUser.Manager_CName = userinfo.CName;
    168             onlineUser.LoginTime = localTime;
    169             onlineUser.LoginIp = ip;
    170             //生成密钥
    171             onlineUser.UserKey = RandomHelper.GetRndNum(32, true);
    172             //Md5(密钥+登陆帐号+密码+IP+密钥.Substring(6,8))
    173             onlineUser.Md5 =
    174                 Encrypt.Md5(onlineUser.UserKey + onlineUser.Manager_LoginName + onlineUser.Manager_LoginPass +
    175                             onlineUser.LoginIp + onlineUser.UserKey.Substring(6, 8));
    176             onlineUser.UpdateTime = localTime;
    177             onlineUser.Sex = userinfo.Sex;
    178             onlineUser.Branch_Id = userinfo.Branch_Id;
    179             onlineUser.Branch_Code = userinfo.Branch_Code;
    180             onlineUser.Branch_Name = userinfo.Branch_Name;
    181             onlineUser.Position_Id = userinfo.Position_Id;
    182             onlineUser.Position_Name = userinfo.Position_Name;
    183             onlineUser.CurrentPage = "";
    184             onlineUser.CurrentPageTitle = "";
    185             //SessionId
    186             onlineUser.SessionId = Session.SessionID;
    187             onlineUser.UserAgent = StringHelper.FilterSql(HttpContext.Current.Request.Headers["User-Agent"] + "");
    188             onlineUser.OperatingSystem = clientHelper.GetSystem();
    189             onlineUser.TerminalType = clientHelper.IsMobileDevice(onlineUser.UserAgent) ? 1 : 0;
    190             onlineUser.BrowserName = clientHelper.GetBrowserName();
    191             onlineUser.BrowserVersion = clientHelper.GetBrowserVersion();
    192 
    193             #endregion
    194 
    195             #region 记录当前用户UserId
    196             //定义HashTable表里Key的名称UserId
    197             string userHashKey = "";
    198             //判断当前用户帐户是否支持同一帐号在不同地方登陆功能,取得用户在HashTable表里Key的名称
    199             //不支持则
    200             if (userinfo.IsMultiUser == 0)
    201             {
    202                 userHashKey = userinfo.Id + "";
    203             }
    204             //支持则
    205             else
    206             {
    207                 userHashKey = userinfo.Id + "_" + onlineUser.SessionId;
    208             }
    209             //记录用户的HashTable Key
    210             onlineUser.UserHashKey = userHashKey;
    211             Session["UserHashKey"] = userHashKey;
    212             #endregion
    213 
    214             #region 将在线用户信息存入全局变量中
    215             //运行在线数据加载函数,如果缓存不存在,则尝试加载数据库中的在线表记录到缓存中
    216             //——主要用于IIS缓存被应用程序池或其他原因回收后,对在线数据进行重新加载,而不会使所有用户都被迫退出系统
    217             OnlineUsersBll.GetInstence().Load();
    218 
    219             //判断缓存中["OnlineUsers"]是否存在,不存在则直接将在线实体添加到缓存中
    220             if (CacheHelper.GetCache("OnlineUsers") == null)
    221             {
    222                 //将当前用户信息添加到Hashtable中
    223                 var hashtable = new Hashtable();
    224                 hashtable.Add(userHashKey, onlineUser);
    225                 //将在线列表(Hashtable)添中进系统缓存中
    226                 CacheHelper.SetCache("OnlineUsers", hashtable);
    227             }
    228             //存在则将它取出HashTable并进行处理
    229             else
    230             {
    231                 //直接从缓存中读取在线列表数据
    232                 var hashtable = (Hashtable)CacheHelper.GetCache("OnlineUsers");
    233 
    234                 //判断当前用户是否存在在线表中,不存在则直接将当前用户的实体对象存储进HashTable
    235                 if (hashtable[userHashKey] == null || hashtable.Count == 0)
    236                 {
    237                     hashtable.Add(userHashKey, onlineUser);
    238                 }
    239                 //存在则
    240                 else
    241                 {
    242                     //添加用户下线记录
    243                     LoginLogBll.GetInstence().Save(userHashKey, "用户【{0}】的账号已经在另一处登录,本次登陆下线!在线时间【{1}】");
    244 
    245                     //将HashTable里存储的前一登陆帐户移除
    246                     OnlineUsersBll.GetInstence().Delete(this, x => x.UserHashKey == userHashKey);
    247                     //移除缓存中的记录
    248                     hashtable.Remove(userHashKey);
    249 
    250                     //将当前用户的实体对象存进在线缓存中
    251                     hashtable.Add(userHashKey, onlineUser);
    252                 }
    253             }
    254 
    255             //将在线实体保存到数据库的在线表中
    256             OnlineUsersBll.GetInstence().Save(this, OnlineUsersBll.GetInstence().Transform(onlineUser));
    257 
    258             //将用户信息表添加到缓存中,并且以150秒的轮询用户在线情况
    259             //new PageBase().OnRemovedCallback为缓存回调函数,用于缓存失效、过期、删除或回收时,所触发的回调函数,执行相应操作
    260             //缓存Key的前面加了"OnlineUsers_"标识,主要是用于清空缓存时区分用户缓存和其他系统缓存,不会将在线用户都清除下线
    261             HttpRuntime.Cache.Insert("OnlineUsers_" + userHashKey, userHashKey, null, DateTime.MaxValue, TimeSpan.FromSeconds(150), CacheItemPriority.Default, new CacheItemRemovedCallback(OnRemovedCallback));
    262 
    263             //更新在线列表数据,将不在线人员删除
    264             OnlineUsersBll.GetInstence().UpdateUserOnlineCount();
    265 
    266             #endregion
    267 
    268             #endregion
    269 
    270             #region 更新用户登陆信息
    271 
    272             userinfo.LoginIp = ip;
    273             userinfo.LoginCount = userinfo.LoginCount++;
    274             userinfo.LoginTime = localTime;
    275 
    276             ManagerBll.GetInstence().Save(this, userinfo, string.Format("用户【{0}】登陆成功,更新登陆信息", userinfo.CName));
    277 
    278             #endregion
    279 
    280             #region 添加用户登录成功日志
    281             LoginLogBll.GetInstence().Save(userHashKey, string.Format("账号【{0}】的用户【{1}】登录成功", userinfo.LoginName, userinfo.CName));
    282             #endregion
    283 
    284             #region 写Cookies
    285             //写入用户的HashTable Key
    286             CookieHelper.SetCookie(OnlineUsersTable.UserHashKey, userHashKey);
    287             //写入加密值
    288             CookieHelper.SetCookie(OnlineUsersTable.Md5, onlineUser.Md5);
    289             #endregion
    290 
    291             //跳转进入主页面           
    292             Response.Redirect("MainPage.aspx");
    293         }
    294 
    295         #region 缓存回调函数
    296         /// <summary>
    297         /// 缓存回调函数,用于缓存失效、过期、删除或回收时,所触发的回调函数,执行相应操作
    298         /// </summary>
    299         /// <param name="key">缓存Key</param>
    300         /// <param name="value">缓存值</param>
    301         /// <param name="reason">触发的原因</param>
    302         public void OnRemovedCallback(string key, object value, CacheItemRemovedReason reason)
    303         {
    304             if (key == null || value == null)
    305                 return;
    306 
    307             //更新在线列表数据,将不在线人员删除
    308             OnlineUsersBll.GetInstence().UpdateUserOnlineCount();
    309 
    310             //switch (reason)
    311             //{
    312             //    //相关联的缓存已经失效
    313             //    case CacheItemRemovedReason.DependencyChanged:
    314             //        break;
    315 
    316             //    //当前用户缓存已过期
    317             //    case CacheItemRemovedReason.Expired:
    318             //        //更新在线列表数据,将不在线人员删除
    319             //        OnlineUsersBll.UpdateUserOnlineCount();
    320 
    321             //        break;
    322 
    323             //    //当前用户已被删除
    324             //    case CacheItemRemovedReason.Removed:
    325             //        break;
    326 
    327             //    //系统释放内存自动回收当前用户
    328             //    case CacheItemRemovedReason.Underused:
    329             //        //更新在线列表数据,将不在线人员删除
    330             //        OnlineUsersBll.UpdateUserOnlineCount();
    331 
    332             //        break;
    333 
    334             //}
    335         }
    336         #endregion
    337     }
    338 }
    View Code

      后端登陆页面界面随便在网上找了个改了一下,弄得很简陋,大家如果有好的UI可以发到我邮箱,我下次更新上去O(∩_∩)O

    点击下载:

    由于框架不是非常成熟,很多朋友不是用来学习而是直接用到项目中,但不熟悉框架引起不少小问题,所以停止提供下载,有需要学习的可以到群共享里下,不便之处敬请谅解。

    版权声明:
      本文由AllEmpty原创并发布于博客园,欢迎转载,未经本人同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如有问题,可以通过1654937@qq.com 联系我,非常感谢。

      发表本编内容,只要主为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:327360708 ,大家一起探讨。

      更多内容,敬请观注博客:http://www.cnblogs.com/EmptyFS/

    只有将自己置空,才能装进更多的东西
  • 相关阅读:
    kali BEEF-XSS启动报错解决
    kali msfconsole启动报错解决
    unittest详解(三) 简单元素定位
    unittest详解(二) 断言
    unittest详解(一) unittest框架
    selenuim python环境安装
    Locust 脚本练习
    Locust 参数化
    Locust 设置断言
    9-04嵌套事务及事务分类
  • 原文地址:https://www.cnblogs.com/FinleyJiang/p/7600813.html
Copyright © 2020-2023  润新知