天眼
75.1MB · 2026-02-07
在企业级应用开发中,如何将自动生成的代码与现有代码库无缝集成是一个长期存在的挑战。Ooder D2B (Design to Bridge) 框架通过 BridgeCode 机制,巧妙地解决了这个问题。本文将深入剖析 BridgeCode 的核心机制,揭示它如何通过 C2U 动态编译、NLP Module 自学习、项目级模板规则配置等技术,与企业原有代码完美融合。
在企业级应用开发中,代码生成技术已经被广泛应用,但如何将生成的代码与现有代码库无缝集成仍然是一个挑战。传统的方法存在以下问题:
Ooder D2B (Design to Bridge) 框架通过 BridgeCode 机制,提供了一种全新的解决方案:
本文将从以下几个方面深入剖析 BridgeCode 机制:
C2UFactory 是 Ooder 框架中负责动态编译和 UI 模块管理的核心工厂类。它的主要职责包括:
核心代码位置:
C2UFactory 提供了多个核心方法来实现动态编译:
// 动态编译 MODULE
public <T extends ModuleUIComponent> UIModule<T> dynBuild(Class customClass, Map<String, ?> valueMap)
// 动态编译 MODULE(完整版)
public <T extends ModuleUIComponent> UIModule<T> dynModule(MethodConfig methodConfig, Class<T> customClass, UIModule module, Map<String, ?> valueMap)
// 获取视图(支持缓存)
public UIModule getViewByMethod(MethodConfig methodAPIBean, String projectName, Map<String, ?> valueMap)
// 创建真实视图
public UIModule createRealView(MethodConfig methodAPIBean, Class customClass, String projectName, Map<String, ?> valueMap, boolean isDyn)
C2UFactory 的动态编译流程如下:
C2UFactory 使用 MVEL (MVFLEX Expression Language) 表达式引擎进行模板渲染:
// 核心渲染代码
String obj = (String) TemplateRuntime.eval(json, MvelDSMRoot.getInstance(), perContext(oTopModule, component.getUIModule()));
T moduleComponent = JSONObject.parseObject(obj, customClass);
MVEL 的优势:
C2UFactory 使用线程锁确保线程安全:
public static final String THREAD_LOCK = "Thread Lock";
public <T extends ModuleUIComponent> UIModule<T> dynModule(MethodConfig methodConfig, Class<T> customClass, UIModule module, Map<String, ?> valueMap) {
synchronized (module.getClassName()) {
// 动态编译逻辑
}
}
C2UFactory 提供了多层缓存机制:
// 1. 线程缓存
Map contextMap = JDSActionContext.getActionContext().getContext();
// 2. 时间缓存
Long createTime = (Long) contextMap.get(url + "[TIME]");
if (module == null && (createTime == null || System.currentTimeMillis() - createTime > 500)) {
// 重新加载
}
// 3. 模块缓存
static Map<String, C2UFactory> managerMap = new HashMap<String, C2UFactory>();
C2UFactory 支持自定义组件:
// 支持自定义类
if (customClass == null) {
customClass = methodConfig.getRealViewClass();
}
// 支持动态加载视图
if (methodConfig.getDynDataBean() != null && module.getRealClassName().equals(module.getClassName())) {
customClass = (Class<T>) CustomDynLoadView.class;
}
FullNlpComponentConverter 是 Ooder 框架中负责将自然语言和配置转换为 NLP 组件的核心转换器。它支持三种转换模式:
核心代码位置:FullNlpComponentConverter.java
只使用 LLM 进行转换:
case LLM_ONLY:
if (llmInterface != null) {
config = llmInterface.convertNaturalLanguageToConfig(naturalLanguage, componentType);
}
break;
适用场景:
只使用 Skills 进行转换:
case SKILLS_ONLY:
if (skillsBridge != null) {
config = skillsBridge.processNaturalLanguage(naturalLanguage, componentType);
}
break;
适用场景:
混合使用 LLM 和 Skills:
case HYBRID:
default:
// 先尝试使用 Skills,失败后使用 LLM
if (skillsBridge != null) {
try {
config = skillsBridge.processNaturalLanguage(naturalLanguage, componentType);
} catch (Exception e) {
// Skills 失败,使用 LLM
if (llmInterface != null) {
config = llmInterface.convertNaturalLanguageToConfig(naturalLanguage, componentType);
}
}
} else if (llmInterface != null) {
config = llmInterface.convertNaturalLanguageToConfig(naturalLanguage, componentType);
}
break;
适用场景:
NlpComponentFactory 使用工厂模式创建各种 Nlp*UIComponent 实例,支持超过 30 种组件类型:
NlpComponentFactory 使用工厂模式创建各种 Nlp*UIComponent 实例:
public static class NlpComponentFactory {
private Map<String, ComponentCreator> creatorMap;
public NlpComponentFactory() {
this.creatorMap = new HashMap<>();
initializeCreators();
}
private void initializeCreators() {
// 注册组件创建器
registerCreator("Block", () -> new NlpBlockUIComponent());
registerCreator("ButtonLayout", () -> new NlpButtonLayoutUIComponent());
registerCreator("ContentBlock", () -> new NlpContentBlockUIComponent());
registerCreator("CustomLayout", () -> new NlpCustomLayoutUIComponent());
registerCreator("Div", () -> new NlpDivUIComponent());
registerCreator("ECharts", () -> new NlpEChartsUIComponent());
registerCreator("FChart", () -> new NlpFChartUIComponent());
registerCreator("Gallery", () -> new NlpGalleryUIComponent());
registerCreator("Group", () -> new NlpGroupUIComponent());
registerCreator("MTree", () -> new NlpMTreeUIComponent());
registerCreator("Opinion", () -> new NlpOpinionUIComponent());
registerCreator("Panel", () -> new NlpPanelUIComponent());
registerCreator("PopTree", () -> new NlpPopTreeUIComponent());
registerCreator("SVGPaper", () -> new NlpSVGPaperUIComponent());
registerCreator("Tabs", () -> new NlpTabsUIComponent());
registerCreator("TitleBlock", () -> new NlpTitleBlockUIComponent());
registerCreator("Tree", () -> new NlpTreeUIComponent());
registerCreator("ClassForm", () -> new NlpClassFormUIComponent());
registerCreator("MForm", () -> new NlpMFormUIComponent());
registerCreator("TableForm", () -> new NlpTableFormUIComponent());
registerCreator("Grid", () -> new NlpGridUIComponent());
registerCreator("MGrid", () -> new NlpMGridUIComponent());
registerCreator("TableGrid", () -> new NlpTableGridUIComponent());
registerCreator("MainIndex", () -> new NlpMainIndexUIComponent());
registerCreator("ButtonViews", () -> new NlpButtonViewsUIComponent());
registerCreator("FoldingTabs", () -> new NlpFoldingTabsUIComponent());
registerCreator("Main", () -> new NlpMainUIComponent());
registerCreator("MButtonViews", () -> new NlpMButtonViewsUIComponent());
registerCreator("MNavButtonViews", () -> new NlpMNavButtonViewsUIComponent());
registerCreator("NavButtonLayout", () -> new NlpNavButtonLayoutUIComponent());
registerCreator("NavFoldingTree", () -> new NlpNavFoldingTreeUIComponent());
registerCreator("NavGallery", () -> new NlpNavGalleryUIComponent());
registerCreator("NavGroup", () -> new NlpNavGroupUIComponent());
registerCreator("NavMenuBar", () -> new NlpNavMenuBarUIComponent());
registerCreator("NavTabs", () -> new NlpNavTabsUIComponent());
registerCreator("NavTree", () -> new NlpNavTreeUIComponent());
registerCreator("Stacks", () -> new NlpStacksUIComponent());
}
}
NlpComponentFactory 支持超过 30 种组件类型,包括:
基础组件:
导航组件:
表单组件:
图表组件:
主组件:
public interface LLMInterface {
Object convertNaturalLanguageToConfig(String naturalLanguage, String componentType);
void initialize();
void close();
String getName();
boolean isInitialized();
}
职责:
public interface SkillsBridge {
Object processNaturalLanguage(String naturalLanguage, String componentType);
void registerSkill(String skillName, Object skill);
void initialize();
void close();
String getName();
boolean isInitialized();
Map<String, Object> getSkills();
Object getSkill(String skillName);
}
职责:
SkillsBridge 支持动态注册技能:
public void registerSkill(String skillName, Object skill) {
skills.put(skillName, skill);
}
自学习过程:
HYBRID 模式的混合转换策略:
优势:
UIPackagePathType 定义了 30+ 种不同的包路径类型,每种类型对应不同的系统模块:
public enum UIPackagePathType implements IconEnumstype {
// 用户工程
App("App", "/App/", "用户工程", UIPackageType.sys, "ri-node-tree"),
// 流程应用
bpm("bpm", "/bpm/", "流程应用", UIPackageType.custom, "ri-node-tree"),
bpmadmin("bpmadmin", "/bpm/admin/", "流程配置", UIPackageType.admin, "ri-settings-3-line"),
custom("bpmcustom", "/bpm/custom/", "流程示例", UIPackageType.custom, "ri-flow-chart-line"),
bpmdisplay("bpmdisplay", "/bpm/custom/display/", "流转控制", UIPackageType.custom, "ri-exchange-line"),
bpmlist("bpmlist", "/bpm/custom/list/", "工作流", UIPackageType.custom, "ri-list-check-line"),
bpmform("bpmform", "/bpm/form/", "工作流表单", UIPackageType.custom, "ri-file-line"),
// 表单插件
formplugins("formplugins", "/fdtform/plugins", "表单插件", UIPackageType.custom, "ri-puzzle-line"),
// 用户定义
img("img", "/img/", "图片", UIPackageType.userdef, "ri-image-line"),
css("css", "/css/", "样式", UIPackageType.userdef, "ri-css3-line"),
// JAVA 编译
java("java", "/java/", "JAVA编译", UIPackageType.esd, "ri-code-box-line"),
debugproject("debugproject", "/debugproject/", "预览", UIPackageType.esd, "ri-code-box-line"),
// 嵌入模块
Module("Module", "/Module/", "嵌入模块", UIPackageType.userdef, "ri-puzzle-line"),
// 预览
preview("preview", "/preview/", "预览", UIPackageType.admin, "ri-search-line"),
Debug("Debug", "/Debug/", "调试运行", UIPackageType.admin, "ri-bug-line"),
// 编辑器
RAD("RAD", "/RAD/", "编辑器", UIPackageType.admin, "ri-cube-line"),
RADDB("RADDB", "/RAD/db/", "数据库插件", UIPackageType.esd, "ri-database-line"),
RADServer("RADServer", "/RAD/server/", "服务器插件", UIPackageType.esd, "ri-server-line"),
RADResource("RADResource", "/RAD/resource/", "资源管理", UIPackageType.esd, "ri-box-3-line"),
RADProject("RADProject", "/RAD/project/", "编辑器工程插件", UIPackageType.esd, "ri-node-tree"),
RADOrg("RADOrg", "/RAD/org/", "协同插件", UIPackageType.esd, "ri-user-group-line"),
esd("esd", "/esd/", "编辑器插件", UIPackageType.esd, "ri-puzzle-line"),
// 系统菜单
systemnav("systemnav", "/system/nav/", "导航菜单", UIPackageType.sys, "ri-menu-line"),
action("action", "/action/", "系统菜单", UIPackageType.sys, "ri-css3-line"),
system("system", "/system/", "统计监控", UIPackageType.sys, "ri-line-chart-line"),
// 库表管理
db("db", "/db/", "库表管理", UIPackageType.sys, "ri-database-line"),
fdt("fdt", "/fdt/", "数据库示例", UIPackageType.sys, "ri-database-line"),
// 工具
formula("formula", "/admin/formula/", "公式管理", UIPackageType.tool, "ri-calculator-line"),
orgmanager("orgmanager", "/admin/org/", "组织机构管理", UIPackageType.tool, "ri-node-tree"),
admin("admin", "/admin/", "管理工具", UIPackageType.tool, "ri-tools-line"),
bpd("bpd", "/admin/bpd/", "工作流插件", UIPackageType.tool, "ri-exchange-line"),
esdright("esdright", "/esd/right/", "权限插件", UIPackageType.tool, "ri-key-line"),
esddic("esddic", "/esd/dic/", "字典", UIPackageType.tool, "ri-book-line"),
esdpage("esdpage", "/esd/page/", "页面插件", UIPackageType.tool, "ri-file-line"),
// DSM 建模
dsm("dsm", "/dsm/", "DSM建模", UIPackageType.dsm, "ri-settings-3-line"),
dsmAgg("dsm", "/dsm/agg/", "聚合模型", UIPackageType.dsm, "ri-node-tree"),
dsmEsdClass("dsmEsdClass", "/dsm/esdclass/", "实体关系", UIPackageType.dsm, "ri-settings-3-line"),
dsmManger("dsmManger", "/dsm/manager/", "领域实例", UIPackageType.dsm, "ri-settings-3-line"),
dsmAdmin("dsmAdmin", "/dsm/admin/", "控制台", UIPackageType.dsm, "ri-speed-line"),
dsmWebSite("dsmWebSite", "/dsm/website/", "模板站点", UIPackageType.dsm, "ri-earth-line"),
dsmManager("dsmManager", "/dsm/manager/", "DSM管理", UIPackageType.dsm, "ri-tools-line"),
repository("repository", "/dsm/repository/", "库表关系", UIPackageType.dsm, "ri-database-line"),
dsmTable("dsmTable", "/dsm/repository/table/", "资源", UIPackageType.dsm, "ri-table-line"),
dsmNav("dsmNav", "/dsm/nav/", "导航", UIPackageType.dsm, "ri-menu-line"),
dsmTemp("dsmTemp", "/dsm/temp/", "领域模板", UIPackageType.dsm, "ri-file-copy-line"),
dsmWebSiteTemp("dsmWebSiteTemp", "/dsm/website/temp/", "模板管理", UIPackageType.dsm, "ri-file-copy-line"),
dsmSelect("dsmSelect", "/dsm/website/select/", "站点模板", UIPackageType.dsm, "ri-earth-line");
}
代码位置:UIPackagePathType.java
ProjectConfig 包含项目的所有配置信息:
public class ProjectConfig {
// 数据库配置
private List<DataBaseConfig> dbConfigs = new ArrayList<DataBaseConfig>();
// 用户包
private String usrPackage;
// 项目名称
private String projectName;
// 公共路径
private String publicPath;
// 工作空间
private String workSpace;
// 资源类型
private ProjectResourceType resourceType;
// API 过滤器
private List<String> apiFilter = new ArrayList<String>();
// 自定义模块过滤器
private List<String> customModuleFilter = new ArrayList<String>();
// 索引
private String index = "App.index";
// 公共服务器 URL
private String publicServerUrl;
// 扩展组件
private List<String> extcoms = new ArrayList<String>();
private List<String> extmodules = new ArrayList<String>();
// 字体、图片、样式
private List<String> fonts = new ArrayList<String>();
private List<String> imgs = new ArrayList<String>();
private List<String> styles = new ArrayList<String>();
// 开发人员
public Map<ProjectRoleType, Set<String>> devPersons = new HashMap<ProjectRoleType, Set<String>>();
}
代码位置:ProjectConfig.java
4.4 项目级配置的优势
| 特性 | 传统代码生成 | BridgeCode |
|---|---|---|
| 代码格式 | JavaScript/Java | Java (注解驱动) |
| 生成方式 | 静态生成 | 动态生成 (C2U) |
| 集成方式 | 手动集成 | 自动集成 |
| 更新方式 | 重新生成 | 热加载 (C2U) |
| 版本控制 | 困难 | 支持 VFS |
| 类型安全 | 弱类型 | 强类型 |
| 维护性 | 低 | 高 |
| 模板数量 | 固定 | 几百种 (NLP) |
| 配置粒度 | 全局 | 项目级 |
| 自学习 | 无 | 支持 (NLP) |
BridgeCode 的设计理念是"声明式生成,运行时集成,自学习优化":
Ooder D2B 框架支持几百种模板,通过多个维度进行分类:
| 组件类型 | 模板数量 | 说明 |
|---|---|---|
| Block | 5+ | 块组件模板 |
| Div | 5+ | DIV 容器模板 |
| Form | 10+ | 表单组件模板 |
| Grid | 10+ | 网格组件模板 |
| Tree | 8+ | 树形组件模板 |
| Gallery | 5+ | 画廊组件模板 |
| SVG | 5+ | SVG 绘图模板 |
| Tabs | 8+ | 标签页模板 |
| Chart | 10+ | 图表模板 |
| Panel | 5+ | 面板模板 |
| Layout | 5+ | 布局模板 |
| 导航组件 | 20+ | 导航组件模板 |
| 主组件 | 5+ | 主组件模板 |
| 表单组件 | 10+ | 表单字段模板 |
总计:超过 100 种组件模板
| 应用场景 | 模板数量 | 说明 |
|---|---|---|
| 用户工程 (App) | 10+ | 用户应用模板 |
| 流程应用 (bpm) | 20+ | 流程管理模板 |
| 表单插件 | 10+ | 表单插件模板 |
| JAVA 编译 | 15+ | Java 编译模板 |
| 嵌入模块 | 10+ | 嵌入模块模板 |
| 编辑器 (RAD) | 20+ | 编辑器模板 |
| 系统菜单 | 15+ | 系统菜单模板 |
| 统计监控 | 10+ | 监控统计模板 |
| 库表管理 | 10+ | 库表管理模板 |
| 工具 | 15+ | 工具模板 |
| DSM 建模 | 20+ | DSM 建模模板 |
总计:超过 150 种应用场景模板
Ooder 框架通过 AI Skills 辅助完成复杂的模板库维护:
通过 VFS 支持模板版本管理:
支持模板的共享和复用:
Ooder D2B 框架相比传统代码生成方案,具有以下核心优势:
传统方案:
BridgeCode 方案:
传统方案:
BridgeCode 方案:
传统方案:
BridgeCode 方案:
传统方案:
BridgeCode 方案:
传统方案:
BridgeCode 方案:
// 使用时间缓存避免频繁加载
Long createTime = (Long) contextMap.get(url + "[TIME]");
if (module == null && (createTime == null || System.currentTimeMillis() - createTime > 500)) {
// 重新加载
}
// 使用 synchronized 保证线程安全
synchronized (module.getClassName()) {
// 动态编译逻辑
}
// 完善的异常处理
try {
module = buildView(methodAPIBean, null, projectName, valueMap, !isCache(methodAPIBean));
} catch (Exception e) {
e.printStackTrace();
throw new JDSException(e);
}
// 生产环境使用 HYBRID 模式
FullNlpComponentConverter converter = new FullNlpComponentConverter(llmInterface, skillsBridge);
converter.setConversionMode(FullNlpComponentConverter.ConversionMode.HYBRID);
// 注册自定义技能
skillsBridge.registerSkill("customSkill", customSkillImplementation);
// 正确初始化和关闭
llmInterface.initialize();
skillsBridge.initialize();
// 使用完成后关闭
llmInterface.close();
skillsBridge.close();
// 设置项目配置
ProjectConfig config = new ProjectConfig();
config.setProjectName("myProject");
config.setUsrPackage("com.example");
config.setApiFilter(Arrays.asList("api1", "api2"));
// 使用 UIPackagePathType 确定包路径
UIPackagePathType pathType = UIPackagePathType.fromSystemCode("bpm");
String pattern = pathType.getPattern();
// 配置开发人员
config.addDevPersons(ProjectRoleType.developer, "user1");
config.addDevPersons(ProjectRoleType.tester, "user2");
// 根据组件类型选择模板
String componentType = "Form";
NlpBaseUIComponent component = converter.convertFromNaturalLanguage("创建一个用户表单", componentType);
// 自定义模板
NlpComponentFactory.registerCreator("CustomComponent", () -> new CustomNlpComponent());
// 使用 VFS 进行版本管理
Folder versionFolder = dsmInst.getJavaFolder().createChildFolder("version-1.0");
versionFolder.upload("template.ftl", new FileInputStream(templateFile));
本文深入剖析了 BridgeCode 如何与企业原有代码合体的核心机制:
BridgeCode 机制具有以下技术优势:
BridgeCode 机制适用于以下场景:
BridgeCode 机制的未来发展方向:
BridgeCode 机制是 Ooder D2B 框架的核心创新,通过 C2U 动态编译、NLP Module 自学习、项目级配置等技术,实现了与企业原有代码的无缝集成。它不仅解决了传统代码生成的痛点,还为企业级应用开发提供了一种全新的思路和方法。
Ooder 框架通过几百种模板、AI 辅助维护、项目级配置等特性,构建了一个强大的代码生成生态系统。这个生态系统不仅提高了开发效率,还保证了代码质量和可维护性。
希望本文能够帮助读者深入理解 BridgeCode 机制,并在实际项目中应用和推广。