上一次介绍的了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. codeforces 691E 矩阵快速幂+dp

    传送门:https://codeforces.com/contest/691/problem/E 题意:给定长度为n的序列,从序列中选择k个数(可以重复选择),使得得到的排列满足xi与xi+1异或的二 ...

  2. Xshell连接Linux服务器总掉线

    Xshell连接linux服务器总掉线,解决办法如下: 1.登录服务器后 [root@test134 ~]# cd /etc/ssh/ [root@test134 ssh]# vim sshd_con ...

  3. 通过socket实现多个连接并实现ssh功能

    一.前言 上一篇中我们已经知道了客户端通过socket来连接服务端,进行了一次数据传输,那如何实现客户端多次发生数据?而服务端接受多个客户端呢? 二.发送中文信息 在python3中,socket只能 ...

  4. kvm虚拟机

    ###查看虚拟机的状态 [root@fgeserver2 ~]# virsh list --all Id Name State------------------------------------- ...

  5. Python学习笔记(三十九)— 内置模块(8)XML基础

    摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432002075 ...

  6. C#为何不推荐在构造函数中访问虚成员

    如果在一个类中定义了虚属性或者虚方法,又在构造函数中访问了这个虚属性或方法,此时VisualStudio是不会给出警告,并且编译也没有问题,但是如果安装了Resharper插件则会给出警告提示:&qu ...

  7. GridControl详解(三)列数据的格式设置

    为了测试方便,我们加入新的3列,格式分别是数据,时间,字符串.代码增加下列部分: //格式增加 dt.Columns.Add("数据",typeof(decimal)); dt.C ...

  8. 无废话JavaScript(下)

    五.函数式 这个可不是JavaScript的发明,它的发明人已经死了,而他的这个发明还在困扰着我们……如同爱迪生的灯泡还在照耀着我们. 其实函数式语言很简单,它就是一种与命令式语言同样“完备”的语言实 ...

  9. 【CodeForces】913 C. Party Lemonade

    [题目]C. Party Lemonade [题意]给定n个物品,第i个物品重量为2^(i-1)价值为ci,每个物品可以无限取,求取总重量>=L的最小代价.1<=30<=n,1< ...

  10. Node.js的开源博客系统Ghost搭建教程

    准备工作 Node.js版本:0.10.x.0.12.x.4.2.x.安装步骤可参考:Node.js环境搭建 Ghost版本:0.7.4:中文集成版(33.6M),中文标准版(3.39M),英文原版( ...