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

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 }
有朋友可能會有疑問,為什么本類要用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 }

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 }
原來的模板根據需要也對應做出了相應調整
我們在第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 }
看看效果:
這個是編輯頁面的路徑,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 }
點擊下載:
由於框架不是非常成熟,很多朋友不是用來學習而是直接用到項目中,但不熟悉框架引起不少小問題,所以停止提供下載,有需要學習的可以到群共享里下,不便之處敬請諒解。
由於本解決方案開發時沒有經過調試,所以存在一些小BUG,這些會在下一章節發布的代碼中解決,大家先自行熟悉一下代碼與結構就可以了
版權聲明:
本文由AllEmpty原創並發布於博客園,歡迎轉載,未經本人同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。如有問題,可以通過1654937@qq.com 聯系我,非常感謝。
發表本編內容,只要主為了和大家共同學習共同進步,有興趣的朋友可以加加Q群:327360708 ,大家一起探討。
更多內容,敬請觀注博客:http://www.cnblogs.com/EmptyFS/