# 养老院管理系统 - 工程架构详解 ## 一、项目整体架构图 ``` ┌─────────────────────────────────────────────────────────────────────┐ │ 前端应用层 │ │ ┌──────────────┬──────────────┬──────────────┬──────────────┐ │ │ │ Vue3后台 │ Vue2后台 │ Vben后台 │ UniApp移动 │ │ │ └──────────────┴──────────────┴──────────────┴──────────────┘ │ └────────────────────────────┬────────────────────────────────────────┘ │ HTTP/REST API ┌────────────────────────────────────────────────────────────────────┐ │ API网关 / 负载均衡 │ │ (Nginx / Spring Cloud) │ └────────────────────────────┬────────────────────────────────────────┘ │ ┌────────────────────────────────────────────────────────────────────┐ │ Spring Boot 应用层 │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ yudao-server (主应用) │ │ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ │ │ Controller 层(控制器) │ │ │ │ │ │ ┌──────────┬──────────┬──────────┬──────────────┐ │ │ │ │ │ │ │Expense │Elderly │Contract │DailyExpenses│ │ │ │ │ │ │ │Controller│Controller│Controller│Controller │ │ │ │ │ │ │ └──────────┴──────────┴──────────┴──────────────┘ │ │ │ │ │ └────────────────────────────────────────────────────────┘ │ │ │ │ ↓ │ │ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ │ │ Service 层(业务逻辑) │ │ │ │ │ │ ┌──────────┬──────────┬──────────┬──────────────┐ │ │ │ │ │ │ │Expense │Elderly │Contract │DailyExpenses│ │ │ │ │ │ │ │Service │Service │Service │Service │ │ │ │ │ │ │ └──────────┴──────────┴──────────┴──────────────┘ │ │ │ │ │ └────────────────────────────────────────────────────────┘ │ │ │ │ ↓ │ │ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ │ │ Mapper 层(数据访问) │ │ │ │ │ │ ┌──────────┬──────────┬──────────┬──────────────┐ │ │ │ │ │ │ │Expense │Elderly │Contract │DailyExpenses│ │ │ │ │ │ │ │Mapper │Mapper │Mapper │Mapper │ │ │ │ │ │ │ └──────────┴──────────┴──────────┴──────────────┘ │ │ │ │ │ └────────────────────────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ 框架层(yudao-framework) │ │ │ │ ┌─────────────┬─────────────┬─────────────┬────────────┐ │ │ │ │ │ Security │ MyBatis │ Redis │ Excel │ │ │ │ │ │ 权限认证 │ ORM增强 │ 缓存 │ 导入导出 │ │ │ │ │ └─────────────┴─────────────┴─────────────┴────────────┘ │ │ │ │ ┌─────────────┬─────────────┬─────────────┬────────────┐ │ │ │ │ │ Tenant │ Job │ MQ │ Monitor │ │ │ │ │ │ 多租户 │ 定时任务 │ 消息队列 │ 监控 │ │ │ │ │ └─────────────┴─────────────┴─────────────┴────────────┘ │ │ │ └──────────────────────────────────────────────────────────────┘ │ └────────────────────────────┬────────────────────────────────────────┘ │ ┌────────────────────────────────────────────────────────────────────┐ │ 数据持久化层 │ │ ┌──────────────┬──────────────┬──────────────┬──────────────┐ │ │ │ MySQL │ Redis │ Elasticsearch │ 其他DB │ │ │ │ 关系型数据库 │ 缓存存储 │ 搜索引擎 │ 备选方案 │ │ │ └──────────────┴──────────────┴──────────────┴──────────────┘ │ └────────────────────────────────────────────────────────────────────┘ ``` --- ## 二、模块依赖关系图 ``` yudao-dependencies (依赖版本管理) ↓ yudao-framework (框架层) ├─ yudao-common (通用工具) ├─ yudao-spring-boot-starter-security (权限) ├─ yudao-spring-boot-starter-mybatis (ORM) ├─ yudao-spring-boot-starter-redis (缓存) ├─ yudao-spring-boot-starter-biz-tenant (多租户) ├─ yudao-spring-boot-starter-job (定时任务) ├─ yudao-spring-boot-starter-mq (消息队列) ├─ yudao-spring-boot-starter-excel (Excel) ├─ yudao-spring-boot-starter-web (Web) ├─ yudao-spring-boot-starter-monitor (监控) └─ yudao-spring-boot-starter-protection (保护) ↓ yudao-module-system (系统模块 - 核心业务) ├─ yudao-module-system-api (API接口) └─ yudao-module-system-biz (业务实现) ↓ yudao-module-infra (基础设施模块) ├─ yudao-module-infra-api └─ yudao-module-infra-biz ↓ yudao-module-member (会员模块 - 可选) ├─ yudao-module-member-api └─ yudao-module-member-biz ↓ yudao-module-bpm (工作流模块 - 可选) ├─ yudao-module-bpm-api └─ yudao-module-bpm-biz ↓ yudao-module-report (报表模块 - 可选) ├─ yudao-module-report-api └─ yudao-module-report-biz ↓ yudao-server (主应用 - 容器) └─ 依赖所有上述模块 ``` --- ## 三、数据流向图 ### 3.1 账单查询流程 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 前端请求: GET /api/order/receivable-total?year=2024 │ └────────────────────────┬────────────────────────────────────────┘ │ ↓ ┌─────────────────────────────────────────────────────────────────┐ │ OrderController.getOrderReceivableTotal() │ │ - 参数验证 │ │ - 权限检查 │ └────────────────────────┬────────────────────────────────────────┘ │ ↓ ┌─────────────────────────────────────────────────────────────────┐ │ OrderApiImpl.getOrderReceivableTotal() │ │ - 循环12个月 │ │ - 调用 getReceivableListByMonth() │ │ - 累加各项金额 │ └────────────────────────┬────────────────────────────────────────┘ │ ↓ ┌─────────────────────────────────────────────────────────────────┐ │ OrderApiImpl.getReceivableListByMonth() │ │ - 调用 getListByMonth() │ └────────────────────────┬────────────────────────────────────────┘ │ ↓ ┌─────────────────────────────────────────────────────────────────┐ │ OrderApiImpl.getListByMonth() │ │ ├─ orderMapper.selectListByMonth() │ │ │ └─ SQL: SELECT * FROM elderly_expense_order WHERE ... │ │ │ (查询该月订单列表) │ │ │ │ │ ├─ orderItemMapper.selectList() │ │ │ └─ SQL: SELECT * FROM elderly_expense_order_item │ │ │ WHERE expense_order_id IN (...) │ │ │ (批量查询订单项) │ │ │ │ │ ├─ itemMapper.selectBatchIds() │ │ │ └─ SQL: SELECT * FROM elderly_expense_item │ │ │ WHERE id IN (...) │ │ │ (批量查询费用项) │ │ │ │ │ └─ dailyExpensesMapper.selectBatchIds() │ │ └─ SQL: SELECT * FROM daily_expenses │ │ WHERE id IN (...) │ │ (批量查询日常开支) │ └────────────────────────┬────────────────────────────────────────┘ │ ↓ ┌─────────────────────────────────────────────────────────────────┐ │ 数据组装与计算 │ │ - 将DO转换为VO │ │ - 计算各项金额 │ │ - 计算实付比例 │ └────────────────────────┬────────────────────────────────────────┘ │ ↓ ┌─────────────────────────────────────────────────────────────────┐ │ 返回响应: OrderItemTotalRespVO │ │ { │ │ "billingMonth": "2024年12月", │ │ "bedTotalAmount": 12000.00, │ │ "nurseTotalAmount": 8000.00, │ │ "mealTotalAmount": 5000.00, │ │ "serviceTotalAmount": 3000.00, │ │ "totalAmount": 28000.00, │ │ "totalActualAmount": 25000.00, │ │ "actualTotalProportion": "89%" │ │ } │ └─────────────────────────────────────────────────────────────────┘ ``` ### 3.2 性能问题展示 ``` 【当前实现】- 性能问题 ┌──────────────────────────────────────────────────────────────┐ │ getOrderReceivableTotal() │ │ for i=1 to 12: │ │ ├─ getReceivableListByMonth(month=i) │ │ │ └─ getListByMonth() │ │ │ ├─ Query 1: selectListByMonth() │ │ │ ├─ Query 2: selectList() - 订单项 │ │ │ ├─ Query 3: selectBatchIds() - 费用项 │ │ │ └─ Query 4: selectBatchIds() - 日常开支 │ │ │ │ │ └─ 累加数据 │ │ │ │ 总查询数: 12 × 4 = 48 次数据库查询 ❌ │ └──────────────────────────────────────────────────────────────┘ 【优化方案】- 性能改进 ┌──────────────────────────────────────────────────────────────┐ │ getOrderReceivableTotal() │ │ ├─ selectListByYear(year) │ │ │ ├─ Query 1: selectListByYear() │ │ │ ├─ Query 2: selectList() - 订单项 │ │ │ ├─ Query 3: selectBatchIds() - 费用项 │ │ │ └─ Query 4: selectBatchIds() - 日常开支 │ │ │ │ │ └─ 在内存中按月份分组 │ │ └─ 循环12个月进行累加 │ │ │ │ 总查询数: 1 × 4 = 4 次数据库查询 ✅ │ │ 性能提升: 92% 的查询减少 │ └──────────────────────────────────────────────────────────────┘ ``` --- ## 四、业务对象关系图 ``` ┌─────────────────────────────────────────────────────────────────┐ │ ElderlyInfo (长者) │ │ ├─ id: 长者ID │ │ ├─ elder_name: 姓名 │ │ ├─ in_status: 在住状态 (1=在住, 2=退住) │ │ ├─ org_type: 机构类型 │ │ └─ tenant_id: 租户ID │ └────────┬──────────────────────────────────────────────────────────┘ │ 1:N ├─────────────────────────────────────────────────────────┐ │ │ ↓ ↓ ┌──────────────────────────┐ ┌──────────────────────────┐ │ ElderlyContract (合同) │ │ ElderlyExpense (费用) │ │ ├─ id │ │ ├─ id │ │ ├─ contract_number │ │ ├─ elder_id │ │ ├─ begin_time │ │ ├─ created_time │ │ ├─ expire_time │ │ └─ ... │ │ ├─ contract_term │ │ │ │ └─ ... │ │ 1:N │ └──────────────────────────┘ │ ↓ │ │ ┌──────────────────────┐│ │ │ExpenseItem (费用项) ││ │ │├─ id ││ │ │├─ expense_id ││ │ │├─ item_category_id ││ │ │├─ type ││ │ │├─ amount ││ │ │└─ ... ││ │ └──────────────────────┘│ └──────────────────────────┘ │ ├─────────────────────────────────────────────────────────┐ │ │ ↓ ↓ ┌──────────────────────────────┐ ┌──────────────────────────┐ │ ExpenseOrder (账单) │ │ DailyExpenses (日常开支)│ │ ├─ id │ │ ├─ id │ │ ├─ elder_id │ │ ├─ elder_id │ │ ├─ billing_month │ │ ├─ item_name │ │ ├─ pay_status │ │ ├─ amount │ │ ├─ payable_amount │ │ ├─ round_amount │ │ ├─ actual_amount │ │ ├─ type │ │ └─ ... │ │ └─ ... │ │ │ │ │ │ 1:N │ │ 1:N │ │ ↓ │ │ ↓ │ │ ┌──────────────────────────┐│ │ (关联) │ │ │ExpenseOrderItem (账单项) ││ │ │ │ │├─ id ││ │ │ │ │├─ expense_order_id ││ │ │ │ │├─ expense_source ││ │ │ │ │├─ source_expense_item_id ││ │ │ │ │├─ total_amount ││ │ │ │ │├─ actual_price ││ │ │ │ │├─ pay_status ││ │ │ │ │└─ ... ││ │ │ │ └──────────────────────────┘│ │ │ └──────────────────────────────┘ └──────────────────────────┘ │ ├─────────────────────────────────────────────────────────┐ │ │ ↓ ↓ ┌──────────────────────────┐ ┌──────────────────────────┐ │ DepositRecord (押金) │ │ ElderlyBalance (余额) │ │ ├─ id │ │ ├─ id │ │ ├─ elder_id │ │ ├─ elder_id │ │ ├─ deposit_amount │ │ ├─ amount │ │ ├─ refund_amount │ │ └─ ... │ │ └─ ... │ │ │ └──────────────────────────┘ └──────────────────────────┘ ``` --- ## 五、系统功能模块图 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 养老院管理系统功能模块 │ └─────────────────────────────────────────────────────────────────┘ │ ├─────────────────────────────────────────────────────────┐ │ │ ↓ ↓ ┌──────────────────────────┐ ┌──────────────────────────┐ │ 长者管理模块 │ │ 合同管理模块 │ │ ├─ 长者信息维护 │ │ ├─ 合同创建 │ │ ├─ 入住管理 │ │ ├─ 合同续签 │ │ ├─ 退住管理 │ │ ├─ 合同终止 │ │ ├─ 床位分配 │ │ ├─ 合同查询 │ │ ├─ 护理等级 │ │ └─ 合同统计 │ │ └─ 长者查询 │ └──────────────────────────┘ └──────────────────────────┘ │ ├─────────────────────────────────────────────────────────┐ │ │ ↓ ↓ ┌──────────────────────────┐ ┌──────────────────────────┐ │ 费用管理模块 │ │ 账单管理模块 │ │ ├─ 费用项维护 │ │ ├─ 账单生成 │ │ ├─ 费用分类 │ │ ├─ 账单查询 │ │ ├─ 费用统计 │ │ ├─ 账单打印 │ │ ├─ 费用调整 │ │ ├─ 缴费管理 │ │ └─ 费用查询 │ │ ├─ 欠费管理 │ └──────────────────────────┘ │ └─ 账单统计 │ │ └──────────────────────────┘ │ ├─────────────────────────────────────────────────────────┐ │ │ ↓ ↓ ┌──────────────────────────┐ ┌──────────────────────────┐ │ 日常开支模块 │ │ 押金管理模块 │ │ ├─ 开支录入 │ │ ├─ 押金收取 │ │ ├─ 开支分类 │ │ ├─ 押金退还 │ │ ├─ 开支统计 │ │ ├─ 押金查询 │ │ ├─ 开支查询 │ │ └─ 押金统计 │ │ └─ 开支导出 │ └──────────────────────────┘ └──────────────────────────┘ │ ├─────────────────────────────────────────────────────────┐ │ │ ↓ ↓ ┌──────────────────────────┐ ┌──────────────────────────┐ │ 员工管理模块 │ │ 设备管理模块 │ │ ├─ 员工信息 │ │ ├─ 设备维护 │ │ ├─ 排班管理 │ │ ├─ 设备监控 │ │ ├─ 考勤管理 │ │ ├─ 设备告警 │ │ ├─ 薪资管理 │ │ └─ 设备统计 │ │ └─ 员工查询 │ └──────────────────────────┘ └──────────────────────────┘ │ ├─────────────────────────────────────────────────────────┐ │ │ ↓ ↓ ┌──────────────────────────┐ ┌──────────────────────────┐ │ 工作流模块 │ │ 报表统计模块 │ │ ├─ 流程定义 │ │ ├─ 收入统计 │ │ ├─ 流程监控 │ │ ├─ 开支统计 │ │ ├─ 任务管理 │ │ ├─ 长者统计 │ │ └─ 流程查询 │ │ ├─ 占用率统计 │ └──────────────────────────┘ │ └─ 自定义报表 │ └──────────────────────────┘ ``` --- ## 六、数据库表结构关系 ``` elderly_info (长者信息表) │ ├─ PK: id ├─ FK: tenant_id → tenant (租户) ├─ FK: bed_id → org_build_bed (床位) ├─ FK: build_id → org_build (建筑) │ ├─ 1:N → elderly_contract (合同) │ ├─ PK: id │ ├─ FK: elder_id → elderly_info │ └─ 字段: contract_number, begin_time, expire_time, contract_term │ ├─ 1:N → elderly_expense_order (账单) │ ├─ PK: id │ ├─ FK: elder_id → elderly_info │ ├─ 字段: billing_month, pay_status, payable_amount, actual_amount │ │ │ └─ 1:N → elderly_expense_order_item (账单项) │ ├─ PK: id │ ├─ FK: expense_order_id → elderly_expense_order │ ├─ 字段: expense_source, source_expense_item_id, total_amount │ └─ 关联: ExpenseItem 或 DailyExpenses │ ├─ 1:N → elderly_expense (费用) │ ├─ PK: id │ ├─ FK: elder_id → elderly_info │ │ │ └─ 1:N → elderly_expense_item (费用项) │ ├─ PK: id │ ├─ FK: expense_id → elderly_expense │ ├─ FK: item_category_id → sys_charge_category │ └─ 字段: type, amount │ ├─ 1:N → daily_expenses (日常开支) │ ├─ PK: id │ ├─ FK: elder_id → elderly_info │ └─ 字段: item_name, amount, round_amount, type │ ├─ 1:N → deposit_record (押金) │ ├─ PK: id │ ├─ FK: elder_id → elderly_info │ └─ 字段: deposit_amount, refund_amount │ ├─ 1:N → elderly_change_record (变更记录) │ ├─ PK: id │ ├─ FK: elder_id → elderly_info │ └─ 字段: change_type, change_content │ ├─ 1:1 → elderly_balance (余额) │ ├─ PK: id │ ├─ FK: elder_id → elderly_info │ └─ 字段: amount │ └─ 1:1 → elderly_expense_subsidy_account (补贴账户) ├─ PK: id ├─ FK: elder_id → elderly_info └─ 字段: amount ``` --- ## 七、API接口层次结构 ``` ┌─────────────────────────────────────────────────────────────────┐ │ API 接口层次结构 │ └─────────────────────────────────────────────────────────────────┘ ┌─ 长者管理 API ──────────────────────────────────────────────────┐ │ GET /api/elderly/list # 查询长者列表 │ │ GET /api/elderly/{id} # 查询长者详情 │ │ POST /api/elderly/create # 创建长者 │ │ PUT /api/elderly/update # 更新长者 │ │ DELETE /api/elderly/{id} # 删除长者 │ │ POST /api/elderly/check-in # 入住 │ │ POST /api/elderly/check-out # 退住 │ └─────────────────────────────────────────────────────────────────┘ ┌─ 合同管理 API ──────────────────────────────────────────────────┐ │ GET /api/contract/list # 查询合同列表 │ │ GET /api/contract/{id} # 查询合同详情 │ │ POST /api/contract/create # 创建合同 │ │ PUT /api/contract/update # 更新合同 │ │ DELETE /api/contract/{id} # 删除合同 │ │ POST /api/contract/renew # 续签合同 │ └─────────────────────────────────────────────────────────────────┘ ┌─ 费用管理 API ──────────────────────────────────────────────────┐ │ GET /api/expense/list # 查询费用列表 │ │ GET /api/expense/{id} # 查询费用详情 │ │ POST /api/expense/create # 创建费用 │ │ PUT /api/expense/update # 更新费用 │ │ DELETE /api/expense/{id} # 删除费用 │ │ GET /api/expense/statistics # 费用统计 │ └─────────────────────────────────────────────────────────────────┘ ┌─ 账单管理 API ──────────────────────────────────────────────────┐ │ GET /api/order/list # 查询账单列表 │ │ GET /api/order/{id} # 查询账单详情 │ │ POST /api/order/create # 创建账单 │ │ PUT /api/order/update # 更新账单 │ │ DELETE /api/order/{id} # 删除账单 │ │ GET /api/order/by-month # 按月查询账单 │ │ GET /api/order/total-by-month # 按月查询总计 │ │ GET /api/order/receivable-list # 查询应收列表 │ │ GET /api/order/receivable-total # 查询应收总计【性能问题】 │ │ POST /api/order/mark-paid # 标记已缴费 │ └─────────────────────────────────────────────────────────────────┘ ┌─ 日常开支 API ──────────────────────────────────────────────────┐ │ GET /api/daily-expenses/list # 查询开支列表 │ │ GET /api/daily-expenses/{id} # 查询开支详情 │ │ POST /api/daily-expenses/create # 创建开支 │ │ PUT /api/daily-expenses/update # 更新开支 │ │ DELETE /api/daily-expenses/{id} # 删除开支 │ │ GET /api/daily-expenses/statistics # 开支统计 │ └─────────────────────────────────────────────────────────────────┘ ┌─ 押金管理 API ──────────────────────────────────────────────────┐ │ GET /api/deposit/list # 查询押金列表 │ │ GET /api/deposit/{id} # 查询押金详情 │ │ POST /api/deposit/create # 创建押金 │ │ PUT /api/deposit/update # 更新押金 │ │ DELETE /api/deposit/{id} # 删除押金 │ │ POST /api/deposit/refund # 退还押金 │ └─────────────────────────────────────────────────────────────────┘ ``` --- ## 八、系统部署架构 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 开发环境 │ │ ┌──────────────┬──────────────┬──────────────┐ │ │ │ IDE │ Git │ Maven │ │ │ │ (IntelliJ) │ (GitHub) │ (3.8+) │ │ │ └──────────────┴──────────────┴──────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────────┐ │ 测试环境 │ │ ┌──────────────┬──────────────┬──────────────┐ │ │ │ JUnit │ Mockito │ H2 Database │ │ │ │ (单元测试) │ (Mock框架) │ (内存数据库)│ │ │ └──────────────┴──────────────┴──────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────────┐ │ 生产环境 │ │ ┌────────────────────────────────────────────────────────────┐ │ │ │ Nginx (反向代理) │ │ │ │ :80 / :443 (HTTPS) │ │ │ └────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌────────────────────────────────────────────────────────────┐ │ │ │ 负载均衡器 (可选) │ │ │ │ (Nginx / HAProxy / F5) │ │ │ └────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌────────────────────────────────────────────────────────────┐ │ │ │ Spring Boot 应用集群 │ │ │ │ ┌──────────────┬──────────────┬──────────────┐ │ │ │ │ │ Instance 1 │ Instance 2 │ Instance N │ │ │ │ │ │ :8080 │ :8081 │ :808N │ │ │ │ │ └──────────────┴──────────────┴──────────────┘ │ │ │ └────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌────────────────────────────────────────────────────────────┐ │ │ │ 数据持久化层 │ │ │ │ ┌──────────────┬──────────────┬──────────────┐ │ │ │ │ │ MySQL │ Redis │ Elasticsearch │ │ │ │ │ (主从) │ (集群) │ (可选) │ │ │ │ │ └──────────────┴──────────────┴──────────────┘ │ │ │ └────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌────────────────────────────────────────────────────────────┐ │ │ │ 备份与监控 │ │ │ │ ┌──────────────┬──────────────┬──────────────┐ │ │ │ │ │ 备份系统 │ 监控系统 │ 日志系统 │ │ │ │ │ │ (定时备份) │ (Prometheus)│ (ELK Stack) │ │ │ │ │ └──────────────┴──────────────┴──────────────┘ │ │ │ └────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ``` --- ## 九、请求处理流程 ``` ┌─────────────────────────────────────────────────────────────────┐ │ HTTP 请求处理流程 │ └─────────────────────────────────────────────────────────────────┘ 1. 请求到达 ↓ Client 发送 HTTP 请求 GET /api/order/receivable-total?year=2024&tenantId=1 ↓ 2. 网关层 ↓ Nginx 接收请求 ├─ SSL/TLS 解密 (如果是HTTPS) ├─ 请求路由 ├─ 负载均衡 └─ 请求转发到应用 ↓ 3. Spring Boot 应用 ↓ DispatcherServlet 接收请求 ↓ 4. 过滤器链 ↓ ├─ CharacterEncodingFilter (字符编码) ├─ CorsFilter (跨域处理) ├─ SecurityFilter (安全过滤) └─ 其他自定义过滤器 ↓ 5. 拦截器链 ↓ ├─ PreHandle (前置处理) │ ├─ 权限验证 │ ├─ 租户隔离 │ └─ 日志记录 ├─ PostHandle (后置处理) └─ AfterCompletion (完成处理) ↓ 6. 控制器处理 ↓ OrderController.getOrderReceivableTotal() ├─ 参数验证 (@Valid) ├─ 权限检查 (@PreAuthorize) ├─ 租户隔离 (TenantContext) └─ 调用业务层 ↓ 7. 业务层处理 ↓ OrderApiImpl.getOrderReceivableTotal() ├─ 业务逻辑处理 ├─ 数据库查询 ├─ 数据组装 └─ 返回结果 ↓ 8. 数据访问层 ↓ ExpenseOrderMapper.selectListByYear() ├─ SQL 构建 ├─ 参数绑定 ├─ 数据库执行 └─ 结果映射 ↓ 9. 数据库操作 ↓ MySQL 执行 SQL 查询 ├─ 查询优化 ├─ 索引使用 ├─ 缓存查询 └─ 返回结果集 ↓ 10. 响应处理 ↓ ├─ 数据转换 (DO → VO) ├─ 序列化 (Object → JSON) ├─ 响应头设置 └─ 返回给客户端 ↓ 11. 客户端接收 ↓ { "code": 0, "msg": "success", "data": { "billingMonth": "2024年12月", "totalAmount": 28000.00, ... } } ``` --- ## 十、缓存策略 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 缓存分层策略 │ └─────────────────────────────────────────────────────────────────┘ ┌─ 一级缓存 (本地缓存) ─────────────────────────────────────────┐ │ 位置: 应用内存 │ │ 工具: Guava Cache / Caffeine │ │ 特点: 速度快,但不支持分布式 │ │ 使用场景: │ │ ├─ 字典数据缓存 │ │ ├─ 配置信息缓存 │ │ └─ 热点数据缓存 │ │ TTL: 5-30 分钟 │ └─────────────────────────────────────────────────────────────────┘ ↓ ┌─ 二级缓存 (分布式缓存) ───────────────────────────────────────┐ │ 位置: Redis 服务器 │ │ 工具: Spring Data Redis │ │ 特点: 支持分布式,速度快 │ │ 使用场景: │ │ ├─ 用户会话缓存 │ │ ├─ 权限数据缓存 │ │ ├─ 账单数据缓存 │ │ └─ 统计数据缓存 │ │ TTL: 30 分钟 - 1 小时 │ │ 缓存键设计: │ │ ├─ order:receivable:total:{year}:{tenantId} │ │ ├─ order:list:{month}:{tenantId} │ │ └─ elderly:info:{elderId} │ └─────────────────────────────────────────────────────────────────┘ ↓ ┌─ 三级缓存 (数据库缓存) ───────────────────────────────────────┐ │ 位置: MySQL 数据库 │ │ 工具: MyBatis 查询缓存 │ │ 特点: 持久化存储 │ │ 使用场景: │ │ ├─ 所有业务数据 │ │ └─ 历史数据 │ │ TTL: 永久存储 │ └─────────────────────────────────────────────────────────────────┘ 缓存更新策略: ├─ Cache-Aside (旁路缓存) │ ├─ 读: 先查缓存,缓存未命中则查数据库,更新缓存 │ └─ 写: 先更新数据库,再删除缓存 │ ├─ Write-Through (写穿) │ ├─ 读: 先查缓存,缓存未命中则查数据库 │ └─ 写: 同时更新缓存和数据库 │ └─ Write-Behind (写回) ├─ 读: 先查缓存,缓存未命中则查数据库 └─ 写: 先更新缓存,异步更新数据库 ``` --- ## 十一、监控与告警 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 监控与告警体系 │ └─────────────────────────────────────────────────────────────────┘ ┌─ 应用监控 ────────────────────────────────────────────────────┐ │ 工具: Spring Boot Actuator + Prometheus + Grafana │ │ 指标: │ │ ├─ JVM 内存使用率 │ │ ├─ 线程数 │ │ ├─ GC 频率 │ │ ├─ HTTP 请求数 │ │ ├─ 请求响应时间 │ │ ├─ 错误率 │ │ └─ 业务指标 │ │ ├─ 账单生成数 │ │ ├─ 缴费成功率 │ │ └─ 应收总额 │ └─────────────────────────────────────────────────────────────────┘ ┌─ 数据库监控 ──────────────────────────────────────────────────┐ │ 工具: MySQL Slow Query Log + pt-query-digest │ │ 指标: │ │ ├─ 慢查询日志 │ │ ├─ 查询执行时间 │ │ ├─ 连接数 │ │ ├─ 锁等待时间 │ │ └─ 复制延迟 │ └─────────────────────────────────────────────────────────────────┘ ┌─ 缓存监控 ────────────────────────────────────────────────────┐ │ 工具: Redis Info + Redis Exporter │ │ 指标: │ │ ├─ 缓存命中率 │ │ ├─ 缓存大小 │ │ ├─ 过期键数 │ │ ├─ 连接数 │ │ └─ 内存使用率 │ └─────────────────────────────────────────────────────────────────┘ ┌─ 日志监控 ────────────────────────────────────────────────────┐ │ 工具: ELK Stack (Elasticsearch + Logstash + Kibana) │ │ 日志类型: │ │ ├─ 应用日志 (INFO, WARN, ERROR) │ │ ├─ 访问日志 (HTTP 请求) │ │ ├─ 审计日志 (用户操作) │ │ └─ 业务日志 (关键业务操作) │ └─────────────────────────────────────────────────────────────────┘ 告警规则: ├─ CPU 使用率 > 80% → 告警 ├─ 内存使用率 > 85% → 告警 ├─ 磁盘使用率 > 90% → 告警 ├─ 数据库连接数 > 80% → 告警 ├─ 慢查询 > 1s → 告警 ├─ 错误率 > 1% → 告警 ├─ 缓存命中率 < 70% → 告警 └─ 应用响应时间 > 1s → 告警 ``` --- **文档生成时间**: 2025-12-08 **文档版本**: 1.0 **作者**: AI Assistant