ref(backend):controlle
This commit is contained in:
103
backend/core/dbhelper.py
Normal file
103
backend/core/dbhelper.py
Normal file
@@ -0,0 +1,103 @@
|
||||
"""数据库通用查询方法"""
|
||||
from typing import Optional
|
||||
|
||||
from tortoise import connections, models
|
||||
|
||||
|
||||
class DbHelper:
|
||||
def __init__(self, model: models.Model):
|
||||
"""
|
||||
初始化
|
||||
:param model: 模型类
|
||||
"""
|
||||
self.model = model
|
||||
|
||||
def __filter(self, kwargs: dict):
|
||||
"""
|
||||
过滤数据,默认过滤数据
|
||||
:param kwargs:
|
||||
:return:
|
||||
"""
|
||||
return self.model.filter(**kwargs)
|
||||
|
||||
async def select(self, kwargs: dict = None) -> Optional[models.Model]:
|
||||
"""
|
||||
查询符合条件的第一个对象, 查无结果时返回None
|
||||
:param kwargs: kwargs: {"name:"7y", "id": 1}
|
||||
:return: select * from model where name = "7y" and id = 1 limit 1
|
||||
"""
|
||||
if kwargs is None:
|
||||
kwargs = {}
|
||||
return await self.__filter(kwargs).first()
|
||||
|
||||
async def update(self, filters: dict = None, updates: dict = None):
|
||||
"""
|
||||
更新单条数据
|
||||
:param filters: 条件字典 {"id":1,"status__not": 9}
|
||||
:param updates: 待更新数据 {"status": 5}
|
||||
:return: 0 失败, 1 成功
|
||||
"""
|
||||
return await self.__filter(filters).update(**updates)
|
||||
|
||||
async def delete(self, pk: int) -> int:
|
||||
"""
|
||||
逻辑删除单条数据, status -> 9
|
||||
:param pk: 数据id
|
||||
:return: 0 是删除 失败, 1是删除成功
|
||||
"""
|
||||
filters = {"id": pk}
|
||||
updates = dict(status=9)
|
||||
return await self.update(filters=filters, updates=updates)
|
||||
|
||||
async def insert(self, data: dict):
|
||||
"""
|
||||
新增一条数据
|
||||
:param data: 模型字典
|
||||
:return: 新增之后的对象
|
||||
"""
|
||||
return await self.model.create(**data)
|
||||
|
||||
async def selects(
|
||||
self, offset: int, limit: int, kwargs: dict = None, order_by: str = None
|
||||
) -> dict:
|
||||
"""
|
||||
条件分页查询数据列表, 支持排序
|
||||
Args:
|
||||
offset: 偏移量
|
||||
limit: 数量
|
||||
kwargs: 条件 {}
|
||||
order_by: 排序,默认为None, 传入 -字段名 降序 字段名升序
|
||||
SQL => select * from model where xx=xx ... order by xx limit offset, limit
|
||||
Returns:
|
||||
{"items": Model列表, "total": "数量"}
|
||||
"""
|
||||
if kwargs is None:
|
||||
kwargs = {}
|
||||
objs = self.__filter(kwargs).all()
|
||||
if order_by is not None:
|
||||
objs = objs.order_by(order_by)
|
||||
|
||||
return dict(
|
||||
items=await objs.offset(offset).limit(limit), total=await objs.count()
|
||||
)
|
||||
|
||||
async def inserts(self, objs: list[models.Model]):
|
||||
"""
|
||||
批量新增数据
|
||||
:param objs: 模型列表
|
||||
:return:
|
||||
"""
|
||||
await self.model.bulk_create(objs)
|
||||
|
||||
@classmethod
|
||||
async def raw_sql(cls, sql: str, args: list = None):
|
||||
"""
|
||||
手动执行SQL
|
||||
:param sql:
|
||||
:param args: sql参数
|
||||
:return:
|
||||
"""
|
||||
db = connections.get("default")
|
||||
if args is None:
|
||||
args = []
|
||||
return await db.execute_query_dict(sql, args)
|
@@ -71,9 +71,11 @@ async def check_permissions(request: Request, user: UserModel = Depends(check_to
|
||||
active_rid = result["roles"][0]["id"]
|
||||
|
||||
# 白名单 登录用户信息, 登录用户菜单信息
|
||||
whitelist = [f"/user/{user.id}", f"/role/{active_rid}/menu"]
|
||||
flag = request.url.path in whitelist and request.method == "GET"
|
||||
if flag:
|
||||
whitelist = [(f"/user/{user.id}", "GET"), (f"/role/{active_rid}/menu", "GET")] + [
|
||||
(f"/user/role/{rid['id']}", "PUT") for rid in result["roles"]
|
||||
]
|
||||
|
||||
if (request.url.path, request.method) in whitelist:
|
||||
return user
|
||||
|
||||
api = request.url.path
|
||||
|
@@ -1,5 +1,10 @@
|
||||
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"
|
||||
@@ -43,3 +48,47 @@ def get_system_info():
|
||||
"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("👌路由注册完成✅。")
|
||||
|
Reference in New Issue
Block a user