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,378 @@
# 前端配置
<cite>
**本文引用的文件**
- [vite.config.js](file://fms-vue/vite.config.js)
- [package.json](file://fms-vue/package.json)
- [vitest.config.js](file://fms-vue/vitest.config.js)
- [index.html](file://fms-vue/index.html)
- [main.js](file://fms-vue/src/main.js)
- [http.js](file://fms-vue/src/services/http.js)
- [tokens.css](file://fms-vue/src/theme/tokens.css)
- [index.js](file://fms-vue/src/theme/index.js)
- [presets.js](file://fms-vue/src/theme/presets.js)
- [app.js](file://fms-vue/src/stores/app.js)
- [index.css](file://fms-vue/src/styles/index.css)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向 FMS 前端(基于 Vite + Vue 3)的配置系统,聚焦以下目标:
- 全面说明 Vite 构建与开发服务器配置:端口、主机、代理、路径别名等。
- 详解主题系统:颜色变量、样式令牌、深浅色切换与主色动态替换机制。
- 环境变量管理策略:开发/测试/生产环境的差异与最佳实践。
- 插件与构建优化选项:当前已启用能力与可扩展点。
- 给出可操作的最佳实践:性能优化、代码分割、资源加载策略。
- 提供常见问题定位与解决方案。
## 项目结构
FMS 前端位于 fms-vue 子工程,关键配置与运行时入口如下:
- 构建与开发服务器:vite.config.js
- 脚本与依赖:package.json
- 测试配置:vitest.config.js
- 应用入口与启动流程:src/main.js、index.html
- HTTP 客户端与环境变量使用:src/services/http.js
- 主题系统与样式:src/theme/*、src/styles/index.css
```mermaid
graph TB
A["index.html<br/>首屏与加载屏"] --> B["src/main.js<br/>应用初始化"]
B --> C["vite.config.js<br/>Vite 构建/开发配置"]
B --> D["src/services/http.js<br/>HTTP 客户端与环境变量"]
B --> E["src/stores/app.js<br/>主题状态与持久化"]
E --> F["src/theme/index.js<br/>写入 CSS 变量/切换深色类"]
F --> G["src/theme/tokens.css<br/>设计令牌与深浅色覆盖"]
E --> H["src/theme/presets.js<br/>预设主色"]
B --> I["src/styles/index.css<br/>引入 tokens 与字体"]
```
图表来源
- [index.html:1-295](file://fms-vue/index.html#L1-L295)
- [main.js:1-78](file://fms-vue/src/main.js#L1-L78)
- [vite.config.js:1-25](file://fms-vue/vite.config.js#L1-L25)
- [http.js:1-111](file://fms-vue/src/services/http.js#L1-L111)
- [app.js:1-123](file://fms-vue/src/stores/app.js#L1-L123)
- [index.js:1-16](file://fms-vue/src/theme/index.js#L1-L16)
- [tokens.css:1-152](file://fms-vue/src/theme/tokens.css#L1-L152)
- [presets.js:1-16](file://fms-vue/src/theme/presets.js#L1-L16)
- [index.css:1-17](file://fms-vue/src/styles/index.css#L1-L17)
章节来源
- [vite.config.js:1-25](file://fms-vue/vite.config.js#L1-L25)
- [package.json:1-48](file://fms-vue/package.json#L1-L48)
- [vitest.config.js:1-34](file://fms-vue/vitest.config.js#L1-L34)
- [index.html:1-295](file://fms-vue/index.html#L1-L295)
- [main.js:1-78](file://fms-vue/src/main.js#L1-L78)
## 核心组件
- Vite 构建与开发服务器
- 路径别名:将 @ 指向 src,便于统一导入。
- 开发服务器:host 为 true,port 固定为 5082,strictPort 确保端口独占;/api 请求代理到后端 http://127.0.0.1:8088。
- 插件:仅启用 @vitejs/plugin-vue。
- 主题系统
- 设计令牌:集中定义在 tokens.css,浅色 :root,深色 .dark 覆盖同一批变量;主色 --fms-primary 由 JS 注入,衍生色通过 color-mix 派生。
- 主题切换:通过 app store 的 darkMode 与 primaryColor 驱动 index.js 中的 applyDarkMode 与 applyPrimaryColor,实时修改 DOM。
- 预设色板:presets.js 提供多套主色,默认主色与 store 初始值一致。
- 环境变量与网络
- 基础 URL:http.js 使用 import.meta.env.VITE_API_BASE_URL,未设置时回退到 /api(开发期走 Vite 代理)。
- 鉴权与错误处理:拦截器统一处理 401/40101 会话失效并跳转登录;网络异常或 5xx 统一提示。
- 应用启动与加载体验
- index.html 内嵌脚本在模块加载前读取本地存储的主题偏好,给 html 添加 boot-dark 类,避免首屏闪烁。
- main.js 在挂载前初始化主题同步,路由就绪后挂载应用,并以过渡动画隐藏加载屏。
章节来源
- [vite.config.js:5-23](file://fms-vue/vite.config.js#L5-L23)
- [tokens.css:7-151](file://fms-vue/src/theme/tokens.css#L7-L151)
- [index.js:5-15](file://fms-vue/src/theme/index.js#L5-L15)
- [presets.js:1-16](file://fms-vue/src/theme/presets.js#L1-L16)
- [app.js:6-123](file://fms-vue/src/stores/app.js#L6-L123)
- [http.js:8-10](file://fms-vue/src/services/http.js#L8-L10)
- [index.html:8-19](file://fms-vue/index.html#L8-L19)
- [main.js:21-58](file://fms-vue/src/main.js#L21-L58)
## 架构总览
下图展示从浏览器加载到主题生效、网络请求代理的关键链路。
```mermaid
sequenceDiagram
participant U as "用户"
participant H as "index.html"
participant M as "main.js"
participant S as "stores/app.js"
participant T as "theme/index.js"
participant C as "theme/tokens.css"
participant V as "vite.config.js"
participant API as "后端服务(8088)"
U->>H : 打开页面
H-->>U : 显示加载屏根据本地存储决定是否加 boot-dark
H->>M : 执行入口脚本
M->>S : initThemeSync(pinia)
S->>T : applyDarkMode(darkMode)
T->>C : 切换 .dark 类
S->>T : applyPrimaryColor(primaryColor)
T->>C : 写入 --fms-primary
U->>M : 触发业务请求
M->>V : 开发期 /api 请求
V-->>API : 代理转发到 http : //127.0.0.1 : 8088
API-->>U : 返回数据
```
图表来源
- [index.html:8-19](file://fms-vue/index.html#L8-L19)
- [main.js:21-58](file://fms-vue/src/main.js#L21-L58)
- [app.js:104-123](file://fms-vue/src/stores/app.js#L104-L123)
- [index.js:5-15](file://fms-vue/src/theme/index.js#L5-L15)
- [tokens.css:7-151](file://fms-vue/src/theme/tokens.css#L7-L151)
- [vite.config.js:11-21](file://fms-vue/vite.config.js#L11-L21)
## 详细组件分析
### Vite 构建与开发服务器配置
- 路径别名
- 将 @ 映射到 src,简化导入路径。
- 开发服务器
- host: true 允许局域网访问;port: 5082;strictPort: true 避免自动换端口。
- 代理:/api -> http://127.0.0.1:8088,changeOrigin 开启以兼容后端跨域校验。
- 插件
- 仅启用 Vue 插件,保持轻量。
```mermaid
flowchart TD
Start(["启动 dev"]) --> Alias["解析路径别名 @ -> src"]
Alias --> Server["启动开发服务器 5082"]
Server --> Proxy{"请求是否匹配 /api ?"}
Proxy --> |是| Forward["转发到 http://127.0.0.1:8088"]
Proxy --> |否| Serve["本地静态资源/模块热更新"]
Forward --> End(["响应"])
Serve --> End
```
图表来源
- [vite.config.js:6-21](file://fms-vue/vite.config.js#L6-L21)
章节来源
- [vite.config.js:1-25](file://fms-vue/vite.config.js#L1-L25)
### 主题配置系统
- 设计令牌
- tokens.css 定义中性色、语义色、控件尺寸、阴影、层级等变量;浅色在 :root,深色通过 .dark 覆盖。
- 主色 --fms-primary 由 JS 注入,hover/active 等衍生色通过 color-mix 计算,保证明暗对比。
- 主题切换机制
- app store 维护 darkMode 与 primaryColor,并通过 watch 调用 theme/index.js 的方法更新 DOM。
- 持久化:pinia-plugin-persistedstate 仅持久化 darkMode、primaryColor、locale。
- 预设色板
- presets.js 提供多套主色,DEFAULT_PRIMARY 作为初始值。
```mermaid
classDiagram
class AppStore {
+boolean darkMode
+string primaryColor
+setDark(value)
+toggleDark()
+setPrimary(color)
}
class ThemeAPI {
+applyDarkMode(isDark)
+applyPrimaryColor(color)
}
class TokensCSS {
+" : root 变量"
+".dark 覆盖变量"
}
class Presets {
+PRESETS[]
+DEFAULT_PRIMARY
}
AppStore --> ThemeAPI : "watch 驱动"
ThemeAPI --> TokensCSS : "写入 CSS 变量/切换类"
AppStore --> Presets : "读取默认主色"
```
图表来源
- [app.js:6-123](file://fms-vue/src/stores/app.js#L6-L123)
- [index.js:5-15](file://fms-vue/src/theme/index.js#L5-L15)
- [tokens.css:7-151](file://fms-vue/src/theme/tokens.css#L7-L151)
- [presets.js:1-16](file://fms-vue/src/theme/presets.js#L1-L16)
章节来源
- [tokens.css:7-151](file://fms-vue/src/theme/tokens.css#L7-L151)
- [index.js:5-15](file://fms-vue/src/theme/index.js#L5-L15)
- [presets.js:1-16](file://fms-vue/src/theme/presets.js#L1-L16)
- [app.js:6-123](file://fms-vue/src/stores/app.js#L6-L123)
### 环境变量管理与网络层
- 环境变量
- 使用 import.meta.env.VITE_API_BASE_URL 指定 API 基础地址;未设置时回退到 /api。
- 开发期通过 Vite 代理将 /api 转发至后端;生产环境建议直接配置真实 API 地址。
- 请求与错误处理
- 请求拦截器注入 Authorization 头;响应拦截器统一封装 ApiResult,处理 401/40101 会话失效并跳转登录。
- 网络异常或 5xx 统一提示,4xx 业务错误交由调用方处理。
```mermaid
sequenceDiagram
participant UI as "业务组件"
participant HTTP as "http.js"
participant AUTH as "auth store"
participant MSG as "Message"
participant BE as "后端"
UI->>HTTP : post(path, data)
HTTP->>AUTH : 读取 token
HTTP->>BE : 发送请求(带 Authorization)
alt 成功
BE-->>HTTP : 返回数据
HTTP-->>UI : 透传结果
else 鉴权失败(401/40101)
BE-->>HTTP : 鉴权错误
HTTP->>AUTH : 清除会话
HTTP-->>UI : 抛出错误
HTTP->>UI : 跳转登录页
else 网络/服务端错误
BE-->>HTTP : 无响应或 5xx
HTTP->>MSG : 统一错误提示
HTTP-->>UI : 抛出错误
end
```
图表来源
- [http.js:8-10](file://fms-vue/src/services/http.js#L8-L10)
- [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)
### 应用启动与加载体验
- 首屏防闪烁
- index.html 在模块加载前读取 localStorage 中 app 的 darkMode,若为真则给 html 添加 boot-dark,使加载屏与最终主题一致。
- 启动流程
- main.js 创建 Pinia 并启用持久化插件,先初始化主题同步,再等待路由就绪后挂载应用,最后以过渡动画隐藏加载屏。
```mermaid
flowchart TD
Boot["index.html 加载"] --> Check["读取本地存储主题偏好"]
Check --> ApplyBoot{"是否需要深色?"}
ApplyBoot --> |是| AddClass["html 添加 boot-dark"]
ApplyBoot --> |否| Skip["保持浅色"]
AddClass --> Main["执行 main.js"]
Skip --> Main
Main --> InitTheme["initThemeSync 恢复主题"]
InitTheme --> Mount["挂载应用"]
Mount --> HideBoot["淡出加载屏"]
```
图表来源
- [index.html:8-19](file://fms-vue/index.html#L8-L19)
- [main.js:14-58](file://fms-vue/src/main.js#L14-L58)
章节来源
- [index.html:8-19](file://fms-vue/index.html#L8-L19)
- [main.js:14-58](file://fms-vue/src/main.js#L14-L58)
### 测试配置
- Vitest 使用 jsdom 环境,全局开关开启,setupFiles 指定初始化脚本。
- 覆盖率统计排除入口与纯常量文件,阈值 60% 起步。
章节来源
- [vitest.config.js:1-34](file://fms-vue/vitest.config.js#L1-L34)
## 依赖关系分析
- 构建与运行
- package.json 定义了 dev/build/preview/test/lint/fmt 等脚本,依赖 vite、@vitejs/plugin-vue、vue 等。
- 运行时依赖
- axios 用于网络请求;pinia 与 pinia-plugin-persistedstate 负责状态与持久化;stk-table-vue 提供表格能力。
- 样式依赖
- styles/index.css 引入 tokens.css、组件库样式与字体。
```mermaid
graph LR
Pkg["package.json<br/>脚本与依赖"] --> Vite["vite.config.js"]
Pkg --> Vue["Vue 3 生态"]
Pkg --> Axios["axios"]
Pkg --> Pinia["pinia + persistedstate"]
Pkg --> Table["stk-table-vue"]
Styles["styles/index.css"] --> Tokens["theme/tokens.css"]
Styles --> Font["@fontsource/noto-sans-sc"]
```
图表来源
- [package.json:1-48](file://fms-vue/package.json#L1-L48)
- [index.css:1-17](file://fms-vue/src/styles/index.css#L1-L17)
章节来源
- [package.json:1-48](file://fms-vue/package.json#L1-L48)
- [index.css:1-17](file://fms-vue/src/styles/index.css#L1-L17)
## 性能考量
- 构建与打包
- 当前未启用额外插件,可通过按需引入、Tree Shaking、分包策略进一步优化。
- 建议:对大体积第三方库进行按需引入或外部化;对路由级视图进行懒加载。
- 开发体验
- 严格端口与固定端口有助于 CI/CD 稳定性;代理配置减少跨域问题。
- 主题渲染
- 使用 CSS 变量与 color-mix 减少重复样式;在首屏前注入主题类避免闪烁。
- 网络
- 合理设置超时与统一错误提示;对鉴权失败做快速重定向,提升用户体验。
[本节为通用指导,不直接分析具体文件]
## 故障排查指南
- 开发服务器端口占用
- 现象:启动时报端口被占用。
- 处理:确认 5082 端口未被占用,或调整 vite.config.js 中的 port。
- 代理无效导致 404
- 现象:请求 /api 返回 404。
- 处理:检查 vite.config.js 的 proxy 配置与后端服务是否启动在 8088。
- 主题闪烁
- 现象:首次加载出现浅色闪屏。
- 处理:确认 index.html 中读取本地存储并添加 boot-dark 的逻辑存在且正确。
- 登录后仍频繁跳转
- 现象:进入页面即跳转登录。
- 处理:检查 http.js 的鉴权拦截逻辑与后端返回码是否为 401/40101。
- 构建产物过大
- 现象:包体积增长明显。
- 处理:评估是否引入了未使用的依赖;考虑拆分与懒加载。
章节来源
- [vite.config.js:11-21](file://fms-vue/vite.config.js#L11-L21)
- [index.html:8-19](file://fms-vue/index.html#L8-L19)
- [http.js:40-104](file://fms-vue/src/services/http.js#L40-L104)
## 结论
本项目的前端配置以简洁、可维护为核心:
- Vite 配置聚焦路径别名、开发服务器与代理,满足日常开发与联调需求。
- 主题系统通过 CSS 变量与 JS 驱动实现灵活切换,支持深浅色与主色定制。
- 环境变量与网络层解耦清晰,便于在不同环境部署。
- 建议在后续迭代中逐步引入按需引入、路由懒加载、更细粒度的构建优化,进一步提升性能与可维护性。
[本节为总结,不直接分析具体文件]
## 附录
- 常用命令
- 开发:pnpm dev
- 构建:pnpm build
- 预览:pnpm preview
- 测试:pnpm test
- 覆盖率:pnpm test:coverage
- 代码检查与格式化:pnpm lint / pnpm fmt
- 环境变量约定
- VITE_API_BASE_URL:API 基础地址(可选),未设置时默认 /api。
- 主题扩展
- 新增预设色:在 presets.js 中添加新条目。
- 新增令牌:在 tokens.css 中补充变量,并在组件中使用对应变量。
章节来源
- [package.json:6-19](file://fms-vue/package.json#L6-L19)
- [http.js:8-10](file://fms-vue/src/services/http.js#L8-L10)
- [presets.js:1-16](file://fms-vue/src/theme/presets.js#L1-L16)
- [tokens.css:7-151](file://fms-vue/src/theme/tokens.css#L7-L151)
@@ -0,0 +1,314 @@
# 后端配置
<cite>
**本文引用的文件**
- [application.yaml](file://fms-api/src/main/resources/application.yaml)
- [AuthProperties.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/config/AuthProperties.java)
- [FileStorageProperties.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/config/FileStorageProperties.java)
- [OrgDatabaseProperties.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java)
- [OrgDataSourceFactory.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java)
- [OrgDataSourceManager.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceManager.java)
- [OrgRoutingDataSource.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgRoutingDataSource.java)
- [OrgDatabaseConfig.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfig.java)
- [README.md](file://fms-api/config/dbconfigs/README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件为 FMS 后端(Spring Boot)配置系统的权威文档,聚焦 application.yaml 的结构与各项参数,覆盖服务器、数据库连接池、多数据源切换、文件存储、安全设置等。同时说明第三方服务集成点、配置验证与默认值管理、以及可热更新的边界与机制。目标是帮助开发者快速理解并正确配置系统,保障生产环境的稳定性与可运维性。
## 项目结构
FMS 后端采用 Spring Boot 工程组织,应用级配置集中在 resources/application.yaml;业务相关配置通过 @ConfigurationProperties 映射到 Java 类;多机构数据库配置以外部 properties 文件形式存放于 config/dbconfigs 目录,按机构 ID 命名加载。
```mermaid
graph TB
A["application.yaml"] --> B["AuthProperties<br/>认证配置绑定"]
A --> C["FileStorageProperties<br/>文件存储配置绑定"]
A --> D["OrgDatabaseProperties<br/>数据库与连接池配置绑定"]
D --> E["OrgDataSourceFactory<br/>创建Druid连接池"]
E --> F["OrgDataSourceManager<br/>按机构ID缓存与管理DS"]
F --> G["OrgRoutingDataSource<br/>基于上下文路由到具体DS"]
H["config/dbconfigs/*.properties<br/>各机构DB连接信息"] --> E
```
图表来源
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [AuthProperties.java:1-29](file://fms-api/src/main/java/cn/g3soft/fmsapi/config/AuthProperties.java#L1-L29)
- [FileStorageProperties.java:1-69](file://fms-api/src/main/java/cn/g3soft/fmsapi/config/FileStorageProperties.java#L1-L69)
- [OrgDatabaseProperties.java:1-120](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java#L1-L120)
- [OrgDataSourceFactory.java:1-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L1-L53)
- [OrgDataSourceManager.java:1-62](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceManager.java#L1-L62)
- [OrgRoutingDataSource.java:1-29](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgRoutingDataSource.java#L1-L29)
- [README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
章节来源
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
## 核心组件
- 服务器与应用基础配置:端口、上下文路径、应用名。
- 认证配置:JWT 密钥与过期时间,支持环境变量注入与默认值。
- 文件存储配置:本地存储与云存储(OSS)两种模式,支持 URL 前缀与存储根目录。
- 多数据源配置:按机构维度加载外部 properties 文件,使用 Druid 连接池,并通过路由数据源在运行时根据上下文选择目标库。
- 连接池与性能调优:初始大小、空闲最小数、最大活跃、等待超时、校验查询、空闲检测、驱逐策略、NAT/防火墙保活等。
章节来源
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [AuthProperties.java:1-29](file://fms-api/src/main/java/cn/g3soft/fmsapi/config/AuthProperties.java#L1-L29)
- [FileStorageProperties.java:1-69](file://fms-api/src/main/java/cn/g3soft/fmsapi/config/FileStorageProperties.java#L1-L69)
- [OrgDatabaseProperties.java:1-120](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java#L1-L120)
- [OrgDataSourceFactory.java:1-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L1-L53)
## 架构总览
下图展示了配置加载与数据源路由的整体流程:应用启动时读取 application.yaml,绑定到对应 Properties 对象;请求进入后,通过 OrgContext 确定当前机构 ID,由 OrgRoutingDataSource 委托给 OrgDataSourceManager,后者从缓存或按需创建 Druid 数据源,最终返回连接。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant App as "Spring MVC"
participant Router as "OrgRoutingDataSource"
participant Manager as "OrgDataSourceManager"
participant Factory as "OrgDataSourceFactory"
participant DS as "DruidDataSource"
participant DB as "数据库"
Client->>App : HTTP 请求
App->>Router : getConnection()
Router->>Manager : getConnection(orgId from context)
alt 首次访问该机构
Manager->>Factory : create(orgId, config)
Factory->>DS : 初始化连接池(属性+保活)
DS-->>Manager : 已就绪
end
Manager-->>Router : Connection
Router-->>App : Connection
App->>DB : 执行SQL
DB-->>App : 结果
App-->>Client : 响应
```
图表来源
- [OrgRoutingDataSource.java:1-29](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgRoutingDataSource.java#L1-L29)
- [OrgDataSourceManager.java:1-62](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceManager.java#L1-L62)
- [OrgDataSourceFactory.java:1-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L1-L53)
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
## 详细组件分析
### 服务器与应用配置
- 端口与上下文路径:用于暴露 API 的监听端口与统一前缀。
- 应用名称:便于日志与监控标识。
章节来源
- [application.yaml:1-8](file://fms-api/src/main/resources/application.yaml#L1-L8)
### 认证配置(JWT)
- 密钥与过期时间:通过 fms.auth.* 绑定到 AuthProperties,支持环境变量覆盖与默认值。
- 建议:生产环境务必通过环境变量注入强随机密钥,避免硬编码。
章节来源
- [application.yaml:10-13](file://fms-api/src/main/resources/application.yaml#L10-L13)
- [AuthProperties.java:1-29](file://fms-api/src/main/java/cn/g3soft/fmsapi/config/AuthProperties.java#L1-L29)
### 文件存储服务配置
- 存储类型:local 或 oss,通过 fms.file.storage-type 控制。
- 本地存储:存储根目录与静态资源 URL 前缀,便于直接挂载或反向代理。
- 云存储(OSS):提供 OSS 端点地址,便于后续扩展上传/下载能力。
章节来源
- [application.yaml:27-34](file://fms-api/src/main/resources/application.yaml#L27-L34)
- [FileStorageProperties.java:1-69](file://fms-api/src/main/java/cn/g3soft/fmsapi/config/FileStorageProperties.java#L1-L69)
### 多数据源配置与切换机制
- 配置来源:每个机构一个 {ORG_ID}.properties 文件,包含 url、username、password、driver。
- 配置加载:OrgDatabaseConfigLoader 负责读取与规范化机构 ID。
- 数据源工厂:OrgDataSourceFactory 将配置转换为 DruidDataSource,并应用全局连接池参数。
- 数据源管理:OrgDataSourceManager 维护 orgId -> DataSource 的并发缓存,懒加载与优雅关闭。
- 路由数据源:OrgRoutingDataSource 作为 Primary 数据源,依据当前线程上下文中的机构 ID 动态选择连接。
```mermaid
classDiagram
class OrgDatabaseProperties {
+Path configDir
+Pool pool
}
class Pool {
+int initialSize
+int minIdle
+int maxActive
+long maxWait
+String validationQuery
+boolean testWhileIdle
+boolean testOnBorrow
+boolean testOnReturn
+Duration timeBetweenEvictionRuns
+Duration minEvictableIdleTime
}
class OrgDatabaseConfig {
+String url
+String username
+String password
+String driver
}
class OrgDataSourceFactory {
+create(orgId, config) DruidDataSource
}
class OrgDataSourceManager {
-ConcurrentMap dataSources
+getDataSource(orgId)
+getConnection(orgId)
+closeAll()
}
class OrgRoutingDataSource {
+getConnection()
+getConnection(username,password)
}
OrgDatabaseProperties --> Pool
OrgDataSourceFactory --> OrgDatabaseProperties : "读取池参数"
OrgDataSourceFactory --> OrgDatabaseConfig : "读取连接信息"
OrgDataSourceManager --> OrgDataSourceFactory : "创建DS"
OrgRoutingDataSource --> OrgDataSourceManager : "委托获取连接"
```
图表来源
- [OrgDatabaseProperties.java:1-120](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java#L1-L120)
- [OrgDatabaseConfig.java:1-10](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfig.java#L1-L10)
- [OrgDataSourceFactory.java:1-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L1-L53)
- [OrgDataSourceManager.java:1-62](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceManager.java#L1-L62)
- [OrgRoutingDataSource.java:1-29](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgRoutingDataSource.java#L1-L29)
章节来源
- [application.yaml:14-26](file://fms-api/src/main/resources/application.yaml#L14-L26)
- [OrgDatabaseProperties.java:1-120](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java#L1-L120)
- [OrgDataSourceFactory.java:1-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L1-L53)
- [OrgDataSourceManager.java:1-62](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceManager.java#L1-L62)
- [OrgRoutingDataSource.java:1-29](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgRoutingDataSource.java#L1-L29)
- [README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
### 数据库连接池配置与性能调优
- 关键参数
- 初始大小/最小空闲/最大活跃:控制预热与容量上限。
- 最大等待时间:防止请求堆积导致雪崩。
- 校验查询:确保取出的连接有效。
- 空闲检测与驱逐:定期清理僵尸连接,降低内存占用。
- 保活:对抗云环境 NAT/防火墙回收空闲 TCP 会话。
- 推荐实践
- 开发环境:initial-size=0,按需增长。
- 生产环境:适当提高 min-idle 与 max-active,结合压测确定阈值。
- 高延迟网络:开启 keepAlive 与合理的 timeBetweenEvictionRuns。
章节来源
- [application.yaml:16-26](file://fms-api/src/main/resources/application.yaml#L16-L26)
- [OrgDatabaseProperties.java:26-118](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java#L26-L118)
- [OrgDataSourceFactory.java:15-42](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L15-L42)
### 文件存储切换与静态资源访问
- 切换方式:修改 fms.file.storage-type 为 local 或 oss。
- 本地模式:配置 storage-dir 与 url-prefix,配合 Web 静态资源映射即可访问。
- 云存储模式:配置 g3oss-url,后续可在文件服务中对接上传/下载逻辑。
章节来源
- [application.yaml:27-34](file://fms-api/src/main/resources/application.yaml#L27-L34)
- [FileStorageProperties.java:1-69](file://fms-api/src/main/java/cn/g3soft/fmsapi/config/FileStorageProperties.java#L1-L69)
### 第三方服务集成配置
- 邮件服务:当前仓库未包含邮件相关配置项,可按需新增 fms.mail.* 并在 Properties 中绑定。
- 消息队列:当前仓库未包含 MQ 相关配置项,可按需新增 fms.mq.* 并在 Properties 中绑定。
- 建议:所有外部服务配置均通过环境变量注入,避免敏感信息入库。
[本节为通用指导,不直接分析具体文件]
### 配置验证、默认值管理与热更新
- 配置验证
- 通过 @ConfigurationProperties 自动绑定,建议在启动阶段对必填字段进行校验(例如 JWT 密钥非空)。
- 数据库驱动与连接串格式应在加载时校验,失败时尽早抛出异常。
- 默认值管理
- 认证过期时间、连接池默认值已在 Properties 中定义,便于开箱即用。
- 可通过 application.yaml 或环境变量覆盖默认值。
- 热更新
- 当前实现为启动时加载并缓存数据源,不支持运行时动态切换数据源或热重载配置文件。
- 若需热更新,可在 Properties 上引入配置刷新机制,并在变更时重建或替换对应数据源。
章节来源
- [application.yaml:10-34](file://fms-api/src/main/resources/application.yaml#L10-L34)
- [AuthProperties.java:1-29](file://fms-api/src/main/java/cn/g3soft/fmsapi/config/AuthProperties.java#L1-L29)
- [OrgDatabaseProperties.java:1-120](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java#L1-L120)
- [OrgDataSourceManager.java:13-62](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceManager.java#L13-L62)
## 依赖关系分析
- 配置绑定:application.yaml → @ConfigurationProperties 类。
- 数据源生命周期:Factory 创建 → Manager 缓存 → Routing 路由。
- 外部依赖:Druid 连接池、SQL Server JDBC(示例驱动),外部 properties 文件。
```mermaid
graph LR
YML["application.yaml"] --> AP["AuthProperties"]
YML --> FP["FileStorageProperties"]
YML --> DP["OrgDatabaseProperties"]
DP --> DF["OrgDataSourceFactory"]
DF --> DM["OrgDataSourceManager"]
DM --> RD["OrgRoutingDataSource"]
CFG["dbconfigs/*.properties"] --> DF
```
图表来源
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [OrgDatabaseProperties.java:1-120](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java#L1-L120)
- [OrgDataSourceFactory.java:1-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L1-L53)
- [OrgDataSourceManager.java:1-62](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceManager.java#L1-L62)
- [OrgRoutingDataSource.java:1-29](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgRoutingDataSource.java#L1-L29)
- [README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
章节来源
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [OrgDataSourceManager.java:1-62](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceManager.java#L1-L62)
## 性能考虑
- 连接池规模:根据并发与平均响应时间估算 max-active,避免过大导致数据库压力。
- 空闲检测:在高延迟或云环境中,保持合理的 timeBetweenEvictionRuns 与 keepAlive。
- 等待超时:合理设置 max-wait,避免长事务拖垮连接池。
- 预热策略:生产环境可适当提升 initial-size/min-idle,减少冷启动抖动。
- 文件存储:本地模式注意磁盘 I/O 与空间配额;云存储关注带宽与限流。
[本节为通用指导,不直接分析具体文件]
## 故障排查指南
- 无法连接数据库
- 检查 dbconfigs/{ORG_ID}.properties 是否存在且内容正确。
- 确认驱动类名与 JDBC URL 匹配数据库类型。
- 查看连接池错误重试与保活配置是否生效。
- 连接泄漏或耗尽
- 检查业务代码是否正确释放连接。
- 调整 max-wait 与 max-active,观察慢查询与锁竞争。
- 静态文件无法访问
- 核对 fms.file.local.url-prefix 与部署时的静态资源映射。
- 认证失败
- 确认环境变量 FMS_JWT_SECRET 已正确注入。
- 检查 jwt-expiration 是否符合预期。
章节来源
- [application.yaml:10-34](file://fms-api/src/main/resources/application.yaml#L10-L34)
- [OrgDataSourceFactory.java:15-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L15-L53)
- [README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
## 结论
本配置体系通过 application.yaml 与 @ConfigurationProperties 完成集中式配置管理,结合外部 properties 文件实现多机构数据源隔离与按需加载。连接池参数可调、具备保活机制,适合云原生与混合部署场景。文件存储支持本地与云存储双模式,便于演进。建议在生产环境严格使用环境变量注入敏感配置,并结合压测优化连接池与超时参数。
[本节为总结,不直接分析具体文件]
## 附录
- 多机构数据库配置示例位置与规范:参见 dbconfigs 目录下的 README。
- 如需扩展第三方服务(邮件、MQ),建议新增独立配置段与 Properties 类,遵循环境变量优先原则。
章节来源
- [README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
@@ -0,0 +1,318 @@
# 环境管理
<cite>
**本文引用的文件**
- [application.yaml](file://fms-api/src/main/resources/application.yaml)
- [README.md](file://fms-api/config/dbconfigs/README.md)
- [G3HD.properties](file://fms-api/config/dbconfigs/G3HD.properties)
- [G3HY2025.properties](file://fms-api/config/dbconfigs/G3HY2025.properties)
- [OrgDataSourceFactory.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java)
- [OrgDatabaseConfigLoader.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java)
- [OrgRoutingDataSource.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgRoutingDataSource.java)
- [OrgContext.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgContext.java)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向FMS环境管理系统,聚焦多环境配置管理策略与数据库动态切换机制。内容涵盖开发、测试、预发布、生产环境的差异化管理方式;环境变量在不同环境中的定义与使用;按机构动态加载数据库连接;敏感信息的安全管理(密钥、密码、访问控制);环境切换的最佳实践(配置校验、回滚策略、部署自动化);以及环境特定的调试工具与监控配置建议。
## 项目结构
后端服务基于Spring Boot,应用级配置集中在application.yaml中,包含服务器端口、上下文路径、JWT密钥来源、数据库连接池参数、文件存储类型等。数据库连接采用“按机构”的独立配置文件模式,位于config/dbconfigs目录下,每个机构一个properties文件,运行时由配置加载器读取并创建数据源。
```mermaid
graph TB
A["应用配置<br/>application.yaml"] --> B["数据库连接池参数<br/>pool.*"]
A --> C["JWT密钥来源<br/>环境变量注入"]
A --> D["文件存储配置<br/>storage-type/local/oss"]
E["机构数据库配置目录<br/>config/dbconfigs/*.properties"] --> F["配置加载器<br/>OrgDatabaseConfigLoader"]
F --> G["数据源工厂<br/>OrgDataSourceFactory"]
G --> H["路由数据源<br/>OrgRoutingDataSource"]
H --> I["业务代码通过JDBC访问"]
```
图表来源
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [OrgDatabaseConfigLoader.java:31-65](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L31-L65)
- [OrgDataSourceFactory.java:15-50](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L15-L50)
- [OrgRoutingDataSource.java:11-27](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgRoutingDataSource.java#L11-L27)
章节来源
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
## 核心组件
- 应用配置中心:application.yaml集中声明服务端口、上下文路径、JWT密钥来源、数据库连接池参数、文件存储策略等。
- 机构数据库配置加载器:从指定目录读取{ORG_ID}.properties,校验并解析为连接信息。
- 数据源工厂:根据配置创建Druid连接池,设置连接池参数与健康检查策略。
- 路由数据源:将当前线程的机构上下文映射到对应数据源,实现多租户隔离。
- 上下文管理:ThreadLocal维护当前请求的机构ID与用户ID,确保数据源路由正确。
章节来源
- [application.yaml:10-34](file://fms-api/src/main/resources/application.yaml#L10-L34)
- [OrgDatabaseConfigLoader.java:19-104](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L19-L104)
- [OrgDataSourceFactory.java:9-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L9-L53)
- [OrgRoutingDataSource.java:11-27](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgRoutingDataSource.java#L11-L27)
- [OrgContext.java:3-55](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgContext.java#L3-L55)
## 架构总览
下图展示了从应用启动到按机构路由访问数据库的整体流程,包括配置加载、数据源创建与选择。
```mermaid
sequenceDiagram
participant App as "应用"
participant Loader as "配置加载器"
participant Factory as "数据源工厂"
participant Router as "路由数据源"
participant DB as "SQL Server"
App->>Loader : 初始化并扫描配置目录
Loader-->>App : 提供按机构加载能力
App->>Router : 发起数据库操作
Router->>Router : 读取当前机构上下文
Router->>Factory : 获取或创建机构数据源
Factory-->>Router : DruidDataSource实例
Router->>DB : 建立连接并执行SQL
DB-->>Router : 返回结果
Router-->>App : 返回查询结果
```
图表来源
- [OrgDatabaseConfigLoader.java:31-65](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L31-L65)
- [OrgDataSourceFactory.java:15-50](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L15-L50)
- [OrgRoutingDataSource.java:18-27](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgRoutingDataSource.java#L18-L27)
- [application.yaml:10-34](file://fms-api/src/main/resources/application.yaml#L10-L34)
## 详细组件分析
### 多环境配置管理策略
- 统一入口:application.yaml作为应用级配置入口,定义服务端口、上下文路径、JWT密钥来源、数据库连接池参数、文件存储策略等。
- 环境变量注入:JWT密钥通过环境变量注入,便于不同环境差异化配置且避免硬编码。
- 外部化数据库配置:机构数据库连接以独立properties文件存放于config/dbconfigs目录,支持按机构隔离,便于在测试、预发布、生产环境中分别准备不同的机构配置集。
- 环境差异点示例:
- 开发环境:本地或内网SQL Server地址、宽松的连接池参数、开启更多日志。
- 测试环境:共享测试库、中等连接池规模、启用基础健康检查。
- 预发布环境:接近生产的网络拓扑、严格连接池与超时参数、开启审计与告警。
- 生产环境:高可用数据库集群、严格的连接池上限与等待时间、强安全策略与最小权限账号。
章节来源
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
### 环境变量在不同环境中的定义与使用
- JWT密钥:通过环境变量注入,避免将敏感信息写入代码或仓库。
- 使用方式:在application.yaml中以占位符形式引用环境变量,运行期由容器或平台注入实际值。
- 最佳实践:
- 为每个环境维护独立的密钥与凭据,禁止跨环境复用。
- 使用平台提供的密钥管理服务(如Kubernetes Secrets、云平台KMS)进行注入与轮换。
- 对关键变量增加格式校验与默认值保护,防止启动失败。
章节来源
- [application.yaml:10-13](file://fms-api/src/main/resources/application.yaml#L10-L13)
### 数据库配置的动态切换机制(按机构)
- 配置目录与命名规范:config/dbconfigs下每个机构一个{ORG_ID}.properties文件,组织ID规范化为大写字母、数字、下划线和连字符。
- 加载与校验:
- 加载器读取指定目录下的properties文件,校验URL必须为SQL Server驱动。
- 必填字段包括url、username、password;driver可选,未提供时使用默认SQL Server驱动。
- 对orgId进行规范化与格式校验,防止路径穿越与非法输入。
- 数据源创建:
- 工厂类根据配置创建DruidDataSource,设置连接池大小、等待时间、空闲检测、保活策略等。
- 针对云NAT/防火墙回收空闲TCP会话,启用定期ping以保持连接活跃。
- 路由选择:
- 路由数据源根据当前线程的机构上下文选择对应数据源,实现多租户隔离。
- 若未设置机构上下文,将抛出异常提示。
```mermaid
flowchart TD
Start(["开始"]) --> Normalize["规范化机构ID"]
Normalize --> CheckPath{"路径合法?"}
CheckPath -- 否 --> ErrPath["抛出路径不合法错误"]
CheckPath -- 是 --> LoadProps["读取*.properties"]
LoadProps --> ValidateUrl{"URL为SQL Server?"}
ValidateUrl -- 否 --> ErrDriver["抛出非SQL Server错误"]
ValidateUrl -- 是 --> CreateDS["创建Druid连接池"]
CreateDS --> Route["根据上下文路由到数据源"]
Route --> End(["结束"])
ErrPath --> End
ErrDriver --> End
```
图表来源
- [OrgDatabaseConfigLoader.java:36-65](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L36-L65)
- [OrgDatabaseConfigLoader.java:67-77](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L67-L77)
- [OrgDataSourceFactory.java:15-50](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L15-L50)
- [OrgRoutingDataSource.java:18-27](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgRoutingDataSource.java#L18-L27)
章节来源
- [README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
- [G3HD.properties:1-5](file://fms-api/config/dbconfigs/G3HD.properties#L1-L5)
- [G3HY2025.properties:1-5](file://fms-api/config/dbconfigs/G3HY2025.properties#L1-L5)
- [OrgDatabaseConfigLoader.java:19-104](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L19-L104)
- [OrgDataSourceFactory.java:9-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L9-L53)
- [OrgRoutingDataSource.java:11-27](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgRoutingDataSource.java#L11-L27)
### 敏感信息的安全管理
- 密钥管理:
- JWT密钥通过环境变量注入,避免明文存储在代码或配置文件中。
- 建议在CI/CD中使用平台密钥管理服务注入,并在各环境独立管理。
- 密码加密与存储:
- 机构数据库密码以明文存在于properties文件中,属于高风险项。建议后续引入加密存储(如KMS托管密钥、环境变量或配置中心加密)。
- 在开发环境可保留明文以便快速验证,但在测试、预发布、生产环境应强制加密与最小权限账号。
- 访问控制:
- 限制config/dbconfigs目录的访问权限,仅允许运行账户读取。
- 对数据库账号实施最小权限原则,仅授予必要表与视图的读写权限。
- 对API层增加鉴权与审计,记录机构上下文与用户上下文变更。
章节来源
- [application.yaml:10-13](file://fms-api/src/main/resources/application.yaml#L10-L13)
- [README.md:16-17](file://fms-api/config/dbconfigs/README.md#L16-L17)
- [G3HD.properties:1-5](file://fms-api/config/dbconfigs/G3HD.properties#L1-L5)
- [G3HY2025.properties:1-5](file://fms-api/config/dbconfigs/G3HY2025.properties#L1-L5)
### 环境切换的最佳实践
- 配置验证:
- 启动时校验JWT密钥是否已注入,缺失则拒绝启动。
- 校验机构配置文件的URL、用户名、密码等必填字段,缺失则抛出明确错误。
- 对orgId进行规范化与正则校验,防止路径穿越与非法输入。
- 回滚策略:
- 每次发布前备份当前环境的application.yaml与机构配置集。
- 支持热切换:通过替换config/dbconfigs下的properties文件并重启服务完成回滚。
- 对数据库迁移脚本进行幂等设计,支持重复执行与回滚脚本。
- 部署自动化:
- CI/CD流水线中注入环境变量与密钥,生成最终配置后部署。
- 使用容器镜像固化应用代码,外部化所有敏感配置。
- 部署后自动执行健康检查与连通性测试(数据库、对象存储等)。
章节来源
- [application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [OrgDatabaseConfigLoader.java:36-65](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L36-L65)
- [README.md:16-28](file://fms-api/config/dbconfigs/README.md#L16-L28)
### 环境特定的调试工具与监控配置
- 开发环境:
- 使用legacy TLS兼容参数启动,以连接仅支持TLS 1.0的旧版SQL Server。
- 开启更详细的日志与慢查询日志,便于定位问题。
- 测试与预发布环境:
- 启用连接池监控指标(Druid内置监控),关注连接数、等待时间与错误率。
- 对关键接口增加调用链追踪与审计日志。
- 生产环境:
- 关闭调试开关,仅保留必要日志级别。
- 接入APM与告警系统,对数据库连接池、错误率、响应时间进行监控与告警。
- 定期演练回滚与故障恢复流程。
章节来源
- [README.md:18-28](file://fms-api/config/dbconfigs/README.md#L18-L28)
- [application.yaml:10-34](file://fms-api/src/main/resources/application.yaml#L10-L34)
## 依赖关系分析
- 组件耦合:
- OrgRoutingDataSource依赖OrgDataSourceManager(由框架装配)与OrgContext,负责按上下文路由。
- OrgDataSourceFactory依赖OrgDatabaseProperties,负责创建Druid连接池。
- OrgDatabaseConfigLoader依赖文件系统与正则校验,负责加载与验证机构配置。
- 外部依赖:
- Spring Boot与Druid连接池。
- SQL Server JDBC驱动。
- 潜在风险:
- 若未设置机构上下文,路由将抛出异常,需确保网关或拦截器正确设置上下文。
- 若properties文件缺失或格式错误,将导致认证或初始化失败。
```mermaid
classDiagram
class OrgContext {
+setOrgId(orgId)
+getOrgId() String
+requireOrgId() String
+setUserId(userId)
+getUserId() String
+requireUserId() String
+clear()
}
class OrgDatabaseConfigLoader {
+init()
+load(orgId) OrgDatabaseConfig
+normalizeOrgId(orgId) String
+getConfigDir() Path
}
class OrgDataSourceFactory {
+create(orgId, config) DruidDataSource
}
class OrgRoutingDataSource {
+getConnection() Connection
+getConnection(username, password) Connection
}
OrgRoutingDataSource --> OrgDataSourceFactory : "获取数据源"
OrgRoutingDataSource --> OrgContext : "读取上下文"
OrgDataSourceFactory --> OrgDatabaseConfigLoader : "使用配置"
```
图表来源
- [OrgContext.java:3-55](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgContext.java#L3-L55)
- [OrgDatabaseConfigLoader.java:19-104](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L19-L104)
- [OrgDataSourceFactory.java:9-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L9-L53)
- [OrgRoutingDataSource.java:11-27](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgRoutingDataSource.java#L11-L27)
章节来源
- [OrgContext.java:3-55](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgContext.java#L3-L55)
- [OrgDatabaseConfigLoader.java:19-104](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L19-L104)
- [OrgDataSourceFactory.java:9-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L9-L53)
- [OrgRoutingDataSource.java:11-27](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgRoutingDataSource.java#L11-L27)
## 性能考虑
- 连接池调优:
- initial-size、min-idle、max-active、max-wait等参数应根据负载与环境调整。
- 启用test-while-idle与keepAlive,对抗云NAT/防火墙回收空闲连接。
- 连接健康检查:
- validation-query用于连接可用性检测,确保获取到的连接有效。
- time-between-eviction-runs与min-evictable-idle-time控制空闲连接回收周期。
- 资源隔离:
- 按机构独立数据源,避免跨租户资源争用。
- 对高频接口使用连接池预热与批量操作减少连接开销。
章节来源
- [application.yaml:14-26](file://fms-api/src/main/resources/application.yaml#L14-L26)
- [OrgDataSourceFactory.java:15-50](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDataSourceFactory.java#L15-L50)
## 故障排查指南
- 常见错误与处理:
- 机构码为空或格式不正确:检查传入orgId并进行规范化与正则校验。
- 配置文件缺失或路径不合法:确认config/dbconfigs目录下存在对应{ORG_ID}.properties,且路径未被篡改。
- URL非SQL Server:确保url以jdbc:sqlserver:开头。
- 缺少必填字段:检查url、username、password是否存在且非空。
- 未设置机构上下文:确保在请求处理前设置OrgContext.orgId。
- 诊断步骤:
- 查看应用日志中的异常堆栈,定位具体失败阶段。
- 验证环境变量是否正确注入(如JWT密钥)。
- 检查数据库连通性与账号权限。
- 对连接池指标进行监控,关注连接泄漏与等待时间。
章节来源
- [OrgDatabaseConfigLoader.java:36-65](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L36-L65)
- [OrgDatabaseConfigLoader.java:67-77](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L67-L77)
- [OrgContext.java:13-30](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgContext.java#L13-L30)
- [application.yaml:10-13](file://fms-api/src/main/resources/application.yaml#L10-L13)
## 结论
FMS环境管理系统通过application.yaml集中管理与外部化配置,结合按机构的独立数据库配置文件,实现了灵活的多环境支持与多租户隔离。通过环境变量注入敏感信息、严格的配置校验与连接池调优,提升了安全性与稳定性。建议在生产环境中进一步强化密钥加密、访问控制与监控告警,并完善回滚与自动化部署流程,以确保高可用与可运维性。
## 附录
- 环境清单与差异对照(示例):
- 开发:本地SQL Server、宽松连接池、详细日志。
- 测试:共享测试库、中等连接池、基础监控。
- 预发布:接近生产拓扑、严格参数、审计与告警。
- 生产:高可用数据库、严格安全策略、全面监控与演练。
- 部署检查清单:
- 环境变量注入验证(JWT密钥等)。
- 机构配置文件完整性与权限校验。
- 数据库连通性与权限测试。
- 连接池指标与错误率基线确认。
- 回滚脚本与应急预案就绪。
@@ -0,0 +1,360 @@
# 配置管理
<cite>
**本文引用的文件**
- [fms-vue/vite.config.js](file://fms-vue/vite.config.js)
- [fms-vue/package.json](file://fms-vue/package.json)
- [fms-vue/src/theme/index.js](file://fms-vue/src/theme/index.js)
- [fms-vue/src/theme/presets.js](file://fms-vue/src/theme/presets.js)
- [fms-vue/src/theme/tokens.css](file://fms-vue/src/theme/tokens.css)
- [fms-api/src/main/resources/application.yaml](file://fms-api/src/main/resources/application.yaml)
- [fms-api/config/dbconfigs/README.md](file://fms-api/config/dbconfigs/README.md)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfig.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfig.java)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向FMS配置管理系统,系统性说明前后端配置体系与最佳实践。内容覆盖:
- 前端Vite构建配置、环境变量管理、主题配置(主色、深浅色模式)
- 后端应用配置(application.yaml)、多租户数据库连接配置、文件存储配置
- 多环境配置策略(开发、测试、生产)
- 运行时配置热更新机制与配置校验规则
- 安全建议(敏感信息加密、配置审计)
## 项目结构
本项目采用前后端分离的多模块结构:
- fms-vue:前端工程,基于Vite + Vue,提供主题系统与UI设计令牌
- fms-api:后端Spring Boot服务,提供API与多租户数据库、文件存储等能力
- 共享配置与迁移脚本位于fms-api/config下
```mermaid
graph TB
subgraph "前端 fms-vue"
VCFG["vite.config.js"]
THEMEJS["theme/index.js"]
PRESETS["theme/presets.js"]
TOKENSCSS["theme/tokens.css"]
PKG["package.json"]
end
subgraph "后端 fms-api"
APPYAML["application.yaml"]
DBPROPS["OrgDatabaseProperties.java"]
DBLOADER["OrgDatabaseConfigLoader.java"]
DBCONFIG["OrgDatabaseConfig.java"]
DBREADME["config/dbconfigs/README.md"]
end
VCFG --> PKG
THEMEJS --> PRESETS
THEMEJS --> TOKENSCSS
APPYAML --> DBPROPS
DBPROPS --> DBLOADER
DBLOADER --> DBCONFIG
DBREADME -.-> DBLOADER
```
图表来源
- [fms-vue/vite.config.js:1-25](file://fms-vue/vite.config.js#L1-L25)
- [fms-vue/src/theme/index.js:1-16](file://fms-vue/src/theme/index.js#L1-L16)
- [fms-vue/src/theme/presets.js:1-16](file://fms-vue/src/theme/presets.js#L1-L16)
- [fms-vue/src/theme/tokens.css:1-152](file://fms-vue/src/theme/tokens.css#L1-L152)
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java:1-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java#L1-L53)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java:1-103](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L1-L103)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfig.java:1-9](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfig.java#L1-L9)
- [fms-api/config/dbconfigs/README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
章节来源
- [fms-vue/vite.config.js:1-25](file://fms-vue/vite.config.js#L1-L25)
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
## 核心组件
- 前端构建与代理:Vite配置定义别名、开发服务器端口与API代理
- 前端主题系统:通过CSS变量与JS动态切换主色与深浅色模式
- 后端应用配置:统一入口application.yaml,包含服务端口、上下文路径、JWT、数据库池、文件存储等
- 多租户数据库配置:按机构码加载独立.properties配置文件,并进行严格校验
- 文件存储配置:支持本地与OSS两种模式
章节来源
- [fms-vue/vite.config.js:1-25](file://fms-vue/vite.config.js#L1-L25)
- [fms-vue/src/theme/index.js:1-16](file://fms-vue/src/theme/index.js#L1-L16)
- [fms-vue/src/theme/presets.js:1-16](file://fms-vue/src/theme/presets.js#L1-L16)
- [fms-vue/src/theme/tokens.css:1-152](file://fms-vue/src/theme/tokens.css#L1-L152)
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java:1-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java#L1-L53)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java:1-103](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L1-L103)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfig.java:1-9](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfig.java#L1-L9)
- [fms-api/config/dbconfigs/README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
## 架构总览
下图展示前后端配置在运行时的交互关系:前端通过Vite启动并代理API请求到后端;后端读取application.yaml与多租户数据库配置,提供API服务。
```mermaid
sequenceDiagram
participant FE as "前端(Vite)"
participant BE as "后端(Spring Boot)"
participant CFG as "application.yaml"
participant DBP as "OrgDatabaseProperties"
participant DBL as "OrgDatabaseConfigLoader"
participant DB as "机构数据库(.properties)"
FE->>BE : "HTTP /api/* (开发时由Vite代理)"
BE->>CFG : "启动时加载基础配置"
BE->>DBP : "绑定fms.database.*属性"
BE->>DBL : "根据机构码加载配置"
DBL->>DB : "读取{ORG_ID}.properties"
DB-->>DBL : "url/username/password/driver"
DBL-->>BE : "OrgDatabaseConfig"
BE-->>FE : "返回业务数据"
```
图表来源
- [fms-vue/vite.config.js:11-21](file://fms-vue/vite.config.js#L11-L21)
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java:8-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java#L8-L53)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java:19-103](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L19-L103)
- [fms-api/config/dbconfigs/README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
## 详细组件分析
### 前端Vite构建配置
- 别名设置:将@指向src目录,便于模块导入
- 开发服务器:host为true,端口固定,strictPort避免冲突
- API代理:开发时将/api请求转发至后端地址,便于联调
- 插件:启用Vue插件
章节来源
- [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)
### 前端环境变量管理
- 当前工程未使用.env或Vite环境变量注入方式,所有运行时行为通过主题与状态管理控制
- 若需接入环境变量,可参考通用工具对.env文件的解析与合并逻辑(如查找优先级、注释处理、引号处理等),以便后续扩展
章节来源
- [fms-vue/package.json:6-19](file://fms-vue/package.json#L6-L19)
### 前端主题配置
- 主色写入:通过JS在根节点设置CSS变量--fms-primary
- 深浅色模式:通过切换html的dark class实现
- 预设色板:集中维护主题色列表与默认值
- 设计令牌:tokens.css集中定义浅色与深色两套变量,主色派生通过color-mix计算
```mermaid
flowchart TD
Start(["应用启动"]) --> LoadPresets["加载预设主色"]
LoadPresets --> ApplyPrimary["写入 --fms-primary"]
ApplyPrimary --> ToggleDark{"是否深色模式?"}
ToggleDark --> |是| AddClass["添加 .dark 类"]
ToggleDark --> |否| RemoveClass["移除 .dark 类"]
AddClass --> Render["渲染界面(使用 tokens.css)"]
RemoveClass --> Render
```
图表来源
- [fms-vue/src/theme/index.js:1-16](file://fms-vue/src/theme/index.js#L1-L16)
- [fms-vue/src/theme/presets.js:1-16](file://fms-vue/src/theme/presets.js#L1-L16)
- [fms-vue/src/theme/tokens.css:1-152](file://fms-vue/src/theme/tokens.css#L1-L152)
章节来源
- [fms-vue/src/theme/index.js:1-16](file://fms-vue/src/theme/index.js#L1-L16)
- [fms-vue/src/theme/presets.js:1-16](file://fms-vue/src/theme/presets.js#L1-L16)
- [fms-vue/src/theme/tokens.css:1-152](file://fms-vue/src/theme/tokens.css#L1-L152)
### 后端应用配置(application.yaml)
- 服务端口与上下文路径:server.port=8088,context-path=/api
- 应用名称:spring.application.name=fms-api
- JWT认证:jwt-secret支持从环境变量注入,过期时间24小时
- 数据库连接池:fms.database.pool.* 控制连接池参数
- 文件存储:fms.file.storage-type选择local或oss;local存储目录与URL前缀;oss端点配置
章节来源
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
### 多租户数据库配置
- 配置目录:fms.database.config-dir指定存放机构数据库配置的目录
- 配置格式:每个机构一个{ORG_ID}.properties文件,包含url、username、password、driver
- 配置加载:启动后根据机构码规范化并读取对应文件,缺失或非法则抛出异常
- 驱动默认:未指定driver时使用SQL Server驱动
- 校验规则:机构码必须匹配正则,必填项检查(url、username、password)
```mermaid
classDiagram
class OrgDatabaseProperties {
+Path configDir
+Pool pool
}
class Pool {
+int initialSize
+int minIdle
+int maxActive
+long maxWait
+String validationQuery
+boolean testWhileIdle
+boolean testOnBorrow
+boolean testOnReturn
+Duration timeBetweenEvictionRuns
+Duration minEvictableIdleTime
}
class OrgDatabaseConfigLoader {
+init()
+load(orgId) OrgDatabaseConfig
+normalizeOrgId(orgId) String
}
class OrgDatabaseConfig {
+String url
+String username
+String password
+String driver
}
OrgDatabaseProperties --> Pool : "包含"
OrgDatabaseConfigLoader --> OrgDatabaseProperties : "读取"
OrgDatabaseConfigLoader --> OrgDatabaseConfig : "生成"
```
图表来源
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java:8-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java#L8-L53)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java:19-103](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L19-L103)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfig.java:1-9](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfig.java#L1-L9)
章节来源
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java:1-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java#L1-L53)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java:1-103](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L1-L103)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfig.java:1-9](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfig.java#L1-L9)
- [fms-api/config/dbconfigs/README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
### 文件存储配置
- 类型选择:storage-type=local或oss
- 本地存储:storage-dir指定物理目录,url-prefix用于静态访问前缀
- OSS存储:g3oss-url指定远端对象存储地址
章节来源
- [fms-api/src/main/resources/application.yaml:27-34](file://fms-api/src/main/resources/application.yaml#L27-L34)
### 多环境配置管理策略
- 开发环境:
- 前端:Vite server端口5082,/api代理到http://127.0.0.1:8088
- 后端:application.yaml中server.port=8088,context-path=/api
- 测试/生产环境:
- 可通过环境变量覆盖敏感配置(如JWT密钥)
- 多租户数据库配置以外部文件形式部署,避免入库
- 文件存储可在不同环境切换local/oss
章节来源
- [fms-vue/vite.config.js:11-21](file://fms-vue/vite.config.js#L11-L21)
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
### 运行时配置的热更新机制
- 前端主题:通过JS动态修改CSS变量与DOM class,无需刷新即可生效
- 后端配置:
- application.yaml为静态资源,重启生效
- 多租户数据库配置以文件形式存在,建议在配置变更时重启服务以确保一致性
- 如需热更新,可在服务内增加监听配置目录变化并重新加载配置的能力(当前仓库未实现)
章节来源
- [fms-vue/src/theme/index.js:1-16](file://fms-vue/src/theme/index.js#L1-L16)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java:19-103](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L19-L103)
### 配置验证规则
- 机构码规范化与校验:仅允许大写英文字母、数字、下划线、连字符,长度限制
- 必填字段校验:url、username、password必须存在且非空
- 驱动读取:未提供driver时回退到SQL Server驱动
- 错误提示:缺失配置或非法输入会抛出明确异常
章节来源
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java:22-103](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L22-L103)
## 依赖关系分析
- 前端依赖:Vite、Vue插件、Pinia、Axios等(见package.json)
- 后端依赖:Spring Boot、JDBC驱动(SQL Server)、自定义数据库配置加载器
- 配置耦合:
- 前端通过Vite代理与后端解耦,便于独立开发与联调
- 后端通过application.yaml与外部.properties文件解耦,支持多租户与多环境
```mermaid
graph LR
FE["前端(fms-vue)"] --> |代理| BE["后端(fms-api)"]
BE --> |读取| APP["application.yaml"]
BE --> |加载| DBP["OrgDatabaseProperties"]
DBP --> |绑定| POOL["Pool配置"]
BE --> |实例化| DBL["OrgDatabaseConfigLoader"]
DBL --> |读取| DBF["{ORG_ID}.properties"]
DBL --> |输出| DBCFG["OrgDatabaseConfig"]
```
图表来源
- [fms-vue/vite.config.js:11-21](file://fms-vue/vite.config.js#L11-L21)
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java:8-53](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseProperties.java#L8-L53)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java:19-103](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L19-L103)
章节来源
- [fms-vue/package.json:21-46](file://fms-vue/package.json#L21-L46)
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
## 性能考虑
- 前端:
- 使用CSS变量与color-mix减少重复样式,提升主题切换性能
- 开发代理减少跨域开销,提高联调效率
- 后端:
- 合理设置连接池参数(initial-size、min-idle、max-active、max-wait)以平衡响应时间与资源占用
- 多租户数据库配置按需加载,避免不必要的I/O
- 文件存储选择本地或OSS,依据吞吐与延迟需求调整
[本节为通用指导,不直接分析具体文件]
## 故障排查指南
- 前端代理失败:
- 检查Vite server代理目标地址是否正确
- 确认后端服务已启动且端口一致
- 主题不生效:
- 确认JS已写入--fms-primary变量
- 检查HTML是否包含正确的class(light/dark)
- 后端启动失败:
- 检查application.yaml中的端口与上下文路径
- 检查JWT密钥是否通过环境变量正确注入
- 多租户数据库连接失败:
- 确认{ORG_ID}.properties是否存在且包含必填字段
- 检查机构码是否规范(大小写、字符集)
- 查看日志中关于缺少配置或格式错误的异常信息
章节来源
- [fms-vue/vite.config.js:11-21](file://fms-vue/vite.config.js#L11-L21)
- [fms-vue/src/theme/index.js:1-16](file://fms-vue/src/theme/index.js#L1-L16)
- [fms-api/src/main/resources/application.yaml:1-34](file://fms-api/src/main/resources/application.yaml#L1-L34)
- [fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java:67-103](file://fms-api/src/main/java/cn/g3soft/fmsapi/database/OrgDatabaseConfigLoader.java#L67-L103)
## 结论
本配置管理体系通过清晰的前后端职责划分与模块化配置,实现了:
- 灵活的主题与多环境支持
- 多租户数据库连接的标准化与强校验
- 可扩展的文件存储方案
建议在生产环境中:
- 使用环境变量管理敏感配置(如JWT密钥)
- 将多租户数据库配置文件纳入安全管控(权限、备份、审计)
- 建立配置变更流程与回滚机制
[本节为总结性内容,不直接分析具体文件]
## 附录
- 多租户数据库配置示例与说明参见dbconfigs/README.md
- 前端脚本命令与依赖版本参见package.json
- 主题设计与令牌定义参见theme目录下的JS与CSS文件
章节来源
- [fms-api/config/dbconfigs/README.md:1-28](file://fms-api/config/dbconfigs/README.md#L1-L28)
- [fms-vue/package.json:6-46](file://fms-vue/package.json#L6-L46)
- [fms-vue/src/theme/index.js:1-16](file://fms-vue/src/theme/index.js#L1-L16)
- [fms-vue/src/theme/presets.js:1-16](file://fms-vue/src/theme/presets.js#L1-L16)
- [fms-vue/src/theme/tokens.css:1-152](file://fms-vue/src/theme/tokens.css#L1-L152)