# 组件交互关系
**本文引用的文件**
- [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)
## 目录
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
应用入口"]
FE_Router["router/index.js
路由与守卫"]
FE_API["api/request.js
Axios封装"]
FE_AsmAPI["api/assessment.js
考核API"]
FE_UserStore["stores/user.js
用户状态"]
FE_Dashboard["views/Dashboard.vue
工作台视图"]
end
subgraph "后端"
BE_App["app/main.py
应用与中间件"]
BE_Config["core/config.py
配置"]
BE_DB["core/database.py
异步引擎/会话"]
BE_Security["core/security.py
JWT/认证"]
BE_Models["models/models.py
ORM模型"]
BE_Svc_Asm["services/assessment_service.py
服务层"]
BE_API_Init["api/v1/__init__.py
路由聚合"]
BE_API_Auth["api/v1/auth.py
认证接口"]
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)