From 01c4dec879f08b084ee3278bde25c477412df851 Mon Sep 17 00:00:00 2001 From: LuPing Zou <“zouluping@inspur.com”> Date: Fri, 25 Jul 2025 14:48:17 +0800 Subject: [PATCH] =?UTF-8?q?feature:=20PC=E7=AB=AF=E9=9B=B6=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=8E=A5=E5=85=A5Vue=E8=AE=BE=E8=AE=A1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../composition/command.service.tsx | 8 +++ .../designer-context/use-designer-context.ts | 19 ++++-- .../use-pc-nocode-designer-context.ts | 60 +++++++++++++++++++ .../form-metadata-nocode.service.ts | 47 +++++++++++++++ .../composition/metadata.service.ts | 16 +++-- .../src/components/types/designer-context.ts | 12 +++- 6 files changed, 148 insertions(+), 14 deletions(-) create mode 100644 packages/designer/src/components/composition/designer-context/use-pc-nocode-designer-context.ts create mode 100644 packages/designer/src/components/composition/form-metadata-nocode.service.ts diff --git a/packages/designer/src/components/composition/command.service.tsx b/packages/designer/src/components/composition/command.service.tsx index 4fa5dc66715..757957d7db0 100644 --- a/packages/designer/src/components/composition/command.service.tsx +++ b/packages/designer/src/components/composition/command.service.tsx @@ -157,10 +157,18 @@ export function useFormCommandService(formSchemaService: UseFormSchema, useFormS });; }); } + + function hasNoCustomCommands(): boolean { + return [DesignerMode.PC_NoCode, DesignerMode.Mobile_NoCode].includes(formSchemaService.designerMode); + } + /** * 将当前表单相关的自定义构件追加到webCmds中 */ function loadCommandsInCurrentPath(): Promise { + if (hasNoCustomCommands()) { + return Promise.resolve(); + } const commandsInfos = formSchemaService.getCommands(); const metadataInfo = formSchemaService.getFormMetadataBasicInfo(); const formCode = formSchemaService.designerMode === DesignerMode.PC_RTC ? metadataInfo.rtcCode : metadataInfo.code; diff --git a/packages/designer/src/components/composition/designer-context/use-designer-context.ts b/packages/designer/src/components/composition/designer-context/use-designer-context.ts index 2b204cdd421..5dac78fdd7b 100644 --- a/packages/designer/src/components/composition/designer-context/use-designer-context.ts +++ b/packages/designer/src/components/composition/designer-context/use-designer-context.ts @@ -1,14 +1,15 @@ import { DesignerMode, UseDesignerContext } from "../../types/designer-context"; import { useLocation } from "../use-location"; -import { useMobileDesignerContext } from "./use-mobile-designer-context"; import { usePCDesignerContext } from "./use-pc-designer-context"; import { usePCRtcDesignerContext } from "./use-pc-rtc-designer-context"; +import { usePCNocodeDesignerContext } from "./use-pc-nocode-designer-context"; /** * 设计器上下文 * @returns */ export function useDesignerContext(): UseDesignerContext { + /** * 判断的当前设计器运行环境 */ @@ -20,6 +21,12 @@ export function useDesignerContext(): UseDesignerContext { if (designerEnvType === 'runtimeCustom') { return DesignerMode.PC_RTC; } + if (designerEnvType === 'noCode') { + return DesignerMode.PC_NoCode; + } + if (designerEnvType === 'mobileNoCode') { + return DesignerMode.Mobile_NoCode; + } if (metadataPath && metadataPath.includes('.mfrm')) { return DesignerMode.Mobile; } @@ -30,12 +37,14 @@ export function useDesignerContext(): UseDesignerContext { const designerMode = getDesignerMode(); switch (designerMode) { - case DesignerMode.PC: case DesignerMode.Mobile: { + case DesignerMode.PC: + case DesignerMode.Mobile: { return usePCDesignerContext(); } - // { - // return useMobileDesignerContext(); - // } + case DesignerMode.PC_NoCode: + case DesignerMode.Mobile_NoCode: { + return usePCNocodeDesignerContext(); + } case DesignerMode.PC_RTC: { return usePCRtcDesignerContext(); } diff --git a/packages/designer/src/components/composition/designer-context/use-pc-nocode-designer-context.ts b/packages/designer/src/components/composition/designer-context/use-pc-nocode-designer-context.ts new file mode 100644 index 00000000000..5ad97612201 --- /dev/null +++ b/packages/designer/src/components/composition/designer-context/use-pc-nocode-designer-context.ts @@ -0,0 +1,60 @@ +import { DesignerMode, UseDesignerContext } from "../../types/designer-context"; +import ToolboxItems from '../../types/toolbox/pc-toolbox.json'; +import { usePCControlCreator } from "../control-creator/use-pc-control-creator.service"; +import SupportedControllers from '../../composition/command/supported-controllers/pc-supported-controller.json'; +import { FormComponent, UseFormSchema } from "../../../components/types"; +import ControllCategories from '../schema-repository/controller/pc-categories'; +import { useNocodeFormMetadata } from "../form-metadata-nocode.service"; +import { useCommandBuilderService as useCommandBuilder } from "../command-builder.service"; + +export function usePCNocodeDesignerContext(): UseDesignerContext { + + /** 设计器模式 */ + const designerMode: DesignerMode = DesignerMode.PC_NoCode; + + /** 工具箱的数据 */ + const toolboxItems: any[] = ToolboxItems; + + /** 要注册的UI组件 */ + const componentsToRegister: any = null; + + /** 支持的控制器 */ + const supportedControllers: any = SupportedControllers; + + /** 控制器分类 */ + const controllCategories: any = ControllCategories; + + /** 控件创建服务 */ + const useControlCreator = usePCControlCreator; + + /** 表单元数据服务 */ + const useFormMetadataService = useNocodeFormMetadata; + + /** 表单构件元数据服务 */ + const useCommandBuilderService = useCommandBuilder; + + /** + * 获取所有的页面组件 + * @returns + */ + function getPageComponents(useFormSchema: UseFormSchema): FormComponent[] { + const pageComponents: FormComponent[] = []; + const pageComponent = useFormSchema.getComponentById('root-component'); + if (pageComponent) { + pageComponents.push(pageComponent); + } + return pageComponents; + } + + return { + designerMode, + toolboxItems, + componentsToRegister, + supportedControllers, + controllCategories, + useControlCreator, + getPageComponents, + useFormMetadataService, + useCommandBuilderService + }; +} diff --git a/packages/designer/src/components/composition/form-metadata-nocode.service.ts b/packages/designer/src/components/composition/form-metadata-nocode.service.ts new file mode 100644 index 00000000000..85a685ee0d1 --- /dev/null +++ b/packages/designer/src/components/composition/form-metadata-nocode.service.ts @@ -0,0 +1,47 @@ +import axios from 'axios'; +import { omit } from 'lodash-es'; +import { DesignerProps } from '../designer.props'; +import { FormMetadaDataDom, MetadataDto, UseFormSchema, UseFormMetadata, FormMetaDataModule } from '../types'; +import { useLocation } from './use-location'; +import { useFormMetadata } from './form-metadata.service'; + +export function useNocodeFormMetadata(props: DesignerProps, useFormSchemaComposition: UseFormSchema): UseFormMetadata { + + const nocodeMetadataUrl = '/api/dev/nocode/v1.0/micro-apps/metadatas'; + + function queryMetadata(): Promise { + const { getHrefParam } = useLocation(); + const metadataId = getHrefParam('metadataId'); + const url = `${nocodeMetadataUrl}/${metadataId}`; + return axios.get(url).then((response: any) => { + const formSchema = JSON.parse(response.data.content).Contents; + const formMetadataBasicInfo = omit(response.data, 'content') as MetadataDto; + + useFormSchemaComposition.setFormMetadataBasicInfo(formMetadataBasicInfo); + useFormSchemaComposition.setFormSchema(formSchema); + return formSchema; + }); + } + + function saveFormMetadata() { + return Promise.resolve(); + } + + function queryFormTemplateRule(formModule: FormMetaDataModule): Promise { + return useFormMetadata(props, useFormSchemaComposition).queryFormTemplateRule(formModule); + } + + function runForm(loadingService: any, messageBoxService: any) { + } + + function publishMenu(messageBoxService: any, notifyService: any) { + } + + return { + queryMetadata, + saveFormMetadata, + queryFormTemplateRule, + runForm, + publishMenu, + }; +} diff --git a/packages/designer/src/components/composition/metadata.service.ts b/packages/designer/src/components/composition/metadata.service.ts index 1047d6b16f9..921e414e25e 100644 --- a/packages/designer/src/components/composition/metadata.service.ts +++ b/packages/designer/src/components/composition/metadata.service.ts @@ -40,7 +40,7 @@ export class MetadataService { */ public getMetadataListByType(relativePath: string, metadataType: string): Promise { let url; - if (this.designerMode === DesignerMode.PC_RTC) { + if (this.shouldUseRtcApi()) { url = `${this.rtcMetadataBasePath}?metadataTypes=${metadataType}`; } else { url = `${this.metadataBasePath}?path=${relativePath}&metadataTypeList=${metadataType}`; @@ -58,7 +58,7 @@ export class MetadataService { */ public getRefMetadata(relativePath: string, metadataId: string): Promise { let url; - if (this.designerMode === DesignerMode.PC_RTC) { + if (this.shouldUseRtcApi()) { url = `${this.rtcMetadataBasePath}/${metadataId}`; } else { url = `${this.metadataBasePath}/relied?metadataPath=${relativePath}&metadataID=${metadataId}`; @@ -103,7 +103,7 @@ export class MetadataService { public getAllMetadataList(relativePath: string, metadataType: string, pageSize = 1000) { let url = `${this.metadataServicePath}/unionmdlist?path=${relativePath}&`; - if (this.designerMode === DesignerMode.PC_RTC) { + if (this.shouldUseRtcApi()) { url = `${this.rtcMetadataBasePath}/rtmetadatalist?`; } return axios.get(`${url}pageIndex=1&pageSize=${pageSize}&metadataTypeList=${metadataType}`).then((res: any) => { @@ -116,7 +116,7 @@ export class MetadataService { } public getPickMetadata(relativePath: string, data: any) { - if (this.designerMode === DesignerMode.PC_RTC) { + if (this.shouldUseRtcApi()) { const url = `${this.rtcMetadataBasePath}/${data?.id}`; return axios.get(url, data).then((res: any) => { return { metadata: res.data }; @@ -130,7 +130,7 @@ export class MetadataService { } public saveMetadata(metadataDto: any, formBasicInfo?: any) { - if (this.designerMode === DesignerMode.PC_RTC) { + if (this.shouldUseRtcApi()) { const { dimension1, dimension2 } = formBasicInfo; return axios.post(this.rtcMetadataBasePath, { metadataDto, @@ -140,7 +140,6 @@ export class MetadataService { } else { return axios.put(this.metadataBasePath, metadataDto); } - } public validateRepeatName(path: string, fileName: string) { @@ -240,4 +239,9 @@ export class MetadataService { return { ok: res.status === 204 }; }); } + + private shouldUseRtcApi(): boolean { + const rtcModes = [DesignerMode.PC_RTC, DesignerMode.PC_NoCode, DesignerMode.Mobile_NoCode]; + return rtcModes.includes(this.designerMode); + } } diff --git a/packages/designer/src/components/types/designer-context.ts b/packages/designer/src/components/types/designer-context.ts index 0570a255278..8c4f6612dc5 100644 --- a/packages/designer/src/components/types/designer-context.ts +++ b/packages/designer/src/components/types/designer-context.ts @@ -11,12 +11,18 @@ export enum DesignerMode { /** 移动设计器 */ Mobile = 'Mobile', - /** PC 运行时定制设计器 */ - PC_RTC = 'PC_RTC' + /** PC运行时定制设计器 */ + PC_RTC = 'PC_RTC', + + /** PC零代码设计器 */ + PC_NoCode = 'PC_NoCode', + + /** 移动端零代码设计器 */ + Mobile_NoCode = 'Mobile_NoCode', } export interface UseDesignerContext { - instances: Record; + instances?: Record; designerMode: DesignerMode; toolboxItems: any[]; componentsToRegister: any[]; -- Gitee