Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 4 additions & 9 deletions backend/app/admin/crud/crud_data_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@
# -*- coding: utf-8 -*-
from typing import Sequence

from sqlalchemy import Select, and_, desc, select
from sqlalchemy import Select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import noload
from sqlalchemy_crud_plus import CRUDPlus

from backend.app.admin.model import DataRule
Expand All @@ -31,16 +30,12 @@ async def get_list(self, name: str | None) -> Select:
:param name: 规则名称
:return:
"""
stmt = select(self.model).options(noload(self.model.scopes)).order_by(desc(self.model.created_time))
filters = {}

filters = []
if name is not None:
filters.append(self.model.name.like(f'%{name}%'))
filters['name__like'] = f'%{name}%'

if filters:
stmt = stmt.where(and_(*filters))

return stmt
return await self.select_order('id', load_strategies={'scopes': 'noload'}, **filters)

async def get_by_name(self, db: AsyncSession, name: str) -> DataRule | None:
"""
Expand Down
23 changes: 6 additions & 17 deletions backend/app/admin/crud/crud_data_scope.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@
# -*- coding: utf-8 -*-
from typing import Sequence

from sqlalchemy import Select, and_, desc, select
from sqlalchemy import Select, select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import noload, selectinload
from sqlalchemy_crud_plus import CRUDPlus

from backend.app.admin.model import DataRule, DataScope
Expand Down Expand Up @@ -42,9 +41,7 @@ async def get_with_relation(self, db: AsyncSession, pk: int) -> DataScope:
:param pk: 范围 ID
:return:
"""
stmt = select(self.model).options(selectinload(self.model.rules)).where(self.model.id == pk)
data_scope = await db.execute(stmt)
return data_scope.scalars().first()
return await self.select_model(db, pk, load_strategies=['rules'])

async def get_all(self, db: AsyncSession) -> Sequence[DataScope]:
"""
Expand All @@ -63,22 +60,14 @@ async def get_list(self, name: str | None, status: int | None) -> Select:
:param status: 范围状态
:return:
"""
stmt = (
select(self.model)
.options(noload(self.model.rules), noload(self.model.roles))
.order_by(desc(self.model.created_time))
)
filters = {}

filters = []
if name is not None:
filters.append(self.model.name.like(f'%{name}%'))
filters['name__like'] = f'%{name}%'
if status is not None:
filters.append(self.model.status == status)
filters['status'] = status

if filters:
stmt = stmt.where(and_(*filters))

return stmt
return await self.select_order('id', load_strategies={'rules': 'noload', 'roles': 'noload'}, **filters)

async def create(self, db: AsyncSession, obj: CreateDataScopeParam) -> None:
"""
Expand Down
25 changes: 11 additions & 14 deletions backend/app/admin/crud/crud_dept.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
from typing import Sequence

from fastapi import Request
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
from sqlalchemy_crud_plus import CRUDPlus

from backend.app.admin.model import Dept
Expand Down Expand Up @@ -56,16 +54,19 @@ async def get_all(
:param status: 部门状态
:return:
"""
filters = {'del_flag__eq': 0}
filters = {'del_flag': 0}

if name is not None:
filters.update(name__like=f'%{name}%')
filters['name__like'] = f'%{name}%'
if leader is not None:
filters.update(leader__like=f'%{leader}%')
filters['leader__like'] = f'%{leader}%'
if phone is not None:
filters.update(phone__startswith=phone)
filters['phone__startswith'] = phone
if status is not None:
filters.update(status=status)
return await self.select_models_order(db, 'sort', None, await filter_data_permission(db, request), **filters)
filters['status'] = status

data_filtered = await filter_data_permission(db, request)
return await self.select_models_order(db, 'sort', 'desc', data_filtered, **filters)

async def create(self, db: AsyncSession, obj: CreateDeptParam) -> None:
"""
Expand Down Expand Up @@ -106,9 +107,7 @@ async def get_with_relation(self, db: AsyncSession, dept_id: int) -> Dept | None
:param dept_id: 部门 ID
:return:
"""
stmt = select(self.model).options(selectinload(self.model.users)).where(self.model.id == dept_id)
result = await db.execute(stmt)
return result.scalars().first()
return await self.select_model(db, dept_id, load_strategies=['users'])

async def get_children(self, db: AsyncSession, dept_id: int) -> Sequence[Dept | None]:
"""
Expand All @@ -118,9 +117,7 @@ async def get_children(self, db: AsyncSession, dept_id: int) -> Sequence[Dept |
:param dept_id: 部门 ID
:return:
"""
stmt = select(self.model).where(self.model.parent_id == dept_id, self.model.del_flag == 0)
result = await db.execute(stmt)
return result.scalars().all()
return await self.select_models(db, parent_id=dept_id, del_flag=0)


dept_dao: CRUDDept = CRUDDept(Dept)
8 changes: 5 additions & 3 deletions backend/app/admin/crud/crud_login_log.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@ async def get_list(self, username: str | None, status: int | None, ip: str | Non
:return:
"""
filters = {}

if username is not None:
filters.update(username__like=f'%{username}%')
filters['username__like'] = f'%{username}%'
if status is not None:
filters.update(status=status)
filters['status'] = status
if ip is not None:
filters.update(ip__like=f'%{ip}%')
filters['ip__like'] = f'%{ip}%'

return await self.select_order('created_time', 'desc', **filters)

async def create(self, db: AsyncSession, obj: CreateLoginLogParam) -> None:
Expand Down
23 changes: 10 additions & 13 deletions backend/app/admin/crud/crud_menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@
# -*- coding: utf-8 -*-
from typing import Sequence

from sqlalchemy import and_, asc, select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
from sqlalchemy_crud_plus import CRUDPlus

from backend.app.admin.model import Menu
Expand Down Expand Up @@ -44,10 +42,12 @@ async def get_all(self, db: AsyncSession, title: str | None, status: int | None)
:return:
"""
filters = {}

if title is not None:
filters.update(title__like=f'%{title}%')
filters['title__like'] = f'%{title}%'
if status is not None:
filters.update(status=status)
filters['status'] = status

return await self.select_models_order(db, 'sort', **filters)

async def get_sidebar(self, db: AsyncSession, superuser: bool, menu_ids: list[int | None]) -> Sequence[Menu]:
Expand All @@ -59,13 +59,12 @@ async def get_sidebar(self, db: AsyncSession, superuser: bool, menu_ids: list[in
:param menu_ids: 菜单 ID 列表
:return:
"""
stmt = select(self.model).order_by(asc(self.model.sort))
filters = [self.model.type.in_([0, 1, 3, 4])]
filters = {'type__in': [0, 1, 3, 4]}

if not superuser:
filters.append(self.model.id.in_(menu_ids))
stmt = stmt.where(and_(*filters))
menu = await db.execute(stmt)
return menu.scalars().all()
filters['id__in'] = menu_ids

return await self.select_models_order(db, 'sort', 'asc', **filters)

async def create(self, db: AsyncSession, obj: CreateMenuParam) -> None:
"""
Expand Down Expand Up @@ -106,9 +105,7 @@ async def get_children(self, db: AsyncSession, menu_id: int) -> list[Menu | None
:param menu_id: 菜单 ID
:return:
"""
stmt = select(self.model).options(selectinload(self.model.children)).where(self.model.id == menu_id)
result = await db.execute(stmt)
menu = result.scalars().first()
menu = await self.select_model(db, menu_id, load_strategies=['children'])
return menu.children


Expand Down
8 changes: 5 additions & 3 deletions backend/app/admin/crud/crud_opera_log.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@ async def get_list(self, username: str | None, status: int | None, ip: str | Non
:return:
"""
filters = {}

if username is not None:
filters.update(username__like=f'%{username}%')
filters['username__like'] = f'%{username}%'
if status is not None:
filters.update(status=status)
filters['status__eq'] = status
if ip is not None:
filters.update(ip__like=f'%{ip}%')
filters['ip__like'] = f'%{ip}%'

return await self.select_order('created_time', 'desc', **filters)

async def create(self, db: AsyncSession, obj: CreateOperaLogParam) -> None:
Expand Down
38 changes: 16 additions & 22 deletions backend/app/admin/crud/crud_role.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@
# -*- coding: utf-8 -*-
from typing import Sequence

from sqlalchemy import Select, and_, desc, select
from sqlalchemy import Select, select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import noload, selectinload
from sqlalchemy_crud_plus import CRUDPlus

from backend.app.admin.model import DataScope, Menu, Role
Expand Down Expand Up @@ -37,13 +36,7 @@ async def get_with_relation(self, db: AsyncSession, role_id: int) -> Role | None
:param role_id: 角色 ID
:return:
"""
stmt = (
select(self.model)
.options(selectinload(self.model.menus), selectinload(self.model.scopes))
.where(self.model.id == role_id)
)
role = await db.execute(stmt)
return role.scalars().first()
return await self.select_model(db, role_id, load_strategies=['menus', 'scopes'])

async def get_all(self, db: AsyncSession) -> Sequence[Role]:
"""
Expand All @@ -62,22 +55,23 @@ async def get_list(self, name: str | None, status: int | None) -> Select:
:param status: 角色状态
:return:
"""
stmt = (
select(self.model)
.options(noload(self.model.users), noload(self.model.menus), noload(self.model.scopes))
.order_by(desc(self.model.created_time))
)

filters = []
filters = {}

if name is not None:
filters.append(self.model.name.like(f'%{name}%'))
filters['name__like'] = f'%{name}%'
if status is not None:
filters.append(self.model.status == status)

if filters:
stmt = stmt.where(and_(*filters))

return stmt
filters['status'] = status

return await self.select_order(
'id',
load_strategies={
'users': 'noload',
'menus': 'noload',
'scopes': 'noload',
},
**filters,
)

async def get_by_name(self, db: AsyncSession, name: str) -> Role | None:
"""
Expand Down
54 changes: 24 additions & 30 deletions backend/app/admin/crud/crud_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
import bcrypt

from sqlalchemy import and_, desc, select
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import noload, selectinload
from sqlalchemy.sql import Select
Expand Down Expand Up @@ -171,29 +171,26 @@ async def get_list(self, dept: int | None, username: str | None, phone: str | No
:param status: 用户状态
:return:
"""
stmt = (
select(self.model)
.options(
selectinload(self.model.dept).options(noload(Dept.parent), noload(Dept.children), noload(Dept.users)),
selectinload(self.model.roles).options(noload(Role.users), noload(Role.menus), noload(Role.scopes)),
)
.order_by(desc(self.model.join_time))
)
filters = {}

filters = []
if dept:
filters.append(self.model.dept_id == dept)
filters['dept_id'] = dept
if username:
filters.append(self.model.username.like(f'%{username}%'))
filters['username__like'] = f'%{username}%'
if phone:
filters.append(self.model.phone.like(f'%{phone}%'))
filters['phone_like'] = f'%{phone}%'
if status is not None:
filters.append(self.model.status == status)
filters['status'] = status

if filters:
stmt = stmt.where(and_(*filters))

return stmt
return await self.select_order(
'id',
'desc',
load_options=[
selectinload(self.model.dept).options(noload(Dept.parent), noload(Dept.children), noload(Dept.users)),
selectinload(self.model.roles).options(noload(Role.users), noload(Role.menus), noload(Role.scopes)),
],
**filters,
)

async def get_super(self, db: AsyncSession, user_id: int) -> bool:
"""
Expand Down Expand Up @@ -294,22 +291,19 @@ async def get_with_relation(
:param username: 用户名
:return:
"""
stmt = select(self.model).options(
selectinload(self.model.dept),
selectinload(self.model.roles).options(selectinload(Role.menus), selectinload(Role.scopes)),
)
filters = {}

filters = []
if user_id:
filters.append(self.model.id == user_id)
filters['id'] = user_id
if username:
filters.append(self.model.username == username)
filters['username'] = username

if filters:
stmt = stmt.where(and_(*filters))

user = await db.execute(stmt)
return user.scalars().first()
return await self.select_model_by_column(
db,
load_options=[selectinload(self.model.roles).options(selectinload(Role.menus), selectinload(Role.scopes))],
load_strategies=['dept'],
**filters,
)


user_dao: CRUDUser = CRUDUser(User)
6 changes: 4 additions & 2 deletions backend/plugin/config/crud/crud_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,12 @@ async def get_list(self, name: str | None, type: str | None) -> Select:
:return:
"""
filters = {'type__not_in': settings.CONFIG_BUILT_IN_TYPES}

if name is not None:
filters.update(name__like=f'%{name}%')
filters['name__like'] = f'%{name}%'
if type is not None:
filters.update(type__like=f'%{type}%')
filters['type__like'] = f'%{type}%'

return await self.select_order('created_time', 'desc', **filters)

async def create(self, db: AsyncSession, obj: CreateConfigParam) -> None:
Expand Down
Loading