feat: add test VIP card VIP365-0000-0000-0000-0000 and admin set-vip endpoint

This commit is contained in:
2026-05-10 22:19:33 +08:00
parent 1b625c70c6
commit 5b23c88df9
2 changed files with 59 additions and 0 deletions

View File

@@ -59,6 +59,16 @@ async function main() {
{ type: 'YEAR', days: 365, count: 20 }, { type: 'YEAR', days: 365, count: 20 },
]; ];
// 测试卡密 (固定值,方便开发验证)
await prisma.vipCard.create({
data: {
cardKey: 'VIP365-0000-0000-0000-0000',
cardType: 'YEAR',
days: 365,
},
}).catch(() => {});
console.log(`✅ 创建测试卡密: VIP365-0000-0000-0000-0000`);
let totalCards = 0; let totalCards = 0;
for (const config of cardConfigs) { for (const config of cardConfigs) {
const cards = []; const cards = [];

View File

@@ -197,6 +197,55 @@ app.post('/api/adverts/:id/click', (req, res) => {
// 头像列表 // 头像列表
app.get('/api/avatars', (req, res) => { app.get('/api/avatars', (req, res) => {
res.json({ success: true, data: [] }); res.json({ success: true, data: [] });
// 更新服务 (electron-updater)
// ============================================
// 更新配置
app.get('/update-config.json', (req, res) => {
res.json({
version: '7.0.4',
url: '',
notes: '',
mandatory: false,
});
});
// latest.yml (electron-updater 标准格式)
app.get('/latest.yml', (req, res) => {
res.type('text/yaml');
res.send(`version: 7.0.4
files: []
releaseDate: '2024-01-01T00:00:00.000Z'
`);
});
// ============================================
// 开发工具端点 (仅 NODE_ENV=development)
// ============================================
app.post('/api/admin/set-vip', async (req, res) => {
if (process.env.NODE_ENV !== 'development') {
return res.status(403).json({ success: false, message: '仅开发环境可用' });
}
try {
const { username, isVip } = req.body;
if (!username) return res.status(400).json({ success: false, message: '缺少 username' });
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();
const user = await prisma.user.update({
where: { username },
data: {
isVip: isVip !== false,
vipExpireAt: isVip !== false ? new Date(Date.now() + 365 * 24 * 60 * 60 * 1000) : null,
vipLevel: isVip !== false ? 1 : 0,
},
});
await prisma.$disconnect();
res.json({ success: true, username: user.username, isVip: user.isVip });
} catch (e: any) {
res.status(500).json({ success: false, message: e.message });
}
});
}); });
// ============================================ // ============================================