# web-kettle **Repository Path**: ding123123/web-kettle ## Basic Information - **Project Name**: web-kettle - **Description**: 开源kettle 9 引擎的web kettle版本,支持查询等150多个转换组件以及工作50多个组件操作方式基本上和客户端相似 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 42 - **Created**: 2025-06-27 - **Last Updated**: 2025-06-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README **本项目持续更新维护** ### **新版本已经上线,集成组织机构、用户、权限角色等功能。正在扩展 web kettle里面集成基于数据字典标准化、数据质控、血缘分析等企业级外围功能。** **承接web kettle组件扩展功能** **新版本演示地址,注册好账号后联系管理员(Q:598762549) 个人用户勿扰,开通角色即可试用 [http://43.137.47.95:8090/](http://43.137.47.95:8090/)** ********一定要开通角色才能正常使用,请联系管理员开通** **功能截图如下:**   ![输入图片说明](img/%E8%AE%BE%E8%AE%A1%E5%99%A8-%E4%BB%BB%E5%8A%A1%E7%AE%A1%E7%90%86.png) ![输入图片说明](img/%E8%AE%BE%E8%AE%A1%E5%99%A8%E6%96%B0%E5%8A%9F%E8%83%BD.jpg) ![输入图片说明](img/%E8%AE%BE%E8%AE%A1%E5%99%A8-%E8%BD%AC%E6%8D%A2.png) ![输入图片说明](img/%E8%AE%BE%E8%AE%A1%E5%99%A8-%E8%BD%AC%E6%8D%A2%E8%AE%BE%E8%AE%A1%E5%99%A8%E5%8F%B3%E9%94%AE%E5%8A%9F%E8%83%BD.png) ![输入图片说明](img/%E8%AE%BE%E8%AE%A1%E5%99%A8-%E8%BD%AC%E6%8D%A2-%E7%BB%84%E4%BB%B6%E5%8F%B3%E9%94%AE%E5%8A%9F%E8%83%BD.png) [点击跳转使用手册->查看演示探讨](http://43.137.47.95/web-etl-docs) ** ### 合作联系QQ:598762549  ** ### 1. 基于kettle 9 开源引擎改造的web-kettle 目前的最新版本在之前的基础上基于用户的需求做了很多功能优化,生产环境比较稳定。 ### 2. 已经做了输入、输出、转换、应用、流程、脚本、查询等150多个转换组件以及工作50多个组件,可按需根据业务定制组件 ### 3. 集成调度平台 和 web-kettle流程设计器直接在浏览器中拖拉拽节点配置属性,然后通过调度模块实现完美调度,支持分布式、集群、前置机部署 ; ### 4. 由于资源库形式维护起来方便,但是执行效率极其低下,尤其多人操作ETL任务的时候会锁库,脚本模式完美规避这个问题,而且解决了数据库每个脚本单独配置,采用目录形式管理多人协作很方便。时长较长任务支持后台执行,刷新的时候会重现当前任务状态,无需客户端一直等待。 ### 5. 深入研究过kettle 源码,优化部分bug。但是无法做出客户端全部交互效果,不过基本上很接近,简单易用代码简洁,很容易进行二次开发扩展。 ### 6. 技术框架 spring boot 、mybatis 、vue、element-ui ### 7. 本项目开发持续接近3年,生产环境也部署过上百个节点,再配合自带的调度平台,开源作为完整的一套ETL解决方案。 ### 8、后台代码如何实现一个组件。(比如要实现一个 调用一个存储过程的组件) ### 9、扩展组件方式: ``` package org.flhy.ext.trans.steps; import com.mxgraph.model.mxCell; import com.mxgraph.util.mxUtils; import org.flhy.ext.core.PropsUI; import org.flhy.ext.trans.step.AbstractStep; import org.flhy.ext.utils.JSONArray; import org.flhy.ext.utils.JSONObject; import org.flhy.ext.utils.StringEscapeHelper; import org.pentaho.di.core.Const; import org.pentaho.di.core.database.DatabaseMeta; import org.pentaho.di.core.row.ValueMeta; import org.pentaho.di.core.row.ValueMetaInterface; import org.pentaho.di.core.row.value.ValueMetaFactory; import org.pentaho.di.trans.step.StepMetaInterface; import org.pentaho.di.trans.steps.dbproc.DBProcMeta; import org.pentaho.di.trans.steps.selectvalues.SelectMetadataChange; import org.pentaho.di.trans.steps.selectvalues.SelectValuesMeta; import org.pentaho.di.trans.steps.sql.ExecSQLMeta; import org.pentaho.metastore.api.IMetaStore; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import java.util.List; // author sf 2019-08-06 @Component("DBProc") @Scope("prototype") public class DBProc extends AbstractStep { @Override public void decode(StepMetaInterface stepMetaInterface, mxCell cell, List databases, IMetaStore metaStore) throws Exception { DBProcMeta DBProcsMeta = (DBProcMeta) stepMetaInterface; String con = cell.getAttribute("connection"); DBProcsMeta.setDatabase(DatabaseMeta.findDatabase(databases, con)); DBProcsMeta.setProcedure(cell.getAttribute("procedure")); DBProcsMeta.setResultName(cell.getAttribute("resultName")); DBProcsMeta.setAutoCommit("Y".equalsIgnoreCase(cell.getAttribute("autoCommit"))); DBProcsMeta.setResultType(ValueMetaFactory.getIdForValueMeta(cell.getAttribute("resultType"))); // JSONArray jsonArray = JSONArray.fromObject(cell.getAttribute( "argument" )); // DBProcsMeta.allocate( jsonArray.size() ); // for(int i=0; i