从零开始编写自己的C#框架(17)——Web层后端首页
后端首頁(yè)是管理員登陸后進(jìn)入的第一個(gè)頁(yè)面,主要是顯示當(dāng)前登陸用戶信息、在線人數(shù)、菜單樹列表、相關(guān)功能按鍵和系統(tǒng)介紹。讓管理員能更方便的找到息想要的內(nèi)容。
根據(jù)不同系統(tǒng)的需要,首頁(yè)會(huì)顯示不同的內(nèi)容,比如顯示公司公告、公司新聞、內(nèi)部短消息、個(gè)人事務(wù)、各種業(yè)務(wù)提醒......等各種內(nèi)容,這些大家可以需要去進(jìn)行呈現(xiàn)。
先上代碼
Main.aspx
1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Main.aspx.cs" Inherits="Solution.Web.Managers.Main" %> 2 3 <!DOCTYPE html> 4 <html xmlns="http://www.w3.org/1999/xhtml"> 5 <head id="Head2" runat="server"> 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 7 <title>從零開始編寫自己的C#框架——后端管理系統(tǒng)</title> 8 <style type="text/css"> 9 body.f-theme-neptune .header 10 { 11 background-color: #005999; 12 border-bottom: 1px solid #1E95EC; 13 } 14 15 body.f-theme-neptune .header .x-panel-body 16 { 17 background-color: transparent; 18 } 19 20 body.f-theme-neptune .header .title a 21 { 22 font-weight: bold; 23 font-size: 24px; 24 text-decoration: none; 25 line-height: 50px; 26 margin-left: 10px; 27 } 28 .label 29 { 30 color: #80ACCC; 31 } 32 .content 33 { 34 color: #fff; 35 } 36 </style> 37 </head> 38 <body> 39 <form id="form1" runat="server"> 40 <f:PageManager ID="PageManager1" AutoSizePanelID="regionPanel" runat="server" /> 41 <f:Timer ID="Timer1" Interval="60" Enabled="false" OnTick="Timer1_Tick" runat="server"> 42 </f:Timer> 43 <f:RegionPanel ID="regionPanel" ShowBorder="false" runat="server"> 44 <Regions> 45 <f:Region ID="regionTop" ShowBorder="false" ShowHeader="false" Position="Top" Layout="Fit" 46 runat="server"> 47 <Toolbars> 48 <f:Toolbar ID="Toolbar1" Position="Bottom" runat="server" CssClass="topbar content" 49 CssStyle="border-bottom: 1px solid #1E95EC;background-color: #005999;"> 50 <Items> 51 <f:ToolbarText Text="歡迎您:" runat="server" CssClass="label"> 52 </f:ToolbarText> 53 <f:ToolbarText ID="txtUser" runat="server" CssClass="content"> 54 </f:ToolbarText> 55 <f:ToolbarText Text="部門:" runat="server" CssClass="label"> 56 </f:ToolbarText> 57 <f:ToolbarText ID="txtBranchName" runat="server" CssClass="content"> 58 </f:ToolbarText> 59 <f:ToolbarText Text="職位:" runat="server" CssClass="label"> 60 </f:ToolbarText> 61 <f:ToolbarText ID="txtPositionInfoName" runat="server" CssClass="content"> 62 </f:ToolbarText> 63 <f:ToolbarText Text="在線人數(shù):" runat="server" CssClass="label"> 64 </f:ToolbarText> 65 <f:ToolbarText ID="txtOnlineUserCount" runat="server" CssClass="content"> 66 </f:ToolbarText> 67 <f:ToolbarFill runat="server" /> 68 <f:Button ID="btnClearCache" runat="server" Icon="controlblank" Text="清除后端緩存" OnClick="btnClearCache_Click" 69 EnablePostBack="false" CssStyle="background-color: transparent;background-image: none !important;border-width: 0 !important;"> 70 </f:Button> 71 <f:Button ID="btnCalendar" runat="server" Icon="Calendar" Text="萬年歷" EnablePostBack="false" 72 CssStyle="background-color: transparent;background-image: none !important;border-width: 0 !important;"> 73 </f:Button> 74 <f:Button ID="btnHelp" EnablePostBack="false" Icon="Help" Text="幫助" runat="server" 75 CssStyle="background-color: transparent;background-image: none !important;border-width: 0 !important;"> 76 </f:Button> 77 <f:Button ID="btnExit" runat="server" Icon="UserRed" Text="安全退出" ConfirmText="確定退出系統(tǒng)?" 78 OnClick="btnExit_Click" CssStyle="background-color: transparent;background-image: none !important;border-width: 0 !important;"> 79 </f:Button> 80 </Items> 81 </f:Toolbar> 82 </Toolbars> 83 </f:Region> 84 <f:Region ID="Region2" Split="true" Width="200px" ShowHeader="true" Title="菜單" EnableCollapse="true" 85 Layout="Fit" Position="Left" runat="server"> 86 <Items> 87 <f:Tree runat="server" ShowBorder="false" ShowHeader="false" EnableArrows="true" 88 EnableLines="true" ID="leftMenuTree"> 89 </f:Tree> 90 </Items> 91 </f:Region> 92 <f:Region ID="mainRegion" ShowHeader="false" Layout="Fit" Position="Center" runat="server"> 93 <Items> 94 <f:TabStrip ID="mainTabStrip" EnableTabCloseMenu="true" ShowBorder="false" runat="server"> 95 <Tabs> 96 <f:Tab ID="Tab1" Title="首頁(yè)" Layout="Fit" Icon="House" runat="server"> 97 <Items> 98 <f:ContentPanel ID="ContentPanel2" ShowBorder="false" BodyPadding="10px" ShowHeader="false" 99 AutoScroll="true" runat="server"> 100 <h2> 101 從零開始編寫自己的C#框架</h2> 102 本框架由AllEmpty原創(chuàng)并發(fā)布于博客園,采用Apache License v2.0軟件授權(quán)許可,歡迎大家試用。大家在使用時(shí),請(qǐng)?jiān)谲浖创a中保留本人的相關(guān)版權(quán)信息,謝謝。 103 <br /> 104 發(fā)表本框架源碼,主要是為了和大家共同學(xué)習(xí)共同進(jìn)步,如果你支持本系列文章的繼續(xù)發(fā)表或有更好的建議,請(qǐng)對(duì)相關(guān)文章回復(fù)你的看法與點(diǎn)擊推薦,有興趣的朋友還可以加加Q群:327360708 105 ,大家一起探討。 106 <br /> 107 更多內(nèi)容,敬請(qǐng)關(guān)注博客:<a href="http://www.cnblogs.com/EmptyFS/" target="_blank">http://www.cnblogs.com/EmptyFS/</a> 108 <br /> 109 <br /> 110 <a href="http://www.cnblogs.com/EmptyFS/tag/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%BC%96%E5%86%99%E8%87%AA%E5%B7%B1%E7%9A%84C%23%E6%A1%86%E6%9E%B6/" 111 target="_blank">從零開始編寫自己的C#框架章節(jié)目錄</a> 112 <br /> 113 <br /> 114 <br /> 115 <h2> 116 使用技術(shù)</h2> 117 <br /> 118 本框架使用ASP.NET(C#)、MsSql、SubSonic3.0、FineUI、Linq、T4模板、IIS緩存等相關(guān)技術(shù) 119 <br /> 120 <br /> 121 <a href="https://github.com/subsonic" target="_blank">SubSonic</a>是<span style="font-size: 16px;"><a 122 href="http://www.wekeroad.com/" target="_blank">Rob Conery</a><span style="font-size: 16px;">用c#語(yǔ)言寫的</span></span>一 123 個(gè)ORM開源框架,使用BSD軟件授權(quán)許可(The BSD 3-Clause License)。它是一個(gè)實(shí)用的快速開發(fā)框架,通過非常簡(jiǎn)單的配置,以及附帶的T4模板,就可以幫我們生成功能強(qiáng)大的數(shù)據(jù)訪問層工具,讓開發(fā)人員遠(yuǎn)離SQL語(yǔ)句的拼接,專注于業(yè)務(wù)邏輯的開發(fā)。 124 <br /> 125 <a target="_blank" style="font-weight: bold;" href="http://fineui.com/">FineUI</a>是<a 126 href="http://cnblogs.com/sanshi/" target="_blank">三生石上</a> 和 <a href="http://www.codeplex.com/site/users/view/RingoDing" 127 target="_blank">RingoDing</a> 創(chuàng)建并維護(hù)。使用Apache License v2.0軟件授權(quán)許可(ExtJS 庫(kù)在 128 <a target="_blank" href="http://www.sencha.com/license">GPL v3</a> 協(xié)議下發(fā)布)。它基于 jQuery 129 / ExtJS 的 ASP.NET 控件庫(kù),創(chuàng)建 No JavaScript,No CSS,No UpdatePanel,No ViewState,No WebServices 130 的網(wǎng)站應(yīng)用程序 131 <br /> 132 <br /> 133 <h2> 134 支持的瀏覽器</h2> 135 IE 8.0+、Chrome、Firefox、Opera、Safari 136 <br /> 137 <br /> 138 <br /> 139 <br /> 140 注:本框架不內(nèi)置 ExtJS 庫(kù),請(qǐng)自行下載ExtJS 庫(kù)后手工添加:<a target="_blank" href="http://fineui.com/bbs/forum.php?mod=viewthread&tid=3218">http://fineui.com/bbs/forum.php?mod=viewthread&tid=3218</a> 141 </f:ContentPanel> 142 </Items> 143 </f:Tab> 144 </Tabs> 145 </f:TabStrip> 146 </Items> 147 </f:Region> 148 </Regions> 149 </f:RegionPanel> 150 <f:Window ID="Window1" runat="server" IsModal="true" Hidden="true" EnableIFrame="true" 151 EnableResize="true" EnableMaximize="true" IFrameUrl="about:blank" Width="650px" 152 Height="450px"> 153 </f:Window> 154 </form> 155 <script> 156 var menuClientID = '<%= leftMenuTree.ClientID %>'; 157 var tabStripClientID = '<%= mainTabStrip.ClientID %>'; 158 159 // 頁(yè)面控件初始化完畢后,會(huì)調(diào)用用戶自定義的onReady函數(shù) 160 F.ready(function () { 161 162 // 初始化主框架中的樹(或者Accordion+Tree)和選項(xiàng)卡互動(dòng),以及地址欄的更新 163 // treeMenu: 主框架中的樹控件實(shí)例,或者內(nèi)嵌樹控件的手風(fēng)琴控件實(shí)例 164 // mainTabStrip: 選項(xiàng)卡實(shí)例 165 // createToolbar: 創(chuàng)建選項(xiàng)卡前的回調(diào)函數(shù)(接受tabConfig參數(shù)) 166 // updateLocationHash: 切換Tab時(shí),是否更新地址欄Hash值 167 // refreshWhenExist: 添加選項(xiàng)卡時(shí),如果選項(xiàng)卡已經(jīng)存在,是否刷新內(nèi)部IFrame 168 // refreshWhenTabChange: 切換選項(xiàng)卡時(shí),是否刷新內(nèi)部IFrame 169 F.util.initTreeTabStrip(F(menuClientID), F(tabStripClientID), null, true, false, false); 170 171 }); 172 </script> 173 </body> 174 </html> View CodeMain.aspx.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using System.Web; 5 using DotNet.Utilities; 6 using FineUI; 7 using Solution.DataAccess.DataModel; 8 using Solution.DataAccess.DbHelper; 9 using Solution.Logic.Managers; 10 using Solution.Web.Managers.WebManage.Application; 11 using SubSonic.Query; 12 13 namespace Solution.Web.Managers 14 { 15 public partial class Main : PageBase 16 { 17 //用戶頁(yè)面操作權(quán)限 18 string _pagePower = ""; 19 20 #region Page_Load 21 protected void Page_Load(object sender, EventArgs e) 22 { 23 if (!IsPostBack) 24 { 25 //添加萬年歷按鍵事件,在主窗口中添加新選項(xiàng)卡 26 btnCalendar.OnClientClick = mainTabStrip.GetAddTabReference("calendar_tab", "/WebManage/Help/wannianli.htm", "萬年歷", IconHelper.GetIconUrl(Icon.Calendar), true); 27 28 //加載信息 29 LoadData(); 30 } 31 } 32 #endregion 33 34 #region 接口函數(shù),用于UI頁(yè)面初始化,給邏輯層對(duì)象、列表等對(duì)象賦值 35 public override void Init() 36 { 37 38 } 39 #endregion 40 41 #region 加載數(shù)據(jù) 42 43 /// <summary>讀取數(shù)據(jù)</summary> 44 public override void LoadData() 45 { 46 #region 展示用戶信息 47 48 //在線人數(shù) 49 txtOnlineUserCount.Text = OnlineUsersBll.GetInstence().GetUserOnlineCount() + ""; 50 51 //當(dāng)前用戶信息 52 var userHashKey = OnlineUsersBll.GetInstence().GetUserHashKey(); 53 var model = OnlineUsersBll.GetInstence().GetModelForCache(x => x.UserHashKey == userHashKey); 54 if (model == null) 55 return; 56 57 //用戶名稱 58 txtUser.Text = model.Manager_CName + " [" + IpHelper.GetUserIp() + "]"; 59 60 //部門 61 txtBranchName.Text = model.Branch_Name; 62 //職位 63 txtPositionInfoName.Text = model.Position_Name; 64 #endregion 65 66 #region 菜單欄數(shù)據(jù)綁定 67 //獲取用戶頁(yè)面操作權(quán)限 68 _pagePower = OnlineUsersBll.GetInstence().GetPagePower(); 69 70 71 //創(chuàng)建查詢條件 72 var wheres = new List<ConditionFun.SqlqueryCondition>(); 73 //條件:只查詢出需要顯示的菜單 74 wheres.Add(new ConditionFun.SqlqueryCondition(ConstraintType.And, MenuInfoTable.IsDisplay, Comparison.Equals, 1)); 75 //進(jìn)行查詢,獲取DataTable 76 var dt = MenuInfoBll.GetInstence().GetDataTable(false, 0, null, 0, 0, wheres); 77 //綁定樹列表 78 BandingTree(dt); 79 80 #endregion 81 82 #region 開啟時(shí)鐘檢測(cè) 83 Timer1.Enabled = true; 84 #endregion 85 86 } 87 #endregion 88 89 #region 頁(yè)面按鍵 90 91 #region 清空緩存并重新加載 92 /// <summary> 93 /// 清空緩存并重新加載 94 /// </summary> 95 /// <param name="sender"></param> 96 /// <param name="e"></param> 97 protected void btnClearCache_Click(object sender, EventArgs e) 98 { 99 //清空全部后端緩存HttpRuntime.Cache(在線列表緩存除外) 100 CacheHelper.RemoveManagersAllCache(); 101 } 102 #endregion 103 104 #region 退出系統(tǒng) 105 /// <summary> 106 /// 退出系統(tǒng) 107 /// </summary> 108 /// <param name="sender"></param> 109 /// <param name="e"></param> 110 protected void btnExit_Click(object sender, EventArgs e) 111 { 112 LoginLogBll.GetInstence().UserExit(); 113 114 FineUI.Alert.ShowInTop("成功退出系統(tǒng)!", "安全退出", MessageBoxIcon.Information, "top.location='Login.aspx'"); 115 } 116 #endregion 117 118 #endregion 119 120 #region 定時(shí)器 121 /// <summary> 122 /// 定時(shí)執(zhí)行方法 123 /// </summary> 124 /// <param name="sender"></param> 125 /// <param name="e"></param> 126 protected void Timer1_Tick(object sender, EventArgs e) 127 { 128 Timer1.Enabled = false; 129 130 #region 檢測(cè)當(dāng)前用戶是否退出 131 OnlineUsersBll.GetInstence().IsTimeOut(); 132 #endregion 133 134 #region 檢測(cè)用戶登錄的有效性(是否被系統(tǒng)踢下線或管理員踢下線) 135 if (OnlineUsersBll.GetInstence().IsOffline(this)) 136 return; 137 #endregion 138 139 #region 更新信息(在線人數(shù),未讀取的短消息) 140 if (HttpRuntime.Cache == null) 141 { 142 txtOnlineUserCount.Text = "--"; 143 } 144 else 145 { 146 //更新當(dāng)前在線用戶數(shù)量 147 txtOnlineUserCount.Text = OnlineUsersBll.GetInstence().GetUserOnlineCount() + ""; 148 } 149 #endregion 150 151 #region 修改用戶最后在線時(shí)間 152 153 //修改用戶最后在線時(shí)間 154 OnlineUsersBll.GetInstence().UpdateTime(); 155 156 #endregion 157 158 Timer1.Enabled = true; 159 } 160 #endregion 161 162 #region FineUI控件之--樹控件(Tree) 163 164 #region 綁定樹控件 165 /// <summary>樹控件(Tree) 166 /// </summary> 167 /// <param name="dataTable">DataTable數(shù)據(jù)源</param> 168 /// <returns>樹控件(Tree)</returns> 169 public void BandingTree(DataTable dataTable) 170 { 171 try 172 { 173 //檢查指定的列是否在數(shù)據(jù)源中能否找到 174 if (dataTable.Rows.Count == 0) 175 { 176 return; 177 } 178 //篩選出全部一級(jí)節(jié)點(diǎn) 179 DataTable dtRoot = DataTableHelper.GetFilterData(dataTable, MenuInfoTable.ParentId, "0", MenuInfoTable.Sort, "Asc"); 180 //判斷是否有節(jié)點(diǎn)存在 181 if (dtRoot.Rows.Count != 0) 182 { 183 //循環(huán)讀取節(jié)點(diǎn) 184 foreach (DataRow dr in dtRoot.Rows) 185 { 186 //判斷當(dāng)前節(jié)點(diǎn)是否有權(quán)限訪問,沒有則跳過本次循環(huán) 187 //暫時(shí)先注釋掉權(quán)限判斷,等添加相關(guān)權(quán)限后再開啟 188 //if (_pagePower.IndexOf("," + dr[MenuInfoTable.Id].ToString() + ",") < 0) 189 //{ 190 // continue; 191 //} 192 193 //創(chuàng)建樹節(jié)點(diǎn) 194 var treenode = new FineUI.TreeNode(); 195 //設(shè)置節(jié)點(diǎn)ID 196 treenode.NodeID = dr[MenuInfoTable.Id].ToString(); 197 //設(shè)置節(jié)點(diǎn)名稱 198 treenode.Text = dr[MenuInfoTable.Name].ToString(); 199 treenode.Target = "mainRegion"; 200 //判斷當(dāng)前節(jié)點(diǎn)是否為最終節(jié)點(diǎn) 201 if (int.Parse(dr[MenuInfoTable.IsMenu].ToString()) != 0) 202 { 203 //設(shè)置節(jié)點(diǎn)鏈接地址,并在Url后面添加頁(yè)面加密參數(shù) 204 treenode.NavigateUrl = dr[MenuInfoTable.Url].ToString() + "?" + MenuInfoBll.GetInstence().PageUrlEncryptString(); 205 treenode.Leaf = true; 206 } 207 else 208 { 209 treenode.NavigateUrl = ""; 210 treenode.Leaf = false; 211 //設(shè)置樹節(jié)點(diǎn)收縮起來 212 treenode.Expanded = false; 213 } 214 215 //添加子節(jié)點(diǎn) 216 AddChildrenNode(dataTable, treenode, dr[MenuInfoTable.Id].ToString()); 217 //將節(jié)點(diǎn)加入樹列表中 218 leftMenuTree.Nodes.Add(treenode); 219 } 220 } 221 } 222 catch (Exception ex) 223 { 224 CommonBll.WriteLog("", ex); 225 } 226 } 227 #endregion 228 229 #region 添加子節(jié)點(diǎn) 230 /// <summary> 231 /// 添加子節(jié)點(diǎn) 232 /// </summary> 233 /// <param name="dt">數(shù)據(jù)表</param> 234 /// <param name="treenode">當(dāng)前樹節(jié)點(diǎn)</param> 235 /// <param name="parentID">父節(jié)點(diǎn)ID值</param> 236 private void AddChildrenNode(DataTable dt, FineUI.TreeNode treenode, string parentID) 237 { 238 //篩選出當(dāng)前節(jié)點(diǎn)下面的子節(jié)點(diǎn) 239 DataTable Childdt = DataTableHelper.GetFilterData(dt, MenuInfoTable.ParentId, parentID, MenuInfoTable.Sort, "Asc"); 240 //判斷是否有節(jié)點(diǎn)存在 241 if (Childdt.Rows.Count > 0) 242 { 243 //循環(huán)讀取節(jié)點(diǎn) 244 foreach (DataRow dr in Childdt.Rows) 245 { 246 //判斷當(dāng)前節(jié)點(diǎn)是否有權(quán)限訪問,沒有則跳過本次循環(huán) 247 //if (_pagePower.IndexOf("," + dr[MenuInfoTable.Id].ToString() + ",") < 0) 248 //{ 249 // continue; 250 //} 251 252 //創(chuàng)建子節(jié)點(diǎn) 253 var TreeChildNode = new FineUI.TreeNode(); 254 //設(shè)置節(jié)點(diǎn)ID 255 TreeChildNode.NodeID = dr[MenuInfoTable.Id].ToString(); 256 //設(shè)置節(jié)點(diǎn)名稱 257 TreeChildNode.Text = dr[MenuInfoTable.Name].ToString(); 258 TreeChildNode.Target = "mainRegion"; 259 //判斷當(dāng)前節(jié)點(diǎn)是否為最終節(jié)點(diǎn) 260 if (int.Parse(dr[MenuInfoTable.IsMenu].ToString()) != 0) 261 { 262 //設(shè)置節(jié)點(diǎn)鏈接地址 263 if (dr[MenuInfoTable.Url].ToString().IndexOf("?") > 0) 264 { 265 TreeChildNode.NavigateUrl = dr[MenuInfoTable.Url].ToString() + "&" + MenuInfoBll.GetInstence().PageUrlEncryptString(); 266 } 267 else 268 { 269 TreeChildNode.NavigateUrl = dr[MenuInfoTable.Url].ToString() + "?" + MenuInfoBll.GetInstence().PageUrlEncryptString(); 270 } 271 //TreeChildNode.NavigateUrl = dr[MenuInfoTable.Url].ToString() + "?" + MenuInfoBll.PageURLEncryptString(); 272 TreeChildNode.Leaf = true; 273 } 274 else 275 { 276 TreeChildNode.NavigateUrl = ""; 277 TreeChildNode.Leaf = false; 278 //設(shè)置樹節(jié)點(diǎn)擴(kuò)張 279 TreeChildNode.Expanded = true; 280 } 281 //將節(jié)點(diǎn)添加進(jìn)樹列表中 282 treenode.Nodes.Add(TreeChildNode); 283 284 //遞歸添加子節(jié)點(diǎn) 285 AddChildrenNode(dt, TreeChildNode, dr[MenuInfoTable.Id].ToString()); 286 287 } 288 289 } 290 291 } 292 293 #endregion 294 295 #endregion 296 297 } 298 } View Code?
1、Main.aspx頁(yè)面說明
Main.aspx頁(yè)面主要使用的是FineUI發(fā)布的空項(xiàng)目改造而來的,在這個(gè)基礎(chǔ)上,頂部添加了當(dāng)前用戶的相關(guān)信息、在線人數(shù),以及清除緩存、萬年歷和退出等按鍵。
添加了<f:Timer ID="Timer1" Interval="60" Enabled="false" OnTick="Timer1_Tick" runat="server">定時(shí)器功能,它每60秒會(huì)運(yùn)行一次,執(zhí)行Timer1_Tick函數(shù),檢查當(dāng)前用戶是否已退出,檢查當(dāng)前用戶帳號(hào)是否已在其他電腦或?yàn)g覽器上登陸或給管理員踢出系統(tǒng),更新頂部當(dāng)前在線人數(shù),更新用戶最后在線時(shí)間(用于檢查用戶是否超時(shí)離線退出)
1 #region 定時(shí)器 2 /// <summary> 3 /// 定時(shí)執(zhí)行方法 4 /// </summary> 5 /// <param name="sender"></param> 6 /// <param name="e"></param> 7 protected void Timer1_Tick(object sender, EventArgs e) 8 { 9 Timer1.Enabled = false; 10 11 #region 檢測(cè)當(dāng)前用戶是否退出 12 OnlineUsersBll.GetInstence().IsTimeOut(); 13 #endregion 14 15 #region 檢測(cè)用戶登錄的有效性(是否被系統(tǒng)踢下線或管理員踢下線) 16 if (OnlineUsersBll.GetInstence().IsOffline(this)) 17 return; 18 #endregion 19 20 #region 更新信息(在線人數(shù),未讀取的短消息) 21 if (HttpRuntime.Cache == null) 22 { 23 txtOnlineUserCount.Text = "--"; 24 } 25 else 26 { 27 //更新當(dāng)前在線用戶數(shù)量 28 txtOnlineUserCount.Text = OnlineUsersBll.GetInstence().GetUserOnlineCount() + ""; 29 } 30 #endregion 31 32 #region 修改用戶最后在線時(shí)間 33 34 //修改用戶最后在線時(shí)間 35 OnlineUsersBll.GetInstence().UpdateTime(); 36 37 #endregion 38 39 Timer1.Enabled = true; 40 } 41 #endregion?
2、Main.aspx.cs文件父類
它繼承PageBase類,頁(yè)面在加載的時(shí)間,就會(huì)自動(dòng)調(diào)用父類的OnInit初始化函數(shù),運(yùn)行里面的程序,來檢查當(dāng)前用戶是否退出,是否有當(dāng)前頁(yè)面的操作權(quán)限,設(shè)置放置在頁(yè)面控件Id為toolBar中的各個(gè)按鍵是否有權(quán)限使用。并記錄用戶當(dāng)前所在位置。
?
3、添加頁(yè)面按鍵事件
對(duì)于FineUI的頁(yè)面按鍵事件,共一兩種,一種是服務(wù)器端事件OnClick,一種是客戶端事件OnClientClick。
添加了服務(wù)器端事件OnClick事件后,必須在cs文件中添加對(duì)應(yīng)的事件函數(shù),比如清空緩存按鍵(btnClearCache_Click)與安全退出按鍵(btnExit_Click)
1 #region 頁(yè)面按鍵 2 3 #region 清空緩存并重新加載 4 /// <summary> 5 /// 清空緩存并重新加載 6 /// </summary> 7 /// <param name="sender"></param> 8 /// <param name="e"></param> 9 protected void btnClearCache_Click(object sender, EventArgs e) 10 { 11 //清空全部后端緩存HttpRuntime.Cache(在線列表緩存除外) 12 CacheHelper.RemoveManagersAllCache(); 13 } 14 #endregion 15 16 #region 退出系統(tǒng) 17 /// <summary> 18 /// 退出系統(tǒng) 19 /// </summary> 20 /// <param name="sender"></param> 21 /// <param name="e"></param> 22 protected void btnExit_Click(object sender, EventArgs e) 23 { 24 LoginLogBll.GetInstence().UserExit(); 25 26 FineUI.Alert.ShowInTop("成功退出系統(tǒng)!", "安全退出", MessageBoxIcon.Information, "top.location='Login.aspx'"); 27 } 28 #endregion清空緩存按鍵主要功能:清除當(dāng)前IIS應(yīng)用程序池中除在線緩存以外的所有HttpRuntime.Cache緩存
安全退出按鍵主要功能:刪除當(dāng)前登陸用戶的所有緩存、Session與Cookies記錄,并添加用戶退出日志。
點(diǎn)擊退出后日志記錄信息(LoginLog表):
?
而客戶端事件OnClientClick,只需要在頁(yè)面中添加JS代碼,它就會(huì)直接執(zhí)行對(duì)應(yīng)的JS函數(shù),不與服務(wù)器端進(jìn)行直接交互。
?
當(dāng)前除了以上添加按鍵事件外,還可以直接在代碼中綁定控件事件方法(添加新選項(xiàng)卡還有其他一些方法,不過以這一種最為方便)
1 #region Page_Load 2 protected void Page_Load(object sender, EventArgs e) 3 { 4 if (!IsPostBack) 5 { 6 //添加萬年歷按鍵事件,在主窗口中添加新選項(xiàng)卡 7 btnCalendar.OnClientClick = mainTabStrip.GetAddTabReference("calendar_tab", "/WebManage/Help/wannianli.htm", "萬年歷", IconHelper.GetIconUrl(Icon.Calendar), true); 8 9 //加載信息 10 LoadData(); 11 } 12 } 13 #endregion以上代碼主要是為萬年歷按鍵添加一個(gè)事件,點(diǎn)擊按鍵后,在首頁(yè)標(biāo)簽旁邊新增一個(gè)選項(xiàng)卡,打開萬年歷頁(yè)面。這些FineUI的范例官網(wǎng)上有,大家自行學(xué)習(xí)就可以了。
?
4、展示用戶信息
這個(gè)比較簡(jiǎn)單,在LoadData函數(shù)中,直接從在線緩存中讀取當(dāng)前用戶實(shí)體后,為頁(yè)面頂部控件賦值就可以了。
在這里簡(jiǎn)單的講講LoadData函數(shù),這是父類的抽像函數(shù)(因?yàn)槊總€(gè)子類都必須將它實(shí)現(xiàn),所以將它從虛函數(shù)改為抽像函數(shù)),在每個(gè)子類中都必須要重寫它,它的主要功能是加載數(shù)據(jù),列表頁(yè)面主要加載的是列表中需要顯示的記錄,而編輯頁(yè)面加載的是各個(gè)頁(yè)面的實(shí)體,將它們與頁(yè)面控件進(jìn)行綁定并顯示出來。實(shí)現(xiàn)了該函數(shù)后,它將會(huì)被父類中的其他各種函數(shù)引用,比如刷新、查詢、翻頁(yè)、保存排序、自動(dòng)排序、刪除、關(guān)閉子窗口......等函數(shù)執(zhí)行完后會(huì)調(diào)用它來重新加載數(shù)據(jù),刷新頁(yè)面顯示內(nèi)容,具體大家可以查看PageBase.cs類,看看有那些函數(shù)引用了LoadData函數(shù)就知道了。
?
5、綁定菜單欄樹列表
首先將所有可以顯示的菜單全部讀取出來
下面是LoadData函數(shù)中的一段代碼
1 #region 菜單欄數(shù)據(jù)綁定 2 //獲取用戶頁(yè)面操作權(quán)限 3 _pagePower = OnlineUsersBll.GetInstence().GetPagePower(); 4 5 6 //創(chuàng)建查詢條件 7 var wheres = new List<ConditionFun.SqlqueryCondition>(); 8 //條件:只查詢出需要顯示的菜單 9 wheres.Add(new ConditionFun.SqlqueryCondition(ConstraintType.And, MenuInfoTable.IsDisplay, Comparison.Equals, 1)); 10 //進(jìn)行查詢,獲取DataTable 11 var dt = MenuInfoBll.GetInstence().GetDataTable(false, 0, null, 0, 0, wheres); 12 //綁定樹列表 13 BandingTree(dt); 14 15 #endregionConditionFun.SqlqueryCondition是封裝好的查詢條件類。
第一個(gè)參數(shù)為查詢表達(dá)式,即當(dāng)前條件與前一條件使用的表達(dá)式是And還是Or;
第二個(gè)參數(shù)是想要查詢的列表名稱,這里我們使用的是表名+Table.列名的方式調(diào)用,這樣操作的話可以使我們的代碼去除硬編碼,好處是當(dāng)我們?nèi)f一修改了數(shù)據(jù)庫(kù)字段名稱后,重新生成相關(guān)的模板并按F6重新編譯代碼時(shí),就會(huì)直接報(bào)出所有未同步修改的代碼錯(cuò)誤位置出來,讓我們能快速定位并修改掉它,而硬編碼(指的是直接使用類似"IsDisplay"這種字段書寫格式的代碼)則不會(huì)報(bào)錯(cuò),代碼量多時(shí)我們將很難找出問題,直接程序執(zhí)行到對(duì)應(yīng)位置時(shí)才會(huì)拋出異常。
第三個(gè)參數(shù)是條件值表達(dá)式,表示當(dāng)前列與值的關(guān)系,比如:等于、大于、小于、in、not in、like......等;
第四個(gè)參數(shù)是條件值
在這里要同大家說明的是,SubSonic3.0對(duì)于括號(hào)支持的不是很多,只支持單層括號(hào),嵌套括號(hào)時(shí)將會(huì)出錯(cuò),為了避免這種問題,建議多括號(hào)做為條件值查詢時(shí),請(qǐng)使用Linq表達(dá)式來查詢(Lambd表達(dá)式),或者存儲(chǔ)過程。具體加括號(hào)后的使用方法在后面章節(jié)會(huì)詳細(xì)的進(jìn)行說明。
MenuInfoBll.GetInstence().GetDataTable()函數(shù)是我們邏輯層生成好的模板函數(shù),我們直接調(diào)用就可以了。(我們后端開發(fā)對(duì)于數(shù)據(jù)的增、刪、查、改等操作函數(shù)幾乎都已經(jīng)生成好了,直接調(diào)用就可以)
通過執(zhí)行BandingTree函數(shù)與AddChildrenNode函數(shù),將菜單樹列表創(chuàng)建后綁定<f:Tree runat="server" ShowBorder="false" ShowHeader="false" EnableArrows="true" EnableLines="true" ID="leftMenuTree"></f:Tree>控件
下面通過向MenuInfo表添加一些菜單記錄來演示我們首頁(yè)中的樹列表顯示效果
1 TRUNCATE TABLE MenuInfo 2 GO 3 4 set IDENTITY_INSERT MenuInfo on 5 GO 6 7 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (1, '系統(tǒng)管理', '/WebManage/Systems/SysAuthority/', 0, 6, 0, 1, 0) 8 GO 9 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (2, '基本設(shè)置', '/WebManage/Systems/SysSet/', 1, 1, 1, 1, 0) 10 GO 11 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (3, '權(quán)限管理', '/WebManage/Systems/SysAuthority/', 1, 2, 1, 1, 0) 12 GO 13 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (5, '安全管理', '/WebManage/Systems/SysSecurity/', 1, 3, 1, 1, 0) 14 GO 15 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (6, '網(wǎng)站參數(shù)設(shè)置', '/WebManage/Systems/SysSet/WebConfigSet.aspx', 2, 1, 2, 1, 1) 16 GO 17 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (11, '菜單管理', '/WebManage/Systems/SysAuthority/MenuPage.aspx', 3, 1, 2, 1, 1) 18 GO 19 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (12, '菜單編輯', '/WebManage/Systems/SysAuthority/MenuPageEdit.aspx', 3, 2, 2, 0, 1) 20 GO 21 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (13, '頁(yè)面權(quán)限設(shè)置', '/WebManage/Systems/SysAuthority/PagePowerSignList.aspx', 3, 3, 2, 1, 1) 22 GO 23 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (14, '部門管理', '/WebManage/Systems/SysAuthority/BranchList.aspx', 3, 7, 2, 1, 1) 24 GO 25 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (15, '部門編輯', '/WebManage/Systems/SysAuthority/BranchEdit.aspx', 3, 8, 2, 0, 1) 26 GO 27 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (16, '職位管理', '/WebManage/Systems/SysAuthority/PositionList.aspx', 3, 9, 2, 1, 1) 28 GO 29 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (17, '職位編輯', '/WebManage/Systems/SysAuthority/PositionEdit.aspx', 3, 10, 2, 0, 1) 30 GO 31 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (18, '管理員管理', '/WebManage/Systems/SysAuthority/ManagerList.aspx', 3, 12, 2, 1, 1) 32 GO 33 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (19, '管理員編輯', '/WebManage/Systems/SysAuthority/ManagerEdit.aspx', 3, 13, 2, 0, 1) 34 GO 35 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (20, '職位權(quán)限樹狀圖', '/WebManage/Systems/SysAuthority/MenuPageTree.aspx', 3, 11, 2, 0, 1) 36 GO 37 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (21, '登陸日志', '/WebManage/Systems/SysSecurity/LoginLogList.aspx', 5, 1, 2, 1, 1) 38 GO 39 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (22, '操作日志', '/WebManage/Systems/SysSecurity/UseLogList.aspx', 5, 2, 2, 1, 1) 40 GO 41 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (23, '在線用戶', '/WebManage/Systems/SysSecurity/OnlineUsers.aspx', 5, 3, 2, 1, 1) 42 GO 43 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (36, '信息發(fā)布', '/WebManage/Information/', 0, 1, 0, 1, 0) 44 GO 45 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (37, '文章管理', '/WebManage/Information/Info/', 36, 1, 1, 1, 0) 46 GO 47 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (38, '文章欄目管理', '/WebManage/Information/Info/InfoClassList.aspx', 37, 1, 2, 1, 1) 48 GO 49 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (39, '文章欄目編輯', '/WebManage/Information/Info/InfoClassAdd.aspx', 37, 2, 2, 0, 1) 50 GO 51 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (40, '文章內(nèi)容管理', '/WebManage/Information/Info/InfoList.aspx', 37, 3, 2, 1, 1) 52 GO 53 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (41, '文章內(nèi)容編輯', '/WebManage/Information/Info/InfoAdd.aspx', 37, 4, 2, 0, 1) 54 GO 55 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (127, '頁(yè)面權(quán)限編輯', '/WebManage/Systems/SysAuthority/PagePowerSignEdit.aspx', 3, 4, 2, 0, 1) 56 GO 57 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (129, '公共頁(yè)面權(quán)限設(shè)置', '/WebManage/Systems/SysAuthority/PagePowerSignPublicList.aspx', 3, 5, 2, 1, 1) 58 GO 59 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (130, '公共頁(yè)面權(quán)限編輯', '/WebManage/Systems/SysAuthority/PagePowerSignPublicEdit.aspx', 3, 6, 2, 0, 1) 60 GO 61 INSERT INTO MenuInfo (Id, Name, Url, ParentId, Sort, Depth, IsDisplay, IsMenu) VALUES (203, '錯(cuò)誤日志', '/WebManage/Systems/SysSecurity/ErrorLog.aspx', 5, 4, 2, 1, 1) 62 GO 63 64 set IDENTITY_INSERT MenuInfo off View Code?
6、小結(jié)
登陸頁(yè)、父類與后端首頁(yè),是本系統(tǒng)三個(gè)最基本的組成零部件,完成了這三個(gè)部件后,接下來就是體驗(yàn)如何來進(jìn)行快速開發(fā)的成果了。后面章節(jié)發(fā)表的內(nèi)容,主要是針對(duì)框架中已生成函數(shù)或一些特殊功能(函數(shù))的調(diào)用方法講解,用實(shí)例來講述這些功能的使用方法。
?
?
? 點(diǎn)擊下載:
本框架不內(nèi)置 ExtJS 庫(kù),請(qǐng)自行下載ExtJS 庫(kù)后手工添加到Solution.Web.Managers項(xiàng)目的根目錄中(如下圖):http://fineui.com/bbs/forum.php?mod=viewthread&tid=3218
?
?
由于框架不是非常成熟,很多朋友不是用來學(xué)習(xí)而是直接用到項(xiàng)目中,但不熟悉框架引起不少小問題,所以停止提供下載,有需要學(xué)習(xí)的可以到群共享里下,不便之處敬請(qǐng)諒解。
?
?
?
?版權(quán)聲明:
本文由AllEmpty原創(chuàng)并發(fā)布于博客園,歡迎轉(zhuǎn)載,未經(jīng)本人同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文鏈接,否則保留追究法律責(zé)任的權(quán)利。如有問題,可以通過1654937@qq.com 聯(lián)系我,非常感謝。
?
發(fā)表本編內(nèi)容,只要主為了和大家共同學(xué)習(xí)共同進(jìn)步,有興趣的朋友可以加加Q群:327360708 ,大家一起探討。
?
更多內(nèi)容,敬請(qǐng)觀注博客:http://www.cnblogs.com/EmptyFS/
轉(zhuǎn)載于:https://www.cnblogs.com/EmptyFS/p/3791945.html
總結(jié)
以上是生活随笔為你收集整理的从零开始编写自己的C#框架(17)——Web层后端首页的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php如何封装类内乡通南阳的_PHP类(
- 下一篇: 面试金典--min栈的实现