前言:
上一章 “SpringBoot 项目(若依脚手架)4”的最后登录完成后,重定向到 /index 首页报 404 ,本章就是解决 登录系统后显示首页内容。
目录
一、简单处理404错误
即登录成功后,跳转到 /index 页面,/index页面中显示 ”欢迎来到首页!!!“ 字样
1)创建 SysIndexController 类,处理 /index 请求
package com.ruoyi.web.controller.system;
import com.ruoyi.common.core.controller.BaseController;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
/**
* @author liangcy
* @create 2019/10/8 - 18:35
*/
@Controller
public class SysIndexController extends BaseController {
@GetMapping("/index")
public String index(ModelMap mmap){
return "/index";
}
}
2)创建 template/index.html 文件,内容如下:
欢迎来到首页!!!
3)启动项目,登录测试
首先访问首页地址:http://localhost:8080/index ,
由于没有登录,被shiro拦截请求,重定向地址到 http://localhost:8080/login
正确输入用户名 、密码和 验证码后,重定向到 首页,结果如图:
二、提前展示本章节完成后的效果
三、编写Controller 层代码
分析:登录成功后,页面重定向到 /index,因此编写 SysIndexController 类处理, /index 请求。
在 SysIndexController 类中,我们需要将当前登录 user 对象、user所拥有的菜单对象放入 map中传入前端页面,代码如下:
package com.ruoyi.web.controller.system;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.system.domain.SysMenu;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysMenuService;
import org.apache.shiro.SecurityUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import javax.annotation.Resource;
import java.util.List;
/**
* @author liangcy
* @create 2019/10/8 - 18:35
*/
@Controller
public class SysIndexController extends BaseController {
@Resource
private ISysMenuService menuService;
@GetMapping("/index")
public String index(ModelMap mmap){
//获取身份信息
SysUser user = (SysUser)SecurityUtils.getSubject().getPrincipal();;
//根据用户id取出菜单
List<SysMenu> menus = menuService.selectMenusByUser(user);
mmap.put("menus", menus);
mmap.put("user", user);
return "/index";
}
}
四、编写model 层
创建 SysMenu 类
package com.ruoyi.system.domain;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 菜单权限表 sys_menu
* @author liangcy
* @create 2019/10/14 - 21:41
*/
@Data
public class SysMenu extends BaseEntity {
//菜单ID
private Long menuId;
//菜单名称
private String menuName;
//父菜单名称
private String parentName;
//父菜单ID
private Long parentId;
//显示顺序
private String orderNum;
//菜单URL
private String url;
//打开方式: menuItem页签 menuBlank新窗口
private String target;
//类型:0目录,1菜单,2按钮
private String menuType;
//菜单状态:0显示,1隐藏
private String visible;
//权限字符串
private String perms;
//菜单图标
private String icon;
//子菜单
private List<SysMenu> children = new ArrayList<>();
}
补充:上述代码中的 List 集合属性,需要new ArrayList() ,这样可以避免以后用到这个对象的时候出现空指针异常
五、编写Service 层
编写 ISysMenuService 接口
package com.ruoyi.system.service;
import com.ruoyi.system.domain.SysMenu;
import com.ruoyi.system.domain.SysUser;
import java.util.List;
/**
* @author liangcy
* @create 2019/10/14 - 21:50
*/
public interface ISysMenuService {
/**
* 根据用户ID查询菜单
* @param user 用户信息
* @return 菜单列表
*/
public List<SysMenu> selectMenusByUser(SysUser user);
}
编写 ISysMenuService 接口实现类 SysMenuServiceImpl
SysMenuServiceImpl 中主要是 selectMenusByUser 方法获取当前用户对于的菜单列表,而 getChildPerms、recursionFn、getChildList、hasChild 四个方法主要是用来构建菜单的树模型(也就是递归获取当前用户所有的子菜单)
package com.ruoyi.system.service.impl;
import com.ruoyi.system.domain.SysMenu;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.mapper.SysMenuMapper;
import com.ruoyi.system.service.ISysMenuService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
/**
* @author liangcy
* @create 2019/10/14 - 21:52
*/
@Service
public class SysMenuServiceImpl implements ISysMenuService {
@Resource
private SysMenuMapper menuMapper;
@Override
public List<SysMenu> selectMenusByUser(SysUser user) {
List<SysMenu> menus = new LinkedList<>();
//管理员显示所有菜单
if (user.isAdmin()) {
menus = menuMapper.selectMenuNormalAll();
} else {
menus = menuMapper.selectMenusByUserId(user.getUserId());
}
return getChildPerms(menus, 0);
}
/**
* 根据父节点的ID获取所有子节点
*
* @param list 分类表
* @param parentId 传入的父节点ID
* @return String
*/
public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId) {
List<SysMenu> returnList = new ArrayList<>();
for (SysMenu menu : list) {
if (menu.getParentId() == parentId) {
recursionFn(list, menu);
returnList.add(menu);
}
}
return returnList;
}
/**
* 递归列表
*
* @param list
* @param t
*/
private void recursionFn(List<SysMenu> list, SysMenu t) {
// 得到子节点列表
List<SysMenu> childList = getChildList(list, t);
t.setChildren(childList);
for (SysMenu tChild : childList) {
if (hasChild(list, tChild)) {
// 判断是否有子节点
Iterator<SysMenu> it = childList.iterator();
while (it.hasNext()) {
SysMenu n = (SysMenu) it.next();
recursionFn(list, n);
}
}
}
}
/**
* 得到子节点列表
*/
private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t) {
List<SysMenu> tlist = new ArrayList<SysMenu>();
Iterator<SysMenu> it = list.iterator();
while (it.hasNext()) {
SysMenu n = (SysMenu) it.next();
if (n.getParentId().longValue() == t.getMenuId().longValue()) {
tlist.add(n);
}
}
return tlist;
}
/**
* 判断是否有子节点
*/
private boolean hasChild(List<SysMenu> list, SysMenu t) {
return getChildList(list, t).size() > 0 ? true : false;
}
}
因很多地方都需要判断 当前用户是否是 admin 所以在 SysUser 类加上 isAdmin 方法来判断
public boolean isAdmin(){
return isAdmin(