从零开始编写自己的C#框架(15)——Web层后端登陆功能
对于一个后端管理系统,最重要内容之一的就是登陆页了,无论是安全验证、用户在线记录、相关日志记录、单用户或多用户使用帐号控制等,都是在这个页面进行处理的。
1、在解决方案中创建一个Web项目,并将它设置为启动项
2、添加引用
3、添加WebManage文件夹与Login.aspx文件
4、添加登陆页面HTML代码
- <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="Solution.Web.Managers.WebManage.Login" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head id="Head1" runat="server">
- <title>从零开始编写自己的C#框架——后端管理系统</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <link rel="stylesheet" href="Css/login.css" />
- <script type="text/javascript">
- function Random(n) { return (Math.floor(Math.random() * n)); };
- function AjaxRnd() { return new Date().getTime() + '' + Random(); };
- function ShowKey() {
- document.getElementById("img_verifycode").src = "Base/Vcode.ashx?a=" + AjaxRnd();
- };
- </script>
- </head>
- <body>
- <!--CENTER开始-->
- <div class="login-container">
- <form id="form1" runat="server">
- <div class="login-header">
- <h3>
- Login</h3>
- </div>
- <div id="login-content" class="clearfix">
- <div>
- <label>
- 用户名</label>
- <div>
- <asp:TextBox runat="server" ID="txtusername" CssClass="input w92" />
- </div>
- <label>
- 密码</label>
- <div>
- <asp:TextBox runat="server" ID="txtpass" CssClass="input w92" TextMode="Password" />
- </div>
- <label>
- 验证码</label>
- <div>
- <asp:TextBox runat="server" ID="txtcode" CssClass="input w100 fl" />
- <asp:Image ID="img_verifycode" runat="server" onclick="ShowKey();" ToolTip="更换验证码"
- ImageUrl="Base/Vcode.ashx" />
- <div class="fc"></div>
- </div>
- </div>
- <div>
- <asp:Button ID="BtnLogin" CssClass="btn" runat="server" OnClick="BtnLogin_Click"
- Text="登陆" />
- </div>
- </div>
- </form>
- </div>
- <!--CENTER结束-->
- </body>
- </html>
css样式在本文后面的解决方案中有
浏览一下效果
5、后端管理系统登陆验证流程图
我们根据下面的流程图来编写登陆页代码
6、添加在线列表数据表并修改管事员表相关字段
执行下面SQL语句
- /****** Object: Table [dbo].[Manager] Script Date: 2014/6/4 22:27:52 ******/
- if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Manager]') and OBJECTPROPERTY(id, N'IsUserTable') = )
- drop table [dbo].[Manager]
- GO
- /****** Object: Table [dbo].[Manager] Script Date: 2014/6/4 22:27:52 ******/
- CREATE TABLE [dbo].[Manager] (
- [Id] [int] IDENTITY (, ) NOT NULL,
- [LoginName] [nvarchar] () NOT NULL,
- [LoginPass] [nvarchar] () NOT NULL,
- [LoginTime] [datetime] NOT NULL,
- [LoginIp] [nvarchar] () NOT NULL,
- [LoginCount] [int] NOT NULL,
- [CreateTime] [datetime] NOT NULL,
- [UpdateTime] [datetime] NOT NULL,
- [IsMultiUser] [tinyint] NOT NULL,
- [Branch_Id] [int] NOT NULL,
- [Branch_Code] [nvarchar] () NOT NULL,
- [Branch_Name] [nvarchar] () NOT NULL,
- [Position_Id] [nvarchar] () NOT NULL,
- [Position_Name] [nvarchar] () NOT NULL,
- [IsWork] [tinyint] NOT NULL,
- [IsEnable] [tinyint] NOT NULL,
- [CName] [nvarchar] () NOT NULL,
- [EName] [nvarchar] () NOT NULL,
- [PhotoImg] [nvarchar] () NOT NULL,
- [Sex] [nvarchar] () NOT NULL,
- [Birthday] [nvarchar] () NOT NULL,
- [NativePlace] [nvarchar] () NOT NULL,
- [NationalName] [nvarchar] () NOT NULL,
- [Record] [nvarchar] () NOT NULL,
- [GraduateCollege] [nvarchar] () NOT NULL,
- [GraduateSpecialty] [nvarchar] () NOT NULL,
- [Tel] [nvarchar] () NOT NULL,
- [Mobile] [nvarchar] () NOT NULL,
- [Email] [nvarchar] () NOT NULL,
- [Qq] [nvarchar] () NOT NULL,
- [Msn] [nvarchar] () NOT NULL,
- [Address] [nvarchar] () NOT NULL,
- [Content] [ntext] NOT NULL,
- [Manager_Id] [int] NOT NULL,
- [Manager_CName] [nvarchar] () NOT NULL
- ) ON [PRIMARY]
- GO
- ALTER TABLE [dbo].[Manager] WITH NOCHECK ADD
- CONSTRAINT [PK_Manager] PRIMARY KEY CLUSTERED
- (
- [Id]
- ) ON [PRIMARY]
- GO
- ALTER TABLE [dbo].[Manager] ADD
- CONSTRAINT [DF_Manager_LoginName] DEFAULT ('') FOR [LoginName],
- CONSTRAINT [DF_Manager_LoginPass] DEFAULT ('') FOR [LoginPass],
- CONSTRAINT [DF_Manager_LoginTime] DEFAULT (getdate()) FOR [LoginTime],
- CONSTRAINT [DF_Manager_LoginIp] DEFAULT ('') FOR [LoginIp],
- CONSTRAINT [DF_Manager_LoginCount] DEFAULT () FOR [LoginCount],
- CONSTRAINT [DF_Manager_CreateTime] DEFAULT (getdate()) FOR [CreateTime],
- CONSTRAINT [DF_Manager_UpdateTime] DEFAULT (getdate()) FOR [UpdateTime],
- CONSTRAINT [DF_Manager_IsMultiUser] DEFAULT () FOR [IsMultiUser],
- CONSTRAINT [DF_Manager_Branch_Id] DEFAULT () FOR [Branch_Id],
- CONSTRAINT [DF_Manager_Branch_Code] DEFAULT ('') FOR [Branch_Code],
- CONSTRAINT [DF_Manager_Branch_Name] DEFAULT ('') FOR [Branch_Name],
- CONSTRAINT [DF_Manager_Position_Id] DEFAULT ('') FOR [Position_Id],
- CONSTRAINT [DF_Manager_Position_Name] DEFAULT ('') FOR [Position_Name],
- CONSTRAINT [DF_Manager_IsWork] DEFAULT () FOR [IsWork],
- CONSTRAINT [DF_Manager_IsEnable] DEFAULT () FOR [IsEnable],
- CONSTRAINT [DF_Manager_CName] DEFAULT ('') FOR [CName],
- CONSTRAINT [DF_Manager_EName] DEFAULT ('') FOR [EName],
- CONSTRAINT [DF_Manager_PhotoImg] DEFAULT ('') FOR [PhotoImg],
- CONSTRAINT [DF_Manager_Sex] DEFAULT ('') FOR [Sex],
- CONSTRAINT [DF_Manager_Birthday] DEFAULT ('') FOR [Birthday],
- CONSTRAINT [DF_Manager_NativePlace] DEFAULT ('') FOR [NativePlace],
- CONSTRAINT [DF_Manager_NationalName] DEFAULT ('') FOR [NationalName],
- CONSTRAINT [DF_Manager_Record] DEFAULT ('') FOR [Record],
- CONSTRAINT [DF_Manager_GraduateCollege] DEFAULT ('') FOR [GraduateCollege],
- CONSTRAINT [DF_Manager_GraduateSpecialty] DEFAULT ('') FOR [GraduateSpecialty],
- CONSTRAINT [DF_Manager_Tel] DEFAULT ('') FOR [Tel],
- CONSTRAINT [DF_Manager_Mobile] DEFAULT ('') FOR [Mobile],
- CONSTRAINT [DF_Manager_Email] DEFAULT ('') FOR [Email],
- CONSTRAINT [DF_Manager_Qq] DEFAULT ('') FOR [Qq],
- CONSTRAINT [DF_Manager_Msn] DEFAULT ('') FOR [Msn],
- CONSTRAINT [DF_Manager_Address] DEFAULT ('') FOR [Address],
- CONSTRAINT [DF_Manager_Content] DEFAULT ('') FOR [Content],
- CONSTRAINT [DF_Manager_Manager_Id] DEFAULT () FOR [Manager_Id],
- CONSTRAINT [DF_Manager_Manager_CName] DEFAULT ('') FOR [Manager_CName]
- GO
- CREATE INDEX [IX_Manager__LoginName] ON [dbo].[Manager]([LoginName]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_Manager__LoginTime] ON [dbo].[Manager]([LoginTime]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_Manager__CreateTime] ON [dbo].[Manager]([CreateTime]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_Manager__UpdateTime] ON [dbo].[Manager]([UpdateTime]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_Manager__Branch_Id] ON [dbo].[Manager]([Branch_Id]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_Manager__Branch_Code] ON [dbo].[Manager]([Branch_Code]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_Manager__Position_Id] ON [dbo].[Manager]([Position_Id]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_Manager__IsWork] ON [dbo].[Manager]([IsWork]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_Manager__IsEnable] ON [dbo].[Manager]([IsEnable]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_Manager__CName] ON [dbo].[Manager]([CName]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_Manager__EName] ON [dbo].[Manager]([EName]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_Manager__Sex] ON [dbo].[Manager]([Sex]) ON [PRIMARY]
- GO
- exec sp_addextendedproperty N'MS_Description', N'主键Id', N'user', N'dbo', N'table', N'Manager', N'column', N'Id'
- GO
- exec sp_addextendedproperty N'MS_Description', N'登陆账号', N'user', N'dbo', N'table', N'Manager', N'column', N'LoginName'
- GO
- exec sp_addextendedproperty N'MS_Description', N'登陆密码', N'user', N'dbo', N'table', N'Manager', N'column', N'LoginPass'
- GO
- exec sp_addextendedproperty N'MS_Description', N'最后登陆时间', N'user', N'dbo', N'table', N'Manager', N'column', N'LoginTime'
- GO
- exec sp_addextendedproperty N'MS_Description', N'最后登陆IP', N'user', N'dbo', N'table', N'Manager', N'column', N'LoginIp'
- GO
- exec sp_addextendedproperty N'MS_Description', N'登陆次数', N'user', N'dbo', N'table', N'Manager', N'column', N'LoginCount'
- GO
- exec sp_addextendedproperty N'MS_Description', N'注册时间', N'user', N'dbo', N'table', N'Manager', N'column', N'CreateTime'
- GO
- exec sp_addextendedproperty N'MS_Description', N'资料最后修改日期', N'user', N'dbo', N'table', N'Manager', N'column', N'UpdateTime'
- GO
- exec sp_addextendedproperty N'MS_Description', N'是否允许同一帐号多人使用,0=只能单个在线,1=可以多人同时在线', N'user', N'dbo', N'table', N'Manager', N'column', N'IsMultiUser'
- GO
- exec sp_addextendedproperty N'MS_Description', N'所属部门ID', N'user', N'dbo', N'table', N'Manager', N'column', N'Branch_Id'
- GO
- exec sp_addextendedproperty N'MS_Description', N'所属部门编号,用户只能正式归属于一个部门', N'user', N'dbo', N'table', N'Manager', N'column', N'Branch_Code'
- GO
- exec sp_addextendedproperty N'MS_Description', N'部门名称', N'user', N'dbo', N'table', N'Manager', N'column', N'Branch_Name'
- GO
- exec sp_addextendedproperty N'MS_Description', N'用户职位ID', N'user', N'dbo', N'table', N'Manager', N'column', N'Position_Id'
- GO
- exec sp_addextendedproperty N'MS_Description', N'职位名称', N'user', N'dbo', N'table', N'Manager', N'column', N'Position_Name'
- GO
- exec sp_addextendedproperty N'MS_Description', N'0=离职,1=就职', N'user', N'dbo', N'table', N'Manager', N'column', N'IsWork'
- GO
- exec sp_addextendedproperty N'MS_Description', N'账号是否启用,1=true(启用),0=false(禁用)', N'user', N'dbo', N'table', N'Manager', N'column', N'IsEnable'
- GO
- exec sp_addextendedproperty N'MS_Description', N'用户中文名称', N'user', N'dbo', N'table', N'Manager', N'column', N'CName'
- GO
- exec sp_addextendedproperty N'MS_Description', N'用户英文名称', N'user', N'dbo', N'table', N'Manager', N'column', N'EName'
- GO
- exec sp_addextendedproperty N'MS_Description', N'头像图片路径', N'user', N'dbo', N'table', N'Manager', N'column', N'PhotoImg'
- GO
- exec sp_addextendedproperty N'MS_Description', N'性别(0=未知,1=男,2=女)', N'user', N'dbo', N'table', N'Manager', N'column', N'Sex'
- GO
- exec sp_addextendedproperty N'MS_Description', N'出生日期', N'user', N'dbo', N'table', N'Manager', N'column', N'Birthday'
- GO
- exec sp_addextendedproperty N'MS_Description', N'籍贯', N'user', N'dbo', N'table', N'Manager', N'column', N'NativePlace'
- GO
- exec sp_addextendedproperty N'MS_Description', N'民族', N'user', N'dbo', N'table', N'Manager', N'column', N'NationalName'
- GO
- exec sp_addextendedproperty N'MS_Description', N'个人--学历', N'user', N'dbo', N'table', N'Manager', N'column', N'Record'
- GO
- exec sp_addextendedproperty N'MS_Description', N'毕业学校', N'user', N'dbo', N'table', N'Manager', N'column', N'GraduateCollege'
- GO
- exec sp_addextendedproperty N'MS_Description', N'毕业专业', N'user', N'dbo', N'table', N'Manager', N'column', N'GraduateSpecialty'
- GO
- exec sp_addextendedproperty N'MS_Description', N'个人--联系电话', N'user', N'dbo', N'table', N'Manager', N'column', N'Tel'
- GO
- exec sp_addextendedproperty N'MS_Description', N'个人--移动电话', N'user', N'dbo', N'table', N'Manager', N'column', N'Mobile'
- GO
- exec sp_addextendedproperty N'MS_Description', N'个人--联系邮箱', N'user', N'dbo', N'table', N'Manager', N'column', N'Email'
- GO
- exec sp_addextendedproperty N'MS_Description', N'个人--QQ', N'user', N'dbo', N'table', N'Manager', N'column', N'Qq'
- GO
- exec sp_addextendedproperty N'MS_Description', N'个人--Msn', N'user', N'dbo', N'table', N'Manager', N'column', N'Msn'
- GO
- exec sp_addextendedproperty N'MS_Description', N'个人--通讯地址', N'user', N'dbo', N'table', N'Manager', N'column', N'Address'
- GO
- exec sp_addextendedproperty N'MS_Description', N'备注', N'user', N'dbo', N'table', N'Manager', N'column', N'Content'
- GO
- exec sp_addextendedproperty N'MS_Description', N'修改人员id', N'user', N'dbo', N'table', N'Manager', N'column', N'Manager_Id'
- GO
- exec sp_addextendedproperty N'MS_Description', N'修改人中文名称', N'user', N'dbo', N'table', N'Manager', N'column', N'Manager_CName'
- GO
- /****** Object: Table [dbo].[OnlineUsers] Script Date: 2014/6/4 22:27:52 ******/
- if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[OnlineUsers]') and OBJECTPROPERTY(id, N'IsUserTable') = )
- drop table [dbo].[OnlineUsers]
- GO
- /****** Object: Table [dbo].[OnlineUsers] Script Date: 2014/6/4 22:27:52 ******/
- CREATE TABLE [dbo].[OnlineUsers] (
- [Id] [int] IDENTITY (, ) NOT NULL,
- [UserHashKey] [nvarchar] () NOT NULL,
- [Manager_Id] [int] NOT NULL,
- [Manager_LoginName] [nvarchar] () NOT NULL,
- [Manager_LoginPass] [nvarchar] () NOT NULL,
- [Manager_CName] [nvarchar] () NOT NULL,
- [LoginTime] [datetime] NOT NULL,
- [LoginIp] [nvarchar] () NOT NULL,
- [UserKey] [nvarchar] () NOT NULL,
- [Md5] [nvarchar] () NOT NULL,
- [UpdateTime] [datetime] NOT NULL,
- [Sex] [nvarchar] () NOT NULL,
- [Branch_Id] [int] NOT NULL,
- [Branch_Code] [nvarchar] () NOT NULL,
- [Branch_Name] [nvarchar] () NOT NULL,
- [Position_Id] [nvarchar] () NOT NULL,
- [Position_Name] [nvarchar] () NOT NULL,
- [CurrentPage] [nvarchar] () NOT NULL,
- [CurrentPageTitle] [nvarchar] () NOT NULL,
- [SessionId] [nvarchar] () NOT NULL,
- [UserAgent] [nvarchar] () NOT NULL,
- [OperatingSystem] [nvarchar] () NOT NULL,
- [TerminalType] [int] NOT NULL,
- [BrowserName] [nvarchar] () NOT NULL,
- [BrowserVersion] [nvarchar] () NOT NULL
- ) ON [PRIMARY]
- GO
- ALTER TABLE [dbo].[OnlineUsers] WITH NOCHECK ADD
- CONSTRAINT [PK_OnlineUsers] PRIMARY KEY CLUSTERED
- (
- [Id]
- ) ON [PRIMARY]
- GO
- ALTER TABLE [dbo].[OnlineUsers] ADD
- CONSTRAINT [DF_OnlineUsers_UserHashKey] DEFAULT ('') FOR [UserHashKey],
- CONSTRAINT [DF_OnlineUsers_Manager_Id] DEFAULT () FOR [Manager_Id],
- CONSTRAINT [DF_OnlineUsers_Manager_LoginName] DEFAULT ('') FOR [Manager_LoginName],
- CONSTRAINT [DF_OnlineUsers_Manager_LoginPass] DEFAULT ('') FOR [Manager_LoginPass],
- CONSTRAINT [DF_OnlineUsers_Manager_CName] DEFAULT ('') FOR [Manager_CName],
- CONSTRAINT [DF_OnlineUsers_LoginTime] DEFAULT (getdate()) FOR [LoginTime],
- CONSTRAINT [DF_OnlineUsers_LoginIp] DEFAULT ('') FOR [LoginIp],
- CONSTRAINT [DF_OnlineUsers_UserKey] DEFAULT ('') FOR [UserKey],
- CONSTRAINT [DF_OnlineUsers_Md5] DEFAULT ('') FOR [Md5],
- CONSTRAINT [DF_OnlineUsers_UpdateTime] DEFAULT (getdate()) FOR [UpdateTime],
- CONSTRAINT [DF_OnlineUsers_Sex] DEFAULT ('') FOR [Sex],
- CONSTRAINT [DF_OnlineUsers_Branch_Id] DEFAULT () FOR [Branch_Id],
- CONSTRAINT [DF_OnlineUsers_Branch_Code] DEFAULT ('') FOR [Branch_Code],
- CONSTRAINT [DF_OnlineUsers_Branch_Name] DEFAULT ('') FOR [Branch_Name],
- CONSTRAINT [DF_OnlineUsers_Position_Id] DEFAULT ('') FOR [Position_Id],
- CONSTRAINT [DF_OnlineUsers_Position_Name] DEFAULT ('') FOR [Position_Name],
- CONSTRAINT [DF_OnlineUsers_CurrentPage] DEFAULT ('') FOR [CurrentPage],
- CONSTRAINT [DF_OnlineUsers_CurrentPageTitle] DEFAULT ('') FOR [CurrentPageTitle],
- CONSTRAINT [DF_OnlineUsers_SessionId] DEFAULT ('') FOR [SessionId],
- CONSTRAINT [DF_OnlineUsers_UserAgent] DEFAULT ('') FOR [UserAgent],
- CONSTRAINT [DF_OnlineUsers_OperatingSystem] DEFAULT ('') FOR [OperatingSystem],
- CONSTRAINT [DF_OnlineUsers_TerminalType] DEFAULT () FOR [TerminalType],
- CONSTRAINT [DF_OnlineUsers_BrowserName] DEFAULT ('') FOR [BrowserName],
- CONSTRAINT [DF_OnlineUsers_BrowserVersion] DEFAULT ('') FOR [BrowserVersion]
- GO
- CREATE INDEX [IX_OnlineUsers__Manager_Id] ON [dbo].[OnlineUsers]([Manager_Id]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_OnlineUsers__Manager_LoginName] ON [dbo].[OnlineUsers]([Manager_LoginName]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_OnlineUsers__Manager_CName] ON [dbo].[OnlineUsers]([Manager_CName]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_OnlineUsers__LoginTime] ON [dbo].[OnlineUsers]([LoginTime]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_OnlineUsers__UpdateTime] ON [dbo].[OnlineUsers]([UpdateTime]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_OnlineUsers__Branch_Id] ON [dbo].[OnlineUsers]([Branch_Id]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_OnlineUsers__Branch_Code] ON [dbo].[OnlineUsers]([Branch_Code]) ON [PRIMARY]
- GO
- CREATE INDEX [IX_OnlineUsers__Position_Id] ON [dbo].[OnlineUsers]([Position_Id]) ON [PRIMARY]
- GO
- exec sp_addextendedproperty N'MS_Description', N'主键Id', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Id'
- GO
- exec sp_addextendedproperty N'MS_Description', N'在线用户列表中的HashTable Key值', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'UserHashKey'
- GO
- exec sp_addextendedproperty N'MS_Description', N'用户Id', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Manager_Id'
- GO
- exec sp_addextendedproperty N'MS_Description', N'登陆账号', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Manager_LoginName'
- GO
- exec sp_addextendedproperty N'MS_Description', N'登陆密码', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Manager_LoginPass'
- GO
- exec sp_addextendedproperty N'MS_Description', N'用户中文名称', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Manager_CName'
- GO
- exec sp_addextendedproperty N'MS_Description', N'登陆时间', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'LoginTime'
- GO
- exec sp_addextendedproperty N'MS_Description', N'登陆IP', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'LoginIp'
- GO
- exec sp_addextendedproperty N'MS_Description', N'用户密钥', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'UserKey'
- GO
- exec sp_addextendedproperty N'MS_Description', N'Md5(密钥+登陆帐号+密码+IP+密钥.Substring(6,8))', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Md5'
- GO
- exec sp_addextendedproperty N'MS_Description', N'最后在线时间', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'UpdateTime'
- GO
- exec sp_addextendedproperty N'MS_Description', N'性别(0=未知,1=男,2=女)', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Sex'
- GO
- exec sp_addextendedproperty N'MS_Description', N'所属部门ID', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Branch_Id'
- GO
- exec sp_addextendedproperty N'MS_Description', N'所属部门编号,用户只能正式归属于一个部门', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Branch_Code'
- GO
- exec sp_addextendedproperty N'MS_Description', N'部门名称', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Branch_Name'
- GO
- exec sp_addextendedproperty N'MS_Description', N'用户职位ID', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Position_Id'
- GO
- exec sp_addextendedproperty N'MS_Description', N'职位名称', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'Position_Name'
- GO
- exec sp_addextendedproperty N'MS_Description', N'用户当前所在页面Url', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'CurrentPage'
- GO
- exec sp_addextendedproperty N'MS_Description', N'用户当前所在页面名称', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'CurrentPageTitle'
- GO
- exec sp_addextendedproperty N'MS_Description', N'用户SessionId', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'SessionId'
- GO
- exec sp_addextendedproperty N'MS_Description', N'客户端UA', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'UserAgent'
- GO
- exec sp_addextendedproperty N'MS_Description', N'操作系统', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'OperatingSystem'
- GO
- exec sp_addextendedproperty N'MS_Description', N'终端类型(0=非移动设备,1=移动设备)', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'TerminalType'
- GO
- exec sp_addextendedproperty N'MS_Description', N'浏览器名称', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'BrowserName'
- GO
- exec sp_addextendedproperty N'MS_Description', N'浏览器的版本', N'user', N'dbo', N'table', N'OnlineUsers', N'column', N'BrowserVersion'
- GO
7、添加后端相关表默认记录
- --添加部门记录
- INSERT INTO Branch (Code, Name, Notes, ParentId, Sort, Depth, Manager_Id, Manager_CName)
- VALUES ('', 'XX公司', '', 0, 1, 0, 1, 'admin')
- GO
- --添加职位记录
- INSERT INTO Position (Name, Branch_Id, Branch_Code, Branch_Name, PagePower, ControlPower, IsSetBranchPower, SetBranchCode, Manager_Id, Manager_CName)
- VALUES ('软件开发工程师', 1, '', 'XX公司', '', '', 1, '', 1, 'admin')
- GO
- --添加管理员
- 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)
- VALUES ('admin', 'c3284d0f94606de1fd2af172aba15bf3', '127.0.0.1', 0, 1, '', 'XX公司', '', '软件开发工程师', 1, 1, 'admin', 'admin', '男', 1, 'admin')
- GO
8、运行T4模板,为新加的表与修改的字段生成DAL层与BLL层代码
9、登陆页cs文件代码(根据上面的流程图+代码中详细注释,大家应该很容易看明白)
- using System;
- using System.Collections;
- using System.Web;
- using System.Web.Caching;
- using DotNet.Utilities;
- using Solution.DataAccess.DataModel;
- using Solution.Logic.Managers;
- namespace Solution.Web.Managers.WebManage
- {
- public partial class Login : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!IsPostBack)
- {
- //进入登陆页面时判断是否是后台直接点击退出的,是的话加退出记录
- LoginLogBll.GetInstence().UserExit();
- #region 初始化用户Session变量
- //在线用户生成的session标识
- Session["UserHashKey"] = null;
- //当前用户可访问的页面
- Session["PagePower"] = null;
- //当前用户页面中可使用的按钮控件
- Session["ControlPower"] = null;
- #endregion
- }
- }
- /// <summary>登录</summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- protected void BtnLogin_Click(object sender, EventArgs e)
- {
- var ip = IpHelper.GetUserIp();
- #region 获取用户输入的参数,并进行数据初步处理
- //获取用户名,并进行危险字符过滤
- var username = StringHelper.Left(txtusername.Text, );
- //获取用户密码
- var userpass = txtpass.Text;
- //获取验证码
- var strCode = StringHelper.Left(txtcode.Text, );
- #endregion
- #region 初步验证
- //开发测试使用,不用每次都输入帐号与密码
- //username = "admin";
- //userpass = "admin";
- //strCode = "12345";
- //用户名验证
- if (string.IsNullOrEmpty(username.Trim()))
- {
- txtusername.Focus();
- JsHelper.Alert("用户名不能为空,请仔细检查您输入的用户名!");
- return;
- }
- //密码验证
- if (string.IsNullOrEmpty(userpass.Trim()))
- {
- txtpass.Focus();
- JsHelper.Alert("密码不能为空,请仔细检查您输入的密码!");
- return;
- }
- //验证码验证
- if (string.IsNullOrEmpty(strCode))
- {
- txtcode.Focus();
- JsHelper.Alert("验证码不能为空!");
- return;
- }
- //判断验证码是否正确
- if (Session["vcode"] == null || !Session["vcode"].ToString().Equals(strCode, StringComparison.InvariantCultureIgnoreCase))
- {
- SessionHelper.RemoveSession("vcode");
- txtpass.Focus();
- JsHelper.Alert("验证码错误!");
- return;
- }
- else
- {
- //验证码正确,删除验证码Session
- SessionHelper.RemoveSession("vcode");
- }
- #endregion
- #region 数据库验证
- //通过用户给的用户名获取相关实体类
- var userinfo = Manager.SingleOrDefault(x => x.LoginName == username);
- //判断用户是否存在
- if (userinfo == null)
- {
- LoginLogBll.GetInstence().Save(, "账号【" + username + "】不存在,登录失败!");
- txtusername.Focus();
- JsHelper.Alert("用户名不存在,请仔细检查您输入的用户名!");
- return;
- }
- //密码不匹配
- if (!userinfo.LoginPass.Equals(Encrypt.Md5(Encrypt.Md5(userpass))))
- {
- LoginLogBll.GetInstence().Save(userinfo.Id, "账号【" + userinfo.LoginName + "】的用户【" + userinfo.CName + "】登录失败!登录密码错误。");
- txtpass.Focus();
- JsHelper.Alert("您输入的用户密码错误!");
- return;
- }
- if (userinfo.IsWork == )
- {
- //添加用户登陆日志
- LoginLogBll.GetInstence().Save(userinfo.Id, "离职用户登录失败!用户【" + userinfo.CName + "】试图登录系统");
- JsHelper.Alert("您已经没有权限登录本系统!");
- return;
- }
- //判断当前账号是否被启用
- if (userinfo.IsEnable == )
- {
- //添加登录日志记录
- LoginLogBll.GetInstence().Save(userinfo.Id, "账号【" + userinfo.LoginName + "】的用户【" + userinfo.CName + "】登录失败!用户账号被禁用。");
- JsHelper.Alert("当前账号未被启用,请联系管理人员激活!");
- return;
- }
- #endregion
- #region 存储在线用户资料
- #region 获取用户操作权限
- if (string.IsNullOrEmpty(userinfo.Position_Id))
- {
- Session["PagePower"] = "";
- Session["ControlPower"] = "";
- LoginLogBll.GetInstence().Save(, "账号【" + username + "】未绑定职位,请管理员进行配置!");
- JsHelper.Alert("您的账号未绑定职位,请与管理员联系!");
- return;
- }
- else
- {
- //获取用户权限并存储到用户Session里
- PositionBll.GetInstence().SetUserPower(userinfo.Position_Id);
- }
- #endregion
- #region 当前用户在线信息
- //当前时间
- var localTime = DateTime.Now.ToLocalTime();
- //创建客户端信息获取实体
- var clientHelper = new ClientHelper(Request);
- //创建在线用户实体
- var onlineUser = new Solution.DataAccess.Model.OnlineUsers();
- //当前用户的Id编号
- onlineUser.Manager_Id = userinfo.Id;
- onlineUser.Manager_LoginName = userinfo.LoginName;
- onlineUser.Manager_LoginPass = userinfo.LoginPass;
- onlineUser.Manager_CName = userinfo.CName;
- onlineUser.LoginTime = localTime;
- onlineUser.LoginIp = ip;
- //生成密钥
- onlineUser.UserKey = RandomHelper.GetRndNum(, true);
- //Md5(密钥+登陆帐号+密码+IP+密钥.Substring(6,8))
- onlineUser.Md5 =
- Encrypt.Md5(onlineUser.UserKey + onlineUser.Manager_LoginName + onlineUser.Manager_LoginPass +
- onlineUser.LoginIp + onlineUser.UserKey.Substring(, ));
- onlineUser.UpdateTime = localTime;
- onlineUser.Sex = userinfo.Sex;
- onlineUser.Branch_Id = userinfo.Branch_Id;
- onlineUser.Branch_Code = userinfo.Branch_Code;
- onlineUser.Branch_Name = userinfo.Branch_Name;
- onlineUser.Position_Id = userinfo.Position_Id;
- onlineUser.Position_Name = userinfo.Position_Name;
- onlineUser.CurrentPage = "";
- onlineUser.CurrentPageTitle = "";
- //SessionId
- onlineUser.SessionId = Session.SessionID;
- onlineUser.UserAgent = StringHelper.FilterSql(HttpContext.Current.Request.Headers["User-Agent"] + "");
- onlineUser.OperatingSystem = clientHelper.GetSystem();
- onlineUser.TerminalType = clientHelper.IsMobileDevice(onlineUser.UserAgent) ? : ;
- onlineUser.BrowserName = clientHelper.GetBrowserName();
- onlineUser.BrowserVersion = clientHelper.GetBrowserVersion();
- #endregion
- #region 记录当前用户UserId
- //定义HashTable表里Key的名称UserId
- string userHashKey = "";
- //判断当前用户帐户是否支持同一帐号在不同地方登陆功能,取得用户在HashTable表里Key的名称
- //不支持则
- if (userinfo.IsMultiUser == )
- {
- userHashKey = userinfo.Id + "";
- }
- //支持则
- else
- {
- userHashKey = userinfo.Id + "_" + onlineUser.SessionId;
- }
- //记录用户的HashTable Key
- onlineUser.UserHashKey = userHashKey;
- Session["UserHashKey"] = userHashKey;
- #endregion
- #region 将在线用户信息存入全局变量中
- //运行在线数据加载函数,如果缓存不存在,则尝试加载数据库中的在线表记录到缓存中
- //——主要用于IIS缓存被应用程序池或其他原因回收后,对在线数据进行重新加载,而不会使所有用户都被迫退出系统
- OnlineUsersBll.GetInstence().Load();
- //判断缓存中["OnlineUsers"]是否存在,不存在则直接将在线实体添加到缓存中
- if (CacheHelper.GetCache("OnlineUsers") == null)
- {
- //将当前用户信息添加到Hashtable中
- var hashtable = new Hashtable();
- hashtable.Add(userHashKey, onlineUser);
- //将在线列表(Hashtable)添中进系统缓存中
- CacheHelper.SetCache("OnlineUsers", hashtable);
- }
- //存在则将它取出HashTable并进行处理
- else
- {
- //直接从缓存中读取在线列表数据
- var hashtable = (Hashtable)CacheHelper.GetCache("OnlineUsers");
- //判断当前用户是否存在在线表中,不存在则直接将当前用户的实体对象存储进HashTable
- if (hashtable[userHashKey] == null || hashtable.Count == )
- {
- hashtable.Add(userHashKey, onlineUser);
- }
- //存在则
- else
- {
- //添加用户下线记录
- LoginLogBll.GetInstence().Save(userHashKey, "用户【{0}】的账号已经在另一处登录,本次登陆下线!在线时间【{1}】");
- //将HashTable里存储的前一登陆帐户移除
- OnlineUsersBll.GetInstence().Delete(this, x => x.UserHashKey == userHashKey);
- //移除缓存中的记录
- hashtable.Remove(userHashKey);
- //将当前用户的实体对象存进在线缓存中
- hashtable.Add(userHashKey, onlineUser);
- }
- }
- //将在线实体保存到数据库的在线表中
- OnlineUsersBll.GetInstence().Save(this, OnlineUsersBll.GetInstence().Transform(onlineUser));
- //将用户信息表添加到缓存中,并且以150秒的轮询用户在线情况
- //new PageBase().OnRemovedCallback为缓存回调函数,用于缓存失效、过期、删除或回收时,所触发的回调函数,执行相应操作
- //缓存Key的前面加了"OnlineUsers_"标识,主要是用于清空缓存时区分用户缓存和其他系统缓存,不会将在线用户都清除下线
- HttpRuntime.Cache.Insert("OnlineUsers_" + userHashKey, userHashKey, null, DateTime.MaxValue, TimeSpan.FromSeconds(), CacheItemPriority.Default, new CacheItemRemovedCallback(OnRemovedCallback));
- //更新在线列表数据,将不在线人员删除
- OnlineUsersBll.GetInstence().UpdateUserOnlineCount();
- #endregion
- #endregion
- #region 更新用户登陆信息
- userinfo.LoginIp = ip;
- userinfo.LoginCount = userinfo.LoginCount++;
- userinfo.LoginTime = localTime;
- ManagerBll.GetInstence().Save(this, userinfo, string.Format("用户【{0}】登陆成功,更新登陆信息", userinfo.CName));
- #endregion
- #region 添加用户登录成功日志
- LoginLogBll.GetInstence().Save(userHashKey, string.Format("账号【{0}】的用户【{1}】登录成功", userinfo.LoginName, userinfo.CName));
- #endregion
- #region 写Cookies
- //写入用户的HashTable Key
- CookieHelper.SetCookie(OnlineUsersTable.UserHashKey, userHashKey);
- //写入加密值
- CookieHelper.SetCookie(OnlineUsersTable.Md5, onlineUser.Md5);
- #endregion
- //跳转进入主页面
- Response.Redirect("MainPage.aspx");
- }
- #region 缓存回调函数
- /// <summary>
- /// 缓存回调函数,用于缓存失效、过期、删除或回收时,所触发的回调函数,执行相应操作
- /// </summary>
- /// <param name="key">缓存Key</param>
- /// <param name="value">缓存值</param>
- /// <param name="reason">触发的原因</param>
- public void OnRemovedCallback(string key, object value, CacheItemRemovedReason reason)
- {
- if (key == null || value == null)
- return;
- //更新在线列表数据,将不在线人员删除
- OnlineUsersBll.GetInstence().UpdateUserOnlineCount();
- //switch (reason)
- //{
- // //相关联的缓存已经失效
- // case CacheItemRemovedReason.DependencyChanged:
- // break;
- // //当前用户缓存已过期
- // case CacheItemRemovedReason.Expired:
- // //更新在线列表数据,将不在线人员删除
- // OnlineUsersBll.UpdateUserOnlineCount();
- // break;
- // //当前用户已被删除
- // case CacheItemRemovedReason.Removed:
- // break;
- // //系统释放内存自动回收当前用户
- // case CacheItemRemovedReason.Underused:
- // //更新在线列表数据,将不在线人员删除
- // OnlineUsersBll.UpdateUserOnlineCount();
- // break;
- //}
- }
- #endregion
- }
- }
后端登陆页面界面随便在网上找了个改了一下,弄得很简陋,大家如果有好的UI可以发到我邮箱,我下次更新上去O(∩_∩)O
点击下载:
由于框架不是非常成熟,很多朋友不是用来学习而是直接用到项目中,但不熟悉框架引起不少小问题,所以停止提供下载,有需要学习的可以到群共享里下,不便之处敬请谅解。
版权声明:
本文由AllEmpty原创并发布于博客园,欢迎转载,未经本人同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如有问题,可以通过1654937@qq.com 联系我,非常感谢。
发表本编内容,只要主为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:327360708 ,大家一起探讨。
更多内容,敬请观注博客:http://www.cnblogs.com/EmptyFS/
从零开始编写自己的C#框架(15)——Web层后端登陆功能的更多相关文章
- 从零开始编写自己的C#框架(1)——前言
记得十五年前自学编程时,拿着C语言厚厚的书,想要上机都不知道要用什么编译器来执行书中的例子.十二年前在大学自学ASP时,由于身边没有一位同学和朋友学习这种语言,也只能整天混在图收馆里拼命的啃书.而再后 ...
- 从零开始编写自己的C#框架 ---- 系列文章
目录: 从零开始编写自己的C#框架(1)——前言从零开始编写自己的C#框架(2)——开发前的准备工作从零开始编写自己的C#框架(3)——开发规范从零开始编写自己的C#框架(4)——文档编写说明从零开始 ...
- 从零开始编写自己的C#框架(17)——Web层后端首页
后端首页是管理员登陆后进入的第一个页面,主要是显示当前登陆用户信息.在线人数.菜单树列表.相关功能按键和系统介绍.让管理员能更方便的找到息想要的内容. 根据不同系统的需要,首页会显示不同的内容,比如显 ...
- 从零开始编写自己的C#框架(25)——网站部署 【转】
服务器安全部署文档 目录1. 前言.. 3 2. 部署环境.. 3 2.1 服务器环境信息.. 3 3. 磁盘阵列配置.. 4 4. 安装操作系统.. ...
- 从零开始编写自己的C#框架(25)——网站部署
导航 1.关掉访问保护 2.发布网站 3.复制网站到服务器 4.添加新网站 5.设置网站访问权限 6.设置文件夹访问权限 7.控制可更新文件夹执行权限 8.设置“应用程序池”.net版本与模式 9.附 ...
- 从零开始编写自己的C#框架(8)——后台管理系统功能设计
还是老规矩先吐下槽,在规范的开发过程中,这个时候应该是编写总体设计(概要设计)的时候,不过对于中小型项目来说,过于规范的遵守软件工程,编写太多文档也会拉长进度,一般会将它与详细设计合并到一起来处理,所 ...
- 从零开始编写自己的C#框架(26)——小结
一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...
- 从零开始编写自己的C#框架(20)——框架异常处理及日志记录
最近很忙,杂事也多,所以开发本框架也是断断续续的,终于在前两天将前面设定的功能都基本完成了,剩下一些小功能遗漏的以后发现再补上.接下来的章节主要都是讲解在本框架的基础上进行开发的小巧. 本框架主要有四 ...
- 从零开始编写自己的C#框架(11)——创建解决方案
这段时间一直在充电,拜读了园子中大神们的博文(wayfarer的<设计之道>.TerryLee的<.NET设计模式系列文章>.卡奴达摩的<设计模式>还有其他一些零散 ...
随机推荐
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)
建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...
- Android Ormlite 学习笔记1 -- 基础
Ormlite 是一个开源Java数据实体映射框架.其中依赖2个核心类库: 1.ormlite-android-4.48.jar 2.ormlite-core-4.48.jar 新建项目,引用上面2个 ...
- Mysql命令大全
格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输 ...
- mysql 5.7中的用户权限分配相关解读!
这篇文章主要介绍了MySQL中基本的用户和权限管理方法,包括各个权限所能操作的事务以及操作权限的一些常用命令语句,是MySQL入门学习中的基础知识,需要的朋友可以参考下 一.简介 各大帖子及文章都会讲 ...
- Hadoop
Hadoop应用场景 Hadoop是专为离线处理和大规模数据分析而设计的,它并不适合那种对几个记录随机读写的在线事务处理模式. 大数据存储:Hadoop最适合一次写入.多次读取的数据存储需求,如数据仓 ...
- Mono on CentOS 6.3 安装笔记
在网上找到篇关于yum的文章,写的很详细特此推荐下,在阅读本文之前建议先看看它: <CentOS yum源的配置与使用> 如果用的是移动光驱,建议不要开启本地的yum 的本地reposit ...
- Jexus Web Server 完全傻瓜化图文配置教程(基于Ubuntu 12.04.3 64位)[内含Hyper-v 2012虚拟机镜像下载地址]
1. 前言 近日有感许多新朋友想尝试使用Jexus,不过绝大多数都困惑徘徊在Linux如何安装啊,如何编译Mono啊,如何配置Jexus啊...等等基础问题,于是昨日向宇内流云兄提议,不如搞几个配置好 ...
- DoraCMS 源码知识点备注
项目需要研究了下DoraCMS这款开源CMS,真心做的不错:).用的框架是常用的express 4 + mongoose,代码也很规范,值得学习. 源码中一些涉及到的小知识点备注下: https:// ...
- Lesson 18 He often does this!
Text After I had had lunch at a village pub, I looked for my bag. I had left it on a chair beside th ...