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:
Claude
2026-08-07 11:02:58 +08:00
co-authored by Claude
parent 13853daa4a
commit 969fdbbe7f
18 changed files with 219 additions and 388 deletions
+16 -24
View File
@@ -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(