feat:更新架构

This commit is contained in:
2025-12-11 17:37:08 +08:00
parent 845f225ff7
commit f7a52fc11a
18 changed files with 2117 additions and 92 deletions

View File

@@ -20,12 +20,52 @@ export default defineConfig({
// https://vitepress.dev/reference/default-theme-config
nav: [
{ text: 'Home', link: '/' },
{ text: 'Web前端', link: '/Web-Front/' },
{ text: 'Web后端', link: '/Web-Backend/' },
{ text: 'DevOps', link: '/DevOps/' },
{ text: 'SpringBoot', link: '/SpringBoot/' },
{ text: 'FastAPI', link: '/FastAPI/' },
{ text: 'Flutter', link: '/Flutter/' },
{ text: 'Web前端',
items: [
{ text: 'Vue3-Common', link: '/Web-Front/Vue3-Common' },
{ text: 'JavaScript知识点整理', link: '/Web-Front/JavaScript-Guide' }
]
},
{ text: 'Web后端',
items: [
{ text: 'MySQL知识点', link: '/Web-Backend/MySQL-Knowledge' },
{ text: 'Flyway简单使用', link: '/Web-Backend/Flyway' },
{ text: 'MyBatis简介和使用', link: '/Web-Backend/MyBatis' },
{ text: 'RustFS简介和使用', link: '/Web-Backend/RustFS' },
{
text: 'SpringBoot',
items: [
{ text: 'Spring IOC简介', link: '/Web-Backend/SpringBoot/SpringIOC' },
{ text: 'SpringBoot启动流程', link: '/Web-Backend/SpringBoot/SpringBoot-Start-Process' },
{ text: 'Spring MVC简介', link: '/Web-Backend/SpringBoot/SpringMVC' },
{ text: 'SpringBoot Starter原理', link: '/Web-Backend/SpringBoot/SpringBootStarter' },
{ text: 'SpringBoot Bean简介', link: '/Web-Backend/SpringBoot/SpringBootBean' },
{ text: 'SpringBoot3原生镜像', link: '/Web-Backend/SpringBoot/SpringBoot3-GraalVM' }
]
},
{
text: 'FastAPI',
items: [
{ text: 'FastAPI基础教程', link: '/Web-Backend/FastAPI/FastAPI-Guide' },
{ text: '基于OAuth2的安全验证', link: '/Web-Backend/FastAPI/OAuth2' }
]
}
]
},
{ text: 'DevOps',
items: [
{ text: 'OpenObserve部署和使用', link: '/DevOps/OpenObserve' },
{ text: 'Jenkins部署和使用', link: '/DevOps/Jenkins' },
{ text: 'ElasticSearch部署和使用', link: '/DevOps/ElasticSearch' }
]
},
{ text: 'Flutter',
items: [
{ text: 'Dart基础教程', link: '/Flutter/DartGuide' },
{ text: 'Flutter基础教程', link: '/Flutter/FlutterGuide' },
{ text: '实战技巧', link: '/Flutter/Practice' }
]
},
],
sidebar: {
'/Web-Front/': [
@@ -33,6 +73,7 @@ export default defineConfig({
text: 'Web前端',
items: [
{ text: 'Vue3-Common', link: '/Web-Front/Vue3-Common' },
{ text: 'JavaScript知识点整理', link: '/Web-Front/JavaScript-Guide' }
]
},
],
@@ -43,8 +84,24 @@ export default defineConfig({
{ text: 'MySQL知识点', link: '/Web-Backend/MySQL-Knowledge' },
{ text: 'Flyway简单使用', link: '/Web-Backend/Flyway' },
{ text: 'MyBatis简介和使用', link: '/Web-Backend/MyBatis' },
{ text: 'RustFS简介和使用', link: '/Web-Backend/RustFS' }
]
{ text: 'RustFS简介和使用', link: '/Web-Backend/RustFS' },
{ text: 'SpringBoot',
items: [
{ text: 'Spring IOC简介', link: '/Web-Backend/SpringBoot/SpringIOC' },
{ text: 'SpringBoot启动流程', link: '/Web-Backend/SpringBoot/SpringBoot-Start-Process' },
{ text: 'Spring MVC简介', link: '/Web-Backend/SpringBoot/SpringMVC' },
{ text: 'SpringBoot Starter原理', link: '/Web-Backend/SpringBoot/SpringBootStarter' },
{ text: 'SpringBoot Bean简介', link: '/Web-Backend/SpringBoot/SpringBootBean' },
{ text: 'SpringBoot3原生镜像', link: '/Web-Backend/SpringBoot/SpringBoot3-GraalVM' }
]
},
{ text: 'FastAPI',
items: [
{ text: 'FastAPI基础教程', link: '/Web-Backend/FastAPI/FastAPI-Guide' },
{ text: '基于OAuth2的安全验证', link: '/Web-Backend/FastAPI/OAuth2' }
]
}
],
},
],
'/DevOps/': [
@@ -56,38 +113,6 @@ export default defineConfig({
{ text: 'ElasticSearch部署和使用', link: '/DevOps/ElasticSearch' }
]
}
],
'/SpringBoot/': [
{
text: 'SpringBoot',
items: [
{ text: 'Spring IOC简介', link: '/SpringBoot/SpringIOC' },
{ text: 'SpringBoot启动流程', link: '/SpringBoot/SpringBoot-Start-Process' },
{ text: 'Spring MVC简介', link: '/SpringBoot/SpringMVC' },
{ text: 'SpringBoot Starter原理', link: '/SpringBoot/SpringBootStarter' },
{ text: 'SpringBoot Bean简介', link: '/SpringBoot/SpringBootBean' },
{ text: 'SpringBoot3原生镜像', link: '/SpringBoot/SpringBoot3-GraalVM' }
]
}
],
'/FastAPI/': [
{
text: 'FastAPI',
items: [
{ text: 'FastAPI基础教程', link: '/FastAPI/FastAPIGuide' },
{ text: '基于OAuth2的FastApi安全验证', link: '/FastAPI/OAuth2' }
]
}
],
'/Flutter/': [
{
text: 'Flutter',
items: [
{ text: 'Dart基础教程', link: '/Flutter/DartGuide' },
{ text: 'Flutter基础教程', link: '/Flutter/FlutterGuide' },
{ text: '实战技巧', link: '/Flutter/Practice' }
]
}
]
},

View File

@@ -1,9 +0,0 @@
---
layout: doc
title: FastAPI
---
# 内容导航
- [FastAPI基础教程](/FastAPI/FastAPIGuide)
- [基于OAuth2的FastApi安全验证](/FastAPI/OAuth2)

View File

@@ -1,13 +0,0 @@
---
layout: doc
title: SpringBoot
---
# 内容导航
- [Spring IOC简介](/SpringBoot/SpringIOC)
- [SpringBoot启动流程](/SpringBoot/SpringBoot-Start-Process)
- [Spring MVC简介](/SpringBoot/SpringMVC)
- [SpringBoot Starter原理](/SpringBoot/SpringBootStarter)
- [SpringBoot Bean简介](/SpringBoot/SpringBootBean)
- [SpringBoot3原生镜像](/SpringBoot/SpringBoot3-GraalVM)

View File

@@ -260,7 +260,7 @@ class BlogComment(AuditBase):
```python
from typing import Optional
from pydantic import BaseModel, Field, field_validator
from pydantic import BaseModel, Field, field_validator, ConfigDict
from datetime import datetime
@@ -316,22 +316,23 @@ class BlogResponse(BlogBase):
create_time: datetime = Field(..., description="创建时间", alias="createTime")
update_time: datetime = Field(..., description="更新时间", alias="updateTime")
class Config:
from_attributes = True
populate_by_name = True
json_encoders = {
# 自定义 datetime 类型的序列化格式
model_config = ConfigDict(
from_attributes=True,
populate_by_name=True,
json_encoders={
datetime: lambda dt: dt.strftime('%Y-%m-%d %H:%M:%S')
}
)
class BlogCategoryResponse(BaseModel):
name: str = Field(..., description="分类名称")
count: int = Field(..., description="博客数量")
class Config:
from_attributes = True
populate_by_name = True
model_config = ConfigDict(
from_attributes=True,
populate_by_name=True
)
class BlogStatsResponse(BaseModel):
@@ -348,30 +349,33 @@ class BlogVisitResponse(BaseModel):
title: str = Field(None, description="博客标题")
visit_time: datetime = Field(..., description="访问时间", alias="visitTime")
class Config:
from_attributes = True
populate_by_name = True
json_encoders = {
model_config = ConfigDict(
from_attributes=True,
populate_by_name=True,
json_encoders={
datetime: lambda dt: dt.strftime('%Y-%m-%d %H:%M:%S')
}
)
class BlogLatestResponse(BaseModel):
id: int = Field(..., description="博客ID")
title: str = Field(..., description="博客标题")
class Config:
from_attributes = True
populate_by_name = True
model_config = ConfigDict(
from_attributes=True,
populate_by_name=True
)
class BlogAdjacentResponse(BaseModel):
id: int = Field(..., description="博客ID")
title: str = Field(..., description="博客标题")
class Config:
from_attributes = True
populate_by_name = True
model_config = ConfigDict(
from_attributes=True,
populate_by_name=True
)
class BlogCommentCreate(BaseModel):
@@ -399,18 +403,17 @@ class BlogCommentResponse(BlogCommentCreate):
user_agent: str = Field(..., description="浏览器信息", alias="userAgent")
create_time: datetime = Field(..., description="创建时间", alias="createTime")
class Config:
from_attributes = True
populate_by_name = True
json_encoders = {
# 自定义 datetime 类型的序列化格式
model_config = ConfigDict(
from_attributes=True,
populate_by_name=True,
json_encoders={
datetime: lambda dt: dt.strftime('%Y-%m-%d %H:%M:%S')
}
)
```
  `@field_validator`为Pydantic V2的验证器装饰器。
  `class Config`为全局配置类,`from_attributes=True`表示允许从SQLAlchemy等ORM对象创建。
  `ConfigDict`为全局配置类,`from_attributes=True`表示允许从SQLAlchemy等ORM对象创建。`populate_by_name=True`表示允许通过字段的别名alias来赋值 `json_encoders`表示自定义特定类型的 JSON 序列化方式。
# 三、服务层
## 3.1 查询操作
@@ -584,3 +587,234 @@ def delete_blog(db: Session, blog_id: int) -> bool:
return True
```
# 四、路由层
```python
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="当前页码从1开始"),
page_size: int = Query(10, ge=1, le=100, alias="pageSize", description="每页显示数量1-100之间"),
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.post("", summary="新增博客内容", response_model=bool)
def add_blog(
blog: BlogCreate = Body(..., description="博客创建数据"),
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 = Path(..., ge=1, description="博客ID"),
blog: BlogUpdate = Body(..., description="博客更新数据"),
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 = Path(..., ge=1, description="博客ID"),
db: Session = Depends(get_db),
_=Depends(verify_token)
):
return blog_service.delete_blog(db, blog_id)
@router.put("/{blog_id}/comment", summary="新增博客评论", response_model=bool)
def add_blog_comment(
request: Request,
blog_id: int = Path(..., ge=1, description="博客ID"),
blog_comment: BlogCommentCreate = Body(..., description="博客评论数据"),
db: Session = Depends(get_db)
):
return blog_service.add_blog_comment(db, request, blog_id, blog_comment)
```
  路由装饰器参数中的`response_model`表示定义接口返回的数据模型。
  参数注解中的`Query()`表示参数来自URL查询字符串`Path/Query/Body`分别对应路径参数、查询参数、请求体参数。
  `Depends()`表示依赖注入,自动解析参数或执行依赖函数。
  `db: Session = Depends(get_db)`表示获取数据库连接,`_=Depends(verify_token)`表示验证用户身份。
  `request: Request`可以获取到HTTP请求的完整上下文信息。
>[!TIP]
>这里的`query: BlogQuery = Depends()`会从查询参数中自动实例化`BlogQuery`对象,并进行数据验证和类型转换。
  注册路由:
```python
from fastapi import FastAPI
from .blog import router as blog_router
def register_routers(app: FastAPI):
app.include_router(blog_router, prefix="")
# main.py
app = FastAPI(title="Blog Service")
register_routers(app)
```
# 五、中间件
## 5.1 全局异常处理器
```python
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)}")
return JSONResponse(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
content={"message": "数据库操作失败", "details": str(e)})
except Exception as e:
# 记录未知异常(带堆栈信息)
logger.critical(f"未知异常: {str(e)}")
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"},
)
```
## 5.2 日志处理器
```python
import atexit
import sys
from fluent import sender
from loguru import logger
from config.setting import settings
FLUENTD_HOST = settings.FLUENTD_HOST
FLUENTD_PORT = 24224
TOPIC_TAG = 'blog-service'
# 日志级别
LOG_LEVEL = settings.LOG_LEVEL.upper()
# 日志格式
STDOUT_FORMAT = (
"<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | "
"<level>{level: <8}</level> | "
"<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - "
"<level>{message}</level>"
)
FILE_FORMAT = (
"{time:YYYY-MM-DD HH:mm:ss.SSS} | "
"{level: <8} | "
"{name}:{function}:{line} - {message}"
)
fluent_sender = sender.FluentSender(
tag=TOPIC_TAG,
host=FLUENTD_HOST,
port=FLUENTD_PORT,
buffer_max_size=8 * 1024 * 1024,
timeout=3.0,
retry_timeout=60
)
def log_to_fluent(message):
try:
record = message.record
# 构建结构化日志数据
log_data = {
'topic': TOPIC_TAG,
'timestamp': record['time'].timestamp(),
'level': record['level'].name.lower(),
'message': record['message'],
'source': f"{record['file'].path}:{record['line']}",
'module': record['module'],
'function': record['function'],
'process_id': record['process'].id,
'thread_id': record['thread'].id,
**record['extra']
}
if not fluent_sender.emit(TOPIC_TAG, log_data):
print(f"Fluentd 发送失败: {fluent_sender.last_error}")
except Exception as e:
print(f"日志处理异常: {str(e)}")
# 移除默认处理器
logger.remove()
# 添加控制台处理器
logger.add(
sink=sys.stdout,
level=LOG_LEVEL,
format=STDOUT_FORMAT,
colorize=True,
backtrace=True, # 显示完整异常堆栈
diagnose=True, # 显示详细异常信息
)
if settings.ENVIRONMENT == 'docker':
logger.add(
log_to_fluent,
level=LOG_LEVEL, # 处理 INFO 及以上级别
format="{message}", # 原始消息(实际使用结构化数据)
backtrace=True, # 启用堆栈回溯
diagnose=True # 显示诊断信息
)
atexit.register(fluent_sender.close)
# 导出配置好的logger
__all__ = ["logger"]
```

View File

@@ -1,11 +1,32 @@
---
layout: doc
title: Web后端
description: Web后端开发技术文档包含数据库、框架、中间件等
---
# 内容导航
# Web 后端开发
后端开发技术栈的学习笔记和总结。
## 主要内容
- [MySQL知识点](/Web-Backend/MySQL-Knowledge)
- [Flyway简单使用](/Web-Backend/Flyway)
- [MyBatis简介和使用](/Web-Backend/MyBatis)
- [RustFS简介和使用](/Web-Backend/RustFS)
### 🍃 SpringBoot
SpringBoot 框架学习系列:
- [Spring IOC简介](/SpringBoot/SpringIOC)
- [SpringBoot启动流程](/SpringBoot/SpringBoot-Start-Process)
- [Spring MVC简介](/SpringBoot/SpringMVC)
- [SpringBoot Starter原理](/SpringBoot/SpringBootStarter)
- [SpringBoot Bean简介](/SpringBoot/SpringBootBean)
- [SpringBoot3原生镜像](/SpringBoot/SpringBoot3-GraalVM)
### 🐍 FastAPI
Python FastAPI 框架学习:
- [FastAPI基础教程](/FastAPI/FastAPI-Guide)
- [基于OAuth2的FastApi安全验证](/FastAPI/OAuth2)

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -1,8 +1,14 @@
---
layout: doc
title: Web前端
description: Web前端开发技术文档
---
# 内容导航
# Web 前端开发
前端开发技术栈的学习笔记和总结。
## 主要内容
- [Vue3-Common](/Web-Front/Vue3-Common)
- [JavaScript知识点整理](/Web-Front/JavaScript-Guide)