??ShenNiusModularity項目的后臺管理主頁面如下圖所示,該頁面為ShenNius.Admin.Mvc項目的Views\Home\Index.cshtml,使用的是layuimini后臺模板(參考文獻2),在layuimini的GitHub主頁中提供有不同樣式的頁面模版鏈接,Index.cshtml頁面的布局與其中的多tab版本很相似,后面找到參考文獻3,其頁面布局代碼和index.shetml頁面中十分相像,估計出處相同。
??大致的布局方式如下所示(從index.cshtml頁面中截取了一部分以作示意,詳細請見參考文獻3)
<div class="layui-layout layui-layout-admin"><div class="layui-header header"><div class="layui-logo layuimini-logo"></div><div class="layuimini-header-content"><a><div class="layuimini-tool"><i title="展開" class="fa fa-outdent" data-side-fold="1"></i></div></a><!--電腦端頭部菜單--><ul class="layui-nav layui-layout-left layuimini-header-menu layuimini-menu-header-pc layuimini-pc-show"></ul> <ul class="layui-nav layui-layout-right">... </ul></div></div><!--無限極左側菜單--><div class="layui-side layui-bg-black layuimini-menu-left"></div><!--初始化加載層--><div class="layuimini-loader"><div class="layuimini-loader-inner"></div></div><div class="layui-body"><div class="layuimini-tab layui-tab-rollTool layui-tab" lay-filter="layuiminiTab" lay-allowclose="true"><ul class="layui-tab-title"><li class="layui-this" id="layuiminiHomeTabId" lay-id=""></li></ul><div class="layui-tab-control">...</div><div class="layui-tab-content"><div id="layuiminiHomeTabIframe" class="layui-tab-item layui-show"></div></div></div></div>
</div>
??上述html示例為框架,最重要的是調用miniAdmin.render函數初始化框架內容,如下面代碼所示。其中options的iniUrl設置的是頁面左側的菜單列表,調用的是ShenNius.Admin.API項目中Controllers\sys\MenuController.LoadLeftMenuTrees函數,內部調用MenuRepository.LoadLeftMenuTreesAsync函數獲取當前用戶的所有角色關聯的菜單id和按鈕id,并構造成菜單樹的形式返回前端頁面。而clearUrl設置的是清除當前用戶的左側菜單緩存的接口地址,調用ShenNius.Admin.API項目中Controllers\sys\UserController.RemoveMenuCache函數。
var options = {iniUrl: "sys/menu/LoadLeftMenuTrees", // 初始化接口"menu/load-left-menu-trees",//clearUrl: "sys/user/removeMenuCache?userId=" + apiUtil.getCurrentUser().id, // 緩存清理接口urlHashLocation: true, // 是否打開hash定位bgColorDefault: false, // 主題默認配置multiModule: true, // 是否開啟多模塊menuChildOpen: true, // 是否默認展開菜單loadingTime: 0, // 初始化加載時間pageAnim: true, // iframe窗口動畫maxTabNum: 15, // 最大的tab打開數量
};
miniAdmin.render(options);
??index.cshtml頁面的處理邏輯大多數都放在了頁面內置的JavaScript中,除了上述初始化左側菜單及tab頁的內容,還包括以下功能:
??1)定義并調用LoadSite函數,從ShenNius.Admin.API項目中Controllers\sys\TenantController .GetList函數獲取所有租戶信息,并顯示在頁面右上角處;
??2)基于signalr,調用mysignalR.js的SaveCurrentUserInfo函數與ShenNius.Infrastructure項目的UserLoginNotifiHub通信存儲用戶登錄信息,如果同一個用戶在不同的客戶端登錄,,則通知后面登錄的客戶端下線;
??3)定義切換租戶菜單響應函數,點擊不同的租戶時,切換選中組合的左側菜單數據(調用LoadSite函數);
$("body").on("click", ".setCurrent", function () {var id = $(this).attr("value");var value = $(this).text();setCurrentSite(id, value);})
??4)定義修改密碼菜單響應函數,調用ShenNius.Admin.Mvc項目的Areas\sys\UserController. ModifyPwd函數彈出修改密碼頁面;
$('#modifyPwd').on("click", function () {layer.open({title: '修改密碼',type: 2,shade: 0.2,shadeClose: true,area: ['600px', '360px'],content: '/sys/user/modifyPwd',btn2: function () {layer.closeAll();}});
});
??5)定義查看用戶基本資料菜單響應函數,調用ShenNius.Admin.Mvc項目的Areas\sys\ UserController.CurrentUserInfo函數彈出基本資料頁面;;
$('#baseUserInfo').on("click", function () {layer.open({title: '基本資料',type: 2,shade: 0.2,shadeClose: true,area: ['600px', '420px'],content: '/sys/user/currentUserInfo',});
});
??6)定義退出登錄菜單響應函數,調用ShenNius.Admin.Mvc項目的Areas\sys\ UserController.Logout函數退出登錄,并跳轉到登錄頁面,同時清除瀏覽器緩存。
$('.login-out').on("click", function () {$.ajax({url: "/sys/user/Logout",type: "get",success: function (res) {if(res.statusCode == 200 && res.success == true){apiUtil.SessionRemove("globalCurrentUserInfo");layer.msg('正在處理,即將退出...', { icon: 1, time: 4000, shift: 6 }, function () {//清空瀏覽器緩存數據localStorage.clear();window.location = '/sys/user/login';});}else{layer.msg(res.msg);return false;}}});
});
參考文獻:
[1]https://gitee.com/shenniu_code_group/shen-nius.-modularity
[2]https://github.com/zhongshaofa/layuimini
[3]https://github.com/shceci/layuimini/blob/v2/index.html
[4]http://layuimini.99php.cn/docs/