提交文件
This commit is contained in:
293
.qoder/repowiki/zh/content/系统架构/技术栈选型.md
Normal file
293
.qoder/repowiki/zh/content/系统架构/技术栈选型.md
Normal file
@@ -0,0 +1,293 @@
|
||||
# 技术栈选型
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/requirements.txt](file://backend/requirements.txt)
|
||||
- [frontend/package.json](file://frontend/package.json)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue)
|
||||
- [frontend/src/assets/main.scss](file://frontend/src/assets/main.scss)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
本技术栈选型文档面向医院绩效系统,系统采用前后端分离架构:后端基于 Python 的 FastAPI + SQLAlchemy 2.0 + PostgreSQL,前端基于 Vue 3 + Element Plus + ECharts,构建工具采用 Vite。本文档从性能特征、社区支持度与长期维护性三个维度,系统阐述技术栈选择的理由,并结合代码实现细节进行验证。
|
||||
|
||||
## 项目结构
|
||||
项目采用典型的前后端分离目录组织方式:
|
||||
- 后端:Python 项目,包含 API 路由、核心配置、数据库模型与 Alembic 迁移等模块
|
||||
- 前端:Vue 3 单页应用,包含路由、状态管理、视图组件与样式资源
|
||||
- 文档:系统架构、数据库设计、前后端接口等文档
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端"
|
||||
A["FastAPI 应用<br/>app/main.py"]
|
||||
B["核心配置<br/>app/core/config.py"]
|
||||
C["数据库引擎<br/>app/core/database.py"]
|
||||
D["数据模型<br/>app/models/models.py"]
|
||||
E["API 路由<br/>app/api/v1/*"]
|
||||
F["服务层<br/>app/services/*"]
|
||||
G["迁移配置<br/>alembic/env.py"]
|
||||
end
|
||||
subgraph "前端"
|
||||
H["Vite 构建<br/>vite.config.js"]
|
||||
I["入口应用<br/>src/main.js"]
|
||||
J["路由配置<br/>src/router/index.js"]
|
||||
K["视图组件<br/>src/views/*"]
|
||||
L["全局样式<br/>src/assets/main.scss"]
|
||||
end
|
||||
A --> B
|
||||
A --> C
|
||||
A --> E
|
||||
E --> F
|
||||
F --> C
|
||||
C --> D
|
||||
G --> D
|
||||
H --> I
|
||||
I --> J
|
||||
J --> K
|
||||
I --> L
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L80)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L10-L65)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L80)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
|
||||
## 核心组件
|
||||
- 后端框架:FastAPI 提供高性能异步 Web 框架,内置 OpenAPI 文档与自动校验,便于构建高质量 API
|
||||
- ORM 层:SQLAlchemy 2.0 提供异步引擎与声明式映射,支持复杂关系与索引优化
|
||||
- 数据库:PostgreSQL 支持事务一致性与 JSON/JSONB 字段,满足绩效数据的结构化与半结构化存储需求
|
||||
- 前端框架:Vue 3 Composition API 提供现代化开发体验与更好的逻辑复用
|
||||
- UI 生态:Element Plus 提供企业级组件库,覆盖表格、表单、图表等管理场景
|
||||
- 可视化:ECharts 提供丰富的图表类型,满足多维度数据展示与交互
|
||||
- 构建工具:Vite 提供快速热更新与高效打包,适配现代前端工程化
|
||||
|
||||
**章节来源**
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L21)
|
||||
|
||||
## 架构概览
|
||||
系统采用前后端分离架构,后端通过 FastAPI 暴露 REST 接口,前端通过 Axios 发起请求,Vite 提供本地开发代理与构建能力。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
FE["前端应用<br/>Vue 3 + Element Plus + ECharts"]
|
||||
VITE["Vite 开发服务器<br/>vite.config.js"]
|
||||
API["FastAPI 应用<br/>app/main.py"]
|
||||
DB["PostgreSQL 数据库"]
|
||||
ORM["SQLAlchemy 2.0<br/>异步引擎"]
|
||||
FE --> |HTTP 请求| VITE
|
||||
VITE --> |代理转发| API
|
||||
API --> ORM
|
||||
ORM --> DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L20)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L53-L56)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 后端技术栈选型分析
|
||||
- FastAPI 的高性能异步特性
|
||||
- 应用启动与中间件配置展示了异步应用实例创建、CORS 中间件与健康检查端点
|
||||
- 异常处理统一记录,便于问题定位与日志审计
|
||||
- SQLAlchemy 2.0 的对象关系映射能力
|
||||
- 异步引擎与会话工厂确保并发安全与连接池管理
|
||||
- 模型定义包含枚举类型、索引与约束,体现业务规则与查询优化
|
||||
- PostgreSQL 的事务处理与 JSON 支持
|
||||
- 配置中使用 asyncpg 驱动,支持异步连接
|
||||
- 模型中多处使用 JSON/JSONB 字段存储结构化配置与参数
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class FastAPI应用 {
|
||||
+创建应用实例()
|
||||
+注册路由()
|
||||
+CORS中间件()
|
||||
+健康检查()
|
||||
+异常处理()
|
||||
}
|
||||
class 异步引擎 {
|
||||
+create_async_engine()
|
||||
+连接池配置()
|
||||
}
|
||||
class 数据库会话 {
|
||||
+AsyncSession()
|
||||
+事务提交()
|
||||
+回滚处理()
|
||||
}
|
||||
class 数据模型 {
|
||||
+枚举类型()
|
||||
+索引与约束()
|
||||
+JSON字段()
|
||||
}
|
||||
FastAPI应用 --> 异步引擎 : "使用"
|
||||
异步引擎 --> 数据库会话 : "创建"
|
||||
数据库会话 --> 数据模型 : "持久化"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L146)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L146)
|
||||
|
||||
### 前端技术栈选型分析
|
||||
- Vue 3 Composition API 的现代化开发体验
|
||||
- 入口应用初始化 Pinia、路由与 Element Plus,提供全局组件注册与国际化
|
||||
- 路由配置采用动态导入与导航守卫,保障页面标题与访问控制
|
||||
- Element Plus 的 UI 组件生态
|
||||
- 全局样式覆盖了卡片、表格、搜索栏与状态标签等常用布局
|
||||
- 图标按需注册,减少包体积
|
||||
- ECharts 的数据可视化能力
|
||||
- 仪表盘、趋势图、饼图、柱状图等多种图表类型在仪表板中组合使用
|
||||
- 图表初始化、选项配置与窗口自适应均在组件内集中处理
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 浏览器 as "浏览器"
|
||||
participant Vite as "Vite 代理"
|
||||
participant 前端 as "Vue 应用"
|
||||
participant 后端 as "FastAPI"
|
||||
浏览器->>Vite : 访问 / (开发模式)
|
||||
Vite-->>浏览器 : 返回前端页面
|
||||
前端->>后端 : GET /api/v1/auth/login
|
||||
后端-->>前端 : {access_token}
|
||||
前端->>后端 : GET /api/v1/staff?page=1&page_size=20
|
||||
后端-->>前端 : 员工列表数据
|
||||
前端->>后端 : GET /api/v1/stats/dashboard
|
||||
后端-->>前端 : 统计与图表数据
|
||||
前端-->>浏览器 : 渲染仪表板
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L20)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L12-L21)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L113)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/assets/main.scss](file://frontend/src/assets/main.scss#L95-L124)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L423-L448)
|
||||
|
||||
### 构建工具 Vite 的选择理由
|
||||
- 开发体验:内置代理与热更新,开发时自动转发 /api 前缀到后端
|
||||
- 依赖管理:与 Vue 3 生态无缝集成,插件生态完善
|
||||
- 版本兼容:Vue 3 与 Vite 5.x 均为稳定版本,社区支持度高
|
||||
|
||||
**章节来源**
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [frontend/package.json](file://frontend/package.json#L21-L25)
|
||||
|
||||
## 依赖分析
|
||||
后端依赖通过 requirements.txt 明确声明,前端依赖通过 package.json 管理。两者均采用语义化版本控制,保证升级的稳定性与可追踪性。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "后端依赖"
|
||||
R1["FastAPI"]
|
||||
R2["SQLAlchemy 2.0"]
|
||||
R3["asyncpg"]
|
||||
R4["Alembic"]
|
||||
R5["Pydantic"]
|
||||
end
|
||||
subgraph "前端依赖"
|
||||
F1["Vue 3"]
|
||||
F2["Element Plus"]
|
||||
F3["ECharts"]
|
||||
F4["Vite"]
|
||||
end
|
||||
R1 --> R2
|
||||
R2 --> R3
|
||||
R2 --> R4
|
||||
R1 --> R5
|
||||
F1 --> F2
|
||||
F1 --> F3
|
||||
F4 --> F1
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
|
||||
**章节来源**
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
|
||||
## 性能考量
|
||||
- 后端性能特征
|
||||
- 异步 I/O 与连接池:异步引擎与连接池配置提升并发吞吐
|
||||
- ORM 查询优化:索引与约束定义有助于查询性能
|
||||
- 事务一致性:PostgreSQL 事务保障数据一致性
|
||||
- 前端性能特征
|
||||
- 按需加载:路由与组件动态导入减少首屏体积
|
||||
- 图表渲染:ECharts 采用 Canvas 渲染,适合大数据量展示
|
||||
- 样式优化:统一的主题变量与布局样式提升渲染效率
|
||||
- 社区支持度与长期维护性
|
||||
- FastAPI、SQLAlchemy、Vue 3、Element Plus、ECharts 均为成熟开源项目,社区活跃,版本迭代稳定
|
||||
- 依赖版本明确,便于后续升级与安全补丁维护
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L21)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L423-L448)
|
||||
- [frontend/src/assets/main.scss](file://frontend/src/assets/main.scss#L15-L26)
|
||||
|
||||
## 故障排除指南
|
||||
- 后端常见问题
|
||||
- 数据库连接失败:检查 DATABASE_URL 与 asyncpg 驱动安装
|
||||
- 迁移执行:使用 Alembic 异步迁移配置确保元数据同步
|
||||
- 异常处理:统一异常记录便于定位问题
|
||||
- 前端常见问题
|
||||
- 开发代理:确认 /api 代理指向后端地址
|
||||
- 路由守卫:登录态失效时重定向至登录页
|
||||
- 图表渲染:监听窗口 resize 并调用图表 resize 方法
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L29)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L42-L65)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L20)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L113)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L441-L447)
|
||||
|
||||
## 结论
|
||||
本技术栈在性能、功能与可维护性之间取得良好平衡:后端利用 FastAPI 的异步能力与 SQLAlchemy 2.0 的 ORM 能力,结合 PostgreSQL 的事务与 JSON 支持,满足医院绩效系统的高并发与复杂数据建模需求;前端通过 Vue 3 + Element Plus + ECharts 提供现代化的管理界面与强大的数据可视化能力;Vite 则确保了高效的开发与构建体验。整体方案具备良好的社区支持与长期维护性,适合持续演进与扩展。
|
||||
455
.qoder/repowiki/zh/content/系统架构/数据流架构.md
Normal file
455
.qoder/repowiki/zh/content/系统架构/数据流架构.md
Normal file
@@ -0,0 +1,455 @@
|
||||
# 数据流架构
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [frontend/src/main.js](file://frontend/src/main.js)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js)
|
||||
- [frontend/src/stores/index.js](file://frontend/src/stores/index.js)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js)
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
|
||||
- [frontend/src/views/finance/Finance.vue](file://frontend/src/views/finance/Finance.vue)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向“医院绩效系统”的数据流架构,覆盖从前端用户交互到后端服务处理,再到数据库持久化的完整链路。重点说明:
|
||||
- 前端状态管理(Pinia Store)的状态变更、组件数据绑定与响应式更新机制
|
||||
- 后端服务层的数据处理流程(业务逻辑、数据验证、异常处理、结果返回)
|
||||
- 数据库层的数据存储与查询优化策略
|
||||
- 典型业务场景的数据流示例与性能优化建议
|
||||
|
||||
## 项目结构
|
||||
系统采用前后端分离架构:
|
||||
- 前端基于 Vue 3 + Pinia + Element Plus,通过路由驱动页面导航与状态管理
|
||||
- 后端基于 FastAPI + SQLAlchemy 2.0 异步 ORM,提供 RESTful 接口与统一异常处理
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_Main["main.js<br/>应用初始化"]
|
||||
FE_Router["router/index.js<br/>路由与守卫"]
|
||||
FE_Store_User["stores/user.js<br/>用户状态"]
|
||||
FE_Store_App["stores/app.js<br/>应用状态"]
|
||||
FE_API["api/*<br/>接口封装"]
|
||||
FE_View_Assess["views/assessment/Assessments.vue<br/>考核列表视图"]
|
||||
FE_View_Finance["views/finance/Finance.vue<br/>财务核算视图"]
|
||||
end
|
||||
subgraph "后端"
|
||||
BE_App["app/main.py<br/>FastAPI 应用"]
|
||||
BE_Router["api/v1/__init__.py<br/>路由聚合"]
|
||||
BE_API_Assess["api/v1/assessments.py<br/>考核API"]
|
||||
BE_Service_Assess["services/assessment_service.py<br/>考核服务"]
|
||||
BE_Models["models/models.py<br/>数据模型"]
|
||||
BE_DB["core/database.py<br/>异步数据库"]
|
||||
BE_Config["core/config.py<br/>系统配置"]
|
||||
end
|
||||
FE_Main --> FE_Router
|
||||
FE_Router --> FE_View_Assess
|
||||
FE_Router --> FE_View_Finance
|
||||
FE_View_Assess --> FE_Store_User
|
||||
FE_View_Assess --> FE_Store_App
|
||||
FE_View_Finance --> FE_Store_App
|
||||
FE_View_Assess --> FE_API
|
||||
FE_View_Finance --> FE_API
|
||||
FE_API --> BE_App
|
||||
BE_App --> BE_Router
|
||||
BE_Router --> BE_API_Assess
|
||||
BE_API_Assess --> BE_Service_Assess
|
||||
BE_Service_Assess --> BE_Models
|
||||
BE_Models --> BE_DB
|
||||
BE_App --> BE_Config
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [frontend/src/views/finance/Finance.vue](file://frontend/src/views/finance/Finance.vue#L1-L614)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
|
||||
## 核心组件
|
||||
- 前端应用入口与依赖注入:注册 Pinia、路由、UI 组件库,挂载应用实例
|
||||
- 路由与导航:定义页面路由、面包屑标题、登录守卫
|
||||
- 状态管理:用户登录态与 Token、全局应用状态(如侧边栏折叠、科室树)
|
||||
- API 层:统一请求封装与各模块接口导出
|
||||
- 视图组件:业务视图负责数据加载、交互与调用 API
|
||||
- 后端应用:FastAPI 实例、CORS、异常处理、健康检查
|
||||
- 路由聚合:按功能模块组织 API 路由
|
||||
- 服务层:业务逻辑封装(如考核 CRUD、状态机流转)
|
||||
- 数据模型:ORM 映射与索引、约束
|
||||
- 数据库:异步引擎、会话工厂、依赖注入
|
||||
- 配置:应用名、版本、数据库、JWT、跨域、分页等
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/stores/index.js](file://frontend/src/stores/index.js#L1-L3)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
## 架构总览
|
||||
以下序列图展示一次“用户登录”到“获取考核列表”的端到端数据流。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant V as "Assessments.vue"
|
||||
participant S as "Pinia 用户Store"
|
||||
participant A as "API 封装"
|
||||
participant F as "FastAPI 应用"
|
||||
participant R as "路由/中间件"
|
||||
participant SVC as "AssessmentService"
|
||||
participant DB as "数据库"
|
||||
U->>V : 输入账号密码并点击登录
|
||||
V->>S : 调用 login(username,password)
|
||||
S->>A : 调用登录接口(loginApi)
|
||||
A->>F : POST /api/v1/auth/login
|
||||
F->>R : CORS/异常处理
|
||||
R-->>F : 路由匹配
|
||||
F-->>A : 返回 access_token
|
||||
A-->>S : 返回 token
|
||||
S-->>V : 更新 token 与用户信息
|
||||
V->>S : 调用 getUserInfo()
|
||||
S->>A : 调用获取用户信息接口
|
||||
A->>F : GET /api/v1/auth/me
|
||||
F->>R : 鉴权/异常处理
|
||||
R-->>F : 路由匹配
|
||||
F-->>A : 返回用户信息
|
||||
A-->>S : 返回用户信息
|
||||
S-->>V : 更新 userInfo
|
||||
V->>A : 请求考核列表(getAssessments)
|
||||
A->>F : GET /api/v1/assessments
|
||||
F->>R : 鉴权/异常处理
|
||||
R-->>F : 路由匹配
|
||||
F->>SVC : 调用 AssessmentService.get_list(...)
|
||||
SVC->>DB : 查询/分页/聚合
|
||||
DB-->>SVC : 结果集
|
||||
SVC-->>F : 业务结果
|
||||
F-->>A : 统一响应包装
|
||||
A-->>V : 返回列表数据
|
||||
V-->>U : 渲染表格与分页
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L178-L195)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L10-L31)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L4-L6)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L20-L52)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L18-L55)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 前端状态管理与组件数据绑定
|
||||
- Pinia Store
|
||||
- 用户 Store:维护 token 与用户信息,支持登录、获取用户信息、登出;登录成功写入本地存储并触发路由跳转
|
||||
- 应用 Store:维护侧边栏折叠状态与科室树,提供加载科室树能力
|
||||
- 组件数据绑定与响应式更新
|
||||
- 视图组件通过响应式数据(ref/reactive)绑定表单与表格
|
||||
- 组件在 mounted 生命周期触发数据加载,使用 Promise.all 并行拉取多个接口
|
||||
- 组件内部通过 ElMessage、ElMessageBox 进行用户反馈与二次确认
|
||||
- 路由守卫
|
||||
- 未登录访问受保护路由时自动跳转登录页
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["组件挂载"]) --> LoadDept["加载科室树"]
|
||||
LoadDept --> LoadIndicators["加载有效指标"]
|
||||
LoadIndicators --> LoadAssessments["加载考核列表"]
|
||||
LoadAssessments --> Render["渲染表格/分页"]
|
||||
Render --> Interact{"用户交互?"}
|
||||
Interact --> |查询/分页| LoadAssessments
|
||||
Interact --> |提交/审核/确认| CallAPI["调用对应 API"]
|
||||
CallAPI --> Refresh["刷新列表/详情"]
|
||||
Refresh --> Render
|
||||
Interact --> |批量创建| Batch["打开批量创建对话框"]
|
||||
Batch --> SubmitBatch["提交批量创建请求"]
|
||||
SubmitBatch --> Refresh
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L178-L292)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L14-L22)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L10-L31)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L113)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
|
||||
### 后端服务层数据处理流程
|
||||
- API 路由
|
||||
- 考核模块提供列表、详情、创建、更新、提交、审核、确认、批量创建等接口
|
||||
- 使用依赖注入获取数据库会话与当前用户,进行鉴权与权限校验
|
||||
- 服务层
|
||||
- AssessmentService 封装业务逻辑:列表查询(含多条件过滤与分页)、详情加载(含关联预加载)、创建(计算总分与加权得分、批量写入明细)、更新(状态限制、重建明细)、状态机流转(提交/审核/确认)
|
||||
- 数据模型与索引
|
||||
- 模型定义了主键、外键、枚举、索引与约束,确保数据一致性与查询效率
|
||||
- 例如:考核记录按 staff、period、status 建立复合索引,便于筛选与排序
|
||||
- 数据库与配置
|
||||
- 异步引擎与会话工厂,依赖注入在请求生命周期内自动 commit/rollback/close
|
||||
- 配置集中管理数据库连接池、JWT、跨域、分页等参数
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant C as "客户端"
|
||||
participant API as "Assessments API"
|
||||
participant AUTH as "鉴权中间件"
|
||||
participant SVC as "AssessmentService"
|
||||
participant DB as "数据库"
|
||||
C->>API : POST /api/v1/assessments/{id}/review
|
||||
API->>AUTH : 校验当前用户(需管理员/经理)
|
||||
AUTH-->>API : 通过
|
||||
API->>SVC : review(assessment_id, reviewer_id, approved, remark)
|
||||
SVC->>DB : 查询考核记录(状态=SUBMITTED)
|
||||
DB-->>SVC : 考核记录
|
||||
SVC->>DB : 更新状态/时间/备注
|
||||
DB-->>SVC : 提交成功
|
||||
SVC-->>API : 返回结果
|
||||
API-->>C : 统一响应
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L118-L145)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L172-L192)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L178)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
### 数据库层存储与查询优化
|
||||
- 异步 ORM 与依赖注入
|
||||
- 使用 async_session_maker 管理会话生命周期,确保异常时回滚与关闭
|
||||
- 索引与约束
|
||||
- 模型层面为高频查询字段建立索引(如部门类型、员工状态、考核记录的 staff/period/status 等)
|
||||
- 使用 CheckConstraint 等约束保证数据完整性
|
||||
- 查询优化建议
|
||||
- 使用 selectinload 预加载关联对象,减少 N+1 查询
|
||||
- 列表查询结合分页与条件过滤,避免一次性加载全量数据
|
||||
- 对高并发场景适当调整数据库连接池大小与超时参数
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L82-L85)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L111-L114)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L174-L178)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L227-L230)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
|
||||
### 典型业务场景数据流示例
|
||||
|
||||
#### 场景一:批量创建考核
|
||||
- 前端
|
||||
- 打开批量创建对话框,选择科室、考核周期与指标集合
|
||||
- 调用批量创建接口,后端按科室在职员工生成考核记录并写入明细
|
||||
- 后端
|
||||
- 服务层查询在职员工,去重检查后批量创建
|
||||
- 返回创建数量与成功状态
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant V as "Assessments.vue"
|
||||
participant A as "API 封装"
|
||||
participant API as "Assessments API"
|
||||
participant SVC as "AssessmentService"
|
||||
participant DB as "数据库"
|
||||
V->>A : batchCreateAssessments({department_id, period_year, period_month, indicators})
|
||||
A->>API : POST /api/v1/assessments/batch-create
|
||||
API->>SVC : batch_create_for_department(...)
|
||||
SVC->>DB : 查询在职员工
|
||||
SVC->>DB : 检查是否存在
|
||||
SVC->>DB : 批量插入Assessment/AssessmentDetail
|
||||
DB-->>SVC : 插入成功
|
||||
SVC-->>API : 返回数量
|
||||
API-->>A : 统一响应
|
||||
A-->>V : 刷新列表
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L257-L286)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L38-L49)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L148-L165)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L208-L262)
|
||||
|
||||
#### 场景二:财务核算数据展示与编辑
|
||||
- 前端
|
||||
- 选择科室与月份,加载收入/支出/汇总与结余数据
|
||||
- 支持新增/编辑/删除财务记录,统一金额格式化显示
|
||||
- 后端
|
||||
- 提供收入/支出查询、结余汇总、科室汇总、类别枚举等接口
|
||||
- 服务层按条件过滤与聚合,返回结构化结果
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant V as "Finance.vue"
|
||||
participant A as "API 封装"
|
||||
participant API as "Finance API"
|
||||
participant DB as "数据库"
|
||||
V->>A : getRevenue/getExpense/getBalance/getDepartmentSummary
|
||||
A->>API : GET /api/v1/finance/*
|
||||
API->>DB : 查询/聚合
|
||||
DB-->>API : 结果集
|
||||
API-->>A : 统一响应
|
||||
A-->>V : 渲染汇总与表格
|
||||
V->>A : create/update/delete
|
||||
A->>API : POST/PUT/DELETE
|
||||
API->>DB : 写入/更新/删除
|
||||
DB-->>API : 成功
|
||||
API-->>A : 统一响应
|
||||
A-->>V : 刷新数据
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/finance/Finance.vue](file://frontend/src/views/finance/Finance.vue#L329-L384)
|
||||
- [frontend/src/views/finance/Finance.vue](file://frontend/src/views/finance/Finance.vue#L451-L505)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [frontend/src/views/finance/Finance.vue](file://frontend/src/views/finance/Finance.vue#L1-L614)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L148-L165)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L1-L79)
|
||||
|
||||
## 依赖关系分析
|
||||
- 前端
|
||||
- main.js 作为入口,注册 Pinia 与路由
|
||||
- router/index.js 定义路由与守卫
|
||||
- stores/* 提供用户与应用状态
|
||||
- api/* 封装请求,视图组件通过 API 调用后端
|
||||
- 后端
|
||||
- app/main.py 创建 FastAPI 实例,注册路由与异常处理
|
||||
- api/v1/__init__.py 聚合各模块路由
|
||||
- api/v1/assessments.py 定义具体接口与依赖注入
|
||||
- services/assessment_service.py 实现业务逻辑
|
||||
- models/models.py 定义数据模型与索引
|
||||
- core/database.py 提供异步数据库依赖
|
||||
- core/config.py 提供配置项
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FE_Main["frontend/src/main.js"] --> FE_Router["frontend/src/router/index.js"]
|
||||
FE_Router --> FE_Views["frontend/src/views/*"]
|
||||
FE_Views --> FE_API["frontend/src/api/*"]
|
||||
FE_API --> BE_App["backend/app/main.py"]
|
||||
BE_App --> BE_Router["backend/app/api/v1/__init__.py"]
|
||||
BE_Router --> BE_API_Assess["backend/app/api/v1/assessments.py"]
|
||||
BE_API_Assess --> BE_Service["backend/app/services/assessment_service.py"]
|
||||
BE_Service --> BE_Models["backend/app/models/models.py"]
|
||||
BE_Models --> BE_DB["backend/app/core/database.py"]
|
||||
BE_App --> BE_Config["backend/app/core/config.py"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
|
||||
## 性能考虑
|
||||
- 前端
|
||||
- 并行加载:视图组件使用 Promise.all 并行请求多个接口,减少等待时间
|
||||
- 分页与缓存:合理设置分页大小,避免一次性加载过多数据;对不频繁变动的数据(如科室树)可做本地缓存
|
||||
- 响应式更新:仅在必要时刷新列表,避免不必要的重渲染
|
||||
- 后端
|
||||
- 预加载与索引:使用 selectinload 减少 N+1 查询;为高频查询字段建立索引
|
||||
- 事务与连接池:利用异步会话工厂与连接池提升吞吐;异常时及时回滚
|
||||
- 分页与过滤:接口层严格限制 page_size,防止大页扫描
|
||||
- 数据库
|
||||
- 连接池参数:根据并发与硬件资源调整 pool_size 与 max_overflow
|
||||
- 索引策略:针对过滤条件与排序字段建立复合索引,避免全表扫描
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L377-L384)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L28-L55)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L82-L85)
|
||||
|
||||
## 故障排查指南
|
||||
- 登录失败
|
||||
- 检查前端 Store 是否正确保存 token,查看浏览器本地存储
|
||||
- 后端异常日志:关注 HTTP 异常与请求验证异常处理器输出
|
||||
- 接口报错
|
||||
- 核对请求路径与参数是否符合后端接口定义(如批量创建的重复查询参数)
|
||||
- 查看后端统一异常处理日志,定位具体错误位置
|
||||
- 数据不一致
|
||||
- 确认服务层事务边界与回滚逻辑,检查数据库约束与索引是否生效
|
||||
- 性能问题
|
||||
- 前端:检查是否存在串行请求,是否可以并行加载
|
||||
- 后端:确认查询是否命中索引,分页参数是否合理
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L10-L31)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L38-L49)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L144-L146)
|
||||
|
||||
## 结论
|
||||
本系统通过清晰的前后端职责划分与统一的异常处理机制,实现了从用户交互到数据库持久化的稳定数据流。前端以 Pinia 管理状态与响应式更新,后端以服务层封装业务逻辑并配合 ORM 索引与连接池实现高效查询。建议在高并发场景下进一步优化索引与连接池参数,并持续监控日志与性能指标以保障系统稳定性。
|
||||
|
||||
## 附录
|
||||
- 关键接口与模型概览
|
||||
- 考核相关:Assessments API、AssessmentService、Assessment/AssessmentDetail 模型
|
||||
- 财务相关:Finance 模型、Finance API
|
||||
- 数据库:异步引擎与会话工厂、索引与约束
|
||||
- 开发与部署建议
|
||||
- 前端:使用环境变量区分开发/生产,开启生产模式构建
|
||||
- 后端:使用 .env 文件管理敏感配置,启用健康检查与日志轮转
|
||||
432
.qoder/repowiki/zh/content/系统架构/整体架构设计.md
Normal file
432
.qoder/repowiki/zh/content/系统架构/整体架构设计.md
Normal file
@@ -0,0 +1,432 @@
|
||||
# 整体架构设计
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt)
|
||||
- [frontend/package.json](file://frontend/package.json)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 引言
|
||||
本文件面向“医院绩效系统”的整体架构设计,围绕后端采用 FastAPI 的分层架构与前端 Vue 3 的单页应用(SPA)进行系统化说明。重点涵盖:
|
||||
- 分层架构:表现层(前端)、业务逻辑层(后端服务)、数据访问层(SQLAlchemy 异步 ORM)
|
||||
- 前后端分离:CORS 配置、API 路由前缀、开发代理与跨域处理
|
||||
- 后端应用实例:FastAPI 实例创建、中间件与全局异常处理
|
||||
- 前端初始化:应用挂载、路由守卫与状态管理
|
||||
- 系统启动流程、健康检查与错误处理策略
|
||||
|
||||
## 项目结构
|
||||
系统采用前后端分离的工程组织方式:
|
||||
- 后端(Python/FastAPI):app 目录下按功能分层(core、api、models、schemas、services、utils),通过 APIRouter 聚合路由
|
||||
- 前端(Vue 3/Pinia/Vite):src 下按功能模块组织(api、components、router、stores、views),使用 Vite 开发服务器与代理
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端"
|
||||
A_main["backend/app/main.py<br/>应用入口与中间件"]
|
||||
A_cfg["backend/app/core/config.py<br/>配置中心"]
|
||||
A_db["backend/app/core/database.py<br/>异步数据库引擎"]
|
||||
A_api["backend/app/api/v1/__init__.py<br/>路由聚合"]
|
||||
A_auth["backend/app/api/v1/auth.py<br/>认证路由"]
|
||||
A_srv["backend/app/services/*<br/>业务服务层"]
|
||||
A_models["backend/app/models/models.py<br/>ORM 模型"]
|
||||
end
|
||||
subgraph "前端"
|
||||
F_main["frontend/src/main.js<br/>应用初始化"]
|
||||
F_router["frontend/src/router/index.js<br/>路由与守卫"]
|
||||
F_store_user["frontend/src/stores/user.js<br/>用户状态"]
|
||||
F_store_app["frontend/src/stores/app.js<br/>应用状态"]
|
||||
F_req["frontend/src/api/request.js<br/>HTTP 封装与拦截器"]
|
||||
F_vite["frontend/vite.config.js<br/>开发代理"]
|
||||
end
|
||||
F_main --> F_router
|
||||
F_main --> F_store_user
|
||||
F_main --> F_store_app
|
||||
F_router --> F_req
|
||||
F_store_user --> F_req
|
||||
F_store_app --> F_req
|
||||
F_req --> A_api
|
||||
A_main --> A_cfg
|
||||
A_main --> A_db
|
||||
A_api --> A_auth
|
||||
A_auth --> A_srv
|
||||
A_srv --> A_models
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L14-L74)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L12-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L98-L116)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L6-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L5-L31)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L5-L66)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L21)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L12-L24)
|
||||
|
||||
## 核心组件
|
||||
- 后端应用实例与中间件
|
||||
- 应用实例创建:定义标题、版本、OpenAPI 文档路径前缀,并注册统一 API 前缀
|
||||
- CORS 中间件:允许指定源、凭证、方法与头
|
||||
- 路由注册:include_router 并设置 API 前缀
|
||||
- 健康检查:提供 /health 接口返回系统状态与版本
|
||||
- 全局异常处理:HTTP 异常、请求验证异常与通用异常的日志与抛出
|
||||
- 配置中心
|
||||
- 应用名、版本、调试开关、API 前缀
|
||||
- 数据库连接串、连接池大小
|
||||
- JWT 密钥、算法、过期时间
|
||||
- CORS 允许源列表
|
||||
- 分页默认与最大页大小
|
||||
- 数据库层
|
||||
- 异步引擎与会话工厂
|
||||
- 基类与依赖注入 get_db
|
||||
- 前端应用初始化
|
||||
- 创建 Vue 应用、注册 Element Plus、Pinia、路由
|
||||
- 挂载到 DOM
|
||||
- 路由与守卫
|
||||
- 定义登录页与主布局子路由
|
||||
- beforeEach 守卫:读取本地 token,未登录跳转登录
|
||||
- 状态管理
|
||||
- Pinia Store:用户登录态与信息、应用侧边栏与科室树
|
||||
- HTTP 封装与拦截器
|
||||
- axios 实例:baseURL 为 /api/v1
|
||||
- 请求拦截:自动附加 Bearer Token
|
||||
- 响应拦截:统一错误提示与 401 自动登出
|
||||
- 开发代理
|
||||
- Vite 代理 /api → 后端 8000 端口,解决开发时跨域问题
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L12-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L98-L116)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L6-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L5-L31)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L5-L66)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L21)
|
||||
|
||||
## 架构总览
|
||||
系统采用典型的三层架构与前后端分离模式:
|
||||
- 表现层(前端):Vue 3 SPA,通过 axios 访问后端 API
|
||||
- 业务逻辑层(后端):FastAPI 路由与服务层,封装领域业务
|
||||
- 数据访问层(后端):SQLAlchemy 异步 ORM,提供模型与查询能力
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
FE["前端 Vue 3<br/>src/main.js"] --> RT["路由守卫<br/>router/index.js"]
|
||||
FE --> ST["状态管理<br/>stores/user.js, app.js"]
|
||||
FE --> AX["HTTP 封装<br/>api/request.js"]
|
||||
AX --> API["后端 API 路由<br/>api/v1/*"]
|
||||
API --> SRV["服务层<br/>services/*"]
|
||||
SRV --> DB["数据库层<br/>models + database.py"]
|
||||
DB --> PG["PostgreSQL"]
|
||||
subgraph "后端"
|
||||
MAIN["FastAPI 应用<br/>main.py"]
|
||||
CFG["配置中心<br/>config.py"]
|
||||
CORS["CORS 中间件"]
|
||||
HEALTH["健康检查 /health"]
|
||||
end
|
||||
FE --> MAIN
|
||||
MAIN --> CORS
|
||||
MAIN --> API
|
||||
MAIN --> CFG
|
||||
MAIN --> HEALTH
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L12-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L98-L116)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L6-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L5-L31)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L5-L66)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 后端应用实例与中间件
|
||||
- 应用创建:设置应用元信息、OpenAPI 文档路径、API 前缀
|
||||
- CORS:允许指定源、凭证、通配方法与头
|
||||
- 路由注册:include_router 并使用统一前缀
|
||||
- 健康检查:/health 返回系统状态与版本
|
||||
- 异常处理:HTTP、验证、通用异常分别记录日志并抛出
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant FastAPI as "FastAPI 应用"
|
||||
participant Router as "API 路由"
|
||||
participant Service as "服务层"
|
||||
participant DB as "数据库"
|
||||
Client->>FastAPI : "GET /api/v1/health"
|
||||
FastAPI-->>Client : "{status : healthy, version}"
|
||||
Client->>FastAPI : "POST /api/v1/auth/login"
|
||||
FastAPI->>Router : "转发到 auth 路由"
|
||||
Router->>Service : "调用认证服务"
|
||||
Service->>DB : "查询用户并校验密码"
|
||||
DB-->>Service : "返回用户信息"
|
||||
Service-->>Router : "生成访问令牌"
|
||||
Router-->>Client : "返回 Token"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
|
||||
### 配置中心与数据库层
|
||||
- 配置项:应用名、版本、API 前缀、数据库 URL、JWT、CORS、分页等
|
||||
- 数据库:异步引擎、会话工厂、依赖注入 get_db;模型继承 Base
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["启动"]) --> LoadCfg["加载配置<br/>config.py"]
|
||||
LoadCfg --> InitEngine["创建异步引擎<br/>database.py"]
|
||||
InitEngine --> InitSession["创建会话工厂<br/>database.py"]
|
||||
InitSession --> Ready(["就绪"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
|
||||
### 业务服务层与模型
|
||||
- 服务层:StaffService 提供员工列表、分页、过滤、增删改查等
|
||||
- 模型层:Department、Staff、Assessment、AssessmentDetail、SalaryRecord、PerformancePlan、Indicator、User、Menu、IndicatorTemplate 等
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class StaffService {
|
||||
+get_list(...)
|
||||
+get_by_id(...)
|
||||
+get_by_employee_id(...)
|
||||
+create(...)
|
||||
+update(...)
|
||||
+delete(...)
|
||||
+get_by_department(...)
|
||||
}
|
||||
class Department {
|
||||
+id
|
||||
+name
|
||||
+code
|
||||
+dept_type
|
||||
+parent_id
|
||||
+level
|
||||
+sort_order
|
||||
+is_active
|
||||
+description
|
||||
+created_at
|
||||
+updated_at
|
||||
}
|
||||
class Staff {
|
||||
+id
|
||||
+employee_id
|
||||
+name
|
||||
+department_id
|
||||
+position
|
||||
+title
|
||||
+phone
|
||||
+email
|
||||
+base_salary
|
||||
+performance_ratio
|
||||
+status
|
||||
+hire_date
|
||||
+created_at
|
||||
+updated_at
|
||||
}
|
||||
Staff --> Department : "属于"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
|
||||
|
||||
### 前端应用初始化与路由守卫
|
||||
- 初始化:创建 Vue 应用、注册 Element Plus、Pinia、路由,挂载到 #app
|
||||
- 路由:登录页与主布局子路由,面包屑标题动态设置
|
||||
- 守卫:未登录且访问非登录页重定向至登录
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Browser as "浏览器"
|
||||
participant App as "Vue 应用"
|
||||
participant Router as "路由"
|
||||
participant Store as "Pinia Store"
|
||||
participant API as "后端 API"
|
||||
Browser->>App : "加载 main.js"
|
||||
App->>Router : "use(router)"
|
||||
App->>Store : "use(pinia)"
|
||||
App->>App : "mount('#app')"
|
||||
Browser->>Router : "访问 / 或受保护路由"
|
||||
Router->>Store : "读取 token"
|
||||
alt 无 token
|
||||
Router-->>Browser : "重定向 /login"
|
||||
else 有 token
|
||||
Router-->>Browser : "放行"
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L12-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L98-L116)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L6-L49)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L12-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L98-L116)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L6-L49)
|
||||
|
||||
### 状态管理与 HTTP 封装
|
||||
- 用户状态:登录、获取用户信息、登出(维护 token 与本地存储)
|
||||
- 应用状态:侧边栏折叠、科室树加载
|
||||
- HTTP 封装:axios 实例、请求头携带 Bearer Token、响应统一错误提示与 401 自动登出
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["用户登录"] --> B["保存 token 到 localStorage"]
|
||||
B --> C["store.user.login()"]
|
||||
C --> D["api.request 发起请求"]
|
||||
D --> E{"响应 code == 200 ?"}
|
||||
E --> |是| F["返回数据"]
|
||||
E --> |否| G["Element Plus 错误提示"]
|
||||
D --> H{"HTTP 401 ?"}
|
||||
H --> |是| I["清除 token 并跳转登录"]
|
||||
H --> |否| J["其他错误处理"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L10-L20)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L14-L63)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L6-L49)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L5-L66)
|
||||
|
||||
### 开发代理与跨域处理
|
||||
- Vite 代理:将 /api 前缀请求代理到 http://localhost:8000
|
||||
- CORS:后端配置允许前端开发地址(如 3000/5173)
|
||||
|
||||
章节来源
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L21)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L28-L29)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L41-L48)
|
||||
|
||||
## 依赖关系分析
|
||||
- 后端依赖
|
||||
- FastAPI、Uvicorn、SQLAlchemy 2.0、asyncpg、Pydantic、Pydantic Settings、Passlib、python-dotenv、httpx、pytest
|
||||
- 前端依赖
|
||||
- Vue 3、Vue Router、Pinia、Axios、Element Plus、@element-plus/icons-vue、ECharts、Day.js、Vite
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "后端依赖"
|
||||
R_fastapi["fastapi"]
|
||||
R_sql["sqlalchemy >= 2.0"]
|
||||
R_asyncpg["asyncpg"]
|
||||
R_pyd["pydantic-settings"]
|
||||
R_pass["passlib[bcrypt]"]
|
||||
R_httpx["httpx"]
|
||||
R_uv["uvicorn"]
|
||||
end
|
||||
subgraph "前端依赖"
|
||||
F_vue["vue"]
|
||||
F_router["vue-router"]
|
||||
F_pinia["pinia"]
|
||||
F_axios["axios"]
|
||||
F_elplus["element-plus"]
|
||||
F_vite["vite"]
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
|
||||
章节来源
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
|
||||
## 性能考虑
|
||||
- 数据库连接池:通过配置项设置连接池大小与溢出数量,避免高并发下的连接争用
|
||||
- 异步 I/O:使用 SQLAlchemy 异步引擎与会话,提升并发吞吐
|
||||
- 分页与索引:服务层对列表查询使用分页与排序,模型层建立常用查询索引
|
||||
- 前端缓存:Pinia Store 缓存用户与科室树,减少重复请求
|
||||
- 日志与监控:后端记录异常日志,结合外部日志系统进行追踪
|
||||
|
||||
## 故障排查指南
|
||||
- 健康检查
|
||||
- 访问 /health 确认后端运行状态与版本
|
||||
- CORS 问题
|
||||
- 确认前端开发端口在后端 CORS 允许列表中
|
||||
- 确认代理配置正确(/api → 8000)
|
||||
- 认证失败
|
||||
- 检查 token 是否存在与有效
|
||||
- 查看 401 自动登出逻辑与错误提示
|
||||
- 数据库连接
|
||||
- 检查 DATABASE_URL、连接池配置与 PostgreSQL 可达性
|
||||
- 异常定位
|
||||
- 查看后端日志与异常处理器输出,结合请求方法与 URL 进行定位
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L53-L76)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L38-L63)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L21)
|
||||
|
||||
## 结论
|
||||
本系统采用清晰的分层架构与前后端分离模式,后端以 FastAPI 为核心,结合 SQLAlchemy 异步 ORM 与 Pydantic 校验,提供稳定可靠的接口能力;前端以 Vue 3 为基础,配合 Pinia 与 Axios,构建现代化的交互体验。通过统一的 API 前缀、CORS 配置与开发代理,确保跨域与开发效率。建议在生产环境中进一步完善鉴权、限流、审计与监控体系。
|
||||
|
||||
## 附录
|
||||
- 启动顺序建议
|
||||
- 后端:启动 Uvicorn 服务(main.py 中的 if __name__ 主入口)
|
||||
- 前端:启动 Vite 开发服务器(package.json scripts dev)
|
||||
- 常用命令
|
||||
- 后端:uvicorn --reload app.main:app --host 0.0.0.0 --port 8000
|
||||
- 前端:npm run dev
|
||||
371
.qoder/repowiki/zh/content/系统架构/系统架构.md
Normal file
371
.qoder/repowiki/zh/content/系统架构/系统架构.md
Normal file
@@ -0,0 +1,371 @@
|
||||
# 系统架构
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js)
|
||||
- [frontend/package.json](file://frontend/package.json)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js)
|
||||
- [docs/backend.md](file://docs/backend.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本系统为“医院绩效管理系统”,采用前后端分离架构,后端基于 FastAPI + SQLAlchemy 2.0 + PostgreSQL 的现代化技术栈,前端基于 Vue 3 + Pinia + Element Plus,提供绩效计划、指标模板、员工与科室管理、考核记录、统计分析、薪酬计算与财务核算等核心功能模块。系统通过异步 I/O 和数据库连接池提升并发能力,并通过统一的 API 前缀与跨域策略实现前后端协同。
|
||||
|
||||
## 项目结构
|
||||
系统分为后端与前端两大子工程,分别位于 backend 与 frontend 目录。后端使用 FastAPI 提供 REST API,按功能模块划分 v1 子路由;前端使用 Vite 构建,通过 Vue Router 实现页面路由,Pinia 管理全局状态,Axios 发起请求并通过代理转发到后端。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端(Frontend)"
|
||||
FE_Main["frontend/src/main.js"]
|
||||
FE_Router["frontend/src/router/index.js"]
|
||||
FE_Store["frontend/src/stores/user.js"]
|
||||
FE_Vite["frontend/vite.config.js"]
|
||||
end
|
||||
subgraph "后端(Backend)"
|
||||
BE_App["backend/app/main.py"]
|
||||
BE_Config["backend/app/core/config.py"]
|
||||
BE_DB["backend/app/core/database.py"]
|
||||
BE_API_Init["backend/app/api/v1/__init__.py"]
|
||||
BE_Auth["backend/app/api/v1/auth.py"]
|
||||
BE_StaffSvc["backend/app/services/staff_service.py"]
|
||||
BE_Req["backend/requirements.txt"]
|
||||
end
|
||||
FE_Main --> FE_Router
|
||||
FE_Main --> FE_Store
|
||||
FE_Vite --> BE_App
|
||||
FE_Router --> FE_Store
|
||||
FE_Store --> BE_Auth
|
||||
BE_App --> BE_API_Init
|
||||
BE_API_Init --> BE_Auth
|
||||
BE_App --> BE_DB
|
||||
BE_DB --> BE_Config
|
||||
BE_Req --> BE_App
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
|
||||
## 核心组件
|
||||
- 后端应用实例与中间件
|
||||
- 应用创建、CORS 中间件、健康检查端点、异常处理器均在后端入口集中配置,确保统一的系统行为与可观测性。
|
||||
- 配置中心
|
||||
- 使用 pydantic-settings 管理应用名称、版本、API 前缀、数据库连接串、JWT 密钥与过期时间、跨域白名单、分页参数等。
|
||||
- 数据库层
|
||||
- 异步 SQLAlchemy 引擎与会话工厂,支持连接池与自动回滚/提交,提供统一的依赖注入接口。
|
||||
- API 路由聚合
|
||||
- v1 路由聚合器统一注册认证、员工、科室、指标、考核、薪酬、统计、财务、计划、菜单、模板等模块路由。
|
||||
- 业务服务层
|
||||
- 以 StaffService 为代表的典型服务层,封装查询、分页、条件过滤、增删改等操作,保证领域逻辑复用与清晰职责。
|
||||
- 前端应用
|
||||
- Vue 3 应用初始化、Pinia 状态管理、Element Plus UI、路由守卫与本地存储鉴权,Vite 开发服务器与代理配置。
|
||||
- 前端状态与路由
|
||||
- 用户登录状态持久化、路由守卫拦截未登录访问、API 请求通过 Axios 发起并与后端统一前缀对接。
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
|
||||
## 架构总览
|
||||
系统采用前后端分离与模块化 API 设计,后端以 FastAPI 为核心,提供 REST 接口;前端通过 Axios 与后端交互,使用 Vue Router 管理页面导航,Pinia 管理用户态与全局状态。数据库采用 PostgreSQL,配合 SQLAlchemy 2.0 异步 ORM 与 Alembic 迁移工具,保障数据一致性与演进能力。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
Client["浏览器/客户端"]
|
||||
FE["前端应用<br/>Vue 3 + Pinia + Element Plus"]
|
||||
Proxy["Vite 开发代理<br/>/api -> 后端"]
|
||||
API["FastAPI 应用<br/>路由聚合 + 中间件"]
|
||||
DB["PostgreSQL 数据库"]
|
||||
ORM["SQLAlchemy 2.0 异步 ORM"]
|
||||
Client --> FE
|
||||
FE --> Proxy
|
||||
Proxy --> API
|
||||
API --> ORM
|
||||
ORM --> DB
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L19-L48)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 后端应用与中间件
|
||||
- 应用创建与文档
|
||||
- 通过工厂函数创建 FastAPI 实例,设置标题、版本、OpenAPI 文档路径与描述,便于自动生成 API 文档。
|
||||
- CORS 与路由
|
||||
- 注册 CORS 中间件与统一 API 前缀,include_router 将 v1 路由聚合器挂载至指定前缀。
|
||||
- 异常处理
|
||||
- 全局注册 HTTP 异常、请求校验异常与通用异常处理器,统一记录日志并向上抛出,便于调试与监控。
|
||||
- 健康检查
|
||||
- 提供 /health 端点返回系统状态与版本信息,便于容器编排与运维监控。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant C as "客户端"
|
||||
participant F as "前端(Vite代理)"
|
||||
participant A as "FastAPI应用"
|
||||
participant R as "路由(v1)"
|
||||
participant S as "服务层"
|
||||
participant D as "数据库"
|
||||
C->>F : "GET /api/v1/...示例"
|
||||
F->>A : "转发请求"
|
||||
A->>R : "路由匹配"
|
||||
R->>S : "调用业务方法"
|
||||
S->>D : "异步查询/写入"
|
||||
D-->>S : "结果集"
|
||||
S-->>R : "业务结果"
|
||||
R-->>A : "响应对象"
|
||||
A-->>F : "HTTP 响应"
|
||||
F-->>C : "返回数据"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
|
||||
### 配置与数据库层
|
||||
- 配置项
|
||||
- 应用名称、版本、API 前缀、数据库连接串、连接池大小、JWT 签发与过期、跨域白名单、默认/最大分页大小等。
|
||||
- 数据库引擎与会话
|
||||
- 异步引擎与会话工厂,提供 get_db 依赖,自动 commit/rollback/关闭,简化事务管理与资源释放。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["应用启动"]) --> LoadCfg["加载配置(Settings)"]
|
||||
LoadCfg --> CreateEngine["创建异步引擎"]
|
||||
CreateEngine --> CreateSession["创建会话工厂"]
|
||||
CreateSession --> ProvideDep["提供 get_db 依赖"]
|
||||
ProvideDep --> End(["服务可用"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
|
||||
### API 路由与认证
|
||||
- 路由聚合
|
||||
- v1 路由聚合器统一 include 各模块路由,便于扩展与维护。
|
||||
- 认证模块
|
||||
- 提供登录、注册、当前用户信息等接口,使用依赖注入获取数据库会话,结合安全工具进行密码校验与令牌签发。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant FR as "前端路由"
|
||||
participant AU as "认证路由"
|
||||
participant DB as "数据库"
|
||||
participant SEC as "安全工具"
|
||||
U->>FR : "提交登录表单"
|
||||
FR->>AU : "POST /api/v1/auth/login"
|
||||
AU->>DB : "查询用户"
|
||||
DB-->>AU : "用户记录"
|
||||
AU->>SEC : "校验密码"
|
||||
SEC-->>AU : "校验结果"
|
||||
AU-->>FR : "返回访问令牌"
|
||||
FR-->>U : "跳转首页/保存令牌"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
|
||||
### 服务层与数据访问
|
||||
- 服务层职责
|
||||
- 封装复杂查询、分页与条件组合,避免在路由层直接编写 SQL,提升可测试性与可维护性。
|
||||
- 典型流程
|
||||
- 列表查询:构造查询条件 → 统计总数 → 分页排序 → 返回数据与总数。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
QStart(["进入服务方法"]) --> Build["构建查询条件"]
|
||||
Build --> Count["统计总数(subquery)"]
|
||||
Count --> Page["分页与排序"]
|
||||
Page --> Exec["执行查询"]
|
||||
Exec --> Ret["返回结果与总数"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L24-L49)
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
|
||||
### 前端应用与状态管理
|
||||
- 应用初始化
|
||||
- 注册 Pinia、路由、Element Plus 与本地化,挂载应用根组件。
|
||||
- 路由与守卫
|
||||
- 定义多级菜单路由,使用 beforeEach 守卫判断本地 token 并重定向至登录页。
|
||||
- 状态管理
|
||||
- 用户 store 管理 token 与用户信息,提供登录、获取用户信息、登出方法,登出时清理本地存储并跳转登录页。
|
||||
- 开发代理
|
||||
- Vite 将 /api 前缀代理到后端地址,解决开发阶段跨域问题。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant V as "Vue 应用"
|
||||
participant R as "路由守卫"
|
||||
participant S as "用户store"
|
||||
participant A as "认证API"
|
||||
V->>R : "导航到受保护页面"
|
||||
R->>S : "读取localStorage.token"
|
||||
alt 无token
|
||||
R-->>V : "重定向到 /login"
|
||||
else 有token
|
||||
R-->>V : "放行"
|
||||
V->>S : "调用 getUserInfo()"
|
||||
S->>A : "GET /api/v1/auth/me"
|
||||
A-->>S : "返回用户信息"
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L113)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L22-L31)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
|
||||
## 依赖分析
|
||||
- 后端技术栈
|
||||
- FastAPI、SQLAlchemy 2.0、Pydantic、Alembic、asyncpg、uvicorn、passlib、python-jose 等,构成高性能、强类型、可演进的后端基础设施。
|
||||
- 前端技术栈
|
||||
- Vue 3、Vue Router、Pinia、Axios、Element Plus、Vite,提供现代化的交互体验与开发效率。
|
||||
- 外部依赖关系
|
||||
- 前端通过 /api 前缀代理访问后端;后端通过 asyncpg 连接 PostgreSQL;配置中心统一管理数据库连接串与 JWT 参数。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FE["前端依赖(package.json)"] --> AX["Axios"]
|
||||
FE --> VR["Vue Router"]
|
||||
FE --> PI["Pinia"]
|
||||
FE --> EP["Element Plus"]
|
||||
BE["后端依赖(requirements.txt)"] --> FA["FastAPI"]
|
||||
BE --> SA["SQLAlchemy 2.0"]
|
||||
BE --> PG["asyncpg"]
|
||||
BE --> AL["Alembic"]
|
||||
BE --> UV["uvicorn"]
|
||||
BE --> PJ["python-jose"]
|
||||
BE --> PB["passlib"]
|
||||
AX --> API["后端API(/api/v1)"]
|
||||
VR --> API
|
||||
PI --> API
|
||||
EP --> FE
|
||||
API --> PG
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
|
||||
章节来源
|
||||
- [frontend/package.json](file://frontend/package.json#L1-L27)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
|
||||
## 性能考虑
|
||||
- 异步 I/O 与连接池
|
||||
- 使用 SQLAlchemy 2.0 异步引擎与连接池参数,减少阻塞,提升高并发下的吞吐能力。
|
||||
- 分页与索引
|
||||
- 服务层对列表查询进行分页与排序,数据库层通过索引优化常用查询字段,降低查询延迟。
|
||||
- 缓存与压缩
|
||||
- 建议在网关层启用静态资源缓存与 Gzip 压缩,减少带宽占用。
|
||||
- 前端懒加载
|
||||
- 路由与组件采用动态导入,缩短首屏加载时间,提升用户体验。
|
||||
- 数据库迁移与版本控制
|
||||
- 使用 Alembic 管理数据库结构变更,避免生产环境回滚风险。
|
||||
|
||||
## 故障排查指南
|
||||
- 后端异常处理
|
||||
- HTTP 异常、请求校验异常与通用异常均被记录日志并向上抛出,便于定位问题来源。
|
||||
- 健康检查
|
||||
- 通过 /health 端点快速确认服务状态与版本信息。
|
||||
- 前端路由守卫
|
||||
- 未登录访问受保护页面将被重定向至登录页,检查本地存储 token 是否存在。
|
||||
- 数据库连接
|
||||
- 若出现连接失败,检查 DATABASE_URL、连接池参数与数据库服务状态。
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L53-L76)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L113)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L21)
|
||||
|
||||
## 结论
|
||||
本系统通过前后端分离与模块化 API 设计,结合 FastAPI 的高性能与强类型特性、Vue 3 的现代开发体验以及 PostgreSQL 的稳定可靠,构建了可扩展、易维护的医院绩效管理平台。建议在生产环境中完善鉴权策略、引入缓存与消息队列、增强监控与日志采集,并持续通过 Alembic 管理数据库演进。
|
||||
|
||||
## 附录
|
||||
- 系统边界与集成点
|
||||
- 系统边界:前端通过 /api 前缀与后端交互;后端仅暴露 REST 接口;数据库为内部存储。
|
||||
- 集成点:JWT 用于前后端鉴权;Axios 作为 HTTP 客户端;Vite 代理用于开发联调。
|
||||
- 架构决策依据
|
||||
- FastAPI:高性能、自动生成 OpenAPI 文档、强类型校验。
|
||||
- Vue 3:组合式 API、更好的 TypeScript 支持、生态丰富。
|
||||
- PostgreSQL:成熟的关系型数据库、异步驱动与迁移工具完善。
|
||||
387
.qoder/repowiki/zh/content/系统架构/组件交互关系.md
Normal file
387
.qoder/repowiki/zh/content/系统架构/组件交互关系.md
Normal file
@@ -0,0 +1,387 @@
|
||||
# 组件交互关系
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向“医院绩效系统”的前后端交互与内部架构,聚焦以下主题:
|
||||
- 前端 Vue 组件与后端 FastAPI 服务的交互模式:HTTP 请求/响应流程、API 封装与错误处理
|
||||
- 组件间通信方式:父子、兄弟与跨组件状态共享
|
||||
- 数据库连接池管理、ORM 查询优化与事务处理
|
||||
- 中间件作用:CORS、身份验证、日志与异常捕获
|
||||
- 数据流与组件依赖关系图
|
||||
|
||||
## 项目结构
|
||||
系统采用前后端分离架构:
|
||||
- 前端:Vue 3 + Pinia + Element Plus + Vue Router
|
||||
- 后端:FastAPI + SQLAlchemy 2.0(异步)+ PostgreSQL
|
||||
- 数据模型统一定义于 ORM 层,服务层负责业务逻辑,API 层提供 REST 接口
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_Main["main.js<br/>应用入口"]
|
||||
FE_Router["router/index.js<br/>路由与守卫"]
|
||||
FE_API["api/request.js<br/>Axios封装"]
|
||||
FE_AsmAPI["api/assessment.js<br/>考核API"]
|
||||
FE_UserStore["stores/user.js<br/>用户状态"]
|
||||
FE_Dashboard["views/Dashboard.vue<br/>工作台视图"]
|
||||
end
|
||||
subgraph "后端"
|
||||
BE_App["app/main.py<br/>应用与中间件"]
|
||||
BE_Config["core/config.py<br/>配置"]
|
||||
BE_DB["core/database.py<br/>异步引擎/会话"]
|
||||
BE_Security["core/security.py<br/>JWT/认证"]
|
||||
BE_Models["models/models.py<br/>ORM模型"]
|
||||
BE_Svc_Asm["services/assessment_service.py<br/>服务层"]
|
||||
BE_API_Init["api/v1/__init__.py<br/>路由聚合"]
|
||||
BE_API_Auth["api/v1/auth.py<br/>认证接口"]
|
||||
end
|
||||
FE_Main --> FE_Router
|
||||
FE_Main --> FE_API
|
||||
FE_API --> BE_App
|
||||
FE_AsmAPI --> FE_API
|
||||
FE_UserStore --> FE_API
|
||||
FE_Dashboard --> FE_AsmAPI
|
||||
BE_App --> BE_Config
|
||||
BE_App --> BE_DB
|
||||
BE_App --> BE_API_Init
|
||||
BE_API_Init --> BE_API_Auth
|
||||
BE_Security --> BE_DB
|
||||
BE_Svc_Asm --> BE_DB
|
||||
BE_Svc_Asm --> BE_Models
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L1-L1082)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
|
||||
## 核心组件
|
||||
- 前端应用入口与插件注册:初始化 Vue 实例、Pinia、路由、Element Plus,并挂载应用。
|
||||
- 路由与导航守卫:统一设置页面标题、校验登录态(localStorage token),未登录重定向至登录页。
|
||||
- Axios 封装:统一基础 URL、超时、请求头;自动注入 Authorization;统一封装响应体结构与错误处理。
|
||||
- 用户状态管理:登录、获取当前用户、登出,持久化 token 并跳转登录页。
|
||||
- API 模块:按功能拆分,如考核 API,支持列表、详情、创建、更新、提交、审核、确认、批量创建等。
|
||||
- 后端应用:创建 FastAPI 实例,注册 CORS、路由前缀、健康检查与全局异常处理器。
|
||||
- 安全与认证:JWT 生成与解析、OAuth2 密钥流、当前用户解析与权限校验。
|
||||
- 数据库:异步引擎与会话工厂,依赖注入式获取会话,自动提交/回滚/关闭。
|
||||
- 业务服务:如考核服务,实现分页、过滤、明细计算、状态流转、批量创建等。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
|
||||
## 架构总览
|
||||
系统采用“前端 SPA + 后端 API”模式,数据流自上而下:
|
||||
- 前端组件通过 API 模块发起 HTTP 请求,Axios 统一拦截器注入 token 并处理响应。
|
||||
- 后端 FastAPI 解析请求,路由到对应控制器,依赖注入数据库会话,调用服务层执行业务逻辑。
|
||||
- 服务层操作 ORM 模型,进行查询、计算与写入,返回标准化结果。
|
||||
- 异常在后端统一捕获并记录日志,前端根据响应体或 HTTP 状态码进行提示与跳转。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant View as "Dashboard.vue"
|
||||
participant API as "assessment.js"
|
||||
participant Axios as "request.js"
|
||||
participant FastAPI as "main.py"
|
||||
participant Router as "api/v1/auth.py"
|
||||
participant Sec as "core/security.py"
|
||||
participant DB as "core/database.py"
|
||||
View->>API : "调用获取考核列表/详情/趋势等"
|
||||
API->>Axios : "GET /api/v1/...带Authorization"
|
||||
Axios->>FastAPI : "HTTP 请求"
|
||||
FastAPI->>Router : "路由匹配"
|
||||
Router->>Sec : "依赖注入当前用户JWT"
|
||||
Sec->>DB : "获取 AsyncSession"
|
||||
DB-->>Sec : "会话可用"
|
||||
Sec-->>Router : "返回当前用户"
|
||||
Router-->>Axios : "业务处理读取/写入"
|
||||
Axios-->>View : "返回标准化数据"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L329-L421)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L82)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 前端组件与 API 交互
|
||||
- 登录流程
|
||||
- 用户输入账号密码 → 调用登录 API → 成功后保存 token 到 localStorage → 跳转首页
|
||||
- 失败时返回错误,前端不保存 token
|
||||
- 路由守卫
|
||||
- 进入受保护路由前检查 token,缺失则重定向登录
|
||||
- Axios 封装
|
||||
- 自动注入 Authorization: Bearer token
|
||||
- 统一响应体结构:当 res.code !== 200 时提示错误并 reject
|
||||
- 对 401/403/404/500 等状态码分别处理,401 清除 token 并跳转登录
|
||||
- Dashboard 视图
|
||||
- 使用多个 API 方法加载统计数据、趋势、排名、财务趋势与预警
|
||||
- 通过 ECharts 渲染图表,监听窗口 resize 事件保持图表尺寸一致
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Comp as "Dashboard.vue"
|
||||
participant Store as "user.js"
|
||||
participant API as "assessment.js"
|
||||
participant Req as "request.js"
|
||||
participant BE as "auth.py"
|
||||
Comp->>Store : "登录用户名/密码"
|
||||
Store->>BE : "POST /api/v1/auth/login"
|
||||
BE-->>Store : "返回 access_token"
|
||||
Store->>Store : "保存 token 到 localStorage"
|
||||
Store-->>Comp : "登录成功"
|
||||
Comp->>API : "getPeriodStats/getTrendData/..."
|
||||
API->>Req : "GET /api/v1/stats/...含Authorization"
|
||||
Req-->>Comp : "返回数据并渲染图表"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L329-L421)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L14-L63)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L329-L421)
|
||||
|
||||
### 后端 API 与服务层
|
||||
- 应用与中间件
|
||||
- 注册 CORS:允许指定 origins、credentials、methods、headers
|
||||
- 注册路由前缀与健康检查
|
||||
- 全局异常处理:HTTP 异常、请求验证异常、通用异常均记录日志并抛出
|
||||
- 认证与安全
|
||||
- 登录:校验用户名与密码,检查用户是否激活,签发 JWT
|
||||
- 当前用户:OAuth2 密钥流 + JWT 解码 + 数据库查询
|
||||
- 权限校验:管理员、经理等角色校验
|
||||
- 服务层(示例:考核)
|
||||
- 支持多条件分页查询、预加载关联、计算总分与加权得分
|
||||
- 状态机:草稿/已提交/已审核/已确认/已驳回
|
||||
- 批量创建:按科室与周期批量生成考核记录与明细
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["请求进入"]) --> CORS["CORS 中间件校验"]
|
||||
CORS --> Router["路由匹配/api/v1/..."]
|
||||
Router --> Auth["OAuth2/JWT 校验当前用户"]
|
||||
Auth --> Service["服务层业务处理查询/计算/写入"]
|
||||
Service --> ORM["ORM 操作异步会话"]
|
||||
ORM --> Resp["返回标准化响应"]
|
||||
Resp --> End(["结束"])
|
||||
Router -.->|异常| Log["记录日志并抛出异常"]
|
||||
Log --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L41-L74)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L82)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L18-L55)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L41-L74)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
|
||||
### 数据库连接池与事务
|
||||
- 异步引擎与会话工厂
|
||||
- 使用异步驱动创建引擎,开启调试输出
|
||||
- 会话工厂设置类为 AsyncSession,关闭提交行为,避免每次提交后失效
|
||||
- 依赖注入
|
||||
- get_db 作为依赖,在 try 块中 yield 会话,成功提交,异常回滚并抛出,finally 关闭
|
||||
- 事务语义
|
||||
- 单次请求内使用同一会话,异常自动回滚,保证一致性
|
||||
- 查询优化
|
||||
- 使用 selectinload 预加载关联,减少 N+1 查询
|
||||
- 多处使用索引字段过滤与排序,结合分页 limit/offset
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
S(["进入依赖 get_db"]) --> New["创建 AsyncSession"]
|
||||
New --> Try["yield 会话给业务"]
|
||||
Try --> Ok{"是否异常?"}
|
||||
Ok -- 是 --> Rollback["session.rollback()"]
|
||||
Rollback --> Throw["raise 异常"]
|
||||
Ok -- 否 --> Commit["session.commit()"]
|
||||
Commit --> Close["session.close()"]
|
||||
Throw --> Close
|
||||
Close --> E(["退出依赖"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L78-L85)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L29-L31)
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
|
||||
### 组件间通信与状态共享
|
||||
- 父子组件通信
|
||||
- Dashboard.vue 通过 props 传递图表容器引用与数据,内部通过 ECharts 实例渲染
|
||||
- 兄弟组件通信
|
||||
- 通过 Pinia store 共享用户 token 与基本信息,任一组件可读写
|
||||
- 跨组件状态共享
|
||||
- 用户 store 统一管理登录态,路由守卫依赖其 token 判断访问权限
|
||||
- API 层通过 Axios 拦截器自动注入 Authorization,避免重复处理
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L423-L448)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L14-L26)
|
||||
|
||||
## 依赖分析
|
||||
- 前端
|
||||
- main.js 依赖 router、store、Element Plus
|
||||
- router/index.js 依赖懒加载组件与 beforeEach 守卫
|
||||
- api/request.js 依赖 axios、Element Plus Message、router
|
||||
- api/assessment.js 依赖 request
|
||||
- stores/user.js 依赖 api/auth 与 router
|
||||
- views/Dashboard.vue 依赖多个统计 API 与 ECharts
|
||||
- 后端
|
||||
- app/main.py 依赖 core/config、core/logging_config、api/v1
|
||||
- api/v1/__init__.py 依赖各功能路由模块
|
||||
- api/v1/auth.py 依赖 core/database、core/security、schemas、models
|
||||
- core/security.py 依赖 core/config、core/database、jose、bcrypt
|
||||
- core/database.py 依赖 core/config
|
||||
- models/models.py 依赖 core/database
|
||||
- services/assessment_service.py 依赖 models、schemas、sqlalchemy
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FE_Main["main.js"] --> FE_Router["router/index.js"]
|
||||
FE_Main --> FE_API["api/request.js"]
|
||||
FE_API --> FE_AsmAPI["api/assessment.js"]
|
||||
FE_AsmAPI --> FE_Dashboard["views/Dashboard.vue"]
|
||||
BE_App["app/main.py"] --> BE_API_Init["api/v1/__init__.py"]
|
||||
BE_API_Init --> BE_API_Auth["api/v1/auth.py"]
|
||||
BE_App --> BE_Config["core/config.py"]
|
||||
BE_App --> BE_DB["core/database.py"]
|
||||
BE_API_Auth --> BE_Security["core/security.py"]
|
||||
BE_Security --> BE_DB
|
||||
BE_Svc_Asm["services/assessment_service.py"] --> BE_Models["models/models.py"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L1-L1082)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
|
||||
## 性能考虑
|
||||
- 异步 I/O 与连接池
|
||||
- 使用 SQLAlchemy 2.0 异步引擎与连接池,提升并发吞吐
|
||||
- 通过依赖注入复用会话,避免频繁创建销毁
|
||||
- 查询优化
|
||||
- 使用 selectinload 预加载关联,减少 N+1 查询
|
||||
- 多处对常用过滤字段建立索引,配合分页 limit/offset
|
||||
- 前端性能
|
||||
- ECharts 图表按需渲染,窗口 resize 时统一触发重绘
|
||||
- API 返回结构化数据,前端仅渲染必要字段,降低 DOM 压力
|
||||
|
||||
## 故障排查指南
|
||||
- 登录失败
|
||||
- 检查用户名/密码是否正确,用户是否被禁用
|
||||
- 查看后端日志与前端错误提示,确认 401/403 场景
|
||||
- 401 未授权
|
||||
- 前端移除本地 token 并跳转登录;确认 JWT 未过期
|
||||
- 403 权限不足
|
||||
- 确认用户角色是否满足接口要求(管理员/经理)
|
||||
- 500 服务器错误
|
||||
- 查看后端日志定位异常堆栈,确认数据库事务是否回滚
|
||||
- 前端网络错误
|
||||
- 检查 baseURL 是否正确(/api/v1),CORS 是否放行
|
||||
- 确认 Axios 拦截器是否正确注入 Authorization
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L38-L63)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L30-L34)
|
||||
|
||||
## 结论
|
||||
本系统通过清晰的前后端职责划分与中间件、安全、数据库与服务层的协同,实现了稳定高效的绩效管理能力。前端以组件为中心,通过 API 模块与状态管理实现松耦合;后端以 FastAPI 为核心,结合异步 ORM 与严格的安全策略,确保高并发下的可靠性与可维护性。建议持续关注查询索引、分页与缓存策略,进一步优化大数据量场景下的性能表现。
|
||||
|
||||
## 附录
|
||||
- 配置项参考
|
||||
- 应用名、版本、API 前缀、数据库连接、JWT 密钥与过期时间、CORS 允许源、分页大小
|
||||
- 数据模型概览
|
||||
- 部门、员工、指标、考核、明细、工资、计划、菜单、模板等核心实体及其关系
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L13-L33)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438)
|
||||
332
.qoder/repowiki/zh/content/系统架构/部署架构.md
Normal file
332
.qoder/repowiki/zh/content/系统架构/部署架构.md
Normal file
@@ -0,0 +1,332 @@
|
||||
# 部署架构
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/.env.example](file://backend/.env.example)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py)
|
||||
- [backend/init_db.py](file://backend/init_db.py)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini)
|
||||
- [frontend/package.json](file://frontend/package.json)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js)
|
||||
- [docs/backend.md](file://docs/backend.md)
|
||||
- [AGENTS.md](file://AGENTS.md)
|
||||
- [test_frontend_connection.py](file://test_frontend_connection.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向医院绩效系统,提供从开发到生产的部署架构说明,覆盖生产、测试与开发环境的配置差异,容器化与编排策略,数据库部署与高可用设计,静态资源与 CDN 缓存策略,以及部署流程、环境变量、监控告警与故障恢复方案。内容基于仓库现有后端与前端工程配置进行归纳与扩展建议。
|
||||
|
||||
## 项目结构
|
||||
系统由前后端分离构成:
|
||||
- 后端采用 FastAPI + SQLAlchemy 2.0 异步 ORM,使用 Alembic 进行数据库迁移,支持异步 PostgreSQL 连接。
|
||||
- 前端采用 Vue 3 + Vite,开发时通过代理将 /api 请求转发至后端本地服务。
|
||||
- 文档与脚本提供了开发与测试命令参考。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_PKG["frontend/package.json"]
|
||||
FE_VITE["frontend/vite.config.js"]
|
||||
FE_DIST["frontend/dist/*"]
|
||||
end
|
||||
subgraph "后端"
|
||||
BE_MAIN["backend/app/main.py"]
|
||||
BE_CFG["backend/app/core/config.py"]
|
||||
BE_DB["backend/app/core/database.py"]
|
||||
BE_LOG["backend/app/core/logging_config.py"]
|
||||
BE_REQ["backend/requirements.txt"]
|
||||
BE_ENV["backend/.env.example"]
|
||||
BE_ALEMBIC["backend/alembic.ini"]
|
||||
BE_INIT["backend/init_db.py"]
|
||||
end
|
||||
FE_VITE --> |"开发代理 /api"| BE_MAIN
|
||||
FE_PKG --> |"构建产物"| FE_DIST
|
||||
BE_MAIN --> BE_DB
|
||||
BE_MAIN --> BE_CFG
|
||||
BE_DB --> |"连接"| BE_ENV
|
||||
BE_ALEMBIC --> |"迁移配置"| BE_DB
|
||||
BE_INIT --> |"初始化数据"| BE_DB
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [backend/.env.example](file://backend/.env.example#L1-L11)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L1-L83)
|
||||
|
||||
章节来源
|
||||
- [docs/backend.md](file://docs/backend.md#L1-L58)
|
||||
- [AGENTS.md](file://AGENTS.md#L15-L53)
|
||||
|
||||
## 核心组件
|
||||
- 应用入口与路由注册:后端通过应用工厂创建 FastAPI 实例,注册跨域中间件与 API 路由,并提供健康检查端点与全局异常处理。
|
||||
- 配置管理:通过 pydantic-settings 读取 .env 文件,集中管理数据库连接、JWT 密钥、CORS 来源、分页参数等。
|
||||
- 数据库层:异步 SQLAlchemy 引擎与会话工厂,支持连接池大小与溢出配置;提供依赖注入式会话生命周期管理。
|
||||
- 日志模块:按日期轮转输出应用日志与错误日志,便于运维定位问题。
|
||||
- 前端开发与构建:Vite 提供开发服务器与代理,构建生成静态资源目录。
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L92)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L10-L65)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L21)
|
||||
|
||||
## 架构总览
|
||||
系统采用“前端静态 + 后端 API”的典型分层架构。前端通过 /api 前缀调用后端接口,后端通过异步数据库连接访问 PostgreSQL。开发阶段通过 Vite 代理实现跨域联调;生产阶段建议通过反向代理或网关统一暴露 API 并托管前端静态资源。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
Client["浏览器/移动端"] --> Proxy["反向代理/Nginx"]
|
||||
Proxy --> FE["前端静态资源<br/>frontend/dist"]
|
||||
Proxy --> API["后端 API<br/>FastAPI"]
|
||||
API --> DB["PostgreSQL"]
|
||||
API --> Redis["可选缓存/会话存储"]
|
||||
```
|
||||
|
||||
说明
|
||||
- 该图为概念性架构示意,用于指导部署拓扑与流量走向。
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 后端应用与配置
|
||||
- 应用工厂与中间件:创建 FastAPI 实例、注册 CORS、挂载路由前缀、健康检查与异常处理。
|
||||
- 配置项:应用名称、版本、调试开关、API 前缀、数据库 URL、连接池参数、JWT 签发参数、CORS 允许来源、分页默认值与最大值。
|
||||
- 数据库连接:异步引擎与会话工厂,支持回滚与关闭,配合依赖注入提供事务级会话。
|
||||
- 日志:控制台 INFO 输出与文件 DEBUG/ERROR 轮转日志,自动按日期创建日志文件。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Settings {
|
||||
+APP_NAME : string
|
||||
+APP_VERSION : string
|
||||
+DEBUG : bool
|
||||
+API_PREFIX : string
|
||||
+DATABASE_URL : string
|
||||
+DATABASE_POOL_SIZE : int
|
||||
+DATABASE_MAX_OVERFLOW : int
|
||||
+SECRET_KEY : string
|
||||
+ALGORITHM : string
|
||||
+ACCESS_TOKEN_EXPIRE_MINUTES : int
|
||||
+CORS_ORIGINS : string[]
|
||||
+DEFAULT_PAGE_SIZE : int
|
||||
+MAX_PAGE_SIZE : int
|
||||
}
|
||||
class Database {
|
||||
+engine
|
||||
+async_session_maker
|
||||
+get_db()
|
||||
}
|
||||
class Logging {
|
||||
+logger
|
||||
+get_logger(name)
|
||||
}
|
||||
Settings <.. Database : "提供连接配置"
|
||||
Settings <.. Logging : "被应用使用"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L27-L65)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L92)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L10-L65)
|
||||
|
||||
### 数据库与迁移
|
||||
- 连接配置:通过 Settings 的 DATABASE_URL 指定异步 PostgreSQL 连接字符串。
|
||||
- 迁移配置:Alembic 默认使用 SQLite 路径示例,实际生产需调整为 PostgreSQL 连接。
|
||||
- 初始化脚本:提供创建表与插入测试数据的异步初始化流程。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> CheckURL["检查 DATABASE_URL 配置"]
|
||||
CheckURL --> IsPG{"是否为 PostgreSQL?"}
|
||||
IsPG --> |是| UsePG["使用 asyncpg 异步驱动"]
|
||||
IsPG --> |否| UseSQLite["使用 SQLite仅开发/测试"]
|
||||
UsePG --> Migrate["执行 Alembic 迁移"]
|
||||
UseSQLite --> LocalInit["运行 init_db 初始化表与测试数据"]
|
||||
Migrate --> Done(["完成"])
|
||||
LocalInit --> Done
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L21)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L7-L7)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L11-L18)
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L21)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L1-L83)
|
||||
|
||||
### 前端开发与构建
|
||||
- 开发服务器:Vite 默认端口,开启代理将 /api 请求转发至后端本地地址。
|
||||
- 构建产物:生产构建输出至 dist 目录,建议由反向代理或对象存储提供静态托管。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Dev as "开发者"
|
||||
participant Vite as "Vite 开发服务器"
|
||||
participant Proxy as "反向代理/Nginx"
|
||||
participant API as "后端 API"
|
||||
Dev->>Vite : 访问 http : //localhost : 5173
|
||||
Vite->>Proxy : 发起 /api 请求
|
||||
Proxy->>API : 转发请求
|
||||
API-->>Proxy : 返回响应
|
||||
Proxy-->>Vite : 返回响应
|
||||
Vite-->>Dev : 渲染页面
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L21)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L54-L56)
|
||||
|
||||
章节来源
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [frontend/package.json](file://frontend/package.json#L1-L27)
|
||||
|
||||
### 部署流程(概念性)
|
||||
以下流程图展示从代码到上线的通用步骤,具体镜像与编排参数需结合企业环境定制。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Dev["开发者提交代码"] --> CI["CI 构建镜像"]
|
||||
CI --> Push["推送镜像到镜像仓库"]
|
||||
Push --> Deploy["部署到目标环境"]
|
||||
Deploy --> Health["健康检查"]
|
||||
Health --> Ready{"就绪?"}
|
||||
Ready --> |否| Rollback["回滚至上一版本"]
|
||||
Ready --> |是| Monitor["监控与告警"]
|
||||
Monitor --> Ops["运维观察"]
|
||||
```
|
||||
|
||||
说明
|
||||
- 该图为通用流程示意,不直接映射具体源文件。
|
||||
|
||||
## 依赖关系分析
|
||||
- 后端依赖:FastAPI、SQLAlchemy 2.0、asyncpg、Alembic、Pydantic/Settings、Uvicorn 等。
|
||||
- 前端依赖:Vue 3、Element Plus、Pinia、Axios、Vite 等。
|
||||
- 开发与测试命令:文档提供了安装、迁移、启动与测试的参考命令。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FE_PKG["frontend/package.json"] --> FE_DEPS["前端依赖"]
|
||||
BE_REQ["backend/requirements.txt"] --> BE_DEPS["后端依赖"]
|
||||
AGENTS["AGENTS.md"] --> FE_CMD["前端命令"]
|
||||
AGENTS --> BE_CMD["后端命令"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [AGENTS.md](file://AGENTS.md#L15-L53)
|
||||
|
||||
章节来源
|
||||
- [frontend/package.json](file://frontend/package.json#L1-L27)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [AGENTS.md](file://AGENTS.md#L15-L53)
|
||||
|
||||
## 性能考虑
|
||||
- 数据库连接池:根据并发与硬件能力调整连接池大小与溢出参数,避免连接争用。
|
||||
- 异常处理:全局异常与验证异常记录日志,有助于定位性能瓶颈与错误热点。
|
||||
- 前端静态资源:生产构建后由 CDN 或反向代理缓存,减少后端带宽压力。
|
||||
- 日志级别:生产环境建议提升控制台日志级别,降低磁盘与 I/O 压力。
|
||||
|
||||
## 故障排查指南
|
||||
- CORS 配置:确认前端开发代理与后端允许来源一致,避免跨域失败。
|
||||
- 登录接口:使用测试脚本验证登录流程与 Token 获取。
|
||||
- 健康检查:通过后端健康端点快速判断服务状态。
|
||||
- 日志定位:查看按日期命名的日志文件,区分应用日志与错误日志。
|
||||
|
||||
章节来源
|
||||
- [test_frontend_connection.py](file://test_frontend_connection.py#L38-L74)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L54-L56)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L18-L59)
|
||||
|
||||
## 结论
|
||||
本部署架构文档基于现有仓库配置,明确了后端配置、数据库连接、前端开发与构建的关键点,并给出了生产环境的通用建议。后续可在企业环境中补充容器化与编排、数据库高可用、CDN 与缓存、监控告警与灾备等方案。
|
||||
|
||||
## 附录
|
||||
|
||||
### 环境变量与配置清单
|
||||
- 数据库连接:通过 DATABASE_URL 指定 PostgreSQL 异步连接字符串。
|
||||
- JWT 密钥:SECRET_KEY 用于签发与校验 Token。
|
||||
- 调试与 API 前缀:DEBUG 控制 SQL 与日志输出;API_PREFIX 作为路由前缀。
|
||||
- CORS 来源:CORS_ORIGINS 控制允许跨域来源。
|
||||
- 分页参数:DEFAULT_PAGE_SIZE 与 MAX_PAGE_SIZE 控制分页范围。
|
||||
|
||||
章节来源
|
||||
- [backend/.env.example](file://backend/.env.example#L3-L11)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L12-L34)
|
||||
|
||||
### 生产/测试/开发环境配置差异建议
|
||||
- 开发环境
|
||||
- DEBUG: True
|
||||
- CORS_ORIGINS: 允许本地开发域名
|
||||
- DATABASE_URL: 本地 PostgreSQL 或 Docker 内部网络地址
|
||||
- 测试环境
|
||||
- DEBUG: False
|
||||
- CORS_ORIGINS: 限定测试域名
|
||||
- DATABASE_URL: 测试专用数据库实例
|
||||
- 生产环境
|
||||
- DEBUG: False
|
||||
- CORS_ORIGINS: 限定正式域名
|
||||
- DATABASE_URL: 使用高可用数据库集群地址
|
||||
- 配置密钥与证书,启用 HTTPS
|
||||
|
||||
说明
|
||||
- 以上为通用建议,具体值需结合企业安全与合规要求设定。
|
||||
|
||||
### 容器化与编排(建议)
|
||||
- 镜像构建
|
||||
- 后端:基于 Python 基础镜像,复制 requirements.txt 并安装依赖,复制源码,暴露端口,设置启动命令。
|
||||
- 前端:基于 Nginx 或 Node 生态镜像,构建静态资源,配置反向代理指向后端 API。
|
||||
- 编排与负载均衡
|
||||
- 使用编排平台部署后端多副本,配置健康检查与滚动更新。
|
||||
- 前端静态资源由对象存储或 CDN 托管,反向代理统一入口。
|
||||
- 数据库高可用
|
||||
- 建议使用 PostgreSQL 主从或托管集群,配置只读副本与自动故障转移。
|
||||
- 备份策略
|
||||
- 定期逻辑备份与增量备份,结合 WAL 归档与时间点恢复(PITR)。
|
||||
- 缓存与会话
|
||||
- 可选引入 Redis 作为会话存储与缓存,提升热点数据访问性能。
|
||||
|
||||
说明
|
||||
- 以上为通用实践建议,需结合企业基础设施与合规要求落地。
|
||||
|
||||
### 监控与告警(建议)
|
||||
- 应用层
|
||||
- 指标:请求延迟、错误率、并发连接数、数据库连接池使用率。
|
||||
- 日志:结构化日志,按服务聚合,保留关键字段以便检索。
|
||||
- 基础设施层
|
||||
- CPU、内存、磁盘、网络 I/O、数据库可用性与延迟。
|
||||
- 告警策略
|
||||
- 设定阈值与静默窗口,区分 P1/P2/P3 级别,确保关键问题及时通知。
|
||||
|
||||
说明
|
||||
- 以上为通用监控建议,需结合企业监控体系与团队流程制定。
|
||||
Reference in New Issue
Block a user