From 5b23c88df9bd8d56a9758a4fb807b680c59c14a6 Mon Sep 17 00:00:00 2001 From: gch3n Date: Sun, 10 May 2026 22:19:33 +0800 Subject: [PATCH] feat: add test VIP card VIP365-0000-0000-0000-0000 and admin set-vip endpoint --- prisma/seed.ts | 10 ++++++++++ src/index.ts | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/prisma/seed.ts b/prisma/seed.ts index 5cd6cea..3b9847e 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -59,6 +59,16 @@ async function main() { { 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; for (const config of cardConfigs) { const cards = []; diff --git a/src/index.ts b/src/index.ts index 3b17abc..7659f1d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -197,6 +197,55 @@ app.post('/api/adverts/:id/click', (req, res) => { // 头像列表 app.get('/api/avatars', (req, res) => { 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 }); + } +}); }); // ============================================