feat: 新增侧边栏

This commit is contained in:
MTrun 2022-04-09 23:55:09 +08:00
parent 9c04f51548
commit 4c28df1602
14 changed files with 224 additions and 78 deletions

View File

@ -4,6 +4,9 @@
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" /> <meta name="renderer" content="webkit" />
<meta name="description" content="低代码平台">
<meta name="keywords" content="GoViewgoview低代码可视化">
<meta name="author" content="奔跑的面条,面条">
<meta <meta
name="viewport" name="viewport"
content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"

View File

@ -0,0 +1,3 @@
import GoUserInfo from './index.vue';
export { GoUserInfo };

View File

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@ -1,3 +0,0 @@
import UserInfo from './index.vue';
export { UserInfo };

View File

@ -10,12 +10,12 @@
<slot name="ri-left"></slot> <slot name="ri-left"></slot>
</template> </template>
<template #ri-right> <template #ri-right>
<user-info></user-info> <go-user-info></go-user-info>
<slot name="ri-right"></slot> <slot name="ri-right"></slot>
</template> </template>
</layout-header> </layout-header>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { LayoutHeader } from '@/layout/components/LayoutHeader' import { LayoutHeader } from '@/layout/components/LayoutHeader'
import { UserInfo } from '@/components/UserInfo' import { GoUserInfo } from '@/components/GoUserInfo'
</script> </script>

View File

@ -10,7 +10,7 @@ import {
DesktopOutline as DesktopOutlineIcon, DesktopOutline as DesktopOutlineIcon,
Download as DownloadIcon, Download as DownloadIcon,
DownloadOutline as DownloadOutlineIcon, DownloadOutline as DownloadOutlineIcon,
Open as OpenIcon, Share as ShareIcon,
Send as SendIcon, Send as SendIcon,
InformationCircleOutline as InformationCircleIcon, InformationCircleOutline as InformationCircleIcon,
Grid as GridIcon, Grid as GridIcon,
@ -50,7 +50,8 @@ import {
Leaf as LeafIcon, Leaf as LeafIcon,
ColorWand as ColorWandIcon, ColorWand as ColorWandIcon,
ArrowBack as ArrowBackIcon, ArrowBack as ArrowBackIcon,
ArrowForward as ArrowForwardIcon ArrowForward as ArrowForwardIcon,
Planet as PawIcon
} from '@vicons/ionicons5' } from '@vicons/ionicons5'
import { import {
@ -125,7 +126,7 @@ const ionicons5 = {
DownloadIcon, DownloadIcon,
DownloadOutlineIcon, DownloadOutlineIcon,
// 导出 // 导出
OpenIcon, ShareIcon,
// 导出 // 导出
SendIcon, SendIcon,
// 信息 // 信息
@ -180,7 +181,9 @@ const ionicons5 = {
// 撤回 // 撤回
ArrowBackIcon, ArrowBackIcon,
// 前进 // 前进
ArrowForwardIcon ArrowForwardIcon,
// 狗爪
PawIcon
} }
const carbon = { const carbon = {

View File

@ -29,6 +29,7 @@ $dark: (
), ),
// hover 边框颜色 // hover 边框颜色
hover-border-color: $--color-dark-bg-5, hover-border-color: $--color-dark-bg-5,
hover-border-color-shallow: $--color-dark-bg-3,
// 阴影 // 阴影
box-shadow: 0 8px 10px #1e1e1e1f box-shadow: 0 8px 10px #1e1e1e1f

View File

@ -31,6 +31,7 @@ $light: (
), ),
// hover 边框颜色 // hover 边框颜色
hover-border-color: $--color-light-bg-4, hover-border-color: $--color-light-bg-4,
// 阴影 hover-border-color-shallow: $--color-light-bg-3,
// 阴影
box-shadow: 0 8px 10px #00000012 box-shadow: 0 8px 10px #00000012
); );

View File

@ -25,7 +25,6 @@ $--color-light-bg-4: #e3e3e4;
$--color-light-bg-4-shallow: lighten($--color-light-bg-4, $--light-shalow); $--color-light-bg-4-shallow: lighten($--color-light-bg-4, $--light-shalow);
$--color-light-bg-5: #bebebe; $--color-light-bg-5: #bebebe;
$--color-light-bg-5-shallow: lighten($--color-light-bg-5, $--light-shalow); $--color-light-bg-5-shallow: lighten($--color-light-bg-5, $--light-shalow);
$--color-light-border: #efeff5;
// 变暗值 // 变暗值
$--dark-shalow: 2%; $--dark-shalow: 2%;
@ -42,7 +41,6 @@ $--color-dark-bg-4: #313132;
$--color-dark-bg-4-shallow: darken($--color-dark-bg-4, $--dark-shalow); $--color-dark-bg-4-shallow: darken($--color-dark-bg-4, $--dark-shalow);
$--color-dark-bg-5: #373739; $--color-dark-bg-5: #373739;
$--color-dark-bg-5-shallow: darken($--color-dark-bg-5, $--dark-shalow); $--color-dark-bg-5-shallow: darken($--color-dark-bg-5, $--dark-shalow);
$--color-dark-border: #333335;
// 最大宽度 // 最大宽度
$--max-width: 1920px; $--max-width: 1920px;

View File

@ -151,11 +151,16 @@ $topOrBottomHeight: 40px;
border-bottom: 1px solid; border-bottom: 1px solid;
@include filter-border-color('background-color1'); @include filter-border-color('background-color1');
} }
.content { .content {
height: calc(100vh - #{$--header-height}); height: calc(100vh - #{$--header-height});
overflow: hidden; overflow: hidden;
} }
.aside {
position: relative;
}
.content-height-show-top-bottom { .content-height-show-top-bottom {
height: calc(100vh - #{$--header-height} - #{$topOrBottomHeight}); height: calc(100vh - #{$--header-height} - #{$topOrBottomHeight});
} }

View File

@ -1,38 +1,172 @@
<template> <template>
<div class="go-chart-edit-tools" :class="settingStore.getChartToolsStatus"> <div
<!-- aside --> class="go-chart-edit-tools"
<div v-if="settingStore.getChartToolsStatus === ToolsStatusEnum.ASIDE" class="tools-aside"></div> :class="[
<!-- dock --> settingStore.getChartToolsStatus,
<div v-else class="tools-dock"></div> isMini && 'isMini',
]"
@click="isMini && (isMini = false)"
@mouseenter="toolsMouseoverHandle"
@mouseleave="toolsMouseoutHandle"
>
<n-tooltip
v-for="item in btnList"
:key="item.key"
:disabled="!isAside"
trigger="hover"
placement="left"
>
<template #trigger>
<n-button
v-show="!isMini"
class="btn-item"
:circle="isAside"
secondary
@click="item.handle"
>
<template #icon>
<n-icon size="22" v-if="isAside">
<component :is="item.icon"></component>
</n-icon>
<component v-else :is="item.icon"></component>
</template>
<n-text depth="3" v-show="!isAside">{{ item.name }}</n-text>
</n-button>
</template>
<!-- 提示 -->
<span>{{ item.name }}</span>
</n-tooltip>
<!-- PawIcon -->
<n-icon
v-show="settingStore.getChartToolsStatus === ToolsStatusEnum.ASIDE && isMini"
size="22"
v-if="isAside"
>
<PawIcon></PawIcon>
</n-icon>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed, h } from 'vue';
import { useSettingStore } from '@/store/modules/settingStore/settingStore' import { useSettingStore } from '@/store/modules/settingStore/settingStore'
import { ToolsStatusEnum } from '@/store/modules/settingStore/settingStore.d' import { ToolsStatusEnum } from '@/store/modules/settingStore/settingStore.d'
import { importHandle, exportHandle } from './utils'
import { icon } from '@/plugins'
const { DownloadIcon, ShareIcon, PawIcon } = icon.ionicons5
const settingStore = useSettingStore() const settingStore = useSettingStore()
//
let mouseTime: any = null
//
const isMini = ref<boolean>(true)
//
const isAside = computed(() => settingStore.getChartToolsStatus === ToolsStatusEnum.ASIDE)
const btnList = [{
key: 'import',
name: '导入',
icon: DownloadIcon,
handle: importHandle
}, {
key: 'export',
name: '导出',
icon: ShareIcon,
handle: exportHandle
}]
const toolsMouseoverHandle = () => {
mouseTime = setTimeout(() => {
if (isMini.value) {
isMini.value = false
}
}, 200);
}
const toolsMouseoutHandle = () => {
clearTimeout(mouseTime)
if (!isMini.value) {
isMini.value = true
}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/* 底部区域的高度 */ /* 底部区域的高度 */
$topOrBottomHeight: 40px; $dockBottom: 60px;
$asideBottom: 100px; $dockMiniWidth: 200px;
@include go('chart-edit-tools') { $dockMiniBottom: 53px;
$asideBottom: 70px;
@include go("chart-edit-tools") {
@extend .go-background-filter;
position: absolute; position: absolute;
&.dock { display: flex;
right: 10px; justify-content: space-around;
bottom: $asideBottom; align-items: center;
} border-radius: 25px;
border: 1px solid;
mix-blend-mode: luminosity;
transition: height ease-in 1s, padding 0.4s, bottom .4s;
@include filter-border-color("hover-border-color-shallow");
&.aside { &.aside {
flex-direction: column;
height: auto;
right: 20px;
padding: 20px 8px;
bottom: $asideBottom;
.btn-item {
margin-bottom: 10px;
padding-bottom: 6px;
&:last-child {
margin-bottom: 0;
}
@include deep() {
.n-button__icon {
margin-right: 4px;
}
}
}
&.isMini {
cursor: pointer;
padding: 12px 8px;
background-color: var(--n-toggle-bar-color);
}
}
&.dock {
width: auto;
left: 50%; left: 50%;
bottom: $topOrBottomHeight; padding: 8px 30px;
} bottom: $dockBottom;
.tools-aside { transform: translateX(-50%);
}
.tools-dock {
.btn-item {
margin-right: 20px;
&:last-child {
margin-right: 0;
}
}
/* 最小化 */
&.isMini {
height: 0;
padding: 5px;
width: $dockMiniWidth;
bottom: $dockMiniBottom;
border-radius: 8px;
cursor: pointer;
border: 0px;
mix-blend-mode: screen;
}
&::after {
content: "";
position: absolute;
left: 0;
width: 100%;
height: 30px;
bottom: -25px;
cursor: pointer;
}
} }
} }
</style> </style>

View File

@ -0,0 +1,47 @@
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { canvasCut, downloadTextFile } from '@/utils'
const chartEditStore = useChartEditStore()
// 导入
export const importHandle = () => { }
// 导出
export const exportHandle = () => {
// 导出数据
downloadTextFile(JSON.stringify(chartEditStore.getStorageInfo || []), undefined, 'json')
// 导出图片
const ruler = document.getElementById('mb-ruler')
const range = document.querySelector('.go-edit-range') as HTMLElement
const watermark = document.getElementById('go-edit-watermark')
// 隐藏边距线
if (!ruler || !range || !watermark) {
window['$message'].error('导出失败!')
return
}
// 记录缩放比例
const scaleTemp = chartEditStore.getEditCanvas.scale
// 去除标尺Dom
ruler.style.display = 'none'
// 百分百展示页面
chartEditStore.setScale(1, true)
// 展示水印
watermark.style.display = 'block'
window['$message'].warning('生成截图和数据中, 请耐心等待...')
setTimeout(() => {
canvasCut(range, () => {
// 隐藏水印
if (watermark) watermark.style.display = 'none'
// 放开边距线
if (ruler) ruler.style.display = 'block'
// 还原页面大小
chartEditStore.setScale(scaleTemp, true)
})
}, 600)
}
// 改变工具栏展示样式
export const changeTypeHandle = () => {
}

View File

@ -1,6 +1,6 @@
<template> <template>
<n-space class="go-mt-0"> <n-space class="go-mt-0">
<n-button v-for="item in btnList" :key="item.title" ghost size="small" @click="item.event"> <n-button v-for="item in btnList" :key="item.title" ghost @click="item.event">
<template #icon> <template #icon>
<component :is="item.icon"></component> <component :is="item.icon"></component>
</template> </template>
@ -14,13 +14,12 @@ import { shallowReactive } from 'vue'
import { renderIcon, fetchPathByName, routerTurnByPath, setSessionStorage, getLocalStorage } from '@/utils' import { renderIcon, fetchPathByName, routerTurnByPath, setSessionStorage, getLocalStorage } from '@/utils'
import { PreviewEnum } from '@/enums/pageEnum' import { PreviewEnum } from '@/enums/pageEnum'
import { StorageEnum } from '@/enums/storageEnum' import { StorageEnum } from '@/enums/storageEnum'
import { canvasCut, downloadTextFile } from '@/utils'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d' import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
import { icon } from '@/plugins' import { icon } from '@/plugins'
const { BrowsersOutlineIcon, SendIcon, DownloadIcon } = icon.ionicons5 const { BrowsersOutlineIcon, SendIcon } = icon.ionicons5
const chartEditStore = useChartEditStore() const chartEditStore = useChartEditStore()
const routerParamsInfo = useRoute() const routerParamsInfo = useRoute()
@ -54,45 +53,6 @@ const previewHandle = () => {
routerTurnByPath(path, [previewId], undefined, true) routerTurnByPath(path, [previewId], undefined, true)
} }
//
const importHandle = () => {}
//
const exportHandle = () => {
//
downloadTextFile(JSON.stringify(chartEditStore.getStorageInfo || []), undefined, 'json')
//
const ruler = document.getElementById('mb-ruler')
const range = document.querySelector('.go-edit-range') as HTMLElement
const watermark = document.getElementById('go-edit-watermark')
// 线
if (!ruler || !range || !watermark) {
window['$message'].error('导出失败!')
return
}
//
const scaleTemp = chartEditStore.getEditCanvas.scale
// Dom
ruler.style.display = 'none'
//
chartEditStore.setScale(1, true)
//
watermark.style.display = 'block'
window['$message'].warning('生成截图和数据中, 请耐心等待...')
setTimeout(() => {
canvasCut(range, () => {
//
if (watermark) watermark.style.display = 'none'
// 线
if (ruler) ruler.style.display = 'block'
//
chartEditStore.setScale(scaleTemp, true)
})
}, 600)
}
// //
const sendHandle = () => { const sendHandle = () => {
window['$message'].warning('该功能暂未实现(因为压根没有后台)') window['$message'].warning('该功能暂未实现(因为压根没有后台)')
@ -105,12 +65,6 @@ const btnList = shallowReactive([
icon: renderIcon(BrowsersOutlineIcon), icon: renderIcon(BrowsersOutlineIcon),
event: previewHandle event: previewHandle
}, },
{
select: true,
title: '下载',
icon: renderIcon(DownloadIcon),
event: exportHandle
},
{ {
select: true, select: true,
title: '发布', title: '发布',