Browse Source

配置域

master
si@aidatagov.com 3 days ago
parent
commit
741c2e8e4d
  1. 116
      vue-fastapi-backend/module_admin/controller/metadata_config_controller.py
  2. 138
      vue-fastapi-backend/module_admin/dao/metadata_config_dao.py
  3. 31
      vue-fastapi-backend/module_admin/entity/do/metadata_config_do.py
  4. 115
      vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py
  5. 141
      vue-fastapi-backend/module_admin/service/metadata_config_service.py
  6. 96
      vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js
  7. 272
      vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue
  8. 392
      vue-fastapi-frontend/src/views/metadataConfig/bizPermiConfig/index.vue

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

@ -2,7 +2,19 @@ from datetime import datetime
from fastapi import APIRouter, Depends, Request, Form from fastapi import APIRouter, Depends, Request, Form
from pydantic_validation_decorator import ValidateFields from pydantic_validation_decorator import ValidateFields
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.vo.metadata_config_vo import MetadataClasModel, MetadataClasPageQueryModel,MetadataSecModel,MetadataSecPageQueryModel from module_admin.entity.vo.metadata_config_vo import (
MetadataClasModel,
MetadataClasPageQueryModel,
MetadataSecModel,
MetadataSecPageQueryModel,
SecuBizConfigModel,
SecuBizConfigPageQueryModel,
SecuBizConfigQueryModel,
SecuBizPermiConfigModel,
SecuBizPermiConfigBatchModel,
SecuBizPermiConfigPageQueryModel,
SecuBizPermiConfigQueryModel
)
from module_admin.service.metadata_config_service import MetadataConfigService from module_admin.service.metadata_config_service import MetadataConfigService
from config.get_db import get_db from config.get_db import get_db
from utils.response_util import ResponseUtil from utils.response_util import ResponseUtil
@ -142,4 +154,104 @@ async def get_metadata_sec_detail(
): ):
result = await MetadataConfigService.get_metadata_sec_detail_services(query_db, sec_id) result = await MetadataConfigService.get_metadata_sec_detail_services(query_db, sec_id)
logger.info(f"获取数据安全配置 onum={sec_id} 详情成功") logger.info(f"获取数据安全配置 onum={sec_id} 详情成功")
return ResponseUtil.success(data=result) return ResponseUtil.success(data=result)
# ---------- t_secu_biz_config 接口(改造后) ----------
@metadataConfigController.get("/bizConfig/list", response_model=PageResponseModel)
async def get_biz_config_list(
request: Request,
query: SecuBizConfigQueryModel = Depends(SecuBizConfigPageQueryModel.as_query),
db: AsyncSession = Depends(get_db),
):
result = await MetadataConfigService.get_biz_config_list_services(db, query, is_page=True)
return ResponseUtil.success(model_content=result)
@metadataConfigController.get("/bizConfig/listall")
async def get_biz_config_list_all(
request: Request,
query: SecuBizConfigQueryModel = Depends(SecuBizConfigPageQueryModel.as_query),
db: AsyncSession = Depends(get_db),
):
result = await MetadataConfigService.get_biz_config_list_services(db, query, is_page=False)
return ResponseUtil.success(data=result)
@metadataConfigController.post("/bizConfig/add")
@ValidateFields(["bizModule", "configType", "securityLevel", "applyType"])
async def add_biz_config(
item: SecuBizConfigModel,
db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
item.create_by = current_user.user.user_name
item.create_time = datetime.now()
result = await MetadataConfigService.add_biz_config_services(db, item)
return ResponseUtil.success(msg=result.message)
@metadataConfigController.post("/bizConfig/edit")
@ValidateFields(["onum"])
async def edit_biz_config(
item: SecuBizConfigModel,
db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
item.update_by = current_user.user.user_name
item.update_time = datetime.now()
result = await MetadataConfigService.edit_biz_config_services(db, item)
return ResponseUtil.success(msg=result.message)
@metadataConfigController.delete("/bizConfig/delete")
async def delete_biz_config(onums: str, db: AsyncSession = Depends(get_db)):
result = await MetadataConfigService.delete_biz_config_services(db, onums)
return ResponseUtil.success(msg=result.message)
@metadataConfigController.get("/bizConfig/detail")
async def get_biz_config_detail(onum: str, db: AsyncSession = Depends(get_db)):
data = await MetadataConfigService.get_biz_config_detail_services(db, onum)
return ResponseUtil.success(data=data)
# ---------- t_secu_biz_permi_config 接口 ----------
@metadataConfigController.get("/bizPermiConfig/list", response_model=PageResponseModel)
async def get_biz_permi_config_list(
request: Request,
query: SecuBizConfigModel = Depends(SecuBizPermiConfigPageQueryModel.as_query),
query_db: AsyncSession = Depends(get_db),
):
result = await MetadataConfigService.get_biz_permi_config_list_services(query_db, query, is_page=True)
return ResponseUtil.success(model_content=result)
@metadataConfigController.post("/bizPermiConfig/add")
async def add_biz_permi_config(
item: SecuBizPermiConfigBatchModel,
db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)
):
create_by = current_user.user.user_name
create_time = datetime.now()
result = await MetadataConfigService.add_biz_permi_config_services(db, item, create_by, create_time)
return ResponseUtil.success(msg=result.message)
@metadataConfigController.post("/bizPermiConfig/edit")
@ValidateFields(["onum"])
async def edit_biz_permi_config(item: SecuBizPermiConfigModel, db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
item.update_by = current_user.user.user_name
item.update_time = datetime.now()
result = await MetadataConfigService.edit_biz_permi_config_services(db, item)
return ResponseUtil.success(msg=result.message)
@metadataConfigController.delete("/bizPermiConfig/delete")
async def delete_biz_permi_config(onums: str, db: AsyncSession = Depends(get_db)):
result = await MetadataConfigService.delete_biz_permi_config_services(db, onums)
return ResponseUtil.success(msg=result.message)
@metadataConfigController.get("/bizPermiConfig/detail")
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)

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

@ -1,9 +1,12 @@
from datetime import datetime, time from datetime import datetime, time
from sqlalchemy import delete, select, update 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 # ORM 类
from module_admin.entity.do.metadata_config_do import MetadataSec # ORM 类 from module_admin.entity.do.metadata_config_do import MetadataSec,SecuBizConfig,SecuBizPermiConfig # ORM 类
from typing import List
from sqlalchemy.orm import joinedload
from sqlalchemy.sql import true
from utils.page_util import PageUtil
class MetadataConfigDao: class MetadataConfigDao:
""" """
@ -49,7 +52,6 @@ class MetadataConfigDao:
if query_object.begin_time and query_object.end_time else True, if query_object.begin_time and query_object.end_time else True,
).order_by(MetadataClas.clas_onum).distinct() ).order_by(MetadataClas.clas_onum).distinct()
from utils.page_util import PageUtil
return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page)
@classmethod @classmethod
@ -113,4 +115,130 @@ class MetadataConfigDao:
@classmethod @classmethod
async def delete_metadata_sec_dao(cls, db: AsyncSession, onum_list: list[str]): async def delete_metadata_sec_dao(cls, db: AsyncSession, onum_list: list[str]):
await db.execute(delete(MetadataSec).where(MetadataSec.onum.in_(onum_list))) await db.execute(delete(MetadataSec).where(MetadataSec.onum.in_(onum_list)))
# ------------- t_secu_biz_config 相关方法 --------------
@classmethod
async def get_biz_config_detail_by_id(cls, db: AsyncSession, onum: int):
result = await db.execute(select(SecuBizConfig).where(SecuBizConfig.onum == onum))
return result.scalars().first()
@classmethod
async def get_biz_config_list(cls, db: AsyncSession, query_object, is_page: bool = False):
query = select(SecuBizConfig).where(
SecuBizConfig.risk_lvl.like(f"%{query_object.risk_lvl}%") if query_object.risk_lvl else True,
SecuBizConfig.isStop == query_object.isStop if query_object.isStop is not None else True,
SecuBizConfig.create_time.between(
datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time.min),
datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time.max),
) if query_object.begin_time and query_object.end_time else True,
).order_by(SecuBizConfig.create_time.desc())
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_biz_config(cls, db: AsyncSession, obj):
db_obj = SecuBizConfig(**obj.model_dump())
db.add(db_obj)
await db.flush()
return db_obj
@classmethod
async def edit_biz_config(cls, db: AsyncSession, onum: int, update_data: dict):
await db.execute(
update(SecuBizConfig).where(SecuBizConfig.onum == onum).values(**update_data)
)
@classmethod
async def delete_biz_config(cls, db: AsyncSession, onum_list: list[int]):
await db.execute(delete(SecuBizConfig).where(SecuBizConfig.onum.in_(onum_list)))
@classmethod
async def add_biz_permi_config_batch(cls, db: AsyncSession, records: List[SecuBizPermiConfig]):
orm_objs = []
for rec in records:
orm_obj = SecuBizPermiConfig(
biz_onum=rec.biz_onum,
obj_type=rec.obj_type,
obj_value=rec.obj_value,
obj_name=rec.obj_name,
isStop=rec.isStop,
create_by=rec.create_by,
create_time=rec.create_time,
update_by=rec.update_by,
update_time=rec.update_time,
)
orm_objs.append(orm_obj)
db.add_all(orm_objs)
# ------------- t_secu_biz_permi_config 相关方法 --------------
@classmethod
async def get_biz_permi_config_detail_by_id(cls, db: AsyncSession, onum: int):
result = await db.execute(select(SecuBizPermiConfig).where(SecuBizPermiConfig.onum == onum))
return result.scalars().first()
# @classmethod
# async def get_biz_permi_config_list(cls, db: AsyncSession, query_object, is_page: bool = False):
# query = select(SecuBizPermiConfig).where(
# SecuBizPermiConfig.obj_value.like(f"%{query_object.obj_value}%") if query_object.obj_value else True,
# SecuBizPermiConfig.obj_type == query_object.obj_type if query_object.obj_type else True,
# SecuBizPermiConfig.isStop == query_object.isStop if query_object.isStop is not None else True,
# SecuBizPermiConfig.create_time.between(
# datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time.min),
# datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time.max),
# ) if query_object.begin_time and query_object.end_time else True,
# ).order_by(SecuBizPermiConfig.create_time.desc())
# 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 get_biz_permi_config_list(cls, db: AsyncSession, query_object, is_page: bool = False):
# 构建基础查询
query = (
select(
SecuBizPermiConfig.onum,
SecuBizPermiConfig.biz_onum,
SecuBizPermiConfig.obj_type,
SecuBizPermiConfig.obj_value,
SecuBizPermiConfig.obj_name,
SecuBizPermiConfig.isStop,
SecuBizPermiConfig.create_by,
SecuBizPermiConfig.create_time,
SecuBizPermiConfig.update_by,
SecuBizPermiConfig.update_time,
SecuBizConfig.biz_name,
MetadataSec.sec_level_summary
)
.join(SecuBizConfig, SecuBizPermiConfig.biz_onum == SecuBizConfig.onum, isouter=True)
.join(MetadataSec, SecuBizConfig.risk_lvl == MetadataSec.onum, isouter=True)
.where(
SecuBizPermiConfig.obj_value.like(f"%{query_object.obj_value}%") if query_object.obj_value else true(),
SecuBizPermiConfig.obj_type == query_object.obj_type if query_object.obj_type else true(),
SecuBizPermiConfig.isStop == query_object.isStop if query_object.isStop is not None else true(),
SecuBizPermiConfig.create_time.between(
datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time.min),
datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time.max),
) if query_object.begin_time and query_object.end_time else true()
)
.order_by(SecuBizPermiConfig.create_time.desc())
)
return await PageUtil.paginate(
db, query, query_object.page_num, query_object.page_size, is_page
)
@classmethod
async def add_biz_permi_config(cls, db: AsyncSession, obj):
db_obj = SecuBizPermiConfig(**obj.model_dump())
db.add(db_obj)
await db.flush()
return db_obj
@classmethod
async def edit_biz_permi_config(cls, db: AsyncSession, onum: int, update_data: dict):
await db.execute(
update(SecuBizPermiConfig).where(SecuBizPermiConfig.onum == onum).values(**update_data)
)
@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)))

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

@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from sqlalchemy import Column, String, Integer, DateTime, TIMESTAMP, func from sqlalchemy import Column, String, Integer, DateTime, TIMESTAMP,Boolean, func
from config.database import Base from config.database import Base
@ -30,4 +30,31 @@ class MetadataSec(Base):
upd_time = Column(TIMESTAMP, default=func.now(), onupdate=func.now(), nullable=True, 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_name = Column(String(50), default=None, comment='等级名称')
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 SecuBizPermiConfig(Base):
__tablename__ = "t_secu_biz_permi_config"
onum = Column(Integer, primary_key=True, autoincrement=True, comment="序号")
biz_onum = Column(Integer, nullable=True, comment="业务域的序号,可关联业务域定义表")
obj_type = Column(String(1), nullable=True, comment="对象类型(0:角色 1:用户)")
obj_value = Column(String(50), nullable=True, comment="角色值")
obj_name = Column(String(50), nullable=True, comment="角色值")
isStop = Column(Boolean, nullable=True, comment="是否停用(0:运行 1:停用)")
create_by = Column(String(20), nullable=True, comment="创建者")
create_time = Column(DateTime, nullable=True, comment="创建时间")
update_by = Column(String(20), nullable=True, comment="更新者")
update_time = Column(DateTime, nullable=True, comment="更新时间")
class SecuBizConfig(Base):
__tablename__ = "t_secu_biz_config"
onum = Column(Integer, primary_key=True, autoincrement=True, comment="序号")
biz_name = Column(String(255), nullable=True, comment="业务域名称") # 这里你给的是int,实际是否应该varchar?
risk_lvl = Column(String(50), nullable=True, comment="可关联安全等级序号")
isStop = Column(Boolean, nullable=True, comment="是否停用(0:运行 1:停用)")
create_by = Column(String(20), nullable=True, comment="创建者")
create_time = Column(DateTime, nullable=True, comment="创建时间")
update_by = Column(String(20), nullable=True, comment="更新者")
update_time = Column(DateTime, nullable=True, comment="更新时间")

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

@ -2,7 +2,7 @@ from datetime import datetime
from pydantic import BaseModel, ConfigDict, Field from pydantic import BaseModel, ConfigDict, Field
from pydantic.alias_generators import to_camel from pydantic.alias_generators import to_camel
from pydantic_validation_decorator import NotBlank, Size from pydantic_validation_decorator import NotBlank, Size
from typing import Literal, Optional from typing import Literal, Optional,List
from module_admin.annotation.pydantic_annotation import as_query from module_admin.annotation.pydantic_annotation import as_query
@ -103,4 +103,115 @@ class MetadataSecPageQueryModel(MetadataSecQueryModel):
""" """
page_num: int = Field(default=1, description='当前页码') page_num: int = Field(default=1, description='当前页码')
page_size: int = Field(default=10, description='每页记录数') page_size: int = Field(default=10, description='每页记录数')
# ----------- t_secu_biz_config 表对应模型 --------------
class SecuBizConfigModel(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='更新时间')
@NotBlank(field_name='risk_lvl', message='安全等级不能为空')
@Size(field_name='risk_lvl', max_length=50, message='安全等级长度不能超过50')
def get_risk_lvl(self):
return self.risk_lvl
def validate_fields(self):
self.get_risk_lvl()
class DeleteSecuBizConfigModel(BaseModel):
"""
删除业务域配置模型
"""
model_config = ConfigDict(alias_generator=to_camel)
onums: str = Field(..., description='需要删除的唯一编号(多个用逗号分隔)')
class SecuBizConfigQueryModel(SecuBizConfigModel):
"""
业务域配置不分页查询模型
"""
begin_time: Optional[str] = Field(default=None, description='开始时间')
end_time: Optional[str] = Field(default=None, description='结束时间')
@as_query
class SecuBizConfigPageQueryModel(SecuBizConfigQueryModel):
"""
业务域配置分页查询模型
"""
page_num: int = Field(default=1, description='当前页码')
page_size: int = Field(default=10, description='每页记录数')
# ----------- t_secu_biz_permi_config 表对应模型 --------------
class SecuBizPermiConfigModel(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='业务域的序号,可关联业务域定义表')
obj_type: Optional[str] = Field(default=None, description='对象类型(0:角色 1:用户)')
obj_value: Optional[str] = Field(default=None, description='角色值')
obj_name: Optional[str] = Field(default=None, description='角色名称')
isStop: Optional[bool] = Field(default=None, description='是否停用(false:运行 true:停用)')
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='更新时间')
class SecuBizPermiConfigBatchModel(BaseModel):
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
biz_onum_list: List[int] = Field(..., description='业务域编号列表')
obj_type: str = Field(..., description='对象类型(0:角色 1:用户)')
obj_value: str = Field(..., description='角色值')
obj_name: str = Field(..., description='角色名称')
isStop: Optional[bool] = Field(default=False, description='是否停用(false:运行 true:停用)')
@NotBlank(field_name='obj_value', message='角色值不能为空')
@Size(field_name='obj_value', max_length=50, message='角色值长度不能超过50个字符')
def get_obj_value(self):
return self.obj_value
@NotBlank(field_name='obj_name', message='角色名称不能为空')
@Size(field_name='obj_name', max_length=50, message='角色名称长度不能超过50个字符')
def get_obj_name(self):
return self.obj_name
def validate_fields(self):
self.get_obj_value()
self.get_obj_name()
class DeleteSecuBizPermiConfigModel(BaseModel):
"""
删除业务域权限配置模型
"""
model_config = ConfigDict(alias_generator=to_camel)
onums: str = Field(..., description='需要删除的唯一编号(多个用逗号分隔)')
class SecuBizPermiConfigQueryModel(SecuBizPermiConfigModel):
"""
业务域权限配置不分页查询模型
"""
begin_time: Optional[str] = Field(default=None, description='开始时间')
end_time: Optional[str] = Field(default=None, description='结束时间')
@as_query
class SecuBizPermiConfigPageQueryModel(SecuBizPermiConfigQueryModel):
"""
业务域权限配置分页查询模型
"""
page_num: int = Field(default=1, description='当前页码')
page_size: int = Field(default=10, description='每页记录数')

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

@ -1,10 +1,12 @@
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, MetadataClasPageQueryModel,MetadataSecModel,MetadataSecPageQueryModel from module_admin.entity.vo.metadata_config_vo import MetadataClasModel, SecuBizPermiConfigBatchModel,MetadataClasPageQueryModel,MetadataSecModel,MetadataSecPageQueryModel,SecuBizConfigModel ,SecuBizConfigQueryModel,SecuBizPermiConfigModel, SecuBizPermiConfigQueryModel
from utils.common_util import CamelCaseUtil from utils.common_util import CamelCaseUtil
from exceptions.exception import ServiceException from exceptions.exception import ServiceException
import uuid import uuid
from typing import List
from datetime import datetime
class MetadataConfigService: class MetadataConfigService:
""" """
@ -159,4 +161,139 @@ class MetadataConfigService:
if result: if result:
return MetadataSecModel(**CamelCaseUtil.transform_result(result)) return MetadataSecModel(**CamelCaseUtil.transform_result(result))
else: else:
return MetadataSecModel(**dict()) return MetadataSecModel(**dict())
# ----------- t_secu_biz_config 服务方法 -----------
@classmethod
async def get_biz_config_list_services(
cls, db: AsyncSession, query_object: SecuBizConfigQueryModel, is_page: bool = False
):
result = await MetadataConfigDao.get_biz_config_list(db, query_object, is_page)
return result
@classmethod
async def add_biz_config_services(cls, db: AsyncSession, page_object: SecuBizConfigModel):
try:
await MetadataConfigDao.add_biz_config(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_biz_config_services(cls, db: AsyncSession, page_object: SecuBizConfigModel):
edit_data = page_object.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 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_biz_config_services(cls, 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_biz_config(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_biz_config_detail_services(cls, db: AsyncSession, onum: str):
result = await MetadataConfigDao.get_biz_config_detail_by_id(db, onum)
if result:
return SecuBizConfigModel(**CamelCaseUtil.transform_result(result))
else:
return SecuBizConfigModel(**dict())
# ----------- t_secu_biz_permi_config 服务方法 -----------
@classmethod
async def get_biz_permi_config_list_services(
cls, db: AsyncSession, query_object: SecuBizPermiConfigQueryModel, is_page: bool = False
):
result = await MetadataConfigDao.get_biz_permi_config_list(db, query_object, is_page)
return result
@classmethod
async def add_biz_permi_config_services(
cls,
db: AsyncSession,
batch_model: SecuBizPermiConfigBatchModel,
create_by: str,
create_time: datetime
) -> CrudResponseModel:
try:
records: List[SecuBizPermiConfigModel] = []
for biz_onum in batch_model.biz_onum_list:
record = SecuBizPermiConfigModel()
record.biz_onum = biz_onum
record.obj_type = batch_model.obj_type
record.obj_value = batch_model.obj_value
record.obj_name = batch_model.obj_name
record.isStop = batch_model.isStop
record.create_by = create_by
record.create_time = create_time
records.append(record)
await MetadataConfigDao.add_biz_permi_config_batch(db, records)
await db.commit()
return CrudResponseModel(is_success=True, message="新增成功")
except Exception as e:
await db.rollback()
raise e
@classmethod
async def edit_biz_permi_config_services(cls, db: AsyncSession, page_object: SecuBizPermiConfigModel):
edit_data = page_object.model_dump(exclude_unset=True)
info = await cls.get_biz_permi_config_detail_services(db, page_object.onum)
if info.onum:
try:
await MetadataConfigDao.edit_biz_permi_config(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_biz_permi_config_services(cls, 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_biz_permi_config(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_biz_permi_config_detail_services(cls, db: AsyncSession, onum: str):
result = await MetadataConfigDao.get_biz_permi_config_detail_by_id(db, onum)
if result:
return SecuBizPermiConfigModel(**CamelCaseUtil.transform_result(result))
else:
return SecuBizPermiConfigModel(**dict())

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

@ -85,4 +85,98 @@ export function delMetadataSec(secIds) {
url: '/default-api/metadataConfig/sec/' + secIds, url: '/default-api/metadataConfig/sec/' + secIds,
method: 'delete' method: 'delete'
}) })
} }
// 查询业务配置列表,带分页
export function listBizConfigAll(query) {
return request({
url: '/default-api/metadataConfig/bizConfig/listall',
method: 'get',
data: query
})
}
export function listBizConfig(query) {
return request({
url: '/default-api/metadataConfig/bizConfig/list',
method: 'get',
data: query
})
}
// 查询业务配置详情
export function getBizConfig(onum) {
return request({
url: '/default-api/metadataConfig/bizConfig/detail',
method: 'get',
params: { onum }
})
}
// 新增业务配置
export function addBizConfig(data) {
return request({
url: '/default-api/metadataConfig/bizConfig/add',
method: 'post',
data: data
})
}
// 修改业务配置
export function updateBizConfig(data) {
return request({
url: '/default-api/metadataConfig/bizConfig/edit',
method: 'post',
data: data
})
}
// 删除业务配置(支持批量,逗号分隔)
export function delBizConfig(onumStr) {
return request({
url: '/default-api/metadataConfig/bizConfig/delete',
method: 'delete',
params: { onums: onumStr }
})
}
// 查询权限配置列表,带分页
export function listBizPermiConfig(query) {
return request({
url: '/default-api/metadataConfig/bizPermiConfig/list',
method: 'get',
data: query
})
}
// 查询权限配置详情
export function getBizPermiConfig(onum) {
return request({
url: '/default-api/metadataConfig/bizPermiConfig/detail',
method: 'get',
params: { onum }
})
}
// 新增权限配置
export function addBizPermiConfig(data) {
return request({
url: '/default-api/metadataConfig/bizPermiConfig/add',
method: 'post',
data: data
})
}
// 修改权限配置
export function updateBizPermiConfig(data) {
return request({
url: '/default-api/metadataConfig/bizPermiConfig/edit',
method: 'post',
data: data
})
}
// 删除权限配置(支持批量,逗号分隔)
export function delBizPermiConfig(onumStr) {
return request({
url: '/default-api/metadataConfig/bizPermiConfig/delete',
method: 'delete',
params: { onums: onumStr }
})
}

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

@ -0,0 +1,272 @@
<template>
<div class="app-container">
<el-row :gutter="10" class="mb8">
<el-form :inline="true" :model="queryForm" >
<el-form-item label="业务域名称">
<el-input v-model="queryForm.bizName" placeholder="请输入业务域名称" clearable />
</el-form-item>
<el-form-item label="风险等级">
<el-input v-model="queryForm.riskLvl" placeholder="请输入风险等级" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleSearch">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="openAddDialog">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="selectedRows.length !== 1"
@click="openEditDialog(selectedRows[0])"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="selectedRows.length === 0"
@click="deleteSelected"
>删除</el-button>
</el-col>
</el-row>
<el-table
v-loading="loading"
:data="bizList"
@selection-change="handleSelectionChange"
style="width: 100%"
border
stripe
>
<el-table-column type="selection" width="55" />
<el-table-column prop="bizName" label="业务域名称" />
<el-table-column prop="riskLvl" label="风险等级" />
<el-table-column prop="isStop" label="是否停用">
<template #default="{ row }">
<el-tag :type="row.isStop === 0 ? 'success' : 'info'">
{{ row.isStop === 0 ? '运行' : '停用' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createBy" label="创建者" />
<el-table-column prop="createTime" label="创建时间" width="180" />
<el-table-column prop="updateBy" label="更新者" />
<el-table-column prop="updateTime" label="更新时间" width="180" />
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryForm.pageNum"
v-model:limit="queryForm.pageSize"
@pagination="getList"
/>
<el-dialog
:title="title"
v-model="open"
width="600px"
append-to-body
:before-close="handleClose"
>
<el-form
ref="bizFormRef"
:model="form"
:rules="rules"
label-width="130px"
size="small"
>
<el-form-item label="业务域名称" prop="bizName">
<el-input v-model="form.bizName" />
</el-form-item>
<el-form-item label="风险等级" prop="riskLvl">
<el-input v-model="form.riskLvl" />
</el-form-item>
<el-form-item label="是否停用" prop="isStop">
<el-select v-model="form.isStop" placeholder="请选择状态">
<el-option label="运行" :value="0" />
<el-option label="停用" :value="1" />
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="open = false">取消</el-button>
<el-button type="primary" @click="submitForm">保存</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { ElMessageBox, ElMessage } from 'element-plus'
import {
listSecuBizConfig,
addSecuBizConfig,
updateSecuBizConfig,
delSecuBizConfig
} from '@/api/metadataConfig/metadataConfig'
const queryForm = reactive({
bizName: '',
riskLvl: '',
pageNum: 1,
pageSize: 10
})
const bizList = ref([])
const total = ref(0)
const loading = ref(false)
const open = ref(false)
const title = ref('')
const bizFormRef = ref(null)
const form = reactive({
onum: null,
bizName: '',
riskLvl: '',
isStop: null
})
const rules = {
bizName: [{ required: true, message: '请输入业务域名称', trigger: 'blur' }],
riskLvl: [{ required: true, message: '请输入风险等级', trigger: 'blur' }],
isStop: [{ required: true, message: '请选择状态', trigger: 'change' }]
}
const selectedRows = ref([])
function handleSelectionChange(val) {
selectedRows.value = val
}
async function getList() {
loading.value = true
try {
const res = await listSecuBizConfig(queryForm)
bizList.value = res.rows || []
total.value = res.total || 0
} catch (error) {
ElMessage.error('获取列表失败,请重试')
} finally {
loading.value = false
}
}
function resetQuery() {
queryForm.bizName = ''
queryForm.riskLvl = ''
queryForm.pageNum = 1
getList()
}
function handleSearch() {
queryForm.pageNum = 1
getList()
}
function openAddDialog() {
title.value = '新增业务域配置'
Object.assign(form, {
onum: null,
bizName: '',
riskLvl: '',
isStop: null
})
open.value = true
}
function openEditDialog(row) {
if (!row) {
ElMessage.warning('请选择一条记录进行编辑')
return
}
title.value = '编辑业务域配置'
Object.assign(form, row)
open.value = true
}
function submitForm() {
bizFormRef.value.validate(async (valid) => {
if (!valid) return
const submitData = { ...form }
try {
if (title.value.includes('新增')) {
await addSecuBizConfig(submitData)
ElMessage.success('新增成功')
} else {
await updateSecuBizConfig(submitData)
ElMessage.success('编辑成功')
}
open.value = false
getList()
} catch (error) {
ElMessage.error('操作失败,请重试')
}
})
}
function deleteRow(onum) {
ElMessageBox.confirm('确定删除该条记录吗?', '提示', { type: 'warning' })
.then(async () => {
try {
await delSecuBizConfig(onum)
ElMessage.success('删除成功')
getList()
} catch (error) {
ElMessage.error('删除失败,请重试')
}
})
.catch(() => {})
}
function deleteSelected() {
if (selectedRows.value.length === 0) {
ElMessage.warning('请至少选择一条记录删除')
return
}
ElMessageBox.confirm(`确定删除选中的 ${selectedRows.value.length} 条记录吗?`, '提示', { type: 'warning' })
.then(async () => {
try {
for (const row of selectedRows.value) {
await delSecuBizConfig(row.onum)
}
ElMessage.success('删除成功')
getList()
} catch (error) {
ElMessage.error('删除失败,请重试')
}
})
.catch(() => {})
}
function handleClose(done) {
bizFormRef.value.resetFields()
done()
}
onMounted(() => {
getList()
})
</script>
<style scoped>
.app-container {
padding: 20px;
}
.mb8 {
margin-bottom: 8px;
}
</style>

392
vue-fastapi-frontend/src/views/metadataConfig/bizPermiConfig/index.vue

@ -0,0 +1,392 @@
<template>
<div class="app-container">
<el-row :gutter="10" class="mb8">
<el-form :inline="true" :model="queryForm" >
<el-form-item label="对象类型">
<el-select v-model="queryForm.objType" placeholder="请选择对象类型" style="width: 180px" clearable>
<el-option label="角色" value="0" />
<el-option label="用户" value="1" />
</el-select>
</el-form-item>
<el-form-item label="对象名称">
<el-input v-model="queryForm.objName" placeholder="请输入对象名称" style="width: 180px" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleSearch">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="openAddDialog">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="selectedRows.length !== 1"
@click="openEditDialog(selectedRows[0])"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="selectedRows.length === 0"
@click="deleteSelected"
>删除</el-button>
</el-col>
</el-row>
<el-table
v-loading="loading"
:data="permList"
@selection-change="handleSelectionChange"
style="width: 100%"
border
stripe
>
<el-table-column type="selection" width="55" />
<el-table-column prop="bizName" label="业务域" />
<el-table-column prop="objType" label="对象类型">
<template #default="{ row }">
{{ row.objType === '0' || row.objType === 0 ? '角色' : '用户' }}
</template>
</el-table-column> <el-table-column prop="objName" label="对象名称" />
<el-table-column prop="isStop" label="是否停用">
<template #default="{ row }">
<el-tag :type="row.isStop? 'success' : 'info'">
{{ row.isStop ? '运行' : '停用' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="secLevelSummary" label="安全等级" />
<el-table-column prop="createBy" label="创建者" />
<el-table-column prop="createTime" label="创建时间" width="180" />
<el-table-column prop="updateBy" label="更新者" />
<el-table-column prop="updateTime" label="更新时间" width="180" />
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryForm.pageNum"
v-model:limit="queryForm.pageSize"
@pagination="getList"
/>
<el-dialog
:title="title"
v-model="open"
width="600px"
append-to-body
:before-close="handleClose"
>
<el-form
ref="permFormRef"
:model="form"
:rules="rules"
label-width="130px"
size="small"
>
<el-form-item label="业务域" prop="bizOnum">
<el-select
v-model="form.bizOnum"
:multiple="isAddMode"
placeholder="请选择业务域"
filterable
clearable
>
<el-option
v-for="dict in bizOnumList"
:key="dict.onum"
:label="dict.bizName"
:value="dict.onum"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="对象类型" prop="objType">
<el-select v-model="form.objType" placeholder="请选择对象类型" @change="changeMetaSecurityObj"
>
<el-option label="角色" value="0" />
<el-option label="用户" value="1" />
</el-select>
</el-form-item>
<!-- @change="handleObjValueChange" -->
<el-form-item label="对象名称" prop="objName">
<el-select
v-model="form.objName"
placeholder="请选择"
maxlength="30"
>
<el-option
v-for="dict in userOrRoleList"
:key="dict.id"
:label="dict.name"
:value="dict.name"
></el-option>
</el-select>
</el-form-item>
<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>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="open = false">取消</el-button>
<el-button type="primary" @click="submitForm">保存</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { ElMessageBox, ElMessage } from 'element-plus'
import {
listBizPermiConfig,
addBizPermiConfig,
updateBizPermiConfig,
listBizConfigAll,
delBizPermiConfig
} from '@/api/metadataConfig/metadataConfig'
import { listUser} from "@/api/system/user";
import { listRole} from "@/api/system/role";
const queryForm = reactive({
objType: '',
objName: '',
pageNum: 1,
pageSize: 10
})
const permList = ref([])
const total = ref(0)
const loading = ref(false)
const open = ref(false)
const title = ref('')
// const handleObjValueChange = (selectedValues) => {
// //
// const sourceList = form.value.objType === '0'
// ? userList.value
// : roleList.value;
// //
// const names = selectedValues.map(value => {
// const item = sourceList.find(item => item.id === value);
// return item ? item.name : '';
// });
// }
const roleList = ref([]);
const userList = ref([]);
const userOrRoleList = ref([]);
const bizOnumList = ref([]);
function getRoleOrUserList() {
listRole().then(response => {
response.rows.forEach(item => {
roleList.value.push({id:item.roleId.toString(),name:item.roleName})
});
});
listUser().then(response => {
response.rows.forEach(item => {
userList.value.push({id:item.userId.toString(),name:item.nickName})
});
});
}
const permFormRef = ref(null)
const form = reactive({
onum: null,
bizOnum: null,
objType: '',
objName: '',
isStop: null
})
function changeMetaSecurityObj(data){
form.objName=""
if(data=="1"){
userOrRoleList.value=userList.value
}else {
userOrRoleList.value=roleList.value
}
}
const rules = {
bizOnum: [{ required: true, message: '请输入业务域', trigger: 'blur' }],
objType: [{ required: true, message: '请选择对象类型', trigger: 'change' }],
objName: [{ required: true, message: '请输入对象名称', trigger: 'blur' }],
isStop: [{ required: true, message: '请选择状态', trigger: 'change' }]
}
const selectedRows = ref([])
function handleSelectionChange(val) {
selectedRows.value = val
}
async function getList() {
loading.value = true
try {
const res = await listBizPermiConfig(queryForm)
permList.value = res.rows || []
total.value = res.total || 0
} catch (error) {
ElMessage.error('获取列表失败,请重试')
} finally {
loading.value = false
}
}
async function getBizList() {
loading.value = true
try {
const res = await listBizConfigAll()
bizOnumList.value = res.data || []
console.log(bizOnumList,"ssss")
} catch (error) {
ElMessage.error('获取业务域列表失败,请重试')
} finally {
loading.value = false
}
}
function resetQuery() {
queryForm.objType = ''
queryForm.objName = ''
queryForm.pageNum = 1
getList()
}
function handleSearch() {
queryForm.pageNum = 1
getList()
}
const isAddMode = ref(true)
function openAddDialog() {
isAddMode.value = true
title.value = '新增业务域权限配置'
Object.assign(form, {
onum: null,
bizOnum: [],
objType: '',
objName: '',
isStop: null
})
open.value = true
}
function openEditDialog(row) {
if (!row) {
ElMessage.warning('请选择一条记录进行编辑')
return
}
isAddMode.value = false
title.value = '编辑业务域权限配置'
Object.assign(form, row)
if(form.objType=="0"){
userOrRoleList.value=roleList.value
}else{
userOrRoleList.value=userList.value
}
open.value = true
}
function submitForm() {
permFormRef.value.validate(async (valid) => {
if (!valid) return
try {
if (title.value.includes('新增')) {
const submitData = {
bizOnumList: form.bizOnum, //
objType: form.objType,
objName: form.objName,
isStop: form.isStop,
}
await addBizPermiConfig(submitData)
ElMessage.success('新增成功')
} else {
const submitData = {
onum: form.onum, //
bizOnum: form.bizOnum, //
objType: form.objType,
objName: form.objName,
isStop: form.isStop,
}
await updateBizPermiConfig(submitData)
ElMessage.success('编辑成功')
}
open.value = false
getList()
} catch (error) {
ElMessage.error('操作失败,请重试')
}
})
}
function deleteRow(onum) {
ElMessageBox.confirm('确定删除该条记录吗?', '提示', { type: 'warning' })
.then(async () => {
try {
await delBizPermiConfig(onum)
ElMessage.success('删除成功')
getList()
} catch (error) {
ElMessage.error('删除失败,请重试')
}
})
.catch(() => {})
}
function deleteSelected() {
if (selectedRows.value.length === 0) {
ElMessage.warning('请至少选择一条记录删除')
return
}
const onumStr = selectedRows.value.map(row => row.onum).join(',')
ElMessageBox.confirm(`确定删除选中的 ${selectedRows.value.length} 条记录吗?`, '提示', { type: 'warning' })
.then(async () => {
try {
await delBizPermiConfig(onumStr)
ElMessage.success('删除成功')
getList()
} catch (error) {
ElMessage.error('删除失败,请重试')
}
})
.catch(() => {})
}
function handleClose(done) {
permFormRef.value.resetFields()
done()
}
onMounted(() => {
getList()
getRoleOrUserList();
getBizList();
})
</script>
<style scoped>
.app-container {
padding: 20px;
}
.mb8 {
margin-bottom: 8px;
}
</style>
Loading…
Cancel
Save