server: port: 9083 tomcat: headers: X-Content-Type-Options: nosniff X-Frame-Options: DENY X-XSS-Protection: 1; mode=block Strict-Transport-Security: max-age=31536000; includeSubDomains spring: servlet: multipart: max-file-size: 50MB max-request-size: 50MB application: name: train-backend datasource: # 训练营数据统一合并进 cfc 同库(zxyj):运营表 train_* 与 cfc 会员/活动/账本同库共存 driver-class-name: com.mysql.cj.jdbc.Driver url: ${TRAIN_DB_URL:jdbc:mysql://192.168.16.251:3306/zxyj?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&createDatabaseIfNotExist=true} username: ${TRAIN_DB_USERNAME:zxyj} password: ${TRAIN_DB_PASSWORD:zxyj@123} hikari: maximum-pool-size: 50 minimum-idle: 10 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000 pool-name: TrainHikariPool mybatis-plus: mapper-locations: classpath*:/mapper/**/*.xml type-aliases-package: com.train.entity configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl global-config: db-config: id-type: auto jwt: # 与 cfc(E:\cfc)对齐同一密钥,使 camp 学员 token 可与 cfc 体系互通 secret: ${JWT_SECRET:cfc-prod-jwt-secret-2026-keep-it-safe!} expiration: 86400000 wechat: appid: wx5ba8038ef16fb245 secret: ${WECHAT_SECRET:dev-only-wechat-secret} login-url: https://api.weixin.qq.com/sns/jscode2session test-mode: true # 测试模式:跳过微信 API 调用,使用模拟 openid test-phone: "13800138000" # 测试模式下 getPhoneNumber 的模拟手机号 subscribe-url: https://api.weixin.qq.com/cgi-bin/message/subscribe/send qrcode-url: https://api.weixin.qq.com/wxa/getwxacodeunlimit # 订阅消息模板 ID(生产填写:微信公众平台「订阅消息」申请后回填) # key 与定时任务 action 对应:followup_t1..30 / preclass_t7..t1 message-template: followup-t1: "" followup-t3: "" followup-t7: "" followup-t21: "" followup-t30: "" preclass-t7: "" preclass-t3: "" preclass-t1: "" upload: base-dir: ./uploads allowed-types: image/jpeg,image/png,image/gif,image/webp,application/pdf logging: level: com.train: debug # 应用配置 app: init-test-data: true # 是否初始化测试/种子数据 # Admin 登录配置 admin: username: admin password: admin123