diff --git a/.env b/.env
deleted file mode 100644
index 7fd8a41..0000000
--- a/.env
+++ /dev/null
@@ -1,9 +0,0 @@
-LOG_LEVEL=DEBUG
-
-DB_USER=root
-DB_PASSWORD=estun%40medical
-#DB_PASSWORD=19940822Cxx%401213
-DB_HOST=localhost
-#DB_HOST=host.docker.internal
-DB_PORT=3306
-DB_NAME=blog
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 7ddac70..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,68 +0,0 @@
-# Python 字节码文件
-__pycache__/
-*.py[cod]
-*$py.class
-
-# C 扩展
-*.so
-
-# 分发/打包
-.Python
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-wheels/
-*.egg-info/
-.installed.cfg
-*.egg
-
-# 虚拟环境
-venv/
-env/
-ENV/
-.env
-.venv
-
-# 测试
-htmlcov/
-.tox/
-.nox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*.cover
-.hypothesis/
-
-# Django 相关
-*.log
-local_settings.py
-db.sqlite3
-db.sqlite3-journal
-media/
-
-# PyCharm IDE
-.idea/
-*.iml
-*.iws
-*.ipr
-
-# VS Code
-.vscode/
-*.code-workspace
-.history/
-
-# 其他
-.DS_Store
-
-logs/
-packages/
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 13566b8..0000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Editor-based HTTP Client requests
-/httpRequests/
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
diff --git a/.idea/blog-service.iml b/.idea/blog-service.iml
deleted file mode 100644
index a1348d4..0000000
--- a/.idea/blog-service.iml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
deleted file mode 100644
index 105ce2d..0000000
--- a/.idea/inspectionProfiles/profiles_settings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 93e34b1..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 90c2e3f..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 35eb1dd..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 19295d7..0000000
--- a/Dockerfile
+++ /dev/null
@@ -1,8 +0,0 @@
-FROM python:3.12-slim
-WORKDIR /app
-COPY ./packages /app/packages
-COPY requirements.txt /app/
-RUN pip install --no-cache-dir --no-index --find-links=/app/packages -r requirements.txt
-COPY . /app/
-EXPOSE 8082
-CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8082"]
\ No newline at end of file
diff --git a/__pycache__/main.cpython-310.pyc b/__pycache__/main.cpython-310.pyc
deleted file mode 100644
index d49dc00..0000000
Binary files a/__pycache__/main.cpython-310.pyc and /dev/null differ
diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc
deleted file mode 100644
index d04da14..0000000
Binary files a/__pycache__/main.cpython-312.pyc and /dev/null differ
diff --git a/api/__init__.py b/api/__init__.py
deleted file mode 100644
index 70bac50..0000000
--- a/api/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from fastapi import FastAPI
-from .blog import router as blog_router
-from .session import router as session_router
-
-def register_routers(app: FastAPI):
- app.include_router(blog_router, prefix="")
- app.include_router(session_router, prefix="")
diff --git a/api/__pycache__/__init__.cpython-310.pyc b/api/__pycache__/__init__.cpython-310.pyc
deleted file mode 100644
index 51d8d64..0000000
Binary files a/api/__pycache__/__init__.cpython-310.pyc and /dev/null differ
diff --git a/api/__pycache__/__init__.cpython-312.pyc b/api/__pycache__/__init__.cpython-312.pyc
deleted file mode 100644
index bf0e5cc..0000000
Binary files a/api/__pycache__/__init__.cpython-312.pyc and /dev/null differ
diff --git a/api/__pycache__/blog.cpython-310.pyc b/api/__pycache__/blog.cpython-310.pyc
deleted file mode 100644
index 5f6706b..0000000
Binary files a/api/__pycache__/blog.cpython-310.pyc and /dev/null differ
diff --git a/api/__pycache__/blog.cpython-312.pyc b/api/__pycache__/blog.cpython-312.pyc
deleted file mode 100644
index f8d81e6..0000000
Binary files a/api/__pycache__/blog.cpython-312.pyc and /dev/null differ
diff --git a/api/blog.py b/api/blog.py
deleted file mode 100644
index 12449ff..0000000
--- a/api/blog.py
+++ /dev/null
@@ -1,82 +0,0 @@
-from typing import List
-
-from fastapi import APIRouter, Depends, Query, Request
-from sqlalchemy.orm import Session
-
-from config.auth import verify_token
-from schemas.blog import BlogResponse, BlogQuery, BlogCategoryResponse, BlogStatsResponse, \
- BlogLatestResponse, BlogCommentCreate, BlogCommentResponse, BlogVisitResponse, BlogCreate, BlogUpdate
-from schemas.pagination import PageResult
-from config.database import get_db
-from service import blog_service
-
-router = APIRouter(
- prefix="/blog",
- tags=["博客管理"],
- responses={404: {"description": "Not found"}}
-)
-
-
-@router.get("/page", summary="分页查询博客", response_model=PageResult[BlogResponse])
-def query_blog_by_page(current_page: int = Query(1, ge=1, alias="currentPage", description="当前页码"),
- page_size: int = Query(10, ge=1, le=100, alias="pageSize", description="每页数量"),
- db: Session = Depends(get_db)):
- return blog_service.query_blog_by_page(db, current_page, page_size)
-
-
-@router.get("/condition", summary="条件查询博客", response_model=List[BlogResponse])
-def query_blog_by_condition(query: BlogQuery = Depends(),
- db: Session = Depends(get_db)):
- return blog_service.query_blog_by_condition(db, query)
-
-
-@router.get("/content/{blog_id}", summary="查询博客内容", response_model=BlogResponse)
-def query_blog_by_id(blog_id: int, db: Session = Depends(get_db)):
- return blog_service.query_blog_by_id(db, blog_id)
-
-
-@router.post("", summary="新增博客内容", response_model=bool)
-def add_blog(blog: BlogCreate, db: Session = Depends(get_db), _ = Depends(verify_token)):
- return blog_service.add_blog(db, blog)
-
-
-@router.put("/{blog_id}", summary="更新博客内容", response_model=bool)
-def update_blog(blog_id: int, blog: BlogUpdate, db: Session = Depends(get_db), _ = Depends(verify_token)):
- return blog_service.update_blog(db, blog_id, blog)
-
-
-@router.delete("/{blog_id}", summary="删除博客内容", response_model=bool)
-def delete_blog(blog_id: int, db: Session = Depends(get_db), _ = Depends(verify_token)):
- return blog_service.delete_blog(db, blog_id)
-
-
-@router.get("/category", summary="查询博客分类", response_model=List[BlogCategoryResponse])
-def query_blog_category(db: Session = Depends(get_db)):
- return blog_service.query_blog_category(db)
-
-
-@router.get("/stats", summary="查询博客统计信息", response_model=BlogStatsResponse)
-def query_blog_stats(db: Session = Depends(get_db)):
- return blog_service.query_blog_stats(db)
-
-
-@router.get("/visit", summary="查询博客访问信息", response_model=PageResult[BlogVisitResponse])
-def query_blog_visit(current_page: int = Query(1, ge=1, alias="currentPage", description="当前页码"),
- page_size: int = Query(10, ge=1, le=100, alias="pageSize", description="每页数量"),
- db: Session = Depends(get_db)):
- return blog_service.query_blog_visit(db, current_page, page_size)
-
-
-@router.get("/latest", summary="查询近期博客", response_model=list[BlogLatestResponse])
-def query_blog_latest(db: Session = Depends(get_db)):
- return blog_service.query_blog_latest(db)
-
-
-@router.put("/comment", summary="新增博客评论", response_model=bool)
-def add_blog_comment(blog_comment: BlogCommentCreate, request: Request, db: Session = Depends(get_db)):
- return blog_service.add_blog_comment(db, request, blog_comment)
-
-
-@router.get("/comment/{blog_id}", summary="查询博客评论", response_model=list[BlogCommentResponse])
-def query_blog_comment(blog_id: int, db: Session = Depends(get_db)):
- return blog_service.query_blog_comment(db, blog_id)
diff --git a/api/session.py b/api/session.py
deleted file mode 100644
index 1a459ca..0000000
--- a/api/session.py
+++ /dev/null
@@ -1,18 +0,0 @@
-from fastapi import APIRouter, Depends
-from fastapi.security import OAuth2PasswordRequestForm
-from sqlalchemy.orm import Session
-
-from config.database import get_db
-from schemas.session import SessionResponse
-from service import session_service
-
-router = APIRouter(
- prefix="/session",
- tags=["会话"],
- responses={404: {"description": "Not found"}}
-)
-
-
-@router.post("", summary="创建会话", response_model=SessionResponse)
-def create(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)):
- return session_service.create(db, form_data.username, form_data.password)
diff --git a/config/__pycache__/auth.cpython-310.pyc b/config/__pycache__/auth.cpython-310.pyc
deleted file mode 100644
index 022e18a..0000000
Binary files a/config/__pycache__/auth.cpython-310.pyc and /dev/null differ
diff --git a/config/__pycache__/auth.cpython-312.pyc b/config/__pycache__/auth.cpython-312.pyc
deleted file mode 100644
index f003779..0000000
Binary files a/config/__pycache__/auth.cpython-312.pyc and /dev/null differ
diff --git a/config/__pycache__/database.cpython-310.pyc b/config/__pycache__/database.cpython-310.pyc
deleted file mode 100644
index 0063898..0000000
Binary files a/config/__pycache__/database.cpython-310.pyc and /dev/null differ
diff --git a/config/__pycache__/database.cpython-312.pyc b/config/__pycache__/database.cpython-312.pyc
deleted file mode 100644
index 48e6e5f..0000000
Binary files a/config/__pycache__/database.cpython-312.pyc and /dev/null differ
diff --git a/config/__pycache__/logging.cpython-310.pyc b/config/__pycache__/logging.cpython-310.pyc
deleted file mode 100644
index 18cc997..0000000
Binary files a/config/__pycache__/logging.cpython-310.pyc and /dev/null differ
diff --git a/config/__pycache__/logging.cpython-312.pyc b/config/__pycache__/logging.cpython-312.pyc
deleted file mode 100644
index 1292149..0000000
Binary files a/config/__pycache__/logging.cpython-312.pyc and /dev/null differ
diff --git a/config/__pycache__/setting.cpython-310.pyc b/config/__pycache__/setting.cpython-310.pyc
deleted file mode 100644
index d49b9cc..0000000
Binary files a/config/__pycache__/setting.cpython-310.pyc and /dev/null differ
diff --git a/config/__pycache__/setting.cpython-312.pyc b/config/__pycache__/setting.cpython-312.pyc
deleted file mode 100644
index 2409b07..0000000
Binary files a/config/__pycache__/setting.cpython-312.pyc and /dev/null differ
diff --git a/config/auth.py b/config/auth.py
deleted file mode 100644
index 5a761ef..0000000
--- a/config/auth.py
+++ /dev/null
@@ -1,85 +0,0 @@
-from contextvars import ContextVar
-from datetime import datetime, timedelta
-from typing import Optional
-
-from fastapi import Depends
-from fastapi.security import OAuth2PasswordBearer
-import jwt
-from passlib.context import CryptContext
-
-from middleware.exceptions import get_credentials_exception
-
-# 密钥和算法配置
-SECRET_KEY = "sjdi@!#3ksj2780se1283"
-ALGORITHM = "HS256"
-ACCESS_TOKEN_EXPIRE_MINUTES = 30
-
-# 密码哈希上下文
-pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
-
-# OAuth2 方案
-# 设置默认登录接口
-oauth2_scheme = OAuth2PasswordBearer(tokenUrl="session")
-
-# 请求上下文
-context_sub: ContextVar[str] = ContextVar('sub')
-
-
-# 获取数据库 加密密码
-def get_password_hash(password: str):
- return pwd_context.hash(password)
-
-
-# 验证数据库密码
-def verify_password(plain_password: str, hashed_password: str):
- return pwd_context.verify(plain_password, hashed_password)
-
-
-# 生成payload
-def create_payload(sub: str) -> dict:
- return {
- "sub": sub
- }
-
-
-# 验证payload
-def verify_payload(payload: dict) -> bool:
- return "sub" in payload
-
-
-# 从payload中获取用户
-def get_payload_sub(payload: dict) -> str:
- return payload["sub"]
-
-
-# 创建token
-def create_token(payload: dict, expires_delta: Optional[timedelta] = None):
- # 复制一份
- payload_copy = payload.copy()
-
- # 加上有效时间
- if expires_delta:
- expire = datetime.now() + expires_delta
- else:
- expire = datetime.now() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
- payload_copy.update({"exp": expire})
-
- # 生成jwt Token
- return jwt.encode(payload_copy, SECRET_KEY, algorithm=ALGORITHM)
-
-
-# 验证token
-async def verify_token(token: str = Depends(oauth2_scheme)):
- try:
- # 1. 检验token信息
- payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
- # 2. 校验payload信息
- if not verify_payload(payload):
- raise get_credentials_exception()
- # 3. 校验数据库中是否存在 payload中的账户信息
- sub = get_payload_sub(payload)
-
- # 4. 存储账户信息
- context_sub.set(sub)
- except jwt.exceptions.InvalidTokenError:
- raise get_credentials_exception()
diff --git a/config/database.py b/config/database.py
deleted file mode 100644
index e600cb2..0000000
--- a/config/database.py
+++ /dev/null
@@ -1,23 +0,0 @@
-from sqlalchemy import create_engine
-from sqlalchemy.ext.declarative import declarative_base
-from sqlalchemy.orm import sessionmaker
-
-from config.setting import settings
-
-DATABASE_URL = f"mysql+pymysql://{settings.DB_USER}:{settings.DB_PASSWORD}@{settings.DB_HOST}:{settings.DB_PORT}/{settings.DB_NAME}"
-
-engine = create_engine(url=DATABASE_URL)
-
-# 会话工厂
-SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
-# ORM基类
-Base = declarative_base()
-
-
-def get_db():
- # 创建数据库会话实例
- db = SessionLocal()
- try:
- yield db
- finally:
- db.close()
diff --git a/config/logging.py b/config/logging.py
deleted file mode 100644
index 4f834d9..0000000
--- a/config/logging.py
+++ /dev/null
@@ -1,65 +0,0 @@
-from loguru import logger
-from pathlib import Path
-
-from config.setting import settings
-
-# 日志目录
-LOG_DIR = Path(__file__).parent.parent.parent / "logs"
-LOG_DIR.mkdir(exist_ok=True)
-
-# 日志级别
-LOG_LEVEL = settings.LOG_LEVEL.upper()
-
-# 日志格式
-STDOUT_FORMAT = (
- "{time:YYYY-MM-DD HH:mm:ss.SSS} | "
- "{level: <8} | "
- "{name}:{function}:{line} - "
- "{message}"
-)
-
-FILE_FORMAT = (
- "{time:YYYY-MM-DD HH:mm:ss.SSS} | "
- "{level: <8} | "
- "{name}:{function}:{line} - {message}"
-)
-
-# 移除默认处理器
-logger.remove()
-
-# 添加控制台处理器
-logger.add(
- sink="sys.stdout",
- level=LOG_LEVEL,
- format=STDOUT_FORMAT,
- colorize=True,
- backtrace=True, # 显示完整异常堆栈
- diagnose=True, # 显示详细异常信息
-)
-
-# 添加文件处理器 - 常规日志
-logger.add(
- sink=LOG_DIR / "app.log",
- level="INFO",
- format=FILE_FORMAT,
- rotation="10 MB", # 日志文件大小达到10MB时自动分割
- retention="7 days", # 保留7天的日志
- compression="zip", # 归档时压缩为zip
- enqueue=True, # 异步写入
- serialize=False, # 不使用JSON格式
-)
-
-# 添加文件处理器 - 错误日志
-logger.add(
- sink=LOG_DIR / "error.log",
- level="ERROR",
- format=FILE_FORMAT,
- rotation="10 MB",
- retention="30 days",
- compression="zip",
- enqueue=True,
- serialize=False,
-)
-
-# 导出配置好的logger
-__all__ = ["logger"]
\ No newline at end of file
diff --git a/config/setting.py b/config/setting.py
deleted file mode 100644
index 6f53870..0000000
--- a/config/setting.py
+++ /dev/null
@@ -1,19 +0,0 @@
-from pydantic_settings import BaseSettings
-
-
-class Settings(BaseSettings):
- DB_HOST: str
- DB_PORT: int
- DB_USER: str
- DB_PASSWORD: str
- DB_NAME: str
-
- LOG_LEVEL: str
-
- class Config:
- env_file = ".env" # 指定.env文件路径
- case_sensitive = False # 忽略变量名大小写
-
-
-# 全局配置实例
-settings = Settings()
diff --git a/id_generator/__init__.py b/id_generator/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/id_generator/__pycache__/__init__.cpython-310.pyc b/id_generator/__pycache__/__init__.cpython-310.pyc
deleted file mode 100644
index 70aa14f..0000000
Binary files a/id_generator/__pycache__/__init__.cpython-310.pyc and /dev/null differ
diff --git a/id_generator/__pycache__/__init__.cpython-312.pyc b/id_generator/__pycache__/__init__.cpython-312.pyc
deleted file mode 100644
index 11d9d6e..0000000
Binary files a/id_generator/__pycache__/__init__.cpython-312.pyc and /dev/null differ
diff --git a/id_generator/__pycache__/generator.cpython-310.pyc b/id_generator/__pycache__/generator.cpython-310.pyc
deleted file mode 100644
index 7dc444c..0000000
Binary files a/id_generator/__pycache__/generator.cpython-310.pyc and /dev/null differ
diff --git a/id_generator/__pycache__/generator.cpython-312.pyc b/id_generator/__pycache__/generator.cpython-312.pyc
deleted file mode 100644
index 46918d5..0000000
Binary files a/id_generator/__pycache__/generator.cpython-312.pyc and /dev/null differ
diff --git a/id_generator/__pycache__/options.cpython-310.pyc b/id_generator/__pycache__/options.cpython-310.pyc
deleted file mode 100644
index 622877f..0000000
Binary files a/id_generator/__pycache__/options.cpython-310.pyc and /dev/null differ
diff --git a/id_generator/__pycache__/options.cpython-312.pyc b/id_generator/__pycache__/options.cpython-312.pyc
deleted file mode 100644
index 6787315..0000000
Binary files a/id_generator/__pycache__/options.cpython-312.pyc and /dev/null differ
diff --git a/id_generator/__pycache__/snowflake.cpython-310.pyc b/id_generator/__pycache__/snowflake.cpython-310.pyc
deleted file mode 100644
index 2e69c12..0000000
Binary files a/id_generator/__pycache__/snowflake.cpython-310.pyc and /dev/null differ
diff --git a/id_generator/__pycache__/snowflake.cpython-312.pyc b/id_generator/__pycache__/snowflake.cpython-312.pyc
deleted file mode 100644
index 8fbb8ff..0000000
Binary files a/id_generator/__pycache__/snowflake.cpython-312.pyc and /dev/null differ
diff --git a/id_generator/__pycache__/snowflake_m1.cpython-310.pyc b/id_generator/__pycache__/snowflake_m1.cpython-310.pyc
deleted file mode 100644
index 33c9cb1..0000000
Binary files a/id_generator/__pycache__/snowflake_m1.cpython-310.pyc and /dev/null differ
diff --git a/id_generator/__pycache__/snowflake_m1.cpython-312.pyc b/id_generator/__pycache__/snowflake_m1.cpython-312.pyc
deleted file mode 100644
index 787690c..0000000
Binary files a/id_generator/__pycache__/snowflake_m1.cpython-312.pyc and /dev/null differ
diff --git a/id_generator/generator.py b/id_generator/generator.py
deleted file mode 100644
index fc995d7..0000000
--- a/id_generator/generator.py
+++ /dev/null
@@ -1,38 +0,0 @@
-"""
-雪花算法生成器IdGenerator
-"""
-
-# !/usr/bin/python
-# coding=UTF-8
-
-
-from . import options
-from . import snowflake_m1
-
-
-class DefaultIdGenerator:
- """
- ID生成器
- """
-
- def __init__(self):
- self.snowflake = None
-
- def set_id_generator(self, option: options.IdGeneratorOptions):
- """
- 设置id生成规则信息
- """
-
- if option.base_time < 100000:
- raise ValueError("base time error.")
-
- self.snowflake = snowflake_m1.SnowFlakeM1(option)
-
- def next_id(self) -> int:
- """
- 获取新的UUID
- """
-
- if self.snowflake is None:
- raise ValueError("please set id generator at first.")
- return self.snowflake.next_id()
diff --git a/id_generator/idregister.py b/id_generator/idregister.py
deleted file mode 100644
index 787faac..0000000
--- a/id_generator/idregister.py
+++ /dev/null
@@ -1,134 +0,0 @@
-"""
-worker id generator
-"""
-
-# !/usr/bin/python
-# coding=UTF-8
-
-
-from threading import Thread
-import time
-import logging
-import redis
-
-
-class Register:
- """
- redis封装
- - host 代表redis ip
- - port 代表redis端口
- - max_worker_id worker_id的最大值, 默认为100
- - password redis的密码, 默认为空
- """
-
- def __init__(self, host, port, max_worker_id=100, password=None):
- self.redis_impl = redis.StrictRedis(host=host, port=port, db=0, password=password)
- self.loop_count = 0
- self.max_loop_count = 10
- self.worker_id_expire_time = 15
- self.max_worker_id = max_worker_id
- self.worker_id = -1
- self.is_stop = False
-
- def get_lock(self, key):
- """
- 获取分布式全局锁,并设置过期时间为30秒
- """
-
- if self.redis_impl.setnx(key, 1):
- self.redis_impl.expire(key, 30)
- return True
- if self.redis_impl.ttl(key) < 0:
- self.redis_impl.expire(key, 30)
- return False
-
- def stop(self):
- """
- 退出注册器的线程
- """
-
- self.is_stop = True
-
- def get_worker_id(self):
- """
- 获取全局唯一worker_id, 会创建一个线程给worker id续期
- 失败返回-1
- """
-
- self.loop_count = 0
-
- def extern_life(my_id):
- while 1:
- time.sleep(self.worker_id_expire_time / 3)
- # 是否关闭了
- if self.is_stop:
- return
- # 更新生命周期
- if self.worker_id != my_id:
- break
- try:
- self.redis_impl.expire(
- f"IdGen:WorkerId:Value:{my_id}",
- self.worker_id_expire_time)
- except Exception as exe:
- logging.error(exe)
- continue
-
- self.worker_id = self.__get_next_worker_id()
- if self.worker_id > -1:
- Thread(target=extern_life, args=[self.worker_id]).start()
- return self.worker_id
-
- def __get_next_worker_id(self):
- """
- 获取全局唯一worker id内部实现
- """
-
- cur = self.redis_impl.incrby("IdGen:WorkerId:Index", 1)
-
- def can_reset():
- try:
- reset_value = self.redis_impl.incr("IdGen:WorkerId:Value:Edit")
- return reset_value != 1
- except Exception as ept:
- logging.error(ept)
- return False
-
- def end_reset():
- try:
- self.redis_impl.set("IdGen:WorkerId:Value:Edit", 0)
- except Exception as ept:
- logging.error(ept)
-
- def is_available(worker_id: int):
- try:
- rst = self.redis_impl.get(f"IdGen:WorkerId:Value:{worker_id}")
- return rst != "Y"
- except Exception as ept:
- logging.error(ept)
- return False
-
- if cur > self.max_worker_id:
- if can_reset():
- self.redis_impl.set("IdGen:WorkerId:Index", -1)
- end_reset()
- self.loop_count += 1
-
- if self.loop_count > self.max_loop_count:
- self.loop_count = 0
- return -1
-
- time.sleep(0.2 * self.loop_count)
- return self.__get_next_worker_id()
- time.sleep(0.2)
- return self.__get_next_worker_id()
- if is_available(cur):
- self.redis_impl.setex(
- f"IdGen:WorkerId:Value:{cur}",
- self.worker_id_expire_time,
- "Y"
- )
- self.loop_count = 0
- return cur
-
- return self.__get_next_worker_id()
diff --git a/id_generator/options.py b/id_generator/options.py
deleted file mode 100644
index 8558381..0000000
--- a/id_generator/options.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""
-生成器IdGenerator配置选项
-"""
-
-# !/usr/bin/python
-# coding=UTF-8
-
-
-class IdGeneratorOptions:
- """
- ID生成器配置
- - worker_id 全局唯一id, 区分不同uuid生成器实例
- - worker_id_bit_length 生成的uuid中worker_id占用的位数
- - seq_bit_length 生成的uuid中序列号占用的位数
- """
-
- def __init__(self, worker_id=0, worker_id_bit_length=6, seq_bit_length=6):
-
- # 雪花计算方法,(1-漂移算法|2-传统算法), 默认1。目前只实现了1。
- self.method = 1
-
- # 基础时间(ms单位), 不能超过当前系统时间
- self.base_time = 1582136402000
-
- # 机器码, 必须由外部设定, 最大值 2^worker_id_bit_length-1
- self.worker_id = worker_id
-
- # 机器码位长, 默认值6, 取值范围 [1, 15](要求:序列数位长+机器码位长不超过22)
- self.worker_id_bit_length = worker_id_bit_length
-
- # 序列数位长, 默认值6, 取值范围 [3, 21](要求:序列数位长+机器码位长不超过22)
- self.seq_bit_length = seq_bit_length
-
- # 最大序列数(含), 设置范围 [max_seq_number, 2^seq_bit_length-1]
- # 默认值0, 表示最大序列数取最大值(2^seq_bit_length-1])
- self.max_seq_number = 0
-
- # 最小序列数(含), 默认值5, 取值范围 [5, max_seq_number], 每毫秒的前5个序列数对应编号0-4是保留位
- # 其中1-4是时间回拨相应预留位, 0是手工新值预留位
- self.min_seq_number = 5
-
- # 最大漂移次数(含), 默认2000, 推荐范围500-10000(与计算能力有关)
- self.top_over_cost_count = 2000
diff --git a/id_generator/snowflake.py b/id_generator/snowflake.py
deleted file mode 100644
index ea36cfa..0000000
--- a/id_generator/snowflake.py
+++ /dev/null
@@ -1,20 +0,0 @@
-
-"""
-雪花算法生成器接口声明
-"""
-
-# !/usr/bin/python
-# coding=UTF-8
-
-
-class SnowFlake():
-
- def __init__(self, options):
- self.options = options
-
- def next_id(self) -> int:
- """
- 获取新的UUID
- """
-
- return 0
diff --git a/id_generator/snowflake_m1.py b/id_generator/snowflake_m1.py
deleted file mode 100644
index 596b76d..0000000
--- a/id_generator/snowflake_m1.py
+++ /dev/null
@@ -1,147 +0,0 @@
-"""
-M1生成器
-"""
-
-# !/usr/bin/python
-# coding=UTF-8
-
-import threading
-import time
-from .snowflake import SnowFlake
-from .options import IdGeneratorOptions
-
-
-class SnowFlakeM1(SnowFlake):
- """
- M1规则ID生成器配置
- """
-
- def __init__(self, options: IdGeneratorOptions):
- # 1.base_time
- self.base_time = 1582136402000
- if options.base_time != 0:
- self.base_time = int(options.base_time)
-
- # 2.worker_id_bit_length
- self.worker_id_bit_length = 6
- if options.worker_id_bit_length != 0:
- self.worker_id_bit_length = int(options.worker_id_bit_length)
-
- # 3.worker_id
- self.worker_id = options.worker_id
-
- # 4.seq_bit_length
- self.seq_bit_length = 6
- if options.seq_bit_length != 0:
- self.seq_bit_length = int(options.seq_bit_length)
-
- # 5.max_seq_number
- self.max_seq_number = int(options.max_seq_number)
- if options.max_seq_number <= 0:
- self.max_seq_number = (1 << self.seq_bit_length) - 1
-
- # 6.min_seq_number
- self.min_seq_number = int(options.min_seq_number)
-
- # 7.top_over_cost_count
- self.top_over_cost_count = int(options.top_over_cost_count)
-
- # 8.Others
- self.__timestamp_shift = self.worker_id_bit_length + self.seq_bit_length
- self.__current_seq_number = self.min_seq_number
- self.__last_time_tick: int = 0
- self.__turn_back_time_tick: int = 0
- self.__turn_back_index: int = 0
- self.__is_over_cost = False
- self.___over_cost_count_in_one_term: int = 0
- self.__id_lock = threading.Lock()
-
- def __next_over_cost_id(self) -> int:
- current_time_tick = self.__get_current_time_tick()
- if current_time_tick > self.__last_time_tick:
- self.__last_time_tick = current_time_tick
- self.__current_seq_number = self.min_seq_number
- self.__is_over_cost = False
- self.___over_cost_count_in_one_term = 0
- return self.__calc_id(self.__last_time_tick)
-
- if self.___over_cost_count_in_one_term >= self.top_over_cost_count:
- self.__last_time_tick = self.__get_next_time_tick()
- self.__current_seq_number = self.min_seq_number
- self.__is_over_cost = False
- self.___over_cost_count_in_one_term = 0
- return self.__calc_id(self.__last_time_tick)
-
- if self.__current_seq_number > self.max_seq_number:
- self.__last_time_tick += 1
- self.__current_seq_number = self.min_seq_number
- self.__is_over_cost = True
- self.___over_cost_count_in_one_term += 1
- return self.__calc_id(self.__last_time_tick)
-
- return self.__calc_id(self.__last_time_tick)
-
- def __next_normal_id(self) -> int:
- current_time_tick = self.__get_current_time_tick()
- if current_time_tick < self.__last_time_tick:
- if self.__turn_back_time_tick < 1:
- self.__turn_back_time_tick = self.__last_time_tick - 1
- self.__turn_back_index += 1
- # 每毫秒序列数的前5位是预留位, 0用于手工新值, 1-4是时间回拨次序
- # 支持4次回拨次序(避免回拨重叠导致ID重复), 可无限次回拨(次序循环使用)。
- if self.__turn_back_index > 4:
- self.__turn_back_index = 1
-
- return self.__calc_turn_back_id(self.__turn_back_time_tick)
-
- # 时间追平时, _TurnBackTimeTick清零
- self.__turn_back_time_tick = min(self.__turn_back_time_tick, 0)
-
- if current_time_tick > self.__last_time_tick:
- self.__last_time_tick = current_time_tick
- self.__current_seq_number = self.min_seq_number
- return self.__calc_id(self.__last_time_tick)
-
- if self.__current_seq_number > self.max_seq_number:
- self.__last_time_tick += 1
- self.__current_seq_number = self.min_seq_number
- self.__is_over_cost = True
- self.___over_cost_count_in_one_term = 1
- return self.__calc_id(self.__last_time_tick)
-
- return self.__calc_id(self.__last_time_tick)
-
- def __calc_id(self, use_time_tick) -> int:
- self.__current_seq_number += 1
- return (
- (use_time_tick << self.__timestamp_shift) +
- (self.worker_id << self.seq_bit_length) +
- self.__current_seq_number
- ) % int(1e64)
-
- def __calc_turn_back_id(self, use_time_tick) -> int:
- self.__turn_back_time_tick -= 1
- return (
- (use_time_tick << self.__timestamp_shift) +
- (self.worker_id << self.seq_bit_length) +
- self.__turn_back_index
- ) % int(1e64)
-
- def __get_current_time_tick(self) -> int:
- return int((time.time_ns() / 1e6) - self.base_time)
-
- def __get_next_time_tick(self) -> int:
- temp_time_ticker = self.__get_current_time_tick()
- while temp_time_ticker <= self.__last_time_tick:
- # 0.001 = 1 mili sec
- time.sleep(0.001)
- temp_time_ticker = self.__get_current_time_tick()
- return temp_time_ticker
-
- def next_id(self) -> int:
- with self.__id_lock:
- if self.__is_over_cost:
- nextid = self.__next_over_cost_id()
- else:
- nextid = self.__next_normal_id()
- return nextid
diff --git a/main.py b/main.py
deleted file mode 100644
index e01f3bb..0000000
--- a/main.py
+++ /dev/null
@@ -1,14 +0,0 @@
-from fastapi import FastAPI
-
-from api import register_routers
-from middleware.blog_visit_middleware import blog_visit_middleware
-from middleware.exceptions import global_exception_handler
-
-app = FastAPI(title="Blog Service")
-
-# 加载中间件
-app.middleware("http")(global_exception_handler)
-app.middleware("http")(blog_visit_middleware)
-
-# 挂载API
-register_routers(app)
\ No newline at end of file
diff --git a/middleware/__pycache__/blog_visit_middleware.cpython-310.pyc b/middleware/__pycache__/blog_visit_middleware.cpython-310.pyc
deleted file mode 100644
index 79f58e4..0000000
Binary files a/middleware/__pycache__/blog_visit_middleware.cpython-310.pyc and /dev/null differ
diff --git a/middleware/__pycache__/blog_visit_middleware.cpython-312.pyc b/middleware/__pycache__/blog_visit_middleware.cpython-312.pyc
deleted file mode 100644
index 26d6612..0000000
Binary files a/middleware/__pycache__/blog_visit_middleware.cpython-312.pyc and /dev/null differ
diff --git a/middleware/__pycache__/exceptions.cpython-310.pyc b/middleware/__pycache__/exceptions.cpython-310.pyc
deleted file mode 100644
index f6e42c5..0000000
Binary files a/middleware/__pycache__/exceptions.cpython-310.pyc and /dev/null differ
diff --git a/middleware/__pycache__/exceptions.cpython-312.pyc b/middleware/__pycache__/exceptions.cpython-312.pyc
deleted file mode 100644
index 279b97a..0000000
Binary files a/middleware/__pycache__/exceptions.cpython-312.pyc and /dev/null differ
diff --git a/middleware/blog_visit_middleware.py b/middleware/blog_visit_middleware.py
deleted file mode 100644
index 64a671e..0000000
--- a/middleware/blog_visit_middleware.py
+++ /dev/null
@@ -1,41 +0,0 @@
-import re
-from fastapi import Request
-
-from models.blog import BlogVisit
-from service import blog_service
-from utils.blog_utils import get_user_agent_info, get_client_ip
-from config.database import SessionLocal
-from middleware.exceptions import AppException
-
-
-async def blog_visit_middleware(request: Request, call_next):
- # 检查路径是否匹配 /blog/content/{blog_id}
- if match := re.match(r"^/blog/content/(\d+)$", request.url.path):
- # 获取客户端信息
- ip = get_client_ip(request)
- user_agent = request.headers.get("User-Agent", "")
- os, browser = get_user_agent_info(user_agent)
- blog_id = int(match.group(1))
-
- # 创建访问记录
- blog_visit = BlogVisit(
- ip=ip,
- os=os,
- browser=browser,
- uri=request.url.path,
- blog_id=blog_id
- )
-
- db = SessionLocal()
- try:
- blog_service.add_blog_visit(db, blog_visit)
- db.commit()
- except Exception as e:
- db.rollback()
- raise AppException(f"新增博客{blog_id}访问记录失败: {e}")
- finally:
- db.close()
-
- # 继续处理请求
- response = await call_next(request)
- return response
diff --git a/middleware/exceptions.py b/middleware/exceptions.py
deleted file mode 100644
index 1fdbf50..0000000
--- a/middleware/exceptions.py
+++ /dev/null
@@ -1,54 +0,0 @@
-from fastapi import Request, HTTPException, status
-from fastapi.responses import JSONResponse
-from sqlalchemy.exc import SQLAlchemyError
-from config.logging import logger
-
-
-# 自定义异常类
-class AppException(Exception):
- def __init__(self, message: str, details=None):
- self.message = message
- self.details = details
-
-
-# 全局异常处理中间件
-async def global_exception_handler(request: Request, call_next):
- try:
- # 记录请求信息(可选)
- logger.info(f"请求: {request.method} {request.url}")
- if request.query_params:
- logger.info(f"查询参数: {dict(request.query_params)}")
-
- response = await call_next(request)
-
- # 记录响应信息(可选)
- if response.status_code >= 400:
- logger.warning(f"响应: {response.status_code}")
-
- return response
-
- except AppException as e:
- # 记录业务异常
- logger.error(f"业务异常: {e.message} - 详情: {e.details}")
- return JSONResponse(status_code=status.HTTP_400_BAD_REQUEST,
- content={"message": e.message, "details": e.details})
-
- except SQLAlchemyError as e:
- # 记录数据库异常
- #logger.critical(f"数据库异常: {str(e)}", exc_info=True)
- return JSONResponse(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
- content={"message": "数据库操作失败", "details": str(e)})
-
- except Exception as e:
- # 记录未知异常(带堆栈信息)
- #logger.critical(f"未知异常: {str(e)}", exc_info=True)
- return JSONResponse(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
- content={"code": 500, "message": "服务器内部错误", "details": str(e)})
-
-
-def get_credentials_exception() -> HTTPException:
- return HTTPException(
- status_code=status.HTTP_401_UNAUTHORIZED,
- detail="Could not validate credentials",
- headers={"WWW-Authenticate": "Bearer"},
- )
diff --git a/models/__pycache__/base.cpython-310.pyc b/models/__pycache__/base.cpython-310.pyc
deleted file mode 100644
index da65d15..0000000
Binary files a/models/__pycache__/base.cpython-310.pyc and /dev/null differ
diff --git a/models/__pycache__/base.cpython-312.pyc b/models/__pycache__/base.cpython-312.pyc
deleted file mode 100644
index d86d7a7..0000000
Binary files a/models/__pycache__/base.cpython-312.pyc and /dev/null differ
diff --git a/models/__pycache__/blog.cpython-310.pyc b/models/__pycache__/blog.cpython-310.pyc
deleted file mode 100644
index 36f7b90..0000000
Binary files a/models/__pycache__/blog.cpython-310.pyc and /dev/null differ
diff --git a/models/__pycache__/blog.cpython-312.pyc b/models/__pycache__/blog.cpython-312.pyc
deleted file mode 100644
index 9512557..0000000
Binary files a/models/__pycache__/blog.cpython-312.pyc and /dev/null differ
diff --git a/models/base.py b/models/base.py
deleted file mode 100644
index c37d6e1..0000000
--- a/models/base.py
+++ /dev/null
@@ -1,57 +0,0 @@
-from sqlalchemy import Column, BigInteger, String, DateTime, event
-from sqlalchemy.ext.declarative import declared_attr
-
-from config.auth import context_sub
-from config.database import Base
-from datetime import datetime
-
-from utils.common import camel_to_snake
-from id_generator import options, generator
-
-# https://github.com/yitter/IdGenerator/tree/master/Python
-options = options.IdGeneratorOptions(worker_id=23)
-idgen = generator.DefaultIdGenerator()
-idgen.set_id_generator(options)
-
-
-# 第二层基类:包含ID
-class IdBase(Base):
- __abstract__ = True
-
- id = Column(BigInteger, primary_key=True, index=True)
-
- @declared_attr
- def __tablename__(cls):
- # 自动把数据库实体类名驼峰转为数据库表名下划线
- return camel_to_snake(cls.__name__)
-
-
-# 自动填充id
-@event.listens_for(IdBase, 'before_insert', propagate=True)
-def before_insert_listener(mapper, connection, target):
- if target.id is None:
- target.id = idgen.next_id()
-
-
-# 第二层基类:包含ID和审计字段
-class AuditBase(IdBase):
- __abstract__ = True
-
- create_time = Column(DateTime, nullable=True, default=datetime.now)
- create_by = Column(String(255), nullable=True)
- update_time = Column(DateTime, nullable=True, default=datetime.now, onupdate=datetime.now)
- update_by = Column(String(255), nullable=True)
-
-
-@event.listens_for(AuditBase, 'before_insert', propagate=True)
-def before_insert(mapper, connection, target):
- value = context_sub.get(None)
- if value is not None:
- target.create_by = value
-
-
-@event.listens_for(AuditBase, 'before_update', propagate=True)
-def before_update(mapper, connection, target):
- value = context_sub.get(None)
- if value is not None:
- target.update_by = value
diff --git a/models/blog.py b/models/blog.py
deleted file mode 100644
index 0d2fcf9..0000000
--- a/models/blog.py
+++ /dev/null
@@ -1,99 +0,0 @@
-from sqlalchemy import (
- BigInteger,
- Boolean,
- Column,
- Integer,
- DECIMAL,
- SMALLINT,
- String,
- LargeBinary
-)
-from sqlalchemy.orm import relationship
-
-from models.base import AuditBase, IdBase
-
-
-class Blog(AuditBase):
- title = Column(String(255), nullable=True, comment="博客标题")
- top_value = Column(Integer, nullable=True, comment="置顶值 越大越靠前")
- is_great = Column(Boolean, nullable=True, comment="是否是精品 0否1是")
- category_id = Column(BigInteger, nullable=True, comment="博客类别")
- summary = Column(String(255), nullable=True, comment="博客内容概要")
- content_id = Column(BigInteger, nullable=True, comment="博客内容")
- word_count = Column(Integer, nullable=True, comment="字数统计")
- read_duration = Column(DECIMAL(10, 2), nullable=True, comment="阅读时长")
-
- category = relationship(
- "BlogCategory",
- back_populates="blogs",
- primaryjoin="foreign(Blog.category_id) == BlogCategory.id"
- )
-
- content = relationship(
- "BlogContent",
- back_populates="blog",
- primaryjoin="foreign(Blog.content_id) == BlogContent.id"
- )
-
- visits = relationship(
- "BlogVisit",
- back_populates="blog",
- primaryjoin="Blog.id == foreign(BlogVisit.blog_id)"
- )
-
- comments = relationship(
- "BlogComment",
- back_populates="blog",
- primaryjoin="Blog.id == foreign(BlogComment.blog_id)"
- )
-
-
-class BlogCategory(AuditBase):
- name = Column(String(45), nullable=True, comment="类别名称")
-
- blogs = relationship(
- "Blog",
- back_populates="category",
- primaryjoin="BlogCategory.id == foreign(Blog.category_id)"
- )
-
-
-class BlogContent(IdBase):
- content = Column(LargeBinary, comment="博客内容")
-
- blog = relationship(
- "Blog",
- back_populates="content",
- primaryjoin="BlogContent.id == foreign(Blog.content_id)"
- )
-
-
-class BlogVisit(AuditBase):
- ip = Column(String(255), nullable=True, comment="ip地址")
- os = Column(String(255), nullable=True, comment="操作系统")
- browser = Column(String(255), nullable=True, comment="浏览器")
- uri = Column(String(255), nullable=True, comment="路径")
- blog_id = Column(BigInteger, nullable=True, comment="博客id")
-
- blog = relationship(
- "Blog",
- back_populates="visits",
- primaryjoin="foreign(BlogVisit.blog_id) == Blog.id"
- )
-
-
-class BlogComment(AuditBase):
- blog_id = Column(BigInteger, comment="博客id")
- parent_id = Column(BigInteger, comment="父评论id")
- name = Column(String(255), comment="评论人昵称")
- website = Column(String(255), nullable=True, comment="评论人网站")
- ip_address = Column(String(45), nullable=True, comment="评论人ip")
- user_agent = Column(String(255), nullable=True, comment="评论人浏览器信息")
- content = Column(String(512), comment="评论内容")
- is_approved = Column(SMALLINT, comment="是否通过")
-
- blog = relationship(
- "Blog",
- back_populates="comments",
- primaryjoin="foreign(BlogComment.blog_id) == Blog.id"
- )
diff --git a/packages/PyJWT-2.10.1-py3-none-any.whl b/packages/PyJWT-2.10.1-py3-none-any.whl
deleted file mode 100644
index 6195c57..0000000
Binary files a/packages/PyJWT-2.10.1-py3-none-any.whl and /dev/null differ
diff --git a/packages/annotated_types-0.7.0-py3-none-any.whl b/packages/annotated_types-0.7.0-py3-none-any.whl
deleted file mode 100644
index 319cf66..0000000
Binary files a/packages/annotated_types-0.7.0-py3-none-any.whl and /dev/null differ
diff --git a/packages/anyio-4.10.0-py3-none-any.whl b/packages/anyio-4.10.0-py3-none-any.whl
deleted file mode 100644
index ba75208..0000000
Binary files a/packages/anyio-4.10.0-py3-none-any.whl and /dev/null differ
diff --git a/packages/click-8.3.0-py3-none-any.whl b/packages/click-8.3.0-py3-none-any.whl
deleted file mode 100644
index 958b5e4..0000000
Binary files a/packages/click-8.3.0-py3-none-any.whl and /dev/null differ
diff --git a/packages/colorama-0.4.6-py2.py3-none-any.whl b/packages/colorama-0.4.6-py2.py3-none-any.whl
deleted file mode 100644
index f666ce9..0000000
Binary files a/packages/colorama-0.4.6-py2.py3-none-any.whl and /dev/null differ
diff --git a/packages/fastapi-0.115.14-py3-none-any.whl b/packages/fastapi-0.115.14-py3-none-any.whl
deleted file mode 100644
index 57d645e..0000000
Binary files a/packages/fastapi-0.115.14-py3-none-any.whl and /dev/null differ
diff --git a/packages/greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl b/packages/greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
deleted file mode 100644
index 610c31d..0000000
Binary files a/packages/greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl and /dev/null differ
diff --git a/packages/h11-0.16.0-py3-none-any.whl b/packages/h11-0.16.0-py3-none-any.whl
deleted file mode 100644
index f12b3ce..0000000
Binary files a/packages/h11-0.16.0-py3-none-any.whl and /dev/null differ
diff --git a/packages/idna-3.10-py3-none-any.whl b/packages/idna-3.10-py3-none-any.whl
deleted file mode 100644
index 52759bd..0000000
Binary files a/packages/idna-3.10-py3-none-any.whl and /dev/null differ
diff --git a/packages/loguru-0.7.3-py3-none-any.whl b/packages/loguru-0.7.3-py3-none-any.whl
deleted file mode 100644
index 58bf021..0000000
Binary files a/packages/loguru-0.7.3-py3-none-any.whl and /dev/null differ
diff --git a/packages/passlib-1.7.4-py2.py3-none-any.whl b/packages/passlib-1.7.4-py2.py3-none-any.whl
deleted file mode 100644
index ca38d13..0000000
Binary files a/packages/passlib-1.7.4-py2.py3-none-any.whl and /dev/null differ
diff --git a/packages/pydantic-2.11.9-py3-none-any.whl b/packages/pydantic-2.11.9-py3-none-any.whl
deleted file mode 100644
index 8a60020..0000000
Binary files a/packages/pydantic-2.11.9-py3-none-any.whl and /dev/null differ
diff --git a/packages/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl b/packages/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
deleted file mode 100644
index 5005eaf..0000000
Binary files a/packages/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl and /dev/null differ
diff --git a/packages/pydantic_settings-2.9.1-py3-none-any.whl b/packages/pydantic_settings-2.9.1-py3-none-any.whl
deleted file mode 100644
index 7ef68c1..0000000
Binary files a/packages/pydantic_settings-2.9.1-py3-none-any.whl and /dev/null differ
diff --git a/packages/pymysql-1.1.2-py3-none-any.whl b/packages/pymysql-1.1.2-py3-none-any.whl
deleted file mode 100644
index 0b96b36..0000000
Binary files a/packages/pymysql-1.1.2-py3-none-any.whl and /dev/null differ
diff --git a/packages/python_dotenv-1.1.1-py3-none-any.whl b/packages/python_dotenv-1.1.1-py3-none-any.whl
deleted file mode 100644
index 1931b3b..0000000
Binary files a/packages/python_dotenv-1.1.1-py3-none-any.whl and /dev/null differ
diff --git a/packages/sniffio-1.3.1-py3-none-any.whl b/packages/sniffio-1.3.1-py3-none-any.whl
deleted file mode 100644
index 04f44e4..0000000
Binary files a/packages/sniffio-1.3.1-py3-none-any.whl and /dev/null differ
diff --git a/packages/sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl b/packages/sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
deleted file mode 100644
index b341efe..0000000
Binary files a/packages/sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl and /dev/null differ
diff --git a/packages/starlette-0.46.2-py3-none-any.whl b/packages/starlette-0.46.2-py3-none-any.whl
deleted file mode 100644
index 18d20fc..0000000
Binary files a/packages/starlette-0.46.2-py3-none-any.whl and /dev/null differ
diff --git a/packages/typing_extensions-4.15.0-py3-none-any.whl b/packages/typing_extensions-4.15.0-py3-none-any.whl
deleted file mode 100644
index 5fec9ca..0000000
Binary files a/packages/typing_extensions-4.15.0-py3-none-any.whl and /dev/null differ
diff --git a/packages/typing_inspection-0.4.1-py3-none-any.whl b/packages/typing_inspection-0.4.1-py3-none-any.whl
deleted file mode 100644
index ff958c3..0000000
Binary files a/packages/typing_inspection-0.4.1-py3-none-any.whl and /dev/null differ
diff --git a/packages/uvicorn-0.23.2-py3-none-any.whl b/packages/uvicorn-0.23.2-py3-none-any.whl
deleted file mode 100644
index 1c0cd7d..0000000
Binary files a/packages/uvicorn-0.23.2-py3-none-any.whl and /dev/null differ
diff --git a/packages/win32_setctime-1.2.0-py3-none-any.whl b/packages/win32_setctime-1.2.0-py3-none-any.whl
deleted file mode 100644
index 7e21ea6..0000000
Binary files a/packages/win32_setctime-1.2.0-py3-none-any.whl and /dev/null differ
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 5fa9cc6..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-fastapi~=0.115.12
sqlalchemy~=2.0.41
pydantic~=2.11.4
PyJWT~=2.10.1
passlib~=1.7.4
loguru~=0.7.3
pydantic-settings~=2.9.1
pymysql~=1.1.1
python-multipart~=0.0.20
uvicorn~=0.23.0
# pip download -r requirements.txt -d ./packages --only-binary=:all: --platform manylinux2014_x86_64 -i https://pypi.tuna.tsinghua.edu.cn/simple
\ No newline at end of file
diff --git a/schemas/__pycache__/blog.cpython-310.pyc b/schemas/__pycache__/blog.cpython-310.pyc
deleted file mode 100644
index 4c29af1..0000000
Binary files a/schemas/__pycache__/blog.cpython-310.pyc and /dev/null differ
diff --git a/schemas/__pycache__/blog.cpython-312.pyc b/schemas/__pycache__/blog.cpython-312.pyc
deleted file mode 100644
index 52df2c2..0000000
Binary files a/schemas/__pycache__/blog.cpython-312.pyc and /dev/null differ
diff --git a/schemas/__pycache__/paginate_query.cpython-310.pyc b/schemas/__pycache__/paginate_query.cpython-310.pyc
deleted file mode 100644
index 1fb7345..0000000
Binary files a/schemas/__pycache__/paginate_query.cpython-310.pyc and /dev/null differ
diff --git a/schemas/__pycache__/paginate_query.cpython-312.pyc b/schemas/__pycache__/paginate_query.cpython-312.pyc
deleted file mode 100644
index 717c1b8..0000000
Binary files a/schemas/__pycache__/paginate_query.cpython-312.pyc and /dev/null differ
diff --git a/schemas/__pycache__/pagination.cpython-310.pyc b/schemas/__pycache__/pagination.cpython-310.pyc
deleted file mode 100644
index ba692f3..0000000
Binary files a/schemas/__pycache__/pagination.cpython-310.pyc and /dev/null differ
diff --git a/schemas/__pycache__/pagination.cpython-312.pyc b/schemas/__pycache__/pagination.cpython-312.pyc
deleted file mode 100644
index f28e0ba..0000000
Binary files a/schemas/__pycache__/pagination.cpython-312.pyc and /dev/null differ
diff --git a/schemas/blog.py b/schemas/blog.py
deleted file mode 100644
index eef6bcd..0000000
--- a/schemas/blog.py
+++ /dev/null
@@ -1,105 +0,0 @@
-from typing import Optional
-
-from pydantic import BaseModel, Field
-from datetime import datetime
-
-
-class BlogQuery(BaseModel):
- # 类别
- category: Optional[str] = None
- # 标题
- title: Optional[str] = None
- # 年份
- year: Optional[int] = None
-
-
-class BlogBase(BaseModel):
- title: str
- topValue: int
- isGreat: bool
- category: str
- content: Optional[str] = None
-
-
-class BlogCreate(BlogBase):
- pass
-
-
-class BlogUpdate(BlogBase):
- pass
-
-
-class BlogResponse(BlogBase):
- id: Optional[int] = None
- summary: Optional[str] = None
- wordCount: Optional[int] = None
- readDuration: Optional[float] = None
- visitCount: Optional[int] = None
- createTime: Optional[datetime] = None
- updateTime: Optional[datetime] = None
-
- class Config:
- from_attributes = True
- json_encoders = {
- # 自定义 datetime 类型的序列化格式
- datetime: lambda dt: dt.strftime('%Y-%m-%d %H:%M:%S')
- }
-
-
-class BlogCategoryResponse(BaseModel):
- name: str
- count: int
-
- class Config:
- from_attributes = True
-
-
-class BlogStatsResponse(BaseModel):
- blogCount: int
- categoryCount: int
- wordCount: int
-
-
-class BlogVisitResponse(BaseModel):
- ip: str
- os: str
- browser: str
- uri: str
- title: Optional[str] = None
- visitTime: datetime
-
- class Config:
- from_attributes = True
- json_encoders = {
- datetime: lambda dt: dt.strftime('%Y-%m-%d %H:%M:%S')
- }
-
-
-class BlogLatestResponse(BaseModel):
- id: int
- title: str
-
- class Config:
- from_attributes = True
-
-
-class BlogCommentCreate(BaseModel):
- blogId: int
- parentId: int
- name: str
- website: Optional[str] = None
- content: str
-
-
-class BlogCommentResponse(BlogCommentCreate):
- id: int
- ipAddress: str
- userAgent: str
- createTime: datetime
-
- class Config:
- from_attributes = True
- json_encoders = {
- # 自定义 datetime 类型的序列化格式
- datetime: lambda dt: dt.strftime('%Y-%m-%d %H:%M:%S')
- }
diff --git a/schemas/paginate_query.py b/schemas/paginate_query.py
deleted file mode 100644
index feadb7b..0000000
--- a/schemas/paginate_query.py
+++ /dev/null
@@ -1,27 +0,0 @@
-from sqlalchemy import select, func
-from sqlalchemy.orm import Session
-
-from schemas.pagination import PageResult
-
-
-def paginate_query(db: Session, query, current_page: int = 1, page_size: int = 10) -> PageResult:
- """通用分页查询函数"""
- # 计算总记录数
- total = db.execute(select(func.count()).select_from(query.subquery())).scalar_one_or_none() or 0
-
- # 计算总页数
- total_pages = (total + page_size - 1) // page_size if page_size != 0 else 0
-
- # 执行分页查询
- results = db.execute(query.offset((current_page - 1) * page_size).limit(page_size)).all()
-
- # 转换为字典列表
- records = [row._asdict() if hasattr(row, "_asdict") else dict(row) for row in results]
-
- return PageResult(
- current=current_page,
- size=page_size,
- total=total,
- pages=total_pages,
- records=records
- )
diff --git a/schemas/pagination.py b/schemas/pagination.py
deleted file mode 100644
index 5ebda67..0000000
--- a/schemas/pagination.py
+++ /dev/null
@@ -1,42 +0,0 @@
-from typing import List, TypeVar, Generic
-
-from pydantic import BaseModel, field_validator
-
-
-class PaginationParams(BaseModel):
- currentPage: int = 1 # 当前页码,从 1 开始
- pageSize: int = 10 # 每页数据量
-
- class Config:
- validate_assignment = True
-
- @field_validator("pageSize")
- def limit_page_size(cls, v):
- if v > 100:
- raise ValueError("pageSize 最大为 100")
- return v
-
-
-T = TypeVar("T")
-
-
-class PageResult(BaseModel, Generic[T]):
- """通用分页结果模型"""
- current: int = 1 # 当前页码(从 1 开始)
- size: int = 10 # 每页大小
- total: int = 0 # 总记录数
- pages: int = 0 # 总页数
- records: List[T] = [] # 数据列表
-
- @field_validator("size")
- def validate_page_size(cls, v):
- if v < 1:
- raise ValueError("page_size 必须至少为 1")
- if v > 1000:
- raise ValueError("page_size 最大为 1000")
- return v
-
- @property
- def offset(self) -> int:
- """计算偏移量"""
- return (self.page - 1) * self.size
\ No newline at end of file
diff --git a/schemas/session.py b/schemas/session.py
deleted file mode 100644
index 2300d1f..0000000
--- a/schemas/session.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from pydantic import BaseModel
-
-
-class SessionResponse(BaseModel):
- access_token: str
- token_type: str
diff --git a/service/__pycache__/blog_service.cpython-310.pyc b/service/__pycache__/blog_service.cpython-310.pyc
deleted file mode 100644
index 07388de..0000000
Binary files a/service/__pycache__/blog_service.cpython-310.pyc and /dev/null differ
diff --git a/service/__pycache__/blog_service.cpython-312.pyc b/service/__pycache__/blog_service.cpython-312.pyc
deleted file mode 100644
index 138ae05..0000000
Binary files a/service/__pycache__/blog_service.cpython-312.pyc and /dev/null differ
diff --git a/service/blog_service.py b/service/blog_service.py
deleted file mode 100644
index 14cba26..0000000
--- a/service/blog_service.py
+++ /dev/null
@@ -1,326 +0,0 @@
-from typing import List
-
-from fastapi import Request
-from sqlalchemy import select, func, desc, and_
-from sqlalchemy.orm import Session
-
-from models.blog import Blog, BlogCategory, BlogVisit, BlogContent, BlogComment
-from schemas.blog import BlogResponse, BlogQuery, BlogCategoryResponse, BlogStatsResponse, \
- BlogLatestResponse, BlogCommentCreate, BlogCommentResponse, BlogVisitResponse, BlogCreate, BlogUpdate
-from schemas.pagination import PageResult
-from schemas.paginate_query import paginate_query
-from middleware.exceptions import AppException
-from utils.blog_utils import get_blog_summary, get_word_count, get_read_duration
-
-
-def query_blog_by_page(db: Session, current_page: int = 1, page_size: int = 10) -> PageResult[BlogResponse]:
- query = select(
- Blog.id,
- Blog.title,
- Blog.top_value.label("topValue"),
- Blog.is_great.label("isGreat"),
- BlogCategory.name.label("category"),
- Blog.summary,
- Blog.word_count.label("wordCount"),
- Blog.read_duration.label("readDuration"),
- func.count(BlogVisit.id).label("visitCount"),
- Blog.create_time.label("createTime"),
- Blog.update_time.label("updateTime")
- ).select_from(Blog).outerjoin(
- BlogCategory, Blog.category_id == BlogCategory.id
- ).outerjoin(
- BlogVisit, Blog.id == BlogVisit.blog_id
- ).group_by(
- Blog.id, BlogCategory.name
- ).order_by(
- desc(Blog.top_value), desc(Blog.update_time)
- )
-
- return paginate_query(db, query, current_page, page_size)
-
-
-def query_blog_by_condition(db: Session, blog_query: BlogQuery) -> List[BlogResponse]:
- query = select(
- Blog.id,
- Blog.title,
- Blog.top_value.label("topValue"),
- Blog.is_great.label("isGreat"),
- BlogCategory.name.label("category"),
- Blog.summary,
- BlogContent.content.label("content"),
- Blog.word_count.label("wordCount"),
- Blog.read_duration.label("readDuration"),
- Blog.create_time.label("createTime"),
- Blog.update_time.label("updateTime")
- ).select_from(Blog).outerjoin(
- BlogCategory, Blog.category_id == BlogCategory.id
- ).outerjoin(
- BlogContent, Blog.content_id == BlogContent.id
- )
-
- conditions = []
-
- if blog_query.category:
- conditions.append(BlogCategory.name == blog_query.category)
-
- if blog_query.title:
- conditions.append(Blog.title.like(f"%{blog_query.title}%"))
-
- if blog_query.year:
- conditions.append(func.extract('year', Blog.create_time) == blog_query.year)
-
- if conditions:
- query = query.where(and_(*conditions))
-
- query = query.order_by(desc(Blog.update_time))
-
- results = db.execute(query).fetchall()
-
- return [BlogResponse.from_orm(result) for result in results]
-
-
-def query_blog_by_id(db: Session, blog_id: int) -> BlogResponse:
- query = db.query(
- Blog.id.label("id"),
- Blog.title.label("title"),
- Blog.top_value.label("topValue"),
- Blog.is_great.label("isGreat"),
- BlogCategory.name.label("category"),
- Blog.summary.label("summary"),
- BlogContent.content.label("content"),
- Blog.word_count.label("wordCount"),
- Blog.read_duration.label("readDuration"),
- func.count(BlogVisit.id).label("visitCount"),
- Blog.create_time.label("createTime"),
- Blog.update_time.label("updateTime")
- ).select_from(Blog).outerjoin(
- BlogCategory, Blog.category_id == BlogCategory.id
- ).outerjoin(
- BlogContent, Blog.content_id == BlogContent.id
- ).outerjoin(
- BlogVisit, Blog.id == BlogVisit.blog_id
- ).filter(Blog.id == blog_id)
-
- blog = query.first()
- if blog[0] is None:
- raise AppException("博客不存在")
-
- return BlogResponse.from_orm(blog)
-
-
-def add_blog(db: Session, blog: BlogCreate) -> bool:
- word_count = get_word_count(blog.content)
-
- db_blog = Blog(
- title=blog.title,
- top_value=blog.topValue,
- is_great=blog.isGreat,
- category_id=add_blog_category(db, blog.category),
- content_id=add_blog_content(db, blog.content),
- summary=get_blog_summary(blog.content),
- word_count=word_count,
- read_duration=get_read_duration(word_count)
- )
-
- db.add(db_blog)
- db.commit()
- db.refresh(db_blog)
-
- return True
-
-
-def add_blog_category(db: Session, category: str) -> int:
- db_blog_category = db.query(BlogCategory).filter(BlogCategory.name == category).first()
- if db_blog_category is None:
- db_new_blog_category = BlogCategory(name=category)
- db.add(db_new_blog_category)
- db.commit()
- category_id = db_new_blog_category.id
- else:
- category_id = db_blog_category.id
-
- return category_id
-
-
-def add_blog_content(db: Session, content: str) -> int:
- db_blog_content = BlogContent(content=content.encode('utf-8'))
- db.add(db_blog_content)
- db.commit()
-
- return db_blog_content.id
-
-
-def update_blog(db: Session, blog_id: int, blog: BlogUpdate) -> bool:
- db_blog = db.query(Blog).filter(Blog.id == blog_id).first()
- if not db_blog:
- raise AppException("博客不存在")
-
- update_data = blog.model_dump(exclude_unset=True)
-
- update_blog_content(db, db_blog.content_id, blog.content)
-
- db_blog.title = update_data["title"]
- db_blog.top_value = update_data["topValue"]
- db_blog.is_great = update_data["isGreat"]
- db_blog.category_id = update_blog_category(db, blog.category)
-
- word_count = get_word_count(blog.content)
- db_blog.summary = get_blog_summary(blog.content),
- db_blog.word_count = word_count
- db_blog.read_duration = get_read_duration(word_count)
-
- db.commit()
- db.refresh(db_blog)
-
- return True
-
-
-def update_blog_category(db: Session, category: str) -> int:
- db_blog_category = db.query(BlogCategory).filter(BlogCategory.name == category).first()
-
- if db_blog_category is None:
- return add_blog_category(db, category)
- else:
- return db_blog_category.id
-
-
-def update_blog_content(db: Session, blog_content_id: int, blog_content: str) -> bool:
- db_blog_content = db.query(BlogContent).filter(BlogContent.id == blog_content_id).first()
- if not db_blog_content:
- raise AppException("博客内容不存在")
-
- db_blog_content.content = blog_content.encode('utf-8')
-
- db.commit()
- db.refresh(db_blog_content)
-
- return True
-
-
-def delete_blog(db: Session, blog_id: int) -> bool:
- db_blog = db.query(Blog).filter(Blog.id == blog_id).first()
- if not db_blog:
- raise AppException("博客不存在")
-
- delete_blog_content(db, db_blog.content_id)
-
- db.delete(db_blog)
- db.commit()
-
- return True
-
-
-def delete_blog_content(db: Session, blog_content_id: int) -> bool:
- db_blog_content = db.query(BlogContent).filter(BlogContent.id == blog_content_id).first()
- if not db_blog_content:
- raise AppException("博客内容不存在")
-
- db.delete(db_blog_content)
- db.commit()
-
- return True
-
-
-def query_blog_category(db: Session) -> List[BlogCategoryResponse]:
- query = select(
- BlogCategory.name,
- func.count(Blog.id).label("count")
- ).select_from(Blog).outerjoin(
- BlogCategory, Blog.category_id == BlogCategory.id
- ).group_by(
- BlogCategory.name
- )
-
- results = db.execute(query).fetchall()
-
- return [BlogCategoryResponse.from_orm(result) for result in results]
-
-
-def query_blog_stats(db: Session) -> BlogStatsResponse:
- return BlogStatsResponse(
- blogCount=db.query(Blog).count(),
- categoryCount=db.query(BlogCategory).count(),
- wordCount=db.query(func.sum(Blog.word_count)).scalar()
- )
-
-
-def query_blog_latest(db: Session) -> List[BlogLatestResponse]:
- query = select(
- Blog.id,
- Blog.title
- ).select_from(Blog).order_by(desc(Blog.update_time)).limit(5)
-
- results = db.execute(query).fetchall()
-
- return [BlogLatestResponse.from_orm(result) for result in results]
-
-
-def add_blog_visit(db: Session, blog_visit: BlogVisit):
- db.add(blog_visit)
- db.commit()
- db.refresh(blog_visit)
-
-
-def query_blog_visit(db: Session, current_page: int = 1, page_size: int = 10) -> PageResult[BlogVisitResponse]:
- query = select(
- BlogVisit.ip,
- BlogVisit.os,
- BlogVisit.browser,
- BlogVisit.uri,
- Blog.title,
- BlogVisit.create_time.label("visitTime")
- ).select_from(BlogVisit).outerjoin(
- Blog, Blog.id == BlogVisit.blog_id
- ).order_by(desc(BlogVisit.create_time))
-
- return paginate_query(db, query, current_page, page_size)
-
-
-def query_blog_comment(db: Session, blog_id: int) -> List[BlogCommentResponse]:
- query = select(
- BlogComment.id,
- BlogComment.blog_id.label("blogId"),
- BlogComment.parent_id.label("parentId"),
- BlogComment.name,
- BlogComment.website,
- BlogComment.ip_address.label("ipAddress"),
- BlogComment.user_agent.label("userAgent"),
- BlogComment.content,
- BlogComment.is_approved.label("isApproved"),
- BlogComment.create_time.label("createTime")
- ).select_from(BlogComment).where(BlogComment.blog_id == blog_id)
- results = db.execute(query).fetchall()
-
- return [BlogCommentResponse.from_orm(result) for result in results]
-
-
-def add_blog_comment(db: Session, request: Request, blog_comment: BlogCommentCreate) -> bool:
- blog = db.query(Blog).filter(Blog.id == blog_comment.blogId).first()
- if not blog:
- raise AppException("博客不存在")
-
- if blog_comment.parentId != 0:
- parent_comment = db.query(BlogComment).filter(
- BlogComment.id == blog_comment.parentId,
- BlogComment.blog_id == blog_comment.blogId
- ).first()
-
- if not parent_comment:
- raise AppException("父评论不存在")
-
- db_comment = BlogComment(
- blog_id=blog_comment.blogId,
- parent_id=blog_comment.parentId,
- name=blog_comment.name,
- website=blog_comment.website,
- content=blog_comment.content,
- ip_address=request.client.host,
- user_agent=request.headers.get("user-agent"),
- is_approved=1
- )
-
- db.add(db_comment)
- db.commit()
- db.refresh(db_comment)
-
- return True
diff --git a/service/session_service.py b/service/session_service.py
deleted file mode 100644
index c15fcf2..0000000
--- a/service/session_service.py
+++ /dev/null
@@ -1,23 +0,0 @@
-from sqlalchemy.orm import Session
-
-from schemas.session import SessionResponse
-from config.auth import create_token, create_payload
-from middleware.exceptions import AppException
-
-
-def create(db: Session, username: str, password: str) -> SessionResponse:
- # 1. 校验账户是否存在
- if username != "admin":
- raise AppException(f"该账户{username}不存在")
-
- # 2. 校验密码是否正确
- if password != "19940822Cxx":
- raise AppException("密码错误")
-
- return SessionResponse(
- access_token=create_token(create_payload(username)),
- token_type="Bearer"
- )
-
-
-
diff --git a/sys.stdout b/sys.stdout
deleted file mode 100644
index 18fd478..0000000
--- a/sys.stdout
+++ /dev/null
@@ -1,816 +0,0 @@
-[32m2025-09-19 23:43:07.605[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-19 23:43:07.685[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-19 23:43:08.892[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-19 23:43:08.893[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-19 23:43:12.227[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-19 23:43:12.239[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/631305371107398[0m
-[32m2025-09-19 23:43:16.396[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-19 23:43:17.331[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-19 23:43:17.332[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-19 23:43:18.318[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/condition?year=2025[0m
-[32m2025-09-19 23:43:18.318[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'year': '2025'}[0m
-[32m2025-09-19 23:43:30.275[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-19 23:43:30.276[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-20 00:21:47.652[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-20 00:21:47.696[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m38[0m - [41m[1m数据库异常: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on '1213@host.docker.internal' ([Errno 11003] getaddrinfo failed)")
-(Background on this error at: https://sqlalche.me/e/20/e3q8)[0m
-[32m2025-09-20 00:21:48.841[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-20 00:21:48.841[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-20 00:21:48.843[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m38[0m - [41m[1m数据库异常: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on '1213@host.docker.internal' ([Errno 11003] getaddrinfo failed)")
-(Background on this error at: https://sqlalche.me/e/20/e3q8)[0m
-[32m2025-09-20 00:21:50.319[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-20 00:21:50.321[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-20 00:21:50.321[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-20 00:21:50.323[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m38[0m - [41m[1m数据库异常: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on '1213@host.docker.internal' ([Errno 11003] getaddrinfo failed)")
-(Background on this error at: https://sqlalche.me/e/20/e3q8)[0m
-[32m2025-09-20 00:21:50.323[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m38[0m - [41m[1m数据库异常: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on '1213@host.docker.internal' ([Errno 11003] getaddrinfo failed)")
-(Background on this error at: https://sqlalche.me/e/20/e3q8)[0m
-[32m2025-09-20 00:22:05.691[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-20 00:22:06.166[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-20 00:22:06.166[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-20 00:22:07.181[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-20 00:22:07.780[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/condition?year=2025[0m
-[32m2025-09-20 00:22:07.780[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'year': '2025'}[0m
-[32m2025-09-20 00:22:10.304[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-20 00:22:12.516[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-20 00:22:12.516[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-20 00:22:13.631[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-20 00:22:13.632[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-20 00:22:13.632[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-20 00:22:13.653[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-20 00:22:15.602[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-20 00:22:16.177[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/condition?year=2025[0m
-[32m2025-09-20 00:22:16.178[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'year': '2025'}[0m
-[32m2025-09-20 00:22:16.642[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-20 00:22:17.057[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-20 00:22:17.057[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-20 22:33:09.756[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=3[0m
-[32m2025-09-20 22:33:09.758[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '3'}[0m
-[32m2025-09-20 22:33:09.799[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m38[0m - [41m[1m数据库异常: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'host.docker.internal' ([Errno 11001] getaddrinfo failed)")
-(Background on this error at: https://sqlalche.me/e/20/e3q8)[0m
-[32m2025-09-20 22:33:12.603[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=3[0m
-[32m2025-09-20 22:33:12.603[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '3'}[0m
-[32m2025-09-20 22:33:12.605[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m38[0m - [41m[1m数据库异常: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'host.docker.internal' ([Errno 11001] getaddrinfo failed)")
-(Background on this error at: https://sqlalche.me/e/20/e3q8)[0m
-[32m2025-09-20 22:33:41.162[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=3[0m
-[32m2025-09-20 22:33:41.162[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '3'}[0m
-[32m2025-09-20 22:33:43.493[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-20 22:33:44.993[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/condition?year=2025[0m
-[32m2025-09-20 22:33:44.994[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'year': '2025'}[0m
-[32m2025-09-20 22:34:30.724[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=3[0m
-[32m2025-09-20 22:34:30.724[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '3'}[0m
-[32m2025-09-20 22:39:14.755[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=3[0m
-[32m2025-09-20 22:39:14.755[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '3'}[0m
-[32m2025-09-20 22:39:28.815[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=3[0m
-[32m2025-09-20 22:39:28.816[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '3'}[0m
-[32m2025-09-20 22:42:06.355[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=3[0m
-[32m2025-09-20 22:42:06.356[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '3'}[0m
-[32m2025-09-20 22:52:16.313[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=3[0m
-[32m2025-09-20 22:52:16.313[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '3'}[0m
-[32m2025-09-20 22:53:37.160[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=3[0m
-[32m2025-09-20 22:53:37.161[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '3'}[0m
-[32m2025-09-20 23:06:35.552[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=3[0m
-[32m2025-09-20 23:06:35.552[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '3'}[0m
-[32m2025-09-20 23:06:45.961[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=3[0m
-[32m2025-09-20 23:06:45.961[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '3'}[0m
-[32m2025-09-20 23:06:49.856[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=3[0m
-[32m2025-09-20 23:06:49.856[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '3'}[0m
-[32m2025-09-20 23:06:51.974[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=3[0m
-[32m2025-09-20 23:06:51.974[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '3'}[0m
-[32m2025-09-20 23:06:52.964[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-20 23:06:53.026[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-20 23:06:55.882[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-20 23:07:07.077[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-20 23:07:18.650[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-20 23:07:19.919[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/condition?category=%E5%B7%A5%E4%BD%9C[0m
-[32m2025-09-20 23:07:19.920[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'category': '工作'}[0m
-[32m2025-09-20 23:07:21.930[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/591259203186757[0m
-[32m2025-09-20 23:07:21.963[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-20 23:07:24.205[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/condition?year=2025[0m
-[32m2025-09-20 23:07:24.206[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'year': '2025'}[0m
-[32m2025-09-20 23:07:27.337[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/685309473689669[0m
-[32m2025-09-20 23:07:27.349[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-20 23:07:30.487[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-20 23:07:31.135[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/condition?category=%E5%B7%A5%E5%85%B7[0m
-[32m2025-09-20 23:07:31.135[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'category': '工具'}[0m
-[32m2025-09-20 23:07:32.841[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=3[0m
-[32m2025-09-20 23:07:32.842[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '3'}[0m
-[32m2025-09-21 10:06:18.830[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:06:18.830[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:06:19.337[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:06:19.337[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:09:08.958[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:09:08.959[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:09:08.959[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:09:09.003[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:09:13.084[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:09:13.088[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:09:13.088[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:09:13.116[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:09:17.146[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:09:17.148[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:09:17.148[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:09:17.167[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:10:27.567[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:10:27.568[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:10:27.568[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:10:27.600[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:10:29.691[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:10:29.691[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:10:29.693[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:10:29.716[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:10:33.337[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-21 10:10:34.566[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/condition?year=2025[0m
-[32m2025-09-21 10:10:34.566[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'year': '2025'}[0m
-[32m2025-09-21 10:10:36.306[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:10:36.306[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:11:07.366[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:11:07.367[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:11:07.367[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:11:07.399[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:11:09.161[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:11:09.161[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:11:09.161[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:11:09.183[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:11:58.374[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:11:58.378[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:12:01.408[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:12:01.409[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:12:01.410[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:12:01.433[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:12:10.773[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:12:10.776[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:12:10.777[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:12:10.798[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:12:11.940[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-21 10:12:37.216[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:12:37.220[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-21 10:12:37.246[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:12:38.146[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:12:38.146[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:12:39.172[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/undefined[0m
-[32m2025-09-21 10:12:39.174[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 422[0m
-[32m2025-09-21 10:13:00.439[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:13:00.441[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:13:00.441[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:13:00.467[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:13:02.124[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:13:02.126[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:13:02.126[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:13:02.147[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:13:04.776[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-21 10:13:04.883[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/631305371107398[0m
-[32m2025-09-21 10:13:13.399[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:13:13.399[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:13:17.976[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-21 10:13:39.121[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:13:39.124[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-21 10:13:39.147[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:13:39.797[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/condition?category=%E5%B7%A5%E4%BD%9C[0m
-[32m2025-09-21 10:13:39.799[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'category': '工作'}[0m
-[32m2025-09-21 10:13:41.071[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/591259203186757[0m
-[32m2025-09-21 10:13:41.130[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/591259203186757[0m
-[32m2025-09-21 10:13:42.954[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/condition?year=2025[0m
-[32m2025-09-21 10:13:42.955[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'year': '2025'}[0m
-[32m2025-09-21 10:13:44.119[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/694197446615109[0m
-[32m2025-09-21 10:13:44.135[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/694197446615109[0m
-[32m2025-09-21 10:13:47.845[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:13:47.845[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:13:57.030[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:13:57.031[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:13:57.031[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:13:57.068[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:14:09.541[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:14:09.544[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:14:09.544[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:14:09.569[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:14:17.410[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-21 10:14:17.412[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:14:17.413[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:14:17.437[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-21 10:14:19.225[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-21 10:14:20.091[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:14:20.091[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-21 10:14:21.729[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-21 10:14:23.107[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/condition?category=%E5%B7%A5%E4%BD%9C[0m
-[32m2025-09-21 10:14:23.107[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'category': '工作'}[0m
-[32m2025-09-21 10:14:24.243[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-21 10:14:25.263[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/condition?category=SpringBoot[0m
-[32m2025-09-21 10:14:25.263[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'category': 'SpringBoot'}[0m
-[32m2025-09-21 10:14:26.588[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/685968269635653[0m
-[32m2025-09-21 10:14:26.611[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/685968269635653[0m
-[32m2025-09-21 10:14:32.814[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-21 10:14:32.814[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:10:32.528[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 15:10:32.538[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m38[0m - [41m[1m数据库异常: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
-(Background on this error at: https://sqlalche.me/e/20/e3q8)[0m
-[32m2025-09-22 15:11:20.975[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 15:11:20.979[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m38[0m - [41m[1m数据库异常: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
-(Background on this error at: https://sqlalche.me/e/20/e3q8)[0m
-[32m2025-09-22 15:12:52.569[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 15:12:52.572[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m38[0m - [41m[1m数据库异常: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
-(Background on this error at: https://sqlalche.me/e/20/e3q8)[0m
-[32m2025-09-22 15:14:34.715[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:14:34.715[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:14:34.722[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m38[0m - [41m[1m数据库异常: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
-(Background on this error at: https://sqlalche.me/e/20/e3q8)[0m
-[32m2025-09-22 15:14:36.797[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 15:14:36.802[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m38[0m - [41m[1m数据库异常: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
-(Background on this error at: https://sqlalche.me/e/20/e3q8)[0m
-[32m2025-09-22 15:14:37.098[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:14:37.098[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:14:37.103[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m38[0m - [41m[1m数据库异常: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
-(Background on this error at: https://sqlalche.me/e/20/e3q8)[0m
-[32m2025-09-22 15:15:18.304[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 15:15:18.835[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:15:18.836[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:16:30.165[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:16:30.166[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:16:30.291[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:16:30.292[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:16:45.745[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:16:45.745[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:17:55.127[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:17:55.127[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:17:59.863[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:17:59.863[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:18:01.178[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:18:01.178[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:18:09.547[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:18:09.548[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:18:10.775[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:18:10.775[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:18:11.597[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 15:18:13.368[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:18:13.368[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:18:14.576[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 15:18:14.606[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 15:18:21.277[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 15:18:21.286[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 15:18:32.435[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 15:18:32.477[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 15:18:34.315[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:18:34.315[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:18:35.850[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 15:18:35.861[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 15:18:36.801[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:18:36.801[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:18:37.910[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 15:18:37.922[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 15:18:54.032[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:18:54.032[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:18:55.791[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 15:18:55.823[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 15:19:07.698[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 15:19:07.711[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 15:19:09.027[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:19:09.027[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:19:10.200[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 15:19:49.933[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:19:49.933[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:19:51.055[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:19:51.055[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:29:07.461[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 15:29:07.461[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 15:29:07.462[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 404[0m
-[32m2025-09-22 15:29:09.248[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 15:29:09.248[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 15:29:09.249[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 404[0m
-[32m2025-09-22 15:29:11.191[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 15:29:11.747[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 15:29:11.747[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 15:29:11.748[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 404[0m
-[32m2025-09-22 15:29:44.643[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 15:29:45.150[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 15:29:45.150[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 15:29:45.151[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 404[0m
-[32m2025-09-22 15:30:49.103[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 15:30:49.752[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 15:30:49.753[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 15:30:49.754[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 404[0m
-[32m2025-09-22 15:30:54.846[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/[0m
-[32m2025-09-22 15:30:54.847[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 404[0m
-[32m2025-09-22 15:30:54.955[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/favicon.ico[0m
-[32m2025-09-22 15:30:54.955[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 404[0m
-[32m2025-09-22 15:31:28.200[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-22 15:31:38.462[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-22 15:31:50.381[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-22 15:32:30.627[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-22 15:32:58.230[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-22 15:33:01.985[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/.well-known/appspecific/com.chrome.devtools.json[0m
-[32m2025-09-22 15:33:01.986[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 404[0m
-[32m2025-09-22 15:33:06.065[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-22 15:33:06.087[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/.well-known/appspecific/com.chrome.devtools.json[0m
-[32m2025-09-22 15:33:06.088[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 404[0m
-[32m2025-09-22 15:33:30.973[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-22 15:33:31.004[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/.well-known/appspecific/com.chrome.devtools.json[0m
-[32m2025-09-22 15:33:31.005[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 404[0m
-[32m2025-09-22 15:33:31.649[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/openapi.json[0m
-[32m2025-09-22 15:33:40.922[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:33:40.922[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:36:26.310[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:36:26.310[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:39:34.526[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:39:34.526[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:42:07.925[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:42:07.926[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:45:58.186[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:45:58.187[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:46:55.130[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:46:55.131[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:47:55.921[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:47:55.922[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:49:55.638[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:49:55.638[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:50:42.343[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:50:42.343[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:54:01.182[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:54:01.182[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:54:34.738[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 15:54:35.231[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 15:54:35.231[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 15:54:35.232[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 404[0m
-[32m2025-09-22 15:54:45.865[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 15:54:45.866[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 15:54:45.866[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 404[0m
-[32m2025-09-22 15:55:11.021[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 15:55:11.021[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 15:55:13.232[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 15:55:13.232[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 15:55:16.814[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=2&pageSize=15[0m
-[32m2025-09-22 15:55:16.814[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '2', 'pageSize': '15'}[0m
-[32m2025-09-22 15:55:18.058[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=3&pageSize=15[0m
-[32m2025-09-22 15:55:18.058[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '3', 'pageSize': '15'}[0m
-[32m2025-09-22 15:55:19.444[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=4&pageSize=15[0m
-[32m2025-09-22 15:55:19.444[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '4', 'pageSize': '15'}[0m
-[32m2025-09-22 15:55:21.420[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 15:55:21.420[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 15:56:21.793[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:56:21.794[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:56:22.607[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 15:56:23.300[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 15:56:23.301[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 15:56:29.178[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:56:29.179[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:56:34.330[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 15:56:34.384[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 15:56:37.117[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 15:56:37.117[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 15:56:46.624[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10[0m
-[32m2025-09-22 15:56:46.624[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '2', 'pageSize': '10'}[0m
-[32m2025-09-22 15:56:48.277[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/591259203186757[0m
-[32m2025-09-22 15:56:48.288[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 15:57:02.098[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10[0m
-[32m2025-09-22 15:57:02.098[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '2', 'pageSize': '10'}[0m
-[32m2025-09-22 15:57:05.160[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/591259203186757[0m
-[32m2025-09-22 15:57:05.187[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 16:01:30.053[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10[0m
-[32m2025-09-22 16:01:30.053[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '2', 'pageSize': '10'}[0m
-[32m2025-09-22 16:11:59.331[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/653526425653317[0m
-[32m2025-09-22 16:11:59.344[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 16:12:16.814[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/653526425653317[0m
-[32m2025-09-22 16:12:16.851[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 16:12:18.578[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 16:12:18.578[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 16:12:19.373[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 16:12:20.288[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 16:12:20.288[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 16:12:22.093[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 16:12:22.103[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 16:13:08.148[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 16:13:08.164[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 16:13:43.129[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 16:13:43.183[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 16:13:47.295[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:13:47.301[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:15:09.734[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:15:09.762[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:15:33.888[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:15:50.282[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:15:50.311[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:17:18.946[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:17:18.987[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:17:50.938[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:17:50.974[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:18:07.683[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:18:07.709[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:19:03.894[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:19:03.922[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:19:30.947[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:19:30.974[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:25:21.951[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:25:21.983[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:25:24.186[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 16:25:24.186[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 16:25:25.748[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 16:25:25.759[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 16:25:27.213[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:25:27.218[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:28:50.934[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:28:50.990[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:31:15.089[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:31:15.117[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:31:22.466[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 16:31:22.509[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 16:31:23.823[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:31:23.827[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:31:51.087[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:31:51.119[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:32:28.998[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:34:34.904[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:34:34.933[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: 'str' object has no attribute '_sa_instance_state'[0m
-[32m2025-09-22 16:35:07.569[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:36:08.384[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 16:38:52.539[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 16:38:54.167[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 16:38:54.168[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 16:38:55.866[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 16:38:55.952[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 16:38:57.139[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:41:18.563[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-22 16:41:38.946[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-22 16:41:39.149[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/openapi.json[0m
-[32m2025-09-22 16:42:24.993[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/blog[0m
-[32m2025-09-22 16:42:24.996[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m38[0m - [41m[1m数据库异常: Class 'schemas.blog.BlogCreate' is not mapped[0m
-[32m2025-09-22 16:54:29.509[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/blog[0m
-[32m2025-09-22 16:54:54.299[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/blog[0m
-[32m2025-09-22 16:55:19.391[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/blog[0m
-[32m2025-09-22 16:57:29.815[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/blog[0m
-[32m2025-09-22 18:14:20.522[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/222[0m
-[32m2025-09-22 18:14:20.552[0m | [31m[1mERROR [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m32[0m - [31m[1m业务异常: 博客不存在 - 详情: None[0m
-[32m2025-09-22 18:25:32.758[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/222[0m
-[32m2025-09-22 18:25:32.805[0m | [31m[1mERROR [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m32[0m - [31m[1m业务异常: 博客不存在 - 详情: None[0m
-[32m2025-09-22 18:26:28.913[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:27:21.610[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-22 18:27:21.641[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:27:23.929[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:27:23.929[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:27:27.864[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:27:28.948[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:27:29.722[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:27:29.722[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:28:52.114[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:28:52.114[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:31:41.995[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:31:41.996[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:31:45.766[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:31:45.766[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:31:48.191[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:31:49.043[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:31:49.043[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:31:50.676[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10[0m
-[32m2025-09-22 18:31:50.676[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '2', 'pageSize': '10'}[0m
-[32m2025-09-22 18:31:55.477[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722514116330950[0m
-[32m2025-09-22 18:31:55.589[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:31:56.525[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10[0m
-[32m2025-09-22 18:31:56.526[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '2', 'pageSize': '10'}[0m
-[32m2025-09-22 18:31:57.563[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722514116330950[0m
-[32m2025-09-22 18:31:57.578[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:32:01.569[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:32:25.403[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722514116330950[0m
-[32m2025-09-22 18:32:25.421[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:32:27.763[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:32:30.262[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722514116330950[0m
-[32m2025-09-22 18:32:30.274[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:32:31.801[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:32:31.896[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:32:31.896[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:32:31.922[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-22 18:32:31.974[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-22 18:32:32.015[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:32:32.016[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:32:33.771[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10[0m
-[32m2025-09-22 18:32:33.771[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '2', 'pageSize': '10'}[0m
-[32m2025-09-22 18:32:35.396[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:32:35.396[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:32:41.918[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722514116330950[0m
-[32m2025-09-22 18:32:41.930[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:32:43.999[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:32:45.747[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:32:45.861[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:32:45.861[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:32:45.872[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-22 18:32:45.884[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-22 18:32:45.915[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:32:45.916[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:32:48.833[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10[0m
-[32m2025-09-22 18:32:48.833[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '2', 'pageSize': '10'}[0m
-[32m2025-09-22 18:32:50.031[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:32:50.031[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:32:53.942[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722514116330950[0m
-[32m2025-09-22 18:32:53.966[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:32:54.843[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:33:00.928[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:33:01.118[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:33:01.118[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:33:01.129[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-22 18:33:01.139[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-22 18:33:01.180[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:33:01.180[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:33:03.100[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:33:05.118[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:33:05.119[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:33:06.433[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722514116330950[0m
-[32m2025-09-22 18:33:06.442[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:33:08.330[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:33:08.330[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:33:09.233[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722514116330950[0m
-[32m2025-09-22 18:33:09.244[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:33:09.895[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:33:11.488[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:33:11.597[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:33:11.597[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:33:11.609[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-22 18:33:11.621[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-22 18:33:11.651[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:33:11.651[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:33:13.466[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:33:15.203[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:33:15.204[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:33:15.764[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:33:43.025[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:33:43.025[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:33:45.937[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:33:45.938[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 405[0m
-[32m2025-09-22 18:34:46.500[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722514116330950[0m
-[32m2025-09-22 18:34:46.511[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:34:47.017[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:34:51.419[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:34:51.500[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:34:51.500[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:34:51.512[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-22 18:34:51.522[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-22 18:34:51.556[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:34:51.557[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:34:53.242[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:36:53.036[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:36:53.036[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:36:54.031[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 18:36:54.031[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 18:36:57.341[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:36:57.341[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:38:13.963[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:38:17.268[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:38:17.268[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:38:19.535[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722514116330950[0m
-[32m2025-09-22 18:38:19.548[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:38:20.820[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:38:23.110[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:38:23.195[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:38:23.195[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:38:23.206[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-22 18:38:23.221[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-22 18:38:23.249[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:38:23.250[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:38:24.949[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:41:06.913[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:41:06.914[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:41:09.726[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:41:09.731[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: delete_blog_content() missing 1 required positional argument: 'blog_content_id'[0m
-[32m2025-09-22 18:41:39.132[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-22 18:41:39.238[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/openapi.json[0m
-[32m2025-09-22 18:41:54.768[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:41:54.771[0m | [41m[1mCRITICAL[0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m44[0m - [41m[1m未知异常: delete_blog_content() missing 1 required positional argument: 'blog_content_id'[0m
-[32m2025-09-22 18:42:14.812[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:42:19.880[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:42:19.885[0m | [31m[1mERROR [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m32[0m - [31m[1m业务异常: 博客内容不存在 - 详情: None[0m
-[32m2025-09-22 18:42:50.275[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:42:50.303[0m | [31m[1mERROR [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m32[0m - [31m[1m业务异常: 博客内容不存在 - 详情: None[0m
-[32m2025-09-22 18:43:06.008[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:43:06.051[0m | [31m[1mERROR [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m32[0m - [31m[1m业务异常: 博客内容不存在 - 详情: None[0m
-[32m2025-09-22 18:44:09.227[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:44:09.253[0m | [31m[1mERROR [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m32[0m - [31m[1m业务异常: 博客内容不存在 - 详情: None[0m
-[32m2025-09-22 18:45:23.874[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:45:23.925[0m | [31m[1mERROR [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m32[0m - [31m[1m业务异常: 博客内容不存在 - 详情: None[0m
-[32m2025-09-22 18:45:57.101[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722514116330950[0m
-[32m2025-09-22 18:45:57.113[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:45:58.136[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:45:58.137[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:46:03.406[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722514116330950[0m
-[32m2025-09-22 18:46:03.449[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:46:04.490[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:46:04.490[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:46:20.664[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:46:20.664[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:46:22.438[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:46:22.443[0m | [31m[1mERROR [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m32[0m - [31m[1m业务异常: 博客内容不存在 - 详情: None[0m
-[32m2025-09-22 18:46:56.020[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:47:07.468[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:47:41.733[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:50:54.925[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722514116330950[0m
-[32m2025-09-22 18:50:55.028[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:50:55.028[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:50:55.067[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-22 18:50:55.083[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-22 18:51:10.453[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:51:13.077[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/blog[0m
-[32m2025-09-22 18:51:13.285[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:51:13.286[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:51:13.301[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-22 18:51:13.317[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-22 18:51:13.358[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:51:13.359[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:51:15.327[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10[0m
-[32m2025-09-22 18:51:15.328[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '2', 'pageSize': '10'}[0m
-[32m2025-09-22 18:54:54.576[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:54:54.576[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:54:56.974[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10[0m
-[32m2025-09-22 18:54:56.974[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '2', 'pageSize': '10'}[0m
-[32m2025-09-22 18:54:59.240[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722542064379334[0m
-[32m2025-09-22 18:54:59.455[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:54:59.455[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:54:59.466[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:54:59.466[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:54:59.494[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-22 18:54:59.527[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-22 18:55:00.853[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10[0m
-[32m2025-09-22 18:55:00.853[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '2', 'pageSize': '10'}[0m
-[32m2025-09-22 18:55:02.437[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:55:02.437[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:55:07.394[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:55:08.960[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/blog[0m
-[32m2025-09-22 18:55:09.151[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:55:09.151[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:55:09.164[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-22 18:55:09.176[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-22 18:55:09.215[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:55:09.216[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:55:12.434[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722543030515142[0m
-[32m2025-09-22 18:55:12.446[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:55:13.732[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:55:13.732[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:55:15.059[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722543030515142[0m
-[32m2025-09-22 18:55:15.072[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:55:15.748[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 18:55:21.292[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/722543030515142[0m
-[32m2025-09-22 18:55:21.465[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:55:21.466[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:55:21.477[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-22 18:55:21.488[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-22 18:55:21.524[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:55:21.524[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:55:23.208[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/722543030515142[0m
-[32m2025-09-22 18:55:23.219[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-22 18:55:24.389[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:55:24.390[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:55:28.920[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: DELETE http://127.0.0.1:8082/blog/722543030515142[0m
-[32m2025-09-22 18:55:29.157[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:55:29.157[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:55:29.182[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-22 18:55:29.192[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-22 18:55:30.441[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10[0m
-[32m2025-09-22 18:55:30.441[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '2', 'pageSize': '10'}[0m
-[32m2025-09-22 18:55:31.669[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:55:31.669[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 18:56:17.221[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10[0m
-[32m2025-09-22 18:56:17.221[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '2', 'pageSize': '10'}[0m
-[32m2025-09-22 18:56:19.131[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 18:56:19.131[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 19:04:46.072[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 19:04:46.073[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 19:05:04.232[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 19:05:04.232[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 19:06:27.903[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 19:06:29.614[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 19:06:30.762[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 19:06:30.763[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 19:06:31.344[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 19:06:31.873[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 19:06:31.873[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 19:06:33.165[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 19:06:33.165[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 19:07:01.746[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 19:07:01.747[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 19:07:14.066[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 19:07:14.066[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 19:07:17.578[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 19:07:17.578[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 19:07:20.284[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 19:07:29.679[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 19:07:29.679[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 19:07:43.055[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 19:07:43.055[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 19:07:43.499[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 19:07:59.605[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 19:07:59.605[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 19:08:00.326[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 19:08:01.072[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 19:08:01.072[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 19:08:37.540[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 19:08:37.541[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 19:08:41.634[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 19:08:41.634[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 19:08:42.352[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 19:08:46.044[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15[0m
-[32m2025-09-22 19:08:46.044[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '15'}[0m
-[32m2025-09-22 19:08:46.882[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/category[0m
-[32m2025-09-22 19:08:47.220[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 19:08:47.220[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 19:35:46.700[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 19:35:46.701[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-22 19:36:39.565[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-22 19:36:39.565[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 13:38:24.061[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/[0m
-[32m2025-09-23 13:38:24.072[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 404[0m
-[32m2025-09-23 13:38:24.176[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/favicon.ico[0m
-[32m2025-09-23 13:38:24.176[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 404[0m
-[32m2025-09-23 13:38:28.402[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-23 13:38:50.471[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-23 13:38:51.104[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/openapi.json[0m
-[32m2025-09-23 13:38:55.964[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-23 13:38:55.964[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 13:38:55.964[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 401[0m
-[32m2025-09-23 13:40:23.368[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-23 13:40:23.369[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 13:40:32.054[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/blog[0m
-[32m2025-09-23 13:40:32.056[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 401[0m
-[32m2025-09-23 13:46:14.026[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-23 13:46:14.554[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/openapi.json[0m
-[32m2025-09-23 13:46:19.941[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-23 13:46:20.022[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/openapi.json[0m
-[32m2025-09-23 13:46:24.491[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-23 13:46:24.553[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/openapi.json[0m
-[32m2025-09-23 13:49:32.889[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-23 13:49:32.991[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/openapi.json[0m
-[32m2025-09-23 13:52:53.666[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-23 13:52:53.766[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/openapi.json[0m
-[32m2025-09-23 13:53:00.113[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/docs[0m
-[32m2025-09-23 13:53:00.173[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/openapi.json[0m
-[32m2025-09-23 13:57:51.959[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-23 13:57:51.960[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 13:57:56.317[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-23 13:57:56.422[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-23 13:57:57.914[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-23 13:57:58.014[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-23 13:57:58.014[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 13:57:58.028[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-23 13:57:58.044[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-23 13:57:58.074[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-23 13:57:58.074[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 13:58:39.770[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-23 13:58:39.785[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-23 13:58:41.260[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-23 13:58:41.262[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 401[0m
-[32m2025-09-23 14:02:37.558[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/session?name=estun&password=medical[0m
-[32m2025-09-23 14:02:37.558[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'name': 'estun', 'password': 'medical'}[0m
-[32m2025-09-23 14:02:37.560[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 422[0m
-[32m2025-09-23 14:03:42.464[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/session[0m
-[32m2025-09-23 14:03:42.466[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 422[0m
-[32m2025-09-23 14:06:05.092[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/session[0m
-[32m2025-09-23 14:06:05.095[0m | [31m[1mERROR [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m32[0m - [31m[1m业务异常: 该账户estun不存在 - 详情: None[0m
-[32m2025-09-23 14:07:04.464[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/session[0m
-[32m2025-09-23 14:07:04.467[0m | [31m[1mERROR [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m32[0m - [31m[1m业务异常: 该账户admin不存在 - 详情: None[0m
-[32m2025-09-23 14:07:53.591[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/session[0m
-[32m2025-09-23 14:07:53.596[0m | [31m[1mERROR [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m32[0m - [31m[1m业务异常: 该账户admin不存在 - 详情: None[0m
-[32m2025-09-23 14:08:48.398[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/session[0m
-[32m2025-09-23 14:26:31.145[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/session[0m
-[32m2025-09-23 14:26:56.041[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/session[0m
-[32m2025-09-23 14:26:57.633[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-23 14:26:57.633[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 14:26:59.248[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-23 14:26:59.333[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-23 14:27:00.498[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-23 14:27:00.500[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 401[0m
-[32m2025-09-23 14:31:33.983[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/session[0m
-[32m2025-09-23 14:31:35.668[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-23 14:31:35.668[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 14:31:37.840[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-23 14:31:37.897[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-23 14:31:39.290[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-23 14:31:39.291[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 401[0m
-[32m2025-09-23 14:37:39.603[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/session[0m
-[32m2025-09-23 14:37:41.438[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-23 14:37:41.438[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 14:37:51.897[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-23 14:37:51.970[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-23 14:37:53.706[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-23 14:37:53.708[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 401[0m
-[32m2025-09-23 14:38:31.930[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/session[0m
-[32m2025-09-23 14:38:33.214[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-23 14:38:33.214[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 14:38:34.724[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-23 14:38:34.779[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-23 14:38:35.684[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-23 14:38:35.686[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 401[0m
-[32m2025-09-23 14:40:02.522[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-23 14:40:02.524[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 401[0m
-[32m2025-09-23 14:40:12.792[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-23 14:40:12.816[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-23 14:40:24.342[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: POST http://127.0.0.1:8082/session[0m
-[32m2025-09-23 14:40:25.690[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-23 14:40:25.691[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 14:40:26.966[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/content/631305371107398[0m
-[32m2025-09-23 14:40:27.033[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/comment/0[0m
-[32m2025-09-23 14:40:28.104[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/631305371107398[0m
-[32m2025-09-23 14:40:28.201[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-23 14:40:28.201[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 14:40:28.215[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/stats[0m
-[32m2025-09-23 14:40:28.230[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/latest[0m
-[32m2025-09-23 14:40:28.263[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-23 14:40:28.263[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 14:41:06.532[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-23 14:41:06.533[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 14:41:58.649[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10[0m
-[32m2025-09-23 14:41:58.649[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m20[0m - [1m查询参数: {'currentPage': '1', 'pageSize': '10'}[0m
-[32m2025-09-23 14:42:06.096[0m | [1mINFO [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m18[0m - [1m请求: PUT http://127.0.0.1:8082/blog/21312[0m
-[32m2025-09-23 14:42:06.098[0m | [33m[1mWARNING [0m | [36mmiddleware.exceptions[0m:[36mglobal_exception_handler[0m:[36m26[0m - [33m[1m响应: 401[0m
diff --git a/test_main.http b/test_main.http
deleted file mode 100644
index a2d81a9..0000000
--- a/test_main.http
+++ /dev/null
@@ -1,11 +0,0 @@
-# Test your FastAPI endpoints
-
-GET http://127.0.0.1:8000/
-Accept: application/json
-
-###
-
-GET http://127.0.0.1:8000/hello/User
-Accept: application/json
-
-###
diff --git a/utils/__pycache__/blog_utils.cpython-310.pyc b/utils/__pycache__/blog_utils.cpython-310.pyc
deleted file mode 100644
index fcc0f75..0000000
Binary files a/utils/__pycache__/blog_utils.cpython-310.pyc and /dev/null differ
diff --git a/utils/__pycache__/blog_utils.cpython-312.pyc b/utils/__pycache__/blog_utils.cpython-312.pyc
deleted file mode 100644
index 1b92325..0000000
Binary files a/utils/__pycache__/blog_utils.cpython-312.pyc and /dev/null differ
diff --git a/utils/__pycache__/common.cpython-310.pyc b/utils/__pycache__/common.cpython-310.pyc
deleted file mode 100644
index 90be752..0000000
Binary files a/utils/__pycache__/common.cpython-310.pyc and /dev/null differ
diff --git a/utils/__pycache__/common.cpython-312.pyc b/utils/__pycache__/common.cpython-312.pyc
deleted file mode 100644
index 10cd946..0000000
Binary files a/utils/__pycache__/common.cpython-312.pyc and /dev/null differ
diff --git a/utils/blog_utils.py b/utils/blog_utils.py
deleted file mode 100644
index 4eeb515..0000000
--- a/utils/blog_utils.py
+++ /dev/null
@@ -1,108 +0,0 @@
-from fastapi import Request
-
-from models.blog import BlogVisit
-
-# 博客概要字数
-BLOG_SUMMARY_COUNT = 100
-
-# 阅读速度 600 字/分钟
-READ_SPEED = 600.0
-
-# 博客非统计字符
-EXCLUDE_CHARS = [' ', '\n', '\t']
-
-
-def get_word_count(text: str) -> int:
- """
- 获取文本字数
-
- :param text: 文本
- :return: 字数
- """
- count = 0
-
- if not text: # 检查None或空字符串
- return count
-
- for char in text:
- if char not in EXCLUDE_CHARS:
- count += 1
-
- return count
-
-
-def get_read_duration(word_count: int) -> float:
- """
- 获取阅读时长 单位:分钟
-
- :param word_count: 文本字数
- :return: 阅读时长
- """
- return word_count / READ_SPEED
-
-
-def get_blog_summary(content: str) -> str:
- """
- 获取简要信息
-
- :param content: 博客内容
- :return: 简要信息
- """
- if len(content) > BLOG_SUMMARY_COUNT:
- return content[:BLOG_SUMMARY_COUNT]
- return content
-
-
-def get_client_ip(request):
- """从请求中获取客户端IP地址"""
- x_forwarded_for = request.headers.get("X-Forwarded-For")
- if x_forwarded_for:
- return x_forwarded_for.split(',')[0]
- return request.client.host
-
-
-def get_user_agent_info(user_agent: str):
- """解析User-Agent获取操作系统和浏览器信息"""
- # 使用正则表达式进行更精确的解析
- os = "Unknown"
- browser = "Unknown"
-
- # 操作系统检测
- if "Windows NT" in user_agent:
- os = "Windows"
- elif "Macintosh" in user_agent:
- os = "Mac OS"
- elif "Linux" in user_agent:
- os = "Linux"
- elif "Android" in user_agent:
- os = "Android"
- elif "iPhone" in user_agent or "iPad" in user_agent:
- os = "iOS"
-
- # 浏览器检测
- if "Chrome" in user_agent:
- browser = "Chrome"
- elif "Firefox" in user_agent:
- browser = "Firefox"
- elif "Safari" in user_agent and "Chrome" not in user_agent:
- browser = "Safari"
- elif "Edge" in user_agent:
- browser = "Edge"
- elif "MSIE" in user_agent or "Trident" in user_agent:
- browser = "Internet Explorer"
-
- return os, browser
-
-
-def get_blog_visit(request: Request, blog_id: int) -> BlogVisit:
- ip = get_client_ip(request)
- user_agent = request.headers.get("User-Agent", "")
- os, browser = get_user_agent_info(user_agent)
-
- return BlogVisit(
- ip=ip,
- os=os,
- browser=browser,
- uri=request.url.path,
- blog_id=blog_id
- )
diff --git a/utils/common.py b/utils/common.py
deleted file mode 100644
index bb599fe..0000000
--- a/utils/common.py
+++ /dev/null
@@ -1,13 +0,0 @@
-import re
-
-
-def camel_to_snake(name: str) -> str:
- """将驼峰命名转换为蛇形命名(CamelCase → snake_case)"""
- name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
- return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).lower()
-
-
-def snake_to_camel(name: str) -> str:
- """将蛇形命名转换为驼峰命名(snake_case → CamelCase)"""
- components = name.split('_')
- return ''.join(x.title() for x in components)