同步闭源版本代码:自动执行升级SQL、历史记录改为数据库存储、去掉git操作,优化代码结构,去掉不需要的文件

This commit is contained in:
暮光:城中城
2023-01-05 20:13:16 +08:00
parent fe1da585ac
commit b8dcdf93a1
109 changed files with 2469 additions and 8158 deletions

View File

@@ -8,24 +8,14 @@ import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.data.config.security.DocUserDetails;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.UserMessage;
import com.zyplayer.doc.data.repository.manage.entity.WikiPage;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageContent;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageFile;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageZan;
import com.zyplayer.doc.data.repository.manage.entity.WikiSpace;
import com.zyplayer.doc.data.repository.manage.entity.*;
import com.zyplayer.doc.data.repository.manage.mapper.WikiPageContentMapper;
import com.zyplayer.doc.data.repository.manage.mapper.WikiPageMapper;
import com.zyplayer.doc.data.repository.manage.param.SearchByEsParam;
import com.zyplayer.doc.data.repository.manage.vo.SpaceNewsVo;
import com.zyplayer.doc.data.repository.support.consts.DocSysType;
import com.zyplayer.doc.data.repository.support.consts.UserMsgType;
import com.zyplayer.doc.data.service.manage.UserMessageService;
import com.zyplayer.doc.data.service.manage.WikiPageContentService;
import com.zyplayer.doc.data.service.manage.WikiPageFileService;
import com.zyplayer.doc.data.service.manage.WikiPageService;
import com.zyplayer.doc.data.service.manage.WikiPageZanService;
import com.zyplayer.doc.data.service.manage.WikiSpaceService;
import com.zyplayer.doc.data.service.manage.*;
import com.zyplayer.doc.data.utils.CachePrefix;
import com.zyplayer.doc.data.utils.CacheUtil;
import com.zyplayer.doc.wiki.controller.vo.WikiPageContentVo;
@@ -33,7 +23,6 @@ import com.zyplayer.doc.wiki.controller.vo.WikiPageVo;
import com.zyplayer.doc.wiki.framework.common.MDToText;
import com.zyplayer.doc.wiki.framework.consts.SpaceType;
import com.zyplayer.doc.wiki.service.common.WikiPageAuthService;
import com.zyplayer.doc.wiki.service.git.GitService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
@@ -48,14 +37,7 @@ import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -70,378 +52,379 @@ import java.util.stream.Collectors;
@RequestMapping("/zyplayer-doc-wiki/page")
@RequiredArgsConstructor
public class WikiPageController {
private final WikiPageService wikiPageService;
private final WikiPageContentService wikiPageContentService;
private final WikiPageContentMapper wikiPageContentMapper;
private final WikiPageFileService wikiPageFileService;
private final WikiPageZanService wikiPageZanService;
private final WikiSpaceService wikiSpaceService;
private final WikiPageMapper wikiPageMapper;
private final WikiPageAuthService wikiPageAuthService;
private final UserMessageService userMessageService;
private final GitService gitService;
@PostMapping("/list")
public ResponseJson<List<WikiPageVo>> list(WikiPage wikiPage) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPage.getSpaceId());
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章列表!");
}
UpdateWrapper<WikiPage> wrapper = new UpdateWrapper<>();
wrapper.eq("del_flag", 0);
wrapper.eq("space_id", wikiPage.getSpaceId());
List<WikiPage> wikiPageList = wikiPageService.list(wrapper);
Map<Long, List<WikiPageVo>> listMap = wikiPageList.stream().map(WikiPageVo::new).collect(Collectors.groupingBy(WikiPageVo::getParentId));
List<WikiPageVo> nodePageList = listMap.get(0L);
if (CollectionUtils.isNotEmpty(nodePageList)) {
nodePageList = nodePageList.stream().sorted(Comparator.comparingInt(WikiPageVo::getSeqNo)).collect(Collectors.toList());
this.setChildren(listMap, nodePageList, "");
}
return DocResponseJson.ok(nodePageList);
}
@PostMapping("/detail")
public ResponseJson<WikiPageContentVo> detail(WikiPage wikiPage) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(wikiPage.getId());
// 页面已删除
if (wikiPageSel == null || Objects.equals(wikiPageSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 空间已删除
if (wikiSpaceSel == null || Objects.equals(wikiSpaceSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章详情!");
}
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", wikiPage.getId());
WikiPageContent pageContent = wikiPageContentService.getOne(wrapper);
UpdateWrapper<WikiPageFile> wrapperFile = new UpdateWrapper<>();
wrapperFile.eq("page_id", wikiPage.getId());
wrapperFile.eq("del_flag", 0);
List<WikiPageFile> pageFiles = wikiPageFileService.list(wrapperFile);
for (WikiPageFile pageFile : pageFiles) {
pageFile.setFileUrl("zyplayer-doc-wiki/common/file?uuid=" + pageFile.getUuid());
}
UpdateWrapper<WikiPageZan> wrapperZan = new UpdateWrapper<>();
wrapperZan.eq("page_id", wikiPage.getId());
wrapperZan.eq("create_user_id", currentUser.getUserId());
wrapperZan.eq("yn", 1);
WikiPageZan pageZan = wikiPageZanService.getOne(wrapperZan);
WikiPageContentVo vo = new WikiPageContentVo();
vo.setWikiPage(wikiPageSel);
vo.setPageContent(pageContent);
vo.setFileList(pageFiles);
vo.setSelfZan((pageZan != null) ? 1 : 0);
vo.setSelfUserId(currentUser.getUserId());
// 上传附件、编辑、权限设置、删除 的权限
String canEdit = wikiPageAuthService.canEdit(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
String canDelete = wikiPageAuthService.canDelete(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
String canUploadFile = wikiPageAuthService.canUploadFile(wikiSpaceSel, wikiPageSel.getId(), currentUser.getUserId());
String canDeleteFile = wikiPageAuthService.canDeleteFile(wikiSpaceSel, wikiPageSel.getId(), currentUser.getUserId());
String canConfigAuth = wikiPageAuthService.canConfigAuth(wikiSpaceSel, wikiPageSel.getId(), currentUser.getUserId());
vo.setCanEdit((canEdit == null) ? 1 : 0);
vo.setCanDelete((canDelete == null) ? 1 : 0);
vo.setCanDeleteFile((canDeleteFile == null) ? 1 : 0);
vo.setCanUploadFile((canUploadFile == null) ? 1 : 0);
vo.setCanConfigAuth((canConfigAuth == null) ? 1 : 0);
// 高并发下会有覆盖问题,但不重要~
Integer viewNum = Optional.ofNullable(wikiPageSel.getViewNum()).orElse(0);
WikiPage wikiPageUp = new WikiPage();
wikiPageUp.setId(wikiPageSel.getId());
wikiPageUp.setViewNum(viewNum + 1);
wikiPageService.updateById(wikiPageUp);
// 修改返回值里的查看数+1
wikiPageSel.setViewNum(viewNum + 1);
return DocResponseJson.ok(vo);
}
@PostMapping("/changeParent")
public ResponseJson<Object> changeParent(WikiPage wikiPage, Integer beforeSeq, Integer afterSeq) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(wikiPage.getId());
// 编辑权限判断
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canEdit = wikiPageAuthService.canEdit(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
if (canEdit != null) {
return DocResponseJson.warn(canEdit);
}
WikiPage wikiPageUp = new WikiPage();
wikiPageUp.setId(wikiPage.getId());
wikiPageUp.setParentId(wikiPage.getParentId());
wikiPageUp.setUpdateTime(new Date());
wikiPageUp.setUpdateUserId(currentUser.getUserId());
wikiPageUp.setUpdateUserName(currentUser.getUsername());
wikiPageService.changeParent(wikiPageUp, beforeSeq, afterSeq);
return DocResponseJson.ok();
}
@PostMapping("/delete")
public ResponseJson<Object> delete(Long pageId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 删除权限判断
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canDelete = wikiPageAuthService.canDelete(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
if (canDelete != null) {
return DocResponseJson.warn(canDelete);
}
// 执行删除
WikiPage wikiPage = new WikiPage();
wikiPage.setId(pageId);
wikiPage.setDelFlag(1);
wikiPage.setName(wikiPageSel.getName());
wikiPage.setUpdateTime(new Date());
wikiPage.setUpdateUserId(currentUser.getUserId());
wikiPage.setUpdateUserName(currentUser.getUsername());
wikiPageService.deletePage(wikiPage);
return DocResponseJson.ok();
}
@PostMapping("/update")
public ResponseJson<Object> update(WikiPage wikiPage, String content, String preview) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPageContent pageContent = new WikiPageContent();
pageContent.setContent(content);
if(wikiPage.getEditorType()==2)
{
preview = MDToText.mdToText(preview);
}
pageContent.setPreview(preview);
// 数据库是varchar(16000)所以如果不开启es的话搜索超过16000的文章就搜不到~es存preview不截断
if (StringUtils.isNotBlank(preview) && preview.length() > 16000) {
pageContent.setPreview(preview.substring(0, 16000));
}
if (StringUtils.isBlank(wikiPage.getName())) {
return DocResponseJson.warn("标题不能为空!");
}
Long pageId = wikiPage.getId();
if (pageId != null && pageId > 0) {
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 编辑权限判断
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canEdit = wikiPageAuthService.canEdit(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
if (canEdit != null) {
return DocResponseJson.warn(canEdit);
}
wikiPage.setSpaceId(null);
wikiPage.setEditType(null);
wikiPage.setUpdateTime(new Date());
wikiPage.setUpdateUserId(currentUser.getUserId());
wikiPage.setUpdateUserName(currentUser.getUsername());
wikiPageService.updateById(wikiPage);
// 详情
pageContent.setUpdateTime(new Date());
pageContent.setUpdateUserId(currentUser.getUserId());
pageContent.setUpdateUserName(currentUser.getUsername());
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", pageId);
wikiPageContentService.update(pageContent, wrapper);
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, wikiPageSel.getId(), wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_UPDATE);
userMessageService.addWikiMessage(userMessage);
} else {
Long parentId = Optional.ofNullable(wikiPage.getParentId()).orElse(0L);
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPage.getSpaceId());
if (wikiSpaceSel == null) {
return DocResponseJson.warn("未找到指定的空间!");
}
// 空间不是自己的
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限新增该空间的文章!");
}
// 空间不是自己的
if (SpaceType.isOthersPersonal(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限新增该空间的文章!");
}
if (parentId > 0) {
WikiPage wikiPageParent = wikiPageService.getById(parentId);
if (!Objects.equals(wikiPage.getSpaceId(), wikiPageParent.getSpaceId())) {
return DocResponseJson.warn("当前空间和父页面的空间不一致,请重新选择父页面!");
}
}
Integer lastSeq = wikiPageMapper.getLastSeq(wikiPage.getSpaceId(), parentId);
lastSeq = Optional.ofNullable(lastSeq).orElse(99999);
wikiPage.setSeqNo(lastSeq + 1);
wikiPage.setCreateTime(new Date());
wikiPage.setUpdateTime(new Date());
wikiPage.setCreateUserId(currentUser.getUserId());
wikiPage.setCreateUserName(currentUser.getUsername());
wikiPageService.save(wikiPage);
// 重置当前分支的所有节点seq值
wikiPageMapper.updateChildrenSeq(wikiPage.getSpaceId(), parentId);
// 详情
pageContent.setPageId(wikiPage.getId());
pageContent.setCreateTime(new Date());
pageContent.setCreateUserId(currentUser.getUserId());
pageContent.setCreateUserName(currentUser.getUsername());
wikiPageContentService.save(pageContent);
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, wikiPage.getId(), wikiPage.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_CREATE);
userMessageService.addWikiMessage(userMessage);
}
try {
// 提交历史版本记录
gitService.commitAndAddHistory(wikiPage.getId(), content);
} catch (ConfirmException e) {
return DocResponseJson.warn(e.getMessage());
}
return DocResponseJson.ok(wikiPage);
}
@PostMapping("/unlock")
public ResponseJson<Object> unlock(Long pageId) {
String lockKey = CachePrefix.WIKI_LOCK_PAGE + pageId;
DocUserDetails pageLockUser = CacheUtil.get(lockKey);
if (pageLockUser != null) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
if (Objects.equals(pageLockUser.getUserId(), currentUser.getUserId())) {
CacheUtil.remove(lockKey);
}
}
return DocResponseJson.ok();
}
@PostMapping("/lock")
public ResponseJson<Object> editLock(Long pageId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
String lockKey = CachePrefix.WIKI_LOCK_PAGE + pageId;
DocUserDetails pageLockUser = CacheUtil.get(lockKey);
if (pageLockUser != null) {
if (!Objects.equals(pageLockUser.getUserId(), currentUser.getUserId())) {
return DocResponseJson.warn("当前页面正在被:" + pageLockUser.getUsername() + " 编辑");
}
}
CacheUtil.put(lockKey, new DocUserDetails(currentUser.getUserId(), currentUser.getUsername()));
return DocResponseJson.ok();
}
@PostMapping("/searchByEs")
public ResponseJson<Object> searchByEs(SearchByEsParam param) {
param.setNewsType(1);
return this.news(param);
}
@PostMapping("/download")
public ResponseJson<Object> download(Long pageId, HttpServletResponse response) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 页面已删除
if (wikiPageSel == null || Objects.equals(wikiPageSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 空间已删除
if (wikiSpaceSel == null || Objects.equals(wikiSpaceSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章详情!");
}
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", pageId);
WikiPageContent pageContent = wikiPageContentService.getOne(wrapper);
try {
ByteArrayInputStream bais = new ByteArrayInputStream(pageContent.getContent().getBytes("GBK"));
POIFSFileSystem poifs = new POIFSFileSystem();
DirectoryEntry directory = poifs.getRoot();
directory.createDocument("WordDocument", bais);
// 写入流
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode(wikiPageSel.getName(), "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx");
ServletOutputStream outputStream = response.getOutputStream();
poifs.writeFilesystem(outputStream);
bais.close();
outputStream.close();
return DocResponseJson.ok();
} catch (Exception e) {
e.printStackTrace();
}
return DocResponseJson.warn("导出失败");
}
@PostMapping("/news")
public ResponseJson<Object> news(SearchByEsParam param) {
// 空间不是自己的
Map<Long, WikiSpace> wikiSpaceMap = this.getCanVisitWikiSpace(param.getSpaceId());
if (wikiSpaceMap.isEmpty()) {
return DocResponseJson.ok();
}
param.setSpaceIds(new ArrayList<>(wikiSpaceMap.keySet()));
String keywords = param.getKeywords();
if (StringUtils.isNotBlank(keywords)) {
param.setKeywords("%" + keywords + "%");
}
// 分页查询
List<SpaceNewsVo> spaceNewsVoList = wikiPageContentMapper.getNewsList(param);
if (spaceNewsVoList == null || spaceNewsVoList.isEmpty()) {
return DocResponseJson.ok();
}
spaceNewsVoList.forEach(val -> {
val.setSpaceName(wikiSpaceMap.get(val.getSpaceId()).getName());
String preview = val.getPreviewContent();
if (preview != null) {
if (preview.length() > 200) {
preview = preview.substring(0, 200);
}
if (keywords != null) {
preview = StringUtils.replaceIgnoreCase(preview, keywords, "<span style=\"color:red\">" + keywords + "</span>");
}
}
val.setPreviewContent(preview);
String pageTitle = val.getPageTitle();
if (pageTitle != null && keywords != null) {
pageTitle = StringUtils.replaceIgnoreCase(pageTitle, keywords, "<span style=\"color:red\">" + keywords + "</span>");
}
val.setPageTitle(pageTitle);
});
return DocResponseJson.ok(spaceNewsVoList);
}
private Map<Long, WikiSpace> getCanVisitWikiSpace(Long spaceId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
List<WikiSpace> spaceList;
// 空间不是自己的
if (spaceId == null || spaceId <= 0) {
QueryWrapper<WikiSpace> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("del_flag", 0);
queryWrapper.ne("type", SpaceType.privateSpace);
spaceList = wikiSpaceService.list(queryWrapper);
} else {
WikiSpace wikiSpaceSel = wikiSpaceService.getById(spaceId);
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return Collections.emptyMap();
}
spaceList = Collections.singletonList(wikiSpaceSel);
}
return spaceList.stream().collect(Collectors.toMap(WikiSpace::getId, val -> val));
}
private void setChildren(Map<Long, List<WikiPageVo>> listMap, List<WikiPageVo> nodePageList, String path) {
if (nodePageList == null || listMap == null) {
return;
}
for (WikiPageVo page : nodePageList) {
String nowPath = path + "/" + page.getName();
page.setPath(nowPath);
List<WikiPageVo> wikiPageVos = listMap.get(page.getId());
if (CollectionUtils.isNotEmpty(wikiPageVos)) {
wikiPageVos = wikiPageVos.stream().sorted(Comparator.comparingInt(WikiPageVo::getSeqNo)).collect(Collectors.toList());
page.setChildren(wikiPageVos);
this.setChildren(listMap, wikiPageVos, nowPath);
}
}
}
private final WikiPageService wikiPageService;
private final WikiPageContentService wikiPageContentService;
private final WikiPageContentMapper wikiPageContentMapper;
private final WikiPageFileService wikiPageFileService;
private final WikiPageZanService wikiPageZanService;
private final WikiSpaceService wikiSpaceService;
private final WikiPageMapper wikiPageMapper;
private final WikiPageAuthService wikiPageAuthService;
private final UserMessageService userMessageService;
private final WikiPageHistoryService wikiPageHistoryService;
@PostMapping("/list")
public ResponseJson<List<WikiPageVo>> list(WikiPage wikiPage) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPage.getSpaceId());
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章列表!");
}
UpdateWrapper<WikiPage> wrapper = new UpdateWrapper<>();
wrapper.eq("del_flag", 0);
wrapper.eq("space_id", wikiPage.getSpaceId());
List<WikiPage> wikiPageList = wikiPageService.list(wrapper);
Map<Long, List<WikiPageVo>> listMap = wikiPageList.stream().map(WikiPageVo::new).collect(Collectors.groupingBy(WikiPageVo::getParentId));
List<WikiPageVo> nodePageList = listMap.get(0L);
if (CollectionUtils.isNotEmpty(nodePageList)) {
nodePageList = nodePageList.stream().sorted(Comparator.comparingInt(WikiPageVo::getSeqNo)).collect(Collectors.toList());
this.setChildren(listMap, nodePageList, "");
}
return DocResponseJson.ok(nodePageList);
}
@PostMapping("/detail")
public ResponseJson<WikiPageContentVo> detail(WikiPage wikiPage) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(wikiPage.getId());
// 页面已删除
if (wikiPageSel == null || Objects.equals(wikiPageSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 空间已删除
if (wikiSpaceSel == null || Objects.equals(wikiSpaceSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章详情!");
}
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", wikiPage.getId());
WikiPageContent pageContent = wikiPageContentService.getOne(wrapper);
UpdateWrapper<WikiPageFile> wrapperFile = new UpdateWrapper<>();
wrapperFile.eq("page_id", wikiPage.getId());
wrapperFile.eq("del_flag", 0);
List<WikiPageFile> pageFiles = wikiPageFileService.list(wrapperFile);
for (WikiPageFile pageFile : pageFiles) {
pageFile.setFileUrl("zyplayer-doc-wiki/common/file?uuid=" + pageFile.getUuid());
}
UpdateWrapper<WikiPageZan> wrapperZan = new UpdateWrapper<>();
wrapperZan.eq("page_id", wikiPage.getId());
wrapperZan.eq("create_user_id", currentUser.getUserId());
wrapperZan.eq("yn", 1);
WikiPageZan pageZan = wikiPageZanService.getOne(wrapperZan);
WikiPageContentVo vo = new WikiPageContentVo();
vo.setWikiPage(wikiPageSel);
vo.setPageContent(pageContent);
vo.setFileList(pageFiles);
vo.setSelfZan((pageZan != null) ? 1 : 0);
vo.setSelfUserId(currentUser.getUserId());
// 上传附件、编辑、权限设置、删除 的权限
String canEdit = wikiPageAuthService.canEdit(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
String canDelete = wikiPageAuthService.canDelete(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
String canUploadFile = wikiPageAuthService.canUploadFile(wikiSpaceSel, wikiPageSel.getId(), currentUser.getUserId());
String canDeleteFile = wikiPageAuthService.canDeleteFile(wikiSpaceSel, wikiPageSel.getId(), currentUser.getUserId());
String canConfigAuth = wikiPageAuthService.canConfigAuth(wikiSpaceSel, wikiPageSel.getId(), currentUser.getUserId());
vo.setCanEdit((canEdit == null) ? 1 : 0);
vo.setCanDelete((canDelete == null) ? 1 : 0);
vo.setCanDeleteFile((canDeleteFile == null) ? 1 : 0);
vo.setCanUploadFile((canUploadFile == null) ? 1 : 0);
vo.setCanConfigAuth((canConfigAuth == null) ? 1 : 0);
// 高并发下会有覆盖问题,但不重要~
Integer viewNum = Optional.ofNullable(wikiPageSel.getViewNum()).orElse(0);
WikiPage wikiPageUp = new WikiPage();
wikiPageUp.setId(wikiPageSel.getId());
wikiPageUp.setViewNum(viewNum + 1);
wikiPageService.updateById(wikiPageUp);
// 修改返回值里的查看数+1
wikiPageSel.setViewNum(viewNum + 1);
return DocResponseJson.ok(vo);
}
@PostMapping("/changeParent")
public ResponseJson<Object> changeParent(WikiPage wikiPage, Integer beforeSeq, Integer afterSeq) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(wikiPage.getId());
// 编辑权限判断
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canEdit = wikiPageAuthService.canEdit(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
if (canEdit != null) {
return DocResponseJson.warn(canEdit);
}
WikiPage wikiPageUp = new WikiPage();
wikiPageUp.setId(wikiPage.getId());
wikiPageUp.setParentId(wikiPage.getParentId());
wikiPageUp.setUpdateTime(new Date());
wikiPageUp.setUpdateUserId(currentUser.getUserId());
wikiPageUp.setUpdateUserName(currentUser.getUsername());
wikiPageService.changeParent(wikiPageUp, beforeSeq, afterSeq);
return DocResponseJson.ok();
}
@PostMapping("/delete")
public ResponseJson<Object> delete(Long pageId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 删除权限判断
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canDelete = wikiPageAuthService.canDelete(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
if (canDelete != null) {
return DocResponseJson.warn(canDelete);
}
// 执行删除
WikiPage wikiPage = new WikiPage();
wikiPage.setId(pageId);
wikiPage.setDelFlag(1);
wikiPage.setName(wikiPageSel.getName());
wikiPage.setUpdateTime(new Date());
wikiPage.setUpdateUserId(currentUser.getUserId());
wikiPage.setUpdateUserName(currentUser.getUsername());
wikiPageService.deletePage(wikiPage);
return DocResponseJson.ok();
}
@PostMapping("/update")
public ResponseJson<Object> update(WikiPage wikiPage, String content, String preview) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPageContent pageContent = new WikiPageContent();
pageContent.setContent(content);
if (wikiPage.getEditorType() == 2) {
preview = MDToText.mdToText(preview);
}
pageContent.setPreview(preview);
// 数据库是varchar(16000)所以如果不开启es的话搜索超过16000的文章就搜不到~es存preview不截断
if (StringUtils.isNotBlank(preview) && preview.length() > 16000) {
pageContent.setPreview(preview.substring(0, 16000));
}
if (StringUtils.isBlank(wikiPage.getName())) {
return DocResponseJson.warn("标题不能为空!");
}
Long pageId = wikiPage.getId();
Long spaceId = wikiPage.getSpaceId();
if (pageId != null && pageId > 0) {
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 编辑权限判断
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canEdit = wikiPageAuthService.canEdit(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
if (canEdit != null) {
return DocResponseJson.warn(canEdit);
}
spaceId = wikiPageSel.getSpaceId();
wikiPage.setSpaceId(null);
wikiPage.setEditType(null);
wikiPage.setUpdateTime(new Date());
wikiPage.setUpdateUserId(currentUser.getUserId());
wikiPage.setUpdateUserName(currentUser.getUsername());
wikiPageService.updateById(wikiPage);
// 详情
pageContent.setUpdateTime(new Date());
pageContent.setUpdateUserId(currentUser.getUserId());
pageContent.setUpdateUserName(currentUser.getUsername());
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", pageId);
wikiPageContentService.update(pageContent, wrapper);
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, wikiPageSel.getId(), wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_UPDATE);
userMessageService.addWikiMessage(userMessage);
} else {
Long parentId = Optional.ofNullable(wikiPage.getParentId()).orElse(0L);
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPage.getSpaceId());
if (wikiSpaceSel == null) {
return DocResponseJson.warn("未找到指定的空间!");
}
// 空间不是自己的
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限新增该空间的文章!");
}
// 空间不是自己的
if (SpaceType.isOthersPersonal(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限新增该空间的文章!");
}
if (parentId > 0) {
WikiPage wikiPageParent = wikiPageService.getById(parentId);
if (!Objects.equals(wikiPage.getSpaceId(), wikiPageParent.getSpaceId())) {
return DocResponseJson.warn("当前空间和父页面的空间不一致,请重新选择父页面!");
}
}
Integer lastSeq = wikiPageMapper.getLastSeq(wikiPage.getSpaceId(), parentId);
lastSeq = Optional.ofNullable(lastSeq).orElse(99999);
wikiPage.setSeqNo(lastSeq + 1);
wikiPage.setCreateTime(new Date());
wikiPage.setUpdateTime(new Date());
wikiPage.setCreateUserId(currentUser.getUserId());
wikiPage.setCreateUserName(currentUser.getUsername());
wikiPageService.save(wikiPage);
// 重置当前分支的所有节点seq值
wikiPageMapper.updateChildrenSeq(wikiPage.getSpaceId(), parentId);
// 详情
pageContent.setPageId(wikiPage.getId());
pageContent.setCreateTime(new Date());
pageContent.setCreateUserId(currentUser.getUserId());
pageContent.setCreateUserName(currentUser.getUsername());
wikiPageContentService.save(pageContent);
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, wikiPage.getId(), wikiPage.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_CREATE);
userMessageService.addWikiMessage(userMessage);
}
try {
// 创建历史记录
wikiPageHistoryService.saveRecord(spaceId, wikiPage.getId(), content);
} catch (ConfirmException e) {
return DocResponseJson.warn(e.getMessage());
}
return DocResponseJson.ok(wikiPage);
}
@PostMapping("/unlock")
public ResponseJson<Object> unlock(Long pageId) {
String lockKey = CachePrefix.WIKI_LOCK_PAGE + pageId;
DocUserDetails pageLockUser = CacheUtil.get(lockKey);
if (pageLockUser != null) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
if (Objects.equals(pageLockUser.getUserId(), currentUser.getUserId())) {
CacheUtil.remove(lockKey);
}
}
return DocResponseJson.ok();
}
@PostMapping("/lock")
public ResponseJson<Object> editLock(Long pageId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
String lockKey = CachePrefix.WIKI_LOCK_PAGE + pageId;
DocUserDetails pageLockUser = CacheUtil.get(lockKey);
if (pageLockUser != null) {
if (!Objects.equals(pageLockUser.getUserId(), currentUser.getUserId())) {
return DocResponseJson.warn("当前页面正在被:" + pageLockUser.getUsername() + " 编辑");
}
}
CacheUtil.put(lockKey, new DocUserDetails(currentUser.getUserId(), currentUser.getUsername()));
return DocResponseJson.ok();
}
@PostMapping("/searchByEs")
public ResponseJson<Object> searchByEs(SearchByEsParam param) {
param.setNewsType(1);
return this.news(param);
}
@PostMapping("/download")
public ResponseJson<Object> download(Long pageId, HttpServletResponse response) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 页面已删除
if (wikiPageSel == null || Objects.equals(wikiPageSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 空间已删除
if (wikiSpaceSel == null || Objects.equals(wikiSpaceSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章详情!");
}
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", pageId);
WikiPageContent pageContent = wikiPageContentService.getOne(wrapper);
try {
ByteArrayInputStream bais = new ByteArrayInputStream(pageContent.getContent().getBytes("GBK"));
POIFSFileSystem poifs = new POIFSFileSystem();
DirectoryEntry directory = poifs.getRoot();
directory.createDocument("WordDocument", bais);
// 写入流
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode(wikiPageSel.getName(), "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx");
ServletOutputStream outputStream = response.getOutputStream();
poifs.writeFilesystem(outputStream);
bais.close();
outputStream.close();
return DocResponseJson.ok();
} catch (Exception e) {
e.printStackTrace();
}
return DocResponseJson.warn("导出失败");
}
@PostMapping("/news")
public ResponseJson<Object> news(SearchByEsParam param) {
// 空间不是自己的
Map<Long, WikiSpace> wikiSpaceMap = this.getCanVisitWikiSpace(param.getSpaceId());
if (wikiSpaceMap.isEmpty()) {
return DocResponseJson.ok();
}
param.setSpaceIds(new ArrayList<>(wikiSpaceMap.keySet()));
String keywords = param.getKeywords();
if (StringUtils.isNotBlank(keywords)) {
param.setKeywords("%" + keywords + "%");
}
// 分页查询
List<SpaceNewsVo> spaceNewsVoList = wikiPageContentMapper.getNewsList(param);
if (spaceNewsVoList == null || spaceNewsVoList.isEmpty()) {
return DocResponseJson.ok();
}
spaceNewsVoList.forEach(val -> {
val.setSpaceName(wikiSpaceMap.get(val.getSpaceId()).getName());
String preview = val.getPreviewContent();
if (preview != null) {
if (preview.length() > 200) {
preview = preview.substring(0, 200);
}
if (keywords != null) {
preview = StringUtils.replaceIgnoreCase(preview, keywords, "<span style=\"color:red\">" + keywords + "</span>");
}
}
val.setPreviewContent(preview);
String pageTitle = val.getPageTitle();
if (pageTitle != null && keywords != null) {
pageTitle = StringUtils.replaceIgnoreCase(pageTitle, keywords, "<span style=\"color:red\">" + keywords + "</span>");
}
val.setPageTitle(pageTitle);
});
return DocResponseJson.ok(spaceNewsVoList);
}
private Map<Long, WikiSpace> getCanVisitWikiSpace(Long spaceId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
List<WikiSpace> spaceList;
// 空间不是自己的
if (spaceId == null || spaceId <= 0) {
QueryWrapper<WikiSpace> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("del_flag", 0);
queryWrapper.ne("type", SpaceType.privateSpace);
spaceList = wikiSpaceService.list(queryWrapper);
} else {
WikiSpace wikiSpaceSel = wikiSpaceService.getById(spaceId);
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return Collections.emptyMap();
}
spaceList = Collections.singletonList(wikiSpaceSel);
}
return spaceList.stream().collect(Collectors.toMap(WikiSpace::getId, val -> val));
}
private void setChildren(Map<Long, List<WikiPageVo>> listMap, List<WikiPageVo> nodePageList, String path) {
if (nodePageList == null || listMap == null) {
return;
}
for (WikiPageVo page : nodePageList) {
String nowPath = path + "/" + page.getName();
page.setPath(nowPath);
List<WikiPageVo> wikiPageVos = listMap.get(page.getId());
if (CollectionUtils.isNotEmpty(wikiPageVos)) {
wikiPageVos = wikiPageVos.stream().sorted(Comparator.comparingInt(WikiPageVo::getSeqNo)).collect(Collectors.toList());
page.setChildren(wikiPageVos);
this.setChildren(listMap, wikiPageVos, nowPath);
}
}
}
}

View File

@@ -1,5 +1,7 @@
package com.zyplayer.doc.wiki.controller;
import cn.hutool.core.util.ZipUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -15,13 +17,13 @@ import com.zyplayer.doc.data.service.manage.WikiPageHistoryService;
import com.zyplayer.doc.data.service.manage.WikiPageService;
import com.zyplayer.doc.data.service.manage.WikiSpaceService;
import com.zyplayer.doc.wiki.framework.consts.SpaceType;
import com.zyplayer.doc.wiki.service.git.GitService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Objects;
@@ -37,53 +39,59 @@ import java.util.Objects;
@RequestMapping("/zyplayer-doc-wiki/page/history")
@RequiredArgsConstructor
public class WikiPageHistoryController {
private final WikiPageHistoryService wikiPageHistoryService;
private final WikiSpaceService wikiSpaceService;
private final WikiPageService wikiPageService;
private final GitService gitService;
@PostMapping("/list")
public ResponseJson<List<WikiPageHistory>> list(Long pageId, Integer pageNum) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 私人空间
if (wikiPageSel == null || Objects.equals(wikiPageSel.getDelFlag(), 1)) {
return DocResponseJson.ok();
}
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 空间已删除
if (wikiSpaceSel == null || Objects.equals(wikiSpaceSel.getDelFlag(), 1)) {
return DocResponseJson.ok();
}
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章详情!");
}
UpdateWrapper<WikiPageHistory> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", pageId);
wrapper.eq("del_flag", 0);
wrapper.orderByDesc("id");
IPage<WikiPageHistory> page = new Page<>(pageNum, 30, false);
wikiPageHistoryService.page(page, wrapper);
return DocResponseJson.ok(page);
}
@PostMapping("/detail")
public ResponseJson<Object> detail(Long id) {
WikiPageHistory wikiPageHistory = wikiPageHistoryService.getById(id);
if (wikiPageHistory == null) {
return DocResponseJson.warn("未找到相关记录");
}
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(wikiPageHistory.getPageId());
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章详情!");
}
String pageHistory = gitService.getPageHistory(wikiPageHistory.getGitCommitId(), wikiPageHistory.getPageId());
return DocResponseJson.ok(pageHistory);
}
private final WikiPageHistoryService wikiPageHistoryService;
private final WikiSpaceService wikiSpaceService;
private final WikiPageService wikiPageService;
@PostMapping("/list")
public ResponseJson<List<WikiPageHistory>> list(Long pageId, Integer pageNum) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 私人空间
if (wikiPageSel == null || Objects.equals(wikiPageSel.getDelFlag(), 1)) {
return DocResponseJson.ok();
}
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 空间已删除
if (wikiSpaceSel == null || Objects.equals(wikiSpaceSel.getDelFlag(), 1)) {
return DocResponseJson.ok();
}
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章详情!");
}
LambdaQueryWrapper<WikiPageHistory> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(WikiPageHistory::getPageId, pageId);
wrapper.eq(WikiPageHistory::getDelFlag, 0);
wrapper.orderByDesc(WikiPageHistory::getId);
wrapper.select(WikiPageHistory::getId, WikiPageHistory::getCreateUserId, WikiPageHistory::getCreateUserName
, WikiPageHistory::getPageId, WikiPageHistory::getCreateTime);
IPage<WikiPageHistory> page = new Page<>(pageNum, 30, false);
wikiPageHistoryService.page(page, wrapper);
return DocResponseJson.ok(page);
}
@PostMapping("/detail")
public ResponseJson<Object> detail(Long id) {
WikiPageHistory wikiPageHistory = wikiPageHistoryService.getById(id);
if (wikiPageHistory == null) {
return DocResponseJson.warn("未找到相关记录");
}
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(wikiPageHistory.getPageId());
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章详情!");
}
try {
byte[] bytes = ZipUtil.unGzip(wikiPageHistory.getContent());
return DocResponseJson.ok(new String(bytes, StandardCharsets.UTF_8));
} catch (Exception e) {
log.error("解析文档内容失败", e);
return DocResponseJson.warn("解析文档内容失败:" + e.getMessage());
}
}
}

View File

@@ -1,184 +0,0 @@
package com.zyplayer.doc.wiki.service.git;
import cn.hutool.core.io.FileUtil;
import com.zyplayer.doc.core.exception.ConfirmException;
import com.zyplayer.doc.data.config.security.DocUserDetails;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageHistory;
import com.zyplayer.doc.data.service.manage.WikiPageHistoryService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.Status;
import org.eclipse.jgit.internal.storage.file.FileRepository;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.File;
import java.nio.charset.Charset;
import java.util.Date;
import java.util.Set;
/**
* git管理相关服务
*
* @author 暮光:城中城
* @since 2020年9月5日
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class GitService {
@Value("${zyplayer.doc.wiki.git-file-path:}")
private String gitFilePath;
@Value("${zyplayer.doc.wiki.git-local-path:}")
private String gitLocalPath;
@Value("${zyplayer.doc.wiki.git-remote-url:}")
private String gitRemoteUrl;
@Value("${zyplayer.doc.wiki.git-remote-username:}")
private String gitRemoteUsername;
@Value("${zyplayer.doc.wiki.git-remote-password:}")
private String gitRemotePassword;
private final WikiPageHistoryService wikiPageHistoryService;
/**
* 提交和写历史记录
*
* @param pageId 页面ID
* @param content 页面内容
*/
public void commitAndAddHistory(Long pageId, String content) {
// 未配置git仓库地址不存历史
if (StringUtils.isBlank(this.getGitLocalPath())) {
return;
}
String commitId = this.writeAndCommit(pageId, content);
// 保存历史记录
if (commitId != null) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPageHistory entity = new WikiPageHistory();
entity.setPageId(pageId);
entity.setCreateTime(new Date());
entity.setDelFlag(0);
entity.setGitCommitId(commitId);
entity.setCreateUserId(currentUser.getUserId());
entity.setCreateUserName(currentUser.getUsername());
wikiPageHistoryService.save(entity);
}
}
/**
* 把内容写入文件并提交git
*
* @param pageId 页面ID
* @param content 页面内容
* @return 版本ID
*/
private synchronized String writeAndCommit(Long pageId, String content) {
try {
// 初始化git仓库
Git git;
File dirFile = new File(this.getDotGitPath());
if (!dirFile.exists()) {
if (StringUtils.isNotBlank(gitRemoteUrl)) {
// 远程仓库拉取
git = Git.cloneRepository().setURI(gitRemoteUrl)
.setCredentialsProvider(new UsernamePasswordCredentialsProvider(gitRemoteUsername, gitRemotePassword))
.setBranch("master").setGitDir(dirFile).setDirectory(dirFile.getParentFile()).call();
} else {
// 创建本地仓库
git = Git.init().setGitDir(dirFile).setDirectory(dirFile.getParentFile()).call();
}
} else {
// 打开本地仓库
git = new Git(new FileRepository(this.getDotGitPath()));
}
// 修改文件内容
FileUtil.writeString(content, this.getGitPagePath(pageId), "utf-8");
// 没有改变的内容
if (git.status().call().isClean()) {
log.info("no changed");
return null;
}
git.add().addFilepattern(".").call();
Status status = git.status().call();
Set<String> missing = status.getMissing();
if (CollectionUtils.isNotEmpty(missing)) {
for (String f : missing) {
log.info("missing file: {}", f);
git.rm().addFilepattern(f).call();
}
}
Set<String> removed = status.getRemoved();
if (CollectionUtils.isNotEmpty(removed)) {
for (String f : removed) {
log.info("remove file: {}", f);
git.rm().addFilepattern(f).call();
}
}
RevCommit commit = git.commit().setMessage("commit").call();
// 存在远程地址则推送
if (StringUtils.isNotBlank(gitRemoteUrl)) {
git.push().setCredentialsProvider(new UsernamePasswordCredentialsProvider(gitRemoteUsername, gitRemotePassword)).call();
}
log.info("commit id: {}", commit.getName());
return commit.getName();
} catch (Exception e) {
log.error("git仓库提交失败", e);
throw new ConfirmException("创建历史记录失败:" + e.getMessage(), e);
}
}
/**
* 获取页面的历史版本内容
*
* @param objId 版本ID
* @param pageId 页面ID
* @return 页面内容
*/
public String getPageHistory(String objId, Long pageId) {
if (StringUtils.isBlank(this.getGitLocalPath())) {
throw new ConfirmException("未配置WIKI历史版本的git目录");
}
try {
Git git = Git.open(new File(this.getDotGitPath()));
Repository repository = git.getRepository();
RevCommit revCommit = new RevWalk(repository).parseCommit(ObjectId.fromString(objId));
TreeWalk treeWalk = TreeWalk.forPath(repository, this.getGitPageFile(pageId), revCommit.getTree());
treeWalk.setRecursive(false);
ObjectId blobId = treeWalk.getObjectId(0);
ObjectLoader loader = repository.open(blobId);
return new String(loader.getBytes(), Charset.forName("UTF-8"));
} catch (Exception e) {
log.error("获取git文件内容失败", e);
throw new ConfirmException("获取历史版本数据失败:" + e.getMessage());
}
}
private String getGitLocalPath() {
return StringUtils.defaultIfBlank(gitLocalPath, gitFilePath);
}
private String getDotGitPath() {
return this.getGitLocalPath() + "/.git";
}
private String getGitPageFile(Long pageId) {
return pageId + ".txt";
}
private String getGitPagePath(Long pageId) {
return this.getGitLocalPath() + "/" + this.getGitPageFile(pageId);
}
}

View File

@@ -1,81 +0,0 @@
//package com.zyplayer.doc.wiki.service.git;
//
//import org.apache.commons.collections.CollectionUtils;
//import org.eclipse.jgit.api.Git;
//import org.eclipse.jgit.api.Status;
//import org.eclipse.jgit.api.errors.GitAPIException;
//import org.eclipse.jgit.lib.ObjectId;
//import org.eclipse.jgit.lib.ObjectLoader;
//import org.eclipse.jgit.lib.Repository;
//import org.eclipse.jgit.revwalk.RevCommit;
//import org.eclipse.jgit.revwalk.RevWalk;
//import org.eclipse.jgit.treewalk.TreeWalk;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.io.File;
//import java.util.Set;
//
//public class GitTest {
// private static Logger logger = LoggerFactory.getLogger(GitTest.class);
//
// private static final String LOCAL_PATH = "d:/zyplayerDoc/wikiGitFiles/.git";
//
// /**
// * 提交
// */
// private static String commitFiles() {
// try {
// Git git = Git.open(new File(LOCAL_PATH));
// if (git.status().call().isClean()) {
// logger.info("no changed");
// return null;
// }
// git.add().addFilepattern(".").call();
// Status status = git.status().call();
// Set<String> missing = status.getMissing();
// if (CollectionUtils.isNotEmpty(missing)) {
// for (String f : missing) {
// logger.info("missing file: {}", f);
// git.rm().addFilepattern(f).call();
// }
// }
// Set<String> removed = status.getRemoved();
// if (CollectionUtils.isNotEmpty(removed)) {
// for (String f : removed) {
// logger.info("remove file: {}", f);
// git.rm().addFilepattern(f).call();
// }
// }
// RevCommit commit = git.commit().setMessage("commit").call();
// logger.info("commit id: {}", commit.getName());
// return commit.getName();
// } catch (Exception e) {
// e.printStackTrace();
// }
// return null;
// }
//
// private static void init() throws GitAPIException {
// File dirFile = new File(LOCAL_PATH);
// Git.init().setGitDir(dirFile).setDirectory(dirFile.getParentFile()).call();
// }
//
// private static void getFile(String objId, String entryPath) throws Exception {
// Git git = Git.open(new File(LOCAL_PATH));
// Repository repository = git.getRepository();
// RevCommit revCommit = new RevWalk(repository).parseCommit(ObjectId.fromString(objId));
// TreeWalk treeWalk = TreeWalk.forPath(repository, entryPath, revCommit.getTree());
// treeWalk.setRecursive(false);
// ObjectId blobId = treeWalk.getObjectId(0);
// ObjectLoader loader = repository.open(blobId);
// String fileContent = new String(loader.getBytes());
// logger.info("fileContent: {}", fileContent);
// }
//
// public static void main(String[] args) throws Exception {
//// init();
//// commitFiles();
// getFile("b47305c88251b7473928640b1f5346b40bb7387e", "14.txt");
// }
//}