# !/usr/bin/env python3 # -*- encoding : utf-8 -*- # @Filename : menu.py # @Software : VSCode # @Datetime : 2021/11/08 22:13:05 # @Author : leo liu # @Version : 1.0 # @Description : from typing import List, Optional from loguru import logger from sqlalchemy import func, desc from sqlalchemy.orm import Session from sqlalchemy.sql.expression import and_, or_ from pydantic.types import conint from extensions.curd_base import CRUDBase from models import Menu, role_menu from ..schemas import menu_schema class CRUDMenu(CRUDBase[Menu, menu_schema.MenuCreate, menu_schema.MenuUpdate]): @staticmethod def query_all(db: Session, *, col_val: str = "", is_delete: int = 0, page: int = 0, page_size: conint(le=50) = 20, order_by: str = "id", is_desc: bool = False) -> dict: temp_page = (page - 1) * page_size search = None order_type = None # 处理多个字段的模糊查询:name if col_val: search = and_(Menu.is_delete == is_delete, or_(Menu.name.like('%' + col_val + "%"), Menu.path.like('%' + col_val + "%"))) else: search = Menu.is_delete == is_delete # 处理排序方式 # 利用属性名反射类属性 if is_desc: order_type = desc(Menu.getAttrFromName(Menu, order_by)) else: order_type = Menu.getAttrFromName(Menu, order_by) # 查询数量 total = db.query(func.count(Menu.menu_id)).filter(search).scalar() # 查询结果集 if page > 0: query_obj = db.query(Menu).filter(search).order_by(order_type).offset(temp_page).limit(page_size).all() else: query_obj = db.query(Menu).filter(search).order_by(order_type).all() items = [{ "menu_id": obj.menu_id, "path": obj.path, "name": obj.name, "super_menu": obj.super_menu and obj.super_menu or "" } for obj in query_obj] return { "items": items, "total": total } def create(self, db: Session, *, obj_in: menu_schema.MenuCreate): db_obj = Menu( path = obj_in.path, name = obj_in.name, super_menu = obj_in.super_menu ) db.add(db_obj) db.commit() # db.refresh(db_obj) def sync_menus(self, db: Session, *, obj_arr: List): for obj_in in obj_arr: menu = db.query(Menu).filter(Menu.path == obj_in["path"]).first() if (menu): menu.name = obj_in["name"] menu.path = obj_in["path"] menu.super_menu = obj_in["super_menu"] menu.is_delete = obj_in["is_delete"] if (menu.is_delete): db.query(role_menu).filter(role_menu.c.menu_id == menu.menu_id).delete() else: db_obj = Menu ( path = obj_in["path"], name = obj_in["name"], super_menu = obj_in["super_menu"] ) db.add(db_obj) db.commit() def get_by_path(self, db: Session, *, path: str) -> Menu: return db.query(Menu).filter(Menu.path == path).first() crud_menu = CRUDMenu(Menu)