上一次介绍的了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=\"470px;height:300px;overflow:hidden;\">"); sb.Append("<table style=\"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=\"150px;text-align:right\">用户名:</td>"); sb.Append("<td><input id=\"txtUserName\" class=\"easyui-textbox\" data-options=\"iconAlign:'left',iconCls:'eu-icon-user'\" style=\"200px;height:26px;\"></td>"); sb.Append("</tr>"); sb.Append("<tr style=\"height:35px;\">"); sb.Append("<td style=\"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=\"200px;height:26px;\"></td>"); sb.Append("</tr>"); sb.Append("<tr style=\"height:35px;\">"); sb.Append("<td style=\"150px;text-align:right\">验证码:</td>"); sb.Append("<td><table><tr><td><input id=\"txtValidate\" class=\"easyui-textbox\" style=\"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 }
用户扩展类的使用方法:
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框架基础上搭建一个新系统,祝生活愉快!