diff --git a/.env b/.env
index bdcd27b..675fd3a 100644
--- a/.env
+++ b/.env
@@ -2,9 +2,9 @@
# 应用配置
# =====================================================================================
# 网站标题
-VITE_TITLE = 绝弹管理中心
+VITE_TITLE = 管理中心
# 网站副标题
-VITE_SUBTITLE = 绝弹管理中心1
+VITE_SUBTITLE = 绝弹管理中心
# 部署路径: 当为 ./ 时路由模式需为 hash
VITE_BASE = /
# 接口前缀:参见 axios 的 baseURL
diff --git a/README.md b/README.md
index 5e92645..c1d4e24 100644
--- a/README.md
+++ b/README.md
@@ -15,6 +15,7 @@
- 遵循 Conventional Changelog 规范, 自动生成版本记录文档
- 内置常用 VsCode 代码片段和推荐扩展,提升开发效率
- 支持路由动态打包、路由权限、路由缓存和动态首页
+- 支持 Docker 部署,包含优化过的 Dockerfile 配置
## 快速开始
diff --git a/index.html b/index.html
index 7433905..46ef5d1 100644
--- a/index.html
+++ b/index.html
@@ -9,16 +9,13 @@
-
-

-
欢迎访问%VITE_TITLE%
-
资源加载中, 请稍等...
+
diff --git a/public/assets/loading.svg b/public/assets/loading.svg
deleted file mode 100644
index a6d260f..0000000
--- a/public/assets/loading.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/scripts/vite/plugin-info.ts b/scripts/vite/plugin-info.ts
index c0f5dae..6aeaa69 100644
--- a/scripts/vite/plugin-info.ts
+++ b/scripts/vite/plugin-info.ts
@@ -1,5 +1,5 @@
import { spawn } from 'child_process';
-import { Plugin, ResolvedConfig } from 'vite';
+import { Plugin } from 'vite';
import pkg from '../../package.json';
/**
@@ -46,8 +46,11 @@ const getBuildInfo = async () => {
const version = commits ? `${latestTag}.${commits}` : `v${pkg.version}`;
const content = `欢迎访问!版本: ${version} 标识: ${hash} 构建: ${time}`;
const style = `"color: #09f; font-weight: 900;", "font-size: 12px; color: #09f; font-family: ''"`;
- const script = `console.log(\`%c${LOGO} \n%c${content}\n\`, ${style});\n`;
- return script;
+ const vString = `var __APP_VERSION__ = '${version}';\n`;
+ const hString = `var __APP_HASH__ = '${hash}';\n`;
+ const dString = `var __APP_DATE__ = '${time}';\n`;
+ const lString = `console.log(\`%c${LOGO} \n%c${content}\n\`, ${style});\n`;
+ return vString + hString + dString + lString;
};
/**
@@ -55,16 +58,9 @@ const getBuildInfo = async () => {
* @returns Plugin
*/
export default function plugin(): Plugin {
- let config: ResolvedConfig;
-
return {
name: 'vite:info',
enforce: 'pre',
-
- configResolved(resolvedConfig) {
- config = resolvedConfig;
- },
-
async transformIndexHtml() {
const script = await getBuildInfo();
return [
diff --git a/src/App.vue b/src/App.vue
index 05aecd5..bf25b10 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -18,6 +18,9 @@ const userStore = useUserStore();
const menuStore = useMenuStore();
const hasAuth = computed(() => {
+ if (!route.name.startsWith('_')) {
+ return true;
+ }
return route.matched.every(item => {
const needAuth = item.meta.auth;
const userAuth = userStore.auth;
diff --git a/src/api/instance/api.ts b/src/api/instance/api.ts
index 90e6151..1c2c7a5 100644
--- a/src/api/instance/api.ts
+++ b/src/api/instance/api.ts
@@ -1,8 +1,28 @@
-import { Service } from './service';
import { addToastInterceptor } from '../interceptors/toast';
import { addAuthInterceptor } from '../interceptors/auth';
import { addExceptionInterceptor } from '../interceptors/exception';
import { env } from '@/config/env';
+import { App } from 'vue';
+import { Api } from '../generated/Api';
+
+/**
+ * 扩展生成的API类
+ */
+export class Service extends Api
{
+ /**
+ * 作为VUE插件进行初始化
+ * @param app
+ */
+ install(app: App) {
+ app.config.globalProperties.$api = this;
+ }
+
+ /**
+ * 登陆过期处理函数
+ * @description 勿动
+ */
+ expireHandler: () => void = () => {};
+}
/**
* API 接口实例
diff --git a/src/api/instance/service.ts b/src/api/instance/service.ts
deleted file mode 100644
index 9e2b504..0000000
--- a/src/api/instance/service.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { App } from 'vue';
-import { Api } from '../generated/Api';
-
-/**
- * 扩展生成的API类
- */
-export class Service extends Api {
- /**
- * 登陆过期处理函数
- * @description 勿动
- */
- expireHandler: () => void = () => {};
-
- /**
- * 作为VUE插件进行初始化
- * @param app
- */
- install(app: App) {
- app.config.globalProperties.$api = this;
- }
-}
diff --git a/src/components/AnEditor/blocks/index.ts b/src/components/AnEditor/blocks/index.ts
index 883afd2..eb62bb0 100644
--- a/src/components/AnEditor/blocks/index.ts
+++ b/src/components/AnEditor/blocks/index.ts
@@ -1,6 +1,5 @@
import { InjectionKey } from 'vue';
import { Block, Blocker, Container } from '../core';
-import { useTextBlock } from './text';
const blockers: Record = import.meta.glob(['./*/index.ts', '!./font/*'], {
eager: true,
@@ -25,47 +24,3 @@ const getIcon = (type: string) => {
};
export { BlockerMap, getBlockerRender, getIcon, getTypeName };
-
-export const BlockerManagerKey = Symbol('k') as InjectionKey>
-
-export function useBlockerManage() {
- const blockers: Blocker[] = [useTextBlock()];
- const leftPanels: any[] = [];
-
- for (const blocker of blockers) {
- const panel = blocker.addLeftTab?.();
- if (panel) {
- leftPanels.push(leftPanels);
- }
- }
-
- const callInitHook = (container: Container) => {
- for (const blocker of blockers) {
- container = blocker.onLoadContainer?.(container) || container;
- }
- return container;
- };
-
- const callLoadHook = (data: any): Blocker => {
- for (const blocker of blockers) {
- data = blocker.onLoadBlock?.(data) || data;
- }
- return data;
- };
-
- const callSaveHook = (block: Block) => {
- let data = block;
- for (const blocker of blockers) {
- data = blocker.onSaveBlock?.(data) || data;
- }
- return data;
- };
-
- return {
- blockers,
- leftPanels,
- callInitHook,
- callLoadHook,
- callSaveHook,
- };
-}
diff --git a/src/components/AnEditor/blocks/text/index.ts b/src/components/AnEditor/blocks/text/index.ts
deleted file mode 100644
index 858cf34..0000000
--- a/src/components/AnEditor/blocks/text/index.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import { Block, Blocker, defineBlocker } from '../../core';
-import { font } from '../font';
-import { Text } from './interface';
-import Option from './option.vue';
-import Render from './render.vue';
-
-export default defineBlocker({
- type: 'text',
- icon: 'icon-park-outline-text',
- title: '文本组件',
- description: '文字',
- render: Render,
- option: Option,
- initial: {
- id: '',
- type: 'text',
- title: '',
- x: 0,
- y: 0,
- w: 300,
- h: 100,
- xFixed: false,
- yFixed: false,
- bgImage: '',
- bgColor: '',
- meta: {},
- actived: false,
- resizable: true,
- draggable: true,
- params: {
- marquee: false,
- speed: 100,
- direction: 'left',
- fontCh: {
- ...font,
- content:
- '温馨提示:乘客您好,进站检票时,持票卡的乘客请在右侧闸机上方感应区内验票,扫码过闸的乘客请将乘车码对准闸机扫码口,扇门打开后依次进闸。乘车过程中请妥善保管好车票,以免丢失。',
- },
- },
- },
-});
-
-export function useTextBlock(): Blocker {
- const initialData: Text = {
- id: '',
- type: 'text',
- title: '',
- x: 0,
- y: 0,
- w: 300,
- h: 100,
- xFixed: false,
- yFixed: false,
- bgImage: '',
- bgColor: '',
- meta: {},
- actived: false,
- resizable: true,
- draggable: true,
- params: {
- marquee: false,
- speed: 100,
- direction: 'left',
- fontCh: {
- ...font,
- content:
- '温馨提示:乘客您好,进站检票时,持票卡的乘客请在右侧闸机上方感应区内验票,扫码过闸的乘客请将乘车码对准闸机扫码口,扇门打开后依次进闸。乘车过程中请妥善保管好车票,以免丢失。',
- },
- },
- };
- return {
- type: 'text',
- icon: 'icon-park-outline-text',
- title: '文本组件',
- description: '文字',
- render: Render,
- option: Option,
- initial: initialData,
- addLeftTab() {
- return {
- title: '文本测试',
- icon: 'icon-park-outline-user',
- component: () => h('div', null, 'TODO')
- }
- },
- };
-}
diff --git a/src/components/AnEditor/blocks/text/index.tsx b/src/components/AnEditor/blocks/text/index.tsx
new file mode 100644
index 0000000..8b29c91
--- /dev/null
+++ b/src/components/AnEditor/blocks/text/index.tsx
@@ -0,0 +1,145 @@
+import { merge } from 'lodash-es';
+import { Block, Blocker, defineBlocker } from '../../core';
+import { BlockItem, Plugin } from '../../core/plugin';
+import { font } from '../font';
+import { Text } from './interface';
+import Option from './option.vue';
+import Render from './render.vue';
+import { Button } from '@arco-design/web-vue';
+
+export default defineBlocker({
+ type: 'text',
+ icon: 'icon-park-outline-text',
+ title: '文本组件',
+ description: '文字',
+ render: Render,
+ option: Option,
+ initial: {
+ id: '',
+ type: 'text',
+ title: '',
+ x: 0,
+ y: 0,
+ w: 300,
+ h: 100,
+ xFixed: false,
+ yFixed: false,
+ bgImage: '',
+ bgColor: '',
+ meta: {},
+ actived: false,
+ resizable: true,
+ draggable: true,
+ params: {
+ marquee: false,
+ speed: 100,
+ direction: 'left',
+ fontCh: {
+ ...font,
+ content:
+ '温馨提示:乘客您好,进站检票时,持票卡的乘客请在右侧闸机上方感应区内验票,扫码过闸的乘客请将乘车码对准闸机扫码口,扇门打开后依次进闸。乘车过程中请妥善保管好车票,以免丢失。',
+ },
+ },
+ },
+});
+
+const defaults: Text = {
+ id: '',
+ type: 'text',
+ title: '',
+ x: 0,
+ y: 0,
+ w: 300,
+ h: 100,
+ xFixed: false,
+ yFixed: false,
+ bgImage: '',
+ bgColor: '',
+ meta: {},
+ actived: false,
+ resizable: true,
+ draggable: true,
+ params: {
+ marquee: false,
+ speed: 100,
+ direction: 'left',
+ fontCh: {
+ ...font,
+ content: '温馨提示:乘客您好',
+ },
+ },
+};
+
+export const item: BlockItem = {
+ type: 'text',
+ icon: 'icon-park-outline-text',
+ title: '文本组件',
+ description: '文字',
+ editRender: Option,
+ viewRender: Render,
+ onInit: () => {
+ return merge({}, defaults);
+ },
+};
+
+export function TextBlock(): Plugin {
+ const defaults = {
+ id: '',
+ type: 'text',
+ title: '',
+ x: 0,
+ y: 0,
+ w: 300,
+ h: 100,
+ xFixed: false,
+ yFixed: false,
+ bgImage: '',
+ bgColor: '',
+ meta: {},
+ actived: false,
+ resizable: true,
+ draggable: true,
+ params: {
+ marquee: false,
+ speed: 100,
+ direction: 'left',
+ fontCh: {
+ ...font,
+ content: '温馨提示:乘客您好',
+ },
+ },
+ };
+ return {
+ name: 'TextBlockPlugin',
+ hrRender: {
+ name: 'TextDelete',
+ render() {
+ return (
+
+ );
+ },
+ },
+ hlRender: {
+ name: 'tip',
+ render() {
+ return 测试提示;
+ },
+ },
+ addBlockItem() {
+ return {
+ type: 'text',
+ icon: 'icon-park-outline-text',
+ title: '文本组件',
+ description: '文字',
+ onInit: () => merge({}, defaults),
+ editRender: Option,
+ viewRender: Render,
+ };
+ },
+ };
+}
diff --git a/src/components/AnEditor/components/Editor.vue b/src/components/AnEditor/components/Editor.vue
index 4dc57a9..6fdba49 100644
--- a/src/components/AnEditor/components/Editor.vue
+++ b/src/components/AnEditor/components/Editor.vue
@@ -2,41 +2,23 @@
-
+
-
+
@@ -44,7 +26,7 @@
import { delConfirm, sleep } from '@/utils';
import { Message } from '@arco-design/web-vue';
import { useVModel } from '@vueuse/core';
-import { Block, ContextMenuItem, EditorKey, useEditor } from '../core';
+import { Block, EditorKey, useEditor } from '../core';
import ContextMenu from './ContextMenu.vue';
import EditorSetting from './EditorConfig.vue';
import EditorHeader from './EditorHeader.vue';
@@ -52,6 +34,8 @@ import EditorLeft from './EditorLeft.vue';
import EditorMain from './EditorMain.vue';
import EditorPreview from './EditorPreview.vue';
import EditorRight from './EditorRight.vue';
+import { ContextKey, usePluginContext } from '../core/plugin';
+import { TextBlock } from '../blocks/text';
const props = defineProps({
visible: {
@@ -67,7 +51,10 @@ const showPreview = ref(false);
const showConfig = ref(false);
const saving = ref(false);
const editor = useEditor();
-const { container, blocks, currentBlock, addBlock, rmBlock, setCurrentBlock } = editor;
+const context = usePluginContext([TextBlock()]);
+const { container, addBlock, rmBlock, setCurrentBlock } = context;
+
+console.log({context});
const blockMenu = reactive<{ show: boolean; x: number; y: number; block: Block | null }>({
show: false,
@@ -76,7 +63,7 @@ const blockMenu = reactive<{ show: boolean; x: number; y: number; block: Block |
block: null,
});
-const blockMenuItems: ContextMenuItem[] = [
+const blockMenuItems: any[] = [
{
name: '删除',
icon: 'icon-park-outline-delete',
@@ -103,7 +90,7 @@ const onBlockContextMenu = (block: Block, e: MouseEvent) => {
const saveData = async () => {
const data = {
container: container.value,
- children: blocks.value,
+ children: container.value.children,
};
saving.value = true;
await sleep(3000);
@@ -120,7 +107,7 @@ const loadData = async () => {
}
const data = JSON.parse(str);
container.value = data.container;
- blocks.value = data.children;
+ container.value.children = data.children;
};
const onExit = async () => {
@@ -133,6 +120,7 @@ const onExit = async () => {
};
provide(EditorKey, editor);
+provide(ContextKey, context);
onMounted(loadData);
diff --git a/src/components/AnEditor/components/EditorConfig.vue b/src/components/AnEditor/components/EditorConfig.vue
index 3198ee5..ccd4f5b 100644
--- a/src/components/AnEditor/components/EditorConfig.vue
+++ b/src/components/AnEditor/components/EditorConfig.vue
@@ -46,9 +46,7 @@ const props = defineProps({
required: true,
},
});
-
const emit = defineEmits(['update:visible', 'update:modelValue']);
-
const show = useVModel(props, 'visible', emit);
const model = useVModel(props, 'modelValue', emit);
diff --git a/src/components/AnEditor/components/EditorHeader.vue b/src/components/AnEditor/components/EditorHeader.vue
index 2fb3711..d13bb07 100644
--- a/src/components/AnEditor/components/EditorHeader.vue
+++ b/src/components/AnEditor/components/EditorHeader.vue
@@ -9,11 +9,13 @@
+