From d498f9f3cd76cf6d079e6329185dc872419266e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Tue, 4 Aug 2026 23:54:07 +0800 Subject: [PATCH] =?UTF-8?q?fix(cms):=20=E4=BF=AE=E5=A4=8D=E7=BD=91?= =?UTF-8?q?=E7=AB=99=E8=AE=BE=E7=BD=AE=E6=9F=A5=E8=AF=A2=E8=87=AA=E6=84=88?= =?UTF-8?q?=E5=92=8C=E5=AD=A4=E5=84=BF=E8=AE=B0=E5=BD=95=E5=A4=8D=E6=B4=BB?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 去除无用的 LambdaQueryWrapper 导入,改用自定义 Mapper 方法查询 - 新增 CmsWebsiteSettingMapper 的 selectByWebsiteIdIgnoreLogic 方法,忽略逻辑删除过滤查询 - 新增 reviveById 方法,实现孤儿记录(deleted 非0或null)复活为正常状态 - 修改控制器 get 方法,优先使用自定义查询,避免因逻辑删除导致查询不到 - 对查询到的已删除或孤儿记录进行复活处理,保持数据唯一约束不冲突 - 新建记录时显式设置 deleted=0,保证逻辑删除查询正常返回 --- .../CmsWebsiteSettingController.java | 21 +++++++++++++------ .../cms/mapper/CmsWebsiteSettingMapper.java | 18 ++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gxwebsoft/cms/controller/CmsWebsiteSettingController.java b/src/main/java/com/gxwebsoft/cms/controller/CmsWebsiteSettingController.java index 27d19d5..22a53d8 100644 --- a/src/main/java/com/gxwebsoft/cms/controller/CmsWebsiteSettingController.java +++ b/src/main/java/com/gxwebsoft/cms/controller/CmsWebsiteSettingController.java @@ -1,7 +1,6 @@ package com.gxwebsoft.cms.controller; import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.cms.service.CmsWebsiteSettingService; import com.gxwebsoft.cms.entity.CmsWebsiteSetting; @@ -9,6 +8,7 @@ import com.gxwebsoft.cms.param.CmsWebsiteSettingParam; import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.common.core.web.BatchParam; +import com.gxwebsoft.cms.mapper.CmsWebsiteSettingMapper; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import org.springframework.security.access.prepost.PreAuthorize; @@ -30,6 +30,9 @@ public class CmsWebsiteSettingController extends BaseController { @Resource private CmsWebsiteSettingService cmsWebsiteSettingService; + @Resource + private CmsWebsiteSettingMapper cmsWebsiteSettingMapper; + @Operation(summary = "分页查询网站设置") @GetMapping("/page") public ApiResult> page(CmsWebsiteSettingParam param) { @@ -47,17 +50,23 @@ public class CmsWebsiteSettingController extends BaseController { @Operation(summary = "根据id查询网站设置") @GetMapping("/{id}") public ApiResult get(@PathVariable("id") Integer id) { - final CmsWebsiteSetting cmsWebsiteSetting = cmsWebsiteSettingService.getOne(new LambdaQueryWrapper().eq(CmsWebsiteSetting::getWebsiteId, id)); - if(ObjectUtil.isEmpty(cmsWebsiteSetting)){ - // 记录不存在时自动建一条空记录,便于前端回填 id 后走 updateById 保存。 - // 必须显式 setDeleted(0),否则 @TableLogic 查询默认补 deleted=0 会查不到刚插入的 null 记录。 + // 自定义查询忽略逻辑删除:能捞到 deleted IS NULL 的孤儿记录(旧逻辑遗留), + // 避免“查不到→新建”时撞 website_id 唯一索引,导致前端报“未获取到网站设置记录”。 + final CmsWebsiteSetting existing = cmsWebsiteSettingMapper.selectByWebsiteIdIgnoreLogic(id); + if (ObjectUtil.isEmpty(existing)) { + // 真正没有记录才新建,并显式 setDeleted(0),避免被 @TableLogic 查询过滤。 final CmsWebsiteSetting setting = new CmsWebsiteSetting(); setting.setWebsiteId(id); setting.setDeleted(0); cmsWebsiteSettingService.save(setting); return success(setting); } - return success(cmsWebsiteSetting); + // 查到的是孤儿/已删除记录:复活为正常态(deleted=0)后返回,不再重复插入。 + if (existing.getDeleted() == null || existing.getDeleted() != 0) { + cmsWebsiteSettingMapper.reviveById(existing.getId()); + existing.setDeleted(0); + } + return success(existing); } @PreAuthorize("hasAuthority('cms:website:save')") diff --git a/src/main/java/com/gxwebsoft/cms/mapper/CmsWebsiteSettingMapper.java b/src/main/java/com/gxwebsoft/cms/mapper/CmsWebsiteSettingMapper.java index dc468fd..8a167d4 100644 --- a/src/main/java/com/gxwebsoft/cms/mapper/CmsWebsiteSettingMapper.java +++ b/src/main/java/com/gxwebsoft/cms/mapper/CmsWebsiteSettingMapper.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.gxwebsoft.cms.entity.CmsWebsiteSetting; import com.gxwebsoft.cms.param.CmsWebsiteSettingParam; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; import java.util.List; @@ -34,4 +36,20 @@ public interface CmsWebsiteSettingMapper extends BaseMapper { */ List selectListRel(@Param("param") CmsWebsiteSettingParam param); + /** + * 忽略逻辑删除,按 websiteId 查最新一条记录。 + * 用于「根据id查询」自愈:能捞到 deleted IS NULL 的孤儿记录(旧逻辑遗留), + * 避免 MP 自带 getOne 因补 deleted=0 而查不到、继而新建时撞 website_id 唯一索引。 + * 注意:自定义 @Select 不被 @TableLogic 自动追加 deleted 过滤(与本项目 XML 自定义查询一致)。 + */ + @Select("SELECT * FROM cms_website_setting WHERE website_id = #{websiteId} ORDER BY id ASC LIMIT 1") + CmsWebsiteSetting selectByWebsiteIdIgnoreLogic(@Param("websiteId") Integer websiteId); + + /** + * 将指定记录复活为正常态(deleted=0)。 + * 自定义 @Update 不受 @TableLogic 改写,可修正孤儿记录而不被 WHERE deleted=0 拦截。 + */ + @Update("UPDATE cms_website_setting SET deleted = 0 WHERE id = #{id}") + void reviveById(@Param("id") Integer id); + }