Commit 63eb40e7 authored by 雍欢's avatar 雍欢

【流程+表单】完善子集权限控制

parent ce1cfa62
...@@ -17,6 +17,7 @@ import com.huigou.uasp.client.CommonController; ...@@ -17,6 +17,7 @@ import com.huigou.uasp.client.CommonController;
import com.huigou.uasp.log.annotation.LogInfo; import com.huigou.uasp.log.annotation.LogInfo;
import com.huigou.uasp.log.domain.model.LogType; import com.huigou.uasp.log.domain.model.LogType;
import com.huigou.uasp.log.domain.model.OperationType; import com.huigou.uasp.log.domain.model.OperationType;
import com.huigou.util.ClassHelper;
import com.huigou.util.SDO; import com.huigou.util.SDO;
import com.mxgraph.util.mxUtils; import com.mxgraph.util.mxUtils;
import org.activiti.bpmn.converter.BpmnXMLConverter; import org.activiti.bpmn.converter.BpmnXMLConverter;
...@@ -26,6 +27,7 @@ import org.activiti.engine.delegate.ExecutionListener; ...@@ -26,6 +27,7 @@ import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.delegate.TaskListener; import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.impl.util.io.StringStreamSource; import org.activiti.engine.impl.util.io.StringStreamSource;
import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.beanutils.converters.ClassConverter;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
...@@ -281,9 +283,21 @@ public class ModelController extends CommonController implements ApplicationCont ...@@ -281,9 +283,21 @@ public class ModelController extends CommonController implements ApplicationCont
public String queryFormFields() { public String queryFormFields() {
String formNo = getSDO().getString("formNo"); String formNo = getSDO().getString("formNo");
EntityManager em = generalRepository.getEntityManager(); EntityManager em = generalRepository.getEntityManager();
List<?> formFields = em.createQuery("select fa from FormAttribute fa inner join SafFormslist f on fa.formId=f.id where f.formNo=:formNo") List<Map<String, Object>> formFields = ((List<Object>) em.createQuery("select fa from FormAttribute fa inner join SafFormslist f on fa.formId=f.id where f.formNo=:formNo")
.setParameter("formNo", formNo) .setParameter("formNo", formNo)
.getResultList(); .getResultList())
.stream()
.map(field -> ClassHelper.beanToMap(field))
.map((Map<String, Object> field) -> {
em.createQuery("select t.name from DbTables t where t.tableName=:tableName")
.setParameter("tableName", field.get("tableName"))
.getResultList()
.stream()
.map(String::valueOf)
.findAny()
.ifPresent(tableName -> field.put("tableLabel", tableName));
return field;
}).collect(Collectors.toList());
return toResult(formFields); return toResult(formFields);
} }
......
package com.huigou.uasp.bmp.intercept; package com.huigou.uasp.bmp.intercept;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.huigou.context.ContextUtil; import com.huigou.context.ContextUtil;
import com.huigou.context.Operator; import com.huigou.context.Operator;
import com.huigou.context.ThreadLocalUtil; import com.huigou.context.ThreadLocalUtil;
import com.huigou.data.domain.model.AbstractEntity;
import com.huigou.data.repository.GeneralRepository; import com.huigou.data.repository.GeneralRepository;
import com.huigou.exception.ApplicationException; import com.huigou.exception.ApplicationException;
import com.huigou.uasp.bmp.operator.OperatorUIElementPermissionBuilder; import com.huigou.uasp.bmp.operator.OperatorUIElementPermissionBuilder;
...@@ -25,6 +24,7 @@ import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; ...@@ -25,6 +24,7 @@ import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* 系统权限获取 页面元素使用 * 系统权限获取 页面元素使用
...@@ -52,16 +52,16 @@ public class ExecuteContextInterceptor extends HandlerInterceptorAdapter { ...@@ -52,16 +52,16 @@ public class ExecuteContextInterceptor extends HandlerInterceptorAdapter {
private void handlePermission(Collection<Map<String, Object>> permissions, HttpServletRequest request) { private void handlePermission(Collection<Map<String, Object>> permissions, HttpServletRequest request) {
if (permissions != null && permissions.size() > 0) { if (permissions != null && permissions.size() > 0) {
request.getSession().setAttribute("PermissionInterceptorSet", permissions); request.getSession().setAttribute("PermissionInterceptorSet", permissions);
Map<String, Object> noaccessField = new HashMap<String, Object>(permissions.size()); Map<String, Object> noaccessField = new HashMap<>(permissions.size());
Map<String, Object> noaccessDetail = new HashMap<String, Object>(permissions.size()); Map<String, Object> noaccessDetail = new HashMap<>(permissions.size());
String code = "", operationId = "", uiElmentKindId = ""; String code = "", operationId = "", uiElmentKindId = "";
for (Map<String, Object> m : permissions) { for (Map<String, Object> m : permissions) {
// 如果界面元素的formFieldId不为空,则说明该界面元素是与表单字段进行的绑定,这时需要将界面元素的code替换为:field+表单字段排序 // 如果界面元素的formFieldId不为空,则说明该界面元素是与表单字段进行的绑定,这时需要将界面元素的code替换为:field+表单字段排序
String formFieldId = (String) m.get("formFieldId"); String formFieldId = (String) m.get("formFieldId");
if (StringUtils.isNotBlank(formFieldId)) { if (StringUtils.isNotBlank(formFieldId)) {
generalRepository.getEntityManager().createQuery("select fa from FormAttribute fa where fa.id=?1") ((List<? extends AbstractEntity>) generalRepository.getEntityManager().createQuery("select fa from FormAttribute fa where fa.id=?1")
.setParameter(1, formFieldId) .setParameter(1, formFieldId)
.getResultList() .getResultList())
.stream() .stream()
.findAny() .findAny()
.map(this::formatFormFieldName) .map(this::formatFormFieldName)
...@@ -91,60 +91,36 @@ public class ExecuteContextInterceptor extends HandlerInterceptorAdapter { ...@@ -91,60 +91,36 @@ public class ExecuteContextInterceptor extends HandlerInterceptorAdapter {
} }
} }
private String formatFormFieldName(Object formField) { private String formatFormFieldName(AbstractEntity formField) {
String formId, fieldName; String formId, tableName;
Integer tableType;
try { try {
formId = BeanUtils.getProperty(formField, "formId"); formId = BeanUtils.getProperty(formField, "formId");
fieldName = BeanUtils.getProperty(formField, "attrCode"); tableName = BeanUtils.getProperty(formField, "tableName");
tableType = Integer.valueOf(BeanUtils.getProperty(formField, "tableType"));
} catch (Exception e) { } catch (Exception e) {
throw new ApplicationException(e); throw new ApplicationException(e);
} }
Optional<JSONObject> optionalJson = getFormJson(formId);
int index = -1; int index = -1;
if (optionalJson.isPresent()) { // 从SAF_FORM_ATTRIBUTE从解析字段的显示index
// 从json中解析字段的显示index List<Map<String, Object>> formFields = ((List<? extends AbstractEntity>) generalRepository.getEntityManager()
List<Object> formFields = optionalJson.get().getJSONArray("list"); .createQuery("select fa from FormAttribute fa where fa.formId=:formId order by fa.sequence")
for (Object o : formFields) {
index++;
JSONObject f = (JSONObject) o;
if (Objects.equals(f.getString("model"), fieldName)) {
break;
}
}
} else {
// 从SAF_FORM_ATTRIBUTE从解析字段的显示index
List<Object> formFields = generalRepository.getEntityManager().createQuery("select fa from FormAttribute fa where fa.formId=:formId order by fa.sequence")
.setParameter("formId", formId)
.getResultList();
for (Object f : formFields) {
index++;
if (f.equals(formField)) {
break;
}
}
}
return String.format("field%d", index);
}
/**
* 获取表单字段的定义JSON
*
* @param formId 表单id
* @return 表单字段的定义JSON
*/
private Optional<JSONObject> getFormJson(String formId) {
return generalRepository.getEntityManager().createQuery("select f from SafFormslist f where f.id=:formId")
.setParameter("formId", formId) .setParameter("formId", formId)
.getResultList() .getResultList())
.stream() .stream()
.findAny() .map(ClassHelper::beanToMap)
.map(form -> { // 根据表名分组
try { .collect(Collectors.groupingBy(field -> field.get("tableName")))
return BeanUtils.getProperty(form, "json"); .getOrDefault(tableName, Collections.emptyList());
} catch (Exception e) { for (Map<String, Object> f : formFields) {
throw new ApplicationException(e); index++;
} if (formField.getId().equals(f.get("id"))) {
}).map(str -> JSON.parseObject((String) str)); break;
}
}
return Objects.equals(tableType, 2) ?
String.format("%s.field%d", StringUtil.getHumpName(tableName), index)
: String.format("field%d", index);
} }
public void intercept(HttpServletRequest request, HttpServletResponse response) throws Exception { public void intercept(HttpServletRequest request, HttpServletResponse response) throws Exception {
......
...@@ -86,11 +86,7 @@ public class OperatorUIElementPermissionBuilderImp implements OperatorUIElementP ...@@ -86,11 +86,7 @@ public class OperatorUIElementPermissionBuilderImp implements OperatorUIElementP
} }
} }
String approvalRuleHandlerId = procUnitHandler != null ? procUnitHandler.getApprovalRuleHandlerId() : null; String approvalRuleHandlerId = procUnitHandler != null ? procUnitHandler.getApprovalRuleHandlerId() : null;
flowElementFieldPermissions.forEach(it -> { flowElementFieldPermissions.forEach(it -> it.put("approvalRuleHandlerId", approvalRuleHandlerId));
it.put("approvalRuleHandlerId", approvalRuleHandlerId);
// TODO 暂时标记为主集
it.put("kindId", "0");
});
return flowElementFieldPermissions; return flowElementFieldPermissions;
} }
} }
...@@ -121,8 +117,10 @@ public class OperatorUIElementPermissionBuilderImp implements OperatorUIElementP ...@@ -121,8 +117,10 @@ public class OperatorUIElementPermissionBuilderImp implements OperatorUIElementP
.map(ExtensionAttribute::getValue) .map(ExtensionAttribute::getValue)
.map(formNo -> getFlowElementFieldPermissions(formNo, fe)) .map(formNo -> getFlowElementFieldPermissions(formNo, fe))
.orElseGet(Collections::emptyList); .orElseGet(Collections::emptyList);
// TODO 暂时设置为主表 flowElementFieldPermissions.forEach(flowElementFieldPermission ->
flowElementFieldPermissions.forEach(flowElementFieldPermission -> flowElementFieldPermission.put("kindId", "0")); getFormFieldPermissionKindId((String) flowElementFieldPermission.get("formFieldId"))
.ifPresent(kindId -> flowElementFieldPermission.put("kindId", kindId))
);
return flowElementFieldPermissions; return flowElementFieldPermissions;
} }
...@@ -205,6 +203,7 @@ public class OperatorUIElementPermissionBuilderImp implements OperatorUIElementP ...@@ -205,6 +203,7 @@ public class OperatorUIElementPermissionBuilderImp implements OperatorUIElementP
// 不是关联的表单字段,直接添加进合并结果集 // 不是关联的表单字段,直接添加进合并结果集
mergeResult.add(o); mergeResult.add(o);
} }
getFormFieldPermissionKindId(formFieldId).ifPresent(kindId -> o.put("kindId", kindId));
Optional<Map<String, Object>> uiElementPermissionOptional = mergeResult.stream().filter(it -> it.get("formFieldId").equals(formFieldId)).findAny(); Optional<Map<String, Object>> uiElementPermissionOptional = mergeResult.stream().filter(it -> it.get("formFieldId").equals(formFieldId)).findAny();
if (uiElementPermissionOptional.isPresent()) { if (uiElementPermissionOptional.isPresent()) {
Map<String, Object> uiElementPermission = uiElementPermissionOptional.get(); Map<String, Object> uiElementPermission = uiElementPermissionOptional.get();
...@@ -216,6 +215,15 @@ public class OperatorUIElementPermissionBuilderImp implements OperatorUIElementP ...@@ -216,6 +215,15 @@ public class OperatorUIElementPermissionBuilderImp implements OperatorUIElementP
return mergeResult; return mergeResult;
} }
private Optional<Integer> getFormFieldPermissionKindId(String formFieldId) {
return ((List<Integer>) generalRepository.getEntityManager().createQuery("select fa.tableType from FormAttribute fa where fa.id=:formFieldId")
.setParameter("formFieldId", formFieldId)
.getResultList())
.stream()
.findAny()
.map(tableType -> tableType.intValue() == 1 ? 0 : 1);
}
private Optional<ExtensionAttribute> getFieldExtensionElement(BaseElement be, String fieldName) { private Optional<ExtensionAttribute> getFieldExtensionElement(BaseElement be, String fieldName) {
return be.getExtensionElements().getOrDefault("field", Collections.emptyList()) return be.getExtensionElements().getOrDefault("field", Collections.emptyList())
.stream() .stream()
......
...@@ -98,13 +98,26 @@ UICtrl.useUIElementPermission = function ($doc) { ...@@ -98,13 +98,26 @@ UICtrl.useUIElementPermission = function ($doc) {
// 获取不同类别权限字段 // 获取不同类别权限字段
// kindId 0:主集 ,1:子集 ,2:按钮 {FIELD:'0',DETAIL:'1',BUTTON:'2'} // kindId 0:主集 ,1:子集 ,2:按钮 {FIELD:'0',DETAIL:'1',BUTTON:'2'}
UICtrl.getUIElementPermissions = function (operationId, kindId) { UICtrl.getUIElementPermissions = function (operationId, kindId, gridId) {
var result = [], permission = window['UIElementPermission'] || {}; var result = [], permission = window['UIElementPermission'] || {};
$.each(permission, function (p, o) { $.each(permission, function (p, o) {
if (o.operationId == operationId && o.kindId == kindId) { if (o.operationId == operationId && o.kindId == kindId) {
result.push(p); result.push(p);
} }
}); });
// 针对自定义表单做特别处理
if (gridId) {
_.each(_.pairs(permission), function (kv) {
var permission = kv[1];
if (permission.operationId == operationId && permission.kindId == kindId && /([a-zA-Z0-9_]+)\.([a-zA-Z0-9_]+)/.test(kv[0])) {
var tableName = RegExp.$1;
if (tableName + 'Grid' == gridId) {
var fieldName = RegExp.$2;
result.push(fieldName)
}
}
});
}
return result; return result;
}; };
...@@ -172,11 +185,11 @@ UICtrl.checkButtonNoAccess = function (id, gridId) { ...@@ -172,11 +185,11 @@ UICtrl.checkButtonNoAccess = function (id, gridId) {
UICtrl.disposeGridPermissionField = function (options, gridId) { UICtrl.disposeGridPermissionField = function (options, gridId) {
options = options || {}; options = options || {};
// 取子集中只读字段 // 取子集中只读字段
var readOnlyList = UICtrl.getUIElementPermissions(UIPO.READONLY, UIPK.DETAIL); var readOnlyList = UICtrl.getUIElementPermissions(UIPO.READONLY, UIPK.DETAIL, gridId);
// 取子集中无访问权限字段 // 取子集中无访问权限字段
var noAccessList = UICtrl.getUIElementPermissions(UIPO.NOACCESS, UIPK.DETAIL); var noAccessList = UICtrl.getUIElementPermissions(UIPO.NOACCESS, UIPK.DETAIL, gridId);
// 取子集中有读写权限字段 // 取子集中有读写权限字段
var readwriteList = UICtrl.getUIElementPermissions(UIPO.READWRITE, UIPK.DETAIL); var readwriteList = UICtrl.getUIElementPermissions(UIPO.READWRITE, UIPK.DETAIL, gridId);
var columns = options['columns']; var columns = options['columns'];
if (options.enabledEdit === true) { if (options.enabledEdit === true) {
if (Public.isReadOnly) {// 只读模式不添加事件 if (Public.isReadOnly) {// 只读模式不添加事件
......
...@@ -5040,7 +5040,7 @@ PropertyPanel.prototype.init = function () { ...@@ -5040,7 +5040,7 @@ PropertyPanel.prototype.init = function () {
for (var i = 0; i < formParameters.length; i++) { for (var i = 0; i < formParameters.length; i++) {
var formParameter = formParameters[i]; var formParameter = formParameters[i];
var html = ['<div class="hg-form-row">']; var html = ['<div class="hg-form-row">'];
html.push('<div class="col-xs-4 col-sm-4"><label class="hg-form-label">' + formParameter.attrName + '</label></div>'); html.push('<div class="col-xs-4 col-sm-4"><label class="hg-form-label"><b>' + formParameter.attrName + '</b>[' + formParameter.tableLabel + ']' + '</label></div>');
html.push('<div class="col-xs-8 col-white-bg col-sm-8">') html.push('<div class="col-xs-8 col-white-bg col-sm-8">')
html.push('<input type="checkbox" name="' + formParameter.attrCode + '" value="readwrite" id="' + formParameter.attrCode + '_readwrite"><label for="' + formParameter.parmCode + '_readwrite" style="margin:0 5px 0 5px">读写</label>'); html.push('<input type="checkbox" name="' + formParameter.attrCode + '" value="readwrite" id="' + formParameter.attrCode + '_readwrite"><label for="' + formParameter.parmCode + '_readwrite" style="margin:0 5px 0 5px">读写</label>');
html.push('<input type="checkbox" name="' + formParameter.attrCode + '" value="readonly" id="' + formParameter.attrCode + '_readonly"><label for="' + formParameter.parmCode + '_readonly" style="margin:0 5px 0 5px">只读</label>'); html.push('<input type="checkbox" name="' + formParameter.attrCode + '" value="readonly" id="' + formParameter.attrCode + '_readonly"><label for="' + formParameter.parmCode + '_readonly" style="margin:0 5px 0 5px">只读</label>');
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
<link href='${parameters.webApp?default("")?html}/themes/css/style.css?v=20181010' rel='stylesheet' type='text/css'/> <link href='${parameters.webApp?default("")?html}/themes/css/style.css?v=20181010' rel='stylesheet' type='text/css'/>
<link href='${parameters.webApp?default("")?html}/themes/css/ui.css?v=20181009' rel='stylesheet' type='text/css'/> <link href='${parameters.webApp?default("")?html}/themes/css/ui.css?v=20181009' rel='stylesheet' type='text/css'/>
<#-- <script src='${parameters.webApp?default("")?html}/javaScript/WEB_APP.js' type='text/javascript'></script>--> <#-- <script src='${parameters.webApp?default("")?html}/javaScript/WEB_APP.js' type='text/javascript'></script>-->
<script src='${parameters.webApp?default("")?html}/lib/underscore-min.js' type='text/javascript'></script>
<script src='${parameters.webApp?default("")?html}/lib/jquery/jquery.min.js' type='text/javascript'></script> <script src='${parameters.webApp?default("")?html}/lib/jquery/jquery.min.js' type='text/javascript'></script>
<script src='${parameters.webApp?default("")?html}/lib/jquery/jquery.json-2.4.min.js' type='text/javascript'></script> <script src='${parameters.webApp?default("")?html}/lib/jquery/jquery.json-2.4.min.js' type='text/javascript'></script>
<script src='${parameters.webApp?default("")?html}/lib/jquery/jquery.i18n.properties.js' type='text/javascript'></script> <script src='${parameters.webApp?default("")?html}/lib/jquery/jquery.i18n.properties.js' type='text/javascript'></script>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment