Browse Source

行控制与列控制页面功能优化

master
si@aidatagov.com 11 hours ago
parent
commit
8459227f42
  1. 178
      vue-fastapi-backend/module_admin/controller/metasecurity_controller.py
  2. 136
      vue-fastapi-backend/module_admin/dao/metaSecurity_dao.py
  3. 54
      vue-fastapi-backend/module_admin/entity/do/metasecurity_do.py
  4. 79
      vue-fastapi-backend/module_admin/entity/vo/metasecurity_vo.py
  5. 270
      vue-fastapi-backend/module_admin/service/metasecurity_service.py
  6. 2
      vue-fastapi-backend/server.py
  7. 108
      vue-fastapi-frontend/src/api/meta/metasercurity.js
  8. 485
      vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityCol.vue
  9. 489
      vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityRow.vue
  10. 4
      vue-fastapi-frontend/src/views/meta/metatask/index.vue

178
vue-fastapi-backend/module_admin/controller/metasecurity_controller.py

@ -0,0 +1,178 @@
from datetime import datetime
from fastapi import APIRouter, Depends, Request
from pydantic_validation_decorator import ValidateFields
from sqlalchemy.ext.asyncio import AsyncSession
from config.enums import BusinessType
from config.get_db import get_db
from module_admin.entity.vo.user_vo import CurrentUserModel
from module_admin.annotation.log_annotation import Log
from module_admin.aspect.interface_auth import CheckUserInterfaceAuth
from module_admin.entity.vo.metasecurity_vo import MetaSecurityColModel, MetaSecurityRowModel, MetaSecurityColPageQueryModel, MetaSecurityRowPageQueryModel, DeleteMetaSecurityModel
from module_admin.service.metasecurity_service import MetaSecurityService
from module_admin.service.login_service import LoginService
from utils.common_util import bytes2file_response
from utils.log_util import logger
from utils.page_util import PageResponseModel
from utils.response_util import ResponseUtil
import uuid
metaSecurityController = APIRouter(prefix='/meta/metaSecurity', dependencies=[Depends(LoginService.get_current_user)])
# MetaSecurity Column相关API
@metaSecurityController.get(
'/col/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('meta:metaSecurityCol:list'))]
)
async def get_meta_security_col_list(
request: Request,
col_page_query: MetaSecurityColPageQueryModel = Depends(MetaSecurityColPageQueryModel.as_query),
query_db: AsyncSession = Depends(get_db),
):
col_page_query_result = await MetaSecurityService.get_meta_security_col_list_services(query_db, col_page_query, is_page=True)
logger.info('获取列配置列表成功')
return ResponseUtil.success(model_content=col_page_query_result)
@metaSecurityController.get('/row/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('meta:metaSecurityRow:list'))]
)
async def get_meta_security_row_list(
request: Request,
row_page_query: MetaSecurityRowPageQueryModel = Depends(MetaSecurityRowPageQueryModel.as_query),
query_db: AsyncSession = Depends(get_db),
):
row_page_query_result = await MetaSecurityService.get_meta_security_row_list_services(query_db, row_page_query, is_page=True)
logger.info('获取行配置列表成功')
return ResponseUtil.success(model_content=row_page_query_result)
@metaSecurityController.get(
'/row/{row_id}', response_model=MetaSecurityRowModel, dependencies=[Depends(CheckUserInterfaceAuth('meta:metaSecurityRow:query'))]
)
async def query_detail_row(request: Request, row_id: str, query_db: AsyncSession = Depends(get_db)):
config_detail_result = await MetaSecurityService.row_detail_services(query_db, row_id)
logger.info(f'获取config_id为{row_id}的信息成功')
return ResponseUtil.success(data=config_detail_result)
@metaSecurityController.get(
'/col/{col_id}', response_model=MetaSecurityColModel, dependencies=[Depends(CheckUserInterfaceAuth('meta:metaSecurityCol:query'))]
)
async def query_detail_col(request: Request, col_id: str, query_db: AsyncSession = Depends(get_db)):
config_detail_result = await MetaSecurityService.col_detail_services(query_db, col_id)
logger.info(f'获取config_id为{col_id}的信息成功')
return ResponseUtil.success(data=config_detail_result)
@metaSecurityController.post('/col', dependencies=[Depends(CheckUserInterfaceAuth('meta:metaSecurityCol:add'))])
@ValidateFields(validate_model='add_meta_security_col')
@Log(title='列配置管理', business_type=BusinessType.INSERT)
async def add_meta_security_col(
request: Request,
add_meta_security_col: MetaSecurityColModel,
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
add_meta_security_col.create_by = current_user.user.user_name
add_meta_security_col.create_time = datetime.now()
add_meta_security_col.update_by = current_user.user.user_name
add_meta_security_col.update_time = datetime.now()
add_meta_security_col_result = await MetaSecurityService.add_meta_security_col_services(request, query_db, add_meta_security_col)
logger.info(add_meta_security_col_result.message)
return ResponseUtil.success(msg=add_meta_security_col_result.message)
@metaSecurityController.put('/col', dependencies=[Depends(CheckUserInterfaceAuth('meta:metaSecurityCol:edit'))])
@ValidateFields(validate_model='edit_meta_security_col')
@Log(title='列配置管理', business_type=BusinessType.UPDATE)
async def edit_meta_security_col(
request: Request,
edit_meta_security_col: MetaSecurityColModel,
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
edit_meta_security_col.update_by = current_user.user.user_name
edit_meta_security_col.update_time = datetime.now()
edit_meta_security_col_result = await MetaSecurityService.edit_meta_security_col_services(request, query_db, edit_meta_security_col)
logger.info(edit_meta_security_col_result.message)
return ResponseUtil.success(msg=edit_meta_security_col_result.message)
@metaSecurityController.delete('/col/{col_ids}', dependencies=[Depends(CheckUserInterfaceAuth('meta:metaSecurityCol:remove'))])
@Log(title='列配置管理', business_type=BusinessType.DELETE)
async def delete_meta_security_col(
request: Request,
col_ids: str,
query_db: AsyncSession = Depends(get_db),
):
delete_meta_security_col = DeleteMetaSecurityModel(metasecurityIds =col_ids)
delete_meta_security_col_result = await MetaSecurityService.delete_meta_security_col_services(request, query_db, delete_meta_security_col)
logger.info(delete_meta_security_col_result.message)
return ResponseUtil.success(msg=delete_meta_security_col_result.message)
# @metaSecurityController.get('/col/{col_id}', response_model=MetaSecurityColModel, dependencies=[Depends(CheckUserInterfaceAuth('meta:metaSecurityCol:query'))])
# async def query_meta_security_col_detail(
# request: Request,
# col_id: str,
# query_db: AsyncSession = Depends(get_db),
# ):
# col_detail_result = await MetaSecurityService.get_meta_security_col_by_id_services(query_db, col_id)
# logger.info(f'获取col_id为{col_id}的列配置信息成功')
# return ResponseUtil.success(data=col_detail_result)
# MetaSecurity Row相关API
@metaSecurityController.post('/row', dependencies=[Depends(CheckUserInterfaceAuth('meta:metaSecurityRow:add'))])
@ValidateFields(validate_model='add_meta_security_row')
@Log(title='行配置管理', business_type=BusinessType.INSERT)
async def add_meta_security_row(
request: Request,
add_meta_security_row: MetaSecurityRowModel,
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
add_meta_security_row.create_by = current_user.user.user_name
add_meta_security_row.create_time = datetime.now()
add_meta_security_row.update_by = current_user.user.user_name
add_meta_security_row.update_time = datetime.now()
add_meta_security_row_result = await MetaSecurityService.add_meta_security_row_services(request, query_db, add_meta_security_row)
logger.info(add_meta_security_row_result.message)
return ResponseUtil.success(msg=add_meta_security_row_result.message)
@metaSecurityController.put('/row', dependencies=[Depends(CheckUserInterfaceAuth('meta:metaSecurityRow:edit'))])
@ValidateFields(validate_model='edit_meta_security_row')
@Log(title='行配置管理', business_type=BusinessType.UPDATE)
async def edit_meta_security_row(
request: Request,
edit_meta_security_row: MetaSecurityRowModel,
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
edit_meta_security_row.update_by = current_user.user.user_name
edit_meta_security_row.update_time = datetime.now()
edit_meta_security_row_result = await MetaSecurityService.edit_meta_security_row_services(request, query_db, edit_meta_security_row)
logger.info(edit_meta_security_row_result.message)
return ResponseUtil.success(msg=edit_meta_security_row_result.message)
@metaSecurityController.delete('/row/{row_ids}', dependencies=[Depends(CheckUserInterfaceAuth('meta:metaSecurityRow:remove'))])
@Log(title='行配置管理', business_type=BusinessType.DELETE)
async def delete_meta_security_row(
request: Request,
row_ids: str,
query_db: AsyncSession = Depends(get_db),
):
delete_meta_security_row = DeleteMetaSecurityModel(metasecurityIds=row_ids)
delete_meta_security_row_result = await MetaSecurityService.delete_meta_security_row_services(request, query_db, delete_meta_security_row)
logger.info(delete_meta_security_row_result.message)
return ResponseUtil.success(msg=delete_meta_security_row_result.message)
@metaSecurityController.get('/row/{row_id}', response_model=MetaSecurityRowModel, dependencies=[Depends(CheckUserInterfaceAuth('meta:metaSecurityRow:query'))])
async def query_meta_security_row_detail(
request: Request,
row_id: int,
query_db: AsyncSession = Depends(get_db),
):
row_detail_result = await MetaSecurityService.get_meta_security_row_by_id_services(query_db, row_id)
logger.info(f'获取row_id为{row_id}的行配置信息成功')
return ResponseUtil.success(data=row_detail_result)

136
vue-fastapi-backend/module_admin/dao/metaSecurity_dao.py

@ -0,0 +1,136 @@
from sqlalchemy import delete, select, update, desc
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.do.metasecurity_do import MetaSecurityCol, MetaSecurityRow
from module_admin.entity.vo.metasecurity_vo import MetaSecurityColModel, MetaSecurityRowModel
from utils.page_util import PageUtil
class MetaSecurityDao:
"""
数据源安全管理模块数据库操作层
"""
@classmethod
async def get_meta_security_col_list(cls, db: AsyncSession, query_object: MetaSecurityColModel, is_page: bool = False):
"""
获取 MetaSecurityCol 的列表信息支持模糊查询和分页
:param db: ORM对象
:param query_object: 查询参数对象
:param is_page: 是否开启分页
:return: 列表信息
"""
# 构建查询条件
filters = []
if query_object.dbCName:
filters.append(MetaSecurityCol.dbCName.like(f"%{query_object.dbCName}%"))
if query_object.obj_value:
filters.append(MetaSecurityCol.obj_value.like(f"%{query_object.obj_value}%"))
if query_object.dbTName:
filters.append(MetaSecurityCol.dbTName.like(f"%{query_object.dbTName}%"))
if query_object.dbSName:
filters.append(MetaSecurityCol.dbSName.like(f"%{query_object.dbSName}%"))
if query_object.dbRID:
filters.append(MetaSecurityCol.dbRID==query_object.dbRID)
# 构建查询语句
query = (
select(MetaSecurityCol)
.where(*filters)
.order_by(desc(MetaSecurityCol.create_time)) # 按创建时间降序排序
)
# 分页处理
col_list = await PageUtil.paginate(
db, query, query_object.page_num, query_object.page_size, is_page
)
return col_list
@classmethod
async def get_meta_security_row_list(cls, db: AsyncSession, query_object: MetaSecurityRowModel, is_page: bool = False):
"""
获取 MetaSecurityRow 的列表信息支持模糊查询和分页
:param db: ORM对象
:param query_object: 查询参数对象
:param is_page: 是否开启分页
:return: 列表信息
"""
# 构建查询条件
filters = []
if query_object.dbCName:
filters.append(MetaSecurityRow.dbCName.like(f"%{query_object.dbCName}%"))
if query_object.obj_value:
filters.append(MetaSecurityRow.obj_value.like(f"%{query_object.obj_value}%"))
if query_object.dbTName:
filters.append(MetaSecurityRow.dbTName.like(f"%{query_object.dbTName}%"))
if query_object.dbSName:
filters.append(MetaSecurityRow.dbSName.like(f"%{query_object.dbSName}%"))
if query_object.dbRID:
filters.append(MetaSecurityRow.dbRID==query_object.dbRID)
# 构建查询语句
query = (
select(MetaSecurityRow)
.where(*filters)
.order_by(desc(MetaSecurityRow.create_time)) # 按创建时间降序排序
)
# 分页处理
row_list = await PageUtil.paginate(
db, query, query_object.page_num, query_object.page_size, is_page
)
return row_list
@classmethod
async def get_meta_security_col_by_id(cls, db: AsyncSession, colId: str):
col = (
await db.execute(
select(MetaSecurityCol)
.where(MetaSecurityCol.colId == colId)
)
).scalars().first()
return col
@classmethod
async def get_meta_security_row_by_id(cls, db: AsyncSession, rowId: str):
row = (
await db.execute(
select(MetaSecurityRow)
.where(MetaSecurityRow.rowId == rowId)
)
).scalars().first()
return row
@classmethod
async def add_meta_security_col(cls, db: AsyncSession,colModel:MetaSecurityColModel):
col = MetaSecurityCol(
**colModel.model_dump()
)
db.add(col)
await db.flush()
return col
@classmethod
async def add_meta_security_row(cls, db: AsyncSession,rowModel:MetaSecurityRowModel):
row = MetaSecurityRow(**rowModel.model_dump())
db.add(row)
await db.flush()
return row
@classmethod
async def delete_meta_security_col(cls, db: AsyncSession, colId: str):
await db.execute(delete(MetaSecurityCol).where(MetaSecurityCol.colId == colId))
@classmethod
async def delete_meta_security_row(cls, db: AsyncSession, rowId: str):
await db.execute(delete(MetaSecurityRow).where(MetaSecurityRow.rowId == rowId))
@classmethod
async def update_meta_security_col(cls, db: AsyncSession, update_data: MetaSecurityColModel):
await db.execute(update(MetaSecurityCol), [update_data])
await db.flush()
@classmethod
async def update_meta_security_row(cls, db: AsyncSession, update_data: MetaSecurityRowModel):
await db.execute(update(MetaSecurityRow), [update_data])
await db.flush()

54
vue-fastapi-backend/module_admin/entity/do/metasecurity_do.py

@ -0,0 +1,54 @@
from sqlalchemy import Column, Integer, String, DateTime, Boolean
from config.database import Base
class MetaSecurityCol(Base):
"""
数据源控制表
"""
__tablename__ = 'meta_security_col'
colId = Column(String(50), primary_key=True, comment='问答id')
create_by = Column(String(20), default='', comment='创建者')
create_time = Column(DateTime, nullable=True, default=None, comment='创建时间')
update_by = Column(String(20), default='', comment='更新者')
update_time = Column(DateTime, nullable=True, default=None, comment='更新时间')
dbRName = Column(String(50), default=None, comment='数据源名称')
dbRID = Column(Integer, nullable=True, default=None, comment='数据源ID')
dbSName = Column(String(50), default=None, comment='模式名称')
dbTName = Column(String(50), default=None, comment='表名称')
dbCName = Column(String(50), default=None, comment='字段名称')
ctrl_type = Column(String(1), default=None, comment='控制类型(0:反向 1:正向)')
obj_type = Column(String(1), default=None, comment='对象类型(0:角色 1:用户)')
obj_value = Column(Integer, default=None, comment='角色值')
isStop = Column(Boolean, nullable=True, default=None, comment='是否停用(0:运行 1:停用)')
class MetaSecurityRow(Base):
"""
数据源行控制表
"""
__tablename__ = 'meta_security_row'
rowId = Column(String(50), primary_key=True, comment='问答id')
create_by = Column(String(20), default='', comment='创建者')
create_time = Column(DateTime, nullable=True, default=None, comment='创建时间')
update_by = Column(String(20), default='', comment='更新者')
update_time = Column(DateTime, nullable=True, default=None, comment='更新时间')
dbRName = Column(String(50), default=None, comment='数据源名称')
dbRID = Column(Integer, nullable=True, default=None, comment='数据源ID')
dbSName = Column(String(50), default=None, comment='模式名称')
dbTName = Column(String(50), default=None, comment='表名称')
dbCName = Column(String(50), default=None, comment='字段名称')
ctrl_type = Column(String(1), default=None, comment='控制类型(0:控制值 1:控制表 2:控制程序)')
obj_type = Column(String(1), default=None, comment='对象类型(0:角色 1:用户)')
obj_value = Column(String(50), default=None, comment='角色值')
isStop = Column(Boolean, nullable=True, default=None, comment='是否停用(0:运行 1:停用)')
ctrl_value = Column(String(100), default=None, comment='控制值')
ctrl_table = Column(String(100), default=None, comment='控制表')
ctrl_col = Column(String(100), default=None, comment='控制字段')
ctrl_system = Column(String(100), default=None, comment='控制程序')

79
vue-fastapi-backend/module_admin/entity/vo/metasecurity_vo.py

@ -0,0 +1,79 @@
from pydantic import BaseModel
from typing import Union, Optional, List
from datetime import datetime
from module_admin.annotation.pydantic_annotation import as_query
from pydantic import BaseModel, ConfigDict, Field
from pydantic.alias_generators import to_camel
class CrudMetaSecurityModel(BaseModel):
is_success: bool
message: str
class MetaSecurityRowModel(BaseModel):
"""
数据源行控制表对应Pydantic模型
"""
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
rowId: Optional[str] = None
create_by: Optional[str] = None
create_time: Optional[datetime] = None
update_by: Optional[str] = None
update_time: Optional[datetime] = None
dbRName: Optional[str] = None
dbRID: Optional[int] = None
dbSName: Optional[str] = None
dbTName: Optional[str] = None
dbCName: Optional[str] = None
ctrl_type: Optional[str] = None # control type (e.g., '0', '1', '2')
obj_type: Optional[str] = None # object type (e.g., '0', '1')
obj_value: Optional[object] = None
isStop: Optional[bool] = None
ctrl_value: Optional[str] = None
ctrl_table: Optional[str] = None
ctrl_col: Optional[str] = None
ctrl_system: Optional[str] = None
class MetaSecurityColModel(BaseModel):
"""
数据源控制表对应Pydantic模型
"""
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
colId: Optional[str] = None
create_by: Optional[str] = None
create_time: Optional[datetime] = None
update_by: Optional[str] = None
update_time: Optional[datetime] = None
dbRName: Optional[str] = None
dbRID: Optional[int] = None
dbSName: Optional[str] = None
dbTName: Optional[str] = None
dbCName: Optional[str] = None
ctrl_type: Optional[str] = None # control type (e.g., '0', '1')
obj_type: Optional[str] = None # object type (e.g., '0', '1')
obj_value: Optional[object] = None
isStop: Optional[bool] = None
@as_query
class MetaSecurityRowPageQueryModel(MetaSecurityRowModel):
"""
元数据任务分页查询模型
"""
page_num: int = Field(default=1, description='当前页码')
page_size: int = Field(default=10, description='每页记录数')
@as_query
class MetaSecurityColPageQueryModel(MetaSecurityColModel):
"""
元数据任务分页查询模型
"""
page_num: int = Field(default=1, description='当前页码')
page_size: int = Field(default=10, description='每页记录数')
class DeleteMetaSecurityModel(BaseModel):
"""
删除参数配置模型
"""
model_config = ConfigDict(alias_generator=to_camel)
metaSecurity_ids: str = Field(description='需要删除的参数主键')

270
vue-fastapi-backend/module_admin/service/metasecurity_service.py

@ -0,0 +1,270 @@
from fastapi import Request
from sqlalchemy.ext.asyncio import AsyncSession
from typing import List
from config.constant import CommonConstant
from exceptions.exception import ServiceException
from module_admin.dao.metaSecurity_dao import MetaSecurityDao
from module_admin.entity.vo.common_vo import CrudResponseModel
from module_admin.entity.vo.metasecurity_vo import MetaSecurityColModel, MetaSecurityRowModel,DeleteMetaSecurityModel
from utils.common_util import CamelCaseUtil
import uuid
class MetaSecurityService:
"""
数据源安全管理模块服务层
"""
@classmethod
async def get_meta_security_col_list_services(
cls, query_db: AsyncSession, query_object: MetaSecurityColModel, is_page: bool = False
):
"""
获取列配置列表信息service
:param query_db: orm对象
:param query_object: 查询参数对象
:param is_page: 是否开启分页
:return: 列配置列表信息对象
"""
col_list_result = await MetaSecurityDao.get_meta_security_col_list(query_db, query_object, is_page)
return col_list_result
@classmethod
async def get_meta_security_row_list_services(
cls, query_db: AsyncSession, query_object: MetaSecurityRowModel, is_page: bool = False
):
"""
获取行配置列表信息service
:param query_db: orm对象
:param query_object: 查询参数对象
:param is_page: 是否开启分页
:return: 行配置列表信息对象
"""
row_list_result = await MetaSecurityDao.get_meta_security_row_list(query_db, query_object, is_page)
return row_list_result
@classmethod
async def get_meta_security_col_by_id_services(cls, query_db: AsyncSession, colId: str):
"""
获取列配置详细信息service
:param query_db: orm对象
:param colId: 列配置ID
:return: 列配置详细信息对象
"""
col = await MetaSecurityDao.get_meta_security_col_by_id(query_db, colId)
if col:
result = MetaSecurityColModel(**CamelCaseUtil.transform_result(col))
else:
result = MetaSecurityColModel(**dict())
return result
@classmethod
async def get_meta_security_row_by_id_services(cls, query_db: AsyncSession, rowId: str):
"""
获取行配置详细信息service
:param query_db: orm对象
:param rowId: 行配置ID
:return: 行配置详细信息对象
"""
row = await MetaSecurityDao.get_meta_security_row_by_id(query_db, rowId)
if row:
result = MetaSecurityRowModel(**CamelCaseUtil.transform_result(row))
else:
result = MetaSecurityRowModel(**dict())
return result
@classmethod
async def add_meta_security_col_services(cls, request: Request, query_db: AsyncSession, page_object: MetaSecurityColModel):
"""
新增列配置服务
:param request: Request对象
:param query_db: orm对象
:param page_object: 新增的列配置对象
:return: 新增列配置校验结果
"""
try:
if isinstance(page_object.obj_value, str) and page_object.obj_value:
obj_values = page_object.obj_value.split(",")
for value in obj_values:
# 创建新的 page_object 实例,避免修改原始对象
new_page_object = MetaSecurityColModel(**page_object.model_dump(by_alias=True))
new_page_object.obj_value = value.strip() # 去除空格并赋值
new_page_object.colId = str(uuid.uuid4())
# 调用 DAO 方法插入数据
await MetaSecurityDao.add_meta_security_col(query_db, new_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 add_meta_security_row_services(cls, request: Request, query_db: AsyncSession, page_object: MetaSecurityRowModel):
"""
新增行配置服务
:param request: Request对象
:param query_db: orm对象
:param page_object: 新增的行配置对象
:return: 新增行配置校验结果
"""
try:
if isinstance(page_object.obj_value, str) and page_object.obj_value:
obj_values = page_object.obj_value.split(",")
for value in obj_values:
# 创建新的 page_object 实例,避免修改原始对象
new_page_object = MetaSecurityRowModel(**page_object.model_dump(by_alias=True))
new_page_object.obj_value = value.strip() # 去除空格并赋值
new_page_object.rowId = str(uuid.uuid4())
# 调用 DAO 方法插入数据
await MetaSecurityDao.add_meta_security_row(query_db, new_page_object)
await query_db.commit()
# 缓存相关操作,如果需要
# await request.app.state.redis.set(...)
return CrudResponseModel(is_success=True, message='新增行配置成功')
except Exception as e:
await query_db.rollback()
raise e
@classmethod
async def col_detail_services(cls, query_db: AsyncSession, col: str):
"""
获取参数配置详细信息service
:param query_db: orm对象
:param config_id: 参数配置id
:return: 参数配置id对应的信息
"""
config = await MetaSecurityDao.get_meta_security_col_by_id(query_db, col)
if config:
result = MetaSecurityColModel(**CamelCaseUtil.transform_result(config))
else:
result = MetaSecurityColModel(**dict())
return result
@classmethod
async def row_detail_services(cls, query_db: AsyncSession, row_id: str):
"""
获取参数配置详细信息service
:param query_db: orm对象
:param config_id: 参数配置id
:return: 参数配置id对应的信息
"""
config = await MetaSecurityDao.get_meta_security_row_by_id(query_db, row_id)
if config:
result = MetaSecurityRowModel(**CamelCaseUtil.transform_result(config))
else:
result = MetaSecurityRowModel(**dict())
return result
@classmethod
async def edit_meta_security_col_services(cls, request: Request, query_db: AsyncSession, page_object: MetaSecurityColModel):
"""
编辑列配置服务
:param request: Request对象
:param query_db: orm对象
:param page_object: 编辑的列配置对象
:return: 编辑列配置校验结果
"""
edit_col = page_object.model_dump(exclude_unset=True)
col_info = await cls.get_meta_security_col_by_id_services(query_db, page_object.colId)
if col_info:
try:
await MetaSecurityDao.update_meta_security_col(query_db, edit_col)
await query_db.commit()
# 缓存更新,如果需要
# await request.app.state.redis.set(...)
return CrudResponseModel(is_success=True, message='编辑列配置成功')
except Exception as e:
await query_db.rollback()
raise e
else:
raise ServiceException(message=f'列配置{page_object.colId}不存在')
@classmethod
async def edit_meta_security_row_services(cls, request: Request, query_db: AsyncSession, page_object: MetaSecurityRowModel):
"""
编辑行配置服务
:param request: Request对象
:param query_db: orm对象
:param page_object: 编辑的行配置对象
:return: 编辑行配置校验结果
"""
edit_row = page_object.model_dump(exclude_unset=True)
row_info = await cls.get_meta_security_row_by_id_services(query_db, page_object.rowId)
if row_info:
try:
await MetaSecurityDao.update_meta_security_row(query_db, edit_row)
await query_db.commit()
return CrudResponseModel(is_success=True, message='编辑行配置成功')
except Exception as e:
await query_db.rollback()
raise e
else:
raise ServiceException(message=f'行配置{page_object.rowId}不存在')
@classmethod
async def delete_meta_security_col_services(cls, request: Request, query_db: AsyncSession, page_object: DeleteMetaSecurityModel):
"""
删除列配置服务
:param request: Request对象
:param query_db: orm对象
:param page_object: 删除列配置对象
:return: 删除列配置校验结果
"""
if page_object.metaSecurity_ids:
col_id_list = page_object.metaSecurity_ids.split(',')
try:
for col_id in col_id_list:
col_info = await cls.get_meta_security_col_by_id_services(query_db, col_id)
if col_info:
# 校验不能删除的系统内置列
await MetaSecurityDao.delete_meta_security_col(query_db, col_id)
await query_db.commit()
return CrudResponseModel(is_success=True, message='删除列配置成功')
except Exception as e:
await query_db.rollback()
raise e
else:
raise ServiceException(message='传入列配置ID为空')
@classmethod
async def delete_meta_security_row_services(cls, request: Request, query_db: AsyncSession, page_object: DeleteMetaSecurityModel):
"""
删除行配置服务
:param request: Request对象
:param query_db: orm对象
:param page_object: 删除行配置对象
:return: 删除行配置校验结果
"""
if page_object.metaSecurity_ids:
row_id_list = page_object.metaSecurity_ids.split(',')
try:
for row_id in row_id_list:
row_info = await cls.get_meta_security_row_by_id_services(query_db, row_id)
if row_info:
await MetaSecurityDao.delete_meta_security_row(query_db, row_id)
await query_db.commit()
return CrudResponseModel(is_success=True, message='删除行配置成功')
except Exception as e:
await query_db.rollback()
raise e
else:
raise ServiceException(message='传入行配置ID为空')

2
vue-fastapi-backend/server.py

@ -24,6 +24,7 @@ from module_admin.controller.server_controller import serverController
from module_admin.controller.user_controller import userController
from module_admin.controller.aichat_controller import aichatController
from module_admin.controller.metatask_controller import metataskController
from module_admin.controller.metasecurity_controller import metaSecurityController
from sub_applications.handle import handle_sub_applications
from utils.common_util import worship
from utils.log_util import logger
@ -80,6 +81,7 @@ controller_list = [
{'router': cacheController, 'tags': ['系统监控-缓存监控']},
{'router': commonController, 'tags': ['通用模块']},
{'router': metataskController, 'tags': ['元数据管理-元数据任务模块']},
{'router': metaSecurityController, 'tags': ['元数据管理-数据安全']},
{'router': aichatController, 'tags': ['智能问答模块']},
]

108
vue-fastapi-frontend/src/api/meta/metasercurity.js

@ -0,0 +1,108 @@
import request from '@/utils/request'
import { parseStrEmpty } from "@/utils/ruoyi";
// 查询列配置列表
export function listMetaSecurityCol(query) {
return request({
url: '/default-api/meta/metaSecurity/col/list',
method: 'get',
params: query
})
}
// 查询行配置列表
export function listMetaSecurityRow(query) {
return request({
url: '/default-api/meta/metaSecurity/row/list',
method: 'get',
params: query
})
}
// 查询列配置详情
export function getMetaSecurityCol(colId) {
return request({
url: '/default-api/meta/metaSecurity/col/' + parseStrEmpty(colId),
method: 'get'
})
}
// 查询行配置详情
export function getMetaSecurityRow(rowId) {
return request({
url: '/default-api/meta/metaSecurity/row/' + parseStrEmpty(rowId),
method: 'get'
})
}
// 新增列配置
export function addMetaSecurityCol(data) {
return request({
url: '/default-api/meta/metaSecurity/col',
method: 'post',
data: data
})
}
// 新增行配置
export function addMetaSecurityRow(data) {
return request({
url: '/default-api/meta/metaSecurity/row',
method: 'post',
data: data
})
}
// 修改列配置
export function updateMetaSecurityCol(data) {
return request({
url: '/default-api/meta/metaSecurity/col',
method: 'put',
data: data
})
}
// 修改行配置
export function updateMetaSecurityRow(data) {
return request({
url: '/default-api/meta/metaSecurity/row',
method: 'put',
data: data
})
}
// 删除列配置
export function deleteMetaSecurityCol(colId) {
return request({
url: '/default-api/meta/metaSecurity/col/' + colId,
method: 'delete'
})
}
// 删除行配置
export function deleteMetaSecurityRow(rowId) {
return request({
url: '/default-api/meta/metaSecurity/row/' + rowId,
method: 'delete'
})
}
// 批量删除列配置
export function deleteMetaSecurityCols(colIds) {
return request({
url: '/default-api/meta/metaSecurity/col/' + colIds,
method: 'delete'
})
}
// 批量删除行配置
export function deleteMetaSecurityRows(rowIds) {
return request({
url: '/default-api/meta/metaSecurity/row/' + rowIds,
method: 'delete'
})
}

485
vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityCol.vue

@ -0,0 +1,485 @@
<template>
<div class="app-container">
<el-row :gutter="20">
<el-col :span="4" :xs="24">
<div class="head-container">
<el-input
v-model="dbResoursName"
placeholder="请输入数据源"
clearable
prefix-icon="search"
style="margin-bottom: 20px"
/>
</div>
<div class="head-container">
<el-tree
:data="dbResourceOptions"
:props="defaultProps"
:expand-on-click-node="false"
:filter-node-method="filterNode"
ref="tree"
node-key="id"
default-expand-all
highlight-current
@node-click="handleNodeClick"
>
<template #default="{ node, data }">
<span class="custom-tree-node">
<i :class="getIconClass(data)"></i>
<span>{{ data.name }}</span>
</span>
</template>
</el-tree>
</div>
</el-col>
<el-col :span="20" :xs="24">
<!-- 搜索框 -->
<el-form :model="queryParams" ref="queryRef" :inline="true" >
<el-form-item label="模式名" prop="dbSName">
<el-input v-model="queryParams.dbSName" placeholder="请输入模式名称" clearable />
</el-form-item>
<el-form-item label="表名" prop="dbTName">
<el-input v-model="queryParams.dbTName" placeholder="请输入表名称" clearable />
</el-form-item>
<el-form-item label="字段名" prop="dbCName">
<el-input v-model="queryParams.dbCName" placeholder="请输入字段名称" clearable />
</el-form-item>
<el-form-item label="对象编号" prop="objValue">
<el-input v-model="queryParams.objValue" placeholder="请输入列名称" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">搜索</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['meta:metaSecurityCol:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleEdit"
v-hasPermi="['meta:metaSecurityCol:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleRemove"
v-hasPermi="['meta:metaSecurityCol:remove']"
>删除</el-button>
</el-col>
</el-row>
<!-- 表格展示 -->
<el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="连接" align="center" prop="dbRName" />
<el-table-column label="模式" align="center" prop="dbSName" />
<el-table-column label="表名" align="center" prop="dbTName" />
<el-table-column label="字段名" align="center" prop="dbCName" />
<el-table-column label="是否可见" align="center" prop="ctrlType" >
<template #default="scope">
<dict-tag
:options="metasecurity_ctr"
:value="scope.row.ctrlType"
/>
</template>
</el-table-column>
<el-table-column label="对象类型" align="center" prop="objType" >
<template #default="scope">
<dict-tag
:options="metasecurity_obj"
:value="scope.row.objType"
/>
</template>
</el-table-column>
<el-table-column label="对象编号" align="center" prop="objValue" >
<template #default="scope">
<span v-if="scope.row.objType === '0'">
{{ getUserName(scope.row.objValue) }}
</span>
<span v-else-if="scope.row.objType === '1'">
{{ getRoleName(scope.row.objValue) }}
</span>
<span v-else>
{{ scope.row.objValue }}
</span>
</template>
</el-table-column>
<el-table-column label="是否停用" align="center" prop="isStop" />
<el-table-column label="操作" align="center" width="180">
<template #default="scope">
<el-button @click="handleEdit(scope.row)" type="text" icon="Edit" />
<el-button @click="handleRemove(scope.row)" type="text" icon="Delete" />
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="handlePagination" />
</el-col>
</el-row>
<!-- 添加或编辑列数据对话框 -->
<!-- 添加或编辑对话框 -->
<el-dialog :title="dialogTitle" v-model="dialogVisible" width="600px">
<el-form :model="form" ref="formRef" label-width="120px" :rules="formRules">
<el-form-item label="连接" prop="dbRID">
<el-select
v-model="form.dbRID"
placeholder="请选择连接"
maxlength="30"
@change="dataChange"
>
<el-option
v-for="dict in dbResourceOldList"
:key="dict.id"
:label="dict.name"
:value="dict.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="模式" prop="dbSName">
<el-input v-model="form.dbSName" placeholder="请输入模式名称" />
</el-form-item>
<el-form-item label="表名" prop="dbTName">
<el-input v-model="form.dbTName" placeholder="请输入表名称" />
</el-form-item>
<el-form-item label="是否可见" prop="ctrlType">
<el-select
v-model="form.ctrlType"
placeholder="请配置是否可见"
maxlength="30"
>
<el-option
v-for="dict in metasecurity_ctr"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="字段名称" prop="dbCName">
<el-input v-model="form.dbCName" placeholder="请输入字段名称" />
</el-form-item>
<el-form-item label="对象类型" prop="objType">
<el-select
v-model="form.objType"
placeholder="请选择对象类型"
maxlength="30"
@change="changeMetaSecurityObj"
>
<el-option
v-for="dict in metasecurity_obj"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="对象编号" prop="objValue">
<el-select
v-model="form.objValue"
:multiple="dialogTitle === '添加列配置'"
placeholder="请选择"
maxlength="30"
>
<el-option
v-for="dict in userOrRoleList"
:key="dict.id"
:label="dict.name"
:value="dict.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否停用" prop="isStop">
<el-switch v-model="form.isStop" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="handleCancel">取消</el-button>
<el-button type="primary" @click="handleSave">确定</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref, reactive, onMounted, toRefs } from 'vue';
import { listMetaSecurityCol, addMetaSecurityCol,getMetaSecurityCol, updateMetaSecurityCol, deleteMetaSecurityCol } from "@/api/meta/metasercurity";
import { datasourcetree } from "@/api/meta/metatask";
import { listUser} from "@/api/system/user";
import { listRole} from "@/api/system/role";
const { proxy } = getCurrentInstance();
const { metasecurity_ctr, metasecurity_obj, metasecurity_type} = proxy.useDict("metasecurity_ctr", "metasecurity_obj", "metasecurity_type");
const queryParams = ref({
dbCName: '',
dbTName: '',
objValue: '',
pageNum: 1,
pageSize: 10
});
const single = ref(true);
const multiple = ref(true);
const dbResoursName = ref(undefined);
const clickNode = ref(undefined);
const defaultProps = {
children: "children",
label: "name"
};
const filterNode = (value, data) => {
if (!value) return true;
return data.name.indexOf(value) !== -1;
};
const handleNodeClick = (data) => {
if( data.id==99999){
queryParams.value.dbRID = "";
}else{
queryParams.value.dbRID = data.id;
}
handleQuery();
};
const getIconClass = (data) => {
let icon=""
if (data.parentId == '0') icon= 'Monitor';
if (data.parentId == '99999') icon= 'Coin';
console.log(icon)
return icon;
};
const dbResourceOptions = ref(undefined);
const form = ref({
colId: '',
dbRName: '',
dbRID: 0,
dbSName: '',
dbTName: '',
dbCName: '',
ctrlType: '',
objType: '',
objValue: '',
isStop: false
});
const ids = ref([]);
const loading = ref(true);
const tableData = ref([]);
const total = ref(0);
const dialogVisible = ref(false);
const dialogTitle = ref('添加列');
const formRules = {
dbCName: [{ required: true, message: '字段不能为空', trigger: 'blur' }],
dbRName: [{ required: true, message: '连接不能为空', trigger: 'blur' }],
dbTName: [{ required: true, message: '表名不能为空', trigger: 'blur' }],
ctrlType: [{ required: true, message: '控制类型不能为空', trigger: 'change' }]
};
const dbResourceOldList = ref([]);
//
const getList = async () => {
loading.value = true;
const response = await listMetaSecurityCol(queryParams.value);
tableData.value = response.rows;
total.value = response.total;
loading.value = false;
};
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.colId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
//
const handleQuery = () => {
queryParams.pageNum = 1;
getList();
};
// objValue
const getUserName = (objValue) => {
if (!objValue) return '';
const values = objValue.split(','); //
const names = values.map(value => {
const user = userList.value.find(user => user.id === value);
return user ? user.name : value;
});
return names.join(', ');
};
// objValue
const getRoleName = (objValue) => {
if (!objValue) return '';
const values = objValue.split(','); //
const names = values.map(value => {
const role = roleList.value.find(role => role.id == value);
return role ? role.name : value;
});
return names.join(', ');
};
function dataChange(data) {
// dbResourceOldList name
const selectedItem = dbResourceOldList.value.find(item => item.id === data);
if (selectedItem) {
// name form.value.dbRName
form.value.dbRName = selectedItem.name;
} else {
// form.value.dbRName
form.value.dbRName = '';
}
}
//
const handlePagination = (pageNum, pageSize) => {
queryParams.pageNum = pageNum;
queryParams.pageSize = pageSize;
getList();
};
const roleList = ref([]);
const userList = ref([]);
const userOrRoleList = 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})
});
});
}
function changeMetaSecurityObj(data){
if(data=="0"){
userOrRoleList.value=userList.value
}else {
userOrRoleList.value=roleList.value
}
form.value.objValue = dialogTitle.value === '添加列配置' ? [] : '';
}
const getDeptTree = async () => {
const treeResponse = await datasourcetree();
if (treeResponse.success && treeResponse.rows.length > 0) {
dbResourceOldList.value = treeResponse.rows;
const childrenList = dbResourceOldList.value.map(element => ({ ...element, parentId: "99999" }));
dbResourceOptions.value = [{ id: 99999, name: "数据源", parentId: 0, children: childrenList }];
}
};
//
const handleEdit = (row) => {
reset();
const colId = row.colId || ids.value;
getMetaSecurityCol(colId).then(response => {
form.value = response.data;
dialogVisible.value = true;
dialogTitle.value = "编辑列配置";
});
};
//
function handleSave() {
proxy.$refs["formRef"].validate(valid => {
if (valid) {
if (form.value.colId != undefined&&form.value.colId !="") {
updateMetaSecurityCol(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
dialogVisible.value = false;
getList();
});
} else {
const submitData = { ...form.value };
submitData.objValue = submitData.objValue.join(',');
addMetaSecurityCol(submitData).then(response => {
proxy.$modal.msgSuccess("新增成功");
dialogVisible.value = false;
getList();
});
}
}
});
}
/** 表单重置 */
function reset() {
form.value = {
colId: '',
dbRName: '',
dbRID: undefined,
dbSName: '',
dbTName: '',
dbCName: '',
ctrlType: '',
objType: '',
objValue: dialogTitle.value === '添加列配置' ? [] : '', //
isStop: false
};
proxy.resetForm("formRef");
}
//
const handleRemove = async (row) => {
const colId = row.colId || ids.value;
proxy.$modal.confirm('是否确认删除ID为"' + colId + '"的数据项?').then(function () {
return deleteMetaSecurityCol(colId);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
};
const handleAdd = () => {
dialogTitle.value = '添加列配置';
reset();
dialogVisible.value = true;
};
//
const handleCancel = () => {
dialogVisible.value = false;
form.value.colId = '';
form.value.dbCName = '';
form.value.ctrlType = '';
form.value.ctrl_value = '';
form.value.isStop = false;
};
onMounted(() => {
getList();
getDeptTree();
getRoleOrUserList();
});
watch(dbResoursName, (val) => {
proxy.$refs["tree"].filter(val);
});
</script>
<style scoped>
/* 添加样式 */
</style>

489
vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityRow.vue

@ -0,0 +1,489 @@
<template>
<div class="app-container">
<el-row :gutter="20">
<el-col :span="4" :xs="24">
<div class="head-container">
<el-input
v-model="dbResoursName"
placeholder="请输入数据源"
clearable
prefix-icon="search"
style="margin-bottom: 20px"
/>
</div>
<div class="head-container">
<el-tree
:data="dbResourceOptions"
:props="defaultProps"
:expand-on-click-node="false"
:filter-node-method="filterNode"
ref="tree"
node-key="id"
default-expand-all
highlight-current
@node-click="handleNodeClick"
>
<template #default="{ node, data }">
<span class="custom-tree-node">
<i :class="getIconClass(data)"></i>
<span>{{ data.name }}</span>
</span>
</template>
</el-tree>
</div>
</el-col>
<el-col :span="20" :xs="24">
<!-- 搜索框 -->
<el-form :model="queryParams" ref="queryRef" :inline="true" >
<el-form-item label="模式名" prop="dbSName">
<el-input v-model="queryParams.dbSName" placeholder="请输入模式名称" clearable />
</el-form-item>
<el-form-item label="表名" prop="dbTName">
<el-input v-model="queryParams.dbTName" placeholder="请输入行名称" clearable />
</el-form-item>
<el-form-item label="字段名" prop="dbCName">
<el-input v-model="queryParams.dbCName" placeholder="请输入行名称" clearable />
</el-form-item>
<el-form-item label="用户角色" prop="objValue">
<el-input v-model="queryParams.objValue" placeholder="请输入行名称" clearable />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">搜索</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['meta:metaSecurityRow:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleEdit"
v-hasPermi="['meta:metaSecurityRow:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleRemove"
v-hasPermi="['meta:metaSecurityRow:remove']"
>删除</el-button>
</el-col>
</el-row>
<!-- 表格展示 -->
<el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="连接" align="center" prop="dbRName" />
<el-table-column label="模式" align="center" prop="dbSName" />
<el-table-column label="表名" align="center" prop="dbTName" />
<el-table-column label="字段名" align="center" prop="dbCName" />
<el-table-column label="控制方式" align="center" prop="ctrlType" >
<template #default="scope">
<dict-tag
:options="metasecurity_type"
:value="scope.row.ctrlType"
/>
</template>
</el-table-column>
<el-table-column label="控制值" align="center" prop="ctrlValue" />
<el-table-column label="对象类型" align="center" prop="objType" >
<template #default="scope">
<dict-tag
:options="metasecurity_obj"
:value="scope.row.objType"
/>
</template>
</el-table-column>
<el-table-column label="对象编号" align="center" prop="objValue" >
<template #default="scope">
<span v-if="scope.row.objType === '0'">
{{ getUserName(scope.row.objValue) }}
</span>
<span v-else-if="scope.row.objType === '1'">
{{ getRoleName(scope.row.objValue) }}
</span>
<span v-else>
{{ scope.row.objValue }}
</span>
</template>
</el-table-column>
<el-table-column label="是否停用" align="center" prop="isStop" />
<el-table-column label="操作" align="center" width="180">
<template #default="scope">
<el-button @click="handleEdit(scope.row)" type="text" icon="Edit" />
<el-button @click="handleRemove(scope.row)" type="text" icon="Delete" />
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="handlePagination" />
</el-col>
</el-row>
<!-- 添加或编辑行数据对话框 -->
<!-- 添加或编辑对话框 -->
<el-dialog :title="dialogTitle" v-model="dialogVisible" width="600px">
<el-form :model="form" ref="formRef" label-width="120px" :rules="formRules">
<el-form-item label="连接" prop="dbRID">
<el-select
v-model="form.dbRID"
placeholder="请选择连接"
maxlength="30"
@change="dataChange"
>
<el-option
v-for="dict in dbResourceOldList"
:key="dict.id"
:label="dict.name"
:value="dict.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="模式" prop="dbSName">
<el-input v-model="form.dbSName" placeholder="请输入模式" />
</el-form-item>
<el-form-item label="表名" prop="dbTName">
<el-input v-model="form.dbTName" placeholder="请输入表名" />
</el-form-item>
<el-form-item label="字段名" prop="dbCName">
<el-input v-model="form.dbCName" placeholder="请输入字段名" />
</el-form-item>
<el-form-item label="控制方式" prop="ctrlType">
<el-select
v-model="form.ctrlType"
placeholder="请输入控制方式"
maxlength="30"
>
<el-option
v-for="dict in metasecurity_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="控制值" prop="ctrlValue">
<el-input v-model="form.ctrlValue" placeholder="请输入控制值" />
</el-form-item>
<el-form-item label="对象类型" prop="objType">
<el-select
v-model="form.objType"
placeholder="请选择对象类型"
maxlength="30"
@change="changeMetaSecurityObj"
>
<el-option
v-for="dict in metasecurity_obj"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="对象编号" prop="objValue">
<el-select
v-model="form.objValue"
placeholder="请选择"
:multiple="dialogTitle === '添加行配置'"
maxlength="30"
>
<el-option
v-for="dict in userOrRoleList"
:key="dict.id"
:label="dict.name"
:value="dict.id"
></el-option>
</el-select></el-form-item>
<el-form-item label="是否停用" prop="isStop">
<el-switch v-model="form.isStop" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="handleCancel">取消</el-button>
<el-button type="primary" @click="handleSave">确定</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref, reactive, onMounted, toRefs } from 'vue';
import { listMetaSecurityRow, addMetaSecurityRow,getMetaSecurityRow, updateMetaSecurityRow, deleteMetaSecurityRow } from "@/api/meta/metasercurity";
const { proxy } = getCurrentInstance();
const { metasecurity_ctr, metasecurity_obj, metasecurity_type} = proxy.useDict("metasecurity_ctr", "metasecurity_obj", "metasecurity_type");
import { datasourcetree } from "@/api/meta/metatask";
import { listUser} from "@/api/system/user";
import { listRole} from "@/api/system/role";
const queryParams = ref({
dbCName: '',
dbTName: '',
objValue: '',
pageNum: 1,
pageSize: 10
});
const single = ref(true);
const multiple = ref(true);
function dataChange(data) {
// dbResourceOldList name
const selectedItem = dbResourceOldList.value.find(item => item.id === data);
if (selectedItem) {
// name form.value.dbRName
form.value.dbRName = selectedItem.name;
} else {
// form.value.dbRName
form.value.dbRName = '';
}
}
const dbResourceOptions = ref(undefined);
const form = ref({
dbRName: '', //
ctrlSystem: '', //
dbRID: undefined,
dbSName: '', //
dbTName: '', //
ctrlType: '', //
ctrlValue: '', //
ctrlTable: '', //
ctrlCol: '', //
objType: '', //
objValue: '', //
isStop: false //
});
const ids = ref([]);
const loading = ref(true);
const tableData = ref([]);
const total = ref(0);
const dialogVisible = ref(false);
const dialogTitle = ref('添加行');
const formRules = {
dbRName: [{ required: true, message: '连接不能为空', trigger: 'blur' }],
dbSName: [{ required: true, message: '模式不能为空', trigger: 'blur' }],
dbTName: [{ required: true, message: '表名不能为空', trigger: 'blur' }],
dbCName: [{ required: true, message: '字段名不能为空', trigger: 'blur' }],
ctrlType: [{ required: true, message: '控制方式不能为空', trigger: 'blur' }],
};
const dbResourceOldList = ref([]);
const roleList = ref([]);
const userList = ref([]);
const dbResoursName = ref(undefined);
const defaultProps = {
children: "children",
label: "name"
};
const filterNode = (value, data) => {
if (!value) return true;
return data.name.indexOf(value) !== -1;
};
const handleNodeClick = (data) => {
if( data.id==99999){
queryParams.value.dbRID = "";
}else{
queryParams.value.dbRID = data.id;
}
handleQuery();
};
const getIconClass = (data) => {
let icon=""
if (data.parentId == '0') icon= 'Monitor';
if (data.parentId == '99999') icon= 'Coin';
console.log(icon)
return icon;
};
const userOrRoleList = 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})
});
});
}
function changeMetaSecurityObj(data){
if(data=="0"){
userOrRoleList.value=userList.value
}else {
userOrRoleList.value=roleList.value
}
form.value.objValue = dialogTitle.value === '添加行配置' ? [] : '';
}
const getDeptTree = async () => {
const treeResponse = await datasourcetree();
if (treeResponse.success && treeResponse.rows.length > 0) {
dbResourceOldList.value = treeResponse.rows;
const childrenList = dbResourceOldList.value.map(element => ({ ...element, parentId: "99999" }));
dbResourceOptions.value = [{ id: 99999, name: "数据源", parentId: 0, children: childrenList }];
}
};
//
const getList = async () => {
loading.value = true;
const response = await listMetaSecurityRow(queryParams.value);
tableData.value = response.rows;
total.value = response.total;
loading.value = false;
};
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.rowId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
//
const handleQuery = () => {
queryParams.pageNum = 1;
getList();
};
//
const handlePagination = (pageNum, pageSize) => {
queryParams.pageNum = pageNum;
queryParams.pageSize = pageSize;
getList();
};
//
const handleEdit = (row) => {
reset();
const rowId = row.rowId || ids.value;
getMetaSecurityRow(rowId).then(response => {
form.value = response.data;
dialogVisible.value = true;
dialogTitle.value = "编辑行配置";
});
};
//
function handleSave() {
proxy.$refs["formRef"].validate(valid => {
if (valid) {
if (form.value.rowId != undefined&&form.value.rowId !="") {
updateMetaSecurityRow(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
dialogVisible.value = false;
getList();
});
} else {
const submitData = { ...form.value };
submitData.objValue = submitData.objValue.join(',');
addMetaSecurityRow(submitData).then(response => {
proxy.$modal.msgSuccess("新增成功");
dialogVisible.value = false;
getList();
});
}
}
});
}
/** 表单重置 */
function reset() {
form.value = {
rowId: '',
dbRName: '',
dbRID: undefined,
dbSName: '',
dbTName: '',
dbCName: '',
ctrlType: '',
objType: '',
objValue: dialogTitle.value === '添加行配置' ? [] : '', //
isStop: false
};
proxy.resetForm("formRef");
}
//
const handleRemove = async (row) => {
const rowId = row.rowId || ids.value;
proxy.$modal.confirm('是否确认删除ID为"' + rowId + '"的数据项?').then(function () {
return deleteMetaSecurityRow(rowId);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
};
const handleAdd = () => {
reset();
dialogTitle.value = '添加行配置';
dialogVisible.value = true;
form.value.objValue = []; //
};
// objValue
const getUserName = (objValue) => {
if (!objValue) return '';
const values = objValue.split(','); //
const names = values.map(value => {
const user = userList.value.find(user => user.id === value);
return user ? user.name : value;
});
return names.join(', ');
};
// objValue
const getRoleName = (objValue) => {
if (!objValue) return '';
const values = objValue.split(','); //
const names = values.map(value => {
const role = roleList.value.find(role => role.id == value);
return role ? role.name : value;
});
return names.join(', ');
};
//
const handleCancel = () => {
dialogVisible.value = false;
form.value.rowId = '';
form.value.dbCName = '';
form.value.ctrlType = '';
form.value.ctrl_value = '';
form.value.isStop = false;
};
onMounted(() => {
getList();
getDeptTree();
getRoleOrUserList();
});
watch(dbResoursName, (val) => {
if (val) {
// Filter the department tree when dbResoursName changes
proxy.$refs["tree"].filter(val);
}
});
</script>
<style scoped>
/* 添加样式 */
</style>

4
vue-fastapi-frontend/src/views/meta/metatask/index.vue

@ -654,12 +654,10 @@ const chooseRows = ref([]);
// Watcher for dynamic changes
watch(dbResoursName, (val) => {
if (val) {
// Filter the department tree when dbResoursName changes
proxy.$refs["tree"].filter(val);
}
});
// watch(filterText, (val) => {
// treeRef.value!.filter(val)

Loading…
Cancel
Save