超级权限管理员权限重复提交报错
This commit is contained in:
@ -1,9 +1,11 @@
|
|||||||
# inventory-backend/app/services/permission_service.py
|
# inventory-backend/app/services/permission_service.py
|
||||||
|
|
||||||
from app.models.system import SysMenu, SysElement, SysRolePermission
|
from app.models.system import SysMenu, SysElement, SysRolePermission
|
||||||
from app.extensions import db
|
from app.extensions import db
|
||||||
|
|
||||||
|
|
||||||
class PermissionService:
|
class PermissionService:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_permission_tree():
|
def get_permission_tree():
|
||||||
"""
|
"""
|
||||||
@ -12,11 +14,13 @@ class PermissionService:
|
|||||||
"""
|
"""
|
||||||
# 1. 获取所有菜单
|
# 1. 获取所有菜单
|
||||||
menus = SysMenu.query.order_by(SysMenu.sort_order).all()
|
menus = SysMenu.query.order_by(SysMenu.sort_order).all()
|
||||||
|
|
||||||
# 2. 获取所有元素
|
# 2. 获取所有元素
|
||||||
elements = SysElement.query.all()
|
elements = SysElement.query.all()
|
||||||
|
|
||||||
# 3. 组装树结构
|
# 3. 组装树结构
|
||||||
tree_data = []
|
tree_data = []
|
||||||
|
|
||||||
for menu in menus:
|
for menu in menus:
|
||||||
menu_dict = menu.to_dict()
|
menu_dict = menu.to_dict()
|
||||||
|
|
||||||
@ -39,7 +43,6 @@ class PermissionService:
|
|||||||
"""获取指定角色拥有的所有权限Code"""
|
"""获取指定角色拥有的所有权限Code"""
|
||||||
perms = SysRolePermission.query.filter_by(role_code=role_code).all()
|
perms = SysRolePermission.query.filter_by(role_code=role_code).all()
|
||||||
|
|
||||||
# 将结果分为 menus 和 elements (虽然前端目前合并处理,但分开更清晰)
|
|
||||||
menu_codes = []
|
menu_codes = []
|
||||||
element_codes = []
|
element_codes = []
|
||||||
|
|
||||||
@ -49,7 +52,6 @@ class PermissionService:
|
|||||||
else:
|
else:
|
||||||
element_codes.append(p.target_code)
|
element_codes.append(p.target_code)
|
||||||
|
|
||||||
# 返回结构适配前端
|
|
||||||
return {
|
return {
|
||||||
'menus': menu_codes,
|
'menus': menu_codes,
|
||||||
'elements': element_codes
|
'elements': element_codes
|
||||||
@ -64,17 +66,27 @@ class PermissionService:
|
|||||||
if not role_code:
|
if not role_code:
|
||||||
raise ValueError("角色代码不能为空")
|
raise ValueError("角色代码不能为空")
|
||||||
|
|
||||||
# 1. 删除该角色旧的所有权限
|
try:
|
||||||
SysRolePermission.query.filter_by(role_code=role_code).delete()
|
# ========= 1️⃣ 先删除旧权限 =========
|
||||||
|
SysRolePermission.query.filter_by(role_code=role_code) \
|
||||||
|
.delete(synchronize_session=False)
|
||||||
|
|
||||||
# 2. 批量添加新权限
|
# ========= 2️⃣ 去重(关键修复点) =========
|
||||||
if permission_codes and len(permission_codes) > 0:
|
# 防止前端传来重复 code 导致 UNIQUE 冲突
|
||||||
|
unique_codes = set(permission_codes) if permission_codes else set()
|
||||||
|
|
||||||
|
# ========= 3️⃣ 批量添加新权限 =========
|
||||||
|
if unique_codes:
|
||||||
# 预先获取所有菜单代码,用于判断类型
|
# 预先获取所有菜单代码,用于判断类型
|
||||||
all_menu_codes = {m.code for m in SysMenu.query.all()}
|
all_menu_codes = {m.code for m in SysMenu.query.all()}
|
||||||
|
|
||||||
new_records = []
|
new_records = []
|
||||||
for code in permission_codes:
|
|
||||||
# 简单判断:如果在菜单表里有,就是 menu,否则是 element
|
for code in unique_codes:
|
||||||
|
if not code:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 判断类型
|
||||||
p_type = 'menu' if code in all_menu_codes else 'element'
|
p_type = 'menu' if code in all_menu_codes else 'element'
|
||||||
|
|
||||||
new_records.append(SysRolePermission(
|
new_records.append(SysRolePermission(
|
||||||
@ -83,7 +95,14 @@ class PermissionService:
|
|||||||
type=p_type
|
type=p_type
|
||||||
))
|
))
|
||||||
|
|
||||||
|
if new_records:
|
||||||
db.session.add_all(new_records)
|
db.session.add_all(new_records)
|
||||||
|
|
||||||
|
# ========= 4️⃣ 提交事务 =========
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
# 发生异常时回滚,防止脏事务
|
||||||
|
db.session.rollback()
|
||||||
|
raise e
|
||||||
Reference in New Issue
Block a user