保存一下

This commit is contained in:
2025-08-26 10:33:41 +08:00
parent 95a73ef524
commit 26f68d89bb
19 changed files with 165 additions and 71 deletions

View File

@@ -1,18 +1,20 @@
import ProcessManages from './process/ProcessManages.ts' import ProcessManageImpl from './process/impl/ProcessManageImpl.ts'
import AppProcess from './process/AppProcess.ts' import ProcessImpl from './process/impl/ProcessImpl.ts'
import type { AppProcessInfo } from '@/core/process/AppProcessInfo.ts' import type { ProcessInfoImpl } from '@/core/process/impl/ProcessInfoImpl.ts'
import { isUndefined } from 'lodash' import { isUndefined } from 'lodash'
import { BasicSystemProcess } from '@/core/system/BasicSystemProcess.ts' import { BasicSystemProcess } from '@/core/system/BasicSystemProcess.ts'
import { DesktopProcess } from '@/core/desktop/DesktopProcess.ts' import { DesktopProcess } from '@/core/desktop/DesktopProcess.ts'
import type { IAllEvent } from '@/core/events/EventTypes.ts' import type { IAllEvent } from '@/core/events/EventTypes.ts'
import type { IEventBuilder } from '@/core/events/IEventBuilder.ts' import type { IEventBuilder } from '@/core/events/IEventBuilder.ts'
import { EventBuilderImpl } from '@/core/events/impl/EventBuilderImpl.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 { export default class XSystem {
private static _instance: XSystem = new XSystem() private static _instance: XSystem = new XSystem()
private _processManages: ProcessManages = new ProcessManages() private _processManage: IProcessManage = new ProcessManageImpl()
private _eventManages: IEventBuilder<IAllEvent> = new EventBuilderImpl() private _eventManage: IEventBuilder<IAllEvent> = new EventBuilderImpl()
constructor() { constructor() {
console.log('XSystem') console.log('XSystem')
@@ -21,11 +23,11 @@ export default class XSystem {
public static get instance() { public static get instance() {
return this._instance return this._instance
} }
public get processManages() { public get processManage() {
return this._processManages return this._processManage
} }
public get eventManages() { public get eventManage() {
return this._eventManages return this._eventManage
} }
public initialization(dom: HTMLDivElement) { public initialization(dom: HTMLDivElement) {
@@ -37,25 +39,25 @@ export default class XSystem {
} }
// 运行进程 // 运行进程
public async run<T extends AppProcess = AppProcess>( public async run<T extends IProcess = IProcess>(
proc: string | AppProcessInfo, proc: string | ProcessInfoImpl,
constructor?: new (info: AppProcessInfo) => T, constructor?: new (info: ProcessInfoImpl) => T,
): Promise<T> { ): Promise<T> {
let info = typeof proc === 'string' ? this._processManages.findProcessInfoByName(proc) : proc let info = typeof proc === 'string' ? this._processManage.findProcessInfoByName(proc) : proc
if (isUndefined(info)) { if (isUndefined(info)) {
throw new Error(`未找到进程信息:${proc}`) throw new Error(`未找到进程信息:${proc}`)
} }
// 是单例应用 // 是单例应用
if (info.singleton) { if (info.singleton) {
let process = this._processManages.findProcessByName(info.name) let process = this._processManage.findProcessByName(info.name)
if (process) { if (process) {
return process as T 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 return process as T
} }

View File

@@ -1,7 +1,7 @@
/** /**
* *
*/ */
export interface Version { export interface IVersion {
/** /**
* *
*/ */

View File

@@ -1,5 +1,5 @@
import AppProcess from '@/core/process/AppProcess.ts' import ProcessImpl from '@/core/process/impl/ProcessImpl.ts'
import type { AppProcessInfo } from '@/core/process/AppProcessInfo.ts' import type { ProcessInfoImpl } from '@/core/process/impl/ProcessInfoImpl.ts'
import XSystem from '@/core/XSystem.ts' import XSystem from '@/core/XSystem.ts'
import { BasicSystemProcess } from '@/core/system/BasicSystemProcess.ts' import { BasicSystemProcess } from '@/core/system/BasicSystemProcess.ts'
import { createApp, h } from 'vue' 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 { DesktopEventEnum } from '@/core/events/EventTypes.ts'
import { debounce } from 'lodash' import { debounce } from 'lodash'
export class DesktopProcess extends AppProcess { export class DesktopProcess extends ProcessImpl {
private _desktopRootDom: HTMLElement; private _desktopRootDom: HTMLElement;
private _isMounted: boolean = false; private _isMounted: boolean = false;
private _width: number = 0; private _width: number = 0;
@@ -22,7 +22,7 @@ export class DesktopProcess extends AppProcess {
return this._isMounted; return this._isMounted;
} }
public get basicSystemProcess() { public get basicSystemProcess() {
return XSystem.instance.processManages.findProcessByName<BasicSystemProcess>('basic-system') return XSystem.instance.processManage.findProcessByName<BasicSystemProcess>('basic-system')
} }
public get width() { public get width() {
@@ -63,10 +63,10 @@ export class DesktopProcess extends AppProcess {
} }
private get eventManages() { private get eventManages() {
return XSystem.instance.eventManages; return XSystem.instance.eventManage;
} }
constructor(info: AppProcessInfo) { constructor(info: ProcessInfoImpl) {
super(info) super(info)
console.log('DesktopProcess') console.log('DesktopProcess')
} }

View File

@@ -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', name: 'desktop',
title: '桌面', title: '桌面',
version: { version: {

View File

@@ -30,7 +30,7 @@ const props = defineProps<{ process: DesktopProcess }>()
const { appIconsRef, gridStyle, gridTemplate } = useDesktopInit('.desktop-container') const { appIconsRef, gridStyle, gridTemplate } = useDesktopInit('.desktop-container')
XSystem.instance.eventManages.addEventListener( XSystem.instance.eventManage.addEventListener(
DesktopEventEnum.onDesktopRootDomResize, DesktopEventEnum.onDesktopRootDomResize,
(width, height) => { (width, height) => {
console.log(width, height) console.log(width, height)

View File

@@ -43,7 +43,7 @@ const onDragEnd = (e: DragEvent) => {
iconInfo.x = gridX iconInfo.x = gridX
iconInfo.y = gridY iconInfo.y = gridY
XSystem.instance.eventManages.notifyEvent(DesktopEventEnum.onDesktopAppIconPos, iconInfo) XSystem.instance.eventManage.notifyEvent(DesktopEventEnum.onDesktopAppIconPos, iconInfo)
} }
</script> </script>

View File

@@ -60,7 +60,7 @@ export function useDesktopInit(containerStr: string) {
}) })
// 有桌面图标的app // 有桌面图标的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 oldAppIcons: IDesktopAppIcon[] = JSON.parse(localStorage.getItem('desktopAppIconInfo') || '[]')
const appIcons: IDesktopAppIcon[] = appInfos.map((processInfo, index) => { const appIcons: IDesktopAppIcon[] = appInfos.map((processInfo, index) => {
const oldAppIcon = oldAppIcons.find(oldAppIcon => oldAppIcon.name === processInfo.name) 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) 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))) localStorage.setItem('desktopAppIconInfo', JSON.stringify(toValue(appIconsRef.value)))
}) })

View File

@@ -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<string, WindowForm>;
/**
* 打开窗体
* @param startName 窗体启动名
*/
openWindowForm(startName: string): void;
}

View File

@@ -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[];
}

View File

@@ -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<T extends IProcess = IProcess>(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;
}

View File

@@ -1,14 +1,15 @@
import { v4 as uuidV4 } from 'uuid'; import { v4 as uuidV4 } from 'uuid';
import XSystem from '../XSystem.ts' import XSystem from '../../XSystem.ts'
import type { AppProcessInfo } from '../process/AppProcessInfo.ts' import WindowForm from '../../window/WindowForm.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 _id: string = uuidV4();
private readonly _processInfo: AppProcessInfo; private readonly _processInfo: IProcessInfo;
// 当前进程的窗体集合 // 当前进程的窗体集合
private _windowForms: Map<string, WindowForm> = new Map(); private _windowForms: Map<string, WindowForm> = new Map();
@@ -22,13 +23,13 @@ export default class AppProcess {
return this._windowForms; return this._windowForms;
} }
constructor(info: AppProcessInfo) { constructor(info: IProcessInfo) {
console.log(`AppProcess: ${info.name}`) console.log(`AppProcess: ${info.name}`)
this._processInfo = info; this._processInfo = info;
const startName = info.startName; const startName = info.startName;
XSystem.instance.processManages.addProcess(this); XSystem.instance.processManage.addProcess(this);
// 通过设置 isJustProcess 为 true则不会创建窗体 // 通过设置 isJustProcess 为 true则不会创建窗体
if (!info.isJustProcess) { if (!info.isJustProcess) {
this.openWindowForm(startName) this.openWindowForm(startName)

View File

@@ -1,8 +1,9 @@
import type { Version } from '../common/types/Version.ts' import type { IVersion } from '../../common/types/IVersion.ts'
import type { IAppProcessInfoParams } from './types/IAppProcessInfoParams.ts' import type { IAppProcessInfoParams } from '../types/IAppProcessInfoParams.ts'
import type { WindowFormConfig } from '../window/types/WindowFormConfig.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 * @private
@@ -38,7 +39,7 @@ export class AppProcessInfo {
* *
* @private * @private
*/ */
private readonly _version: Version; private readonly _version: IVersion;
/** /**
* *
@@ -56,7 +57,7 @@ export class AppProcessInfo {
* *
* @private * @private
*/ */
private readonly _windowFormConfigs: Array<WindowFormConfig>; private readonly _windowFormConfigs: Array<IWindowFormConfig>;
constructor(info: IAppProcessInfoParams) { constructor(info: IAppProcessInfoParams) {
this._name = info.name; this._name = info.name;

View File

@@ -1,30 +1,33 @@
import type AppProcess from './AppProcess.ts' import type ProcessImpl from './ProcessImpl.ts'
import { AppProcessInfo } from '@/core/process/AppProcessInfo.ts' import { ProcessInfoImpl } from '@/core/process/impl/ProcessInfoImpl.ts'
import { BasicSystemProcessInfo } from '@/core/system/BasicSystemProcessInfo.ts' import { BasicSystemProcessInfo } from '@/core/system/BasicSystemProcessInfo.ts'
import { DesktopProcessInfo } from '@/core/desktop/DesktopProcessInfo.ts' import { DesktopProcessInfo } from '@/core/desktop/DesktopProcessInfo.ts'
import type { IAppProcessInfoParams } from '@/core/process/types/IAppProcessInfoParams.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 { export default class ProcessManageImpl implements IProcessManage {
private _processPool: Map<string, AppProcess> = new Map<string, AppProcess>(); private _processPool: Map<string, IProcess> = new Map<string, IProcess>();
private _processInfos: AppProcessInfo[] = []; private _processInfos: IProcessInfo[] = new Array<ProcessInfoImpl>();
public get processInfos() { public get processInfos() {
return this._processInfos; return this._processInfos;
} }
constructor() { constructor() {
console.log('ProcessManages') console.log('ProcessManageImpl')
this.loadAppProcessInfos(); this.loadAppProcessInfos();
} }
// TODO 加载所有进程信息 // TODO 加载所有进程信息
public loadAppProcessInfos() { private loadAppProcessInfos() {
console.log('加载所有进程信息') console.log('加载所有进程信息')
// 添加内置进程 // 添加内置进程
const apps = import.meta.glob<IAppProcessInfoParams>('../apps/**/*.json', { eager: true }) const apps = import.meta.glob<IAppProcessInfoParams>('../../apps/**/*.json', { eager: true })
const internalProcessInfos: AppProcessInfo[] = Object.values(apps).map(data => new AppProcessInfo(data)) const internalProcessInfos: ProcessInfoImpl[] = Object.values(apps).map(data => new ProcessInfoImpl(data))
this._processInfos.push(BasicSystemProcessInfo) this._processInfos.push(BasicSystemProcessInfo)
this._processInfos.push(DesktopProcessInfo) 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); this._processPool.set(process.id, process);
} }
@@ -49,9 +52,9 @@ export default class ProcessManages {
* *
* @param name * @param name
*/ */
public findProcessByName<T extends AppProcess = AppProcess>(name: string) { public findProcessByName<T extends IProcess = IProcess>(name: string) {
const pools = [...this._processPool.values()]; 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 * @param process
*/ */
public removeProcess(process: AppProcess): void; public removeProcess(process: IProcess): void;
public removeProcess(params: string | AppProcess) { public removeProcess(params: string | IProcess) {
const id = typeof params === 'string' ? params : params.id; const id = typeof params === 'string' ? params : params.id;
this._processPool.delete(id); this._processPool.delete(id);
} }

View File

@@ -1,5 +1,5 @@
import type { Version } from '../../common/types/Version.ts' import type { IVersion } from '../../common/types/IVersion.ts'
import type { WindowFormConfig } from '../../window/types/WindowFormConfig.ts' import type { IWindowFormConfig } from '../../window/types/IWindowFormConfig.ts'
/** /**
* 应用进程入参信息 * 应用进程入参信息
@@ -16,11 +16,11 @@ export interface IAppProcessInfoParams {
/** 应用进程启动入口 */ /** 应用进程启动入口 */
startName?: string; startName?: string;
/** 应用版本信息 */ /** 应用版本信息 */
version?: Version; version?: IVersion;
/** 应用是否只存在一个进程 */ /** 应用是否只存在一个进程 */
singleton: boolean; singleton: boolean;
/** 是否只是一个进程, 没有UI */ /** 是否只是一个进程, 没有UI */
isJustProcess: boolean; isJustProcess: boolean;
/** 进程所有的窗口配置信息 */ /** 进程所有的窗口配置信息 */
windowFormConfigs?: WindowFormConfig[]; windowFormConfigs?: IWindowFormConfig[];
} }

View File

@@ -6,7 +6,7 @@
* <p>onProcessWindowFormFocus - </p> * <p>onProcessWindowFormFocus - </p>
* *
*/ */
type AppProcessEvent = type TAppProcessEvent =
'onProcessExit' | 'onProcessExit' |
'onProcessWindowFormOpen' | 'onProcessWindowFormOpen' |
'onProcessWindowFormExit' | 'onProcessWindowFormExit' |

View File

@@ -1,17 +1,17 @@
import AppProcess from '../process/AppProcess.ts' import ProcessImpl from '../process/impl/ProcessImpl.ts'
import { AppProcessInfo } from '@/core/process/AppProcessInfo.ts' import { ProcessInfoImpl } from '@/core/process/impl/ProcessInfoImpl.ts'
/** /**
* 基础系统进程 * 基础系统进程
*/ */
export class BasicSystemProcess extends AppProcess{ export class BasicSystemProcess extends ProcessImpl{
private _isMounted: boolean = false; private _isMounted: boolean = false;
public get isMounted() { public get isMounted() {
return this._isMounted; return this._isMounted;
} }
constructor(info: AppProcessInfo) { constructor(info: ProcessInfoImpl) {
super(info) super(info)
console.log('BasicSystemProcess') console.log('BasicSystemProcess')
} }

View File

@@ -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', name: 'basic-system',
title: '基础系统进程', title: '基础系统进程',
isJustProcess: true, isJustProcess: true,

View File

@@ -1,7 +1,7 @@
import { v4 as uuidV4 } from 'uuid'; 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 XSystem from '../XSystem.ts'
import type { AppProcessInfo } from '../process/AppProcessInfo.ts' import type { ProcessInfoImpl } from '../process/impl/ProcessInfoImpl.ts'
export default class WindowForm { export default class WindowForm {
private readonly _id: string = uuidV4(); private readonly _id: string = uuidV4();
@@ -11,10 +11,10 @@ export default class WindowForm {
return this._id; return this._id;
} }
public get proc() { 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; this._procId = proc.id;
console.log('WindowForm') console.log('WindowForm')
} }

View File

@@ -1,7 +1,7 @@
/** /**
* *
*/ */
export interface WindowFormConfig { export interface IWindowFormConfig {
/** /**
* *
*/ */