Rookey.Frame v1.0快速開發平臺-用戶登錄

来源:http://www.cnblogs.com/rookey/archive/2016/03/04/5242687.html
-Advertisement-
Play Games

上一次介紹的了Rookey.Frame v1.0快速開發平臺的整體功能,接下來會對各個功能點進行解析說明,今天給大家介紹下系統登錄功能。 用戶登錄 系統中基本上所有功能頁面都是從後臺代碼拼接後返回的,登錄頁面也不例外,請看下圖: 接下來看下後臺登錄的HTML: /// <summary> /// 獲


上一次介紹的了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[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
    }
View Code

用戶擴展類的使用方法:

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框架基礎上搭建一個新系統,祝生活愉快!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這是最新番茄花園win7系統64位快速穩定版 V2016年2月,該系統由系統媽整理和上傳,系統具有更安全、更穩定、更人性化等特點。集成最常用的裝機軟體,集成最全面的硬體驅動,精心挑選的系統維護工具,加上番茄花園獨有人性化的設計。是電腦城、個人、公司快速裝機之首選!擁有此系統,您也可以輕鬆成為裝機高手
  • 1.1 rsync伺服器端配置 1.1.1 查看伺服器端rsync版本 1.1.2 創建配置文件 預設安裝好rsync程式後,並不會自動創建rsync的主配置文件,需要手工來創建,其主配置文件為“/etc/rsyncd.conf”,創建該文件 並插入如下內容: 1 #Rsync server 2 #
  • 一.創建型模式 模式名稱 定 義 使用頻率 學習難度 簡單工廠模式 (Simple Factory Pattern) 定義一個工廠類,它可以根據參數的不同返回不同類的實例,被創建的實例通常都具有共同的父類。 ★★☆☆☆ ★★★☆☆ 工廠方法模式 (Factory Method Pattern) 定義
  • 單例模式三種寫法: 第一種最簡單,但沒有考慮線程安全,在多線程時可能會出問題 public class Singleton { private static Singleton _instance = null; private Singleton(){} public static Singlet
  • MVC中HtmlHelper用法大全參考 解析MVC中HtmlHelper控制項7個大類中各個控制項的主要使用方法(1) 2012-02-27 16:25 HtmlHelper類在命令System.Web.Mvc.Html之中,主要由7個靜態類組成,它們分別是FormExtensions類,InputE
  • 開篇 本篇文章主要是幫助剛開始接觸CrystalReport報表的新手提供一個循序漸進的教程。該教程主要分為三個部分1)CrystalReport的基本使用方法;2)使用CrystalReport對數據進行分組求和;3)CrystalReport如何使用自定義的數據源(如記憶體中的DataTable表
  • 我們以做一個計算器為例,給大家介紹簡單工廠的應用: 效果: 這裡我們使用 繼承 ,虛方法, 簡單工廠的設計模式來完成 首先,我們除了搭好窗體外,我們應該把我們的一些類準備好: 1.計算的父類Calculation using System; using System.Collections.Gene
  • 最近看見一個騎士飛行棋的小游戲代碼,感覺這個代碼中將大多數C#的基礎知識都運用到了,是一個新手檢驗學習成果的有效方法,特此將這個代碼整理一遍。這是一個控制台程式。這是代碼下載地址,代碼中的註釋非常詳細介紹了每段代碼的作用: http://files.cnblogs.com/files/xiaohua
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...