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 @@
-
- loading -

欢迎访问%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 @@ +
+