Files
DjangoAdmin_FastAPI_EleVue/apps/services/role_menu.py
T
ClaudeandClaude dbcce79536 chore: 基线提交(重构前快照)
重构前保存现有 apps/ 结构基线,供后续各阶段回滚。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 09:43:18 +08:00

80 lines
2.3 KiB
Python

import asyncio
from fastapi.logger import logger
from sqlalchemy import and_
from apps.forms.role_menu import RoleMenuForm
from apps.models.menu import Menu
from apps.models.role_menu import RoleMenu
from extensions import get_db_session
from utils import R
from utils.perm_cache import invalidate_role_perms
# 根据角色ID查询菜单列表
def get_role_menu_list(role_id):
db = get_db_session()
# 获取全部菜单列表(仅查询 id、title、parent_id,避免 SELECT * 全量拉取大字段)
menuList = db.query(Menu.id, Menu.title, Menu.parent_id).filter(and_(Menu.is_delete == 0, Menu.status == 1)).order_by(Menu.sort.asc()).all()
if len(menuList) == 0:
return None
# 根据角色ID查询角色菜单关系数据
role_menu = db.query(RoleMenu).filter(RoleMenu.role_id == role_id).all()
# 菜单ID集合
idList = []
# 遍历角色菜单数据源
if role_menu:
for v in role_menu:
# 加入数组
idList.append(v.menu_id)
# 实例化菜单列表
menu_list = []
# 遍历菜单数据
for menu in menuList:
# 菜单ID
menu_id = menu.id
data = {
'id': menu_id,
'title': menu.title,
'open': True,
'parentId': menu.parent_id,
}
if menu_id in idList:
data['checked'] = True
# 加入数组
menu_list.append(data)
# 返回结果
return menu_list
# 保存角色菜单数据
async def save_role_menu(request, data: RoleMenuForm):
def _save():
db = get_db_session()
# 角色ID
role_id = data.role_id
# 菜单ID列表
menuIdList = data.menu_id or []
# 删除当前角色ID相关菜单权限
db.query(RoleMenu).filter(RoleMenu.role_id == role_id).delete()
# 处理菜单数据
if menuIdList:
new_menus = []
for menu_id in menuIdList:
if not menu_id:
continue
new_menus.append(RoleMenu(role_id=role_id, menu_id=menu_id))
db.add_all(new_menus)
return role_id
# 同步DB操作放入线程池,避免阻塞事件循环
role_id = await asyncio.to_thread(_save)
# 清理该角色下所有用户的权限缓存
await invalidate_role_perms(role_id)
# 返回结果
return R.ok()