diff --git a/LICENSE b/LICENSE
index 6364cff6112763064f7a2e3da158d0f4d15b9183..300577bf1335da552ff9982a79b022f2fc70b1ef 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,21 +1,21 @@
-MIT License
-
-Copyright (c) 2023 疯狂的挖掘机
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+MIT License
+
+Copyright (c) 2023 Otis Duer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.en.md b/README.en.md
deleted file mode 100644
index 3b32d4976e3b49302d99ea9fbf5a42f8189e3c0c..0000000000000000000000000000000000000000
--- a/README.en.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# data_harness-be
-
-#### Description
-驭数轻云后端代码仓库
-
-#### Software Architecture
-Software architecture description
-
-#### Installation
-
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### Instructions
-
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### Contribution
-
-1. Fork the repository
-2. Create Feat_xxx branch
-3. Commit your code
-4. Create Pull Request
-
-
-#### Gitee Feature
-
-1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
-2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
-3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
-4. The most valuable open source project [GVP](https://gitee.com/gvp)
-5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
-6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
diff --git a/README.md b/README.md
index 8995200f4a99ba9a4a7cb28510b4cc34e4ed75f0..b58c9fdc95edff812c0f39f1f76256aba8baa119 100644
--- a/README.md
+++ b/README.md
@@ -3,23 +3,20 @@
📃 [[Gitee](https://gitee.com/data_harness_cloud/data_harness-be)] [[GitHub](https://github.com/data-harness-cloud/data_harness-be.git)]
- 👋 加入我们的 [[WeChat]]
+ 👋 加入我们的 WeChat
-## 介绍
+## 介绍(代码将在下周更新到仓库)
“驭数轻云数据平台”(以下简称驭数平台)是驭数团队开源的数据平台,平台致力于为中小企业提供易用、低门槛基于大模型打造的数据平台,助力企业便捷、低成本的实现“掌控数据、轻盈如云”的愿景。驭数平台短期目标致力于满足企业的基础数据梳理、数据治理、数据中台等数据功能,远景目标是基于大模型为广大企业提供开源可用的Data Fabric实现平台。
开发团队是一群热爱开源的小伙伴,各自在多年的工作以及项目实践中发现,很多企业想建设企业自己的数据平台的时候往往找不到一款趁手工具。而且商业平台的价格昂贵,实施成本高,基本不可能进行二次开发。往往企业可能需要的功能只是其中的一点,但是不得不面对大集群、多功能的捆绑购买。团队经过一段时间的准备,为企业、个人在数据的应用以及数据平台建设,提供多一种选择。同时随着大模型的发展,团队将深入思考大模型在数据领域的应用,以及在数据领域的各个环节如何与大模型结合,并且这些成果将会同步更新在开源平台。
平台的开发刚起步,还有非常多的问题,希望社区的小伙伴多一些包容,也欢迎更多的小伙伴能够加入到团队一起共建。
-### [ **驭数轻云数据平台系统演示** ](http://175.24.190.217:30666/#/dashboard/index)
-因集成了AI服务,有限的算力需要不断的用于训练模型,暂时需要申请体验,用户名与密码请联系开发团队,后期算力改善后将完全开放体验。
-
驭数平台由如下特性:
1. **基于大模型的数据平台:** 驭数平台是基于大模型为驱动的综合数据平台,支持企业将自身结构以及非结构化数据成果与大模型结合,平台将支持基于大模型的数据应用,例如:数据探源、图表生成、数据报告、数据归因、技术元数据与业务元数据融合等等。
2. **更完整的数据功能:** 驭数平台的功能将会完整的支撑企业数据使用的各个环节,从作为基础数据平台的数据积累、数据中台、数据治理、大模型落地应用。
3. **全面的开源支撑:** 除了数据平台全部开源,在大模型领域的成果也会开源,包括我们基于项目进行微调的私有模型,例如业务元数据与技术元数据的微调模型、数据治理成果的微调模型等等,团队以完全开放的心态与社区小伙伴共建数据平台。
4. **轻量化平台:** 团队小伙伴来自于五湖四海,多年在开发以及数据领域的经验教训,深刻认识到数据平台的轻量化对中小企业的是一个不小的福音,我们本次开发的是基于单体服务的平台,并且暂时没有考虑Hadoop体系,而是以Doris为作为基础的存算基础平台,大大的减轻大家的使用负担。同时也兼容单机MySQL,完全轻装上阵,实现数据平台的建设以及落地应用。
-5. **高质量的界面UI:** 颜值即正义,我们很荣幸的邀请到UI设计师与团队一起推动开源平台的建设,直接输出企业级UI,大家开箱即用,不虚任何场合的演示。
+5. **高质量的界面UI:**颜值即正义,我们很荣幸的邀请到UI设计师与团队一起推动开源平台的建设,直接输出企业级UI,大家开箱即用,不虚任何场合的演示。
---
@@ -27,97 +24,50 @@
由于会提供模型,尽管模型在训练的各个阶段都尽力确保数据的合规性和准确性,但由于模型规模较小,且模型受概率随机性因素影响,无法保证输出内容的准确。同时模型的输出容易被用户的输入误导。**本项目不承担开源模型和代码导致的数据安全、舆情风险或发生任何模型被误导、滥用、传播、不当利用而产生的风险和责任。**
-
-## 架构图
-### 整体架构图
-
-
-### 数据架构图
-
-
-## 单体服务模块列表
-| 模块 | Doris/MySQL | Hadoop体系 |
-| --- | --- | --- |
-| 系统管理模块 | 开发中| 待计划|
-| 数据资源模块 | 开发中| 待计划|
-| 数据蓝图模块 | 开发中| 待计划|
-| 数据开发模块 | 开发中| 待计划|
-| 数据发现模块 | 计划| 待计划|
-| 数据服务模块 | 计划| 待计划|
-| 数据工厂模块 | 计划| 待计划|
-| 数据可视模块 | 计划| 待计划|
-| 数据运营模块 | 计划| 待计划|
-| AI大模型探索模块 | 计划| 待计划|
-
-## 微服务模块列表
-| 模块 | Doris/MySQL | Hadoop体系 |
-| --- | --- | --- |
-| 系统管理模块 | 计划| 待计划|
-| 数据资源模块 | 计划| 待计划|
-| 数据蓝图模块 | 计划| 待计划|
-| 数据开发模块 | 计划| 待计划|
-| 数据发现模块 | 计划| 待计划|
-| 数据服务模块 | 计划| 待计划|
-| 数据工厂模块 | 计划| 待计划|
-| 数据可视模块 | 计划| 待计划|
-| 数据运营模块 | 计划| 待计划|
-| AI大模型探索模块 | 计划| 待计划|
+## 模块列表
+| 模块 | 完成度 |
+| --- | --- |
+| 系统管理模块 | 开发中|
+| 数据资源模块 | 开发中|
+| 数据蓝图模块 | 开发中|
+| 数据开发模块 | 开发中|
+| 数据发现模块 | 计划|
+| 数据服务模块 | 计划|
+| 数据工厂模块 | 计划|
+| 数据可视模块 | 计划|
+| 数据运营模块 | 计划|
+| AI大模型探索模块 | 计划|
## 项目截图
-项目登录页
-
+项目登录页

项目首页
-
-
-目录边栏
-
+## 
-AI大模型对话
-
+目录边栏

-AI大模型对话示例
-
+AI大模型对话

-数据规划
-
+AI大模型对话示例

-模型概览和设计
-
-
+数据规划

-新建模型
-
+模型概览和设计


-数据开发
-
+新建模型

-数据传输
-
+数据开发

-任务调度列表
-
+数据传输

+任务调度列表

## 技术栈
-| 模块 | 组件 | 版本 | 计划 |
-|------|------------|-----|-----------------|
-| 前端 | vue | 3.x | TS |
-| 后端 | Springboot | 2.x | 3.x |
-| 架构 | 单体 | -- | 微服务 |
-| 部署 | Docker | -- | K8S |
-| 数据传输 | Seatunnel | 2.x | flink |
-| 任务调度 | Quartz | -- | DolphinSchedule |
-| 存算引擎 | Doris/MySQl | -- | Hadoop |
-| LLM大模型 | 开源模型/商用模型 | -- | 微调数据行业模型 |
-
-
+待补充...
### 部署过程
-[前端工程-基于Vue3](https://gitee.com/data_harness_cloud/data_harness-fe)
-
-[部署工程-一键部署](https://gitee.com/data_harness_cloud/data_harness_deployment)
\ No newline at end of file
+待补充...
diff --git a/application-webadmin/src/main/java/supie/webadmin/app/controller/DatabaseManagementController.java b/application-webadmin/src/main/java/supie/webadmin/app/controller/DatabaseManagementController.java
index d435a076da65effa07e7a6ca88cab38d06f85e2d..2335f0d00c6f09a993dd4b77cafc9d4095bc4a21 100644
--- a/application-webadmin/src/main/java/supie/webadmin/app/controller/DatabaseManagementController.java
+++ b/application-webadmin/src/main/java/supie/webadmin/app/controller/DatabaseManagementController.java
@@ -50,7 +50,7 @@ public class DatabaseManagementController {
strategy.closeAll();
} catch (Exception e) {
log.error("数据源连接失败", e);
- return ResponseResult.error("500", "连接失败:"+e.getMessage());
+ return ResponseResult.error("500", "连接失败:"+e.getMessage());
}
return ResponseResult.success("连接成功!");
}
@@ -69,11 +69,11 @@ public class DatabaseManagementController {
Strategy strategy = strategyFactory.getStrategy(
databaseManagement.getDatabaseType(), databaseManagement.getIp(), databaseManagement.getPort(),
databaseManagement.getDatabaseName(), databaseManagement.getUsername(), databaseManagement.getPassword());
- price = strategy.queryDatabaseTable(databaseManagement);
+ price = strategy.queryDatabaseTable(databaseManagement.getDatabaseName());
strategy.closeAll();
} catch (Exception e) {
log.error("数据源连接失败", e);
- return ResponseResult.error("500", e.getMessage());
+ return ResponseResult.error("500", e.getMessage());
}
return ResponseResult.success(price);
}
@@ -92,11 +92,11 @@ public class DatabaseManagementController {
Strategy strategy = strategyFactory.getStrategy(
databaseManagement.getDatabaseType(), databaseManagement.getIp(), databaseManagement.getPort(),
databaseManagement.getDatabaseName(), databaseManagement.getUsername(), databaseManagement.getPassword());
- price = strategy.queryTableFields(databaseManagement);
+ price = strategy.queryTableFields(databaseManagement.getDatabaseName(), databaseManagement.getTableName());
strategy.closeAll();
} catch (Exception e) {
- log.error("数据源连接失败",e);
- return ResponseResult.error("500",e.getMessage());
+ log.error("数据源连接失败", e);
+ return ResponseResult.error("500", e.getMessage());
}
return ResponseResult.success(price);
}
@@ -112,13 +112,21 @@ public class DatabaseManagementController {
resultData = strategy.executeSqlList(sql);
strategy.closeAll();
} catch (Exception e) {
- log.error("数据源连接失败",e);
- return ResponseResult.error("500", e.getMessage());
+ log.error("数据源连接失败", e);
+ return ResponseResult.error("500", e.getMessage());
}
return ResponseResult.success(resultData);
}
-}
-
-
+ @PostMapping("/getAllDatabaseName")
+ @ApiOperation("获取可操作的所有数据库名称")
+ public ResponseResult> getAllDatabaseName(@MyRequestBody DatabaseManagement databaseManagement){
+ Strategy strategy = strategyFactory.getStrategy(
+ databaseManagement.getDatabaseType(), databaseManagement.getIp(), databaseManagement.getPort(),
+ databaseManagement.getDatabaseName(), databaseManagement.getUsername(), databaseManagement.getPassword());
+ List resultData = strategy.queryAllDatabaseName();
+ strategy.closeAll();
+ return ResponseResult.success(resultData);
+ }
+}
diff --git a/application-webadmin/src/main/java/supie/webadmin/app/controller/ProjectEngineController.java b/application-webadmin/src/main/java/supie/webadmin/app/controller/ProjectEngineController.java
index 4788dfd50a270584ae81059bc031a02496537d34..aee911b746aa9b8affa09afe5ade909634adc9a8 100644
--- a/application-webadmin/src/main/java/supie/webadmin/app/controller/ProjectEngineController.java
+++ b/application-webadmin/src/main/java/supie/webadmin/app/controller/ProjectEngineController.java
@@ -1,8 +1,14 @@
package supie.webadmin.app.controller;
+import cn.hutool.core.util.StrUtil;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
import supie.common.log.annotation.OperationLog;
import supie.common.log.model.constant.SysOperationLogType;
import com.github.pagehelper.page.PageMethod;
+import supie.webadmin.app.service.databasemanagement.Strategy;
+import supie.webadmin.app.service.databasemanagement.StrategyFactory;
import supie.webadmin.app.vo.*;
import supie.webadmin.app.dto.*;
import supie.webadmin.app.model.*;
@@ -33,6 +39,10 @@ public class ProjectEngineController {
@Autowired
private ProjectEngineService projectEngineService;
+ @Autowired
+ private ProjectMainService projectMainService;
+ @Autowired
+ private StrategyFactory strategyFactory;
/**
* 新增数据项目-存算引擎表数据。
@@ -198,4 +208,64 @@ public class ProjectEngineController {
}
return ResponseResult.success();
}
+
+ /**
+ * 获取可操作的数据库集
+ *
+ * @param projectId 项目 ID
+ * @return 返回结果
+ * @author 王立宏
+ * @date 2023/11/14 05:30
+ */
+ @PostMapping("/getAllDatabaseName")
+ @ApiOperation("获取可操作的所有数据库名称")
+ public ResponseResult> getAllDatabaseName(@MyRequestBody Long projectId){
+ if (projectId == null) {
+ return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
+ }
+ ProjectMain projectMain = projectMainService.getByIdWithRelation(projectId, MyRelationParam.full());
+ if (projectMain == null || projectMain.getProjectEngineId() == null || projectMain.getProjectEngine() == null) {
+ return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST,
+ "数据验证失败,当前 [数据] 并不存在,请刷新后重试!");
+ }
+ ProjectEngine projectEngine = projectMain.getProjectEngine();
+ Strategy strategy = strategyFactory.getStrategy(
+ projectEngine.getEngineType(), projectEngine.getEngineHost(), projectEngine.getEnginePort(),
+ null, projectEngine.getEngineUsername(), projectEngine.getEnginePassword());
+ List resultData = strategy.queryAllDatabaseName();
+ strategy.closeAll();
+ return ResponseResult.success(resultData);
+ }
+
+ /**
+ * 执行 SQL
+ *
+ * @param sql SQL语句
+ * @param databaseName 目标数据库名称
+ * @param projectId 项目 ID
+ * @return 响应结果
+ * @author 王立宏
+ * @date 2023/11/14 05:30
+ */
+ @ApiOperation("执行sql接口")
+ @PostMapping("/executeSql")
+ public ResponseResult>> executeSql(
+ @MyRequestBody String sql, @MyRequestBody String databaseName, @MyRequestBody Long projectId){
+ if (projectId == null || StrUtil.isBlank(sql) || StrUtil.isBlank(databaseName)) {
+ return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
+ }
+ ProjectMain projectMain = projectMainService.getByIdWithRelation(projectId, MyRelationParam.full());
+ if (projectMain == null || projectMain.getProjectEngineId() == null || projectMain.getProjectEngine() == null) {
+ return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST,
+ "数据验证失败,当前 [数据] 并不存在,请刷新后重试!");
+ }
+ ProjectEngine projectEngine = projectMain.getProjectEngine();
+ Strategy strategy = strategyFactory.getStrategy(
+ projectEngine.getEngineType(), projectEngine.getEngineHost(), projectEngine.getEnginePort(),
+ databaseName, projectEngine.getEngineUsername(), projectEngine.getEnginePassword());
+ List