.Net Core3.1 MVC + EF Core+ AutoFac+LayUI+Sqlserver的框架搭建--------权限控制
用户表:
角色表:
菜单表:
操作按钮表:
角色菜单表:
菜单按钮操作表:
部门表:
系统首页:
@using Core.Net.Common.Core.Net.Core.Cookies; @{ UserModel uModel = UserHelper.GetCurrent(); if (uModel == null || uModel.UserId == 0) { this.Context.Response.Redirect("/SystemManage/Manage/Login"); return; } } <!doctype html> <html class="x-admin-sm"> <head> <meta charset="UTF-8"> <title>秦歌项目管理系统2.0</title> <meta name="renderer" content="webkit|ie-comp|ie-stand"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8" /> <meta http-equiv="Cache-Control" content="no-siteapp" /> <link rel="stylesheet" href="/xadmin/css/font.css"> <link rel="stylesheet" href="/xadmin/css/xadmin.css"> <!-- <link rel="stylesheet" href="./css/theme5.css"> --> <script src="/xadmin/lib/layui/layui.js" charset="utf-8"></script> <script type="text/javascript" src="/xadmin/js/xadmin.js"></script> <!-- 让IE8/9支持媒体查询,从而兼容栅格 --> <!--[if lt IE 9]> <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script> <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script> <![endif]--> <script> // 是否开启刷新记忆tab功能 // var is_remember = false; </script> </head> <body class="index"> <!-- 顶部开始 --> <div class="container"> <div class="logo"> <a href="/">标题</a> </div> <div class="left_open"> <a><i title="展开左侧栏" class="iconfont"></i></a> </div> <ul class="layui-nav left fast-add" lay-filter=""> <li class="layui-nav-item"> <a href="javascript:;">+新增</a> <dl class="layui-nav-child"> <!-- 二级菜单 --> <dd> <a onclick="xadmin.open('最大化','http://www.baidu.com','','',true)"> <i class="iconfont"></i>弹出最大化 </a> </dd> </dl> </li> </ul> <ul class="layui-nav right" lay-filter=""> <li class="layui-nav-item"> <a href="javascript:;">@uModel.UserName</a> <dl class="layui-nav-child"> <!-- 二级菜单 --> <dd> <a onclick="def_Open('', '/systemmanager/User/UserInfo/@UserHelper.GetUserId()',550,600)">个人信息</a> </dd> <dd> <a onclick="def_Open('修改密码','/systemmanager/User/EditPassword',550,300)">修改密码</a> </dd> <dd> <a onclick="LogOut()">退出</a> </dd> </dl> </li> <li class="layui-nav-item to-index"> <a href="/">前台首页</a> </li> </ul> </div> <!-- 顶部结束 --> <!-- 中部开始 --> <!-- 左侧菜单开始 --> <div class="left-nav"> <div id="side-nav"> <ul id="nav"> @foreach (var item in Core.Net.Web.Common.DropdownHelper.GetNavList(uModel.RoleId)) { if (item.item.Count > 0) { <li class="layui-nav-itemed"> <a href="javascript:;"> <i class="iconfont left-nav-li" lay-tips="@item.MenuName"></i> <cite> @item.MenuName </cite> <i class="iconfont nav_right"></i> </a> @foreach (var item1 in item.item) { <ul class="sub-menu"> <li> <a onclick="xadmin.add_tab('@item1.MenuName', '@item1.MenuUrl', true)"> <i class="iconfont"></i> <cite>@item1.MenuName</cite> </a> </li> </ul> } </li> } } </ul> </div> </div> <!-- <div class="x-slide_left"></div> --> <!-- 左侧菜单结束 --> <!-- 右侧主体开始 --> <div class="page-content"> <div class="layui-tab tab" lay-filter="xbs_tab" lay-allowclose="false"> <ul class="layui-tab-title"> <li class="home"> <i class="layui-icon"></i>我的桌面 </li> </ul> <div class="layui-unselect layui-form-select layui-form-selected" id="tab_right"> <dl> <dd data-type="this">关闭当前</dd> <dd data-type="other">关闭其它</dd> <dd data-type="all">关闭全部</dd> </dl> </div> <div class="layui-tab-content"> <div class="layui-tab-item layui-show"> <iframe src='' frameborder="0" scrolling="yes" class="x-iframe"></iframe> </div> </div> <div id="tab_show"></div> </div> </div> <style> #warn { position: fixed; top: 0px; left: 0px; right: 0px; bottom: 0px; margin: auto; } </style> <div id="test" style="display: none; padding: 20px;"> <form class="layui-form"> <div class="layui-form-item"> <label class="layui-form-label">账号:</label> <div class="layui-input-block"> <input type="text" value="@uModel.UserName" name="title" lay-verify="title" readonly="readonly" class="layui-input"> </div> </div> </form> </div> <div class="page-content-bg"></div> <style id="theme_style"></style> <!-- 右侧主体结束 --> </body> </html> <script> function def_Open(showtitle, url, w, h) { xadmin.open(showtitle, url, w, h); } </script> <script> function Open() { layer.open({ title: '自定义页面层', type: 1, skin: 'layui-layer-rim', area: ['1000px', '580px'], content: $('#test11111'), btn: '确定', maxmin: true, minStack: false, //最小化不堆叠在左下角 id: 'page1', //定义 ID,防止重复弹出 min: function (layero, index) { layer.msg('阻止了默认的最小化'); layer.style(index, { top: 'auto', bottom: 0 }); return false; } }); } </script> <script> function LogOut() { $.ajax({ type: "post", url: "/systemmanager/Login/LogOut", success: function (msg) { if (msg == "1") { window.location.href = "/systemmanager/Login/Index"; } } }); } </script>
DropdownHelper通用类:
using Core.Net.Common.Core.Net.Core; using Core.Net.Common.Core.Net.Core.Cookies; using Core.Net.Common.Core.Net.Data; using Core.Net.Model.System; using Microsoft.AspNetCore.Mvc.Rendering; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading.Tasks; using static Core.Net.Common.Core.Net.Core.JsonHelper; namespace Core.Net.Web.Common { public class DropdownHelper { /// <summary> /// 部门下拉框 /// </summary> /// <returns></returns> public static IEnumerable<SelectListItem> GetDepartList() { return GetList("DepartName", "DepartId", "where IsUse=1", "CoreNetSystemDepart", "请选择部门"); } /// <summary> /// 角色下拉框 /// </summary> /// <returns></returns> public static IEnumerable<SelectListItem> GetRoleList() { return GetList("RoleName", "RoleId", "where IsUse=1", "CoreNetSystemRole", "请选择角色"); } /// <summary> /// 数据库表名下拉框 /// </summary> /// <returns></returns> public static IEnumerable<SelectListItem> GetTableList() { return GetList("DepartName", "DepartId", "where IsUse=1", "CoreNetSystemDepart", "请选择部门"); } /// <summary> /// 获取一级菜单,也就是一级导航栏列表 /// </summary> /// <returns></returns> public static IEnumerable<SelectListItem> GetMenuList() { return GetList("MenuName", "MenuId", "where PMenuId=0", "CoreNetSystemMenu", "请选择父菜单"); } /// <summary> /// 任务调度,获取任务列表 /// </summary> /// <returns></returns> public static IEnumerable<SelectListItem> GetTaskList() { return GetList("TaskName", "SetId", " where IsUse=1", "CoreNetSystemQuartZSet", "请选择任务名称"); } /// <summary> /// 获取菜单左侧树形列表对象 /// </summary> /// <returns></returns> public static string GetOneLayerJson() { DataTable dtlist= SqlHelper.Query("select MenuId as id,PMenuId as pId,MenuName as title from CoreNetSystemMenu where PMenuId=0"); string str = dtlist.ToJson(); return dtlist.ToJson().TrimEnd(']').TrimStart('['); } /// <summary> /// 获取字典左侧的树形列表对象 /// </summary> /// <returns></returns> public static string GetOneDictionary() { DataTable dtlist = SqlHelper.Query("select DicId as id,PDicId as pId,PDicName as title from CoreNetSystemDictionaryItem where PDicId=0 "); string str = dtlist.ToJson(); return dtlist.ToJson().TrimEnd(']').TrimStart('['); } /// <summary> /// 首页导航栏的权限 /// </summary> /// <returns></returns> public static List<NavMenu> GetNavList(int RoleId) { //获取菜单列表 DataTable oneNav = SqlHelper.Query("SELECT*FROM CoreNetSystemMenu where IsUse=1 order by Sort asc"); //获取角色权限列表 DataTable twoNav = SqlHelper.Query("select a.PMenuId,a.MenuId,a.MenuName,a.MenuUrl,b.OperateIdString from CoreNetSystemMenu a,CoreNetSystemRoleOrMenu b where a.MenuId=b.MenuId and b.RoleId="+ RoleId+" order by b.Sort asc"); List<CoreNetSystemMenu> oneNavDrop = ModelConvertHelper<CoreNetSystemMenu>.ConvertToModel(oneNav); List<MenuItem> twoNavDrop= ModelConvertHelper<MenuItem>.ConvertToModel(twoNav); List<NavMenu> navlist = new List<NavMenu>(); foreach (var item1 in oneNavDrop) { if (item1.PMenuId==0) { NavMenu navMenu = new NavMenu(); navMenu.MenuId = item1.MenuId; navMenu.MenuName = item1.MenuName; foreach (var item2 in twoNavDrop) { if (item1.MenuId== item2.PMenuId) { NavItem item = new NavItem(); item.MenuId = item2.MenuId; item.MenuName = item2.MenuName; item.MenuUrl =item2.MenuUrl; navMenu.item.Add(item); } } navlist.Add(navMenu); } } return navlist; } /// <summary> /// 获取菜单操作的string对象,这个RoleId=1是超级管理员,这里有二级管理员,他们可以在超级管理元分配的权限下,在次对自己下面的人进行用户权限的配置,而超级管理员,它无视任何权限
///规则,拥有所有权限。 /// </summary> /// <returns></returns> public static List<RoleLimit> GetRoleOrMenuString(int RoleId) { List<RoleLimit> list = new List<RoleLimit>(); DataTable operation = SqlHelper.Query(" SELECT OperationId,OperationName FROM CoreNetSystemOperation"); bool IsAdd = false; DataTable menulist = null; if (RoleId == 0) { IsAdd = true; RoleId = UserHelper.GetRoleId(); } if (RoleId == 1) { menulist = SqlHelper.Query(" select a.MenuId ,OperateString=isnull(STUFF((SELECT ','+cast(OperationId as varchar) FROM CoreNetSystemMenuOrOperate where MenuId=a.MenuId FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,''),''),a.MenuName from CoreNetSystemMenu a where PMenuId>0"); } else { menulist = SqlHelper.Query(" select a.MenuId ,OperateString=isnull(STUFF((SELECT ','+cast(OperationId as varchar) FROM CoreNetSystemMenuOrOperate where MenuId=a.MenuId FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,''),''),a.MenuName from CoreNetSystemMenu a where a.IsUse=1 and PMenuId>0"); } if (IsAdd) { foreach (DataRow item1 in menulist.Rows) { RoleLimit limit = new RoleLimit(); limit.MenuId = int.Parse(item1["MenuId"].ToString()); limit.MenuName = item1["MenuName"].ToString(); if (item1["OperateString"].ToString().Length > 0) { string[] arr = item1["OperateString"].ToString().Split(','); for (int i = 0; i < arr.Length; i++) { RoleItem it = new RoleItem(); it.OperationId = int.Parse(arr[i]); it.IsCheck = 0; it.OperationName = getName(arr[i], operation); limit.Item.Add(it); } } list.Add(limit); } } else { DataTable rolelist = SqlHelper.Query("SELECT RoleId, MenuId, OperateIdString FROM CoreNetSystemRoleOrMenu where RoleId = " + RoleId); foreach (DataRow item1 in menulist.Rows) { RoleLimit limit = new RoleLimit(); limit.MenuId = int.Parse(item1["MenuId"].ToString()); limit.MenuName = item1["MenuName"].ToString(); if (item1["OperateString"].ToString().Length > 0) { string[] arr1 = item1["OperateString"].ToString().Split(','); bool isOne = false; string operateitem = ""; foreach (DataRow item2 in rolelist.Rows) { if (item1["MenuId"].ToString() == item2["MenuId"].ToString()) { isOne = true; operateitem = item2["OperateIdString"].ToString(); } } if (isOne == true) { if (operateitem.Length > 0) { string[] arr2 = operateitem.Split(','); bool ischeck = false; for (int i = 0; i < arr1.Length; i++) { RoleItem it = new RoleItem(); it.OperationId = int.Parse(arr1[i]); for (int j = 0; j < arr2.Length; j++) { if (arr1[i] == arr2[j]) { ischeck = true; } } if (ischeck == true) { it.IsCheck = 1; ischeck = false; } else { it.IsCheck = 0; } it.OperationName = getName(arr1[i], operation); limit.Item.Add(it); } } } else { for (int i = 0; i < arr1.Length; i++) { RoleItem it = new RoleItem(); it.OperationId = int.Parse(arr1[i]); it.IsCheck = 0; it.OperationName = getName(arr1[i], operation); limit.Item.Add(it); } } } else { } list.Add(limit); } } return list; } public static string getName(string OperateId,DataTable dt) { string name = ""; foreach (DataRow item in dt.Rows) { if (item["OperationId"].ToString()==OperateId) { name = item["OperationName"].ToString(); } } return name; } /// <summary> /// 获取所有一级模块列表 /// </summary> /// <returns></returns> public static IEnumerable<SelectListItem> GetList(string name,string value,string where,string tablename, string DefaultTitle) { string sql = "select " + name + " as name," + value + " as value from "+tablename+" " + where; DataTable dtlist = SqlHelper.Query(sql); IQueryable<Dropdown> dropdowns = ModelConvertHelper<Dropdown>.ConvertToModel(dtlist).AsQueryable(); return new[] { new SelectListItem { Text = DefaultTitle, Value = "0" } }.Concat( from d in dropdowns select new SelectListItem { Text = d.name, Value = d.value.ToString() }) ; } } //下拉框模型 public class Dropdown { public int value { get; set; } public string name { get; set; } } /// <summary> /// 控制权限的模型 /// </summary> public class RoleLimit { public int MenuId { get; set; } public string MenuName { get; set; } public List<RoleItem> Item = new List<RoleItem>(); } /// <summary> /// 控制权限的子模型 /// </summary> public class RoleItem { public int OperationId { get; set; } public int IsCheck { get; set; } public string OperationName { get; set; } } /// <summary> /// 首页左侧导航栏菜单权限模型 /// </summary> public class NavMenu { public int MenuId { get; set; } public string MenuName { get; set; } public List<NavItem> item = new List<NavItem>(); } public class NavItem { public int MenuId { get; set; } public string MenuName { get; set; } public string MenuUrl { get; set; } public string MenuOperate { get; set; } } public class MenuItem { public int PMenuId { get; set; } public int MenuId { get; set; } public string MenuName { get; set; } public string MenuUrl { get; set; } } }
按钮权限的控制UIButton:
using Core.Net.Common.Core.Net.Core.Cookies; using Core.Net.Common.Core.Net.Data; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading.Tasks; using static Core.Net.Common.Core.Net.Core.JsonHelper; namespace Core.Net.Web.Common { /// <summary> /// 用户按钮操作权限控制中心 /// </summary> public class UIButton { //定义一个数组用来存储单个操作按钮 public static List<OperateItem> list; public static void getCurrentPageAuth(string url) { if (UserHelper.GetCurrent().RoleId!=1) { //获取当前角色在当前页面的操作id字符串 DataTable dt = SqlHelper.Query("select b.OperateIdString from CoreNetSystemMenu a,CoreNetSystemRoleOrMenu b where a.MenuUrl='"+url.Trim()+"' and b.RoleId="+UserHelper.GetRoleId()+" and a.MenuId=b.MenuId"); if (dt.Rows[0]["OperateIdString"].ToString().Length>0) { list = ModelConvertHelper<OperateItem>.ConvertToModel(SqlHelper.Query("SELECT OperationEName as item FROM CoreNetSystemOperation where OperationId in(" + dt.Rows[0]["OperateIdString"].ToString() + ")")); } } } /// <summary> /// 添加按钮操作 /// </summary> /// <param name="operateName">按钮操作字符串</param> /// <param name="title">标题</param> /// <param name="url">url路径</param> /// <param name="width">弹框的宽度</param> /// <param name="height">弹框的高度</param> /// <returns></returns> public static string GetAdd(string operateName, string title,string url,int width,int height) { //超级管理员无视权限 if (UserHelper.GetCurrent().RoleId==1) { return "<button class=\"layui-btn\" onclick=\"def_Open('" + title + "','" + url.Trim() + "'," + width + "," + height + ")\"><i class=\"layui-icon\"></i>添加</button>"; } if (list.Count>0) { foreach (var item in list) { if (item.item==operateName) { return "<button class=\"layui-btn\" onclick=\"def_Open('" + title + "','" + url.Trim() + "'," + width + "," + height + ")\"><i class=\"layui-icon\"></i>添加</button>"; } } } return ""; } /// <summary> /// 编辑按钮操作 /// </summary> /// <param name="operateName">按钮字符名称</param> /// <param name="title">弹框标题</param> /// <param name="url">url路径</param> /// <param name="width">弹框的宽度</param> /// <param name="height">弹框的高度</param> /// <returns></returns> public static string GetEdit(string operateName,string title, string url, int width, int height) { //超级管理员无视权限 if (UserHelper.GetCurrent().RoleId==1) { return " <a lay-event=\"edit\" title=\"编辑\" onclick=\"def_Open('" + title + "', '" + url.Trim() + "'," + width + "," + height + ")\" href=\"javascript:; \"><i class=\"layui-icon\" style=\"margin-right:10px\"></i></a>"; } if (list.Count > 0) { foreach (var item in list) { if (item.item == operateName) { return " <a lay-event=\"edit\" title=\"编辑\" onclick=\"def_Open('" + title + "', '" + url.Trim() + "'," + width + "," + height + ")\" href=\"javascript:; \"><i class=\"layui-icon\" style=\"margin-right:10px\"></i></a>"; } } } return ""; } /// <summary> // 单个删除操作按钮 /// </summary> /// <param name="operateName">按钮字符名称</param> /// <param name="url">url路径</param> /// <param name="IdString">主键ID</param> /// <returns></returns> public static string GetDel(string operateName, string url, string IdString) { //超级管理员无视权限 if (UserHelper.GetCurrent().RoleId==1) { return "<a lay-event=\"del\" title=\"删除\" onclick=\"def_Del('确定删除','" + url + "/Delete?id={{" + IdString + "}}','')\" id=\"del{{" + IdString + "}}\" lay-suburl=\"" + url + "/Del\" href=\"javascript:;\"><i class=\"layui-icon\" style=\"margin-right:10px\"></i></a>"; } if (list.Count > 0) { foreach (var item in list) { if (item.item == operateName) { return "<a lay-event=\"del\" title=\"删除\" onclick=\"def_Del('确定删除','" + url + "/Delete?id={{" + IdString + "}}','')\" id=\"del{{" + IdString + "}}\" lay-suburl=\"" + url + "/Del\" href=\"javascript:;\"><i class=\"layui-icon\" style=\"margin-right:10px\"></i></a>"; } } } return ""; } /// <summary> /// 批量删除按钮 /// </summary> /// <param name="operateName">按钮名称字符</param> /// <param name="url">url路径</param> /// <param name="IdString">主键ID</param> /// <returns></returns> public static string GetDelAll(string operateName, string url, string IdString) { //超级管理员无视权限 if (UserHelper.GetCurrent().RoleId==1) { return "<button class=\"layui-btn layui-btn-danger\" onclick=\"def_DelAll('" + url + "/DeleteAll', '" + IdString + "')\"><i class=\"layui-icon\"></i>批量删除</button>"; } if (list.Count > 0) { foreach (var item in list) { if (item.item == operateName) { return "<button class=\"layui-btn layui-btn-danger\" onclick=\"def_DelAll('" + url + "/DeleteAll', '" + IdString + "')\"><i class=\"layui-icon\"></i>批量删除</button>"; } } } return ""; } public class OperateItem { public string item { get; set; } } } }
通用搜索栏,因为每个页面都会存在搜索功能,如果每个页面都要重新去添加,太操蛋了,所以干脆封装一下,需要哪些条件可以直接去就行了,如果没有满足的条件可以直接在通用类里面添加就行了。
using Core.Net.Common.Core.Net.Core.Cookies; using Core.Net.Common.Core.Net.Data; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading.Tasks; using static Core.Net.Common.Core.Net.Core.JsonHelper; namespace Core.Net.Web.Common { public class UISearch { /// <summary> /// 获取搜索条件 /// </summary> /// <param name="model"></param> /// <returns></returns> public static string getSearch(UIModel model) { string UIString = ""; UIString += getStartString(model.url); for (int i = 0; i < model.items.Length; i++) { UIString += getUICenter(model.items[i]); } UIString += getEndString(); return UIString; } private static string getUICenter(int item) { string UIString = ""; switch (item) { case 1: UIString= getAreaList(); break; case 2: UIString = getDrolist("部门", "CoreNetSystemDepart", "DepartId", "DepartName", "where IsUse=1"); break; case 3: UIString = getInput("用户名称", "InputName", ""); break; case 4: UIString = getDrolist("用户", "CoreNetSystemUser", "UserId", "RealName", "where IsUse=1"); break; default: break; } return UIString; } /// <summary> /// 获取搜索页面html头半部分 /// </summary> /// <returns></returns> private static string getStartString(string url) { return "<div class=\"layui-col-md12\"><div class=\"layui-card\"><div class=\"layui-card-body\"><form class=\"layui-form\" id=\"searchform\" style=\"margin-top:2px\"action=\"" + url+"\">"; } /// <summary> /// 获取搜索页面html尾半部分 /// </summary> /// <returns></returns> private static string getEndString() { return "<div class=\"layui-inline layui-show-xs-block\" style=\"margin-left: 20px\"><button class=\"layui-btn\" id=\"tijiao\" onclick=\"def_Search('searchform'); return false; \"><i class=\"layui-icon\"></i></button></div></form></div></div></div>"; } /// <summary> /// Id=1表示获取区域下拉列表 /// </summary> /// <returns></returns> private static string getAreaList() { string UIString = ""; UIString+= "<a style=\"font-size: 10pt; \">  区域:</a>"; UIString += "<div class=\"layui-input-inline layui-show-xs-block\" style=\"width: 105px; height: 30px; \"> <select name=\"provid\" id=\"provid\" lay-filter=\"provid\"><option value=\"410000\" selected>河南省</option></select></div>"; UIString += "<div class=\"layui-input-inline layui-show-xs-block\" style=\"width: 105px; height: 30px; \"><select name=\"cityid\" id=\"cityid\" lay-filter=\"cityid\"></select></div>"; UIString += " <div class=\"layui-input-inline layui-show-xs-block\" style=\"width: 105px; height: 30px; \"><select name=\"areaid\" id=\"areaid\" lay-filter=\"areaid\"></select></div>"; return UIString; } /// <summary> /// 获取下拉列表的通用方法 /// </summary> /// <param name="title">标题</param> /// <param name="tablename">数据库表名</param> /// <param name="value">下拉框value值</param> /// <param name="name">下拉框name值</param> /// <param name="where">sql语句where查询条件</param> /// <returns>html字符串代码</returns> private static string getDrolist(string title,string tablename,string value,string name, string where) { string UIString = ""; List<Item> items = ModelConvertHelper<Item>.ConvertToModel(SqlHelper.Query("select " + value + " as value,"+name+" as name from " + tablename + " " + where)); UIString += "<a style=\"font-size: 10pt; margin-left: 20px\">" + title + ":</a>"; UIString += " <div class=\"layui-input-inline layui-show-xs-block\" style=\"width: 105px; height: 30px; \">"; UIString += " <select name=\""+name+"\" id=\""+name+"\" lay-filter=\""+name+"\">"; UIString += "<option value=\"0\">请选择</option>"; foreach (var item in items) { UIString += "<option value=\"" + item.value + "\">" + item.name + "</option>"; } UIString += " </select></div>"; return UIString; } /// <summary> /// 拼接部门下拉框【个人信息】 /// </summary> /// <param name="title">标题</param> /// <param name="tablename">数据库表名</param> /// <param name="value">下拉框value值</param> /// <param name="name">下拉框name值</param> /// <param name="Type">查询类型《1、部门;2、角色》</param> /// <returns></returns> public static string getSelectOption(string tablename, string value, string name, int Type) { string where = ""; switch (Type) { case 1: //1、查询部门【后台赋值】 where = "where IsUse=1 and DepartId="+ UserHelper.GetDepart(); break; case 2: //2、查询角色【后台赋值】 where = "where IsUse=1 and RoleId=" + UserHelper.GetRoleId(); break; default: break; } string UIString = ""; List<Item> items = ModelConvertHelper<Item>.ConvertToModel(SqlHelper.Query("select " + value + " as value,"+name+" as name from " + tablename + " " + where)); foreach (var item in items) { UIString += "<option selected=\"selected\" value=\"" + item.value + "\">" + item.name + "</option>"; } return UIString; } /// <summary> /// 获取输入框或者一个时间选择框通用方法 /// </summary> /// <param name="title">标题</param> /// <param name="value">输入框Id和name的值</param> /// <param name="strTime">输入框默认值</param> /// <returns></returns> private static string getInput(string title,string value,string strTime) { string UIString = ""; UIString += "<a style=\"font-size: 10pt; margin-left: 20px\">" + title + ":</a>"; UIString += "<div class=\"layui-input-inline layui-show-xs-block\" style=\"width: 105px; height: 30px; \">"; UIString += "<input class=\"layui-input\" autocomplete=\"off\" value=\"" + strTime + "\" name=\"" + value + "\" id=\"" + value + "\">"; UIString += "</div>"; return UIString; } /// <summary> /// 获取两个时间格式的通用类 /// </summary> /// <param name="title">标题</param> /// <param name="value1">第一个时间的id和name值</param> /// <param name="value2">第二个时间的id和name值</param> /// <param name="startTime">第一个时间的默认时间值</param> /// <param name="endTime">第二个时间的默认时间值</param> /// <returns></returns> private static string getInput(string title, string value1,string value2,string startTime,string endTime) { string UIString = ""; UIString += "<a style=\"font-size: 10pt; margin-left: 20px\">" + title + ":</a>"; UIString += "<div class=\"layui-input-inline layui-show-xs-block\" style=\"width: 105px; height: 30px; \">"; UIString += "<input class=\"layui-input\" autocomplete=\"off\" value=\"" + startTime + "\" name=\"" + value1 + "\" id=\"" +value1 + "\">"; UIString += "<input class=\"layui-input\" autocomplete=\"off\" value=\"" + endTime + "\" name=\"" + value2 + "\" id=\"" + value2 + "\">"; UIString += "</div>"; return UIString; } } public class Item { public int value { get; set; } public string name { get; set; } } public class UIModel { public string url { get; set; } public int[] items { get; set; } public UIModel(string url,int[] items) { this.url = url; this.items = items; } } }
下面来用一个功能来对按钮权限控制进行实际测试,以部门表为例:
DepartController.cs 控制器:
using Core.Net.Common.Core.Net.Core; using Core.Net.IServices; using Core.Net.Model.System; using Core.Net.Web.Common; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Core.Net.Web.Areas.SystemManager.Controllers { [Area("SystemManager")] public class DepartController : BaseController { private readonly ICoreNetSystemDepartServiecs _coreNetSystemDepartServiecs; public DepartController(ICoreNetSystemDepartServiecs coreNetSystemDepartServiecs) { _coreNetSystemDepartServiecs = coreNetSystemDepartServiecs; } public IActionResult JsonList() { int pageSize = ConvertHelper.SafeRequest("limit", 20, Request);//每页显示个数 int nowPage = ConvertHelper.SafeRequest("page", 1, Request);//当前页码 PageModel page = PageModelInstance.GetInstance(pageSize, nowPage); var listData =_coreNetSystemDepartServiecs.FindList(page, "DepartId", true); return Content("{ \"code\":0,\"msg\":\"\",\"count\":\"" + page.RecordCount+ "\",\"data\":" + listData.ToJson() + "}"); } [HttpGet] public ActionResult Edit() { int Id = ConvertHelper.SafeParse(RouteData.Values["id"] as string, 0); if (Id > 0) { return View(_coreNetSystemDepartServiecs.FindEntity("DepartId", Id)); } else { //ViewData["pvalue"] = sPValue; // 和Model 的列名相同,等同于给下拉列表赋值 return View(); } } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(CoreNetSystemDepart model) { ModelState.Remove("DepartId"); if (ModelState.IsValid) { if (model.DepartId > 0) { CoreNetSystemDepart oldModel =_coreNetSystemDepartServiecs.FindEntity("DepartId", model.DepartId); oldModel.DepartName = model.DepartName; oldModel.IsUse = model.IsUse; oldModel.UpdateTime = DateTime.Now; return OperateResult(_coreNetSystemDepartServiecs.Update(oldModel), "修改成功", "修改失败", "/SystemManager/Depart/list"); } else { model.AddTime = DateTime.Now; return OperateResult(_coreNetSystemDepartServiecs.Insert(model), "新增成功", "新增失败", "/SystemManager/Depart/list"); } } else { return OperateResult(0, "", "填写数据有误", ""); } } [HttpPost] public JsonResult Delete(int id) { return OperateResult(_coreNetSystemDepartServiecs.Delete("DepartId", id), "删除成功", "删除失败", ""); } [HttpPost] public JsonResult DeleteAll() { string idStr = Request.Form["checklist"]; if (idStr == null || idStr.Length < 1) return OperateResult(0, "", "请选择要删除的数据", ""); int nCount = 0; string[] idList = idStr.Split(','); foreach (string id in idList) { if (_coreNetSystemDepartServiecs.Delete("DepartId", ConvertHelper.SafeParse(id, 0)) > 0) { nCount += 1; } } return OperateResult(nCount, nCount + "条数据删除成功", "删除失败", ""); } [HttpPost] public IActionResult Swich(int id, int state) { CoreNetSystemDepart oldModel =_coreNetSystemDepartServiecs.FindEntity("DepartId", id); oldModel.IsUse = state; oldModel.UpdateTime = DateTime.Now; int count = _coreNetSystemDepartServiecs.Update(oldModel); return Content(count.ToString()); } } }
List.cs:
@using Core.Net.Web.Common; @{ Layout = "~/Views/Shared/_LayouList.cshtml"; UIButton.getCurrentPageAuth("/SystemManager/Depart/list"); } <div class="layui-fluid"> <div class="layui-row layui-col-space15"> <div class="layui-col-md12"> <div class="layui-card"> <div class="layui-card-header"> @Html.Raw(UIButton.GetAdd("add", "添加部门", "/SystemManager/Depart/Edit", 420, 210)) @Html.Raw(UIButton.GetDelAll("deleteall", "/SystemManager/Depart", "DepartId")) </div> <div class="layui-card-body " id="list"> <table class="layui-table" lay-data="{ url:'/SystemManager/Depart/JsonList', page:true,limit:20, id:'listtable',text:{none:'暂无数据'}}" lay-filter="listtable"> <thead> <tr> <th lay-data="{checkbox:true}"></th> <th lay-data="{field:'DepartId'}">部门ID</th> <th lay-data="{field:'DepartName'}">部门名称</th> <th lay-data="{field:'IsUse',templet:StateShow}">是否启用</th> <th lay-data="{field:'AddTime'}">添加时间</th> <th lay-data="{field:'UpdateTime'}">更新时间</th> <th lay-data="{fixed: 'right', align:'center', toolbar: '#operatebar'}">操作</th> </tr> </thead> </table> </div> <script type="text/html" id="operatebar"> @Html.Raw(UIButton.GetEdit("edit", "编辑", "/SystemManager/Depart/Edit/{{d.DepartId}}", 420, 210)) @Html.Raw(UIButton.GetDel("delete", "/SystemManager/Depart", "d.DepartId")) </script> </div> </div> </div> </div> <script type="text/html" id="StateShow"> {{# if(d.IsUse==1){ }} <input type="checkbox" name="status" lay-skin="switch" checked lay-text="启用|禁用" value={{ d.DepartId}} lay-filter="status"> {{# } else { }} <input type="checkbox" name="status" lay-skin="switch" lay-text="启用|禁用" value={{ d.DepartId}} lay-filter="status"> {{# } }} </script> <script> layui.use(['table', 'layer', 'jquery', 'form'], function () { var layer = layui.layer, $ = layui.jquery, form = layui.form; //动态开启和关闭用户的启用蛇者 form.on('switch(status)', function (data) { // 得到开关的value值,实际是需要修改的ID值。 var id = data.value; var status = this.checked ? '1' : '0'; var index; $.ajax({ type: 'POST', url: '/SystemManager/Depart/Swich', data: { "id": id, "state": status }, beforeSend: function () { index = layer.msg('正在切换中,请稍候', { icon: 16, time: false, shade: 0.8 }); }, error: function (data) { console.log(data); layer.msg('数据异常,操作失败!'); }, success: function (data) { if (data == "1") { setTimeout(function () { layer.close(index); layer.msg('操作成功!'); }, 2000); } else { console.log(data); layer.msg('数据异常,操作失败!'); } }, dataType: 'JSON' }); }); }); </script>
Edit.cs:
@model Core.Net.Model.System.CoreNetSystemDepart; @using Core.Net.Common.Core.Net.Core; @{ Layout = "~/Views/Shared/_LayoutEdit.cshtml"; int Id = ConvertHelper.SafeParse(ViewContext.RouteData.Values["id"] as string, 0); } <div class="layui-fluid"style="background-color: #FFFAFA"> <div class="layui-row" > @using (Html.BeginForm("Edit", "Depart", FormMethod.Post, new { id = "form1", @class = "layui-form", @action = "/SystemManager/Depart/Edit/", @ajax = false })) { @Html.AntiForgeryToken() @Html.HiddenFor(model => model.DepartId) <div class="layui-form-item"> <label for="DepartName" class="layui-form-label">部门名称</label> <div class="layui-input-inline"> @Html.TextBoxFor(m => m.DepartName, null, new Dictionary<string, object> { { "class", "layui-input" }, { "lay-verify", "required" } }) </div> </div> <div class="layui-form-item"> <label for="IsUse" class="layui-form-label">是否启用</label> <div class="layui-input-inline"> @Html.RadioButtonFor(m => m.IsUse, "1", new { @checked = true, @title = "是" }) @Html.RadioButtonFor(m => m.IsUse, "0", new { @title = "否" }) </div> </div> <div class="layui-form-item"> <label for="L_repass" class="layui-form-label"> </label> <button class="layui-btn" lay-filter="add" lay-submit=""> 提交 </button> </div> } </div> </div>
注意:list,edit中已经引入了LayouList和LayouEdit母版页了
红色部分就是对按钮权限的控制。
在对通用搜索栏进行实际使用:
UserLogController.cs:
using Consul; using Core.Net.Common.Core.Net.Core; using Core.Net.Common.Core.Net.Core.Consul; using Core.Net.Common.Core.Net.Core.Nlog4; using Core.Net.Common.Core.Net.Core.Security; using Core.Net.IServices; using Core.Net.Model.System; using Core.Net.Web.Common; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Core.Net.Web.Areas.SystemManager.Controllers { [Area("SystemManager")] public class UserLogController : BaseController { public static int index; private readonly ICoreNetSystemUserServices _coreNetSystemUserServiecs; private readonly ICoreNetSystemUserLogServices _coreNetSystemUserLogServiecs; public UserLogController(ICoreNetSystemUserServices coreNetSystemUserServiecs, ICoreNetSystemUserLogServices coreNetSystemUserLogServiecs ) { _coreNetSystemUserServiecs = coreNetSystemUserServiecs; _coreNetSystemUserLogServiecs = coreNetSystemUserLogServiecs; } public IActionResult JsonList() { int pageSize = ConvertHelper.SafeRequest("limit", 20, Request);//每页显示个数 int nowPage = ConvertHelper.SafeRequest("page", 1, Request);//当前页码 PageModel page = PageModelInstance.GetInstance(pageSize, nowPage); int UserId = ConvertHelper.SafeRequest("RealName", 0, Request);//当前页码 int RecordCount = 0; var listData = _coreNetSystemUserLogServiecs.CoreNetSystemUserLog_GetList(UserId, pageSize, nowPage, out RecordCount); //string str = demo(); return Content("{ \"code\":0,\"msg\":\"\",\"count\":\"" + RecordCount + "\",\"data\":" + listData.ToJson() + "}"); } /// <summary> /// consul客户端测试 /// </summary> /// <returns></returns> public string demo() { #region 分布式架构 #region 通过 Consul 服务发现来执行服务实例。ZooKeeper //发现服务 string url = "http://CoreNet/api/Login/Index"; ConsulClient client = new ConsulClient(config => { config.Address = new Uri("http://localhost:8500/"); config.Datacenter = "dc1"; }); var response = client.Agent.Services().Result.Response; foreach (var item in response) { Console.WriteLine("*************************************************************"); Console.WriteLine(item.Key); var service = item.Value; Console.WriteLine($"{service.Address}--{service.Port}--{service.Service}"); Console.WriteLine("*************************************************************"); } Uri uri = new Uri(url); string groupName = uri.Host; AgentService agentService = null; var serviceDirectory = response.Where(s => s.Value.Service.Equals(groupName, StringComparison.OrdinalIgnoreCase)).ToArray(); //{//1、 写死的 // agentService = serviceDirectory[0].Value; //} { //2、轮询 if (index >= 10000) { index = 0; } agentService = serviceDirectory[index++ % serviceDirectory.Length].Value; } // {//3、随机 // var indexResult = new Random(index++).Next(0, serviceDirectory.Length); // agentService = serviceDirectory[indexResult].Value; //} url = $"{uri.Scheme}://{agentService.Address}:{agentService.Port}{uri.PathAndQuery}"; #endregion string content = ConsulHttpRequest.InvokeAPI(url); #endregion return content; } [HttpGet] public ActionResult Edit() { int Id = ConvertHelper.SafeParse(RouteData.Values["id"] as string, 0); if (Id > 0) { return View(_coreNetSystemUserServiecs.FindEntity("UserId", Id)); } else { //ViewData["pvalue"] = sPValue; // 和Model 的列名相同,等同于给下拉列表赋值 return View(); } } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(CoreNetSystemUser model) { ModelState.Remove("UserId"); if (ModelState.IsValid) { if (model.DepartId == 0) { return OperateResult(0, "", "请选择部门!", ""); } if (model.RoleId == 0) { return OperateResult(0, "", "请选择角色!", ""); } List< CoreNetSystemUser> userlist = _coreNetSystemUserServiecs.GetTEntityList(p=>p.UserName==model.UserName); if (userlist.Count>1) { return OperateResult(0, "", "账号已经存在!", ""); } if (model.UserId > 0) { CoreNetSystemUser oldModel = _coreNetSystemUserServiecs.FindEntity("UserId", model.UserId); oldModel.UserName = model.UserName; oldModel.RealName = model.RealName; oldModel.RoleId = model.RoleId; oldModel.DepartId = model.DepartId; oldModel.IsUse = model.IsUse; oldModel.UpdateTime = DateTime.Now; return OperateResult(_coreNetSystemUserServiecs.Update(oldModel), "修改成功", "修改失败", "/SystemManager/User/list"); } else { model.Passward= Md5.Md5Upper32(model.Passward); model.AddTime = DateTime.Now; return OperateResult(_coreNetSystemUserServiecs.Insert(model), "新增成功", "新增失败", "/SystemManager/User/list"); } } else { return OperateResult(0, "", "填写数据有误", ""); } } [HttpPost] public JsonResult Delete(int id) { return OperateResult(_coreNetSystemUserServiecs.Delete("UserId", id), "删除成功", "删除失败", ""); } [HttpPost] public JsonResult DeleteAll() { string idStr = Request.Form["checklist"]; if (idStr == null || idStr.Length < 1) return OperateResult(0, "", "请选择要删除的数据", ""); int nCount = 0; string[] idList = idStr.Split(','); foreach (string id in idList) { if (_coreNetSystemUserServiecs.Delete("UserId", ConvertHelper.SafeParse(id, 0)) > 0) { nCount += 1; } } return OperateResult(nCount, nCount + "条数据删除成功", "删除失败", ""); } [HttpPost] public IActionResult Swich(int id,int state) { CoreNetSystemUser oldModel = _coreNetSystemUserServiecs.FindEntity("UserId",id); oldModel.IsUse = state; oldModel.UpdateTime = DateTime.Now; int count=_coreNetSystemUserServiecs.Update(oldModel); return Content(count.ToString()); } } }
List:
@model Core.Net.Model.System.CoreNetSystemUser; @using Core.Net.Web.Common; @{ Layout = "~/Views/Shared/_LayouList.cshtml"; ViewData["UIModel"] = new UIModel("/SystemManager/UserLog/JsonList", new int[] { 4 });//这个数组中的数字对应的Search.cshtml里面的注释的ID表示的含义。 } <div class="layui-fluid"> <div class="layui-row layui-col-space15"> @Html.Partial("UISearch", ViewData["UIModel"]) <div class="layui-col-md12"> <div class="layui-card"> <div class="layui-card-body " id="list"> <table class="layui-table" lay-data="{ url:'/SystemManager/UserLog/JsonList', page:true,limit:20, id:'listtable',text:{none:'暂无数据'}}" lay-filter="listtable"> <thead> <tr> <th lay-data="{checkbox:true}"></th> <th lay-data="{field:'UserName'}">用户名</th> <th lay-data="{field:'RealName'}">真实姓名</th> <th lay-data="{field:'LoginType',templet:LoginType}">登录类型</th> <th lay-data="{field:'UserIP'}">登录Ip</th> <th lay-data="{field:'LoginTime'}">登录时间</th> </tr> </thead> </table> </div> </div> </div> </div> </div> <script> function LoginType(data) { if (data.LoginType == 1) { return "Pc客户端登录"; } else { return "App客户端登录"; } } </script>
注意上面的红色部分,就是通用搜索栏的封装。
通用搜索栏我自定义了一个单独的模块,然后用 ViewData["UIModel"] = new UIModel("/SystemManager/UserLog/JsonList", new int[] { 4 });赋值,
用@Html.Partial("UISearch", ViewData["UIModel"]) 加载:
UISearch.cshtml:
@using Core.Net.Web.Common; @Html.Raw(UISearch.getSearch(ViewData["UIModel"] as UIModel)) @* ID=1:区域下拉框 这里的ID对应的就是通用封装类UISearch.cs可不是UISearch.cshtml ID=2:部门下拉框 ID=3:文本框 *@ <script src="~/UpFile/CityList.js?t=@DateTime.Now.ToString(" yyyyMMddhhmmss")"></script>//这个是城市列表的js,用于做省市区三级联动的。如果不需要,只要传入ID加载就行了。 <script type="text/javascript"> layui.use(['layer', 'jquery', 'form', 'laydate'], function () { var layer = layui.layer, $ = layui.jquery, form = layui.form; //年月选择器 var laydate = layui.laydate; laydate.render({ elem: '#endTime' , type: 'month' , change: function (value, date, endDate) { $("#endTime").val(value); if ($(".layui-laydate").length) { $(".layui-laydate").remove(); } } }); laydate.render({ elem: '#startTime' , type: 'month' , change: function (value, date, endDate) { $("#startTime").val(value); if ($(".layui-laydate").length) { $(".layui-laydate").remove(); } } }); //区域选择器,初始化城市,默认初始化河南省下所有城市 var cityarr = provinceList[0].children; var proviceid = 410000; $('#cityid').empty(); $('#cityid').append(new Option("请选择城市", 0)); for (var i = 0; i < cityarr.length; i++) { if (cityarr[i].pId == proviceid) { $('#cityid').append(new Option(cityarr[i].title, cityarr[i].id));// 下拉菜单里添加元素 } } //城市选择变化时 form.on('select(cityid)', function (data) { cityChange(data.value); form.render();//下拉菜单渲染 把内容加载进去 }); function cityChange(data) { if (data == 0) { $('#areaid').empty(); $('#areaid').append(new Option("请选择县区", 0)); } var cityarr = provinceList[0].children; for (var i = 0; i < cityarr.length; i++) { if (cityarr[i].id == data) { $('#areaid').empty(); $('#areaid').append(new Option("请选择县区", 0)); for (var j = 0; j < cityarr[i].children.length; j++) { $('#areaid').append(new Option(cityarr[i].children[j].title, cityarr[i].children[j].id));// 下拉菜单里添加元素 } } } } form.render();//下拉菜单渲染 把内容加载进去 }); </script>
效果:
这里一个基本的架构已经搭建起来了。目前位置,已经可以根据当前的架构完成相应的功能模块了。
.Net Core