diff --git a/src/core/XSystem.ts b/src/core/XSystem.ts index e588e08..39485ab 100644 --- a/src/core/XSystem.ts +++ b/src/core/XSystem.ts @@ -1,12 +1,7 @@ -import ProcessManageImpl from './process/impl/ProcessManageImpl.ts' import ProcessImpl from './process/impl/ProcessImpl.ts' import { isUndefined } from 'lodash' import { BasicSystemProcess } from '@/core/system/BasicSystemProcess.ts' import { DesktopProcess } from '@/core/desktop/DesktopProcess.ts' -import type { IAllEvent } from '@/core/events/EventTypes.ts' -import type { IEventBuilder } from '@/core/events/IEventBuilder.ts' -import { EventBuilderImpl } from '@/core/events/impl/EventBuilderImpl.ts' -import type { IProcessManage } from '@/core/process/IProcessManage.ts' import type { IProcess } from '@/core/process/IProcess.ts' import type { IProcessInfo } from '@/core/process/IProcessInfo.ts' import { ObservableWeakRefImpl } from '@/core/state/impl/ObservableWeakRefImpl.ts' @@ -15,6 +10,7 @@ import { NotificationService } from '@/core/service/services/NotificationService import { SettingsService } from '@/core/service/services/SettingsService.ts' import { WindowFormService } from '@/core/service/services/WindowFormService.ts' import { UserService } from '@/core/service/services/UserService.ts' +import { processManager } from '@/core/process/ProcessManager.ts' interface IGlobalState { isLogin: boolean @@ -23,8 +19,6 @@ interface IGlobalState { export default class XSystem { private static _instance: XSystem = new XSystem() - private _processManage: IProcessManage = new ProcessManageImpl() - private _eventManage: IEventBuilder = new EventBuilderImpl() private _globalState: IObservable = new ObservableWeakRefImpl({ isLogin: false }) @@ -41,12 +35,6 @@ export default class XSystem { public static get instance() { return this._instance } - public get processManage() { - return this._processManage - } - public get eventManage() { - return this._eventManage - } public get globalState() { return this._globalState } @@ -69,14 +57,14 @@ export default class XSystem { proc: string | IProcessInfo, constructor?: new (info: IProcessInfo) => T, ): Promise { - let info = typeof proc === 'string' ? this._processManage.findProcessInfoByName(proc)! : proc + let info = typeof proc === 'string' ? processManager.findProcessInfoByName(proc)! : proc if (isUndefined(info)) { throw new Error(`未找到进程信息:${proc}`) } // 是单例应用 if (info.singleton) { - let process = this._processManage.findProcessByName(info.name) + let process = processManager.findProcessByName(info.name) if (process) { return process as T } diff --git a/src/core/desktop/DesktopProcess.ts b/src/core/desktop/DesktopProcess.ts index 4dcb7f7..79571a0 100644 --- a/src/core/desktop/DesktopProcess.ts +++ b/src/core/desktop/DesktopProcess.ts @@ -1,13 +1,12 @@ import ProcessImpl from '@/core/process/impl/ProcessImpl.ts' -import type { ProcessInfoImpl } from '@/core/process/impl/ProcessInfoImpl.ts' -import XSystem from '@/core/XSystem.ts' import { BasicSystemProcess } from '@/core/system/BasicSystemProcess.ts' import { createApp, h } from 'vue' import DesktopComponent from '@/core/desktop/ui/DesktopComponent.vue' import { naiveUi } from '@/core/common/naive-ui/components.ts' -import { DesktopEventEnum } from '@/core/events/EventTypes.ts' import { debounce } from 'lodash' import type { IProcessInfo } from '@/core/process/IProcessInfo.ts' +import { eventManager } from '@/core/events/EventManager.ts' +import { processManager } from '@/core/process/ProcessManager.ts' export class DesktopProcess extends ProcessImpl { private _desktopRootDom: HTMLElement; @@ -23,7 +22,7 @@ export class DesktopProcess extends ProcessImpl { return this._isMounted; } public get basicSystemProcess() { - return XSystem.instance.processManage.findProcessByName('basic-system') + return processManager.findProcessByName('basic-system') } public get width() { @@ -58,15 +57,11 @@ export class DesktopProcess extends ProcessImpl { if (this._pendingResize) { this._pendingResize = false; console.log('onDesktopRootDomResize') - this.eventManages.notifyEvent(DesktopEventEnum.onDesktopRootDomResize, this._width, this._height); + eventManager.notifyEvent('onDesktopRootDomResize', this._width, this._height); } }); } - private get eventManages() { - return XSystem.instance.eventManage; - } - constructor(info: IProcessInfo) { super(info) console.log('DesktopProcess') diff --git a/src/core/desktop/ui/DesktopComponent.vue b/src/core/desktop/ui/DesktopComponent.vue index e7bf7e8..cb16caf 100644 --- a/src/core/desktop/ui/DesktopComponent.vue +++ b/src/core/desktop/ui/DesktopComponent.vue @@ -24,18 +24,16 @@ import type { DesktopProcess } from '@/core/desktop/DesktopProcess.ts' import XSystem from '@/core/XSystem.ts' import { notificationApi } from '@/core/common/naive-ui/discrete-api.ts' import { configProviderProps } from '@/core/common/naive-ui/theme.ts' -import { DesktopEventEnum } from '@/core/events/EventTypes.ts' import { useDesktopInit } from '@/core/desktop/ui/hooks/useDesktopInit.ts' import AppIcon from '@/core/desktop/ui/components/AppIcon.vue' -import { watch } from 'vue' import type { IDesktopAppIcon } from '@/core/desktop/types/IDesktopAppIcon.ts' +import { eventManager } from '@/core/events/EventManager.ts' const props = defineProps<{ process: DesktopProcess }>() const { appIconsRef, gridStyle, gridTemplate } = useDesktopInit('.desktop-icons-container') -XSystem.instance.eventManage.addEventListener( - DesktopEventEnum.onDesktopRootDomResize, +eventManager.addEventListener('onDesktopRootDomResize', (width, height) => { console.log(width, height) notificationApi.create({ diff --git a/src/core/desktop/ui/components/AppIcon.vue b/src/core/desktop/ui/components/AppIcon.vue index 87bda19..6d0c0f0 100644 --- a/src/core/desktop/ui/components/AppIcon.vue +++ b/src/core/desktop/ui/components/AppIcon.vue @@ -13,8 +13,7 @@ diff --git a/src/core/desktop/ui/hooks/useDesktopInit.ts b/src/core/desktop/ui/hooks/useDesktopInit.ts index 388f7db..385b317 100644 --- a/src/core/desktop/ui/hooks/useDesktopInit.ts +++ b/src/core/desktop/ui/hooks/useDesktopInit.ts @@ -1,4 +1,3 @@ -import XSystem from '@/core/XSystem.ts' import type { IDesktopAppIcon } from '@/core/desktop/types/IDesktopAppIcon.ts' import { computed, @@ -14,9 +13,9 @@ import { watch, watchEffect, } from 'vue' -import { DesktopEventEnum } from '@/core/events/EventTypes.ts' -import { useDraggable } from '@vueuse/core' import type { IGridTemplateParams } from '@/core/desktop/types/IGridTemplateParams.ts' +import { eventManager } from '@/core/events/EventManager.ts' +import { processManager } from '@/core/process/ProcessManager.ts' export function useDesktopInit(containerStr: string) { let container:HTMLElement @@ -60,7 +59,7 @@ export function useDesktopInit(containerStr: string) { }) // 有桌面图标的app - const appInfos = XSystem.instance.processManage.processInfos.filter(processInfo => !processInfo.isJustProcess) + const appInfos = processManager.processInfos.filter(processInfo => !processInfo.isJustProcess) const oldAppIcons: IDesktopAppIcon[] = JSON.parse(localStorage.getItem('desktopAppIconInfo') || '[]') const appIcons: IDesktopAppIcon[] = appInfos.map((processInfo, index) => { const oldAppIcon = oldAppIcons.find(oldAppIcon => oldAppIcon.name === processInfo.name) @@ -89,7 +88,7 @@ export function useDesktopInit(containerStr: string) { exceedApp.value = hideAppIcons }) - XSystem.instance.eventManage.addEventListener(DesktopEventEnum.onDesktopAppIconPos, (iconInfo) => { + eventManager.addEventListener('onDesktopAppIconPos', (iconInfo) => { localStorage.setItem('desktopAppIconInfo', JSON.stringify(toValue(appIconsRef.value))) }) diff --git a/src/core/events/EventManager.ts b/src/core/events/EventManager.ts new file mode 100644 index 0000000..6b63a22 --- /dev/null +++ b/src/core/events/EventManager.ts @@ -0,0 +1,35 @@ +import { EventBuilderImpl } from '@/core/events/impl/EventBuilderImpl.ts' +import type { IEventMap } from '@/core/events/IEventBuilder.ts' +import type { IDesktopAppIcon } from '@/core/desktop/types/IDesktopAppIcon.ts' + +export const eventManager = new EventBuilderImpl() + +/** + * 系统进程的事件 + * @description + *

onAuthChange - 认证状态改变

+ *

onThemeChange - 主题改变

+ */ +export interface IBasicSystemEvent extends IEventMap { + /** 认证状态改变 */ + onAuthChange: () => {}, + /** 主题改变 */ + onThemeChange: (theme: string) => void +} + +/** + * 桌面进程的事件 + * @description + *

onDesktopRootDomResize - 桌面根dom尺寸改变

+ *

onDesktopProcessInitialize - 桌面进程初始化完成

+ */ +export interface IDesktopEvent extends IEventMap { + /** 桌面根dom尺寸改变 */ + onDesktopRootDomResize: (width: number, height: number) => void + /** 桌面进程初始化完成 */ + onDesktopProcessInitialize: () => void + /** 桌面应用图标位置改变 */ + onDesktopAppIconPos: (iconInfo: IDesktopAppIcon) => void +} + +export interface IAllEvent extends IDesktopEvent, IBasicSystemEvent {} diff --git a/src/core/events/EventTypes.ts b/src/core/events/EventTypes.ts deleted file mode 100644 index da80ade..0000000 --- a/src/core/events/EventTypes.ts +++ /dev/null @@ -1,63 +0,0 @@ -import type { IEventMap } from '@/core/events/IEventBuilder.ts' -import type { IDesktopAppIcon } from '@/core/desktop/types/IDesktopAppIcon.ts' - -/** - * 基础系统进程事件枚举 - * @description - *

onAuthenticationChange - 认证状态改变

- *

onBasicSystemProcessInitialize - 主题改变

- */ -export enum BasicSystemEventEnum { - /** 基础系统进程初始化完成 */ - onBasicSystemProcessInitialize = 'onBasicSystemProcessInitialize', - /** 认证状态改变 */ - onAuthChange = 'onAuthChange', - /** 主题改变 */ - onThemeChange = 'onThemeChange' -} - -/** - * 系统进程的事件 - * @description - *

onAuthChange - 认证状态改变

- *

onThemeChange - 主题改变

- */ -export interface IBasicSystemEvent extends IEventMap { - /** 认证状态改变 */ - [BasicSystemEventEnum.onAuthChange]: () => {}, - /** 主题改变 */ - [BasicSystemEventEnum.onThemeChange]: (theme: string) => void -} - -/** - * 桌面进程事件枚举 - * @description - *

onDesktopRootDomResize - 桌面根dom尺寸改变

- *

onDesktopProcessInitialize - 桌面进程初始化完成

- */ -export enum DesktopEventEnum { - /** 桌面进程初始化完成 */ - onDesktopRootDomResize = 'onDesktopRootDomResize', - /** 桌面进程初始化完成 */ - onDesktopProcessInitialize = 'onDesktopProcessInitialize', - /** 桌面应用图标位置改变 */ - onDesktopAppIconPos = 'onDesktopAppIconPos' -} - - -/** - * 桌面进程的事件 - * @description - *

onDesktopRootDomResize - 桌面根dom尺寸改变

- *

onDesktopProcessInitialize - 桌面进程初始化完成

- */ -export interface IDesktopEvent extends IEventMap { - /** 桌面根dom尺寸改变 */ - [DesktopEventEnum.onDesktopRootDomResize]: (width: number, height: number) => void - /** 桌面进程初始化完成 */ - [DesktopEventEnum.onDesktopProcessInitialize]: () => void - /** 桌面应用图标位置改变 */ - [DesktopEventEnum.onDesktopAppIconPos]: (iconInfo: IDesktopAppIcon) => void -} - -export interface IAllEvent extends IDesktopEvent, IBasicSystemEvent {} diff --git a/src/core/process/IProcessManage.ts b/src/core/process/IProcessManager.ts similarity index 96% rename from src/core/process/IProcessManage.ts rename to src/core/process/IProcessManager.ts index c189d31..f03964a 100644 --- a/src/core/process/IProcessManage.ts +++ b/src/core/process/IProcessManager.ts @@ -5,7 +5,7 @@ import type { IProcessInfo } from '@/core/process/IProcessInfo.ts' /** * 进程管理 */ -export interface IProcessManage { +export interface IProcessManager { /** 所有进程信息 */ get processInfos(): IProcessInfo[]; /** diff --git a/src/core/process/ProcessManager.ts b/src/core/process/ProcessManager.ts new file mode 100644 index 0000000..c3fe652 --- /dev/null +++ b/src/core/process/ProcessManager.ts @@ -0,0 +1,3 @@ +import ProcessManagerImpl from '@/core/process/impl/ProcessManagerImpl.ts' + +export const processManager = new ProcessManagerImpl(); diff --git a/src/core/process/impl/ProcessImpl.ts b/src/core/process/impl/ProcessImpl.ts index cb0de53..ce343b1 100644 --- a/src/core/process/impl/ProcessImpl.ts +++ b/src/core/process/impl/ProcessImpl.ts @@ -1,9 +1,9 @@ import { v4 as uuidV4 } from 'uuid'; -import XSystem from '../../XSystem.ts' import WindowFormImpl from '../../window/impl/WindowFormImpl.ts' import type { IProcess } from '@/core/process/IProcess.ts' import type { IProcessInfo } from '@/core/process/IProcessInfo.ts' import type { IWindowForm } from '@/core/window/IWindowForm.ts' +import { processManager } from '@/core/process/ProcessManager.ts' /** * 进程 @@ -30,7 +30,7 @@ export default class ProcessImpl implements IProcess { const startName = info.startName; - XSystem.instance.processManage.registerProcess(this); + processManager.registerProcess(this); // 通过设置 isJustProcess 为 true,则不会创建窗体 if (!info.isJustProcess) { this.openWindowForm(startName) diff --git a/src/core/process/impl/ProcessManageImpl.ts b/src/core/process/impl/ProcessManagerImpl.ts similarity index 94% rename from src/core/process/impl/ProcessManageImpl.ts rename to src/core/process/impl/ProcessManagerImpl.ts index 8ef9784..0d42f88 100644 --- a/src/core/process/impl/ProcessManageImpl.ts +++ b/src/core/process/impl/ProcessManagerImpl.ts @@ -3,14 +3,14 @@ import { ProcessInfoImpl } from '@/core/process/impl/ProcessInfoImpl.ts' import { BasicSystemProcessInfo } from '@/core/system/BasicSystemProcessInfo.ts' import { DesktopProcessInfo } from '@/core/desktop/DesktopProcessInfo.ts' import type { IAppProcessInfoParams } from '@/core/process/types/IAppProcessInfoParams.ts' -import type { IProcessManage } from '@/core/process/IProcessManage.ts' +import type { IProcessManager } from '@/core/process/IProcessManager.ts' import type { IProcess } from '@/core/process/IProcess.ts' import type { IProcessInfo } from '@/core/process/IProcessInfo.ts' /** * 进程管理 */ -export default class ProcessManageImpl implements IProcessManage { +export default class ProcessManagerImpl implements IProcessManager { private _processPool: Map = new Map(); private _processInfos: IProcessInfo[] = new Array(); diff --git a/src/core/service/kernel/EventService.ts b/src/core/service/kernel/EventService.ts deleted file mode 100644 index e177c4a..0000000 --- a/src/core/service/kernel/EventService.ts +++ /dev/null @@ -1,98 +0,0 @@ -/** - * 事件定义 - * @interface IEventMap 事件定义 键是事件名称,值是事件处理函数 - */ -export interface IEventMap { - [key: string]: (...args: any[]) => void -} - -interface HandlerWrapper any> { - fn: T - once: boolean -} - -export class EventService { - private _eventHandlers = new Map>>() - - /** - * 添加事件监听器 - * @param eventName 事件名称 - * @param handler 监听器 - * @param options { immediate: 立即执行一次 immediateArgs: 立即执行的参数 once: 只监听一次 } - * @example - * eventBus.addEventListener('noArgs', () => {}) - * eventBus.addEventListener('greet', name => {}, { immediate: true, immediateArgs: ['abc'] }) - * eventBus.addEventListener('onResize', (w, h) => {}, { immediate: true, immediateArgs: [1, 2] }) - */ - addEventListener( - eventName: E, - handler: F, - options?: { - immediate?: boolean; - immediateArgs?: Parameters; - once?: boolean; - }, - ) { - if (!handler) return - if (!this._eventHandlers.has(eventName)) { - this._eventHandlers.set(eventName, new Set>()) - } - - const set = this._eventHandlers.get(eventName)! - if (![...set].some((wrapper) => wrapper.fn === handler)) { - set.add({ fn: handler, once: options?.once ?? false }) - } - - if (options?.immediate) { - try { - handler(...(options.immediateArgs ?? [])) - } catch (e) { - console.error(e) - } - } - } - - /** - * 移除事件监听器 - * @param eventName 事件名称 - * @param handler 监听器 - * @example - * eventBus.removeEventListener('noArgs', () => {}) - */ - removeEventListener(eventName: E, handler: F) { - const set = this._eventHandlers.get(eventName) - if (!set) return - - for (const wrapper of set) { - if (wrapper.fn === handler) { - set.delete(wrapper) - } - } - } - - /** - * 通知事件 - * @param eventName 事件名称 - * @param args 参数 - * @example - * eventBus.notifyEvent('noArgs') - * eventBus.notifyEvent('greet', 'Alice') - * eventBus.notifyEvent('onResize', 1, 2) - */ - notifyEvent(eventName: E, ...args: Parameters) { - if (!this._eventHandlers.has(eventName)) return - - const set = this._eventHandlers.get(eventName)! - for (const wrapper of set) { - try { - wrapper.fn(...args) - } catch (e) { - console.error(e) - } - - if (wrapper.once) { - set.delete(wrapper) - } - } - } -} diff --git a/src/core/service/services/UserService.ts b/src/core/service/services/UserService.ts index f6c87b9..f40da05 100644 --- a/src/core/service/services/UserService.ts +++ b/src/core/service/services/UserService.ts @@ -1,6 +1,18 @@ import { AService } from '@/core/service/kernel/AService.ts' +import type { IObservable } from '@/core/state/IObservable.ts' + +interface IUserInfo { + id: string; + name: string; + token: string; +} export class UserService extends AService { + private _userInfo: IObservable; + get userInfo() { + return this._userInfo; + } + constructor() { super("UserService"); console.log("UserService - 服务注册") diff --git a/src/core/state/impl/ObservableImpl.ts b/src/core/state/impl/ObservableImpl.ts index d561496..1dbbd49 100644 --- a/src/core/state/impl/ObservableImpl.ts +++ b/src/core/state/impl/ObservableImpl.ts @@ -73,7 +73,7 @@ import type { * // 9️⃣ 销毁 ObservableImpl * obs.dispose() */ -export class Observable> implements IObservable { +export class ObservableImpl> implements IObservable { /** Observable 状态对象,深层 Proxy */ public readonly state: TObservableState diff --git a/src/core/window/impl/WindowFormImpl.ts b/src/core/window/impl/WindowFormImpl.ts index b72074d..8920dbc 100644 --- a/src/core/window/impl/WindowFormImpl.ts +++ b/src/core/window/impl/WindowFormImpl.ts @@ -4,6 +4,7 @@ import type { IProcess } from '@/core/process/IProcess.ts' import type { IWindowForm } from '@/core/window/IWindowForm.ts' import type { IWindowFormConfig } from '@/core/window/types/IWindowFormConfig.ts' import type { WindowFormPos } from '@/core/window/types/WindowFormTypes.ts' +import { processManager } from '@/core/process/ProcessManager.ts' export default class WindowFormImpl implements IWindowForm { private readonly _id: string = uuidV4(); @@ -16,7 +17,7 @@ export default class WindowFormImpl implements IWindowForm { return this._id; } public get proc() { - return XSystem.instance.processManage.findProcessById(this._procId) + return processManager.findProcessById(this._procId) } private get desktopRootDom() { return XSystem.instance.desktopRootDom;