20260823210241

This commit is contained in:
oneao committed 2026-08-23 21:02:41 +08:00
1 parent 5ff4583aeb
commit f4c7413dc6
2766 files changed
+1836409 -94689

No files matched your search

@@ -0,0 +1,330 @@
# 故障处理
<cite>
**本文引用的文件**
- [GlobalExceptionHandler.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java)
- [application.yaml](file://fms-api/src/main/resources/application.yaml)
- [http.js](file://fms-vue/src/services/http.js)
- [FpsMonitor.vue](file://fms-vue/src/components/FpsMonitor.vue)
- [OrgDatabaseConfigLoader.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java)
- [OrgDatabaseConfig.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfig.java)
- [README.md](file://fms-api/config/dbconfigs/README.md)
- [LogRebuild.java](file://.tmp-fkcheck/LogRebuild.java)
- [OrgDataSourceFactoryTests.java](file://fms-api/src/test/java/cn/g3soft/fmsapi/database/OrgDataSourceFactoryTests.java)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能注意事项](#性能注意事项)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向FMS系统的运维与研发人员,聚焦于常见故障的类型识别、定位方法、恢复流程与预防机制。内容覆盖前后端错误日志分析、数据库连接异常、网络问题、内存与CPU瓶颈诊断,以及服务重启、数据回滚、熔断降级与健康检查等实践建议。
## 项目结构
FMS系统由前端Vue应用与后端Spring Boot API组成:
- 前端负责请求拦截、统一错误提示、登录态处理与运行时性能监控(FPS)。
- 后端提供全局异常处理、多机构数据库配置加载、连接池参数配置与结构化日志表设计。
```mermaid
graph TB
FE["前端 Vue<br/>请求拦截/错误提示/FPS监控"] --> API["后端 Spring Boot API<br/>全局异常/接口响应"]
API --> DB["SQL Server<br/>多机构数据库"]
API --> LOG["日志表 s_log_technical / s_log_login / s_log_audit"]
```
**图表来源**
- [http.js:40-104](file://fms-vue/src/services/http.js#L40-L104)
- [GlobalExceptionHandler.java:15-84](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java#L15-L84)
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [LogRebuild.java:25-96](file://.tmp-fkcheck/LogRebuild.java#L25-L96)
**章节来源**
- [http.js:1-111](file://fms-vue/src/services/http.js#L1-L111)
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
## 核心组件
- 前端HTTP拦截器:统一注入鉴权头、解析服务端返回码、处理超时与网络异常、对认证失败进行会话清理与跳转登录。
- 后端全局异常处理器:捕获业务异常、保存对象异常、数据库访问异常与未处理异常,记录系统异常并返回统一错误响应。
- 多机构数据库配置加载:按机构ID读取properties文件,校验URL协议为SQL Server,抛出非法路径或认证错误。
- 连接池与服务器配置:定义端口、上下文路径、数据库连接池参数(初始大小、最大活跃数、等待时间、空闲检测等)。
- 日志表结构:技术日志、登录日志、审计日志包含trace_id、request_id、错误码、异常文本、上下文等字段,便于追踪与分析。
**章节来源**
- [http.js:40-104](file://fms-vue/src/services/http.js#L40-L104)
- [GlobalExceptionHandler.java:15-84](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java#L15-L84)
- [OrgDatabaseConfigLoader.java:31-57](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L31-L57)
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [LogRebuild.java:25-96](file://.tmp-fkcheck/LogRebuild.java#L25-L96)
## 架构总览
前后端通过REST交互,前端在请求层集中处理鉴权与错误提示;后端以全局异常处理器统一收敛异常,并通过数据库连接池访问多机构SQL Server。日志写入结构化表,支持按trace_id与级别检索。
```mermaid
sequenceDiagram
participant U as "用户浏览器"
participant FE as "前端 http.js"
participant API as "后端 GlobalExceptionHandler"
participant DB as "SQL Server"
participant LOG as "日志表"
U->>FE : 发起API请求
FE->>FE : 注入Authorization头
FE->>API : HTTP请求
API->>DB : 执行数据库操作
DB-->>API : 结果或异常
API->>LOG : 记录技术/登录/审计日志
API-->>FE : 统一响应(成功/业务/系统异常)
FE-->>U : 展示结果或错误提示
```
**图表来源**
- [http.js:40-104](file://fms-vue/src/services/http.js#L40-L104)
- [GlobalExceptionHandler.java:15-84](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java#L15-L84)
- [LogRebuild.java:25-96](file://.tmp-fkcheck/LogRebuild.java#L25-L96)
## 详细组件分析
### 前端错误处理与性能监控
- 请求拦截:自动附加Bearer Token,超时默认15秒。
- 响应拦截:将无code的响应包装为标准结构;根据返回码判断是否认证失败并跳转登录;对网络异常与5xx错误弹出全局消息提示。
- 性能监控:内置FPS监控组件,使用requestAnimationFrame采样,统计当前帧率、平均值与历史柱状图,支持重置与拖拽。
```mermaid
flowchart TD
Start(["请求开始"]) --> Inject["注入Authorization头"]
Inject --> Send["发送HTTP请求"]
Send --> Resp{"响应成功?"}
Resp -- 否 --> NetErr["网络异常/超时"]
NetErr --> Toast["显示全局错误提示"]
Toast --> End(["结束"])
Resp -- 是 --> CheckCode{"返回码=0?"}
CheckCode -- 否 --> AuthCheck{"是否认证错误?"}
AuthCheck -- 是 --> Logout["清理会话并跳转登录"]
AuthCheck -- 否 --> BizErr["构造业务错误并抛出"]
CheckCode -- 是 --> Success["透传数据"]
Success --> End
Logout --> End
BizErr --> End
```
**图表来源**
- [http.js:40-104](file://fms-vue/src/services/http.js#L40-L104)
**章节来源**
- [http.js:1-111](file://fms-vue/src/services/http.js#L1-L111)
- [FpsMonitor.vue:1-290](file://fms-vue/src/components/FpsMonitor.vue#L1-L290)
### 后端全局异常处理
- 分类处理:认证异常、业务异常、保存对象异常、数据库异常与通用异常。
- 日志记录:对所有系统异常记录method、uri与堆栈信息。
- 统一响应:返回标准错误码与消息,避免暴露内部细节。
```mermaid
classDiagram
class GlobalExceptionHandler {
+handleAuthenticationException()
+handleBusinessException()
+handleSaveObjectException()
+handleDatabaseException()
+handleException()
-logSystemException()
-systemErrorResponse()
}
```
**图表来源**
- [GlobalExceptionHandler.java:15-84](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java#L15-L84)
**章节来源**
- [GlobalExceptionHandler.java:15-84](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java#L15-L84)
### 多机构数据库配置与连接策略
- 配置文件:每个机构一个properties文件,命名规范为{ORG_ID}.properties,仅允许字母、数字、下划线与连字符。
- 安全校验:路径规范化后限制在配置目录内;缺失文件或非法路径抛出认证异常。
- 驱动与协议:强制要求URL以jdbc:sqlserver:开头。
- 连接池行为:测试用例表明获取连接失败时不重试、快速失败并断开后续尝试,避免雪崩。
```mermaid
flowchart TD
A["加载机构配置"] --> B["规范化组织ID与路径"]
B --> C{"路径合法且文件存在?"}
C -- 否 --> E["抛出认证异常"]
C -- 是 --> D["读取properties并校验URL协议"]
D --> F{"是否为SQL Server URL?"}
F -- 否 --> G["抛出非法协议异常"]
F -- 是 --> H["创建数据源(连接池)"]
```
**图表来源**
- [OrgDatabaseConfigLoader.java:31-57](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L31-L57)
- [OrgDataSourceFactoryTests.java:11-29](file://fms-api/src/test/java/cn/g3soft/fmsapi/database/OrgDataSourceFactoryTests.java#L11-L29)
**章节来源**
- [OrgDatabaseConfigLoader.java:31-57](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L31-L57)
- [OrgDatabaseConfig.java:1-10](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfig.java#L1-L10)
- [README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
- [OrgDataSourceFactoryTests.java:11-29](file://fms-api/src/test/java/cn/g3soft/fmsapi/database/OrgDataSourceFactoryTests.java#L11-L29)
## 依赖关系分析
- 前端依赖axios进行HTTP通信,统一封装post方法与拦截器逻辑。
- 后端依赖Spring MVC与Druid连接池,通过application.yaml配置服务与连接池参数。
- 日志模块通过SQL脚本创建结构化表,支撑技术日志、登录日志与审计日志的持久化与索引查询。
```mermaid
graph LR
Axios["axios(http.js)"] --> API["Spring MVC(GlobalExceptionHandler)"]
API --> Druid["Druid连接池(application.yaml)"]
API --> SQL["SQL Server(LogRebuild.java)"]
```
**图表来源**
- [http.js:1-111](file://fms-vue/src/services/http.js#L1-L111)
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [LogRebuild.java:25-96](file://.tmp-fkcheck/LogRebuild.java#L25-L96)
**章节来源**
- [http.js:1-111](file://fms-vue/src/services/http.js#L1-L111)
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [LogRebuild.java:25-96](file://.tmp-fkcheck/LogRebuild.java#L25-L96)
## 性能注意事项
- 前端渲染性能:使用FPS监控组件观察帧率变化,结合历史柱状图定位卡顿时段;合理设置采样间隔与历史长度,避免过度响应式更新。
- 后端接口响应:关注数据库连接池参数(最大活跃数、等待时间),在高并发场景下避免连接耗尽导致请求排队。
- 数据库查询优化:利用日志表中的trace_id与级别索引,结合业务模块代码定位慢查询与异常热点。
[本节为通用指导,无需特定文件引用]
## 故障排查指南
### 网络连接问题
- 现象:前端报“网络异常”或“请求超时”,后端可能不可达或返回5xx。
- 排查步骤:
- 检查前端超时配置与baseURL是否正确。
- 确认后端服务端口与上下文路径配置。
- 查看后端全局异常处理器是否记录了系统异常与方法URI。
- 若为认证错误(401/40101),前端会清理会话并跳转登录页。
**章节来源**
- [http.js:40-104](file://fms-vue/src/services/http.js#L40-L104)
- [application.yaml:1-4](file://fms-api/src/main/resources/application.yaml#L1-L4)
- [GlobalExceptionHandler.java:57-84](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java#L57-L84)
### 数据库连接异常
- 现象:接口报错“系统异常”,或连接池无法获取连接。
- 排查步骤:
- 核对机构配置文件是否存在且路径合法,URL必须为SQL Server协议。
- 检查连接池参数(initial-size、max-active、max-wait)是否合理。
- 验证连接失败时的快速失败策略,避免重试风暴。
- 通过日志表检索trace_id与错误码,定位具体数据库节点与SQL。
**章节来源**
- [OrgDatabaseConfigLoader.java:31-57](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L31-L57)
- [application.yaml:14-26](file://fms-api/src/main/resources/application.yaml#L14-L26)
- [OrgDataSourceFactoryTests.java:11-29](file://fms-api/src/test/java/cn/g3soft/fmsapi/database/OrgDataSourceFactoryTests.java#L11-L29)
- [LogRebuild.java:52-75](file://.tmp-fkcheck/LogRebuild.java#L52-L75)
### 内存溢出(OOM)
- 现象:服务频繁重启、GC频繁、堆内存占用过高。
- 排查步骤:
- 收集JVM堆转储与GC日志,分析大对象与泄漏点。
- 检查数据库连接池是否过大导致连接泄露。
- 审查前端是否一次性加载超大资源导致页面崩溃。
- 结合日志表中的trace_id关联前后端调用链,定位触发点。
[本节为通用指导,无需特定文件引用]
### CPU占用过高
- 现象:接口响应变慢、线程阻塞、CPU持续高位。
- 排查步骤:
- 使用线程dump分析热点线程与锁竞争。
- 检查数据库慢查询与全表扫描。
- 评估前端重渲染与大数据量列表导致的计算开销。
- 通过日志表按模块与级别筛选异常与耗时记录。
[本节为通用指导,无需特定文件引用]
### 错误日志分析方法
- 前端JavaScript错误:
- 关注http.js的响应拦截器抛出的错误结构与提示。
- 使用浏览器控制台与网络面板查看请求与响应。
- 后端异常堆栈:
- 通过GlobalExceptionHandler记录的method与uri定位接口。
- 结合日志表s_log_technical的exception_text与context_text深入分析。
- 业务逻辑错误:
- 依据业务异常与保存对象异常的table、action、index字段缩小范围。
**章节来源**
- [http.js:49-104](file://fms-vue/src/services/http.js#L49-L104)
- [GlobalExceptionHandler.java:20-64](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java#L20-L64)
- [LogRebuild.java:52-75](file://.tmp-fkcheck/LogRebuild.java#L52-L75)
### 性能瓶颈识别与优化方案
- 前端渲染性能优化:
- 使用FpsMonitor.vue观察帧率波动,减少不必要的重渲染。
- 合理分页与虚拟滚动,降低DOM压力。
- 后端接口响应优化:
- 调整连接池参数,避免连接耗尽。
- 引入缓存与异步处理,降低同步阻塞。
- 数据库查询优化:
- 基于日志表trace_id与级别索引定位慢查询。
- 优化SQL与索引,减少全表扫描。
**章节来源**
- [FpsMonitor.vue:1-290](file://fms-vue/src/components/FpsMonitor.vue#L1-L290)
- [application.yaml:14-26](file://fms-api/src/main/resources/application.yaml#L14-L26)
- [LogRebuild.java:52-75](file://.tmp-fkcheck/LogRebuild.java#L52-L75)
### 系统恢复流程
- 服务重启策略:
- 先停止流量入口,再优雅关闭服务,确保事务一致性。
- 重启后验证健康检查与基础接口可用性。
- 数据回滚操作:
- 基于迁移脚本与备份进行回滚,优先回滚最近变更。
- 回滚后校验关键表结构与数据完整性。
- 紧急修复方案:
- 临时放宽连接池限制或降级非核心功能。
- 通过日志表快速定位问题根因并实施热修复。
[本节为通用指导,无需特定文件引用]
### 故障预防机制
- 健康检查:
- 实现轻量级健康检查接口,验证数据库连通性与自身可达性。
- 自动重试:
- 对幂等接口配置有限重试与退避策略,避免雪崩。
- 熔断降级:
- 对依赖服务启用熔断器,失败时快速返回降级响应。
- 监控告警:
- 基于日志表与指标采集建立阈值告警,及时发现问题。
[本节为通用指导,无需特定文件引用]
### 应急预案与灾难恢复计划
- 预案分级:
- 定义P0-P3事件等级,明确响应时限与升级路径。
- 恢复目标:
- RTO(恢复时间目标)与RPO(恢复点目标)设定与演练。
- 演练与复盘:
- 定期开展故障演练,完善SOP与知识库。
- 复盘根因,落实改进措施与回归测试。
[本节为通用指导,无需特定文件引用]
## 结论
FMS系统在前后端均具备完善的错误处理与日志能力。通过统一的异常处理、结构化日志表与连接池配置,可高效定位网络、数据库与性能问题。建议结合健康检查、重试与熔断机制提升系统韧性,并制定标准化的恢复流程与应急预案,保障业务连续性。
## 附录
- 常用命令与配置参考:
- 启动Legacy SQL Server开发环境时指定TLS安全属性。
- 检查连接池参数与服务器上下文路径。
**章节来源**
- [README.md:18-28](file://fms-api/config/dbconfigs/README.md#L18-L28)
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
@@ -0,0 +1,296 @@
# 监控运维
<cite>
**本文引用的文件**
- [application.yaml](file://fms-api/src/main/resources/application.yaml)
- [pom.xml](file://fms-api/pom.xml)
- [FmsApiApplication.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/FmsApiApplication.java)
- [GlobalExceptionHandler.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java)
- [OrgDatabaseProperties.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java)
- [http.js](file://fms-vue/src/services/http.js)
- [FpsMonitor.vue](file://fms-vue/src/components/FpsMonitor.vue)
- [LogRebuild.java](file://.tmp-fkcheck/LogRebuild.java)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能与容量规划](#性能与容量规划)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件为 FMS 系统的监控运维文档,覆盖前端性能指标采集、后端接口响应时间监控、数据库查询性能分析、日志收集与管理策略、系统健康检查机制、数据库监控方案以及运维管理工具使用指南(服务启停、配置热更新、故障自愈)和容量规划扩容策略。内容基于仓库中现有实现进行梳理,并给出可落地的运维建议与可视化图示。
## 项目结构
FMS 由前后端两部分组成:
- 前端 fms-vue:基于 Vue 3 + Vite,提供用户界面与前端性能监控能力(FPS 面板),并通过统一的 HTTP 客户端访问后端 API。
- 后端 fms-api:Spring Boot 应用,暴露 /api 上下文下的 REST 接口;通过 Druid 连接池访问 SQL Server;内置全局异常处理与统一返回结构;支持按组织动态加载数据库配置。
```mermaid
graph TB
A["浏览器"] --> B["前端 fms-vue<br/>HTTP 客户端"]
B --> C["后端 fms-api<br/>Spring MVC"]
C --> D["Druid 连接池"]
D --> E["SQL Server 数据库"]
```
**图表来源**
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [http.js:1-111](file://fms-vue/src/services/http.js#L1-L111)
- [pom.xml:32-96](file://fms-api/pom.xml#L32-L96)
**章节来源**
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [pom.xml:32-96](file://fms-api/pom.xml#L32-L96)
## 核心组件
- 前端性能监控:FPS 面板组件,实时统计当前帧率、平均帧率、最低帧率,并以柱状图展示历史趋势,支持拖拽定位与重置。
- 前端网络层:Axios 封装,统一注入认证头、统一错误处理、超时与网络异常提示、鉴权失败跳转登录。
- 后端全局异常处理:集中捕获业务异常、数据库异常等,记录系统级日志并返回统一错误码与消息。
- 数据库连接池:Druid 连接池参数在配置文件中定义,包含最大活跃数、等待超时、空闲检测等。
- 启动入口:应用启动时初始化雪花 ID 生成器,随后启动 Spring Boot 容器。
**章节来源**
- [FpsMonitor.vue:1-290](file://fms-vue/src/components/FpsMonitor.vue#L1-L290)
- [http.js:1-111](file://fms-vue/src/services/http.js#L1-L111)
- [GlobalExceptionHandler.java:1-84](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java#L1-L84)
- [application.yaml:10-34](file://fms-api/src/main/resources/application.yaml#L10-L34)
- [FmsApiApplication.java:1-22](file://fms-api/src/main/java/cn/g3soft/fmsapi/FmsApiApplication.java#L1-L22)
## 架构总览
下图展示了从前端请求到后端处理、数据库访问及异常处理的完整链路,并标注了监控点。
```mermaid
sequenceDiagram
participant U as "用户"
participant FE as "前端 fms-vue"
participant BE as "后端 fms-api"
participant DB as "SQL Server"
U->>FE : 触发操作
FE->>FE : 采集 FPSrequestAnimationFrame
FE->>BE : 发起 HTTP 请求带 Authorization
BE->>BE : 路由/控制器处理
BE->>DB : 执行 SQL经 Druid 连接池
DB-->>BE : 返回结果或异常
BE-->>FE : 统一 ApiResponse
FE-->>U : 渲染结果/提示错误
Note over FE,BE : 监控点:前端 FPS、请求耗时、后端异常日志、数据库连接池状态
```
**图表来源**
- [FpsMonitor.vue:36-75](file://fms-vue/src/components/FpsMonitor.vue#L36-L75)
- [http.js:40-104](file://fms-vue/src/services/http.js#L40-L104)
- [GlobalExceptionHandler.java:48-84](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java#L48-L84)
- [application.yaml:14-26](file://fms-api/src/main/resources/application.yaml#L14-L26)
## 详细组件分析
### 前端性能监控(FPS)
- 采样机制:使用 requestAnimationFrame 高频计数,按固定采样间隔计算 FPS,维护当前值、平均值、最小值与历史柱状图。
- 健壮性:对非法入参做归一化;后台切换时重置采样窗口,避免将暂停时长计入均值;支持拖拽移动与重置统计。
- 集成方式:开发环境按需异步加载,生产环境默认不引入,减少开销。
```mermaid
flowchart TD
Start(["组件挂载"]) --> Init["初始化采样窗口"]
Init --> RAF["进入 requestAnimationFrame 循环"]
RAF --> Count{"达到采样间隔?"}
Count -- 否 --> RAF
Count -- 是 --> Calc["计算 FPS/更新平均/最小/历史"]
Calc --> RAF
RAF --> Visibility{"页面可见性变化?"}
Visibility -- 前台 --> Reset["重置采样窗口"]
Visibility -- 后台 --> Wait["等待恢复前台"]
Reset --> RAF
Wait --> RAF
```
**图表来源**
- [FpsMonitor.vue:36-75](file://fms-vue/src/components/FpsMonitor.vue#L36-L75)
- [FpsMonitor.vue:136-146](file://fms-vue/src/components/FpsMonitor.vue#L136-L146)
**章节来源**
- [FpsMonitor.vue:1-290](file://fms-vue/src/components/FpsMonitor.vue#L1-L290)
### 前端网络层与错误处理
- 请求拦截:自动注入 Authorization 头(Bearer Token)。
- 响应拦截:统一包装 ApiResponse;对 401/40101 清会话并跳转登录;对超时与网络异常给出友好提示;对 5xx 或不可达场景弹出全局错误消息。
- 超时与重试:默认超时 15s;可在调用处传入自定义配置。
```mermaid
sequenceDiagram
participant FE as "前端 http.js"
participant BE as "后端 fms-api"
FE->>FE : 请求拦截注入 Authorization
FE->>BE : 发送请求
alt 成功
BE-->>FE : 200 + ApiResponse
FE-->>FE : 标记 success/code/message/data
else 鉴权失败(401/40101)
BE-->>FE : 401/40101
FE-->>FE : 清理会话并跳转登录
else 网络/超时
BE-->>FE : 无响应/超时
FE-->>FE : 抛出错误并弹全局提示
end
```
**图表来源**
- [http.js:40-104](file://fms-vue/src/services/http.js#L40-L104)
**章节来源**
- [http.js:1-111](file://fms-vue/src/services/http.js#L1-L111)
### 后端全局异常处理与日志
- 统一异常分类:认证异常、业务异常、保存对象异常、数据库异常、通用异常。
- 日志记录:系统级异常记录方法、URI、堆栈等信息,便于问题定位。
- 统一返回:所有异常均返回标准 ApiResponse,包含错误码与消息。
```mermaid
classDiagram
class GlobalExceptionHandler {
+handleAuthenticationException()
+handleBusinessException()
+handleSaveObjectException()
+handleDatabaseException()
+handleException()
-logSystemException()
-systemErrorResponse()
}
```
**图表来源**
- [GlobalExceptionHandler.java:15-84](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java#L15-L84)
**章节来源**
- [GlobalExceptionHandler.java:1-84](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java#L1-L84)
### 数据库连接池与慢查询
- 连接池参数:最大活跃连接数、等待超时、空闲检测、借还校验等均在配置中定义。
- 慢查询分析:建议在 SQL Server 侧开启查询计划与慢查询日志,结合业务表索引优化;可通过临时脚本验证日志表结构与索引。
- 备份恢复:建议定期全量+增量备份,并在测试环境演练恢复流程。
```mermaid
flowchart TD
A["应用启动"] --> B["读取 Druid 配置"]
B --> C["创建连接池实例"]
C --> D{"连接可用?"}
D -- 否 --> E["等待/重试/告警"]
D -- 是 --> F["业务请求获取连接"]
F --> G["执行 SQL"]
G --> H{"是否慢查询?"}
H -- 是 --> I["记录慢查询/分析执行计划"]
H -- 否 --> J["正常返回"]
```
**图表来源**
- [application.yaml:14-26](file://fms-api/src/main/resources/application.yaml#L14-L26)
- [LogRebuild.java:52-75](file://.tmp-fkcheck/LogRebuild.java#L52-L75)
**章节来源**
- [application.yaml:14-26](file://fms-api/src/main/resources/application.yaml#L14-L26)
- [LogRebuild.java:52-75](file://.tmp-fkcheck/LogRebuild.java#L52-L75)
### 系统健康检查
- 现状:仓库未提供显式的健康检查端点。
- 建议:新增 /actuator/health 或自定义 /health 端点,检查应用自身与数据库连通性;供负载均衡与健康探针使用。
- 告警规则:当健康检查失败、接口超时率升高、错误率超过阈值时触发告警。
[本节为概念性说明,不直接分析具体文件]
### 日志收集与管理策略
- 应用日志:后端通过 SLF4J 记录系统异常与关键路径信息;前端在网络异常与鉴权失败时弹出全局提示。
- 日志级别:建议生产环境 INFO 及以上,调试阶段可临时提高至 DEBUG。
- 日志轮转:建议接入 Logback/Log4j2 的滚动策略(按天/大小),并归档保留一定周期。
- 结构化日志:建议统一 JSON 格式,包含 trace_id、user_id、module_code、duration_ms 等字段,便于检索与分析。
- 日志表:仓库中存在技术日志表结构示例,可用于持久化关键操作与异常信息。
**章节来源**
- [GlobalExceptionHandler.java:66-84](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java#L66-L84)
- [LogRebuild.java:52-75](file://.tmp-fkcheck/LogRebuild.java#L52-L75)
### 运维管理工具使用指南
- 服务启停:使用 Maven 插件打包后通过 java -jar 启动;开发环境可使用 spring-boot-devtools 提升迭代效率。
- 配置热更新:当前未启用配置中心;如需热更新,可考虑引入 Spring Cloud Config/Nacos 或基于 Actuator refresh。
- 故障自愈:建议结合健康检查与编排平台(如 Kubernetes Liveness/Readiness)实现自动重启与流量摘除。
**章节来源**
- [pom.xml:98-105](file://fms-api/pom.xml#L98-L105)
- [FmsApiApplication.java:13-18](file://fms-api/src/main/java/cn/g3soft/fmsapi/FmsApiApplication.java#L13-L18)
## 依赖关系分析
- 前端依赖:Vue 3、Vite、Pinia、Axios、NProgress 等。
- 后端依赖:Spring Boot WebMVC、JDBC、Druid、JWT、Jackson、SQL Server JDBC 驱动等。
- 模块耦合:前端通过 HTTP 与后端交互;后端通过连接池访问数据库;异常处理贯穿全链路。
```mermaid
graph LR
FE["fms-vue"] --> |HTTP| BE["fms-api"]
BE --> |JDBC| DB["SQL Server"]
BE --> |Druid| Pool["连接池"]
```
**图表来源**
- [pom.xml:32-96](file://fms-api/pom.xml#L32-L96)
- [fms-vue/package.json:21-46](file://fms-vue/package.json#L21-L46)
**章节来源**
- [pom.xml:32-96](file://fms-api/pom.xml#L32-L96)
- [fms-vue/package.json:21-46](file://fms-vue/package.json#L21-L46)
## 性能与容量规划
- 前端性能:
- 指标:FPS、首屏时间、资源加载耗时、接口响应时间。
- 手段:FPS 面板、网络层埋点(请求开始/结束时间)、静态资源缓存与压缩。
- 后端性能:
- 指标:接口 P95/P99 耗时、错误率、线程池/连接池利用率。
- 手段:接口耗时统计、慢查询分析、连接池参数调优。
- 数据库性能:
- 指标:连接池使用率、慢查询数量、锁等待、IO/CPU 使用。
- 手段:索引优化、执行计划分析、分库分表/读写分离(视规模)。
- 容量规划:
- 基线:压测得出单实例 QPS/TPS、CPU/内存/IO 水位。
- 扩容:水平扩展实例数,配合负载均衡与健康检查;数据库垂直升级或横向扩展。
- 弹性:根据 CPU/连接池使用率设置自动扩缩容策略。
[本节为通用指导,不直接分析具体文件]
## 故障排查指南
- 前端网络异常:
- 现象:请求超时、网络异常、鉴权失败。
- 处理:检查代理与跨域、确认 Token 有效性、查看全局错误提示。
- 后端异常:
- 现象:系统异常、保存失败、数据库异常。
- 处理:查看全局异常日志、定位 URI 与方法、检查数据库连接与 SQL。
- 数据库问题:
- 现象:连接池耗尽、慢查询增多。
- 处理:调整连接池参数、分析慢查询、优化索引与 SQL。
**章节来源**
- [http.js:76-104](file://fms-vue/src/services/http.js#L76-L104)
- [GlobalExceptionHandler.java:48-84](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java#L48-L84)
## 结论
FMS 已具备前端 FPS 监控、统一网络层与后端全局异常处理的基础能力。建议在此基础上完善健康检查端点、结构化日志与慢查询分析,并结合连接池与数据库侧优化,形成完整的监控与运维体系。通过容量规划与弹性扩容策略,保障系统在高峰期的稳定性与可扩展性。
## 附录
- 关键配置位置:
- 后端端口与上下文:application.yaml
- 数据库连接池参数:application.yaml
- 前端基础 URL 与超时:http.js
- 前端 FPS 面板:FpsMonitor.vue
- 后端异常处理:GlobalExceptionHandler.java
- 启动入口与 ID 生成器:FmsApiApplication.java
**章节来源**
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [http.js:1-111](file://fms-vue/src/services/http.js#L1-L111)
- [FpsMonitor.vue:1-290](file://fms-vue/src/components/FpsMonitor.vue#L1-L290)
- [GlobalExceptionHandler.java:1-84](file://fms-api/src/main/java/cn/g3soft/fmsapi/exception/GlobalExceptionHandler.java#L1-L84)
- [FmsApiApplication.java:1-22](file://fms-api/src/main/java/cn/g3soft/fmsapi/FmsApiApplication.java#L1-L22)
@@ -0,0 +1,231 @@
# 部署方案
<cite>
**本文引用的文件**
- [fms-api/pom.xml](file://fms-api/pom.xml)
- [fms-api/src/main/resources/application.yaml](file://fms-api/src/main/resources/application.yaml)
- [fms-api/start.cmd](file://fms-api/start.cmd)
- [fms-api/config/dbconfigs/README.md](file://fms-api/config/dbconfigs/README.md)
- [fms-api/config/dbconfigs/G3HD.properties](file://fms-api/config/dbconfigs/G3HD.properties)
- [fms-vue/package.json](file://fms-vue/package.json)
- [fms-vue/vite.config.js](file://fms-vue/vite.config.js)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能与容量规划](#性能与容量规划)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本部署方案面向FMS系统生产环境,覆盖服务器硬件与操作系统要求、JDK与Node.js版本、前后端构建流程、Docker容器化与编排、Nginx反向代理(静态资源托管、API网关、SSL)、多环境差异化配置、以及负载均衡与高可用设计。文档基于仓库中后端Spring Boot应用、前端Vite工程及现有配置文件进行说明,确保可落地执行。
## 项目结构
FMS系统采用前后端分离架构:
- 后端:Spring Boot API服务(端口8088,上下文/api),使用SQL Server数据库,支持本地或OSS文件存储。
- 前端:Vue 3 + Vite工程,开发时通过Vite代理将/api请求转发至后端;生产环境由Nginx统一提供静态资源并反向代理API。
```mermaid
graph TB
Client["浏览器/客户端"] --> Nginx["Nginx 反向代理"]
Nginx --> |静态资源| FE["fms-vue 构建产物(dist)"]
Nginx --> |/api/*| BE["fms-api Spring Boot(8088)"]
BE --> DB["SQL Server"]
BE --> FS["文件存储<br/>本地/OSS"]
```
图表来源
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [fms-vue/vite.config.js:11-22](file://fms-vue/vite.config.js#L11-L22)
章节来源
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [fms-vue/vite.config.js:11-22](file://fms-vue/vite.config.js#L11-L22)
## 核心组件
- 后端服务:Spring Boot Web MVC + JDBC + Druid连接池 + JWT鉴权 + SQL Server驱动。
- 前端应用:Vue 3 + Vite + Pinia + Axios等。
- 数据存储:SQL Server(多机构properties配置)。
- 文件存储:本地目录或OSS(可通过配置切换)。
章节来源
- [fms-api/pom.xml:32-96](file://fms-api/pom.xml#L32-L96)
- [fms-api/src/main/resources/application.yaml:10-34](file://fms-api/src/main/resources/application.yaml#L10-L34)
- [fms-vue/package.json:21-46](file://fms-vue/package.json#L21-L46)
## 架构总览
生产环境推荐拓扑:
- 入口层:Nginx对外暴露HTTPS,负责静态资源缓存、Gzip/Brotli压缩、限流、WAF(可选)和API路由。
- 应用层:fms-api以无状态方式运行,建议多实例横向扩展,配合会话共享或无状态JWT。
- 数据层:SQL Server主备或集群;文件存储建议使用对象存储(OSS)以提升可扩展性。
```mermaid
sequenceDiagram
participant U as "用户"
participant N as "Nginx"
participant F as "fms-vue 静态资源"
participant B as "fms-api 服务"
participant D as "SQL Server"
U->>N : HTTPS GET /index.html
N-->>U : 返回静态页面
U->>N : HTTPS POST /api/login
N->>B : 转发 /api/*
B->>D : 查询用户信息
D-->>B : 返回结果
B-->>N : JSON响应
N-->>U : 返回登录结果
```
图表来源
- [fms-vue/vite.config.js:15-21](file://fms-vue/vite.config.js#L15-L21)
- [fms-api/src/main/resources/application.yaml:1-4](file://fms-api/src/main/resources/application.yaml#L1-L4)
## 详细组件分析
### 后端构建与运行(Maven + Spring Boot)
- JDK版本:Java 21(由POM属性指定)。
- Maven插件:spring-boot-maven-plugin打包为可执行JAR。
- 启动命令:Windows下start.cmd设置JAVA_HOME与MAVEN_HOME后执行spring-boot:run;生产环境直接java -jar运行。
- 关键依赖:Spring Web MVC、JDBC、Druid连接池、JWT、SQL Server驱动。
章节来源
- [fms-api/pom.xml:29-31](file://fms-api/pom.xml#L29-L31)
- [fms-api/pom.xml:98-105](file://fms-api/pom.xml#L98-L105)
- [fms-api/start.cmd:1-8](file://fms-api/start.cmd#L1-L8)
### 后端配置与环境变量
- 服务端口与上下文:server.port=8088,server.servlet.context-path=/api。
- 应用名:spring.application.name=fms-api。
- 认证:JWT密钥通过环境变量注入(FMS_JWT_SECRET),过期时间默认24小时。
- 数据库:连接池参数(初始大小、最小空闲、最大活跃、等待超时、健康检查等)在application.yaml中定义;多机构数据库连接通过config/dbconfigs/*.properties加载。
- 文件存储:默认local模式,本地目录./data/files,URL前缀/api/file/static;也可切换至OSS。
章节来源
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [fms-api/config/dbconfigs/README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
- [fms-api/config/dbconfigs/G3HD.properties:1-5](file://fms-api/config/dbconfigs/G3HD.properties#L1-L5)
### 前端构建与优化(Vite)
- 脚本命令:dev/build/preview/test/lint/fmt等。
- 开发代理:/api代理到http://127.0.0.1:8088,便于联调。
- 构建产物:vite build输出dist目录,适合Nginx托管。
- 依赖:Vue 3、Pinia、Axios、Vitest等。
章节来源
- [fms-vue/package.json:6-19](file://fms-vue/package.json#L6-L19)
- [fms-vue/vite.config.js:11-22](file://fms-vue/vite.config.js#L11-L22)
- [fms-vue/package.json:21-46](file://fms-vue/package.json#L21-L46)
### Docker容器化部署
- 后端镜像:基于OpenJDK 21基础镜像,复制fms-api打包的JAR,暴露8088端口,设置环境变量(如FMS_JWT_SECRET、数据库连接等)。
- 前端镜像:基于Nginx镜像,复制fms-vue/dist到/usr/share/nginx/html,并通过nginx.conf将/api反向代理到后端服务。
- 编排:使用docker-compose或Kubernetes管理多实例、滚动更新、健康检查、日志收集与监控。
(本节为通用实践说明,不直接引用具体代码文件)
### Nginx反向代理与静态资源托管
- 静态资源:将fms-vue/dist映射到根路径,启用缓存、Gzip/Brotli压缩、HTTP/2。
- API网关:将/api/*转发到后端服务集群(多个upstream节点实现负载均衡)。
- SSL证书:配置HTTPS监听、证书路径、强制HTTPS跳转、安全头(HSTS、CSP等)。
- 安全与限流:结合Nginx模块或外部WAF实现访问控制与速率限制。
(本节为通用实践说明,不直接引用具体代码文件)
### 多环境差异化配置
- 开发环境:
- 前端:vite dev,/api代理到本地8088。
- 后端:start.cmd或mvn spring-boot:run,读取本地dbconfigs与默认application.yaml。
- 测试环境:
- 独立数据库与文件存储路径;JWT密钥与数据库连接通过环境变量注入。
- 生产环境:
- 多实例后端+Nginx负载均衡;文件存储建议切换至OSS;严格的安全策略与监控告警。
章节来源
- [fms-vue/vite.config.js:15-21](file://fms-vue/vite.config.js#L15-L21)
- [fms-api/src/main/resources/application.yaml:10-34](file://fms-api/src/main/resources/application.yaml#L10-L34)
### 负载均衡与高可用
- 后端多实例:同一服务多副本,Nginx upstream轮询或加权策略。
- 会话无状态:使用JWT,避免服务端会话绑定。
- 数据库高可用:SQL Server主备或Always On;连接重试与熔断。
- 文件存储:对象存储(OSS)天然具备高可用与弹性扩容能力。
- 健康检查:Nginx主动探测后端存活,异常节点自动摘除。
(本节为通用实践说明,不直接引用具体代码文件)
## 依赖关系分析
- 后端依赖:Spring Web MVC、JDBC、Druid、JWT、SQL Server驱动。
- 前端依赖:Vue 3、Pinia、Axios、Vite、Vitest等。
- 运行时依赖:JDK 21、Node.js(与Vite兼容的版本)、Nginx(生产静态托管与反向代理)。
```mermaid
graph LR
A["fms-vue(package.json)"] --> V["Vite"]
A --> P["Vue 3"]
A --> X["Axios"]
B["fms-api(pom.xml)"] --> S["Spring Boot Web MVC"]
B --> J["JDBC + Druid"]
B --> W["JWT"]
B --> D["SQL Server Driver"]
```
图表来源
- [fms-vue/package.json:21-46](file://fms-vue/package.json#L21-L46)
- [fms-api/pom.xml:32-96](file://fms-api/pom.xml#L32-L96)
章节来源
- [fms-vue/package.json:21-46](file://fms-vue/package.json#L21-L46)
- [fms-api/pom.xml:32-96](file://fms-api/pom.xml#L32-L96)
## 性能与容量规划
- 服务器硬件(参考值):
- 后端:4核8GB起步,生产建议8核16GB以上;根据并发与SQL复杂度调整。
- 前端/Nginx:2核4GB即可,主要承担静态资源与反向代理。
- 数据库:按业务规模评估CPU/内存/IO,建议专用主机或云数据库。
- 操作系统:Linux发行版(CentOS/RHEL/Ubuntu/Debian)或Windows Server(若沿用Windows部署)。
- 网络与安全:开放443/80端口,关闭不必要端口;启用防火墙与访问白名单。
- 缓存与压缩:Nginx开启Gzip/Brotli、静态资源缓存;后端连接池与SQL优化。
- 监控与日志:集中日志采集(ELK/云日志)、指标监控(Prometheus+Grafana)、链路追踪(可选)。
(本节为通用实践说明,不直接引用具体代码文件)
## 故障排查指南
- 后端无法启动:
- 检查JDK版本是否为21;确认spring-boot-maven-plugin已正确打包。
- 验证application.yaml中的端口、上下文路径与数据库连接是否正确。
- 数据库连接失败:
- 核对config/dbconfigs下的*.properties是否包含正确的url/username/password/driver。
- 注意SQL Server TLS版本与加密选项(legacy环境需特殊JVM参数)。
- 前端代理问题:
- 开发环境确认vite.config.js中/api代理目标地址可达。
- 生产环境确认Nginx对/api的反向代理规则与后端服务端口一致。
- 文件访问异常:
- 本地模式检查./data/files目录权限与磁盘空间。
- OSS模式检查g3oss-url与鉴权配置。
章节来源
- [fms-api/start.cmd:1-8](file://fms-api/start.cmd#L1-L8)
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [fms-api/config/dbconfigs/README.md:18-28](file://fms-api/config/dbconfigs/README.md#L18-L28)
- [fms-vue/vite.config.js:15-21](file://fms-vue/vite.config.js#L15-L21)
## 结论
本方案基于现有后端与前端工程,明确了生产环境的软硬件要求、构建与部署流程、容器化与编排思路、Nginx反向代理与安全配置、多环境差异化管理,以及负载均衡与高可用设计。按此方案实施,可实现稳定、可扩展且易维护的FMS系统生产部署。
## 附录
- 环境变量清单(示例):
- FMS_JWT_SECRET:JWT签名密钥(生产必须替换默认值)。
- 数据库连接:通过config/dbconfigs/*.properties注入(敏感信息不入库)。
- 文件存储:storage-type=local或oss;OSS模式下配置g3oss-url。
- 构建与发布步骤(概览):
- 前端:pnpm install -> pnpm build -> 产出dist。
- 后端:mvn clean package -> 生成可执行JAR。
- 部署:Nginx托管dist,/api反向代理到后端服务;配置HTTPS与缓存策略。
(本节为通用实践说明,不直接引用具体代码文件)
@@ -0,0 +1,381 @@
# 部署运维
<cite>
**本文引用的文件**
- [fms-api/pom.xml](file://fms-api/pom.xml)
- [fms-api/src/main/resources/application.yaml](file://fms-api/src/main/resources/application.yaml)
- [fms-api/start.cmd](file://fms-api/start.cmd)
- [fms-api/config/dbconfigs/README.md](file://fms-api/config/dbconfigs/README.md)
- [fms-api/config/dbconfigs/G3HD.properties](file://fms-api/config/dbconfigs/G3HD.properties)
- [fms-api/config/dbconfigs/G3HY2025.properties](file://fms-api/config/dbconfigs/G3HY2025.properties)
- [fms-vue/package.json](file://fms-vue/package.json)
- [fms-vue/vite.config.js](file://fms-vue/vite.config.js)
- [fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向生产环境的FMS系统,提供端到端的部署与运维指南。内容涵盖:
- Docker容器化部署方案、服务器环境要求与网络配置
- 前后端构建流程与发布策略(静态资源优化、CDN与缓存)
- 监控与日志收集(应用性能监控、错误日志、告警)
- 数据库备份恢复与数据迁移流程
- 日常运维操作(服务启停、配置更新、故障排查)
- 性能调优与安全加固最佳实践
## 项目结构
FMS由前后端两个主要子系统构成:
- 后端:Spring Boot API服务(Java 21),使用Maven构建,默认端口8088,上下文路径/api
- 前端:Vue 3 + Vite应用,开发时通过代理访问后端API,生产构建为静态资源
```mermaid
graph TB
subgraph "前端"
FE["fms-vue<br/>Vite 构建"]
end
subgraph "后端"
BE["fms-api<br/>Spring Boot Web MVC"]
end
DB["SQL Server"]
OSS["对象存储(可选)"]
FE --> |"HTTP /api/*"| BE
BE --> DB
BE --> OSS
```
图表来源
- [fms-vue/vite.config.js:11-21](file://fms-vue/vite.config.js#L11-L21)
- [fms-api/src/main/resources/application.yaml:1-4](file://fms-api/src/main/resources/application.yaml#L1-L4)
章节来源
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [fms-vue/vite.config.js:1-25](file://fms-vue/vite.config.js#L1-L25)
- [fms-vue/package.json:6-19](file://fms-vue/package.json#L6-L19)
- [fms-api/pom.xml:29-96](file://fms-api/pom.xml#L29-L96)
## 核心组件
- 后端服务:基于Spring Boot Web MVC,内置Tomcat,暴露REST接口;使用Druid连接池与SQL Server JDBC驱动;JWT鉴权;支持本地或OSS文件存储
- 前端应用:Vue 3 + Vite,开发模式代理/api到后端;生产模式输出静态资源供Web服务器或CDN托管
- 数据库:SQL Server,按组织隔离的配置文件管理多库连接
- 安全:JWT签名与校验,密钥长度与有效期强制校验
章节来源
- [fms-api/pom.xml:32-96](file://fms-api/pom.xml#L32-L96)
- [fms-api/src/main/resources/application.yaml:10-34](file://fms-api/src/main/resources/application.yaml#L10-L34)
- [fms-api/config/dbconfigs/README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
- [fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java:18-81](file://fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java#L18-L81)
## 架构总览
生产环境推荐拓扑:
- Nginx/反向代理对外暴露HTTPS入口,将静态资源请求指向CDN或本地静态目录,将/api转发至后端
- 后端以Docker容器运行,挂载外部卷用于文件存储与配置
- 数据库独立部署,仅对后端开放端口
```mermaid
graph TB
Client["浏览器/客户端"]
CDN["CDN(可选)"]
Nginx["Nginx/反向代理"]
FEStatic["前端静态资源(dist)"]
BE["fms-api 容器"]
DB["SQL Server"]
OSS["对象存储(可选)"]
Client --> |HTTPS /| Nginx
Nginx --> |静态资源| CDN
Nginx --> |静态资源| FEStatic
Nginx --> |/api/*| BE
BE --> DB
BE --> OSS
```
图表来源
- [fms-vue/vite.config.js:11-21](file://fms-vue/vite.config.js#L11-L21)
- [fms-api/src/main/resources/application.yaml:1-4](file://fms-api/src/main/resources/application.yaml#L1-L4)
- [fms-api/src/main/resources/application.yaml:27-34](file://fms-api/src/main/resources/application.yaml#L27-L34)
## 详细组件分析
### 后端服务(fms-api)
- 技术栈与依赖:Spring Boot Web MVC、JDBC、Druid连接池、SQL Server JDBC驱动、JWT、Jackson、UA解析、IP定位等
- 启动方式:Maven spring-boot:run(开发脚本),生产建议打包为可执行JAR并容器化运行
- 配置要点:
- 服务端口与上下文路径
- JWT密钥与有效期
- 数据库连接池参数
- 文件存储类型(本地/OSS)及路径/URL前缀
```mermaid
classDiagram
class JwtUtils {
+init() void
+generateToken(userId, orgId, sessionId) String
+parseToken(token) TokenClaims
+getOrgId(token) String
}
class AuthProperties {
+jwtSecret String
+jwtExpiration Duration
}
class ApplicationConfig {
+server.port int
+server.servlet.context-path String
+fms.auth.jwt-secret String
+fms.auth.jwt-expiration Duration
+fms.database.pool.* ...
+fms.file.storage-type String
+fms.file.local.storage-dir String
+fms.file.local.url-prefix String
+fms.file.oss.g3oss-url String
}
JwtUtils --> AuthProperties : "读取配置"
ApplicationConfig ..> JwtUtils : "影响鉴权行为"
```
图表来源
- [fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java:18-81](file://fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java#L18-L81)
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
章节来源
- [fms-api/pom.xml:29-96](file://fms-api/pom.xml#L29-L96)
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [fms-api/start.cmd:1-8](file://fms-api/start.cmd#L1-L8)
### 前端应用(fms-vue)
- 构建与预览:vite build生成dist静态资源;vite preview本地预览
- 开发代理:开发时将/api请求代理到后端8088端口
- 发布产物:dist目录包含HTML、JS、CSS等资源,适合放置于Nginx或CDN
```mermaid
flowchart TD
Start(["开始"]) --> Build["执行 vite build"]
Build --> Dist["产出 dist 静态资源"]
Dist --> Deploy["部署至 Nginx/CDN"]
Deploy --> End(["完成"])
```
图表来源
- [fms-vue/package.json:6-19](file://fms-vue/package.json#L6-L19)
- [fms-vue/vite.config.js:11-21](file://fms-vue/vite.config.js#L11-L21)
章节来源
- [fms-vue/package.json:6-19](file://fms-vue/package.json#L6-L19)
- [fms-vue/vite.config.js:1-25](file://fms-vue/vite.config.js#L1-L25)
### 数据库与多租户配置
- 多组织数据库:每个组织一个properties文件,命名规则与示例见文档
- 连接信息:url、username、password、driver
- 开发兼容:旧版SQL Server需TLS兼容参数
```mermaid
flowchart TD
A["选择组织ID"] --> B{"是否存在对应 .properties ?"}
B --> |是| C["加载连接参数"]
B --> |否| D["报错/回退"]
C --> E["建立数据库连接"]
```
图表来源
- [fms-api/config/dbconfigs/README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
- [fms-api/config/dbconfigs/G3HD.properties:1-5](file://fms-api/config/dbconfigs/G3HD.properties#L1-L5)
- [fms-api/config/dbconfigs/G3HY2025.properties:1-5](file://fms-api/config/dbconfigs/G3HY2025.properties#L1-L5)
章节来源
- [fms-api/config/dbconfigs/README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
- [fms-api/config/dbconfigs/G3HD.properties:1-5](file://fms-api/config/dbconfigs/G3HD.properties#L1-L5)
- [fms-api/config/dbconfigs/G3HY2025.properties:1-5](file://fms-api/config/dbconfigs/G3HY2025.properties#L1-L5)
### 登录鉴权流程(JWT)
```mermaid
sequenceDiagram
participant C as "客户端"
participant S as "fms-api"
participant J as "JwtUtils"
C->>S : "POST /api/auth/login (账号/密码)"
S->>S : "验证凭据"
S->>J : "generateToken(userId, orgId, sessionId)"
J-->>S : "返回JWT字符串"
S-->>C : "返回{token}"
C->>S : "后续请求携带 Authorization : Bearer <token>"
S->>J : "parseToken(token)"
J-->>S : "解析出userId/orgId/sessionId"
S-->>C : "业务响应"
```
图表来源
- [fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java:45-66](file://fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java#L45-L66)
- [fms-api/src/main/resources/application.yaml:10-13](file://fms-api/src/main/resources/application.yaml#L10-L13)
章节来源
- [fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java:18-81](file://fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java#L18-L81)
- [fms-api/src/main/resources/application.yaml:10-13](file://fms-api/src/main/resources/application.yaml#L10-L13)
## 依赖关系分析
- 后端依赖:Spring Boot、JDBC、Druid、SQL Server驱动、JWT、Jackson、UA Parser、IP2Region
- 前端依赖:Vue 3、Vue Router、Pinia、Axios、Dayjs、UI组件库等
- 运行时依赖:JDK 21、Node.js(构建期)、Nginx/CDN(生产)
```mermaid
graph LR
FE["fms-vue"] --> |"构建产物"| DIST["dist 静态资源"]
DIST --> |"托管"| WEB["Nginx/CDN"]
WEB --> |"HTTP /api/*"| BE["fms-api"]
BE --> |"JDBC"| DB["SQL Server"]
BE --> |"可选"| OSS["对象存储"]
```
图表来源
- [fms-vue/package.json:21-45](file://fms-vue/package.json#L21-L45)
- [fms-api/pom.xml:32-96](file://fms-api/pom.xml#L32-L96)
章节来源
- [fms-vue/package.json:21-45](file://fms-vue/package.json#L21-L45)
- [fms-api/pom.xml:32-96](file://fms-api/pom.xml#L32-L96)
## 性能考虑
- 连接池调优:根据并发与延迟调整初始大小、最小空闲、最大活跃、等待超时、空闲检测间隔等
- 静态资源优化:启用Gzip/Brotli压缩、长缓存(带版本哈希)、按需懒加载路由与组件
- CDN与缓存:静态资源上CDN,设置合理的Cache-Control与ETag;API层避免过度缓存敏感数据
- 数据库:索引优化、慢查询治理、连接池上限与超时合理配置
- 容器资源:限制CPU/内存,预留堆外内存给JVM与连接池
[本节为通用指导,不直接分析具体文件]
## 故障排查指南
- 启动失败
- 检查JDK版本与环境变量(参考开发启动脚本)
- 确认端口占用与上下文路径
- 鉴权异常
- 校验JWT密钥长度与有效期配置
- 检查令牌是否过期或缺失必要声明
- 数据库连接问题
- 核对组织数据库配置文件格式与连通性
- 关注连接池耗尽与超时
- 文件上传/访问
- 本地存储:确认目录存在且可写,URL前缀正确
- OSS:确认地址与权限
章节来源
- [fms-api/start.cmd:1-8](file://fms-api/start.cmd#L1-L8)
- [fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java:28-42](file://fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java#L28-L42)
- [fms-api/config/dbconfigs/README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
- [fms-api/src/main/resources/application.yaml:27-34](file://fms-api/src/main/resources/application.yaml#L27-L34)
## 结论
FMS采用前后端分离架构,后端以Spring Boot提供服务,前端以Vite构建静态资源。生产部署建议通过反向代理统一入口,结合CDN加速静态资源,数据库独立部署并按组织隔离。配合合理的连接池、缓存与监控策略,可获得稳定高效的运行体验。
[本节为总结性内容,不直接分析具体文件]
## 附录
### 生产部署方案(Docker化)
- 镜像构建
- 后端:基于JDK 21基础镜像,复制打包后的JAR,暴露端口8088
- 前端:基于Nginx镜像,复制dist目录,配置静态资源与反向代理
- 环境变量与配置
- 后端:通过环境变量注入JWT密钥、数据库连接池参数、文件存储配置
- 前端:通过Nginx环境变量或构建时替换API基址
- 数据持久化
- 挂载文件存储目录(本地模式)
- 数据库与对象存储独立部署
- 网络与安全
- 仅开放443端口,内部端口不暴露
- 启用HTTPS,配置强加密套件与HSTS
- 限制跨域与源白名单
[本节为通用指导,不直接分析具体文件]
### 服务器环境要求
- 后端:JDK 21,建议4核8GB起(视并发与负载调整)
- 前端:构建阶段需要Node.js(版本与包管理器依pnpm-lock为准)
- 数据库:SQL Server(版本与TLS策略需与驱动匹配)
- 存储:本地磁盘或对象存储(按配置)
章节来源
- [fms-api/pom.xml:29-31](file://fms-api/pom.xml#L29-L31)
- [fms-api/config/dbconfigs/README.md:18-28](file://fms-api/config/dbconfigs/README.md#L18-L28)
### 前后端构建流程与发布策略
- 前端
- 开发:vite dev,自动代理/api到后端
- 构建:vite build,产出dist
- 发布:将dist部署至Nginx或CDN,配置缓存头与压缩
- 后端
- 构建:mvn package(Spring Boot Maven插件)
- 运行:java -jar 或容器运行
- 配置:application.yaml与组织数据库配置文件
章节来源
- [fms-vue/package.json:6-19](file://fms-vue/package.json#L6-L19)
- [fms-vue/vite.config.js:11-21](file://fms-vue/vite.config.js#L11-L21)
- [fms-api/pom.xml:98-105](file://fms-api/pom.xml#L98-L105)
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
### 静态资源优化、CDN与缓存策略
- 启用Gzip/Brotli压缩
- 为静态资源设置长期缓存(带内容哈希)
- 使用CDN分发静态资源,配置边缘缓存与回源策略
- API响应按需缓存,敏感数据不缓存
[本节为通用指导,不直接分析具体文件]
### 监控与日志收集
- 应用性能监控
- 接入APM(如SkyWalking/Pinpoint)采集JVM指标、接口耗时、错误率
- 日志收集
- 应用日志:统一输出JSON格式,集中收集(ELK/Loki)
- 访问日志:Nginx访问日志结构化,便于审计与分析
- 告警机制
- 基于指标阈值(CPU/内存/错误率/慢查询)配置告警
- 关键链路失败即时通知
[本节为通用指导,不直接分析具体文件]
### 数据库备份恢复与数据迁移
- 备份策略
- 全量+增量备份,异地容灾
- 定期演练恢复流程
- 恢复流程
- 停机窗口评估与回滚预案
- 校验备份完整性后恢复
- 数据迁移
- 使用版本化脚本与工具进行增量迁移
- 迁移前后进行一致性校验与回滚方案
[本节为通用指导,不直接分析具体文件]
### 日常运维操作
- 服务启停
- 后端:systemd或容器编排管理生命周期
- 前端:Nginx重载配置或滚动更新
- 配置更新
- 后端:热更新或灰度发布(注意状态与连接池)
- 前端:静态资源版本升级,CDN刷新
- 故障排查
- 查看应用日志、访问日志、数据库慢查询
- 检查连接池、磁盘空间、证书有效期
[本节为通用指导,不直接分析具体文件]
### 性能调优与安全加固
- 性能调优
- JVM参数优化(堆大小、GC策略)
- 连接池与线程池容量调优
- 静态资源压缩与缓存
- 安全加固
- HTTPS强制与强加密套件
- JWT密钥轮换与最小权限原则
- 输入校验、防注入、限流与防重放
- 敏感配置外置与加密存储
[本节为通用指导,不直接分析具体文件]