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

菜单可能会有子菜单
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项目】一个众筹网站的开发(七)后台用户菜单的更多相关文章
- 【JavaWeb项目】一个众筹网站的开发(八)后台页面详细设置
一.user.jsp改造 删除引入菜单 抽取导航栏 nav-bar.jsp,删除引入导航栏 删除引入main.jsp的到好烂 数据库里添加url 报错,url不对 没有/ url正确 action=& ...
- 【JavaWeb项目】一个众筹网站的开发(五)后台用户登录功能
用户模块 1)注册 表单校验,使用校验插件 用户密码需要加密存储 注册成功后来到管理控制台,将用户放在session中,防止以后获取 以后用户经常获取用户id,使用mabatis主键自增策略,保存用户 ...
- 【JavaWeb项目】一个众筹网站的开发(四)后台用户注册功能
重点: 密码加密存储 使用jQuery插件做校验和错误提示等 密码不能明文存储,在数据库中是加密存储的 可逆加密:通过密文使用解密算法得到明文 DES AES 不可逆加密:通过密文,得不到明文 MD5 ...
- 【JavaWeb项目】一个众筹网站的开发(一)架构搭建
本项目是@尚硅谷相关视频的记录. 本项目使用Maven构建,工程架构如下图所示: 一.公司的公共父工程和工具类包 1.父工程 每个公司都有自己的父工程 父工程作用:对公司使用的jar包进行统一管理,别 ...
- 【JavaWeb项目】一个众筹网站的开发(九)邮件开发
Java官方支持邮件开发,Javax-mail jdk中默认没有,需要另外下载 apache的基于Javax-mail开发了commons-mail,更加简单高效,推荐使用 一.电子邮件接收和发送协议 ...
- 【JavaWeb项目】一个众筹网站的开发(六)后台用户权限控制
登陆成功进入控制面板后 左侧的菜单是共同的元素,抽取出来做静态包含 要求必须是按照不同的用户得到不同的菜单 用户做了权限限制,哪个用户能操作哪些内容(链接.按钮.内容) 一.RBAC权限模型 权限管理 ...
- 【JavaWeb项目】一个众筹网站的开发(三)第一个网页
一.bootstrap 本项目采用bootstrap3 bootstrap中文网 https://www.bootcss.com/ 使用bootstrap三步: 1.导入jQuery 2.导入boot ...
- 【JavaWeb项目】一个众筹网站的开发(二)架构搭建之架构测试
1.dao层和pojo都是使用mbg生成,基本的CRUD以及JavaBean 2.将mbg放在dao层,一旦dao层打包以后mbg就删除掉 一.创建数据库用于测试 数据库名称:scw_0325 SQL ...
- JavaWeb项目:旅游网站【涉及各种知识】
JQuery异步请求(ajax) $.ajax({ // 请求方式为get或者post等 type: "GET", // 服务器响应的数据类型 dataType: "js ...
随机推荐
- 77th ploty 制图神器
https://blog.csdn.net/u012897374/article/details/77857980
- DB2数据库常用的函数总结
CONCAT>>-CONCAT-------(--expression1--,--expression2--)--------------><功能:将两个字符串连接起来,如果两 ...
- 搭建ELK和EFK
公司突然发下任务让我搭建elk和efk,于是做完之后写入了博客,生产环境下,亲测可用哦 搭建ELK 一共两台服务器,一个节点(logstash) 主服务器上 修改最大链接和最大打开的文件 1.临时修改 ...
- mysql 查询表的最大时间 的数据
SELECT * from (SELECT MAX(a.update_date) as q ,a.monitoring_point_id from biz_monitoring_point_recor ...
- UNP学习第三章
一.主机字节序和网络字节序 转换时用到下列四个函数: #include <netinet/in.h> uint16_t htons(uint16_t host16bitvalue); ui ...
- 3D打印切片软件Cura及CuraEngine原理分析
引言 年初开始进入3D打印行业,受命以Cura为基础,研发一款自主的3D打印切片软件. 自主研发要取其长处,补其不足,首先自然是要搞清楚Cura到底做了什么,读Cura的代码是必需的.我一向都觉得比起 ...
- JavaScript 工作原理之十一-渲染引擎及性能优化小技巧
原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第十一章. 迄 ...
- 2018-2019-2 20175223 实验三《敏捷开发与XP实践》实验报告
目录 北京电子科技学院(BESTI)实验报告 实验名称:实验三 敏捷开发与XP实践 实验内容.步骤与体会: 一.实验三 敏捷开发与XP实践-1 二.实验三 敏捷开发与XP实践-2 三.实验三 敏捷开发 ...
- IE8 indexOf
因为ie8中的js数组没有indexOf方法,所以使用之前要先加入这段js代码 if (!Array.prototype.indexOf) { Array.prototype.indexOf = fu ...
- hci_ceph安装过程
auto loiface lo inet loopbackauto enp50s0f0iface enp50s0f0 inet static address 192.168.1.6 netmask 2 ...