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

  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(); };
  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>

  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') = )
  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 (, ) NOT NULL,
  9. [LoginName] [nvarchar] () NOT NULL,
  10. [LoginPass] [nvarchar] () NOT NULL,
  11. [LoginTime] [datetime] NOT NULL,
  12. [LoginIp] [nvarchar] () 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] () NOT NULL,
  19. [Branch_Name] [nvarchar] () NOT NULL,
  20. [Position_Id] [nvarchar] () NOT NULL,
  21. [Position_Name] [nvarchar] () NOT NULL,
  22. [IsWork] [tinyint] NOT NULL,
  23. [IsEnable] [tinyint] NOT NULL,
  24. [CName] [nvarchar] () NOT NULL,
  25. [EName] [nvarchar] () NOT NULL,
  26. [PhotoImg] [nvarchar] () NOT NULL,
  27. [Sex] [nvarchar] () NOT NULL,
  28. [Birthday] [nvarchar] () NOT NULL,
  29. [NativePlace] [nvarchar] () NOT NULL,
  30. [NationalName] [nvarchar] () NOT NULL,
  31. [Record] [nvarchar] () NOT NULL,
  32. [GraduateCollege] [nvarchar] () NOT NULL,
  33. [GraduateSpecialty] [nvarchar] () NOT NULL,
  34. [Tel] [nvarchar] () NOT NULL,
  35. [Mobile] [nvarchar] () NOT NULL,
  36. [Email] [nvarchar] () NOT NULL,
  37. [Qq] [nvarchar] () NOT NULL,
  38. [Msn] [nvarchar] () NOT NULL,
  39. [Address] [nvarchar] () NOT NULL,
  40. [Content] [ntext] NOT NULL,
  41. [Manager_Id] [int] NOT NULL,
  42. [Manager_CName] [nvarchar] () 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 () 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 () FOR [IsMultiUser],
  62. CONSTRAINT [DF_Manager_Branch_Id] DEFAULT () 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 () FOR [IsWork],
  68. CONSTRAINT [DF_Manager_IsEnable] DEFAULT () 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 () 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') = )
  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 (, ) NOT NULL,
  239. [UserHashKey] [nvarchar] () NOT NULL,
  240. [Manager_Id] [int] NOT NULL,
  241. [Manager_LoginName] [nvarchar] () NOT NULL,
  242. [Manager_LoginPass] [nvarchar] () NOT NULL,
  243. [Manager_CName] [nvarchar] () NOT NULL,
  244. [LoginTime] [datetime] NOT NULL,
  245. [LoginIp] [nvarchar] () NOT NULL,
  246. [UserKey] [nvarchar] () NOT NULL,
  247. [Md5] [nvarchar] () NOT NULL,
  248. [UpdateTime] [datetime] NOT NULL,
  249. [Sex] [nvarchar] () NOT NULL,
  250. [Branch_Id] [int] NOT NULL,
  251. [Branch_Code] [nvarchar] () NOT NULL,
  252. [Branch_Name] [nvarchar] () NOT NULL,
  253. [Position_Id] [nvarchar] () NOT NULL,
  254. [Position_Name] [nvarchar] () NOT NULL,
  255. [CurrentPage] [nvarchar] () NOT NULL,
  256. [CurrentPageTitle] [nvarchar] () NOT NULL,
  257. [SessionId] [nvarchar] () NOT NULL,
  258. [UserAgent] [nvarchar] () NOT NULL,
  259. [OperatingSystem] [nvarchar] () NOT NULL,
  260. [TerminalType] [int] NOT NULL,
  261. [BrowserName] [nvarchar] () NOT NULL,
  262. [BrowserVersion] [nvarchar] () 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 () 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 () 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 () 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

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

  1. --添加部门记录
  2. INSERT INTO Branch (Code, Name, Notes, ParentId, Sort, Depth, Manager_Id, Manager_CName)
  3. VALUES ('', '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, '', 'XX公司', '', '', 1, '', 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, '', 'XX公司', '', '软件开发工程师', 1, 1, 'admin', 'admin', '男', 1, 'admin')
  14. GO

  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, );
  42. //获取用户密码
  43. var userpass = txtpass.Text;
  44. //获取验证码
  45. var strCode = StringHelper.Left(txtcode.Text, );
  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(, "账号【" + 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 == )
  115. {
  116. //添加用户登陆日志
  117. LoginLogBll.GetInstence().Save(userinfo.Id, "离职用户登录失败!用户【" + userinfo.CName + "】试图登录系统");
  118. JsHelper.Alert("您已经没有权限登录本系统!");
  119. return;
  120. }
  121.  
  122. //判断当前账号是否被启用
  123. if (userinfo.IsEnable == )
  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(, "账号【" + 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(, 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(, ));
  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) ? : ;
  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 == )
  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 == )
  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(), 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. }

  后端登陆页面界面随便在网上找了个改了一下,弄得很简陋,大家如果有好的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. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

  2. 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)

    建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...

  3. Android Ormlite 学习笔记1 -- 基础

    Ormlite 是一个开源Java数据实体映射框架.其中依赖2个核心类库: 1.ormlite-android-4.48.jar 2.ormlite-core-4.48.jar 新建项目,引用上面2个 ...

  4. Mysql命令大全

    格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输 ...

  5. mysql 5.7中的用户权限分配相关解读!

    这篇文章主要介绍了MySQL中基本的用户和权限管理方法,包括各个权限所能操作的事务以及操作权限的一些常用命令语句,是MySQL入门学习中的基础知识,需要的朋友可以参考下 一.简介 各大帖子及文章都会讲 ...

  6. Hadoop

    Hadoop应用场景 Hadoop是专为离线处理和大规模数据分析而设计的,它并不适合那种对几个记录随机读写的在线事务处理模式. 大数据存储:Hadoop最适合一次写入.多次读取的数据存储需求,如数据仓 ...

  7. Mono on CentOS 6.3 安装笔记

    在网上找到篇关于yum的文章,写的很详细特此推荐下,在阅读本文之前建议先看看它: <CentOS yum源的配置与使用> 如果用的是移动光驱,建议不要开启本地的yum 的本地reposit ...

  8. Jexus Web Server 完全傻瓜化图文配置教程(基于Ubuntu 12.04.3 64位)[内含Hyper-v 2012虚拟机镜像下载地址]

    1. 前言 近日有感许多新朋友想尝试使用Jexus,不过绝大多数都困惑徘徊在Linux如何安装啊,如何编译Mono啊,如何配置Jexus啊...等等基础问题,于是昨日向宇内流云兄提议,不如搞几个配置好 ...

  9. DoraCMS 源码知识点备注

    项目需要研究了下DoraCMS这款开源CMS,真心做的不错:).用的框架是常用的express 4 + mongoose,代码也很规范,值得学习. 源码中一些涉及到的小知识点备注下: https:// ...

  10. 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 ...