feat: 简化为'每天5次免费→充值星尘'模型——问答免费优先星尘扣减(10/次)+充值引导弹窗+我的页星尘余额卡(去掉免费/Pro分层)
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user