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

  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层后端登陆功能的更多相关文章

  1. 从零开始编写自己的C#框架(1)——前言

    记得十五年前自学编程时,拿着C语言厚厚的书,想要上机都不知道要用什么编译器来执行书中的例子.十二年前在大学自学ASP时,由于身边没有一位同学和朋友学习这种语言,也只能整天混在图收馆里拼命的啃书.而再后 ...

  2. 从零开始编写自己的C#框架 ---- 系列文章

    目录: 从零开始编写自己的C#框架(1)——前言从零开始编写自己的C#框架(2)——开发前的准备工作从零开始编写自己的C#框架(3)——开发规范从零开始编写自己的C#框架(4)——文档编写说明从零开始 ...

  3. 从零开始编写自己的C#框架(17)——Web层后端首页

    后端首页是管理员登陆后进入的第一个页面,主要是显示当前登陆用户信息.在线人数.菜单树列表.相关功能按键和系统介绍.让管理员能更方便的找到息想要的内容. 根据不同系统的需要,首页会显示不同的内容,比如显 ...

  4. 从零开始编写自己的C#框架(25)——网站部署 【转】

    服务器安全部署文档 目录1.     前言.. 3 2.     部署环境.. 3 2.1         服务器环境信息.. 3 3.     磁盘阵列配置.. 4 4.     安装操作系统.. ...

  5. 从零开始编写自己的C#框架(25)——网站部署

    导航 1.关掉访问保护 2.发布网站 3.复制网站到服务器 4.添加新网站 5.设置网站访问权限 6.设置文件夹访问权限 7.控制可更新文件夹执行权限 8.设置“应用程序池”.net版本与模式 9.附 ...

  6. 从零开始编写自己的C#框架(8)——后台管理系统功能设计

    还是老规矩先吐下槽,在规范的开发过程中,这个时候应该是编写总体设计(概要设计)的时候,不过对于中小型项目来说,过于规范的遵守软件工程,编写太多文档也会拉长进度,一般会将它与详细设计合并到一起来处理,所 ...

  7. 从零开始编写自己的C#框架(26)——小结

    一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...

  8. 从零开始编写自己的C#框架(20)——框架异常处理及日志记录

    最近很忙,杂事也多,所以开发本框架也是断断续续的,终于在前两天将前面设定的功能都基本完成了,剩下一些小功能遗漏的以后发现再补上.接下来的章节主要都是讲解在本框架的基础上进行开发的小巧. 本框架主要有四 ...

  9. 从零开始编写自己的C#框架(11)——创建解决方案

    这段时间一直在充电,拜读了园子中大神们的博文(wayfarer的<设计之道>.TerryLee的<.NET设计模式系列文章>.卡奴达摩的<设计模式>还有其他一些零散 ...

随机推荐

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. JavaScript Array对象

    介绍Js的Array 数组对象. 目录 1. 介绍:介绍 Array 数组对象的说明.定义方式以及属性. 2. 实例方法:介绍 Array 对象的实例方法:concat.every.filter.fo ...

  3. React在开发中的常用结构以及功能详解

    一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...

  4. Linux 常用命令(持续补充)

    常用命令: command &:将进程放在后台执行 ctrl + z:暂停当前进程 并放入后台 jobs:查看当前后台任务 bg( %id):将任务转为后台执行 fg( %id):将任务调回前 ...

  5. javascript动画系列第四篇——拖拽改变元素大小

    × 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位 ...

  6. 浅谈JSP中include指令与include动作标识的区别

    JSP中主要包含三大指令,分别是page,include,taglib.本篇主要提及include指令. include指令使用格式:<%@ include file="文件的绝对路径 ...

  7. Android中的多线程断点下载

    首先来看一下多线程下载的原理.多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序"拼接"起来就 ...

  8. 如何获取url中的参数并传递给iframe中的报表

    在使用报表软件时,用户系统左边一般有目录树,点击报表节点就会在右侧网页的iframe中显示出报表,同时点击的时候也会传递一些参数给网页,比如时间和用户信息等.如何使网页中的报表能够获取到传递过来的参数 ...

  9. BZOJ 2119: 股市的预测 [后缀数组 ST表]

    2119: 股市的预测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 331  Solved: 153[Submit][Status][Discuss ...

  10. 【原】npm 常用命令详解

    今年上半年在学习gulp的使用,对npm的掌握是必不可少的,经常到npm官网查询文档让我感到不爽,还不如整理了一些常用的命令到自己博客上,于是根据自己的理解简单翻译过来,终于有点输出,想学习npm这块 ...