!5 一些lombok的使用

使用 @RequiredArgsConstructor 进行注入
使用 @jav 替换logger
优化了import,不导入*
idea自动整理了下代码格式
This commit is contained in:
handy
2022-12-29 09:05:50 +00:00
committed by 暮光:城中城
parent d5636c89dd
commit 3829a438e2
18 changed files with 1532 additions and 1523 deletions

View File

@@ -19,15 +19,14 @@ import com.zyplayer.doc.data.service.manage.WikiPageFileService;
import com.zyplayer.doc.data.service.manage.WikiPageService;
import com.zyplayer.doc.data.service.manage.WikiSpaceService;
import com.zyplayer.doc.wiki.framework.consts.Const;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
@@ -42,87 +41,83 @@ import java.util.Optional;
* @author 暮光:城中城
* @since 2019年2月17日
*/
@Slf4j
@RestController
@RequestMapping("/zyplayer-doc-wiki/common")
@RequiredArgsConstructor
public class WikiCommonController {
private static Logger logger = LoggerFactory.getLogger(WikiCommonController.class);
@Resource
WikiPageFileService wikiPageFileService;
@Resource
WikiPageService wikiPageService;
@Resource
WikiSpaceService wikiSpaceService;
@Resource
UserInfoService userInfoService;
@Resource
WikiPageFileMapper wikiPageFileMapper;
@AuthMan
@PostMapping("/user/base")
public ResponseJson<Object> userBaseInfo(String search) {
if (StringUtils.isBlank(search)) {
return DocResponseJson.ok();
}
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.and(con -> con.and(conSub -> conSub.like("user_name", search).or().like("user_no", search)
.or().like("email", search)).and(conSub -> conSub.eq("del_flag", 0)));
queryWrapper.select("id", "user_name");
// 搜索最多返回20条
IPage<UserInfo> page = new Page<>(1, 20, false);
userInfoService.page(page, queryWrapper);
return DocResponseJson.ok(page);
}
@GetMapping("/file")
public ResponseJson<Object> file(HttpServletResponse response, String uuid) {
if (StringUtils.isBlank(uuid)) {
return DocResponseJson.warn("指定文件ID");
}
UpdateWrapper<WikiPageFile> wrapperFile = new UpdateWrapper<>();
wrapperFile.eq("uuid", uuid);
WikiPageFile pageFile = wikiPageFileService.getOne(wrapperFile);
if (pageFile == null) {
return DocResponseJson.warn("未找到指定文件");
}
// 未登录访问文件,需要判断是否是开放空间的文件
Long pageId = Optional.ofNullable(pageFile.getPageId()).orElse(0L);
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
if (pageId > 0 && currentUser == null) {
WikiPage wikiPage = wikiPageService.getById(pageId);
WikiSpace wikiSpace = wikiSpaceService.getById(wikiPage.getSpaceId());
if (wikiSpace.getOpenDoc() == 0) {
return DocResponseJson.warn("登陆后才可访问此文件");
}
}
// 增加下载次数
wikiPageFileMapper.addDownloadNum(pageFile.getId());
try {
String fileName = Optional.ofNullable(pageFile.getFileName()).orElse("");
File file = new File(pageFile.getFileUrl());
String fileSuffix = "";
if (fileName.lastIndexOf(".") >= 0) {
fileSuffix = fileName.substring(fileName.lastIndexOf("."));
}
String mimeStr = Optional.ofNullable(Const.mimeMap.get(fileSuffix)).orElse("text/plain");
response.setContentType(mimeStr);
response.setHeader("Content-disposition", "inline;filename=" + URLEncoder.encode(fileName, "UTF-8"));
private final WikiPageFileService wikiPageFileService;
private final WikiPageService wikiPageService;
private final WikiSpaceService wikiSpaceService;
private final UserInfoService userInfoService;
private final WikiPageFileMapper wikiPageFileMapper;
@AuthMan
@PostMapping("/user/base")
public ResponseJson<Object> userBaseInfo(String search) {
if (StringUtils.isBlank(search)) {
return DocResponseJson.ok();
}
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.and(con -> con.and(conSub -> conSub.like("user_name", search).or().like("user_no", search)
.or().like("email", search)).and(conSub -> conSub.eq("del_flag", 0)));
queryWrapper.select("id", "user_name");
// 搜索最多返回20条
IPage<UserInfo> page = new Page<>(1, 20, false);
userInfoService.page(page, queryWrapper);
return DocResponseJson.ok(page);
}
@GetMapping("/file")
public ResponseJson<Object> file(HttpServletResponse response, String uuid) {
if (StringUtils.isBlank(uuid)) {
return DocResponseJson.warn("请指定文件ID");
}
UpdateWrapper<WikiPageFile> wrapperFile = new UpdateWrapper<>();
wrapperFile.eq("uuid", uuid);
WikiPageFile pageFile = wikiPageFileService.getOne(wrapperFile);
if (pageFile == null) {
return DocResponseJson.warn("未找到指定文件");
}
// 未登录访问文件,需要判断是否是开放空间的文件
Long pageId = Optional.ofNullable(pageFile.getPageId()).orElse(0L);
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
if (pageId > 0 && currentUser == null) {
WikiPage wikiPage = wikiPageService.getById(pageId);
WikiSpace wikiSpace = wikiSpaceService.getById(wikiPage.getSpaceId());
if (wikiSpace.getOpenDoc() == 0) {
return DocResponseJson.warn("登陆后才可访问此文件");
}
}
// 增加下载次数
wikiPageFileMapper.addDownloadNum(pageFile.getId());
try {
String fileName = Optional.ofNullable(pageFile.getFileName()).orElse("");
File file = new File(pageFile.getFileUrl());
String fileSuffix = "";
if (fileName.lastIndexOf(".") >= 0) {
fileSuffix = fileName.substring(fileName.lastIndexOf("."));
}
String mimeStr = Optional.ofNullable(Const.mimeMap.get(fileSuffix)).orElse("text/plain");
response.setContentType(mimeStr);
response.setHeader("Content-disposition", "inline;filename=" + URLEncoder.encode(fileName, "UTF-8"));
// response.setHeader("Content-disposition", "inline;filename=" + fileName);
// response.setHeader("Content-Disposition", "inline; fileName=" + fileName + ";filename*=utf-8''" + URLEncoder.encode(fileName, "UTF-8"));
InputStream inputStream = new FileInputStream(file);
OutputStream os = response.getOutputStream();
byte[] b = new byte[2048];
int length;
while ((length = inputStream.read(b)) > 0) {
os.write(b, 0, length);
}
os.close();
inputStream.close();
return null;
} catch (Exception e) {
logger.info("失败:{}", e.getMessage());
}
return DocResponseJson.warn("获取文件失败");
}
InputStream inputStream = new FileInputStream(file);
OutputStream os = response.getOutputStream();
byte[] b = new byte[2048];
int length;
while ((length = inputStream.read(b)) > 0) {
os.write(b, 0, length);
}
os.close();
inputStream.close();
return null;
} catch (Exception e) {
log.info("失败:{}", e.getMessage());
}
return DocResponseJson.warn("获取文件失败");
}
}

View File

@@ -17,16 +17,20 @@ import com.zyplayer.doc.data.service.manage.WikiPageService;
import com.zyplayer.doc.data.service.manage.WikiSpaceService;
import com.zyplayer.doc.wiki.controller.vo.WikiPageContentVo;
import com.zyplayer.doc.wiki.controller.vo.WikiPageVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.*;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
/**
@@ -35,155 +39,152 @@ import java.util.stream.Collectors;
* @author 暮光:城中城
* @since 2019年2月17日
*/
@Slf4j
@RestController
@RequestMapping("/zyplayer-doc-wiki/open-api")
@RequiredArgsConstructor
public class WikiOpenApiController {
private static Logger logger = LoggerFactory.getLogger(WikiOpenApiController.class);
@Resource
WikiPageService wikiPageService;
@Resource
WikiSpaceService wikiSpaceService;
@Resource
WikiPageContentService wikiPageContentService;
@Resource
WikiPageFileService wikiPageFileService;
@Resource
WikiPageContentMapper wikiPageContentMapper;
@PostMapping("/space/info")
public ResponseJson<WikiSpace> spaceInfo(String space) {
WikiSpace wikiSpace = this.getWikiSpace(space);
if (wikiSpace == null) {
return DocResponseJson.warn("未找到该文档");
}
return DocResponseJson.ok(wikiSpace);
}
@PostMapping("/page/news")
public ResponseJson<List<WikiPageVo>> news(SearchByEsParam param, String space) {
WikiSpace wikiSpace = this.getWikiSpace(space);
if (wikiSpace == null) {
return DocResponseJson.warn("未找到该文档");
}
String keywords = param.getKeywords();
if (StringUtils.isNotBlank(keywords)) {
param.setKeywords("%" + keywords + "%");
}
// 分页查询
param.setSpaceIds(Collections.singletonList(wikiSpace.getId()));
List<SpaceNewsVo> spaceNewsVoList = wikiPageContentMapper.getNewsList(param);
if (CollectionUtils.isNotEmpty(spaceNewsVoList)) {
spaceNewsVoList.forEach(val -> {
val.setSpace(wikiSpace.getUuid());
val.setSpaceName(wikiSpace.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);
}
@PostMapping("/page/list")
public ResponseJson<List<WikiPageVo>> list(String space) {
WikiSpace wikiSpace = this.getWikiSpace(space);
if (wikiSpace == null) {
return DocResponseJson.warn("未找到该文档");
}
QueryWrapper<WikiPage> wrapper = new QueryWrapper<>();
wrapper.eq("del_flag", 0);
wrapper.eq("space_id", wikiSpace.getId());
List<WikiPage> wikiPageList = wikiPageService.list(wrapper);
if (CollectionUtils.isEmpty(wikiPageList)) {
return DocResponseJson.ok();
}
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("/page/detail")
public ResponseJson<WikiPageContentVo> detail(String space, Long pageId) {
WikiSpace wikiSpace = this.getWikiSpace(space);
if (wikiSpace == null) {
return DocResponseJson.warn("未找到该文档");
}
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 不存在或不属于该空间
if (wikiPageSel == null || !Objects.equals(wikiPageSel.getSpaceId(), wikiSpace.getId())) {
return DocResponseJson.warn("未找到该文档");
}
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", pageId);
WikiPageContent pageContent = wikiPageContentService.getOne(wrapper);
UpdateWrapper<WikiPageFile> wrapperFile = new UpdateWrapper<>();
wrapperFile.eq("page_id", pageId);
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());
}
// 高并发下会有覆盖问题,但不重要~
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);
WikiPageContentVo vo = new WikiPageContentVo();
vo.setWikiPage(wikiPageSel);
vo.setPageContent(pageContent);
vo.setFileList(pageFiles);
return DocResponseJson.ok(vo);
}
private void setChildren(Map<Long, List<WikiPageVo>> listMap, List<WikiPageVo> nodePageList) {
if (nodePageList == null || listMap == null) {
return;
}
for (WikiPageVo page : nodePageList) {
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);
}
}
}
/**
* 获取空间信息
* @param space
* @return
*/
private WikiSpace getWikiSpace(String space) {
QueryWrapper<WikiSpace> wrapperSpace = new QueryWrapper<>();
wrapperSpace.eq("uuid", space);
wrapperSpace.eq("del_flag", 0);
WikiSpace wikiSpace = wikiSpaceService.getOne(wrapperSpace);
// 不存在或未开放
if (wikiSpace == null || wikiSpace.getOpenDoc() != 1) {
return null;
}
return wikiSpace;
}
private final WikiPageService wikiPageService;
private final WikiSpaceService wikiSpaceService;
private final WikiPageContentService wikiPageContentService;
private final WikiPageFileService wikiPageFileService;
private final WikiPageContentMapper wikiPageContentMapper;
@PostMapping("/space/info")
public ResponseJson<WikiSpace> spaceInfo(String space) {
WikiSpace wikiSpace = this.getWikiSpace(space);
if (wikiSpace == null) {
return DocResponseJson.warn("未找到该文档");
}
return DocResponseJson.ok(wikiSpace);
}
@PostMapping("/page/news")
public ResponseJson<List<WikiPageVo>> news(SearchByEsParam param, String space) {
WikiSpace wikiSpace = this.getWikiSpace(space);
if (wikiSpace == null) {
return DocResponseJson.warn("未找到该文档");
}
String keywords = param.getKeywords();
if (StringUtils.isNotBlank(keywords)) {
param.setKeywords("%" + keywords + "%");
}
// 分页查询
param.setSpaceIds(Collections.singletonList(wikiSpace.getId()));
List<SpaceNewsVo> spaceNewsVoList = wikiPageContentMapper.getNewsList(param);
if (CollectionUtils.isNotEmpty(spaceNewsVoList)) {
spaceNewsVoList.forEach(val -> {
val.setSpace(wikiSpace.getUuid());
val.setSpaceName(wikiSpace.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);
}
@PostMapping("/page/list")
public ResponseJson<List<WikiPageVo>> list(String space) {
WikiSpace wikiSpace = this.getWikiSpace(space);
if (wikiSpace == null) {
return DocResponseJson.warn("未找到该文档");
}
QueryWrapper<WikiPage> wrapper = new QueryWrapper<>();
wrapper.eq("del_flag", 0);
wrapper.eq("space_id", wikiSpace.getId());
List<WikiPage> wikiPageList = wikiPageService.list(wrapper);
if (CollectionUtils.isEmpty(wikiPageList)) {
return DocResponseJson.ok();
}
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("/page/detail")
public ResponseJson<WikiPageContentVo> detail(String space, Long pageId) {
WikiSpace wikiSpace = this.getWikiSpace(space);
if (wikiSpace == null) {
return DocResponseJson.warn("未找到该文档");
}
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 不存在或不属于该空间
if (wikiPageSel == null || !Objects.equals(wikiPageSel.getSpaceId(), wikiSpace.getId())) {
return DocResponseJson.warn("未找到该文档");
}
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", pageId);
WikiPageContent pageContent = wikiPageContentService.getOne(wrapper);
UpdateWrapper<WikiPageFile> wrapperFile = new UpdateWrapper<>();
wrapperFile.eq("page_id", pageId);
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());
}
// 高并发下会有覆盖问题,但不重要~
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);
WikiPageContentVo vo = new WikiPageContentVo();
vo.setWikiPage(wikiPageSel);
vo.setPageContent(pageContent);
vo.setFileList(pageFiles);
return DocResponseJson.ok(vo);
}
private void setChildren(Map<Long, List<WikiPageVo>> listMap, List<WikiPageVo> nodePageList) {
if (nodePageList == null || listMap == null) {
return;
}
for (WikiPageVo page : nodePageList) {
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);
}
}
}
/**
* 获取空间信息
*
* @param space
* @return
*/
private WikiSpace getWikiSpace(String space) {
QueryWrapper<WikiSpace> wrapperSpace = new QueryWrapper<>();
wrapperSpace.eq("uuid", space);
wrapperSpace.eq("del_flag", 0);
WikiSpace wikiSpace = wikiSpaceService.getOne(wrapperSpace);
// 不存在或未开放
if (wikiSpace == null || wikiSpace.getOpenDoc() != 1) {
return null;
}
return wikiSpace;
}
}

View File

@@ -8,24 +8,41 @@ 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.config.security.UserAuthVo;
import com.zyplayer.doc.data.repository.manage.entity.*;
import com.zyplayer.doc.data.repository.manage.entity.AuthInfo;
import com.zyplayer.doc.data.repository.manage.entity.UserAuth;
import com.zyplayer.doc.data.repository.manage.entity.UserInfo;
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.WikiPageZan;
import com.zyplayer.doc.data.repository.manage.entity.WikiSpace;
import com.zyplayer.doc.data.repository.manage.mapper.UserGroupAuthMapper;
import com.zyplayer.doc.data.repository.support.consts.DocSysModuleType;
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.*;
import com.zyplayer.doc.data.service.manage.AuthInfoService;
import com.zyplayer.doc.data.service.manage.UserAuthService;
import com.zyplayer.doc.data.service.manage.UserInfoService;
import com.zyplayer.doc.data.service.manage.UserMessageService;
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.wiki.controller.vo.UserPageAuthVo;
import com.zyplayer.doc.wiki.framework.consts.WikiAuthType;
import com.zyplayer.doc.wiki.service.common.WikiPageAuthService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.*;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -35,146 +52,138 @@ import java.util.stream.Stream;
* @author 暮光:城中城
* @since 2019年2月17日
*/
@Slf4j
@AuthMan
@RestController
@RequestMapping("/zyplayer-doc-wiki/page/auth")
@RequiredArgsConstructor
public class WikiPageAuthController {
private static Logger logger = LoggerFactory.getLogger(WikiPageAuthController.class);
@Resource
WikiPageZanService wikiPageZanService;
@Resource
WikiSpaceService wikiSpaceService;
@Resource
UserInfoService userInfoService;
@Resource
WikiPageService wikiPageService;
@Resource
UserAuthService userAuthService;
@Resource
AuthInfoService authInfoService;
@Resource
WikiPageAuthService wikiPageAuthService;
@Resource
UserMessageService userMessageService;
@Resource
UserGroupAuthMapper userGroupAuthMapper;
@PostMapping("/assign")
public ResponseJson<List<WikiPageZan>> assign(Long pageId, String authList) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canConfigAuth = wikiPageAuthService.canConfigAuth(wikiSpaceSel, pageId, currentUser.getUserId());
if (canConfigAuth != null) {
return DocResponseJson.warn(canConfigAuth);
}
List<String> authNameList = Stream.of(WikiAuthType.values()).map(WikiAuthType::getCode).collect(Collectors.toList());
QueryWrapper<AuthInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.in("auth_name", authNameList);
Collection<AuthInfo> authInfoList = authInfoService.list(queryWrapper);
Map<String, Long> authInfoMap = authInfoList.stream().collect(Collectors.toMap(AuthInfo::getAuthName, AuthInfo::getId));
// 先删除页面的所有用户的权限
userAuthService.deleteModuleAuth(DocSysType.WIKI.getType(), DocSysModuleType.Wiki.PAGE.getType(), pageId);
List<UserPageAuthVo> authVoList = JSON.parseArray(authList, UserPageAuthVo.class);
for (UserPageAuthVo authVo : authVoList) {
List<UserAuth> userAuthList = new LinkedList<>();
if (Objects.equals(authVo.getEditPage(), 1)) {
Long authId = authInfoMap.get(WikiAuthType.EDIT_PAGE.getCode());
UserAuth userAuth = this.createUserAuth(pageId, currentUser.getUserId(), authVo.getUserId(), authId);
userAuthList.add(userAuth);
}
if (Objects.equals(authVo.getDeletePage(), 1)) {
Long authId = authInfoMap.get(WikiAuthType.DELETE_PAGE.getCode());
UserAuth userAuth = this.createUserAuth(pageId, currentUser.getUserId(), authVo.getUserId(), authId);
userAuthList.add(userAuth);
}
if (Objects.equals(authVo.getPageFileUpload(), 1)) {
Long authId = authInfoMap.get(WikiAuthType.PAGE_FILE_UPLOAD.getCode());
UserAuth userAuth = this.createUserAuth(pageId, currentUser.getUserId(), authVo.getUserId(), authId);
userAuthList.add(userAuth);
}
if (Objects.equals(authVo.getPageFileDelete(), 1)) {
Long authId = authInfoMap.get(WikiAuthType.PAGE_FILE_DELETE.getCode());
UserAuth userAuth = this.createUserAuth(pageId, currentUser.getUserId(), authVo.getUserId(), authId);
userAuthList.add(userAuth);
}
if (Objects.equals(authVo.getPageAuthManage(), 1)) {
Long authId = authInfoMap.get(WikiAuthType.PAGE_AUTH_MANAGE.getCode());
UserAuth userAuth = this.createUserAuth(pageId, currentUser.getUserId(), authVo.getUserId(), authId);
userAuthList.add(userAuth);
}
if (userAuthList.size() <= 0) {
continue;
}
// 保存权限,重新登录后可用,后期可以考虑在这里直接修改缓存里的用户权限
userAuthService.saveBatch(userAuthList);
// 给相关人发送消息
UserInfo userInfo = userInfoService.getById(authVo.getUserId());
UserMessage userMessage = userMessageService.createUserMessage(currentUser, pageId, wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_AUTH);
userMessage.setAffectUserId(userInfo.getId());
userMessage.setAffectUserName(userInfo.getUserName());
userMessageService.addWikiMessage(userMessage);
// 刷新用户权限
List<UserAuthVo> userAuthListNew = userAuthService.getUserAuthSet(authVo.getUserId());
DocUserUtil.setUserAuth(authVo.getUserId(), userAuthListNew);
}
return DocResponseJson.ok();
}
@PostMapping("/list")
public ResponseJson<Object> list(Long pageId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canConfigAuth = wikiPageAuthService.canConfigAuth(wikiSpaceSel, pageId, currentUser.getUserId());
if (canConfigAuth != null) {
return DocResponseJson.warn(canConfigAuth);
}
List<UserAuth> authList = userAuthService.getModuleAuthList(DocSysType.WIKI.getType(), DocSysModuleType.Wiki.PAGE.getType(), pageId);
if (CollectionUtils.isEmpty(authList)) {
return DocResponseJson.ok();
}
// 权限ID对应的权限名
Collection<AuthInfo> authInfoList = authInfoService.listByIds(authList.stream().map(UserAuth::getAuthId).collect(Collectors.toSet()));
Map<Long, String> authInfoMap = authInfoList.stream().collect(Collectors.toMap(AuthInfo::getId, AuthInfo::getAuthName));
// 查询用户信息
Map<Long, List<UserAuth>> userAuthGroup = authList.stream().collect(Collectors.groupingBy(UserAuth::getUserId));
Collection<UserInfo> userInfos = userInfoService.listByIds(userAuthGroup.keySet());
Map<Long, String> userInfoMap = userInfos.stream().collect(Collectors.toMap(UserInfo::getId, UserInfo::getUserName));
List<UserPageAuthVo> authVoList = new LinkedList<>();
// 组装结果集
userAuthGroup.forEach((key, value) -> {
Set<String> authNameSet = value.stream().map(auth -> authInfoMap.get(auth.getAuthId())).collect(Collectors.toSet());
UserPageAuthVo authVo = new UserPageAuthVo();
authVo.setEditPage(this.haveAuth(authNameSet, WikiAuthType.EDIT_PAGE));
authVo.setDeletePage(this.haveAuth(authNameSet, WikiAuthType.DELETE_PAGE));
authVo.setPageFileUpload(this.haveAuth(authNameSet, WikiAuthType.PAGE_FILE_UPLOAD));
authVo.setPageFileDelete(this.haveAuth(authNameSet, WikiAuthType.PAGE_FILE_DELETE));
authVo.setPageAuthManage(this.haveAuth(authNameSet, WikiAuthType.PAGE_AUTH_MANAGE));
authVo.setUserId(key);
authVo.setUserName(userInfoMap.get(key));
authVoList.add(authVo);
});
return DocResponseJson.ok(authVoList);
}
private Integer haveAuth(Set<String> authNameSet, WikiAuthType wikiAuthType) {
return authNameSet.contains(wikiAuthType.getCode()) ? 1 : 0;
}
private UserAuth createUserAuth(Long pageId, Long loginUserId, Long userId, Long authId) {
UserAuth userAuth = new UserAuth();
userAuth.setSysType(DocSysType.WIKI.getType());
userAuth.setSysModuleType(DocSysModuleType.Wiki.PAGE.getType());
userAuth.setSysModuleId(pageId);
userAuth.setCreationTime(new Date());
userAuth.setCreateUid(loginUserId);
userAuth.setDelFlag(0);
userAuth.setUserId(userId);
userAuth.setAuthId(authId);
return userAuth;
}
private final WikiPageZanService wikiPageZanService;
private final WikiSpaceService wikiSpaceService;
private final UserInfoService userInfoService;
private final WikiPageService wikiPageService;
private final UserAuthService userAuthService;
private final AuthInfoService authInfoService;
private final WikiPageAuthService wikiPageAuthService;
private final UserMessageService userMessageService;
private final UserGroupAuthMapper userGroupAuthMapper;
@PostMapping("/assign")
public ResponseJson<List<WikiPageZan>> assign(Long pageId, String authList) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canConfigAuth = wikiPageAuthService.canConfigAuth(wikiSpaceSel, pageId, currentUser.getUserId());
if (canConfigAuth != null) {
return DocResponseJson.warn(canConfigAuth);
}
List<String> authNameList = Stream.of(WikiAuthType.values()).map(WikiAuthType::getCode).collect(Collectors.toList());
QueryWrapper<AuthInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.in("auth_name", authNameList);
Collection<AuthInfo> authInfoList = authInfoService.list(queryWrapper);
Map<String, Long> authInfoMap = authInfoList.stream().collect(Collectors.toMap(AuthInfo::getAuthName, AuthInfo::getId));
// 先删除页面的所有用户的权限
userAuthService.deleteModuleAuth(DocSysType.WIKI.getType(), DocSysModuleType.Wiki.PAGE.getType(), pageId);
List<UserPageAuthVo> authVoList = JSON.parseArray(authList, UserPageAuthVo.class);
for (UserPageAuthVo authVo : authVoList) {
List<UserAuth> userAuthList = new LinkedList<>();
if (Objects.equals(authVo.getEditPage(), 1)) {
Long authId = authInfoMap.get(WikiAuthType.EDIT_PAGE.getCode());
UserAuth userAuth = this.createUserAuth(pageId, currentUser.getUserId(), authVo.getUserId(), authId);
userAuthList.add(userAuth);
}
if (Objects.equals(authVo.getDeletePage(), 1)) {
Long authId = authInfoMap.get(WikiAuthType.DELETE_PAGE.getCode());
UserAuth userAuth = this.createUserAuth(pageId, currentUser.getUserId(), authVo.getUserId(), authId);
userAuthList.add(userAuth);
}
if (Objects.equals(authVo.getPageFileUpload(), 1)) {
Long authId = authInfoMap.get(WikiAuthType.PAGE_FILE_UPLOAD.getCode());
UserAuth userAuth = this.createUserAuth(pageId, currentUser.getUserId(), authVo.getUserId(), authId);
userAuthList.add(userAuth);
}
if (Objects.equals(authVo.getPageFileDelete(), 1)) {
Long authId = authInfoMap.get(WikiAuthType.PAGE_FILE_DELETE.getCode());
UserAuth userAuth = this.createUserAuth(pageId, currentUser.getUserId(), authVo.getUserId(), authId);
userAuthList.add(userAuth);
}
if (Objects.equals(authVo.getPageAuthManage(), 1)) {
Long authId = authInfoMap.get(WikiAuthType.PAGE_AUTH_MANAGE.getCode());
UserAuth userAuth = this.createUserAuth(pageId, currentUser.getUserId(), authVo.getUserId(), authId);
userAuthList.add(userAuth);
}
if (userAuthList.size() <= 0) {
continue;
}
// 保存权限,重新登录后可用,后期可以考虑在这里直接修改缓存里的用户权限
userAuthService.saveBatch(userAuthList);
// 给相关人发送消息
UserInfo userInfo = userInfoService.getById(authVo.getUserId());
UserMessage userMessage = userMessageService.createUserMessage(currentUser, pageId, wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_AUTH);
userMessage.setAffectUserId(userInfo.getId());
userMessage.setAffectUserName(userInfo.getUserName());
userMessageService.addWikiMessage(userMessage);
// 刷新用户权限
List<UserAuthVo> userAuthListNew = userAuthService.getUserAuthSet(authVo.getUserId());
DocUserUtil.setUserAuth(authVo.getUserId(), userAuthListNew);
}
return DocResponseJson.ok();
}
@PostMapping("/list")
public ResponseJson<Object> list(Long pageId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canConfigAuth = wikiPageAuthService.canConfigAuth(wikiSpaceSel, pageId, currentUser.getUserId());
if (canConfigAuth != null) {
return DocResponseJson.warn(canConfigAuth);
}
List<UserAuth> authList = userAuthService.getModuleAuthList(DocSysType.WIKI.getType(), DocSysModuleType.Wiki.PAGE.getType(), pageId);
if (CollectionUtils.isEmpty(authList)) {
return DocResponseJson.ok();
}
// 权限ID对应的权限名
Collection<AuthInfo> authInfoList = authInfoService.listByIds(authList.stream().map(UserAuth::getAuthId).collect(Collectors.toSet()));
Map<Long, String> authInfoMap = authInfoList.stream().collect(Collectors.toMap(AuthInfo::getId, AuthInfo::getAuthName));
// 查询用户信息
Map<Long, List<UserAuth>> userAuthGroup = authList.stream().collect(Collectors.groupingBy(UserAuth::getUserId));
Collection<UserInfo> userInfos = userInfoService.listByIds(userAuthGroup.keySet());
Map<Long, String> userInfoMap = userInfos.stream().collect(Collectors.toMap(UserInfo::getId, UserInfo::getUserName));
List<UserPageAuthVo> authVoList = new LinkedList<>();
// 组装结果集
userAuthGroup.forEach((key, value) -> {
Set<String> authNameSet = value.stream().map(auth -> authInfoMap.get(auth.getAuthId())).collect(Collectors.toSet());
UserPageAuthVo authVo = new UserPageAuthVo();
authVo.setEditPage(this.haveAuth(authNameSet, WikiAuthType.EDIT_PAGE));
authVo.setDeletePage(this.haveAuth(authNameSet, WikiAuthType.DELETE_PAGE));
authVo.setPageFileUpload(this.haveAuth(authNameSet, WikiAuthType.PAGE_FILE_UPLOAD));
authVo.setPageFileDelete(this.haveAuth(authNameSet, WikiAuthType.PAGE_FILE_DELETE));
authVo.setPageAuthManage(this.haveAuth(authNameSet, WikiAuthType.PAGE_AUTH_MANAGE));
authVo.setUserId(key);
authVo.setUserName(userInfoMap.get(key));
authVoList.add(authVo);
});
return DocResponseJson.ok(authVoList);
}
private Integer haveAuth(Set<String> authNameSet, WikiAuthType wikiAuthType) {
return authNameSet.contains(wikiAuthType.getCode()) ? 1 : 0;
}
private UserAuth createUserAuth(Long pageId, Long loginUserId, Long userId, Long authId) {
UserAuth userAuth = new UserAuth();
userAuth.setSysType(DocSysType.WIKI.getType());
userAuth.setSysModuleType(DocSysModuleType.Wiki.PAGE.getType());
userAuth.setSysModuleId(pageId);
userAuth.setCreationTime(new Date());
userAuth.setCreateUid(loginUserId);
userAuth.setDelFlag(0);
userAuth.setUserId(userId);
userAuth.setAuthId(authId);
return userAuth;
}
}

View File

@@ -18,8 +18,8 @@ import com.zyplayer.doc.data.service.manage.WikiPageService;
import com.zyplayer.doc.data.service.manage.WikiSpaceService;
import com.zyplayer.doc.wiki.controller.vo.WikiPageCommentVo;
import com.zyplayer.doc.wiki.framework.consts.SpaceType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
@@ -35,20 +35,21 @@ import java.util.Objects;
* @author 暮光:城中城
* @since 2019年2月17日
*/
@Slf4j
@AuthMan
@RestController
@RequestMapping("/zyplayer-doc-wiki/page/comment")
@RequiredArgsConstructor
public class WikiPageCommentController {
private static Logger logger = LoggerFactory.getLogger(WikiPageCommentController.class);
@Resource
WikiPageCommentService wikiPageCommentService;
private final WikiPageCommentService wikiPageCommentService;
@Resource
WikiSpaceService wikiSpaceService;
private final WikiSpaceService wikiSpaceService;
@Resource
WikiPageService wikiPageService;
private final WikiPageService wikiPageService;
@Resource
UserMessageService userMessageService;
private final UserMessageService userMessageService;
@PostMapping("/list")
public ResponseJson<List<WikiPageCommentVo>> list(WikiPageComment pageComment) {

View File

@@ -8,14 +8,24 @@ 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.*;
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.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.*;
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.utils.CachePrefix;
import com.zyplayer.doc.data.utils.CacheUtil;
import com.zyplayer.doc.wiki.controller.vo.WikiPageContentVo;
@@ -23,22 +33,28 @@ import com.zyplayer.doc.wiki.controller.vo.WikiPageVo;
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;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.net.URLEncoder;
import java.util.*;
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.stream.Collectors;
/**
@@ -47,389 +63,380 @@ import java.util.stream.Collectors;
* @author 暮光:城中城
* @since 2019年2月17日
*/
@Slf4j
@AuthMan
@RestController
@RequestMapping("/zyplayer-doc-wiki/page")
@RequiredArgsConstructor
public class WikiPageController {
private static Logger logger = LoggerFactory.getLogger(WikiPageController.class);
@Resource
WikiPageService wikiPageService;
@Resource
WikiPageContentService wikiPageContentService;
@Resource
WikiPageContentMapper wikiPageContentMapper;
@Resource
WikiPageFileService wikiPageFileService;
@Resource
WikiPageZanService wikiPageZanService;
@Resource
WikiSpaceService wikiSpaceService;
@Resource
WikiPageMapper wikiPageMapper;
@Resource
WikiPageAuthService wikiPageAuthService;
@Resource
UserMessageService userMessageService;
@Resource
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);
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 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);
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);
}
}
}
}

View File

@@ -19,8 +19,8 @@ import com.zyplayer.doc.data.service.manage.WikiPageFileService;
import com.zyplayer.doc.data.service.manage.WikiPageService;
import com.zyplayer.doc.data.service.manage.WikiSpaceService;
import com.zyplayer.doc.wiki.service.common.WikiPageAuthService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -28,7 +28,6 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.util.Date;
import java.util.HashMap;
@@ -40,26 +39,22 @@ import java.util.Map;
* @author 暮光:城中城
* @since 2019年2月17日
*/
@Slf4j
@AuthMan
@RestController
@RequestMapping("/zyplayer-doc-wiki/page/file")
@RequiredArgsConstructor
public class WikiPageFileController {
private static Logger logger = LoggerFactory.getLogger(WikiPageFileController.class);
@Value("${zyplayer.doc.wiki.upload-path:}")
private String uploadPath;
@Resource
WikiPageFileService wikiPageFileService;
@Resource
WikiSpaceService wikiSpaceService;
@Resource
WikiPageService wikiPageService;
@Resource
WikiPageAuthService wikiPageAuthService;
@Resource
UserMessageService userMessageService;
@Value("${zyplayer.doc.wiki.upload-path:}")
private String uploadPath;
private final WikiPageFileService wikiPageFileService;
private final WikiSpaceService wikiSpaceService;
private final WikiPageService wikiPageService;
private final WikiPageAuthService wikiPageAuthService;
private final UserMessageService userMessageService;
// @PostMapping("/list")
// public ResponseJson<List<WikiPageFile>> list(WikiPageFile wikiPageFile) {
// // TODO 检查space是否开放访问
@@ -72,113 +67,114 @@ public class WikiPageFileController {
// }
// return DocResponseJson.ok(fileList);
// }
@PostMapping("/delete")
public ResponseJson<Object> delete(WikiPageFile wikiPageFile) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
Long id = wikiPageFile.getId();
if (id == null || id <= 0) {
return DocResponseJson.warn("需指定删除的附件!");
}
WikiPageFile pageFileSel = wikiPageFileService.getById(wikiPageFile.getId());
WikiPage wikiPageSel = wikiPageService.getById(pageFileSel.getPageId());
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 权限判断
String canDeleteFile = wikiPageAuthService.canDeleteFile(wikiSpaceSel, pageFileSel.getPageId(), currentUser.getUserId());
if (canDeleteFile != null) {
return DocResponseJson.warn(canDeleteFile);
}
wikiPageFile.setDelFlag(1);
wikiPageFile.setUpdateUserId(currentUser.getUserId());
wikiPageFile.setUpdateUserName(currentUser.getUsername());
wikiPageFile.setUpdateTime(new Date());
wikiPageFileService.updateById(wikiPageFile);
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, wikiPageSel.getId(), wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_FILE_DEL);
userMessage.setAffectUserId(wikiPageSel.getCreateUserId());
userMessage.setAffectUserName(wikiPageSel.getCreateUserName());
userMessageService.addWikiMessage(userMessage);
return DocResponseJson.ok();
}
@PostMapping("/wangEditor/upload")
public Map<String, Object> wangEditorUpload(WikiPageFile wikiPageFile, @RequestParam("files") MultipartFile file) {
Map<String, Object> resultMap = new HashMap<>();
DocResponseJson docResponseJson = this.uploadFile(wikiPageFile, file);
if (!docResponseJson.isOk()) {
resultMap.put("errno", 1);
resultMap.put("message", docResponseJson.getErrMsg());
} else {
resultMap.put("errno", 0);
resultMap.put("data", new JSONObject().fluentPut("url", wikiPageFile.getFileUrl()));
}
return resultMap;
}
@PostMapping("/upload")
public ResponseJson upload(WikiPageFile wikiPageFile, @RequestParam("files") MultipartFile file) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
Long pageId = wikiPageFile.getPageId();
if (pageId == null || pageId <= 0) {
return DocResponseJson.warn("未指定附件关联的文档");
}
WikiPage wikiPageSel = wikiPageService.getById(pageId);
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 权限判断
String canUploadFile = wikiPageAuthService.canUploadFile(wikiSpaceSel, wikiPageSel.getId(), currentUser.getUserId());
if (canUploadFile != null) {
return DocResponseJson.warn(canUploadFile);
}
DocResponseJson docResponseJson = this.uploadFile(wikiPageFile, file);
if (!docResponseJson.isOk()) {
return docResponseJson;
}
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, pageId, wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_UPLOAD);
userMessage.setAffectUserId(wikiPageSel.getCreateUserId());
userMessage.setAffectUserName(wikiPageSel.getCreateUserName());
userMessageService.addWikiMessage(userMessage);
return DocResponseJson.ok(wikiPageFile);
}
/**
* 单纯的文件上传方法
* @param wikiPageFile
* @param file
* @return
*/
private DocResponseJson uploadFile(WikiPageFile wikiPageFile, MultipartFile file) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
String fileName = file.getOriginalFilename();
String fileSuffix = "";
if (fileName != null && fileName.lastIndexOf(".") >= 0) {
fileSuffix = fileName.substring(fileName.lastIndexOf("."));
}
String path = uploadPath + "/" + DateTime.now().toString("yyyy/MM/dd") + "/";
File newFile = new File(path);
if (!newFile.exists() && !newFile.mkdirs()) {
return DocResponseJson.warn("创建文件夹失败");
}
String simpleUUID = IdUtil.simpleUUID();
path += simpleUUID + fileSuffix;
newFile = new File(path);
try {
file.transferTo(newFile);
} catch (Exception e) {
e.printStackTrace();
return DocResponseJson.warn("保存文件失败");
}
wikiPageFile.setFileSize(file.getSize());
wikiPageFile.setUuid(simpleUUID);
wikiPageFile.setFileUrl(path);
wikiPageFile.setFileName(fileName);
wikiPageFile.setCreateTime(new Date());
wikiPageFile.setCreateUserId(currentUser.getUserId());
wikiPageFile.setCreateUserName(currentUser.getUsername());
wikiPageFile.setDelFlag(0);
wikiPageFileService.save(wikiPageFile);
wikiPageFile.setFileUrl("zyplayer-doc-wiki/common/file?uuid=" + wikiPageFile.getUuid());
return DocResponseJson.ok();
}
@PostMapping("/delete")
public ResponseJson<Object> delete(WikiPageFile wikiPageFile) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
Long id = wikiPageFile.getId();
if (id == null || id <= 0) {
return DocResponseJson.warn("需指定删除的附件!");
}
WikiPageFile pageFileSel = wikiPageFileService.getById(wikiPageFile.getId());
WikiPage wikiPageSel = wikiPageService.getById(pageFileSel.getPageId());
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 权限判断
String canDeleteFile = wikiPageAuthService.canDeleteFile(wikiSpaceSel, pageFileSel.getPageId(), currentUser.getUserId());
if (canDeleteFile != null) {
return DocResponseJson.warn(canDeleteFile);
}
wikiPageFile.setDelFlag(1);
wikiPageFile.setUpdateUserId(currentUser.getUserId());
wikiPageFile.setUpdateUserName(currentUser.getUsername());
wikiPageFile.setUpdateTime(new Date());
wikiPageFileService.updateById(wikiPageFile);
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, wikiPageSel.getId(), wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_FILE_DEL);
userMessage.setAffectUserId(wikiPageSel.getCreateUserId());
userMessage.setAffectUserName(wikiPageSel.getCreateUserName());
userMessageService.addWikiMessage(userMessage);
return DocResponseJson.ok();
}
@PostMapping("/wangEditor/upload")
public Map<String, Object> wangEditorUpload(WikiPageFile wikiPageFile, @RequestParam("files") MultipartFile file) {
Map<String, Object> resultMap = new HashMap<>();
DocResponseJson docResponseJson = this.uploadFile(wikiPageFile, file);
if (!docResponseJson.isOk()) {
resultMap.put("errno", 1);
resultMap.put("message", docResponseJson.getErrMsg());
} else {
resultMap.put("errno", 0);
resultMap.put("data", new JSONObject().fluentPut("url", wikiPageFile.getFileUrl()));
}
return resultMap;
}
@PostMapping("/upload")
public ResponseJson upload(WikiPageFile wikiPageFile, @RequestParam("files") MultipartFile file) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
Long pageId = wikiPageFile.getPageId();
if (pageId == null || pageId <= 0) {
return DocResponseJson.warn("未指定附件关联的文档");
}
WikiPage wikiPageSel = wikiPageService.getById(pageId);
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 权限判断
String canUploadFile = wikiPageAuthService.canUploadFile(wikiSpaceSel, wikiPageSel.getId(), currentUser.getUserId());
if (canUploadFile != null) {
return DocResponseJson.warn(canUploadFile);
}
DocResponseJson docResponseJson = this.uploadFile(wikiPageFile, file);
if (!docResponseJson.isOk()) {
return docResponseJson;
}
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, pageId, wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_UPLOAD);
userMessage.setAffectUserId(wikiPageSel.getCreateUserId());
userMessage.setAffectUserName(wikiPageSel.getCreateUserName());
userMessageService.addWikiMessage(userMessage);
return DocResponseJson.ok(wikiPageFile);
}
/**
* 单纯的文件上传方法
*
* @param wikiPageFile
* @param file
* @return
*/
private DocResponseJson uploadFile(WikiPageFile wikiPageFile, MultipartFile file) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
String fileName = file.getOriginalFilename();
String fileSuffix = "";
if (fileName != null && fileName.lastIndexOf(".") >= 0) {
fileSuffix = fileName.substring(fileName.lastIndexOf("."));
}
String path = uploadPath + "/" + DateTime.now().toString("yyyy/MM/dd") + "/";
File newFile = new File(path);
if (!newFile.exists() && !newFile.mkdirs()) {
return DocResponseJson.warn("创建文件夹失败");
}
String simpleUUID = IdUtil.simpleUUID();
path += simpleUUID + fileSuffix;
newFile = new File(path);
try {
file.transferTo(newFile);
} catch (Exception e) {
e.printStackTrace();
return DocResponseJson.warn("保存文件失败");
}
wikiPageFile.setFileSize(file.getSize());
wikiPageFile.setUuid(simpleUUID);
wikiPageFile.setFileUrl(path);
wikiPageFile.setFileName(fileName);
wikiPageFile.setCreateTime(new Date());
wikiPageFile.setCreateUserId(currentUser.getUserId());
wikiPageFile.setCreateUserName(currentUser.getUsername());
wikiPageFile.setDelFlag(0);
wikiPageFileService.save(wikiPageFile);
wikiPageFile.setFileUrl("zyplayer-doc-wiki/common/file?uuid=" + wikiPageFile.getUuid());
return DocResponseJson.ok();
}
}

View File

@@ -8,17 +8,20 @@ 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.*;
import com.zyplayer.doc.data.service.manage.*;
import com.zyplayer.doc.data.repository.manage.entity.WikiPage;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageHistory;
import com.zyplayer.doc.data.repository.manage.entity.WikiSpace;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
@@ -28,62 +31,59 @@ import java.util.Objects;
* @author 暮光:城中城
* @since 2019年2月17日
*/
@Slf4j
@AuthMan
@RestController
@RequestMapping("/zyplayer-doc-wiki/page/history")
@RequiredArgsConstructor
public class WikiPageHistoryController {
private static Logger logger = LoggerFactory.getLogger(WikiPageHistoryController.class);
@Resource
WikiPageHistoryService wikiPageHistoryService;
@Resource
WikiSpaceService wikiSpaceService;
@Resource
WikiPageService wikiPageService;
@Resource
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;
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);
}
}

View File

@@ -17,13 +17,12 @@ 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.wiki.framework.consts.SpaceType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
@@ -33,67 +32,64 @@ import java.util.Objects;
* @author 暮光:城中城
* @since 2019年2月17日
*/
@Slf4j
@AuthMan
@RestController
@RequestMapping("/zyplayer-doc-wiki/page/zan")
@RequiredArgsConstructor
public class WikiPageZanController {
private static Logger logger = LoggerFactory.getLogger(WikiPageZanController.class);
@Resource
WikiPageZanService wikiPageZanService;
@Resource
WikiSpaceService wikiSpaceService;
@Resource
WikiPageService wikiPageService;
@Resource
UserMessageService userMessageService;
@PostMapping("/list")
public ResponseJson<List<WikiPageZan>> list(WikiPageZan wikiPageZan) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(wikiPageZan.getPageId());
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有获取该空间的点赞列表权限!");
}
UpdateWrapper<WikiPageZan> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", wikiPageZan.getPageId());
wrapper.eq(wikiPageZan.getCommentId() != null, "comment_id", wikiPageZan.getCommentId());
wrapper.eq("yn", 1);
List<WikiPageZan> zanList = wikiPageZanService.list(wrapper);
return DocResponseJson.ok(zanList);
}
@PostMapping("/update")
public ResponseJson<Object> update(WikiPageZan wikiPageZan) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
Long id = wikiPageZan.getId();
Long pageId;
if (id != null && id > 0) {
WikiPageZan wikiPageZanSel = wikiPageZanService.getById(id);
pageId = wikiPageZanSel.getPageId();
} else if (wikiPageZan.getPageId() != null) {
pageId = wikiPageZan.getPageId();
} else {
return DocResponseJson.warn("需指定所属页面!");
}
WikiPage wikiPageSel = wikiPageService.getById(pageId);
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有该空间的点赞权限!");
}
wikiPageZanService.zanPage(wikiPageZan);
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, wikiPageSel.getId(), wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_ZAN);
if (!Objects.equals(wikiPageZan.getYn(), 1)) {
userMessage.setMsgType(UserMsgType.WIKI_PAGE_ZAN_CANCEL.getType());
}
userMessage.setAffectUserId(wikiPageSel.getCreateUserId());
userMessage.setAffectUserName(wikiPageSel.getCreateUserName());
userMessageService.addWikiMessage(userMessage);
return DocResponseJson.ok();
}
private final WikiPageZanService wikiPageZanService;
private final WikiSpaceService wikiSpaceService;
private final WikiPageService wikiPageService;
private final UserMessageService userMessageService;
@PostMapping("/list")
public ResponseJson<List<WikiPageZan>> list(WikiPageZan wikiPageZan) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(wikiPageZan.getPageId());
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有获取该空间的点赞列表权限!");
}
UpdateWrapper<WikiPageZan> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", wikiPageZan.getPageId());
wrapper.eq(wikiPageZan.getCommentId() != null, "comment_id", wikiPageZan.getCommentId());
wrapper.eq("yn", 1);
List<WikiPageZan> zanList = wikiPageZanService.list(wrapper);
return DocResponseJson.ok(zanList);
}
@PostMapping("/update")
public ResponseJson<Object> update(WikiPageZan wikiPageZan) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
Long id = wikiPageZan.getId();
Long pageId;
if (id != null && id > 0) {
WikiPageZan wikiPageZanSel = wikiPageZanService.getById(id);
pageId = wikiPageZanSel.getPageId();
} else if (wikiPageZan.getPageId() != null) {
pageId = wikiPageZan.getPageId();
} else {
return DocResponseJson.warn("需指定所属页面!");
}
WikiPage wikiPageSel = wikiPageService.getById(pageId);
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有该空间的点赞权限!");
}
wikiPageZanService.zanPage(wikiPageZan);
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, wikiPageSel.getId(), wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_ZAN);
if (!Objects.equals(wikiPageZan.getYn(), 1)) {
userMessage.setMsgType(UserMsgType.WIKI_PAGE_ZAN_CANCEL.getType());
}
userMessage.setAffectUserId(wikiPageSel.getCreateUserId());
userMessage.setAffectUserName(wikiPageSel.getCreateUserName());
userMessageService.addWikiMessage(userMessage);
return DocResponseJson.ok();
}
}

View File

@@ -22,15 +22,19 @@ import com.zyplayer.doc.data.service.manage.WikiSpaceService;
import com.zyplayer.doc.wiki.controller.vo.UserSpaceAuthVo;
import com.zyplayer.doc.wiki.controller.vo.WikiSpaceVo;
import com.zyplayer.doc.wiki.framework.consts.WikiAuthType;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.*;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**
@@ -39,215 +43,212 @@ import java.util.stream.Collectors;
* @author 暮光:城中城
* @since 2019年2月17日
*/
@Slf4j
@AuthMan
@RestController
@RequestMapping("/zyplayer-doc-wiki/space")
@RequiredArgsConstructor
public class WikiSpaceController {
private static Logger logger = LoggerFactory.getLogger(WikiSpaceController.class);
@Resource
WikiSpaceService wikiSpaceService;
@Resource
UserGroupAuthService userGroupAuthService;
@Resource
WikiSpaceFavoriteService wikiSpaceFavoriteService;
@Resource
UserSettingService userSettingService;
@PostMapping("/list")
public ResponseJson<List<WikiSpaceVo>> list(WikiSpace wikiSpace, Integer ignoreFavorite) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
UpdateWrapper<WikiSpace> wrapper = new UpdateWrapper<>();
wrapper.eq("del_flag", 0);
wrapper.eq(wikiSpace.getId() != null, "id", wikiSpace.getId());
wrapper.and(con -> con.and(conSub -> conSub.eq("type", 3).eq("create_user_id", currentUser.getUserId())).or().in("type", 1, 2));
List<WikiSpace> spaceList = wikiSpaceService.list(wrapper);
List<WikiSpaceVo> spaceVoList = spaceList.stream().map(WikiSpaceVo::new).collect(Collectors.toList());
// 收藏
QueryWrapper<WikiSpaceFavorite> favoriteWrapper = new QueryWrapper<>();
favoriteWrapper.eq("user_id", currentUser.getUserId());
favoriteWrapper.eq("del_flag", 0);
List<WikiSpaceFavorite> favoriteList = wikiSpaceFavoriteService.list(favoriteWrapper);
Set<Long> spaceFavoriteMap = favoriteList.stream().map(WikiSpaceFavorite::getSpaceId).collect(Collectors.toSet());
for (WikiSpaceVo spaceVo : spaceVoList) {
spaceVo.setFavorite(spaceFavoriteMap.contains(spaceVo.getId()) ? 1 : 0);
}
// 设置
if (!Objects.equals(ignoreFavorite, 1)) {
QueryWrapper<UserSetting> settingWrapper = new QueryWrapper<>();
settingWrapper.eq("user_id", currentUser.getUserId());
settingWrapper.eq("name", UserSettingConst.WIKI_ONLY_SHOW_FAVORITE);
settingWrapper.eq("del_flag", 0);
UserSetting userSetting = userSettingService.getOne(settingWrapper);
if (userSetting != null && Objects.equals(userSetting.getValue(), "1")) {
List<WikiSpaceVo> onlySpaceVoList = spaceVoList.stream().filter(item -> Objects.equals(item.getFavorite(), 1)).collect(Collectors.toList());
return DocResponseJson.ok(onlySpaceVoList);
}
}
return DocResponseJson.ok(spaceVoList);
}
@PostMapping("/update")
public ResponseJson<WikiSpace> update(WikiSpace wikiSpace) {
Long id = wikiSpace.getId();
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
if (id != null && id > 0) {
WikiSpace wikiSpaceSel = wikiSpaceService.getById(id);
// 不是创建人不能修改空间
if (!Objects.equals(currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有该空间的编辑权!");
}
wikiSpace.setUuid(null);
wikiSpace.setEditType(null);
wikiSpaceService.updateById(wikiSpace);
} else {
wikiSpace.setUuid(IdUtil.simpleUUID());
wikiSpace.setCreateTime(new Date());
wikiSpace.setCreateUserId(currentUser.getUserId());
wikiSpace.setCreateUserName(currentUser.getUsername());
wikiSpaceService.save(wikiSpace);
}
return DocResponseJson.ok(wikiSpace);
}
@PostMapping("/setting/update")
public ResponseJson<WikiSpace> settingUpdate(String name, String value) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
QueryWrapper<UserSetting> wrapper = new QueryWrapper<>();
wrapper.eq("user_id", currentUser.getUserId());
wrapper.eq("name", name);
UserSetting userSettingSel = userSettingService.getOne(wrapper);
UserSetting userSettingUp = new UserSetting();
if (userSettingSel != null) {
userSettingUp.setId(userSettingSel.getId());
} else {
userSettingUp.setCreateTime(new Date());
}
userSettingUp.setName(name);
userSettingUp.setValue(value);
userSettingUp.setDelFlag(0);
userSettingUp.setUserId(currentUser.getUserId());
userSettingService.saveOrUpdate(userSettingUp);
return DocResponseJson.ok();
}
@PostMapping("/setting/list")
public ResponseJson<WikiSpace> settingList() {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
QueryWrapper<UserSetting> wrapper = new QueryWrapper<>();
wrapper.eq("user_id", currentUser.getUserId());
wrapper.eq("name", UserSettingConst.WIKI_ONLY_SHOW_FAVORITE);
wrapper.eq("del_flag", 0);
List<UserSetting> settingList = userSettingService.list(wrapper);
if (CollectionUtils.isEmpty(settingList)) {
return DocResponseJson.ok();
}
Map<String, String> userSettingMap = settingList.stream().collect(Collectors.toMap(UserSetting::getName, UserSetting::getValue));
return DocResponseJson.ok(userSettingMap);
}
@PostMapping("/favorite/update")
public ResponseJson<Object> groupAuth(Long spaceId, Integer delFlag) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
QueryWrapper<WikiSpaceFavorite> wrapper = new QueryWrapper<>();
wrapper.eq("space_id", spaceId);
wrapper.eq("user_id", currentUser.getUserId());
WikiSpaceFavorite favoriteSel = wikiSpaceFavoriteService.getOne(wrapper);
WikiSpaceFavorite favoriteUp = new WikiSpaceFavorite();
if (favoriteSel != null) {
favoriteUp.setId(favoriteSel.getId());
} else {
favoriteUp.setCreateTime(new Date());
}
favoriteUp.setDelFlag(delFlag);
favoriteUp.setUserId(currentUser.getUserId());
favoriteUp.setSpaceId(spaceId);
wikiSpaceFavoriteService.saveOrUpdate(favoriteUp);
return DocResponseJson.ok();
}
@PostMapping("/auth/assign")
public ResponseJson<Object> authAssign(Long spaceId, String authList) {
// 判断是否具有授权的权限
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiSpace wikiSpaceSel = wikiSpaceService.getById(spaceId);
// 只有空间创建人可以管理该空间对用户组的授权
if (!Objects.equals(currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限管理该空间的权限");
}
// 先删除页面的所有用户的权限
QueryWrapper<UserGroupAuth> updateWrapper = new QueryWrapper<>();
updateWrapper.eq("data_id", spaceId);
updateWrapper.eq("project_type", DocSysType.WIKI.getType());
userGroupAuthService.remove(updateWrapper);
// 在创建权限
List<UserSpaceAuthVo> authVoList = JSON.parseArray(authList, UserSpaceAuthVo.class);
for (UserSpaceAuthVo authVo : authVoList) {
List<UserGroupAuth> userAuthList = new LinkedList<>();
this.createUserAuth(userAuthList, authVo.getEditPage(), spaceId, WikiAuthType.EDIT_PAGE, authVo.getGroupId());
this.createUserAuth(userAuthList, authVo.getDeletePage(), spaceId, WikiAuthType.DELETE_PAGE, authVo.getGroupId());
this.createUserAuth(userAuthList, authVo.getPageFileUpload(), spaceId, WikiAuthType.PAGE_FILE_UPLOAD, authVo.getGroupId());
this.createUserAuth(userAuthList, authVo.getPageFileDelete(), spaceId, WikiAuthType.PAGE_FILE_DELETE, authVo.getGroupId());
this.createUserAuth(userAuthList, authVo.getPageAuthManage(), spaceId, WikiAuthType.PAGE_AUTH_MANAGE, authVo.getGroupId());
if (userAuthList.size() > 0) {
userGroupAuthService.saveBatch(userAuthList);
}
}
return DocResponseJson.ok();
}
@PostMapping("/auth/list")
public ResponseJson<Object> authList(Long spaceId) {
// 判断是否具有授权的权限
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiSpace wikiSpaceSel = wikiSpaceService.getById(spaceId);
// 只有空间创建人可以管理该空间对用户组的授权
if (!Objects.equals(currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限管理该空间的权限");
}
QueryWrapper<UserGroupAuth> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("data_id", spaceId);
queryWrapper.eq("project_type", DocSysType.WIKI.getType());
List<UserGroupAuth> authList = userGroupAuthService.list(queryWrapper);
if (CollectionUtils.isEmpty(authList)) {
return DocResponseJson.ok();
}
// 查询用户信息
Map<Long, List<UserGroupAuth>> userAuthGroup = authList.stream().collect(Collectors.groupingBy(UserGroupAuth::getGroupId));
List<UserSpaceAuthVo> authVoList = new LinkedList<>();
// 组装结果集
userAuthGroup.forEach((key, value) -> {
Set<Integer> authNameSet = value.stream().map(UserGroupAuth::getAuthType).collect(Collectors.toSet());
UserSpaceAuthVo authVo = new UserSpaceAuthVo();
authVo.setEditPage(this.haveAuth(authNameSet, WikiAuthType.EDIT_PAGE));
authVo.setDeletePage(this.haveAuth(authNameSet, WikiAuthType.DELETE_PAGE));
authVo.setPageFileUpload(this.haveAuth(authNameSet, WikiAuthType.PAGE_FILE_UPLOAD));
authVo.setPageFileDelete(this.haveAuth(authNameSet, WikiAuthType.PAGE_FILE_DELETE));
authVo.setPageAuthManage(this.haveAuth(authNameSet, WikiAuthType.PAGE_AUTH_MANAGE));
authVo.setGroupId(key);
authVoList.add(authVo);
});
return DocResponseJson.ok(authVoList);
}
private Integer haveAuth(Set<Integer> authNameSet, WikiAuthType wikiAuthType) {
return authNameSet.contains(wikiAuthType.getType()) ? 1 : 0;
}
private void createUserAuth(List<UserGroupAuth> userAuthList, Integer authValue, Long spaceId, WikiAuthType authType, Long groupId) {
if (Objects.equals(authValue, 1)) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
UserGroupAuth userAuth = new UserGroupAuth();
userAuth.setDataId(spaceId);
userAuth.setAuthType(authType.getType());
userAuth.setGroupId(groupId);
userAuth.setCreateTime(new Date());
userAuth.setCreateUserId(currentUser.getUserId());
userAuth.setCreateUserName(currentUser.getUsername());
userAuth.setProjectType(DocSysType.WIKI.getType());
userAuth.setDelFlag(0);
userAuthList.add(userAuth);
}
}
private final WikiSpaceService wikiSpaceService;
private final UserGroupAuthService userGroupAuthService;
private final WikiSpaceFavoriteService wikiSpaceFavoriteService;
private final UserSettingService userSettingService;
@PostMapping("/list")
public ResponseJson<List<WikiSpaceVo>> list(WikiSpace wikiSpace, Integer ignoreFavorite) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
UpdateWrapper<WikiSpace> wrapper = new UpdateWrapper<>();
wrapper.eq("del_flag", 0);
wrapper.eq(wikiSpace.getId() != null, "id", wikiSpace.getId());
wrapper.and(con -> con.and(conSub -> conSub.eq("type", 3).eq("create_user_id", currentUser.getUserId())).or().in("type", 1, 2));
List<WikiSpace> spaceList = wikiSpaceService.list(wrapper);
List<WikiSpaceVo> spaceVoList = spaceList.stream().map(WikiSpaceVo::new).collect(Collectors.toList());
// 收藏
QueryWrapper<WikiSpaceFavorite> favoriteWrapper = new QueryWrapper<>();
favoriteWrapper.eq("user_id", currentUser.getUserId());
favoriteWrapper.eq("del_flag", 0);
List<WikiSpaceFavorite> favoriteList = wikiSpaceFavoriteService.list(favoriteWrapper);
Set<Long> spaceFavoriteMap = favoriteList.stream().map(WikiSpaceFavorite::getSpaceId).collect(Collectors.toSet());
for (WikiSpaceVo spaceVo : spaceVoList) {
spaceVo.setFavorite(spaceFavoriteMap.contains(spaceVo.getId()) ? 1 : 0);
}
// 设置
if (!Objects.equals(ignoreFavorite, 1)) {
QueryWrapper<UserSetting> settingWrapper = new QueryWrapper<>();
settingWrapper.eq("user_id", currentUser.getUserId());
settingWrapper.eq("name", UserSettingConst.WIKI_ONLY_SHOW_FAVORITE);
settingWrapper.eq("del_flag", 0);
UserSetting userSetting = userSettingService.getOne(settingWrapper);
if (userSetting != null && Objects.equals(userSetting.getValue(), "1")) {
List<WikiSpaceVo> onlySpaceVoList = spaceVoList.stream().filter(item -> Objects.equals(item.getFavorite(), 1)).collect(Collectors.toList());
return DocResponseJson.ok(onlySpaceVoList);
}
}
return DocResponseJson.ok(spaceVoList);
}
@PostMapping("/update")
public ResponseJson<WikiSpace> update(WikiSpace wikiSpace) {
Long id = wikiSpace.getId();
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
if (id != null && id > 0) {
WikiSpace wikiSpaceSel = wikiSpaceService.getById(id);
// 不是创建人不能修改空间
if (!Objects.equals(currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有该空间的编辑权!");
}
wikiSpace.setUuid(null);
wikiSpace.setEditType(null);
wikiSpaceService.updateById(wikiSpace);
} else {
wikiSpace.setUuid(IdUtil.simpleUUID());
wikiSpace.setCreateTime(new Date());
wikiSpace.setCreateUserId(currentUser.getUserId());
wikiSpace.setCreateUserName(currentUser.getUsername());
wikiSpaceService.save(wikiSpace);
}
return DocResponseJson.ok(wikiSpace);
}
@PostMapping("/setting/update")
public ResponseJson<WikiSpace> settingUpdate(String name, String value) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
QueryWrapper<UserSetting> wrapper = new QueryWrapper<>();
wrapper.eq("user_id", currentUser.getUserId());
wrapper.eq("name", name);
UserSetting userSettingSel = userSettingService.getOne(wrapper);
UserSetting userSettingUp = new UserSetting();
if (userSettingSel != null) {
userSettingUp.setId(userSettingSel.getId());
} else {
userSettingUp.setCreateTime(new Date());
}
userSettingUp.setName(name);
userSettingUp.setValue(value);
userSettingUp.setDelFlag(0);
userSettingUp.setUserId(currentUser.getUserId());
userSettingService.saveOrUpdate(userSettingUp);
return DocResponseJson.ok();
}
@PostMapping("/setting/list")
public ResponseJson<WikiSpace> settingList() {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
QueryWrapper<UserSetting> wrapper = new QueryWrapper<>();
wrapper.eq("user_id", currentUser.getUserId());
wrapper.eq("name", UserSettingConst.WIKI_ONLY_SHOW_FAVORITE);
wrapper.eq("del_flag", 0);
List<UserSetting> settingList = userSettingService.list(wrapper);
if (CollectionUtils.isEmpty(settingList)) {
return DocResponseJson.ok();
}
Map<String, String> userSettingMap = settingList.stream().collect(Collectors.toMap(UserSetting::getName, UserSetting::getValue));
return DocResponseJson.ok(userSettingMap);
}
@PostMapping("/favorite/update")
public ResponseJson<Object> groupAuth(Long spaceId, Integer delFlag) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
QueryWrapper<WikiSpaceFavorite> wrapper = new QueryWrapper<>();
wrapper.eq("space_id", spaceId);
wrapper.eq("user_id", currentUser.getUserId());
WikiSpaceFavorite favoriteSel = wikiSpaceFavoriteService.getOne(wrapper);
WikiSpaceFavorite favoriteUp = new WikiSpaceFavorite();
if (favoriteSel != null) {
favoriteUp.setId(favoriteSel.getId());
} else {
favoriteUp.setCreateTime(new Date());
}
favoriteUp.setDelFlag(delFlag);
favoriteUp.setUserId(currentUser.getUserId());
favoriteUp.setSpaceId(spaceId);
wikiSpaceFavoriteService.saveOrUpdate(favoriteUp);
return DocResponseJson.ok();
}
@PostMapping("/auth/assign")
public ResponseJson<Object> authAssign(Long spaceId, String authList) {
// 判断是否具有授权的权限
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiSpace wikiSpaceSel = wikiSpaceService.getById(spaceId);
// 只有空间创建人可以管理该空间对用户组的授权
if (!Objects.equals(currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限管理该空间的权限");
}
// 先删除页面的所有用户的权限
QueryWrapper<UserGroupAuth> updateWrapper = new QueryWrapper<>();
updateWrapper.eq("data_id", spaceId);
updateWrapper.eq("project_type", DocSysType.WIKI.getType());
userGroupAuthService.remove(updateWrapper);
// 在创建权限
List<UserSpaceAuthVo> authVoList = JSON.parseArray(authList, UserSpaceAuthVo.class);
for (UserSpaceAuthVo authVo : authVoList) {
List<UserGroupAuth> userAuthList = new LinkedList<>();
this.createUserAuth(userAuthList, authVo.getEditPage(), spaceId, WikiAuthType.EDIT_PAGE, authVo.getGroupId());
this.createUserAuth(userAuthList, authVo.getDeletePage(), spaceId, WikiAuthType.DELETE_PAGE, authVo.getGroupId());
this.createUserAuth(userAuthList, authVo.getPageFileUpload(), spaceId, WikiAuthType.PAGE_FILE_UPLOAD, authVo.getGroupId());
this.createUserAuth(userAuthList, authVo.getPageFileDelete(), spaceId, WikiAuthType.PAGE_FILE_DELETE, authVo.getGroupId());
this.createUserAuth(userAuthList, authVo.getPageAuthManage(), spaceId, WikiAuthType.PAGE_AUTH_MANAGE, authVo.getGroupId());
if (userAuthList.size() > 0) {
userGroupAuthService.saveBatch(userAuthList);
}
}
return DocResponseJson.ok();
}
@PostMapping("/auth/list")
public ResponseJson<Object> authList(Long spaceId) {
// 判断是否具有授权的权限
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiSpace wikiSpaceSel = wikiSpaceService.getById(spaceId);
// 只有空间创建人可以管理该空间对用户组的授权
if (!Objects.equals(currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限管理该空间的权限");
}
QueryWrapper<UserGroupAuth> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("data_id", spaceId);
queryWrapper.eq("project_type", DocSysType.WIKI.getType());
List<UserGroupAuth> authList = userGroupAuthService.list(queryWrapper);
if (CollectionUtils.isEmpty(authList)) {
return DocResponseJson.ok();
}
// 查询用户信息
Map<Long, List<UserGroupAuth>> userAuthGroup = authList.stream().collect(Collectors.groupingBy(UserGroupAuth::getGroupId));
List<UserSpaceAuthVo> authVoList = new LinkedList<>();
// 组装结果集
userAuthGroup.forEach((key, value) -> {
Set<Integer> authNameSet = value.stream().map(UserGroupAuth::getAuthType).collect(Collectors.toSet());
UserSpaceAuthVo authVo = new UserSpaceAuthVo();
authVo.setEditPage(this.haveAuth(authNameSet, WikiAuthType.EDIT_PAGE));
authVo.setDeletePage(this.haveAuth(authNameSet, WikiAuthType.DELETE_PAGE));
authVo.setPageFileUpload(this.haveAuth(authNameSet, WikiAuthType.PAGE_FILE_UPLOAD));
authVo.setPageFileDelete(this.haveAuth(authNameSet, WikiAuthType.PAGE_FILE_DELETE));
authVo.setPageAuthManage(this.haveAuth(authNameSet, WikiAuthType.PAGE_AUTH_MANAGE));
authVo.setGroupId(key);
authVoList.add(authVo);
});
return DocResponseJson.ok(authVoList);
}
private Integer haveAuth(Set<Integer> authNameSet, WikiAuthType wikiAuthType) {
return authNameSet.contains(wikiAuthType.getType()) ? 1 : 0;
}
private void createUserAuth(List<UserGroupAuth> userAuthList, Integer authValue, Long spaceId, WikiAuthType authType, Long groupId) {
if (Objects.equals(authValue, 1)) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
UserGroupAuth userAuth = new UserGroupAuth();
userAuth.setDataId(spaceId);
userAuth.setAuthType(authType.getType());
userAuth.setGroupId(groupId);
userAuth.setCreateTime(new Date());
userAuth.setCreateUserId(currentUser.getUserId());
userAuth.setCreateUserName(currentUser.getUsername());
userAuth.setProjectType(DocSysType.WIKI.getType());
userAuth.setDelFlag(0);
userAuthList.add(userAuth);
}
}
}

View File

@@ -1,6 +1,6 @@
package com.zyplayer.doc.wiki.controller.vo;
import lombok.*;
import lombok.Data;
/**
* 用户页面权限信息

View File

@@ -1,6 +1,6 @@
package com.zyplayer.doc.wiki.controller.vo;
import lombok.*;
import lombok.Data;
/**
* 用户空间权限信息

View File

@@ -1,7 +1,7 @@
package com.zyplayer.doc.wiki.controller.vo;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageComment;
import lombok.*;
import lombok.Data;
import java.util.List;

View File

@@ -3,7 +3,7 @@ package com.zyplayer.doc.wiki.controller.vo;
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 lombok.*;
import lombok.Data;
import java.util.List;

View File

@@ -1,7 +1,7 @@
package com.zyplayer.doc.wiki.controller.vo;
import com.zyplayer.doc.data.repository.manage.entity.WikiPage;
import lombok.*;
import lombok.Data;
import java.util.Date;
import java.util.List;

View File

@@ -1,7 +1,7 @@
package com.zyplayer.doc.wiki.controller.vo;
import com.zyplayer.doc.data.repository.manage.entity.WikiSpace;
import lombok.*;
import lombok.Data;
import java.util.Date;

View File

@@ -3,7 +3,11 @@ package com.zyplayer.doc.wiki.framework.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import java.lang.annotation.*;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 开启wiki模块注解

View File

@@ -7,9 +7,9 @@ import com.zyplayer.doc.data.repository.support.consts.DocSysModuleType;
import com.zyplayer.doc.data.repository.support.consts.DocSysType;
import com.zyplayer.doc.wiki.framework.consts.SpaceType;
import com.zyplayer.doc.wiki.framework.consts.WikiAuthType;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Objects;
/**
@@ -19,148 +19,148 @@ import java.util.Objects;
* @since 2020-06-16
*/
@Service
@RequiredArgsConstructor
public class WikiPageAuthService {
@Resource
UserGroupAuthMapper userGroupAuthMapper;
/**
* 是否具有编辑权限
*
* @param wikiSpaceSel
* @param editType
* @param pageId
* @param currentUserId
* @return
*/
public String canEdit(WikiSpace wikiSpaceSel, Integer editType, Long pageId, Long currentUserId) {
if (wikiSpaceSel == null || Objects.equals(editType, 1)) {
return "当前页面不允许编辑!";
}
// 私人空间不允许调用接口获取文章
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
return "您没有权限修改该空间的文章!";
}
// 空间不是自己的,也没有权限
if (SpaceType.isOthersPersonal(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
boolean pageAuth = DocUserUtil.haveCustomAuth(WikiAuthType.EDIT_PAGE.getCode(), DocSysType.WIKI.getType(), DocSysModuleType.Wiki.PAGE.getType(), pageId);
if (!pageAuth) {
// 在空间上直接授权了分组的权限,在这个分组里就具有权限
Long authId = userGroupAuthMapper.haveAuth(wikiSpaceSel.getId(), DocSysType.WIKI.getType(), WikiAuthType.EDIT_PAGE.getType(), currentUserId);
if (authId == null) {
return "您没有修改该文章的权限!";
}
}
}
return null;
}
/**
* 是否具有权限编辑权限
*
* @param wikiSpaceSel
* @param pageId
* @param currentUserId
* @return
*/
public String canConfigAuth(WikiSpace wikiSpaceSel, Long pageId, Long currentUserId) {
if (!SpaceType.isPersonal(wikiSpaceSel.getType())) {
return "只有个人空间才可以编辑权限";
}
if (!Objects.equals(currentUserId, wikiSpaceSel.getCreateUserId())) {
if (!DocUserUtil.haveCustomAuth(WikiAuthType.PAGE_AUTH_MANAGE.getCode(), DocSysType.WIKI.getType(), DocSysModuleType.Wiki.PAGE.getType(), pageId)) {
// 在空间上直接授权了分组的权限,在这个分组里就具有权限
Long authId = userGroupAuthMapper.haveAuth(wikiSpaceSel.getId(), DocSysType.WIKI.getType(), WikiAuthType.PAGE_AUTH_MANAGE.getType(), currentUserId);
if (authId == null) {
return "您不是创建人或没有权限";
}
}
}
return null;
}
/**
* 是否具有附件上传权限
*
* @param wikiSpaceSel
* @param pageId
* @param currentUserId
* @return
*/
public String canUploadFile(WikiSpace wikiSpaceSel, Long pageId, Long currentUserId) {
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
return "您没有该空间的文件上传权限!";
}
// 空间不是自己的,也没有权限
if (SpaceType.isOthersPersonal(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
boolean pageAuth = DocUserUtil.haveCustomAuth(WikiAuthType.PAGE_FILE_UPLOAD.getCode(), DocSysType.WIKI.getType(), DocSysModuleType.Wiki.PAGE.getType(), pageId);
if (!pageAuth) {
// 在空间上直接授权了分组的权限,在这个分组里就具有权限
Long authId = userGroupAuthMapper.haveAuth(wikiSpaceSel.getId(), DocSysType.WIKI.getType(), WikiAuthType.PAGE_FILE_UPLOAD.getType(), currentUserId);
if (authId == null) {
return "您没有上传该文章附件的权限!";
}
}
}
return null;
}
/**
* 是否具有附件删除权限
*
* @param wikiSpaceSel
* @param pageId
* @param currentUserId
* @return
*/
public String canDeleteFile(WikiSpace wikiSpaceSel, Long pageId, Long currentUserId) {
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
return "您没有该空间的文件上传权限!";
}
// 空间不是自己的,也没有权限
if (SpaceType.isOthersPersonal(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
boolean pageAuth = DocUserUtil.haveCustomAuth(WikiAuthType.PAGE_FILE_DELETE.getCode(), DocSysType.WIKI.getType(), DocSysModuleType.Wiki.PAGE.getType(), pageId);
if (!pageAuth) {
// 在空间上直接授权了分组的权限,在这个分组里就具有权限
Long authId = userGroupAuthMapper.haveAuth(wikiSpaceSel.getId(), DocSysType.WIKI.getType(), WikiAuthType.PAGE_FILE_DELETE.getType(), currentUserId);
if (authId == null) {
return "您没有删除该文章附件的权限!";
}
}
}
return null;
}
/**
* 是否具有删除权限
*
* @param wikiSpaceSel
* @param editType
* @param pageId
* @param currentUserId
* @return
*/
public String canDelete(WikiSpace wikiSpaceSel, Integer editType, Long pageId, Long currentUserId) {
if (wikiSpaceSel == null || Objects.equals(editType, 1)) {
return "当前页面不允许编辑!";
}
// 私人空间不允许调用接口获取文章
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
return "您没有权限修改该空间的文章!";
}
// 空间不是自己的,也没有权限
if (SpaceType.isOthersPersonal(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
boolean pageAuth = DocUserUtil.haveCustomAuth(WikiAuthType.DELETE_PAGE.getCode(), DocSysType.WIKI.getType(), DocSysModuleType.Wiki.PAGE.getType(), pageId);
if (!pageAuth) {
// 在空间上直接授权了分组的权限,在这个分组里就具有权限
Long authId = userGroupAuthMapper.haveAuth(wikiSpaceSel.getId(), DocSysType.WIKI.getType(), WikiAuthType.DELETE_PAGE.getType(), currentUserId);
if (authId == null) {
return "您没有删除该文章的权限!";
}
}
}
return null;
}
private final UserGroupAuthMapper userGroupAuthMapper;
/**
* 是否具有编辑权限
*
* @param wikiSpaceSel
* @param editType
* @param pageId
* @param currentUserId
* @return
*/
public String canEdit(WikiSpace wikiSpaceSel, Integer editType, Long pageId, Long currentUserId) {
if (wikiSpaceSel == null || Objects.equals(editType, 1)) {
return "当前页面不允许编辑!";
}
// 私人空间不允许调用接口获取文章
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
return "您没有权限修改该空间的文章!";
}
// 空间不是自己的,也没有权限
if (SpaceType.isOthersPersonal(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
boolean pageAuth = DocUserUtil.haveCustomAuth(WikiAuthType.EDIT_PAGE.getCode(), DocSysType.WIKI.getType(), DocSysModuleType.Wiki.PAGE.getType(), pageId);
if (!pageAuth) {
// 在空间上直接授权了分组的权限,在这个分组里就具有权限
Long authId = userGroupAuthMapper.haveAuth(wikiSpaceSel.getId(), DocSysType.WIKI.getType(), WikiAuthType.EDIT_PAGE.getType(), currentUserId);
if (authId == null) {
return "您没有修改该文章的权限!";
}
}
}
return null;
}
/**
* 是否具有权限编辑权限
*
* @param wikiSpaceSel
* @param pageId
* @param currentUserId
* @return
*/
public String canConfigAuth(WikiSpace wikiSpaceSel, Long pageId, Long currentUserId) {
if (!SpaceType.isPersonal(wikiSpaceSel.getType())) {
return "只有个人空间才可以编辑权限";
}
if (!Objects.equals(currentUserId, wikiSpaceSel.getCreateUserId())) {
if (!DocUserUtil.haveCustomAuth(WikiAuthType.PAGE_AUTH_MANAGE.getCode(), DocSysType.WIKI.getType(), DocSysModuleType.Wiki.PAGE.getType(), pageId)) {
// 在空间上直接授权了分组的权限,在这个分组里就具有权限
Long authId = userGroupAuthMapper.haveAuth(wikiSpaceSel.getId(), DocSysType.WIKI.getType(), WikiAuthType.PAGE_AUTH_MANAGE.getType(), currentUserId);
if (authId == null) {
return "您不是创建人或没有权限";
}
}
}
return null;
}
/**
* 是否具有附件上传权限
*
* @param wikiSpaceSel
* @param pageId
* @param currentUserId
* @return
*/
public String canUploadFile(WikiSpace wikiSpaceSel, Long pageId, Long currentUserId) {
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
return "您没有该空间的文件上传权限!";
}
// 空间不是自己的,也没有权限
if (SpaceType.isOthersPersonal(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
boolean pageAuth = DocUserUtil.haveCustomAuth(WikiAuthType.PAGE_FILE_UPLOAD.getCode(), DocSysType.WIKI.getType(), DocSysModuleType.Wiki.PAGE.getType(), pageId);
if (!pageAuth) {
// 在空间上直接授权了分组的权限,在这个分组里就具有权限
Long authId = userGroupAuthMapper.haveAuth(wikiSpaceSel.getId(), DocSysType.WIKI.getType(), WikiAuthType.PAGE_FILE_UPLOAD.getType(), currentUserId);
if (authId == null) {
return "您没有上传该文章附件的权限!";
}
}
}
return null;
}
/**
* 是否具有附件删除权限
*
* @param wikiSpaceSel
* @param pageId
* @param currentUserId
* @return
*/
public String canDeleteFile(WikiSpace wikiSpaceSel, Long pageId, Long currentUserId) {
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
return "您没有该空间的文件上传权限!";
}
// 空间不是自己的,也没有权限
if (SpaceType.isOthersPersonal(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
boolean pageAuth = DocUserUtil.haveCustomAuth(WikiAuthType.PAGE_FILE_DELETE.getCode(), DocSysType.WIKI.getType(), DocSysModuleType.Wiki.PAGE.getType(), pageId);
if (!pageAuth) {
// 在空间上直接授权了分组的权限,在这个分组里就具有权限
Long authId = userGroupAuthMapper.haveAuth(wikiSpaceSel.getId(), DocSysType.WIKI.getType(), WikiAuthType.PAGE_FILE_DELETE.getType(), currentUserId);
if (authId == null) {
return "您没有删除该文章附件的权限!";
}
}
}
return null;
}
/**
* 是否具有删除权限
*
* @param wikiSpaceSel
* @param editType
* @param pageId
* @param currentUserId
* @return
*/
public String canDelete(WikiSpace wikiSpaceSel, Integer editType, Long pageId, Long currentUserId) {
if (wikiSpaceSel == null || Objects.equals(editType, 1)) {
return "当前页面不允许编辑!";
}
// 私人空间不允许调用接口获取文章
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
return "您没有权限修改该空间的文章!";
}
// 空间不是自己的,也没有权限
if (SpaceType.isOthersPersonal(wikiSpaceSel.getType(), currentUserId, wikiSpaceSel.getCreateUserId())) {
boolean pageAuth = DocUserUtil.haveCustomAuth(WikiAuthType.DELETE_PAGE.getCode(), DocSysType.WIKI.getType(), DocSysModuleType.Wiki.PAGE.getType(), pageId);
if (!pageAuth) {
// 在空间上直接授权了分组的权限,在这个分组里就具有权限
Long authId = userGroupAuthMapper.haveAuth(wikiSpaceSel.getId(), DocSysType.WIKI.getType(), WikiAuthType.DELETE_PAGE.getType(), currentUserId);
if (authId == null) {
return "您没有删除该文章的权限!";
}
}
}
return null;
}
}

View File

@@ -6,6 +6,8 @@ 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;
@@ -18,12 +20,9 @@ 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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.File;
import java.util.Date;
import java.util.Set;
@@ -34,151 +33,151 @@ import java.util.Set;
* @author 暮光:城中城
* @since 2020年9月5日
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class GitService {
private static Logger logger = LoggerFactory.getLogger(GitService.class);
@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;
@Resource
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()) {
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();
// 存在远程地址则推送
if (StringUtils.isNotBlank(gitRemoteUrl)) {
git.push().setCredentialsProvider(new UsernamePasswordCredentialsProvider(gitRemoteUsername, gitRemotePassword)).call();
}
logger.info("commit id: {}", commit.getName());
return commit.getName();
} catch (Exception e) {
logger.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());
} catch (Exception e) {
logger.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);
}
@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());
} 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);
}
}