mirror of
https://gitee.com/dromara/go-view.git
synced 2025-02-24 16:22:57 +08:00
feat: 预览页\JSON编辑页\图表页保存同步更新
This commit is contained in:
parent
8000aaeb13
commit
5dc58362cc
@ -9,6 +9,12 @@ export enum DragKeyEnum {
|
|||||||
DRAG_KEY = 'ChartData'
|
DRAG_KEY = 'ChartData'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 不同页面保存操作
|
||||||
|
export enum SavePageEnum {
|
||||||
|
CHART = 'SaveChart',
|
||||||
|
JSON = 'SaveJSON'
|
||||||
|
}
|
||||||
|
|
||||||
// 操作枚举
|
// 操作枚举
|
||||||
export enum MenuEnum {
|
export enum MenuEnum {
|
||||||
// 移动
|
// 移动
|
||||||
@ -42,6 +48,8 @@ export enum MenuEnum {
|
|||||||
BACK = 'back',
|
BACK = 'back',
|
||||||
// 前进
|
// 前进
|
||||||
FORWORD = 'forward',
|
FORWORD = 'forward',
|
||||||
|
// 保存
|
||||||
|
SAVE = 'save',
|
||||||
// 锁定
|
// 锁定
|
||||||
LOCK = 'lock',
|
LOCK = 'lock',
|
||||||
// 解除锁定
|
// 解除锁定
|
||||||
|
@ -12,6 +12,12 @@ export enum PreviewEnum {
|
|||||||
CHART_PREVIEW_NAME = 'ChartPreview',
|
CHART_PREVIEW_NAME = 'ChartPreview',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum EditEnum {
|
||||||
|
// 图表JSON编辑
|
||||||
|
CHART_EDIT = '/chart/edit/:id(.*)*',
|
||||||
|
CHART_EDIT_NAME = 'ChartEdit',
|
||||||
|
}
|
||||||
|
|
||||||
export enum PageEnum {
|
export enum PageEnum {
|
||||||
// 登录
|
// 登录
|
||||||
BASE_LOGIN = '/login',
|
BASE_LOGIN = '/login',
|
||||||
|
@ -21,7 +21,8 @@ const RootRoute: Array<RouteRecordRaw> = [
|
|||||||
...HttpErrorPage,
|
...HttpErrorPage,
|
||||||
modules.projectRoutes,
|
modules.projectRoutes,
|
||||||
modules.chartRoutes,
|
modules.chartRoutes,
|
||||||
modules.previewRoutes
|
modules.previewRoutes,
|
||||||
|
modules.editRoutes
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
20
src/router/modules/edit.route.ts
Normal file
20
src/router/modules/edit.route.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { RouteRecordRaw } from 'vue-router'
|
||||||
|
import { EditEnum } from '@/enums/pageEnum'
|
||||||
|
|
||||||
|
// 引入路径
|
||||||
|
const importPath = {
|
||||||
|
[EditEnum.CHART_EDIT_NAME]: () => import('@/views/edit/index.vue')
|
||||||
|
}
|
||||||
|
|
||||||
|
const chartRoutes: RouteRecordRaw = {
|
||||||
|
path: EditEnum.CHART_EDIT,
|
||||||
|
name: EditEnum.CHART_EDIT_NAME,
|
||||||
|
component: importPath[EditEnum.CHART_EDIT_NAME],
|
||||||
|
meta: {
|
||||||
|
title: '编辑',
|
||||||
|
isRoot: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export default chartRoutes
|
@ -1,9 +1,11 @@
|
|||||||
import projectRoutes from './project.router'
|
import projectRoutes from './project.router'
|
||||||
import chartRoutes from './chart.route'
|
import chartRoutes from './chart.route'
|
||||||
import previewRoutes from './preview.route'
|
import previewRoutes from './preview.route'
|
||||||
|
import editRoutes from './edit.route'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
projectRoutes,
|
projectRoutes,
|
||||||
chartRoutes,
|
chartRoutes,
|
||||||
previewRoutes
|
previewRoutes,
|
||||||
|
editRoutes
|
||||||
}
|
}
|
@ -3,7 +3,7 @@ import { PreviewEnum } from '@/enums/pageEnum'
|
|||||||
|
|
||||||
// 引入路径
|
// 引入路径
|
||||||
const importPath = {
|
const importPath = {
|
||||||
'PreviewEnum.CHART_PREVIEW_NAME': () => import('@/views/preview/index.vue')
|
'PreviewEnum.CHART_PREVIEW_NAME': () => import('@/views/preview/wrapper.vue')
|
||||||
}
|
}
|
||||||
|
|
||||||
const chartRoutes: RouteRecordRaw = {
|
const chartRoutes: RouteRecordRaw = {
|
||||||
|
@ -58,17 +58,65 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, computed, h } from 'vue'
|
import { ref, computed, h, onBeforeUnmount } 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 { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
|
import { fetchPathByName, routerTurnByPath, setSessionStorage, getLocalStorage } from '@/utils'
|
||||||
|
import { EditEnum } from '@/enums/pageEnum'
|
||||||
|
import { StorageEnum } from '@/enums/storageEnum'
|
||||||
|
import { useRoute } from 'vue-router'
|
||||||
|
import { useSync } from '@/views/chart/hooks/useSync.hook'
|
||||||
|
import { SavePageEnum } from '@/enums/editPageEnum'
|
||||||
import { GoSystemSet } from '@/components/GoSystemSet/index'
|
import { GoSystemSet } from '@/components/GoSystemSet/index'
|
||||||
import { exportHandle } from './utils'
|
import { exportHandle } from './utils'
|
||||||
import { useFile } from './hooks/useFile.hooks'
|
import { useFile } from './hooks/useFile.hooks'
|
||||||
import { BtnListType, TypeEnum } from './index.d'
|
import { BtnListType, TypeEnum } from './index.d'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
|
|
||||||
const { DownloadIcon, ShareIcon, PawIcon, SettingsSharpIcon } = icon.ionicons5
|
const { DownloadIcon, ShareIcon, PawIcon, SettingsSharpIcon, CodeSlashIcon } = icon.ionicons5
|
||||||
const settingStore = useSettingStore()
|
const settingStore = useSettingStore()
|
||||||
|
const chartEditStore = useChartEditStore()
|
||||||
|
const routerParamsInfo = useRoute()
|
||||||
|
const { updateComponent } = useSync()
|
||||||
|
|
||||||
|
// 编辑
|
||||||
|
const editHandle = () => {
|
||||||
|
// 获取id路径
|
||||||
|
const path = fetchPathByName(EditEnum.CHART_EDIT_NAME, 'href')
|
||||||
|
if (!path) return
|
||||||
|
let { id } = routerParamsInfo.params as any
|
||||||
|
id = typeof id === 'string' ? id : id[0]
|
||||||
|
updateToSession(id)
|
||||||
|
routerTurnByPath(path, [id], undefined, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 把内存中的数据同步到SessionStorage 便于传递给新窗口初始化数据
|
||||||
|
function updateToSession(id: string) {
|
||||||
|
const storageInfo = chartEditStore.getStorageInfo
|
||||||
|
const sessionStorageInfo = getLocalStorage(StorageEnum.GO_CHART_STORAGE_LIST) || []
|
||||||
|
|
||||||
|
if (sessionStorageInfo?.length) {
|
||||||
|
const repeateIndex = sessionStorageInfo.findIndex((e: { id: string }) => e.id === id)
|
||||||
|
// 重复替换
|
||||||
|
if (repeateIndex !== -1) {
|
||||||
|
sessionStorageInfo.splice(repeateIndex, 1, { ...storageInfo, id })
|
||||||
|
setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, sessionStorageInfo)
|
||||||
|
} else {
|
||||||
|
sessionStorageInfo.push({ ...storageInfo, id})
|
||||||
|
setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, sessionStorageInfo)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [{ ...storageInfo, id }])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onBeforeUnmount((() => {
|
||||||
|
// 【监听JSON代码 刷新图表】
|
||||||
|
const updateFn = (e: any) => updateComponent(e!.detail, true, false)
|
||||||
|
addEventListener(SavePageEnum.JSON, updateFn)
|
||||||
|
return () => removeEventListener(SavePageEnum.JSON, updateFn)
|
||||||
|
})())
|
||||||
|
|
||||||
// 鼠标悬停定时器
|
// 鼠标悬停定时器
|
||||||
let mouseTime: any = null
|
let mouseTime: any = null
|
||||||
@ -95,6 +143,13 @@ const btnList: BtnListType[] = [
|
|||||||
name: '导入',
|
name: '导入',
|
||||||
icon: DownloadIcon
|
icon: DownloadIcon
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: 'edit',
|
||||||
|
type: TypeEnum.BUTTON,
|
||||||
|
name: '编辑JSON',
|
||||||
|
icon: CodeSlashIcon,
|
||||||
|
handle: editHandle
|
||||||
|
},
|
||||||
{
|
{
|
||||||
key: 'setting',
|
key: 'setting',
|
||||||
type: TypeEnum.BUTTON,
|
type: TypeEnum.BUTTON,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
import { WinKeyboard, MacKeyboard, MenuEnum } from '@/enums/editPageEnum'
|
import { WinKeyboard, MacKeyboard, MenuEnum, SavePageEnum } from '@/enums/editPageEnum'
|
||||||
import throttle from 'lodash/throttle'
|
import throttle from 'lodash/throttle'
|
||||||
import debounce from 'lodash/debounce'
|
import debounce from 'lodash/debounce'
|
||||||
import keymaster from 'keymaster'
|
import keymaster from 'keymaster'
|
||||||
@ -23,6 +23,7 @@ export const winKeyboardValue = {
|
|||||||
[MenuEnum.DELETE]: 'delete',
|
[MenuEnum.DELETE]: 'delete',
|
||||||
[MenuEnum.BACK]: winCtrlMerge('z'),
|
[MenuEnum.BACK]: winCtrlMerge('z'),
|
||||||
[MenuEnum.FORWORD]: winCtrlMerge(winShiftMerge('z')),
|
[MenuEnum.FORWORD]: winCtrlMerge(winShiftMerge('z')),
|
||||||
|
[MenuEnum.SAVE]: winCtrlMerge('s'),
|
||||||
[MenuEnum.GROUP]: winCtrlMerge('g'),
|
[MenuEnum.GROUP]: winCtrlMerge('g'),
|
||||||
[MenuEnum.UN_GROUP]: winCtrlMerge(winShiftMerge('g')),
|
[MenuEnum.UN_GROUP]: winCtrlMerge(winShiftMerge('g')),
|
||||||
[MenuEnum.LOCK]: winCtrlMerge('l'),
|
[MenuEnum.LOCK]: winCtrlMerge('l'),
|
||||||
@ -48,6 +49,7 @@ export const macKeyboardValue = {
|
|||||||
[MenuEnum.DELETE]: macCtrlMerge('backspace'),
|
[MenuEnum.DELETE]: macCtrlMerge('backspace'),
|
||||||
[MenuEnum.BACK]: macCtrlMerge('z'),
|
[MenuEnum.BACK]: macCtrlMerge('z'),
|
||||||
[MenuEnum.FORWORD]: macCtrlMerge(macShiftMerge('z')),
|
[MenuEnum.FORWORD]: macCtrlMerge(macShiftMerge('z')),
|
||||||
|
[MenuEnum.SAVE]: macCtrlMerge('s'),
|
||||||
[MenuEnum.GROUP]: macCtrlMerge('g'),
|
[MenuEnum.GROUP]: macCtrlMerge('g'),
|
||||||
[MenuEnum.UN_GROUP]: macCtrlMerge(macShiftMerge('g')),
|
[MenuEnum.UN_GROUP]: macCtrlMerge(macShiftMerge('g')),
|
||||||
[MenuEnum.LOCK]: macCtrlMerge('l'),
|
[MenuEnum.LOCK]: macCtrlMerge('l'),
|
||||||
@ -71,6 +73,7 @@ const winKeyList: Array<string> = [
|
|||||||
winKeyboardValue.back,
|
winKeyboardValue.back,
|
||||||
winKeyboardValue.forward,
|
winKeyboardValue.forward,
|
||||||
|
|
||||||
|
winKeyboardValue.save,
|
||||||
winKeyboardValue.group,
|
winKeyboardValue.group,
|
||||||
winKeyboardValue.unGroup,
|
winKeyboardValue.unGroup,
|
||||||
|
|
||||||
@ -96,6 +99,7 @@ const macKeyList: Array<string> = [
|
|||||||
macKeyboardValue.back,
|
macKeyboardValue.back,
|
||||||
macKeyboardValue.forward,
|
macKeyboardValue.forward,
|
||||||
|
|
||||||
|
macKeyboardValue.save,
|
||||||
macKeyboardValue.group,
|
macKeyboardValue.group,
|
||||||
macKeyboardValue.unGroup,
|
macKeyboardValue.unGroup,
|
||||||
|
|
||||||
@ -203,6 +207,11 @@ export const useAddKeyboard = () => {
|
|||||||
case keyboardValue.show:
|
case keyboardValue.show:
|
||||||
keymaster(e, throttle(() => { chartEditStore.setShow(); return false }, throttleTime))
|
keymaster(e, throttle(() => { chartEditStore.setShow(); return false }, throttleTime))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// 保存 ct+s
|
||||||
|
case keyboardValue.save:
|
||||||
|
keymaster(e, throttle(() => { dispatchEvent(new CustomEvent(SavePageEnum.CHART, { detail: chartEditStore.getStorageInfo })); return false }, 200))
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
winKeyList.forEach((key: string) => {
|
winKeyList.forEach((key: string) => {
|
||||||
|
99
src/views/edit/index.vue
Normal file
99
src/views/edit/index.vue
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
<template>
|
||||||
|
<div class="go-edit">
|
||||||
|
<n-layout has-sider sider-placement="right">
|
||||||
|
<n-layout-content>
|
||||||
|
<div>
|
||||||
|
<n-space class="go-mx-1 go-my-1">
|
||||||
|
<n-button size="medium" @click="back">返回</n-button>
|
||||||
|
<n-button v-if="showOpenFilePicker" size="medium" @click="importJSON">导入</n-button>
|
||||||
|
<!-- <n-button size="medium" type="primary" @click="confirm">覆盖</n-button> -->
|
||||||
|
</n-space>
|
||||||
|
</div>
|
||||||
|
<monaco-editor
|
||||||
|
v-model:modelValue="content"
|
||||||
|
language="json"
|
||||||
|
:editorOptions="{
|
||||||
|
lineNumbers: 'on',
|
||||||
|
minimap: { enabled: true }
|
||||||
|
}"
|
||||||
|
/>
|
||||||
|
</n-layout-content>
|
||||||
|
</n-layout>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { computed, ref, watch } from 'vue'
|
||||||
|
import { MonacoEditor } from '@/components/Pages/MonacoEditor'
|
||||||
|
import { SavePageEnum } from '@/enums/editPageEnum'
|
||||||
|
import { getSessionStorageInfo } from '../preview/utils'
|
||||||
|
import type { ChartEditStorageType } from '../preview/index.d'
|
||||||
|
import { setSessionStorage } from '@/utils'
|
||||||
|
import { StorageEnum } from '@/enums/storageEnum'
|
||||||
|
|
||||||
|
const showOpenFilePicker: Function = (window as any).showOpenFilePicker
|
||||||
|
let content = ref('')
|
||||||
|
|
||||||
|
// 从sessionStorage 获取数据
|
||||||
|
function getDataBySession () {
|
||||||
|
const localStorageInfo: ChartEditStorageType = getSessionStorageInfo() as ChartEditStorageType
|
||||||
|
content.value = JSON.stringify(localStorageInfo, undefined, 2)
|
||||||
|
}
|
||||||
|
getDataBySession()
|
||||||
|
|
||||||
|
// 返回父窗口
|
||||||
|
function back() {
|
||||||
|
opener.name = Date.now()
|
||||||
|
window.open(opener.location.href, opener.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 导入json文本
|
||||||
|
async function importJSON() {
|
||||||
|
const files = await showOpenFilePicker()
|
||||||
|
const file = await files[0].getFile()
|
||||||
|
const fr = new FileReader()
|
||||||
|
fr.readAsText(file)
|
||||||
|
fr.onloadend = () => {
|
||||||
|
content.value = (fr.result || '').toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 同步 [画布页失去焦点时同步数据到JSON页,JSON页Ctrl+S 时同步数据到画布页]
|
||||||
|
opener.addEventListener(SavePageEnum.CHART, (e: any) => {
|
||||||
|
setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [e.detail])
|
||||||
|
content.value = JSON.stringify(e.detail, undefined, 2)
|
||||||
|
})
|
||||||
|
|
||||||
|
document.addEventListener('keydown', function (e) {
|
||||||
|
if (e.keyCode == 83 && (navigator.platform.match('Mac') ? e.metaKey : e.ctrlKey)) {
|
||||||
|
e.preventDefault()
|
||||||
|
if (!opener) {
|
||||||
|
return window['$message'].error('源窗口已关闭,视图同步失败')
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const detail = JSON.parse(content.value)
|
||||||
|
delete detail.id
|
||||||
|
// 保持id不变
|
||||||
|
opener.dispatchEvent(new CustomEvent(SavePageEnum.JSON, { detail }))
|
||||||
|
} catch (e) {
|
||||||
|
window['$message'].error('内容格式有误')
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.go-edit {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
@include deep() {
|
||||||
|
.go-editor-area {
|
||||||
|
height: calc(100% - 40px) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
25
src/views/preview/wrapper.vue
Normal file
25
src/views/preview/wrapper.vue
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<template>
|
||||||
|
<Preview :key="key"></Preview>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { getSessionStorageInfo } from './utils'
|
||||||
|
import type { ChartEditStorageType } from './index.d'
|
||||||
|
import { SavePageEnum } from '@/enums/editPageEnum'
|
||||||
|
import { setSessionStorage } from '@/utils'
|
||||||
|
import { StorageEnum } from '@/enums/storageEnum'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import Preview from './index.vue'
|
||||||
|
|
||||||
|
let key = ref(Date.now())
|
||||||
|
let localStorageInfo: ChartEditStorageType = getSessionStorageInfo() as ChartEditStorageType
|
||||||
|
|
||||||
|
// 数据变更 -> 同步sessionStorage -> reload页面 (重新执行Mounted)
|
||||||
|
;[SavePageEnum.JSON, SavePageEnum.CHART].forEach((saveEvent: string) => {
|
||||||
|
opener.addEventListener(saveEvent, (e: any) => {
|
||||||
|
setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [{ ...e.detail, id: localStorageInfo.id }])
|
||||||
|
key.value = Date.now()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
Loading…
Reference in New Issue
Block a user