From 85c5e68db7ed5448059f729a8ddb8438c6e8c661 Mon Sep 17 00:00:00 2001 From: juetan Date: Fri, 20 Oct 2023 23:22:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BC=96=E8=BE=91=E5=99=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=A2=84=E8=A7=88=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 +- src/App.vue | 2 +- .../blocks/components/font/interface.ts | 2 +- src/components/editor/blocks/date/index.ts | 3 +- src/components/editor/blocks/index.ts | 11 ++- src/components/editor/blocks/text/index.ts | 7 +- src/components/editor/blocks/text/option.vue | 4 +- src/components/editor/blocks/time/index.ts | 3 +- .../editor/components/BaseOption.vue | 16 ++-- .../editor/components/ImagePicker.vue | 4 +- src/components/editor/config/block.ts | 49 ++++++++++++ src/components/editor/config/context.ts | 17 +++-- src/components/editor/index.vue | 23 +++++- src/components/editor/panel-left/index.vue | 70 ++++++++++++++--- .../editor/panel-main/components/block.vue | 24 +++++- .../editor/panel-main/components/header.vue | 6 +- src/components/editor/panel-main/index.vue | 37 +++++++-- src/components/editor/preview/index.vue | 76 +++++++++++++++++-- 18 files changed, 301 insertions(+), 55 deletions(-) diff --git a/.env b/.env index f84a78f..2ea954c 100644 --- a/.env +++ b/.env @@ -6,7 +6,7 @@ VITE_TITLE = 绝弹管理后台 # 网站副标题 VITE_SUBTITLE = 快速开发web应用的模板工具 # 接口前缀 说明:参见 axios 的 baseURL -VITE_API = http://127.0.0.1:3030/ +VITE_API = https://nest.dev.juetan.cn/ # ===================================================================================== # 开发设置 diff --git a/src/App.vue b/src/App.vue index ba84824..ce7d42e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -5,7 +5,7 @@ -
+
diff --git a/src/components/editor/blocks/components/font/interface.ts b/src/components/editor/blocks/components/font/interface.ts index 805ae12..6ebab6f 100644 --- a/src/components/editor/blocks/components/font/interface.ts +++ b/src/components/editor/blocks/components/font/interface.ts @@ -1,4 +1,4 @@ -import { CSSProperties, StyleValue } from "vue"; +import { CSSProperties } from "vue"; export interface Font { /** diff --git a/src/components/editor/blocks/date/index.ts b/src/components/editor/blocks/date/index.ts index 6ae843e..ba4fe45 100644 --- a/src/components/editor/blocks/date/index.ts +++ b/src/components/editor/blocks/date/index.ts @@ -1,6 +1,6 @@ import { defineBlocker } from "../../config"; -import { Date } from "./interface"; import { font } from "../components/font"; +import { Date } from "./interface"; import Option from "./option.vue"; import Render from "./render.vue"; @@ -14,6 +14,7 @@ export default defineBlocker({ initial: { id: "", type: "date", + title: '', x: 0, y: 0, w: 300, diff --git a/src/components/editor/blocks/index.ts b/src/components/editor/blocks/index.ts index a682f28..b20af4f 100644 --- a/src/components/editor/blocks/index.ts +++ b/src/components/editor/blocks/index.ts @@ -11,4 +11,13 @@ const getBlockerRender = (type: string) => { return BlockerMap[type].render; }; -export { BlockerMap, getBlockerRender }; +const getTypeName = (type: string) => { + return BlockerMap[type].title; +}; + +const getIcon = (type: string) => { + return BlockerMap[type].icon; +}; + +export { BlockerMap, getBlockerRender, getIcon, getTypeName }; + diff --git a/src/components/editor/blocks/text/index.ts b/src/components/editor/blocks/text/index.ts index f01106d..4289440 100644 --- a/src/components/editor/blocks/text/index.ts +++ b/src/components/editor/blocks/text/index.ts @@ -1,8 +1,8 @@ import { defineBlocker } from "../../config"; -import Render from "./render.vue"; -import Option from "./option.vue"; -import { Text } from "./interface"; import { font } from "../components/font"; +import { Text } from "./interface"; +import Option from "./option.vue"; +import Render from "./render.vue"; export default defineBlocker({ type: "text", @@ -14,6 +14,7 @@ export default defineBlocker({ initial: { id: "", type: "text", + title: "", x: 0, y: 0, w: 300, diff --git a/src/components/editor/blocks/text/option.vue b/src/components/editor/blocks/text/option.vue index 6f7cde6..2cb2239 100644 --- a/src/components/editor/blocks/text/option.vue +++ b/src/components/editor/blocks/text/option.vue @@ -24,9 +24,7 @@
-
- -
+ diff --git a/src/components/editor/components/ImagePicker.vue b/src/components/editor/components/ImagePicker.vue index 1cd0293..d460f86 100644 --- a/src/components/editor/components/ImagePicker.vue +++ b/src/components/editor/components/ImagePicker.vue @@ -28,12 +28,12 @@ -
+
diff --git a/src/components/editor/config/block.ts b/src/components/editor/config/block.ts index ff6b685..cb8767c 100644 --- a/src/components/editor/config/block.ts +++ b/src/components/editor/config/block.ts @@ -1,17 +1,66 @@ export interface Block { + /** + * 组件ID + */ id: string; + /** + * 组件类型 + */ type: string; + /** + * 组件名称 + */ + title: string; + /** + * 距离左侧 + */ x: number; + /** + * 距离顶部 + */ y: number; + /** + * 宽度 + */ w: number; + /** + * 高度 + */ h: number; + /** + * 水平方向是否固定 + */ xFixed: boolean; + /** + * 垂直方向是否固定 + */ yFixed: boolean; + /** + * 背景图片 + */ bgImage?: string; + /** + * 背景颜色 + */ bgColor?: string; + /** + * 是否选中 + */ actived: boolean; + /** + * 是否可缩放 + */ resizable: boolean; + /** + * 是否可拖拽 + */ draggable: boolean; + /** + * 元数据 + */ meta: Record; + /** + * 组件参数 + */ params: T; } diff --git a/src/components/editor/config/context.ts b/src/components/editor/config/context.ts index 89e1dfe..332fc85 100644 --- a/src/components/editor/config/context.ts +++ b/src/components/editor/config/context.ts @@ -2,14 +2,16 @@ import { InjectionKey, Ref } from "vue"; import { Block } from "./block"; import { Container } from "./container"; +export interface Current { + block: Block | null; + rightPanelCollapsed: boolean; +} + export interface Context { /** * 运行时数据 */ - current: Ref<{ - block: Block | null; - rightPanelCollapsed: boolean; - }>; + current: Ref; /** * 组件列表 */ @@ -36,7 +38,10 @@ export interface Context { * 加载数据 */ loadData: () => void; + /** + * 预览 + */ + preview: () => void; } -export const ContextKey = Symbol('ContextKey') as InjectionKey; - +export const ContextKey = Symbol("ContextKey") as InjectionKey; diff --git a/src/components/editor/index.vue b/src/components/editor/index.vue index 6733542..3a29206 100644 --- a/src/components/editor/index.vue +++ b/src/components/editor/index.vue @@ -4,7 +4,7 @@
-
+
@@ -16,6 +16,7 @@
+ @@ -25,6 +26,9 @@ import PanelHeader from "./panel-header/index.vue"; import PanelLeft from "./panel-left/index.vue"; import PanelMain from "./panel-main/index.vue"; import PanelRight from "./panel-right/index.vue"; +import AppnifyPreview from "./preview/index.vue"; + +const preview = ref(false); /** * 运行时上下文 @@ -105,7 +109,15 @@ const setCurrentBlock = (block: Block | null) => { const setContainerOrigin = () => { container.value.x = 0; container.value.y = 0; - container.value.zoom = 0.7; + const el = document.querySelector(".juetan-editor-container"); + if (el) { + const { width, height } = el.getBoundingClientRect(); + const wZoom = width / container.value.width; + const hZoom = height / container.value.width; + const zoom = Math.floor((wZoom > hZoom ? wZoom : hZoom) * 100) / 100; + // console.log(width, height, wZoom, hZoom, zoom); + container.value.zoom = zoom; + } }; /** @@ -119,14 +131,17 @@ provide(ContextKey, { setContainerOrigin, loadData, saveData, + preview() { + preview.value = true; + }, }); diff --git a/src/components/editor/panel-main/components/block.vue b/src/components/editor/panel-main/components/block.vue index 66a554c..f2743fe 100644 --- a/src/components/editor/panel-main/components/block.vue +++ b/src/components/editor/panel-main/components/block.vue @@ -13,6 +13,7 @@ :isActive="data.actived" :isResizable="data.resizable" :style="blockStyle" + :class="'resizer'" @dragging="onItemDragOrResize" @resizing="onItemDragOrResize" @activated="setCurrentBlock(data)" @@ -57,4 +58,25 @@ const onItemDragOrResize = (rect: any) => { }; - + diff --git a/src/components/editor/panel-main/components/header.vue b/src/components/editor/panel-main/components/header.vue index 68efe8b..0d4e4b0 100644 --- a/src/components/editor/panel-main/components/header.vue +++ b/src/components/editor/panel-main/components/header.vue @@ -21,7 +21,7 @@ 组件: - {{ blocks.length }} 个 + {{ blocks.length }} 个 @@ -31,7 +31,7 @@ - + @@ -78,7 +78,7 @@ import InputImage from "../../components/InputImage.vue"; import { ContextKey } from "../../config"; import AniTexter from "./texter.vue"; -const { container, blocks, current, setContainerOrigin } = inject(ContextKey)!; +const { container, blocks, current, preview, setContainerOrigin } = inject(ContextKey)!; diff --git a/src/components/editor/panel-main/index.vue b/src/components/editor/panel-main/index.vue index 74e3da9..257e59c 100644 --- a/src/components/editor/panel-main/index.vue +++ b/src/components/editor/panel-main/index.vue @@ -4,7 +4,7 @@
-
+
diff --git a/src/components/editor/preview/index.vue b/src/components/editor/preview/index.vue index 542020b..0242e01 100644 --- a/src/components/editor/preview/index.vue +++ b/src/components/editor/preview/index.vue @@ -1,13 +1,79 @@ - \ No newline at end of file +