release: Elysia ToDo v1.0.0

鍏ㄦ爤涓汉淇℃伅绠$悊搴旂敤锛岄泦鎴愬緟鍔炰换鍔°€佷範鎯墦鍗°€佺邯蹇垫棩鎻愰啋銆佽祫浜ф€昏鍔熻兘銆

Made-with: Cursor
This commit is contained in:
祀梦
2026-03-14 22:21:26 +08:00
commit 2979197b1c
104 changed files with 21737 additions and 0 deletions

View 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
View 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
View 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
View 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")