docs(config): 添加配置文件管理说明并调整开发环境配置

- 创建 CONFIG_MANAGEMENT.md 详细说明配置文件结构和管理规范
- 为 mt-pay 和 mt-startup 模块分别创建生产环境配置文件
- 将前端访问地址从生产域名改为开发环境本地地址
- 更新 PayPal Webhook 配置为开发环境内网穿透地址
- 调整应用启动时的访问地址提示信息
- 优化数据库连接和服务器配置的环境变量支持
This commit is contained in:
2025-12-26 16:05:53 +08:00
parent 07dcd9408c
commit 504ccabba1
9 changed files with 362 additions and 109 deletions

232
CONFIG_MANAGEMENT.md Normal file
View File

@@ -0,0 +1,232 @@
# 配置文件管理说明
## 📁 配置文件结构
### mt-pay 模块
```
mt-pay/src/main/resources/
├── application.yml # 基础配置只设置active profile
├── application-dev.yml # 开发环境配置(本地开发)
├── application-prod.yml # 生产环境配置(服务器部署)
└── application-test.yml # 测试环境配置(可选)
```
### mt-startup 模块
```
mt-startup/src/main/resources/
├── application.yml # 基础配置只设置active profile
├── application-dev.yml # 开发环境配置(本地开发)
└── application-prod.yml # 生产环境配置(服务器部署)
```
## 🔧 环境配置说明
### 开发环境dev
**配置文件**: `application-dev.yml`
**配置内容**:
- 前端URL: `http://localhost:3000`(本地开发)
- PayPal Webhook: 使用内网穿透(如 `https://xxx.cpolar.top/api/paypal/webhook`
- 数据库: 开发环境数据库连接
**使用场景**:
- 本地开发调试
- IDE中直接运行
- 使用 `--spring.profiles.active=dev` 启动
**启动方式**:
```bash
# IDE中运行
# 或命令行
java -jar mt-startup-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
```
### 生产环境prod
**配置文件**: `application-prod.yml`
**配置内容**:
- 前端URL: `https://shopd.mtkj2025.com`(生产域名)
- PayPal Webhook: `https://shopd.mtkj2025.com/api/paypal/webhook`
- 数据库: 生产环境数据库连接(通过环境变量配置)
**使用场景**:
- 服务器部署
- 生产环境运行
- 使用 `--spring.profiles.active=prod` 启动
**启动方式**:
```bash
java -jar mt-startup-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
```
## 📝 配置项说明
### 前端URL配置
**开发环境** (`application-dev.yml`):
```yaml
app:
frontend:
url: http://localhost:3000
```
**生产环境** (`application-prod.yml`):
```yaml
app:
frontend:
url: ${app.frontend.url:https://shopd.mtkj2025.com}
```
**说明**:
- 开发环境固定使用 `localhost:3000`
- 生产环境支持通过环境变量覆盖:`-Dapp.frontend.url=https://your-domain.com`
### PayPal Webhook配置
**开发环境** (`application-dev.yml`):
```yaml
paypal:
webhook-url: https://2646b437.r33.cpolar.top/api/paypal/webhook
```
**生产环境** (`application-prod.yml`):
```yaml
paypal:
webhook-url: ${paypal.webhook-url:https://shopd.mtkj2025.com/api/paypal/webhook}
```
**说明**:
- 开发环境使用内网穿透服务cpolar/ngrok
- 生产环境使用域名,支持通过环境变量覆盖
## 🚀 部署流程
### 本地开发
1. **确保使用dev配置**
- `application.yml``spring.profiles.active: dev`
- 或启动时指定:`--spring.profiles.active=dev`
2. **启动后端**
```bash
# IDE中直接运行
# 或
mvn spring-boot:run -Dspring-boot.run.profiles=dev
```
3. **启动前端**
```bash
cd E:\MTKJPAY-FRONT
npm run dev
```
4. **访问地址**
- 前端: `http://localhost:3000`
- 后端API: `http://localhost:8082/api`
### 生产部署
1. **打包应用**
```bash
cd E:\MTKJPAY
mvn clean package -DskipTests
```
2. **上传到服务器**
- 上传 `mt-startup/target/mt-startup-0.0.1-SNAPSHOT.jar`
3. **启动应用使用prod配置**
```bash
java -jar mt-startup-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
```
4. **访问地址**
- 前端: `https://shopd.mtkj2025.com`
- 后端API: `https://shopd.mtkj2025.com/api`通过Nginx代理
## ⚠️ 重要提示
### 1. 配置文件隔离
- ✅ **开发环境配置不会影响生产环境**
- ✅ **生产环境配置不会影响本地开发**
- ✅ **打包时不会覆盖服务器配置**
### 2. 环境变量覆盖
生产环境支持通过环境变量或启动参数覆盖配置:
```bash
# 覆盖前端URL
java -jar app.jar --spring.profiles.active=prod \
-Dapp.frontend.url=https://your-domain.com
# 覆盖PayPal Webhook
java -jar app.jar --spring.profiles.active=prod \
-Dpaypal.webhook-url=https://your-domain.com/api/paypal/webhook
```
### 3. 默认值设置
Java代码中的默认值设置为开发环境值
```java
@Value("${app.frontend.url:http://localhost:3000}")
private String frontendUrl;
```
- 如果配置文件中没有设置,使用默认值(开发环境)
- 如果配置文件中设置了,使用配置文件的值
### 4. 配置文件优先级
Spring Boot配置优先级从高到低
1. 命令行参数(`--spring.profiles.active=prod`
2. 环境变量
3. `application-{profile}.yml`
4. `application.yml`
5. Java代码中的默认值
## 📋 配置检查清单
### 开发环境
- [x] `application.yml` 中 `spring.profiles.active: dev`
- [x] `application-dev.yml` 中前端URL为 `http://localhost:3000`
- [x] `application-dev.yml` 中PayPal Webhook使用内网穿透
- [x] Java代码默认值为 `http://localhost:3000`
### 生产环境
- [x] `application-prod.yml` 中前端URL为 `https://shopd.mtkj2025.com`
- [x] `application-prod.yml` 中PayPal Webhook为 `https://shopd.mtkj2025.com/api/paypal/webhook`
- [x] 支持通过环境变量覆盖配置
- [x] 打包时使用 `--spring.profiles.active=prod` 启动
## 🔍 验证方法
### 验证开发环境配置
```bash
# 启动应用
java -jar app.jar --spring.profiles.active=dev
# 检查日志,应该看到:
# - 前端代理地址: http://localhost:3000
```
### 验证生产环境配置
```bash
# 启动应用
java -jar app.jar --spring.profiles.active=prod
# 检查日志,应该看到:
# - 前端地址: https://shopd.mtkj2025.com
# - Webhook URL: https://shopd.mtkj2025.com/api/paypal/webhook
```
## 📚 相关文档
- `DEPLOYMENT_README.md` - 部署说明
- `DOMAIN_CONFIG_SUMMARY.md` - 域名配置总结
- `NGINX_SSL_CONFIG.md` - Nginx SSL配置

View File

@@ -32,9 +32,9 @@ public class MtPayApplication {
String contextPath = env.getProperty("server.servlet.context-path", ""); String contextPath = env.getProperty("server.servlet.context-path", "");
String activeProfiles = String.join(",", env.getActiveProfiles()); String activeProfiles = String.join(",", env.getActiveProfiles());
// 构建完整的访问地址(使用域名) // 构建完整的访问地址(开发环境使用localhost生产环境使用配置的域名)
String serverHost = env.getProperty("app.server.host", "shopd.mtkj2025.com"); String serverHost = env.getProperty("app.server.host", "localhost");
String protocol = env.getProperty("app.server.protocol", "https"); String protocol = env.getProperty("app.server.protocol", "http");
String baseUrl = protocol + "://" + serverHost + ":" + serverPort + contextPath; String baseUrl = protocol + "://" + serverHost + ":" + serverPort + contextPath;
String apiUrl = baseUrl + "/api"; String apiUrl = baseUrl + "/api";
String druidUrl = baseUrl + "/druid"; String druidUrl = baseUrl + "/druid";
@@ -73,7 +73,7 @@ public class MtPayApplication {
log.info(""" log.info("""
📌 提示: 📌 提示:
- 前端地址: https://shopd.mtkj2025.com - 前端代理地址: http://localhost:3000
- 后端API地址: {} - 后端API地址: {}
- 图片上传接口: {}/product/upload/image - 图片上传接口: {}/product/upload/image
- 商品管理接口: {}/product - 商品管理接口: {}/product

View File

@@ -25,7 +25,7 @@ public class ProductLinkServiceImpl implements ProductLinkService {
@Autowired @Autowired
private MtProductLinkMapper productLinkMapper; private MtProductLinkMapper productLinkMapper;
@Value("${app.frontend.url:https://shopd.mtkj2025.com}") @Value("${app.frontend.url:http://localhost:3000}")
private String frontendUrl; private String frontendUrl;
private static final int DEFAULT_EXPIRE_DAYS = 90; private static final int DEFAULT_EXPIRE_DAYS = 90;

View File

@@ -72,7 +72,7 @@ public class ProductServiceImpl implements ProductService {
/** /**
* 前端访问地址用于生成商品详情页URL * 前端访问地址用于生成商品详情页URL
*/ */
@Value("${app.frontend.url:https://shopd.mtkj2025.com}") @Value("${app.frontend.url:http://localhost:3000}")
private String frontendUrl; private String frontendUrl;
/** /**
@@ -858,7 +858,8 @@ public class ProductServiceImpl implements ProductService {
/** /**
* 从完整URL中提取链接码 * 从完整URL中提取链接码
* 支持两种输入: * 支持两种输入:
* 1. 完整URLhttps://shopd.mtkj2025.com/product/2563c74bd94c4a4b95abccf697a6c756 * 1. 完整URLhttp://localhost:3000/product/2563c74bd94c4a4b95abccf697a6c756(开发环境)
* 或 https://shopd.mtkj2025.com/product/2563c74bd94c4a4b95abccf697a6c756生产环境
* 2. 链接码2563c74bd94c4a4b95abccf697a6c756 * 2. 链接码2563c74bd94c4a4b95abccf697a6c756
* *
* @param input 用户输入的URL或链接码 * @param input 用户输入的URL或链接码

View File

@@ -75,12 +75,11 @@ server:
# 文件写入磁盘的阈值(超过此大小会写入临时文件) # 文件写入磁盘的阈值(超过此大小会写入临时文件)
file-size-threshold: 2MB file-size-threshold: 2MB
# 应用配置(所有环境通用 # 应用配置(开发环境
app: app:
# 前端访问地址(用于生成商品详情页URL等 # 前端访问地址(开发环境使用localhost
# 注意已配置SSL证书使用HTTPS和域名
frontend: frontend:
url: https://shopd.mtkj2025.com url: http://localhost:3000
# 阿里云OSS相关配置所有环境通用 # 阿里云OSS相关配置所有环境通用
aliyun: aliyun:
@@ -112,10 +111,11 @@ paypal:
mode: sandbox mode: sandbox
# 是否启用PayPal支付 # 是否启用PayPal支付
enabled: true enabled: true
# Webhook URL服务器公网地址必须使用HTTPS端口443 # Webhook URL开发环境使用内网穿透或测试地址
# 注意PayPal只接受HTTPS端口443的Webhook URL # 注意PayPal只接受HTTPS端口443的Webhook URL
# 已配置SSL证书使用域名访问 # 开发环境可以使用内网穿透服务如ngrok、cpolar或留空
webhook-url: https://shopd.mtkj2025.com/api/paypal/webhook # 生产环境需要在application-prod.yml中配置
webhook-url: https://2646b437.r33.cpolar.top/api/paypal/webhook
# Webhook ID从PayPal控制台获取用于验证Webhook签名 # Webhook ID从PayPal控制台获取用于验证Webhook签名
webhook-id: 0SX6117212808615P webhook-id: 0SX6117212808615P

View File

@@ -46,9 +46,9 @@ public class MtkjpayApplication {
String contextPath = env.getProperty("server.servlet.context-path", ""); String contextPath = env.getProperty("server.servlet.context-path", "");
String activeProfiles = String.join(",", env.getActiveProfiles()); String activeProfiles = String.join(",", env.getActiveProfiles());
// 构建完整的访问地址(使用域名) // 构建完整的访问地址(开发环境使用localhost生产环境使用配置的域名)
String serverHost = env.getProperty("app.server.host", "shopd.mtkj2025.com"); String serverHost = env.getProperty("app.server.host", "localhost");
String protocol = env.getProperty("app.server.protocol", "https"); String protocol = env.getProperty("app.server.protocol", "http");
String baseUrl = protocol + "://" + serverHost + ":" + serverPort + contextPath; String baseUrl = protocol + "://" + serverHost + ":" + serverPort + contextPath;
String apiUrl = baseUrl + "/api"; String apiUrl = baseUrl + "/api";
String druidUrl = baseUrl + "/druid"; String druidUrl = baseUrl + "/druid";
@@ -87,7 +87,7 @@ public class MtkjpayApplication {
log.info(""" log.info("""
📌 提示: 📌 提示:
- 前端地址: https://shopd.mtkj2025.com - 前端代理地址: http://localhost:3000
- 后端API地址: {} - 后端API地址: {}
- 图片上传接口: {}/product/upload/image - 图片上传接口: {}/product/upload/image
- 商品管理接口: {}/product - 商品管理接口: {}/product

View File

@@ -74,11 +74,11 @@ server:
# 文件写入磁盘的阈值(超过此大小会写入临时文件) # 文件写入磁盘的阈值(超过此大小会写入临时文件)
file-size-threshold: 2MB file-size-threshold: 2MB
# 应用配置(所有环境通用 # 应用配置(开发环境
app: app:
# 前端访问地址(已配置SSL证书使用HTTPS和域名 # 前端访问地址(开发环境使用localhost
frontend: frontend:
url: https://shopd.mtkj2025.com url: http://localhost:3000
# 阿里云OSS相关配置所有环境通用 # 阿里云OSS相关配置所有环境通用
aliyun: aliyun:

View File

@@ -0,0 +1,108 @@
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源(生产环境)
master:
url: ${prod.db.url}
username: ${prod.db.username}
password: ${prod.db.password}
# 初始连接数
initial-size: 5
# 最小连接池数量
min-idle: 10
# 最大连接池数量
max-active: 200
# 配置获取连接等待超时的时间
max-wait: 60000
# 配置连接超时时间
connect-timeout: 30000
# 配置网络超时时间
socket-timeout: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
max-evictable-idle-time-millis: 900000
# 配置检测连接是否有效
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
# Druid监控配置
web-stat-filter:
enabled: true
stat-view-servlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: false
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
# 服务器配置
server:
port: ${server.port:8082}
servlet:
context-path: /
multipart:
max-file-size: 10MB
max-request-size: 50MB
file-size-threshold: 2MB
# 应用配置(生产环境)
app:
# 前端访问地址已配置SSL证书使用HTTPS和域名
# 支持通过环境变量覆盖:-Dapp.frontend.url=https://your-domain.com
frontend:
url: ${app.frontend.url:https://shopd.mtkj2025.com}
# PingPong支付配置生产环境
pingpong:
client-id: ${pingpong.client-id}
acc-id: ${pingpong.acc-id}
secret: ${pingpong.secret}
sign-type: MD5
gateway: https://acquirer-payment.pingpongx.com
mode: build
enabled: false
# PayPal支付配置生产环境
# 注意:当前为测试环境,使用沙箱凭证
# 正式环境需要替换为生产环境的Client ID和Secret
paypal:
# PayPal Client IDAPI密钥- 从环境变量或配置中心获取
client-id: ${paypal.client-id:AdGYUZpvLuHR30dybOApvM-RNB1pVKtd74SVfh-6TK52xV-1JEBddHVMCWuDdyyHri4DXd4kABBi7Icb}
# PayPal Client Secret密钥- 从环境变量或配置中心获取
client-secret: ${paypal.client-secret:ENblspyRmwsOU_PWFurlhEYUF5Da6aYKl0pjK4ehm7p3R5aSqvbpaF_YsIIs8v0ty1c9WJu15XP-Fe_1}
# 环境模式sandbox沙箱或 production生产
# 当前为测试环境使用sandbox
mode: ${paypal.mode:sandbox}
# 是否启用PayPal支付
enabled: ${paypal.enabled:true}
# Webhook URL已配置SSL证书使用HTTPS和域名
# 支持通过环境变量覆盖:-Dpaypal.webhook-url=https://your-domain.com/api/paypal/webhook
webhook-url: ${paypal.webhook-url:https://shopd.mtkj2025.com/api/paypal/webhook}
# Webhook ID从PayPal控制台获取
webhook-id: ${paypal.webhook-id:}

View File

@@ -1,91 +1,3 @@
spring: spring:
application:
name: MTKJPAY
profiles: profiles:
active: dev active: dev
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
# Druid监控配置
web-stat-filter:
enabled: true
stat-view-servlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: false
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
# MyBatis-Plus配置
mybatis-plus:
# 配置扫描mapper.xml文件路径
mapper-locations: classpath*:/mapper/**/*.xml
# 配置实体类包路径
type-aliases-package: com.mtkj.mtpay.entity
# 配置MyBatis-Plus全局配置
configuration:
# 开启驼峰命名转换
map-underscore-to-camel-case: true
# 开启二级缓存
cache-enabled: false
# 日志实现
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
# 全局配置
global-config:
db-config:
# 主键类型AUTO-数据库自增
id-type: auto
# 逻辑删除字段
logic-delete-field: deleted
# 逻辑删除值
logic-delete-value: 1
# 逻辑未删除值
logic-not-delete-value: 0
# 服务器配置(所有环境通用)
server:
port: 8082
servlet:
context-path: /
# 文件上传配置
multipart:
# 单个文件最大大小10MB
max-file-size: 10MB
# 请求最大大小50MB支持多文件上传
max-request-size: 50MB
# 文件写入磁盘的阈值(超过此大小会写入临时文件)
file-size-threshold: 2MB
# 应用配置(所有环境通用)
app:
# 前端访问地址已配置SSL证书使用HTTPS和域名
frontend:
url: https://shopd.mtkj2025.com
# 阿里云OSS相关配置所有环境通用
aliyun:
oss:
accessId: LTAI5tHbwvzWfANvNxju2yN1
accessKey: sAQR2swByBgmMOofH97hSJT638aVcJ
endpoint: https://oss-cn-hangzhou.aliyuncs.com
bucketName: mtkj2025