上一次介绍的了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\">&nbsp;</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\">密&nbsp;&nbsp;&nbsp;码:</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[]);
if (token.Length > )
{
//取用户扩展信息
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[]);
if (File.Exists(dllPath))
{
Assembly assembly = Assembly.LoadFrom(dllPath);
extendType = assembly.GetTypes().Where(x => x.Name == token[]).FirstOrDefault();
if (extendType != null)
{
cacheFactory.Set<Type>("UserExtendType", extendType); //扩展对象类型存入缓存
}
}
}
else //扩展对象类型从缓存中取
{
extendType = cacheFactory.Get<Type>("UserExtendType");
}
if (extendType != null)
{
//反序列化用户扩展对象
object obj = Globals.Deserialize(extendType, token[]);
userInfo.ExtendUserObject = obj as UserExtendBase;
}
}
return userInfo;
}
return null;
}
}
} #endregion #region 构造函数 public UserInfo()
{
ClientBrowserWidth = ;
ClientBrowserHeight = ;
} #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框架基础上搭建一个新系统,祝生活愉快!

Rookey.Frame v1.0快速开发平台-用户登录的更多相关文章

  1. Rookey.Frame v1.0快速开发平台-整体介绍

    Rookey.Frame v1.0是一套基于.NET MVC的极速开发框架,支持简单逻辑模块零代码编程.支持二次开发,具有高扩展性.高复用性.高伸缩性. 框架特点 (1)简单逻辑模块实现零代码编程,通 ...

  2. Rookey.Frame v1.0极速开发平台稳定版发布

    Rookey.Frame v1.0经过一年时间的修改及沉淀,稳定版终于问世了,此版本经过上线系统验证,各个功能点都经过终端用户验证并持续优化,主要优化以下几个方面: 1.性能较原来提升3倍之多 2.修 ...

  3. Rookey.Frame v1.0 视频教程发布了

    经过昨天几个小时的折腾, Rookey.Frame v1.0开发视频教程终于发布了,由于是第一次做视频有很多地方做的不够好,后续我会慢慢改进,争取将视频教程做好. 本期发布视频: (一)Rookey. ...

  4. Rookey.Frame v1.0 视频教程之三发布-框架核心思想介绍

    本期发布视频: (三)Rookey.Frame v1.0框架核心思想 介绍了Rookey.Frame v1.0框架搭建的核心思想,将框架核心思想理解清楚,对框架运行就会得心应手 官方视频教程: htt ...

  5. 文件批量上传-统一附件管理器-在线预览文件(有互联网和没有两种)--SNF快速开发平台3.0

    实际上在SNF里使用附件管理是非常简单的事情,一句代码就可以搞定.但我也要在这里记录一下统一附件管理器能满足的需求. 通用的附件管理,不要重复开发,调用尽量简洁. 批量文件上传,并对每个文件大小限制, ...

  6. MVC通用控件库展示-MVC4.0+WebAPI+EasyUI+Knockout--SNF快速开发平台3.0

    在我们开发中怎么才能提高效率,就是要有大量的公共组件(控件)可以直接使用而不用自己再开发一遍,既然是公共控件那也得简单实用才行.下面就介绍一下SNF-MVC当中的控件库. 总体控件库展示: 1.通用用 ...

  7. SNF快速开发平台3.0之BS页面展示和九大优点-部分页面显示效果-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout

    一)经过多年的实践不断优化.精心维护.运行稳定.功能完善: 能经得起不同实施策略下客户的折腾,能满足各种情况下客户的复杂需求. 二)编码实现简单易懂.符合设计模式等理念: 上手快,见效快.方便维护,能 ...

  8. SNF快速开发平台3.0之-界面个性化配置+10种皮肤+7种菜单-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout

    一.个性配置-首页:可以进行拖动保存配置,下次登录时就会按配置的进行加载 二.个人配置页面 7种菜单用户可自定义配置,和预览效果 10种皮肤自定义配置,和预览效果 皮肤和菜单可以随意组合-部分截图: ...

  9. JEECG 4.0 版本发布,JAVA快速开发平台

    JEECG 4.0 版本发布,系统全面优化升级,更快,更稳定!         导读                               ⊙平台性能优化,系统更稳定,速度闪电般提升      ...

随机推荐

  1. ctsc2009 移民站选址

    分析:非常非常好的一道题! 首先需要对问题进行转化: 行列无关,对于行单独处理,对于列单独处理 必然存在一个最优方案使得每一个新站与旧站重合. 转化1很显然,对于转化2,是一类非常经典的“中位数问题” ...

  2. 2018-2019 ACM-ICPC 焦作赛区 部分题解

    题目链接:https://codeforces.com/gym/102028 B. Ultraman vs. Aodzilla and Bodzilla 题意: 两只怪兽,它们的生命和攻击分别为hpA ...

  3. HDU3400 三分套三分

    题意 就是给你两条线段AB , CD ,一个人在AB以速度p跑,在CD上以q跑, 在其他地方跑速度是r.问你从A到D最少的时间. 三分AB ,然后再三分CD ,模板题目,这题卡精度 eps不能少 #i ...

  4. 「Python」19个python编写技巧

    1. 交换赋值 2. Unpacking 3. 使用操作符in 4. 字符串操作 5. 字典键值列表 6. 字典键值判断 7. 字典 get 和 setdefault 方法 8. 判断真伪 9. 遍历 ...

  5. 解决SQL Server 2008 64位系统无法导入Access/Excel的问题

    最近更换了新服务器,操作系统Windows Server 2008 X64,数据库SQL Server 2008 X64,Office 2007(好像只有32位),在存储过程执行OpenDatasou ...

  6. CSS 文本属性

    一.文本位置 text-align: 参数 /** * left center right:左中右**/text-align: left; 二.文本行间距 line-height: 参数 特别要注意: ...

  7. Shell编程——vim常用命令

    [vim]工作模式切换:    在普通模式下输入 i(插入).c(修改).o(另起一行) 命令时进入编辑模式:按 esc 键退回到普通模式.    在普通模式下输入冒号(:)可以进入命令模式.输入完命 ...

  8. (4.2)基于LingPipe的文本基本极性分析【demo】

    酒店评论情感分析系统(四)—— 基于LingPipe的文本基本极性分析[demo] (Positive (favorable) vs. Negative (unfavorable)) 这篇文章为Lin ...

  9. 分享一个彻底冻结对象的函数——来自阮一峰老师的《ECMAScript 6 入门》

    var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, i) => { if ( ...

  10. 【BZOJ做题记录】07.07~?

    在NOI一周前重开一个坑 最后更新时间:7.08 07:38 7.06 下午做的几道CQOI题: BZOJ1257: [CQOI2007]余数之和sum:把k mod i写成k-k/i*i然后分段求后 ...