JavaWeb项目一个众筹网站的开发后台用户菜单
Posted AI数据
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb项目一个众筹网站的开发后台用户菜单相关的知识,希望对你有一定的参考价值。
mvn命令不能运行:
jar-war-pom之间是可以直接写,优先找这个工程,而不是仓库的位置
pom-pom子父关系,需要去仓库中找,我们需要使用<relativePath>../project-parent/pom.xml</relativePath>
在当前的子pom中,指定一下父pom文件在哪里,就不会优先去仓库中找
<parent> <groupId>com.atguigu.project</groupId> <artifactId>project-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../project-parent/pom.xml</relativePath> </parent>
登陆以后来到控制台,需要显示所有菜单
菜单都存在数据库中
t_permission表下添加菜单相关内容
菜单可能会有子菜单
TPermission中添加
private List<TPermission> childs; public List<TPermission> getChilds() { return childs; } public void setChilds(List<TPermission> childs) { this.childs = childs; }
web层controlller中
登录成功后要获取菜单
DispatcherController负责页面调度
在进入main页面时,要获取所有菜单
并整理好父子菜单关系
省略了导包
package com.atguigu.scw.manager.controller;
@Controller public class DispatcherController { @Autowired TPermissionService ps; // 伪静态化效果 @RequestMapping(value = "/main.html") public String toMainPage(HttpSession session) { // 校验,只有登陆的用户才可以到main // 判断session中是否有这个用户,如果没有去登录页面 Object object = session.getAttribute(Constants.LOGIN_USER); if (object == null) { // 用户没登陆 return "redirect:/login.jsp"; } else { // 用户登陆来到main页面 // session中没有菜单,或菜单被从session中清除 if (session.getAttribute(Constants.USER_MENUS) == null) { // 1.先查出所有菜单,在页面进行显示 List<TPermission> menus = ps.getAllMenus(); // 2.将查到的菜单放在请求域中/session域中 // 菜单这些数据没必要每次来到main都调用service方法进行查询, // 放在session用户,当前用户的这次会话会一直使用 // 只需要去数据库中查一次 session.setAttribute(Constants.USER_MENUS, menus); } return "manager/main"; } } }
新定义了常量USER_MENUS
package com.atguigu.scw.manager.constant; public class Constants { public static final String LOGIN_USER = "loginUser"; public static final String USER_MENUS = "userMenus"; }
因此需要service层中增加
TPermission接口和实现类
package com.atguigu.scw.manager.service; import java.util.List; import com.atguigu.scw.manager.bean.TPermission; public interface TPermissionService { // 拿到所有菜单 public List<TPermission> getAllMenus(); }
实现类
有
package com.atguigu.scw.manager.service.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.atguigu.scw.manager.bean.TPermission; import com.atguigu.scw.manager.dao.TPermissionMapper; import com.atguigu.scw.manager.service.TPermissionService; @Service public class TPermissionServiceImpl implements TPermissionService { @Autowired TPermissionMapper mapper; public List<TPermission> getAllMenus() { // 父菜单保存 List<TPermission> menus = new ArrayList<TPermission>(); Map<Integer, TPermission> map = new HashMap<Integer, TPermission>(); // 这是所有菜单:18个菜单 List<TPermission> list = mapper.selectByExample(null); // 递归结束条件,一定得有一个跳出条件 // 无限级菜单:递归方法 // public void buildMenus(List<Permission> list){} // for(permission p: list){ // if(hasChilds()){ // // 拿到当前的子菜单 // List childs = getCurrentsChilds(p); // buildMenus(List<Permission> list) // }else{ // // 添加到父菜单,只保存一个大的一级菜单 // //menus.add(menus); // // 加到上级菜单中 // addToParentMenus(p){ // //找到当前菜单的父菜单 // //p_menus = p.getPid // //当前菜单设置进去 // p_menus.addChilds(p); // } // } // } // 1.将所有菜单都放在map中 // 都是引用,如果从map中拿到这个数据改变以后,map中页面变化 for (TPermission tPermission : list) { map.put(tPermission.getId(), tPermission); } // 二级菜单? for (TPermission tPermission : list) { if (tPermission.getPid() == 0) { // 父菜单,确定4个父菜单 menus.add(tPermission); } else { // 子菜单 ,加入到父菜单中 // tPermission(子菜单),拿到父菜单 Integer pid = tPermission.getPid(); // 拿到父菜单:以pid的值作为map中的菜单id,就是父菜单 TPermission p_menu = map.get(pid); // 拿到当前父菜单的子菜单,子菜单会有一些问题 // 这个list第一次获取是没有的,如果添加一次以后,list是有的 List<TPermission> childs = p_menu.getChilds(); if (childs != null) { // 当前有子菜单 childs.add(tPermission); } else { // 当前没有子菜单 childs = new ArrayList(); // 添加当前子菜单 childs.add(tPermission); // 将当前整理好的childs设置进去 p_menu.setChilds(childs); } // // childs.add(tPermission); // p_menu.setChilds(childs); // for (TPermission p_m: list) { // if (p_m.getId() == pid) { // p_m.setChilds(childs); // } // } } } // 将菜单子父级关系整理好交给页面 // List<TPermission> // List[Tp1{childMenus},Tp2,Tp3,Tp4] // 整理父子关系,将子菜单设置到父菜单的private List<TPermission> childs里面 // 1.查出父菜单:不推荐 // List<4> parents = getParents(pid=0) // 2.遍历父菜单 // for(TPermission p:parents){ // //查出这个的子菜单List<7> childs = getChild(pid=p.id) // //p.setChilds(childs); // } // 采取的方法:一次性查出所有菜单,使用程序进行组合 return menus; } }
另一种写法
public class TPermissionServiceImpl implements TPermissionService { @Autowired public TPermissionMapper tPermissionMapper; public List<TPermission> getAllMenus() { // 获取所有菜单 List<TPermission> permissions = tPermissionMapper.selectByExample(null); // 顶级父菜单 List<TPermission> top = new ArrayList<TPermission>(); // 保存所有菜单到map中,是为了方便取父菜单,不保存到map中则需要自己编写遍历方法 Map<Integer, TPermission> menus = new HashMap<Integer, TPermission>(); // 填充map for (TPermission tp: permissions){ menus.put(tp.getId(), tp); } // 遍历,将子菜单放到父菜单的childs中去 for (TPermission tp: permissions){ // 如果是父菜单,加到top中去 if (tp.getPid() == 0){ top.add(tp); }else { // 不是菜单,就要找到其父菜单,并将自己加到父菜单childs列表中,这样遍历完后,所有的子菜单都会进入childs // 从map中获取父菜单 TPermission parent = menus.get(tp.getPid()); // 如果是空,说明还没添加任何子菜单,需要建立列表,然后添加子菜单 if (parent.getChilds() == null){ parent.setChilds(new ArrayList<TPermission>()); parent.getChilds().add(tp); }else { parent.getChilds().add(tp); } } } return top; } }
菜单处理的一种方式,从父菜单着手:
public class MenusTest { static List<TPermission> menusList = new ArrayList<TPermission>(); // 判断是否有子菜单 public static boolean hasParent(TPermission tPermission){ // 只要不等于0都有父菜单 if (tPermission.getPid() != 0){ return true; } return false; } // 获取父菜单,上面项目用的map public static TPermission getParent(TPermission tp){ for (TPermission t: menusList){ if (tp.getPid() == t.getId()){ return t; } } return null; } public static List<TPermission> getTopMenu(){ List<TPermission> top = new ArrayList<TPermission>(); for (TPermission t: menusList){ if (t.getPid() == 0){ top.add(t); } } return top; } // 获取无限极菜单 public static List<TPermission> buildMenus(){ // 遍历list for (TPermission tp: menusList){ // 如果有父菜单就加到父菜单的子菜单列表中 if (hasParent(tp)){ // 添加到父菜单的列表中 // 获取父菜单 TPermission parent = getParent(tp); if (parent.getChilds()== null){ parent.setChilds(new ArrayList<TPermission>()); parent.getChilds().add(tp); }else { parent.getChilds().add(tp); } } } // 获得顶级父菜单 return getTopMenu(); } public static void main(String[] args) { TPermission p1 =new TPermission(); p1.setId(1); p1.setName("学校管理"); p1.setPid(0); menusList.add(p1); TPermission p2 =new TPermission(); p2.setId(2); p2.setName("科目管理"); p2.setPid(0); menusList.add(p2); TPermission p3 =new TPermission(); p3.setId(3); p3.setName("文科"); p3.setPid(2); menusList.add(p3); TPermission p31 =new TPermission(); p31.setId(4); p31.setName("理科"); p31.setPid(2); menusList.add(p31); TPermission p311 =new TPermission(); p311.setId(5); p311.setName("物理"); p311.setPid(4); menusList.add(p311); TPermission p312 =new TPermission(); p312.setId(6); p312.setName("化学"); p312.setPid(4); menusList.add(p312); TPermission p4 =new TPermission(); p4.setId(7); p4.setName("班级管理"); p4.setPid(1); menusList.add(p4); TPermission p5 =new TPermission(); p5.setId(8); p5.setName("教师管理"); p5.setPid(1); menusList.add(p5); TPermission p41 =new TPermission(); p41.setId(9); p41.setName("一年二班"); p41.setPid(7); menusList.add(p41); TPermission p42 =new TPermission(); p42.setId(10); p42.setName("一年一班"); p42.setPid(7); menusList.add(p42); List<TPermission> menus = buildMenus(); for (TPermission menu: menus){ System.out.println(menu); } } }
开始处理jsp
需要对main.jsp中的菜单进行抽取
user_menus.jsp
<%@page import="com.atguigu.scw.manager.constant.Constants"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <div class="col-sm-3 col-md-2 sidebar"> <div class="tree"> <ul style="padding-left:0px;" class="list-group"> <li class="list-group-item tree-closed" > <a href="${ctp }/main.html"><i class="glyphicon glyphicon-dashboard"></i> 控制面板</a> </li> <!-- 遍历菜单 --> <c:forEach items="<%=session.getAttribute(Constants.USER_MENUS) %>" var="p_menu"> <li class="list-group-item tree-closed"> <span><i class="${p_menu.icon }"></i> ${p_menu.name } <span class="badge" style="float:right">${fn:length(p_menu.childs)}</span></span> <ul style="margin-top:10px;display:none;"> <c:forEach items="${p_menu.childs }" var="c_menu"> <li style="height:30px;"> <a href="${c_menu.url }"><i class="${c_menu.icon }"></i> ${c_menu.name }</a> </li> </c:forEach> </ul> </li> </c:forEach> </ul> </div> </div>
main.jsp中引入
<div class="container-fluid"> <div class="row"> <%@include file="/WEB-INF/includes/user_menu.jsp" %> <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"> <h1 class="page-header">控制面板</h1> <div class="row placeholders"> <div class="col-xs-6 col-sm-3 placeholder"> <img data-src="holder.js/200x200/auto/sky" class="img-responsive" alt="Generic placeholder thumbnail"> <h4>Label</h4> <span class="text-muted">Something else</span> </div> <div class="col-xs-6 col-sm-3 placeholder"> <img data-src="holder.js/200x200/auto/vine" class="img-responsive" alt="Generic placeholder thumbnail"> <h4>Label</h4> <span class="text-muted">Something else</span> </div> <div class="col-xs-6 col-sm-3 placeholder"> <img data-src="holder.js/200x200/auto/sky" class="img-responsive" alt="Generic placeholder thumbnail"> <h4>Label</h4> <span class="text-muted">Something else</span> </div> <div class="col-xs-6 col-sm-3 placeholder"> <img data-src="holder.js/200x200/auto/vine" class="img-responsive" alt="Generic placeholder thumbnail"> <h4>Label</h4> <span class="text-muted">Something else</span> </div> </div> </div> </div> </div>
运行
图标还需要处理一下,加到数据库中
以上是关于JavaWeb项目一个众筹网站的开发后台用户菜单的主要内容,如果未能解决你的问题,请参考以下文章
javaweb基于ssm框架快递代拿管理系统设计与实现(项目源码)
项目一众筹网06_03,给角色分配Auth/菜单或者说是权限回显checkbox建角色与菜单/权限关联关系表执行给角色分配菜单