掘金 人工智能 21小时前
AI + 低代码 技术揭秘(四):项目模型和块模型
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了 VTJ 低代码平台的核心数据层,重点关注 ProjectModel 和 BlockModel 类,它们作为项目结构、文件组织和状态管理的关键。 ProjectModel 提供了全面的项目状态管理接口,包括 CRUD 操作、文件管理、事件系统、以及与 Designer UI 的集成。文章详细介绍了 PageFile 和 BlockFile 的结构,以及数据持久化和序列化的方法。此外,还阐述了锁管理系统在协作编辑中的应用,为理解 VTJ 平台的底层架构提供了重要参考。

📌 **核心数据模型**: VTJ 低代码平台的核心数据层由 ProjectModel 和 BlockModel 构成,这两个类是所有设计时操作的中央数据存储,负责管理项目的整体状态。

📂 **文件管理功能**: ProjectModel 提供了全面的文件管理功能,包括创建、编辑、删除、复制页面和区块等操作。同时,平台支持两种主要的文件类型:PageFile (页面文件) 和 BlockFile (区块文件),分别用于表示可导航的应用程序屏幕和可重用的组件。

💡 **事件驱动架构**: ProjectModel 通过事件系统实现状态更改通知,涵盖了项目属性更改、文件活动状态更改、页面和区块的 CRUD 操作、依赖项修改、项目发布和代码生成等多种事件,确保了系统的灵活性和响应性。

🔗 **与 Designer UI 集成**: 项目模型与 designer 界面紧密集成,通过反应式钩子和 widget 组件实现用户友好的文件操作界面,例如 Pages 和 Blocks 小组件,提供了分类组织和拖放功能。

💾 **数据持久化和序列化**: ProjectModel 提供了数据持久化和序列化的功能,通过 toDsl 方法创建可序列化的表示形式,适用于项目文件存储、版本控制、模板发布和代码生成输入,确保了数据的完整性和可移植性。

本文档涵盖了 VTJ 低代码平台的核心数据层,特别是管理项目结构、文件组织和状态管理的 ProjectModel 和 BlockModel 类。这些模型充当所有设计时作的中央数据存储,并为可视化设计人员的文件管理功能提供基础。

有关在运行时渲染和执行这些模型的信息,请参阅 Engine、Provider 和 Service Layer。有关从这些模型生成代码的详细信息,请参阅代码生成和解析管道 。

数据模型架构

project 和 block 模型形成一个分层数据结构,代表整个低代码 project 状态:

ProjectModel 类结构

ProjectModel 类用作管理项目状态的主要接口,并为对所有项目实体执行 CRUD 作提供方法:

核心属性

属性类型描述
id字符串唯一项目标识符
name字符串项目名称
platform平台类型目标平台('web'、'h5'、'uniapp')
pages页面文件[]项目页面和目录
blocksBlockFile[]可重用的块组件
currentFile页面文件、块文件当前活动文件
dependencies依赖外部包依赖项
apisApiSchemaAPI 定义
meta元模式[]元数据配置

文件管理作

ProjectModel 提供了全面的文件管理功能:

事件驱动型架构

ProjectModel 为状态更改通知实现了一个全面的事件系统:

事件类型

事件常量触发条件目的
EVENT_PROJECT_CHANGE任何项目属性更改常规项目更新
EVENT_PROJECT_ACTIVED文件打开/关闭活动文件状态更改
EVENT_PROJECT_PAGES_CHANGE页面 CRUD 作页面列表更新
EVENT_PROJECT_BLOCKS_CHANGE阻止 CRUD 作黑名单更新
EVENT_PROJECT_DEPS_CHANGE依赖项修改依赖项管理
EVENT_PROJECT_PUBLISH项目发布发布工作流程
EVENT_PROJECT_GEN_SOURCE代码生成源代码生成

事件流模式

文件类型系统

VTJ 管理两种具有不同特征的主要文件类型:

PageFile 结构

页面表示可导航的应用程序屏幕,可以按层次结构进行组织:

interface PageFile {  id: string; // Unique identifier  name: string; // Component name (PascalCase)  title: string; // Display title  type: 'page'; // File type marker  dir?: boolean; // Directory flag  children?: PageFile[]; // Child pages (for directories)  dsl?: BlockSchema; // Design schema (null for directories)  raw?: boolean; // Source code mode flag  cache?: boolean; // Page caching  hidden?: boolean; // Hide in navigation  pure?: boolean; // Pure component mode}

BlockFile 结构

区块是可重用的组件,可以通过多种方法创建:

interface BlockFile {  id: string;  name: string;  title: string;  type: 'block';  fromType: 'Schema' | 'UrlSchema' | 'Plugin'; // Creation method  dsl?: BlockSchema; // Design schema  category?: string; // Organization category  library?: string; // Plugin library name  urls?: string; // External resource URLs}

fromType 属性确定如何处理块:

与 Designer UI 集成

项目模型通过反应式钩子和 widget 组件与 designer 界面紧密集成:

UI 组件集成

UI 上下文中的文件操作

设计器小部件为文件作提供了用户友好的界面:

Pages 小组件作

// Page management actionsconst onAction = async (action: any) => {  const { name, modelValue } = action;  const { data } = modelValue;  switch (name) {    case 'add':      // Create new page/directory      project.value?.createPage(pageData, parentId);      break;    case 'edit':      // Update existing page      project.value?.updatePage(pageData);      break;    case 'remove':      // Delete page      project.value?.removePage(data.id);      break;    case 'copy':      // Clone page      project.value?.clonePage(data, parentId);      break;    case 'saveToBlock':      // Convert page to reusable block      await project.value?.saveToBlock(data);      break;  }};

区块管理界面

块小部件提供分类组织和拖放功能:

数据持久化和序列化

ProjectModel 为持久化和共享提供了序列化功能:

DSL 导出格式

toDsl(_version?: string): ProjectSchema {  const attrs = ProjectModel.attrs.reduce((result, current) => {    result[current] = (this as any)[current];    return result;  }, {} as Record<string, any>);  // Clean DSL data for serialization  if (attrs.pages) {    attrs.pages = attrs.pages.map((page: PageFile) => ({      ...page,      dsl: undefined // Remove design schemas    }));  }  return {    __VTJ_PROJECT__: true,    id: this.id,    ...attrs  } as ProjectSchema;}

此方法创建适用于以下各项的可序列化表示形式:

状态管理生命周期

锁管理系统

ProjectModel 通过锁定机制包含协作编辑支持:

lock(id: string) {  this.locked = id;  // Emit change event}unlock(id: string) {  if (id !== this.locked) return;  this.locked = '';  // Emit change event}

该系统可防止在协作环境中进行并发修改,并与身份验证系统集成,以确保只有授权用户才能修改锁定的项目。

源码仓库

gitee.com/newgateway/…

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

VTJ 低代码平台 ProjectModel BlockModel 数据层
相关文章