//查询出所有的菜单
Menu root = menuDao.get(“0”);
Tree t1 = null;
Tree t2 = null;
//一级菜单
for(Menu m:root.getMenus()) {
t1 = new Tree();
t1.setId(m.getMenuid());
t1.setText(m.getMenuname());
//二级菜单
for(Menu m2 : m.getMenus()) {
t2 = new Tree();
t2.setId(m2.getMenuid());
t2.setText(m2.getMenuname());
//如果角色下包含有这个权限菜单,让其勾选
if(roleMenus.contains(m2)) {
t2.setChecked(true);
}
t1.getChildren().add(t2);
}
treeList.add(t1);
}
2)修改RoleAction
/*
- 获取角色菜单权限
*/
public void readRoleMenus() {
List menus = roleBiz.readRoleMenus(getId());
write(JSON.toJSONString(menus));
}
3)修改roleMenuSet.js
$(function(){
$(‘#tree’).tree({
url:‘role_readRoleMenus?id=1’,
animate:true,
checkbox:true
})
});
再次访问
03、级联显示角色菜单
1)修改roleMenuSet.html
href=“ui/themes/default/easyui.css”>
2)修改roleMenuSet.js
$(function(){
$(‘#tree’).tree({
animate:true,
checkbox:true
})
$(‘#grid’).datagrid({
url:‘role_list’,
columns:[[
{field:‘uuid’,title:‘编号’,width:‘100’},
{field:‘name’,title:‘名称’,width:‘100’}
]],
singleSelect:true,
onClickRow:function(rowIndex,rowData){
$(‘#tree’).tree({
url:‘role_readRoleMenus?id=’+rowData.uuid,
animate:true,
checkbox:true
})
}
})
});
04、角色菜单提交保存
1)修改IRoleBiz和RoleBiz
IRoleBiz
package com.itzheng.erp.biz;
import java.util.List;
import com.itzheng.erp.entity.Role;
import com.itzheng.erp.entity.Tree;
/**
-
角色业务逻辑层接口
-
@author Administrator
*/
public interface IRoleBiz extends IBaseBiz{
//获取角色菜单权限
//uuid 角色编号
List readRoleMenus(Long uuid);
/*
-
更新角色权限
-
uuid角色编号
-
checkedStr 勾选中的菜单ID字符串,以逗号分隔
*/
public void updateRoleMenus(Long uuid,String checkedStr);
}
RoleBiz
/*
-
更新角色权限
-
uuid角色编号
-
checkedStr 勾选中的菜单ID字符串,以逗号分隔
*/
public void updateRoleMenus(Long uuid,String checkedStr) {
//得到角色信息,进入持久化状态,后的对对象的操作都会保存到数据库当中
Role role = roleDao.get(uuid);
//清除角色下的菜单权限(delete from role_menu where roleuuid=?)
role.setMenus(new ArrayList
String[] ids = checkedStr.split(“,”);
Menu menu = null;
for (String id : ids) {
menu = menuDao.get(id);
//保存角色下的菜单权限:insert into role_menu
role.getMenus().add(menu);
}
}
2)修改RoleAction
private String checkedStr;//勾选中的菜单ID字符串,以逗号分隔
public String getCheckedStr() {
return checkedStr;
}
public void setCheckedStr(String checkedStr) {
this.checkedStr = checkedStr;
}
/*
-
更新角色权限
-
uuid角色编号
-
checkedStr 勾选中的菜单ID字符串,以逗号分隔
*/
public void updateRoleMenus() {
try {
roleBiz.updateRoleMenus(getId(), checkedStr);
write(ajaxReturn(true, “更新成功”));
} catch (Exception e) {
write(ajaxReturn(false, “更新失败”));
// TODO: handle exception
e.printStackTrace();
}
}
3)roleMenuSet.html
href=“ui/themes/default/easyui.css”>
保存
3)roleMenuSet.js
$(‘#btnSave’).bind(‘click’,function(){
var nodes = $(‘#tree’).tree(‘getChecked’);
var ids = new Array();
$.each(nodes,function(i, node){
ids.push(node.id);
});
//[1,2,3,4] => “1,2,3,4”
var checkedStr = ids.join(‘,’);//把数组里的每个元都拼接上逗号
//构建提交数据
var formdata = {};
//id赋值
formdata.id= $(‘#grid’).datagrid(‘getSelected’).uuid;
//选中的菜单ID
formdata.checkedStr=checkedStr;
//alert(JSON.stringify(formdata));
$.ajax({
url: ‘role_updateRoleMenus’,
data:formdata,
type:‘post’,
dataType: ‘json’,
success:function(rtn){
$.messager.alert(‘提示’,rtn.message,‘info’);
}
});
});
4、用户角色设置
(1)需求分析
一个用户可以指定多个角色,实现思路与角色权限设置相同
(2)代码实现
1)业务层实现
a、修改IEmpBiz和EmpBiz
IEmpBiz
EmpBiz
EmpBiz
// 获取用户角色权限
public List readEmpRoles(Long uuid) {
List treeList = new ArrayList();
//获取用户信息
Emp emp = empDao.get(uuid);
//获取用户下的角色列表
List empRoles = emp.getRoles();
//获取所有的角色列表
List rolesList = roleDao.getList(null, null, null);
Tree t1 = null;
for(Role role : rolesList) {
t1 = new Tree();
//转换为String类型
t1.setId(String.valueOf( role.getUuid()));
t1.setText(role.getName());
//判断其是否需要选中,用户是否拥有这个角色
if(empRoles.contains(role)) {
t1.setChecked(true);
}
treeList.add(t1);
}
return treeList;
}
// 更新用户角色
public void updateEmpRoles(Long uuid, String checkedStr) {
Emp emp = empDao.get(uuid);
//清空该用户下的所有角色
emp.setRoles(new ArrayList());
String[] ids = checkedStr.split(“,”);
Role role = null;
for (String id : ids) {
role = roleDao.get(Long.valueOf(id));
//设置用户的角色
emp.getRoles().add(role);
}
}
b、 修改applicationContext_biz.xml
2)修改EmpAction
3)用户角色的设置前端页面,创建empRolesSet.html,和empRolesSet.js
empRolesSet.html
href=“ui/themes/default/easyui.css”>
保存
empRolesSet.js
$(function(){
$(‘#tree’).tree({
animate:true,
checkbox:true
});
$(‘#grid’).datagrid({
url:‘emp_list’,
columns:[[
{field:‘uuid’,title:‘编号’,width:‘100’},
{field:‘name’,title:‘名称’,width:‘100’}
]],
singleSelect:true,
onClickRow:function(rowIndex,rowData){
$(‘#tree’).tree({
url:‘emp_readEmpRoles?id=’+rowData.uuid,
animate:true,
checkbox:true
});
}
});
$(‘#btnSave’).bind(‘click’,function(){
var nodes = $(‘#tree’).tree(‘getChecked’);
var ids = new Array();
$.each(nodes,function(i, node){
ids.push(node.id);
});
//[1,2,3,4] => “1,2,3,4”
var checkedStr = ids.join(‘,’);//把数组里的每个元素都拼接上逗号
//构建提交数据
var formdata = {};
//id赋值
formdata.id= $(‘#grid’).datagrid(‘getSelected’).uuid;
//选中角色ID
formdata.checkedStr=checkedStr;
//alert(JSON.stringify(formdata));
$.ajax({
url: ‘emp_upateEmpRoles’,
data:formdata,
type:‘post’,
dataType: ‘json’,
success:function(rtn){
$.messager.alert(‘提示’,rtn.message,‘info’);
}
});
});
});
4)测试访问:http://localhost:8080/erp/empRolesSet.html
5、显示权限菜单
(1)需要与实现思路
要求:用户登陆后只显示他拥有的菜单,多对多关联查询:
涉及到的实体类:
用户 角色 菜单
5个表的查询:
根据用户ID查询该用户所拥有的菜单,多对多关联查询:
用户(EMP) => 角色(ROLE)=> 菜单(MENU)
HQL:
select m from Emp e join e.roles r join r.menus m where e.uuid=?
(2)代码实现
根据用户编号查询菜单列表
1)修改IEmpDao和EmpDao创建getMenusByEmpuuid
IEmpDao
EmpDao
2)业务层
IEmpBiz
EmpBiz
@Override
public List
return empDao.getMenusByEmpuuid(uuid);
}
3)EmpAction层
/*
- 获取用户的菜单权限
*/
public void getMenusByEmpuuid() {
if (null != getLoginUser()) {
List
write(JSON.toJSONString(menuList));
}
}
测试访问http://localhost:8080/erp/emp_getMenusByEmpuuid
返回如下结果
数据为数组,且全部是二级菜单,这种数据格式无法在页面加载成菜单
4)根据权限显示菜单
总结
三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。
- 第一个是算法
关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。
而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本
《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题
《算法的乐趣》共有23个章节:
- 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)
基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)
- 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)
pBiz.getMenusByEmpuuid(getLoginUser().getUuid());
write(JSON.toJSONString(menuList));
}
}
测试访问http://localhost:8080/erp/emp_getMenusByEmpuuid
返回如下结果
数据为数组,且全部是二级菜单,这种数据格式无法在页面加载成菜单
4)根据权限显示菜单
总结
三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。
- 第一个是算法
关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。
而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本
《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题
[外链图片转存中…(img-5pIqS5RJ-1714342480484)]
《算法的乐趣》共有23个章节:
[外链图片转存中…(img-6HQkSxuM-1714342480485)]
[外链图片转存中…(img-Ykgz4qLv-1714342480485)]
- 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)
基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)
[外链图片转存中…(img-5SefoQAG-1714342480485)]
- 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)
[外链图片转存中…(img-F3lJc8cL-1714342480486)]