182 lines
5.0 KiB
Go
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
|
|
} |