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 }