diff --git a/src/core/XSystem.ts b/src/core/XSystem.ts index a36ae27..6282f18 100644 --- a/src/core/XSystem.ts +++ b/src/core/XSystem.ts @@ -1,18 +1,20 @@ -import ProcessManages from './process/ProcessManages.ts' -import AppProcess from './process/AppProcess.ts' -import type { AppProcessInfo } from '@/core/process/AppProcessInfo.ts' +import ProcessManageImpl from './process/impl/ProcessManageImpl.ts' +import ProcessImpl from './process/impl/ProcessImpl.ts' +import type { ProcessInfoImpl } from '@/core/process/impl/ProcessInfoImpl.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' export default class XSystem { private static _instance: XSystem = new XSystem() - private _processManages: ProcessManages = new ProcessManages() - private _eventManages: IEventBuilder = new EventBuilderImpl() + private _processManage: IProcessManage = new ProcessManageImpl() + private _eventManage: IEventBuilder = new EventBuilderImpl() constructor() { console.log('XSystem') @@ -21,11 +23,11 @@ export default class XSystem { public static get instance() { return this._instance } - public get processManages() { - return this._processManages + public get processManage() { + return this._processManage } - public get eventManages() { - return this._eventManages + public get eventManage() { + return this._eventManage } public initialization(dom: HTMLDivElement) { @@ -37,25 +39,25 @@ export default class XSystem { } // 运行进程 - public async run( - proc: string | AppProcessInfo, - constructor?: new (info: AppProcessInfo) => T, + public async run( + proc: string | ProcessInfoImpl, + constructor?: new (info: ProcessInfoImpl) => T, ): Promise { - let info = typeof proc === 'string' ? this._processManages.findProcessInfoByName(proc) : proc + let info = typeof proc === 'string' ? this._processManage.findProcessInfoByName(proc) : proc if (isUndefined(info)) { throw new Error(`未找到进程信息:${proc}`) } // 是单例应用 if (info.singleton) { - let process = this._processManages.findProcessByName(info.name) + let process = this._processManage.findProcessByName(info.name) if (process) { return process as T } } // 创建进程 - let process = isUndefined(constructor) ? new AppProcess(info) : new constructor(info) + let process = isUndefined(constructor) ? new ProcessImpl(info) : new constructor(info) return process as T } diff --git a/src/core/common/types/Version.ts b/src/core/common/types/IVersion.ts similarity index 90% rename from src/core/common/types/Version.ts rename to src/core/common/types/IVersion.ts index fc18b6f..dfc88d3 100644 --- a/src/core/common/types/Version.ts +++ b/src/core/common/types/IVersion.ts @@ -1,7 +1,7 @@ /** * 版本信息 */ -export interface Version { +export interface IVersion { /** * 公司名称 */ diff --git a/src/core/desktop/DesktopProcess.ts b/src/core/desktop/DesktopProcess.ts index 09d9d83..01f389b 100644 --- a/src/core/desktop/DesktopProcess.ts +++ b/src/core/desktop/DesktopProcess.ts @@ -1,5 +1,5 @@ -import AppProcess from '@/core/process/AppProcess.ts' -import type { AppProcessInfo } from '@/core/process/AppProcessInfo.ts' +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' @@ -8,7 +8,7 @@ import { naiveUi } from '@/core/common/naive-ui/components.ts' import { DesktopEventEnum } from '@/core/events/EventTypes.ts' import { debounce } from 'lodash' -export class DesktopProcess extends AppProcess { +export class DesktopProcess extends ProcessImpl { private _desktopRootDom: HTMLElement; private _isMounted: boolean = false; private _width: number = 0; @@ -22,7 +22,7 @@ export class DesktopProcess extends AppProcess { return this._isMounted; } public get basicSystemProcess() { - return XSystem.instance.processManages.findProcessByName('basic-system') + return XSystem.instance.processManage.findProcessByName('basic-system') } public get width() { @@ -63,10 +63,10 @@ export class DesktopProcess extends AppProcess { } private get eventManages() { - return XSystem.instance.eventManages; + return XSystem.instance.eventManage; } - constructor(info: AppProcessInfo) { + constructor(info: ProcessInfoImpl) { super(info) console.log('DesktopProcess') } diff --git a/src/core/desktop/DesktopProcessInfo.ts b/src/core/desktop/DesktopProcessInfo.ts index 15a3a65..4c4d731 100644 --- a/src/core/desktop/DesktopProcessInfo.ts +++ b/src/core/desktop/DesktopProcessInfo.ts @@ -1,6 +1,6 @@ -import { AppProcessInfo } from '@/core/process/AppProcessInfo.ts' +import { ProcessInfoImpl } from '@/core/process/impl/ProcessInfoImpl.ts' -export const DesktopProcessInfo = new AppProcessInfo({ +export const DesktopProcessInfo = new ProcessInfoImpl({ name: 'desktop', title: '桌面', version: { diff --git a/src/core/desktop/ui/DesktopComponent.vue b/src/core/desktop/ui/DesktopComponent.vue index 245bf62..417823e 100644 --- a/src/core/desktop/ui/DesktopComponent.vue +++ b/src/core/desktop/ui/DesktopComponent.vue @@ -30,7 +30,7 @@ const props = defineProps<{ process: DesktopProcess }>() const { appIconsRef, gridStyle, gridTemplate } = useDesktopInit('.desktop-container') -XSystem.instance.eventManages.addEventListener( +XSystem.instance.eventManage.addEventListener( DesktopEventEnum.onDesktopRootDomResize, (width, height) => { console.log(width, height) diff --git a/src/core/desktop/ui/components/AppIcon.vue b/src/core/desktop/ui/components/AppIcon.vue index b08dc37..87bda19 100644 --- a/src/core/desktop/ui/components/AppIcon.vue +++ b/src/core/desktop/ui/components/AppIcon.vue @@ -43,7 +43,7 @@ const onDragEnd = (e: DragEvent) => { iconInfo.x = gridX iconInfo.y = gridY - XSystem.instance.eventManages.notifyEvent(DesktopEventEnum.onDesktopAppIconPos, iconInfo) + XSystem.instance.eventManage.notifyEvent(DesktopEventEnum.onDesktopAppIconPos, iconInfo) } diff --git a/src/core/desktop/ui/hooks/useDesktopInit.ts b/src/core/desktop/ui/hooks/useDesktopInit.ts index 03da16c..146a602 100644 --- a/src/core/desktop/ui/hooks/useDesktopInit.ts +++ b/src/core/desktop/ui/hooks/useDesktopInit.ts @@ -60,7 +60,7 @@ export function useDesktopInit(containerStr: string) { }) // 有桌面图标的app - const appInfos = XSystem.instance.processManages.processInfos.filter(processInfo => !processInfo.isJustProcess) + const appInfos = XSystem.instance.processManage.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) @@ -85,7 +85,7 @@ export function useDesktopInit(containerStr: string) { appIconsRef.value = rearrangeIcons(toRaw(appIconsRef.value), nCols, nRows, oCols, oRows) }) - XSystem.instance.eventManages.addEventListener(DesktopEventEnum.onDesktopAppIconPos, (iconInfo) => { + XSystem.instance.eventManage.addEventListener(DesktopEventEnum.onDesktopAppIconPos, (iconInfo) => { localStorage.setItem('desktopAppIconInfo', JSON.stringify(toValue(appIconsRef.value))) }) diff --git a/src/core/process/IProcess.ts b/src/core/process/IProcess.ts new file mode 100644 index 0000000..77b62e5 --- /dev/null +++ b/src/core/process/IProcess.ts @@ -0,0 +1,20 @@ +import type { ProcessInfoImpl } from '@/core/process/impl/ProcessInfoImpl.ts' +import type WindowForm from '@/core/window/WindowForm.ts' +import type { IProcessInfo } from '@/core/process/IProcessInfo.ts' + +/** + * 进程接口 + */ +export interface IProcess { + /** 进程id */ + get id(): string; + /** 进程信息 */ + get processInfo(): IProcessInfo; + /** 进程的窗体列表 */ + get windowForms(): Map; + /** + * 打开窗体 + * @param startName 窗体启动名 + */ + openWindowForm(startName: string): void; +} diff --git a/src/core/process/IProcessInfo.ts b/src/core/process/IProcessInfo.ts new file mode 100644 index 0000000..0e8a309 --- /dev/null +++ b/src/core/process/IProcessInfo.ts @@ -0,0 +1,26 @@ +import type { IVersion } from '@/core/common/types/IVersion.ts' +import type { IWindowFormConfig } from '@/core/window/types/IWindowFormConfig.ts' + +/** + * 进程的描述信息 + */ +export interface IProcessInfo { + /** 进程名称 - 唯一 */ + get name(): string; + /** 进程标题 */ + get title(): string; + /** 进程描述 */ + get description(): string; + /** 进程图标 */ + get icon(): string; + /** 启动窗体名称 */ + get startName(): string; + /** 进程版本 */ + get version(): IVersion; + /** 是否单例进程 */ + get singleton(): boolean; + /** 是否仅进程 */ + get isJustProcess(): boolean; + /** 进程的窗体配置 */ + get windowFormConfigs(): IWindowFormConfig[]; +} diff --git a/src/core/process/IProcessManage.ts b/src/core/process/IProcessManage.ts new file mode 100644 index 0000000..be8dac1 --- /dev/null +++ b/src/core/process/IProcessManage.ts @@ -0,0 +1,41 @@ +import type { ProcessInfoImpl } from '@/core/process/impl/ProcessInfoImpl.ts' +import type { IProcess } from '@/core/process/IProcess.ts' +import type { IProcessInfo } from '@/core/process/IProcessInfo.ts' + +/** + * 进程管理 + */ +export interface IProcessManage { + /** 所有进程信息 */ + get processInfos(): IProcessInfo[]; + /** + * 添加进程 + * @param process 进程 + */ + addProcess(process: IProcess): void; + /** + * 通过进程id查找进程 + * @param id 进程id + */ + findProcessById(id: string): IProcess | undefined; + /** + * 通过进程名查找进程 + * @param name 进程名 + */ + findProcessByName(name: string): T | undefined; + /** + * 通过进程id删除进程 + * @param id 进程id + */ + removeProcess(id: string): void; + /** + * 通过进程对象删除进程 + * @param process 进程对象 + */ + removeProcess(process: IProcess): void; + /** + * 通过进程名查找进程信息 + * @param name 进程名 + */ + findProcessInfoByName(name: string): IProcessInfo | undefined; +} \ No newline at end of file diff --git a/src/core/process/AppProcess.ts b/src/core/process/impl/ProcessImpl.ts similarity index 65% rename from src/core/process/AppProcess.ts rename to src/core/process/impl/ProcessImpl.ts index 78e48da..4844f5f 100644 --- a/src/core/process/AppProcess.ts +++ b/src/core/process/impl/ProcessImpl.ts @@ -1,14 +1,15 @@ import { v4 as uuidV4 } from 'uuid'; -import XSystem from '../XSystem.ts' -import type { AppProcessInfo } from '../process/AppProcessInfo.ts' -import WindowForm from '../window/WindowForm.ts' +import XSystem from '../../XSystem.ts' +import WindowForm from '../../window/WindowForm.ts' +import type { IProcess } from '@/core/process/IProcess.ts' +import type { IProcessInfo } from '@/core/process/IProcessInfo.ts' /** * 进程 */ -export default class AppProcess { +export default class ProcessImpl implements IProcess { private readonly _id: string = uuidV4(); - private readonly _processInfo: AppProcessInfo; + private readonly _processInfo: IProcessInfo; // 当前进程的窗体集合 private _windowForms: Map = new Map(); @@ -22,13 +23,13 @@ export default class AppProcess { return this._windowForms; } - constructor(info: AppProcessInfo) { + constructor(info: IProcessInfo) { console.log(`AppProcess: ${info.name}`) this._processInfo = info; const startName = info.startName; - XSystem.instance.processManages.addProcess(this); + XSystem.instance.processManage.addProcess(this); // 通过设置 isJustProcess 为 true,则不会创建窗体 if (!info.isJustProcess) { this.openWindowForm(startName) diff --git a/src/core/process/AppProcessInfo.ts b/src/core/process/impl/ProcessInfoImpl.ts similarity index 80% rename from src/core/process/AppProcessInfo.ts rename to src/core/process/impl/ProcessInfoImpl.ts index 3e88260..5bd227a 100644 --- a/src/core/process/AppProcessInfo.ts +++ b/src/core/process/impl/ProcessInfoImpl.ts @@ -1,8 +1,9 @@ -import type { Version } from '../common/types/Version.ts' -import type { IAppProcessInfoParams } from './types/IAppProcessInfoParams.ts' -import type { WindowFormConfig } from '../window/types/WindowFormConfig.ts' +import type { IVersion } from '../../common/types/IVersion.ts' +import type { IAppProcessInfoParams } from '../types/IAppProcessInfoParams.ts' +import type { IWindowFormConfig } from '../../window/types/IWindowFormConfig.ts' +import type { IProcessInfo } from '@/core/process/IProcessInfo.ts' -export class AppProcessInfo { +export class ProcessInfoImpl implements IProcessInfo { /** * 应用进程名称 * @private @@ -38,7 +39,7 @@ export class AppProcessInfo { * 应用版本信息 * @private */ - private readonly _version: Version; + private readonly _version: IVersion; /** * 应用是否只存在一个进程 @@ -56,7 +57,7 @@ export class AppProcessInfo { * 进程所有的窗口配置信息 * @private */ - private readonly _windowFormConfigs: Array; + private readonly _windowFormConfigs: Array; constructor(info: IAppProcessInfoParams) { this._name = info.name; diff --git a/src/core/process/ProcessManages.ts b/src/core/process/impl/ProcessManageImpl.ts similarity index 59% rename from src/core/process/ProcessManages.ts rename to src/core/process/impl/ProcessManageImpl.ts index b8826f9..5f04529 100644 --- a/src/core/process/ProcessManages.ts +++ b/src/core/process/impl/ProcessManageImpl.ts @@ -1,30 +1,33 @@ -import type AppProcess from './AppProcess.ts' -import { AppProcessInfo } from '@/core/process/AppProcessInfo.ts' +import type ProcessImpl from './ProcessImpl.ts' +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 { IProcess } from '@/core/process/IProcess.ts' +import type { IProcessInfo } from '@/core/process/IProcessInfo.ts' /** * 进程管理 */ -export default class ProcessManages { - private _processPool: Map = new Map(); - private _processInfos: AppProcessInfo[] = []; +export default class ProcessManageImpl implements IProcessManage { + private _processPool: Map = new Map(); + private _processInfos: IProcessInfo[] = new Array(); public get processInfos() { return this._processInfos; } constructor() { - console.log('ProcessManages') + console.log('ProcessManageImpl') this.loadAppProcessInfos(); } // TODO 加载所有进程信息 - public loadAppProcessInfos() { + private loadAppProcessInfos() { console.log('加载所有进程信息') // 添加内置进程 - const apps = import.meta.glob('../apps/**/*.json', { eager: true }) - const internalProcessInfos: AppProcessInfo[] = Object.values(apps).map(data => new AppProcessInfo(data)) + const apps = import.meta.glob('../../apps/**/*.json', { eager: true }) + const internalProcessInfos: ProcessInfoImpl[] = Object.values(apps).map(data => new ProcessInfoImpl(data)) this._processInfos.push(BasicSystemProcessInfo) this._processInfos.push(DesktopProcessInfo) @@ -33,7 +36,7 @@ export default class ProcessManages { } // 添加进程 - public addProcess(process: AppProcess) { + public addProcess(process: ProcessImpl) { this._processPool.set(process.id, process); } @@ -49,9 +52,9 @@ export default class ProcessManages { * 通过进程名称查找进程 * @param name 进程名称 */ - public findProcessByName(name: string) { + public findProcessByName(name: string) { const pools = [...this._processPool.values()]; - return pools.find(proc => proc.processInfo.name === name) as T; + return pools.find(proc => proc.processInfo.name === name) as T | undefined; } /** @@ -63,8 +66,8 @@ export default class ProcessManages { * 根据进程删除进程 * @param process 进程信息 */ - public removeProcess(process: AppProcess): void; - public removeProcess(params: string | AppProcess) { + public removeProcess(process: IProcess): void; + public removeProcess(params: string | IProcess) { const id = typeof params === 'string' ? params : params.id; this._processPool.delete(id); } diff --git a/src/core/process/types/IAppProcessInfoParams.ts b/src/core/process/types/IAppProcessInfoParams.ts index c47bbdb..03e7306 100644 --- a/src/core/process/types/IAppProcessInfoParams.ts +++ b/src/core/process/types/IAppProcessInfoParams.ts @@ -1,5 +1,5 @@ -import type { Version } from '../../common/types/Version.ts' -import type { WindowFormConfig } from '../../window/types/WindowFormConfig.ts' +import type { IVersion } from '../../common/types/IVersion.ts' +import type { IWindowFormConfig } from '../../window/types/IWindowFormConfig.ts' /** * 应用进程入参信息 @@ -16,11 +16,11 @@ export interface IAppProcessInfoParams { /** 应用进程启动入口 */ startName?: string; /** 应用版本信息 */ - version?: Version; + version?: IVersion; /** 应用是否只存在一个进程 */ singleton: boolean; /** 是否只是一个进程, 没有UI */ isJustProcess: boolean; /** 进程所有的窗口配置信息 */ - windowFormConfigs?: WindowFormConfig[]; + windowFormConfigs?: IWindowFormConfig[]; } \ No newline at end of file diff --git a/src/core/process/types/AppProcessEvent.ts b/src/core/process/types/TAppProcessEvent.ts similarity index 94% rename from src/core/process/types/AppProcessEvent.ts rename to src/core/process/types/TAppProcessEvent.ts index ed34380..b0254fc 100644 --- a/src/core/process/types/AppProcessEvent.ts +++ b/src/core/process/types/TAppProcessEvent.ts @@ -6,7 +6,7 @@ *

onProcessWindowFormFocus - 进程的窗体获取焦点

* */ -type AppProcessEvent = +type TAppProcessEvent = 'onProcessExit' | 'onProcessWindowFormOpen' | 'onProcessWindowFormExit' | diff --git a/src/core/system/BasicSystemProcess.ts b/src/core/system/BasicSystemProcess.ts index 51731ee..1cb2074 100644 --- a/src/core/system/BasicSystemProcess.ts +++ b/src/core/system/BasicSystemProcess.ts @@ -1,17 +1,17 @@ -import AppProcess from '../process/AppProcess.ts' -import { AppProcessInfo } from '@/core/process/AppProcessInfo.ts' +import ProcessImpl from '../process/impl/ProcessImpl.ts' +import { ProcessInfoImpl } from '@/core/process/impl/ProcessInfoImpl.ts' /** * 基础系统进程 */ -export class BasicSystemProcess extends AppProcess{ +export class BasicSystemProcess extends ProcessImpl{ private _isMounted: boolean = false; public get isMounted() { return this._isMounted; } - constructor(info: AppProcessInfo) { + constructor(info: ProcessInfoImpl) { super(info) console.log('BasicSystemProcess') } diff --git a/src/core/system/BasicSystemProcessInfo.ts b/src/core/system/BasicSystemProcessInfo.ts index 99c51ea..a36996c 100644 --- a/src/core/system/BasicSystemProcessInfo.ts +++ b/src/core/system/BasicSystemProcessInfo.ts @@ -1,9 +1,9 @@ -import { AppProcessInfo } from '@/core/process/AppProcessInfo.ts' +import { ProcessInfoImpl } from '@/core/process/impl/ProcessInfoImpl.ts' /** * 基础系统进程信息 */ -export const BasicSystemProcessInfo = new AppProcessInfo({ +export const BasicSystemProcessInfo = new ProcessInfoImpl({ name: 'basic-system', title: '基础系统进程', isJustProcess: true, diff --git a/src/core/window/WindowForm.ts b/src/core/window/WindowForm.ts index edd3ff3..1cf656f 100644 --- a/src/core/window/WindowForm.ts +++ b/src/core/window/WindowForm.ts @@ -1,7 +1,7 @@ import { v4 as uuidV4 } from 'uuid'; -import type AppProcess from '../process/AppProcess.ts' +import type ProcessImpl from '../process/impl/ProcessImpl.ts' import XSystem from '../XSystem.ts' -import type { AppProcessInfo } from '../process/AppProcessInfo.ts' +import type { ProcessInfoImpl } from '../process/impl/ProcessInfoImpl.ts' export default class WindowForm { private readonly _id: string = uuidV4(); @@ -11,10 +11,10 @@ export default class WindowForm { return this._id; } public get proc() { - return XSystem.instance.processManages.findProcessById(this._procId) + return XSystem.instance.processManage.findProcessById(this._procId) } - constructor(proc: AppProcess, startName: string) { + constructor(proc: ProcessImpl, startName: string) { this._procId = proc.id; console.log('WindowForm') } diff --git a/src/core/window/types/WindowFormConfig.ts b/src/core/window/types/IWindowFormConfig.ts similarity index 95% rename from src/core/window/types/WindowFormConfig.ts rename to src/core/window/types/IWindowFormConfig.ts index 0a01bab..e00e5da 100644 --- a/src/core/window/types/WindowFormConfig.ts +++ b/src/core/window/types/IWindowFormConfig.ts @@ -1,7 +1,7 @@ /** * 窗体配置 */ -export interface WindowFormConfig { +export interface IWindowFormConfig { /** * 窗体名称 */