feat: implement composite debounced search with prepended select and wipe out duplicate root permission nodes
This commit is contained in:
@ -459,6 +459,27 @@ class PermissionService:
|
||||
SysRolePermission.query.filter_by(target_code=menu.code).delete()
|
||||
db.session.delete(menu)
|
||||
|
||||
# 第二步:清理重复菜单(同一个 code 存在多条记录,保留 ID 最小的)
|
||||
# 先找出所有可能重复的 code
|
||||
duplicate_check = db.session.query(
|
||||
SysMenu.code,
|
||||
func.count(SysMenu.id).label('cnt')
|
||||
).group_by(SysMenu.code).having(func.count(SysMenu.id) > 1).all()
|
||||
|
||||
for code, cnt in duplicate_check:
|
||||
# 获取该 code 的所有记录,按 id 排序,保留第一条,删除其余
|
||||
duplicates = SysMenu.query.filter_by(code=code).order_by(SysMenu.id).all()
|
||||
# 保留第一条,删除其他
|
||||
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()
|
||||
db.session.delete(dup)
|
||||
|
||||
# 第三步:强制重新设置所有子菜单的 parent_id,确保没有遗漏
|
||||
# 先将所有子菜单的 parent_id 设为 None,然后重新设置
|
||||
SysMenu.query.filter(SysMenu.code.in_(child_codes)).update({SysMenu.parent_id: None})
|
||||
|
||||
# 创建或更新菜单
|
||||
menu_map = {} # code -> menu obj
|
||||
|
||||
|
||||
Reference in New Issue
Block a user