我是靠谱客的博主 冷静大门,最近开发中收集的这篇文章主要介绍利用MVVM来实现基于角色的权限菜单,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

      近日来研究了RBAC模型,参考了网上诸多例子,而后利用WPF技术实现了一个基于角色的权限菜单的简单示例,例子非常简单,重在这种模型的应用。将这些概念及例子做一个总结,以便大家交流学习。

      RBAC模型主要是首先将访问权限与角色相关联,然后角色再与用户相关联。

      主要分为三个部分:User用户,Role角色,及Permission权限。

      首先设计数据表:

             Users表:UserID,UserName,UserPwd,RoleID;

             Role表:RoleID,RoleName;

             Permission表:PermissionID,PermissionName;

             RolePermission表:RolePermissionID,RoleID,PermissioID;

设计好数据表以后,就开始项目的编写,因为这段时间研究的是MVVM模式的应用,因此,使用了MVVM模式编写此例。

项目分为Model,View及ViewModel三个部分。Model只要的功能是实体类和提供的服务。实体类是对事物属性抽象构成的类,即代表事物的属性集合,只有属性,没有方法。所提供的服务主要是通过访问数据存储获取数据,来生成实体类的实例,为实体类实例提供数据。ViewModel是View和Model之间的纽带,其过程是将View绑定到ViewModel上,而同时有包装了Model的实体及服务。当用户对界面操作时,会引发ViewModel的变化,ViewModel调用Model中的服务,修改其包装实体或实体集。由于这些实体或实体集同样被绑定到界面上,因此,界面对用户的操作做出响应。

在Service中有两个服务,分别是对于权限的判断,就主界面的显示。

PermissionServie.cs中的内容:

public class PermissionServie : IPermissionServie
    {
        public static int userIDstatic;

        public PermissionServie()
        {
            userIDstatic = 0;
        }

        /// <summary>
        /// 判断用户登录是否有效
        /// </summary>
        /// <param name="user"></param>
        string IPermissionServie.LoginIsValid(User user)
        {
            string valid = "";
            int ID = 0;
            string constr = "server=(local);Integrated Security=True;pwd='';uid=sa;database=Children";
            SqlConnection con = new SqlConnection(constr);

            try
            {
                con.Open();
                string cmdstr = "select UserPwd,UserID from Users where UserName='" + user.UserName + "'";
                SqlCommand sqlcmd = new SqlCommand(cmdstr, con);
                SqlDataReader sqlreader = sqlcmd.ExecuteReader();
                if (sqlreader.Read())
                {
                    string pwd = sqlreader[0].ToString();
                    if (pwd == user.UserPwd)
                    {
                        valid = "登录成功";
                        ID = Convert.ToInt16(sqlreader[1]) ;
                    }//name+pwd
                    else
                        valid = "密码错误";
                }
                else
                    valid = "用户名不存在";
                sqlreader.Close();

            }
            catch (Exception e1) { }

            con.Close();

            userIDstatic = ID;

            return valid;
        }

        /// <summary>
        /// 根据用户名密码查找数据库,返回该用户相应的权限集合
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        ObservableCollection<Permission> IPermissionServie.GetUserPermissions()
        {
            Permission _permission;
            ObservableCollection<Permission> list = new ObservableCollection<Permission>();
            User user = DataPool.UserDataStore;

            string constr = "server=(local);Integrated Security=True;pwd='';uid=sa;database=Children";
            SqlConnection con = new SqlConnection(constr);

            try
            {
                con.Open();
                //string cmdstr = "select PermissionID from RolePermission where RoleID=(select RoleID from UserRole where UserID="+ userIDstatic +")";
                string cmdstr = "select PermissionID from Users inner join RolePermission on Users.RoleID=RolePermission.RoleID  where UserName='"+ user.UserName +"'";
                SqlDataAdapter da = new SqlDataAdapter(cmdstr, con);
                DataSet ds = new DataSet();
                SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(da); //使用 CommandBuilder 自动生成 SQL 语句
                da.Fill(ds);
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    _permission = new Permission();
                    _permission.PermissionID = Convert.ToInt16(ds.Tables[0].Rows[i][0]);
                    list.Add(_permission);
                }
            }
            catch (Exception e)
            {

            }

            con.Close();


            return list;
        }
    }

     

ShowWinService.cs:

public class ShowWinService : IShowWinService
    {

        public ShowWinService()
        {
           
        }

        public void ShowDialog<T>(object viewModel) where T : Window
        {
            T showWin = Activator.CreateInstance<T>();
            //showWin.DataContext = viewModel;

            showWin.Show();
        }

        public void ClosedWin<T>() where T : Window
        {

            T closedWin = Activator.CreateInstance<T>();

            closedWin.Close();
        }
    }

     个文件是主要的内容,其中PermissionServie.cs中首先对用户名及密码进行了判断,看是否是合法用户,接着看此用户相对应的角色是什么,并将其角色对应的权限找出,并设置相应的菜单权限。在设计权限时,首先考虑的是权限逻辑,这仅仅是对于对象的类别,不涉及到对象的特定实例。对所有的用户都是一样的,并不区分操作的具体对象实例。要实现对象的实例级,就要将权限逻辑配合业务逻辑。例如,在业务逻辑中判断用户具体的权限有哪些。

    ShowMainViewModel.cs中涉及了关于权限的业务逻辑判断。

public void OperateMenu()
        {
            for (int i = 0; i < _permissionProperty.Count; i++)
            {
                Permission _permission = _permissionProperty[i];
                int ID = _permission.PermissionID;
                switch(ID)
                {
                    case 1:
                        IsUse1 = true;
                        break;
                    case 2:
                        IsUse2 = true;
                        break;
                    case 3:
                        IsUse3 = true;
                        break;
                    default :
                        break;
                }
            }

        }

     比较简单,讲的也比较简单,重在MVVM模式及RBAC模型的了解。

源码下载:http://download.csdn.net/source/2267576

 

最后

以上就是冷静大门为你收集整理的利用MVVM来实现基于角色的权限菜单的全部内容,希望文章能够帮你解决利用MVVM来实现基于角色的权限菜单所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部