合并闭源版功能,创建文档时上传文件也能绑定到page上

This commit is contained in:
Sh1yu
2023-06-27 16:43:33 +08:00
parent d03a1fa746
commit 49d697347a
10 changed files with 100 additions and 19 deletions

View File

@@ -6,6 +6,7 @@ export default {
pageChangeParent: (data) => request({url: '/zyplayer-doc-wiki/page/changeParent', method: 'post', data: Qs.stringify(data)}), 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)}), 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)}), updatePage: (data) => request({url: '/zyplayer-doc-wiki/page/update', method: 'post', data: Qs.stringify(data)}),
createEmptyPage: (data) => request({url: '/zyplayer-doc-wiki/page/empty', method: 'post', data: Qs.stringify(data)}),
pageDetail: (data) => request({url: '/zyplayer-doc-wiki/page/detail', method: 'post', data: Qs.stringify(data)}), pageDetail: (data) => request({url: '/zyplayer-doc-wiki/page/detail', method: 'post', data: Qs.stringify(data)}),
pageDelete: (data) => request({url: '/zyplayer-doc-wiki/page/delete', method: 'post', data: Qs.stringify(data)}), pageDelete: (data) => request({url: '/zyplayer-doc-wiki/page/delete', method: 'post', data: Qs.stringify(data)}),
pageHistoryList: (data) => request({url: '/zyplayer-doc-wiki/page/history/list', method: 'post', data: Qs.stringify(data)}), pageHistoryList: (data) => request({url: '/zyplayer-doc-wiki/page/history/list', method: 'post', data: Qs.stringify(data)}),

View File

@@ -208,10 +208,14 @@ const turnLeftCollapse = () => {
} }
const createWiki = () => { const createWiki = () => {
if (choiceSpace.value > 0) { if (choiceSpace.value > 0) {
router.push({ pageApi.createEmptyPage({spaceId: choiceSpace.value,parentId: nowPageId.value})
path: '/page/edit', .then((json) => {
query: {parentId: nowPageId.value} router.push({
}) path: '/page/edit',
query: {parentId: nowPageId.value, pageIdHid: json.data}
})
})
} else { } else {
ElMessage.warning('请先选择或创建空间') ElMessage.warning('请先选择或创建空间')
} }

View File

@@ -79,6 +79,8 @@ let isUnlock = ref(false);
let pageId = ref(''); let pageId = ref('');
// 父级,有值代表在此父级新建文档 // 父级,有值代表在此父级新建文档
let parentId = ref(''); let parentId = ref('');
// 从新建文档传递过来的
let pageIdHid = ref('');
let markdownContent = ref(''); let markdownContent = ref('');
let fileUploadUrl = ref(import.meta.env.VITE_APP_BASE_API + '/zyplayer-doc-wiki/page/file/wangEditor/upload'); let fileUploadUrl = ref(import.meta.env.VITE_APP_BASE_API + '/zyplayer-doc-wiki/page/file/wangEditor/upload');
let toolbars = { let toolbars = {
@@ -179,6 +181,9 @@ const createWikiSave = (saveAfter) => {
} }
// 修改内容时强制不能修改父路径,只能在目录上拖动修改 // 修改内容时强制不能修改父路径,只能在目录上拖动修改
let parentIdVal = pageId.value > 0 ? '' : parentId.value let parentIdVal = pageId.value > 0 ? '' : parentId.value
if (!!pageIdHid.value){
wikiPage.value.id = pageIdHid.value
}
let param = { let param = {
spaceId: props.spaceId, spaceId: props.spaceId,
parentId: parentIdVal, parentId: parentIdVal,
@@ -188,6 +193,7 @@ const createWikiSave = (saveAfter) => {
content: content, content: content,
preview: preview, preview: preview,
} }
pageApi.updatePage(param).then((json) => { pageApi.updatePage(param).then((json) => {
ElMessage.success('保存成功!') ElMessage.success('保存成功!')
// 重新加载左侧列表,跳转到展示页面 // 重新加载左侧列表,跳转到展示页面
@@ -238,9 +244,16 @@ const cleanPage = () => {
} }
} }
const initQueryParam = (to) => { const initQueryParam = (to) => {
pageIdHid.value = to.query.pageIdHid
// pageId和parentId二选一传了pageId代表编辑页面否则代表新建页面 // pageId和parentId二选一传了pageId代表编辑页面否则代表新建页面
pageId.value = to.query.pageId pageId.value = to.query.pageId
parentId.value = to.query.parentId parentId.value = to.query.parentId
if (!!pageIdHid.value){
wangEditorRef.value.setPageId(pageIdHid.value)
}
if (!!pageId.value){
wangEditorRef.value.setPageId(pageId.value)
}
if (!!pageId.value) { if (!!pageId.value) {
loadPageDetail(pageId.value) loadPageDetail(pageId.value)
pageApi.pageLock({pageId: pageId.value}).catch((json) => { pageApi.pageLock({pageId: pageId.value}).catch((json) => {
@@ -260,6 +273,13 @@ let mavonEditorRef = ref();
const addMarkdownImage = (pos, file) => { const addMarkdownImage = (pos, file) => {
let formData = new FormData() let formData = new FormData()
formData.append('files', file) formData.append('files', file)
if (!!pageIdHid.value){
formData.append('pageId', pageIdHid.value)
}
if (!!pageId.value){
formData.append('pageId', pageId.value)
}
axios({ axios({
url: fileUploadUrl.value, url: fileUploadUrl.value,
method: 'post', method: 'post',

View File

@@ -35,7 +35,7 @@ let toolbarConfig = {
"fullScreen", "undo", "redo", "emotion", "|", "lineHeight", "fontFamily" "fullScreen", "undo", "redo", "emotion", "|", "lineHeight", "fontFamily"
], ],
}; };
let editorPageId = ref('');
let route = useRoute(); let route = useRoute();
let editorConfig = ref({ let editorConfig = ref({
placeholder: '请输入文档内容', placeholder: '请输入文档内容',
@@ -47,6 +47,9 @@ let editorConfig = ref({
// 最大支持50M图片上传 // 最大支持50M图片上传
maxFileSize: 50 * 1024 * 1024, maxFileSize: 50 * 1024 * 1024,
withCredentials: true, withCredentials: true,
meta: {
pageId: editorPageId,
},
}, },
uploadVideo: { uploadVideo: {
server: import.meta.env.VITE_APP_BASE_API + '/zyplayer-doc-wiki/page/file/wangEditor/upload', server: import.meta.env.VITE_APP_BASE_API + '/zyplayer-doc-wiki/page/file/wangEditor/upload',
@@ -54,6 +57,9 @@ let editorConfig = ref({
// 最大支持300M图片上传 // 最大支持300M图片上传
maxFileSize: 300 * 1024 * 1024, maxFileSize: 300 * 1024 * 1024,
withCredentials: true, withCredentials: true,
meta: {
pageId: editorPageId,
},
} }
} }
}); });
@@ -83,6 +89,9 @@ const getPageData = () => {
const setTitle = (title) => { const setTitle = (title) => {
pageTitle.value = title; pageTitle.value = title;
} }
const setPageId = (id) => {
editorPageId.value = id;
}
const setHtml = (content) => { const setHtml = (content) => {
editorRef.value.select([]); editorRef.value.select([]);
@@ -96,7 +105,7 @@ onBeforeUnmount(() => {
editor.destroy(); editor.destroy();
}); });
defineExpose({setTitle, setHtml, getPageData}); defineExpose({setTitle,setPageId, setHtml, getPageData});
</script> </script>
<style lang="scss"> <style lang="scss">

View File

@@ -190,7 +190,54 @@ public class WikiPageController {
wikiPageService.deletePage(wikiPage); wikiPageService.deletePage(wikiPage);
return DocResponseJson.ok(); return DocResponseJson.ok();
} }
//创建空白page
@PostMapping("/empty")
public ResponseJson<Object> empty(WikiPage wikiPage) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
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());
wikiPage.setName("未命名");
wikiPageService.save(wikiPage);
// 重置当前分支的所有节点seq值
wikiPageMapper.updateChildrenSeq(wikiPage.getSpaceId(), parentId);
WikiPageContent pageContent = new WikiPageContent();
pageContent.setContent("");
pageContent.setPreview("");
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);
return DocResponseJson.ok(wikiPage.getId());
}
@PostMapping("/update") @PostMapping("/update")
public ResponseJson<Object> update(WikiPage wikiPage, String content, String preview) { public ResponseJson<Object> update(WikiPage wikiPage, String content, String preview) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser(); DocUserDetails currentUser = DocUserUtil.getCurrentUser();

View File

@@ -5,13 +5,13 @@
<link rel="icon" href="wiki-logo.png" /> <link rel="icon" href="wiki-logo.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>WIKI文档管理系统</title> <title>WIKI文档管理系统</title>
<script type="module" crossorigin src="assets/main.68e288a7.js"></script> <script type="module" crossorigin src="assets/main.94982ebd.js"></script>
<link rel="modulepreload" href="assets/highlight.js.b879387e.js"> <link rel="modulepreload" href="assets/highlight.js.b879387e.js">
<link rel="modulepreload" href="assets/vue.9fe1449e.js"> <link rel="modulepreload" href="assets/vue.9fe1449e.js">
<link rel="modulepreload" href="assets/vendor.f45cfa8b.js"> <link rel="modulepreload" href="assets/vendor.1b8bf7cc.js">
<link rel="modulepreload" href="assets/vant.bd56adbb.js"> <link rel="modulepreload" href="assets/vant.af525f67.js">
<link rel="modulepreload" href="assets/wangeditor.cbd30c7d.js"> <link rel="modulepreload" href="assets/wangeditor.cbd30c7d.js">
<link rel="stylesheet" href="assets/style.686b5b54.css"> <link rel="stylesheet" href="assets/style.9c39e1d4.css">
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>