# 组件交互关系 **本文引用的文件** - [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)