Browse Source

fix(button): 解决按钮配置接口权限和空值处理问题

- 为 getButtonConfig 接口添加 @NoAuthInterface 注解以允许匿名访问
- 在 getButtonConfigVo 方法中添加异常捕获机制防止运行时错误
- 实现 buildEmptyResultForAllForms 方法构建完整的表单ID键列表
- 当用户无角色权限时返回所有已发布在线表单的空按钮配置
- 确保前端能够获取完整的 formId 列表而不会因权限问题缺失数据
feature/2026-07-ccc-dev
chenchuchuan 1 week ago
parent
commit
e8e7cbd588
  1. 2
      common/common-online/src/main/java/apelet/common/online/controller/RoleFormButtonController.java
  2. 61
      common/common-online/src/main/java/apelet/common/online/service/impl/RoleFormButtonServiceImpl.java

2
common/common-online/src/main/java/apelet/common/online/controller/RoleFormButtonController.java

@ -1,6 +1,7 @@ @@ -1,6 +1,7 @@
package apelet.common.online.controller;
import apelet.common.core.annotation.MyRequestBody;
import apelet.common.core.annotation.NoAuthInterface;
import apelet.common.core.constant.ErrorCodeEnum;
import apelet.common.core.object.*;
import apelet.common.core.util.MyCommonUtil;
@ -39,6 +40,7 @@ public class RoleFormButtonController { @@ -39,6 +40,7 @@ public class RoleFormButtonController {
* @return 包含 formId, buttonList[{name, checked}]
*/
@GetMapping("/getButtonConfig")
@NoAuthInterface
public ResponseResult<Map<String, Set<String>>> getButtonConfig(@RequestParam(required = false) Long formId) {
return ResponseResult.success(service.getButtonConfigVo(formId));
}

61
common/common-online/src/main/java/apelet/common/online/service/impl/RoleFormButtonServiceImpl.java

@ -66,27 +66,32 @@ public class RoleFormButtonServiceImpl extends BaseService<RoleFormButton, Long> @@ -66,27 +66,32 @@ public class RoleFormButtonServiceImpl extends BaseService<RoleFormButton, Long>
// ========== 核心:查询按钮配置VO(合并当前用户所有角色) ==========
@Override
public Map<String, Set<String>> getButtonConfigVo(Long formId) {
// 1. 获取当前登录用户的所有角色
Set<Long> roleIds = getCurrentUserRoleIds();
try {
// 1. 获取当前登录用户的所有角色
Set<Long> roleIds = getCurrentUserRoleIds();
// Set<Long> roleIds = CollectionUtil.newHashSet(2080534691714174976L, 1694263314487447643L);
if (CollectionUtil.isEmpty(roleIds)) {
return Collections.emptyMap();
}
List<RoleFormButton> roleFormButtonList = mapper.selectList(new LambdaQueryWrapper<RoleFormButton>().in(RoleFormButton::getRoleId, roleIds));
if (CollectionUtil.isEmpty(roleFormButtonList)) {
return Collections.emptyMap();
}
// 2. 遍历所有角色,合并各角色在该表单的勾选按钮(取并集)
Map<String, Set<String>> roleCheckedNamesMap = new HashMap<>();
for (RoleFormButton roleFormButton : roleFormButtonList) {
if (StringUtils.isBlank(roleFormButton.getButtonConfig())) {
continue;
if (CollectionUtil.isEmpty(roleIds)) {
return buildEmptyResultForAllForms();
}
List<RoleFormButton> roleFormButtonList = mapper.selectList(new LambdaQueryWrapper<RoleFormButton>().in(RoleFormButton::getRoleId, roleIds));
if (CollectionUtil.isEmpty(roleFormButtonList)) {
return buildEmptyResultForAllForms();
}
// 2. 遍历所有角色,合并各角色在该表单的勾选按钮(取并集)
Map<String, Set<String>> roleCheckedNamesMap = new HashMap<>();
for (RoleFormButton roleFormButton : roleFormButtonList) {
if (StringUtils.isBlank(roleFormButton.getButtonConfig())) {
continue;
}
List<WidgetJsonButtonParser.ButtonInfo> buttonInfoList = JSON.parseArray(roleFormButton.getButtonConfig(), WidgetJsonButtonParser.ButtonInfo.class);
Set<String> checkedNames = buttonInfoList.stream().filter(btn -> btn.getEnabled() != null && btn.getEnabled()).map(WidgetJsonButtonParser.ButtonInfo::getName).collect(Collectors.toSet());
roleCheckedNamesMap.computeIfAbsent(Long.toString(roleFormButton.getFormId()), k -> new HashSet<>()).addAll(checkedNames);
}
List<WidgetJsonButtonParser.ButtonInfo> buttonInfoList = JSON.parseArray(roleFormButton.getButtonConfig(), WidgetJsonButtonParser.ButtonInfo.class);
Set<String> checkedNames = buttonInfoList.stream().filter(btn -> btn.getEnabled() != null && btn.getEnabled()).map(WidgetJsonButtonParser.ButtonInfo::getName).collect(Collectors.toSet());
roleCheckedNamesMap.computeIfAbsent(Long.toString(roleFormButton.getFormId()), k -> new HashSet<>()).addAll(checkedNames);
return roleCheckedNamesMap;
} catch (Exception e) {
log.error("获取按钮配置失败", e);
}
return roleCheckedNamesMap;
return buildEmptyResultForAllForms();
}
/**
@ -100,6 +105,26 @@ public class RoleFormButtonServiceImpl extends BaseService<RoleFormButton, Long> @@ -100,6 +105,26 @@ public class RoleFormButtonServiceImpl extends BaseService<RoleFormButton, Long>
return StrUtil.split(tokenData.getRoleIds(), ',').stream().map(Long::valueOf).collect(Collectors.toSet());
}
/**
* 构建空结果 Map查询所有已发布在线表单中有按钮的 formIdvalue 均为空 Set
* 确保前端在没有角色按钮权限配置时仍能拿到完整的 formId key 列表
*/
private Map<String, Set<String>> buildEmptyResultForAllForms() {
Map<String, Set<String>> result = new HashMap<>();
List<OnlinePage> pageList = onlinePageService.queryByEnableList();
if (CollectionUtil.isEmpty(pageList)) {
return result;
}
Set<Long> pageIdSet = pageList.stream().map(OnlinePage::getPageId).collect(Collectors.toSet());
OnlineForm filter = new OnlineForm();
filter.setPageIdSet(pageIdSet);
List<OnlineForm> formList = onlineFormService.getOnlineFormList(filter, null);
for (OnlineForm form : formList) {
result.put(form.getFormId().toString(), Collections.emptySet());
}
return result;
}
// ========== 核心:批量保存按钮配置(事务) ==========
@Override
@Transactional(rollbackFor = Exception.class)

Loading…
Cancel
Save