從零開始編寫自己的C#框架(16)——Web層后端父類


  本章節講述的各個類是后端系統的核心之一,涉及到系統安全驗證、操作日志記錄、頁面與按鍵權限控制、后端頁面功能封裝等內容,希望學習本系列的朋友認真查看新增的類與函數,這對以后使用本框架進行開發時非常重要。

 

  1、父類(基類)的實現

  在開發后端首頁與相關功能頁面前,我們首先要實現的是所有頁面的基類(父類),將常用的功能都預先實現出來,而后面的相關UI類則直接繼承它,這樣就能簡單的自動實現了相關頁面功能,不用再每個頁面去編寫某些按鍵功能或其他一些功能,如果有特殊的需要,再重寫對應的功能類就可以了,對於常用功能,由於之前的邏輯層與數據層已使用模板生成好了,所以直接調用,這樣的話比如實現一個列表頁面的一些功能(如下圖),只需要簡單的在頁面控件使用指定名稱,那么一些實現代碼就不用再編寫了,這些控件自動擁有對應的功能,比如刷新、自動排序、保存排序(直接修改下圖中排序列的輸入框后點擊保存排序就可以了,這個功能不用編寫任何一個代碼,只需要將按鍵放到下圖位置,然后使用指定名稱就可以了)等功能。這樣操作將使我們后面的開發工作更加輕松。而對於列表的話,也只需要調用邏輯層函數直接綁定(bll.BindGrid(this, Grid1, Grid1.PageIndex + 1, Grid1.PageSize, InquiryCondition(), _order);)就可以實現列表、分頁、翻頁、排序等功能。當然列表點擊審核的√與×就會同步更改數據庫對應記錄的字段與圖標,也只需要在列表控件對應函數復制進簡單的幾行代碼就可以實現,這些會在后面相應章節中具體講述。

   

  先上父類與接口代碼

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Web.UI;
  4 using DotNet.Utilities;
  5 using FineUI;
  6 using Solution.Logic.Managers;
  7 using Solution.Logic.Managers.Application;
  8 
  9 namespace Solution.Web.Managers.WebManage.Application
 10 {
 11     /// <summary>
 12     /// Web層頁面父類
 13     /// 本基類封裝了各種常用函數,c減少重復代碼的編寫
 14     /// </summary>
 15     public abstract class PageBase : System.Web.UI.Page, IPageBase
 16     {
 17         #region 定義對象
 18         //邏輯層接口對象
 19         protected ILogicBase bll = null;
 20         //定義列表對象
 21         private FineUI.Grid grid = null;
 22         //頁面排序容器
 23         List<string> sortList = null;
 24         #endregion
 25 
 26         #region 初始化函數
 27         protected override void OnInit(EventArgs e)
 28         {
 29             base.OnInit(e);
 30             
 31             //檢測用戶是否超時退出
 32             OnlineUsersBll.GetInstence().IsTimeOut();
 33 
 34             if (!IsPostBack)
 35             {
 36                 //檢測當前頁面是否有訪問權限
 37                 MenuInfoBll.GetInstence().CheckPagePower(this);
 38 
 39                 #region 設置頁面按鍵權限
 40                 //定義按鍵控件
 41                 Control btnControl = null;
 42                 try
 43                 {
 44                     //找到頁面放置按鍵控件的位置
 45                     ControlCollection controls = MenuInfoBll.GetInstence().GetToolBarControls(this.Controls);
 46                     //逐個讀取出來
 47                     for (int i = 0; i < controls.Count; i++)
 48                     {
 49                         //取出控件
 50                         btnControl = controls[i];
 51                         //判斷是否除了刷新、查詢和關閉以外的按鍵
 52                         if (btnControl.ID != "ButtonRefresh" && btnControl.ID != "ButtonSearch" && btnControl.ID != "ButtonClose" && btnControl.ID != "btnReset")
 53                         {
 54                             //是的話檢查該按鍵當前用戶是否有控件權限,沒有的話則禁用該按鍵
 55                             ((FineUI.Button)btnControl).Enabled = MenuInfoBll.GetInstence().CheckControlPower(this, btnControl.ID);
 56                         }
 57                     }
 58                 }
 59                 catch (Exception) { }
 60                 #endregion
 61 
 62                 //記錄用戶當前所在的頁面位置
 63                 CommonBll.UserRecord(this);
 64             }
 65 
 66             //運行UI頁面初始化函數,子類繼承后需要重寫本函數,以提供給本初始化函數調用
 67             Init();
 68         }
 69         #endregion
 70 
 71         #region 接口函數,用於UI頁面初始化,給邏輯層對象、列表等對象賦值
 72 
 73         /// <summary>
 74         /// 接口函數,用於UI頁面初始化,給邏輯層對象、列表等對象賦值
 75         /// </summary>
 76         public abstract void Init();
 77 
 78         #endregion
 79 
 80         #region 頁面各種按鍵事件
 81 
 82         /// <summary>
 83         /// 刷新按鈕事件
 84         /// </summary>
 85         /// <param name="sender"></param>
 86         /// <param name="e"></param>
 87         protected void ButtonRefresh_Click(object sender, EventArgs e)
 88         {
 89             FineUI.PageContext.RegisterStartupScript("window.location.reload()");
 90         }
 91 
 92         /// <summary>
 93         /// 關閉
 94         /// </summary>
 95         /// <param name="sender"></param>
 96         /// <param name="e"></param>
 97         protected void ButtonClose_Click(object sender, EventArgs e)
 98         {
 99             PageContext.RegisterStartupScript(ActiveWindow.GetHideRefreshReference());
100 
101         }
102         /// <summary>
103         /// 查詢
104         /// </summary>
105         /// <param name="sender"></param>
106         /// <param name="e"></param>
107         protected void ButtonSearch_Click(object sender, EventArgs e)
108         {
109             LoadData();
110         }
111 
112         /// <summary>
113         /// 新增
114         /// </summary>
115         /// <param name="sender"></param>
116         /// <param name="e"></param>
117         protected void ButtonAdd_Click(object sender, EventArgs e)
118         {
119             Add();
120         }
121 
122         /// <summary>
123         /// 編輯
124         /// </summary>
125         /// <param name="sender"></param>
126         /// <param name="e"></param>
127         protected void ButtonEdit_Click(object sender, EventArgs e)
128         {
129             Edit();
130         }
131 
132         /// <summary>
133         /// 刪除
134         /// </summary>
135         /// <param name="sender"></param>
136         /// <param name="e"></param>
137         protected void ButtonDelete_Click(object sender, EventArgs e)
138         {
139             //執行刪除操作,返回刪除結果
140             string result = Delete();
141 
142             if (string.IsNullOrEmpty(result))
143                 return;
144             //彈出提示框
145             FineUI.Alert.ShowInParent(result, FineUI.MessageBoxIcon.Information);
146 
147             //重新加載頁面表格
148             LoadData();
149         }
150 
151 
152         /// <summary>
153         /// 保存數據
154         /// </summary>
155         /// <param name="sender"></param>
156         /// <param name="e"></param>
157         protected void ButtonSave_Click(object sender, EventArgs e)
158         {
159             //執行保存操作,返回保存結果
160             string result = Save();
161 
162             if (string.IsNullOrEmpty(result))
163             {
164                 PageContext.RegisterStartupScript(ActiveWindow.GetHidePostBackReference());
165                 FineUI.Alert.ShowInParent("保存成功", FineUI.MessageBoxIcon.Information);
166             }
167             else
168             {
169                 //by july,部分頁面保存后,必須刷新原頁面的,把返回的值用 "{url}" + 跳轉地址的方式傳過來
170                 if (StringHelper.Left(result, 5) == "{url}")
171                 {
172                     string url = result.Trim().Substring(6);
173                     FineUI.Alert.ShowInParent("保存成功", "", FineUI.MessageBoxIcon.Information, "self.location='" + url + "'");
174                 }
175                 else
176                 {
177                     FineUI.Alert.ShowInParent(result, FineUI.MessageBoxIcon.Information);
178                 }
179             }
180         }
181 
182         /// <summary>保存排序</summary>
183         /// <param name="sender"></param>
184         /// <param name="e"></param>
185         protected void ButtonSaveSort_Click(object sender, EventArgs e)
186         {
187             SaveSort();
188         }
189 
190         /// <summary>自動排序</summary>
191         /// <param name="sender"></param>
192         /// <param name="e"></param>
193         protected void ButtonSaveAutoSort_Click(object sender, EventArgs e)
194         {
195             //默認使用多級分類
196             SaveAutoSort();
197         }
198 
199         /// <summary>
200         /// 排序
201         /// </summary>
202         /// <param name="sender"></param>
203         /// <param name="e"></param>
204         protected void Grid1_Sort(object sender, FineUI.GridSortEventArgs e)
205         {
206             //生成排序關鍵字
207             Sort(e);
208             //刷新列表
209             LoadData();
210         }
211 
212         /// <summary>
213         /// 分頁
214         /// </summary>
215         /// <param name="sender"></param>
216         /// <param name="e"></param>
217         protected void Grid1_PageIndexChange(object sender, FineUI.GridPageEventArgs e)
218         {
219             if (grid != null)
220             {
221                 grid.PageIndex = e.NewPageIndex;
222 
223                 LoadData();
224             }
225         }
226         
227         /// <summary>
228         /// 關閉子窗口事件
229         /// </summary>
230         /// <param name="sender"></param>
231         /// <param name="e"></param>
232         protected virtual void Window1_Close(object sender, WindowCloseEventArgs e)
233         {
234             LoadData();
235         }
236 
237         /// <summary>
238         /// 關閉子窗口事件
239         /// </summary>
240         /// <param name="sender"></param>
241         /// <param name="e"></param>
242         protected virtual void Window2_Close(object sender, WindowCloseEventArgs e)
243         {
244             LoadData();
245         }
246 
247         /// <summary>
248         /// 關閉子窗口事件
249         /// </summary>
250         /// <param name="sender"></param>
251         /// <param name="e"></param>
252         protected virtual void Window3_Close(object sender, WindowCloseEventArgs e)
253         {
254             LoadData();
255         }
256         #endregion
257 
258         #region 虛函數,主要給頁面各種按鍵事件調用,子類需要使用到相關功能時必須將它實現
259 
260         /// <summary>
261         /// 加載事件
262         /// </summary>
263         public virtual void LoadData() { }
264 
265         /// <summary>
266         /// 添加記錄
267         /// </summary>
268         public virtual void Add() { }
269 
270         /// <summary>
271         /// 修改記錄
272         /// </summary>
273         public virtual void Edit() { }
274 
275         /// <summary>
276         /// 刪除記錄
277         /// </summary>
278         /// <returns>返回刪除結果</returns>
279         public virtual string Delete()
280         {
281             return null;
282         }
283 
284         /// <summary>
285         /// 保存數據
286         /// </summary>
287         /// <returns>返回保存結果</returns>
288         public virtual string Save()
289         {
290             return "";
291         }
292 
293         /// <summary>
294         /// 保存排序
295         /// </summary>
296         /// <returns>返回保存結果</returns>
297         public virtual void SaveSort()
298         {
299             //保存排序
300             if (grid != null && bll != null)
301             {
302                 //更新排序
303                 if (bll.UpdateSort(this, grid, "tbxOrderID"))
304                 {
305                     //重新加載列表
306                     LoadData();
307 
308                     Alert.ShowInParent("操作成功", "保存排序成功", "window.location.reload();");
309                 }
310                 else
311                 {
312                     Alert.ShowInParent("操作成失敗", "保存排序失敗", "window.location.reload();");
313                 }
314             }
315         }
316 
317         /// <summary>
318         /// 保存自動排序
319         /// </summary>
320         public virtual void SaveAutoSort()
321         {
322             if (bll == null)
323             {
324                 Alert.ShowInParent("保存失敗", "邏輯層對象為null,請聯系開發人員給當前頁面的邏輯層對象賦值");
325                 return;
326             }
327 
328             if (bll.UpdateAutoSort(this, "", true))
329             {
330                 Alert.ShowInParent("保存成功", "保存自動排序成功", "window.location.reload();");
331             }
332             else
333             {
334                 Alert.ShowInParent("保存失敗", "保存自動排序失敗", "window.location.reload();");
335             }
336         }
337 
338         /// <summary>
339         /// 生成排序關鍵字
340         /// </summary>
341         /// <param name="e"></param>
342         public virtual void Sort(FineUI.GridSortEventArgs e)
343         {
344             //處理排序
345             sortList = null;
346             sortList = new List<string>();
347             //排序列字段名稱
348             string sortName = "";
349 
350             if (e.SortField.Length > 0)
351             {
352                 //判斷是升序還是降序
353                 if (e.SortDirection != null && e.SortDirection.ToUpper() == "DESC")
354                 {
355                     sortList.Add(e.SortField + " desc");
356                 }
357                 else
358                 {
359                     sortList.Add(e.SortField + " asc");
360                 }
361                 sortName = e.SortField;
362             }
363             else
364             {
365                 //使用默認排序——主鍵列降序排序
366                 sortList.Add("Id desc");
367                 sortName = "Id";
368             }
369 
370             //利用反射的方式給頁面控件賦值
371             //查找指定名稱控件
372             var control = Page.FindControl("SortColumn");
373             if (control != null)
374             {
375                 //判斷是否是TextBox類型
376                 var type = control.GetType();
377                 if (type.FullName == "System.Web.UI.WebControls.TextBox")
378                 {
379                     //存儲排序列字段名稱
380                     ((TextBox)control).Text = sortName;
381                 }
382             }
383         }
384 
385         #endregion
386 
387     }
388 }
View Code
 1 namespace Solution.Web.Managers.WebManage.Application
 2 {
 3     /// <summary>
 4     /// UI頁面接口類——主要用於列表(Grid)頁
 5     /// </summary>
 6     public interface IPageBase
 7     {
 8         #region 用於UI頁面初始化,給邏輯層對象、列表等對象賦值,主要是列表(Grid)頁面使用
 9 
10         void Init();
11 
12         #endregion
13     }
14 }
View Code

  有朋友可能會有疑問,為什么本類要用abstract修飾成抽象類,而實現類中只有接口Init()函數是抽象函數,這樣設置主要是強制要求Init()函數在子類中必須實現,因為在開發過程中,不這樣強制的話,一些頁面開發時很容易忘記去給父類的相關對象賦值,那么父類中的一些功能在調用時就無法正常運行。

  代碼中的OnInit()函數,在頁面啟動的時候會調用到,主要用於檢查用戶登陸情況,用戶是否有當前頁面的訪問權限和頁面按鍵的使用權限,記錄用戶訪問記錄,以及運行UI頁面初始化函數,方便父類相關函數功能的調用(比如保存排序、分頁等功能)。

  另外,預先定義好了頁面各種常用按鍵事件,只要在頁面里放置這些按鍵,就可以自動調用這些事件功能,部分按鍵功能已實現的就不用再編寫代碼,未實現的則直接重寫對應的虛函數,就可以達到想要的效果。

  而虛函數,大多都沒有實現其功能的代碼,可能有朋友會說,為什么不用接口呢?呃......在這里再重新說明一下,定義成接口的話就必須要去實現,而對於多數頁面來說,並不一定要用到這個功能,那么這些頁面代碼看起來就很羅嗦,充斥大量無用代碼,可讀性就會非常的差,而用虛方法只是放在那里就可以了,需要使用時才去重寫,這樣操作會比較靈活,頁面代碼看起來也非常整潔干凈。

  由於下面不少功能都是重新溝思后編寫的,所以可能會存在一些不合理的地方,且未經過運行測試,以后會根據情況進行增刪。

  

 

  2、邏輯層添加了接口,且抽象類實現這個接口並增加對應的抽象函數

  為了方便上面父類的調用,減少重復代碼的編寫,在邏輯層增加了接口類ILogicBase,而原來的邏輯層抽象類LogicBase(所有模板都必須繼承的類)也實現了該接口

 1 using System.Collections.Generic;
 2 using System.Web.UI;
 3 using Solution.DataAccess.DbHelper;
 4 
 5 namespace Solution.Logic.Managers.Application
 6 {
 7     public interface ILogicBase
 8     {
 9         #region 綁定表格
10 
11         void BindGrid(FineUI.Grid grid, int pageIndex = 0, int pageSize = 0,
12             List<ConditionFun.SqlqueryCondition> wheres = null, List<string> orders = null);
13 
14         void BindGrid(FineUI.Grid grid, int parentValue,
15             List<ConditionFun.SqlqueryCondition> wheres = null, List<string> orders = null, string parentId = "ParentId");
16 
17         void BindGrid(FineUI.Grid grid, int parentValue, List<string> orders = null,
18             string parentId = "ParentId");
19 
20         #endregion
21 
22         #region 刪除記錄
23 
24         void Delete(Page page, int id);
25 
26         void Delete(Page page, int[] id);
27 
28         #endregion
29 
30         #region 保存排序
31 
32         bool UpdateSort(Page page, FineUI.Grid grid1, string tbxOrderId, string orderIdName = "OrderId");
33 
34         #endregion
35 
36         #region 自動排序
37 
38         bool UpdateAutoSort(Page page, string strWhere = "", bool isExistsMoreLv = false, int pid = 0,
39             string fieldName = "OrderId", string fieldParentId = "ParentId");
40 
41         #endregion
42     }
43 }
View Code
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq.Expressions;
 4 using System.Web.UI;
 5 using FineUI;
 6 using Solution.DataAccess.DbHelper;
 7 using Solution.Logic.Managers.Application;
 8 
 9 namespace Solution.Logic.Managers
10 {
11     /// <summary>
12     /// 邏輯層抽象類
13     /// </summary>
14     public abstract class LogicBase : ILogicBase
15     {
16         #region 清空緩存
17         /// <summary>清空緩存</summary>
18         public virtual void DelCache()
19         {
20 
21         }
22         #endregion
23         
24         #region 全表緩存加載條件
25         /// <summary>
26         /// 全表緩存加載條件——對於有些表並不用所有記錄都加載到緩存當中,這個時候就可以重寫本函數來實現每次加載時只加載指定的記錄到緩存中
27         /// </summary>
28         /// <typeparam name="T"></typeparam>
29         /// <returns></returns>
30         public virtual Expression<Func<T, bool>> GetExpression<T>()
31         {
32             return null;
33         }
34         #endregion
35 
36         #region 綁定表格
37         public abstract void BindGrid(FineUI.Grid grid, int pageIndex = 0, int pageSize = 0, List<ConditionFun.SqlqueryCondition> wheres = null, List<string> orders = null);
38 
39         public abstract void BindGrid(FineUI.Grid grid, int parentValue, List<ConditionFun.SqlqueryCondition> wheres = null, List<string> orders = null,
40             string parentId = "ParentId");
41 
42         public abstract void BindGrid(FineUI.Grid grid, int parentValue, List<string> orders = null, string parentId = "ParentId");
43         #endregion
44 
45         #region 刪除記錄
46         public abstract void Delete(Page page, int id);
47         public abstract void Delete(Page page, int[] id);
48         #endregion
49 
50         #region 保存排序
51         public abstract bool UpdateSort(Page page, Grid grid1, string tbxOrderId, string orderIdName = "OrderId");
52         #endregion
53 
54         #region 自動排序
55         public abstract bool UpdateAutoSort(Page page, string strWhere = "", bool isExistsMoreLv = false, int pid = 0,
56             string fieldName = "OrderId", string fieldParentId = "ParentId");
57         #endregion
58     }
59 }
View Code

  原來的模板根據需要也對應做出了相應調整

  我們在第1點時不是強制要求實現Init()函數嗎,這里就是主要為PageBase類(父類)的邏輯層接口賦值用的。

  比如我們要實現一個信息列表的功能,由於我們的邏輯層都繼承了ILogicBase類,所以我們只要在Init()函數中給PageBase類的protected ILogicBase bll = null;這個定義重新賦值就可以了,那么在執行下面代碼時就會通過這個接口的調用來執行對應類的功能

  在Init()初始化函數中,給邏輯層對象賦值例子

 

 1 using System;
 2 using Solution.Logic.Managers;
 3 using Solution.Web.Managers.WebManage.Application;
 4 
 5 namespace Solution.Web.Managers
 6 {
 7     public partial class WebForm1 : PageBase
 8     {
 9         protected void Page_Load(object sender, EventArgs e)
10         {
11 
12         }
13 
14 
15         #region 接口函數,用於UI頁面初始化,給邏輯層對象、列表等對象賦值
16         /// <summary>
17         /// 接口函數,用於UI頁面初始化,給邏輯層對象、列表等對象賦值
18         /// </summary>
19         public override void Init()
20         {
21             //給邏輯層對象賦值
22             bll = InformationBll.GetInstence();
23             //給表格賦值
24             grid = Grid1;
25         }
26         #endregion
27     }
28 }

 

 

  PageBase類執行邏輯層程序代碼——實際上這些代碼可以再次進行封裝成一個公共函數,不過都是用模板生成的,有變動不用一個個改就懶得再重構了

 

 1         /// <summary>
 2         /// 保存排序
 3         /// </summary>
 4         /// <returns>返回保存結果</returns>
 5         public virtual void SaveSort()
 6         {
 7             //保存排序
 8             if (grid != null && bll != null)
 9             {
10                 //更新排序
11                 if (bll.UpdateSort(this, grid, "tbxOrderID"))
12                 {
13                     //重新加載列表
14                     LoadData();
15 
16                     Alert.ShowInParent("操作成功", "保存排序成功", "window.location.reload();");
17                 }
18                 else
19                 {
20                     Alert.ShowInParent("操作成失敗", "保存排序失敗", "window.location.reload();");
21                 }
22             }
23         }
24 
25         /// <summary>
26         /// 保存自動排序
27         /// </summary>
28         public virtual void SaveAutoSort()
29         {
30             if (bll == null)
31             {
32                 Alert.ShowInParent("保存失敗", "邏輯層對象為null,請聯系開發人員給當前頁面的邏輯層對象賦值");
33                 return;
34             }
35 
36             if (bll.UpdateAutoSort(this, "", true))
37             {
38                 Alert.ShowInParent("保存成功", "保存自動排序成功", "window.location.reload();");
39             }
40             else
41             {
42                 Alert.ShowInParent("保存失敗", "保存自動排序失敗", "window.location.reload();");
43             }
44         }

 

 

 

  3、MenuInfoBll邏輯類

  它是后端所有頁面權限、頁面控件權限,以及頁面訪問鏈接加密處理的功能類

  它會將后端所有菜單與頁面記錄全部加載到緩存當中,優化后端檢查權限時的性能;

  用戶對后端頁面的所有訪問,都會經過CheckPagePower函數的處理,只要在系統中綁定了菜單與頁面,后端頁面開發時,就不必去考慮頁面權限,即不用對每個頁面的權限進行賦值,CheckPagePower函數會自動檢查並判斷用戶是否有訪問權限並做出相應處理;

  后端所有頁面的加密解密處理函數也在這里,所有訪問鏈接都需要加上對應的加密函數,不然該頁面無法正常訪問,這種功能可以使我們的后端在管理相關業務時,用戶不能通過復制頁面鏈接后修改鏈接參數中的Id訪問,以達到查看當前用戶查看無權限訪問的信息,防止業務信息被非常查看(當然也不是不能破解,這種算法將加大其難度),另外該鏈接只有當前瀏覽器上有效,通過復制發送給他人馬上失效。

  1 using System;
  2 using System.Collections;
  3 using System.Collections.Generic;
  4 using System.Linq;
  5 using System.Text;
  6 using System.Web;
  7 using System.Web.UI;
  8 using DotNet.Utilities;
  9 using Solution.DataAccess.DataModel;
 10 
 11 namespace Solution.Logic.Managers
 12 {
 13     /// <summary>
 14     /// MenuInfoBll邏輯類
 15     /// </summary>
 16     public partial class MenuInfoBll : LogicBase
 17     {
 18         /***********************************************************************
 19          * 自定義函數                                                          *
 20          ***********************************************************************/
 21 
 22         #region 自定義函數
 23 
 24         private const string const_CacheKey_Model = "Cache_MenuInfo_AllModel";
 25 
 26         #region 獲取MenuInfo全表內容並放到緩存中
 27 
 28         /// <summary>
 29         /// 取得MenuInfo全表內容——使用菜單地址做為KEY
 30         /// </summary>
 31         /// <returns>返回Hashtable</returns>
 32         public Hashtable GetHashtable()
 33         {
 34             //讀取記錄
 35             object obj = CacheHelper.GetCache(const_CacheKey_Model);
 36             //如果記錄不存在,則重新加載
 37             if (obj == null)
 38             {
 39                 //初始化全局菜單內容緩存
 40                 var ht = new Hashtable();
 41                 //獲取菜單表全部內容
 42                 var all = MenuInfo.All();
 43                 //遍歷讀取
 44                 foreach (var model in all)
 45                 {
 46                     //創建菜單實體
 47                     var menuinfo = new MenuInfo();
 48                     menuinfo.Id = model.Id;
 49                     menuinfo.Name = model.Name;
 50                     menuinfo.Url = model.Url;
 51                     menuinfo.ParentId = model.ParentId;
 52                     menuinfo.Depth = model.Depth;
 53 
 54                     try
 55                     {
 56                         //將菜單實體存入容器中
 57                         //使用頁面地址做為KEY
 58                         ht.Add(menuinfo.Url, menuinfo);
 59                     }
 60                     catch (Exception)
 61                     {
 62                     }
 63                 }
 64 
 65                 if (ht.Count > 0)
 66                 {
 67                     CacheHelper.SetCache(const_CacheKey_Model, ht);
 68                 }
 69 
 70                 return ht;
 71             }
 72             else
 73             {
 74                 return (Hashtable) obj;
 75             }
 76         }
 77 
 78         #endregion
 79 
 80         #region 清空緩存
 81 
 82         /// <summary>清空緩存</summary>
 83         public override void DelCache()
 84         {
 85             CacheHelper.RemoveOneCache(const_CacheKey_Model);
 86         }
 87 
 88         #endregion
 89 
 90         #region 根據菜單Url地址,獲取菜單相應內容
 91 
 92         /// <summary>
 93         /// 根據菜單Url地址,獲取菜單相應內容
 94         /// </summary>
 95         /// <param name="menuInfoUrl">頁面地址</param>
 96         /// <returns>返回菜單實體</returns>
 97         public MenuInfo GetMenuInfo(string menuInfoUrl)
 98         {
 99             try
100             {
101                 //從全局緩存中讀取菜單內容
102                 //獲取菜單實體
103                 return (MenuInfo) (MenuInfoBll.GetInstence().GetHashtable()[menuInfoUrl]);
104             }
105             catch (Exception)
106             {
107                 return new MenuInfo();
108             }
109         }
110 
111         #endregion
112 
113         #region 檢查頁面權限
114 
115         /// <summary>
116         /// 檢查當前菜單或頁面是否有權限訪問
117         /// </summary>
118         /// <param name="menuId">菜單ID</param>
119         /// <returns>真或假</returns>
120         public bool CheckPagePower(string menuId)
121         {
122             var pagePower = OnlineUsersBll.GetInstence().GetPagePower();
123             if (string.IsNullOrEmpty(pagePower) || menuId == "")
124             {
125                 return false;
126             }
127             //檢查是否有權限
128             if (
129                 pagePower.IndexOf("," + menuId + ",") >= 0)
130             {
131                 return true;
132             }
133             else
134             {
135                 return false;
136             }
137         }
138 
139         #endregion
140 
141         #region 檢查當前頁面控件是否有權限訪問
142 
143         /// <summary>
144         /// 檢查當前頁面控件是否有權限訪問
145         /// </summary>
146         /// <param name="page">頁面指針</param>
147         /// <param name="controlName">控件名稱</param>
148         /// <returns>真或假</returns>
149         public bool CheckControlPower(Page page, string controlName)
150         {
151             //獲取當前訪問頁面的URL
152             var currentPage = page.Request.Url.AbsolutePath;
153             //獲取當前用戶所有可以訪問的頁面ID
154             var menuId = GetMenuInfo(currentPage).Id;
155             //判斷全局緩存中是否存儲了該控件ID,否的話表示該控件沒有權限
156             if (PagePowerSignPublicBll.GetInstence().GetHashtable()[controlName] == null)
157             {
158                 return false;
159             }
160             else
161             {
162                 var controlPower = OnlineUsersBll.GetInstence().GetControlPower();
163                 if (string.IsNullOrEmpty(controlPower))
164                 {
165                     return false;
166                 }
167                 //獲取當前控件ID
168                 string ppsID = PagePowerSignPublicBll.GetInstence().GetHashtable()[controlName].ToString();
169 
170                 //檢查是否有權限
171                 if (controlPower.IndexOf("," + menuId + "|" + ppsID + ",") >= 0)
172                 {
173                     return true;
174                 }
175                 else
176                 {
177                     return false;
178                 }
179 
180             }
181 
182         }
183 
184         #endregion
185 
186         #region 判斷當前用戶是否有當前頁面操作權限
187 
188         /// <summary>
189         /// 判斷當前用戶是否有本頁面的操作權限
190         /// </summary>
191         /// <returns></returns>
192         public void CheckPagePower(Page page)
193         {
194             try
195             {
196                 //獲取當前訪問頁面的名稱
197                 var currentPage = page.Request.Url.AbsolutePath;
198                 if (currentPage.Equals("/WebManage/Main.aspx"))
199                     return;
200 
201                 //檢查是否從正確路徑進入
202                 ChichPageEncrypt(page);
203 
204 
205                 //獲取當前用戶所有可以訪問的頁面ID
206                 var menuId = GetMenuInfo(currentPage).Id + "";
207 
208                 if (!CheckPagePower(menuId))
209                 {
210                     //添加用戶訪問記錄
211                     UseLogBll.GetInstence().Save(page, "{0}沒有權限訪問【{1}】頁面");
212 
213                     page.Response.Write("您沒有訪問該頁面的權限!");
214                     page.Response.End();
215                     return;
216                 }
217 
218             }
219             catch (Exception)
220             {
221                 //添加用戶訪問記錄
222                 UseLogBll.GetInstence().Save(page, "{0}沒有權限訪問【{1}】頁面");
223 
224                 page.Response.Write("您沒有訪問該頁面的權限!");
225                 page.Response.End();
226                 return;
227             }
228         }
229 
230         #endregion
231 
232         #region 頁面訪問加密--檢查用戶是否從正確的路徑進入本頁面
233 
234         /// <summary>
235         /// 設置頁面加密--用於檢查用戶是否從正確的路徑進入本頁面
236         /// </summary>
237         /// <param name="key">頁面加密的Key</param>
238         /// <returns>加密后的字符串</returns>
239         public string SetPageEncrypt(string key)
240         {
241             //當前用戶md5
242             var md5 = OnlineUsersBll.GetInstence().GetMd5();
243             //加密:md5+Key
244             var encrypt = DotNet.Utilities.Encrypt.Md5(md5 + key);
245             //再次加密:Key + Encrypt
246             return Encrypt.Md5(key + encrypt);
247         }
248 
249         /// <summary>
250         /// 檢查用戶是否從正確的路徑進入本頁面,默認KEY為ID
251         /// </summary>
252         public void CheckPageEncrypt(Page page)
253         {
254             //當前用戶md5
255             var md5 = OnlineUsersBll.GetInstence().GetMd5();
256             //Key,如果沒有傳遞Key這個變量過來的,就讀取id或ParentID做為Key使用
257             var key = HttpContext.Current.Request["Id"];
258             if (string.IsNullOrEmpty(key))
259             {
260                 key = HttpContext.Current.Request["pid"];
261             }
262             if (string.IsNullOrEmpty(key))
263             {
264                 key = HttpContext.Current.Request["ParentId"];
265             }
266             if (string.IsNullOrEmpty(key))
267             {
268                 key = HttpContext.Current.Request["Key"];
269             }
270             //上一鏈接傳過來的加密數據
271             var keyEncrypt = HttpContext.Current.Request["KeyEncrypt"];
272 
273             //加密:md5+Key
274             var encrypt = Encrypt.Md5(md5 + key);
275             //再次加密:Key + Encrypt
276             encrypt = Encrypt.Md5(key + encrypt);
277 
278             //檢查是否有權限,沒有權限的直接終止當前頁面的運行
279             if (keyEncrypt != encrypt || string.IsNullOrEmpty(key))
280             {
281                 try
282                 {
283                     //添加用戶訪問記錄
284                     UseLogBll.GetInstence().Save(page, "{0}沒有權限訪問【{1}】頁面");
285                 }
286                 catch (Exception)
287                 {
288                 }
289 
290                 HttpContext.Current.Response.Write("你從錯誤的路徑進入當前頁面!");
291                 HttpContext.Current.Response.End();
292             }
293         }
294 
295         /// <summary>
296         /// 組成URL加密參數字符串
297         /// </summary>
298         /// <param name="key">頁面加密的Key</param>
299         /// <returns>組成URL加密參數字符串</returns>
300         public string PageUrlEncryptString(string key)
301         {
302             return "KeyEncrypt=" + SetPageEncrypt(key) + "&Key=" + key;
303         }
304 
305         /// <summary>
306         /// 組成URL加密參數字符串,使用隨機生成的Key,如果頁面傳的參數中包含有ID這個名稱的,則不能使用本函數
307         /// </summary>
308         /// <returns>組成URL加密參數字符串</returns>
309         public string PageUrlEncryptString()
310         {
311             var key = RandomHelper.GetRandomCode(null, 12);
312             return "KeyEncrypt=" + SetPageEncrypt(key) + "&Id=" + key;
313         }
314 
315         /// <summary>
316         /// 組成URL加密參數字符串——返回不帶Key的字符串
317         /// </summary>
318         /// <param name="key">頁面加密的Key</param>
319         /// <returns>組成URL加密參數字符串——不帶Key</returns>
320         public string PageUrlEncryptStringNoKey(string key)
321         {
322             return "KeyEncrypt=" + SetPageEncrypt(key);
323         }
324 
325         /// <summary>和 PageBase.BtnSave_Click 對應,部分頁面刷新后不關閉原頁面,並要刷新的情況下使用</summary>
326         /// <param name="url">跳轉的url</param>
327         /// <returns></returns>
328         public string PageSaveReturnUrlFlash(string url)
329         {
330             url = DirFileHelper.GetFilePath(HttpContext.Current.Request.Path) + "/" + url;
331             return "{url}" + url;
332         }
333 
334         #endregion
335 
336         #region 從頁面中找到放置按鍵控件的位置
337 
338         /// <summary>
339         /// 從頁面中找到放置按鍵控件的位置
340         /// </summary>
341         /// <param name="controls"></param>
342         /// <returns></returns>
343         public ControlCollection GetToolBarControls(ControlCollection controls)
344         {
345             if (controls == null)
346                 return null;
347 
348             ControlCollection c = null;
349             try
350             {
351                 for (int i = 0; i < controls.Count; i++)
352                 {
353                     if (controls[i].ID == "toolBar")
354                     {
355                         return controls[i].Controls;
356                     }
357                     c = GetToolBarControls(controls[i].Controls);
358                     if (c != null)
359                         return c;
360                 }
361             }
362             catch (Exception)
363             {
364             }
365 
366             return c;
367         }
368 
369         #endregion
370 
371         #endregion 自定義函數
372     }
373 }
View Code

  看看效果:

  這個是編輯頁面的路徑,KeyEncrypt參數值就是加密后的字串

  

  將地址復制出來在同一個瀏覽器換個標簽訪問,修改Id參數,加密串不變時,顯示沒權限訪問

  

  換個瀏覽器使用同樣的鏈接訪問效果

  

 

  4、OnlineUsersBll邏輯類

  它是后端所有在線緩存、列表數據讀寫操作的功能類

  主要功能大家自己研究吧,由於未經過運行測試,后面開發時可能會對一些函數進行比較大的修改。

  1 using System;
  2 using System.Collections;
  3 using System.Collections.Generic;
  4 using System.Web;
  5 using System.Web.UI;
  6 using DotNet.Utilities;
  7 using FineUI;
  8 using Solution.DataAccess.DataModel;
  9 
 10 namespace Solution.Logic.Managers
 11 {
 12 
 13     /// <summary>
 14     /// OnlineUsersBll邏輯類
 15     /// </summary>
 16     public partial class OnlineUsersBll : LogicBase
 17     {
 18         /***********************************************************************
 19          * 自定義函數                                                          *
 20          ***********************************************************************/
 21         #region 自定義函數
 22 
 23         #region 加載數據庫記錄到緩存
 24         private static readonly object LockObject = new object();
 25         /// <summary>
 26         /// 加載數據庫記錄到緩存
 27         /// </summary>
 28         public void Load()
 29         {
 30             lock (LockObject)
 31             {
 32                 //判斷緩存中["OnlineUsers"]是否存在,不存在則嘗試加載數據庫中的在線表
 33                 if (CacheHelper.GetCache("OnlineUsers") == null)
 34                 {
 35                     //將當前用戶信息添加到Hashtable中
 36                     var onlineUsers = new Hashtable();
 37 
 38                     //不存在則嘗試加載數據庫中的在線表到緩存中
 39                     var list = GetList();
 40                     if (list != null && list.Count > 0)
 41                     {
 42                         foreach (var model in list)
 43                         {
 44                             try
 45                             {
 46                                 onlineUsers.Add(model.UserHashKey, model);
 47                             }
 48                             catch
 49                             {
 50                             }
 51                         }
 52 
 53                         //將在線列表(Hashtable)添中進系統緩存中
 54                         CacheHelper.SetCache("OnlineUsers", onlineUsers);
 55                     }
 56                 }
 57             }
 58         }
 59         #endregion
 60 
 61         #region 獲取在線用戶表內容
 62         /// <summary>
 63         /// 根據字段名稱,獲取當前用戶在線表中的內容
 64         /// </summary>
 65         /// <param name="colName">字段名<para/>
 66         /// 可選參數<para/>
 67         /// UserId : 當前用戶的ID編號<para/>
 68         /// LoginDate : 登錄時間<para/>
 69         /// OnlineTime : 在線時長<para/>
 70         /// LoginIp : 當前用戶IP<para/>
 71         /// LoginName : 當前用戶登陸名<para/>
 72         /// CName : 當前用戶中文名<para/>
 73         /// Sex : 當前用戶的性別<para/>
 74         /// BranchId : 部門自動ID<para/>
 75         /// BranchCode : 部門編碼<para/>
 76         /// BranchName : 部門名稱<para/>
 77         /// PositionInfoId : 職位ID<para/>
 78         /// PositionInfoName : 職位名稱<para/>
 79         /// </param>
 80         /// <returns></returns>
 81         public object GetUserOnlineInfo(string colName)
 82         {
 83             return GetUserOnlineInfo(null, colName);
 84         }
 85         /// <summary>
 86         /// 根據字段名稱,獲取指定用戶在線表中的內容
 87         /// </summary>
 88         /// <param name="userHashKey">用戶在線列表的Key</param>
 89         /// <param name="colName">字段名<para/>
 90         /// userId : 當前用戶的ID編號<para/>
 91         /// LoginDate : 登錄時間<para/>
 92         /// OnlineTime : 在線時長<para/>
 93         /// LoginIp : 當前用戶IP<para/>
 94         /// LoginName : 當前用戶登陸名<para/>
 95         /// CName : 當前用戶中文名<para/>
 96         /// Sex : 當前用戶的性別<para/>
 97         /// BranchId : 部門自動ID<para/>
 98         /// BranchCode : 部門編碼<para/>
 99         /// BranchName : 部門名稱<para/>
100         /// PositionInfoId : 職位ID<para/>
101         /// PositionInfoName : 職位名稱<para/>
102         /// </param>
103         /// <returns></returns>
104         public object GetUserOnlineInfo(string userHashKey, string colName)
105         {
106             //由於GetUserHashKey有可能從
107 
108             try
109             {
110                 if (colName == "")
111                 {
112                     return null;
113                 }
114 
115                 if (userHashKey == null)
116                 {
117                     userHashKey = GetUserHashKey() +"";
118                 }
119 
120                 //如果不存在在線表則退出
121                 if (HttpRuntime.Cache["OnlineUsers"] == null || userHashKey == "")
122                     return null;
123 
124                 //返回指定字段的內容
125                 var model = (DataAccess.Model.OnlineUsers)((Hashtable) CacheHelper.GetCache("OnlineUsers"))[userHashKey];
126 
127                 return GetFieldValue(model, colName);
128             }
129             catch (Exception e)
130             {
131                 CommonBll.WriteLog("", e);
132             }
133 
134             return null;
135         }
136         #endregion
137 
138         #region 更新在線用戶信息
139         /// <summary>
140         /// 更新在線用戶信息
141         /// </summary>
142         /// <param name="userId">用戶ID,即在線用戶表中的KEY</param>
143         /// <param name="colName">要更新的字段名稱</param>
144         /// <param name="value">將要賦的值</param>
145         public void UpdateUserOnlineInfo(string userId, string colName, object value)
146         {
147             try
148             {
149                 ((Dictionary<String, object>)((Hashtable)CacheHelper.GetCache("OnlineUsers"))[userId])[colName] = value;
150             }
151             catch (Exception) { }
152         }
153         #endregion
154 
155         #region 獲取在線人數
156         /// <summary>
157         /// 獲取在線人數
158         /// </summary>
159         /// <returns></returns>
160         public int GetUserOnlineCount()
161         {
162             return ((Hashtable)CacheHelper.GetCache("OnlineUsers")).Count;
163         }
164         #endregion
165 
166         #region 更新在線人數
167         /// <summary>
168         /// 更新在線人數,將不在線人員刪除
169         /// </summary>
170         public void UpdateUserOnlineCount()
171         {
172             //獲取在線列表
173             var onlineUsers = (Hashtable)CacheHelper.GetCache("OnlineUsers");
174 
175             //如果不存在在線表則退出
176             if (onlineUsers == null)
177                 return;
178 
179             //初始化下線用戶KEY存儲數組
180             var users = new string[onlineUsers.Count];
181             int i = 0;
182 
183             //循環讀取在線信息
184             foreach (DictionaryEntry de in onlineUsers)
185             {
186                 //判斷該用戶是否在線,不在線的話則將它暫停存儲起來
187                 if (CacheHelper.GetCache("OnlineUsers_" + de.Key) == null)
188                 {
189                     users[i] = de.Key + "";
190                     i++;
191                 }
192             }
193 
194             //移除在線數據
195             for (int j = 0; j < users.Length; j++)
196             {
197                 if (users[j] == null)
198                     break;
199 
200                 //添加用戶下線記錄
201                 LoginLogBll.GetInstence().Save(users[j], "用戶【{0}】退出系統!在線時間【{1}】");
202                 //將HashTable里存儲的前一登陸帳戶移除
203                 Delete(null, x => x.UserHashKey == users[j]);
204                 //移除在線用戶
205                 RemoveUser(users[j]);
206             }
207         }
208         #endregion
209 
210         #region 刪除在線緩存中的用戶
211         /// <summary>
212         /// 刪除在線緩存中的用戶
213         /// </summary>
214         /// <param name="userHashKey"></param>
215         public void RemoveUser(string userHashKey)
216         {
217             //獲取在線列表
218             var onlineUsers = (Hashtable)CacheHelper.GetCache("OnlineUsers");
219 
220             //如果不存在在線表則退出
221             if (onlineUsers == null)
222                 return;
223 
224             //移除在線用戶
225             onlineUsers.Remove(userHashKey);
226         }
227         #endregion
228 
229         #region 判斷用戶是否被強迫離線
230         /// <summary>
231         /// 判斷用戶是否被強迫離線[true是;false否](由於用戶長時間沒有操作系統自動剔除用戶節省資源,管理人員剔除下線)
232         /// </summary>
233         public bool IsOffline(Page page)
234         {
235             try
236             {
237                 //獲取當前用戶Id
238                 var userinfoId = GetManagerId();
239                 //獲取用戶Key
240                 var userHashKey = GetUserHashKey();
241 
242                 //判斷當前用戶是否已經被系統清出
243                 if (userinfoId == 0 || HttpRuntime.Cache.Get("OnlineUsers_" + userHashKey) == null)
244                 {
245                     //通知用戶
246                     FineUI.Alert.Show("您太久沒有操作已退出系統,請重新登錄!", "檢測通知", MessageBoxIcon.Information, "window.location.href='/WebManage/Login.aspx';");
247                     return true;
248                 }
249                 else
250                 {
251                     //判斷在線用戶的Md5與當前用戶存儲的Md5是否一致
252                     if (GenerateMd5() != CookieHelper.GetCookieValue(OnlineUsersTable.Md5))
253                     {
254                         CommonBll.WriteLog("當前帳號已經下線,用戶Id【" + userinfoId + "");
255 
256                         //通知用戶
257                         FineUI.Alert.Show("您的賬號已經在另一處登錄,當前賬號已經下線!", "檢測通知", MessageBoxIcon.Information, "window.location.href='/WebManage/Login.aspx';");
258                         return true;
259                     }
260                 }
261                 return false;
262             }
263             catch (Exception ex)
264             {
265                 CommonBll.WriteLog("Logic.Systems.Manager.CheckIsOffline出現異常", ex);
266 
267                 FineUI.Alert.Show("系統已經開始更新維護,請稍后重新登錄!", "檢測通知", MessageBoxIcon.Information, "window.location.href='/WebManage/Login.aspx';");
268                 return true;
269             }
270 
271         }
272         #endregion
273 
274         #region 判斷用戶是否超時退出
275 
276         /// <summary>
277         /// 判斷用戶是否超時退出(退出情況:1.系統更新,2.用戶自動退出)
278         /// </summary>
279         public void IsTimeOut()
280         {
281             if (HttpContext.Current.Session == null || GetUserHashKey() == null)
282             {
283                 try
284                 {
285                     //不存在則表示Session失效了,重新從Cookies中加載
286                     var userHashKey = CookieHelper.GetCookieValue(OnlineUsersTable.UserHashKey);
287                     var md5 = CookieHelper.GetCookieValue(OnlineUsersTable.Md5);
288 
289                     //判斷Cookies是否存在,存在則查詢在線列表,重新獲取用戶信息
290                     if (userHashKey.Length > 0 && md5.Length == 32)
291                     {
292                         //讀取當前用戶在線實體
293                         var model = GetModelForCache(x => x.UserHashKey == userHashKey);
294                         //當前用戶存在在線列表中
295                         if (model != null)
296                         {
297                             //計算用戶md5值
298                             var key = GenerateMd5(model);
299 
300                             //判斷用戶的md5值是否正確
301                             if (md5 == key)
302                             {
303                                 //將UserHashKey存儲到緩存中
304                                 HttpContext.Current.Session[OnlineUsersTable.UserHashKey] = userHashKey;
305                                 //獲取用戶權限並存儲到用戶Session里
306                                 PositionBll.GetInstence().SetUserPower(model.Position_Id);
307                                 //更新用戶當前SessionId到在線表中
308                                 //UpdateUserOnlineInfo(model.Id + "", OnlineUsersTable.SessionId, HttpContext.Current.Session.SessionID);
309 
310                                 //加載用戶相關信息完畢,退出超時檢查
311                                 return;
312                             }
313                         }
314                     }
315                 }
316                 catch (Exception e)
317                 {
318                     //出現異常,保存出錯日志信息
319                     CommonBll.WriteLog("", e);
320                 }
321                 
322                 
323                 //用戶不存在,直接退出
324                 FineUI.Alert.Show("當前用戶登錄已經過時或系統已更新,請重新登錄!", "檢測通知", MessageBoxIcon.Information, "window.location.href='/WebManage/Login.aspx';");
325                 HttpContext.Current.Response.End();
326             }
327         }
328         #endregion
329 
330         #region 生成加密串——用戶加密密鑰計算
331         /// <summary>
332         /// 生成加密串——用戶加密密鑰計算
333         /// </summary>
334         /// <param name="model">在線實體</param>
335         /// <returns></returns>
336         public string GenerateMd5(DataAccess.Model.OnlineUsers model)
337         {
338             if (model == null)
339             {
340                 return RandomHelper.GetRndKey();
341             }
342             else
343             {
344                 //Md5(密鑰+登陸帳號+密碼+IP+密鑰.Substring(6,8))
345                 return Encrypt.Md5(model.UserKey + model.Manager_LoginName + model.Manager_LoginPass +
346                             IpHelper.GetUserIp() + model.UserKey.Substring(6, 8));
347             }
348         }
349 
350         /// <summary>
351         /// 生成加密串——用戶加密密鑰計算,直接讀取當前用戶實體
352         /// </summary>
353         /// <returns></returns>
354         public string GenerateMd5()
355         {
356             //讀取當前用戶實體
357             var model = GetModelForCache(GetManagerId());
358             return GenerateMd5(model);
359         }
360         #endregion
361 
362         #region 獲取用戶ID
363         /// <summary>
364         /// 從Session中讀取用戶ID,如果Session為Null時,返回0
365         /// </summary>
366         /// <returns></returns>
367         public int GetManagerId()
368         {
369             return ConvertHelper.Cint0(GetUserOnlineInfo(OnlineUsersTable.Manager_Id));
370         }
371         #endregion
372 
373         #region 獲取用戶中文名稱
374         /// <summary>
375         /// 從Session中讀取用戶中文名稱,如果Session為Null時,返回""
376         /// </summary>
377         /// <returns></returns>
378         public string GetManagerCName()
379         {
380             return GetUserOnlineInfo(OnlineUsersTable.Manager_CName) + "";
381         }
382         #endregion
383 
384         #region 獲取用戶UserHashKey
385         /// <summary>
386         /// 獲取用戶UserHashKey
387         /// </summary>
388         /// <returns></returns>
389         public object GetUserHashKey()
390         {
391             //讀取Session中存儲的UserHashKey值
392             var userHashKey = HttpContext.Current.Session[OnlineUsersTable.UserHashKey];
393             //如果為null
394             if (userHashKey == null)
395             {
396                 //為null則表示用戶Session過期了,所以要檢查用戶登陸,避免用戶權限問題
397                 IsTimeOut();
398 
399                 //從Cookies中讀取
400                 userHashKey = CookieHelper.GetCookieValue(OnlineUsersTable.UserHashKey);
401                 //不為null時,重新存儲到Session中
402                 if (userHashKey != null)
403                 {
404                     HttpContext.Current.Session[OnlineUsersTable.UserHashKey] = userHashKey;
405                 }
406             }
407             return userHashKey;
408         }
409         #endregion
410 
411         #region 獲取用戶加密串——用戶加密密鑰Md5值
412         /// <summary>
413         /// 獲取用戶加密串——用戶加密密鑰Md5值
414         /// </summary>
415         /// <returns></returns>
416         public object GetMd5()
417         {
418             //讀取Session中存儲的Md5值
419             var md5 = HttpContext.Current.Session[OnlineUsersTable.Md5];
420             //如果為null
421             if (md5 == null)
422             {
423                 //為null則表示用戶Session過期了,所以要檢查用戶登陸,避免用戶權限問題
424                 IsTimeOut();
425 
426                 //從Cookies中讀取
427                 md5 = CookieHelper.GetCookieValue(OnlineUsersTable.Md5);
428                 //不為null時,重新存儲到Session中
429                 if (md5 != null)
430                 {
431                     HttpContext.Current.Session[OnlineUsersTable.Md5] = md5;
432                 }
433             }
434             return md5;
435         }
436         #endregion
437         
438         #region 獲取用戶頁面操作權限
439         /// <summary>
440         /// 獲取用戶頁面操作權限
441         /// </summary>
442         /// <returns></returns>
443         public string GetPagePower()
444         {
445             //讀取Session中存儲的PagePower值
446             var pagePower = HttpContext.Current.Session[PositionTable.PagePower];
447             //如果為null
448             if (pagePower == null)
449             {
450                 //獲取用戶權限並存儲到用戶Session里
451                 PositionBll.GetInstence().SetUserPower(GetUserOnlineInfo(OnlineUsersTable.Position_Id) + "");
452             }
453             pagePower = HttpContext.Current.Session[PositionTable.PagePower];
454             return pagePower + "";
455         }
456         #endregion
457 
458         #region 獲取用戶頁面控件(按鍵)操作權限
459         /// <summary>
460         /// 獲取用戶頁面控件(按鍵)操作權限
461         /// </summary>
462         /// <returns></returns>
463         public string GetControlPower()
464         {
465             //讀取Session中存儲的ControlPower值
466             var controlPower = HttpContext.Current.Session[PositionTable.ControlPower];
467             //如果為null
468             if (controlPower == null)
469             {
470                 //獲取用戶權限並存儲到用戶Session里
471                 PositionBll.GetInstence().SetUserPower(GetUserOnlineInfo(OnlineUsersTable.Position_Id) + "");
472             }
473             controlPower = HttpContext.Current.Session[PositionTable.ControlPower];
474             return controlPower + "";
475         }
476         #endregion
477 
478         #endregion 自定義函數
479     }
480 }
View Code

 

  點擊下載:

由於框架不是非常成熟,很多朋友不是用來學習而是直接用到項目中,但不熟悉框架引起不少小問題,所以停止提供下載,有需要學習的可以到群共享里下,不便之處敬請諒解。

 由於本解決方案開發時沒有經過調試,所以存在一些小BUG,這些會在下一章節發布的代碼中解決,大家先自行熟悉一下代碼與結構就可以了

 

 

 

 版權聲明:

  本文由AllEmpty原創並發布於博客園,歡迎轉載,未經本人同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。如有問題,可以通過1654937@qq.com 聯系我,非常感謝。

 

  發表本編內容,只要主為了和大家共同學習共同進步,有興趣的朋友可以加加Q群:327360708 ,大家一起探討。

 

  更多內容,敬請觀注博客:http://www.cnblogs.com/EmptyFS/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM