feat: 简化为'每天5次免费→充值星尘'模型——问答免费优先星尘扣减(10/次)+充值引导弹窗+我的页星尘余额卡(去掉免费/Pro分层)

This commit is contained in:
2026-09-14 11:07:19 +08:00
parent 3777f67af6
commit d44893d78d
3 changed files with 87 additions and 35 deletions
+22 -5
View File
@@ -1,6 +1,6 @@
const express = require('express')
const router = express.Router()
const { AIChatQuota, AIModel } = require('../models')
const { AIChatQuota, AIModel, User } = require('../models')
const ApiResponse = require('../utils/response')
const { userAuthMiddleware, optionalAuthMiddleware } = require('../middleware/auth')
const logger = require('../utils/logger')
@@ -81,10 +81,27 @@ router.post('/ask', askRateLimit, optionalAuthMiddleware, async (req, res) => {
const quota = await getOrCreateQuota(openid, isGuest)
if (!quota.hasQuota()) {
const msg = isGuest
? `今日 ${GUEST_DAILY_QUOTA} 次游客体验已用完,登录后每天可问 5 次`
: '今日问答次数已用完,分享好友可获得更多次数'
return ApiResponse.error(res, msg, 403, { isGuest, needLogin: isGuest })
if (isGuest) {
return ApiResponse.error(res, `今日 ${GUEST_DAILY_QUOTA} 次游客体验已用完,登录后每天可问 5 次`, 403, { isGuest, needLogin: true })
}
// 免费额度用完 → 检查星尘余额,有则扣星尘(10星尘/次)
const user = await User.findOne({ openid })
const coins = (user && user.vpayCoins) || 0
if (coins < 10) {
return ApiResponse.error(res, '今日免费次数已用完,充值星尘可继续提问(10星尘/次)', 402, { needRecharge: true, coins, costPerAsk: 10 })
}
// 扣星尘(原子操作防并发)
const updated = await User.updateOne({ _id: user._id, vpayCoins: { $gte: 10 } }, { $inc: { vpayCoins: -10 } })
if (updated.modifiedCount === 0) {
return ApiResponse.error(res, '星尘余额不足,请充值后继续', 402, { needRecharge: true })
}
// 跳过正常 quota 扣减,直接用星尘
const aiModels2 = await AIModel.getActiveModels()
if (!aiModels2 || aiModels2.length === 0) {
const env2 = [{ name: 'env-model', apiUrl: process.env.OPENAI_API_URL || 'https://api.openai.com/v1/chat/completions', apiKey: process.env.OPENAI_API_KEY, modelId: process.env.OPENAI_MODEL || 'gpt-3.5-turbo' }]
return await tryModels(env2, question, dimension, res, quota, isGuest)
}
return await tryModels(aiModels2, question, dimension, res, quota, isGuest)
}
const aiModels = await AIModel.getActiveModels()