Update mengyastore

This commit is contained in:
2026-05-13 12:11:46 +08:00
parent ad54b1eb7e
commit 37983f3b60
156 changed files with 10064 additions and 5681 deletions

View File

@@ -10,7 +10,7 @@ import (
"github.com/joho/godotenv"
)
// Config is populated entirely from environment variables (optionally set via .env — see Load).
// Config 全部由环境变量填充(可通过工作目录下 .env.development 或 ENV_FILE 设置,见 Load)。
type Config struct {
AppEnv string
AdminToken string
@@ -31,17 +31,26 @@ type Config struct {
RabbitMQEnabled bool
RabbitMQURL string
RabbitMQEnv string
WebhookMengyaSecret string
PaymentPendingTTLSecs int
// GinDebug为 true 时启用 Gin Debug打印路由表等默认 false日志更干净。
GinDebug bool
// EnableSwagger为 true 时注册 /swagger UI默认在 GIN_DEBUG 或 ENABLE_SWAGGER 为真时为 true。
EnableSwagger bool
}
// App environment: affects defaults when DATABASE_DSN / RABBITMQ_ENV are omitted.
// APP_ENV=production → prod DB default, RABBITMQ_ENV default prod
// Otherwise → development defaults (test DB, rabbit dev).
// 应用环境:在未设置 DATABASE_DSN / RABBITMQ_ENV 时决定默认值。
// APP_ENV=production → 生产库 DSN、RABBITMQ_ENV 默认 prod
// 否则 → 开发默认测试库、RabbitMQ 开发环境)。
const (
EnvDevelopment = "development"
EnvProduction = "production"
)
// Built-in DSN fallbacks when DATABASE_DSN is empty.
// 内建 DSN DATABASE_DSN 为空时使用。
const (
TestDSN = "mengyastore-test:mengyastore-test@tcp(10.1.1.100:3306)/mengyastore-test?charset=utf8mb4&parseTime=True&loc=Local"
ProdDSN = "mengyastore:mengyastore@tcp(192.168.1.100:3306)/mengyastore?charset=utf8mb4&parseTime=True&loc=Local"
@@ -60,26 +69,33 @@ const (
DefaultRedisPassword = "tyh@19900420"
)
// Load reads optional .env file(s) then builds Config from the process environment.
// Load 读取可选的 env 文件,再从进程环境组装 Config。
//
// Dotenv resolution order:
// 1. File named by ENV_FILE (if set)
// 2. .env in current working directory
// 解析 env 文件的顺序:
// 1. 环境变量 ENV_FILE 指定的文件(若设置了)
// 2. 当前工作目录下的 .env.development不存在则忽略
//
// Variables (all optional unless noted):
// 环境变量说明(除非注明否则均可选):
//
// APP_ENV — development | production (default: development)
// ADMIN_TOKEN — admin API token (default: changeme)
// AUTH_API_URL — SproutGate base URL
// DATABASE_DSN — MySQL DSN; if empty, uses TestDSN or ProdDSN from APP_ENV
// APP_ENV — development | production(默认 development
// ADMIN_TOKEN — 管理端 API 令牌(默认 changeme
// AUTH_API_URL — 萌芽认证中心 SproutGate URL
// DATABASE_DSN — MySQL DSN;为空则按 APP_ENV 选用 TestDSN / ProdDSN
// RABBITMQ_ENABLED — true/false
// RABBITMQ_URL — full amqp URL
// RABBITMQ_ENV — dev | prod (default from APP_ENV)
// RABBITMQ_PASSWORD — if RABBITMQ_URL empty but RABBITMQ_ENABLED, builds URL with host/vhost defaults
// RABBITMQ_URL — 完整 amqp URL
// RABBITMQ_ENV — dev | prod(默认随 APP_ENV
// RABBITMQ_PASSWORD — 若已启用 MQ 但未设 RABBITMQ_URL则用默认主机/vhost 拼 URL 时需要口令
//
// HTTP_LISTEN_ADDR — 进程监听,默认 :8080
// PUBLIC_API_BASE_URL — 对外 API 基地址(反向代理场景)
//
// WEBHOOK_MENGYA_SECRET — 若设置,到账 Webhook 须带相同请求头 X-Webhook-Secret
// PAYMENT_PENDING_SECONDS — 萌芽支付待支付超时(秒,默认 60
//
// GIN_DEBUG — 1/true/yes/onGin Debug默认关闭为真时同时开启 Swagger UI/swagger
// ENABLE_SWAGGER — 1/true/yes/on启用 Swagger UI与 GIN_DEBUG 任一为真即注册 /swagger
// WEBHOOK_LOG_VERBOSE — 1/true萌芽 Webhook 日志附带 notice/body 摘要(排查渠道用)
//
// REDIS_ENABLED — 默认 true显式 false/0/off 则关闭
// REDIS_ADDR — 默认 development→TestRedisAddrproduction→ProdRedisAddr
// REDIS_PASSWORD — 默认 DefaultRedisPassword建议生产用环境变量覆盖
@@ -168,10 +184,34 @@ func Load() (*Config, error) {
}
}
cfg.WebhookMengyaSecret = strings.TrimSpace(os.Getenv("WEBHOOK_MENGYA_SECRET"))
if sec := strings.TrimSpace(os.Getenv("PAYMENT_PENDING_SECONDS")); sec != "" {
if n, err := strconv.Atoi(sec); err == nil && n > 0 {
cfg.PaymentPendingTTLSecs = n
}
}
if cfg.PaymentPendingTTLSecs <= 0 {
cfg.PaymentPendingTTLSecs = 60
}
cfg.GinDebug = envTruthy(os.Getenv("GIN_DEBUG"))
cfg.EnableSwagger = cfg.GinDebug || envTruthy(os.Getenv("ENABLE_SWAGGER"))
return cfg, nil
}
// redisEnabledFromEnv defaults to true unless explicitly turned off.
// envTruthy将 1、true、yes、on 视为真(不区分大小写)。
func envTruthy(s string) bool {
switch strings.ToLower(strings.TrimSpace(s)) {
case "1", "true", "yes", "on":
return true
default:
return false
}
}
// redisEnabledFromEnv除非显式关闭否则默认启用 Redis。
func redisEnabledFromEnv(v string) bool {
s := strings.ToLower(strings.TrimSpace(v))
if s == "false" || s == "0" || s == "no" || s == "off" {
@@ -188,8 +228,8 @@ func loadDotenv() {
_ = godotenv.Load(f)
return
}
// Standard local file; ignore missing.
_ = godotenv.Load(filepath.Clean(".env"))
// 本地开发默认文件名;不存在则忽略。
_ = godotenv.Load(filepath.Clean(".env.development"))
}
func normalizeAppEnv(s string) string {