package user import ( "yunyan/comm" "yunyan/lego/sys/mysql" "yunyan/pb" ) // 新用户开户礼:注册即到账,不需要任何操作。 // // ⚠️ 这是**临时**的拉新政策(2026-08-28 起)。要停掉就把 newUserGiftEnabled 置 false, // 或直接删掉 applyNewUserGift 的调用点(api_sgin.go 里创建用户那一处)。 // // 2026-09 起三个额度桶停用,开户礼改成「VIP 天数 + 算力」(算力归账号、不过期,见 comm/compute.go)。 // 两个数额由**后台「会员与算力」页配置**(comm.LoadOpsParams),改了不用发版; // 配置表里没有这两行时回落到 comm 的默认值(30 天 + 100 算力)。 // // ⚠️ 两项都配 0 = 注册不送任何东西,这是合法配置而不是「没配」——所以 ParseOpsParams // 区分「键不存在」与「值为 0」,别改成 `if v > 0` 那种写法。 const newUserGiftEnabled = true // applyNewUserGift 把开户礼写进尚未落库的新用户对象。 // 只在「用户不存在 → 新建」的分支调用,老用户不受影响。 // // 直接赋值而非累加:这是刚 new 出来的对象,几个额度字段都还是零值。 // p 由调用方传入(comm.LoadOpsParams())而不是在函数里各读一次:发放与流水必须用**同一份快照**, // 否则两次读之间后台改了配置,就会出现「送的是 A、流水记的是 B」的对不上账。 func applyNewUserGift(user *pb.DBUser, now int64, p comm.OpsParams) { if !newUserGiftEnabled || user == nil { return } if p.NewUserGiftVipDays > 0 { user.Vipexptime = now + int64(p.NewUserGiftVipDays)*24*60*60 } user.Computebalance = p.NewUserGiftCompute } // logNewUserGift 记一条活动奖励流水,便于后台对账「送出去多少」。 // 礼包已经随用户一起落库了,这条流水写失败不回滚、只忽略。 func logNewUserGift(uid string, now int64, p comm.OpsParams) { if !newUserGiftEnabled { return } if p.NewUserGiftVipDays == 0 && p.NewUserGiftCompute == 0 { return // 后台配成不送,就别记一条全 0 的流水 } _ = mysql.Insert(comm.TableUserUseLog, &pb.DBUserUseLog{ Uid: uid, Ts: now, Logtype: pb.UserLogType_ActivityReward, Addvipday: int64(p.NewUserGiftVipDays), Compute: p.NewUserGiftCompute, Extra: "new user register gift", }) }