diff --git a/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/repository/manage/entity/WikiPage.java b/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/repository/manage/entity/WikiPage.java index 3ac6d10e..baf18586 100644 --- a/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/repository/manage/entity/WikiPage.java +++ b/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/repository/manage/entity/WikiPage.java @@ -87,7 +87,7 @@ public class WikiPage implements Serializable { private Date updateTime; /** - * 0=有效 1=删除 + * 0=有效 1=删除 2=永久删除 */ private Integer delFlag; diff --git a/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/manage/impl/WikiPageServiceImpl.java b/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/manage/impl/WikiPageServiceImpl.java index 6b4f4a40..3db0516b 100644 --- a/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/manage/impl/WikiPageServiceImpl.java +++ b/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/manage/impl/WikiPageServiceImpl.java @@ -77,7 +77,7 @@ public class WikiPageServiceImpl extends ServiceImpl i } private void deletePageAndSon(WikiPage wikiPage) { - wikiPage.setDelFlag(1); + wikiPage.setDelFlag(wikiPage.getDelFlag()); this.updateById(wikiPage); QueryWrapper wrapper = new QueryWrapper<>(); diff --git a/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/params/PageDeleteParam.java b/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/params/PageDeleteParam.java new file mode 100644 index 00000000..5e04b56a --- /dev/null +++ b/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/params/PageDeleteParam.java @@ -0,0 +1,10 @@ +package org.dromara.zyplayer.data.service.params; + +import lombok.Data; + +@Data +public class PageDeleteParam { + private Long pageId; + private Integer delFlag; + private Long spaceId; +} diff --git a/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/params/PageRecycleListParam.java b/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/params/PageRecycleListParam.java new file mode 100644 index 00000000..ab2bede5 --- /dev/null +++ b/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/params/PageRecycleListParam.java @@ -0,0 +1,18 @@ +package org.dromara.zyplayer.data.service.params; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 回收站列表参数 + * + * @author 暮光:城中城 + * @since 2023-05-01 + */ +@Data +public class PageRecycleListParam implements Serializable { + private Long spaceId; + private Long pageNum; + +} diff --git a/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/params/RecycleDeletePageParam.java b/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/params/RecycleDeletePageParam.java new file mode 100644 index 00000000..882b45ce --- /dev/null +++ b/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/params/RecycleDeletePageParam.java @@ -0,0 +1,9 @@ +package org.dromara.zyplayer.data.service.params; + +import lombok.Data; + +@Data +public class RecycleDeletePageParam { + private String pageIds; + private Long spaceId; +} diff --git a/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/params/RestorePageParam.java b/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/params/RestorePageParam.java new file mode 100644 index 00000000..389733a7 --- /dev/null +++ b/zyplayer-doc-data/src/main/java/org/dromara/zyplayer/data/service/params/RestorePageParam.java @@ -0,0 +1,8 @@ +package org.dromara.zyplayer.data.service.params; + +import lombok.Data; + +@Data +public class RestorePageParam { + private String pageIds; +} diff --git a/zyplayer-doc-ui/wiki-ui/src/assets/api/page.js b/zyplayer-doc-ui/wiki-ui/src/assets/api/page.js index c2a8e9ae..37bba217 100644 --- a/zyplayer-doc-ui/wiki-ui/src/assets/api/page.js +++ b/zyplayer-doc-ui/wiki-ui/src/assets/api/page.js @@ -6,6 +6,9 @@ export default { pageChangeParent: (data) => request({url: '/zyplayer-doc-wiki/page/changeParent', method: 'post', data: Qs.stringify(data)}), pageList: (data) => request({url: '/zyplayer-doc-wiki/page/list', method: 'post', data: Qs.stringify(data)}), updatePage: (data) => request({url: '/zyplayer-doc-wiki/page/update', method: 'post', data: Qs.stringify(data)}), + recyclePageListList: data => request({url: '/zyplayer-doc-wiki/page/recycleList', method: 'post', data: Qs.stringify(data)}), + pageRestore: data => request({url: '/zyplayer-doc-wiki/page/restore', method: 'post', data: Qs.stringify(data)}), + recycleDeletePage: data => request({url: '/zyplayer-doc-wiki/page/recycleDelete', method: 'post', data: Qs.stringify(data)}), copyPage: (data) => request({url: '/zyplayer-doc-wiki/page/copy', method: 'post', data: Qs.stringify(data)}), movePage: (data) => request({url: '/zyplayer-doc-wiki/page/move', method: 'post', data: Qs.stringify(data)}), renamePage: (data) => request({url: '/zyplayer-doc-wiki/page/rename', method: 'post', data: Qs.stringify(data)}), diff --git a/zyplayer-doc-ui/wiki-ui/src/routes.js b/zyplayer-doc-ui/wiki-ui/src/routes.js index 08d0ab9e..0d991d17 100644 --- a/zyplayer-doc-ui/wiki-ui/src/routes.js +++ b/zyplayer-doc-ui/wiki-ui/src/routes.js @@ -12,6 +12,8 @@ import NoAuth from './views/common/NoAuth.vue'; // import Home from './views/home/Home.vue'; // import MyInfo from './views/user/MyInfo.vue'; import Show from './views/view/View.vue'; +import Setting from './views/view/Setting.vue'; +import Recycle from './views/view/Recycle.vue'; import Edit from './views/view/Edit.vue'; // import spaceManage from './views/space/Manage.vue'; @@ -43,10 +45,12 @@ export default createRouter({ component: PageLayout, children: [ // {path: '/home', name: 'WIKI文档管理', component: NoAuth}, - {path: '/user/myInfo', name: 'WIKI-我的信息', component: NoAuth}, - {path: '/view/:spaceId?/:pageId?', name: 'WIKI-页面查看', component: Show}, - {path: '/edit/:spaceId/:pageId', name: 'WIKI-编辑内容', component: Edit}, - {path: '/space/manage', name: 'WIKI-空间管理', component: NoAuth}, + {path: '/user/myInfo', name: '我的信息', component: NoAuth}, + {path: '/view/:spaceId?/:pageId?', name: '页面查看', component: Show}, + {path: '/edit/:spaceId/:pageId', name: '页面编辑', component: Edit}, + {path: '/view/setting/:spaceId', name: '空间设置', component: Setting}, + {path: '/view/recycle/:spaceId', name: '回收站', component: Recycle}, + {path: '/space/manage', name: '空间管理', component: NoAuth}, ], }, { diff --git a/zyplayer-doc-ui/wiki-ui/src/views/view/Recycle.vue b/zyplayer-doc-ui/wiki-ui/src/views/view/Recycle.vue new file mode 100644 index 00000000..010fe5d7 --- /dev/null +++ b/zyplayer-doc-ui/wiki-ui/src/views/view/Recycle.vue @@ -0,0 +1,144 @@ + + + + + + diff --git a/zyplayer-doc-ui/wiki-ui/src/views/view/Setting.vue b/zyplayer-doc-ui/wiki-ui/src/views/view/Setting.vue new file mode 100644 index 00000000..1f58a2be --- /dev/null +++ b/zyplayer-doc-ui/wiki-ui/src/views/view/Setting.vue @@ -0,0 +1,44 @@ + + + + + + diff --git a/zyplayer-doc-ui/wiki-ui/src/views/view/aside/AddMenu.vue b/zyplayer-doc-ui/wiki-ui/src/views/view/aside/AddMenu.vue index de3f4607..7f4cb27f 100644 --- a/zyplayer-doc-ui/wiki-ui/src/views/view/aside/AddMenu.vue +++ b/zyplayer-doc-ui/wiki-ui/src/views/view/aside/AddMenu.vue @@ -1,5 +1,5 @@ +
+
空间设置
+
+
+
回收站
+
@@ -51,9 +57,8 @@ diff --git a/zyplayer-doc-ui/wiki-ui/src/views/view/setting/BaseInfo.vue b/zyplayer-doc-ui/wiki-ui/src/views/view/setting/BaseInfo.vue new file mode 100644 index 00000000..5f9bd2fa --- /dev/null +++ b/zyplayer-doc-ui/wiki-ui/src/views/view/setting/BaseInfo.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/zyplayer-doc-ui/wiki-ui/src/views/view/setting/MoreAction.vue b/zyplayer-doc-ui/wiki-ui/src/views/view/setting/MoreAction.vue new file mode 100644 index 00000000..f756f4ed --- /dev/null +++ b/zyplayer-doc-ui/wiki-ui/src/views/view/setting/MoreAction.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/zyplayer-doc-wiki/src/main/java/org/dromara/zyplayer/wiki/controller/WikiPageController.java b/zyplayer-doc-wiki/src/main/java/org/dromara/zyplayer/wiki/controller/WikiPageController.java index a780d294..0534d2bb 100644 --- a/zyplayer-doc-wiki/src/main/java/org/dromara/zyplayer/wiki/controller/WikiPageController.java +++ b/zyplayer-doc-wiki/src/main/java/org/dromara/zyplayer/wiki/controller/WikiPageController.java @@ -20,6 +20,10 @@ import org.dromara.zyplayer.data.repository.manage.vo.WikiPageTemplateInfoVo; import org.dromara.zyplayer.data.repository.support.consts.DocSysType; import org.dromara.zyplayer.data.repository.support.consts.UserMsgType; import org.dromara.zyplayer.data.service.manage.*; +import org.dromara.zyplayer.data.service.params.PageDeleteParam; +import org.dromara.zyplayer.data.service.params.PageRecycleListParam; +import org.dromara.zyplayer.data.service.params.RecycleDeletePageParam; +import org.dromara.zyplayer.data.service.params.RestorePageParam; import org.dromara.zyplayer.data.utils.CachePrefix; import org.dromara.zyplayer.data.utils.CacheUtil; import org.dromara.zyplayer.wiki.controller.vo.WikiPageContentVo; @@ -78,7 +82,6 @@ public class WikiPageController { if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) { return DocResponseJson.warn("您没有权限查看该空间的文章列表!"); } - List wikiPageList = wikiPageService.wikiPageTemplateInfos(wikiPage.getSpaceId()); Map> listMap = wikiPageList.stream().map(WikiPageVo::new).collect(Collectors.groupingBy(WikiPageVo::getParentId)); List nodePageList = listMap.get(0L); @@ -88,7 +91,22 @@ public class WikiPageController { } return DocResponseJson.ok(nodePageList); } - + + @PostMapping("/recycleList") + public ResponseJson> recycleList(PageRecycleListParam param) { + return wikiPageWebService.recycleList(param); + } + + @PostMapping("/restore") + public ResponseJson restore(RestorePageParam param) { + return wikiPageWebService.restore(param.getPageIds()); + } + + @PostMapping("/recycleDelete") + public ResponseJson recycleDelete(RecycleDeletePageParam param) { + return wikiPageWebService.recycleDelete(param); + } + @PostMapping("/detail") public ResponseJson detail(WikiPage wikiPage) { DocUserDetails currentUser = DocUserUtil.getCurrentUser(); @@ -172,28 +190,8 @@ public class WikiPageController { } @PostMapping("/delete") - public ResponseJson 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); - QueryWrapper queryWrapper = new QueryWrapper(); - queryWrapper.eq("space_id", wikiPageSel.getSpaceId()); - queryWrapper.eq("page_id", wikiPageSel.getId()); - wikiPageTemplateService.remove(queryWrapper); + public ResponseJson delete(PageDeleteParam param) { + wikiPageWebService.delete(param); return DocResponseJson.ok(); } diff --git a/zyplayer-doc-wiki/src/main/java/org/dromara/zyplayer/wiki/service/WikiPageWebService.java b/zyplayer-doc-wiki/src/main/java/org/dromara/zyplayer/wiki/service/WikiPageWebService.java index f9deaed4..a65ea3a6 100644 --- a/zyplayer-doc-wiki/src/main/java/org/dromara/zyplayer/wiki/service/WikiPageWebService.java +++ b/zyplayer-doc-wiki/src/main/java/org/dromara/zyplayer/wiki/service/WikiPageWebService.java @@ -7,15 +7,27 @@ import cn.hutool.core.util.URLUtil; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import cn.hutool.system.SystemUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.commons.collections4.CollectionUtils; import org.dromara.zyplayer.core.json.DocResponseJson; import org.dromara.zyplayer.core.json.ResponseJson; import org.dromara.zyplayer.data.config.security.DocUserDetails; import org.dromara.zyplayer.data.config.security.DocUserUtil; import org.dromara.zyplayer.data.repository.manage.entity.WikiPage; +import org.dromara.zyplayer.data.repository.manage.entity.WikiPageTemplate; import org.dromara.zyplayer.data.repository.manage.entity.WikiSpace; +import org.dromara.zyplayer.data.repository.manage.mapper.WikiPageMapper; import org.dromara.zyplayer.data.service.manage.WikiPageService; +import org.dromara.zyplayer.data.service.manage.WikiPageTemplateService; import org.dromara.zyplayer.data.service.manage.WikiSpaceService; +import org.dromara.zyplayer.data.service.params.PageDeleteParam; +import org.dromara.zyplayer.data.service.params.PageRecycleListParam; +import org.dromara.zyplayer.data.service.params.RecycleDeletePageParam; import org.dromara.zyplayer.data.utils.HtmlUtils; +import org.dromara.zyplayer.wiki.controller.vo.WikiPageVo; import org.dromara.zyplayer.wiki.framework.consts.SpaceType; import org.apache.commons.lang3.StringUtils; import org.docx4j.XmlUtils; @@ -38,7 +50,11 @@ import javax.servlet.http.HttpServletResponse; import java.io.File; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.List; import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; @Service public class WikiPageWebService { @@ -48,6 +64,10 @@ public class WikiPageWebService { WikiPageService wikiPageService; @Resource WikiSpaceService wikiSpaceService; + @Resource + WikiPageMapper wikiPageMapper; + @Resource + WikiPageTemplateService wikiPageTemplateService; public ResponseJson download(Long pageId, String content, HttpServletRequest request, HttpServletResponse response) { DocUserDetails currentUser = DocUserUtil.getCurrentUser(); @@ -118,4 +138,104 @@ public class WikiPageWebService { } return DocResponseJson.warn("导出失败"); } + + /** + * 获取空间已删除的页面 + * + * @author 暮光:城中城 + * @since 2023-04-29 + */ + public ResponseJson> recycleList(PageRecycleListParam param) { + // 删除的页面 + WikiSpace wikiSpaceSel = wikiSpaceService.getById(param.getSpaceId()); + // 不是空间的协作者返回空列表 TODO 判断权限 + if (wikiSpaceSel == null) { + return DocResponseJson.ok(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(WikiPage::getDelFlag, 1); + wrapper.eq(WikiPage::getSpaceId, param.getSpaceId()); + wrapper.orderByDesc(WikiPage::getUpdateTime).orderByDesc(WikiPage::getId); + IPage page = new Page<>(param.getPageNum(), 20, true); + wikiPageService.page(page, wrapper); + DocResponseJson> responseJson = DocResponseJson.ok(); + responseJson.setTotal(page.getTotal()); + if (CollectionUtils.isNotEmpty(page.getRecords())) { + responseJson.setData(page.getRecords().stream().map(WikiPageVo::new).collect(Collectors.toList())); + } + return responseJson; + } + + public ResponseJson restore(String pageIds) { + String[] pageIdArr = StringUtils.split(pageIds, ","); + for (String pageId : pageIdArr) { + DocResponseJson restoreRes = this.restore(Long.valueOf(pageId)); + if (!restoreRes.isOk()) { + return restoreRes; + } + } + return DocResponseJson.ok(); + } + + public DocResponseJson restore(Long pageId) { + DocUserDetails currentUser = DocUserUtil.getCurrentUser(); + WikiPage wikiPageSel = wikiPageService.getById(pageId); + WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId()); + // 是否具有编辑权限 TODO +// if (!userDataAuthService.canEditPage(wikiSpaceSel.getId(), pageId, wikiSpaceSel.getCreateUserId())) { +// return DocResponseJson.warn(ErrorEnum.NO_PERMISSION_TO_RESTORE_ARTICLE); +// } + // 执行恢复操作 + WikiPage wikiPage = new WikiPage(); + wikiPage.setId(pageId); + wikiPage.setDelFlag(0); + wikiPage.setName(wikiPageSel.getName()); + wikiPage.setUpdateTime(new Date()); + wikiPage.setUpdateUserId(currentUser.getUserId()); + wikiPage.setUpdateUserName(currentUser.getUsername()); + wikiPageService.updateById(wikiPage); + // 重置当前分支的所有节点seq值 + wikiPageMapper.updateChildrenSeq(wikiPageSel.getSpaceId(), wikiPageSel.getParentId()); + return DocResponseJson.ok(); + } + + public DocResponseJson delete(PageDeleteParam param) { + DocUserDetails currentUser = DocUserUtil.getCurrentUser(); + WikiPage wikiPageSel = wikiPageService.getById(param.getPageId()); + // 删除权限判断 TODO + 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(param.getPageId()); + wikiPage.setDelFlag(Optional.ofNullable(param.getDelFlag()).orElse(1)); + wikiPage.setName(wikiPageSel.getName()); + wikiPage.setUpdateTime(new Date()); + wikiPage.setUpdateUserId(currentUser.getUserId()); + wikiPage.setUpdateUserName(currentUser.getUsername()); + wikiPageService.deletePage(wikiPage); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("space_id", wikiPageSel.getSpaceId()); + queryWrapper.eq("page_id", wikiPageSel.getId()); + wikiPageTemplateService.remove(queryWrapper); + return DocResponseJson.ok(); + } + + public ResponseJson recycleDelete(RecycleDeletePageParam param) { + String[] pageIdArr = StringUtils.split(param.getPageIds(), ","); + for (String pageId : pageIdArr) { + PageDeleteParam deleteParam = new PageDeleteParam(); + deleteParam.setPageId(Long.valueOf(pageId)); + deleteParam.setSpaceId(param.getSpaceId()); + deleteParam.setDelFlag(2); + DocResponseJson restoreRes = this.delete(deleteParam); + if (!restoreRes.isOk()) { + return restoreRes; + } + } + return DocResponseJson.ok(); + } }