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. jquery 实现复选框选择效果

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  2. 【leetcode】908. Smallest Range I

    题目如下: 解题思路:简单的不能再简单的题目了,对于任意一个A[i]来说,其可能的最小的最大值是A[i]-K,最大的最小值是A[i]+K.遍历数组,求出所有元素中最大的最小值和最小的最大值,两者之差( ...

  3. websocket 中使用Service层的方法

    创建公共Utils 类 ApplicationContextRegister @Component @Lazy(false) public class ApplicationContextRegist ...

  4. Python基础教程(001)--前言

    前言 人生苦短,我用Python. Python的作者,Guido von Rossum,确实是荷兰人.1982年,Guido从阿姆斯特丹大学(University of Amsterdam)获得了数 ...

  5. Java的传值调用

    (本文非引战或diss,只是说出自己的理解,欢迎摆正心态观看或探讨) 引子 之所以写这篇文章是因为前些天写了一篇<Java中真的只有值传递么?>探讨了网上关于Java只有值传递的说法,当时 ...

  6. js判断是否安装app,安装打开app

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. ABP的新旧版本

    新版本 https://abp.io/documents/abp/latest/Index https://github.com/abpframework/abp ABP is an open sou ...

  8. AVL树,C语言实现,完整代码,先贴上,讲解稍后

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #de ...

  9. 【Java多线程系列八】volatile和ThreadLocal

    1. volatile final class Singleton { private static Singleton instance = null; private Singleton() { ...

  10. js事件处理程序详解,html事件处理程序,dom0级事件处理程序,dom2级事件处理程序

    博客搬迁,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/11/24/js%e4%ba%8b%e4%bb%b6%e5%a4%84%e7%90%86%e ...