diff --git a/CONFIG_MANAGEMENT.md b/CONFIG_MANAGEMENT.md new file mode 100644 index 0000000..b32711b --- /dev/null +++ b/CONFIG_MANAGEMENT.md @@ -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配置 + diff --git a/mt-pay/src/main/java/com/mtkj/mtpay/MtPayApplication.java b/mt-pay/src/main/java/com/mtkj/mtpay/MtPayApplication.java index cd36f0f..4d61858 100644 --- a/mt-pay/src/main/java/com/mtkj/mtpay/MtPayApplication.java +++ b/mt-pay/src/main/java/com/mtkj/mtpay/MtPayApplication.java @@ -32,9 +32,9 @@ public class MtPayApplication { String contextPath = env.getProperty("server.servlet.context-path", ""); String activeProfiles = String.join(",", env.getActiveProfiles()); - // 构建完整的访问地址(使用域名) - String serverHost = env.getProperty("app.server.host", "shopd.mtkj2025.com"); - String protocol = env.getProperty("app.server.protocol", "https"); + // 构建完整的访问地址(开发环境使用localhost,生产环境使用配置的域名) + String serverHost = env.getProperty("app.server.host", "localhost"); + String protocol = env.getProperty("app.server.protocol", "http"); String baseUrl = protocol + "://" + serverHost + ":" + serverPort + contextPath; String apiUrl = baseUrl + "/api"; String druidUrl = baseUrl + "/druid"; @@ -73,7 +73,7 @@ public class MtPayApplication { log.info(""" 📌 提示: - - 前端地址: https://shopd.mtkj2025.com + - 前端代理地址: http://localhost:3000 - 后端API地址: {} - 图片上传接口: {}/product/upload/image - 商品管理接口: {}/product diff --git a/mt-pay/src/main/java/com/mtkj/mtpay/service/impl/ProductLinkServiceImpl.java b/mt-pay/src/main/java/com/mtkj/mtpay/service/impl/ProductLinkServiceImpl.java index b4db647..dc84fd5 100644 --- a/mt-pay/src/main/java/com/mtkj/mtpay/service/impl/ProductLinkServiceImpl.java +++ b/mt-pay/src/main/java/com/mtkj/mtpay/service/impl/ProductLinkServiceImpl.java @@ -25,7 +25,7 @@ public class ProductLinkServiceImpl implements ProductLinkService { @Autowired private MtProductLinkMapper productLinkMapper; - @Value("${app.frontend.url:https://shopd.mtkj2025.com}") + @Value("${app.frontend.url:http://localhost:3000}") private String frontendUrl; private static final int DEFAULT_EXPIRE_DAYS = 90; diff --git a/mt-pay/src/main/java/com/mtkj/mtpay/service/impl/ProductServiceImpl.java b/mt-pay/src/main/java/com/mtkj/mtpay/service/impl/ProductServiceImpl.java index 559c2e7..0460d6e 100644 --- a/mt-pay/src/main/java/com/mtkj/mtpay/service/impl/ProductServiceImpl.java +++ b/mt-pay/src/main/java/com/mtkj/mtpay/service/impl/ProductServiceImpl.java @@ -72,7 +72,7 @@ public class ProductServiceImpl implements ProductService { /** * 前端访问地址(用于生成商品详情页URL) */ - @Value("${app.frontend.url:https://shopd.mtkj2025.com}") + @Value("${app.frontend.url:http://localhost:3000}") private String frontendUrl; /** @@ -858,7 +858,8 @@ public class ProductServiceImpl implements ProductService { /** * 从完整URL中提取链接码 * 支持两种输入: - * 1. 完整URL:https://shopd.mtkj2025.com/product/2563c74bd94c4a4b95abccf697a6c756 + * 1. 完整URL:http://localhost:3000/product/2563c74bd94c4a4b95abccf697a6c756(开发环境) + * 或 https://shopd.mtkj2025.com/product/2563c74bd94c4a4b95abccf697a6c756(生产环境) * 2. 链接码:2563c74bd94c4a4b95abccf697a6c756 * * @param input 用户输入的URL或链接码 diff --git a/mt-pay/src/main/resources/application-dev.yml b/mt-pay/src/main/resources/application-dev.yml index 7ea21be..53acc8e 100644 --- a/mt-pay/src/main/resources/application-dev.yml +++ b/mt-pay/src/main/resources/application-dev.yml @@ -75,12 +75,11 @@ server: # 文件写入磁盘的阈值(超过此大小会写入临时文件) file-size-threshold: 2MB -# 应用配置(所有环境通用) +# 应用配置(开发环境) app: - # 前端访问地址(用于生成商品详情页URL等) - # 注意:已配置SSL证书,使用HTTPS和域名 + # 前端访问地址(开发环境使用localhost) frontend: - url: https://shopd.mtkj2025.com + url: http://localhost:3000 # 阿里云OSS相关配置(所有环境通用) aliyun: @@ -112,10 +111,11 @@ paypal: mode: sandbox # 是否启用PayPal支付 enabled: true - # Webhook URL(服务器公网地址,必须使用HTTPS,端口443) + # Webhook URL(开发环境使用内网穿透或测试地址) # 注意:PayPal只接受HTTPS(端口443)的Webhook URL - # 已配置SSL证书,使用域名访问 - webhook-url: https://shopd.mtkj2025.com/api/paypal/webhook + # 开发环境可以使用内网穿透服务(如ngrok、cpolar)或留空 + # 生产环境需要在application-prod.yml中配置 + webhook-url: https://2646b437.r33.cpolar.top/api/paypal/webhook # Webhook ID(从PayPal控制台获取,用于验证Webhook签名) webhook-id: 0SX6117212808615P diff --git a/mt-startup/src/main/java/com/mtkj/mtkjpay/MtkjpayApplication.java b/mt-startup/src/main/java/com/mtkj/mtkjpay/MtkjpayApplication.java index 94b61d6..e33041f 100644 --- a/mt-startup/src/main/java/com/mtkj/mtkjpay/MtkjpayApplication.java +++ b/mt-startup/src/main/java/com/mtkj/mtkjpay/MtkjpayApplication.java @@ -46,9 +46,9 @@ public class MtkjpayApplication { String contextPath = env.getProperty("server.servlet.context-path", ""); String activeProfiles = String.join(",", env.getActiveProfiles()); - // 构建完整的访问地址(使用域名) - String serverHost = env.getProperty("app.server.host", "shopd.mtkj2025.com"); - String protocol = env.getProperty("app.server.protocol", "https"); + // 构建完整的访问地址(开发环境使用localhost,生产环境使用配置的域名) + String serverHost = env.getProperty("app.server.host", "localhost"); + String protocol = env.getProperty("app.server.protocol", "http"); String baseUrl = protocol + "://" + serverHost + ":" + serverPort + contextPath; String apiUrl = baseUrl + "/api"; String druidUrl = baseUrl + "/druid"; @@ -87,7 +87,7 @@ public class MtkjpayApplication { log.info(""" 📌 提示: - - 前端地址: https://shopd.mtkj2025.com + - 前端代理地址: http://localhost:3000 - 后端API地址: {} - 图片上传接口: {}/product/upload/image - 商品管理接口: {}/product diff --git a/mt-startup/src/main/resources/application-dev.yml b/mt-startup/src/main/resources/application-dev.yml index a0ce97b..0e18b2e 100644 --- a/mt-startup/src/main/resources/application-dev.yml +++ b/mt-startup/src/main/resources/application-dev.yml @@ -74,11 +74,11 @@ server: # 文件写入磁盘的阈值(超过此大小会写入临时文件) file-size-threshold: 2MB -# 应用配置(所有环境通用) +# 应用配置(开发环境) app: - # 前端访问地址(已配置SSL证书,使用HTTPS和域名) + # 前端访问地址(开发环境使用localhost) frontend: - url: https://shopd.mtkj2025.com + url: http://localhost:3000 # 阿里云OSS相关配置(所有环境通用) aliyun: diff --git a/mt-startup/src/main/resources/application-prod.yml b/mt-startup/src/main/resources/application-prod.yml new file mode 100644 index 0000000..abaef96 --- /dev/null +++ b/mt-startup/src/main/resources/application-prod.yml @@ -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 ID(API密钥)- 从环境变量或配置中心获取 + 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:} + diff --git a/mt-startup/src/main/resources/application.yml b/mt-startup/src/main/resources/application.yml index 75e5f89..3d7808a 100644 --- a/mt-startup/src/main/resources/application.yml +++ b/mt-startup/src/main/resources/application.yml @@ -1,91 +1,3 @@ spring: - application: - name: MTKJPAY profiles: 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 -