fix: 修复代理生成卡密权限检查和参数问题

- 后端兼容application_id和app_id参数
- 添加卡类权限检查,确保代理只能生成有权限的卡类
- 前端使用application_id参数名
- 移除卡类显示中的billing_type原始值,改为显示价格

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-10 01:16:28 +08:00
parent e63753a853
commit a2ce784ac0
2 changed files with 32 additions and 4 deletions
+30 -2
View File
@@ -183,6 +183,7 @@ func handleGenerateCards(c *gin.Context) {
var req struct { var req struct {
ApplicationID uint `json:"application_id"` ApplicationID uint `json:"application_id"`
AppID uint `json:"app_id"` // 兼容前端传的app_id
CardTypeID uint `json:"card_type_id"` CardTypeID uint `json:"card_type_id"`
Quantity int `json:"quantity"` Quantity int `json:"quantity"`
} }
@@ -191,16 +192,36 @@ func handleGenerateCards(c *gin.Context) {
return return
} }
// 兼容 app_id 和 application_id
appID := req.ApplicationID
if appID == 0 {
appID = req.AppID
}
var agentApp model.AgentApplication var agentApp model.AgentApplication
if err := database.DB.Where("agent_id = ? AND application_id = ?", userID, req.ApplicationID).First(&agentApp).Error; err != nil { if err := database.DB.Where("agent_id = ? AND application_id = ?", userID, appID).First(&agentApp).Error; err != nil {
response.Error(c, 403, "无权操作该应用") response.Error(c, 403, "无权操作该应用")
return return
} }
// 检查代理是否有该卡类的生成权限
var agentCardType model.AgentApplicationCardType
if err := database.DB.Where("agent_application_id = ? AND card_type_id = ? AND can_generate = ?", agentApp.ID, req.CardTypeID, true).First(&agentCardType).Error; err != nil {
response.Error(c, 403, "无权生成该卡类")
return
}
// 获取卡类信息以计算价格
var cardType model.CardType
if err := database.DB.First(&cardType, req.CardTypeID).Error; err != nil {
response.Error(c, 404, "卡类不存在")
return
}
cards := make([]model.Card, req.Quantity) cards := make([]model.Card, req.Quantity)
for i := 0; i < req.Quantity; i++ { for i := 0; i < req.Quantity; i++ {
cards[i] = model.Card{ cards[i] = model.Card{
ApplicationID: req.ApplicationID, ApplicationID: appID,
CardTypeID: req.CardTypeID, CardTypeID: req.CardTypeID,
CardKey: generateCardCode(), CardKey: generateCardCode(),
CreatorID: userID, CreatorID: userID,
@@ -213,8 +234,15 @@ func handleGenerateCards(c *gin.Context) {
return return
} }
// 返回生成的卡号
codes := make([]string, req.Quantity)
for i, card := range cards {
codes[i] = card.CardKey
}
response.Success(c, gin.H{ response.Success(c, gin.H{
"count": req.Quantity, "count": req.Quantity,
"codes": codes,
}) })
} }
+2 -2
View File
@@ -104,7 +104,7 @@ async function handleGenerate() {
saving.value = true saving.value = true
try { try {
const data = await api.post<{ codes: string[], cards: any[] }>('/agent/cards/generate', { const data = await api.post<{ codes: string[], cards: any[] }>('/agent/cards/generate', {
app_id: Number(form.value.application_id), application_id: Number(form.value.application_id),
card_type_id: Number(form.value.card_type_id), card_type_id: Number(form.value.card_type_id),
quantity: form.value.count, quantity: form.value.count,
}) })
@@ -178,7 +178,7 @@ onMounted(() => {
</UiSelectTrigger> </UiSelectTrigger>
<UiSelectContent> <UiSelectContent>
<UiSelectItem v-for="type in cardTypes" :key="type.id" :value="String(type.id)"> <UiSelectItem v-for="type in cardTypes" :key="type.id" :value="String(type.id)">
{{ type.name }}<template v-if="type.billing_type"> ({{ type.billing_type }})</template> {{ type.name }} - ¥{{ type.price }}
</UiSelectItem> </UiSelectItem>
</UiSelectContent> </UiSelectContent>
</UiSelect> </UiSelect>