From ec4ed10afdc82e7e3d5ad8dd3dcc3341027169a3 Mon Sep 17 00:00:00 2001 From: Miao_Spring <539943419@qq.com> Date: Thu, 5 Sep 2024 00:10:36 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat:=201.=E6=8F=92=E4=BB=B6=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E6=97=B6=E4=BC=9A=E6=9C=89=E5=85=A8=E5=B1=80=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E3=80=822.=E9=87=8D=E5=91=BD=E5=90=8DmiaoMessageProvi?= =?UTF-8?q?der=E4=B8=BAmiaoAlertTipProvider?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 17 +- src/class/PluginCenter.ts | 203 ++++--- ...eProvider.vue => miaoAlertTipProvider.vue} | 16 +- src/hooks/init.ts | 5 +- src/hooks/init/initPlugin.ts | 35 +- src/hooks/useMiaoFetchApi.ts | 521 +++++++++--------- src/hooks/usePluginCenter.ts | 8 +- src/plugins/miaoCodeMirror/miaoCodeMirror.vue | 23 +- src/plugins/miaoCrypto/miaoCrypto.vue | 79 ++- src/plugins/miaoCrypto/workers/aes-worker.ts | 1 - src/plugins/miaoImages/miaoImages.vue | 6 +- src/plugins/miaoMarkdown/miaoMarkdown.vue | 2 +- src/plugins/miaoPDF/miaoPDF.vue | 4 +- src/plugins/miaoPluginTemplate/template.vue | 8 +- src/types/fetch.ts | 10 +- src/types/type.ts | 8 + 16 files changed, 481 insertions(+), 465 deletions(-) rename src/components/{miaoMessageProvider.vue => miaoAlertTipProvider.vue} (92%) diff --git a/src/App.vue b/src/App.vue index bce09de..9aaab10 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,5 @@ + @@ -199,6 +207,7 @@ onMounted(async () => { + diff --git a/src/class/PluginCenter.ts b/src/class/PluginCenter.ts index 04145ee..32e440e 100644 --- a/src/class/PluginCenter.ts +++ b/src/class/PluginCenter.ts @@ -1,124 +1,109 @@ -import useVirtualPages from '@/hooks/useVirtualPages' -import VirtualDirectory, { VirtualFile } from './VirtualDirectory' -import { ShallowRef, shallowRef } from 'vue' +import useVirtualPages from "@/hooks/useVirtualPages"; +import VirtualDirectory, { VirtualFile } from "./VirtualDirectory"; +import { ShallowRef, shallowRef } from "vue"; +import { alertTipType } from "@/types/type"; export enum PluginGroup { - default = 'default', - mainMenu = 'mainMenu' + default = "default", + mainMenu = "mainMenu" } export interface registerComponentOption { - key: string - name: string - icon?: any - getComponent: () => Promise - group?: PluginGroup[] - filter: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[]) => boolean - disable?: boolean - exitConfirm?: boolean + key: string; + name: string; + icon?: any; + getComponent: () => Promise; + group?: PluginGroup[]; + filter: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[]) => boolean; + disable?: boolean; + exitConfirm?: boolean; } type Plugin = { - // 用于显示的名字 - name: string - // 代表插件的icon - icon?: ShallowRef - // 是否禁用插件 - disable: boolean - // 插件所属的group,用于区分插件使用的场合 - group: PluginGroup[] - // 判断在未禁用时是否可以使用这个组件 - // 使用组件即调用下面的func - filter: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[]) => boolean - func: ( - VDirectories: VirtualDirectory[], - VFiles: VirtualFile[], - ...args: any[] - ) => void -} + // 用于显示的名字 + name: string; + // 代表插件的icon + icon?: ShallowRef; + // 是否禁用插件 + disable: boolean; + // 插件所属的group,用于区分插件使用的场合 + group: PluginGroup[]; + // 判断在未禁用时是否可以使用这个组件 + // 使用组件即调用下面的func + filter: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[]) => boolean; + func: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[], ...args: any[]) => void; +}; export default class PluginCenter { - constructor() { - this.pluginsMap = {} - } - pluginsMap: { - [key: string]: Plugin - } + constructor(globalAlertTip: alertTipType) { + this.pluginsMap = {}; + this.globalAlertTip = globalAlertTip; + } + pluginsMap: { + [key: string]: Plugin; + }; - register(key: string, plugin: Plugin) { - this.pluginsMap[key] = plugin - } + globalAlertTip: alertTipType; - /** - * 便捷地注册一个组件为插件,触发时直接用新页面打开 - */ - registerComponent(option: registerComponentOption): void { - const { - key, - name, - getComponent, - icon, - filter, - group = [PluginGroup.default], - disable = false, - exitConfirm = false - } = option - let _component: any - const views = useVirtualPages() - this.register(key, { - name, - filter, - icon: shallowRef(icon), - group, - disable, - func: async ( - VDirectories: VirtualDirectory[], - VFiles: VirtualFile[] - ) => { - if (filter(VDirectories, VFiles) === false) { - return - } - if (_component === undefined) _component = await getComponent() - views.push(_component, VDirectories, VFiles, { - VirtualPageOption: { - exitConfirm - } - }) - } - }) - } + register(key: string, plugin: Plugin) { + this.pluginsMap[key] = plugin; + } - getUsablePlugin( - VDirectories: VirtualDirectory[], - VFiles: VirtualFile[], - option?: { - group?: PluginGroup[] - } - ) { - const { group = [PluginGroup.default] } = option ?? {} - const usableList = [] - for (let key of Object.keys(this.pluginsMap)) { - const _plugin = this.pluginsMap[key] - if ( - !_plugin.disable && - _plugin.group.filter((v) => group.includes(v)).length > 0 && - _plugin.filter(VDirectories, VFiles) - ) { - usableList.push(key) - } - } - return usableList.map((key) => ({ - key, - ...this.pluginsMap[key] - })) - } + /** + * 便捷地注册一个组件为插件,触发时直接用新页面打开 + */ + registerComponent(option: registerComponentOption): void { + const { key, name, getComponent, icon, filter, group = [PluginGroup.default], disable = false, exitConfirm = false } = option; + let _component: any; + const views = useVirtualPages(); + this.register(key, { + name, + filter, + icon: shallowRef(icon), + group, + disable, + func: async (VDirectories: VirtualDirectory[], VFiles: VirtualFile[]) => { + if (filter(VDirectories, VFiles) === false) { + return; + } - usePlugin( - key: string, - VDirectories?: VirtualDirectory[], - VFiles?: VirtualFile[], - ...args: any[] - ) { - this.pluginsMap[key].func(VDirectories ?? [], VFiles ?? [], ...args) - } + const setAlertTip = key !== 'miaoDirectory' && this.globalAlertTip(`加载 ${name} 插件中`); + if (_component === undefined) _component = await getComponent(); + setAlertTip && setAlertTip(`加载 ${name} 插件完成`, { + type: "success", + timeout: 2000 + }); + views.push(_component, VDirectories, VFiles, { + VirtualPageOption: { + exitConfirm + } + }); + } + }); + } + + getUsablePlugin( + VDirectories: VirtualDirectory[], + VFiles: VirtualFile[], + option?: { + group?: PluginGroup[]; + } + ) { + const { group = [PluginGroup.default] } = option ?? {}; + const usableList = []; + for (let key of Object.keys(this.pluginsMap)) { + const _plugin = this.pluginsMap[key]; + if (!_plugin.disable && _plugin.group.filter(v => group.includes(v)).length > 0 && _plugin.filter(VDirectories, VFiles)) { + usableList.push(key); + } + } + return usableList.map(key => ({ + key, + ...this.pluginsMap[key] + })); + } + + usePlugin(key: string, VDirectories?: VirtualDirectory[], VFiles?: VirtualFile[], ...args: any[]) { + this.pluginsMap[key].func(VDirectories ?? [], VFiles ?? [], ...args); + } } diff --git a/src/components/miaoMessageProvider.vue b/src/components/miaoAlertTipProvider.vue similarity index 92% rename from src/components/miaoMessageProvider.vue rename to src/components/miaoAlertTipProvider.vue index 5210b2e..f5cba1e 100644 --- a/src/components/miaoMessageProvider.vue +++ b/src/components/miaoAlertTipProvider.vue @@ -18,12 +18,7 @@ import generateId from '@/hooks/generateId'; import { NIcon } from 'naive-ui'; import { computed, onMounted, ref, shallowReactive } from 'vue'; import { InformationCircle, CheckmarkCircle, CloseCircle } from '@vicons/ionicons5' - -interface MessageOptions { - type?: 'info' | 'success' | 'error' - timeout?: number - id?: number -} +import { AlertTipMessageOptions } from '@/types/type'; interface Message { icon: any, @@ -48,7 +43,7 @@ const messageList = computed(() => { ...messageMap[v], })) }) -const message = (content: string, options?: MessageOptions) => { +const alertTip = (content: string, options?: AlertTipMessageOptions) => { let timer: any const { timeout = 0, type = 'info', id = generateId() } = options ?? {} if (timeout > 0) { @@ -63,10 +58,10 @@ const message = (content: string, options?: MessageOptions) => { content, timer } - return (newContent: string, newOptions?: MessageOptions) => { + return (newContent: string, newOptions?: AlertTipMessageOptions) => { newOptions = newOptions ?? {} newOptions.id = id - message(newContent, newOptions) + alertTip(newContent, newOptions) } } @@ -86,7 +81,7 @@ onMounted(async () => { }) -defineExpose({ message }); +defineExpose({ alertTip });