您的位置:首页 > 编程语言 > C#

【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:(里面提供了很多常用的工具类)

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!";
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息