You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
3.2 KiB

3 years ago
# !/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)