# 系统架构 **本文引用的文件** - [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/core/security.py](file://backend/app/core/security.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/models/models.py](file://backend/app/models/models.py) - [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.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/src/router/index.js](file://frontend/src/router/index.js) - [frontend/src/stores/user.js](file://frontend/src/stores/user.js) - [frontend/src/api/request.js](file://frontend/src/api/request.js) - [frontend/package.json](file://frontend/package.json) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考虑](#性能考虑) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本系统为“医院绩效管理系统”,采用前后端分离架构,后端基于 FastAPI + SQLAlchemy 2.0 + PostgreSQL 的异步数据访问栈,前端基于 Vue 3 + Pinia + Element Plus。系统围绕“分层架构 + 微服务理念(按功能域拆分 API 路由)”组织模块,覆盖用户认证、基础数据管理(科室、员工、指标)、绩效考核(含流程化状态机)、工资核算、数据分析与报表、系统管理(菜单)等核心领域。 ## 项目结构 - 后端(Python/FastAPI) - 应用入口与中间件:app/main.py - 配置中心:app/core/config.py - 数据库连接与会话:app/core/database.py - 安全与认证:app/core/security.py - API 路由聚合:app/api/v1/__init__.py - 典型业务路由:app/api/v1/auth.py 等 - 数据模型:app/models/models.py - 服务层:app/services/*(如 assessment_service.py、staff_service.py) - 依赖声明:backend/requirements.txt - 前端(Vue 3) - 应用入口:frontend/src/main.js - 路由:frontend/src/router/index.js - 状态管理:frontend/src/stores/user.js - HTTP 封装:frontend/src/api/request.js - 依赖声明:frontend/package.json ```mermaid graph TB subgraph "前端" FE_Main["frontend/src/main.js"] FE_Router["frontend/src/router/index.js"] FE_Store["frontend/src/stores/user.js"] FE_API["frontend/src/api/request.js"] end subgraph "后端" BE_App["backend/app/main.py"] BE_Config["backend/app/core/config.py"] BE_DB["backend/app/core/database.py"] BE_Security["backend/app/core/security.py"] BE_API_Auth["backend/app/api/v1/auth.py"] BE_API_Router["backend/app/api/v1/__init__.py"] BE_Models["backend/app/models/models.py"] BE_Svc_Assess["backend/app/services/assessment_service.py"] BE_Svc_Staff["backend/app/services/staff_service.py"] end FE_Main --> FE_Router FE_Main --> FE_Store FE_Main --> FE_API FE_API --> BE_App BE_App --> BE_API_Router BE_API_Router --> BE_API_Auth BE_App --> BE_DB BE_App --> BE_Security BE_DB --> BE_Models BE_API_Auth --> BE_Security BE_API_Auth --> BE_DB BE_Svc_Assess --> BE_DB BE_Svc_Staff --> BE_DB ``` 图表来源 - [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/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) - [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) - [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66) 章节来源 - [backend/app/main.py](file://backend/app/main.py#L15-L77) - [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/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/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) - [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) - [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66) - [frontend/package.json](file://frontend/package.json#L1-L27) - [backend/requirements.txt](file://backend/requirements.txt#L1-L17) ## 核心组件 - 应用入口与生命周期 - 后端通过 create_app 构建 FastAPI 实例,注册 CORS、全局异常处理器、健康检查端点,并挂载 API 路由前缀。 - 前端通过 main.js 初始化应用、注册插件与路由,挂载到 DOM。 - 配置中心 - 统一读取 .env,提供应用名、版本、API 前缀、数据库连接、JWT 参数、跨域白名单、分页参数等。 - 数据库与会话 - 使用 SQLAlchemy 2.0 异步引擎与会话工厂,提供 get_db 依赖注入,自动事务提交/回滚与关闭。 - 安全与认证 - 基于 OAuth2 密码流,JWT 生成与校验,支持当前用户解析、活跃用户校验、管理员/经理权限校验。 - API 路由聚合 - v1 路由聚合器统一 include 各业务模块路由(认证、基础数据、考核、工资、统计、财务、计划、菜单、模板等)。 - 数据模型 - 覆盖科室、员工、指标、考核记录、考核明细、工资记录、绩效计划、计划-KPI 关联、菜单、指标模板等。 - 服务层 - AssessmentService 提供考核的增删改查、批量创建、状态流转(草稿/提交/审核/确认)。 - StaffService 提供员工的查询、创建、更新、删除、按科室检索。 - 前端 - 路由定义页面级视图;Pinia Store 管理用户态;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/core/security.py](file://backend/app/core/security.py#L21-L110) - [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17) - [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438) - [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263) - [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L13-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) - [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66) ## 架构总览 系统采用“前后端分离 + 分层架构 + 微服务理念(按功能域拆分 API)”: - 展示层:Vue 3 单页应用,Element Plus 组件库,Pinia 状态管理。 - 控制层:FastAPI 路由与依赖注入,OAuth2/JWT 认证,CORS 放通。 - 业务层:服务类封装业务规则与流程(如考核状态机)。 - 数据层:SQLAlchemy 2.0 ORM + 异步数据库连接,PostgreSQL。 - 数据模型:强类型枚举与关系映射,确保数据一致性与可维护性。 ```mermaid graph TB UI["前端界面
Vue 3 + Element Plus"] --> API["后端 API
FastAPI"] API --> AUTH["认证与授权
JWT/OAuth2"] API --> SVC["服务层
业务规则与流程"] API --> ORM["数据访问
SQLAlchemy 异步"] ORM --> DB["数据库
PostgreSQL"] AUTH --- SEC["安全工具
密码哈希/令牌"] SVC --- MODELS["数据模型
枚举/关系"] ``` 图表来源 - [backend/app/main.py](file://backend/app/main.py#L19-L48) - [backend/app/core/security.py](file://backend/app/core/security.py#L24-L110) - [backend/app/core/database.py](file://backend/app/core/database.py#L10-L39) - [backend/app/models/models.py](file://backend/app/models/models.py#L16-L61) - [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L14-L206) - [frontend/src/main.js](file://frontend/src/main.js#L1-L24) ## 详细组件分析 ### 认证与授权组件 - 后端 - OAuth2 密码流令牌端点,登录时校验用户名/密码与账户状态,签发 JWT。 - 当前用户解析与权限校验(活跃用户、管理员、经理)。 - 前端 - 登录成功写入本地存储 token,后续请求自动附加 Authorization 头。 - 401 自动跳转登录页,统一错误提示。 ```mermaid sequenceDiagram participant U as "用户" participant FE as "前端" participant API as "后端 API" participant SEC as "安全模块" participant DB as "数据库" U->>FE : 输入账号密码 FE->>API : POST /api/v1/auth/login API->>SEC : 校验密码/账户状态 SEC->>DB : 查询用户 DB-->>SEC : 用户信息 SEC-->>API : 生成访问令牌 API-->>FE : 返回 access_token FE->>FE : 保存 token 到本地存储 FE->>API : 后续请求携带 Authorization ``` 图表来源 - [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L38) - [backend/app/core/security.py](file://backend/app/core/security.py#L55-L91) - [frontend/src/api/request.js](file://frontend/src/api/request.js#L15-L26) - [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20) 章节来源 - [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L38) - [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110) - [frontend/src/api/request.js](file://frontend/src/api/request.js#L15-L63) - [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L49) ### 绩效考核组件 - 服务层 - 支持按条件筛选、分页、关联加载(员工与科室、指标)。 - 创建/更新时计算总分与加权得分,支持批量为科室员工初始化考核。 - 状态机:草稿 → 提交 → 审核(通过/驳回)→ 确认。 - 数据模型 - Assessment/AssessmentDetail/Indicator/Staff 等多表关联,索引覆盖常用查询字段。 ```mermaid flowchart TD Start(["开始"]) --> Create["创建考核记录
计算总分/加权分"] Create --> Details["创建明细项
关联指标"] Details --> Submit["提交考核
状态=提交"] Submit --> Review{"审核通过?"} Review --> |是| Approve["审核通过
状态=审核通过"] Review --> |否| Reject["审核驳回
状态=驳回"] Approve --> Finalize["确认考核
状态=确认"] Reject --> End(["结束"]) Finalize --> End ``` 图表来源 - [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L71-L206) - [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203) 章节来源 - [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L18-L263) - [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203) ### 员工管理组件 - 服务层 - 支持按科室、状态、关键词搜索,分页返回员工列表与总数。 - 提供创建、更新、删除、按科室获取在职员工等能力。 - 数据模型 - Staff 与 Department 多对一关系,索引覆盖常用过滤字段。 ```mermaid classDiagram class Staff { +int id +string employee_id +string name +int department_id +string position +float base_salary +float performance_ratio +StaffStatus status } class Department { +int id +string name +string code +DeptType dept_type } Staff --> Department : "属于" ``` 图表来源 - [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114) - [backend/app/models/models.py](file://backend/app/models/models.py#L62-L86) 章节来源 - [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L17-L112) - [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114) ### 数据模型与关系 - 关键实体与枚举:科室类型、平衡计分卡维度、员工状态、考核状态、指标类型、计划状态、菜单类型、模板类型等。 - 主要关系:部门-员工(一对多)、员工-考核(一对多)、考核-明细(一对多)、明细-指标(多对一)、计划-KPI 关联、菜单父子关系等。 - 索引策略:在常用过滤字段上建立索引,提升查询性能。 ```mermaid erDiagram DEPARTMENTS ||--o{ STAFF : "拥有" STAFF ||--o{ ASSESSMENTS : "被考核" ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : "包含" INDICATORS ||--o{ ASSESSMENT_DETAILS : "被使用" STAFF ||--o{ SALARY_RECORDS : "产生" PERFORMANCE_PLANS ||--o{ PLAN_KPI_RELATIONS : "关联" INDICATORS ||--o{ PLAN_KPI_RELATIONS : "被纳入" MENUS ||--o{ MENUS : "父子" ``` 图表来源 - [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438) 章节来源 - [backend/app/models/models.py](file://backend/app/models/models.py#L16-L438) ### 前后端交互与路由 - 前端 - 路由定义页面级视图,包含仪表盘、基础数据、考核管理、工资核算、统计报表、经济核算、绩效计划、系统管理等。 - 路由守卫校验 token,未登录重定向至登录页。 - 后端 - API 路由前缀统一为 /api/v1,各模块独立注册。 - 认证模块提供登录、注册、当前用户信息接口。 ```mermaid sequenceDiagram participant R as "浏览器" participant RT as "前端路由" participant AX as "Axios 请求" participant AP as "FastAPI 路由" participant DB as "数据库" R->>RT : 访问 / 或具体页面 RT->>AX : 发起 API 请求 AX->>AP : /api/v1/...带 Authorization AP->>DB : 查询/写入数据 DB-->>AP : 返回结果 AP-->>AX : JSON 响应 AX-->>RT : 渲染页面 ``` 图表来源 - [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L113) - [frontend/src/api/request.js](file://frontend/src/api/request.js#L7-L12) - [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17) 章节来源 - [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) - [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17) ## 依赖关系分析 - 后端依赖 - Web 框架:FastAPI - 异步数据库:SQLAlchemy 2.0 + asyncpg - 安全:python-jose + passlib[bcrypt] - 配置:pydantic-settings - 测试:pytest + pytest-asyncio - 前端依赖 - 运行时:vue、vue-router、pinia、axios、element-plus - 构建:vite、sass ```mermaid graph LR subgraph "后端" F["FastAPI"] S["SQLAlchemy 2.0"] P["asyncpg"] J["python-jose"] B["passlib[bcrypt]"] PS["pydantic-settings"] PY["pytest + pytest-asyncio"] end subgraph "前端" V["Vue 3"] VR["vue-router"] PI["Pinia"] AX["axios"] EP["Element Plus"] VT["vite"] SC["sass"] end F --> S S --> P F --> J F --> B F --> PS F --> PY V --> VR V --> PI V --> AX V --> EP V --> VT V --> SC ``` 图表来源 - [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#L1-L27) ## 性能考虑 - 异步 I/O:后端使用 SQLAlchemy 2.0 异步引擎与会话,降低高并发下的阻塞。 - 连接池:通过配置池大小与溢出参数,平衡吞吐与资源占用。 - 查询优化:模型中为高频过滤字段建立索引,服务层使用 selectinload 减少 N+1 查询。 - 分页与总数:服务层先统计总数再分页,避免一次性加载大结果集。 - 前端缓存:合理利用浏览器缓存与 Pinia 状态持久化,减少重复请求。 ## 故障排查指南 - 登录失败 - 检查用户名/密码与账户状态;确认 JWT 生成与返回。 - 前端:确认 Authorization 头是否正确附加。 - 权限错误(403) - 确认当前用户角色与所需权限;检查 get_current_admin_user/get_current_manager_user 逻辑。 - 数据库连接问题 - 检查 DATABASE_URL、池大小与超时配置;确认 PostgreSQL 可达。 - 健康检查 - 访问 /health 端点确认服务可用与版本信息。 章节来源 - [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L30-L34) - [backend/app/core/security.py](file://backend/app/core/security.py#L94-L109) - [backend/app/core/config.py](file://backend/app/core/config.py#L18-L21) - [backend/app/main.py](file://backend/app/main.py#L54-L56) - [frontend/src/api/request.js](file://frontend/src/api/request.js#L39-L62) ## 结论 本系统以“前后端分离 + 分层架构 + 微服务理念”实现模块化与可扩展性,结合异步数据库访问与严格的权限控制,满足医院绩效管理在数据一致性、安全性与可维护性方面的关键需求。建议持续完善测试覆盖、日志与监控体系,并在生产环境调整安全密钥与跨域策略。 ## 附录 - 部署建议 - 后端:使用 uvicorn 运行,配置反向代理(Nginx)与 HTTPS;分离 .env 与敏感配置。 - 前端:构建产物部署至静态服务器或 CDN,配置正确的 API 前缀与跨域。 - 开发建议 - 使用 Alembic 管理数据库迁移;完善单元与集成测试;引入 OpenAPI 文档与 Redoc。