Browse Source

代码提交

master
si@aidatagov.com 7 days ago
parent
commit
a8c731f926
  1. 15
      vue-fastapi-backend/module_admin/controller/metasecurity_controller.py
  2. 36
      vue-fastapi-backend/module_admin/dao/metaSecurity_dao.py
  3. 14
      vue-fastapi-backend/module_admin/service/metasecurity_service.py
  4. 7
      vue-fastapi-frontend/src/api/meta/metasercurity.js
  5. 160
      vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityCol.vue
  6. 166
      vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityRow.vue

15
vue-fastapi-backend/module_admin/controller/metasecurity_controller.py

@ -41,6 +41,21 @@ async def get_meta_security_row_list(
row_page_query_result = await MetaSecurityService.get_meta_security_row_list_services(query_db, row_page_query, is_page=True)
logger.info('获取行配置列表成功')
return ResponseUtil.success(model_content=row_page_query_result)
@metaSecurityController.get(
'/mdlNamelist/{ssys_id}',
dependencies=[Depends(CheckUserInterfaceAuth('meta:metasecurity:row:list'))]
)
async def get_meta_mdlName_list(
ssys_id: int ,
query_db: AsyncSession = Depends(get_db),
):
"""
获取指定系统下的模式名schema列表
"""
result = await MetaSecurityService.get_meta_mdlName_list_services(query_db, ssys_id)
logger.info("获取系统模式名列表成功")
return ResponseUtil.success(data=result)
@metaSecurityController.get(
'/row/{row_id}', response_model=MetaSecurityRowModel, dependencies=[Depends(CheckUserInterfaceAuth('meta:metasecurity:row:list'))]
)

36
vue-fastapi-backend/module_admin/dao/metaSecurity_dao.py

@ -1,10 +1,9 @@
from sqlalchemy import delete, select, update, desc
from sqlalchemy import delete, func, select, update, desc
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.do.metasecurity_do import MetaSecurityCol, MetaSecurityRow
from module_admin.entity.vo.metasecurity_vo import MetaSecurityColModel, MetaSecurityRowModel
from utils.page_util import PageUtil
from module_admin.entity.do.meta_do import MetadataExtractInfo, MetadataSuppInfo
class MetaSecurityDao:
"""
数据源安全管理模块数据库操作层
@ -82,6 +81,37 @@ class MetaSecurityDao:
db, query, query_object.page_num, query_object.page_size, is_page
)
return row_list
@classmethod
async def get_schema_by_system(cls, db: AsyncSession, ssys_id: int):
"""
获取指定系统下的模式名schema从两个表取合集去重
"""
if not ssys_id:
raise ValueError("系统名(ssys_id)为必填参数")
# 第一个表
q1 = (
select(MetadataExtractInfo.mdl_name.label("schema"))
.where(MetadataExtractInfo.ssys_id == ssys_id)
)
# 第二个表
q2 = (
select(MetadataSuppInfo.mdl_name.label("schema"))
.where(MetadataSuppInfo.ssys_id == ssys_id)
)
# UNION ALL + DISTINCT(正确写法)
union_sub = q1.union_all(q2).subquery()
union_query = (
select(func.distinct(union_sub.c.schema).label("schema"))
.order_by(union_sub.c.schema)
)
result = await db.execute(union_query)
return [row.schema for row in result.fetchall() if row.schema]
@classmethod
async def get_api_col_list(cls, db: AsyncSession, dbRCode: str,dbSName: str,dbTname:str,objType:str,objValue:str):

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

@ -54,6 +54,20 @@ class MetaSecurityService:
"""
row_list_result = await MetaSecurityDao.get_meta_security_row_list(query_db, query_object, is_page)
return row_list_result
@classmethod
async def get_meta_mdlName_list_services(
cls, query_db: AsyncSession, ssys_id: int
):
"""
获取行配置列表信息service
:param query_db: orm对象
:param query_object: 查询参数对象
:param is_page: 是否开启分页
:return: 行配置列表信息对象
"""
row_list_result = await MetaSecurityDao.get_schema_by_system(query_db, ssys_id)
return row_list_result
@classmethod
async def get_meta_security_col_by_id_services(cls, query_db: AsyncSession, colId: str):

7
vue-fastapi-frontend/src/api/meta/metasercurity.js

@ -26,7 +26,12 @@ export function getMetaSecurityCol(colId) {
method: 'get'
})
}
export function getMetaMdlNameList(ssysId) {
return request({
url: '/default-api/meta/metaSecurity/mdlNamelist/' + ssysId,
method: 'get'
})
}
// 查询行配置详情
export function getMetaSecurityRow(rowId) {
return request({

160
vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityCol.vue

@ -174,13 +174,32 @@
</el-select>
</el-form-item>
<el-form-item label="模式" prop="dbSName">
<!-- <el-form-item label="模式" prop="dbSName">
<el-input v-model="form.dbSName" placeholder="请输入模式名称" />
</el-form-item> -->
<el-form-item label="模式" prop="dbSName">
<el-select v-model="form.dbSName" placeholder="选择模式" @change="onSchemaChange">
<el-option v-for="item in schemaList" :key="item" :value="item" :label="item" />
</el-select>
</el-form-item>
<el-form-item label="表名" prop="dbTName">
<el-input v-model="form.dbTName" placeholder="请输入表名称" />
<el-select v-model="form.dbTName" placeholder="选择表" @change="onTableChange" :disabled="!form.dbSName" filterable>
<el-option v-for="table in tableList" :key="table" :value="table" :label="table" />
</el-select>
</el-form-item>
<el-form-item label="字段名称" prop="dbCName">
<el-select
v-model="form.dbCName"
placeholder="选择字段(可多选)"
multiple
collapse-tags
:disabled="!form.dbTName"
>
<el-option v-for="col in columnList" :key="col" :value="col" :label="col" />
</el-select>
</el-form-item>
<el-form-item label="是否可见" prop="ctrlType">
<el-select
v-model="form.ctrlType"
@ -195,9 +214,7 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="字段名称" prop="dbCName">
<el-input v-model="form.dbCName" placeholder="请输入字段名称" />
</el-form-item>
<el-form-item label="对象类型" prop="objType">
<el-select
v-model="form.objType"
@ -259,10 +276,11 @@
<script setup>
import { ref, reactive, onMounted, toRefs } from 'vue';
import { listMetaSecurityCol, addMetaSecurityCol,getMetaSecurityCol, updateMetaSecurityCol, deleteMetaSecurityCol } from "@/api/meta/metasercurity";
import { listMetaSecurityCol, addMetaSecurityCol,getMetaSecurityCol, updateMetaSecurityCol, deleteMetaSecurityCol,getMetaMdlNameList } from "@/api/meta/metasercurity";
import { datasourcetree } from "@/api/meta/metatask";
import { listUser} from "@/api/system/user";
import { listRole} from "@/api/system/role";
import { getMetaDataList, getColumnList } from "@/api/meta/metaInfo"
const { proxy } = getCurrentInstance();
const { metasecurity_ctr, metasecurity_obj, metasecurity_type} = proxy.useDict("metasecurity_ctr", "metasecurity_obj", "metasecurity_type");
@ -274,6 +292,9 @@ const queryParams = ref({
pageNum: 1,
pageSize: 10
});
const schemaList = ref([]) //
const tableList = ref([]) //
const columnList = ref([]) //
const single = ref(true);
const multiple = ref(true);
const dbResoursName = ref(undefined);
@ -309,7 +330,7 @@ const form = ref({
dbRID: 0,
dbSName: '',
dbTName: '',
dbCName: '',
dbCName: [] , //
ctrlType: '',
objType: '',
objValue: '',
@ -355,6 +376,63 @@ const handleObjValueChange = (selectedValues) => {
};
const dataChange = async (dbRID) => {
form.value.dbRID = dbRID
// 1) schema
const res = await getMetaMdlNameList(dbRID)
schemaList.value = res.data
//
form.value.dbSName = ""
form.value.dbTName = ""
form.value.dbCName = []
tableList.value = []
columnList.value = []
const selectedItem = dbResourceOldList.value.find(item => item.id === dbRID);
if (selectedItem) {
// name form.value.dbRName
form.value.dbRName = selectedItem.name;
} else {
// form.value.dbRName
form.value.dbRName = '';
}
}
const onSchemaChange = async (mdlName) => {
form.value.dbTName = ""
form.value.dbCName = []
tableList.value = []
columnList.value = []
if (!mdlName) return
const queryParams = {
ssysId: form.value.dbRID, // ID
mdlName: mdlName,
pageNum: 1,
pageSize: 10000
}
const res = await getMetaDataList(queryParams)
tableList.value = res.data.rows.map(item => item.tabEngName)
}
const onTableChange = async (tabName) => {
form.value.dbCName = []
columnList.value = []
if (!tabName) return
const params = {
ssysId: form.value.dbRID,
mdlName: form.value.dbSName,
tabName: tabName
}
const res = await getColumnList(params)
columnList.value = ["ALL", ...res.data.map(item => item.fldEngName)]
}
//
const getList = async () => {
loading.value = true;
@ -394,18 +472,7 @@ const getRoleName = (objValue) => {
});
return names.join(', ');
};
function dataChange(data) {
// dbResourceOldList name
const selectedItem = dbResourceOldList.value.find(item => item.id === data);
if (selectedItem) {
// name form.value.dbRName
form.value.dbRName = selectedItem.name;
} else {
// form.value.dbRName
form.value.dbRName = '';
}
}
//
const handlePagination = (pageNum, pageSize) => {
queryParams.pageNum = pageNum;
@ -453,8 +520,19 @@ const getDeptTree = async () => {
const handleEdit = (row) => {
reset();
const colId = row.colId || ids.value;
getMetaSecurityCol(colId).then(response => {
form.value = response.data;
const data = response.data;
//
if (data.dbCName && typeof data.dbCName === 'string') {
data.dbCName = data.dbCName.split(',');
} else if (!data.dbCName) {
data.dbCName = [];
}
form.value = data;
dialogVisible.value = true;
dialogTitle.value = "编辑列配置";
});
@ -464,25 +542,35 @@ const handleEdit = (row) => {
function handleSave() {
proxy.$refs["formRef"].validate(valid => {
if (valid) {
if (form.value.colId != undefined&&form.value.colId !="") {
updateMetaSecurityCol(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
dialogVisible.value = false;
getList();
});
} else {
const submitData = { ...form.value };
submitData.objValue = submitData.objValue.join(',');
addMetaSecurityCol(submitData).then(response => {
proxy.$modal.msgSuccess("新增成功");
dialogVisible.value = false;
getList();
});
}
if (!valid) return;
// form
const submitData = { ...form.value };
//
if (Array.isArray(submitData.dbCName)) {
submitData.dbCName = submitData.dbCName.join(',');
}
if (Array.isArray(submitData.objValue)) {
submitData.objValue = submitData.objValue.join(',');
}
//
if (submitData.colId) {
updateMetaSecurityCol(submitData).then(() => {
proxy.$modal.msgSuccess("修改成功");
dialogVisible.value = false;
getList();
});
} else {
addMetaSecurityCol(submitData).then(() => {
proxy.$modal.msgSuccess("新增成功");
dialogVisible.value = false;
getList();
});
}
});
}
/** 表单重置 */
function reset() {
form.value = {
@ -491,7 +579,7 @@ function reset() {
dbRID: undefined,
dbSName: '',
dbTName: '',
dbCName: '',
dbCName: [],
generateType: '',
ctrlType: '',
objType: '',

166
vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityRow.vue

@ -164,15 +164,29 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="模式" prop="dbSName">
<el-input v-model="form.dbSName" placeholder="请输入模式" />
</el-form-item>
<el-form-item label="表名" prop="dbTName">
<el-input v-model="form.dbTName" placeholder="请输入表名" />
</el-form-item>
<el-form-item label="字段名" prop="dbCName">
<el-input v-model="form.dbCName" placeholder="请输入字段名" />
</el-form-item>
<el-form-item label="模式" prop="dbSName">
<el-select v-model="form.dbSName" placeholder="选择模式" @change="onSchemaChange">
<el-option v-for="item in schemaList" :key="item" :value="item" :label="item" />
</el-select>
</el-form-item>
<el-form-item label="表名" prop="dbTName">
<el-select v-model="form.dbTName" placeholder="选择表" @change="onTableChange" :disabled="!form.dbSName" filterable>
<el-option v-for="table in tableList" :key="table" :value="table" :label="table" />
</el-select>
</el-form-item>
<el-form-item label="字段名称" prop="dbCName">
<el-select
v-model="form.dbCName"
placeholder="选择字段(可多选)"
multiple
collapse-tags
:disabled="!form.dbTName"
>
<el-option v-for="col in columnList" :key="col" :value="col" :label="col" />
</el-select>
</el-form-item>
<el-form-item label="控制方式" prop="ctrlType">
<el-select
v-model="form.ctrlType"
@ -235,12 +249,14 @@
<script setup>
import { ref, reactive, onMounted, toRefs } from 'vue';
import { listMetaSecurityRow, addMetaSecurityRow,getMetaSecurityRow, updateMetaSecurityRow, deleteMetaSecurityRow } from "@/api/meta/metasercurity";
import { listMetaSecurityRow, addMetaSecurityRow,getMetaSecurityRow, updateMetaSecurityRow, deleteMetaSecurityRow,getMetaMdlNameList } from "@/api/meta/metasercurity";
const { proxy } = getCurrentInstance();
const { metasecurity_ctr, metasecurity_obj, metasecurity_type} = proxy.useDict("metasecurity_ctr", "metasecurity_obj", "metasecurity_type");
import { datasourcetree } from "@/api/meta/metatask";
import { listUser} from "@/api/system/user";
import { listRole} from "@/api/system/role";
import { getMetaDataList, getColumnList } from "@/api/meta/metaInfo"
const queryParams = ref({
dbCName: '',
dbTName: '',
@ -250,18 +266,9 @@ const queryParams = ref({
});
const single = ref(true);
const multiple = ref(true);
function dataChange(data) {
// dbResourceOldList name
const selectedItem = dbResourceOldList.value.find(item => item.id === data);
if (selectedItem) {
// name form.value.dbRName
form.value.dbRName = selectedItem.name;
} else {
// form.value.dbRName
form.value.dbRName = '';
}
}
const schemaList = ref([]) //
const tableList = ref([]) //
const columnList = ref([]) //
const dbResourceOptions = ref(undefined);
const form = ref({
dbRName: '', //
@ -295,6 +302,62 @@ const handleObjValueChange = (selectedValues) => {
};
const dataChange = async (dbRID) => {
form.value.dbRID = dbRID
// 1) schema
const res = await getMetaMdlNameList(dbRID)
schemaList.value = res.data
//
form.value.dbSName = ""
form.value.dbTName = ""
form.value.dbCName = []
tableList.value = []
columnList.value = []
const selectedItem = dbResourceOldList.value.find(item => item.id === dbRID);
if (selectedItem) {
// name form.value.dbRName
form.value.dbRName = selectedItem.name;
} else {
// form.value.dbRName
form.value.dbRName = '';
}
}
const onSchemaChange = async (mdlName) => {
form.value.dbTName = ""
form.value.dbCName = []
tableList.value = []
columnList.value = []
if (!mdlName) return
const queryParams = {
ssysId: form.value.dbRID, // ID
mdlName: mdlName,
pageNum: 1,
pageSize: 10000
}
const res = await getMetaDataList(queryParams)
tableList.value = res.data.rows.map(item => item.tabEngName)
}
const onTableChange = async (tabName) => {
form.value.dbCName = []
columnList.value = []
if (!tabName) return
const params = {
ssysId: form.value.dbRID,
mdlName: form.value.dbSName,
tabName: tabName
}
const res = await getColumnList(params)
columnList.value = ["ALL", ...res.data.map(item => item.fldEngName)]
}
/** 重置按钮操作 */
function resetQuery() {
@ -405,39 +468,60 @@ const handlePagination = (pageNum, pageSize) => {
};
//
const handleEdit = (row) => {
reset();
const rowId = row.rowId || ids.value;
getMetaSecurityRow(rowId).then(response => {
form.value = response.data;
const data = response.data;
//
if (data.dbCName && typeof data.dbCName === 'string') {
data.dbCName = data.dbCName.split(',');
} else if (!data.dbCName) {
data.dbCName = [];
}
form.value = data;
dialogVisible.value = true;
dialogTitle.value = "编辑行配置";
});
};
//
function handleSave() {
proxy.$refs["formRef"].validate(valid => {
if (valid) {
if (form.value.rowId != undefined&&form.value.rowId !="") {
updateMetaSecurityRow(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
dialogVisible.value = false;
getList();
});
} else {
const submitData = { ...form.value };
submitData.objValue = submitData.objValue.join(',');
addMetaSecurityRow(submitData).then(response => {
proxy.$modal.msgSuccess("新增成功");
dialogVisible.value = false;
getList();
});
}
if (!valid) return;
// form
const submitData = { ...form.value };
//
if (Array.isArray(submitData.dbCName)) {
submitData.dbCName = submitData.dbCName.join(',');
}
if (Array.isArray(submitData.objValue)) {
submitData.objValue = submitData.objValue.join(',');
}
//
if (submitData.colId) {
updateMetaSecurityRow(submitData).then(() => {
proxy.$modal.msgSuccess("修改成功");
dialogVisible.value = false;
getList();
});
} else {
addMetaSecurityRow(submitData).then(() => {
proxy.$modal.msgSuccess("新增成功");
dialogVisible.value = false;
getList();
});
}
});
}
/** 表单重置 */
function reset() {
form.value = {
@ -497,7 +581,7 @@ const getRoleName = (objValue) => {
const handleCancel = () => {
dialogVisible.value = false;
form.value.rowId = '';
form.value.dbCName = '';
form.value.dbCName = [];
form.value.ctrlType = '';
form.value.ctrl_value = '';
form.value.isStop = false;

Loading…
Cancel
Save