mini-rbac/backend/core/utils.py
2022-10-04 12:40:11 +08:00

95 lines
2.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import importlib
import inspect
import os
import random
from core.log import logger
def list_to_tree(
menus, parent_flag: str = "pid", children_key: str = "children"
) -> list:
"""
list 结构转 树结构
:param menus: [{id:1, pid: 3}]
:param parent_flag: 节点关系字段
:param children_key: 生成树结构的子节点字段
:return: list 类型的 树嵌套数据
""" ""
# 先转成字典 id作为key, 数据作为value
menu_map = {menu["id"]: menu for menu in menus}
arr = []
for menu in menus:
# 有父级
if mid := menu.get(parent_flag):
# 有 子项的情况
if result := menu_map[mid].get(children_key):
result.append(menu)
else:
# 无子项的情况
menu_map[mid][children_key] = [menu]
else:
arr.append(menu)
return arr
def get_system_info():
"""获取系统信息"""
return {
"usage": {
"cpu": f"{random.random() * 100: .2}",
"memory": f"{random.random() * 100: .2}",
"disk": f"{random.random() * 100: .2}",
},
"performance": {
"rps": f"{random.random() * random.randint(1, 50): .2}",
"time": f"{random.random() * random.randint(1, 50): .2}",
"user": f"{random.randint(1, 50)}",
},
}
def load_routers(
app, package_path: str = "router", router_name: str = "router", is_init=False
):
"""
自动注册路由
:param app: FastAPI 实例对象 或者 APIRouter对象
:param package_path: 路由包所在路径默认相对路径router包
:param router_name: APIRouter实例名称需所有实例统一默认router
:param is_init: 是否在包中的__init__.py中导入了所有APIRouter实例默认否
:return: 默认None
"""
def __register(module_obj):
"""注册路由module_obj 模块对象"""
if hasattr(module_obj, router_name):
router_obj = getattr(module_obj, router_name)
app.include_router(router_obj)
logger.info("开始扫描路由。")
if is_init:
# 1. init 导入了其他自文件包时
for _, module in inspect.getmembers(
importlib.import_module(package_path), inspect.ismodule
):
__register(module)
else:
# 2. 排除init文件时 的情况
for _, _, files in os.walk(package_path):
for file in files:
if file.endswith(".py") and file != "__init__.py":
module = importlib.import_module(f"{package_path}.{file[:-3]}")
__register(module)
for route in app.routes:
try:
logger.debug(
f"{route.path}, {route.methods}, {route.__dict__.get('summary')}"
)
except AttributeError as e:
logger.error(e)
logger.info("👌路由注册完成✅。")