2022-10-04 04:40:11 +00:00
|
|
|
|
import importlib
|
|
|
|
|
import inspect
|
|
|
|
|
import os
|
2022-09-16 17:11:21 +00:00
|
|
|
|
import random
|
|
|
|
|
|
2022-10-04 04:40:11 +00:00
|
|
|
|
from core.log import logger
|
|
|
|
|
|
2022-09-16 17:11:21 +00:00
|
|
|
|
|
2022-09-11 10:34:18 +00:00
|
|
|
|
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
|
2022-09-16 17:11:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_system_info():
|
|
|
|
|
"""获取系统信息"""
|
|
|
|
|
return {
|
|
|
|
|
"usage": {
|
|
|
|
|
"cpu": f"{random.random() * 100: .2}",
|
|
|
|
|
"memory": f"{random.random() * 100: .2}",
|
|
|
|
|
"disk": f"{random.random() * 100: .2}",
|
2022-09-17 09:57:09 +00:00
|
|
|
|
},
|
|
|
|
|
"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)}",
|
|
|
|
|
},
|
2022-09-16 17:11:21 +00:00
|
|
|
|
}
|
2022-10-04 04:40:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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("👌路由注册完成✅。")
|