Files
solosw 99b11b04e4 1.0
2026-01-05 14:11:34 +08:00

182 lines
5.0 KiB
Go

package handlers
import (
"awesomeProject/internal/common"
"awesomeProject/internal/config"
"awesomeProject/internal/models"
"fmt"
"log"
"strconv"
)
// UserConfigHandler 用户配置变更处理器
type UserConfigHandler struct{}
// GetConfigKeys 返回该处理器关心的配置键
func (h *UserConfigHandler) GetConfigKeys() []string {
return []string{
config.ConfigDefaultUserScore,
config.ConfigReferralBonus,
config.ConfigMaxUserLevel,
config.ConfigEnableRegistration,
}
}
// Handle 处理配置变更事件
func (h *UserConfigHandler) Handle(event config.ConfigEvent) error {
switch event.ConfigKey {
case config.ConfigDefaultUserScore:
return h.handleDefaultUserScoreChange(event)
case config.ConfigReferralBonus:
return h.handleReferralBonusChange(event)
case config.ConfigMaxUserLevel:
return h.handleMaxUserLevelChange(event)
case config.ConfigEnableRegistration:
return h.handleRegistrationToggle(event)
default:
return fmt.Errorf("未知的配置键: %s", event.ConfigKey)
}
}
// handleDefaultUserScoreChange 处理默认用户积分变更
func (h *UserConfigHandler) handleDefaultUserScoreChange(event config.ConfigEvent) error {
newScoreStr, ok := event.NewValue.(string)
if !ok {
return fmt.Errorf("默认用户积分配置值类型错误")
}
newScore, err := strconv.ParseFloat(newScoreStr, 64)
if err != nil {
return fmt.Errorf("默认用户积分配置值格式错误: %v", err)
}
if newScore < 0 {
return fmt.Errorf("默认用户积分不能为负数")
}
log.Printf("默认用户积分已更新: %v -> %.2f", event.OldValue, newScore)
// 这里可以添加业务逻辑,比如:
// 1. 更新新注册用户的积分计算逻辑
// 2. 发送通知给管理员
// 3. 更新缓存中的默认积分值
return nil
}
// handleReferralBonusChange 处理推荐奖励变更
func (h *UserConfigHandler) handleReferralBonusChange(event config.ConfigEvent) error {
newBonusStr, ok := event.NewValue.(string)
if !ok {
return fmt.Errorf("推荐奖励配置值类型错误")
}
newBonus, err := strconv.ParseFloat(newBonusStr, 64)
if err != nil {
return fmt.Errorf("推荐奖励配置值格式错误: %v", err)
}
if newBonus < 0 {
return fmt.Errorf("推荐奖励不能为负数")
}
log.Printf("推荐奖励已更新: %v -> %.2f", event.OldValue, newBonus)
// 这里可以添加业务逻辑,比如:
// 1. 重新计算推荐奖励策略
// 2. 发送通知给有推荐关系的用户
// 3. 更新推荐系统的计算规则
return nil
}
// handleMaxUserLevelChange 处理最大用户等级变更
func (h *UserConfigHandler) handleMaxUserLevelChange(event config.ConfigEvent) error {
newLevelStr, ok := event.NewValue.(string)
if !ok {
return fmt.Errorf("最大用户等级配置值类型错误")
}
newLevel, err := strconv.Atoi(newLevelStr)
if err != nil {
return fmt.Errorf("最大用户等级配置值格式错误: %v", err)
}
if newLevel < 1 {
return fmt.Errorf("最大用户等级不能小于1")
}
log.Printf("最大用户等级已更新: %v -> %d", event.OldValue, newLevel)
// 检查是否有用户等级超过新的最大等级
if err := h.checkAndAdjustUserLevels(newLevel); err != nil {
log.Printf("调整用户等级失败: %v", err)
// 不返回错误,避免阻塞其他处理器
}
return nil
}
// handleRegistrationToggle 处理注册开关变更
func (h *UserConfigHandler) handleRegistrationToggle(event config.ConfigEvent) error {
newValueStr, ok := event.NewValue.(string)
if !ok {
return fmt.Errorf("注册开关配置值类型错误")
}
enabled, err := strconv.ParseBool(newValueStr)
if err != nil {
return fmt.Errorf("注册开关配置值格式错误: %v", err)
}
if enabled {
log.Printf("用户注册已开启")
// 这里可以添加逻辑,比如:
// 1. 清理注册限制缓存
// 2. 发送开放注册通知
// 3. 更新前端注册页面状态
} else {
log.Printf("用户注册已关闭")
// 这里可以添加逻辑,比如:
// 1. 设置注册限制
// 2. 显示注册关闭页面
// 3. 通知相关管理员
}
return nil
}
// checkAndAdjustUserLevels 检查并调整超过最大等级的用户
func (h *UserConfigHandler) checkAndAdjustUserLevels(maxLevel int) error {
db := common.GetDB()
// 查找等级超过最大等级的用户
var highLevelUsers []models.User
err := db.Where("user_level > ?", maxLevel).Find(&highLevelUsers).Error
if err != nil {
return fmt.Errorf("查询高等级用户失败: %v", err)
}
if len(highLevelUsers) == 0 {
log.Printf("没有发现超过最大等级(%d)的用户", maxLevel)
return nil
}
// 批量调整这些用户的等级
result := db.Model(&models.User{}).
Where("user_level > ?", maxLevel).
Update("user_level", maxLevel)
if result.Error != nil {
return fmt.Errorf("批量调整用户等级失败: %v", result.Error)
}
log.Printf("已调整 %d 个用户的等级到最大等级: %d", result.RowsAffected, maxLevel)
// 这里可以添加更多逻辑,比如:
// 1. 发送等级调整通知给用户
// 2. 记录等级变更日志
// 3. 重新计算相关权益
return nil
}