feat(admin): 计费页长出「充值渠道」块 —— 兑换码生成/台账 + 积分包定价
P5.1 收尾:此前生成码只有 API。计费页现在从上到下 = 计费规则(积分→token 汇率) → 充值渠道(钱→积分:兑换码 + 微信定价用的积分包) → 用量观测, 两层汇率在同一页可见、各管各的。 - 兑换码:面额/张数/备注生成;**明文码只在生成响应显示一次**(等同现金, 台账 GET /admin/redeem-codes 服务端脱敏只露首尾,丢码重生成、不提供找回 ——顺手把接口这个第二明文出口堵了);台账含核销状态。 - 积分包:新增/上下架(微信 P5.2 上线前把定价面备好);admin api.ts 补 packs/redeem-codes 四个函数。 - launch.json 加 admin-console-alt(:5176)——5174 被用户自己的 sundynix-site 占着,不动别人端口。 live:5176 登录→生成 5 张(绿色一次性面板+复制全部)→配「入门包 1000分/¥9.9」 在售可下架→台账脱敏 curl 复核;tsc+41 vitest 全绿。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -84,13 +84,20 @@ func (h *Handler) AdminGenRedeemCodes(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, gin.H{"codes": codes})
|
||||
}
|
||||
|
||||
// AdminRedeemCodes: GET /api/v1/admin/redeem-codes —— 兑换码列表(含核销状态)。
|
||||
// AdminRedeemCodes: GET /api/v1/admin/redeem-codes —— 兑换码台账(含核销状态)。
|
||||
// 码在台账里脱敏只露首尾:完整明文只在生成响应里给一次。兑换码等同现金,
|
||||
// 常驻可查的列表接口不该是第二个明文出口(丢了码就重新生成一张,不提供找回)。
|
||||
func (h *Handler) AdminRedeemCodes(c *gin.Context) {
|
||||
rows, err := h.db.ListRedeemCodes(c.Request.Context(), 200)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadGateway, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
for i := range rows {
|
||||
if n := len(rows[i].Code); n > 12 {
|
||||
rows[i].Code = rows[i].Code[:8] + "…" + rows[i].Code[n-4:]
|
||||
}
|
||||
}
|
||||
c.JSON(http.StatusOK, gin.H{"codes": rows})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user