同步闭源版本代码:自动执行升级SQL、历史记录改为数据库存储、去掉git操作,优化代码结构,去掉不需要的文件
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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");
|
||||
// }
|
||||
//}
|
||||
1
zyplayer-doc-wiki/src/main/resources/dist/css/index.07006734.css
vendored
Normal file
1
zyplayer-doc-wiki/src/main/resources/dist/css/index.07006734.css
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon-wiki.png"><title>WIKI文档管理系统</title><link href="css/chunk-vendors.308b73bf.css" rel="preload" as="style"><link href="css/index.87aebf71.css" rel="preload" as="style"><link href="js/chunk-vendors.fcb2db6f.js" rel="preload" as="script"><link href="js/index.dbe36481.js" rel="preload" as="script"><link href="css/chunk-vendors.308b73bf.css" rel="stylesheet"><link href="css/index.87aebf71.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but zyplayer-wiki-ui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="js/chunk-vendors.fcb2db6f.js"></script><script src="js/index.dbe36481.js"></script></body></html>
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon-wiki.png"><title>WIKI文档管理系统</title><link href="css/chunk-vendors.308b73bf.css" rel="preload" as="style"><link href="css/index.07006734.css" rel="preload" as="style"><link href="js/chunk-vendors.10d9e04d.js" rel="preload" as="script"><link href="js/index.aa2826a9.js" rel="preload" as="script"><link href="css/chunk-vendors.308b73bf.css" rel="stylesheet"><link href="css/index.07006734.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but zyplayer-wiki-ui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="js/chunk-vendors.10d9e04d.js"></script><script src="js/index.aa2826a9.js"></script></body></html>
|
||||
165
zyplayer-doc-wiki/src/main/resources/dist/js/chunk-vendors.10d9e04d.js
vendored
Normal file
165
zyplayer-doc-wiki/src/main/resources/dist/js/chunk-vendors.10d9e04d.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
zyplayer-doc-wiki/src/main/resources/dist/js/index.aa2826a9.js
vendored
Normal file
1
zyplayer-doc-wiki/src/main/resources/dist/js/index.aa2826a9.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user