fix(cmsNavigation): 规范code字段并添加唯一性校验

- 规范化code字段,trim并转为小写以保证唯一性校验一致
- 添加栏目code租户内唯一性校验逻辑,避免重复冲突
- 保留空或空串code时不进行唯一性校验
- 修改与新增操作均调用唯一性校验函数
- 避免触发数据库唯一索引导致操作失败异常
This commit is contained in:
2026-08-03 20:29:33 +08:00
parent cf2a372ba4
commit ff432b82c0

View File

@@ -104,8 +104,14 @@ public class CmsNavigationController extends BaseController {
}
// 去除前面空格
cmsNavigation.setTitle(StrUtil.trimStart(cmsNavigation.getTitle()));
// code 规范化trim + 转小写(唯一性以规范化后的值为准)
if (cmsNavigation.getCode() != null) {
cmsNavigation.setCode(cmsNavigation.getCode().trim().toLowerCase());
}
// 单页模型绑定唯一性校验:同一租户下同一个单页只能绑定一个栏目
checkPageBindingUnique(cmsNavigation);
// 栏目 code 租户内唯一性校验code 为空/空串时不校验)
checkCodeUnique(cmsNavigation);
if (cmsNavigationService.save(cmsNavigation)) {
// 添加成功事务处理
cmsNavigationService.saveAsync(cmsNavigation);
@@ -119,8 +125,14 @@ public class CmsNavigationController extends BaseController {
@Operation(summary = "修改网站导航记录表")
@PutMapping()
public ApiResult<?> update(@RequestBody CmsNavigation cmsNavigation) {
// code 规范化trim + 转小写(唯一性以规范化后的值为准)
if (cmsNavigation.getCode() != null) {
cmsNavigation.setCode(cmsNavigation.getCode().trim().toLowerCase());
}
// 单页模型绑定唯一性校验:同一租户下同一个单页只能绑定一个栏目
checkPageBindingUnique(cmsNavigation);
// 栏目 code 租户内唯一性校验code 为空/空串时不校验)
checkCodeUnique(cmsNavigation);
// 顶级栏目parentId=0的显示位置top/bottom发生变更时
// 递归同步所有子级(含孙级)的 top/bottom保持层级一致。
if (cmsNavigation.getParentId() != null && cmsNavigation.getParentId() == 0
@@ -160,6 +172,27 @@ public class CmsNavigationController extends BaseController {
}
@PreAuthorize("hasAuthority('cms:cmsNavigation:update')")
/**
* 校验栏目 code 租户内唯一:同一租户下 code 不可重复code 为空/空串时不校验)。
* 与单页绑定唯一性校验并列,避免触发 uk_navigation_tenant_code 唯一索引导致用户看到"操作失败"。
*/
private void checkCodeUnique(CmsNavigation cmsNavigation) {
String code = cmsNavigation.getCode();
if (code == null || code.trim().isEmpty()) {
return;
}
LambdaQueryWrapper<CmsNavigation> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(CmsNavigation::getTenantId, getTenantId())
.eq(CmsNavigation::getCode, code.trim())
.eq(CmsNavigation::getDeleted, 0);
if (cmsNavigation.getNavigationId() != null) {
wrapper.ne(CmsNavigation::getNavigationId, cmsNavigation.getNavigationId());
}
if (cmsNavigationService.count(wrapper) > 0) {
throw new BusinessException("栏目 code「" + code.trim() + "」已存在,请更换");
}
}
@Operation(summary = "修改栏目状态")
@PutMapping("/status")
public ApiResult<?> updateStatus(@RequestBody Map<String, Object> body) {