权限管理系统(一)

简介: 前面我们做的小项目都是一个表的,业务代码也相对简单。现在我们来做一个权限管理系统,体验一下多表的业务逻辑,顺便巩固一下过滤器的知识。!

目的


现在我有一个管理商品、订单的页面。当用户点击某个超链接时,过滤器会检测该用户是否有权限!

10.jpg


需求分析


按照面向对象的思想,我们至少应该有权限(Privilege)和用户(User)实体。两个实体足够了吗?细想一下,如果我们有多个用户,多个用户也有多个权限,当要为用户授权的时候,这样子就会非常麻烦!所以我们应该引入角色(Role)这个实体!

引入角色(Role)这个实体方便在哪呢??把权限赋给角色(比如:把删除、修改的权限给管理员这个角色),管理员这个角色再赋给用户,那么该用户就有了修改、删除的权限了!

权限和角色是多对多的关系,角色和用户也是多对多的关系!



开发实体


用户实体


publicclassUser{


   privateStringid;

   privateStringusername;

   privateStringpassword;


   //记住角色

   privateSet<Role>roles=newHashSet<>();


   //各种getter和setter.....



}


角色实体


publicclassRole{

   privateStringid;

   privateStringname;

   privateStringdescription;


   //记住所有的用户

   privateSet<User>users=newHashSet<>();


   //记住所有的权限

   privateSet<Privilege>privileges=newHashSet<>();


   //各种getter和setter.....

}


权限实体


publicclassPrivilege{


   privateStringid;

   privateStringname;

   privateStringdescription;


   //记住所有的角色

   privateSet<Role>roles=newHashSet<>();


   //各种getter和setter.....


}


改良


用户和角色、角色和权限都是多对多的关系,这是毋庸置疑的!我们也按照面向对象的方法来设计,用集合来记住另一方的数据!

但是呢,我们想想:

  • 在权限的Dao中,在查看权限的时候,有必要列出相对应的角色吗??
  • 在角色的Dao中,在查看角色的时候,有必要列出相对应的用户吗??

答案是没有的,一般我们都不会显示出来。所以,权限的实体没必要使用Set集合来记住角色,角色实体没必要使用Set集合来记住用户!


改良后的权限实体


publicclassPrivilege{


   privateStringid;

   privateStringname;

   privateStringdescription;


   //各种setter和getter方法

   

}


改良后的角色实体


publicclassRole{

   privateStringid;

   privateStringname;

   privateStringdescription;

   

   //记住所有的权限

   privateSet<Privilege>privileges=newHashSet<>();


   //各种setter和getter方法



}



在数据库中建表


user表


CREATETABLEuser(

     id       VARCHAR(20)PRIMARYKEY,

     usernameVARCHAR(20)NOTNULL,

     passwordVARCHAR(20)NOTNULL

   

   

   );


role表


CREATETABLErole(

     id          VARCHAR(20)PRIMARYKEY,

     name        VARCHAR(20)NOTNULL,

     descriptionVARCHAR(255)

   

   );


privilege表


CREATETABLEprivilege(

   

     id          VARCHAR(20)PRIMARYKEY,

     name        VARCHAR(20)NOTNULL,

     descriptionVARCHAR(255)

   

   

   );


user和role的关系表


CREATETABLEuser_role(

   

     user_idVARCHAR(20),

     role_idVARCHAR(20),

     PRIMARYKEY(user_id,role_id),

     CONSTRAINTuser_id_FKFOREIGNKEY(user_id)REFERENCESuser(id),

     CONSTRAINTrole_id_FKFOREIGNKEY(role_id)REFERENCESrole(id)

   );


role和privilege的关系表


CREATETABLErole_privilege(

   

     role_id      VARCHAR(20),

     privilege_idVARCHAR(20),

     PRIMARYKEY(role_id,privilege_id),

   

     CONSTRAINTrole_id_FK1FOREIGNKEY(role_id)REFERENCESrole(id),

     CONSTRAINTprivilege_id_FKFOREIGNKEY(privilege_id)REFERENCESprivilege(id)

   

   );

注意:user和role的关系表、role和privilege的关系都有role_id作为外键,外键的名称是不能一样的!



开发DAO


PrivilegeDao


/**

* 权限的管理应该有以下的功能:

* 1.添加权限

* 2.查看所有权限

* 3.查找某个权限

*

* */

publicclassPrivilegeDao{


   /*添加权限*/

   publicvoidaddPrivilege(Privilegeprivilege){

       try{


           QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());

           Stringsql="INSERT INTO privilege (id, name, description) VALUE (?, ?, ?)";

           queryRunner.update(sql,newObject[]{privilege.getId(),privilege.getName(),privilege.getDescription()});



       }catch(Exceptione){

           e.printStackTrace();

           thrownewRuntimeException("添加权限失败了!");

       }

   }


   /*查找权限*/

   publicPrivilegefindPrivilege(Stringid){


       try{


           QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());

           Stringsql="SELECT *FROM privilege WHERE id = ?";

           Privilegeprivilege=(Privilege)queryRunner.query(sql,newBeanHandler(Privilege.class),newObject[]{id});


           returnprivilege;

       }catch(Exceptione){

           e.printStackTrace();

           thrownewRuntimeException("查找权限失败了!");

       }

   }


   /*获取所有的权限*/

   publicList<Privilege>getAllPrivileges(){


       try{


           QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());

           Stringsql="SELECT * FROM privilege ";


           List<Privilege>privileges=(List<Privilege>)queryRunner.query(sql,newBeanListHandler(Privilege.class));

           

           returnprivileges;


       }catch(Exceptione){

           e.printStackTrace();

           thrownewRuntimeException("查找权限失败了!");

       }

   }

}


测试PrivilegeDao的功能


为了测试方便,添加有参构造函数到Privilege对象中

publicclassPrivilegeDaoTest{

   

       PrivilegeDaoprivilegeDao=newPrivilegeDao();

   

       @Test

       publicvoidadd(){

   

           Privilegeprivilege=newPrivilege("2","修改","修改功能");

   

           privilegeDao.addPrivilege(privilege);

   

       }

   

       @Test

       publicvoidgetAll(){

           List<Privilege>list=privilegeDao.getAllPrivileges();

   

           for(Privilegeprivilege:list){

   

               System.out.println(privilege.getId());

           }

       }

   

       @Test

       publicvoidfind(){

           Stringid="2";

   

           Privilegeprivilege=privilegeDao.findPrivilege(id);

   

           System.out.println(privilege.getName());

   

       }

}


UserDao


publicclassUserDao{


   publicvoidaddUser(Useruser){


       try{


           QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());

           Stringsql="INSERT INTO user (id,username,password) VALUES(?,?,?)";


           queryRunner.update(sql,newObject[]{user.getId(),user.getUsername(),user.getPassword()});



       }catch(Exceptione){

           e.printStackTrace();

           thrownewRuntimeException("添加权限失败了!");

       }


   }


   publicUserfind(Stringid){

       try{


           QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());


           Stringsql="SELECT * FROM user WHERE id=?";

           Useruser=(User)queryRunner.query(sql,newBeanHandler(User.class),newObject[]{id});


           returnuser;


       }catch(Exceptione){

           e.printStackTrace();

           thrownewRuntimeException("添加权限失败了!");

       }


   }


   publicList<User>getAll(){

       try{


           QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());


           Stringsql="SELECT * FORM user";

           List<User>users=(List<User>)queryRunner.query(sql,newBeanListHandler(User.class));


           returnusers;

       }catch(Exceptione){

           e.printStackTrace();

           thrownewRuntimeException("添加权限失败了!");

       }

   }

}


測試UserDao


publicclassUserDaoTest{


   UserDaouserDao=newUserDao();


   @Test

   publicvoidadd(){


       Useruser=newUser();

       user.setId("2");

       user.setUsername("qqq");

       user.setPassword("123");

       userDao.addUser(user);



   }


   @Test

   publicvoidfind(){


       Stringid="1";

       Useruser=userDao.find(id);


       System.out.println(user.getUsername());

   }


   @Test

   publicvoidfindALL(){


       List<User>userList=userDao.getAll();


       for(Useruser:userList){


           System.out.println(user.getUsername());

       }


   }


}


RoleDao


publicvoidadd(Rolerole){


       try{

           QueryRunnerrunner=newQueryRunner(JdbcUtils.getDataSource());

           Stringsql="insert into role(id,name,description) values(?,?,?)";

           Objectparams[]={role.getId(),role.getName(),role.getDescription()};

           runner.update(sql,params);

       }catch(Exceptione){

           thrownewRuntimeException(e);

       }


   }


   publicRolefind(Stringid){


       try{

           QueryRunnerrunner=newQueryRunner(JdbcUtils.getDataSource());

           Stringsql="select * from role where id=?";

           return(Role)runner.query(sql,id,newBeanHandler(Role.class));

       }catch(Exceptione){

           thrownewRuntimeException(e);

       }

   }


   //得到所有角色

   publicList<Role>getAll(){

       try{


           QueryRunnerrunner=newQueryRunner(JdbcUtils.getDataSource());

           Stringsql="select * from role";

           return(List<Role>)runner.query(sql,newBeanListHandler(Role.class));

       }catch(Exceptione){

           thrownewRuntimeException(e);

       }


   }




目录
相关文章
|
搜索推荐 算法 Go
对Go的切片进行随机排序
使用math/rand包和sort包来对切片进行随机排序
289 0
|
监控 安全 Java
五大权限系统模型该如何选择?
五大权限系统模型该如何选择?
737 0
|
Java Linux Python
Linux环境下 代码java调用python出错
Linux环境下 代码java调用python出错
278 4
|
存储 缓存 算法
RAM与ROM的区别及应用
RAM与ROM的区别及应用
|
存储 NoSQL 算法
5)深度解密 Redis 的哈希(Hash)
5)深度解密 Redis 的哈希(Hash)
211 1
|
11月前
|
数据库 开发者
IntelliJ IDEA调试技巧:提升你的调试效率
调试是软件开发中不可或缺的一部分,而IntelliJ IDEA提供了一套强大的调试工具,可以帮助开发者更高效地定位和解决问题。本文将分享一些高手必会的IDEA调试技巧,让你在调试时如虎添翼。
277 0
|
网络协议 算法 安全
【网络协议基础】TCP/IP协议大全
TCP/IP协议是现代计算机网络通信的基础,是互联网及局域网广泛使用的一套协议。TCP/IP协议集采用分层模型,以便于网络的设计、实现和管理。
749 2
|
SQL 关系型数据库 MySQL
sql数据库同步软件
SQL数据库同步软件有多种选择,以下是一些常见的工具: * SQL Data Compare:此工具可以帮助在SQL Server或Azure SQL数据库之间进行数据比较和同步。它能够自动检测
|
缓存 前端开发 JavaScript
Vite 打包优化:全面解析与实践
Vite 作为新一代前端构建工具,以其快速开发体验和高效打包能力著称。然而,在实际项目开发中,为了进一步提升性能和用户体验,我们仍需对 Vite 打包进行优化。本文将深入探讨 Vite 打包优化策略,涵盖代码拆分、资源压缩、缓存利用、构建配置等多个方面,并提供实践案例和最佳实践建议,帮助开发者充分释放 Vite 的潜力。
2691 1
|
机器学习/深度学习 数据可视化 数据挖掘
【视频】线性混合效应模型(LMM,Linear Mixed Models)和R语言实现案例(一)
【视频】线性混合效应模型(LMM,Linear Mixed Models)和R语言实现案例