From bfbe35a47ba81e758f741e2686347bdcec5f2cc6 Mon Sep 17 00:00:00 2001 From: siyaqi Date: Mon, 23 Jun 2025 19:02:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AE=89=E5=85=A8=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/metadata_config_controller.py | 65 +++++++++++++++- .../module_admin/dao/datasec_config_dao.py | 66 ++++++++++++++++ .../module_admin/dao/metadata_config_dao.py | 55 ++++++++++++- .../entity/do/metadata_config_do.py | 17 ++++ .../entity/vo/metadata_config_vo.py | 23 +++++- .../service/datasec_config_service.py | 77 +++++++++++++++++++ .../src/api/metadataConfig/metadataConfig.js | 42 ++++++++++ 7 files changed, 341 insertions(+), 4 deletions(-) create mode 100644 vue-fastapi-backend/module_admin/dao/datasec_config_dao.py create mode 100644 vue-fastapi-backend/module_admin/service/datasec_config_service.py diff --git a/vue-fastapi-backend/module_admin/controller/metadata_config_controller.py b/vue-fastapi-backend/module_admin/controller/metadata_config_controller.py index 770ddec..fef3fd3 100644 --- a/vue-fastapi-backend/module_admin/controller/metadata_config_controller.py +++ b/vue-fastapi-backend/module_admin/controller/metadata_config_controller.py @@ -21,10 +21,12 @@ from module_admin.entity.vo.metadata_config_vo import ( BatchDataopLabelConfigModelVo, BatchDataopLabelModelPageQueryModel, BatchDatatypeLabelConfigPageQueryModel, - SecuBizPermiConfigQueryModel, + DatasecConfigPageQueryModel, + DatasecConfigModel, ) from module_admin.service.metadata_config_service import MetadataConfigService from module_admin.service.batch_label_config_service import BatchLabelConfigService +from module_admin.service.datasec_config_service import DatasecConfigService from config.get_db import get_db from utils.response_util import ResponseUtil from utils.page_util import PageResponseModel @@ -484,3 +486,64 @@ async def get_datatype_label_detail( result = await BatchLabelConfigService.get_datatype_detail_services(query_db, onum) logger.info(f'获取数据类型标签配置 onum={onum} 详情成功') return ResponseUtil.success(data=result) +@metadataConfigController.get("/datasecConfig/list", response_model=PageResponseModel) +async def get_datasec_config_list( + request: Request, + query: DatasecConfigModel = Depends(DatasecConfigPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + result = await DatasecConfigService.get_datasec_list_services(query_db, query, False) + logger.info("获取数据安全参数配置列表成功") + return ResponseUtil.success(data=result) + + +@metadataConfigController.post("/datasecConfig") +@ValidateFields(validate_model="add_datasec_config") +async def add_datasec_config( + request: Request, + model: DatasecConfigModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + model.create_by = current_user.user.user_name + model.create_time = datetime.now() + result = await DatasecConfigService.add_datasec_services(query_db, model) + logger.info(result.message) + return ResponseUtil.success(msg=result.message) + + +@metadataConfigController.put("/datasecConfig") +@ValidateFields(validate_model="edit_datasec_config") +async def edit_datasec_config( + request: Request, + model: DatasecConfigModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + model.update_by = current_user.user.user_name + model.update_time = datetime.now() + result = await DatasecConfigService.edit_datasec_services(query_db, model) + logger.info(result.message) + return ResponseUtil.success(msg=result.message) + + +@metadataConfigController.delete("/datasecConfig/{onum_list}") +async def delete_datasec_config( + request: Request, + onum_list: str, + query_db: AsyncSession = Depends(get_db), +): + result = await DatasecConfigService.delete_datasec_services(query_db, onum_list) + logger.info(result.message) + return ResponseUtil.success(msg=result.message) + + +@metadataConfigController.get("/datasecConfig/{onum}", response_model=DatasecConfigModel) +async def get_datasec_config_detail( + request: Request, + onum: int, + query_db: AsyncSession = Depends(get_db), +): + result = await DatasecConfigService.get_datasec_detail_services(query_db, onum) + logger.info(f"获取数据安全参数配置 onum={onum} 详情成功") + return ResponseUtil.success(data=result) diff --git a/vue-fastapi-backend/module_admin/dao/datasec_config_dao.py b/vue-fastapi-backend/module_admin/dao/datasec_config_dao.py new file mode 100644 index 0000000..324ee3b --- /dev/null +++ b/vue-fastapi-backend/module_admin/dao/datasec_config_dao.py @@ -0,0 +1,66 @@ +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.future import select +from sqlalchemy import update, delete +from datetime import datetime, time +from typing import List + +from module_admin.entity.do.metadata_config_do import DatasecConfig # ORM 类 +from utils.page_util import PageUtil + + +class DatasecConfigDao: + """ + 数据安全参数配置表 DAO + """ + + @classmethod + async def get_detail_by_id(cls, db: AsyncSession, onum: int): + """ + 根据主键获取详情 + """ + result = await db.execute(select(DatasecConfig).where(DatasecConfig.onum == onum)) + return result.scalars().first() + + @classmethod + async def get_list(cls, db: AsyncSession, query_object, is_page: bool = False): + """ + 获取数据列表(支持分页) + """ + query = select(DatasecConfig).where( + DatasecConfig.metatask_name.like(f"%{query_object.metatask_name}%") if query_object.metatask_name else True, + DatasecConfig.status == query_object.status if query_object.status else True, + DatasecConfig.create_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(0, 0, 0)), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)), + ) if query_object.begin_time and query_object.end_time else True + ).order_by(DatasecConfig.onum) + + return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) + + @classmethod + async def add(cls, db: AsyncSession, model_obj): + """ + 新增任务配置 + """ + db_obj = DatasecConfig(**model_obj.model_dump()) + db.add(db_obj) + await db.flush() + return db_obj + + @classmethod + async def edit(cls, db: AsyncSession, onum: int, update_dict: dict): + """ + 编辑任务配置 + """ + await db.execute( + update(DatasecConfig) + .where(DatasecConfig.onum == onum) + .values(**update_dict) + ) + + @classmethod + async def delete(cls, db: AsyncSession, onum_list: List[int]): + """ + 批量删除任务配置 + """ + await db.execute(delete(DatasecConfig).where(DatasecConfig.onum.in_(onum_list))) diff --git a/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py b/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py index 17e9442..0c54e67 100644 --- a/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py +++ b/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py @@ -2,7 +2,7 @@ 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,MetadataExtractInfo # ORM 类 -from module_admin.entity.do.metadata_config_do import MetadataSec,SecuBizConfig,SecuBizPermiConfig,SecuBizConfigRela # ORM 类 +from module_admin.entity.do.metadata_config_do import MetadataSec,SecuBizConfig,SecuBizPermiConfig,SecuBizConfigRela,DatasecConfig # ORM 类 from typing import List from sqlalchemy.orm import joinedload @@ -259,4 +259,55 @@ class MetadataConfigDao: .join(SecuBizConfigRela, MetadataExtractInfo.onum == SecuBizConfigRela.tab_onum) .where(SecuBizConfigRela.biz_onum == biz_onum) ) - return result.scalars().all() \ No newline at end of file + return result.scalars().all() + @classmethod + async def get_detail_by_id(cls, db: AsyncSession, onum: int): + """ + 根据主键获取详情 + """ + result = await db.execute(select(DatasecConfig).where(DatasecConfig.onum == onum)) + return result.scalars().first() + + @classmethod + async def get_list(cls, db: AsyncSession, query_object, is_page: bool = False): + """ + 获取数据列表(支持分页) + """ + query = select(DatasecConfig).where( + DatasecConfig.metatask_name.like(f"%{query_object.metatask_name}%") if query_object.metatask_name else True, + DatasecConfig.status == query_object.status if query_object.status else True, + DatasecConfig.create_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(0, 0, 0)), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)), + ) if query_object.begin_time and query_object.end_time else True + ).order_by(DatasecConfig.onum) + + return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) + + @classmethod + async def add(cls, db: AsyncSession, model_obj): + """ + 新增任务配置 + """ + db_obj = DatasecConfig(**model_obj.model_dump()) + db.add(db_obj) + await db.flush() + return db_obj + + @classmethod + async def edit(cls, db: AsyncSession, onum: int, update_dict: dict): + """ + 编辑任务配置 + """ + await db.execute( + update(DatasecConfig) + .where(DatasecConfig.onum == onum) + .values(**update_dict) + ) + + @classmethod + async def delete(cls, db: AsyncSession, onum_list: List[int]): + """ + 批量删除任务配置 + """ + await db.execute(delete(DatasecConfig).where(DatasecConfig.onum.in_(onum_list))) \ No newline at end of file diff --git a/vue-fastapi-backend/module_admin/entity/do/metadata_config_do.py b/vue-fastapi-backend/module_admin/entity/do/metadata_config_do.py index 0260b6d..88f5260 100644 --- a/vue-fastapi-backend/module_admin/entity/do/metadata_config_do.py +++ b/vue-fastapi-backend/module_admin/entity/do/metadata_config_do.py @@ -114,3 +114,20 @@ class BatchDatatypeLabelConfig(Base): mdl_name = Column(String(50), nullable=True) upd_by = Column(String(50), nullable=True) upd_time = Column(DateTime, nullable=True, comment='更新时间') +class DatasecConfig(Base): + """ + 数据安全参数配置 ORM 映射类,对应表 t_datasec_config + """ + __tablename__ = "t_datasec_config" + + onum = Column(Integer, primary_key=True, autoincrement=True, comment="任务主键") + metatask_name = Column(String(50), nullable=False, default="", comment="任务名称") + create_by = Column(String(64), nullable=False, default="", comment="创建者") + create_time = Column(DateTime, nullable=True, comment="创建时间") + update_by = Column(String(64), nullable=True, default="", comment="更新者") + update_time = Column(DateTime, nullable=True, comment="更新时间") + metatask_param = Column(String(500), nullable=True, comment="参数") + status = Column(String(10), nullable=False, default="N", comment="状态") + ds_time = Column(DateTime, nullable=True, comment="调度时间") + ds_ids = Column(String(50), nullable=True, comment="任务ID") + schId = Column(String(50), nullable=True, comment="调度id") \ No newline at end of file diff --git a/vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py b/vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py index 407a60f..6818329 100644 --- a/vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py +++ b/vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py @@ -314,4 +314,25 @@ class BatchDatatypeLabelConfigPageQueryModel(BatchDatatypeLabelConfigModel): @as_query class BatchBusiLabelConfigPageQueryModel(BatchBusiLabelConfigModel): page_num: int = Field(default=1, description='当前页码') - page_size: int = Field(default=10, description='每页记录数') \ No newline at end of file + page_size: int = Field(default=10, description='每页记录数') +class DatasecConfigModel(BaseModel): + """ + 数据安全任务配置 Pydantic 模型(对应表 t_datasec_config) + """ + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + onum: Optional[int] = Field(default=None, description="任务主键") + metatask_name: Optional[str] = Field(default=None, description="任务名称") + 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="更新时间") + metatask_param: Optional[str] = Field(default=None, description="参数") + status: Optional[str] = Field(default="N", description="状态") + ds_time: Optional[datetime] = Field(default=None, description="调度时间") + ds_ids: Optional[str] = Field(default=None, description="任务ID") + schId: Optional[str] = Field(default=None, description="调度id") +@as_query +class DatasecConfigPageQueryModel(DatasecConfigModel): + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') \ No newline at end of file diff --git a/vue-fastapi-backend/module_admin/service/datasec_config_service.py b/vue-fastapi-backend/module_admin/service/datasec_config_service.py new file mode 100644 index 0000000..a9d5b3a --- /dev/null +++ b/vue-fastapi-backend/module_admin/service/datasec_config_service.py @@ -0,0 +1,77 @@ +from sqlalchemy.ext.asyncio import AsyncSession +from module_admin.dao.datasec_config_dao import DatasecConfigDao +from module_admin.entity.vo.metadata_config_vo import DatasecConfigModel +from module_admin.entity.vo.common_vo import CrudResponseModel +from exceptions.exception import ServiceException +from utils.common_util import CamelCaseUtil + + +class DatasecConfigService: + """ + 数据安全参数配置表 Service 层 + """ + + @classmethod + async def get_datasec_list_services(cls, db: AsyncSession, query_object, is_page: bool = False): + """ + 获取配置列表(支持分页) + """ + return await DatasecConfigDao.get_list(db, query_object, is_page) + + @classmethod + async def add_datasec_services(cls, db: AsyncSession, page_object: DatasecConfigModel): + """ + 新增配置 + """ + try: + await DatasecConfigDao.add(db, page_object) + await db.commit() + return CrudResponseModel(is_success=True, message="新增成功") + except Exception as e: + await db.rollback() + raise e + + @classmethod + async def edit_datasec_services(cls, db: AsyncSession, page_object: DatasecConfigModel): + """ + 编辑配置 + """ + edit_data = page_object.model_dump(exclude_unset=True) + info = await cls.get_datasec_detail_services(db, page_object.onum) + if info and info.onum: + try: + await DatasecConfigDao.edit(db, page_object.onum, edit_data) + await db.commit() + return CrudResponseModel(is_success=True, message="更新成功") + except Exception as e: + await db.rollback() + raise e + else: + raise ServiceException(message="配置数据不存在") + + @classmethod + async def delete_datasec_services(cls, db: AsyncSession, onum_list: str): + """ + 批量删除配置 + """ + id_list = [int(x.strip()) for x in onum_list.split(",") if x.strip().isdigit()] + if not id_list: + raise ServiceException(message="无效的编号列表") + + try: + await DatasecConfigDao.delete(db, id_list) + await db.commit() + return CrudResponseModel(is_success=True, message="删除成功") + except Exception as e: + await db.rollback() + raise e + + @classmethod + async def get_datasec_detail_services(cls, db: AsyncSession, onum: int): + """ + 获取配置详情 + """ + result = await DatasecConfigDao.get_detail_by_id(db, onum) + if result: + return DatasecConfigModel(**CamelCaseUtil.transform_result(result)) + return DatasecConfigModel(**dict()) diff --git a/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js b/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js index bc3f8ee..4baa88f 100644 --- a/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js +++ b/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js @@ -315,3 +315,45 @@ export function getDatatypeLabelDetail(onum) { method: 'get' }) } +// 获取数据安全参数配置列表(分页) +export function getDatasecConfigList(params) { + return request({ + url: '/default-api/metadataConfig/datasecConfig/list', + method: 'get', + params + }) +} + +// 新增数据安全参数配置 +export function addDatasecConfig(data) { + return request({ + url: '/default-api/metadataConfig/datasecConfig', + method: 'post', + data + }) +} + +// 编辑数据安全参数配置 +export function editDatasecConfig(data) { + return request({ + url: '/default-api/metadataConfig/datasecConfig', + method: 'put', + data + }) +} + +// 删除数据安全参数配置 +export function deleteDatasecConfig(onumList) { + return request({ + url: '/default-api/metadataConfig/datasecConfig/' + onumList, + method: 'delete' + }) +} + +// 获取数据安全参数配置详情 +export function getDatasecConfigDetail(onum) { + return request({ + url: '/default-api/metadataConfig/datasecConfig/' + onum, + method: 'get' + }) +}