提交文件

This commit is contained in:
2026-02-28 15:16:15 +08:00
parent 1a4e50e0a4
commit 44f250f58e
159 changed files with 61268 additions and 0 deletions

View 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 则确保了高效的开发与构建体验。整体方案具备良好的社区支持与长期维护性,适合持续演进与扩展。

View 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 文件管理敏感配置,启用健康检查与日志轮转

View 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/FastAPIapp 目录下按功能分层core、api、models、schemas、services、utils通过 APIRouter 聚合路由
- 前端Vue 3/Pinia/Vitesrc 下按功能模块组织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

View 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成熟的关系型数据库、异步驱动与迁移工具完善。

View 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/v1CORS 是否放行
- 确认 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)

View 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 级别,确保关键问题及时通知。
说明
- 以上为通用监控建议,需结合企业监控体系与团队流程制定。