package com.java1234.repository;

import com.java1234.entity.Menu;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

/**
 * 菜单=Repository接口
 */
public interface MenuRepository extends JpaRepository<Menu,Integer> {

    /**
     * 根据父节点以及用户角色id查询子节点
     * @param parentId
     * @param roleId
     * @return
     */
    @Query(value = "SELECT * FROM t_menu WHERE p_id=?1 AND id IN (SELECT menu_id FROM t_role_menu WHERE role_id=?2)",nativeQuery = true)
    public List<Menu> findByParentIdAndRoleId(int parentId,int roleId);
}

package com.java1234.service;

import com.java1234.entity.Menu;

import java.util.List;

/**
 * 权限菜单Service接口
 */
public interface MenuService {

    /**
     * 根据父节点以及用户角色id查询子节点
     * @param parentId
     * @param roleId
     * @return
     */
    public List<Menu> findByParentIdAndRoleId(int parentId, int roleId);
}

package com.java1234.service.impl;

import com.java1234.entity.Menu;
import com.java1234.repository.MenuRepository;
import com.java1234.service.MenuService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * 权限菜单Service实现类
 */
@Service("menuService")
public class MenuServiceImpl implements MenuService {

    @Resource
    private MenuRepository menuRepository;

    @Override
    public List<Menu> findByParentIdAndRoleId(int parentId, int roleId) {
        return menuRepository.findByParentIdAndRoleId(parentId,roleId);
    }
}

package com.java1234.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.java1234.entity.Menu;
import com.java1234.service.MenuService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.java1234.entity.Role;
import com.java1234.entity.User;
import com.java1234.service.RoleService;
import com.java1234.service.UserService;
import com.java1234.util.StringUtil;

/**
 * 用户Controller
 * @author Administrator
 *
 */
@Controller
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserService userService;

    @Resource
    private RoleService roleService;


    @Resource
    private MenuService menuService;

    /**
     * 用户登录判断
     * @param imageCode
     * @param user
     * @param bindingResult
     * @param session
     * @return
     */
    @ResponseBody
    @RequestMapping("/login")
    public Map<String,Object> login(String imageCode,@Valid User user,BindingResult bindingResult,HttpSession session){
        Map<String,Object> map=new HashMap<String,Object>();
        if(StringUtil.isEmpty(imageCode)){
            map.put("success", false);
            map.put("errorInfo", "请输入验证码!");
            return map;
        }
        if(!session.getAttribute("checkcode").equals(imageCode)){
            map.put("success", false);
            map.put("errorInfo", "验证码输入错误!");
            return map;
        }
        if(bindingResult.hasErrors()){
            map.put("success", false);
            map.put("errorInfo", bindingResult.getFieldError().getDefaultMessage());
            return map;
        }
        Subject subject=SecurityUtils.getSubject();
        UsernamePasswordToken token=new UsernamePasswordToken(user.getUserName(), user.getPassword());
        try{
            subject.login(token);
            String userName=(String) SecurityUtils.getSubject().getPrincipal();
            User currentUser=userService.findByUserName(userName);
            session.setAttribute("currentUser", currentUser);
            List<Role> roleList=roleService.findByUserId(currentUser.getId());
            map.put("roleList", roleList);
            map.put("roleSize", roleList.size());
            map.put("success", true);
            return map;
        }catch(Exception e){
            e.printStackTrace();
            map.put("success", false);
            map.put("errorInfo", "用户名或者密码错误!");
            return map;
        }
    }

    /**
     * 保存角色信息
     * @param roleId
     * @param session
     * @return
     * @throws Exception
     */
    @ResponseBody
    @RequestMapping("/saveRole")
    public Map<String,Object> saveRole(Integer roleId,HttpSession session)throws Exception{
        Map<String,Object> map=new HashMap<String,Object>();
        Role currentRole=roleService.findById(roleId);
        session.setAttribute("currentRole", currentRole);
        map.put("success", true);
        return map;
    }

    /**
     * 加载当前用户信息
     * @param session
     * @return
     * @throws Exception
     */
    @ResponseBody
    @GetMapping("/loadUserInfo")
    public String loadUserInfo(HttpSession session)throws Exception{
        User currentUser=(User) session.getAttribute("currentUser");
        Role currentRole=(Role) session.getAttribute("currentRole");
        return "欢迎您:"+currentUser.getTrueName()+"&nbsp;[&nbsp;"+currentRole.getName()+"&nbsp;]";
    }


    /**
     * 加载权限菜单
     * @param session
     * @param parentId
     * @return
     * @throws Exception
     */
    @ResponseBody
    @PostMapping("/loadMenuInfo")
    public String loadMenuInfo(HttpSession session,Integer parentId)throws Exception{
        Role currentRole=(Role) session.getAttribute("currentRole");
        return getAllMenuByParentId(parentId,currentRole.getId()).toString();
    }

    /**
     * 获取所有菜单信息
     * @param parentId
     * @param roleId
     * @return
     */
    public JsonArray getAllMenuByParentId(Integer parentId,Integer roleId){
        JsonArray jsonArray=this.getMenuByParentId(parentId, roleId);
        for(int i=0;i<jsonArray.size();i++){
            JsonObject jsonObject=(JsonObject) jsonArray.get(i);
            if("open".equals(jsonObject.get("state").getAsString())){
                continue;
            }else{
                jsonObject.add("children", getAllMenuByParentId(jsonObject.get("id").getAsInt(), roleId));
            }
        }
        return jsonArray;
    }

    /**
     * 根据父节点和用户角色Id查询菜单
     * @param parentId
     * @param roleId
     * @return
     */
    public JsonArray getMenuByParentId(Integer parentId,Integer roleId){
        List<Menu> menuList=menuService.findByParentIdAndRoleId(parentId, roleId);
        JsonArray jsonArray=new JsonArray();
        for(Menu menu:menuList){
            JsonObject jsonObject=new JsonObject();
            jsonObject.addProperty("id", menu.getId()); // 节点Id
            jsonObject.addProperty("text", menu.getName()); // 节点名称
            if(menu.getState()==1){
                jsonObject.addProperty("state", "closed"); // 根节点
            }else{
                jsonObject.addProperty("state", "open"); // 叶子节点
            }
            jsonObject.addProperty("iconCls", menu.getIcon()); // 节点图标
            JsonObject attributeObject=new JsonObject(); // 扩展属性
            attributeObject.addProperty("url", menu.getUrl()); // 菜单请求地址
            jsonObject.add("attributes", attributeObject);
            jsonArray.add(jsonObject);
        }
        return jsonArray;
    }
}

SpringBoot打造企业级进销存储系统 第五讲-LMLPHP

$("#tree").tree({
			lines:true,
			url:'/user/loadMenuInfo?parentId=-1',
			onLoadSuccess:function(){
				$("#tree").tree("expandAll");
			}
		});
    <ul id="tree" class="easyui-tree" style="padding: 10px"></ul>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>后台管理-进销存管理系统</title>
    <link rel="stylesheet" type="text/css" href="/static/jquery-easyui-1.3.3/themes/default/easyui.css"></link>
    <link rel="stylesheet" type="text/css" href="/static/jquery-easyui-1.3.3/themes/icon.css"></link>
    <style type="text/css">

        .clock {
            float:right;
            width: 300px;
            height: 30px;
            padding-left: 20px;
            color: rgb(0, 76, 126);
            background: url(/static/images/clock.gif) no-repeat;
            font-size: 14px;
        }

        .userInfo{
            float:left;
            padding-left: 20px;
            padding-top: 30px;
        }

    </style>
    <script type="text/javascript" src="/static/jquery-easyui-1.3.3/jquery.min.js"></script>
    <script type="text/javascript" src="/static/jquery-easyui-1.3.3/jquery.easyui.min.js"></script>
    <script type="text/javascript" src="/static/jquery-easyui-1.3.3/locale/easyui-lang-zh_CN.js"></script>
    <script type="text/javascript">

        function showTime(){
            var date = new Date();
            this.year = date.getFullYear();
            this.month = date.getMonth() + 1;
            this.date = date.getDate();
            this.day = new Array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六")[date.getDay()];
            this.hour = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
            this.minute = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
            this.second = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();

            $("#clock").text("现在是:" + this.year + "年" + this.month + "月" + this.date + "日 " + this.hour + ":" + this.minute + ":" + this.second + " " + this.day);
        }

        $(document).ready(function() {

            window.setInterval("showTime()",1000);

            $("#userInfo").load("/user/loadUserInfo"); // 加载用户信息

            $("#tree").tree({
                lines:true,
                url:'/user/loadMenuInfo?parentId=-1',
                onLoadSuccess:function(){
                    $("#tree").tree("expandAll");
                }
            });
        });

    </script>
</head>
<body class="easyui-layout">
<div region="north" style="height: 72px;">
    <table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0">
        <tr>
            <td width="381px" style="background:url(/static/images/top_left.jpg)">
            </td>
            <td style="background:url(/static/images/top_center.jpg)">
                <div id="userInfo" class="userInfo"></div>
            </td>
            <td valign="bottom" width="544px" style="background:url(/static/images/top_right.jpg)">
                <div id="clock" class="clock"></div>
            </td>
        </tr>
    </table>
</div>

<div region="center">
</div>

<div region="west" style="width: 200px" title="导航菜单" split="true" iconCls="icon-navigation">
    <ul id="tree" class="easyui-tree" style="padding: 10px"></ul>

</div>

<div region="south" style="height: 30px;padding: 5px" align="center">
    Copyright © 2012-2017 南通小锋网络科技有限公司  版权所有
</div>

</body>
</html>
03-17 09:08