上一次介绍的了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. move_base代码学习一

    System overview move_base 源码 API nav_core BaseGlobalPlanner BaseLocalPlanner RecoveryBehavior Recove ...

  2. 前端PHP入门-023-重点日期函数之程序执行时间检测

    我们有的时经常需要做程序的执行时间执行效率判断. 实现的思路如下: <?php //记录开始时间 //记录结整时 // 开始时间 减去(-) 结束时间 得到程序的运行时间 ?> 可是大家不 ...

  3. linux 下 mysql 主从配置

    话不多说,直接干. 准备条件:安装两个mysql数据库,随便哪个作主库,另一个从库. 1.在主库创建 复制用的账号 grant replication slave ,replication clien ...

  4. 图:centrality

    [定义]Centrality:图中每个节点v的相对重要度c(v),重要度是什么可根据具体应用定义. [估计方法] Degree centrality Betweenness centrality Cl ...

  5. jQuery技术内幕 深入解析jQuery架构设计与实现原理

    jquery的外衣 jquery是一个轻量级的JS框架 //以下截取自jquery源码片段 (function( window, undefined ) { /* 源码内容 */ })( window ...

  6. 云风pbc源码alloc.c

    #include <stdlib.h> #include <stdio.h> // 用于统计内存的申请和释放次数匹配 ; void * _pbcM_malloc(size_t ...

  7. 【洛谷 P2472】 [SCOI2007]蜥蜴 (最大流)

    题目链接 简单网络流. 源点向蜥蜴连流量为\(1\)的边. 能跳出去的点向汇点连流量为\(INF\)的边. 把每个点拆成\(2\)个点,\(O(n^4)\)枚举两两点,如果距离小于等于\(d\),就互 ...

  8. 【leetcode 简单】第五十题 位1的个数

    编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量). 示例 : 输入: 11 输出: 3 解释: 整数 11 的二进制表示为 00000000000 ...

  9. flex实例(阮一峰)

    Flex 布局教程:实例篇   作者: 阮一峰 日期: 2015年7月14日 上一篇文章介绍了Flex布局的语法,今天介绍常见布局的Flex写法. 你会看到,不管是什么布局,Flex往往都可以几行命令 ...

  10. python之yagmail库笔记

    1. yagmail是啥 yagmail是给正常人用的,封装的比较彻底的一个python邮件库,发送接收邮件只需要几行代码,炒鸡简单. 2. 安装 使用pip安装,炒鸡简单: pip install ...