main
tamguo 7 years ago
parent 167877ce78
commit dbe756eadc

@ -1,5 +1,7 @@
package com.tamguo.modules.sys.service; package com.tamguo.modules.sys.service;
import java.util.Map;
import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.plugins.Page;
import com.tamguo.modules.sys.model.SysRoleEntity; import com.tamguo.modules.sys.model.SysRoleEntity;
import com.tamguo.modules.sys.model.condition.SysRoleCondition; import com.tamguo.modules.sys.model.condition.SysRoleCondition;
@ -8,4 +10,6 @@ public interface ISysRoleService {
Page<SysRoleEntity> listData(SysRoleCondition condition); Page<SysRoleEntity> listData(SysRoleCondition condition);
Map<String, Object> menuTreeData(String roleCode);
} }

@ -1,11 +1,19 @@
package com.tamguo.modules.sys.service.impl; package com.tamguo.modules.sys.service.impl;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.Condition;
import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.plugins.Page;
import com.tamguo.modules.sys.dao.SysMenuMapper;
import com.tamguo.modules.sys.dao.SysRoleMapper; import com.tamguo.modules.sys.dao.SysRoleMapper;
import com.tamguo.modules.sys.model.SysMenuEntity;
import com.tamguo.modules.sys.model.SysRoleEntity; import com.tamguo.modules.sys.model.SysRoleEntity;
import com.tamguo.modules.sys.model.condition.SysRoleCondition; import com.tamguo.modules.sys.model.condition.SysRoleCondition;
import com.tamguo.modules.sys.service.ISysRoleService; import com.tamguo.modules.sys.service.ISysRoleService;
@ -15,6 +23,8 @@ public class SysRoleServiceImpl implements ISysRoleService{
@Autowired @Autowired
private SysRoleMapper sysRoleMapper; private SysRoleMapper sysRoleMapper;
@Autowired
private SysMenuMapper sysMenuMapper;
@Transactional(readOnly=true) @Transactional(readOnly=true)
@Override @Override
@ -23,4 +33,33 @@ public class SysRoleServiceImpl implements ISysRoleService{
return page.setRecords(sysRoleMapper.listData(condition , page)); return page.setRecords(sysRoleMapper.listData(condition , page));
} }
@SuppressWarnings("unchecked")
@Override
public Map<String, Object> menuTreeData(String roleCode) {
List<SysMenuEntity> menus = sysMenuMapper.selectList(Condition.EMPTY);
JSONObject result = new JSONObject();
JSONObject menuInfo = transformZTree(menus);
result.put("menuMap", menuInfo);
return result;
}
private JSONObject transformZTree(List<SysMenuEntity> menus) {
JSONObject result = new JSONObject();
if(menus != null) {
JSONArray nodes = new JSONArray();
for(int i=0 ; i<menus.size() ; i++) {
SysMenuEntity menu = menus.get(i);
JSONObject node = new JSONObject();
node.put("name", menu.getMenuName());
node.put("pId", menu.getParentCode());
node.put("id", menu.getMenuCode());
node.put("title", menu.getMenuName());
nodes.add(node);
}
result.put("default", nodes);
}
return result;
}
} }

@ -18,16 +18,27 @@ import com.tamguo.modules.sys.utils.Result;
@RequestMapping(path="sys/role") @RequestMapping(path="sys/role")
public class SysRoleController { public class SysRoleController {
// 角色列表
private final String ROLE_INDEX_PAGE = "modules/sys/role/index"; private final String ROLE_INDEX_PAGE = "modules/sys/role/index";
// 分配角色菜单权限
private final String ROLE_MENU_INDEX_PAGE = "modules/sys/role/menu";
@Autowired @Autowired
private ISysRoleService iSysRoleService; private ISysRoleService iSysRoleService;
/** 角色首页*/
@RequestMapping(path="index") @RequestMapping(path="index")
public String index() { public String index() {
return ROLE_INDEX_PAGE; return ROLE_INDEX_PAGE;
} }
/** 角色授权功能菜单*/
@RequestMapping(path="menu")
public String menu() {
return ROLE_MENU_INDEX_PAGE;
}
/** 列表数据*/
@RequestMapping(path="listData",method=RequestMethod.POST) @RequestMapping(path="listData",method=RequestMethod.POST)
@ResponseBody @ResponseBody
public Map<String, Object> listData(SysRoleCondition condition) { public Map<String, Object> listData(SysRoleCondition condition) {
@ -35,4 +46,10 @@ public class SysRoleController {
return Result.jqGridResult(page.getRecords(), page.getTotal(), page.getSize(), page.getCurrent(), page.getPages()); return Result.jqGridResult(page.getRecords(), page.getTotal(), page.getSize(), page.getCurrent(), page.getPages());
} }
@RequestMapping(path="menuTreeData")
@ResponseBody
public Map<String, Object> menuTreeData(String roleCode) {
return iSysRoleService.menuTreeData(roleCode);
}
} }

@ -17,7 +17,7 @@ import com.tamguo.modules.sys.utils.Result;
@Controller @Controller
@RequestMapping(path="sys/user") @RequestMapping(path="sys/user")
public class UserController { public class SysUserController {
private final String USER_INDEX_PAGE = "modules/sys/user/index"; private final String USER_INDEX_PAGE = "modules/sys/user/index";
private final String USER_LIST_PAGE = "modules/sys/user/list"; private final String USER_LIST_PAGE = "modules/sys/user/list";

@ -127,7 +127,7 @@ $('#dataGrid').dataGrid({
actions.push('<a href="/js/a/sys/role/delete?roleCode='+row.roleCode+'" class="btnList" title="删除角色" data-confirm="确认要删除该角色吗?"><i class="fa fa-trash-o"></i></a>&nbsp;'); actions.push('<a href="/js/a/sys/role/delete?roleCode='+row.roleCode+'" class="btnList" title="删除角色" data-confirm="确认要删除该角色吗?"><i class="fa fa-trash-o"></i></a>&nbsp;');
actions.push('<a href="javascript:" class="btnMore" title="更多操作"><i class="fa fa-chevron-circle-right"></i></a>&nbsp;'); actions.push('<a href="javascript:" class="btnMore" title="更多操作"><i class="fa fa-chevron-circle-right"></i></a>&nbsp;');
actions.push('<div class="moreItems">'); actions.push('<div class="moreItems">');
actions.push('<a href="/js/a/sys/role/form?roleCode='+row.id+'&op=auth" class="btn btn-default btn-xs btnList" title="角色分配功能权限"><i class="fa fa-check-square-o"></i> 功能菜单</a>&nbsp;'); actions.push('<a href="sys/role/menu?roleCode='+row.id+'&op=auth" class="btn btn-default btn-xs btnList" title="角色分配功能权限"><i class="fa fa-check-square-o"></i> 功能菜单</a>&nbsp;');
actions.push('<a href="/js/a/sys/role/formAuthDataScope?roleCode='+row.id+'" class="btn btn-default btn-xs btnList" title="角色分配数据权限"><i class="fa fa-check-circle-o"></i> 数据权限</a>&nbsp;'); actions.push('<a href="/js/a/sys/role/formAuthDataScope?roleCode='+row.id+'" class="btn btn-default btn-xs btnList" title="角色分配数据权限"><i class="fa fa-check-circle-o"></i> 数据权限</a>&nbsp;');
actions.push('<a href="/js/a/sys/role/formAuthUser?roleCode='+row.id+'" class="btn btn-default btn-xs btnList" title="角色分配用户"><i class="fa fa-user"></i> 分配用户</a>&nbsp;'); actions.push('<a href="/js/a/sys/role/formAuthUser?roleCode='+row.id+'" class="btn btn-default btn-xs btnList" title="角色分配用户"><i class="fa fa-user"></i> 分配用户</a>&nbsp;');
actions.push('</div>'); actions.push('</div>');

@ -0,0 +1,215 @@
<!DOCTYPE html><html><head><meta charset="utf-8"><meta content="webkit" name="renderer"/><meta http-equiv="X-UA-Compatible"
content="IE=edge"><meta name="keywords" content="PoweredByJeeSiteV4.0"/><meta http-equiv="Cache-Control"
content="no-cache, no-store, must-revalidate"/><meta name="description" content="PoweredByJeeSiteV4.0"/><meta
content="no-cache" http-equiv="Pragma"/><meta http-equiv="Expires" content="0"/><meta
content="width=device-width, initial-scale=1, user-scalable=1" name="viewport"/>
<title>角色管理 - JeeSite Demo</title>
<script th:src="${setting.domain + 'global.min.js'}"></script>
<script th:src="${setting.domain + 'jquery/jquery-1.12.4.min.js'}"></script>
<script th:src="${setting.domain + 'jquery/jquery-migrate-1.4.1.min.js'}"></script>
<!--[if lt IE 9]><script src="/js/static/common/h5fix.min.js"></script><![endif]-->
<link rel="stylesheet" th:href="${setting.domain + 'fonts/font-icons.min.css'}">
<link rel="stylesheet" th:href="${setting.domain + 'bootstrap/css/bootstrap.min.css'}">
<link rel="stylesheet" th:href="${setting.domain + 'select2/4.0/select2.css'}">
<link rel="stylesheet" th:href="${setting.domain + 'icheck/1.0/minimal/grey.css'}">
<link rel="stylesheet" th:href="${setting.domain + 'jquery-ztree/3.5/css/metro/zTreeStyle.css'}">
<link rel="stylesheet" th:href="${setting.domain + 'adminlte/css/AdminLTE.min.css'}">
<link rel="stylesheet" th:href="${setting.domain + 'common/jeesite.css'}">
<link rel="stylesheet" th:href="${setting.domain + 'common/common.css'}">
</head><body class="hold-transition ">
<div class="wrapper"><div class="main-content">
<div class="box box-main">
<div class="box-header">
<div class="box-title">
<i class="fa icon-people"></i> 角色授权功能菜单
</div>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div>
<form id="inputForm" action="/js/a/sys/role/save" method="post" class="form-horizontal">
<input type="hidden" id="op" name="op" value="auth"/>
<div class="box-body">
<div class="form-unit">基本信息</div>
<div class="row">
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-4" title="">
<span class="required ">*</span> 角色名称:<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<input type="hidden" id="oldRoleName" name="oldRoleName" value="部门经理"/>
<input type="text" id="roleName" name="roleName" value="部门经理" maxlength="100" readonly="true" class="form-control required " remote="/js/a/sys/role/checkRoleName?oldRoleName=部门经理" data-msg-remote="角色名称已存在"/>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-4" title="">
<span class="required ">*</span> 角色编码:<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<input type="hidden" id="isNewRecord" name="isNewRecord" value="false"/>
<input type="text" id="roleCode" name="roleCode" value="dept" maxlength="64" readonly="true" class="form-control required abc"/>
</div>
</div>
</div>
</div>
<div class="form-unit">授权功能菜单</div>
<div id="menuTrees"></div>
<script id="menuTpl" type="text/template">
<div class="pull-left" style="padding:0 15px;min-width:300px;">
<div class="box box-solid" style="background:#FAFAFA">
<div class="box-header">
<div class="box-title icheck">
<label><input type="checkbox" id="checkall_{{d.key}}"
class="checkall"/> {{d.label}}</label>
</div>
<div class="box-tools pull-right" style="top:8px;">
<a class="btn btn-box-tool" id="expand_{{d.key}}"
value="menuTree_{{d.key}}" >展开</a>/<a
class="btn btn-box-tool" id="collapse_{{d.key}}"
value="menuTree_{{d.key}}" >折叠</a>
</div>
</div>
<div class="box-body">
<div id="menuTree_{{d.key}}" class="ztree"></div>
</div>
</div>
</div>
</script>
<input type="hidden" id="roleMenuListJson" name="roleMenuListJson" value=""/>
</div>
<div class="box-footer">
<div class="row">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-sm btn-primary" id="btnSubmit"><i class="fa fa-check"></i> 保 存</button>&nbsp;
<button type="button" class="btn btn-sm btn-default" id="btnCancel" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply-all"></i> 关 闭</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<a id="scroll-up" href="#" class="btn btn-sm"><i class="fa fa-angle-double-up"></i></a>
<script th:src="${setting.domain + 'bootstrap/js/bootstrap.min.js'}"></script>
<script th:src="${setting.domain + 'select2/4.0/select2.js'}"></script>
<script th:src="${setting.domain + 'select2/4.0/i18n/zh_CN.js'}"></script>
<script th:src="${setting.domain + 'layer/3.1/layer.js'}"></script>
<script th:src="${setting.domain + 'my97/WdatePicker.js'}"></script>
<script th:src="${setting.domain + 'jquery-ztree/3.5/js/jquery.ztree.all-3.5.js'}"></script>
<script th:src="${setting.domain + 'jquery-validation/1.16/jquery.validate.js'}"></script>
<script th:src="${setting.domain + 'jquery-validation/1.16/localization/messages_zh_CN.js'}"></script>
<script th:src="${setting.domain + 'jquery-validation/1.16/jquery.validate.extend.js'}"></script>
<script th:src="${setting.domain + 'common/jeesite.js'}"></script>
<script th:src="${setting.domain + 'common/i18n/jeesite_zh_CN.js'}"></script>
<script th:src="${setting.domain + 'common/common.js'}"></script>
<script>
$("#inputForm").validate({
submitHandler: function(form){
// 获取数据权限数据
var menuData = [];
$.each(menuTrees, function(key, menuTree){
var treeNodes = menuTree.getCheckedNodes(true);
for(var i=0; i<treeNodes.length; i++) {
menuData.push(treeNodes[i].id);
}
});
$("#roleMenuListJson").val(JSON.stringify(menuData));
// 提交表单数据
js.ajaxSubmitForm($(form), function(data){
js.showMessage(data.message);
if(data.result == Global.TRUE){
js.closeCurrentTabPage(function(contentWindow){
contentWindow.page();
});
}
}, "json");
}
});
//加载数据权限树结构
var setting = {
check:{enable:true,nocheckInherit:true,chkboxType:{"Y":"ps","N":"ps"}},
view:{selectedMulti:false,nameIsHTML: true},
data:{simpleData:{enable:true},key:{title:"title"}},
callback:{
beforeClick: function (treeId, treeNode, clickFlag) {
var tree = $.fn.zTree.getZTreeObj(treeId);
tree.checkNode(treeNode, !treeNode.checked, true, true);
return false;
},
onCheck: function (event, treeId, treeNode){
var tid = treeNode.tId;
if(!treeNode.checked){
$(".checkall[value="+treeId+"]").each(function(){
if(this.checked){
$(this).removeAttr("checked").iCheck('update');
}
return false;
});
}
}
}
},
sysCodeDict = [{"id":"1019065441754435584","updateDate":"2018-07-17 11:45","updateBy":"system","createBy":"system","status":"0","createDate":"2018-07-17 11:45","treeSort":30,"treeNames":"主导航菜单","parentCodes":"0,","treeLeaf":"1","treeLevel":0,"treeSorts":"0000000030,","dictCode":"1019065441754435584","description":"","cssStyle":"","cssClass":"","dictLabelOrig":"主导航菜单","dictValue":"default","dictType":"sys_menu_sys_code","isSys":"1","dictLabel":"主导航菜单","parentCode":"0","isRoot":true,"isTreeLeaf":true}],
menuTrees = {}; // 用sysCode分类存储所有菜单树
$.ajax({
type: 'POST',
url: "menuTreeData?___t=" + new Date().getTime(),
data: {roleCode: 'dept'},
dataType: 'json',
async: false,
error: function(data){
js.showErrorMessage(data.responseText);
},
success: function(data, status, xhr){
for (var sysCode in data.menuMap){
var menuMap = data.menuMap[sysCode];
$('#menuTrees').append(js.template('menuTpl', {key: sysCode,
label: js.getDictLabel(sysCodeDict, sysCode, '未知', true)}));
// 初始化树结构
var tree = $.fn.zTree.init($("#menuTree_"+sysCode), setting, menuMap);
// 展开第一级节点
var nodes = tree.getNodesByParam("level", 0);
for(var i=0; i<nodes.length; i++) {
tree.expandNode(nodes[i], true, false, false);
}
// 展开第二级节点
nodes = tree.getNodesByParam("level", 1);
for(var i=0; i<nodes.length; i++) {
tree.expandNode(nodes[i], true, false, false);
}
// 默认展开全部节点
//tree.expandAll(true);
// 树结构:全选、取消全选
$('#checkall_'+sysCode).iCheck({
checkboxClass:'icheckbox_minimal-grey'
}).on('ifChecked ifUnchecked', function(){
var sysCode = $(this).attr('sysCode');
if(this.checked){
menuTrees[sysCode].checkAllNodes(true);
}else{
menuTrees[sysCode].checkAllNodes(false);
}
}).attr("sysCode", sysCode);
// 展开和折叠按钮绑定
$('#expand_'+sysCode).click(function(){
var sysCode = $(this).attr('sysCode');
menuTrees[sysCode].expandAll(true);
}).attr("sysCode", sysCode);
$('#collapse_'+sysCode).click(function(){
var sysCode = $(this).attr('sysCode');
menuTrees[sysCode].expandAll(false);
}).attr("sysCode", sysCode);
// 将树对象存储到全局数组里
menuTrees[sysCode] = tree;
}
// 默认选择节点
for (var idx in data.roleMenuList){
var roleMenu = data.roleMenuList[idx], sysCode = roleMenu.sysCode;
var node = menuTrees[sysCode].getNodeByParam("id",roleMenu.menuCode);
try{menuTrees[sysCode].checkNode(node, true, false);}catch(e){}
}
}
});
</script>
Loading…
Cancel
Save