refactor(orm): 将所有的批量 delete/update 重构为对象级操作,以确保触发 SQLAlchemy 审计事件
This commit is contained in:
@ -109,8 +109,10 @@ class PermissionService:
|
||||
try:
|
||||
# 1. 开启事务 (Flask-SQLAlchemy 自动管理,但明确逻辑更好)
|
||||
|
||||
# 2. 删除该角色旧的所有权限
|
||||
SysRolePermission.query.filter_by(role_code=role_code).delete()
|
||||
# 2. 删除该角色旧的所有权限(改为对象级删除以触发审计事件)
|
||||
old_perms = SysRolePermission.query.filter_by(role_code=role_code).all()
|
||||
for p in old_perms:
|
||||
db.session.delete(p)
|
||||
|
||||
# 3. 准备新数据
|
||||
if permissions:
|
||||
@ -374,10 +376,14 @@ class PermissionService:
|
||||
).all()
|
||||
|
||||
for menu in legacy_menus:
|
||||
# 删除关联的权限
|
||||
SysRolePermission.query.filter_by(target_code=menu.code).delete()
|
||||
# 删除关联的元素
|
||||
SysElement.query.filter_by(menu_code=menu.code).delete()
|
||||
# 删除关联的权限(改为对象级删除以触发审计事件)
|
||||
old_perms = SysRolePermission.query.filter_by(target_code=menu.code).all()
|
||||
for p in old_perms:
|
||||
db.session.delete(p)
|
||||
# 删除关联的元素(改为对象级删除以触发审计事件)
|
||||
old_elements = SysElement.query.filter_by(menu_code=menu.code).all()
|
||||
for e in old_elements:
|
||||
db.session.delete(e)
|
||||
# 删除菜单
|
||||
db.session.delete(menu)
|
||||
print(f"🗑️ 已清理旧版库存盘点菜单: {menu.code} ({menu.name})")
|
||||
@ -456,8 +462,10 @@ class PermissionService:
|
||||
).all()
|
||||
for menu in orphaned_menus:
|
||||
print(f"🗑️ 清理根级别冗余菜单: {menu.code} ({menu.name})")
|
||||
# 删除关联的权限
|
||||
SysRolePermission.query.filter_by(target_code=menu.code).delete()
|
||||
# 删除关联的权限(改为对象级删除以触发审计事件)
|
||||
old_perms = SysRolePermission.query.filter_by(target_code=menu.code).all()
|
||||
for p in old_perms:
|
||||
db.session.delete(p)
|
||||
db.session.delete(menu)
|
||||
|
||||
# 第二步:清理重复菜单(同一个 code 存在多条记录,保留 ID 最小的)
|
||||
@ -473,13 +481,20 @@ class PermissionService:
|
||||
# 保留第一条,删除其他
|
||||
for dup in duplicates[1:]:
|
||||
print(f"🗑️ 清理重复菜单: {dup.code} (id={dup.id}, name={dup.name})")
|
||||
SysRolePermission.query.filter_by(target_code=dup.code).delete()
|
||||
SysElement.query.filter_by(menu_code=dup.code).delete()
|
||||
# 改为对象级删除以触发审计事件
|
||||
old_perms = SysRolePermission.query.filter_by(target_code=dup.code).all()
|
||||
for p in old_perms:
|
||||
db.session.delete(p)
|
||||
old_elements = SysElement.query.filter_by(menu_code=dup.code).all()
|
||||
for e in old_elements:
|
||||
db.session.delete(e)
|
||||
db.session.delete(dup)
|
||||
|
||||
# 第三步:强制重新设置所有子菜单的 parent_id,确保没有遗漏
|
||||
# 先将所有子菜单的 parent_id 设为 None,然后重新设置
|
||||
SysMenu.query.filter(SysMenu.code.in_(child_codes)).update({SysMenu.parent_id: None})
|
||||
# 改为对象级更新以触发审计事件
|
||||
child_menus = SysMenu.query.filter(SysMenu.code.in_(child_codes)).all()
|
||||
for m in child_menus:
|
||||
m.parent_id = None
|
||||
|
||||
# 创建或更新菜单
|
||||
menu_map = {} # code -> menu obj
|
||||
|
||||
Reference in New Issue
Block a user