上一次介紹的了Rookey.Frame v1.0快速開發平臺的整體功能,接下來會對各個功能點進行解析說明,今天給大家介紹下系統登錄功能。 用戶登錄 系統中基本上所有功能頁面都是從後臺代碼拼接後返回的,登錄頁面也不例外,請看下圖: 接下來看下後臺登錄的HTML: /// <summary> /// 獲
上一次介紹的了Rookey.Frame v1.0快速開發平臺的整體功能,接下來會對各個功能點進行解析說明,今天給大家介紹下系統登錄功能。
用戶登錄
系統中基本上所有功能頁面都是從後臺代碼拼接後返回的,登錄頁面也不例外,請看下圖:
接下來看下後臺登錄的HTML:
/// <summary> /// 獲取登錄頁面 /// </summary> /// <returns></returns> public override string GetLoginHTML() { StringBuilder sb = new StringBuilder(); sb.Append("<script type=\"text/javascript\" src=\"/Scripts/common/Login.js\"></script>"); sb.Append("<div id=\"w\" class=\"easyui-dialog\" title=\"登錄視窗\" data-options=\"iconCls:'eu-icon-password',closable:false,modal:true,buttons:[{id:'btnLogin',text:'登錄',iconCls:'eu-icon-ok',handler:function(){DoLogin();}},{text:'關閉',iconCls:'eu-icon-close',handler:function(){Close();}}]\" style=\"width:470px;height:300px;overflow:hidden;\">"); sb.Append("<table style=\"width:100%;\">"); sb.Append("<tr><td colspan=\"2\"><img src=\"/Images/Login/login_head.png\" /></td></tr>"); sb.Append("<tr style=\"height:20px;\"><td colspan=\"2\"> </td></tr>"); sb.Append("<tr style=\"height:35px;\">"); sb.Append("<td style=\"width:150px;text-align:right\">用戶名:</td>"); sb.Append("<td><input id=\"txtUserName\" class=\"easyui-textbox\" data-options=\"iconAlign:'left',iconCls:'eu-icon-user'\" style=\"width:200px;height:26px;\"></td>"); sb.Append("</tr>"); sb.Append("<tr style=\"height:35px;\">"); sb.Append("<td style=\"width:150px;text-align:right\">密 碼:</td>"); sb.Append("<td><input id=\"txtPwd\" type=\"password\" class=\"easyui-textbox\" data-options=\"iconAlign:'left',iconCls:'eu-icon-password'\" style=\"width:200px;height:26px;\"></td>"); sb.Append("</tr>"); sb.Append("<tr style=\"height:35px;\">"); sb.Append("<td style=\"width:150px;text-align:right\">驗證碼:</td>"); sb.Append("<td><table><tr><td><input id=\"txtValidate\" class=\"easyui-textbox\" style=\"width:125px;height:26px;\"></td><td><img id=\"validate\" onclick=\"this.src=this.src+'?'\" src=\"/Security/ValidateCode.html\" style=\"cursor: pointer; border: 1px solid #ddd\" alt=\"看不清楚,換一張\" title=\"看不清楚,換一張\" /></td></tr></table></td>"); sb.Append("</tr>"); sb.Append("</table>"); sb.Append("</div>"); sb.Append("<script type=\"text/javascript\">$(function (){$('#w').dialog('open');</script>"); return sb.ToString(); }
登錄方式採用AJAX請求登錄,針對登錄頁面有個專門的js文件Login.js做登錄處理,在初始化的時候細節處理見下圖:
下麵為登錄方法:
接下來看下後臺登錄處理,系統中基本上每個控制器都有同步和非同步兩個,不管採用哪個都可以,用戶控制器也一樣
/// <summary> /// 用戶控制器(非同步) /// </summary> public class UserAsyncController : AsyncController /// <summary> /// 用戶控制器 /// </summary> public class UserController : Controller
登錄代碼見下圖:
登錄擴展
在上一節中有一個Demo程式,是基於Rookey.Frame 1.0開發的一個示例應用程式Rookey.Demo,在Rookey.Demo只需要引用相關的DLL和簡單的配置即可擁有Rookey.Frame 1.0所有功能,同時也是完全獨立的系統,這樣框架的復用性就比較強,同時就要示框架擴展性比較強;對於每個系統都會緩存一些全局信息如用戶信息,同時每個系統要求緩存的用戶信息可能是不一樣的,有的需要顯示用戶的部門、崗位等信息,有的卻不需要顯示,這時就需要系統具有對用戶擴展能力才能保證框架適用於各種不同的系統,在Rookey.Frame 1.0框架中除了基本的用戶信息類外還提供了擴展用戶類,下麵為框架的用戶信息類:
/// <summary> /// 用戶類 /// </summary> public sealed class UserInfo { #region 當前賬戶 /// <summary> /// 互斥鎖 /// </summary> private static object locker = new object(); /// <summary> /// 當前賬戶信息 /// </summary> public static UserInfo CurrentUserInfo { get { lock (locker) { FormsIdentity identity = ApplicationObject.CurrentHttpContext.User.Identity as FormsIdentity; if (identity != null) { string[] token = identity.Ticket.UserData.Split("___".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); //取用戶基本信息 UserInfo userInfo = JsonHelper.Deserialize<UserInfo>(token[0]); if (token.Length > 1) { //取用戶擴展信息 Type extendType = null; ICacheProvider cacheFactory = CacheFactory.GetCacheInstance(CacheProviderType.LOCALMEMORYCACHE); if (cacheFactory == null || cacheFactory.Get<Type>("UserExtendType") == null) { string binPath = Globals.GetBinPath(); string dllPath = string.Format(@"{0}{1}", binPath, token[2]); if (File.Exists(dllPath)) { Assembly assembly = Assembly.LoadFrom(dllPath); extendType = assembly.GetTypes().Where(x => x.Name == token[3]).FirstOrDefault(); if (extendType != null) { cacheFactory.Set<Type>("UserExtendType", extendType); //擴展對象類型存入緩存 } } } else //擴展對象類型從緩存中取 { extendType = cacheFactory.Get<Type>("UserExtendType"); } if (extendType != null) { //反序列化用戶擴展對象 object obj = Globals.Deserialize(extendType, token[1]); userInfo.ExtendUserObject = obj as UserExtendBase; } } return userInfo; } return null; } } } #endregion #region 構造函數 public UserInfo() { ClientBrowserWidth = 0; ClientBrowserHeight = 0; } #endregion #region 屬性 /// <summary> /// 用戶Id /// </summary> public long UserId { get; set; } /// <summary> /// 用戶名 /// </summary> public string UserName { get; set; } /// <summary> /// 用戶別名 /// </summary> public string AliasName { get; set; } /// <summary> /// 所屬組織 /// </summary> public long? OrganizationId { get; set; } /// <summary> /// 客戶端IP /// </summary> public string ClientIP { get; set; } /// <summary> /// 擴展用戶對象 /// </summary> public UserExtendBase ExtendUserObject { get; set; } #region 客戶端參數 /// <summary> /// 客戶端瀏覽器可見區域寬 /// </summary> public int ClientBrowserWidth { get; set; } /// <summary> /// 客戶端瀏覽器可見區域高 /// </summary> public int ClientBrowserHeight { get; set; } #endregion #endregion #region 靜態方法 /// <summary> /// 獲取當前用戶別名 /// </summary> /// <returns></returns> public static string GetUserAliasName() { if (string.IsNullOrWhiteSpace(CurrentUserInfo.AliasName)) { return CurrentUserInfo.UserName; } return CurrentUserInfo.AliasName; } /// <summary> /// 當前用戶是否為超級管理員 /// </summary> /// <returns></returns> public static bool IsSuperAdmin() { return CurrentUserInfo != null && CurrentUserInfo.UserName == "admin"; } #endregion }View Code
用戶擴展類的使用方法:
1.添加用戶擴展類,如下示例
/// <summary> /// 用戶擴展對象 /// </summary> public class UserExtendObject : UserExtendBase { /// <summary> /// 當前用戶所屬部門 /// </summary> public string DeptName { get; set; } /// <summary> /// 當前用戶職務 /// </summary> public string DutyName { get; set; } }
2.添加用戶擴展處理類,如下示例
/// <summary> /// 用戶擴展對象處理 /// </summary> public static class UserExtendHandle { /// <summary> /// 獲取用戶擴展信息 /// </summary> /// <param name="o"></param> /// <param name="e"></param> /// <returns></returns> public static UserExtendObject GetUserExtendObject(object o, EventUserArgs e) { UserExtendObject obj = new UserExtendObject() { DeptName = string.Empty, DutyName = string.Empty }; return obj; } }
3.在Global.asax.cs程式池啟動方法Application_Start中添加以下代碼即可
//用戶擴展對象 UserEventHandler.BindUserLoginEvent += new UserEventHandler.EventUserLogin(UserExtendHandle.GetUserExtendObject);
今天就介紹到這裡,下次將介紹如果在Rookey.Frame 1.0框架基礎上搭建一個新系統,祝生活愉快!