用户管理新增附属机构配置,支持一个用户配置多个部门,支持多部门数据权限过滤

This commit is contained in:
thinkgem
2019-05-08 17:07:45 +08:00
parent 00cc2fa797
commit ff462950bd
31 changed files with 4768 additions and 3728 deletions

View File

@@ -160,16 +160,18 @@ user:
# 角色管理
role:
# 扩展数据权限定义3本部门4本公司5本部门和本公司
# ctrlTypeClass 控制的 Class 类,如果为 NONE则代表是不控制该类型权限
# ctrlDataAttrName 控制的数据,返回当前用户有权限的数据值,可以接受 String 或 String[] 的类型;
# ctrlDataParentCodesAttrName 控制的数据所有上级,用于控制数据为树表的情况,为数组时,必须与 ctrlDataAttrName 长度相同。
extendDataScopes: >
{
3: {
Office: {
#控制类型的类名 : "用来获取控制表名和主键,如果为 NONE则代表是不控制该类型权限",
ctrlTypeClass: "com.jeesite.modules.sys.entity.Office",
ctrlDataAttrName: "currentUser.refObj.office.officeCode",
ctrlDataParentCodesAttrName: "currentUser.refObj.office.parentCodes"
#控制数据的类名: "指定一个静态类名,方便 ctrlDataAttrName 得到权限数据,如:当前部门编码、公司编码",
ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
#控制数据的类名下的属性名 : "可看做类下的 get 方法EmpUtils.getOffices(),支持返回字符串或字符串数组类型",
ctrlDataAttrName: "officeCodes",
#控制数据的所有上级编码 : "用于控制数据为树表的情况,为数组时,必须与 ctrlDataAttrName 返回的长度相同,不是树表设置为空",
ctrlDataParentCodesAttrName: "officeParentCodess"
},
Company: {
ctrlTypeClass: "NONE"
@@ -181,20 +183,23 @@ role:
},
Company: {
ctrlTypeClass: "com.jeesite.modules.sys.entity.Company",
ctrlDataAttrName: "currentUser.refObj.company.companyCode",
ctrlDataParentCodesAttrName: "currentUser.refObj.company.parentCodes"
ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
ctrlDataAttrName: "company.companyCode",
ctrlDataParentCodesAttrName: "company.parentCodes"
}
},
5: {
Office: {
ctrlTypeClass: "com.jeesite.modules.sys.entity.Office",
ctrlDataAttrName: "currentUser.refObj.office.officeCode",
ctrlDataParentCodesAttrName: "currentUser.refObj.office.parentCodes"
ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
ctrlDataAttrName: "officeCodes",
ctrlDataParentCodesAttrName: "officeParentCodess"
},
Company: {
ctrlTypeClass: "com.jeesite.modules.sys.entity.Company",
ctrlDataAttrName: "currentUser.refObj.company.companyCode",
ctrlDataParentCodesAttrName: "currentUser.refObj.company.parentCodes"
ctrlDataClass: "com.jeesite.modules.sys.utils.EmpUtils",
ctrlDataAttrName: "company.companyCode",
ctrlDataParentCodesAttrName: "company.parentCodes"
}
}
}

View File

@@ -1,3 +1,14 @@
-- 新增文件管理模块
INSERT INTO js_sys_module(module_code, module_name, description, main_class_name, current_version, upgrade_info, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('filemanager', '文件管理', '公共文件柜、个人文件柜、文件分享', 'com.jeesite.modules.filemanager.web.FilemanagerController', '4.1.4', NULL, '0', 'system', getdate(), 'system', getdate(), NULL);
-- 员工附属机构关系表
CREATE TABLE [js_sys_employee_office]
(
[id] varchar(64) NOT NULL UNIQUE,
[emp_code] varchar(64) NOT NULL,
[office_code] varchar(64) NOT NULL,
[post_code] varchar(64),
PRIMARY KEY ([emp_code], [office_code])
);

View File

@@ -1,3 +1,15 @@
-- 新增文件管理模块
INSERT INTO js_sys_module(module_code, module_name, description, main_class_name, current_version, upgrade_info, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('filemanager', '文件管理', '公共文件柜、个人文件柜、文件分享', 'com.jeesite.modules.filemanager.web.FilemanagerController', '4.1.4', NULL, '0', 'system', now(), 'system', now(), NULL);
-- 员工附属机构关系表
CREATE TABLE js_sys_employee_office
(
id varchar(64) NOT NULL COMMENT '编号',
emp_code varchar(64) NOT NULL COMMENT '员工编码',
office_code varchar(64) NOT NULL COMMENT '机构编码',
post_code varchar(64) COMMENT '岗位编码',
PRIMARY KEY (emp_code, office_code),
UNIQUE (id)
) COMMENT = '员工附属机构关系表';

View File

@@ -1,3 +1,20 @@
-- 新增文件管理模块
INSERT INTO js_sys_module(module_code, module_name, description, main_class_name, current_version, upgrade_info, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('filemanager', '文件管理', '公共文件柜、个人文件柜、文件分享', 'com.jeesite.modules.filemanager.web.FilemanagerController', '4.1.4', NULL, '0', 'system', sysdate, 'system', sysdate, NULL);
-- 员工附属机构关系表
CREATE TABLE js_sys_employee_office
(
id varchar2(64) NOT NULL UNIQUE,
emp_code varchar2(64) NOT NULL,
office_code varchar2(64) NOT NULL,
post_code varchar2(64),
PRIMARY KEY (emp_code, office_code)
);
COMMENT ON TABLE js_sys_employee_office IS '员工附属机构关系表';
COMMENT ON COLUMN js_sys_employee_office.id IS '编号';
COMMENT ON COLUMN js_sys_employee_office.emp_code IS '员工编码';
COMMENT ON COLUMN js_sys_employee_office.office_code IS '机构编码';
COMMENT ON COLUMN js_sys_employee_office.post_code IS '岗位编码';

View File

@@ -1,3 +1,20 @@
-- 新增文件管理模块
INSERT INTO js_sys_module(module_code, module_name, description, main_class_name, current_version, upgrade_info, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('filemanager', '文件管理', '公共文件柜、个人文件柜、文件分享', 'com.jeesite.modules.filemanager.web.FilemanagerController', '4.1.4', NULL, '0', 'system', now(), 'system', now(), NULL);
-- 员工附属机构关系表
CREATE TABLE js_sys_employee_office
(
id varchar(64) NOT NULL UNIQUE,
emp_code varchar(64) NOT NULL,
office_code varchar(64) NOT NULL,
post_code varchar(64),
PRIMARY KEY (emp_code, office_code)
) WITHOUT OIDS;
COMMENT ON TABLE js_sys_employee_office IS '员工附属机构关系表';
COMMENT ON COLUMN js_sys_employee_office.id IS '编号';
COMMENT ON COLUMN js_sys_employee_office.emp_code IS '员工编码';
COMMENT ON COLUMN js_sys_employee_office.office_code IS '机构编码';
COMMENT ON COLUMN js_sys_employee_office.post_code IS '岗位编码';

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jeesite.modules.sys.dao.EmployeeOfficeDao">
<!-- 查询数据
<select id="findList" resultType="EmployeeOffice">
SELECT ${sqlMap.column.toSql()}
FROM ${sqlMap.table.toSql()}
<where>
${sqlMap.where.toSql()}
</where>
ORDER BY ${sqlMap.order.toSql()}
</select> -->
</mapper>

View File

@@ -107,7 +107,7 @@ for (c in child.columnList){
id: 'office_'+editOptions.id, title: '机构选择',
name: '${c.attrName}', value: val.split('|')[0],
labelName: '${c.attrName2}', labelValue: val.split('|')[1],
url: '\${ctx}/sys/office/treeData?officeTypes=1,2', cssClass: '${cssClass}'
url: '\${ctx}/sys/office/treeData', cssClass: '${cssClass}'
});
}
}

View File

@@ -0,0 +1,69 @@
<% layout('/layouts/default.html', {title: '附属机构管理', libs: ['validate']}){ %>
<div class="main-content">
<div class="box box-main">
<div class="box-header with-border">
<div class="box-title">
<i class="fa fa-list-alt"></i> ${text(employeeOffice.isNewRecord ? '新增附属机构' : '编辑附属机构')}
</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:form id="inputForm" model="${employeeOffice}" action="${ctx}/sys/empOffice/save" method="post" class="form-horizontal">
<#form:hidden path="empCode"/>
<#form:hidden path="isNewRecord"/>
<div class="box-body"><br/>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="control-label col-sm-2" title="">
<span class="required hide">*</span> ${text('附属机构')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-5">
<#form:treeselect id="office" title="${text('机构选择')}"
path="officeCode" labelPath="officeName" readonly="${!employeeOffice.isNewRecord}"
url="${ctx}/sys/office/treeData?ctrlPermi=2" class="required" allowClear="false"/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="control-label col-sm-2" title="">
<span class="required hide">*</span> ${text('岗位编码')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-5">
<#form:select name="postCode" items="${postList}"
itemLabel="postName" itemValue="postCode" class="form-control"/>
</div>
</div>
</div>
</div>
</div>
<div class="box-footer">
<div class="row">
<div class="col-sm-offset-2 col-sm-10">
<% if (hasPermi('sys:empUser:view')){ %>
<button type="submit" class="btn btn-sm btn-primary" id="btnSubmit"><i class="fa fa-check"></i> ${text('保 存')}</button>&nbsp;
<% } %>
<button type="button" class="btn btn-sm btn-default" id="btnCancel" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply-all"></i> ${text('关 闭')}</button>
</div>
</div>
</div>
</#form:form>
</div>
</div>
<% } %>
<script>
$("#inputForm").validate({
submitHandler: function(form){
js.ajaxSubmitForm($(form), function(data){
js.showMessage(data.message);
if(data.result == Global.TRUE){
js.closeCurrentTabPage(function(contentWindow){
contentWindow.page();
});
}
}, "json");
}
});
</script>

View File

@@ -0,0 +1,53 @@
<% layout('/layouts/default.html', {title: '附属机构管理', libs: ['dataGrid']}){ %>
<div class="main-content">
<div class="box box-main">
<div class="box-header">
<div class="box-title">
<i class="fa fa-list-alt"></i> ${text('附属机构管理')}
</div>
<div class="box-tools pull-right">
<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
<% if(hasPermi('sys:empUser:view')){ %>
<a href="${ctx}/sys/empOffice/form?empCode=1&isNewRecord=true" class="btn btn-default btnTool" title="${text('新增附属机构')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
<% } %>
</div>
</div>
<div class="box-body">
<#form:form id="searchForm" model="${employeeOffice}" action="${ctx}/sys/empOffice/listData" method="post" class="form-inline hide"
data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
<#form:hidden path="empCode"/>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-sm">${text('查询')}</button>
<button type="reset" class="btn btn-default btn-sm">${text('重置')}</button>
</div>
</#form:form>
<table id="dataGrid"></table>
<div id="dataGridPage"></div>
</div>
</div>
</div>
<% } %>
<script>
// 初始化DataGrid对象
$('#dataGrid').dataGrid({
searchForm: $("#searchForm"),
columnModel: [
{header:'${text("附属机构")}', name:'officeCode', index:'a.office_code', width:200, align:"center", frozen:true, formatter: function(val, obj, row, act){
return '<a href="${ctx}/sys/empOffice/form?empCode='+row.empCode+'&officeCode='+row.officeCode+'" class="btnList" data-title="${text("编辑附属机构")}">'+(val||row.id)+'</a>';
}},
{header:'${text("岗位编码")}', name:'postCode', index:'a.post_code', width:200, align:"center"},
{header:'${text("操作")}', name:'actions', width:120, sortable:false, title:false, formatter: function(val, obj, row, act){
var actions = [];
<% if(hasPermi('sys:empUser:view')){ %>
actions.push('<a href="${ctx}/sys/empOffice/form?empCode='+row.empCode+'&officeCode='+row.officeCode+'" class="btnList" title="${text("编辑附属机构")}"><i class="fa fa-pencil"></i></a>&nbsp;');
actions.push('<a href="${ctx}/sys/empOffice/delete?empCode='+row.empCode+'&officeCode='+row.officeCode+'" class="btnList" title="${text("删除附属机构")}" data-confirm="${text("确认要删除该附属机构吗?")}"><i class="fa fa-trash-o"></i></a>&nbsp;');
<% } %>
return actions.join('');
}}
],
// 加载成功后执行事件
ajaxSuccess: function(data){
}
});
</script>

View File

@@ -143,8 +143,8 @@
<label class="control-label col-sm-4" title="">
<span class="required hide">*</span> ${text('所在岗位')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<#form:select multiple="true" path="employee.employeePosts" items="${postList}"
itemLabel="postName" itemValue="postCode" class="form-control"/>
<#form:select multiple="true" path="employee.employeePosts" items="${postList}"
itemLabel="postName" itemValue="postCode" class="form-control"/>
</div>
</div>
</div>
@@ -158,6 +158,20 @@
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="control-label col-sm-2" title="">
<span class="required hide">*</span> ${text('附属机构')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-10">
<table id="empOfficeGrid"></table>
<% if (hasPermi('sys:empUser:edit')){ %>
<a href="#" id="empOfficeGridAddRowBtn" class="btn btn-primary btn-sm mt10 mb10"><i class="fa fa-plus"></i> ${text('增行')}</a>
<% } %>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
@@ -195,21 +209,59 @@
</div>
</div>
<% } %>
<script id="treeselectTpl" type="text/template">//<!--<div>
<#form:treeselect id="{{d.id}}" title="{{d.title}}" name="{{d.name}}" value="{{d.value}}"
labelName="{{d.labelName}}" labelValue="{{d.labelValue}}" url="{{d.url}}"
class="{{d.cssClass}}" btnClass="btn-sm" allowClear="true"/>
</div>//--></script>
<script>
$("#inputForm").validate({
submitHandler: function(form){
<% if(op == 'add' || op == 'auth') { // 获取选中角色 %>
$("#userRoleString").val(roleGrid.dataGrid('getSelectRows').join(','));
<% } %>
js.ajaxSubmitForm($(form), function(data){
js.showMessage(data.message);
if(data.result == Global.TRUE){
js.closeCurrentTabPage(function(contentWindow){
contentWindow.page();
});
$("#empOfficeGrid").dataGrid({
data: ${toJson(empUser.employee.employeeOfficeList)},
datatype: "local", // 设置本地数据
columnModel: [
{header:'${text("附属机构")}', name:'officeName', sortable:false, width:100,
formatter: function(val, obj, row, act){
return js.val(row, 'officeCode')+'|'+js.val(row, 'officeName');
}, editable: true, edittype: "custom", editoptions: {
custom_element: function(val, editOptions) {
return js.template('treeselectTpl', {
id: 'office_'+editOptions.id, title: '机构选择',
name: 'officeCode', value: val.split('|')[0],
labelName: 'officeName', labelValue: val.split('|')[1],
url: '${ctx}/sys/office/treeData', cssClass: 'required'
});
}
}
}, "json");
}
},
{header:'${text("附属岗位")}', name:'postCode', sortable:false, width:100,
editable:true, edittype:'select', editoptions:{'class':'form-control',
items: $.merge([{postName:'&nbsp;',postCode:''}], ${toJson(postList)}),
itemLabel: 'postName', itemValue: 'postCode', dataInit: function(element){
$(element).select2().on("change",function(){$(this).valid()});
}
}
},
{header:'${text("操作")}', name:'actions', width:80, sortable:false, fixed:true, formatter: function(val, obj, row, act){
var actions = [];
actions.push('<a href="#" onclick="js.confirm(\'${text("你确认要删除这条数据吗?")}\', function(){$(\'#empOfficeGrid\').dataGrid(\'delRowData\',\''+obj.rowId+'\')});return false;"><i class="fa fa-trash-o"></i></a>&nbsp;');
return actions.join('');
}, editoptions: {defaultValue: 'new'}}
],
autoGridHeight: function(){return 'auto'}, // 设置自动高度
// 编辑表格参数
editGrid: true, // 是否是编辑表格
editGridInitRowNum: 0, // 编辑表格的初始化新增行数
editGridAddRowBtn: $('#empOfficeGridAddRowBtn'), // 子表增行按钮
editGridAddRowInitData: {id: '', status: Global.STATUS_NORMAL}, // 新增行的时候初始化的数据
// 编辑表格的提交数据参数
editGridInputFormListName: 'employee.employeeOfficeList', // 提交的数据列表名
editGridInputFormListAttrs: 'officeCode,officeName,postCode,postName,', // 提交数据列表的属性字段
ajaxSuccess: function(){
}
});
<% if(op == 'add' || op == 'auth') {%>
// 加载角色列表
@@ -237,4 +289,19 @@ var roleGrid = $("#roleGrid").dataGrid({
}
});
<% } %>
$("#inputForm").validate({
submitHandler: function(form){
<% if(op == 'add' || op == 'auth') { // 获取选中角色 %>
$("#userRoleString").val(roleGrid.dataGrid('getSelectRows').join(','));
<% } %>
js.ajaxSubmitForm($(form), function(data){
js.showMessage(data.message);
if(data.result == Global.TRUE){
js.closeCurrentTabPage(function(contentWindow){
contentWindow.page();
});
}
}, "json");
}
});
</script>