從零開始編寫自己的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/

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM