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表下添加菜单相关内容

菜单可能会有子菜单

TPermissionMapper中添加

    private List<TPermission> childs;

    public List<TPermission> getChilds() {
return childs;
} public void setChilds(List<TPermission> childs) {
this.childs = childs;
}

web层controlller中

登录成功后要获取菜单

DispatcherController负责页面调度

省略了导包

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;
} }

开始处理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项目】一个众筹网站的开发(七)后台用户菜单的更多相关文章

  1. 【JavaWeb项目】一个众筹网站的开发(八)后台页面详细设置

    一.user.jsp改造 删除引入菜单 抽取导航栏 nav-bar.jsp,删除引入导航栏 删除引入main.jsp的到好烂 数据库里添加url 报错,url不对 没有/ url正确 action=& ...

  2. 【JavaWeb项目】一个众筹网站的开发(五)后台用户登录功能

    用户模块 1)注册 表单校验,使用校验插件 用户密码需要加密存储 注册成功后来到管理控制台,将用户放在session中,防止以后获取 以后用户经常获取用户id,使用mabatis主键自增策略,保存用户 ...

  3. 【JavaWeb项目】一个众筹网站的开发(四)后台用户注册功能

    重点: 密码加密存储 使用jQuery插件做校验和错误提示等 密码不能明文存储,在数据库中是加密存储的 可逆加密:通过密文使用解密算法得到明文 DES AES 不可逆加密:通过密文,得不到明文 MD5 ...

  4. 【JavaWeb项目】一个众筹网站的开发(一)架构搭建

    本项目是@尚硅谷相关视频的记录. 本项目使用Maven构建,工程架构如下图所示: 一.公司的公共父工程和工具类包 1.父工程 每个公司都有自己的父工程 父工程作用:对公司使用的jar包进行统一管理,别 ...

  5. 【JavaWeb项目】一个众筹网站的开发(九)邮件开发

    Java官方支持邮件开发,Javax-mail jdk中默认没有,需要另外下载 apache的基于Javax-mail开发了commons-mail,更加简单高效,推荐使用 一.电子邮件接收和发送协议 ...

  6. 【JavaWeb项目】一个众筹网站的开发(六)后台用户权限控制

    登陆成功进入控制面板后 左侧的菜单是共同的元素,抽取出来做静态包含 要求必须是按照不同的用户得到不同的菜单 用户做了权限限制,哪个用户能操作哪些内容(链接.按钮.内容) 一.RBAC权限模型 权限管理 ...

  7. 【JavaWeb项目】一个众筹网站的开发(三)第一个网页

    一.bootstrap 本项目采用bootstrap3 bootstrap中文网 https://www.bootcss.com/ 使用bootstrap三步: 1.导入jQuery 2.导入boot ...

  8. 【JavaWeb项目】一个众筹网站的开发(二)架构搭建之架构测试

    1.dao层和pojo都是使用mbg生成,基本的CRUD以及JavaBean 2.将mbg放在dao层,一旦dao层打包以后mbg就删除掉 一.创建数据库用于测试 数据库名称:scw_0325 SQL ...

  9. JavaWeb项目:旅游网站【涉及各种知识】

    JQuery异步请求(ajax) $.ajax({ // 请求方式为get或者post等 type: "GET", // 服务器响应的数据类型 dataType: "js ...

随机推荐

  1. webpack学习(一)起步安装

    起步   webpack 用于编译 JavaScript 模块.一旦完成安装,你就可以通过 webpack 的 CLI 或 API 与其配合交互.如果你还不熟悉 webpack,请阅读核心概念和打包器 ...

  2. vue框架中什么是MVVM

    前端页面中使用MVVM的思想,即MVVM是整个视图层view的概念,属于视图层的概念. MVVM是前端视图层的分层开发思想,将页面分成了Model, View,和VM:其中VM是核心,因为VM是V和M ...

  3. Python3.5-20190508-廖老师-自我笔记-迭代器

    可以实现for ...in 的都可以称为,可迭代对象,Iterable 可以使用isinstance(是什么实例嘛)来判断是不是可迭代对象 可以被next()函数调用并不断返回下一个值的对象称为迭代器 ...

  4. Windows7有“系统保留”分区时,安装系统要注意的两点

    1.手动格式化“系统保留”分区 2.格式化完成之后,安装系统到第二个分区,不能安装到“系统保留”分区 具体看图: 本文章转载于辰羿的博客,如有侵权请联系本论坛维护者删除.

  5. OpenLayers学习笔记(十二)— 飞机速度矢量线预测(二)

    根据计算公式实现预测线 作者:狐狸家的鱼 GitHub:八至 之前有一篇博客简单写了一个模拟demo,根据物体当前的速度和方向预测多少时间后所在的位置,具体计算是参考<(译)计算距离.方位以及更 ...

  6. 2019 牛客暑期多校 第一场 H XOR (线性基)

    题目:https://ac.nowcoder.com/acm/contest/881/H 题意:求一个集合内所有子集异或和为0的长度之和 思路:首先集合内异或和,这是线性基的一个明显标志,然后我们不管 ...

  7. 根据一个经纬度坐标获取周边最近经纬。Java实现

    1.需求:指定一个经纬度坐标,如:(31.2121751783,121.4411213954).周围有一堆经纬度坐标,找出与它最近的那个. 2.实现思路:将给出经纬度看成原点(0,0).周围经纬度定位 ...

  8. UML的类型

    分类 UML从考虑系统的不同角度出发,定义了用例图.类图.对象图.包图.状态图.活动图.序列图.协作图.构件图.部署图等10种图. 常见的UML图有用例图(Use Case Diagram).类图(C ...

  9. MySQL 存储过程-definer和invoker的解释

    [definer和invoker的解释] 创建存储过程的时候可以指定 SQL SECURITY属性,设置为 DEFINER 或者INVOKER,用来奉告mysql在执行存储过程的时候,,是以DEFIN ...

  10. Excel2016怎么批量删除空白行 如何删除空白行

    我们在编辑Excel文档的时候,如果表格中有大量的空白行,这时我们怎么样把它们批量删除呢?下面我们就一起来看看操作的方法吧.   工具/原料   Excel2016 方法/步骤     首先在电脑上打 ...