Browse Source

作用域配置

master
siyaqi 11 hours ago
parent
commit
b8fd9a5ebb
  1. 13
      vue-fastapi-backend/module_admin/controller/metadata_config_controller.py
  2. 23
      vue-fastapi-backend/module_admin/dao/metadata_config_dao.py
  3. 12
      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. 60
      vue-fastapi-backend/module_admin/service/metadata_config_service.py
  6. 7
      vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js
  7. 217
      vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue

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

@ -12,6 +12,7 @@ from module_admin.entity.vo.metadata_config_vo import (
SecuBizConfigQueryModel, SecuBizConfigQueryModel,
SecuBizPermiConfigModel, SecuBizPermiConfigModel,
SecuBizPermiConfigBatchModel, SecuBizPermiConfigBatchModel,
SecuBizConfigAddModel,
SecuBizPermiConfigPageQueryModel, SecuBizPermiConfigPageQueryModel,
SecuBizPermiConfigQueryModel SecuBizPermiConfigQueryModel
) )
@ -178,7 +179,7 @@ async def get_biz_config_list_all(
@metadataConfigController.post("/bizConfig/add") @metadataConfigController.post("/bizConfig/add")
@ValidateFields(["bizModule", "configType", "securityLevel", "applyType"]) @ValidateFields(["bizModule", "configType", "securityLevel", "applyType"])
async def add_biz_config( async def add_biz_config(
item: SecuBizConfigModel, item: SecuBizConfigAddModel,
db: AsyncSession = Depends(get_db), db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user), current_user: CurrentUserModel = Depends(LoginService.get_current_user),
): ):
@ -191,7 +192,7 @@ async def add_biz_config(
@metadataConfigController.post("/bizConfig/edit") @metadataConfigController.post("/bizConfig/edit")
@ValidateFields(["onum"]) @ValidateFields(["onum"])
async def edit_biz_config( async def edit_biz_config(
item: SecuBizConfigModel, item: SecuBizConfigAddModel,
db: AsyncSession = Depends(get_db), db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user), current_user: CurrentUserModel = Depends(LoginService.get_current_user),
): ):
@ -254,4 +255,10 @@ async def delete_biz_permi_config(onums: str, db: AsyncSession = Depends(get_db)
@metadataConfigController.get("/bizPermiConfig/detail") @metadataConfigController.get("/bizPermiConfig/detail")
async def get_biz_permi_config_detail(onum: 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) data = await MetadataConfigService.get_biz_permi_config_detail_services(db, onum)
return ResponseUtil.success(data=data) 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)

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

@ -1,9 +1,10 @@
from datetime import datetime, time from datetime import datetime, time
from sqlalchemy import delete, select, update,and_ from sqlalchemy import delete, select, update,and_
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.do.meta_do import MetadataClas # ORM 类 from module_admin.entity.do.meta_do import MetadataClas,MetadataExtractInfo # ORM 类
from module_admin.entity.do.metadata_config_do import MetadataSec,SecuBizConfig,SecuBizPermiConfig # ORM 类 from module_admin.entity.do.metadata_config_do import MetadataSec,SecuBizConfig,SecuBizPermiConfig,SecuBizConfigRela # ORM 类
from typing import List from typing import List
from sqlalchemy.orm import joinedload from sqlalchemy.orm import joinedload
from sqlalchemy.sql import true from sqlalchemy.sql import true
from utils.page_util import PageUtil from utils.page_util import PageUtil
@ -242,4 +243,20 @@ class MetadataConfigDao:
@classmethod @classmethod
async def delete_biz_permi_config(cls, db: AsyncSession, onum_list: list[int]): async def delete_biz_permi_config(cls, db: AsyncSession, onum_list: list[int]):
await db.execute(delete(SecuBizPermiConfig).where(SecuBizPermiConfig.onum.in_(onum_list))) 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()

12
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_desc = Column(String(200), default=None, comment='等级说明')
sec_level_summary = Column(String(200), 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): class SecuBizPermiConfig(Base):
__tablename__ = "t_secu_biz_permi_config" __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 表对应模型 -------------- # ----------- 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): class SecuBizConfigModel(BaseModel):
""" """
业务域配置对应 Pydantic 模型 业务域配置对应 Pydantic 模型

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

@ -1,8 +1,10 @@
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.dao.metadata_config_dao import MetadataConfigDao from module_admin.dao.metadata_config_dao import MetadataConfigDao
from module_admin.entity.vo.common_vo import CrudResponseModel 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 utils.common_util import CamelCaseUtil
from module_admin.entity.do.metadata_config_do import SecuBizConfigRela # ORM 类
from exceptions.exception import ServiceException from exceptions.exception import ServiceException
import uuid import uuid
from typing import List from typing import List
@ -172,9 +174,27 @@ class MetadataConfigService:
return result return result
@classmethod @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: 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() await db.commit()
return CrudResponseModel(is_success=True, message="新增成功") return CrudResponseModel(is_success=True, message="新增成功")
except Exception as e: except Exception as e:
@ -182,12 +202,35 @@ class MetadataConfigService:
raise e raise e
@classmethod @classmethod
async def edit_biz_config_services(cls, db: AsyncSession, page_object: SecuBizConfigModel): async def edit_biz_config_services(cls, db: AsyncSession, page_object: SecuBizConfigAddModel):
edit_data = page_object.model_dump(exclude_unset=True)
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) info = await cls.get_biz_config_detail_services(db, page_object.onum)
if info.onum: if info.onum:
try: try:
await MetadataConfigDao.edit_biz_config(db, page_object.onum, edit_data) 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() await db.commit()
return CrudResponseModel(is_success=True, message="更新成功") return CrudResponseModel(is_success=True, message="更新成功")
except Exception as e: except Exception as e:
@ -296,4 +339,9 @@ class MetadataConfigService:
if result: if result:
return SecuBizPermiConfigModel(**CamelCaseUtil.transform_result(result)) return SecuBizPermiConfigModel(**CamelCaseUtil.transform_result(result))
else: else:
return SecuBizPermiConfigModel(**dict()) 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 } params: { onums: onumStr }
}) })
} }
// 查询数据安全配置详情
export function getBizRalaList(onum) {
return request({
url: '/default-api/metadataConfig/bizConfigRela/list/' + onum,
method: 'get'
})
}

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

@ -96,45 +96,113 @@
<el-dialog <el-dialog
:title="title" :title="title"
v-model="open" v-model="open"
width="600px" width="1600px"
append-to-body append-to-body
:before-close="handleClose" :before-close="handleClose"
> >
<el-form <el-form
ref="bizFormRef" ref="bizFormRef"
:model="form" :model="form"
:rules="rules" :rules="rules"
label-width="130px" label-width="130px"
size="small" >
> <el-row :gutter="20">
<el-form-item label="业务域名称" prop="bizName"> <el-col :span="8">
<el-input v-model="form.bizName" /> <el-form-item label="业务域名称" prop="bizName">
</el-form-item> <el-input v-model="form.bizName" style="width: 200px"/>
<el-form-item label="风险等级" prop="riskLvl"> </el-form-item>
<el-select </el-col>
v-model="form.riskLvl" <el-col :span="8">
placeholder="风险等级" <el-form-item label="风险等级" prop="riskLvl">
filterable <el-select
clearable v-model="form.riskLvl"
> placeholder="风险等级"
<el-option filterable
v-for="dict in secList" clearable
:key="dict.onum" style="width: 200px"
:label="dict.secLevelSummary" >
:value="dict.onum" <el-option
></el-option> v-for="dict in secList"
</el-select> :key="dict.onum"
</el-form-item> :label="dict.secLevelSummary"
:value="dict.onum"
<el-form-item label="是否停用" prop="isStop"> />
<el-select v-model="form.isStop" placeholder="请选择状态"> </el-select>
<el-option label="运行" :value=true /> </el-form-item>
<el-option label="停用" :value=false /> </el-col>
</el-select> <el-col :span="8">
</el-form-item> <el-form-item label="是否停用" prop="isStop">
</el-form> <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>
<template #footer> <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 @click="open = false">取消</el-button>
<el-button type="primary" @click="submitForm">保存</el-button> <el-button type="primary" @click="submitForm">保存</el-button>
</template> </template>
@ -145,12 +213,17 @@
<script setup> <script setup>
import { ref, reactive, onMounted } from 'vue' import { ref, reactive, onMounted } from 'vue'
import { ElMessageBox, ElMessage } from 'element-plus' 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 { import {
listBizConfig, listBizConfig,
addBizConfig, addBizConfig,
listMetadataSec, listMetadataSec,
updateBizConfig, updateBizConfig,
getBizRalaList,
delBizConfig delBizConfig
} from '@/api/metadataConfig/metadataConfig' } from '@/api/metadataConfig/metadataConfig'
@ -160,6 +233,12 @@ const queryForm = reactive({
pageNum: 1, pageNum: 1,
pageSize: 10 pageSize: 10
}) })
const leftQueryForm = reactive({
ssysCd: '',
tabName: '',
pageNum: 1,
pageSize: 10
})
const bizList = ref([]) const bizList = ref([])
const secList = ref([]) const secList = ref([])
@ -234,6 +313,7 @@ function openAddDialog() {
riskLvl: '', riskLvl: '',
isStop: null isStop: null
}) })
rightTableData.value=[]
open.value = true open.value = true
} }
@ -243,6 +323,7 @@ function openEditDialog(row) {
return return
} }
title.value = '编辑业务域配置' title.value = '编辑业务域配置'
loadRightTable(row.onum)
Object.assign(form, row) Object.assign(form, row)
open.value = true open.value = true
} }
@ -250,7 +331,13 @@ function openEditDialog(row) {
function submitForm() { function submitForm() {
bizFormRef.value.validate(async (valid) => { bizFormRef.value.validate(async (valid) => {
if (!valid) return 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 { try {
if (title.value.includes('新增')) { if (title.value.includes('新增')) {
await addBizConfig(submitData) await addBizConfig(submitData)
@ -305,10 +392,60 @@ function handleClose(done) {
bizFormRef.value.resetFields() bizFormRef.value.resetFields()
done() 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(() => { onMounted(() => {
getList() getList()
getSecList() getSecList()
loadLeftTable()
}) })
</script> </script>
@ -319,4 +456,12 @@ onMounted(() => {
.mb8 { .mb8 {
margin-bottom: 8px; margin-bottom: 8px;
} }
.flex-col-center {
display: flex;
flex-direction: column;
margin-top: 150px;
justify-content: center;
align-items: center;
height: 100%;
}
</style> </style>

Loading…
Cancel
Save