release: Elysia ToDo v1.0.0
鍏ㄦ爤涓汉淇℃伅绠$悊搴旂敤锛岄泦鎴愬緟鍔炰换鍔°€佷範鎯墦鍗°€佺邯蹇垫棩鎻愰啋銆佽祫浜ф€昏鍔熻兘銆 Made-with: Cursor
This commit is contained in:
5
api/app/utils/__init__.py
Normal file
5
api/app/utils/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
||||
"""
|
||||
Utils 工具模块
|
||||
"""
|
||||
from app.utils.crud import get_or_404
|
||||
from app.utils.logger import logger
|
||||
34
api/app/utils/crud.py
Normal file
34
api/app/utils/crud.py
Normal file
@@ -0,0 +1,34 @@
|
||||
"""
|
||||
通用 CRUD 工具函数
|
||||
"""
|
||||
from typing import Type, TypeVar
|
||||
from fastapi import HTTPException
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.database import Base
|
||||
from app.utils.logger import logger
|
||||
|
||||
|
||||
ModelType = TypeVar("ModelType", bound=Base)
|
||||
|
||||
|
||||
def get_or_404(
|
||||
db: Session,
|
||||
model: Type[ModelType],
|
||||
item_id: int,
|
||||
name: str = "资源"
|
||||
) -> ModelType:
|
||||
"""
|
||||
获取实体,不存在时抛出 404 异常
|
||||
|
||||
Args:
|
||||
db: 数据库会话
|
||||
model: 模型类
|
||||
item_id: 实体 ID
|
||||
name: 实体名称(用于错误信息)
|
||||
"""
|
||||
item = db.query(model).filter(model.id == item_id).first()
|
||||
if not item:
|
||||
logger.warning(f"{name}不存在: id={item_id}")
|
||||
raise HTTPException(status_code=404, detail=f"{name}不存在")
|
||||
return item
|
||||
11
api/app/utils/datetime.py
Normal file
11
api/app/utils/datetime.py
Normal file
@@ -0,0 +1,11 @@
|
||||
from datetime import datetime, timezone, date
|
||||
|
||||
|
||||
def utcnow() -> datetime:
|
||||
"""统一获取 UTC 时间的工具函数"""
|
||||
return datetime.now(timezone.utc)
|
||||
|
||||
|
||||
def today() -> date:
|
||||
"""获取当天日期"""
|
||||
return date.today()
|
||||
48
api/app/utils/logger.py
Normal file
48
api/app/utils/logger.py
Normal file
@@ -0,0 +1,48 @@
|
||||
import logging
|
||||
import os
|
||||
from datetime import datetime
|
||||
from logging.handlers import TimedRotatingFileHandler
|
||||
|
||||
from app.config import LOG_LEVEL, LOG_DIR
|
||||
|
||||
# 确保日志目录存在
|
||||
os.makedirs(LOG_DIR, exist_ok=True)
|
||||
|
||||
|
||||
def setup_logger(name: str) -> logging.Logger:
|
||||
"""设置日志记录器"""
|
||||
logger = logging.getLogger(name)
|
||||
logger.setLevel(getattr(logging, LOG_LEVEL))
|
||||
|
||||
# 避免重复添加处理器
|
||||
if logger.handlers:
|
||||
return logger
|
||||
|
||||
# 日志格式
|
||||
formatter = logging.Formatter(
|
||||
"[%(asctime)s] [%(levelname)s] [%(name)s] %(message)s",
|
||||
datefmt="%Y-%m-%d %H:%M:%S"
|
||||
)
|
||||
|
||||
# 控制台处理器
|
||||
console_handler = logging.StreamHandler()
|
||||
console_handler.setFormatter(formatter)
|
||||
logger.addHandler(console_handler)
|
||||
|
||||
# 文件处理器(按日期分割)
|
||||
log_file = os.path.join(LOG_DIR, "app.log")
|
||||
file_handler = TimedRotatingFileHandler(
|
||||
log_file,
|
||||
when="midnight",
|
||||
interval=1,
|
||||
backupCount=30,
|
||||
encoding="utf-8"
|
||||
)
|
||||
file_handler.setFormatter(formatter)
|
||||
logger.addHandler(file_handler)
|
||||
|
||||
return logger
|
||||
|
||||
|
||||
# 创建日志记录器
|
||||
logger = setup_logger("app")
|
||||
Reference in New Issue
Block a user