fix(cms): 修复网站设置查询自愈和孤儿记录复活问题
- 去除无用的 LambdaQueryWrapper 导入,改用自定义 Mapper 方法查询 - 新增 CmsWebsiteSettingMapper 的 selectByWebsiteIdIgnoreLogic 方法,忽略逻辑删除过滤查询 - 新增 reviveById 方法,实现孤儿记录(deleted 非0或null)复活为正常状态 - 修改控制器 get 方法,优先使用自定义查询,避免因逻辑删除导致查询不到 - 对查询到的已删除或孤儿记录进行复活处理,保持数据唯一约束不冲突 - 新建记录时显式设置 deleted=0,保证逻辑删除查询正常返回
This commit is contained in:
@@ -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<PageResult<CmsWebsiteSetting>> page(CmsWebsiteSettingParam param) {
|
||||
@@ -47,17 +50,23 @@ public class CmsWebsiteSettingController extends BaseController {
|
||||
@Operation(summary = "根据id查询网站设置")
|
||||
@GetMapping("/{id}")
|
||||
public ApiResult<CmsWebsiteSetting> get(@PathVariable("id") Integer id) {
|
||||
final CmsWebsiteSetting cmsWebsiteSetting = cmsWebsiteSettingService.getOne(new LambdaQueryWrapper<CmsWebsiteSetting>().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')")
|
||||
|
||||
@@ -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<CmsWebsiteSetting> {
|
||||
*/
|
||||
List<CmsWebsiteSetting> 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);
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user