Browse Source

作用域配置

master
siyaqi 11 hours ago
parent
commit
b8fd9a5ebb
  1. 11
      vue-fastapi-backend/module_admin/controller/metadata_config_controller.py
  2. 21
      vue-fastapi-backend/module_admin/dao/metadata_config_dao.py
  3. 10
      vue-fastapi-backend/module_admin/entity/do/metadata_config_do.py
  4. 27
      vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py
  5. 58
      vue-fastapi-backend/module_admin/service/metadata_config_service.py
  6. 7
      vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js
  7. 163
      vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue

11
vue-fastapi-backend/module_admin/controller/metadata_config_controller.py

@ -12,6 +12,7 @@ from module_admin.entity.vo.metadata_config_vo import (
SecuBizConfigQueryModel,
SecuBizPermiConfigModel,
SecuBizPermiConfigBatchModel,
SecuBizConfigAddModel,
SecuBizPermiConfigPageQueryModel,
SecuBizPermiConfigQueryModel
)
@ -178,7 +179,7 @@ async def get_biz_config_list_all(
@metadataConfigController.post("/bizConfig/add")
@ValidateFields(["bizModule", "configType", "securityLevel", "applyType"])
async def add_biz_config(
item: SecuBizConfigModel,
item: SecuBizConfigAddModel,
db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
@ -191,7 +192,7 @@ async def add_biz_config(
@metadataConfigController.post("/bizConfig/edit")
@ValidateFields(["onum"])
async def edit_biz_config(
item: SecuBizConfigModel,
item: SecuBizConfigAddModel,
db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
@ -255,3 +256,9 @@ async def delete_biz_permi_config(onums: str, db: AsyncSession = Depends(get_db)
async def get_biz_permi_config_detail(onum: str, db: AsyncSession = Depends(get_db)):
data = await MetadataConfigService.get_biz_permi_config_detail_services(db, onum)
return ResponseUtil.success(data=data)
@metadataConfigController.get("/bizConfigRela/list/{bizOnum}")
async def get_biz_rela_config_list(bizOnum: int, query_db: AsyncSession = Depends(get_db),
):
ai_chat_list_result = await MetadataConfigService.get_biz_config_rela_list_services(query_db, bizOnum)
logger.info('获取成功')
return ResponseUtil.success(data=ai_chat_list_result)

21
vue-fastapi-backend/module_admin/dao/metadata_config_dao.py

@ -1,9 +1,10 @@
from datetime import datetime, time
from sqlalchemy import delete, select, update,and_
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.do.meta_do import MetadataClas # ORM 类
from module_admin.entity.do.metadata_config_do import MetadataSec,SecuBizConfig,SecuBizPermiConfig # ORM 类
from module_admin.entity.do.meta_do import MetadataClas,MetadataExtractInfo # ORM 类
from module_admin.entity.do.metadata_config_do import MetadataSec,SecuBizConfig,SecuBizPermiConfig,SecuBizConfigRela # ORM 类
from typing import List
from sqlalchemy.orm import joinedload
from sqlalchemy.sql import true
from utils.page_util import PageUtil
@ -243,3 +244,19 @@ class MetadataConfigDao:
@classmethod
async def delete_biz_permi_config(cls, db: AsyncSession, onum_list: list[int]):
await db.execute(delete(SecuBizPermiConfig).where(SecuBizPermiConfig.onum.in_(onum_list)))
# ----------------------------------biz_confg_rela------------------------------
@classmethod
async def delete_biz_rela_dao(cls, db: AsyncSession, biz_onum: int):
await db.execute(delete(SecuBizConfigRela).where(SecuBizConfigRela.biz_onum == biz_onum) )
@classmethod
async def add_batch_biz_rela_dao(cls, db: AsyncSession, rela_list: List[SecuBizConfigRela]):
db.add_all(rela_list)
await db.flush()
@classmethod
async def get_biz_rela_by_biz_id(cls, db: AsyncSession, biz_onum: int):
result = await db.execute(
select(MetadataExtractInfo)
.join(SecuBizConfigRela, MetadataExtractInfo.onum == SecuBizConfigRela.tab_onum)
.where(SecuBizConfigRela.biz_onum == biz_onum)
)
return result.scalars().all()

10
vue-fastapi-backend/module_admin/entity/do/metadata_config_do.py

@ -32,7 +32,17 @@ class MetadataSec(Base):
sec_level_desc = Column(String(200), default=None, comment='等级说明')
sec_level_summary = Column(String(200), comment='等级简介')
class SecuBizConfigRela(Base):
"""
业务域配置关联表 ORM 映射类对应表 t_secu_biz_config_rela
"""
__tablename__ = "t_secu_biz_config_rela"
onum = Column(Integer, primary_key=True, autoincrement=True, comment="序号")
biz_onum = Column(Integer, nullable=True, comment="业务域id")
tab_onum = Column(Integer, nullable=True, comment="表id")
create_by = Column(String(20), nullable=True, comment="创建者")
create_time = Column(DateTime, nullable=True, comment="创建时间")
class SecuBizPermiConfig(Base):
__tablename__ = "t_secu_biz_permi_config"

27
vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py

@ -107,6 +107,33 @@ class MetadataSecPageQueryModel(MetadataSecQueryModel):
# ----------- t_secu_biz_config 表对应模型 --------------
class SecuBizConfigRelaModel(BaseModel):
"""
业务域配置关联表对应 Pydantic 模型
"""
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
onum: Optional[int] = Field(default=None, description="序号")
biz_onum: Optional[int] = Field(default=None, description="业务域ID")
tab_onum: Optional[int] = Field(default=None, description="表ID")
create_by: Optional[str] = Field(default=None, description="创建者")
create_time: Optional[datetime] = Field(default=None, description="创建时间")
class SecuBizConfigAddModel(BaseModel):
"""
业务域配置对应 Pydantic 模型
"""
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
onum: Optional[int] = Field(default=None, description='序号')
biz_name: Optional[str] = Field(default=None, description='业务域名称')
risk_lvl: Optional[str] = Field(default=None, description='可关联安全等级序号')
isStop: Optional[Literal[0, 1]] = Field(default=None, description='是否停用(0:运行 1:停用)')
create_by: Optional[str] = Field(default=None, description='创建者')
create_time: Optional[datetime] = Field(default=None, description='创建时间')
update_by: Optional[str] = Field(default=None, description='更新者')
update_time: Optional[datetime] = Field(default=None, description='更新时间')
tab_onum_list: List[int] = Field(default=None, description='表id列表')
class SecuBizConfigModel(BaseModel):
"""
业务域配置对应 Pydantic 模型

58
vue-fastapi-backend/module_admin/service/metadata_config_service.py

@ -1,8 +1,10 @@
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.dao.metadata_config_dao import MetadataConfigDao
from module_admin.entity.vo.common_vo import CrudResponseModel
from module_admin.entity.vo.metadata_config_vo import MetadataClasModel, SecuBizPermiConfigBatchModel,MetadataClasPageQueryModel,MetadataSecModel,MetadataSecPageQueryModel,SecuBizConfigModel ,SecuBizConfigQueryModel,SecuBizPermiConfigModel, SecuBizPermiConfigQueryModel
from module_admin.entity.vo.metadata_config_vo import MetadataClasModel,SecuBizConfigAddModel,SecuBizConfigRelaModel,\
SecuBizPermiConfigBatchModel,MetadataClasPageQueryModel,MetadataSecModel,MetadataSecPageQueryModel,SecuBizConfigModel ,SecuBizConfigQueryModel,SecuBizPermiConfigModel, SecuBizPermiConfigQueryModel
from utils.common_util import CamelCaseUtil
from module_admin.entity.do.metadata_config_do import SecuBizConfigRela # ORM 类
from exceptions.exception import ServiceException
import uuid
from typing import List
@ -172,9 +174,27 @@ class MetadataConfigService:
return result
@classmethod
async def add_biz_config_services(cls, db: AsyncSession, page_object: SecuBizConfigModel):
async def add_biz_config_services(cls, db: AsyncSession, page_object: SecuBizConfigAddModel):
try:
await MetadataConfigDao.add_biz_config(db, page_object)
configMode = SecuBizConfigModel()
configMode.onum=page_object.onum
configMode.biz_name=page_object.biz_name
configMode.risk_lvl=page_object.risk_lvl
configMode.isStop=page_object.isStop
configMode.create_by=page_object.create_by
configMode.update_by=page_object.update_by
configMode.update_time=page_object.update_time
configMode.create_time=page_object.create_time
obj=await MetadataConfigDao.add_biz_config(db, configMode)
records: List[SecuBizConfigRela] = []
for tab_onum in page_object.tab_onum_list:
record = SecuBizConfigRela()
record.biz_onum = obj.onum
record.tab_onum = tab_onum
record.create_by = obj.create_by
record.create_time = obj.create_time
records.append(record)
await MetadataConfigDao.add_batch_biz_rela_dao(db,records)
await db.commit()
return CrudResponseModel(is_success=True, message="新增成功")
except Exception as e:
@ -182,12 +202,35 @@ class MetadataConfigService:
raise e
@classmethod
async def edit_biz_config_services(cls, db: AsyncSession, page_object: SecuBizConfigModel):
edit_data = page_object.model_dump(exclude_unset=True)
async def edit_biz_config_services(cls, db: AsyncSession, page_object: SecuBizConfigAddModel):
configMode = SecuBizConfigModel()
configMode.onum=page_object.onum
configMode.biz_name=page_object.biz_name
configMode.risk_lvl=page_object.risk_lvl
configMode.isStop=page_object.isStop
configMode.create_by=page_object.create_by
configMode.update_by=page_object.update_by
configMode.update_time=page_object.update_time
configMode.create_time=page_object.create_time
edit_data = configMode.model_dump(exclude_unset=True)
info = await cls.get_biz_config_detail_services(db, page_object.onum)
if info.onum:
try:
await MetadataConfigDao.edit_biz_config(db, page_object.onum, edit_data)
await MetadataConfigDao.delete_biz_rela_dao(db, page_object.onum)
records: List[SecuBizConfigRela] = []
for tab_onum in page_object.tab_onum_list:
record = SecuBizConfigRela()
record.biz_onum = page_object.onum
record.tab_onum = tab_onum
record.create_by = page_object.update_by
record.create_time = page_object.update_time
records.append(record)
await MetadataConfigDao.add_batch_biz_rela_dao(db,records)
await db.commit()
return CrudResponseModel(is_success=True, message="更新成功")
except Exception as e:
@ -297,3 +340,8 @@ class MetadataConfigService:
return SecuBizPermiConfigModel(**CamelCaseUtil.transform_result(result))
else:
return SecuBizPermiConfigModel(**dict())
@classmethod
async def get_biz_config_rela_list_services(cls, result_db: AsyncSession, biz_onum: int,
):
ai_session_list = await MetadataConfigDao.get_biz_rela_by_biz_id(result_db, biz_onum) # 查询最新的20条
return CamelCaseUtil.transform_result(ai_session_list)

7
vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js

@ -180,3 +180,10 @@ export function delBizPermiConfig(onumStr) {
params: { onums: onumStr }
})
}
// 查询数据安全配置详情
export function getBizRalaList(onum) {
return request({
url: '/default-api/metadataConfig/bizConfigRela/list/' + onum,
method: 'get'
})
}

163
vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue

@ -96,7 +96,7 @@
<el-dialog
:title="title"
v-model="open"
width="600px"
width="1600px"
append-to-body
:before-close="handleClose"
>
@ -105,35 +105,103 @@
:model="form"
:rules="rules"
label-width="130px"
size="small"
>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="业务域名称" prop="bizName">
<el-input v-model="form.bizName" />
<el-input v-model="form.bizName" style="width: 200px"/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="风险等级" prop="riskLvl">
<el-select
v-model="form.riskLvl"
placeholder="风险等级"
filterable
clearable
style="width: 200px"
>
<el-option
v-for="dict in secList"
:key="dict.onum"
:label="dict.secLevelSummary"
:value="dict.onum"
></el-option>
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否停用" prop="isStop">
<el-select v-model="form.isStop" placeholder="请选择状态">
<el-option label="运行" :value=true />
<el-option label="停用" :value=false />
<el-select v-model="form.isStop" placeholder="请选择状态" style="width: 200px">
<el-option label="运行" :value="true" />
<el-option label="停用" :value="false" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<!-- 在这里增加左右两个表格之间是穿梭按钮 左边条件 leftQueryForm ssysCd是下拉选dsSysListgetMetaDataList是查询左边的表格的接口getBizRalaList是查右表的接口参数是getBizRalaListonum右移会在右表push一条左移会移除一条 右表无分页 -->
<el-row :gutter="20" style="margin-top: 20px">
<!-- 左侧表格可选元数据 -->
<el-col :span="10">
<el-form :model="leftQueryForm" inline size="small" >
<el-form-item label="系统名">
<el-select v-model="leftQueryForm.ssysCd" placeholder="请选择系统" clearable filterable style="width: 180px">
<el-option v-for="item in dsSysList" :key="item.id" :label="item.name" :value="item.name" />
</el-select>
</el-form-item>
<el-form-item label="表名">
<el-input v-model="leftQueryForm.tabName" placeholder="请输入表名" clearable style="width: 180px"/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadLeftTable">查询</el-button>
</el-form-item>
</el-form>
<el-table
:data="leftTableData"
height="300"
border
style="margin-top: 10px"
@selection-change="handleLeftSelect"
>
<el-table-column type="selection" width="50" />
<el-table-column prop="ssysCd" label="系统名" />
<el-table-column prop="mdlName" label="模式名" />
<el-table-column prop="tabEngName" label="表名" />
</el-table>
<pagination
v-show="leftTotal > 0"
:total="leftTotal"
v-model:page="leftQueryForm.pageNum"
v-model:limit="leftQueryForm.pageSize"
@pagination="loadLeftTable"
style="left: 0%!;"
/>
</el-col>
<!-- 中间穿梭按钮 -->
<el-col :span="4" class="flex-col-center">
<el-button type="primary" @click="moveToRight" :disabled="leftSelected.length === 0"> > </el-button>
<el-button type="danger" style="margin-top: 10px" @click="moveToLeft" :disabled="rightSelected.length === 0"> < </el-button>
</el-col>
<!-- 右侧表格已关联元数据 -->
<el-col :span="10">
<el-table
:data="rightTableData"
height="360"
border
@selection-change="handleRightSelect"
>
<el-table-column type="selection" width="50" />
<el-table-column prop="ssysCd" label="系统名" />
<el-table-column prop="mdlName" label="模式名" />
<el-table-column prop="tabEngName" label="表名" />
</el-table>
</el-col>
</el-row>
<template #footer>
<el-button @click="open = false">取消</el-button>
<el-button type="primary" @click="submitForm">保存</el-button>
@ -145,12 +213,17 @@
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { ElMessageBox, ElMessage } from 'element-plus'
import useUserStore from '@/store/modules/user'; //
import {getMetaDataList} from "@/api/meta/metaInfo"
const userStore = useUserStore(); //
const dsSysList = userStore.dsSysList; // 访
import {
listBizConfig,
addBizConfig,
listMetadataSec,
updateBizConfig,
getBizRalaList,
delBizConfig
} from '@/api/metadataConfig/metadataConfig'
@ -160,6 +233,12 @@ const queryForm = reactive({
pageNum: 1,
pageSize: 10
})
const leftQueryForm = reactive({
ssysCd: '',
tabName: '',
pageNum: 1,
pageSize: 10
})
const bizList = ref([])
const secList = ref([])
@ -234,6 +313,7 @@ function openAddDialog() {
riskLvl: '',
isStop: null
})
rightTableData.value=[]
open.value = true
}
@ -243,6 +323,7 @@ function openEditDialog(row) {
return
}
title.value = '编辑业务域配置'
loadRightTable(row.onum)
Object.assign(form, row)
open.value = true
}
@ -250,7 +331,13 @@ function openEditDialog(row) {
function submitForm() {
bizFormRef.value.validate(async (valid) => {
if (!valid) return
const submitData = { ...form }
let tabonums=[]
rightTableData.value.forEach(item=>{
tabonums.push(item.onum)
})
console.log( rightTableData.value,"sss")
const submitData = { ...form,tabOnumList:tabonums }
try {
if (title.value.includes('新增')) {
await addBizConfig(submitData)
@ -305,10 +392,60 @@ function handleClose(done) {
bizFormRef.value.resetFields()
done()
}
//穿
const leftTableData = ref([])
const leftTotal = ref(0)
const leftSelected = ref([])
const rightTableData = ref([])
const rightSelected = ref([])
function handleLeftSelect(rows) {
leftSelected.value = rows
}
function handleRightSelect(rows) {
rightSelected.value = rows
}
async function loadLeftTable() {
const res = await getMetaDataList(leftQueryForm)
leftTableData.value = res.data.rows || []
leftTotal.value = res.data.total || 0
}
async function loadRightTable(onum) {
const res = await getBizRalaList(onum)
rightTableData.value = res.data || []
}
// ssysCd + mdlName + tabEngName
function buildKey(row) {
return `${row.ssysCd}||${row.mdlName}||${row.tabEngName}`
}
function moveToRight() {
const existingKeys = new Set(rightTableData.value.map(buildKey))
leftSelected.value.forEach(item => {
if (!existingKeys.has(buildKey(item))) {
let additem=item
additem.onum=item.extractOnum
rightTableData.value.push(item)
}
})
}
function moveToLeft() {
const removeKeys = new Set(rightSelected.value.map(buildKey))
rightTableData.value = rightTableData.value.filter(item => !removeKeys.has(buildKey(item)))
}
onMounted(() => {
getList()
getSecList()
loadLeftTable()
})
</script>
@ -319,4 +456,12 @@ onMounted(() => {
.mb8 {
margin-bottom: 8px;
}
.flex-col-center {
display: flex;
flex-direction: column;
margin-top: 150px;
justify-content: center;
align-items: center;
height: 100%;
}
</style>

Loading…
Cancel
Save