【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 ...
随机推荐
- java命令-jstack
jstack用于生产java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一条线程正在执行的方法 堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,比如线程间死锁.死循环. ...
- CF 1045 H. Self-exploration 解题报告
CF 1045 H. Self-exploration 考虑到串的结构一定是 1...0....1....0.....1... 这样的,而\(01\)与\(10\)在转折点交替出现 首先串长一定是\( ...
- 【LeetCode 33】搜索旋转排序数组
题目链接 [题解] 会发现旋转之后,假设旋转点是i 则0..i-1是递增有序的.然后i..len-1也是递增有序的. 且nums[i..len-1]<nums[0]. 而nums[1..i-1] ...
- Tomcat内存问题解决办法
使用Java程序从数据库中查询大量的数据时出现异常:java.lang.OutOfMemoryError: Java heap space 在JVM中如果98%的时间是用于GC且可用的 Heap si ...
- CF 1150 D Three Religions——序列自动机优化DP
题目:http://codeforces.com/contest/1150/problem/D 老是想着枚举当前在给定字符串的哪个位置,以此来转移. 所以想对三个串分别建 trie 树,然后求出三个t ...
- linux基础知识汇总(二)-vi/vim
转:http://blog.csdn.net/sky04/article/details/5662582 vi与vim一样都是编辑器,不同的是vim更高级一些,可以理解是vi的高级版本.vi就像Win ...
- (2)C++基本类型
一.整形 short .int. long. long long sizeof查看类型所占的字节数 cout << sizeof(short)<<endl;//2 字节 cou ...
- Rust <3>:控制流
if.loop.for.while: fn main() { if 3 > 4 { println!{">"}; } else { println!{"< ...
- layui 下拉框 动态获取数据
$(function(){var grade=$("#grade");grade.append("一年级"); //添加下拉列表grade.append(&qu ...
- linux命令du
du log2012.log 查看文件大小 du -sh * 当前目录所有文件的大小 du|sort -nr|more 按照空间大小排序 du -c log30.tar.gz log31.tar. ...