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