From 71eff27715b719fd7cf8e55dcf4e90c6b2f09867 Mon Sep 17 00:00:00 2001 From: "si@aidatagov.com" Date: Fri, 30 May 2025 01:08:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=89=E5=85=A8=E7=AD=89=E7=BA=A7=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 | 67 +++- .../module_admin/dao/metadata_config_dao.py | 36 +++ .../entity/do/metadata_config_do.py | 13 + .../entity/vo/metadata_config_vo.py | 45 +++ .../service/metadata_config_service.py | 76 ++++- .../src/api/metadataConfig/metadataConfig.js | 44 +++ .../src/views/metadataConfig/sec/index.vue | 293 ++++++++++++++++++ 7 files changed, 571 insertions(+), 3 deletions(-) create mode 100644 vue-fastapi-frontend/src/views/metadataConfig/sec/index.vue 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 a419d07..8198c75 100644 --- a/vue-fastapi-backend/module_admin/controller/metadata_config_controller.py +++ b/vue-fastapi-backend/module_admin/controller/metadata_config_controller.py @@ -2,7 +2,7 @@ from datetime import datetime from fastapi import APIRouter, Depends, Request, Form from pydantic_validation_decorator import ValidateFields from sqlalchemy.ext.asyncio import AsyncSession -from module_admin.entity.vo.metadata_config_vo import MetadataClasModel, MetadataClasPageQueryModel +from module_admin.entity.vo.metadata_config_vo import MetadataClasModel, MetadataClasPageQueryModel,MetadataSecModel,MetadataSecPageQueryModel from module_admin.service.metadata_config_service import MetadataConfigService from config.get_db import get_db from utils.response_util import ResponseUtil @@ -78,3 +78,68 @@ async def get_metadata_clas_detail( result = await MetadataConfigService.get_metadata_clas_detail_services(query_db, clas_id) logger.info(f"获取元数据分类ID={clas_id}详情成功") return ResponseUtil.success(data=result) +# ------------------------ MetadataSec 控制接口 ------------------------ # + +@metadataConfigController.get("/sec/list", response_model=PageResponseModel) +async def get_metadata_sec_list( + request: Request, + query: MetadataSecPageQueryModel = Depends(MetadataSecPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + result = await MetadataConfigService.get_metadata_sec_list_services(query_db, query, is_page=True) + logger.info("获取数据安全配置列表成功") + return ResponseUtil.success(model_content=result) + + +@metadataConfigController.post("/sec") +@ValidateFields(validate_model="add_metadata_sec") +async def add_metadata_sec( + request: Request, + add_sec: MetadataSecModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + add_sec.upd_time = datetime.now() + add_sec.rec_subm_prsn = current_user.user.user_name + + result = await MetadataConfigService.add_metadata_sec_services(query_db, add_sec) + logger.info(result.message) + return ResponseUtil.success(msg=result.message) + + +@metadataConfigController.put("/sec") +@ValidateFields(validate_model="edit_metadata_sec") +async def edit_metadata_sec( + request: Request, + edit_sec: MetadataSecModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + edit_sec.upd_time = datetime.now() + edit_sec.rec_subm_prsn = current_user.user.user_name + + result = await MetadataConfigService.edit_metadata_sec_services(query_db, edit_sec) + logger.info(result.message) + return ResponseUtil.success(msg=result.message) + + +@metadataConfigController.delete("/sec/{sec_ids}") +async def delete_metadata_sec( + request: Request, + sec_ids: str, + query_db: AsyncSession = Depends(get_db), +): + result = await MetadataConfigService.delete_metadata_sec_services(query_db, sec_ids) + logger.info(result.message) + return ResponseUtil.success(msg=result.message) + + +@metadataConfigController.get("/sec/{sec_id}", response_model=MetadataSecModel) +async def get_metadata_sec_detail( + request: Request, + sec_id: str, + query_db: AsyncSession = Depends(get_db), +): + result = await MetadataConfigService.get_metadata_sec_detail_services(query_db, sec_id) + logger.info(f"获取数据安全配置 onum={sec_id} 详情成功") + return ResponseUtil.success(data=result) \ No newline at end of file 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 ce16c58..282f5b0 100644 --- a/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py +++ b/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py @@ -2,6 +2,7 @@ from datetime import datetime, time from sqlalchemy import delete, select, update 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 # ORM 类 class MetadataConfigDao: @@ -78,3 +79,38 @@ class MetadataConfigDao: 删除标签信息(支持批量) """ await db.execute(delete(MetadataClas).where(MetadataClas.clas_onum.in_(clas_onum_list))) + @classmethod + async def get_sec_detail_by_id(cls, db: AsyncSession, onum: str): + result = await db.execute(select(MetadataSec).where(MetadataSec.onum == onum)) + return result.scalars().first() + + @classmethod + async def get_metadata_sec_list(cls, db: AsyncSession, query_object, is_page: bool = False): + query = select(MetadataSec).where( + MetadataSec.sec_level_name.like(f"%{query_object.sec_level_name}%") if query_object.sec_level_name else True, + MetadataSec.sec_eff_flag == query_object.sec_eff_flag if query_object.sec_eff_flag else True, + MetadataSec.upd_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(MetadataSec.upd_time.desc()).distinct() + + from utils.page_util import PageUtil + return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) + + @classmethod + async def add_metadata_sec_dao(cls, db: AsyncSession, sec): + db_sec = MetadataSec(**sec.model_dump()) + db.add(db_sec) + await db.flush() + return db_sec + + @classmethod + async def edit_metadata_sec_dao(cls, db: AsyncSession, onum: str, update_data: dict): + await db.execute( + update(MetadataSec).where(MetadataSec.onum == onum).values(**update_data) + ) + + @classmethod + async def delete_metadata_sec_dao(cls, db: AsyncSession, onum_list: list[str]): + await db.execute(delete(MetadataSec).where(MetadataSec.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 5d21c2f..23c6a56 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 @@ -18,3 +18,16 @@ from config.database import Base # clas_eff_flag = Column(String(1), default=None, comment='标签有效标志') # rec_subm_prsn = Column(String(64), default=None, comment='记录提交人') # upd_time = Column(TIMESTAMP, default=func.now(), onupdate=func.now(), nullable=True, comment='更新时间') +class MetadataSec(Base): + """ + 数据安全配置表 + """ + __tablename__ = 't_metadata_sec' + + onum = Column(String(36), primary_key=True, comment='唯一编号') + sec_eff_flag = Column(String(1), default=None, comment='有效标志') + rec_subm_prsn = Column(String(64), default=None, comment='记录提交人') + upd_time = Column(TIMESTAMP, default=func.now(), onupdate=func.now(), nullable=True, comment='更新时间') + sec_level_name = Column(String(50), default=None, comment='等级名称') + sec_level_desc = Column(String(200), default=None, comment='等级说明') + sec_level_summary = Column(String(200), comment='等级简介') \ 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 bcea6a1..fa17988 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 @@ -59,3 +59,48 @@ class DeleteMetadataClasModel(BaseModel): clas_onums: str = Field(description='需要删除的标签主键(多个用逗号分隔)') +class MetadataSecModel(BaseModel): + """ + 数据安全配置表对应 Pydantic 模型 + """ + + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + onum: Optional[str] = Field(default=None, description='唯一编号') + sec_eff_flag: Optional[Literal['0', '1']] = Field(default=None, description='有效标志') + rec_subm_prsn: Optional[str] = Field(default=None, description='记录提交人') + upd_time: Optional[datetime] = Field(default=None, description='更新时间') + sec_level_name: Optional[str] = Field(default=None, description='等级名称') + sec_level_desc: Optional[str] = Field(default=None, description='等级说明') + sec_level_summary: Optional[str] = Field(default=None, description='等级简介') + + @NotBlank(field_name='sec_level_name', message='等级名称不能为空') + @Size(field_name='sec_level_name', min_length=1, max_length=50, message='等级名称长度不能超过50个字符') + def get_sec_level_name(self): + return self.sec_level_name + + def validate_fields(self): + self.get_sec_level_name() +class DeleteMetadataSecModel(BaseModel): + """ + 删除数据安全配置模型 + """ + + model_config = ConfigDict(alias_generator=to_camel) + + onums: str = Field(description='需要删除的唯一编号(多个用逗号分隔)') +class MetadataSecQueryModel(MetadataSecModel): + """ + 数据安全配置不分页查询模型 + """ + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') + +@as_query +class MetadataSecPageQueryModel(MetadataSecQueryModel): + """ + 数据安全配置分页查询模型 + """ + 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/metadata_config_service.py b/vue-fastapi-backend/module_admin/service/metadata_config_service.py index f31fce9..62a0ec4 100644 --- a/vue-fastapi-backend/module_admin/service/metadata_config_service.py +++ b/vue-fastapi-backend/module_admin/service/metadata_config_service.py @@ -1,10 +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, MetadataClasPageQueryModel +from module_admin.entity.vo.metadata_config_vo import MetadataClasModel, MetadataClasPageQueryModel,MetadataSecModel,MetadataSecPageQueryModel from utils.common_util import CamelCaseUtil from exceptions.exception import ServiceException - +import uuid class MetadataConfigService: """ @@ -88,3 +88,75 @@ class MetadataConfigService: return MetadataClasModel(**CamelCaseUtil.transform_result(result)) else: return MetadataClasModel(**dict()) + @classmethod + async def get_metadata_sec_list_services( + cls, query_db: AsyncSession, query_object: MetadataSecPageQueryModel, is_page: bool = False + ): + """ + 查询数据安全配置列表 + """ + result = await MetadataConfigDao.get_metadata_sec_list(query_db, query_object, is_page) + return result + + @classmethod + async def add_metadata_sec_services(cls, query_db: AsyncSession, page_object: MetadataSecModel): + """ + 新增数据安全配置 + """ + try: + page_object.onum=str(uuid.uuid4()) + await MetadataConfigDao.add_metadata_sec_dao(query_db, page_object) + await query_db.commit() + return CrudResponseModel(is_success=True, message="新增成功") + except Exception as e: + await query_db.rollback() + raise e + + @classmethod + async def edit_metadata_sec_services(cls, query_db: AsyncSession, page_object: MetadataSecModel): + """ + 编辑数据安全配置 + """ + edit_data = page_object.model_dump(exclude_unset=True) + info = await cls.get_metadata_sec_detail_services(query_db, page_object.onum) + if info.onum: + try: + await MetadataConfigDao.edit_metadata_sec_dao(query_db, page_object.onum, edit_data) + await query_db.commit() + return CrudResponseModel(is_success=True, message="更新成功") + except Exception as e: + await query_db.rollback() + raise e + else: + raise ServiceException(message="数据安全配置不存在") + + @classmethod + async def delete_metadata_sec_services(cls, query_db: AsyncSession, onum_list: str): + """ + 删除数据安全配置(支持多个编号用逗号分隔) + """ + if not onum_list: + raise ServiceException(message="传入的编号为空") + + id_list = [onum.strip() for onum in onum_list.split(",") if onum.strip()] + if not id_list: + raise ServiceException(message="无效的编号列表") + + try: + await MetadataConfigDao.delete_metadata_sec_dao(query_db, id_list) + await query_db.commit() + return CrudResponseModel(is_success=True, message="删除成功") + except Exception as e: + await query_db.rollback() + raise e + + @classmethod + async def get_metadata_sec_detail_services(cls, query_db: AsyncSession, onum: str): + """ + 查询数据安全配置详情 + """ + result = await MetadataConfigDao.get_sec_detail_by_id(query_db, onum) + if result: + return MetadataSecModel(**CamelCaseUtil.transform_result(result)) + else: + return MetadataSecModel(**dict()) \ No newline at end of file diff --git a/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js b/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js index 42ceb64..0491c4a 100644 --- a/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js +++ b/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js @@ -42,3 +42,47 @@ export function delMetadataClas(clasIds) { method: 'delete' }) } +// ========================== MetadataSec 接口(新增) ========================== + +// 查询数据安全配置列表,带分页 +export function listMetadataSec(query) { + return request({ + url: '/default-api/metadataConfig/sec/list', + method: 'get', + params: query + }) +} + +// 查询数据安全配置详情 +export function getMetadataSec(secId) { + return request({ + url: '/default-api/metadataConfig/sec/' + secId, + method: 'get' + }) +} + +// 新增数据安全配置 +export function addMetadataSec(data) { + return request({ + url: '/default-api/metadataConfig/sec', + method: 'post', + data: data + }) +} + +// 修改数据安全配置 +export function updateMetadataSec(data) { + return request({ + url: '/default-api/metadataConfig/sec', + method: 'put', + data: data + }) +} + +// 删除数据安全配置(支持批量,逗号分隔) +export function delMetadataSec(secIds) { + return request({ + url: '/default-api/metadataConfig/sec/' + secIds, + method: 'delete' + }) +} \ No newline at end of file diff --git a/vue-fastapi-frontend/src/views/metadataConfig/sec/index.vue b/vue-fastapi-frontend/src/views/metadataConfig/sec/index.vue new file mode 100644 index 0000000..d5be39a --- /dev/null +++ b/vue-fastapi-frontend/src/views/metadataConfig/sec/index.vue @@ -0,0 +1,293 @@ + + + + +