mirror of
https://github.com/fastapi-practices/fastapi_best_architecture.git
synced 2025-08-15 03:52:54 +08:00
Add query users by department ID (#175)
* Add query users by department ID * fix dept parent id schema field * fix dept get all select * update the test sql
This commit is contained in:
@ -62,11 +62,12 @@ async def update_avatar(request: Request, username: str, avatar: Avatar):
|
||||
@router.get('', summary='(模糊条件)分页获取所有用户', dependencies=[DependsJwtAuth, PageDepends])
|
||||
async def get_all_users(
|
||||
db: CurrentSession,
|
||||
dept: Annotated[int | None, Query()] = None,
|
||||
username: Annotated[str | None, Query()] = None,
|
||||
phone: Annotated[str | None, Query()] = None,
|
||||
status: Annotated[int | None, Query()] = None,
|
||||
):
|
||||
user_select = await UserService.get_select(username=username, phone=phone, status=status)
|
||||
user_select = await UserService.get_select(dept=dept, username=username, phone=phone, status=status)
|
||||
page_data = await paging_data(db, user_select, GetAllUserInfo)
|
||||
return await response_base.success(data=page_data)
|
||||
|
||||
|
@ -51,7 +51,7 @@ class Settings(BaseSettings):
|
||||
|
||||
# Demo mode
|
||||
# Only GET, OPTIONS requests are allowed
|
||||
DEMO_MODE: bool = True
|
||||
DEMO_MODE: bool = False
|
||||
DEMO_MODE_EXCLUDE: set[tuple[str, str]] = {
|
||||
('POST', f'{API_V1_STR}/auth/login'),
|
||||
('POST', f'{API_V1_STR}/auth/logout'),
|
||||
|
@ -2,7 +2,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from typing import Any
|
||||
|
||||
from sqlalchemy import select, and_, asc
|
||||
from sqlalchemy import select, and_, asc, or_
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy.orm import selectinload
|
||||
|
||||
@ -23,14 +23,22 @@ class CRUDDept(CRUDBase[Dept, CreateDept, UpdateDept]):
|
||||
) -> Any:
|
||||
se = select(self.model).order_by(asc(self.model.sort))
|
||||
where_list = [self.model.del_flag == 0]
|
||||
conditions = []
|
||||
if name:
|
||||
where_list.append(self.model.name.like(f'%{name}%'))
|
||||
conditions.append(self.model.name.like(f'%{name}%'))
|
||||
if leader:
|
||||
where_list.append(self.model.leader.like(f'%{leader}%'))
|
||||
conditions.append(self.model.leader.like(f'%{leader}%'))
|
||||
if phone:
|
||||
where_list.append(self.model.phone.startswith(phone))
|
||||
se_phone = self.model.phone.startswith(phone)
|
||||
dept_select = await db.execute(se.where(se_phone))
|
||||
dept_likes = dept_select.scalars().all()
|
||||
where_list.append(or_(se_phone, self.model.id.in_([dept.parent_id for dept in dept_likes])))
|
||||
if status is not None:
|
||||
where_list.append(self.model.status == status)
|
||||
if conditions:
|
||||
dept_select = await db.execute(se.where(and_(*conditions)))
|
||||
dept_likes = dept_select.scalars().all()
|
||||
where_list.append(or_(*conditions, self.model.id.in_([dept.parent_id for dept in dept_likes])))
|
||||
if where_list:
|
||||
se = se.where(and_(*where_list))
|
||||
dept = await db.execute(se)
|
||||
|
@ -69,7 +69,7 @@ class CRUDUser(CRUDBase[User, CreateUser, UpdateUser]):
|
||||
)
|
||||
return user.rowcount
|
||||
|
||||
async def get_all(self, username: str = None, phone: str = None, status: int = None) -> Select:
|
||||
async def get_all(self, dept: int = None, username: str = None, phone: str = None, status: int = None) -> Select:
|
||||
se = (
|
||||
select(self.model)
|
||||
.options(selectinload(self.model.dept))
|
||||
@ -77,6 +77,8 @@ class CRUDUser(CRUDBase[User, CreateUser, UpdateUser]):
|
||||
.order_by(desc(self.model.join_time))
|
||||
)
|
||||
where_list = []
|
||||
if dept:
|
||||
where_list.append(self.model.dept_id == dept)
|
||||
if username:
|
||||
where_list.append(self.model.username.like(f'%{username}%'))
|
||||
if phone:
|
||||
|
@ -11,7 +11,7 @@ from backend.app.utils.re_verify import is_phone
|
||||
|
||||
class DeptBase(SchemaBase):
|
||||
name: str
|
||||
parent_id: int | None = Field(default=None, ge=1, description='菜单父级ID')
|
||||
parent_id: int | None = Field(default=None, description='菜单父级ID')
|
||||
sort: int = Field(default=0, ge=0, description='排序')
|
||||
leader: str | None = None
|
||||
phone: str | None = None
|
||||
|
@ -100,8 +100,8 @@ class UserService:
|
||||
return count
|
||||
|
||||
@staticmethod
|
||||
async def get_select(*, username: str = None, phone: str = None, status: int = None) -> Select:
|
||||
return await UserDao.get_all(username=username, phone=phone, status=status)
|
||||
async def get_select(*, dept: int, username: str = None, phone: str = None, status: int = None) -> Select:
|
||||
return await UserDao.get_all(dept=dept, username=username, phone=phone, status=status)
|
||||
|
||||
@staticmethod
|
||||
async def update_permission(*, request: Request, pk: int) -> int:
|
||||
|
@ -99,6 +99,7 @@ CREATE TABLE sys_menu
|
||||
(
|
||||
id INTEGER NOT NULL AUTO_INCREMENT,
|
||||
name VARCHAR(50) NOT NULL COMMENT '菜单名称',
|
||||
title varchar(50) not null comment '菜单标题',
|
||||
level INTEGER NOT NULL COMMENT '菜单层级',
|
||||
sort INTEGER NOT NULL COMMENT '排序',
|
||||
icon VARCHAR(100) COMMENT '菜单图标',
|
||||
|
@ -1,14 +1,23 @@
|
||||
INSERT INTO fba.sys_dept (id, name, level, sort, leader, phone, email, status, del_flag, parent_id, created_time, updated_time)
|
||||
VALUES (1, 'test', 0, 0, null, null, null, 1, 0, null, '2023-06-26 17:13:45', null);
|
||||
|
||||
insert into fba.sys_menu (id, name, level, sort, icon, path, menu_type, component, perms, status, remark, parent_id, created_time, updated_time, `show`, cache)
|
||||
values (1, 'test', 0, 0, null, null, 0, null, null, 1, null, null, '2023-06-26 17:13:45', null, 0, 1),
|
||||
(2, 'dashboard', 0, 0, 'icon-dashboard', '/dashboard', 0, '/dashboard/workplace/index.vue', null, 1, null, null, '2023-06-30 10:10:34', null, 1, 1),
|
||||
(3, 'Workplace', 0, 0, null, '/workplace', 0, null, null, 1, null, 2, '2023-06-30 10:11:40', null, 1, 1),
|
||||
(4, 'arcoWebsite', 0, 101, 'icon-link', 'https://arco.design', 0, null, null, 1, null, null, '2023-06-30 10:13:04', null, 1, 1),
|
||||
(5, 'log', 0, 1, 'icon-bug', '/log', 0, null, null, 1, null, null, '2023-06-30 10:13:54', null, 1, 1),
|
||||
(6, 'Login', 0, 0, null, '/login', 0, '/log/login/index.vue', null, 1, null, 5, '2023-06-30 10:14:23', null, 1, 1),
|
||||
(7, 'faq', 0, 102, 'icon-question-circle', 'https://arco.design/vue/docs/pro/faq', 0, null, null, 1, null, null, '2023-06-30 10:14:56', null, 1, 1);
|
||||
insert into fba.sys_menu (id, name, level, sort, icon, path, menu_type, component, perms, status, remark, parent_id, created_time, updated_time, show, cache, title)
|
||||
values (1, 'test', 0, 0, null, null, 0, null, null, 1, null, null, '2023-06-26 17:13:45', null, 0, 1, '测试'),
|
||||
(2, 'dashboard', 0, 0, 'icon-dashboard', '/dashboard', 0, '/dashboard/workplace/index.vue', null, 1, null, null, '2023-06-30 10:10:34', null, 1, 1, '仪表盘'),
|
||||
(3, 'Workplace', 0, 0, null, '/workplace', 1, null, null, 1, null, 2, '2023-06-30 10:11:40', null, 1, 1, '工作台'),
|
||||
(4, 'arcoWebsite', 0, 888, 'icon-link', 'https://arco.design', 0, null, null, 1, null, null, '2023-06-30 10:13:04', '2023-07-07 20:05:20', 1, 1, 'arco官网'),
|
||||
(5, 'log', 0, 66, 'icon-bug', '/log', 0, null, null, 1, '这是系统日志记录;这是系统日志记录;这是系统日志记录;这是系统日志记录;这是系统日志记录;这是系统日志记录;这是系统日志记录;这是系统日志记录;这是系统日志记录;这是系统日志记录;', null, '2023-06-30 10:13:54', '2023-07-07 20:04:42', 1, 1, '日志'),
|
||||
(6, 'Login', 0, 0, null, '/login', 1, '/log/login/index.vue', null, 1, null, 5, '2023-06-30 10:14:23', null, 1, 1, '登录日志'),
|
||||
(7, 'faq', 0, 999, 'icon-question-circle', 'https://arco.design/vue/docs/pro/faq', 0, null, null, 1, null, null, '2023-06-30 10:14:56', '2023-07-07 20:05:10', 1, 1, '常见问题'),
|
||||
(8, 'admin', 0, 6, 'icon-settings', '/admin', 0, '', null, 1, null, null, '2023-07-04 10:52:48', '2023-07-07 20:06:02', 1, 1, '系统管理'),
|
||||
(9, 'SysMenu', 0, 2, '', '/sys-menu', 1, '/admin/menu/index.vue', null, 1, '系统后台菜单管理,玛卡巴卡?', 8, '2023-07-04 10:55:02', '2023-07-08 22:43:53', 1, 1, '菜单管理'),
|
||||
(10, 'test', 0, 100, null, null, 0, null, null, 1, null, null, '2023-07-07 20:23:57', '2023-07-07 20:04:53', 0, 1, '测试2'),
|
||||
(11, 'test', 0, 0, null, null, 1, null, null, 1, null, 10, '2023-07-07 20:20:55', null, 1, 1, '测试3'),
|
||||
(12, '', 0, 0, null, null, 2, null, null, 1, null, 11, '2023-07-07 20:42:31', null 1, 1, '测试4'),
|
||||
(13, '', 0, 0, null, null, 2, null, null, 1, null, 11, '2023-07-07 20:42:52', null 1, 1, '测试5'),
|
||||
(14, '', 0, 0, null, null, 2, null, null, 1, null, 11, '2023-07-07 20:16:27', null, 1, 1, '测试6'),
|
||||
(15, 'Opera', 0, 0, null, '/opera', 1, '/log/opera/index.vue', null, 1, null, 5, '2023-07-07 20:28:21', null, 1, 1, '操作日志'),
|
||||
(16, 'SysDept', 0, 0, null, 'sys-dept', 1, '/admin/dept/index.vue', null, 1, null, 8, '2023-07-08 22:43:20', null, 1, 1, '部门管理');
|
||||
|
||||
INSERT INTO fba.sys_role (id, name, data_scope, status, remark, created_time, updated_time)
|
||||
VALUES (1, 'test', 2, 1, null, '2023-06-26 17:13:45', null);
|
||||
|
Reference in New Issue
Block a user