Browse Source

ds适配改造及数据安全接口升级

master
siyaqi 3 weeks ago
parent
commit
a2b4a2ee4e
  1. 28
      vue-fastapi-backend/module_admin/service/metasecurity_service.py
  2. 1
      vue-fastapi-backend/requirements.txt
  3. 13
      vue-fastapi-frontend/src/api/meta/metaInfo.js
  4. 32
      vue-fastapi-frontend/src/views/meta/metatask/index.vue

28
vue-fastapi-backend/module_admin/service/metasecurity_service.py

@ -23,6 +23,7 @@ from sqlglot.expressions import Table
from sqlglot import exp ,parse_one from sqlglot import exp ,parse_one
from typing import Set from typing import Set
from sqlparse.tokens import Keyword, DML from sqlparse.tokens import Keyword, DML
from urllib.parse import quote_plus
class MetaSecurityService: class MetaSecurityService:
""" """
数据源安全管理模块服务层 数据源安全管理模块服务层
@ -379,7 +380,9 @@ class MetaSecurityService:
# 1️⃣ 去掉 jdbc 前缀 # 1️⃣ 去掉 jdbc 前缀
jdbc_prefixes = { jdbc_prefixes = {
"jdbc:mysql://": len("jdbc:mysql://"), "jdbc:mysql://": len("jdbc:mysql://"),
"jdbc:postgresql://": len("jdbc:postgresql://") "jdbc:postgresql://": len("jdbc:postgresql://"),
"jdbc:oracle:thin:@//": len("jdbc:oracle:thin:@//"),
"jdbc:oracle:thin:@": len("jdbc:oracle:thin:@")
} }
for prefix, length in jdbc_prefixes.items(): for prefix, length in jdbc_prefixes.items():
if address.startswith(prefix): if address.startswith(prefix):
@ -410,6 +413,21 @@ class MetaSecurityService:
pool_pre_ping=True, pool_pre_ping=True,
connect_args={"timeout": 5} # ⭐ 关键 connect_args={"timeout": 5} # ⭐ 关键
) )
elif db_type.lower() == "oracle":
address = db_params["address"].lstrip("/")
user = quote_plus(db_params["user"])
password = quote_plus(db_params["password"])
connect_type = (db_params.get("connectType") or "").upper()
service_or_sid = quote_plus(db_params.get("database", ""))
if connect_type == "ORACLE_SID":
conn_str = f"oracle+oracledb://{user}:{password}@{address}/?sid={service_or_sid}"
else:
conn_str = f"oracle+oracledb://{user}:{password}@{address}/?service_name={service_or_sid}"
engine = create_async_engine(
conn_str,
pool_pre_ping=True,
connect_args={"transport_connect_timeout": 5}
)
else: else:
raise ValueError("不支持的数据库类型") raise ValueError("不支持的数据库类型")
@ -501,6 +519,14 @@ class MetaSecurityService:
FROM INFORMATION_SCHEMA.COLUMNS FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '{table}' WHERE TABLE_NAME = '{table}'
""" """
elif db_type.lower() == "oracle":
query = f"""
SELECT COLUMN_NAME AS "column_name"
FROM ALL_TAB_COLUMNS
WHERE OWNER = UPPER('{schema}')
AND TABLE_NAME = UPPER('{table}')
ORDER BY COLUMN_ID
"""
else: else:
raise ValueError(f"暂不支持数据库类型: {db_type}") raise ValueError(f"暂不支持数据库类型: {db_type}")

1
vue-fastapi-backend/requirements.txt

@ -34,6 +34,7 @@ mdurl==0.1.2
minio==7.2.14 minio==7.2.14
numpy==2.2.1 numpy==2.2.1
openpyxl==3.1.5 openpyxl==3.1.5
oracledb==2.2.1
orjson==3.10.12 orjson==3.10.12
packaging==25.0 packaging==25.0
pandas==2.2.2 pandas==2.2.2

13
vue-fastapi-frontend/src/api/meta/metaInfo.js

@ -1,4 +1,5 @@
import request from '@/utils/request' import request from '@/utils/request'
import cache from '@/plugins/cache'
// 查询参数列表 // 查询参数列表
export function getDataSourceList(query) { export function getDataSourceList(query) {
@ -100,7 +101,17 @@ export function getProcData(param){
params: param params: param
}) })
} }
export function getschemaById(id) {
const query = {
userName: cache.local.get("username"),
password: cache.local.get("password")
}
return request({
url: '/ds-api/dolphinscheduler/datasources/schemas?datasource='+id,
method: 'get',
headers: {dashUserName:query.userName,dashPassword:query.password}
})
}

32
vue-fastapi-frontend/src/views/meta/metatask/index.vue

@ -500,13 +500,22 @@
</div> </div>
<el-form-item label="模式列表" prop="dbSName"> <el-form-item label="模式列表" prop="dbSName">
<el-input <el-select
v-model="form.dbSName" v-model="form.dbSName"
filterable
allow-create
clearable
placeholder="请输入模式列表,不填即采集全部的模式" placeholder="请输入模式列表,不填即采集全部的模式"
maxlength="30"
:disabled="isEdit" :disabled="isEdit"
style="width: 80%" style="width: 80%"
>
<el-option
v-for="item in dbSCodeList"
:key="item"
:label="item"
:value="item"
/> />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -568,6 +577,7 @@
<script setup name="MetaTask"> <script setup name="MetaTask">
import { ref, reactive, onMounted, watch } from "vue"; import { ref, reactive, onMounted, watch } from "vue";
import { listmetatask, getmetatask, delmetatask, addmetatask, updatemetatask, downOrUpmetatask, datasourcetree, datasourceall ,dsmetataskdelete} from "@/api/meta/metatask"; import { listmetatask, getmetatask, delmetatask, addmetatask, updatemetatask, downOrUpmetatask, datasourcetree, datasourceall ,dsmetataskdelete} from "@/api/meta/metatask";
import { getschemaById} from "@/api/meta/metaInfo";
import runDialog from "./runDialog"; import runDialog from "./runDialog";
import dsDialog from "./dsDialog"; import dsDialog from "./dsDialog";
import logDialog from "./logsDialog"; import logDialog from "./logsDialog";
@ -595,10 +605,7 @@ const workerGroupList = ref(undefined);
const defindName = ref(""); const defindName = ref("");
const dbResourceOptions = ref(undefined); const dbResourceOptions = ref(undefined);
const dbRCodeList = ref(undefined); const dbRCodeList = ref(undefined);
const dbSCodeList = ref([ const dbSCodeList = ref([]);
{ value: "scheam", label: "scheam" },
{ value: "scheam2", label: "scheam2" }
]);
const metataskTypeOptions = ref([ const metataskTypeOptions = ref([
{ value: "0", label: "元数据采集", children: [{ value: "00", label: "表字段" }, { value: "01", label: "存储过程" }] }, { value: "0", label: "元数据采集", children: [{ value: "00", label: "表字段" }, { value: "01", label: "存储过程" }] },
{ value: "1", label: "元数据加工" } { value: "1", label: "元数据加工" }
@ -760,6 +767,17 @@ const reset = () => {
proxy.resetForm("taskForm"); proxy.resetForm("taskForm");
}; };
const loadSchemaList = async (dbRCode) => {
dbSCodeList.value = [];
if (!dbRCode) return;
try {
const response = await getschemaById(dbRCode);
dbSCodeList.value = response?.data || [];
} catch {
dbSCodeList.value = [];
}
};
const getIconClass = (data) => { const getIconClass = (data) => {
let icon="" let icon=""
if (data.parentId == '0') icon= 'Monitor'; if (data.parentId == '0') icon= 'Monitor';
@ -821,6 +839,7 @@ const handleAdd = () => {
return; return;
} }
reset(); reset();
loadSchemaList(clickNode.value?.id);
isEdit.value=false; isEdit.value=false;
open.value = true; open.value = true;
}; };
@ -830,6 +849,7 @@ const handleUpdate = async (row) => {
const metataskId = row.metataskId || ids.value; const metataskId = row.metataskId || ids.value;
const response = await getmetatask(metataskId); const response = await getmetatask(metataskId);
form.value = response.data; form.value = response.data;
await loadSchemaList(form.value.dbRCode);
open.value = true; open.value = true;
isEdit.value=true; isEdit.value=true;

Loading…
Cancel
Save