Rookey.Frame v1.0快速开发平台-用户登录
上一次介绍的了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[]);
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快速开发平台-用户登录的更多相关文章
- Rookey.Frame v1.0快速开发平台-整体介绍
Rookey.Frame v1.0是一套基于.NET MVC的极速开发框架,支持简单逻辑模块零代码编程.支持二次开发,具有高扩展性.高复用性.高伸缩性. 框架特点 (1)简单逻辑模块实现零代码编程,通 ...
- Rookey.Frame v1.0极速开发平台稳定版发布
Rookey.Frame v1.0经过一年时间的修改及沉淀,稳定版终于问世了,此版本经过上线系统验证,各个功能点都经过终端用户验证并持续优化,主要优化以下几个方面: 1.性能较原来提升3倍之多 2.修 ...
- Rookey.Frame v1.0 视频教程发布了
经过昨天几个小时的折腾, Rookey.Frame v1.0开发视频教程终于发布了,由于是第一次做视频有很多地方做的不够好,后续我会慢慢改进,争取将视频教程做好. 本期发布视频: (一)Rookey. ...
- Rookey.Frame v1.0 视频教程之三发布-框架核心思想介绍
本期发布视频: (三)Rookey.Frame v1.0框架核心思想 介绍了Rookey.Frame v1.0框架搭建的核心思想,将框架核心思想理解清楚,对框架运行就会得心应手 官方视频教程: htt ...
- 文件批量上传-统一附件管理器-在线预览文件(有互联网和没有两种)--SNF快速开发平台3.0
实际上在SNF里使用附件管理是非常简单的事情,一句代码就可以搞定.但我也要在这里记录一下统一附件管理器能满足的需求. 通用的附件管理,不要重复开发,调用尽量简洁. 批量文件上传,并对每个文件大小限制, ...
- MVC通用控件库展示-MVC4.0+WebAPI+EasyUI+Knockout--SNF快速开发平台3.0
在我们开发中怎么才能提高效率,就是要有大量的公共组件(控件)可以直接使用而不用自己再开发一遍,既然是公共控件那也得简单实用才行.下面就介绍一下SNF-MVC当中的控件库. 总体控件库展示: 1.通用用 ...
- SNF快速开发平台3.0之BS页面展示和九大优点-部分页面显示效果-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout
一)经过多年的实践不断优化.精心维护.运行稳定.功能完善: 能经得起不同实施策略下客户的折腾,能满足各种情况下客户的复杂需求. 二)编码实现简单易懂.符合设计模式等理念: 上手快,见效快.方便维护,能 ...
- SNF快速开发平台3.0之-界面个性化配置+10种皮肤+7种菜单-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout
一.个性配置-首页:可以进行拖动保存配置,下次登录时就会按配置的进行加载 二.个人配置页面 7种菜单用户可自定义配置,和预览效果 10种皮肤自定义配置,和预览效果 皮肤和菜单可以随意组合-部分截图: ...
- JEECG 4.0 版本发布,JAVA快速开发平台
JEECG 4.0 版本发布,系统全面优化升级,更快,更稳定! 导读 ⊙平台性能优化,系统更稳定,速度闪电般提升 ...
随机推荐
- STM32自动生成精美图案
http://note.youdao.com/noteshare?id=65f237225624d22fe18f4aaaeec8db07
- ubuntu如何杀死进程
一.得到所有进程 先用命令查询出所有进程 ps -ef 二.杀死进程 我们使用ps -ef命令之后,就会得到一些列进程信息,有进程pid什么的,如果你要杀死莫个进程的话,直接使用命令 kill ...
- P值解释和误区
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...
- NOIP2013 提高组 Day1
https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%7C30 期望得分:100+100+100=300 实际得 ...
- 理解 CSS 中的伪元素 :before 和 :after
CSS 的主要目的是给 HTML 元素添加样式,然而,在一些案例中给文档添加额外的元素是多余的或是不可能的.事实上 CSS 中有一个特性允许我们添加额外元素而不扰乱文档本身,这就是“伪元素”. 你一定 ...
- 更改gradle的java的class文件输出目录的结构
group 'com.thinkvenus.common'version '1.0-SNAPSHOT' apply plugin: 'java' sourceCompatibility = 1.8 r ...
- JQuery的几个基础操作
先介绍两个函数(数组) 1.$.map(array,function(element,index)); 对于数组array中的每个元素,调用上面所示的function(element,index)函数 ...
- 实现字符串检索strstr函数、字符串长度strlen函数、字符串拷贝strcpy函数
#include <stdio.h> #include <stdlib.h> #include <string.h> /* _Check_return_ _Ret_ ...
- 微信小程序rpx单位
rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应.规定屏幕宽为750rpx.如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375p ...
- git push multiple repo
git remote add xxx https://git.github.com