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 fc3c7f3b6..fba775ffe 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 @@ -231,7 +231,7 @@ public class CmsDocController extends BaseController { public AjaxResult editCmsDIr(@ApiParam(name = "id", value = "栏目Id") @PathVariable Long id, @ApiParam(name = "cmsDirUpdateVo", value = "栏目更新对象") @RequestBody CmsDirUpdateVo cmsDirUpdateVo) { cmsDocService.updateCmsDir(id, cmsDirUpdateVo); - return success("异步更新栏目信息"); + return success("栏目信息更新成功"); } /** 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 db49328f4..423a042dd 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 @@ -68,7 +68,7 @@ public class OpenController extends BaseController { public GenericsTableDataInfo docList(@ApiParam(name = "dirId", value = "栏目Id") @PathVariable("dirId") Long dirId , CmsDocSearchVo cmsDocSearchVo) { cmsDocSearchVo.setIsOpen(true); - List list = cmsDocService.selectCmsDocList(dirId, cmsDocSearchVo); + List list = cmsDocService.selectSetDefaultHeadImgCmsDocList(dirId, cmsDocSearchVo); return getAllGenericsDataTableToPage(list); } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDir.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDir.java index bee538d12..6489c0115 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDir.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDir.java @@ -41,6 +41,9 @@ public class CmsDir implements Comparable { @ApiModelProperty(value = "排序", hidden = true) private Integer sort; + @ApiModelProperty(value = "文章头图") + private String headImg; + public String getName() { if (name != null) { name = name.replaceAll(CmsConstants.DIR_SEPARATOR, diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDirUpdateVo.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDirUpdateVo.java index 16e14bdce..501b14166 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDirUpdateVo.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDirUpdateVo.java @@ -21,9 +21,6 @@ public class CmsDirUpdateVo { @ApiModelProperty(value = "顺序") private Integer order; - public CmsDir toCmsDir() { - CmsDir cmsDir = new CmsDir(); - cmsDir.setName(name); - return cmsDir; - } + @ApiModelProperty(value = "文章头图") + private String headImg; } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDoc.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDoc.java index bfc1b59de..5e4b59cdc 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDoc.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/CmsDoc.java @@ -166,6 +166,7 @@ public class CmsDoc extends BaseSortEntity { CmsDir cmsDir = new CmsDir(); cmsDir.setId(id); cmsDir.setName(name); + cmsDir.setHeadImg(headImg); cmsDir.setSort(this.getSort()); cmsDir.setCreatedAt(getCreateTime()); return cmsDir; @@ -186,6 +187,8 @@ public class CmsDoc extends BaseSortEntity { HotCmsDocDto hotCmsDocDto = new HotCmsDocDto(); hotCmsDocDto.setId(id); hotCmsDocDto.setName(name); + hotCmsDocDto.setSummary(summary); + hotCmsDocDto.setPublishTime(publishTime); return hotCmsDocDto; } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/HotCmsDocDto.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/HotCmsDocDto.java index e1eefc2ae..01debaa72 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/HotCmsDocDto.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/HotCmsDocDto.java @@ -1,10 +1,13 @@ package com.microservices.cms.doc.domain; +import com.fasterxml.jackson.annotation.JsonFormat; import com.microservices.common.core.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.Date; + /** * @author otto */ @@ -23,4 +26,11 @@ public class HotCmsDocDto { @Excel(name = "文章名称") @ApiModelProperty("文章名称") private String name; + + @ApiModelProperty("文章概要") + private String summary; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("发布时间") + private Date publishTime; } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/gitlink/EntryDto.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/gitlink/EntryDto.java index 826f468c1..9a2bafba4 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/gitlink/EntryDto.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/domain/gitlink/EntryDto.java @@ -1,5 +1,7 @@ package com.microservices.cms.doc.domain.gitlink; +import com.alibaba.fastjson2.JSONObject; +import com.microservices.common.core.exception.ServiceException; import lombok.Data; /** @@ -22,4 +24,12 @@ public class EntryDto implements Comparable { // 重写Comparable接口的compareTo方法,根据年龄升序排列,降序修改相减顺序即可 return Math.toIntExact(entryDto.getCommit().getCreated_at_unix() - this.commit.getCreated_at_unix()); } + + public static EntryDto getEntryDtoFromJson(JSONObject subEntriesResult) { + FileEntryDto fileEntryDto = subEntriesResult.toJavaObject(FileEntryDto.class); + if (fileEntryDto == null || fileEntryDto.getEntries() == null) { + throw new ServiceException("该文章不存在"); + } + return fileEntryDto.getEntries(); + } } 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 39c9cc400..aacb21b3e 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 @@ -31,6 +31,17 @@ public interface CmsDocMapper { */ public List selectCmsDocList(CmsDocSearchVo cmsDocSearchVo); + + + /** + * 查询文章信息列表(设置默认头图为栏目头图) + * + * @param cmsDocSearchVo 文章信息 + * @return 文章信息集合 + */ + List selectCmsDocListSetDefaultHeadImg(CmsDocSearchVo cmsDocSearchVo); + + /** * 新增文章信息 * @@ -172,4 +183,13 @@ public interface CmsDocMapper { Long getNotAuditCmsCountByDeptId(Long deptId); Long getCmsDocVisitsByDeptId(Long deptId); + + /** + * 根据组织id获取专区下所有文章和栏目 + * @param deptId 组织id + * @return 文章和栏目列表 + */ + List selectCmsDocAndDirListByDept(Long deptId); + + void updateCmsDocShaByPathAndDeptId(@Param("sha") String sha, @Param("filePath") String filePath, @Param("deptId") Long deptId); } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/ICmsAsyncService.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/ICmsAsyncService.java index fe7b5b464..8b65689fa 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/ICmsAsyncService.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/doc/service/ICmsAsyncService.java @@ -91,7 +91,7 @@ public interface ICmsAsyncService { void asyncCreateBranchAndDeleteFileAndCreatePR(CmsDoc newDocWithAudit, CmsProject cmsProject); - void asyncMoveFileToNewDir(CmsProject cmsProject, CmsDoc oldCmsDir, CmsDoc newCmsDir); + void asyncMoveFileToNewDir(CmsProject cmsProject, CmsDoc oldCmsDir, String newCmsDirName); /** * 推送文章数据到搜索引擎 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 01091cb37..1ea9e9833 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 @@ -288,4 +288,10 @@ public interface ICmsDocService { CmsDocBaseDto selectCmsDocBaseInfoById(Long id); Long getCmsDocVisitsByDeptId(Long deptId); + + List selectSetDefaultHeadImgCmsDocList(Long dirId, CmsDocSearchVo cmsDocSearchVo); + + List selectCmsDocAndDirListByDept(Long deptId); + + void updateCmsDocShaByPathAndDeptId(String sha, String filePath, Long deptId); } 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 f13577770..d5643f8c8 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 @@ -16,6 +16,7 @@ import com.microservices.cms.project.service.ICmsProjectService; import com.microservices.cms.utils.CmsConstants; import com.microservices.cms.utils.CmsGitLinkRequestUrl; import com.microservices.cms.utils.CmsUtils; +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; @@ -24,6 +25,7 @@ import com.microservices.common.core.exception.ServiceException; import com.microservices.common.core.utils.DateUtils; import com.microservices.common.core.utils.StringUtils; import com.microservices.common.core.utils.html.EscapeUtil; +import com.microservices.common.core.utils.sign.Base64; import com.microservices.common.core.utils.uuid.IdUtils; import com.microservices.common.httpClient.constant.GitLinkConstants; import com.microservices.common.httpClient.service.HttpAPIService; @@ -47,6 +49,7 @@ import org.springframework.util.DigestUtils; import java.net.URISyntaxException; import java.util.*; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -93,6 +96,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { private RemoteZoneService remoteZoneService; @Autowired private RequestConfig config; + /** * 异步设置文章更新时间 * @@ -109,7 +113,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { } else { redisService.setCacheObject(updateDocIntervalKey, cmsProject.getName(), 1L, TimeUnit.MINUTES); } - CmsDocSearchVo cmsDocSearch=new CmsDocSearchVo(); + CmsDocSearchVo cmsDocSearch = new CmsDocSearchVo(); cmsDocSearch.setDeptId(cmsProject.getDeptId()); List cmsDocList = cmsDocMapper.selectCmsDocList(cmsDocSearch); for (EntryDto entryDto : entryDtoList) { @@ -150,7 +154,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { webhook.put("eventCondition", "push"); webhook.put("http_method", "POST"); webhook.put("secret", ""); - webhook.put("url", gatewayUrl+"/cms/doc/open/dept/"+cmsProject.getDeptId()); + webhook.put("url", gatewayUrl + "/cms/doc/open/dept/" + cmsProject.getDeptId()); webhook.put("events", new String[]{"push"}); jsonObject.put("webhook", webhook); //增加Webhook @@ -231,7 +235,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { } private void syncDocAddedData(CmsProject cmsProject, List addedList) { - for (String addedFilePath:addedList) { + for (String addedFilePath : addedList) { try { String[] filePathList = addedFilePath.split("/"); if (filePathList.length != 2) { @@ -250,15 +254,15 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { syncCreateDoc(entry, dirName, cmsProject.getDeptId(), fileEntry.getLast_commit()); } } - }catch (Exception e){ + } catch (Exception e) { logger.error("[{}]同步新增文章发生异常:{}" , cmsProject.getName(), e.getMessage()); } } } - private void syncDocRemovedData(CmsProject cmsProject,List removedList) { - for (String removedFilePath:removedList) { + private void syncDocRemovedData(CmsProject cmsProject, List removedList) { + for (String removedFilePath : removedList) { try { String[] filePathList = removedFilePath.split("/"); if (filePathList.length != 2) { @@ -357,7 +361,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { cmsDocSearch.setDeptId(cmsDir.getDeptId()); cmsDocSearch.setDirName(cmsDir.getName()); cmsDocSearch.setIsDir(false); - List cmsDocList=cmsDocMapper.selectCmsDocList(cmsDocSearch); + List cmsDocList = cmsDocMapper.selectCmsDocList(cmsDocSearch); //获取数据库所有文件的filePath List databaseFilePathList = cmsDocList.stream().map(CmsDoc::getFilePath).collect(Collectors.toList()); //获取需要新增的文章 @@ -383,16 +387,16 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { @Override public void asyncDocData(Long deptId, String bodyStr) { //防止多次操作同时执行,将同步内容放入队列,根据先后时间执行同步动作 - String cmsSyncDeptIdKey=CacheConstants.CMS_SYNC_DEPT_ID_KEY+deptId; + String cmsSyncDeptIdKey = CacheConstants.CMS_SYNC_DEPT_ID_KEY + deptId; //为当前同步操作生成UUID,若拿到的UUID为自身,则执行本次同步动作 - String UUID= IdUtils.fastSimpleUUID(); + String UUID = IdUtils.fastSimpleUUID(); redisService.leftPush(cmsSyncDeptIdKey, UUID); //设置缓存过期时间,防止异常情况导致同步无法继续执行 redisService.expire(cmsSyncDeptIdKey, 3600, TimeUnit.SECONDS); String currentUUID = String.valueOf(redisService.listIndexOf(cmsSyncDeptIdKey, -1)); //设置最大循环阈值,防止意外情况导致死循环(7200次,约1小时左右) - int threshold=7200; - while (!UUID.equals(currentUUID)&&threshold!=0){ + int threshold = 7200; + while (!UUID.equals(currentUUID) && threshold != 0) { try { Thread.sleep(1000); } catch (InterruptedException e) { @@ -402,41 +406,41 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { threshold--; } - try{ - CmsProject cmsProject=cmsProjectService.selectCmsProjectByDeptId(deptId); - JSONObject body=JSONObject.parseObject(bodyStr); + try { + CmsProject cmsProject = cmsProjectService.selectCmsProjectByDeptId(deptId); + JSONObject body = JSONObject.parseObject(bodyStr); //获取本次推送中Commit总数 - Integer totalCommits=body.getInteger("total_commits"); + Integer totalCommits = body.getInteger("total_commits"); //从webhook请求中获取本次提交内容 - JSONArray commits=body.getJSONArray("commits"); + JSONArray commits = body.getJSONArray("commits"); //当commit总数大于提交的列表数量时,代表此次PUSH未携带所有commit,此时进行一次全量同步 - if(totalCommits!=null - &&commits!=null - &&totalCommits>commits.size()){ + if (totalCommits != null + && commits != null + && totalCommits > commits.size()) { fullSyncDocData(cmsProject); - }else{ - for (int i = commits.size()-1; i >=0 ; i--) { - JSONObject commit=commits.getJSONObject(i); + } else { + for (int i = commits.size() - 1; i >= 0; i--) { + JSONObject commit = commits.getJSONObject(i); //获取新增的文件列表 - JSONArray addedList=commit.getJSONArray("added"); - if(addedList!=null){ - syncDocAddedData(cmsProject,addedList.toJavaList(String.class)); + JSONArray addedList = commit.getJSONArray("added"); + if (addedList != null) { + syncDocAddedData(cmsProject, addedList.toJavaList(String.class)); } //获取删除的文件列表 - JSONArray removedList=commit.getJSONArray("removed"); - if(removedList!=null){ - syncDocRemovedData(cmsProject,removedList.toJavaList(String.class)); + JSONArray removedList = commit.getJSONArray("removed"); + if (removedList != null) { + syncDocRemovedData(cmsProject, removedList.toJavaList(String.class)); } //获取更新的文件列表 - JSONArray modifiedList=commit.getJSONArray("modified"); - if(modifiedList!=null){ + JSONArray modifiedList = commit.getJSONArray("modified"); + if (modifiedList != null) { syncDocModifiedData(cmsProject, modifiedList.toJavaList(String.class)); } } } - }catch (Exception e) { + } catch (Exception e) { logger.error("同步文章时发送异常:{}", e.getMessage()); - }finally { + } finally { //本次同步执行完成后,再弹出该UUID redisService.rightPop(cmsSyncDeptIdKey, 500, TimeUnit.MICROSECONDS); } @@ -469,12 +473,12 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { } @Override - public void syncCreateDir(String dirName,EntryDto entry,CmsProject cmsProject,boolean isCreateKeep){ + public void syncCreateDir(String dirName, EntryDto entry, CmsProject cmsProject, boolean isCreateKeep) { CmsDoc cmsDir = new CmsDoc(); cmsDir.setName(dirName); cmsDir.setCreateTime(entry.getCommit().getCreated_at()); boolean insertResult; - if(isCreateKeep){ + if (isCreateKeep) { //若该栏目不存在,检查文件夹中是否存在.keep文件 JSONObject subEntriesResult = gitLinkRequestHelper.doGet( CmsGitLinkRequestUrl.GET_FILE_SUB_ENTRIES(cmsProject, cmsDir.getName(), CmsConstants.BRANCH_MASTER)); @@ -484,14 +488,14 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { if (keepEntry != null) { //若存在,则在数据库中创建该栏目 - insertResult=createCmsDir(cmsDir,cmsProject.getDeptId(),keepEntry); + insertResult = createCmsDir(cmsDir, cmsProject.getDeptId(), keepEntry); } else { //若不存在,则在数据库中创建该栏目,同时在仓库的该文件夹下创建.keep文件 insertResult = cmsDocService.insertCmsDocDir(cmsProject.getDeptId(), cmsDir.copyToCmsDir()); } - }else{ + } else { //若不自动创建,则在数据库中创建根据文件名该栏目 - insertResult=createCmsDir(cmsDir,cmsProject.getDeptId(),entry); + insertResult = createCmsDir(cmsDir, cmsProject.getDeptId(), entry); } @@ -500,7 +504,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { } } - private boolean createCmsDir(CmsDoc cmsDir,Long deptId,EntryDto entry){ + private boolean createCmsDir(CmsDoc cmsDir, Long deptId, EntryDto entry) { cmsDir.setIsDir(true); cmsDir.setFilePath(cmsDir.getDirPath()); cmsDir.setDeptId(deptId); @@ -678,6 +682,7 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { requestBody); cmsDoc.setAuditPrNumber(result.getString("pull_request_number") + "-" + result.getString("pull_request_id")); } + @Override public CmsDoc updateCmsDocDatabaseAndUpdateForGitLink(CmsDoc oldCmsDoc, CmsDocDto cmsDocDto, String branchName) { if (oldCmsDoc == null) { @@ -871,27 +876,87 @@ public class CmsAsyncServiceImpl implements ICmsAsyncService { } @Override - @Async - public void asyncMoveFileToNewDir(CmsProject cmsProject, CmsDoc oldCmsDir, CmsDoc newCmsDir) { + public void asyncMoveFileToNewDir(CmsProject cmsProject, CmsDoc oldCmsDir, String newCmsDirName) { try { - remoteZoneService.lockCmsByDeptId(cmsProject.getDeptId(), 1, SecurityConstants.INNER); - //创建新栏目 - String message = String.format("重命名栏目:由[%s]重命名为[%s]", oldCmsDir.getName(), newCmsDir.getName()); - cmsDocService.createFileByGitLink(newCmsDir, message, ""); - //在数据库中重命名该栏目,防止后续操作推送的WebHook重复创建栏目 - cmsDocService.updateCmsCommonDatabase(newCmsDir, CmsConstants.BRANCH_MASTER); - //将原栏目中所有文章移动到新栏目中 - moveCmsDocToNewCmsDir(cmsProject, oldCmsDir.getName(), newCmsDir.getName(), message); - //删除旧栏目 - deleteCmsDocByGitLink(cmsProject, oldCmsDir); + JSONObject dirFilesJson = gitLinkRequestHelper.doGet(CmsGitLinkRequestUrl.GET_DIR_SUB_ENTRIES( + cmsProject, + oldCmsDir.getName(), + CmsConstants.BRANCH_MASTER)); + List entryDtoList = cmsDocService.getEntriesFromRequestResult(dirFilesJson, cmsProject, false); + CountDownLatch countDownLatch = new CountDownLatch(entryDtoList.size()); + // 异步获取每篇文章内容 + entryDtoList.forEach(entryDto -> { + CustomExecutorFactory.threadPoolExecutor.execute(() -> { + try { + JSONObject fileSubEntriesResult = gitLinkRequestHelper.doGet( + CmsGitLinkRequestUrl.GET_FILE_SUB_ENTRIES( + cmsProject, + entryDto.getPath(), + CmsConstants.BRANCH_MASTER)); + EntryDto cmsDocEntryDto = EntryDto.getEntryDtoFromJson(fileSubEntriesResult); + entryDto.setContent(cmsDocEntryDto.getContent()); + } finally { + countDownLatch.countDown(); + } + }); + }); + try { + countDownLatch.await(); + } catch (InterruptedException e) { + logger.error("栏目重命名失败(将对应代码库中文章移动至新文件夹失败):{}", e.getMessage()); + throw new ServiceException("栏目重命名失败"); + } + + for (EntryDto entryDto : entryDtoList) { + JSONObject updateFileBody = new JSONObject(); + updateFileBody.put("branch", CmsConstants.BRANCH_MASTER); + updateFileBody.put("message", "移动文章至新栏目"); + updateFileBody.put("from_path", entryDto.getPath()); + String newFilePath = newCmsDirName + "/" + entryDto.getName(); + updateFileBody.put("filepath", newFilePath); + updateFileBody.put("base64_filepath", Base64.contentToBase64(newFilePath)); + updateFileBody.put("sha", entryDto.getSha()); + String content = entryDto.getContent(); + if (content == null) { + content = ""; + } + updateFileBody.put("content", content); + gitLinkRequestHelper.doPut(CmsGitLinkRequestUrl.UPDATE_FILE(cmsProject), updateFileBody); + } + CmsDoc newCmsDoc = oldCmsDir.copyToRenameCmsDir(newCmsDirName); + //在数据库中重命名该栏目 + cmsDocService.updateCmsCommonDatabase(newCmsDoc, CmsConstants.BRANCH_MASTER); } catch (Exception e) { - logger.error("重命名栏目失败(原栏目名称[{}],新栏目名称[{}]):{}", oldCmsDir.getName(), newCmsDir.getName(), e.getMessage()); - throw new ServiceException("重命名栏目失败(原栏目名称[" + oldCmsDir.getName() + "],新栏目名称[" + newCmsDir.getName() + "])"); - } finally { - remoteZoneService.lockCmsByDeptId(cmsProject.getDeptId(), 0, SecurityConstants.INNER); + logger.error("重命名栏目失败(原栏目名称[{}],新栏目名称[{}]):{}", oldCmsDir.getName(), newCmsDirName, e.getMessage()); + throw new ServiceException("重命名栏目失败(原栏目名称[" + oldCmsDir.getName() + "],新栏目名称[" + newCmsDirName + "])"); } +// finally { +// remoteZoneService.lockCmsByDeptId(cmsProject.getDeptId(), 0, SecurityConstants.INNER); +// } } +// @Override +// @Async +// public void asyncMoveFileToNewDir(CmsProject cmsProject, CmsDoc oldCmsDir, CmsDoc newCmsDir) { +// try { +// remoteZoneService.lockCmsByDeptId(cmsProject.getDeptId(), 1, SecurityConstants.INNER); +// //创建新栏目 +// String message = String.format("重命名栏目:由[%s]重命名为[%s]", oldCmsDir.getName(), newCmsDir.getName()); +// cmsDocService.createFileByGitLink(newCmsDir, message, ""); +// //在数据库中重命名该栏目,防止后续操作推送的WebHook重复创建栏目 +// cmsDocService.updateCmsCommonDatabase(newCmsDir, CmsConstants.BRANCH_MASTER); +// //将原栏目中所有文章移动到新栏目中 +// moveCmsDocToNewCmsDir(cmsProject, oldCmsDir.getName(), newCmsDir.getName(), message); +// //删除旧栏目 +// deleteCmsDocByGitLink(cmsProject, oldCmsDir); +// } catch (Exception e) { +// logger.error("重命名栏目失败(原栏目名称[{}],新栏目名称[{}]):{}", oldCmsDir.getName(), newCmsDir.getName(), e.getMessage()); +// throw new ServiceException("重命名栏目失败(原栏目名称[" + oldCmsDir.getName() + "],新栏目名称[" + newCmsDir.getName() + "])"); +// } finally { +// remoteZoneService.lockCmsByDeptId(cmsProject.getDeptId(), 0, SecurityConstants.INNER); +// } +// } + @Async @Override public void pushDocDataSearchEngine(CmsDoc cmsDoc) { 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 4d42885d6..6bde4ed91 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 @@ -103,7 +103,7 @@ public class CmsDocServiceImpl implements ICmsDocService { CmsProject cmsProject = cmsProjectService.selectCmsProjectByDeptId(cmsDoc.getDeptId()); - String branchName = DocAuditStatus.AUDIT_PASS.getAuditCode().equals(cmsDoc.getAuditStatus()) ? CmsConstants.BRANCH_MASTER : cmsDoc.getAuditTmpBranchName(); + String branchName = DocAuditStatus.AUDIT_PASS.getAuditCode().equals(cmsDoc.getAuditStatus()) ? CmsConstants.BRANCH_MASTER : cmsDoc.getAuditTmpBranchName(); FileEntryDto fileEntryDto = getFileEntryDto(cmsProject, cmsDoc.getFilePath(), branchName); EntryDto entryDto = fileEntryDto.getEntries(); @@ -197,20 +197,21 @@ public class CmsDocServiceImpl implements ICmsDocService { @Override public void updateCmsDir(Long id, CmsDirUpdateVo cmsDirUpdateVo) { CmsDoc oldCmsDir = selectCmsDir(id); - checkCmsLockStatus(oldCmsDir.getDeptId()); //设置栏目排序 setCmsSort(cmsDirUpdateVo.getOrder(), oldCmsDir, false, null); + oldCmsDir.setHeadImg(cmsDirUpdateVo.getHeadImg()); updateCmsCommonDatabase(oldCmsDir, CmsConstants.BRANCH_MASTER); CmsProject cmsProject = cmsProjectService.selectCmsProjectByDeptId(oldCmsDir.getDeptId()); - CmsDoc newCmsDir = oldCmsDir.copyToRenameCmsDir(cmsDirUpdateVo.getName()); + String newCmsDirName = cmsDirUpdateVo.getName(); - if (StringUtils.isNotEmpty(newCmsDir.getName()) && !newCmsDir.getName().equals(oldCmsDir.getName())) { - CmsDoc cmsDir = cmsDocMapper.selectCmsDocDirByNameAndDeptId(newCmsDir.getName(), oldCmsDir.getDeptId()); + if (StringUtils.isNotEmpty(newCmsDirName) && !newCmsDirName.equals(oldCmsDir.getName())) { + CmsDoc cmsDir = cmsDocMapper.selectCmsDocDirByNameAndDeptId(newCmsDirName, oldCmsDir.getDeptId()); if (cmsDir != null) { - throw new ServiceException("栏目名称已存在,不允许进行重命名(新栏目名称[" + newCmsDir.getName() + "])"); - } - cmsAsyncService.asyncMoveFileToNewDir(cmsProject, oldCmsDir, newCmsDir); + throw new ServiceException("栏目名称已存在,不允许进行重命名(新栏目名称[" + newCmsDirName + "])"); } + // 异步修改栏目名称(将仓库内原文件夹下所有文章移动到新文件夹下) + cmsAsyncService.asyncMoveFileToNewDir(cmsProject, oldCmsDir, newCmsDirName); + } } @Override @@ -237,7 +238,7 @@ public class CmsDocServiceImpl implements ICmsDocService { cmsDocSearchVo.setDirName(cmsDir.getName()); cmsDocSearchVo.setDeptId(cmsDir.getDeptId()); cmsDocSearchVo.setIsDir(false); - List cmsDocList = cmsDocMapper.selectCmsDocList(cmsDocSearchVo); + List cmsDocList = cmsDocMapper.selectCmsDocListSetDefaultHeadImg(cmsDocSearchVo); List> futures = new ArrayList(); for (CmsDoc cmsDoc : cmsDocList) { CompletableFuture future = CompletableFuture.supplyAsync(() -> { @@ -283,6 +284,21 @@ public class CmsDocServiceImpl implements ICmsDocService { return selectCmsDocListByDatabase(dirId, cmsDocSearchVo); } + @Override + public List selectSetDefaultHeadImgCmsDocList(Long dirId, CmsDocSearchVo cmsDocSearchVo) { + return selectCmsDocListSetDefaultHeadImgByDatabase(dirId, cmsDocSearchVo); + } + + @Override + public List selectCmsDocAndDirListByDept(Long deptId) { + return cmsDocMapper.selectCmsDocAndDirListByDept(deptId); + } + + @Override + public void updateCmsDocShaByPathAndDeptId(String sha, String filePath, Long deptId) { + cmsDocMapper.updateCmsDocShaByPathAndDeptId(sha,filePath,deptId); + } + private List selectCmsDocListByDatabase(Long dirId, CmsDocSearchVo cmsDocSearchVo) { CmsDoc cmsDocDir = selectCmsDir(dirId); @@ -295,6 +311,24 @@ public class CmsDocServiceImpl implements ICmsDocService { return cmsDocList.stream().map(CmsDoc::copyToCmsDocBaseDto).collect(Collectors.toList()); } + /** + * 设置文章默认头图为栏目头图 + * @param dirId 栏目id + * @param cmsDocSearchVo 文章查询条件 + * @return 文章列表 + */ + private List selectCmsDocListSetDefaultHeadImgByDatabase(Long dirId, CmsDocSearchVo cmsDocSearchVo) { + CmsDoc cmsDocDir = selectCmsDir(dirId); + + cmsDocSearchVo.setDeptId(cmsDocDir.getDeptId()); + cmsDocSearchVo.setDirName(cmsDocDir.getName()); + List cmsDocList = cmsDocMapper.selectCmsDocListSetDefaultHeadImg(cmsDocSearchVo); + if (cmsDocList == null || cmsDocList.isEmpty()) { + return new ArrayList<>(); + } + return cmsDocList.stream().map(CmsDoc::copyToCmsDocBaseDto).collect(Collectors.toList()); + } + /** * 检查专区资讯是否处于锁定状态,若处于则抛出异常 * @@ -552,6 +586,7 @@ public class CmsDocServiceImpl implements ICmsDocService { throw new ServiceException("计算字符串Sha出错"); } } + @Override public void setCmsSort(Integer order, CmsDoc oldCmsDoc, boolean isChangeOnDir, String isHomePage) { //调整文章/栏目顺序 @@ -697,7 +732,7 @@ public class CmsDocServiceImpl implements ICmsDocService { Long originCmsDocId = Long.parseLong(oldCmsDoc.getAuditType().split("-")[1]); CmsDoc originCmsDoc = cmsDocMapper.selectCmsDocById(originCmsDocId); deleteTmpBranchIfBranchExist(oldCmsDoc); - BeanUtils.copyProperties(originCmsDoc,oldCmsDoc); + BeanUtils.copyProperties(originCmsDoc, oldCmsDoc); cmsDocMapper.deleteCmsDocById(id); } else //文章审核类型:create 直接新增文章 @@ -724,11 +759,11 @@ public class CmsDocServiceImpl implements ICmsDocService { } else //更新已发布文章 if (oldCmsDoc.getAuditStatus().equals(DocAuditStatus.AUDIT_PASS.getAuditCode())) { - //1.创建一条auditType="update-原文章id",audit_status为2,其余字段与待更新文章一致的新文章数据 - newDocWithAudit = insertDocWithAudit(oldCmsDoc, - DocAndZoneOperation.OPERATION_UPDATE.getOperationCode() + "-" + id, - DocAuditStatus.TO_BE_AUDIT.getAuditCode()); - } + //1.创建一条auditType="update-原文章id",audit_status为2,其余字段与待更新文章一致的新文章数据 + newDocWithAudit = insertDocWithAudit(oldCmsDoc, + DocAndZoneOperation.OPERATION_UPDATE.getOperationCode() + "-" + id, + DocAuditStatus.TO_BE_AUDIT.getAuditCode()); + } cmsAsyncService.asyncUpdateBranchAndFileAndCreatePR(newDocWithAudit, cmsDocDto); return true; } @@ -785,7 +820,7 @@ public class CmsDocServiceImpl implements ICmsDocService { gitLinkRequestHelper.doDelete(CmsGitLinkRequestUrl.DELETE_BRANCH(cmsProject, cmsDoc.getAuditTmpBranchName())); } catch (ServiceException e) { //忽略分支不存在异常 - if(!"分支不存在!".equals(e.getMessage())) { + if (!"分支不存在!".equals(e.getMessage())) { throw new ServiceException(e.getMessage()); } } @@ -863,6 +898,7 @@ public class CmsDocServiceImpl implements ICmsDocService { cmsDoc.setIsDir(true); cmsDoc.setFilePath(cmsDoc.getDirPath(cmsDir.getName())); cmsDoc.setDeptId(deptId); + cmsDoc.setHeadImg(cmsDir.getHeadImg()); cmsDoc.setName(cmsDir.getName()); return insertCommonCmsDoc(cmsDoc, "创建栏目:" + cmsDir.getName(), ""); } @@ -949,7 +985,7 @@ public class CmsDocServiceImpl implements ICmsDocService { List cmsDocList = cmsDocMapper.selectHotCmsDocList(cmsDocInput); if (cmsDocList != null) { //todo:需检查该文章是否在GitLink中存在 - return cmsDocList.stream().map(x -> x.copyToHotCmsDocDto()).collect(Collectors.toList()); + return cmsDocList.stream().map(CmsDoc::copyToHotCmsDocDto).collect(Collectors.toList()); } return new ArrayList<>(); @@ -990,7 +1026,7 @@ public class CmsDocServiceImpl implements ICmsDocService { for (CmsDoc cmsDir : cmsDirList) { CmsDocSearchVo cmsDocSearchVo = new CmsDocSearchVo(); cmsDocSearchVo.setIsOpen(isOpen); - List cmsDocBaseDtoList = selectCmsDocList(cmsDir.getId(), cmsDocSearchVo); + List cmsDocBaseDtoList = selectSetDefaultHeadImgCmsDocList(cmsDir.getId(), cmsDocSearchVo); CmsDocOverviewDto cmsDocOverviewDto = new CmsDocOverviewDto(); cmsDocOverviewDto.setId(cmsDir.getId()); cmsDocOverviewDto.setName(cmsDir.getName()); @@ -1104,7 +1140,7 @@ public class CmsDocServiceImpl implements ICmsDocService { CmsDocSearchVo cmsDocSearch = new CmsDocSearchVo(); cmsDocSearch.setDeptId(deptId); cmsDocSearch.setIsHomepage(CmsConstants.TRUE); - List cmsDocList = cmsDocMapper.selectCmsDocList(cmsDocSearch); + List cmsDocList = cmsDocMapper.selectCmsDocListSetDefaultHeadImg(cmsDocSearch); List cmsDocBaseDtoList = new ArrayList<>(); for (CmsDoc cmsDoc : cmsDocList) { CmsDocBaseDto cmsDocBaseDto = cmsDoc.copyToCmsDocBaseDto(); diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/controller/CmsProjectController.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/controller/CmsProjectController.java index 672921c86..08ded4e6f 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/controller/CmsProjectController.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/controller/CmsProjectController.java @@ -95,8 +95,12 @@ public class CmsProjectController extends BaseController { @GetMapping("/getProjectByDeptId/{deptId}") public R getProjectByDeptId( @ApiParam(name = "deptId", value = "组织Id") @PathVariable(value = "deptId") Long deptId) { - CmsProject cmsProject = cmsProjectService.selectCmsProjectByDeptId(deptId); - return R.ok(JSONObject.toJSONString(cmsProject)); + CmsProject cmsProject = cmsProjectService.selectCmsProjectByDeptIdAndNoException(deptId); + if (cmsProject == null) { + return R.ok(null); + } else { + return R.ok(JSONObject.toJSONString(cmsProject)); + } } /** @@ -170,4 +174,16 @@ public class CmsProjectController extends BaseController { public R removeByDeptId(@PathVariable(value = "deptId") Long deptId) { return R.ok(cmsProjectService.deleteCmsProjectByDeptId(deptId) > 0); } + + /** + * 初始化专区对应项目 + */ + @RequiresPermissions("zone:project:add") + @ApiOperation("初始化专区对应项目") + @Log(title = "初始化专区对应项目", businessType = BusinessType.INSERT) + @PostMapping("initCmsProject/dept/{deptId}") + public AjaxResult initCmsProject( + @ApiParam(name = "deptId", value = "组织Id") @PathVariable(value = "deptId") Long deptId) { + return toAjax(cmsProjectService.initZoneCmsProjectByDept(deptId)); + } } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/service/ICmsProjectService.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/service/ICmsProjectService.java index e89669ebe..ce095be0e 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/service/ICmsProjectService.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/service/ICmsProjectService.java @@ -78,4 +78,8 @@ public interface ICmsProjectService { Boolean updateCmsProjectByDept(SysDept dept); boolean operateProtectedBranchByZoneAuditSetting(String userName, String identifier, Long deptId, String operationType); + + boolean initZoneCmsProjectByDept(Long deptId); + + CmsProject selectCmsProjectByDeptIdAndNoException(Long deptId); } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/service/impl/CmsProjectServiceImpl.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/service/impl/CmsProjectServiceImpl.java index 0c67ace2a..04d78d57d 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/service/impl/CmsProjectServiceImpl.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/project/service/impl/CmsProjectServiceImpl.java @@ -1,21 +1,23 @@ package com.microservices.cms.project.service.impl; +import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; -import com.microservices.cms.doc.domain.CmsDir; -import com.microservices.cms.doc.domain.CmsDocBaseDto; -import com.microservices.cms.doc.domain.CmsDocSearchVo; +import com.microservices.cms.doc.domain.*; import com.microservices.cms.doc.service.ICmsAsyncService; import com.microservices.cms.doc.service.ICmsDocService; import com.microservices.cms.project.domain.CmsProject; import com.microservices.cms.project.mapper.CmsProjectMapper; import com.microservices.cms.project.service.ICmsProjectService; +import com.microservices.cms.utils.CmsConstants; import com.microservices.cms.utils.CmsGitLinkRequestUrl; +import com.microservices.common.core.constant.HttpStatus; import com.microservices.common.core.constant.SecurityConstants; import com.microservices.common.core.enums.SystemRole; import com.microservices.common.core.exception.ServiceException; import com.microservices.common.core.utils.PinYinStringUtils; import com.microservices.common.core.utils.StringUtils; import com.microservices.common.datascope.annotation.DataScope; +import com.microservices.common.httpClient.domain.GitLinkRequestUrl; import com.microservices.common.httpClient.util.GitLinkRequestHelper; import com.microservices.system.api.RemoteDeptService; import com.microservices.system.api.RemoteUserService; @@ -23,6 +25,7 @@ import com.microservices.system.api.domain.SysDept; import com.microservices.system.api.domain.SysRole; import com.microservices.system.api.domain.SysUser; import com.microservices.system.api.utils.FeignUtils; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -37,6 +40,7 @@ import java.util.List; * @author otto * @date 2023-03-27 */ +@Slf4j @Service public class CmsProjectServiceImpl implements ICmsProjectService { @Autowired @@ -228,6 +232,75 @@ public class CmsProjectServiceImpl implements ICmsProjectService { return true; } + @Override + public boolean initZoneCmsProjectByDept(Long deptId) { + boolean initResult = false; + CmsProject cmsProject = cmsProjectMapper.selectCmsProjectByDeptId(deptId); + if (cmsProject != null) { + JSONObject project = null; + try { + project = gitLinkRequestHelper.doGet(CmsGitLinkRequestUrl.GET_PROJECT_DETAIL(cmsProject.getUsername(), cmsProject.getIdentifier())); + } catch (ServiceException e) { + if (!e.getCode().equals(HttpStatus.NOT_FOUND)) { + throw new ServiceException(e.getCode(), e.getMessage()); + } + } + if (project != null) { + throw new ServiceException("专区对应项目已存在,不能重复初始化"); + } else { + Long organizationId = getOrganizationId(); + // 创建专区对应项目 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("user_id", organizationId); + jsonObject.put("name", cmsProject.getName()); + jsonObject.put("repository_name", cmsProject.getIdentifier()); + jsonObject.put("description", cmsProject.getDescription()); + jsonObject.put("private", false); + //调用GitLink接口创建项目 + JSONObject result = gitLinkRequestHelper.doPost(CmsGitLinkRequestUrl.CREATE_PROJECT(), jsonObject); + initResult = result != null && cmsProject.getIdentifier().equals(result.getString("identifier")); + } + } else { + Long projectId = insertZoneCmsProjectByDept(deptId); + if (projectId != null && projectId > 0) { + cmsProject = cmsProjectMapper.selectCmsProjectById(projectId); + initResult = true; + } + } + if (initResult) { + // 批量创建文章对应代码库文件 + List cmsDocAndDirList = cmsDocService.selectCmsDocAndDirListByDept(deptId); + if (cmsDocAndDirList == null || cmsDocAndDirList.isEmpty()) { + return initResult; + } + JSONObject docCommitJson = new JSONObject(); + docCommitJson.put("branch", CmsConstants.BRANCH_MASTER); + docCommitJson.put("message", "初始化专区文章对应代码库文件"); + JSONArray docFiles = new JSONArray(); + for (CmsDoc cmsDoc : cmsDocAndDirList) { + JSONObject docFile = new JSONObject(); + docFile.put("action_type", "create"); + docFile.put("content", ""); + docFile.put("encoding", "text"); + docFile.put("file_path", cmsDoc.getFilePath()); + docFiles.add(docFile); + } + docCommitJson.put("files", docFiles); + JSONObject result = gitLinkRequestHelper.doPost( + CmsGitLinkRequestUrl.BATCH_COMMIT(cmsProject.getUsername(), cmsProject.getIdentifier()) + , docCommitJson); + if (result == null) { + throw new ServiceException("专区对应项目初始化成功,但专区文章在项目中创建失败"); + } + JSONArray resultContents = result.getJSONArray("contents"); + for (int i = 0; i < resultContents.size(); i++) { + JSONObject contentJson = resultContents.getJSONObject(i); + cmsDocService.updateCmsDocShaByPathAndDeptId(contentJson.getString("sha"), contentJson.getString("path"), deptId); + } + } + return initResult; + } + private String handleSpecialCharacters(String name) { return StringUtils.replace(name, " ", "-"); @@ -242,6 +315,11 @@ public class CmsProjectServiceImpl implements ICmsProjectService { return cmsProject; } + @Override + public CmsProject selectCmsProjectByDeptIdAndNoException(Long deptId) { + return cmsProjectMapper.selectCmsProjectByDeptId(deptId); + } + @Override public Boolean changeUserRole(Long userId, Long oldDeptId, Long newDeptId, Long oldRoleId, Long newRoleId) { SysUser sysUser = FeignUtils.getReturnData(remoteUserService.getSysUserByUserId(userId, SecurityConstants.INNER)); diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/service/impl/SysUserServiceImpl.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/service/impl/SysUserServiceImpl.java index 14e375de1..9e1e41284 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/service/impl/SysUserServiceImpl.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/service/impl/SysUserServiceImpl.java @@ -1,4 +1,4 @@ -package com.microservices.cms.common.service.impl; +package com.microservices.cms.service.impl; import com.microservices.cms.common.service.ISysUserService; import com.microservices.common.core.constant.SecurityConstants; diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/utils/CmsGitLinkRequestUrl.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/utils/CmsGitLinkRequestUrl.java index a5d3bd58a..0fedd22aa 100644 --- a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/utils/CmsGitLinkRequestUrl.java +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/utils/CmsGitLinkRequestUrl.java @@ -148,19 +148,19 @@ public class CmsGitLinkRequestUrl extends GitLinkRequestUrl { ); } - public static GitLinkRequestUrl CREATE_PROTECTED_BRANCHES(String username, String identifier, Map params, List pushWhitelistUsernames) throws URISyntaxException { + public static GitLinkRequestUrl CREATE_PROTECTED_BRANCHES(String username, String identifier, Map params, List pushWhitelistUsernames) throws URISyntaxException { String path = buildUri(String.format("/api/%s/%s/protected_branches.json", username, identifier), params); path = concatenateParametersAfterUrl(path, "push_whitelist_usernames[]", pushWhitelistUsernames); return getGitLinkRequestUrl(path); } - public static GitLinkRequestUrl UPDATE_PROTECTED_BRANCHES(String username, String identifier, Map params, List pushWhitelistUsernames) throws URISyntaxException { + public static GitLinkRequestUrl UPDATE_PROTECTED_BRANCHES(String username, String identifier, Map params, List pushWhitelistUsernames) throws URISyntaxException { String path = buildUri(String.format("/api/%s/%s/protected_branches/master.json", username, identifier), params); path = concatenateParametersAfterUrl(path, "push_whitelist_usernames[]", pushWhitelistUsernames); return getGitLinkRequestUrl(path); } - public static GitLinkRequestUrl DELETE_PROTECTED_BRANCHES(String username, String identifier, Map params, List pushWhitelistUsernames) throws URISyntaxException { + public static GitLinkRequestUrl DELETE_PROTECTED_BRANCHES(String username, String identifier, Map params, List pushWhitelistUsernames) throws URISyntaxException { String path = buildUri(String.format("/api/%s/%s/protected_branches/master.json", username, identifier), params); path = concatenateParametersAfterUrl(path, "push_whitelist_usernames[]", pushWhitelistUsernames); return getGitLinkRequestUrl(path); @@ -197,4 +197,12 @@ public class CmsGitLinkRequestUrl extends GitLinkRequestUrl { public static String ZONE_DOC_URL(String gitlinkUrl, String zoneKey, Long docId) { return EscapeUtil.removeExtraSlashOfUrl(String.format("%s/zone/%s/newdetail/%d", gitlinkUrl, zoneKey, docId)); } + + public static GitLinkRequestUrl GET_PROJECT_DETAIL(String username, String identifier) { + return getAdminGitLinkRequestUrl(String.format("/api/%s/%s/detail.json", username, identifier)); + } + + public static GitLinkRequestUrl BATCH_COMMIT(String username, String identifier) { + return getAdminGitLinkRequestUrl(String.format("/api/v1/%s/%s/contents/batch.json", username, identifier)); + } } diff --git a/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/utils/CustomExecutorFactory.java b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/utils/CustomExecutorFactory.java new file mode 100644 index 000000000..534b8cc33 --- /dev/null +++ b/microservices-modules/microservices-modules-cms/src/main/java/com/microservices/cms/utils/CustomExecutorFactory.java @@ -0,0 +1,37 @@ +package com.microservices.cms.utils; + +import com.microservices.common.core.exception.ServiceException; +import com.microservices.common.core.threadPool.ThreadPoolExecutorWrap; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 线程池工厂 + * + * @author OTTO + */ +public class CustomExecutorFactory { + /** + * 创建线程池 + * 存在并发处理的情况,设置核心线程为2,设置有界队列长度为100,最大线程数为10 + * 当超出队列已满且达到最大线程数时抛出异常 + * Ncpu=CPU数量 + * Ucpu=目标CPU的使用率,0<=Ucpu<=1 + * W/C=任务等待时间与任务计算时间的比率 + * Nthreads =Ncpu*Ucpu*(1+W/C) + */ + public static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutorWrap( + 5 + , 10 + , 10 + , TimeUnit.SECONDS + , new ArrayBlockingQueue<>(100) + , Executors.defaultThreadFactory() + , (r, executor) -> { + throw new ServiceException("目前处理的人太多了,请稍后再试"); + } + ); +} 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 9d75f4f72..b74ba296e 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,50 @@ 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, + -- 处理文章和栏目头图为NULL或空字符串的情况 + CASE + -- 文章头图不为空(非NULL且非空字符串) + WHEN cd.head_img IS NOT NULL AND TRIM(cd.head_img) != '' THEN cd.head_img + -- 栏目存在且头图不为空 + WHEN dir.head_img IS NOT NULL AND TRIM(dir.head_img) != '' THEN dir.head_img + END AS head_img, + cd.dir_name, + cd.dept_id, + cd.issue_id, + cd.is_homepage, + cd.editor_type, + cd.keywords, + cd.is_dir + from cms_doc cd + left join cms_doc dir on cd.dir_name = dir.name and cd.dept_id = dir.dept_id + + + + where dept_id = #{deptId} and is_dir = 1 @@ -283,6 +344,15 @@ from cms_doc where dept_id = #{deptId}; + @@ -405,6 +475,12 @@ and dept_id = #{deptId} and is_dir = #{isDir}; + + update cms_doc + set file_sha=#{sha} + where file_path=#{filePath} + and dept_id=#{deptId} + delete diff --git a/microservices-modules/microservices-modules-dms/pom.xml b/microservices-modules/microservices-modules-dms/pom.xml index 98af09f00..d74dfd4ed 100644 --- a/microservices-modules/microservices-modules-dms/pom.xml +++ b/microservices-modules/microservices-modules-dms/pom.xml @@ -133,7 +133,7 @@ com.hankcs hanlp - portable-1.3.4 + portable-1.8.4 diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java index 64924c276..385b6fd96 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java @@ -59,8 +59,8 @@ public class AchievementsServiceImpl implements IAchievementsService { @Autowired private IBehaviorImageService behaviorImageService; - @Value("${markerSpaceUrl}") - public String markerSpaceUrl; + @Value("${makerSpaceUrl}") + public String makerSpaceUrl; @Value("${http.gitLinkUrl}") public String gitLinkUrl; @@ -217,7 +217,7 @@ public class AchievementsServiceImpl implements IAchievementsService { } if (Objects.equals(source, "2")) { - concatUrl(list, markerSpaceUrl); + concatUrl(list, makerSpaceUrl); } if (Objects.equals(source, "4")) { diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java index 811bb8d27..87729d721 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java @@ -377,6 +377,9 @@ public class TalentReferralService { */ public Object competitionExpertTalentReferral(Long competitionId) { TaskVo task = talentReferralMapper.selectCompetitionById(competitionId); + if (task == null) { + return new ArrayList<>(); + } List categories = new ArrayList<>(); List completedTasks = talentReferralMapper.selectCompetitionIdByStatus(); List allExperts = talentReferralMapper.selectExpertsBy(new ExpertVo()); diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/TaskResourceLibraryService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/TaskResourceLibraryService.java index 3b505ee7e..44be32df1 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/TaskResourceLibraryService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/TaskResourceLibraryService.java @@ -22,8 +22,8 @@ import static com.microservices.dms.constant.TaskConstant.MARKER_SPACE_DOWNLOAD_ public class TaskResourceLibraryService { private final TaskResourceLibraryMapper taskResourceLibraryMapper; - @Value("${markerSpaceUrl}") - public String markerSpaceUrl; + @Value("${makerSpaceUrl}") + public String makerSpaceUrl; public int addClick(Clicker click) { click.setCreatedAt(DateUtils.getNowDate()); @@ -104,7 +104,7 @@ public class TaskResourceLibraryService { List> attachments = taskResourceLibraryMapper.getAttachments(l.getPaperId()); for (KeyValVo a : attachments) { Object v = a.getV(); - a.setV(String.format(MARKER_SPACE_DOWNLOAD_API_BY_ID, markerSpaceUrl, v)); + a.setV(String.format(MARKER_SPACE_DOWNLOAD_API_BY_ID, makerSpaceUrl, v)); } l.setAttachmentList(attachments); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/impl/ExpertResourceLibraryServiceImpl.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/impl/ExpertResourceLibraryServiceImpl.java index 418910e72..cf8f107db 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/impl/ExpertResourceLibraryServiceImpl.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/impl/ExpertResourceLibraryServiceImpl.java @@ -32,8 +32,8 @@ public class ExpertResourceLibraryServiceImpl implements IExpertResourceLibraryS @Autowired private ExpertResourceLibraryMapper expertResourceLibraryMapper; - @Value("${markerSpaceUrl}") - public String markerSpaceUrl; + @Value("${makerSpaceUrl}") + public String makerSpaceUrl; /** * 查询专家资源库 * @@ -77,7 +77,7 @@ public class ExpertResourceLibraryServiceImpl implements IExpertResourceLibraryS private void buildFullUrl(Map map) { if (map != null && map.containsKey("id") && map.get("id") != null) { String id = map.get("id").toString(); - map.put("url", String.format(MARKER_SPACE_DOWNLOAD_API_BY_ID, markerSpaceUrl, id)); + map.put("url", String.format(MARKER_SPACE_DOWNLOAD_API_BY_ID, makerSpaceUrl, id)); } } diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/BehaviorImageMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/BehaviorImageMapper.xml index 7aca6ce78..a28d62609 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/BehaviorImageMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/BehaviorImageMapper.xml @@ -140,24 +140,55 @@ + +