页面加载逻辑优化
This commit is contained in:
@@ -3,6 +3,8 @@ import {defineStore} from 'pinia';
|
|||||||
export const useStorePageData = defineStore('pageData', {
|
export const useStorePageData = defineStore('pageData', {
|
||||||
state: () => {
|
state: () => {
|
||||||
return {
|
return {
|
||||||
|
// 页面加载状态 -1=空间不存在 0=初始值 1=加载中 2=加载成功 3=加载失败
|
||||||
|
pageLoadStatus: 0,
|
||||||
pageInfo: {},
|
pageInfo: {},
|
||||||
pageAuth: {},
|
pageAuth: {},
|
||||||
fileList: [],
|
fileList: [],
|
||||||
@@ -15,4 +17,40 @@ export const useStorePageData = defineStore('pageData', {
|
|||||||
eventPageListUpdate: false,
|
eventPageListUpdate: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
getters: {
|
||||||
|
getFirstViewPage: (state) => {
|
||||||
|
return () => {
|
||||||
|
let getPage = (dataList) => {
|
||||||
|
for (let i = 0; i < dataList.length; i++) {
|
||||||
|
let page = dataList[i];
|
||||||
|
if (page.editorType !== 0) {
|
||||||
|
return page;
|
||||||
|
} else if (page.children) {
|
||||||
|
let find = getPage(page.children);
|
||||||
|
if (find) return find;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return getPage(state.pageList);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getPageById: (state) => {
|
||||||
|
return (pageId) => {
|
||||||
|
let getPage = (dataList) => {
|
||||||
|
for (let i = 0; i < dataList.length; i++) {
|
||||||
|
let page = dataList[i];
|
||||||
|
if (page.id === pageId) {
|
||||||
|
return page;
|
||||||
|
} else if (page.children) {
|
||||||
|
let find = getPage(page.children);
|
||||||
|
if (find) return find;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return getPage(state.pageList);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -64,6 +64,6 @@ html, body {
|
|||||||
background-color: #fff !important;
|
background-color: #fff !important;
|
||||||
color: #333;
|
color: #333;
|
||||||
height: 60px !important;
|
height: 60px !important;
|
||||||
border-bottom: 1px solid #eee;
|
border-bottom: 1px solid #f0f0f0;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -67,10 +67,10 @@ let emit = defineEmits(['switchSpace', 'changeExpandedKeys', 'loadPageList']);
|
|||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
storeDisplay.currentPage = 'view';
|
storeDisplay.currentPage = 'view';
|
||||||
storeDisplay.showHeader = true;
|
storeDisplay.showHeader = true;
|
||||||
initQueryParam(route);
|
loadPageDetail(route.params);
|
||||||
});
|
});
|
||||||
onBeforeRouteUpdate((to) => {
|
onBeforeRouteUpdate((updateGuard) => {
|
||||||
initQueryParam(to);
|
loadPageDetail(updateGuard.params);
|
||||||
});
|
});
|
||||||
// 页面展示相关
|
// 页面展示相关
|
||||||
let wikiPage = ref({});
|
let wikiPage = ref({});
|
||||||
@@ -113,10 +113,17 @@ const afterLoadPage = () => {
|
|||||||
createNavigationHeading();
|
createNavigationHeading();
|
||||||
}, 500);
|
}, 500);
|
||||||
}
|
}
|
||||||
const loadPageDetail = (pageId) => {
|
const loadPageDetail = (query) => {
|
||||||
clearHistory();
|
clearPageData();
|
||||||
|
let pageId = query.pageId;
|
||||||
|
let spaceId = query.spaceId;
|
||||||
|
if (!pageId || !spaceId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
pageContent.value = '';
|
pageContent.value = '';
|
||||||
|
storePage.pageLoadStatus = 1;
|
||||||
pageApi.pageDetail({id: pageId}).then(async (json) => {
|
pageApi.pageDetail({id: pageId}).then(async (json) => {
|
||||||
|
storePage.pageLoadStatus = 2;
|
||||||
let result = json.data || {};
|
let result = json.data || {};
|
||||||
let wikiPageRes = result.wikiPage || {};
|
let wikiPageRes = result.wikiPage || {};
|
||||||
wikiPageRes.selfZan = result.selfZan || 0;
|
wikiPageRes.selfZan = result.selfZan || 0;
|
||||||
@@ -150,6 +157,9 @@ const loadPageDetail = (pageId) => {
|
|||||||
storePage.pageInfo = wikiPageRes;
|
storePage.pageInfo = wikiPageRes;
|
||||||
storePage.pageAuth = wikiPageAuth.value;
|
storePage.pageAuth = wikiPageAuth.value;
|
||||||
afterLoadPage();
|
afterLoadPage();
|
||||||
|
}).catch(e => {
|
||||||
|
console.log(e);
|
||||||
|
storePage.pageLoadStatus = 3;
|
||||||
});
|
});
|
||||||
getPageHistory(pageId);
|
getPageHistory(pageId);
|
||||||
}
|
}
|
||||||
@@ -170,14 +180,6 @@ const createNavigationHeading = () => {
|
|||||||
let spaceId = '';
|
let spaceId = '';
|
||||||
let pageId = '';
|
let pageId = '';
|
||||||
let pageContentRef = ref();
|
let pageContentRef = ref();
|
||||||
const initQueryParam = (to) => {
|
|
||||||
spaceId = parseInt(to.params.spaceId);
|
|
||||||
pageId = parseInt(to.params.pageId);
|
|
||||||
clearPageData();
|
|
||||||
if (!!pageId) {
|
|
||||||
loadPageDetail(pageId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const clearPageData = () => {
|
const clearPageData = () => {
|
||||||
wikiPage.value = {};
|
wikiPage.value = {};
|
||||||
wikiPageAuth.value = {};
|
wikiPageAuth.value = {};
|
||||||
@@ -185,6 +187,8 @@ const clearPageData = () => {
|
|||||||
pageContentShow.value = '';
|
pageContentShow.value = '';
|
||||||
storePage.pageInfo = {};
|
storePage.pageInfo = {};
|
||||||
storePage.pageAuth = {};
|
storePage.pageAuth = {};
|
||||||
|
storePage.fileList = [];
|
||||||
|
storePage.pageLoadStatus = 0;
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -202,7 +206,7 @@ const clearPageData = () => {
|
|||||||
overflow: auto;
|
overflow: auto;
|
||||||
padding: 30px 20px;
|
padding: 30px 20px;
|
||||||
position: relative;
|
position: relative;
|
||||||
border-right: 1px solid #eee;
|
border-right: 1px solid #f0f0f0;
|
||||||
|
|
||||||
.view-body-box {
|
.view-body-box {
|
||||||
max-width: 840px;
|
max-width: 840px;
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-show="!spaceTreeIsClose" class="wiki-page-tree-box">
|
<div v-show="!spaceTreeIsClose" class="wiki-page-tree-box">
|
||||||
<el-tree ref="wikiPageTreeRef" :current-node-key="props.nowPageId" :data="storePage.wikiPageList"
|
<el-tree ref="wikiPageTreeRef" :current-node-key="props.nowPageId" :data="storePage.pageList"
|
||||||
:default-expanded-keys="wikiPageExpandedKeys" :expand-on-click-node="true"
|
:default-expanded-keys="wikiPageExpandedKeys" :expand-on-click-node="true"
|
||||||
:filter-node-method="filterPageNode" :props="defaultProps" :draggable="!props.readOnly"
|
:filter-node-method="filterPageNode" :props="defaultProps" :draggable="!props.readOnly"
|
||||||
@node-click="handleNodeClick" @node-drop="handlePageDrop" node-key="id" highlight-current
|
@node-click="handleNodeClick" @node-drop="handlePageDrop" node-key="id" highlight-current
|
||||||
@@ -238,7 +238,7 @@ const openMoveMenu = (onlyMove) => {
|
|||||||
// visibleMoveMenu.value = true;
|
// visibleMoveMenu.value = true;
|
||||||
// moveToPageId.value = storePage.choosePageId
|
// moveToPageId.value = storePage.choosePageId
|
||||||
// moveToSpaceId.value = storeSpace.chooseSpaceId
|
// moveToSpaceId.value = storeSpace.chooseSpaceId
|
||||||
// moveToWikiPageList.value = storePage.wikiPageList
|
// moveToWikiPageList.value = storePage.pageList
|
||||||
}
|
}
|
||||||
const openTemplateCreate = (exsit) => {
|
const openTemplateCreate = (exsit) => {
|
||||||
// TODO
|
// TODO
|
||||||
@@ -276,9 +276,24 @@ const doRename = (node, data) => {
|
|||||||
const doGetPageList = () => {
|
const doGetPageList = () => {
|
||||||
storePage.pageList = [];
|
storePage.pageList = [];
|
||||||
storePage.favoritePageList = [];
|
storePage.favoritePageList = [];
|
||||||
let param = {spaceId: storeSpace.chooseSpaceId};
|
let spaceId = storeSpace.chooseSpaceId;
|
||||||
pageApi.pageList(param).then((json) => {
|
pageApi.pageList({spaceId: spaceId}).then((json) => {
|
||||||
storePage.wikiPageList = json.data || [];
|
storePage.pageList = json.data || [];
|
||||||
|
// 查看页面
|
||||||
|
if (storePage.pageList.length <= 0) {
|
||||||
|
router.push({path: `/view/${spaceId}`});
|
||||||
|
} else {
|
||||||
|
let routePageId = parseInt(route.params.pageId);
|
||||||
|
let findPage = storePage.getPageById(routePageId);
|
||||||
|
if (findPage) {
|
||||||
|
router.replace({path: `/view/${spaceId}/${routePageId}`});
|
||||||
|
} else {
|
||||||
|
let firstPage = storePage.getFirstViewPage();
|
||||||
|
if (firstPage) {
|
||||||
|
router.replace({path: `/view/${spaceId}/${firstPage.id}`});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const doSearchByKeywords = (queryString, callback) => {
|
const doSearchByKeywords = (queryString, callback) => {
|
||||||
|
|||||||
@@ -7,10 +7,15 @@
|
|||||||
<a-button @click="turnLeftCollapse" v-else type="text" :icon="h(MenuUnfoldOutlined)"></a-button>
|
<a-button @click="turnLeftCollapse" v-else type="text" :icon="h(MenuUnfoldOutlined)"></a-button>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="storeDisplay.currentPage === 'view'" class="title-time-box">
|
<div v-if="storeDisplay.currentPage === 'view'" class="title-time-box">
|
||||||
|
<template v-if="storePage.pageLoadStatus===1">
|
||||||
|
<LoadingOutlined style="margin-top: 16px;font-size: 18px;"/>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="storePage.pageLoadStatus===2">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<span class="text">{{storePage.pageInfo.name || ''}}</span>
|
<span class="text">{{storePage.pageInfo.name || ''}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="time">最近修改:{{storePage.pageInfo.updateTime || ''}}</div>
|
<div class="time">最近修改:{{storePage.pageInfo.updateTime || ''}}</div>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -78,7 +83,7 @@ import {
|
|||||||
} from '@element-plus/icons-vue'
|
} from '@element-plus/icons-vue'
|
||||||
import {
|
import {
|
||||||
UserOutlined, EditOutlined, MessageOutlined, CheckOutlined, EllipsisOutlined,
|
UserOutlined, EditOutlined, MessageOutlined, CheckOutlined, EllipsisOutlined,
|
||||||
MenuFoldOutlined, MenuUnfoldOutlined
|
MenuFoldOutlined, MenuUnfoldOutlined, LoadingOutlined
|
||||||
} from '@ant-design/icons-vue';
|
} from '@ant-design/icons-vue';
|
||||||
import {toRefs, ref, reactive, onMounted, watch, defineEmits, h, computed} from 'vue';
|
import {toRefs, ref, reactive, onMounted, watch, defineEmits, h, computed} from 'vue';
|
||||||
import {useRouter, useRoute} from "vue-router";
|
import {useRouter, useRoute} from "vue-router";
|
||||||
@@ -139,7 +144,7 @@ const deleteWikiPage = () => {
|
|||||||
}).then(() => {
|
}).then(() => {
|
||||||
pageApi.pageDelete({pageId: storePage.pageInfo.id}).then(() => {
|
pageApi.pageDelete({pageId: storePage.pageInfo.id}).then(() => {
|
||||||
pageApi.pageList({spaceId: storeSpace.chooseSpaceId}).then((json) => {
|
pageApi.pageList({spaceId: storeSpace.chooseSpaceId}).then((json) => {
|
||||||
storePage.wikiPageList = json.data || [];
|
storePage.pageList = json.data || [];
|
||||||
}).then(()=>{
|
}).then(()=>{
|
||||||
router.push({path: '/home', query: {spaceId: storePage.pageInfo.spaceId}});
|
router.push({path: '/home', query: {spaceId: storePage.pageInfo.spaceId}});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ const getUserHeadBgColor = (userId) => {
|
|||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.comment-box {
|
.comment-box {
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
height: calc(100vh - 275px);
|
height: calc(100vh - 285px);
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
|
||||||
.comment-card {
|
.comment-card {
|
||||||
|
|||||||
Reference in New Issue
Block a user