Browse Source

feat(role): 添加角色按钮权限配置功能

- 在IRoleFormButtonService中新增listAllFormButtons方法用于分页查询所有在线表单下的按钮
- 为OnlineForm实体类添加pageIdSet字段支持页面ID集合查询
- 在OnlineFormMapper.xml中添加pageIdSet过滤条件支持
- 扩展OnlinePageService新增queryByEnableList方法查询启用的在线表单页面
- 在RoleFormButtonController中新增listAllFormButtons接口提供表单按钮列表查询
- 在RoleFormButtonServiceImpl中实现完整的表单按钮权限配置逻辑
- 修改SysRoleController在角色新增和更新时支持按钮权限配置参数
- 添加按钮权限配置的批量保存功能到角色管理流程中
feature/form-permission-control
chenchuchuan 3 weeks ago
parent
commit
cb1b2dd9c3
  1. 19
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/tenant/controller/RoleFormButtonController.java
  2. 10
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/tenant/service/IRoleFormButtonService.java
  3. 53
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/tenant/service/impl/RoleFormButtonServiceImpl.java
  4. 22
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysRoleController.java
  5. 6
      common/common-online/src/main/java/apelet/common/online/dao/mapper/OnlineFormMapper.xml
  6. 7
      common/common-online/src/main/java/apelet/common/online/model/OnlineForm.java
  7. 7
      common/common-online/src/main/java/apelet/common/online/service/OnlinePageService.java
  8. 5
      common/common-online/src/main/java/apelet/common/online/service/impl/OnlinePageServiceImpl.java

19
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/tenant/controller/RoleFormButtonController.java

@ -87,6 +87,25 @@ public class RoleFormButtonController {
} }
/** /**
* 分页查询所有在线表单下的所有按钮
* 遍历全部在线表单从每个表单的 widgetJson 中提取已开启的按钮
*
* @param orderParam 排序参数
* @param pageParam 分页参数
* @return 分页结果每个元素包含 formId, formName, buttonList[{name, checked}]
*/
@PostMapping("/listAllFormButtons")
public ResponseResult<MyPageData<?>> listAllFormButtons(
@MyRequestBody MyOrderParam orderParam,
@MyRequestBody MyPageParam pageParam) {
if (pageParam != null) {
PageMethod.startPage(pageParam.getPageNum(), pageParam.getPageSize());
}
List<Map<String, Object>> result = service.listAllFormButtons(orderParam);
return ResponseResult.success(MyPageUtil.makeResponseData(result));
}
/**
* 分页查询按钮权限配置列表 * 分页查询按钮权限配置列表
*/ */
@PostMapping("/list") @PostMapping("/list")

10
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/tenant/service/IRoleFormButtonService.java

@ -2,6 +2,7 @@ package apelet.tenantadmin.tenant.service;
import apelet.common.core.base.service.IBaseService; import apelet.common.core.base.service.IBaseService;
import apelet.common.core.object.CallResult; import apelet.common.core.object.CallResult;
import apelet.common.core.object.MyOrderParam;
import apelet.tenantadmin.tenant.dto.RoleFormButtonDto; import apelet.tenantadmin.tenant.dto.RoleFormButtonDto;
import apelet.tenantadmin.tenant.model.RoleFormButton; import apelet.tenantadmin.tenant.model.RoleFormButton;
@ -66,4 +67,13 @@ public interface IRoleFormButtonService
* 删除角色下绑定的所有按钮权限配置角色删除时调用 * 删除角色下绑定的所有按钮权限配置角色删除时调用
*/ */
void removeByRoleId(Long roleId); void removeByRoleId(Long roleId);
/**
* 分页查询所有在线表单下的所有按钮
* 遍历全部在线表单从每个表单的 widgetJson 中提取已开启的按钮
*
* @param orderParam 排序参数
* @return 分页结果每个元素包含 formId, formName, buttonList[{name, checked}]
*/
List<Map<String, Object>> listAllFormButtons(MyOrderParam orderParam);
} }

53
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/tenant/service/impl/RoleFormButtonServiceImpl.java

@ -3,22 +3,29 @@ package apelet.tenantadmin.tenant.service.impl;
import apelet.common.core.base.dao.BaseDaoMapper; import apelet.common.core.base.dao.BaseDaoMapper;
import apelet.common.core.base.service.BaseService; import apelet.common.core.base.service.BaseService;
import apelet.common.core.object.CallResult; import apelet.common.core.object.CallResult;
import apelet.common.core.object.MyOrderParam;
import apelet.common.online.model.OnlineForm; import apelet.common.online.model.OnlineForm;
import apelet.common.online.model.OnlinePage;
import apelet.common.online.service.OnlineFormService; import apelet.common.online.service.OnlineFormService;
import apelet.common.online.service.OnlinePageService;
import apelet.common.sequence.wrapper.IdGeneratorWrapper; import apelet.common.sequence.wrapper.IdGeneratorWrapper;
import apelet.tenantadmin.tenant.dao.RoleFormButtonMapper; import apelet.tenantadmin.tenant.dao.RoleFormButtonMapper;
import apelet.tenantadmin.tenant.dto.RoleFormButtonDto; import apelet.tenantadmin.tenant.dto.RoleFormButtonDto;
import apelet.tenantadmin.tenant.model.RoleFormButton; import apelet.tenantadmin.tenant.model.RoleFormButton;
import apelet.tenantadmin.tenant.service.IRoleFormButtonService; import apelet.tenantadmin.tenant.service.IRoleFormButtonService;
import apelet.tenantadmin.tenant.util.WidgetJsonButtonParser; import apelet.tenantadmin.tenant.util.WidgetJsonButtonParser;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
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 org.springframework.util.CollectionUtils;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* 角色-表单按钮权限配置服务实现 * 角色-表单按钮权限配置服务实现
@ -28,9 +35,7 @@ import java.util.*;
*/ */
@Service @Service
@Slf4j @Slf4j
public class RoleFormButtonServiceImpl public class RoleFormButtonServiceImpl extends BaseService<RoleFormButton, Long> implements IRoleFormButtonService {
extends BaseService<RoleFormButton, Long>
implements IRoleFormButtonService {
@Autowired @Autowired
private RoleFormButtonMapper mapper; private RoleFormButtonMapper mapper;
@ -41,6 +46,9 @@ public class RoleFormButtonServiceImpl
@Autowired @Autowired
private OnlineFormService onlineFormService; private OnlineFormService onlineFormService;
@Autowired
private OnlinePageService onlinePageService;
@Override @Override
protected BaseDaoMapper<RoleFormButton> mapper() { protected BaseDaoMapper<RoleFormButton> mapper() {
return mapper; return mapper;
@ -179,4 +187,43 @@ public class RoleFormButtonServiceImpl
qw.eq(RoleFormButton::getRoleId, roleId); qw.eq(RoleFormButton::getRoleId, roleId);
this.remove(qw); this.remove(qw);
} }
private static @NotNull Map<String, Object> getButtonResult(OnlineForm form, List<WidgetJsonButtonParser.ButtonInfo> buttons) {
Map<String, Object> item = new HashMap<>();
item.put("formId", form.getFormId());
item.put("formName", form.getFormName());
List<Map<String, Object>> buttonList = new ArrayList<>();
if (!CollectionUtils.isEmpty(buttons)) {
for (WidgetJsonButtonParser.ButtonInfo btn : buttons) {
Map<String, Object> btnMap = new HashMap<>();
btnMap.put("name", btn.getName());
btnMap.put("checked", false);
buttonList.add(btnMap);
}
}
item.put("buttonList", buttonList);
return item;
}
@Override
public List<Map<String, Object>> listAllFormButtons(MyOrderParam orderParam) {
// 查询已发布的 page
List<OnlinePage> pageList = onlinePageService.queryByEnableList();
if (CollectionUtil.isEmpty(pageList)) {
return Collections.emptyList();
}
Set<Long> pageIdSet = pageList.stream().map(OnlinePage::getPageId).collect(Collectors.toSet());
// 分页查询在线表单
String orderBy = MyOrderParam.buildOrderBy(orderParam, OnlineForm.class);
OnlineForm onlineForm = new OnlineForm();
onlineForm.setPageIdSet(pageIdSet);
List<OnlineForm> formList = onlineFormService.getOnlineFormList(null, orderBy);
List<Map<String, Object>> result = new ArrayList<>();
for (OnlineForm form : formList) {
List<WidgetJsonButtonParser.ButtonInfo> buttons =
WidgetJsonButtonParser.extractEnabledButtons(form.getWidgetJson());
result.add(getButtonResult(form, buttons));
}
return result;
}
} }

22
application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/upms/controller/SysRoleController.java

@ -9,6 +9,8 @@ import apelet.common.core.util.MyPageUtil;
import apelet.common.core.validator.UpdateGroup; import apelet.common.core.validator.UpdateGroup;
import apelet.common.log.annotation.OperationLog; import apelet.common.log.annotation.OperationLog;
import apelet.common.log.model.constant.SysOperationLogType; import apelet.common.log.model.constant.SysOperationLogType;
import apelet.tenantadmin.tenant.dto.RoleFormButtonDto;
import apelet.tenantadmin.tenant.service.IRoleFormButtonService;
import apelet.tenantadmin.upms.dto.SysRoleDto; import apelet.tenantadmin.upms.dto.SysRoleDto;
import apelet.tenantadmin.upms.dto.SysUserDto; import apelet.tenantadmin.upms.dto.SysUserDto;
import apelet.tenantadmin.upms.model.SysRole; import apelet.tenantadmin.upms.model.SysRole;
@ -49,6 +51,8 @@ public class SysRoleController {
private SysRoleService sysRoleService; private SysRoleService sysRoleService;
@Autowired @Autowired
private SysUserService sysUserService; private SysUserService sysUserService;
@Autowired
private IRoleFormButtonService roleFormButtonService;
/** /**
* 新增角色操作 * 新增角色操作
@ -56,6 +60,7 @@ public class SysRoleController {
* @param sysRoleDto 新增角色对象 * @param sysRoleDto 新增角色对象
* @param menuIdListString 与当前角色Id绑定的menuId列表多个menuId之间逗号分隔 * @param menuIdListString 与当前角色Id绑定的menuId列表多个menuId之间逗号分隔
* @param deptId 组织Id可选 * @param deptId 组织Id可选
* @param buttonConfigList 按钮权限配置列表可选不传不影响原有逻辑
* @return 应答结果对象包含新增角色的主键Id * @return 应答结果对象包含新增角色的主键Id
*/ */
@ApiOperationSupport(ignoreParameters = {"sysRoleDto.roleId", "sysRoleDto.createTimeStart", "sysRoleDto.createTimeEnd"}) @ApiOperationSupport(ignoreParameters = {"sysRoleDto.roleId", "sysRoleDto.createTimeStart", "sysRoleDto.createTimeEnd"})
@ -64,7 +69,8 @@ public class SysRoleController {
public ResponseResult<Long> add( public ResponseResult<Long> add(
@MyRequestBody SysRoleDto sysRoleDto, @MyRequestBody SysRoleDto sysRoleDto,
@MyRequestBody String menuIdListString, @MyRequestBody String menuIdListString,
@MyRequestBody Long deptId) { @MyRequestBody Long deptId,
@MyRequestBody List<RoleFormButtonDto> buttonConfigList) {
String errorMessage = MyCommonUtil.getModelValidationError(sysRoleDto); String errorMessage = MyCommonUtil.getModelValidationError(sysRoleDto);
if (errorMessage != null) { if (errorMessage != null) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage); return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
@ -79,6 +85,11 @@ public class SysRoleController {
menuIdSet = result.getData().getObject("menuIdSet", new TypeReference<Set<Long>>(){}); menuIdSet = result.getData().getObject("menuIdSet", new TypeReference<Set<Long>>(){});
} }
sysRoleService.saveNew(sysRole, menuIdSet, deptId); sysRoleService.saveNew(sysRole, menuIdSet, deptId);
// 按钮权限配置(可选,不传不影响原有逻辑)
if (buttonConfigList != null && !buttonConfigList.isEmpty()) {
buttonConfigList.forEach(dto -> dto.setRoleId(sysRole.getRoleId()));
roleFormButtonService.batchSaveButtonConfig(buttonConfigList);
}
return ResponseResult.success(sysRole.getRoleId()); return ResponseResult.success(sysRole.getRoleId());
} }
@ -88,6 +99,7 @@ public class SysRoleController {
* @param sysRoleDto 更新角色对象 * @param sysRoleDto 更新角色对象
* @param menuIdListString 与当前角色Id绑定的menuId列表多个menuId之间逗号分隔 * @param menuIdListString 与当前角色Id绑定的menuId列表多个menuId之间逗号分隔
* @param deptId 组织Id可选 * @param deptId 组织Id可选
* @param buttonConfigList 按钮权限配置列表可选不传不影响原有逻辑
* @return 应答结果对象 * @return 应答结果对象
*/ */
@OperationLog(type = SysOperationLogType.UPDATE) @OperationLog(type = SysOperationLogType.UPDATE)
@ -95,7 +107,8 @@ public class SysRoleController {
public ResponseResult<Void> update( public ResponseResult<Void> update(
@MyRequestBody SysRoleDto sysRoleDto, @MyRequestBody SysRoleDto sysRoleDto,
@MyRequestBody String menuIdListString, @MyRequestBody String menuIdListString,
@MyRequestBody Long deptId) { @MyRequestBody Long deptId,
@MyRequestBody List<RoleFormButtonDto> buttonConfigList) {
String errorMessage = MyCommonUtil.getModelValidationError(sysRoleDto, Default.class, UpdateGroup.class); String errorMessage = MyCommonUtil.getModelValidationError(sysRoleDto, Default.class, UpdateGroup.class);
if (errorMessage != null) { if (errorMessage != null) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage); return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
@ -118,6 +131,11 @@ public class SysRoleController {
errorMessage = "更新失败,数据不存在,请刷新后重试!"; errorMessage = "更新失败,数据不存在,请刷新后重试!";
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage); return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
} }
// 按钮权限配置(可选,不传不影响原有逻辑)
if (buttonConfigList != null && !buttonConfigList.isEmpty()) {
buttonConfigList.forEach(dto -> dto.setRoleId(sysRole.getRoleId()));
roleFormButtonService.batchSaveButtonConfig(buttonConfigList);
}
return ResponseResult.success(); return ResponseResult.success();
} }

6
common/common-online/src/main/java/apelet/common/online/dao/mapper/OnlineFormMapper.xml

@ -56,6 +56,12 @@
<if test="onlineFormFilter.masterTableId != null"> <if test="onlineFormFilter.masterTableId != null">
AND zz_online_form.master_table_id = #{onlineFormFilter.masterTableId} AND zz_online_form.master_table_id = #{onlineFormFilter.masterTableId}
</if> </if>
<if test="onlineFormFilter.pageIdSet != null">
AND zz_online_form.page_id IN
<foreach collection="onlineFormFilter.pageIdSet" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</if>
</if> </if>
</sql> </sql>

7
common/common-online/src/main/java/apelet/common/online/model/OnlineForm.java

@ -16,6 +16,7 @@ import org.mapstruct.factory.Mappers;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* 在线表单实体对象 * 在线表单实体对象
@ -139,6 +140,12 @@ public class OnlineForm {
@TableField(exist = false) @TableField(exist = false)
private Map<String, Object> formTypeDictMap; private Map<String, Object> formTypeDictMap;
/**
* 页面id集合
*/
@TableField(exist = false)
private Set<Long> pageIdSet;
@Mapper @Mapper
public interface OnlineFormModelMapper extends BaseModelMapper<OnlineFormVo, OnlineForm> { public interface OnlineFormModelMapper extends BaseModelMapper<OnlineFormVo, OnlineForm> {
/** /**

7
common/common-online/src/main/java/apelet/common/online/service/OnlinePageService.java

@ -135,4 +135,11 @@ public interface OnlinePageService extends IBaseService<OnlinePage, Long> {
* @return 在线表单页面列表 * @return 在线表单页面列表
*/ */
List<OnlinePage> getInListWithNonTenant(List<Long> pageIds, String orderBy); List<OnlinePage> getInListWithNonTenant(List<Long> pageIds, String orderBy);
/**
* 查询启用的在线表单页面列表
*
* @return 在线表单页面列表
*/
List<OnlinePage> queryByEnableList();
} }

5
common/common-online/src/main/java/apelet/common/online/service/impl/OnlinePageServiceImpl.java

@ -296,4 +296,9 @@ public class OnlinePageServiceImpl extends BaseService<OnlinePage, Long> impleme
} }
return onlinePageMapper.selectList(queryWrapper); return onlinePageMapper.selectList(queryWrapper);
} }
@Override
public List<OnlinePage> queryByEnableList() {
return onlinePageMapper.selectList(new LambdaQueryWrapper<OnlinePage>().eq(OnlinePage::getPublished, true));
}
} }

Loading…
Cancel
Save