Browse Source

Merge remote-tracking branch 'origin/master'

master
xueyinfei 1 day ago
parent
commit
e437ec550f
  1. 116
      vue-fastapi-backend/module_admin/controller/metadata_config_controller.py
  2. 6
      vue-fastapi-backend/module_admin/dao/datastd_dao.py
  3. 139
      vue-fastapi-backend/module_admin/dao/metadata_config_dao.py
  4. 31
      vue-fastapi-backend/module_admin/entity/do/metadata_config_do.py
  5. 111
      vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py
  6. 141
      vue-fastapi-backend/module_admin/service/metadata_config_service.py
  7. 96
      vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js
  8. 8
      vue-fastapi-frontend/src/views/datastd/stdcode/index.vue
  9. 8
      vue-fastapi-frontend/src/views/datastd/stddict/AddEditForm.vue
  10. 15
      vue-fastapi-frontend/src/views/datastd/stddict/index.vue
  11. 272
      vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue
  12. 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 pydantic_validation_decorator import ValidateFields
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 config.get_db import get_db
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)
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)

6
vue-fastapi-backend/module_admin/dao/datastd_dao.py

@ -337,10 +337,8 @@ class DataStdDao:
DataStdMain.data_std_busi_ownership_prsn.label("data_std_busi_ownership_prsn")
)
.outerjoin( # 使用left outer join确保即使没有关联code也能返回主表数据
DataStdDict,
DataStdMain.data_std_no == DataStdDict.data_std_no
)
.outerjoin(DataStdMain, DataStdDict.data_std_no == DataStdMain.data_std_no) # 正确方向的左连接
.where(*filters)
.order_by(desc(DataStdDict.create_time)) # 按创建时间降序排序
)

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

@ -1,9 +1,12 @@
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 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:
"""
@ -49,7 +52,6 @@ class MetadataConfigDao:
if query_object.begin_time and query_object.end_time else True,
).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)
@classmethod
@ -113,4 +115,131 @@ class MetadataConfigDao:
@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)))
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_name.like(f"%{query_object.obj_name}%") if query_object.obj_name 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 sqlalchemy import Column, String, Integer, DateTime, TIMESTAMP, func
from sqlalchemy import Column, String, Integer, DateTime, TIMESTAMP,Boolean, func
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='更新时间')
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='等级简介')
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="更新时间")

111
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.alias_generators import to_camel
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
@ -103,4 +103,111 @@ class MetadataSecPageQueryModel(MetadataSecQueryModel):
"""
page_num: int = Field(default=1, 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: Optional[str] = Field(default=None, description='角色值')
obj_name: str = Field(..., description='角色名称')
isStop: Optional[bool] = Field(default=False, description='是否停用(false:运行 true:停用)')
@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_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 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,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 exceptions.exception import ServiceException
import uuid
from typing import List
from datetime import datetime
class MetadataConfigService:
"""
@ -159,4 +161,139 @@ class MetadataConfigService:
if result:
return MetadataSecModel(**CamelCaseUtil.transform_result(result))
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,
method: 'delete'
})
}
}
// 查询业务配置列表,带分页
export function listBizConfigAll(query) {
return request({
url: '/default-api/metadataConfig/bizConfig/listall',
method: 'get',
params: query
})
}
export function listBizConfig(query) {
return request({
url: '/default-api/metadataConfig/bizConfig/list',
method: 'get',
params: 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',
params: 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 }
})
}

8
vue-fastapi-frontend/src/views/datastd/stdcode/index.vue

@ -148,7 +148,7 @@
</el-table>
<!-- 分页 -->
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="handlePagination" />
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-col>
</el-row>
@ -214,11 +214,7 @@ const defaultProps = {
const dialogVisible2 = ref(false);
const dialogTitle2 = ref('标准代码');
const selectedRow = ref(null); // codeItem
const handlePagination = (pageNum, pageSize) => {
queryParams.value.pageNum = pageNum;
queryParams.value.pageSize = pageSize;
handleQuery();
};
const getSrcSysName = (id) => {
const match = dbResourceOldList.value.find(item => item.id === id);
return match ? match.name : id;

8
vue-fastapi-frontend/src/views/datastd/stddict/AddEditForm.vue

@ -31,8 +31,8 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据字典类型" prop="dictType">
<el-select v-model="formData.dictType" placeholder="请选择数据字典类型">
<el-form-item label="数据字典类型" prop="dataDictType">
<el-select v-model="formData.dataDictType" placeholder="请选择数据字典类型">
<el-option label="基础数据" value="0" />
<el-option label="指标数据" value="1" />
</el-select>
@ -108,7 +108,7 @@ const props = defineProps({
//
const formRules = ref({
dataDictVest: [{ required: true, message: '请选择字典归属', trigger: 'blur' }],
dictType: [{ required: true, message: '请选择数据字典类型', trigger: 'blur' }],
dataDictType: [{ required: true, message: '请选择数据字典类型', trigger: 'blur' }],
dataStdBusiOwnershipDept: [{ required: true, message: '请选择业务认责部门', trigger: 'blur' }],
dataStdItOwnershipDept: [{ required: true, message: '请选择技术认责部门', trigger: 'blur' }],
dataDictNo: [{ required: true, message: '请输入数据字典编号', trigger: 'blur' }],
@ -172,6 +172,8 @@ const handleSubmit = () => {
const apiCall = props.isEdit ? updateStdDict(formData.value) : addStdDict(formData.value);
apiCall
.then(() => {
proxy.$modal.msgSuccess("提交审批流程成功!");
emit('refresh');
handleClose();
})

15
vue-fastapi-frontend/src/views/datastd/stddict/index.vue

@ -105,7 +105,7 @@
</el-table-column>
<el-table-column label="类型" align="center">
<template #default="{ row }">
{{ row.dictType == 0 ? "基础数据" : "指标数据" }}
{{ row.dataDictType == 0 ? "基础数据" : "指标数据" }}
</template>
</el-table-column>
<!-- <el-table-column label="来源系统" width="150" align="center" prop="sysName" /> -->
@ -212,7 +212,7 @@
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="handlePagination"
@pagination="getList"
/>
</el-col>
</el-row>
@ -258,7 +258,7 @@ const { std_code_status, std_code_appr } = proxy.useDict(
const queryParams = ref({
dataDictNo: "",
dataDictCnName: "",
dictType: "",
dataDictType: "",
sysName: "",
classId: "dict",
sysId: "",
@ -296,11 +296,6 @@ const handleStdClick = (code) => {
});
};
const handlePagination = (pageNum, pageSize) => {
queryParams.value.pageNum = pageNum;
queryParams.value.pageSize = pageSize;
handleQuery();
};
const transCodetoId = (dataStdNo) => {
const match = stdList.value.find(item => item.dataStdNo === dataStdNo);
@ -346,7 +341,7 @@ const resetQuery = () => {
queryParams.value = {
dataDictNo: "",
dataDictCnName: "",
dictType: "",
dataDictType: "",
sysName: "",
sysId: undefined,
pageNum: 1,
@ -380,7 +375,7 @@ const handleAdd = () => {
dataDictVest: "company",
sysId: 10000,
sysName: "公司级",
dictType: "",
dataDictType: "",
dataDictNo: "",
dataDictEngName: "",
dataDictCnName: "",

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 {
console.log(queryForm,"queryForm")
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 || []
} 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