052医疗项目-模块五:权限设置-实现根据用户显示不同的菜单

我们之前的做法是:

不管什么类型的用户登录:医院,卫生局等显示的左侧菜单都是一样的。我们在这篇文章里面就要实现不同的用户登录时显示的菜单是不同的.

我们先介绍数据库中的那几张表:那几张表和第三方系统有关。

这几张表对应的是

我们要查的是一个角色的菜单和菜单下的二级菜单:

我们先去看菜单表:

我们看到bss_sys_module就是菜单表(模块表):

这个表里面存放了一级和二级菜单。我们要把一级和二级菜单都查出来:

select m1.moduleid,m1.name,m2.moduleid menuid_two,m2.name menuname_two,m2.url from bss_sys_module m1,bss_sys_module m2
where m1.parentid=‘0‘--保证查出来的是一级菜单
and m2.parentid!=‘0‘--保证查出来的是二级菜单
and m2.parentid=m1.moduleid--查出一级菜单下的二级菜单

结果:

但是我我们要查的是:角色下的模块,所以最终的sql我们要这么写:

select m1.moduleid,m1.name,m2.moduleid menuid_two,m2.name menuname_two,m2.url from bss_sys_module m1,bss_sys_module m2
where m1.parentid=‘0‘--保证查出来的是一级菜单
and m2.parentid!=‘0‘--保证查出来的是二级菜单
and m2.parentid=m1.moduleid--查出一级菜单下的二级菜单
and m2.moduleid
in(

--角色范围内的菜单
select bss_sys_rolemodule.moduleid from bss_sys_role,bss_sys_rolesys,bss_sys_rolenode,bss_sys_rolemodule,bss_sys_roleoperate
where bss_sys_role.roleid=bss_sys_rolesys.roleid--知道角色在哪个系统.
and bss_sys_rolenode.rsid=bss_sys_rolesys.rsid--根据系统查找节点
and bss_sys_rolemodule.rnid=bss_sys_rolenode.rnid--节点下的model
and bss_sys_rolemodule.rmid=bss_sys_roleoperate.rmid
and bss_sys_role.roleid=‘A1657D9C6C7D47B59A99132A5ACE1A2E‘ --指定查卫生局

)
   order by m1.showorder,m2.showorder

查询结果:

这就是卫生局的模块权限。

同理我们看一下供货商的菜单权限:

select m1.moduleid,m1.name,m2.moduleid menuid_two,m2.name menuname_two,m2.url from bss_sys_module m1,bss_sys_module m2
where m1.parentid=‘0‘--保证查出来的是一级菜单
and m2.parentid!=‘0‘--保证查出来的是二级菜单
and m2.parentid=m1.moduleid--查出一级菜单下的二级菜单
and m2.moduleid
in(

--角色范围内的菜单
select bss_sys_rolemodule.moduleid from bss_sys_role,bss_sys_rolesys,bss_sys_rolenode,bss_sys_rolemodule,bss_sys_roleoperate
where bss_sys_role.roleid=bss_sys_rolesys.roleid--知道角色在哪个系统.
and bss_sys_rolenode.rsid=bss_sys_rolesys.rsid--根据系统查找节点
and bss_sys_rolemodule.rnid=bss_sys_rolenode.rnid--节点下的model
and bss_sys_rolemodule.rmid=bss_sys_roleoperate.rmid
and bss_sys_role.roleid=‘DD5E37F61B4D4D79BE84C3B8FCEDDAF0‘ --指定查供货商

)
   order by m1.showorder,m2.showorder

结果如下:

写好了sql  我们就要写Mapper.

这里涉及到一个问题:我们看一级菜单对应着好几个二级菜单,也就是一对多的关系,所以我们在做映射时要注意了,我们之前在学习mybatis是学习过Mybatis的一对多的查询,

我们这里就用这个方法。用resultMap .

 <!--
 "menus"指的是Menu类里面的属性List<menu> menus。因为在select 语句中返回了五个查询结果,我们要把
 这五个返回结果一一映射好。这里就是在做映射。
                    column表示的是数据库里面的列,而property表示的是yycg.base.pojo.vo.menu这个类里面的属性
  -->
 <resultMap id="findMenuByroleidResultMap" type="yycg.base.pojo.vo.Menu">
    <id column="menuid" property="menuid" />----这个表示的是主键,表示menuid相同的就合并
    <result column="menuname" property="menuname" />
    <collection property="menus" ofType="yycg.base.vo.Menu">
        <result column="menuid_two" property="menuid" />
         <result column="menuname_two" property="menuname" />
         <result column="url" property="url" />
    </collection>
</resultMap>

<!-- 根据角色获取菜单(一、二级) -->
  <select id="findMenuByroleid" parameterType="java.lang.String"
    resultMap="findMenuByroleidResultMap"
  >

select m1.moduleid menuid,
       m1.name     menuname,
       m2.moduleid menuid_two,
       m2.name     menuname_two,
       m2.url
  from bss_sys_module m1, bss_sys_module m2

 where m2.parentid = m1.moduleid
   and m1.parentid = ‘0‘
   and m2.parentid != ‘0‘

   and m2.moduleid in(

   <!--角色范围内的菜单 -->
   select bss_sys_rolemodule.moduleid from bss_sys_role,bss_sys_rolesys,bss_sys_rolenode,bss_sys_rolemodule,bss_sys_roleoperate

   where bss_sys_role.roleid=bss_sys_rolesys.roleid
   and bss_sys_rolenode.rsid=bss_sys_rolesys.rsid
   and bss_sys_rolemodule.rnid=bss_sys_rolenode.rnid
   and bss_sys_roleoperate.rmid=bss_sys_rolemodule.rmid
   and bss_sys_role.roleid=#{roleid}
   )
  order by m1.showorder,m2.showorder
  </select>

我们写好了Dao层之后,我们来写Service层:

    //取出角色id因为用户的groupid就是用户的角色id,所以可以直接从
//数据字典里面得到groupid也就是角色id
    String roleid=systemConfigService.findDictinfoByDictcode("s01", sysuser.getGroupid()).getRemark();

    activeUser.setSysmc(sysmc);

    //根据角色id获取菜单
//这里涉及到一个点我们取出来的是一个list但是我们却要存在一个Menu里面
//这个怎么弄,我们再设计json时就是考虑到了这一点:menus:[

//]
            List<Menu> menu_list = sysuserMapperCustom.findMenuByroleid(roleid);
            Menu menu = new Menu();
            menu.setMenus(menu_list);
            activeUser.setMenu(menu);//将用户菜单存入用户身份对象中
//根据角色id获取菜单
//这里在取Menu的时候,涉及到一个难点我们取出来的是一个list但是我们却要存在一个Menu里面
//这个怎么弄,我们再设计json时就是考虑到了这一点:menus:[

//]

Service写好了之后,我们来写Action.

    /**
     *
     * 获得菜单菜单,并转换成json
     */
    @RequestMapping("/usermenu")
    public @ResponseBody  Menu usermenu(HttpServletRequest request)throws Exception
    {

        HttpSession session=request.getSession();

        ActiveUser activeUser=(ActiveUser)session.getAttribute(Config.ACTIVEUSER_KEY);

        return    activeUser.getMenu();

    }

我们在浏览器的url中输入http://127.0.0.1:8080/yycgproject/usermenu.action就得到了json数据。

最后在页面上做修改:

var _menus;
    $(function() {//预加载方法
        //通过ajax请求菜单
        $.ajax({
            url : ‘${baseurl}usermenu.action‘,
            type : ‘POST‘,
            dataType : ‘json‘,
            success : function(data) {
                _menus = data;
                initMenu(_menus);//解析json数据,将菜单生成
            },
            error : function(msg) {
                alert(‘菜单加载异常!‘);
            }
        });

测试:用admin登录之后:效果如下:

只显示了超级管理员的菜单,别的菜单都不显示了。

测试通过。

时间: 2024-08-10 15:09:27

052医疗项目-模块五:权限设置-实现根据用户显示不同的菜单的相关文章

049医疗项目-模块五:权限设置-第三方系统的接入

我们先演示要实现的功能: 单击: 我们看着有三个子模块: 点击模块管理: 在模块管理中,我们可以设置一共有几个模块,每个模块里面有哪些具体的操作等. 角色管理: 给角色分配权限. 好,我们接下来看具体的实现: 我们先把第三方系统引入到工程中: import工程. 然后修改sysconfig,和sysmanager系统中的/WEB-INF/proxool.xml文件 接着 然后重启Tomcat. 然后修改代码: 我们增加下面连个Action层:其实我们的第三方系统的实现原理就是我们从自己的项目中的

049医疗项目-模块五:权限设置

权限管理模块 这是我写的最后一个模块,其他还有一个统计模块,我没时间看了.所以就不写了. 基础: 权限管理设计模型 通用的:用户权限管理模型(用到5张表:权限表.角色表.用户表.角色和权限关系表.用户和角色关系表) 但是本系统在上面的基础上有所改进,采用了第三方系统来实现权限管理. 本系统设计: 权限表: 使用第三方用户授权系统,权限表包括:系统表.模块表.操作表 用户表: 使用groupid区分不同的用户类型 使用sysid存储用户所属单位id 角色表: 用户角色对用户类型一对一. 用户角色采

051医疗项目-模块五:权限设置-用户授权

对饮系统的:

044医疗项目-模块四:采购单模块—采购单保存(Dao,Service,Action三层)

我们上上一篇文章(042医疗项目-模块四:采购单模块-采购单明细添加查询,并且把数据添加到数据库中)做的工作是把数据插入到了数据库,我们这篇文章做的是042医疗项目-模块四:采购单模块-采购单明细添加查询,并且把数据添加到数据库中这里没有写采购量,我们这篇文章做的就是把采购量写进入,也就是Updata之前的那个记录.这样采购单里面的记录就完整了. 如下: Dao层:用的是逆向工程生成的:yycgdmxMapper.updateByPrimaryKeySelective(yycgdmx_updat

017医疗项目-模块一:用户登录功能的实现

用户在登录页面上填好姓名和密码还有验证码实现登录. 实现的效果如下: 输入信息后成功. 具体做法代码如下: 我们还是从Dao层开始: 这里用到的Dao层的代码无非就是查名字,查密码什么的.之前就有的,这里的不用了. Service:这一层很重要: 先讲一下这一层要做的东西: 我们要做用户的登录验证. 1.根据传进来的id,去数据库查有没有这个用户,没有直接抛异常,有的话就继续下一步. 2.根据查到的用户sysuser.去查他的存在数据库里面的密码和我们在页面上的密码是不是一致的,一致的就继续,不

037医疗项目-模块四:采购单模块—采购单模块的整体需求

采购单模块的整体需求: 医院在采购药品时,先创建一个采购单,采购单内容包括本次采购的药品信息(采购量.采购金额),采购单创建成功后,需要提交到监管单位,由监管单位进行审核.审核通过后由供货商按照采购单的内容进行发货,医院收到药品后执行入库操作. 操作流程: 第一步:填写采购单基本信息 采购单基本信息包括:采购年份.采购单名称.建单时间.提交时间.联系人.联系电话.备注.采购单状态.. 第二步:当上面的采购单填好之后,按下"保存"键,就进入到这一步.填写采购单详细信息,本次采购的药品信息

032医疗项目-模块三:药品供应商目录模块——Service层和Action层和调试

我们上一篇文章讲了Dao层代码: 这一篇我们讲解Service层和Action层: Service层: 分为接口和实现类,我们主要看实现类:GysemplServiceImpl package yycg.business.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import yycg.business.dao.mapper.Gysypml

037医疗项目-模块四:采购单模块—采购单数据模型

上一篇文章我们知道了采购的需求.这篇文章我们就要看一下采购单模块的数据库怎么去建立. 我们设计时采用两张表: 1:采购单基本信息表(YYCGD): 也就是对应的页面上的: 当然我们设计数据库的时候不可能只有上面这些字段.我们看一下真实数据库中是怎么设计的: 我们来看一下这些字段的意义: 采购单号:相当于订单号,方便管理需要 采购单名称:对采购单简短说明,名称 医院id:创建采购单单位的id(记录单位id而不是用户的id) (外键) 联系人:联系人和建单人可能不是一个人 联系电话:联系人的电话 建

022医疗项目-模块二:药品目录的导入导出-对XSSF导出excel类进行封装

资源全部来源于传智播客. 好的架构师写的程序,就算给刚入门的新手看,新手一看就知道怎么去用.所以我们要对XSSF导出excel类进行封装.这是架构师的工作,但我们也要知道. 我们写一个封装类: 这个类单独有自己的main函数. 我们进入main函数一步一步看: public static void main(String[] args) throws Exception { /** 导出文件存放物理路径 * @param fileWebPath * 导出文件web下载路径 * @param fi