SSH 结构中 不同角色登录,显示不同的菜单

本文介绍了一种基于Struts2框架实现动态菜单的方法。主要步骤包括:在前台页面使用Struts2标签从值栈中获取菜单数据;在Action中查询用户对应的菜单列表并存入值栈;以及在Service层实现具体的查询逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于这个功能,这里也就是提供一个思路,在做项目的时候因为要用到,肯定存在更好的方法,此思路仅供参考。

 

一、关于前台页面的接收方式

这里使用struts2的标签: <s:iterator value="值栈中的值"> 来从struts2的值栈中拿到需要的值

 1 <s:iterator value="#menusList">
 2     <li>
 3         <a href="#" class="dropdown-toggle">
 4             <i class="${icon}"></i>
 5             <span class="menu-text">${name}</span>
 6             <b class="arrow icon-angle-down"></b>
 7         </a>
 8         <ul class="submenu">
 9         
10             <s:iterator value="children">
11                 <li>
12                     <a href="${url}" target="main">
13                         <i class="${icon}"></i>${name}
14                     </a>
15                 </li>
16             </s:iterator>
17             
18         </ul>
19     </li>
20 </s:iterator>

 

 二、在Action的默认方法中使用函数来查询当前用户所拥有的菜单列表.

1     @Override
2     public String execute() throws Exception {
3         Employee employee = (Employee) ActionContext.getContext().getSession().get(USER_IN_SESSION);
4         List<Menu> list = menuService.findByLoginUserId(employee.getId());
5         // 这里通过putContext()放进去
6         // 前台取值时<s:标签内的value中取
7         putContext("menusList", list);
8         return SUCCESS;
9     }            

 三、在Service的借口中和实现类 ServiceImpl 中添加此查询方法:

1 public interface IMenuService extends IBaseService<Menu> {
2     
3     List<Menu> findByLoginUserId(Long loginUserId);
4     
5 }

实现类 MenuServiceImpl.java

 1 public class MenuServiceImpl extends BaseServiceImpl<Menu> implements IMenuService {
 2 
 3     @Override
 4     public List<Menu> findByLoginUserId(Long loginUserId) {
 5         //String hql = "select distinct m from Employee e join e.roles r join r.menus m where e.id = ?";
 6         String hql = "select distinct m from Employee e join e.roles r join r.menus m where e.id=?";
 7         
 8         // 先拿该用户所有菜单:allList中有该用户所有菜单(包括一级菜单和二级菜单)
 9         List<Menu> allList = baseDao.findByHql(hql, loginUserId);
10 
11         // 定义一个列表来装一级菜单
12         List<Menu> parentList = new ArrayList<Menu>();
13         // 筛选一级菜单
14         for (Menu pmenu : allList) {
15             // 筛选条件,此菜单没有父级菜单
16             if (pmenu.getParent() == null) {
17                 parentList.add(pmenu);
18             }
19         }
20 
21         //筛选二级菜单
22         for (Menu cmenu : allList) {
23             //判断条件:此菜单的父级菜单存在
24             if (cmenu.getParent()!=null) {
25                 //迭代上面已经取出的父级菜单
26                 for (Menu pmenu : parentList) {
27                     //判断条件:pmenu父级菜单的id和cmenu子级菜单属性中parent的getid相等
28                     if (pmenu.getId() == cmenu.getParent().getId()) {
29                         //把子菜单放入相应的父级菜单下
30                         pmenu.getChildren().add(cmenu);
31                     }
32                 }
33             }
34         }
35         
36         return parentList;
37     }
38 }

 

至此,根据登录的用户,来获取相应所拥有的菜单列表的功能已经完成。

需要注意的是:

  1. 在使用struts2的标签从值栈中取值的时候,需要注意后台存放的名字和前台struts标签中取值时候的名字,需要保持一致。

  2. 关于不同用户显示不同权限菜单,原理很简单,从seesion中取当前登录的 id,根据 id 去数据库中查询该 id 所拥有的角色列表等。

   (这里需要注意hibernate 多表联查 HQL 语句 的问题)

  3. 在使用其他方法(如 JSON等),可能需要根据方法来调整相关实现类的细节处理等。

 

转载于:https://www.cnblogs.com/applerosa/p/5946914.html

1.鲜花展示以及用户模块:分别针对消费者,店长,总经理等不同角色进行不同页面,与库存表相关联 (1)针对消费者展示花的文字信息,以及图片,并展示购买按钮,选择分店进行下单。 (2)针对店长角色,在花的展示页面显示新增、修改、下架按钮,针对下架的商品店长有权限在待上架中操作鲜花上架。 (3)针对总经理,只展示鲜花展示页面,不显示任何操作。 (4)数据库查询出来的数据返回前台,将鲜花名称,花语,价格使用foreach循环放入div,展示到前台页面。(5)使用c:if标签判断登录用户角色,展示角色对应按钮。 (6)通过修改鲜花状态的字段来实现鲜花上下架功能。 (7)vip购买,显示折扣并显示折后价,普通用户没有。 (8)店长对本店客户的信息维护,总经理对所有店的客户的信息维护。 2.分店模块:与订单表,员工表相关联 (1)针对分店进行增删该查。 (2)在新增分店时指定分店店长,指定员是从员工表中查出的非店长员工, 指定后要关联新增的分店Id并且要更改该员工对应的角色表。 (3)更改分店店长,指定的员是从当前的分店中找出的,并且在指定新店长后,需要将原店长的角色指定回普通员工,这些涉及4表的更改。 3.员工以及前台页面模块:分别关联用户表,分店表(1)针对员工进行的增删改查。 (2)总经理登录可以看到所有分店的员工,分店店长登录只能看到自己店面的员工。 (3)可以调动员工到不同的分店,可以针对员工进行请假,请假的同时,工作天数会少一天,还有一个开除员工的选项。 (4)加入httpclient调用天气的接口,使用了H5和easyui来美化前台的皮肤。 4.库存管理以及前台页面模块:分别关联订单表,分店表,员工表,角色表,鲜花表 (1)不同角色登录可以看到不同的库存,总经理登录可以看到所有分店所有花材的库存,而分店店长登录只能看到本店花材的库存。(2)店长登录可以针对鲜花表增加的鲜花进行库存的新增。 (3)对外开放鲜花的webservice接口,添加时间控件的小部件。 (4)Bug的查找以及页面的美化。 5.订单以及javamail、POI模块:分别关联分店表,库存表,员工表,用户表,顾客表,供应商表,花材表,分为供应商订单和顾客订单 (1)顾客订单,顾客新增时可以新增鲜花订单,通过分店以及花材Id定位到库存,顾客可以进行订单的修改和退货。 (2)店长登录看到顾客订单后,确认发货顾客订单就不可以修改,同时库存也会相应减少。 (3)店长登录可以新增供应商订单,同时可以修改和退货。 (4)供应商登录可以看到订单,发货后相应库存会增加。 (5)顾客订单新增时,会判断用户是否为VIP来确定订单金额,并且会针对分店库存进行订单数量限定。 (6)POI报表打印以及javaMail发送邮件功能。 6.数据分析模块:关联库存表,分店表,订单表,员工表,用户表,角色表 (1)店长登录时,看到的所有数据,库存,销售金额,销售数量都是以本店的花朵为基础进行的查询。 (2)经理登录时,看到的所有数据是以分店为基础进行的查询。 7.供应商以及mongoDB模块:关联了供应商表,用户表,角色表 (1)进行普通的增删该查,条件查询。(1)进行普通的增删该查,条件查询。 (2)在spring中集合mongoDB,通过AOP切点切入mongoDB。 (3)针对log记录进行查询,可以查询正常以及异常的日志状态,以及时间区间,名字条件查询。 8.登陆和注册模块:关联了用户表,角色表,顾客表,员工表,供应商表 (1)注册时会选择需要注册的角色,供应商注册时会需要验证邮箱。 (2)任何角色注册时,都会进后台判断真实信息是否可以匹配,可以匹配才能注册。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值