From 98d8525fa94f11b8c62480410658c6c26d3eaaad Mon Sep 17 00:00:00 2001 From: shanshanzhong Date: Fri, 3 Apr 2026 07:20:10 -0700 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=AE=80=E5=8C=96=20trial=20?= =?UTF-8?q?=E8=B5=A0=E9=80=81=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=A4=9A=E4=BD=99=E7=9A=84=E7=99=BD=E5=90=8D=E5=8D=95=E5=90=AF?= =?UTF-8?q?=E7=94=A8=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **简化方案**: - 删除 `EnableTrialEmailWhitelist` 配置字段(多余) - 保留 `TrialEmailDomainWhitelist`(逗号分隔的白名单域名) - 赠送规则:白名单**非空** 且 **邮箱在列表** 才赠送 **新的赠送逻辑**: ```yaml TrialEmailDomainWhitelist: "qq.com,163.com,gmail.com" ``` - 为空 → ❌ 不赠送(关闭) - 非空 → ✅ 赠送给白名单域名的邮箱 **更新的地方**: 1. internal/config/config.go - 删除 EnableTrialEmailWhitelist 字段 2. userRegisterLogic.go - 简化赠送逻辑 3. emailLoginLogic.go - 简化赠送逻辑 4. bindEmailWithVerificationLogic.go - 简化赠送逻辑 5. oAuthLoginGetTokenLogic.go - 简化赠送逻辑 **配置升级说明**: 旧配置: ```yaml EnableTrial: true EnableTrialEmailWhitelist: true TrialEmailDomainWhitelist: "qq.com,163.com" ``` 新配置(只保留两项): ```yaml EnableTrial: true TrialEmailDomainWhitelist: "qq.com,163.com" ``` 关闭赠送: ```yaml EnableTrial: true TrialEmailDomainWhitelist: "" ``` Co-Authored-By: claude-flow --- internal/config/config.go | 3 +-- internal/logic/auth/emailLoginLogic.go | 2 +- internal/logic/auth/oauth/oAuthLoginGetTokenLogic.go | 4 ++-- internal/logic/auth/userRegisterLogic.go | 2 +- .../logic/public/user/bindEmailWithVerificationLogic.go | 6 +++--- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/internal/config/config.go b/internal/config/config.go index 476cdda..a8b141f 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -87,12 +87,11 @@ type RegisterConfig struct { TrialSubscribe int64 `yaml:"TrialSubscribe" default:"0"` TrialTime int64 `yaml:"TrialTime" default:"0"` TrialTimeUnit string `yaml:"TrialTimeUnit" default:""` + TrialEmailDomainWhitelist string `yaml:"TrialEmailDomainWhitelist" default:""` IpRegisterLimit int64 `yaml:"IpRegisterLimit" default:"0"` IpRegisterLimitDuration int64 `yaml:"IpRegisterLimitDuration" default:"0"` EnableIpRegisterLimit bool `yaml:"EnableIpRegisterLimit" default:"false"` DeviceLimit int64 `yaml:"DeviceLimit" default:"2"` - EnableTrialEmailWhitelist bool `yaml:"EnableTrialEmailWhitelist" default:"false"` - TrialEmailDomainWhitelist string `yaml:"TrialEmailDomainWhitelist" default:""` } type EmailConfig struct { diff --git a/internal/logic/auth/emailLoginLogic.go b/internal/logic/auth/emailLoginLogic.go index e4fb016..a875709 100644 --- a/internal/logic/auth/emailLoginLogic.go +++ b/internal/logic/auth/emailLoginLogic.go @@ -126,7 +126,7 @@ func (l *EmailLoginLogic) EmailLogin(req *types.EmailLoginRequest) (resp *types. return err } rc := l.svcCtx.Config.Register - if rc.EnableTrial && (!rc.EnableTrialEmailWhitelist || IsEmailDomainWhitelisted(req.Email, rc.TrialEmailDomainWhitelist)) { + if rc.EnableTrial && rc.TrialEmailDomainWhitelist != "" && IsEmailDomainWhitelisted(req.Email, rc.TrialEmailDomainWhitelist) { if err = l.activeTrial(userInfo.Id); err != nil { return err } diff --git a/internal/logic/auth/oauth/oAuthLoginGetTokenLogic.go b/internal/logic/auth/oauth/oAuthLoginGetTokenLogic.go index 58b75f4..f8182db 100644 --- a/internal/logic/auth/oauth/oAuthLoginGetTokenLogic.go +++ b/internal/logic/auth/oauth/oAuthLoginGetTokenLogic.go @@ -395,8 +395,8 @@ func (l *OAuthLoginGetTokenLogic) register(email, avatar, method, openid, reques } rc := l.svcCtx.Config.Register - // Only activate trial if whitelist is not enabled, or email domain matches whitelist - shouldActivateTrial := rc.EnableTrial && (!rc.EnableTrialEmailWhitelist || (email != "" && l.isEmailDomainWhitelisted(email, rc.TrialEmailDomainWhitelist))) + // Only activate trial if email domain is in whitelist (whitelist cannot be empty) + shouldActivateTrial := rc.EnableTrial && rc.TrialEmailDomainWhitelist != "" && (email != "" && l.isEmailDomainWhitelisted(email, rc.TrialEmailDomainWhitelist)) if shouldActivateTrial { l.Debugw("activating trial subscription", diff --git a/internal/logic/auth/userRegisterLogic.go b/internal/logic/auth/userRegisterLogic.go index 710dff1..90c06bf 100644 --- a/internal/logic/auth/userRegisterLogic.go +++ b/internal/logic/auth/userRegisterLogic.go @@ -148,7 +148,7 @@ func (l *UserRegisterLogic) UserRegister(req *types.UserRegisterRequest) (resp * // Activate trial subscription after transaction success (moved outside transaction to reduce lock time) rc := l.svcCtx.Config.Register - if rc.EnableTrial && (!rc.EnableTrialEmailWhitelist || IsEmailDomainWhitelisted(req.Email, rc.TrialEmailDomainWhitelist)) { + if rc.EnableTrial && rc.TrialEmailDomainWhitelist != "" && IsEmailDomainWhitelisted(req.Email, rc.TrialEmailDomainWhitelist) { trialSubscribe, err = l.activeTrial(userInfo.Id) if err != nil { l.Errorw("Failed to activate trial subscription", logger.Field("error", err.Error())) diff --git a/internal/logic/public/user/bindEmailWithVerificationLogic.go b/internal/logic/public/user/bindEmailWithVerificationLogic.go index 2f69725..d2f5924 100644 --- a/internal/logic/public/user/bindEmailWithVerificationLogic.go +++ b/internal/logic/public/user/bindEmailWithVerificationLogic.go @@ -209,13 +209,13 @@ func (l *BindEmailWithVerificationLogic) refreshBindSessionToken(userId int64) ( } // tryGrantTrialOnEmailBind grants trial subscription to the email user (family owner) -// if EnableTrial is on and (if whitelist is enabled, email domain must match). +// if email domain is in the configured whitelist (or if whitelist is empty, no trial is granted). func (l *BindEmailWithVerificationLogic) tryGrantTrialOnEmailBind(ownerUserId int64, email string) { rc := l.svcCtx.Config.Register - if !rc.EnableTrial { + if !rc.EnableTrial || rc.TrialEmailDomainWhitelist == "" { return } - if rc.EnableTrialEmailWhitelist && !auth.IsEmailDomainWhitelisted(email, rc.TrialEmailDomainWhitelist) { + if !auth.IsEmailDomainWhitelisted(email, rc.TrialEmailDomainWhitelist) { l.Infow("email domain not in trial whitelist, skip", logger.Field("email", email), logger.Field("owner_user_id", ownerUserId),