mirror of
https://gitee.com/dromara/go-view.git
synced 2025-04-06 03:58:04 +08:00
feat: 新增侧边栏
This commit is contained in:
parent
9c04f51548
commit
4c28df1602
@ -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="GoView,goview,低代码,可视化">
|
||||||
|
<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"
|
||||||
|
3
src/components/GoUserInfo/index.ts
Normal file
3
src/components/GoUserInfo/index.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
import GoUserInfo from './index.vue';
|
||||||
|
|
||||||
|
export { GoUserInfo };
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.7 KiB |
@ -1,3 +0,0 @@
|
|||||||
import UserInfo from './index.vue';
|
|
||||||
|
|
||||||
export { UserInfo };
|
|
@ -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>
|
||||||
|
@ -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 = {
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
);
|
);
|
||||||
|
@ -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;
|
||||||
|
@ -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});
|
||||||
}
|
}
|
||||||
|
@ -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>
|
||||||
|
@ -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 = () => {
|
||||||
|
|
||||||
|
}
|
@ -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: '发布',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user