From ee43cbeaa8bee2af8adf6a394907e3cd0868aa53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Wed, 8 Apr 2026 11:14:12 +0800 Subject: [PATCH 01/59] =?UTF-8?q?fix(=E8=B5=84=E6=BA=90=E5=AE=A1=E6=A0=B8)?= =?UTF-8?q?:=20=E4=B8=93=E5=8C=BA=E4=BC=9A=E5=91=98=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E7=9A=84=E5=BE=85=E5=AE=A1=E6=A0=B8=E8=B5=84=E6=BA=90=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E5=9C=A8=E4=BA=86=E8=B5=84=E6=BA=90=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题定位:公开接口获取资源列表时未筛选资源审核状态 --- .../zone/resource/domain/vo/ZoneResourceOpenSearchVo.java | 3 +++ .../src/main/resources/mapper/zone/ZoneResourceMapper.xml | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/domain/vo/ZoneResourceOpenSearchVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/domain/vo/ZoneResourceOpenSearchVo.java index 6d12c59e0..a95c4f6b9 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/domain/vo/ZoneResourceOpenSearchVo.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/domain/vo/ZoneResourceOpenSearchVo.java @@ -53,6 +53,9 @@ public class ZoneResourceOpenSearchVo extends BaseEntity { @ApiModelProperty(value = "是否根据下载次数降序排序(与orderByColumn互斥,该属性优先级更高)") private Boolean orderByDownloadCount = false; + @ApiModelProperty(value = "审核状态(0:待审核,1:审核通过 2:审核不通过)") + private String auditStatus; + public ZoneResource toZoneResource() { ZoneResource target = new ZoneResource(); BeanUtils.copyProperties(this, target); diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneResourceMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneResourceMapper.xml index e894836df..c667ee632 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneResourceMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneResourceMapper.xml @@ -156,6 +156,14 @@ and zr.id in (select resource_id from zone_resource_to_type where type_id=#{searchTypeId}) + + + and zr.audit_status = #{auditStatus} + + + and zr.audit_status = '1' + + ${params.dataScope} From 27bd86998c32b2a69b6a52e0bc7ee9946f18c112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Fri, 10 Apr 2026 10:31:26 +0800 Subject: [PATCH 02/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E5=89=8D=E5=8F=B0=E9=A1=B9=E7=9B=AE=E8=81=9A=E5=90=88?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增查询我的项目列表接口 2. 新增查询我的项目详情接口 3. 新增前台新增项目聚合接口 4. 新增前台编辑项目聚合接口 5. 新增前台删除项目聚合接口 --- .../common/controller/FrontController.java | 62 +++++++++++++++++++ .../domain/vo/ZoneProjectUpdateVo.java | 4 ++ .../project/service/IZoneProjectService.java | 25 ++++++++ .../service/impl/ZoneProjectServiceImpl.java | 49 +++++++++++++++ .../mapper/zone/ZoneProjectMapper.xml | 1 + 5 files changed, 141 insertions(+) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java index 33816d408..a893c8357 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java @@ -10,6 +10,11 @@ import com.microservices.common.security.annotation.RequiresPermissions; import com.microservices.common.security.utils.SecurityUtils; import com.microservices.zone.detail.domain.vo.ZoneFrontRoleVo; import com.microservices.zone.detail.service.IZoneDetailService; +import com.microservices.zone.project.domain.vo.ZoneProjectDataVo; +import com.microservices.zone.project.domain.vo.ZoneProjectInputVo; +import com.microservices.zone.project.domain.vo.ZoneProjectSearchVo; +import com.microservices.zone.project.domain.vo.ZoneProjectUpdateVo; +import com.microservices.zone.project.service.IZoneProjectService; import com.microservices.zone.resource.domain.ZoneResource; import com.microservices.zone.resource.domain.vo.ZoneResourceDataVo; import com.microservices.zone.resource.domain.vo.ZoneResourceInputVo; @@ -32,6 +37,9 @@ public class FrontController extends BaseController { @Autowired private IZoneResourceService zoneResourceService; + @Autowired + private IZoneProjectService zoneProjectService; + @Autowired private IZoneDetailService zoneDetailService; @@ -91,6 +99,60 @@ public class FrontController extends BaseController { return toAjax(zoneResourceService.deleteMyZoneResourceByIds(ids)); } + /** + * 查询我的项目列表 + */ + @RequiresPermissions("zone:front:project:myList") + @GetMapping("/myProjectList") + @ApiOperation(value = "查询我的项目列表") + public GenericsTableDataInfo myProjectList(ZoneProjectSearchVo zoneProjectSearchVo) { + zoneProjectSearchVo.setCreateBy(SecurityUtils.getUsername()); + return zoneProjectService.selectMyZoneProjectList(zoneProjectSearchVo); + } + + /** + * 查询我的项目详情 + */ + @RequiresPermissions("zone:front:project:query") + @GetMapping("/myProject/{id}") + @ApiOperation(value = "查询我的项目详情") + public GenericsAjaxResult myProject(@PathVariable("id") Long id) { + return genericsSuccess(zoneProjectService.selectZoneProjectDataById(id)); + } + + /** + * 新增项目 + */ + @RequiresPermissions("zone:front:project:add") + @Log(title = "专区前台项目操作", businessType = BusinessType.INSERT) + @PostMapping("/addProject") + @ApiOperation(value = "新增项目") + public AjaxResult addProject(@RequestBody ZoneProjectInputVo zoneProjectInputVo) { + return success(zoneProjectService.insertZoneProject(zoneProjectInputVo)); + } + + /** + * 编辑项目 + */ + @RequiresPermissions("zone:front:project:edit") + @Log(title = "专区前台项目操作", businessType = BusinessType.UPDATE) + @PutMapping("/editProject") + @ApiOperation(value = "编辑项目") + public AjaxResult editProject(@RequestBody ZoneProjectUpdateVo zoneProjectUpdateVo) { + return success(zoneProjectService.updateMyZoneProject(zoneProjectUpdateVo.getId(), zoneProjectUpdateVo)); + } + + /** + * 删除项目 + */ + @RequiresPermissions("zone:front:project:remove") + @Log(title = "专区前台项目操作", businessType = BusinessType.DELETE) + @DeleteMapping("/removeProject/{ids}") + @ApiOperation(value = "删除项目") + public AjaxResult removeProject(@PathVariable Long[] ids) { + return toAjax(zoneProjectService.deleteMyZoneProjectByIds(ids)); + } + /** * 检查当前登录用户在当前专区下角色 */ diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectUpdateVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectUpdateVo.java index 31eaa2814..01c987584 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectUpdateVo.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectUpdateVo.java @@ -14,6 +14,10 @@ import javax.validation.constraints.NotNull; @Data @ApiModel("项目聚合更新对象") public class ZoneProjectUpdateVo { + @ApiModelProperty(value = "项目Id", required = true) + @NotNull + private Long id; + @ApiModelProperty(value = "聚合项目类型") @NotNull private Long projectTypeId; diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/IZoneProjectService.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/IZoneProjectService.java index 7dce19372..6891173d8 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/IZoneProjectService.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/IZoneProjectService.java @@ -112,4 +112,29 @@ public interface IZoneProjectService { Integer selectHomepageCount(Long zoneId); List selectZoneProjectByScoreList(ZoneProjectSearchVo zoneProjectSearchVo, boolean isOpen); + + /** + * 查询我的项目列表 + * + * @param zoneProjectSearchVo 查询条件 + * @return 项目列表 + */ + GenericsTableDataInfo selectMyZoneProjectList(ZoneProjectSearchVo zoneProjectSearchVo); + + /** + * 批量删除我的项目(校验创建者) + * + * @param ids 需要删除的项目主键集合 + * @return 结果 + */ + int deleteMyZoneProjectByIds(Long[] ids); + + /** + * 修改我的项目(校验创建者) + * + * @param id 项目主键 + * @param zoneProjectUpdateVo 更新数据 + * @return 结果 + */ + int updateMyZoneProject(Long id, ZoneProjectUpdateVo zoneProjectUpdateVo); } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java index 9dc5da87b..81df66074 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java @@ -385,9 +385,17 @@ public class ZoneProjectServiceImpl implements IZoneProjectService { public int insertZoneProject(ZoneProjectInputVo zoneProjectInputVo) { ZoneDetail zoneDetail = zoneDetailService.selectZoneDetailById(zoneProjectInputVo.getZoneId()); zoneProjectTypeService.selectZoneProjectTypeByIdAndZoneId(zoneProjectInputVo.getProjectTypeId(), zoneProjectInputVo.getZoneId()); + ZoneProject existingProject = zoneProjectMapper.selectZoneProjectByGitLinkProjectIdAndZoneId( + zoneProjectInputVo.getGitlinkProjectId(), zoneProjectInputVo.getZoneId()); + if (existingProject != null) { + throw new ServiceException("该GitLink项目已存在于专区中,不可重复添加"); + } JSONObject gitLinkProject = getGitLinkProjectById(zoneProjectInputVo.getGitlinkProjectId()); ZoneProject zoneProject = zoneProjectInputVo.toZoneProject(); zoneProject.setCreateTime(DateUtils.getNowDate()); + if (StringUtils.isEmpty(zoneProject.getCreateBy())) { + zoneProject.setCreateBy(SecurityUtils.getUsername()); + } zoneProject.setDeptId(zoneDetail.getDeptId()); zoneProject.setDeptId(zoneDetail.getDeptId()); JSONObject author = gitLinkProject.getJSONObject("author"); @@ -633,6 +641,47 @@ public class ZoneProjectServiceImpl implements IZoneProjectService { return zoneProjectMapper.selectHomepageCount(zoneId); } + @Override + public GenericsTableDataInfo selectMyZoneProjectList(ZoneProjectSearchVo zoneProjectSearchVo) { + if (zoneProjectSearchVo == null || zoneProjectSearchVo.getZoneId() == null) { + throw new ServiceException("获取我的项目列表时必须传入专区Id"); + } + zoneDetailService.selectZoneDetailById(zoneProjectSearchVo.getZoneId()); + startPage(); + List zoneProjectList = zoneProjectMapper.selectZoneProjectList(zoneProjectSearchVo); + return PageUtils.toListPage(zoneProjectList, this::toZoneProjectDataVoList); + } + + @Override + public int deleteMyZoneProjectByIds(Long[] ids) { + for (Long id : ids) { + ZoneProject zoneProject = zoneProjectMapper.selectZoneProjectById(id); + if (zoneProject == null) { + throw new ServiceException("该项目不存在(项目Id[" + id + "])"); + } + if (!zoneProject.getCreateBy().equals(SecurityUtils.getUsername())) { + throw new ServiceException("仅允许删除自身创建的项目"); + } + } + int success = 0; + for (Long id : ids) { + success += deleteZoneProjectById(id); + } + return success; + } + + @Override + public int updateMyZoneProject(Long id, ZoneProjectUpdateVo zoneProjectUpdateVo) { + ZoneProject zoneProject = zoneProjectMapper.selectZoneProjectById(id); + if (zoneProject == null) { + throw new ServiceException("该项目不存在(项目Id[" + id + "])"); + } + if (!zoneProject.getCreateBy().equals(SecurityUtils.getUsername())) { + throw new ServiceException("仅允许编辑自身创建的项目"); + } + return updateZoneProject(id, zoneProjectUpdateVo); + } + @Override public List selectZoneProjectByScoreList(ZoneProjectSearchVo zoneProjectSearchVo, boolean isOpen) { if (zoneProjectSearchVo.getProjectTypeId() == null) { diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml index b735f8d6e..f2d13d1ad 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml @@ -114,6 +114,7 @@ and zp.project_type_id = #{projectTypeId} and zp.zone_id = #{zoneId} + and zp.create_by = #{createBy} and zp.is_homepage = #{isHomepage} From 33ff6795d1b5adf2ea93c97fdd0f430724815471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Fri, 10 Apr 2026 14:36:20 +0800 Subject: [PATCH 03/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E9=A1=B9=E7=9B=AE=E8=81=9A=E5=90=88=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20=20-=E6=96=B0=E5=A2=9E=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E7=8A=B6=E6=80=81=E5=B8=B8=E9=87=8F=EF=BC=88?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E9=80=9A=E8=BF=87/=E4=B8=8D=E9=80=9A?= =?UTF-8?q?=E8=BF=87/=E5=BE=85=E5=AE=A1=E6=A0=B8=EF=BC=89=20=20-ZoneDetail?= =?UTF-8?q?=E6=96=B0=E5=A2=9EprojectNeedAudit=E5=AD=97=E6=AE=B5=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E4=B8=93=E5=8C=BA=E6=98=AF=E5=90=A6=E5=BC=80=E5=90=AF?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=AE=A1=E6=A0=B8=20=20-ZoneProject=E6=96=B0?= =?UTF-8?q?=E5=A2=9EauditStatus/auditTime/auditBy=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=20=20-=E6=96=B0=E5=A2=9EZoneProjectAuditVo?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E8=AF=B7=E6=B1=82=E5=AF=B9=E8=B1=A1=20=20-?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=90=8E=E5=8F=B0=E5=AE=A1=E6=A0=B8=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3PUT/project/audit=20=20-=E5=89=8D=E5=8F=B0=E6=96=B0?= =?UTF-8?q?=E5=A2=9E/=E7=BC=96=E8=BE=91=E9=A1=B9=E7=9B=AE=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E4=B8=93=E5=8C=BA=E5=BC=80=E5=90=AF=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E5=88=99=E8=87=AA=E5=8A=A8=E8=AE=BE=E7=BD=AE=E5=BE=85=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E7=8A=B6=E6=80=81=20=20-=E5=89=8D=E5=8F=B0=E5=85=AC?= =?UTF-8?q?=E5=BC=80=E9=A1=B9=E7=9B=AE=E5=88=97=E8=A1=A8=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E4=BB=85=E6=98=BE=E7=A4=BA=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E7=9A=84=E9=A1=B9=E7=9B=AE=20=20-"=E6=88=91?= =?UTF-8?q?=E7=9A=84=E9=A1=B9=E7=9B=AE=E5=88=97=E8=A1=A8"=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=89=80=E6=9C=89=E5=AE=A1=E6=A0=B8=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E7=9A=84=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zone/detail/domain/ZoneDetail.java | 5 ++ .../detail/domain/vo/ZoneDetailDataVo.java | 6 +++ .../detail/domain/vo/ZoneDetailUpdateVo.java | 6 +++ .../controller/ZoneProjectController.java | 11 ++++ .../zone/project/domain/ZoneProject.java | 13 +++++ .../project/domain/vo/ZoneProjectDataVo.java | 9 ++++ .../domain/vo/ZoneProjectSearchVo.java | 2 + .../project/service/IZoneProjectService.java | 8 +++ .../service/impl/ZoneProjectServiceImpl.java | 53 ++++++++++++++++++- .../zone/utils/ZoneConstants.java | 13 +++++ .../mapper/zone/ZoneDetailMapper.xml | 6 +++ .../mapper/zone/ZoneProjectMapper.xml | 21 +++++++- 12 files changed, 151 insertions(+), 2 deletions(-) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/ZoneDetail.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/ZoneDetail.java index 795a05090..7cd52081e 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/ZoneDetail.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/ZoneDetail.java @@ -190,6 +190,11 @@ public class ZoneDetail extends BaseEntity { @ApiModelProperty(value = "资源是否需要审核(0:不需要审核,1:需要审核)") private Integer resourceNeedAudit; + /** + * 项目是否需要审核(0:不需要,1:需要) + */ + @ApiModelProperty(value = "项目是否需要审核(0:不需要审核,1:需要审核)") + private Integer projectNeedAudit; /** * 资讯是否锁定中(0:未锁定,1:锁定) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneDetailDataVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneDetailDataVo.java index 7a1fe28d2..8517331fb 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneDetailDataVo.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneDetailDataVo.java @@ -155,6 +155,12 @@ public class ZoneDetailDataVo extends BaseEntity { @ApiModelProperty(value = "资源是否需要审核(0:不需要审核,1:需要审核)") private Integer resourceNeedAudit; + /** + * 项目是否需要审核(0:不需要,1:需要) + */ + @ApiModelProperty(value = "项目是否需要审核(0:不需要审核,1:需要审核)") + private Integer projectNeedAudit; + /** * 资讯是否锁定中(0:未锁定,1:锁定) */ diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneDetailUpdateVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneDetailUpdateVo.java index a6554d6be..414d4f622 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneDetailUpdateVo.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneDetailUpdateVo.java @@ -123,6 +123,12 @@ public class ZoneDetailUpdateVo { @ApiModelProperty(value = "资源是否需要审核(0:不需要审核,1:需要审核)") private Integer resourceNeedAudit; + /** + * 项目是否需要审核(0:不需要,1:需要) + */ + @ApiModelProperty(value = "项目是否需要审核(0:不需要审核,1:需要审核)") + private Integer projectNeedAudit; + /** * 资讯是否锁定中(0:未锁定,1:锁定) */ diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/controller/ZoneProjectController.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/controller/ZoneProjectController.java index 3ec4b74a1..30eee393b 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/controller/ZoneProjectController.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/controller/ZoneProjectController.java @@ -135,4 +135,15 @@ public class ZoneProjectController extends BaseController { public AjaxResult updateHomepageShow(@PathVariable Long id) { return toAjax(zoneProjectService.updateZoneProjectHomePageShow(id)); } + + /** + * 审核特色专区项目 + */ + @RequiresPermissions("zone:project:audit") + @Log(title = "审核特色专区项目", businessType = BusinessType.UPDATE) + @PutMapping("/audit") + @ApiOperation("审核特色专区项目") + public AjaxResult audit(@RequestBody @Validated ZoneProjectAuditVo zoneProjectAuditVo) { + return toAjax(zoneProjectService.auditZoneProject(zoneProjectAuditVo)); + } } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/ZoneProject.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/ZoneProject.java index bfd1c3463..feffe145b 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/ZoneProject.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/ZoneProject.java @@ -3,9 +3,12 @@ package com.microservices.zone.project.domain; import com.microservices.common.core.annotation.Excel; import com.microservices.common.core.web.domain.BaseEntity; import com.microservices.system.api.domain.SysDept; +import io.swagger.annotations.ApiModelProperty; import com.microservices.zone.project.domain.vo.ZoneProjectDataVo; import lombok.Data; +import java.util.Date; + /** * 特色专区项目聚合对象 zone_project * @@ -83,6 +86,13 @@ public class ZoneProject extends BaseEntity { */ private String isHomepage; + @ApiModelProperty(value = "审核状态(0:待审核,1:审核通过 2:审核不通过)") + private String auditStatus; + @ApiModelProperty(value = "审核时间") + private Date auditTime; + @ApiModelProperty(value = "审核人") + private String auditBy; + public ZoneProjectDataVo toZoneProjectDataVo() { ZoneProjectDataVo zoneProjectDataVo = new ZoneProjectDataVo(); zoneProjectDataVo.setId(this.getId()); @@ -93,6 +103,9 @@ public class ZoneProject extends BaseEntity { zoneProjectDataVo.setZoneId(this.getZoneId()); zoneProjectDataVo.setSort(this.getSort()); zoneProjectDataVo.setGitlinkProjectId(this.getGitlinkProjectId()); + zoneProjectDataVo.setAuditStatus(this.getAuditStatus()); + zoneProjectDataVo.setAuditTime(this.getAuditTime()); + zoneProjectDataVo.setAuditBy(this.getAuditBy()); return zoneProjectDataVo; } } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectDataVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectDataVo.java index 6f77549d7..c4574c9da 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectDataVo.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectDataVo.java @@ -6,6 +6,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.Date; + /** * @author otto */ @@ -40,6 +42,13 @@ public class ZoneProjectDataVo implements Comparable { @Excel(name = "gitlink项目Id") private Long gitlinkProjectId; + @ApiModelProperty(value = "审核状态(0:待审核,1:审核通过 2:审核不通过)") + private String auditStatus; + @ApiModelProperty(value = "审核时间") + private Date auditTime; + @ApiModelProperty(value = "审核人") + private String auditBy; + @Override public int compareTo(ZoneProjectDataVo zoneProjectDataVo) { // 重写Comparable接口的compareTo方法,根据年龄升序排列,降序修改相减顺序即可 diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectSearchVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectSearchVo.java index 3d1a7405b..0fde19510 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectSearchVo.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectSearchVo.java @@ -13,4 +13,6 @@ import lombok.Data; public class ZoneProjectSearchVo extends ZoneProjectOpenSearchVo { @ApiModelProperty(value = "所属专区") private Long zoneId; + @ApiModelProperty(value = "审核状态(0:待审核,1:审核通过 2:审核不通过)") + private String auditStatus; } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/IZoneProjectService.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/IZoneProjectService.java index 6891173d8..3b77f5b15 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/IZoneProjectService.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/IZoneProjectService.java @@ -137,4 +137,12 @@ public interface IZoneProjectService { * @return 结果 */ int updateMyZoneProject(Long id, ZoneProjectUpdateVo zoneProjectUpdateVo); + + /** + * 审核项目 + * + * @param zoneProjectAuditVo 审核数据 + * @return 结果 + */ + int auditZoneProject(ZoneProjectAuditVo zoneProjectAuditVo); } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java index 81df66074..2bd3e34f1 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java @@ -12,8 +12,10 @@ import com.microservices.common.core.web.page.GenericsTableDataInfo; import com.microservices.common.datascope.annotation.DataScope; import com.microservices.common.httpClient.util.GitLinkRequestHelper; import com.microservices.common.redis.service.RedisService; +import com.microservices.common.security.auth.AuthUtil; import com.microservices.common.security.utils.DictUtils; import com.microservices.common.security.utils.SecurityUtils; +import com.microservices.common.core.enums.SystemRole; import com.microservices.system.api.domain.SysDictData; import com.microservices.zone.common.service.IZoneAsyncService; import com.microservices.zone.detail.domain.ZoneDetail; @@ -113,6 +115,9 @@ public class ZoneProjectServiceImpl implements IZoneProjectService { throw new ServiceException("查询项目列表时,请指定专区Id"); } zoneDetailService.selectZoneDetailById(zoneProjectSearchVo.getZoneId()); + if (isOpen) { + zoneProjectSearchVo.setAuditStatus(ZoneConstants.PROJECT_AUDIT_PASS); + } startPage(); zoneProjectSearchVo.setIsOpen(isOpen); List zoneProjectList = zoneProjectMapper.selectZoneProjectList(zoneProjectSearchVo); @@ -403,6 +408,12 @@ public class ZoneProjectServiceImpl implements IZoneProjectService { zoneProject.setName(author.getString("name") + "/" + gitLinkProject.getString("name")); zoneProject.setFullName(author.getString("login") + "/" + gitLinkProject.getString("identifier")); } + // 专区开启项目审核后,专区会员和专区运营人员新增项目都需要审核 + if (projectNeedAudit(zoneDetail)) { + zoneProject.setAuditStatus(ZoneConstants.PROJECT_NOT_AUDIT); + } else { + zoneProject.setAuditStatus(ZoneConstants.PROJECT_AUDIT_PASS); + } //设置排序值为当前最大的排序值+1 Integer maxSort = zoneProjectMapper.selectMaxSortByZoneId(zoneProjectInputVo.getZoneId()); if (maxSort == null) { @@ -679,7 +690,15 @@ public class ZoneProjectServiceImpl implements IZoneProjectService { if (!zoneProject.getCreateBy().equals(SecurityUtils.getUsername())) { throw new ServiceException("仅允许编辑自身创建的项目"); } - return updateZoneProject(id, zoneProjectUpdateVo); + ZoneDetail zoneDetail = zoneDetailService.selectZoneDetailById(zoneProject.getZoneId()); + int result = updateZoneProject(id, zoneProjectUpdateVo); + if (projectNeedAudit(zoneDetail)) { + ZoneProject updateProject = new ZoneProject(); + updateProject.setId(id); + updateProject.setAuditStatus(ZoneConstants.PROJECT_NOT_AUDIT); + zoneProjectMapper.updateZoneProject(updateProject); + } + return result; } @Override @@ -729,4 +748,36 @@ public class ZoneProjectServiceImpl implements IZoneProjectService { } return zoneProjectJSONList; } + + private boolean projectNeedAudit(ZoneDetail zoneDetail) { + if (1 == zoneDetail.getProjectNeedAudit()) { + boolean isOperator = AuthUtil.hasUserIdentity(zoneDetail.getDeptId(), SystemRole.ZONE_OPERATOR.getRoleKey()); + boolean isMember = AuthUtil.hasUserIdentity(zoneDetail.getDeptId(), SystemRole.ZONE_MEMBER.getRoleKey()); + if (isOperator || isMember) { + return true; + } + } + return false; + } + + @Override + public int auditZoneProject(ZoneProjectAuditVo zoneProjectAuditVo) { + ZoneProject zoneProject = zoneProjectMapper.selectZoneProjectById(zoneProjectAuditVo.getId()); + if (zoneProject == null) { + throw new ServiceException("该项目不存在(项目Id[" + zoneProjectAuditVo.getId() + "])"); + } + zoneDetailService.checkZoneDataScope(zoneProject.getZoneId()); + if (!ZoneConstants.PROJECT_AUDIT_PASS.equals(zoneProjectAuditVo.getAuditStatus()) + && !ZoneConstants.PROJECT_AUDIT_FAILED.equals(zoneProjectAuditVo.getAuditStatus())) { + throw new ServiceException("审核状态仅允许设置为审核通过和审核不通过"); + } + if (!ZoneConstants.PROJECT_NOT_AUDIT.equals(zoneProject.getAuditStatus())) { + throw new ServiceException("该项目当前未处于待审核状态,不允许进行审核操作"); + } + zoneProject.setAuditTime(DateUtils.getNowDate()); + zoneProject.setAuditBy(SecurityUtils.getUsername()); + zoneProject.setAuditStatus(zoneProjectAuditVo.getAuditStatus()); + zoneProject.setRemark(zoneProjectAuditVo.getRemark()); + return zoneProjectMapper.updateZoneProject(zoneProject); + } } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/utils/ZoneConstants.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/utils/ZoneConstants.java index 2a90253bb..65c85cb08 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/utils/ZoneConstants.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/utils/ZoneConstants.java @@ -66,6 +66,19 @@ public class ZoneConstants { * 资源审核状态-待审核 */ public final static String RESOURCE_NOT_AUDIT = "0"; + + /** + * 项目审核状态-审核通过 + */ + public final static String PROJECT_AUDIT_PASS = "1"; + /** + * 项目审核状态-审核未通过 + */ + public final static String PROJECT_AUDIT_FAILED = "2"; + /** + * 项目审核状态-待审核 + */ + public final static String PROJECT_NOT_AUDIT = "0"; /** * 前台权限-管理者 */ diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneDetailMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneDetailMapper.xml index c7cddd80d..b53997f14 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneDetailMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneDetailMapper.xml @@ -44,6 +44,7 @@ + @@ -101,6 +102,7 @@ template, is_lock_cms, resource_need_audit, + project_need_audit, doc_need_audit, section_cms_show, section_project_show, @@ -159,6 +161,7 @@ z.template, z.is_lock_cms, z.resource_need_audit, + z.project_need_audit, z.doc_need_audit, z.section_cms_show, z.section_project_show, @@ -273,6 +276,7 @@ helper_show, doc_need_audit, resource_need_audit, + project_need_audit, is_lock_cms, section_cms_show, section_project_show, @@ -327,6 +331,7 @@ #{helperShow}, #{docNeedAudit}, #{resourceNeedAudit}, + #{projectNeedAudit}, #{isLockCms}, #{sectionCmsShow}, #{sectionProjectShow}, @@ -390,6 +395,7 @@ helper_title = #{helperTitle}, doc_need_audit = #{docNeedAudit}, resource_need_audit = #{resourceNeedAudit}, + project_need_audit = #{projectNeedAudit}, is_lock_cms = #{isLockCms}, section_cms_show = #{sectionCmsShow}, section_project_show = #{sectionProjectShow}, diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml index f2d13d1ad..80079a6ed 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml @@ -19,6 +19,9 @@ + + + @@ -75,6 +81,9 @@ zp.update_time, zp.project_type_id, zp.is_homepage, + zp.audit_status, + zp.audit_time, + zp.audit_by, d.dept_id, d.parent_id, d.ancestors, @@ -115,6 +124,7 @@ and zp.project_type_id = #{projectTypeId} and zp.zone_id = #{zoneId} and zp.create_by = #{createBy} + and zp.audit_status = #{auditStatus} and zp.is_homepage = #{isHomepage} @@ -188,6 +198,9 @@ create_time, update_by, update_time, + audit_status, + audit_time, + audit_by, #{name}, @@ -202,6 +215,9 @@ #{createTime}, #{updateBy}, #{updateTime}, + #{auditStatus}, + #{auditTime}, + #{auditBy}, @@ -219,6 +235,9 @@ update_time = #{updateTime}, sort = #{sort}, is_homepage = #{isHomepage}, + audit_status = #{auditStatus}, + audit_time = #{auditTime}, + audit_by = #{auditBy}, where id = #{id} From 930197590036ad30719ee162045410535b32ccf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Fri, 10 Apr 2026 14:36:24 +0800 Subject: [PATCH 04/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E9=A1=B9=E7=9B=AE=E8=81=9A=E5=90=88=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20=20-=E6=96=B0=E5=A2=9E=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E7=8A=B6=E6=80=81=E5=B8=B8=E9=87=8F=EF=BC=88?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E9=80=9A=E8=BF=87/=E4=B8=8D=E9=80=9A?= =?UTF-8?q?=E8=BF=87/=E5=BE=85=E5=AE=A1=E6=A0=B8=EF=BC=89=20=20-ZoneDetail?= =?UTF-8?q?=E6=96=B0=E5=A2=9EprojectNeedAudit=E5=AD=97=E6=AE=B5=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E4=B8=93=E5=8C=BA=E6=98=AF=E5=90=A6=E5=BC=80=E5=90=AF?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=AE=A1=E6=A0=B8=20=20-ZoneProject=E6=96=B0?= =?UTF-8?q?=E5=A2=9EauditStatus/auditTime/auditBy=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=20=20-=E6=96=B0=E5=A2=9EZoneProjectAuditVo?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E8=AF=B7=E6=B1=82=E5=AF=B9=E8=B1=A1=20=20-?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=90=8E=E5=8F=B0=E5=AE=A1=E6=A0=B8=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3PUT/project/audit=20=20-=E5=89=8D=E5=8F=B0=E6=96=B0?= =?UTF-8?q?=E5=A2=9E/=E7=BC=96=E8=BE=91=E9=A1=B9=E7=9B=AE=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E4=B8=93=E5=8C=BA=E5=BC=80=E5=90=AF=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E5=88=99=E8=87=AA=E5=8A=A8=E8=AE=BE=E7=BD=AE=E5=BE=85=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E7=8A=B6=E6=80=81=20=20-=E5=89=8D=E5=8F=B0=E5=85=AC?= =?UTF-8?q?=E5=BC=80=E9=A1=B9=E7=9B=AE=E5=88=97=E8=A1=A8=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E4=BB=85=E6=98=BE=E7=A4=BA=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E7=9A=84=E9=A1=B9=E7=9B=AE=20=20-"=E6=88=91?= =?UTF-8?q?=E7=9A=84=E9=A1=B9=E7=9B=AE=E5=88=97=E8=A1=A8"=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=89=80=E6=9C=89=E5=AE=A1=E6=A0=B8=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E7=9A=84=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/domain/vo/ZoneProjectAuditVo.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectAuditVo.java diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectAuditVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectAuditVo.java new file mode 100644 index 000000000..519b89163 --- /dev/null +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectAuditVo.java @@ -0,0 +1,22 @@ +package com.microservices.zone.project.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +@ApiModel("项目审核对象") +public class ZoneProjectAuditVo { + @ApiModelProperty(value = "项目Id", required = true) + @NotNull + private Long id; + + @ApiModelProperty(value = "审核状态(1:审核通过 2:审核不通过)", required = true) + @NotNull + private String auditStatus; + + @ApiModelProperty(value = "备注") + private String remark; +} From 9f1d89da49d2d3508736229d0de0ffb25bbc1ef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Fri, 10 Apr 2026 16:36:48 +0800 Subject: [PATCH 05/59] =?UTF-8?q?feat(=E5=A4=A7=E6=96=87=E4=BB=B6=E5=88=86?= =?UTF-8?q?=E7=89=87=E4=B8=8A=E4=BC=A0):=20=E4=BC=98=E5=8C=96=E6=96=AD?= =?UTF-8?q?=E7=82=B9=E7=BB=AD=E4=BC=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 检查秒传时用查询数据库是否存在相同的 fileSignature 且状态为上传中或者合并中的会话,返回该会话的id,前端可以根据该会话id继续完成上传,如果该会话为上传中则返回已上传分片的number,前端可以仅上传未上传的分片,如果为合并中,前端可以调用查询进度接口获取合并进度 --- .../file/domain/vo/CheckInstantUploadVo.java | 25 ++++++++++++++++++- .../CheckInstantUploadResponseVo.java | 17 +++++++++++++ .../file/mapper/FileUploadSessionMapper.java | 6 +++-- .../impl/ChunkedUploadServiceImpl.java | 25 ++++++++++++++++++- .../mapper/file/FileUploadSessionMapper.xml | 9 ++++++- 5 files changed, 77 insertions(+), 5 deletions(-) diff --git a/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/domain/vo/CheckInstantUploadVo.java b/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/domain/vo/CheckInstantUploadVo.java index ed128df3d..9bce894b0 100644 --- a/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/domain/vo/CheckInstantUploadVo.java +++ b/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/domain/vo/CheckInstantUploadVo.java @@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; +import java.util.List; @Data @ApiModel("检查秒传返回") @@ -13,7 +14,10 @@ public class CheckInstantUploadVo implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty("是否可以秒传") - private Boolean canInstantUpload; + private Boolean canInstantUpload = false; + + @ApiModelProperty("是否可以断点续传") + private Boolean canResumingUpload = false; @ApiModelProperty("已存在文件ID(秒传时)") private Long existingFileId; @@ -30,6 +34,15 @@ public class CheckInstantUploadVo implements Serializable { @ApiModelProperty("已存在文件大小(秒传时)") private String existingFileSize; + @ApiModelProperty("已存在未上传完成的会话Id(断点续传时)") + private Long resumingSessionId; + + @ApiModelProperty("已上传的分片Id列表(断点续传时)-当状态为合并中时该值为null,请直接调用进度接口查看进度") + private List completedUploadChunkedNumberList; + + @ApiModelProperty("已存在未上传完成的会话状态(断点续传时)") + private String resumingSessionStatus; + @ApiModelProperty("消息") private String message; @@ -45,6 +58,16 @@ public class CheckInstantUploadVo implements Serializable { return vo; } + public static CheckInstantUploadVo resumingSuccess(Long sessionId, List completedUploadChunkedIdList,String resumingSessionStatus) { + CheckInstantUploadVo vo = new CheckInstantUploadVo(); + vo.setCanResumingUpload(true); + vo.setResumingSessionId(sessionId); + vo.setCompletedUploadChunkedNumberList(completedUploadChunkedIdList); + vo.setResumingSessionStatus(resumingSessionStatus); + vo.setMessage("断点续传成功"); + return vo; + } + public static CheckInstantUploadVo needUpload(String message) { CheckInstantUploadVo vo = new CheckInstantUploadVo(); vo.setCanInstantUpload(false); diff --git a/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/domain/vo/response/CheckInstantUploadResponseVo.java b/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/domain/vo/response/CheckInstantUploadResponseVo.java index 13c0244b1..cb3039ac4 100644 --- a/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/domain/vo/response/CheckInstantUploadResponseVo.java +++ b/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/domain/vo/response/CheckInstantUploadResponseVo.java @@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; +import java.util.List; @Data @ApiModel("检查秒传响应") @@ -16,6 +17,9 @@ public class CheckInstantUploadResponseVo implements Serializable { @ApiModelProperty("是否可以秒传") private Boolean canInstantUpload; + @ApiModelProperty("是否可以断点续传") + private Boolean canResumingUpload; + @ApiModelProperty("已存在文件ID") private Long existingFileId; @@ -31,17 +35,30 @@ public class CheckInstantUploadResponseVo implements Serializable { @ApiModelProperty("已存在文件大小") private String existingFileSize; + @ApiModelProperty("已存在未上传完成的会话Id(断点续传时)") + private Long resumingSessionId; + + @ApiModelProperty("已上传的分片Id列表(断点续传时)-当状态为合并中时该值为null,请直接调用进度接口查看进度") + private List completedUploadChunkedNumberList; + + @ApiModelProperty("已存在未上传完成的会话状态(断点续传时)") + private String resumingSessionStatus; + @ApiModelProperty("消息") private String message; public static CheckInstantUploadResponseVo from(CheckInstantUploadVo vo) { CheckInstantUploadResponseVo response = new CheckInstantUploadResponseVo(); response.setCanInstantUpload(vo.getCanInstantUpload()); + response.setCanResumingUpload(vo.getCanResumingUpload()); response.setExistingFileId(vo.getExistingFileId()); response.setExistingFileName(vo.getExistingFileName()); response.setExistingFilePath(vo.getExistingFilePath()); response.setExistingFileUrl(vo.getExistingFileUrl()); response.setExistingFileSize(vo.getExistingFileSize()); + response.setResumingSessionId(vo.getResumingSessionId()); + response.setCompletedUploadChunkedNumberList(vo.getCompletedUploadChunkedNumberList()); + response.setResumingSessionStatus(vo.getResumingSessionStatus()); response.setMessage(vo.getMessage()); return response; } diff --git a/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/mapper/FileUploadSessionMapper.java b/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/mapper/FileUploadSessionMapper.java index 6583dd7a2..e6109c5a5 100644 --- a/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/mapper/FileUploadSessionMapper.java +++ b/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/mapper/FileUploadSessionMapper.java @@ -80,11 +80,11 @@ public interface FileUploadSessionMapper { /** * 根据文件哈希和哈希类型查询已完成的会话 * - * @param fileHash 文件哈希 + * @param fileSignature 文件哈希 * @param hashType 哈希类型 * @return 文件分片上传会话 */ - FileUploadSession selectCompletedByFileSignatureAndType(@Param("fileHash") String fileHash, @Param("hashType") String hashType); + FileUploadSession selectCompletedByFileSignatureAndType(@Param("fileSignature") String fileSignature, @Param("hashType") String hashType); /** * 更新会话状态 @@ -102,4 +102,6 @@ public interface FileUploadSessionMapper { * @return 结果 */ int incrementUploadedChunks(String uploadId); + + FileUploadSession selectUploadingOrMergingByFileSignatureAndType(@Param("fileSignature") String fileSignature, @Param("hashType") String hashType); } diff --git a/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/service/impl/ChunkedUploadServiceImpl.java b/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/service/impl/ChunkedUploadServiceImpl.java index 539230b13..f5b03890d 100644 --- a/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/service/impl/ChunkedUploadServiceImpl.java +++ b/microservices-modules/microservices-modules-file/src/main/java/com/microservices/file/service/impl/ChunkedUploadServiceImpl.java @@ -124,7 +124,7 @@ public class ChunkedUploadServiceImpl implements IChunkedUploadService { // 校验文件大小 if (input.getFileSize() > maxFileSize) { - throw new ServiceException("文件大小超过限制: %s(%d字节) ",FileUtils.calcFileSize(maxFileSize),maxFileSize); + throw new ServiceException("文件大小超过限制: %s(%d字节) ", FileUtils.calcFileSize(maxFileSize), maxFileSize); } // 2. 计算分片信息(使用服务端动态计算的分片大小) @@ -225,6 +225,29 @@ public class ChunkedUploadServiceImpl implements IChunkedUploadService { ); } } + // 3. 检查断点续传:查询数据库是否存在相同的 fileSignature 且状态为上传中或者合并中 + FileUploadSession uploadingOrMergingSession = sessionMapper.selectUploadingOrMergingByFileSignatureAndType(fileSignature, session.getHashType()); + if (uploadingOrMergingSession != null && uploadingOrMergingSession.getFileSignature() != null) { + // ========== 断点续传成功 ========== + // 删除当前会话及其分片记录 + chunkMapper.deleteByUploadId(uploadId); + sessionMapper.deleteByUploadId(uploadId); + // 清理临时文件 + cleanupTempFiles(session); + List completedUploadChunkedIdList = null; + if (FileUploadSession.Status.UPLOADING.getCode().equals(uploadingOrMergingSession.getStatus())) { + List chunkList = chunkMapper.selectByUploadId(uploadingOrMergingSession.getUploadId()); + completedUploadChunkedIdList = chunkList.stream() + .filter(x -> FileUploadChunk.Status.UPLOADED.getCode().equals(x.getStatus())) + .map(FileUploadChunk::getChunkNumber).collect(Collectors.toList()); + } + + // 返回已存在文件信息 + return CheckInstantUploadVo.resumingSuccess( + uploadingOrMergingSession.getSessionId(), + completedUploadChunkedIdList, + uploadingOrMergingSession.getStatus()); + } // ========== 不能秒传,存储哈希值 ========== session.setFileSignature(fileSignature); diff --git a/microservices-modules/microservices-modules-file/src/main/resources/mapper/file/FileUploadSessionMapper.xml b/microservices-modules/microservices-modules-file/src/main/resources/mapper/file/FileUploadSessionMapper.xml index cf4b71c5c..bf6c7ef5e 100644 --- a/microservices-modules/microservices-modules-file/src/main/resources/mapper/file/FileUploadSessionMapper.xml +++ b/microservices-modules/microservices-modules-file/src/main/resources/mapper/file/FileUploadSessionMapper.xml @@ -85,12 +85,19 @@ + From 8f2ff93dcac819da371d6571446ed713aa8619f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Mon, 13 Apr 2026 11:18:35 +0800 Subject: [PATCH 06/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E5=89=8D=E5=8F=B0=E9=A1=B9=E7=9B=AE=E8=81=9A=E5=90=88?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增前台查询项目聚合分类接口 2. 调整前台新增/编辑项目逻辑:不允许调整排序字段 --- .../common/controller/FrontController.java | 44 ++++++++++++++----- .../domain/vo/ZoneProjectFrontUpdateVo.java | 28 ++++++++++++ .../project/domain/vo/ZoneProjectInputVo.java | 11 ++--- .../domain/vo/ZoneProjectSearchVo.java | 5 ++- .../domain/vo/ZoneProjectUpdateVo.java | 13 ++---- .../domain/vo/ZoneResourceSearchVo.java | 5 ++- 6 files changed, 75 insertions(+), 31 deletions(-) create mode 100644 microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectFrontUpdateVo.java diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java index a893c8357..c1fa3a300 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java @@ -1,5 +1,6 @@ package com.microservices.zone.common.controller; +import com.alibaba.fastjson2.JSONObject; import com.microservices.common.core.web.controller.BaseController; import com.microservices.common.core.web.domain.AjaxResult; import com.microservices.common.core.web.domain.GenericsAjaxResult; @@ -10,11 +11,10 @@ import com.microservices.common.security.annotation.RequiresPermissions; import com.microservices.common.security.utils.SecurityUtils; import com.microservices.zone.detail.domain.vo.ZoneFrontRoleVo; import com.microservices.zone.detail.service.IZoneDetailService; -import com.microservices.zone.project.domain.vo.ZoneProjectDataVo; -import com.microservices.zone.project.domain.vo.ZoneProjectInputVo; -import com.microservices.zone.project.domain.vo.ZoneProjectSearchVo; -import com.microservices.zone.project.domain.vo.ZoneProjectUpdateVo; +import com.microservices.zone.project.domain.ZoneProjectType; +import com.microservices.zone.project.domain.vo.*; import com.microservices.zone.project.service.IZoneProjectService; +import com.microservices.zone.project.service.IZoneProjectTypeService; import com.microservices.zone.resource.domain.ZoneResource; import com.microservices.zone.resource.domain.vo.ZoneResourceDataVo; import com.microservices.zone.resource.domain.vo.ZoneResourceInputVo; @@ -23,9 +23,12 @@ import com.microservices.zone.resource.domain.vo.ZoneResourceUpdateVo; import com.microservices.zone.resource.service.IZoneResourceService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * @author otto */ @@ -43,6 +46,9 @@ public class FrontController extends BaseController { @Autowired private IZoneDetailService zoneDetailService; + @Autowired + private IZoneProjectTypeService zoneProjectTypeService; + /** * 查询我的资源列表 */ @@ -99,12 +105,26 @@ public class FrontController extends BaseController { return toAjax(zoneResourceService.deleteMyZoneResourceByIds(ids)); } + /** + * 查询特色专区项目分类列表 + */ + @GetMapping("/zone/{zoneId}/projectTypeList") + @ApiOperation("查询特色专区项目分类列表") + public GenericsTableDataInfo projectTypeList( + @ApiParam(name = "zoneId", value = "专区Id") @PathVariable Long zoneId) { + startPage(); + ZoneProjectType zoneProjectType = new ZoneProjectType(); + zoneProjectType.setZoneId(zoneId); + List list = zoneProjectTypeService.selectZoneProjectTypeList(zoneProjectType); + return getGenericsDataTable(list); + } + /** * 查询我的项目列表 */ @RequiresPermissions("zone:front:project:myList") @GetMapping("/myProjectList") - @ApiOperation(value = "查询我的项目列表") + @ApiOperation(value = "查询我的项目聚合列表") public GenericsTableDataInfo myProjectList(ZoneProjectSearchVo zoneProjectSearchVo) { zoneProjectSearchVo.setCreateBy(SecurityUtils.getUsername()); return zoneProjectService.selectMyZoneProjectList(zoneProjectSearchVo); @@ -115,7 +135,7 @@ public class FrontController extends BaseController { */ @RequiresPermissions("zone:front:project:query") @GetMapping("/myProject/{id}") - @ApiOperation(value = "查询我的项目详情") + @ApiOperation(value = "查询我的项目聚合详情") public GenericsAjaxResult myProject(@PathVariable("id") Long id) { return genericsSuccess(zoneProjectService.selectZoneProjectDataById(id)); } @@ -126,7 +146,7 @@ public class FrontController extends BaseController { @RequiresPermissions("zone:front:project:add") @Log(title = "专区前台项目操作", businessType = BusinessType.INSERT) @PostMapping("/addProject") - @ApiOperation(value = "新增项目") + @ApiOperation(value = "新增项目聚合") public AjaxResult addProject(@RequestBody ZoneProjectInputVo zoneProjectInputVo) { return success(zoneProjectService.insertZoneProject(zoneProjectInputVo)); } @@ -136,10 +156,10 @@ public class FrontController extends BaseController { */ @RequiresPermissions("zone:front:project:edit") @Log(title = "专区前台项目操作", businessType = BusinessType.UPDATE) - @PutMapping("/editProject") - @ApiOperation(value = "编辑项目") - public AjaxResult editProject(@RequestBody ZoneProjectUpdateVo zoneProjectUpdateVo) { - return success(zoneProjectService.updateMyZoneProject(zoneProjectUpdateVo.getId(), zoneProjectUpdateVo)); + @PutMapping("/editProject/{projectId}") + @ApiOperation(value = "编辑项目聚合") + public AjaxResult editProject(@PathVariable("projectId") Long projectId,@RequestBody ZoneProjectFrontUpdateVo zoneProjectFrontUpdateVo) { + return success(zoneProjectService.updateMyZoneProject(projectId, zoneProjectFrontUpdateVo.toZoneProjectUpdateVo())); } /** @@ -148,7 +168,7 @@ public class FrontController extends BaseController { @RequiresPermissions("zone:front:project:remove") @Log(title = "专区前台项目操作", businessType = BusinessType.DELETE) @DeleteMapping("/removeProject/{ids}") - @ApiOperation(value = "删除项目") + @ApiOperation(value = "删除项目聚合") public AjaxResult removeProject(@PathVariable Long[] ids) { return toAjax(zoneProjectService.deleteMyZoneProjectByIds(ids)); } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectFrontUpdateVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectFrontUpdateVo.java new file mode 100644 index 000000000..e1c93b6bf --- /dev/null +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectFrontUpdateVo.java @@ -0,0 +1,28 @@ +package com.microservices.zone.project.domain.vo; + +import com.microservices.common.core.utils.bean.BeanUtils; +import com.microservices.zone.project.domain.ZoneProject; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author otto + */ + +@Data +@ApiModel("项目聚合前台更新对象") +public class ZoneProjectFrontUpdateVo { + @ApiModelProperty(value = "聚合项目类型") + @NotNull + protected Long projectTypeId; + + + public ZoneProjectUpdateVo toZoneProjectUpdateVo() { + ZoneProjectUpdateVo zoneProjectUpdateVo = new ZoneProjectUpdateVo(); + BeanUtils.copyProperties(this, zoneProjectUpdateVo); + return zoneProjectUpdateVo; + } +} diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectInputVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectInputVo.java index e0977a679..faaa66f4a 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectInputVo.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectInputVo.java @@ -14,19 +14,16 @@ import javax.validation.constraints.NotNull; @Data @ApiModel("项目聚合输入对象") -public class ZoneProjectInputVo { +public class ZoneProjectInputVo { @ApiModelProperty(value = "gitlink项目Id", required = true) @NotNull - private Long gitlinkProjectId; + protected Long gitlinkProjectId; @ApiModelProperty(value = "聚合项目类型", required = true) @NotNull - private Long projectTypeId; + protected Long projectTypeId; @ApiModelProperty(value = "所属专区", required = true) @NotNull - private Long zoneId; - - @ApiModelProperty(value = "排序") - private Integer sort; + protected Long zoneId; public ZoneProject toZoneProject() { ZoneProject zoneProject = new ZoneProject(); diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectSearchVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectSearchVo.java index 0fde19510..bf2e4a07b 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectSearchVo.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectSearchVo.java @@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotNull; + /** * @author otto */ @@ -11,7 +13,8 @@ import lombok.Data; @Data @ApiModel("项目聚合搜索对象") public class ZoneProjectSearchVo extends ZoneProjectOpenSearchVo { - @ApiModelProperty(value = "所属专区") + @ApiModelProperty(value = "所属专区",required = true) + @NotNull private Long zoneId; @ApiModelProperty(value = "审核状态(0:待审核,1:审核通过 2:审核不通过)") private String auditStatus; diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectUpdateVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectUpdateVo.java index 01c987584..e01e29333 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectUpdateVo.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectUpdateVo.java @@ -13,22 +13,15 @@ import javax.validation.constraints.NotNull; @Data @ApiModel("项目聚合更新对象") -public class ZoneProjectUpdateVo { - @ApiModelProperty(value = "项目Id", required = true) - @NotNull - private Long id; - - @ApiModelProperty(value = "聚合项目类型") - @NotNull - private Long projectTypeId; - +public class ZoneProjectUpdateVo extends ZoneProjectFrontUpdateVo{ @ApiModelProperty(value = "顺序") private Integer order; public ZoneProject toZoneProject(Long id) { ZoneProject zoneProject = new ZoneProject(); zoneProject.setId(id); - zoneProject.setProjectTypeId(projectTypeId); + zoneProject.setProjectTypeId(super.projectTypeId); + zoneProject.setSort(order); return zoneProject; } } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/domain/vo/ZoneResourceSearchVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/domain/vo/ZoneResourceSearchVo.java index d7243e811..69766752f 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/domain/vo/ZoneResourceSearchVo.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/domain/vo/ZoneResourceSearchVo.java @@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotNull; + /** * @author otto */ @@ -12,7 +14,8 @@ import lombok.Data; @ApiModel("资源搜索对象") public class ZoneResourceSearchVo extends ZoneResourceOpenSearchVo { - @ApiModelProperty(value = "所属专区") + @ApiModelProperty(value = "所属专区",required = true) + @NotNull private Long zoneId; @ApiModelProperty(value = "审核状态(0:待审核,1:审核通过 2:审核不通过)") From 481c3ddfbdd1e93ddc74519a0824c5061a5a7111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Tue, 14 Apr 2026 08:55:33 +0800 Subject: [PATCH 07/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E5=89=8D=E5=8F=B0=E9=A1=B9=E7=9B=AE=E8=81=9A=E5=90=88?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除前台获取项目聚合分类列表接口,共用后台管理接口,取消后台获取分类列表权限限制 --- .../zone/common/controller/FrontController.java | 14 -------------- .../controller/ZoneProjectTypeController.java | 1 - 2 files changed, 15 deletions(-) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java index c1fa3a300..3210cc011 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java @@ -105,20 +105,6 @@ public class FrontController extends BaseController { return toAjax(zoneResourceService.deleteMyZoneResourceByIds(ids)); } - /** - * 查询特色专区项目分类列表 - */ - @GetMapping("/zone/{zoneId}/projectTypeList") - @ApiOperation("查询特色专区项目分类列表") - public GenericsTableDataInfo projectTypeList( - @ApiParam(name = "zoneId", value = "专区Id") @PathVariable Long zoneId) { - startPage(); - ZoneProjectType zoneProjectType = new ZoneProjectType(); - zoneProjectType.setZoneId(zoneId); - List list = zoneProjectTypeService.selectZoneProjectTypeList(zoneProjectType); - return getGenericsDataTable(list); - } - /** * 查询我的项目列表 */ diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/controller/ZoneProjectTypeController.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/controller/ZoneProjectTypeController.java index 3d7ff90dc..475b60caf 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/controller/ZoneProjectTypeController.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/controller/ZoneProjectTypeController.java @@ -35,7 +35,6 @@ public class ZoneProjectTypeController extends BaseController { /** * 查询特色专区项目分类列表 */ - @RequiresPermissions("zone:projectType:list") @GetMapping("/list") @ApiOperation("查询特色专区项目分类列表") public GenericsTableDataInfo list(ZoneProjectType zoneProjectType) { From e80a0ded7afcc05faa20258822c2d26d2800d2f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Tue, 14 Apr 2026 15:09:43 +0800 Subject: [PATCH 08/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E5=89=8D=E5=8F=B0=E9=A1=B9=E7=9B=AE=E8=81=9A=E5=90=88?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增查询专区下我的GitLink项目列表:支持会员查询我的项目或者我是owner权限的组织下的项目 --- .../common/controller/FrontController.java | 12 ++++ .../domain/vo/GitLinkProjectSearchVo.java | 30 ++-------- .../project/service/IZoneProjectService.java | 2 + .../service/impl/ZoneProjectServiceImpl.java | 55 ++++++++++++------- .../zone/utils/ZoneConstants.java | 4 ++ .../zone/utils/ZoneGitLinkRequestUrl.java | 7 +++ 6 files changed, 63 insertions(+), 47 deletions(-) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java index 3210cc011..078b2745a 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java @@ -105,6 +105,18 @@ public class FrontController extends BaseController { return toAjax(zoneResourceService.deleteMyZoneResourceByIds(ids)); } + + /** + * 查询GitLink项目列表 + */ + @GetMapping("/zone/{zoneId}/myGitlinkProjectList") + @ApiOperation("查询专区下我的GitLink项目列表") + public GenericsTableDataInfo selectMyGitlinkProjectListByZone( + @ApiParam(name = "zoneId", value = "专区Id") @PathVariable Long zoneId + , MyGitLinkProjectSearchVo myGitLinkProjectSearchVo) { + return zoneProjectService.selectMyGitlinkProjectListByZone(zoneId, myGitLinkProjectSearchVo); + } + /** * 查询我的项目列表 */ diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/GitLinkProjectSearchVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/GitLinkProjectSearchVo.java index 6d4c81e55..c210c0599 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/GitLinkProjectSearchVo.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/GitLinkProjectSearchVo.java @@ -11,37 +11,15 @@ import lombok.Data; @Data @ApiModel("GitLink项目搜索对象") -public class GitLinkProjectSearchVo { +public class GitLinkProjectSearchVo extends MyGitLinkProjectSearchVo { @ApiModelProperty(value = "项目语言") private Long languageId; - @ApiModelProperty(value = "项目排序") - private String sortBy; - @ApiModelProperty(value = "搜索关键字") - private String search; - @ApiModelProperty(value = "页码") - private Long page; - @ApiModelProperty(value = "每页数量") - private Long limit; public String genQueryString() { - StringBuilder stringBuilder = new StringBuilder("?"); - if (page == null) { - page = 1L; - } - if (limit == null) { - limit = 15L; - } - stringBuilder.append("page=").append(page); - stringBuilder.append("&limit=").append(limit); + StringBuilder queryString = super.genBaseQueryString(); if (languageId != null) { - stringBuilder.append("&language_id=").append(languageId); + queryString.append("&language_id=").append(languageId); } - if (StringUtils.isNotEmpty(sortBy)) { - stringBuilder.append("&sort_by=").append(sortBy); - } - if (StringUtils.isNotEmpty(search)) { - stringBuilder.append("&search=").append(search); - } - return stringBuilder.toString(); + return queryString.toString(); } } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/IZoneProjectService.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/IZoneProjectService.java index 3b77f5b15..7778128e3 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/IZoneProjectService.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/IZoneProjectService.java @@ -145,4 +145,6 @@ public interface IZoneProjectService { * @return 结果 */ int auditZoneProject(ZoneProjectAuditVo zoneProjectAuditVo); + + GenericsTableDataInfo selectMyGitlinkProjectListByZone(Long zoneId, MyGitLinkProjectSearchVo myGitLinkProjectSearchVo); } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java index 2bd3e34f1..7a0345bea 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java @@ -1,5 +1,6 @@ package com.microservices.zone.project.service.impl; +import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.microservices.common.core.constant.CacheConstants; @@ -567,27 +568,7 @@ public class ZoneProjectServiceImpl implements IZoneProjectService { JSONObject result = gitLinkRequestHelper.doGet( ZoneGitLinkRequestUrl.PROJECTS(gitLinkProjectSearchVo.genQueryString()) ); - List list = result.getList(ZoneConstants.GITLINK_RESPONSE_PROJECTS_KEY, JSONObject.class); - if (list == null) { - throw new ServiceException("Gitlink项目列表获取失败"); - } - ZoneProjectSearchVo zoneProjectSearchVo = new ZoneProjectSearchVo(); - zoneProjectSearchVo.setZoneId(zoneId); - List zoneProjectList = zoneProjectMapper.selectZoneProjectList(zoneProjectSearchVo); - List gitlinkProjectList = new ArrayList<>(); - for (JSONObject gitlinkProject : list) { - if (zoneId != null) { - boolean isChoose = zoneProjectList.stream().anyMatch(x -> x.getGitlinkProjectId().equals(gitlinkProject.getLong("id"))); - if (isChoose) { - gitlinkProject.put("isChoose", true); - } else { - gitlinkProject.put("isChoose", false); - } - } - gitlinkProjectList.add(gitlinkProject); - } - Long size = result.getLong(ZoneConstants.GITLINK_RESPONSE_TOTAL_COUNT_KEY); - return PageUtils.toPage(gitlinkProjectList, size); + return execGitlinkProjectsSearch(zoneId, result,ZoneConstants.GITLINK_RESPONSE_TOTAL_COUNT_KEY); } @Override @@ -780,4 +761,36 @@ public class ZoneProjectServiceImpl implements IZoneProjectService { zoneProject.setRemark(zoneProjectAuditVo.getRemark()); return zoneProjectMapper.updateZoneProject(zoneProject); } + + @Override + public GenericsTableDataInfo selectMyGitlinkProjectListByZone(Long zoneId, MyGitLinkProjectSearchVo gitLinkProjectSearchVo) { + JSONObject result = gitLinkRequestHelper.doGet( + ZoneGitLinkRequestUrl.MY_OWNER_PROJECTS(SecurityUtils.getUsername(), gitLinkProjectSearchVo.myProjectsQueryString()) + ); + return execGitlinkProjectsSearch(zoneId, result,ZoneConstants.GITLINK_RESPONSE_COUNT_KEY); + } + + private GenericsTableDataInfo execGitlinkProjectsSearch(Long zoneId, JSONObject result,String totalKey) { + List list = result.getList(ZoneConstants.GITLINK_RESPONSE_PROJECTS_KEY, JSONObject.class); + if (list == null) { + throw new ServiceException("Gitlink项目列表获取失败"); + } + ZoneProjectSearchVo zoneProjectSearchVo = new ZoneProjectSearchVo(); + zoneProjectSearchVo.setZoneId(zoneId); + List zoneProjectList = zoneProjectMapper.selectZoneProjectList(zoneProjectSearchVo); + List gitlinkProjectList = new ArrayList<>(); + for (JSONObject gitlinkProject : list) { + if (zoneId != null) { + boolean isChoose = zoneProjectList.stream().anyMatch(x -> x.getGitlinkProjectId().equals(gitlinkProject.getLong("id"))); + if (isChoose) { + gitlinkProject.put("isChoose", true); + } else { + gitlinkProject.put("isChoose", false); + } + } + gitlinkProjectList.add(gitlinkProject); + } + Long size = result.getLong(totalKey); + return PageUtils.toPage(gitlinkProjectList, size); + } } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/utils/ZoneConstants.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/utils/ZoneConstants.java index 65c85cb08..47273b936 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/utils/ZoneConstants.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/utils/ZoneConstants.java @@ -28,6 +28,10 @@ public class ZoneConstants { * GitLink响应总数Key */ public final static String GITLINK_RESPONSE_TOTAL_COUNT_KEY = "total_count"; + /** + * GitLink响应总数Key + */ + public final static String GITLINK_RESPONSE_COUNT_KEY = "count"; /** * GitLink项目列表Key */ diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/utils/ZoneGitLinkRequestUrl.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/utils/ZoneGitLinkRequestUrl.java index 382aad989..bd65e46cb 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/utils/ZoneGitLinkRequestUrl.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/utils/ZoneGitLinkRequestUrl.java @@ -22,6 +22,13 @@ public class ZoneGitLinkRequestUrl extends GitLinkRequestUrl { return getOpenGitLinkRequestUrl(String.format("/api/projects.json%s", query)); } + /** + * 搜索项目列表 + */ + public static GitLinkRequestUrl MY_OWNER_PROJECTS(String username,String query) { + return getOpenGitLinkRequestUrl(String.format("/api/users/%s/projects.json%s",username, query)); + } + /** * 获取项目贡献者 From 77cd5bbc3a2c3c8eb39e9a0711d006fc3f5b6eb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Tue, 14 Apr 2026 15:11:54 +0800 Subject: [PATCH 09/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E5=89=8D=E5=8F=B0=E9=A1=B9=E7=9B=AE=E8=81=9A=E5=90=88?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增查询专区下我的GitLink项目列表:支持会员查询我的项目或者我是owner权限的组织下的项目 --- .../domain/vo/MyGitLinkProjectSearchVo.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/MyGitLinkProjectSearchVo.java diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/MyGitLinkProjectSearchVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/MyGitLinkProjectSearchVo.java new file mode 100644 index 000000000..02056e6c7 --- /dev/null +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/MyGitLinkProjectSearchVo.java @@ -0,0 +1,48 @@ +package com.microservices.zone.project.domain.vo; + +import com.microservices.common.core.utils.StringUtils; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author otto + */ + +@Data +@ApiModel("GitLink项目搜索对象") +public class MyGitLinkProjectSearchVo { + @ApiModelProperty(value = "项目排序") + private String sortBy; + @ApiModelProperty(value = "搜索关键字") + private String search; + @ApiModelProperty(value = "页码") + private Long page; + @ApiModelProperty(value = "每页数量") + private Long limit; + + protected StringBuilder genBaseQueryString() { + StringBuilder stringBuilder = new StringBuilder("?"); + if (page == null) { + page = 1L; + } + if (limit == null) { + limit = 15L; + } + stringBuilder.append("page=").append(page); + stringBuilder.append("&limit=").append(limit); + if (StringUtils.isNotEmpty(sortBy)) { + stringBuilder.append("&sort_by=").append(sortBy); + } + if (StringUtils.isNotEmpty(search)) { + stringBuilder.append("&search=").append(search); + } + return stringBuilder; + } + + public String myProjectsQueryString() { + StringBuilder stringBuilder = genBaseQueryString(); + stringBuilder.append("&category=admin&is_public=public"); + return stringBuilder.toString(); + } +} From 4f5f9a283c6e712ffa5c6b6905396fb6e23963ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Tue, 14 Apr 2026 15:38:46 +0800 Subject: [PATCH 10/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E5=89=8D=E5=8F=B0=E9=A1=B9=E7=9B=AE=E8=81=9A=E5=90=88?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 前台会员新增项目聚合接口调整为支持批量新增 --- .../zone/common/controller/FrontController.java | 5 +++-- .../zone/project/service/impl/ZoneProjectServiceImpl.java | 4 +--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java index 078b2745a..b0ca529da 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/FrontController.java @@ -25,6 +25,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -145,8 +146,8 @@ public class FrontController extends BaseController { @Log(title = "专区前台项目操作", businessType = BusinessType.INSERT) @PostMapping("/addProject") @ApiOperation(value = "新增项目聚合") - public AjaxResult addProject(@RequestBody ZoneProjectInputVo zoneProjectInputVo) { - return success(zoneProjectService.insertZoneProject(zoneProjectInputVo)); + public AjaxResult addProject(@RequestBody @Validated List zoneProjectInputVoList) { + return success(zoneProjectService.insertBatchZoneProject(zoneProjectInputVoList)); } /** diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java index 7a0345bea..995a7a809 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java @@ -734,9 +734,7 @@ public class ZoneProjectServiceImpl implements IZoneProjectService { if (1 == zoneDetail.getProjectNeedAudit()) { boolean isOperator = AuthUtil.hasUserIdentity(zoneDetail.getDeptId(), SystemRole.ZONE_OPERATOR.getRoleKey()); boolean isMember = AuthUtil.hasUserIdentity(zoneDetail.getDeptId(), SystemRole.ZONE_MEMBER.getRoleKey()); - if (isOperator || isMember) { - return true; - } + return isOperator || isMember; } return false; } From aff24c83d25f9d3bfc426d5ae3a6a874d63c7df7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Wed, 15 Apr 2026 13:54:04 +0800 Subject: [PATCH 11/59] =?UTF-8?q?feat(=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2?= =?UTF-8?q?):=20=E5=AE=9E=E7=8E=B0=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现MySQL全文检索:基于MATCH...AGAINST NATURAL LANGUAGE MODE 搜索范围覆盖文档标题(name)和摘要(summary)双字段 结果按全文相关度降序+更新时间降序双重排序 仅检索已审核通过且非目录类型的文档 - 实现项目全文检索:基于MATCH...AGAINST搜索zone_project.name字段 仅返回已审核项目(audit_status='1'),按相关度+更新时间排序 - 实现资源全文检索:搜索资源名称(name)+关键词(keywords)复合字段 创新性支持附件文件名全文匹配(通过EXISTS子查询关联sys_file_info表) 资源结果附带匹配附件信息(文件ID、文件名、文件大小),存储于extendData 通过RemoteFileService远程调用获取附件详情,支持大小写不敏感匹配 - 引入Redis缓存策略:第一页搜索结果缓存5分钟 --- .../microservices-modules-cms/pom.xml | 6 + .../cms/doc/controller/OpenController.java | 42 +++ .../cms/doc/mapper/CmsDocMapper.java | 21 ++ .../cms/project/mapper/CmsProjectMapper.java | 22 ++ .../cms/search/dto/DocSearchRequest.java | 43 +++ .../cms/search/dto/DocSearchResponse.java | 63 ++++ .../cms/search/dto/DocSearchResult.java | 70 +++++ .../search/service/IGlobalSearchService.java | 20 ++ .../service/impl/GlobalSearchServiceImpl.java | 189 ++++++++++++ .../resources/mapper/cms/CmsDocMapper.xml | 28 ++ .../resources/mapper/cms/CmsProjectMapper.xml | 34 +++ .../microservices-modules-zone/pom.xml | 6 + .../common/controller/OpenController.java | 44 +++ .../project/mapper/ZoneProjectMapper.java | 24 ++ .../resource/mapper/ZoneResourceMapper.java | 23 ++ .../zone/search/dto/GlobalSearchRequest.java | 51 ++++ .../zone/search/dto/GlobalSearchResponse.java | 63 ++++ .../zone/search/dto/GlobalSearchResult.java | 82 +++++ .../search/service/IGlobalSearchService.java | 20 ++ .../service/impl/GlobalSearchServiceImpl.java | 280 ++++++++++++++++++ .../mapper/zone/ZoneProjectMapper.xml | 44 +++ .../mapper/zone/ZoneResourceMapper.xml | 66 +++++ 22 files changed, 1241 insertions(+) create mode 100644 microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchRequest.java create mode 100644 microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchResponse.java create mode 100644 microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchResult.java create mode 100644 microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/service/IGlobalSearchService.java create mode 100644 microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/service/impl/GlobalSearchServiceImpl.java create mode 100644 microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchRequest.java create mode 100644 microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchResponse.java create mode 100644 microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchResult.java create mode 100644 microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/IGlobalSearchService.java create mode 100644 microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java diff --git a/microservices-modules/microservices-modules-cms/pom.xml b/microservices-modules/microservices-modules-cms/pom.xml index ec4598e09..e9e2e1236 100644 --- a/microservices-modules/microservices-modules-cms/pom.xml +++ b/microservices-modules/microservices-modules-cms/pom.xml @@ -126,6 +126,12 @@ 3.6.2 compile + + com.microservices + microservices-common-search + 3.6.2 + compile + diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/OpenController.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/OpenController.java index 423a042dd..61f465a64 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/OpenController.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/OpenController.java @@ -9,8 +9,12 @@ import com.microservices.common.core.web.controller.BaseController; import com.microservices.common.core.web.domain.AjaxResult; import com.microservices.common.core.web.domain.GenericsAjaxResult; import com.microservices.common.core.web.page.GenericsTableDataInfo; +import com.microservices.common.core.web.page.TableDataInfo; import com.microservices.common.log.annotation.Log; import com.microservices.common.log.enums.BusinessType; +import com.microservices.cms.search.dto.DocSearchRequest; +import com.microservices.cms.search.dto.DocSearchResponse; +import com.microservices.cms.search.service.IGlobalSearchService; import io.swagger.annotations.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -35,6 +39,44 @@ public class OpenController extends BaseController { @Autowired private ICmsWechatService cmsWechatService; + @Autowired + private IGlobalSearchService globalSearchService; + + /** + * 文章搜索接口 + * + * @param keyword 搜索关键词 + * @param zoneId 专区ID + * @param pageNum 页码 + * @param pageSize 每页数量 + * @return 搜索结果 + */ + @ApiOperation("文章搜索") + @GetMapping("/search") + public TableDataInfo docSearchGet( + @ApiParam("搜索关键词") @RequestParam String keyword, + @ApiParam("专区ID") @RequestParam Long zoneId, + @ApiParam("页码") @RequestParam(defaultValue = "1") Integer pageNum, + @ApiParam("每页数量") @RequestParam(defaultValue = "20") Integer pageSize) { + + DocSearchRequest request = new DocSearchRequest(); + request.setKeyword(keyword); + request.setZoneId(zoneId); + request.setPageNum(pageNum); + request.setPageSize(pageSize); + + logger.info("文章搜索请求(GET): keyword={}", keyword); + + DocSearchResponse response = globalSearchService.docSearch(request); + + TableDataInfo dataInfo = new TableDataInfo(); + dataInfo.setCode(200); + dataInfo.setMsg("查询成功"); + dataInfo.setRows(response.getResults()); + dataInfo.setTotal(response.getTotal()); + return dataInfo; + } + /** * 查询栏目列表 */ diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/mapper/CmsDocMapper.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/mapper/CmsDocMapper.java index aacb21b3e..64d165429 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/mapper/CmsDocMapper.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/mapper/CmsDocMapper.java @@ -192,4 +192,25 @@ public interface CmsDocMapper { List selectCmsDocAndDirListByDept(Long deptId); void updateCmsDocShaByPathAndDeptId(@Param("sha") String sha, @Param("filePath") String filePath, @Param("deptId") Long deptId); + + /** + * 全局搜索 - 全文索引查询 + * + * @param keyword 搜索关键词 + * @param deptId 组织ID(可选) + * @param offset 偏移量 + * @param pageSize 每页数量 + * @return 搜索结果列表 + */ + List globalSearch(@Param("keyword") String keyword, @Param("deptId") Long deptId, + @Param("offset") int offset, @Param("pageSize") int pageSize); + + /** + * 全局搜索结果计数 + * + * @param keyword 搜索关键词 + * @param deptId 组织ID(可选) + * @return 结果数量 + */ + Long globalSearchCount(@Param("keyword") String keyword, @Param("deptId") Long deptId); } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/mapper/CmsProjectMapper.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/mapper/CmsProjectMapper.java index 377b04816..a7c9495eb 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/mapper/CmsProjectMapper.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/mapper/CmsProjectMapper.java @@ -2,6 +2,7 @@ package com.microservices.cms.project.mapper; import com.microservices.cms.project.domain.CmsProject; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -64,4 +65,25 @@ public interface CmsProjectMapper { CmsProject selectCmsProjectByDeptId(Long deptId); CmsProject selectCmsProjectByIdentifier(String identifier); + + /** + * 全局搜索 - 全文索引查询 + * + * @param keyword 搜索关键词 + * @param deptId 组织ID(可选) + * @param offset 偏移量 + * @param pageSize 每页数量 + * @return 搜索结果列表 + */ + List globalSearch(@Param("keyword") String keyword, @Param("deptId") Long deptId, + @Param("offset") int offset, @Param("pageSize") int pageSize); + + /** + * 全局搜索结果计数 + * + * @param keyword 搜索关键词 + * @param deptId 组织ID(可选) + * @return 结果数量 + */ + Long globalSearchCount(@Param("keyword") String keyword, @Param("deptId") Long deptId); } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchRequest.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchRequest.java new file mode 100644 index 000000000..ec491aa4d --- /dev/null +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchRequest.java @@ -0,0 +1,43 @@ +package com.microservices.cms.search.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 文章搜索请求对象 + * + * @author microservices + */ +@Data +@ApiModel("文章搜索请求对象") +public class DocSearchRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 搜索关键词 + */ + @ApiModelProperty(value = "搜索关键词", required = true) + private String keyword; + + /** + * 专区ID + */ + @ApiModelProperty(value = "专区ID") + private Long zoneId; + + /** + * 页码 + */ + @ApiModelProperty(value = "页码") + private Integer pageNum = 1; + + /** + * 每页数量 + */ + @ApiModelProperty(value = "每页数量") + private Integer pageSize = 20; +} diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchResponse.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchResponse.java new file mode 100644 index 000000000..93ecf514c --- /dev/null +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchResponse.java @@ -0,0 +1,63 @@ +package com.microservices.cms.search.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * 全局搜索响应对象 + * + * @author microservices + */ +@Data +@ApiModel("文章搜索响应对象") +public class DocSearchResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 总结果数 + */ + @ApiModelProperty(value = "总结果数") + private Long total; + + /** + * 搜索结果列表 + */ + @ApiModelProperty(value = "搜索结果列表") + private List results; + + /** + * 各类型结果数量统计 + */ + @ApiModelProperty(value = "各类型结果数量统计") + private Map typeCounts; + + /** + * 搜索耗时(毫秒) + */ + @ApiModelProperty(value = "搜索耗时(毫秒)") + private Long searchTime; + + /** + * 搜索关键词 + */ + @ApiModelProperty(value = "搜索关键词") + private String keyword; + + /** + * 当前页码 + */ + @ApiModelProperty(value = "当前页码") + private Integer pageNum; + + /** + * 每页数量 + */ + @ApiModelProperty(value = "每页数量") + private Integer pageSize; +} diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchResult.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchResult.java new file mode 100644 index 000000000..5415b77da --- /dev/null +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchResult.java @@ -0,0 +1,70 @@ +package com.microservices.cms.search.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 文章搜索结果对象 + * + * @author microservices + */ +@Data +@ApiModel("文章搜索结果对象") +public class DocSearchResult implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ApiModelProperty(value = "ID") + private Long id; + + /** + * 标题 + */ + @ApiModelProperty(value = "标题") + private String title; + + /** + * 内容摘要 + */ + @ApiModelProperty(value = "内容摘要") + private String content; + + /** + * 高亮片段 + */ + @ApiModelProperty(value = "高亮片段") + private String highlight; + + /** + * 组织ID + */ + @ApiModelProperty(value = "组织ID") + private Long deptId; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private Date createTime; + + /** + * 相关度评分 + */ + @ApiModelProperty(value = "相关度评分") + private Double score; + + /** + * 扩展数据(JSON格式) + */ + @ApiModelProperty(value = "扩展数据") + private String extendData; +} diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/service/IGlobalSearchService.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/service/IGlobalSearchService.java new file mode 100644 index 000000000..3231b5caa --- /dev/null +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/service/IGlobalSearchService.java @@ -0,0 +1,20 @@ +package com.microservices.cms.search.service; + +import com.microservices.cms.search.dto.DocSearchRequest; +import com.microservices.cms.search.dto.DocSearchResponse; + +/** + * 全局搜索服务接口 + * + * @author microservices + */ +public interface IGlobalSearchService { + + /** + * 全局搜索 + * + * @param request 搜索请求 + * @return 搜索响应 + */ + DocSearchResponse docSearch(DocSearchRequest request); +} diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/service/impl/GlobalSearchServiceImpl.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/service/impl/GlobalSearchServiceImpl.java new file mode 100644 index 000000000..eca4bb2ea --- /dev/null +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/service/impl/GlobalSearchServiceImpl.java @@ -0,0 +1,189 @@ +package com.microservices.cms.search.service.impl; + +import com.microservices.cms.doc.domain.CmsDoc; +import com.microservices.cms.doc.mapper.CmsDocMapper; +import com.microservices.cms.doc.service.ICmsDocService; +import com.microservices.cms.search.service.IGlobalSearchService; +import com.microservices.common.core.utils.StringUtils; +import com.microservices.common.redis.service.RedisService; +import com.microservices.cms.search.dto.DocSearchRequest; +import com.microservices.cms.search.dto.DocSearchResponse; +import com.microservices.cms.search.dto.DocSearchResult; +import com.microservices.common.security.utils.SecurityUtils; +import com.microservices.system.api.model.LoginUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * 全局搜索服务实现 + * + * @author microservices + */ +@Service +public class GlobalSearchServiceImpl implements IGlobalSearchService { + + private static final Logger logger = LoggerFactory.getLogger(GlobalSearchServiceImpl.class); + + @Autowired + private CmsDocMapper cmsDocMapper; + @Autowired + private RedisService redisService; + @Autowired + private ICmsDocService cmsDocService; + + private static final String SEARCH_CACHE_PREFIX = "search:cache:"; + private static final Long CACHE_EXPIRE_SECONDS = 300L; // 5分钟 + + @Override + public DocSearchResponse docSearch(DocSearchRequest request) { + long startTime = System.currentTimeMillis(); + + // 参数校验 + if (StringUtils.isEmpty(request.getKeyword())) { + return buildEmptyResponse(request); + } + + // 1. 尝试从缓存获取(仅第一页) + if (request.getPageNum() == 1) { + String cacheKey = buildCacheKey(request); + + DocSearchResponse cached = redisService.getCacheObject(SEARCH_CACHE_PREFIX + cacheKey); + if (cached != null) { + cached.setSearchTime(System.currentTimeMillis() - startTime); + return cached; + } + } + + // 2. 并行搜索各类型 + List allResults = new ArrayList<>(); + Map typeCounts = new HashMap<>(); + + // 获取当前用户信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + + // 搜索CMS文章 + List docResults = searchDocs(request); + allResults.addAll(docResults); + typeCounts.put("doc", (long) docResults.size()); + + // 3. 按相关度评分排序 + allResults.sort((a, b) -> { + if (b.getScore() != null && a.getScore() != null) { + return b.getScore().compareTo(a.getScore()); + } + return 0; + }); + + // 4. 分页 + int total = allResults.size(); + int start = (request.getPageNum() - 1) * request.getPageSize(); + int end = Math.min(start + request.getPageSize(), total); + List pagedResults = start < total ? + allResults.subList(start, end) : new ArrayList<>(); + + // 5. 构建响应 + DocSearchResponse response = new DocSearchResponse(); + response.setTotal((long) total); + response.setResults(pagedResults); + response.setTypeCounts(typeCounts); + response.setKeyword(request.getKeyword()); + response.setPageNum(request.getPageNum()); + response.setPageSize(request.getPageSize()); + response.setSearchTime(System.currentTimeMillis() - startTime); + + // 6. 缓存结果(仅第一页) + if (request.getPageNum() == 1) { + String cacheKey = buildCacheKey(request); + redisService.setCacheObject(SEARCH_CACHE_PREFIX + cacheKey, response, CACHE_EXPIRE_SECONDS, TimeUnit.SECONDS); + } + + // 7. 记录搜索日志 + recordSearchLog(request, response, loginUser); + + return response; + } + + /** + * 记录搜索日志 + */ + private void recordSearchLog(DocSearchRequest request, DocSearchResponse response, LoginUser loginUser) { + Long userId = loginUser != null ? loginUser.getUserId() : null; + String searchTypes = "文章"; + Long deptId = cmsDocService.getDeptIdByZoneId(request.getZoneId()); + logger.info("全局搜索 - 关键词: {}, 用户ID: {}, 耗时: {}ms, 结果数: {}, 类型: {}, 专区Id: {}, 组织ID: {}", + request.getKeyword(), + userId, + response.getSearchTime(), + response.getTotal(), + searchTypes, + request.getZoneId(), + deptId + ); + } + + /** + * 搜索CMS文章 + */ + private List searchDocs(DocSearchRequest request) { + List results = new ArrayList<>(); + try { + // 使用部门ID参数 + Long deptId = cmsDocService.getDeptIdByZoneId(request.getZoneId()); + + List docs = cmsDocMapper.globalSearch( + request.getKeyword(), + deptId, + (request.getPageNum() - 1) * request.getPageSize(), + request.getPageSize() + ); + + for (CmsDoc doc : docs) { + DocSearchResult result = new DocSearchResult(); + result.setId(doc.getId()); + result.setTitle(doc.getName()); + result.setContent(doc.getSummary()); + result.setDeptId(doc.getDeptId()); + result.setCreateTime(doc.getCreateTime()); + result.setScore(1.0); // MySQL全文索引默认相关度 + results.add(result); + } + } catch (Exception e) { + // 记录错误但继续处理其他类型 + System.err.println("搜索CMS文章失败: " + e.getMessage()); + } + return results; + } + + /** + * 构建缓存键 + */ + private String buildCacheKey(DocSearchRequest request) { + Long deptId = cmsDocService.getDeptIdByZoneId(request.getZoneId()); + StringBuilder key = new StringBuilder(request.getKeyword()); + key.append(":").append(String.join(",", "Doc")); + if (deptId != null) { + key.append(":dept=").append(deptId); + } + return key.toString(); + } + + /** + * 构建空响应 + */ + private DocSearchResponse buildEmptyResponse(DocSearchRequest request) { + DocSearchResponse response = new DocSearchResponse(); + response.setTotal(0L); + response.setResults(new ArrayList<>()); + response.setTypeCounts(new HashMap<>()); + response.setKeyword(request.getKeyword()); + response.setPageNum(request.getPageNum()); + response.setPageSize(request.getPageSize()); + response.setSearchTime(0L); + return response; + } +} diff --git a/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml b/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml index c67f642be..d66f99632 100644 --- a/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml +++ b/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml @@ -494,4 +494,32 @@ #{id} + + + + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsProjectMapper.xml b/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsProjectMapper.xml index 1c99f7f0d..4684628ec 100644 --- a/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsProjectMapper.xml +++ b/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsProjectMapper.xml @@ -159,4 +159,38 @@ item="id" collection="array" open="(" separator="," close=")">#{id} + + + + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-zone/pom.xml b/microservices-modules/microservices-modules-zone/pom.xml index b92340783..f784ef1cd 100644 --- a/microservices-modules/microservices-modules-zone/pom.xml +++ b/microservices-modules/microservices-modules-zone/pom.xml @@ -133,6 +133,12 @@ 3.6.2 compile + + com.microservices + microservices-common-search + 3.6.2 + compile + diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/OpenController.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/OpenController.java index 9cfbcd91a..67fe49506 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/OpenController.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/OpenController.java @@ -6,6 +6,7 @@ import com.microservices.common.core.web.controller.BaseController; import com.microservices.common.core.web.domain.AjaxResult; import com.microservices.common.core.web.domain.GenericsAjaxResult; import com.microservices.common.core.web.page.GenericsTableDataInfo; +import com.microservices.common.core.web.page.TableDataInfo; import com.microservices.common.log.annotation.Log; import com.microservices.common.log.enums.BusinessType; import com.microservices.system.api.domain.SysUser; @@ -37,6 +38,10 @@ import com.microservices.zone.resource.domain.vo.ZoneResourceOpenSearchVo; import com.microservices.zone.resource.service.IZoneResourceDomainService; import com.microservices.zone.resource.service.IZoneResourceService; import com.microservices.zone.resource.service.IZoneResourceTypeService; +import com.microservices.zone.search.dto.GlobalSearchRequest; +import com.microservices.zone.search.dto.GlobalSearchResponse; +import com.microservices.zone.search.dto.GlobalSearchResult; +import com.microservices.zone.search.service.IGlobalSearchService; import com.microservices.zone.specialProject.domain.ZoneSpecialProject; import com.microservices.zone.specialProject.domain.ZoneSpecialProjectRelevancy; import com.microservices.zone.specialProject.domain.ZoneSpecialProjectReport; @@ -411,4 +416,43 @@ public class OpenController extends BaseController { List list = zoneSpecialProjectReportService.selectZoneSpecialProjectReportList(zoneSpecialProjectReportSearchVo.toZoneSpecialProjectReport()); return getGenericsDataTable(list); } + + @Autowired + private IGlobalSearchService globalSearchService; + + /** + * 全局搜索接口(GET方法) + * + * @param keyword 搜索关键词 + * @param types 搜索类型(逗号分隔) + * @param zoneId 专区ID + * @param pageNum 页码 + * @param pageSize 每页数量 + * @return 搜索结果 + */ + @ApiOperation("全局搜索(GET)") + @GetMapping("/global") + public GenericsTableDataInfo globalSearchGet( + @ApiParam("搜索关键词") @RequestParam String keyword, + @ApiParam("搜索类型") @RequestParam(required = false) String types, + @ApiParam("专区ID") @RequestParam Long zoneId, + @ApiParam("页码") @RequestParam(defaultValue = "1") Integer pageNum, + @ApiParam("每页数量") @RequestParam(defaultValue = "20") Integer pageSize) { + + GlobalSearchRequest request = new GlobalSearchRequest(); + request.setKeyword(keyword); + request.setPageNum(pageNum); + request.setPageSize(pageSize); + request.setZoneId(zoneId); + + if (types != null && !types.isEmpty()) { + request.setTypes(java.util.Arrays.asList(types.split(","))); + } + + logger.info("全局搜索请求(GET): keyword={}, types={}", keyword, types); + + GlobalSearchResponse response = globalSearchService.globalSearch(request); + + return new GenericsTableDataInfo<>(response.getResults(),response.getTotal()); + } } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/mapper/ZoneProjectMapper.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/mapper/ZoneProjectMapper.java index 91e1bae05..95f34dc3b 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/mapper/ZoneProjectMapper.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/mapper/ZoneProjectMapper.java @@ -155,4 +155,28 @@ public interface ZoneProjectMapper { * @return */ int deleteZoneProjectByZoneId(Long zoneId); + + /** + * 全局搜索 - 全文索引查询 + * + * @param keyword 搜索关键词 + * @param zoneId 专区ID(可选) + * @param offset 偏移量 + * @param pageSize 每页数量 + * @return 搜索结果列表 + */ + List globalSearch(@Param("keyword") String keyword, @Param("zoneId") Long zoneId, + @Param("offset") int offset, + @Param("pageSize") int pageSize); + + /** + * 全局搜索结果计数 + * + * @param keyword 搜索关键词 + * @param zoneId 专区ID(可选) + * @param deptId 组织ID(可选) + * @return 结果数量 + */ + Long globalSearchCount(@Param("keyword") String keyword, @Param("zoneId") Long zoneId, + @Param("deptId") Long deptId); } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java index c1d1b4404..de699cf1e 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java @@ -95,4 +95,27 @@ public interface ZoneResourceMapper { * @param zoneId 专区Id */ void deleteZoneResourceByZoneId(Long zoneId); + + /** + * 全局搜索 - 全文索引查询 + * + * @param keyword 搜索关键词 + * @param zoneId 专区ID + * @param offset 偏移量 + * @param pageSize 每页数量 + * @return 搜索结果列表 + */ + List globalSearch(@Param("keyword") String keyword, @Param("zoneId") Long zoneId, + @Param("offset") int offset,@Param("pageSize") int pageSize); + + /** + * 全局搜索结果计数 + * + * @param keyword 搜索关键词 + * @param zoneId 专区ID(可选) + * @param deptId 组织ID(可选) + * @return 结果数量 + */ + Long globalSearchCount(@Param("keyword") String keyword, @Param("zoneId") Long zoneId, + @Param("deptId") Long deptId); } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchRequest.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchRequest.java new file mode 100644 index 000000000..328caf286 --- /dev/null +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchRequest.java @@ -0,0 +1,51 @@ +package com.microservices.zone.search.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 全局搜索请求对象 + * + * @author microservices + */ +@Data +@ApiModel("全局搜索请求对象") +public class GlobalSearchRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 搜索关键词 + */ + @ApiModelProperty(value = "搜索关键词", required = true) + private String keyword; + + /** + * 搜索类型列表(zone_project, resource, member) + * 为空则搜索所有类型 + */ + @ApiModelProperty(value = "搜索类型列表") + private List types; + + /** + * 专区ID + */ + @ApiModelProperty(value = "专区ID") + private Long zoneId; + + /** + * 页码 + */ + @ApiModelProperty(value = "页码") + private Integer pageNum = 1; + + /** + * 每页数量 + */ + @ApiModelProperty(value = "每页数量") + private Integer pageSize = 20; +} diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchResponse.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchResponse.java new file mode 100644 index 000000000..59550f99f --- /dev/null +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchResponse.java @@ -0,0 +1,63 @@ +package com.microservices.zone.search.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * 全局搜索响应对象 + * + * @author microservices + */ +@Data +@ApiModel("全局搜索响应对象") +public class GlobalSearchResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 总结果数 + */ + @ApiModelProperty(value = "总结果数") + private Long total; + + /** + * 搜索结果列表 + */ + @ApiModelProperty(value = "搜索结果列表") + private List results; + + /** + * 各类型结果数量统计 + */ + @ApiModelProperty(value = "各类型结果数量统计") + private Map typeCounts; + + /** + * 搜索耗时(毫秒) + */ + @ApiModelProperty(value = "搜索耗时(毫秒)") + private Long searchTime; + + /** + * 搜索关键词 + */ + @ApiModelProperty(value = "搜索关键词") + private String keyword; + + /** + * 当前页码 + */ + @ApiModelProperty(value = "当前页码") + private Integer pageNum; + + /** + * 每页数量 + */ + @ApiModelProperty(value = "每页数量") + private Integer pageSize; +} diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchResult.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchResult.java new file mode 100644 index 000000000..f71b97676 --- /dev/null +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchResult.java @@ -0,0 +1,82 @@ +package com.microservices.zone.search.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 全局搜索结果对象 + * + * @author microservices + */ +@Data +@ApiModel("全局搜索结果对象") +public class GlobalSearchResult implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 结果类型(zone_project, resource, member) + */ + @ApiModelProperty(value = "结果类型") + private String type; + + /** + * ID + */ + @ApiModelProperty(value = "ID") + private Long id; + + /** + * 标题 + */ + @ApiModelProperty(value = "标题") + private String title; + + /** + * 内容摘要 + */ + @ApiModelProperty(value = "内容摘要") + private String content; + + /** + * 高亮片段 + */ + @ApiModelProperty(value = "高亮片段") + private String highlight; + + /** + * 组织ID + */ + @ApiModelProperty(value = "组织ID") + private Long deptId; + + /** + * 专区ID + */ + @ApiModelProperty(value = "专区ID") + private Long zoneId; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private Date createTime; + + /** + * 相关度评分 + */ + @ApiModelProperty(value = "相关度评分") + private Double score; + + /** + * 扩展数据(JSON格式) + */ + @ApiModelProperty(value = "扩展数据") + private String extendData; +} diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/IGlobalSearchService.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/IGlobalSearchService.java new file mode 100644 index 000000000..6b7162cd3 --- /dev/null +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/IGlobalSearchService.java @@ -0,0 +1,20 @@ +package com.microservices.zone.search.service; + +import com.microservices.zone.search.dto.GlobalSearchRequest; +import com.microservices.zone.search.dto.GlobalSearchResponse; + +/** + * 全局搜索服务接口 + * + * @author microservices + */ +public interface IGlobalSearchService { + + /** + * 全局搜索 + * + * @param request 搜索请求 + * @return 搜索响应 + */ + GlobalSearchResponse globalSearch(GlobalSearchRequest request); +} diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java new file mode 100644 index 000000000..ef13d7598 --- /dev/null +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java @@ -0,0 +1,280 @@ +package com.microservices.zone.search.service.impl; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.microservices.common.core.domain.R; +import com.microservices.common.core.utils.StringUtils; +import com.microservices.common.redis.service.RedisService; +import com.microservices.common.security.utils.SecurityUtils; +import com.microservices.system.api.RemoteFileService; +import com.microservices.system.api.domain.SysFileInfo; +import com.microservices.system.api.model.LoginUser; +import com.microservices.zone.project.domain.ZoneProject; +import com.microservices.zone.project.mapper.ZoneProjectMapper; +import com.microservices.zone.resource.domain.ZoneResource; +import com.microservices.zone.resource.mapper.ZoneResourceMapper; +import com.microservices.zone.search.dto.GlobalSearchRequest; +import com.microservices.zone.search.dto.GlobalSearchResponse; +import com.microservices.zone.search.dto.GlobalSearchResult; +import com.microservices.zone.search.service.IGlobalSearchService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.concurrent.TimeUnit; + +/** + * 全局搜索服务实现 + * + * @author microservices + */ +@Service +public class GlobalSearchServiceImpl implements IGlobalSearchService { + + private static final Logger logger = LoggerFactory.getLogger(GlobalSearchServiceImpl.class); + + @Autowired + private ZoneProjectMapper zoneProjectMapper; + + @Autowired + private ZoneResourceMapper zoneResourceMapper; + + @Autowired + private RemoteFileService remoteFileService; + + @Autowired + private RedisService redisService; + + private static final String SEARCH_CACHE_PREFIX = "search:cache:"; + private static final long CACHE_EXPIRE_SECONDS = 300; // 5分钟 + + @Override + public GlobalSearchResponse globalSearch(GlobalSearchRequest request) { + long startTime = System.currentTimeMillis(); + + // 参数校验 + if (StringUtils.isEmpty(request.getKeyword())) { + return buildEmptyResponse(request); + } + + // 1. 尝试从缓存获取(仅第一页) + if (request.getPageNum() == 1) { + String cacheKey = buildCacheKey(request); + GlobalSearchResponse cached = redisService.getCacheObject(SEARCH_CACHE_PREFIX + cacheKey); + if (cached != null) { + cached.setSearchTime(System.currentTimeMillis() - startTime); + return cached; + } + } + + // 2. 并行搜索各类型 + List allResults = new ArrayList<>(); + Map typeCounts = new HashMap<>(); + + // 获取当前用户信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + + // 确定要搜索的类型 + List searchTypes = request.getTypes(); + if (searchTypes == null || searchTypes.isEmpty()) { + searchTypes = Arrays.asList("zone_project", "resource", "member"); + } + + // 搜索Zone项目 + if (searchTypes.contains("zone_project")) { + List zoneProjectResults = searchZoneProjects(request); + allResults.addAll(zoneProjectResults); + typeCounts.put("zone_project", (long) zoneProjectResults.size()); + } + + // 搜索Zone资源 + if (searchTypes.contains("resource")) { + List resourceResults = searchResources(request); + allResults.addAll(resourceResults); + typeCounts.put("resource", (long) resourceResults.size()); + } + + // 3. 按相关度评分排序 + allResults.sort((a, b) -> { + if (b.getScore() != null && a.getScore() != null) { + return b.getScore().compareTo(a.getScore()); + } + return 0; + }); + + // 4. 分页 + int total = allResults.size(); + int start = (request.getPageNum() - 1) * request.getPageSize(); + int end = Math.min(start + request.getPageSize(), total); + List pagedResults = start < total ? + allResults.subList(start, end) : new ArrayList<>(); + + // 5. 构建响应 + GlobalSearchResponse response = new GlobalSearchResponse(); + response.setTotal((long) total); + response.setResults(pagedResults); + response.setTypeCounts(typeCounts); + response.setKeyword(request.getKeyword()); + response.setPageNum(request.getPageNum()); + response.setPageSize(request.getPageSize()); + response.setSearchTime(System.currentTimeMillis() - startTime); + + // 6. 缓存结果(仅第一页) + if (request.getPageNum() == 1) { + String cacheKey = buildCacheKey(request); + redisService.setCacheObject( + SEARCH_CACHE_PREFIX + cacheKey, + response, + CACHE_EXPIRE_SECONDS, + TimeUnit.SECONDS); + } + + // 7. 异步记录搜索日志 + recordSearchLog(request, response, loginUser); + + return response; + } + + /** + * 异步记录搜索日志 + */ + @Async + public void recordSearchLog(GlobalSearchRequest request, GlobalSearchResponse response, LoginUser loginUser) { + try { + logger.info("全局搜索 - 关键词: {}, 用户ID: {}, 耗时: {}ms, 结果数: {}, 搜索类型: {}, 专区ID: {}", + request.getKeyword(), + loginUser != null ? loginUser.getUserId() : null, + response.getSearchTime(), + response.getTotal(), + request.getTypes() != null ? String.join(",", request.getTypes()) : null, + request.getZoneId() + ); + } catch (Exception e) { + logger.error("记录搜索日志失败: {}", e.getMessage()); + } + } + + /** + * 搜索Zone项目 + */ + private List searchZoneProjects(GlobalSearchRequest request) { + List results = new ArrayList<>(); + try { + List projects = zoneProjectMapper.globalSearch( + request.getKeyword(), + request.getZoneId(), + (request.getPageNum() - 1) * request.getPageSize(), + request.getPageSize() + ); + + for (ZoneProject project : projects) { + GlobalSearchResult result = new GlobalSearchResult(); + result.setType("zone_project"); + result.setId(project.getId()); + result.setTitle(project.getName()); + result.setContent(project.getFullName()); + result.setDeptId(project.getDeptId()); + result.setZoneId(project.getZoneId()); + result.setCreateTime(project.getCreateTime()); + result.setScore(1.0); + results.add(result); + } + } catch (Exception e) { + System.err.println("搜索Zone项目失败: " + e.getMessage()); + } + return results; + } + + /** + * 搜索Zone资源 + */ + private List searchResources(GlobalSearchRequest request) { + List results = new ArrayList<>(); + try { + List resources = zoneResourceMapper.globalSearch( + request.getKeyword(), + request.getZoneId(), + (request.getPageNum() - 1) * request.getPageSize(), + request.getPageSize() + ); + + for (ZoneResource resource : resources) { + GlobalSearchResult result = new GlobalSearchResult(); + result.setType("resource"); + result.setId(resource.getId()); + result.setTitle(resource.getName()); + result.setContent(resource.getSummary()); + result.setDeptId(resource.getDeptId()); + result.setZoneId(resource.getZoneId()); + result.setCreateTime(resource.getCreateTime()); + result.setScore(1.0); + + // 查询并过滤匹配的附件 + if (StringUtils.isNotEmpty(resource.getFileIds())) { + try { + R> fileResponse = remoteFileService.getFileList(resource.getFileIds()); + if (fileResponse != null && fileResponse.getCode() == 200 && fileResponse.getData() != null) { + List> matchedFiles = fileResponse.getData().stream() + .filter(file -> StringUtils.isNotEmpty(file.getFileOriginName()) + && file.getFileOriginName().toLowerCase().contains(request.getKeyword().toLowerCase())) + .map(file -> { + Map fileInfo = new HashMap<>(); + fileInfo.put("fileId", file.getFileId()); + fileInfo.put("fileName", file.getFileOriginName()); + fileInfo.put("fileSize", file.getFileSizeInfo()); + return fileInfo; + }) + .collect(Collectors.toList()); + + if (!matchedFiles.isEmpty()) { + ObjectMapper objectMapper = new ObjectMapper(); + Map extendData = new HashMap<>(); + extendData.put("matchedFiles", matchedFiles); + result.setExtendData(objectMapper.writeValueAsString(extendData)); + } + } + } catch (Exception e) { + logger.warn("查询附件信息失败: resourceId={}, error={}", resource.getId(), e.getMessage()); + } + } + + results.add(result); + } + } catch (Exception e) { + System.err.println("搜索Zone资源失败: " + e.getMessage()); + } + return results; + } + + /** + * 构建缓存键 + */ + private String buildCacheKey(GlobalSearchRequest request) { + StringBuilder key = new StringBuilder(request.getKeyword()); + if (request.getTypes() != null && !request.getTypes().isEmpty()) { + key.append(":").append(String.join(",", request.getTypes())); + } + if (request.getZoneId() != null) { + key.append(":zone=").append(request.getZoneId()); + } + return key.toString(); + } + + /** + * 构建空响应 + */ + private GlobalSearchResponse buildEmptyResponse(GlobalSearchRequest request) { + GlobalSearchResponse response = new GlobalSearchResponse(); + response.setTotal(0L); + response.setResults(new ArrayList<>()); + response.setTypeCounts(new HashMap<>()); + response.setKeyword(request.getKeyword()); + response.setPageNum(request.getPageNum()); + response.setPageSize(request.getPageSize()); + response.setSearchTime(0L); + return response; + } +} diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml index 80079a6ed..cb4b24997 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml @@ -276,4 +276,48 @@ from zone_project where zone_id = #{zoneId} + + + + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneResourceMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneResourceMapper.xml index c667ee632..79621d02e 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneResourceMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneResourceMapper.xml @@ -301,4 +301,70 @@ from zone_resource where zone_id = #{zoneId} + + + + + \ No newline at end of file From 43149d52bfea227feebf089f8451fdacb5dfaaf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Thu, 16 Apr 2026 11:08:26 +0800 Subject: [PATCH 12/59] =?UTF-8?q?feat(=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2?= =?UTF-8?q?):=20=E5=AE=9E=E7=8E=B0=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 支持专区会员的名称和用户名搜索:会员名称通过FULLTEXT索引进行搜索,用户名使用LIKE条件搜索 --- .../zone/member/mapper/ZoneMemberMapper.java | 14 +++ .../service/impl/GlobalSearchServiceImpl.java | 85 ++++++++++++++++++- .../mapper/zone/ZoneMemberMapper.xml | 22 +++++ 3 files changed, 120 insertions(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java index ed373f64f..4710aafea 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java @@ -154,4 +154,18 @@ public interface ZoneMemberMapper { * @return 会员组织Id列表 */ List checkUserIsMemberInDepts(@Param("userId") Long userId, @Param("deptIds") Long[] deptIds); + + /** + * 全局搜索 - 会员名称和用户名搜索 + * + * @param keyword 搜索关键词 + * @param zoneId 专区ID + * @param offset 偏移量 + * @param pageSize 每页数量 + * @return 搜索结果列表 + */ + List globalSearch(@Param("keyword") String keyword, + @Param("zoneId") Long zoneId, + @Param("offset") int offset, + @Param("pageSize") int pageSize); } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java index ef13d7598..d3042bdd0 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java @@ -12,6 +12,8 @@ import com.microservices.zone.project.domain.ZoneProject; import com.microservices.zone.project.mapper.ZoneProjectMapper; import com.microservices.zone.resource.domain.ZoneResource; import com.microservices.zone.resource.mapper.ZoneResourceMapper; +import com.microservices.zone.member.domain.ZoneMember; +import com.microservices.zone.member.mapper.ZoneMemberMapper; import com.microservices.zone.search.dto.GlobalSearchRequest; import com.microservices.zone.search.dto.GlobalSearchResponse; import com.microservices.zone.search.dto.GlobalSearchResult; @@ -42,6 +44,9 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { @Autowired private ZoneResourceMapper zoneResourceMapper; + @Autowired + private ZoneMemberMapper zoneMemberMapper; + @Autowired private RemoteFileService remoteFileService; @@ -97,6 +102,13 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { typeCounts.put("resource", (long) resourceResults.size()); } + // 搜索Zone会员 + if (searchTypes.contains("member")) { + List memberResults = searchZoneMembers(request); + allResults.addAll(memberResults); + typeCounts.put("member", (long) memberResults.size()); + } + // 3. 按相关度评分排序 allResults.sort((a, b) -> { if (b.getScore() != null && a.getScore() != null) { @@ -244,7 +256,78 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { results.add(result); } } catch (Exception e) { - System.err.println("搜索Zone资源失败: " + e.getMessage()); + logger.error("搜索Zone资源失败: {}" , e.getMessage()); + } + return results; + } + + /** + * 搜索Zone会员 + */ + private List searchZoneMembers(GlobalSearchRequest request) { + List results = new ArrayList<>(); + try { + List members = zoneMemberMapper.globalSearch( + request.getKeyword(), + request.getZoneId(), + (request.getPageNum() - 1) * request.getPageSize(), + request.getPageSize() + ); + + for (ZoneMember member : members) { + GlobalSearchResult result = new GlobalSearchResult(); + result.setType("member"); + result.setId(member.getId()); + result.setTitle(member.getName()); + + // 构建内容:用户名 + 会员介绍 + StringBuilder content = new StringBuilder(); + if (member.getSysUser() != null && StringUtils.isNotEmpty(member.getSysUser().getUserName())) { + content.append("用户名: ").append(member.getSysUser().getUserName()); + } + if (StringUtils.isNotEmpty(member.getIntroduction())) { + if (content.length() > 0) { + content.append(" | "); + } + content.append(member.getIntroduction()); + } + result.setContent(content.toString()); + + result.setDeptId(member.getDeptId()); + result.setZoneId(member.getZoneId()); + result.setCreateTime(member.getCreateTime()); + + // 根据匹配情况设置评分 + double score = 1.0; + if (member.getName() != null && member.getName().toLowerCase().contains(request.getKeyword().toLowerCase())) { + score = 2.0; // 会员名称匹配,评分更高 + } + result.setScore(score); + + // 添加扩展数据 + if (StringUtils.isNotEmpty(member.getImageUrl()) || member.getMemberLevelId() != null) { + try { + ObjectMapper objectMapper = new ObjectMapper(); + Map extendData = new HashMap<>(); + if (StringUtils.isNotEmpty(member.getImageUrl())) { + extendData.put("imageUrl", member.getImageUrl()); + } + if (member.getMemberLevelId() != null) { + extendData.put("memberLevelId", member.getMemberLevelId()); + } + if (member.getSysUser() != null && StringUtils.isNotEmpty(member.getSysUser().getAvatar())) { + extendData.put("userAvatar", member.getSysUser().getAvatar()); + } + result.setExtendData(objectMapper.writeValueAsString(extendData)); + } catch (Exception e) { + logger.warn("构建会员扩展数据失败: memberId={}, error={}", member.getId(), e.getMessage()); + } + } + + results.add(result); + } + } catch (Exception e) { + logger.error("搜索Zone会员失败: {}", e.getMessage()); } return results; } diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneMemberMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneMemberMapper.xml index 891a864e7..2f7e1ee3b 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneMemberMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneMemberMapper.xml @@ -363,4 +363,26 @@ from zone_member where zone_id = #{zoneId} + + + \ No newline at end of file From 9799da2fefa45f748c9d9b86d145d95fd2cf384c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Thu, 16 Apr 2026 11:13:40 +0800 Subject: [PATCH 13/59] =?UTF-8?q?feat(=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2?= =?UTF-8?q?):=20=E5=AE=9E=E7=8E=B0=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:使用git关键字搜索gitlink仓库时无法匹配,排查后发现FULLTEXT最小词长限制为4,小于四位的词长不会被匹配,同时对于the、of等停顿词也不会进行匹配 修复方案:补充LIKE作为后备搜索 --- .../resources/mapper/cms/CmsDocMapper.xml | 19 +++++++++++--- .../mapper/zone/ZoneProjectMapper.xml | 25 ++++++++++++------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml b/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml index d66f99632..fee46a864 100644 --- a/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml +++ b/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml @@ -495,18 +495,25 @@ - + @@ -517,7 +524,11 @@ WHERE cd.is_dir = 0 AND cd.audit_status = '1' - AND MATCH(cd.name, cd.summary) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) + AND ( + MATCH(cd.name, cd.summary) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) + OR cd.name LIKE CONCAT('%', #{keyword}, '%') + OR cd.summary LIKE CONCAT('%', #{keyword}, '%') + ) AND cd.dept_id = #{deptId} diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml index cb4b24997..be52126cb 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml @@ -277,7 +277,7 @@ where zone_id = #{zoneId} - + @@ -310,14 +315,16 @@ \ No newline at end of file From 822505b98927ef974376e83ecf5ebaa9773dd90f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Thu, 16 Apr 2026 11:15:06 +0800 Subject: [PATCH 14/59] =?UTF-8?q?feat(=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2?= =?UTF-8?q?):=20=E5=AE=9E=E7=8E=B0=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整资源附件匹配逻辑:由FULLTEXT全文检索调整为LIKE检索,保持和JAVA逻辑中的remoteFile接口处理一致 --- .../resource/mapper/ZoneResourceMapper.java | 4 +--- .../mapper/zone/ZoneResourceMapper.xml | 20 +++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java index de699cf1e..3a739adf7 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java @@ -113,9 +113,7 @@ public interface ZoneResourceMapper { * * @param keyword 搜索关键词 * @param zoneId 专区ID(可选) - * @param deptId 组织ID(可选) * @return 结果数量 */ - Long globalSearchCount(@Param("keyword") String keyword, @Param("zoneId") Long zoneId, - @Param("deptId") Long deptId); + Long globalSearchCount(@Param("keyword") String keyword, @Param("zoneId") Long zoneId); } diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneResourceMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneResourceMapper.xml index 79621d02e..bfbe4e6c5 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneResourceMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneResourceMapper.xml @@ -302,7 +302,7 @@ where zone_id = #{zoneId} - + @@ -354,17 +355,16 @@ zr.audit_status = '1' AND ( MATCH(zr.name, zr.keywords) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) + OR zr.name LIKE CONCAT('%', #{keyword}, '%') + OR zr.keywords LIKE CONCAT('%', #{keyword}, '%') OR EXISTS ( SELECT 1 FROM sys_file_info sf WHERE FIND_IN_SET(sf.file_id, zr.file_ids) - AND MATCH(sf.file_origin_name) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) + AND sf.file_origin_name LIKE CONCAT('%', #{keyword}, '%') ) ) AND zr.zone_id = #{zoneId} - - AND zr.dept_id = #{deptId} - \ No newline at end of file From cd483c065dbb5f4c82e4c37fb655eed7f8a4c14a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Thu, 16 Apr 2026 15:20:48 +0800 Subject: [PATCH 15/59] =?UTF-8?q?feat(=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2?= =?UTF-8?q?):=20=E5=AE=9E=E7=8E=B0=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 全局搜索的extendData字段由String类型调整为JSONObject类型,前端使用时更友好 2. 调整文章搜索逻辑:搜索结果按照全文搜索评分降序排序,同时返回全文搜索评分的分数 --- .../cms/doc/controller/OpenController.java | 20 +++--- .../cms/doc/domain/CmsDocWithScore.java | 23 +++++++ .../cms/doc/mapper/CmsDocMapper.java | 17 ++++++ .../cms/search/dto/DocSearchResult.java | 3 +- .../service/impl/GlobalSearchServiceImpl.java | 20 +++++- .../resources/mapper/cms/CmsDocMapper.xml | 61 +++++++++++++++++++ .../zone/search/dto/GlobalSearchResult.java | 3 +- .../service/impl/GlobalSearchServiceImpl.java | 17 +++--- 8 files changed, 138 insertions(+), 26 deletions(-) create mode 100644 microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDocWithScore.java diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/OpenController.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/OpenController.java index 61f465a64..cf3364636 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/OpenController.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/OpenController.java @@ -5,6 +5,7 @@ import com.microservices.cms.doc.domain.*; import com.microservices.cms.doc.service.ICmsDocCommentService; import com.microservices.cms.doc.service.ICmsDocService; import com.microservices.cms.doc.service.ICmsWechatService; +import com.microservices.cms.search.dto.DocSearchResult; import com.microservices.common.core.web.controller.BaseController; import com.microservices.common.core.web.domain.AjaxResult; import com.microservices.common.core.web.domain.GenericsAjaxResult; @@ -45,15 +46,15 @@ public class OpenController extends BaseController { /** * 文章搜索接口 * - * @param keyword 搜索关键词 - * @param zoneId 专区ID - * @param pageNum 页码 + * @param keyword 搜索关键词 + * @param zoneId 专区ID + * @param pageNum 页码 * @param pageSize 每页数量 * @return 搜索结果 */ @ApiOperation("文章搜索") @GetMapping("/search") - public TableDataInfo docSearchGet( + public GenericsTableDataInfo docSearchGet( @ApiParam("搜索关键词") @RequestParam String keyword, @ApiParam("专区ID") @RequestParam Long zoneId, @ApiParam("页码") @RequestParam(defaultValue = "1") Integer pageNum, @@ -69,12 +70,7 @@ public class OpenController extends BaseController { DocSearchResponse response = globalSearchService.docSearch(request); - TableDataInfo dataInfo = new TableDataInfo(); - dataInfo.setCode(200); - dataInfo.setMsg("查询成功"); - dataInfo.setRows(response.getResults()); - dataInfo.setTotal(response.getTotal()); - return dataInfo; + return new GenericsTableDataInfo<>(response.getResults(), response.getTotal()); } /** @@ -217,9 +213,9 @@ public class OpenController extends BaseController { @Log(title = "同步文章数据", businessType = BusinessType.UPDATE) public AjaxResult syncDocData( @ApiParam(name = "deptId", value = "组织Id", required = true) @PathVariable("deptId") Long deptId - ,@RequestBody() String bodyStr + , @RequestBody() String bodyStr , HttpServletRequest request) { - cmsDocService.syncDocData(deptId,bodyStr); + cmsDocService.syncDocData(deptId, bodyStr); return AjaxResult.success("同步消息发送成功"); } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDocWithScore.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDocWithScore.java new file mode 100644 index 000000000..1b1690561 --- /dev/null +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDocWithScore.java @@ -0,0 +1,23 @@ +package com.microservices.cms.doc.domain; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * CmsDoc with full-text search score + * 用于全局搜索结果,包含全文搜索相关度评分 + * + * @author otto + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class CmsDocWithScore extends CmsDoc implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 全文搜索相关度评分(来自 MySQL MATCH...AGAINST) + */ + private Double searchScore; +} diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/mapper/CmsDocMapper.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/mapper/CmsDocMapper.java index 64d165429..39b05dfd6 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/mapper/CmsDocMapper.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/mapper/CmsDocMapper.java @@ -2,6 +2,7 @@ package com.microservices.cms.doc.mapper; import com.microservices.cms.doc.domain.CmsDoc; import com.microservices.cms.doc.domain.CmsDocSearchVo; +import com.microservices.cms.doc.domain.CmsDocWithScore; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -213,4 +214,20 @@ public interface CmsDocMapper { * @return 结果数量 */ Long globalSearchCount(@Param("keyword") String keyword, @Param("deptId") Long deptId); + + /** + * 全局搜索 - 全文索引查询(含评分) + * + * @param keyword 搜索关键词 + * @param deptId 组织ID(可选) + * @param offset 偏移量 + * @param pageSize 每页数量 + * @return 搜索结果列表(含评分) + */ + List globalSearchWithScore( + @Param("keyword") String keyword, + @Param("deptId") Long deptId, + @Param("offset") int offset, + @Param("pageSize") int pageSize + ); } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchResult.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchResult.java index 5415b77da..24915421b 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchResult.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/dto/DocSearchResult.java @@ -1,5 +1,6 @@ package com.microservices.cms.search.dto; +import com.alibaba.fastjson2.JSONObject; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -66,5 +67,5 @@ public class DocSearchResult implements Serializable { * 扩展数据(JSON格式) */ @ApiModelProperty(value = "扩展数据") - private String extendData; + private JSONObject extendData; } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/service/impl/GlobalSearchServiceImpl.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/service/impl/GlobalSearchServiceImpl.java index eca4bb2ea..3224e7e14 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/service/impl/GlobalSearchServiceImpl.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/search/service/impl/GlobalSearchServiceImpl.java @@ -1,6 +1,8 @@ package com.microservices.cms.search.service.impl; +import com.alibaba.fastjson2.JSONObject; import com.microservices.cms.doc.domain.CmsDoc; +import com.microservices.cms.doc.domain.CmsDocWithScore; import com.microservices.cms.doc.mapper.CmsDocMapper; import com.microservices.cms.doc.service.ICmsDocService; import com.microservices.cms.search.service.IGlobalSearchService; @@ -135,21 +137,33 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { // 使用部门ID参数 Long deptId = cmsDocService.getDeptIdByZoneId(request.getZoneId()); - List docs = cmsDocMapper.globalSearch( + // 使用新的带评分的查询方法 + List docs = cmsDocMapper.globalSearchWithScore( request.getKeyword(), deptId, (request.getPageNum() - 1) * request.getPageSize(), request.getPageSize() ); - for (CmsDoc doc : docs) { + for (CmsDocWithScore doc : docs) { DocSearchResult result = new DocSearchResult(); result.setId(doc.getId()); result.setTitle(doc.getName()); result.setContent(doc.getSummary()); result.setDeptId(doc.getDeptId()); result.setCreateTime(doc.getCreateTime()); - result.setScore(1.0); // MySQL全文索引默认相关度 + + // 使用数据库返回的实际搜索评分 + Double score = doc.getSearchScore(); + if (score == null || score == 0.0) { + // 对于 LIKE 匹配(无全文评分),赋予最小评分 + score = 0.1; + } + result.setScore(score); + + JSONObject extendData = new JSONObject(); + extendData.put("visits", doc.getVisits()); + result.setExtendData(extendData); results.add(result); } } catch (Exception e) { diff --git a/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml b/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml index fee46a864..d7ad24a14 100644 --- a/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml +++ b/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml @@ -107,6 +107,40 @@ from cms_doc cd + + select cd.id, + cd.create_by, + cd.create_time, + cd.update_by, + cd.update_time, + cd.name, + cd.file_name, + cd.file_path, + cd.file_sha, + cd.file_size, + cd.file_url, + cd.html_url, + cd.visits, + cd.sort, + cd.publish_time, + cd.publish_user, + cd.publish_user_image, + cd.publish_user_url, + cd.publish_user_nickname, + cd.summary, + cd.head_img, + cd.dir_name, + cd.dept_id, + cd.issue_id, + cd.is_homepage, + cd.editor_type, + cd.keywords, + cd.is_dir, + -- 计算全文搜索相关度评分 + MATCH(cd.name, cd.summary) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) AS search_score + from cms_doc cd + + select cd.id, cd.create_by, @@ -533,4 +567,31 @@ AND cd.dept_id = #{deptId} + + + + + + + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchResult.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchResult.java index f71b97676..746a2611c 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchResult.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/dto/GlobalSearchResult.java @@ -1,5 +1,6 @@ package com.microservices.zone.search.dto; +import com.alibaba.fastjson2.JSONObject; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -78,5 +79,5 @@ public class GlobalSearchResult implements Serializable { * 扩展数据(JSON格式) */ @ApiModelProperty(value = "扩展数据") - private String extendData; + private JSONObject extendData; } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java index d3042bdd0..e4449fe16 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java @@ -1,5 +1,6 @@ package com.microservices.zone.search.service.impl; +import com.alibaba.fastjson2.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; import com.microservices.common.core.domain.R; import com.microservices.common.core.utils.StringUtils; @@ -229,11 +230,11 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { try { R> fileResponse = remoteFileService.getFileList(resource.getFileIds()); if (fileResponse != null && fileResponse.getCode() == 200 && fileResponse.getData() != null) { - List> matchedFiles = fileResponse.getData().stream() + List matchedFiles = fileResponse.getData().stream() .filter(file -> StringUtils.isNotEmpty(file.getFileOriginName()) && file.getFileOriginName().toLowerCase().contains(request.getKeyword().toLowerCase())) .map(file -> { - Map fileInfo = new HashMap<>(); + JSONObject fileInfo = new JSONObject(); fileInfo.put("fileId", file.getFileId()); fileInfo.put("fileName", file.getFileOriginName()); fileInfo.put("fileSize", file.getFileSizeInfo()); @@ -242,10 +243,9 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { .collect(Collectors.toList()); if (!matchedFiles.isEmpty()) { - ObjectMapper objectMapper = new ObjectMapper(); - Map extendData = new HashMap<>(); + JSONObject extendData = new JSONObject(); extendData.put("matchedFiles", matchedFiles); - result.setExtendData(objectMapper.writeValueAsString(extendData)); + result.setExtendData(extendData); } } } catch (Exception e) { @@ -256,7 +256,7 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { results.add(result); } } catch (Exception e) { - logger.error("搜索Zone资源失败: {}" , e.getMessage()); + logger.error("搜索Zone资源失败: {}", e.getMessage()); } return results; } @@ -307,8 +307,7 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { // 添加扩展数据 if (StringUtils.isNotEmpty(member.getImageUrl()) || member.getMemberLevelId() != null) { try { - ObjectMapper objectMapper = new ObjectMapper(); - Map extendData = new HashMap<>(); + JSONObject extendData = new JSONObject(); if (StringUtils.isNotEmpty(member.getImageUrl())) { extendData.put("imageUrl", member.getImageUrl()); } @@ -318,7 +317,7 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { if (member.getSysUser() != null && StringUtils.isNotEmpty(member.getSysUser().getAvatar())) { extendData.put("userAvatar", member.getSysUser().getAvatar()); } - result.setExtendData(objectMapper.writeValueAsString(extendData)); + result.setExtendData(extendData); } catch (Exception e) { logger.warn("构建会员扩展数据失败: memberId={}, error={}", member.getId(), e.getMessage()); } From a0384614d30bce53781119239802dbc659312b6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Thu, 16 Apr 2026 16:26:40 +0800 Subject: [PATCH 16/59] =?UTF-8?q?feat(=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2?= =?UTF-8?q?):=20=E5=AE=9E=E7=8E=B0=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整项目、资源、会员搜索逻辑:搜索结果按照全文搜索评分降序排序,同时返回全文搜索评分的分数 --- .../member/domain/ZoneMemberWithScore.java | 22 ++++++ .../zone/member/mapper/ZoneMemberMapper.java | 15 ++++ .../project/domain/ZoneProjectWithScore.java | 22 ++++++ .../project/mapper/ZoneProjectMapper.java | 15 ++++ .../domain/ZoneResourceWithScore.java | 22 ++++++ .../resource/mapper/ZoneResourceMapper.java | 15 ++++ .../service/impl/GlobalSearchServiceImpl.java | 39 +++++++---- .../mapper/zone/ZoneMemberMapper.xml | 68 +++++++++++++++++++ .../mapper/zone/ZoneProjectMapper.xml | 24 +++++++ .../mapper/zone/ZoneResourceMapper.xml | 31 +++++++++ 10 files changed, 261 insertions(+), 12 deletions(-) create mode 100644 microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/domain/ZoneMemberWithScore.java create mode 100644 microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/ZoneProjectWithScore.java create mode 100644 microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/domain/ZoneResourceWithScore.java diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/domain/ZoneMemberWithScore.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/domain/ZoneMemberWithScore.java new file mode 100644 index 000000000..25aa85bb9 --- /dev/null +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/domain/ZoneMemberWithScore.java @@ -0,0 +1,22 @@ +package com.microservices.zone.member.domain; + +import com.microservices.zone.member.domain.ZoneMember; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * ZoneMember with full-text search score + * 用于全局搜索结果,包含全文搜索相关度评分 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ZoneMemberWithScore extends ZoneMember implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 全文搜索相关度评分(来自 MySQL MATCH...AGAINST) + */ + private Double searchScore; +} diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java index 4710aafea..435d0437e 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java @@ -168,4 +168,19 @@ public interface ZoneMemberMapper { @Param("zoneId") Long zoneId, @Param("offset") int offset, @Param("pageSize") int pageSize); + + /** + * 全局搜索 - 会员名称和用户名搜索(含评分) + * + * @param keyword 搜索关键词 + * @param zoneId 专区ID + * @param offset 偏移量 + * @param pageSize 每页数量 + * @return 搜索结果列表(含评分) + */ + List globalSearchWithScore( + @Param("keyword") String keyword, + @Param("zoneId") Long zoneId, + @Param("offset") int offset, + @Param("pageSize") int pageSize); } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/ZoneProjectWithScore.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/ZoneProjectWithScore.java new file mode 100644 index 000000000..b1ab357fc --- /dev/null +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/ZoneProjectWithScore.java @@ -0,0 +1,22 @@ +package com.microservices.zone.project.domain; + +import com.microservices.zone.project.domain.ZoneProject; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * ZoneProject with full-text search score + * 用于全局搜索结果,包含全文搜索相关度评分 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ZoneProjectWithScore extends ZoneProject implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 全文搜索相关度评分(来自 MySQL MATCH...AGAINST) + */ + private Double searchScore; +} diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/mapper/ZoneProjectMapper.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/mapper/ZoneProjectMapper.java index 95f34dc3b..4b4fb601f 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/mapper/ZoneProjectMapper.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/mapper/ZoneProjectMapper.java @@ -179,4 +179,19 @@ public interface ZoneProjectMapper { */ Long globalSearchCount(@Param("keyword") String keyword, @Param("zoneId") Long zoneId, @Param("deptId") Long deptId); + + /** + * 全局搜索 - 全文索引查询(含评分) + * + * @param keyword 搜索关键词 + * @param zoneId 专区ID + * @param offset 偏移量 + * @param pageSize 每页数量 + * @return 搜索结果列表(含评分) + */ + List globalSearchWithScore( + @Param("keyword") String keyword, + @Param("zoneId") Long zoneId, + @Param("offset") int offset, + @Param("pageSize") int pageSize); } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/domain/ZoneResourceWithScore.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/domain/ZoneResourceWithScore.java new file mode 100644 index 000000000..81a74eba8 --- /dev/null +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/domain/ZoneResourceWithScore.java @@ -0,0 +1,22 @@ +package com.microservices.zone.resource.domain; + +import com.microservices.zone.resource.domain.ZoneResource; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * ZoneResource with full-text search score + * 用于全局搜索结果,包含全文搜索相关度评分 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ZoneResourceWithScore extends ZoneResource implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 全文搜索相关度评分(来自 MySQL MATCH...AGAINST) + */ + private Double searchScore; +} diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java index 3a739adf7..cfe7720bb 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java @@ -116,4 +116,19 @@ public interface ZoneResourceMapper { * @return 结果数量 */ Long globalSearchCount(@Param("keyword") String keyword, @Param("zoneId") Long zoneId); + + /** + * 全局搜索 - 全文索引查询(含评分) + * + * @param keyword 搜索关键词 + * @param zoneId 专区ID + * @param offset 偏移量 + * @param pageSize 每页数量 + * @return 搜索结果列表(含评分) + */ + List globalSearchWithScore( + @Param("keyword") String keyword, + @Param("zoneId") Long zoneId, + @Param("offset") int offset, + @Param("pageSize") int pageSize); } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java index e4449fe16..31760eef3 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/search/service/impl/GlobalSearchServiceImpl.java @@ -10,10 +10,13 @@ import com.microservices.system.api.RemoteFileService; import com.microservices.system.api.domain.SysFileInfo; import com.microservices.system.api.model.LoginUser; import com.microservices.zone.project.domain.ZoneProject; +import com.microservices.zone.project.domain.ZoneProjectWithScore; import com.microservices.zone.project.mapper.ZoneProjectMapper; import com.microservices.zone.resource.domain.ZoneResource; +import com.microservices.zone.resource.domain.ZoneResourceWithScore; import com.microservices.zone.resource.mapper.ZoneResourceMapper; import com.microservices.zone.member.domain.ZoneMember; +import com.microservices.zone.member.domain.ZoneMemberWithScore; import com.microservices.zone.member.mapper.ZoneMemberMapper; import com.microservices.zone.search.dto.GlobalSearchRequest; import com.microservices.zone.search.dto.GlobalSearchResponse; @@ -176,14 +179,14 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { private List searchZoneProjects(GlobalSearchRequest request) { List results = new ArrayList<>(); try { - List projects = zoneProjectMapper.globalSearch( + List projects = zoneProjectMapper.globalSearchWithScore( request.getKeyword(), request.getZoneId(), (request.getPageNum() - 1) * request.getPageSize(), request.getPageSize() ); - for (ZoneProject project : projects) { + for (ZoneProjectWithScore project : projects) { GlobalSearchResult result = new GlobalSearchResult(); result.setType("zone_project"); result.setId(project.getId()); @@ -192,7 +195,13 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { result.setDeptId(project.getDeptId()); result.setZoneId(project.getZoneId()); result.setCreateTime(project.getCreateTime()); - result.setScore(1.0); + + // 使用数据库返回的实际搜索评分 + Double score = project.getSearchScore(); + if (score == null || score == 0.0) { + score = 0.1; // LIKE 匹配的最小评分 + } + result.setScore(score); results.add(result); } } catch (Exception e) { @@ -207,14 +216,14 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { private List searchResources(GlobalSearchRequest request) { List results = new ArrayList<>(); try { - List resources = zoneResourceMapper.globalSearch( + List resources = zoneResourceMapper.globalSearchWithScore( request.getKeyword(), request.getZoneId(), (request.getPageNum() - 1) * request.getPageSize(), request.getPageSize() ); - for (ZoneResource resource : resources) { + for (ZoneResourceWithScore resource : resources) { GlobalSearchResult result = new GlobalSearchResult(); result.setType("resource"); result.setId(resource.getId()); @@ -223,7 +232,13 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { result.setDeptId(resource.getDeptId()); result.setZoneId(resource.getZoneId()); result.setCreateTime(resource.getCreateTime()); - result.setScore(1.0); + + // 使用数据库返回的实际搜索评分 + Double score = resource.getSearchScore(); + if (score == null || score == 0.0) { + score = 0.1; // LIKE 匹配的最小评分 + } + result.setScore(score); // 查询并过滤匹配的附件 if (StringUtils.isNotEmpty(resource.getFileIds())) { @@ -267,14 +282,14 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { private List searchZoneMembers(GlobalSearchRequest request) { List results = new ArrayList<>(); try { - List members = zoneMemberMapper.globalSearch( + List members = zoneMemberMapper.globalSearchWithScore( request.getKeyword(), request.getZoneId(), (request.getPageNum() - 1) * request.getPageSize(), request.getPageSize() ); - for (ZoneMember member : members) { + for (ZoneMemberWithScore member : members) { GlobalSearchResult result = new GlobalSearchResult(); result.setType("member"); result.setId(member.getId()); @@ -297,10 +312,10 @@ public class GlobalSearchServiceImpl implements IGlobalSearchService { result.setZoneId(member.getZoneId()); result.setCreateTime(member.getCreateTime()); - // 根据匹配情况设置评分 - double score = 1.0; - if (member.getName() != null && member.getName().toLowerCase().contains(request.getKeyword().toLowerCase())) { - score = 2.0; // 会员名称匹配,评分更高 + // 使用数据库返回的实际搜索评分 + Double score = member.getSearchScore(); + if (score == null || score == 0.0) { + score = 0.1; // LIKE 匹配(包括用户名匹配)的最小评分 } result.setScore(score); diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneMemberMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneMemberMapper.xml index 2f7e1ee3b..5a96c5fa2 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneMemberMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneMemberMapper.xml @@ -61,6 +61,11 @@ + + + + select zm.id, zm.user_id, @@ -109,6 +114,54 @@ left join zone_member_type zmt on zmt.id = zm.member_type_id + + select zm.id, + zm.user_id, + zm.name, + zm.image_url, + zm.introduction, + zm.member_type_id, + zm.member_level_id, + zm.is_audit, + zm.is_homepage, + zm.dept_id, + zm.del_flag, + zm.create_by, + zm.create_time, + zm.update_by, + zm.update_time, + zm.zone_id, + zm.sort, + zm.remark, + zm.audit_time, + zml.name as levelName, + zml.sort as levelSort, + zmt.name as typeName, + zmt.sort as typeSort, + u.user_id as userId, + u.gitlink_user_id, + u.user_name, + u.nick_name, + u.email, + u.avatar, + u.phonenumber, + u.sex, + u.status, + u.del_flag as userDelFlag, + d.dept_id as deptId, + d.parent_id, + d.ancestors, + d.dept_name, + d.order_num, + d.leader, + d.status as dept_status, + MATCH(zm.name) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) AS search_score + from zone_member as zm + left join sys_dept d on zm.dept_id = d.dept_id + left join sys_user u on u.user_id = zm.user_id + left join zone_member_level zml on zml.id = zm.member_level_id + left join zone_member_type zmt on zmt.id = zm.member_type_id + select id, user_id, @@ -385,4 +438,19 @@ zm.create_time DESC LIMIT #{offset}, #{pageSize} + + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml index be52126cb..aacb3a15a 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml @@ -45,6 +45,11 @@ + + + + select id, name, @@ -312,6 +317,25 @@ LIMIT #{offset}, #{pageSize} + + + + + + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml index 1220ceec7..0f68be949 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml @@ -354,4 +354,19 @@ AND zp.dept_id = #{deptId} + + \ No newline at end of file From 01eb5464e469fd17a4bb807a2ef75f651172ae3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Mon, 27 Apr 2026 14:19:51 +0800 Subject: [PATCH 34/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E4=BC=98=E5=8C=96=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E4=B8=AD=E9=A1=B9=E7=9B=AE=E6=90=9C=E7=B4=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 全局搜索调整为POST请求 --- .../cms/doc/controller/OpenController.java | 25 +++---------------- .../common/controller/OpenController.java | 4 +-- 2 files changed, 6 insertions(+), 23 deletions(-) diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/OpenController.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/OpenController.java index cf3364636..9bcfd5e6d 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/OpenController.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/OpenController.java @@ -46,30 +46,13 @@ public class OpenController extends BaseController { /** * 文章搜索接口 * - * @param keyword 搜索关键词 - * @param zoneId 专区ID - * @param pageNum 页码 - * @param pageSize 每页数量 * @return 搜索结果 */ @ApiOperation("文章搜索") - @GetMapping("/search") - public GenericsTableDataInfo docSearchGet( - @ApiParam("搜索关键词") @RequestParam String keyword, - @ApiParam("专区ID") @RequestParam Long zoneId, - @ApiParam("页码") @RequestParam(defaultValue = "1") Integer pageNum, - @ApiParam("每页数量") @RequestParam(defaultValue = "20") Integer pageSize) { - - DocSearchRequest request = new DocSearchRequest(); - request.setKeyword(keyword); - request.setZoneId(zoneId); - request.setPageNum(pageNum); - request.setPageSize(pageSize); - - logger.info("文章搜索请求(GET): keyword={}", keyword); - - DocSearchResponse response = globalSearchService.docSearch(request); - + @PostMapping("/search") + public GenericsTableDataInfo docSearch(@RequestBody DocSearchRequest docSearchRequest) { + logger.info("文章搜索请求: keyword={}", docSearchRequest.getKeyword()); + DocSearchResponse response = globalSearchService.docSearch(docSearchRequest); return new GenericsTableDataInfo<>(response.getResults(), response.getTotal()); } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/OpenController.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/OpenController.java index 0c53285ac..67dfa5884 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/OpenController.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/OpenController.java @@ -425,10 +425,10 @@ public class OpenController extends BaseController { * * @return 搜索结果 */ - @ApiOperation("全局搜索(GET)") + @ApiOperation("全局搜索") @PostMapping("/global") public GenericsTableDataInfo globalSearchGet(@RequestBody GlobalSearchRequest globalSearchRequest) { - logger.info("全局搜索请求(GET): keyword={}, types={}", globalSearchRequest.getKeyword(), globalSearchRequest.getTypes()); + logger.info("全局搜索请求: keyword={}, types={}", globalSearchRequest.getKeyword(), globalSearchRequest.getTypes()); GlobalSearchResponse response = globalSearchService.globalSearch(globalSearchRequest); return new GenericsTableDataInfo<>(response.getResults(), response.getTotal()); } From 2fe06ea7881d3572a150920c8b2ef51e5b97fc98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Mon, 27 Apr 2026 14:28:24 +0800 Subject: [PATCH 35/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E4=BC=98=E5=8C=96=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E4=B8=AD=E9=A1=B9=E7=9B=AE=E6=90=9C=E7=B4=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/microservices/zone/member/mapper/ZoneMemberMapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java index e48eae894..4377a2a6a 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java @@ -184,5 +184,5 @@ public interface ZoneMemberMapper { @Param("offset") int offset, @Param("pageSize") int pageSize); - Long globalSearchCount(String keyword, Long zoneId); + Long globalSearchCount(@Param("keyword") String keyword, @Param("zoneId") Long zoneId); } From 7582c5cb11822fa2152dc319df7675d38d4f6ef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Tue, 28 Apr 2026 08:57:12 +0800 Subject: [PATCH 36/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E4=BC=98=E5=8C=96=E5=85=A8=E5=B1=80=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E4=B8=AD=E9=A1=B9=E7=9B=AE=E6=90=9C=E7=B4=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化搜索结果中出现匹配度很低的数据 --- .../resources/mapper/cms/CmsDocMapper.xml | 8 +-- .../common/controller/OpenController.java | 4 +- .../zone/member/mapper/ZoneMemberMapper.java | 14 ----- .../project/mapper/ZoneProjectMapper.java | 13 ----- .../resource/mapper/ZoneResourceMapper.java | 12 ----- .../mapper/zone/ZoneMemberMapper.xml | 28 ++-------- .../mapper/zone/ZoneProjectMapper.xml | 41 ++------------- .../mapper/zone/ZoneResourceMapper.xml | 52 ++----------------- 8 files changed, 14 insertions(+), 158 deletions(-) diff --git a/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml b/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml index 58db5a2b8..86e7ba14c 100644 --- a/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml +++ b/microservices-modules/microservices-modules-cms/src/main/resources/mapper/cms/CmsDocMapper.xml @@ -542,7 +542,7 @@ cd.is_dir = 0 AND cd.audit_status = '1' AND ( - MATCH(cd.name, cd.summary) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) + MATCH(cd.name, cd.summary) AGAINST(#{keyword} IN BOOLEAN MODE) OR cd.name LIKE CONCAT('%', #{keyword}, '%') OR cd.summary LIKE CONCAT('%', #{keyword}, '%') ) @@ -551,7 +551,7 @@ ORDER BY CASE - WHEN MATCH(cd.name, cd.summary) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) > 0 THEN 1 + WHEN MATCH(cd.name, cd.summary) AGAINST(#{keyword} IN BOOLEAN MODE) > 0 THEN 1 ELSE 2 END, cd.update_time DESC @@ -565,7 +565,7 @@ cd.is_dir = 0 AND cd.audit_status = '1' AND ( - MATCH(cd.name, cd.summary) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) + MATCH(cd.name, cd.summary) AGAINST(#{keyword} IN BOOLEAN MODE) OR cd.name LIKE CONCAT('%', #{keyword}, '%') OR cd.summary LIKE CONCAT('%', #{keyword}, '%') ) @@ -586,7 +586,7 @@ cd.is_dir = 0 AND cd.audit_status = '1' AND ( - MATCH(cd.name, cd.summary) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) + MATCH(cd.name, cd.summary) AGAINST(#{keyword} IN BOOLEAN MODE) OR cd.name LIKE CONCAT('%', #{keyword}, '%') OR cd.summary LIKE CONCAT('%', #{keyword}, '%') ) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/OpenController.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/OpenController.java index 67dfa5884..7a03b6f08 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/OpenController.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/common/controller/OpenController.java @@ -6,7 +6,6 @@ import com.microservices.common.core.web.controller.BaseController; import com.microservices.common.core.web.domain.AjaxResult; import com.microservices.common.core.web.domain.GenericsAjaxResult; import com.microservices.common.core.web.page.GenericsTableDataInfo; -import com.microservices.common.core.web.page.TableDataInfo; import com.microservices.common.log.annotation.Log; import com.microservices.common.log.enums.BusinessType; import com.microservices.system.api.domain.SysUser; @@ -30,7 +29,6 @@ import com.microservices.zone.project.domain.vo.ZoneProjectSearchVo; import com.microservices.zone.project.domain.vo.ZoneStatisticsVo; import com.microservices.zone.project.service.IZoneProjectService; import com.microservices.zone.project.service.IZoneProjectTypeService; -import com.microservices.zone.resource.domain.ZoneResource; import com.microservices.zone.resource.domain.ZoneResourceDomain; import com.microservices.zone.resource.domain.ZoneResourceType; import com.microservices.zone.resource.domain.vo.ZoneResourceDataVo; @@ -427,7 +425,7 @@ public class OpenController extends BaseController { */ @ApiOperation("全局搜索") @PostMapping("/global") - public GenericsTableDataInfo globalSearchGet(@RequestBody GlobalSearchRequest globalSearchRequest) { + public GenericsTableDataInfo globalSearch(@RequestBody GlobalSearchRequest globalSearchRequest) { logger.info("全局搜索请求: keyword={}, types={}", globalSearchRequest.getKeyword(), globalSearchRequest.getTypes()); GlobalSearchResponse response = globalSearchService.globalSearch(globalSearchRequest); return new GenericsTableDataInfo<>(response.getResults(), response.getTotal()); diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java index 4377a2a6a..9db2cab83 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/member/mapper/ZoneMemberMapper.java @@ -155,20 +155,6 @@ public interface ZoneMemberMapper { */ List checkUserIsMemberInDepts(@Param("userId") Long userId, @Param("deptIds") Long[] deptIds); - /** - * 全局搜索 - 会员名称和用户名搜索 - * - * @param keyword 搜索关键词 - * @param zoneId 专区ID - * @param offset 偏移量 - * @param pageSize 每页数量 - * @return 搜索结果列表 - */ - List globalSearch(@Param("keyword") String keyword, - @Param("zoneId") Long zoneId, - @Param("offset") int offset, - @Param("pageSize") int pageSize); - /** * 全局搜索 - 会员名称和用户名搜索(含评分) * diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/mapper/ZoneProjectMapper.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/mapper/ZoneProjectMapper.java index 9f731c771..883654868 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/mapper/ZoneProjectMapper.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/mapper/ZoneProjectMapper.java @@ -156,19 +156,6 @@ public interface ZoneProjectMapper { */ int deleteZoneProjectByZoneId(Long zoneId); - /** - * 全局搜索 - 全文索引查询 - * - * @param keyword 搜索关键词 - * @param zoneId 专区ID(可选) - * @param offset 偏移量 - * @param pageSize 每页数量 - * @return 搜索结果列表 - */ - List globalSearch(@Param("keyword") String keyword, @Param("zoneId") Long zoneId, - @Param("offset") int offset, - @Param("pageSize") int pageSize); - /** * 全局搜索结果计数 * diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java index cfe7720bb..9e9d30626 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/resource/mapper/ZoneResourceMapper.java @@ -96,18 +96,6 @@ public interface ZoneResourceMapper { */ void deleteZoneResourceByZoneId(Long zoneId); - /** - * 全局搜索 - 全文索引查询 - * - * @param keyword 搜索关键词 - * @param zoneId 专区ID - * @param offset 偏移量 - * @param pageSize 每页数量 - * @return 搜索结果列表 - */ - List globalSearch(@Param("keyword") String keyword, @Param("zoneId") Long zoneId, - @Param("offset") int offset,@Param("pageSize") int pageSize); - /** * 全局搜索结果计数 * diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneMemberMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneMemberMapper.xml index 01726e6ea..0c37dcecf 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneMemberMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneMemberMapper.xml @@ -156,7 +156,7 @@ d.order_num, d.leader, d.status as dept_status, - MATCH(zm.name) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) AS search_score + MATCH(zm.name) AGAINST(#{keyword} IN BOOLEAN MODE) AS search_score from zone_member as zm left join sys_dept d on zm.dept_id = d.dept_id left join sys_user u on u.user_id = zm.user_id @@ -418,28 +418,6 @@ where zone_id = #{zoneId} - - - - SELECT zp.id, - zp.name, - zp.sort, - zp.full_name, - zp.gitlink_project_id, - zp.dept_id, - zp.zone_id, - zp.del_flag, - zp.create_by, - zp.create_time, - zp.update_by, - zp.update_time, - zp.project_type_id, - zp.is_homepage, - zp.audit_status, - zp.audit_time, - zp.audit_by - FROM zone_project zp - WHERE zp.zone_id = #{zoneId} - AND zp.audit_status = '1' - AND ( - MATCH(zp.name) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) - OR zp.name LIKE CONCAT('%', #{keyword}, '%') - ) - ORDER BY - CASE - WHEN MATCH(zp.name) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) > 0 THEN 1 - ELSE 2 - END, - zp.update_time DESC - LIMIT #{offset}, #{pageSize} - - - SELECT zr.id, - zr.name, - zr.file_ids, - zr.domain_id, - zr.sort, - zr.is_homepage, - zr.zone_id, - zr.dept_id, - zr.del_flag, - zr.create_by, - zr.create_time, - zr.update_by, - zr.update_time, - zr.editor_type, - zr.audit_status, - zr.audit_time, - zr.audit_by, - zr.summary, - zr.remark, - zr.keywords, - zr.extend_data - FROM zone_resource zr - WHERE - zr.zone_id = #{zoneId} - AND zr.audit_status = '1' - AND ( - MATCH(zr.name, zr.keywords) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) - OR zr.name LIKE CONCAT('%', #{keyword}, '%') - OR zr.keywords LIKE CONCAT('%', #{keyword}, '%') - OR EXISTS ( - SELECT 1 FROM sys_file_info sf - WHERE FIND_IN_SET(sf.file_id, zr.file_ids) - AND sf.file_origin_name LIKE CONCAT('%', #{keyword}, '%') - ) - ) - ORDER BY - CASE - WHEN MATCH(zr.name, zr.keywords) AGAINST(#{keyword} IN NATURAL LANGUAGE MODE) > 0 THEN 1 - ELSE 2 - END, - zr.update_time DESC - LIMIT #{offset}, #{pageSize} - - + insert into sys_user_dept_role From 77d8a8ae23121eebbee9165513d1f1a8c6f52f18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Tue, 28 Apr 2026 15:32:02 +0800 Subject: [PATCH 40/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E5=AD=98=E5=9C=A8=E5=BE=85=E5=AE=A1=E6=A0=B8=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=EF=BC=8C=E4=B8=8D=E5=85=81=E8=AE=B8=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/api/RemoteDeptService.java | 3 ++ .../factory/RemoteDeptFallbackFactory.java | 5 ++ .../common/core/constant/UserConstants.java | 4 ++ .../cms/doc/controller/CmsDocController.java | 2 +- .../doc/service/impl/CmsDocServiceImpl.java | 49 +++++++++++-------- .../controller/SysUserDeptRoleController.java | 8 +++ .../service/ISysUserDeptRoleService.java | 2 + .../impl/SysUserDeptRoleServiceImpl.java | 5 ++ 8 files changed, 57 insertions(+), 21 deletions(-) diff --git a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/RemoteDeptService.java b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/RemoteDeptService.java index d89fbfb3b..6d5a36bf8 100644 --- a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/RemoteDeptService.java +++ b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/RemoteDeptService.java @@ -163,4 +163,7 @@ public interface RemoteDeptService { */ @GetMapping("/SysUserDeptRole/checkUserInDept") R checkUserInDept(@RequestParam("currentDeptId") Long currentDeptId, @RequestParam("userId") Long userId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + @GetMapping("/SysUserDeptRole/getSysUserDeptRoleByDeptIdAndUserId") + R getSysUserDeptRoleByDeptIdAndUserId(@RequestParam("deptId") Long deptId, @RequestParam("userId") Long userId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } diff --git a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/factory/RemoteDeptFallbackFactory.java b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/factory/RemoteDeptFallbackFactory.java index 169c376a0..65fc6775e 100644 --- a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/factory/RemoteDeptFallbackFactory.java +++ b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/factory/RemoteDeptFallbackFactory.java @@ -92,6 +92,11 @@ public class RemoteDeptFallbackFactory implements FallbackFactory checkUserInDept(Long currentDeptId, Long userId, String source) { return R.fail("检查用户是否在指定部门下失败:" + throwable.getMessage()); } + + @Override + public R getSysUserDeptRoleByDeptIdAndUserId(Long deptId, Long userId, String source) { + return R.fail("获取用户在指定部门下的角色失败:" + throwable.getMessage()); + } }; } } diff --git a/microservices-common/microservices-common-core/src/main/java/com/microservices/common/core/constant/UserConstants.java b/microservices-common/microservices-common-core/src/main/java/com/microservices/common/core/constant/UserConstants.java index 7130861ce..578b6f430 100644 --- a/microservices-common/microservices-common-core/src/main/java/com/microservices/common/core/constant/UserConstants.java +++ b/microservices-common/microservices-common-core/src/main/java/com/microservices/common/core/constant/UserConstants.java @@ -167,4 +167,8 @@ public class UserConstants { * 文章管理-编辑文章权限 */ public static final String CMS_PERMS_DOCS_EDIT = "cms:doc:edit"; + /** + * 文章管理-审核文章权限 + */ + public static final String CMS_PERMS_DOCS_AUDIT = "cms:doc:audit"; } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/CmsDocController.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/CmsDocController.java index 8ca4468ab..82aa61d7d 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/CmsDocController.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/controller/CmsDocController.java @@ -238,7 +238,7 @@ public class CmsDocController extends BaseController { /** * 审核文章信息 */ - @RequiresPermissions("cms:doc:audit") + @RequiresPermissions(UserConstants.CMS_PERMS_DOCS_AUDIT) @Log(title = "文章信息", businessType = BusinessType.UPDATE) @PutMapping("/{id}/audit") @ApiOperation("审核文章") diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsDocServiceImpl.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsDocServiceImpl.java index e7523f3da..1b2dba5af 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsDocServiceImpl.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsDocServiceImpl.java @@ -10,7 +10,6 @@ import com.microservices.cms.doc.service.ICmsDocCommentService; import com.microservices.cms.doc.service.ICmsDocService; import com.microservices.cms.project.domain.CmsProject; import com.microservices.cms.project.service.ICmsProjectService; -import com.microservices.cms.search.dto.DocSearchResult; import com.microservices.cms.utils.CmsConstants; import com.microservices.cms.utils.CmsGitLinkRequestUrl; import com.microservices.common.core.constant.CacheConstants; @@ -361,7 +360,7 @@ public class CmsDocServiceImpl implements ICmsDocService { checkCmsLockStatus(dirDoc.getDeptId()); CmsDoc cmsDoc = cmsDocInputDto.toCmsDoc(dirDoc); - if (isNoAuditRequired(dirDoc.getDeptId()) || hasDeptPerms(dirDoc.getDeptId(), UserConstants.CMS_PERMS_DOCS_ADD)) { + if (isNoAuditRequired(dirDoc.getDeptId()) || hasDeptAdminPerms(dirDoc.getDeptId(), UserConstants.CMS_PERMS_DOCS_AUDIT)) { //文章自动置为审核通过状态值 cmsDoc.setAuditStatus(DocAuditStatus.AUDIT_PASS.getAuditCode()); boolean success = insertCommonCmsDoc(cmsDoc, @@ -424,6 +423,9 @@ public class CmsDocServiceImpl implements ICmsDocService { @Transactional(rollbackFor = Exception.class) public boolean auditCmsDoc(Long docId, CmsDocAuditVo cmsDocAuditVo) { CmsDoc cmsDoc = cmsDocMapper.selectCmsDocById(docId); + if (cmsDoc == null) { + throw new ServiceException("该文章不存在"); + } checkCmsLockStatus(cmsDoc.getDeptId()); CmsProject cmsProject = cmsProjectService.selectCmsProjectByDeptId(cmsDoc.getDeptId()); @@ -734,7 +736,7 @@ public class CmsDocServiceImpl implements ICmsDocService { } } //用户为专区管理员或专区无审核机制时,直接更新文章及仓库主分支 - if (hasDeptPerms(oldCmsDoc.getDeptId(), UserConstants.CMS_PERMS_DOCS_EDIT) || isNoAuditRequired(oldCmsDoc.getDeptId())) { + if (hasDeptAdminPerms(oldCmsDoc.getDeptId(), UserConstants.CMS_PERMS_DOCS_AUDIT) || isNoAuditRequired(oldCmsDoc.getDeptId())) { //专区管理员重新编辑并提交审核未通过文章 或 重新编辑并提交待审核文章时专区不需审核机制 if (!oldCmsDoc.getAuditStatus().equals(DocAuditStatus.AUDIT_PASS.getAuditCode())) { //文章审核类型:update-原文章id 取出原文章id直接更新,删除待审核更新类型文章 @@ -1305,11 +1307,12 @@ public class CmsDocServiceImpl implements ICmsDocService { cmsAsyncService.updateCmsPublishDataByGitLink(cmsProject, cmsDoc, branchName); } - private Boolean hasDeptPerms(Long deptId, String perms) { + private Boolean hasDeptAdminPerms(Long deptId, String perms) { LoginUser loginUser = SecurityUtils.getLoginUser(); Boolean hasPerms = FeignUtils.getReturnData( remoteDeptService.checkUserInDeptOrParentDeptHasPerms(deptId, loginUser.getUserId(), perms, SecurityConstants.INNER) ); + if (hasPerms == null) { hasPerms = false; } @@ -1327,35 +1330,26 @@ public class CmsDocServiceImpl implements ICmsDocService { CmsProject cmsProject = cmsProjectService.selectCmsProjectByDeptId(cmsDoc.getDeptId()); //删除待审核、审核未通过文章——删除临时分支,拒绝合并请求 - if (DocAuditStatus.TO_BE_AUDIT.getAuditCode().equals(cmsDoc.getAuditStatus()) - || DocAuditStatus.AUDIT_FAIL.getAuditCode().equals(cmsDoc.getAuditStatus())) { + if (DocAuditStatus.TO_BE_AUDIT.getAuditCode().equals(cmsDoc.getAuditStatus())) { //拒绝GitLink合并请求 gitLinkRequestHelper.doPost( CmsGitLinkRequestUrl.REFUSE_MERGE_PULL_REQUEST(cmsProject, cmsDoc.getAuditPrNumber()), null); gitLinkRequestHelper.doPost(CmsGitLinkRequestUrl.DELETE_BRANCH(cmsProject, cmsDoc.getAuditTmpBranchName()), null); - - // 所有删除操作调整为将审核状态设置为已拒绝 - cmsDoc.setAuditType(DocAuditStatus.AUDIT_FAIL.getAuditCode()); - cmsDoc.setRemark("管理员删除"); - cmsDocMapper.updateCmsDoc(cmsDoc); - return 1; + return cmsDocMapper.deleteCmsDocById(cmsDoc.getId()); + } + if (DocAuditStatus.AUDIT_FAIL.getAuditCode().equals(cmsDoc.getAuditStatus())) { + return cmsDocMapper.deleteCmsDocById(cmsDoc.getId()); } // 判读当前用户是否拥有文章直接删除权限 - if (hasDeptPerms(cmsDoc.getDeptId(), UserConstants.CMS_PERMS_DOCS_DELETE) //当前用户为专区管理员 + if (hasDeptAdminPerms(cmsDoc.getDeptId(), UserConstants.CMS_PERMS_DOCS_AUDIT) //当前用户为专区管理员 || isNoAuditRequired(cmsDoc.getDeptId()) //当前专区文章发布无需审核机制 ) { String branchName = CmsConstants.BRANCH_MASTER; boolean deleteResult = cmsAsyncService.deleteCmsDocForGitLink(cmsDoc, cmsProject, branchName); if (deleteResult) { - CmsDocSearchVo cmsDocSearchVo = new CmsDocSearchVo(); - cmsDocSearchVo.setName(cmsDoc.getName()); - cmsDocSearchVo.setDeptId(cmsDoc.getDeptId()); - cmsDocSearchVo.setIsDir(false); - cmsDocSearchVo.setDirName(cmsDoc.getDirName()); - cmsDocSearchVo.setAuditStatus(DocAuditStatus.TO_BE_AUDIT.getAuditCode()); // 拒绝相关合并请求并清理所有临时分支,同时删除所有临时申请 - List tmpDocList = cmsDocMapper.selectCmsDocList(cmsDocSearchVo); + List tmpDocList = tmpDocList(cmsDoc); cmsAsyncService.clearTmpDoc(cmsProject, tmpDocList); cmsDoc.setAuditStatus(DocAuditStatus.AUDIT_FAIL.getAuditCode()); cmsDoc.setRemark("管理员删除"); @@ -1363,6 +1357,10 @@ public class CmsDocServiceImpl implements ICmsDocService { } } else { + List tmpDocList = tmpDocList(cmsDoc); + if (!tmpDocList.isEmpty()) { + throw new ServiceException("已存在待审核操作,请等待审核完成后再进行操作"); + } //1.创建一条auditType="delete-原文章id",audit_status=2,其余字段与待删除文章一致的新文章数据 CmsDoc newDocWithAudit = insertDeletedDocWithAudit(cmsDoc, id); cmsAsyncService.asyncCreateBranchAndDeleteFileAndCreatePR(newDocWithAudit, cmsProject); @@ -1371,6 +1369,17 @@ public class CmsDocServiceImpl implements ICmsDocService { throw new ServiceException("文件删除失败"); } + private List tmpDocList(CmsDoc cmsDoc) { + CmsDocSearchVo cmsDocSearchVo = new CmsDocSearchVo(); + cmsDocSearchVo.setName(cmsDoc.getName()); + cmsDocSearchVo.setDeptId(cmsDoc.getDeptId()); + cmsDocSearchVo.setIsDir(false); + cmsDocSearchVo.setDirName(cmsDoc.getDirName()); + cmsDocSearchVo.setAuditStatus(DocAuditStatus.TO_BE_AUDIT.getAuditCode()); + // 拒绝相关合并请求并清理所有临时分支,同时删除所有临时申请 + return cmsDocMapper.selectCmsDocList(cmsDocSearchVo); + } + public int deleteCmsDocDatabaseById(Long id) { CmsDoc cmsDoc = cmsDocMapper.selectCmsDocById(id); if (cmsDoc != null && !cmsDoc.getIsDir()) { diff --git a/microservices-modules/microservices-modules-system/src/main/java/com/microservices/system/controller/SysUserDeptRoleController.java b/microservices-modules/microservices-modules-system/src/main/java/com/microservices/system/controller/SysUserDeptRoleController.java index 51c5bd88a..818101fac 100644 --- a/microservices-modules/microservices-modules-system/src/main/java/com/microservices/system/controller/SysUserDeptRoleController.java +++ b/microservices-modules/microservices-modules-system/src/main/java/com/microservices/system/controller/SysUserDeptRoleController.java @@ -322,4 +322,12 @@ public class SysUserDeptRoleController extends BaseController { Boolean userInDept = sysUserDeptRoleService.checkUserInDept(currentDeptId, userId); return R.ok(userInDept); } + @ApiOperation(value = "用户是否在指定部门下", hidden = true) + @InnerAuth + @GetMapping("/getSysUserDeptRoleByDeptIdAndUserId") + public R getSysUserDeptRoleByDeptIdAndUserId(@ApiParam(name = "deptId", value = "组织id", required = true) Long deptId, + @ApiParam(name = "userId", value = "用户id", required = true) Long userId) { + SysUserDeptRole userIdentifier = sysUserDeptRoleService.getSysUserDeptRoleByDeptIdAndUserId(deptId, userId); + return R.ok(userIdentifier); + } } diff --git a/microservices-modules/microservices-modules-system/src/main/java/com/microservices/system/service/ISysUserDeptRoleService.java b/microservices-modules/microservices-modules-system/src/main/java/com/microservices/system/service/ISysUserDeptRoleService.java index a98eca638..5b6aedd5b 100644 --- a/microservices-modules/microservices-modules-system/src/main/java/com/microservices/system/service/ISysUserDeptRoleService.java +++ b/microservices-modules/microservices-modules-system/src/main/java/com/microservices/system/service/ISysUserDeptRoleService.java @@ -162,4 +162,6 @@ public interface ISysUserDeptRoleService { void deleteSysUserDeptRoleByDeleteUser(@Param("userId") Long userId); Boolean checkUserInDeptOrParentDeptHasPerms(Long deptId, Long userId, String perms); + + SysUserDeptRole getSysUserDeptRoleByDeptIdAndUserId(Long deptId, Long userId); } diff --git a/microservices-modules/microservices-modules-system/src/main/java/com/microservices/system/service/impl/SysUserDeptRoleServiceImpl.java b/microservices-modules/microservices-modules-system/src/main/java/com/microservices/system/service/impl/SysUserDeptRoleServiceImpl.java index 7a0194ae0..b18d862c1 100644 --- a/microservices-modules/microservices-modules-system/src/main/java/com/microservices/system/service/impl/SysUserDeptRoleServiceImpl.java +++ b/microservices-modules/microservices-modules-system/src/main/java/com/microservices/system/service/impl/SysUserDeptRoleServiceImpl.java @@ -574,6 +574,11 @@ public class SysUserDeptRoleServiceImpl implements ISysUserDeptRoleService { return hasPermsCount > 0; } + @Override + public SysUserDeptRole getSysUserDeptRoleByDeptIdAndUserId(Long deptId, Long userId) { + return sysUserDeptRoleMapper.selectSysUserDeptRoleByUserIdAndDeptId(userId, deptId); + } + @Override public Boolean checkUserInDept(Long currentDeptId, Long userId) { SysUserDeptRole sysUserDeptRole = sysUserDeptRoleMapper.selectSysUserDeptRoleByUserIdAndDeptId(userId, currentDeptId); From 18d0a9ce3e53ad1536677ca438c732f343b62e7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Tue, 28 Apr 2026 15:45:05 +0800 Subject: [PATCH 41/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E5=AD=98=E5=9C=A8=E5=BE=85=E5=AE=A1=E6=A0=B8=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=EF=BC=8C=E4=B8=8D=E5=85=81=E8=AE=B8=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../microservices/cms/doc/service/ICmsDocService.java | 2 ++ .../cms/doc/service/impl/CmsAsyncServiceImpl.java | 4 ++++ .../cms/doc/service/impl/CmsDocServiceImpl.java | 9 +++------ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/ICmsDocService.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/ICmsDocService.java index 1ea9e9833..a0f78e9c9 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/ICmsDocService.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/ICmsDocService.java @@ -294,4 +294,6 @@ public interface ICmsDocService { List selectCmsDocAndDirListByDept(Long deptId); void updateCmsDocShaByPathAndDeptId(String sha, String filePath, Long deptId); + + List getTmpDocList(CmsDoc cmsDoc); } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java index 62333f905..1f62e911d 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java @@ -647,6 +647,10 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { } private void createBranchByGitLink(CmsProject cmsProject, CmsDoc cmsDoc, String newBranchName) { + List tmpDocList = cmsDocService.getTmpDocList(cmsDoc); + if (!tmpDocList.isEmpty()) { + throw new ServiceException("已存在待审核操作,请等待审核完成后再进行操作"); + } //调用GitLink创建分支接口 JSONObject requestBody = new JSONObject(); requestBody.put("new_branch_name", newBranchName); diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsDocServiceImpl.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsDocServiceImpl.java index 1b2dba5af..a333f7fee 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsDocServiceImpl.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsDocServiceImpl.java @@ -1349,7 +1349,7 @@ public class CmsDocServiceImpl implements ICmsDocService { boolean deleteResult = cmsAsyncService.deleteCmsDocForGitLink(cmsDoc, cmsProject, branchName); if (deleteResult) { // 拒绝相关合并请求并清理所有临时分支,同时删除所有临时申请 - List tmpDocList = tmpDocList(cmsDoc); + List tmpDocList = getTmpDocList(cmsDoc); cmsAsyncService.clearTmpDoc(cmsProject, tmpDocList); cmsDoc.setAuditStatus(DocAuditStatus.AUDIT_FAIL.getAuditCode()); cmsDoc.setRemark("管理员删除"); @@ -1357,10 +1357,6 @@ public class CmsDocServiceImpl implements ICmsDocService { } } else { - List tmpDocList = tmpDocList(cmsDoc); - if (!tmpDocList.isEmpty()) { - throw new ServiceException("已存在待审核操作,请等待审核完成后再进行操作"); - } //1.创建一条auditType="delete-原文章id",audit_status=2,其余字段与待删除文章一致的新文章数据 CmsDoc newDocWithAudit = insertDeletedDocWithAudit(cmsDoc, id); cmsAsyncService.asyncCreateBranchAndDeleteFileAndCreatePR(newDocWithAudit, cmsProject); @@ -1369,7 +1365,8 @@ public class CmsDocServiceImpl implements ICmsDocService { throw new ServiceException("文件删除失败"); } - private List tmpDocList(CmsDoc cmsDoc) { + @Override + public List getTmpDocList(CmsDoc cmsDoc) { CmsDocSearchVo cmsDocSearchVo = new CmsDocSearchVo(); cmsDocSearchVo.setName(cmsDoc.getName()); cmsDocSearchVo.setDeptId(cmsDoc.getDeptId()); From 6e29169fa4dffd447f5ec02dd2003255bed66edc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Tue, 28 Apr 2026 16:04:08 +0800 Subject: [PATCH 42/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E5=AD=98=E5=9C=A8=E5=BE=85=E5=AE=A1=E6=A0=B8=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=EF=BC=8C=E4=B8=8D=E5=85=81=E8=AE=B8=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cms/doc/service/impl/CmsAsyncServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java index 1f62e911d..b2d887412 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java @@ -20,6 +20,7 @@ import com.microservices.cms.utils.CustomExecutorFactory; import com.microservices.common.core.constant.CacheConstants; import com.microservices.common.core.constant.Constants; import com.microservices.common.core.constant.SecurityConstants; +import com.microservices.common.core.enums.DocAndZoneOperation; import com.microservices.common.core.enums.DocAuditStatus; import com.microservices.common.core.enums.SystemRole; import com.microservices.common.core.exception.ServiceException; @@ -648,7 +649,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { private void createBranchByGitLink(CmsProject cmsProject, CmsDoc cmsDoc, String newBranchName) { List tmpDocList = cmsDocService.getTmpDocList(cmsDoc); - if (!tmpDocList.isEmpty()) { + if (tmpDocList.size() > 1) { throw new ServiceException("已存在待审核操作,请等待审核完成后再进行操作"); } //调用GitLink创建分支接口 From b62c85f3739de94a8e124ee9aee04cc3c5aae571 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Tue, 28 Apr 2026 16:19:35 +0800 Subject: [PATCH 43/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E5=AD=98=E5=9C=A8=E5=BE=85=E5=AE=A1=E6=A0=B8=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=EF=BC=8C=E4=B8=8D=E5=85=81=E8=AE=B8=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doc/service/impl/CmsAsyncServiceImpl.java | 25 +++++++++---------- .../doc/service/impl/CmsDocServiceImpl.java | 8 ++++++ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java index b2d887412..5c0ca62c0 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java @@ -613,18 +613,21 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { } //3.将文件变更同步至新分支 cmsDoc = updateCmsDocDatabaseAndUpdateForGitLink(cmsDoc, cmsDocDto, tmpBranchName); - //4.创建合并请求 - try { - createPullRequestByGitLink(cmsProject, - cmsDoc, "更新文章:" + StringUtils.truncateStringAndConcatenatingSpecifiedString(cmsDoc.getName(), - 100, "..."), tmpBranchName); - } catch (ServiceException e) { - //忽略重复创建PR异常 - if (!"请求GitLink失败(合并请求已存在)".equals(e.getMessage())) { - throw new ServiceException(e.getMessage()); + if (StringUtils.isEmpty(cmsDoc.getAuditPrNumber())) { + //4.创建合并请求 + try { + createPullRequestByGitLink(cmsProject, + cmsDoc, "更新文章:" + StringUtils.truncateStringAndConcatenatingSpecifiedString(cmsDoc.getName(), + 100, "..."), tmpBranchName); + } catch (ServiceException e) { + //忽略重复创建PR异常 + if (!"请求GitLink失败(合并请求已存在)".equals(e.getMessage())) { + throw new ServiceException(e.getMessage()); + } } } + cmsDocService.updateCmsCommonDatabase(cmsDoc, tmpBranchName); } @@ -648,10 +651,6 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { } private void createBranchByGitLink(CmsProject cmsProject, CmsDoc cmsDoc, String newBranchName) { - List tmpDocList = cmsDocService.getTmpDocList(cmsDoc); - if (tmpDocList.size() > 1) { - throw new ServiceException("已存在待审核操作,请等待审核完成后再进行操作"); - } //调用GitLink创建分支接口 JSONObject requestBody = new JSONObject(); requestBody.put("new_branch_name", newBranchName); diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsDocServiceImpl.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsDocServiceImpl.java index a333f7fee..c6c7f727b 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsDocServiceImpl.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsDocServiceImpl.java @@ -860,6 +860,10 @@ public class CmsDocServiceImpl implements ICmsDocService { } private CmsDoc insertDocWithAudit(CmsDoc oldCmsDoc, String auditType, String auditStatus) { + List tmpDocList = getTmpDocList(oldCmsDoc); + if (!tmpDocList.isEmpty()) { + throw new ServiceException("已存在待审核操作,请等待审核完成后再进行操作"); + } oldCmsDoc.setId(null); oldCmsDoc.setAuditType(auditType); oldCmsDoc.setAuditStatus(auditStatus); @@ -869,6 +873,10 @@ public class CmsDocServiceImpl implements ICmsDocService { } private CmsDoc insertDeletedDocWithAudit(CmsDoc oldCmsDoc, Long oldCmsDocId) { + List tmpDocList = getTmpDocList(oldCmsDoc); + if (!tmpDocList.isEmpty()) { + throw new ServiceException("已存在待审核操作,请等待审核完成后再进行操作"); + } oldCmsDoc.setId(null); oldCmsDoc.setAuditType(DocAndZoneOperation.OPERATION_DELETE.getOperationCode() + "-" + oldCmsDocId); oldCmsDoc.setAuditStatus(DocAuditStatus.TO_BE_AUDIT.getAuditCode()); From 6982b6451da6f49c73475826ad20c239b8473a50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Tue, 28 Apr 2026 16:43:06 +0800 Subject: [PATCH 44/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E5=AD=98=E5=9C=A8=E5=BE=85=E5=AE=A1=E6=A0=B8=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=EF=BC=8C=E4=B8=8D=E5=85=81=E8=AE=B8=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doc/service/impl/CmsAsyncServiceImpl.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java index 5c0ca62c0..0ec0bf09a 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/impl/CmsAsyncServiceImpl.java @@ -613,17 +613,15 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { } //3.将文件变更同步至新分支 cmsDoc = updateCmsDocDatabaseAndUpdateForGitLink(cmsDoc, cmsDocDto, tmpBranchName); - if (StringUtils.isEmpty(cmsDoc.getAuditPrNumber())) { - //4.创建合并请求 - try { - createPullRequestByGitLink(cmsProject, - cmsDoc, "更新文章:" + StringUtils.truncateStringAndConcatenatingSpecifiedString(cmsDoc.getName(), - 100, "..."), tmpBranchName); - } catch (ServiceException e) { - //忽略重复创建PR异常 - if (!"请求GitLink失败(合并请求已存在)".equals(e.getMessage())) { - throw new ServiceException(e.getMessage()); - } + //4.创建合并请求 + try { + createPullRequestByGitLink(cmsProject, + cmsDoc, "更新文章:" + StringUtils.truncateStringAndConcatenatingSpecifiedString(cmsDoc.getName(), + 100, "..."), tmpBranchName); + } catch (ServiceException e) { + //忽略重复创建PR异常 + if (!e.getMessage().contains("合并请求已存在")) { + throw new ServiceException(e.getMessage()); } } From d631abe3a15e5f397d21cf736c719fb51ab55a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Tue, 28 Apr 2026 18:16:43 +0800 Subject: [PATCH 45/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E6=A3=80=E6=9F=A5=E5=BD=93=E5=89=8D=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=9C=A8=E5=BD=93=E5=89=8D=E4=B8=93=E5=8C=BA?= =?UTF-8?q?=E4=B8=8B=E6=9D=83=E9=99=90=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/domain/vo/ZoneFrontRoleVo.java | 3 + .../service/impl/ZoneDetailServiceImpl.java | 86 +++++++++++++------ 2 files changed, 63 insertions(+), 26 deletions(-) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneFrontRoleVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneFrontRoleVo.java index 4e7ed58ed..88f74bb9d 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneFrontRoleVo.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneFrontRoleVo.java @@ -20,6 +20,9 @@ public class ZoneFrontRoleVo { @ApiModelProperty(value = "资讯管理访问地址") @JsonInclude(JsonInclude.Include.NON_EMPTY) private String docManageUrl; + @ApiModelProperty(value = "项目管理访问地址") + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private String projectManageUrl; } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java index a84b8dc0d..13aa378f5 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java @@ -24,6 +24,7 @@ import com.microservices.system.api.RemoteUserService; import com.microservices.system.api.domain.SysDept; import com.microservices.system.api.domain.SysDictData; import com.microservices.system.api.domain.SysUserDeptRole; +import com.microservices.system.api.model.LoginUser; import com.microservices.system.api.utils.FeignUtils; import com.microservices.zone.common.service.IZoneAsyncService; import com.microservices.zone.detail.domain.ZoneDetail; @@ -108,14 +109,19 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { private IZoneSpecialProjectService zoneSpecialProjectService; @Value("${zone.zoneAdminUrl}") private String zoneAdminUrl; - @Value("${zone.zoneConfigurationUrl}") - private String zoneConfigurationUrl; + @Value("${zone.zoneConfigurationPath:/zone/configuration}") + private String zoneConfigurationPath; @Value("${zone.adminUrl}") private String adminUrl; - @Value("${zone.resourceManageUrl}") - private String resourceManageUrl; - @Value("${zone.docManageUrl}") - private String docManageUrl; + @Value("${zone.resourceManagePath:/zone/resource/resource}") + private String resourceManagePath; + @Value("${zone.docManagePath:/zone/content/doc}") + private String docManagePath; + @Value("${zone.projectManagePath:/zone/project/list}") + private String projectManagePath; + + @Value("${http.gatewayUrl}") + public String gatewayUrl; @Autowired private RedisService redisService; @@ -202,13 +208,13 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { Date[] lastWeek = getLastWeek(); //专区文章数统计 ZoneDetailDataVo articlesGroupByKey = zoneDetailMapper - .countArticlesGroupByKey(lastWeek[0],lastWeek[1],zoneDetail.getKey()) ; + .countArticlesGroupByKey(lastWeek[0], lastWeek[1], zoneDetail.getKey()); if (articlesGroupByKey != null) { zoneDetailDataVo.setWeekArticles(articlesGroupByKey.getWeekArticles()); } //专区浏览数据统计 ZoneDetailDataVo puVsGroupByKey = zoneDetailMapper - .countPUVsGroupByKey(lastWeek[0],lastWeek[1],zoneDetail.getKey()) ; + .countPUVsGroupByKey(lastWeek[0], lastWeek[1], zoneDetail.getKey()); if (puVsGroupByKey != null) { zoneDetailDataVo.setWeekPV(puVsGroupByKey.getWeekPV()); zoneDetailDataVo.setWeekUV(puVsGroupByKey.getWeekUV()); @@ -505,14 +511,14 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { .filter(x -> zoneDetail.getDeptId().equals(x.getDeptId())) .findFirst().orElse(null); if (userIdentify != null) { - return genChangeCurrentUserIdentityUrl(userIdentify, gitLinkToken, zoneId, notMemberParentUserIdentify); + return genChangeCurrentUserIdentityUrl(userIdentify, zoneId, notMemberParentUserIdentify); } // 当不存在当前专区对应的管理权限时查找在父级组织中是否存在身份 userIdentify = userIdentifyList.stream() .filter(x -> deptAncestors.contains(String.valueOf(x.getDeptId()))) .findFirst().orElse(null); if (userIdentify != null) { - return genChangeCurrentUserIdentityUrl(userIdentify, gitLinkToken, zoneId, notMemberParentUserIdentify); + return genChangeCurrentUserIdentityUrl(userIdentify, zoneId, notMemberParentUserIdentify); } } return null; @@ -525,12 +531,11 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { * 参照需求 * * @param userIdentify - * @param gitLinkToken * @param zoneId * @param notMemberParentUserIdentify * @return */ - private String genChangeCurrentUserIdentityUrl(SysUserDeptRole userIdentify, String gitLinkToken, Long zoneId, SysUserDeptRole notMemberParentUserIdentify) { + private String genChangeCurrentUserIdentityUrl(SysUserDeptRole userIdentify, Long zoneId, SysUserDeptRole notMemberParentUserIdentify) { String roleKey = userIdentify.getSysRole().getRoleKey(); Long deptId = userIdentify.getDeptId(); if (SystemRole.ZONE_MEMBER.getRoleKey().equals(roleKey)) { @@ -541,10 +546,10 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { } if (SystemRole.ZONE_ADMIN.getRoleKey().equals(roleKey) || SystemRole.ZONE_OPERATOR.getRoleKey().equals(roleKey)) { - return zoneConfigurationUrl + "?changeCurrentUserIdentity=" + deptId; + return gatewayUrl + zoneConfigurationPath + "?changeCurrentUserIdentity=" + deptId; } if (SystemRole.PLATFORM_ADMIN.getRoleKey().equals(roleKey)) { - return zoneConfigurationUrl + "/" + zoneId + "?changeCurrentUserIdentity=" + deptId; + return gatewayUrl + zoneConfigurationPath + "/" + zoneId + "?changeCurrentUserIdentity=" + deptId; } return null; @@ -635,19 +640,48 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { public ZoneFrontRoleVo checkCurrentRoleInZone(Long zoneId) { ZoneFrontRoleVo zoneFrontRoleVo = new ZoneFrontRoleVo(); ZoneDetail zoneDetail = selectZoneDetailById(zoneId); - boolean isZoneAdmin = AuthUtil.hasUserIdentity(zoneDetail.getDeptId(), SystemRole.ZONE_ADMIN.getRoleKey()); - boolean isZoneOperator = AuthUtil.hasUserIdentity(zoneDetail.getDeptId(), SystemRole.ZONE_OPERATOR.getRoleKey()); - boolean isZoneMember = AuthUtil.hasUserIdentity(zoneDetail.getDeptId(), SystemRole.ZONE_MEMBER.getRoleKey()); - if (isZoneAdmin || isZoneOperator) { - zoneFrontRoleVo.setRole(ZoneConstants.FRONT_ROLE_MANAGER); - zoneFrontRoleVo.setResourceManageUrl(resourceManageUrl); - zoneFrontRoleVo.setDocManageUrl(docManageUrl); - } else if (isZoneMember) { - zoneFrontRoleVo.setRole(ZoneConstants.FRONT_ROLE_MEMBER); - } else { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysDept sysDept = FeignUtils.getReturnData(remoteDeptService.getDeptByDeptId(zoneDetail.getDeptId(), SecurityConstants.INNER)); + List userIdentifyList = FeignUtils.getReturnData( + remoteUserService.getSysUserDeptRoleListByUserName(loginUser.getUsername(), SecurityConstants.INNER) + ); + if (sysDept == null || userIdentifyList == null) { zoneFrontRoleVo.setRole(ZoneConstants.FRONT_ROLE_NONE); + return zoneFrontRoleVo; + } else { + List deptIdList = Arrays.asList(sysDept.getAncestors().split(",")); + SysUserDeptRole parentDeptUserIdentify = userIdentifyList + .stream() + .filter(x -> deptIdList.contains(String.valueOf(x.getDeptId()))) + .filter(x -> !x.getSysRole().getRoleKey().equals(SystemRole.ZONE_MEMBER.getRoleKey())) + .findFirst().orElse(null); + SysUserDeptRole currentUserIdentify = userIdentifyList.stream().filter(x -> x.getDeptId().equals(zoneDetail.getDeptId())).findFirst().orElse(null); + String resourceManageUrl = gatewayUrl + resourceManagePath + "?changeCurrentUserIdentity="; + String docManageUrl = gatewayUrl + docManagePath + "?changeCurrentUserIdentity="; + String projectManageUrl = gatewayUrl + projectManagePath + "?changeCurrentUserIdentity="; + if (currentUserIdentify != null) { + if (currentUserIdentify.getSysRole().getRoleKey().equals(SystemRole.ZONE_MEMBER.getRoleKey())) { + if (parentDeptUserIdentify != null) { + zoneFrontRoleVo.setRole(ZoneConstants.FRONT_ROLE_MANAGER); + zoneFrontRoleVo.setResourceManageUrl(resourceManageUrl + parentDeptUserIdentify.getDeptId()); + zoneFrontRoleVo.setDocManageUrl(docManageUrl + parentDeptUserIdentify.getDeptId()); + zoneFrontRoleVo.setProjectManageUrl(projectManageUrl + parentDeptUserIdentify.getDeptId()); + return zoneFrontRoleVo; + } else { + zoneFrontRoleVo.setRole(ZoneConstants.FRONT_ROLE_MEMBER); + return zoneFrontRoleVo; + } + } else { + zoneFrontRoleVo.setRole(ZoneConstants.FRONT_ROLE_MANAGER); + zoneFrontRoleVo.setResourceManageUrl(resourceManageUrl + currentUserIdentify.getDeptId()); + zoneFrontRoleVo.setDocManageUrl(docManageUrl + currentUserIdentify.getDeptId()); + zoneFrontRoleVo.setProjectManageUrl(projectManageUrl + currentUserIdentify.getDeptId()); + return zoneFrontRoleVo; + } + } } + zoneFrontRoleVo.setRole(ZoneConstants.FRONT_ROLE_NONE); return zoneFrontRoleVo; } @@ -678,14 +712,14 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { } if (SystemRole.ZONE_ADMIN.getRoleKey().equals(roleKey) || SystemRole.ZONE_OPERATOR.getRoleKey().equals(roleKey)) { - return zoneConfigurationUrl; + return gatewayUrl + zoneConfigurationPath; } if (SystemRole.PLATFORM_ADMIN.getRoleKey().equals(roleKey)) { ZoneDetail zoneDetail = zoneDetailMapper.selectZoneDetailByDeptId(deptId); if (zoneDetail == null) { return zoneAdminUrl; } - return zoneConfigurationUrl + "/" + zoneDetail.getId(); + return gatewayUrl + zoneConfigurationPath + "/" + zoneDetail.getId(); } return adminUrl; From c218b86a39be2a7c4c9ac607ed18005464f9a71e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Tue, 28 Apr 2026 18:25:02 +0800 Subject: [PATCH 46/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E6=A3=80=E6=9F=A5=E5=BD=93=E5=89=8D=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=9C=A8=E5=BD=93=E5=89=8D=E4=B8=93=E5=8C=BA?= =?UTF-8?q?=E4=B8=8B=E6=9D=83=E9=99=90=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ZoneDetailServiceImpl.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java index 13aa378f5..a510a257d 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java @@ -119,9 +119,6 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { private String docManagePath; @Value("${zone.projectManagePath:/zone/project/list}") private String projectManagePath; - - @Value("${http.gatewayUrl}") - public String gatewayUrl; @Autowired private RedisService redisService; @@ -546,10 +543,10 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { } if (SystemRole.ZONE_ADMIN.getRoleKey().equals(roleKey) || SystemRole.ZONE_OPERATOR.getRoleKey().equals(roleKey)) { - return gatewayUrl + zoneConfigurationPath + "?changeCurrentUserIdentity=" + deptId; + return adminUrl + zoneConfigurationPath + "?changeCurrentUserIdentity=" + deptId; } if (SystemRole.PLATFORM_ADMIN.getRoleKey().equals(roleKey)) { - return gatewayUrl + zoneConfigurationPath + "/" + zoneId + "?changeCurrentUserIdentity=" + deptId; + return adminUrl + zoneConfigurationPath + "/" + zoneId + "?changeCurrentUserIdentity=" + deptId; } return null; @@ -656,9 +653,9 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { .filter(x -> !x.getSysRole().getRoleKey().equals(SystemRole.ZONE_MEMBER.getRoleKey())) .findFirst().orElse(null); SysUserDeptRole currentUserIdentify = userIdentifyList.stream().filter(x -> x.getDeptId().equals(zoneDetail.getDeptId())).findFirst().orElse(null); - String resourceManageUrl = gatewayUrl + resourceManagePath + "?changeCurrentUserIdentity="; - String docManageUrl = gatewayUrl + docManagePath + "?changeCurrentUserIdentity="; - String projectManageUrl = gatewayUrl + projectManagePath + "?changeCurrentUserIdentity="; + String resourceManageUrl = adminUrl + resourceManagePath + "?changeCurrentUserIdentity="; + String docManageUrl = adminUrl + docManagePath + "?changeCurrentUserIdentity="; + String projectManageUrl = adminUrl + projectManagePath + "?changeCurrentUserIdentity="; if (currentUserIdentify != null) { if (currentUserIdentify.getSysRole().getRoleKey().equals(SystemRole.ZONE_MEMBER.getRoleKey())) { if (parentDeptUserIdentify != null) { @@ -712,14 +709,14 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { } if (SystemRole.ZONE_ADMIN.getRoleKey().equals(roleKey) || SystemRole.ZONE_OPERATOR.getRoleKey().equals(roleKey)) { - return gatewayUrl + zoneConfigurationPath; + return adminUrl + zoneConfigurationPath; } if (SystemRole.PLATFORM_ADMIN.getRoleKey().equals(roleKey)) { ZoneDetail zoneDetail = zoneDetailMapper.selectZoneDetailByDeptId(deptId); if (zoneDetail == null) { return zoneAdminUrl; } - return gatewayUrl + zoneConfigurationPath + "/" + zoneDetail.getId(); + return adminUrl + zoneConfigurationPath + "/" + zoneDetail.getId(); } return adminUrl; From 820ecc2d61d596bfb403ed07ab594c2ec7ca8c50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Tue, 28 Apr 2026 18:42:30 +0800 Subject: [PATCH 47/59] =?UTF-8?q?feat(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA?= =?UTF-8?q?):=20=E6=A3=80=E6=9F=A5=E5=BD=93=E5=89=8D=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=9C=A8=E5=BD=93=E5=89=8D=E4=B8=93=E5=8C=BA?= =?UTF-8?q?=E4=B8=8B=E6=9D=83=E9=99=90=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/service/impl/ZoneDetailServiceImpl.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java index a510a257d..6b2ae5649 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java @@ -663,18 +663,22 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { zoneFrontRoleVo.setResourceManageUrl(resourceManageUrl + parentDeptUserIdentify.getDeptId()); zoneFrontRoleVo.setDocManageUrl(docManageUrl + parentDeptUserIdentify.getDeptId()); zoneFrontRoleVo.setProjectManageUrl(projectManageUrl + parentDeptUserIdentify.getDeptId()); - return zoneFrontRoleVo; } else { zoneFrontRoleVo.setRole(ZoneConstants.FRONT_ROLE_MEMBER); - return zoneFrontRoleVo; } } else { zoneFrontRoleVo.setRole(ZoneConstants.FRONT_ROLE_MANAGER); zoneFrontRoleVo.setResourceManageUrl(resourceManageUrl + currentUserIdentify.getDeptId()); zoneFrontRoleVo.setDocManageUrl(docManageUrl + currentUserIdentify.getDeptId()); zoneFrontRoleVo.setProjectManageUrl(projectManageUrl + currentUserIdentify.getDeptId()); - return zoneFrontRoleVo; } + return zoneFrontRoleVo; + } else if (parentDeptUserIdentify != null) { + zoneFrontRoleVo.setRole(ZoneConstants.FRONT_ROLE_MANAGER); + zoneFrontRoleVo.setResourceManageUrl(resourceManageUrl + parentDeptUserIdentify.getDeptId()); + zoneFrontRoleVo.setDocManageUrl(docManageUrl + parentDeptUserIdentify.getDeptId()); + zoneFrontRoleVo.setProjectManageUrl(projectManageUrl + parentDeptUserIdentify.getDeptId()); + return zoneFrontRoleVo; } } From 31ad557697a1db898b3305989d03df2f2d9f0711 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Wed, 29 Apr 2026 10:07:06 +0800 Subject: [PATCH 48/59] =?UTF-8?q?fix(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA)?= =?UTF-8?q?:=20=E4=BF=AE=E5=A4=8D=E5=AE=A1=E6=A0=B8=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E7=9A=84=E9=A1=B9=E7=9B=AE=E8=81=9A=E5=90=88=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E7=94=B3=E8=AF=B7=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/mapper/zone/ZoneProjectMapper.xml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml index c4dc5a5bb..92152cd51 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml @@ -132,7 +132,14 @@ and zp.project_type_id = #{projectTypeId} and zp.zone_id = #{zoneId} and zp.create_by = #{createBy} - and zp.audit_status = #{auditStatus} + + + and zp.audit_status = #{auditStatus} + + + and zp.audit_status = '1' + + and zp.is_homepage = #{isHomepage} @@ -151,6 +158,14 @@ and zp.name like concat('%', #{name}, '%') and zp.project_type_id = #{projectTypeId} and zp.zone_id = #{zoneId} + + + and zp.audit_status = #{auditStatus} + + + and zp.audit_status = '1' + + ${params.dataScope} From 40620e18b57006f1aa664ed249003f60f3d9ca2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AC=A7=E6=B6=9B?= <731554297@qq.com> Date: Wed, 29 Apr 2026 10:36:55 +0800 Subject: [PATCH 49/59] =?UTF-8?q?fix(=E8=B6=85=E7=AE=97=E4=B8=93=E5=8C=BA)?= =?UTF-8?q?:=20=E4=BF=AE=E5=A4=8D=E5=AE=A1=E6=A0=B8=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E7=9A=84=E9=A1=B9=E7=9B=AE=E8=81=9A=E5=90=88=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E7=94=B3=E8=AF=B7=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/vo/ZoneProjectSearchVo.java | 4 ++- .../service/impl/ZoneProjectServiceImpl.java | 31 +++++++++++++------ .../mapper/zone/ZoneProjectMapper.xml | 15 +++++---- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectSearchVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectSearchVo.java index bf2e4a07b..292f5d5a8 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectSearchVo.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/domain/vo/ZoneProjectSearchVo.java @@ -13,9 +13,11 @@ import javax.validation.constraints.NotNull; @Data @ApiModel("项目聚合搜索对象") public class ZoneProjectSearchVo extends ZoneProjectOpenSearchVo { - @ApiModelProperty(value = "所属专区",required = true) + @ApiModelProperty(value = "所属专区", required = true) @NotNull private Long zoneId; @ApiModelProperty(value = "审核状态(0:待审核,1:审核通过 2:审核不通过)") private String auditStatus; + @ApiModelProperty(value = "是否为我的项目", hidden = true) + private Boolean isMyProject; } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java index 1e9451fb1..36e65e7ac 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/project/service/impl/ZoneProjectServiceImpl.java @@ -392,7 +392,10 @@ public class ZoneProjectServiceImpl implements IZoneProjectService { ZoneProject existingProject = zoneProjectMapper.selectZoneProjectByGitLinkProjectIdAndZoneId( zoneProjectInputVo.getGitlinkProjectId(), zoneProjectInputVo.getZoneId()); if (existingProject != null) { - throw new ServiceException("该GitLink项目已存在于专区中,不可重复添加"); + if (existingProject.getAuditStatus().equals(ZoneConstants.PROJECT_NOT_AUDIT)) { + throw new ServiceException("该项目正处于于专区审核中,不可重复添加"); + } + throw new ServiceException("该项目已存在于专区中,不可重复添加"); } JSONObject gitLinkProject = getGitLinkProjectById(zoneProjectInputVo.getGitlinkProjectId()); ZoneProject zoneProject = zoneProjectInputVo.toZoneProject(); @@ -566,7 +569,10 @@ public class ZoneProjectServiceImpl implements IZoneProjectService { JSONObject result = gitLinkRequestHelper.doGet( ZoneGitLinkRequestUrl.PROJECTS(gitLinkProjectSearchVo.genQueryString()) ); - return execGitlinkProjectsSearch(zoneId, result, ZoneConstants.GITLINK_RESPONSE_TOTAL_COUNT_KEY); + ZoneProjectSearchVo zoneProjectSearchVo = new ZoneProjectSearchVo(); + zoneProjectSearchVo.setZoneId(zoneId); + List zoneProjectList = zoneProjectMapper.selectZoneProjectList(zoneProjectSearchVo); + return execGitlinkProjectsSearch(zoneId, result, ZoneConstants.GITLINK_RESPONSE_TOTAL_COUNT_KEY, zoneProjectList); } @Override @@ -580,9 +586,12 @@ public class ZoneProjectServiceImpl implements IZoneProjectService { ZoneProject zoneProject = zoneProjectMapper .selectZoneProjectByGitLinkProjectIdAndZoneId(gitlinkProjectId, zoneId); if (zoneProject != null) { -// throw new ServiceException("该GitLink项目已存在于专区中,不可重复添加(专区Id[" + zoneId + "],GitLink项目Id[" + gitlinkProjectId + "])"); - logger.warn("该GitLink项目已存在于专区中,不可重复添加(专区Id[{}],GitLink项目Id[{}])", zoneId, gitlinkProjectId); - break; + if (zoneProject.getAuditStatus().equals(ZoneConstants.PROJECT_NOT_AUDIT)) { + throw new ServiceException("该项目正处于于专区审核中,不可重复添加(专区Id[" + zoneId + "],项目Id[" + gitlinkProjectId + "])"); + } + throw new ServiceException("该项目已存在于专区中,不可重复添加(专区Id[" + zoneId + "],项目Id[" + gitlinkProjectId + "])"); +// logger.warn("该GitLink项目已存在于专区中,不可重复添加(专区Id[{}],GitLink项目Id[{}])", zoneId, gitlinkProjectId); +// break; } success += insertZoneProject(zoneProjectInputVo); } @@ -765,17 +774,19 @@ public class ZoneProjectServiceImpl implements IZoneProjectService { JSONObject result = gitLinkRequestHelper.doGet( ZoneGitLinkRequestUrl.MY_OWNER_PROJECTS(SecurityUtils.getUsername(), gitLinkProjectSearchVo.myProjectsQueryString()) ); - return execGitlinkProjectsSearch(zoneId, result, ZoneConstants.GITLINK_RESPONSE_COUNT_KEY); + ZoneProjectSearchVo zoneProjectSearchVo = new ZoneProjectSearchVo(); + zoneProjectSearchVo.setZoneId(zoneId); + zoneProjectSearchVo.setIsMyProject(true); + List zoneProjectList = zoneProjectMapper.selectZoneProjectList(zoneProjectSearchVo); + return execGitlinkProjectsSearch(zoneId, result, ZoneConstants.GITLINK_RESPONSE_COUNT_KEY, zoneProjectList); } - private GenericsTableDataInfo execGitlinkProjectsSearch(Long zoneId, JSONObject result, String totalKey) { + private GenericsTableDataInfo execGitlinkProjectsSearch(Long zoneId, JSONObject result, String totalKey, List zoneProjectList) { List list = result.getList(ZoneConstants.GITLINK_RESPONSE_PROJECTS_KEY, JSONObject.class); if (list == null) { throw new ServiceException("Gitlink项目列表获取失败"); } - ZoneProjectSearchVo zoneProjectSearchVo = new ZoneProjectSearchVo(); - zoneProjectSearchVo.setZoneId(zoneId); - List zoneProjectList = zoneProjectMapper.selectZoneProjectList(zoneProjectSearchVo); + List gitlinkProjectList = new ArrayList<>(); for (JSONObject gitlinkProject : list) { if (zoneId != null) { diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml index 92152cd51..3c68154f0 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneProjectMapper.xml @@ -133,11 +133,12 @@ and zp.zone_id = #{zoneId} and zp.create_by = #{createBy} - - and zp.audit_status = #{auditStatus} + + and zp.audit_status != '2' - and zp.audit_status = '1' + and zp.audit_status = #{auditStatus} + and zp.audit_status = '1' and zp.is_homepage = #{isHomepage} @@ -159,11 +160,12 @@ and zp.project_type_id = #{projectTypeId} and zp.zone_id = #{zoneId} - - and zp.audit_status = #{auditStatus} + + and zp.audit_status != '2' - and zp.audit_status = '1' + and zp.audit_status = #{auditStatus} + and zp.audit_status = '1' @@ -174,6 +176,7 @@ where zp.zone_id = #{zoneId} and zp.gitlink_project_id = #{gitlinkProjectId} + and zp.audit_status != '2'