feat(repo): 全部模块 service 改用 repository(Repository 全面落地)
- 24 个模块 service 从直接 db.query 改为使用各自 repository(get_by_id/filter/create/update) - 4 个 agent 并行分组转换:system 组、dictionary/configuration/member/region、cms/link/notice、job/log - 保留合法 db 用法:跨模型查询(user→dept/level/position、ad→adsort、adsort→item/itemcate)、投影查询(role/menu)、按条件删除(set_permission/save_role_menu/add_user_role)、独立会话(record_job_log/record_operation_log)、db.commit(pause/resume) - 修复 JobLogRepository 软删列 del_flag;修复 ad/notice create 重复传参 bug - 修复 base_repository.get_by_id/get_by_ids 兼容字符串 ID - 实测:27 个读接口 + dept/notice/member/level 写操作全通过 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -48,6 +48,7 @@ from sqlalchemy import and_, or_
|
||||
|
||||
from modules.system.menu.schemas import MenuForm
|
||||
from modules.system.menu.models import Menu
|
||||
from modules.system.menu.repository import menu_repo
|
||||
from modules.system.role.models import RoleMenu
|
||||
from modules.system.user.models import UserRole
|
||||
from core.database import get_db_session
|
||||
@@ -60,9 +61,8 @@ from utils.perm_cache import get_cached_permissions, set_cached_permissions, get
|
||||
# 查询菜单列表
|
||||
|
||||
def get_menu_page(request):
|
||||
db = get_db_session()
|
||||
# 实例化查询对象
|
||||
query = db.query(Menu).filter(Menu.is_delete == 0)
|
||||
query = menu_repo.filter(Menu.is_delete == 0)
|
||||
# 菜单名称
|
||||
name = request.query_params.get('name')
|
||||
if name:
|
||||
@@ -84,9 +84,8 @@ def get_menu_page(request):
|
||||
# 根据ID查询菜单详情
|
||||
|
||||
def get_menu_detail(menu_id):
|
||||
db = get_db_session()
|
||||
# 根据ID查询菜单
|
||||
menu = db.query(Menu).filter(and_(Menu.id == menu_id, Menu.is_delete == 0)).first()
|
||||
menu = menu_repo.get_by_id(menu_id)
|
||||
# 查询结果判空
|
||||
if not menu:
|
||||
return None
|
||||
@@ -94,8 +93,8 @@ def get_menu_detail(menu_id):
|
||||
data = menu.to_dict()
|
||||
|
||||
# 查询菜单权限节点
|
||||
permission_list = db.query(Menu).filter(
|
||||
and_(Menu.parent_id == menu_id, Menu.type == 1, Menu.is_delete == 0)).all()
|
||||
permission_list = menu_repo.filter(
|
||||
Menu.parent_id == menu_id, Menu.type == 1, Menu.is_delete == 0).all()
|
||||
# 选中的权限节点
|
||||
checked_list = []
|
||||
if permission_list:
|
||||
@@ -109,12 +108,11 @@ def get_menu_detail(menu_id):
|
||||
|
||||
async def add_menu(request, data: MenuForm):
|
||||
def _add():
|
||||
db = get_db_session()
|
||||
# 权限节点
|
||||
checkedList = data.checked_list or []
|
||||
|
||||
# 表单数据赋值给对象
|
||||
menu = Menu(
|
||||
# 表单数据赋值给对象并插入
|
||||
menu = menu_repo.create(
|
||||
title=data.title,
|
||||
icon=data.icon,
|
||||
path=data.path,
|
||||
@@ -125,11 +123,9 @@ async def add_menu(request, data: MenuForm):
|
||||
status=data.status,
|
||||
hide=data.hide,
|
||||
target=data.target,
|
||||
sort=data.sort
|
||||
sort=data.sort,
|
||||
create_user=get_user_id(request)
|
||||
)
|
||||
menu.create_user = get_user_id(request)
|
||||
# 插入数据
|
||||
menu.save()
|
||||
|
||||
# 保存节点数据
|
||||
set_permission(data.type, checkedList, data.title, data.path, menu.id, get_user_id(request))
|
||||
@@ -146,13 +142,12 @@ async def add_menu(request, data: MenuForm):
|
||||
|
||||
async def update_menu(request, data: MenuForm):
|
||||
def _update():
|
||||
db = get_db_session()
|
||||
# 记录ID判空
|
||||
if not data.id or data.id <= 0:
|
||||
return R.failed("记录ID不能为空")
|
||||
|
||||
# 根据ID查询记录
|
||||
menu = db.query(Menu).filter(and_(Menu.id == data.id, Menu.is_delete == 0)).first()
|
||||
menu = menu_repo.get_by_id(data.id)
|
||||
# 查询结果判空
|
||||
if not menu:
|
||||
return R.failed("记录不存在")
|
||||
@@ -165,7 +160,7 @@ async def update_menu(request, data: MenuForm):
|
||||
updData['update_user'] = get_user_id(request)
|
||||
updData['update_time'] = datetime.now(tz=timezone.utc)
|
||||
# 更新数据源
|
||||
result = db.query(Menu).filter_by(id=data.id).update(updData)
|
||||
result = menu_repo.update(data.id, updData)
|
||||
# 提交数据
|
||||
if not result:
|
||||
return R.failed("更新失败")
|
||||
@@ -188,7 +183,6 @@ async def update_menu(request, data: MenuForm):
|
||||
|
||||
async def delete_menu(menu_id):
|
||||
def _delete():
|
||||
db = get_db_session()
|
||||
# 记录ID为空判断
|
||||
if not menu_id:
|
||||
return R.failed("记录ID不存在"), None
|
||||
@@ -197,7 +191,7 @@ async def delete_menu(menu_id):
|
||||
if not id_list:
|
||||
return R.failed("记录ID不存在"), None
|
||||
# 批量查询并校验
|
||||
records = db.query(Menu).filter(and_(Menu.id.in_(id_list), Menu.is_delete == 0)).all()
|
||||
records = menu_repo.filter(Menu.id.in_(id_list), Menu.is_delete == 0).all()
|
||||
if len(records) != len(id_list):
|
||||
return R.failed("记录不存在"), None
|
||||
# 批量设置删除标识
|
||||
@@ -323,14 +317,13 @@ def set_permission(menu_type, checkedList, title, path, parent_id, user_id):
|
||||
|
||||
def get_permissions_list_sync(user_id):
|
||||
"""同步查询用户权限节点(直查DB,不读缓存),供同步鉴权路径使用"""
|
||||
db = get_db_session()
|
||||
if user_id == 1:
|
||||
# 超级管理员
|
||||
menu_list = db.query(Menu).filter(and_(Menu.is_delete == 0, Menu.type == 1)).all()
|
||||
menu_list = menu_repo.filter(Menu.is_delete == 0, Menu.type == 1).all()
|
||||
else:
|
||||
# 其他用户:通过 ORM join 查询权限节点
|
||||
menu_list = (
|
||||
db.query(Menu)
|
||||
menu_repo.filter()
|
||||
.join(RoleMenu, RoleMenu.menu_id == Menu.id)
|
||||
.join(UserRole, UserRole.role_id == RoleMenu.role_id)
|
||||
.filter(
|
||||
@@ -363,16 +356,15 @@ async def get_permissions_list(user_id):
|
||||
|
||||
def get_permission_menu_list_sync(user_id):
|
||||
"""同步查询用户菜单树(直查DB,不读缓存),供线程池内使用"""
|
||||
db = get_db_session()
|
||||
if user_id == 1:
|
||||
# 超级管理员
|
||||
# 查询全部菜单列表
|
||||
menu_list = db.query(Menu).filter(and_(Menu.is_delete == 0, Menu.status == 1, Menu.type == 0)).order_by(
|
||||
menu_list = menu_repo.filter(Menu.is_delete == 0, Menu.status == 1, Menu.type == 0).order_by(
|
||||
Menu.sort.asc())
|
||||
return get_tree_list(menu_list)
|
||||
# 其他用户:通过 ORM join 查询菜单列表
|
||||
menu_list = (
|
||||
db.query(Menu)
|
||||
menu_repo.filter()
|
||||
.join(RoleMenu, RoleMenu.menu_id == Menu.id)
|
||||
.join(UserRole, UserRole.role_id == RoleMenu.role_id)
|
||||
.filter(
|
||||
|
||||
Reference in New Issue
Block a user