项目模型和区块模型
本文档涵盖了 VTJ 低代码平台的核心数据层,重点介绍了管理项目结构、文件组织和状态管理的 ProjectModel
和 BlockModel
类。这些模型作为所有设计时操作的中央数据存储,并为可视化设计器的文件管理功能提供基础支撑。
有关运行时渲染和执行这些模型的信息,请参阅 Engine、Provider 和 Service Layer 文档。有关代码生成的实现细节,请参阅代码生成和解析管道文档。
数据模型架构
项目(Project)和区块(Block)模型构成分层数据结构,完整表示低代码项目的状态:
ProjectModel 类结构
ProjectModel
类是管理项目状态的主要接口,提供对所有项目实体执行 CRUD 操作的方法:
核心属性
属性 | 类型 | 描述 |
---|---|---|
id | string | 唯一项目标识符 |
name | string | 项目名称 |
platform | PlatformType | 目标平台('web'/'h5'/'uniapp') |
pages | PageFile[] | 项目页面和目录结构 |
blocks | BlockFile[] | 可复用区块组件列表 |
currentFile | PageFile/BlockFile | 当前活动文件 |
dependencies | Dependency | 外部包依赖项 |
apis | ApiSchema | API 定义集合 |
meta | MetaSchema[] | 元数据配置项 |
文件管理操作
ProjectModel 提供全面的文件管理功能:
事件驱动架构
ProjectModel 实现了完整的事件系统用于状态变更通知:
事件类型
事件常量 | 触发条件 | 目的 |
---|---|---|
EVENT_PROJECT_CHANGE | 任何项目属性变更 | 通知全局项目更新 |
EVENT_PROJECT_ACTIVED | 文件打开/关闭操作 | 活动文件状态变更通知 |
EVENT_PROJECT_PAGES_CHANGE | 页面增删改操作 | 页面结构更新通知 |
EVENT_PROJECT_BLOCKS_CHANGE | 区块增删改操作 | 区块列表更新通知 |
EVENT_PROJECT_DEPS_CHANGE | 依赖项变更 | 依赖关系更新通知 |
EVENT_PROJECT_PUBLISH | 项目发布操作 | 触发发布流程 |
EVENT_PROJECT_GEN_SOURCE | 代码生成操作 | 源代码生成事件通知 |
事件流模式
文件类型系统
VTJ 管理两种具有不同特性的主要文件类型:
PageFile 结构
页面表示可导航的应用程序界面,支持分层组织:
ts
interface PageFile {
id: string; // 唯一标识符
name: string; // 组件名(帕斯卡命名法)
title: string; // 显示标题
type: 'page'; // 文件类型标记
dir?: boolean; // 目录标识
children?: PageFile[]; // 子页面(目录结构)
dsl?: BlockSchema; // 设计架构(目录为空)
raw?: boolean; // 源码模式标记
cache?: boolean; // 页面缓存配置
hidden?: boolean; // 是否隐藏于导航
pure?: boolean; // 纯组件模式
}
BlockFile 结构
区块是可复用的组件单元,支持多种创建方式:
ts
interface BlockFile {
id: string; // 唯一标识符
name: string; // 区块名称
title: string; // 显示标题
type: 'block'; // 文件类型标记
fromType: 'Schema' | 'UrlSchema' | 'Plugin'; // 创建方式
dsl?: BlockSchema; // 设计架构
category?: string; // 分类标识
library?: string; // 插件库名称
urls?: string; // 外部资源URL
}
fromType
属性决定区块的处理方式:
- Schema:通过可视化设计器创建
- UrlSchema:从外部 JSON 架构导入
- Plugin:从外部 JavaScript/CSS 资源加载
与设计器(Designer)集成
项目模型通过响应式钩子和组件与设计器界面深度集成:
UI 组件集成架构
文件操作接口
设计器小部件提供用户友好的文件操作界面:
页面管理操作
ts
// 页面管理操作处理
const onAction = async (action: any) => {
const { name, modelValue } = action;
const { data } = modelValue;
switch (name) {
case 'add': // 创建新页面/目录
project.value?.createPage(pageData, parentId);
break;
case 'edit': // 更新现有页面
project.value?.updatePage(pageData);
break;
case 'remove': // 删除页面
project.value?.removePage(data.id);
break;
case 'copy': // 克隆页面
project.value?.clonePage(data, parentId);
break;
case 'saveToBlock': // 转换为可复用区块
await project.value?.saveToBlock(data);
break;
}
};
区块管理界面
区块小部件提供分类组织和拖放功能:
数据持久化与序列化
ProjectModel 提供序列化功能用于持久化存储:
DSL 导出格式
ts
toDsl(_version?: string): ProjectSchema {
// 提取可序列化属性
const attrs = ProjectModel.attrs.reduce((result, current) => {
result[current] = (this as any)[current];
return result;
}, {} as Record<string, any>);
// 清理序列化数据
if (attrs.pages) {
attrs.pages = attrs.pages.map((page: PageFile) => ({
...page,
dsl: undefined // 移除设计架构
}));
}
return {
__VTJ_PROJECT__: true, // 项目标识
id: this.id,
...attrs
} as ProjectSchema;
}
此序列化格式适用于:
- 项目文件存储
- 版本控制系统
- 模板发布
- 代码生成输入
状态管理生命周期
协作编辑锁系统
ProjectModel 通过锁定机制支持协作编辑:
ts
// 锁定项目
lock(id: string) {
this.locked = id;
// 触发变更事件
}
// 解锁项目
unlock(id: string) {
if (id !== this.locked) return;
this.locked = '';
// 触发变更事件
}
该系统防止协作环境中的并发修改,并与认证系统集成确保仅授权用户可修改锁定的项目。
说明
本文档由AI辅助翻译,可能存在术语差异或时效性问题,请查阅原文确认:https://deepwiki.com/ChenXiaohui99/vtj/2.2-project-and-block-models