【C#MVC4】菜单管理和访问权限分配(一)
2016-09-01 21:25
381 查看
今天开始,写一个关于菜单管理的小例子,加深对mvc的使用。为什么选择菜单管理呢,因为中大型后台系统,根据用户角色的不同,均会做用户权限的分配。所以这个用处还是很广的,尤其对初学者而言,大部分公司都会将这部分不是很重要的放给新人做,让他们熟悉一下开发环境和开发流程。
这个项目暂时是由我空闲时间更新,所以可能会很慢,若有需要这个项目的代码,或者你做到更新的地方,想继续学下去,或者有问题的朋友,可以私聊我,我会进行相关的解答,和开放源代码。由于刚开始写博客,语言组织可能不是很好,有什么意见或是建议欢迎评论。
项目的工具是:VS2013,SqlServer2014,
表的结构是:
总共三张表,用途分别为:
User_Master:用户的登录表,这里没什么作用,也没有写过多的验证,只是用来登录系统。
Menu_List:菜单表,用于存放菜单按钮。Id,唯一标识列;Request_URL,请求路径;Name,菜单名;Serial,菜单位置标识;Menu_Level:菜单所属的等级/父菜单的ID;Icon_Name,菜单的图片。
Menu_List_Access:用户权限分配表。Id,唯一标示列;User_Master_Id,用户的Id;Menu_List_I,所属菜单的Id;
服务器端框架:EF6.0、并没有使用什么集成框架。
前段框架:EasyUI
开发模式:asp.net MVC4
项目结构:Common层:工具类
Model层:实体层,使用EF生成表的实体模型
Service层:持久层,使用Linq进行数据交换
Manager层:这里没有太大意义,但是保留习惯。
Controller层:控制层,进行数据的处理和视图的转发
View层,视图层,包含各个页面
大致业务流程:并没什么业务其实….就是将menu按角色分配给不同的用户,比如一般系统分为,客服,站点管理员,全局管理员,操作员等,这些人员的登录进入系统后,显示的菜单是不同的。进入系统后,系统就会去根据User_Master_Id去加载User_Menu_Access表,找到对应的Menu后,加载显示在一个tree上面。这样就做到了权限的分配。然后这里我们演示了一个菜单的管理,就是你新建一个页面之后,需要使用菜单管理将这个页面挂载到menu_list表中,管理员才能对其进行分配。
上面讲的可能有点乱,但是我相信既然你点进这个链接说明你是对这个流程较为了解的了,因为语言组织有点差,我写博客的目的之一也是为了锻炼自己的语言表达,能到达到清晰的表达自己的想法的程度就行了。
项目的初始搭建工作我就不再重复了,在我之前写的一个项目里有,这个也是接着那个项目做的 http://blog.csdn.net/f627422467/article/details/52319131
这里引入EasyUI的文件:直接放到项目目录下即可,但是重新打开项目,将刚刚的文件夹 包含在项目中。(会不会有初学者不知道如何将文件包含在项目中? 真有不会的可以私聊或是评论区留言哦)
最后项目的目录结构应该是这样的:
接下来是做一个登录的功能,但是篇幅有限,这一篇就做一些准备工作好了。
Common类下面添加一些公用的工具类,虽然这样违反了 最少知道原则增加了程序一定的耦合度,但是该做取舍时,要适度。
Utility:(里面提供了很多常用的工具类)
LogHelper:日志工具类,这里可已经错误日志记录下来,保存在物理路径中。
UserMessageShow:(常用的信息,有效的避免了在代码中硬编码)
这个项目暂时是由我空闲时间更新,所以可能会很慢,若有需要这个项目的代码,或者你做到更新的地方,想继续学下去,或者有问题的朋友,可以私聊我,我会进行相关的解答,和开放源代码。由于刚开始写博客,语言组织可能不是很好,有什么意见或是建议欢迎评论。
项目的工具是:VS2013,SqlServer2014,
表的结构是:
总共三张表,用途分别为:
User_Master:用户的登录表,这里没什么作用,也没有写过多的验证,只是用来登录系统。
Menu_List:菜单表,用于存放菜单按钮。Id,唯一标识列;Request_URL,请求路径;Name,菜单名;Serial,菜单位置标识;Menu_Level:菜单所属的等级/父菜单的ID;Icon_Name,菜单的图片。
Menu_List_Access:用户权限分配表。Id,唯一标示列;User_Master_Id,用户的Id;Menu_List_I,所属菜单的Id;
服务器端框架:EF6.0、并没有使用什么集成框架。
前段框架:EasyUI
开发模式:asp.net MVC4
项目结构:Common层:工具类
Model层:实体层,使用EF生成表的实体模型
Service层:持久层,使用Linq进行数据交换
Manager层:这里没有太大意义,但是保留习惯。
Controller层:控制层,进行数据的处理和视图的转发
View层,视图层,包含各个页面
大致业务流程:并没什么业务其实….就是将menu按角色分配给不同的用户,比如一般系统分为,客服,站点管理员,全局管理员,操作员等,这些人员的登录进入系统后,显示的菜单是不同的。进入系统后,系统就会去根据User_Master_Id去加载User_Menu_Access表,找到对应的Menu后,加载显示在一个tree上面。这样就做到了权限的分配。然后这里我们演示了一个菜单的管理,就是你新建一个页面之后,需要使用菜单管理将这个页面挂载到menu_list表中,管理员才能对其进行分配。
上面讲的可能有点乱,但是我相信既然你点进这个链接说明你是对这个流程较为了解的了,因为语言组织有点差,我写博客的目的之一也是为了锻炼自己的语言表达,能到达到清晰的表达自己的想法的程度就行了。
项目的初始搭建工作我就不再重复了,在我之前写的一个项目里有,这个也是接着那个项目做的 http://blog.csdn.net/f627422467/article/details/52319131
这里引入EasyUI的文件:直接放到项目目录下即可,但是重新打开项目,将刚刚的文件夹 包含在项目中。(会不会有初学者不知道如何将文件包含在项目中? 真有不会的可以私聊或是评论区留言哦)
最后项目的目录结构应该是这样的:
接下来是做一个登录的功能,但是篇幅有限,这一篇就做一些准备工作好了。
Common类下面添加一些公用的工具类,虽然这样违反了 最少知道原则增加了程序一定的耦合度,但是该做取舍时,要适度。
Utility:(里面提供了很多常用的工具类)
using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Web; using System.Web.Mvc; namespace Arise.Common { public class Utility { public static int ConvertToInt32(string num) { try { return Convert.ToInt32(num); } catch (Exception) { return 0; } } public static DataTable ToDataTable<T>(List<T> items) { var tb = new DataTable(typeof(T).Name); PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo prop in props) { Type t = GetCoreType(prop.PropertyType); tb.Columns.Add(prop.Name, t); } foreach (T item in items) { var values = new object[props.Length]; for (int i = 0; i < props.Length; i++) { values[i] = props[i].GetValue(item, null); } tb.Rows.Add(values); } return tb; } public static bool IsNullable(Type t) { return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)); } public static Type GetCoreType(Type t) { if (t != null && IsNullable(t)) { if (!t.IsValueType) { return t; } else { return Nullable.GetUnderlyingType(t); } } else { return t; } } public static int ConvertToInt32(Object obj) { try { return Convert.ToInt32(obj.ToString()); } catch (Exception) { return 0; } } public static short ConvertToShort(string num) { try { return short.Parse(num); } catch (Exception) { return 0; } } public static decimal ConvertToDecimal(string num) { try { return Convert.ToDecimal(num); } catch (Exception) { return 0; } } public static decimal ConvertToDecimal(decimal? num) { try { return Convert.ToDecimal(num); } catch (Exception) { return 0; } } public static decimal ConvertToDecimal(Object obj) { try { return Convert.ToDecimal(obj.ToString()); } catch (Exception) { return 0; } } public static double ConvertToDouble(decimal num) { try { return Convert.ToDouble(num); } catch (Exception) { return 0; } } public static double ConvertToDouble(Object obj) { try { return Convert.ToDouble(obj); } catch (Exception) { return 0; } } public static DateTime ConvertToDatetime(string value) { try { return Convert.ToDateTime(value); } catch (Exception) { return DateTime.Now; } } public static DateTime ConvertToDatetime(object value) { try { return Convert.ToDateTime(value.ToString()); } catch (Exception) { return DateTime.Now; } } public static DateTime GetCurrentDateTime(double GMT) { try { return DateTime.Now.ToUniversalTime().AddHours(GMT); } catch (Exception) { return DateTime.Now.ToUniversalTime(); } } public static Exception GetInnerException(Exception exception) { if (exception.InnerException != null) { return GetInnerException(exception.InnerException); } return exception; } public static string GetFinnalExceptionMessage(Exception exception) { if (exception.InnerException != null) { return GetFinnalExceptionMessage(exception.InnerException); } return exception.Message; } /// <summary> /// Convert Date dd/MM/yyyy to MM/dd/yyyy or MM/dd/yyyy to dd/MM/yyyy /// </summary> /// <param name="strDate"></param> /// <returns></returns> public static string ConvertDate(string strDate) { string date = ""; string[] TempDate; if (strDate != "") { TempDate = strDate.Split('/'); date = TempDate[1].ToString() + "/" + TempDate[0].ToString() + "/" + TempDate[2].ToString(); } return date; } public static JsonResult ReturnJsonResult(string result, string message) { return new JsonResult { Data = new { result = result, message = message }, }; } public static JsonResult ReturnJsonResult(string result) { JsonResult js = new JsonResult(); js.Data = result; return js; } public static JsonResult ReturnJsonResult<T>(T t) { JsonResult js = new JsonResult(); js.Data = t; return js; } /// <summary> /// 转换为Json格式 /// </summary> /// <param name="obj">要转换的对象</param> /// <returns>结果Json对象</returns> public static string ToJson(object obj) { IsoDateTimeConverter timeConverter = new IsoDateTimeConverter(); timeConverter.DateTimeFormat = "dd/MM/yyyy"; return JsonConvert.SerializeObject(obj, timeConverter); } public static string ToJsonIgnoreForeignKey(object obj) { JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings(); jsonSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; return JsonConvert.SerializeObject(obj, jsonSerializerSettings); } /// <summary> /// 转换为带记录总数的Json格式 /// </summary> /// <param name="obj">要转换的对象</param> /// <param name="total">记录总数</param> /// <returns>结果Json对象</returns> public static string ToGridJson(object obj, int total) { IsoDateTimeConverter timeConverter = new IsoDateTimeConverter(); timeConverter.DateTimeFormat = "dd/MM/yyyy"; Hashtable hash = new Hashtable(); hash["total"] = total; hash["rows"] = obj; return (JsonConvert.SerializeObject(hash, timeConverter)).Replace("\r\n", " ").Replace("\n", ""); } public static string ToGridJsonWithTime(object obj, int total) { IsoDateTimeConverter timeConverter = new IsoDateTimeConverter(); timeConverter.DateTimeFormat = "dd/MM/yyyy HH:mm:ss"; Hashtable hash = new Hashtable(); hash["total"] = total; hash["rows"] = obj; return (JsonConvert.SerializeObject(hash, timeConverter)).Replace("\r\n", " ").Replace("\n", ""); } /// <summary> /// 使Json反序列化 /// </summary> /// <typeparam name="T">反序列化类型</typeparam> /// <param name="obj">Json</param> /// <returns>结果对象</returns> public static T Deserialize<T>(string obj) { return JsonConvert.DeserializeObject<T>(obj); } public static DataTable JsonToDataTable(string strJson) { //取出表名 Regex rg = new Regex(@"(?<={)[^:]+(?=:\[)", RegexOptions.IgnoreCase); string strName = rg.Match(strJson).Value; DataTable tb = null; //去除表名 strJson = strJson.Substring(strJson.IndexOf("[") + 1); strJson = strJson.Substring(0, strJson.IndexOf("]")); //获取数据 Regex rgData = new Regex(@"(?<={)[^}]+(?=})"); MatchCollection mc = rgData.Matches(strJson); for (int i = 0; i < mc.Count; i++) { string strRow = mc[i].Value; string[] strRows = strRow.Split(','); //创建表 if (tb == null) { tb = new DataTable(); tb.TableName = strName; foreach (string str in strRows) { DataColumn dc = new DataColumn(); string[] strCell = str.Split(':'); dc.ColumnName = strCell[0].Replace("\"", ""); tb.Columns.Add(dc); } tb.AcceptChanges(); } //增加内容 DataRow dr = tb.NewRow(); for (int r = 0; r < strRows.Length; r++) { dr[r] = strRows[r].Split(':')[1].Trim().Replace(",", ",").Replace(":", ":").Replace("\"", "").Replace("null", "").Replace("NULL", ""); } tb.Rows.Add(dr); tb.AcceptChanges(); } return tb; } public static string DataTableToJson(DataTable dt) { StringBuilder Json = new StringBuilder(); Json.Append("["); if (dt.Rows.Count > 0) { for (int i = 0; i < dt.Rows.Count; i++) { Json.Append("{"); for (int j = 0; j < dt.Columns.Count; j++) { Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":\"" + dt.Rows[i][j].ToString() + "\""); if (j < dt.Columns.Count - 1) { Json.Append(","); } } Json.Append("}"); if (i < dt.Rows.Count - 1) { Json.Append(","); } } } Json.Append("]"); return Json.ToString(); } public static void DeleteFile(string fileNameAndPath) { if (System.IO.File.Exists(fileNameAndPath)) { System.IO.File.Delete(fileNameAndPath); } } } }
LogHelper:日志工具类,这里可已经错误日志记录下来,保存在物理路径中。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Configuration; using System.IO; namespace Arise.Common { public static class LogHelper { public static string RecordError(Exception exception) { string Url = HttpContext.Current.Request.RawUrl;//错误发生地址 string errorMessage = Utility.GetFinnalExceptionMessage(exception); try { string path = ConfigurationManager.AppSettings["TempFilePath"].ToString().Trim(); string year = DateTime.Now.ToString("dd/MM/yyyy").Substring(6, 4); string month = DateTime.Now.ToString("dd/MM/yyyy").Substring(3, 2); string day = DateTime.Now.ToString("dd/MM/yyyy").Substring(0, 2); path += @"ErrorLog\" + year + month; if (!Directory.Exists(path)) //如果文件夹不存在,则创建文件夹(每个月一个文件夹) { Directory.CreateDirectory(path); } string fileName = @"\ErrorLog" + year + month + day + ".txt"; path += fileName; if (!File.Exists(path)) //如果文件不存在,则创建文件(每天一个文件) { File.Create(path).Close(); } StreamWriter writer = new StreamWriter(path, true); String date = DateTime.Now.ToString(); writer.WriteLine("\r\n" + date); writer.WriteLine("Message: "); writer.WriteLine("\t" + errorMessage); writer.Close(); return errorMessage; } catch (Exception) { throw new Exception(errorMessage); } } public static string GetFinnalExceptionMessage(Exception exception) { if (exception.InnerException != null) { return GetFinnalExceptionMessage(exception.InnerException); } return exception.Message; } } }
UserMessageShow:(常用的信息,有效的避免了在代码中硬编码)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Arise.Common { public static class UserMessageShow { public static string ErrorPassword = "Your Password OR UserName is Error!"; public static string ErrorLogin = "Your have alreadly Login System!"; } }
相关文章推荐
- 分享微信开发Html5轻游戏中的几个坑
- C# MVC模式下商品抽奖功能实现
- Zend的MVC机制使用分析(二)
- ASP.NET MVC 4 捆绑和缩小实例介绍
- asp.net mvc实现简单的实时消息推送
- ASP.NET Mvc开发之查询数据
- ASP.NET MVC中将控制器分离到类库的实现
- asp.net实现在非MVC中使用Razor模板引擎的方法
- MVC默认路由实现分页(PagerExtend.dll下载)
- ASP.NET MVC中使用JavaScriptResult的用法示例
- ASP.NET MVC中的AJAX应用
- .Net MVC网站中配置文件的读写
- 微信公众号支付(MVC版本)
- 为ASP.NET MVC及WebApi添加路由优先级
- ASP.NET MVC中图表控件的使用方法
- Asp.net mvc实时生成缩率图到硬盘
- 剖析ASP.NET MVC的DependencyResolver组件
- ASP.NET MVC下拉框联动实例解析
- ASP XML制作菜单管理程序
- ASP.NET MVC的四种验证编程方式