From e249aa56e7fd7b5e6114202794d7c071e8bc4f44 Mon Sep 17 00:00:00 2001 From: Stevenma <3296308883@qq.com> Date: Sun, 10 May 2026 14:50:42 +0800 Subject: [PATCH] fix: VIP activation not reflecting due to stale session-status token; add missing routes --- src/index.ts | 45 ++++++++++++++++++++++++++++++++--- src/routes/auth.ts | 55 ++++++++++++++++++++++++++++++++++++++----- src/routes/filters.ts | 40 +++++++++++++++++++++++++++++++ src/routes/vip.ts | 11 +++++++++ 4 files changed, 142 insertions(+), 9 deletions(-) diff --git a/src/index.ts b/src/index.ts index aa6fee0..2f1df41 100644 --- a/src/index.ts +++ b/src/index.ts @@ -91,9 +91,25 @@ app.get('/api/qrcode/public/current', (req, res) => { res.json({ success: true, data: { qrcode: null, url: '' } }); }); -// 弹窗 -app.get('/api/popups/', (req, res) => { - res.json({ success: true, data: [] }); +// 弹窗 (通用参数化路由) +app.get('/api/popups/:name', (req, res) => { + const { name } = req.params; + const popups: Record = { + test_beta_01: { id: 'test_beta_01', title: '测试弹窗', content: '', shown: false }, + }; + res.json({ success: true, data: popups[name] ?? null }); +}); + +// 嘉豪弹窗 +app.get('/api/jiahao', (req, res) => { + res.json({ + success: true, + data: { + enabled: false, + message: '', + imageUrl: '', + }, + }); }); // 售后教程弹窗 @@ -172,6 +188,29 @@ 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' +`); +}); + // ============================================ // 错误处理 // ============================================ diff --git a/src/routes/auth.ts b/src/routes/auth.ts index 328fc63..d97a0bc 100644 --- a/src/routes/auth.ts +++ b/src/routes/auth.ts @@ -211,14 +211,57 @@ router.post('/login', async (req: Request, res: Response) => { }); // ============================================ -// 会话状态 +// 会话状态 (从数据库查询最新状态,避免 token 缓存导致 isVip 过期) // ============================================ router.get('/session-status', authMiddleware, async (req: Request, res: Response) => { - res.json({ - success: true, - valid: true, - user: req.user, - }); + try { + const user = await prisma.user.findUnique({ + where: { id: req.user!.userId }, + select: { + id: true, + username: true, + email: true, + avatar: true, + isVip: true, + vipExpireAt: true, + vipLevel: true, + }, + }); + + if (!user) { + return res.status(401).json({ + success: false, + message: '用户不存在', + code: 'USER_NOT_FOUND', + }); + } + + // 检查 VIP 是否过期 + let isVip = user.isVip; + if (user.vipExpireAt && new Date() > user.vipExpireAt) { + isVip = false; + await prisma.user.update({ + where: { id: user.id }, + data: { isVip: false }, + }); + } + + res.json({ + success: true, + valid: true, + user: { + userId: user.id, + username: user.username, + email: user.email, + avatar: user.avatar, + isVip, + vipLevel: user.vipLevel, + }, + }); + } catch (error) { + console.error('Session status error:', error); + res.status(500).json({ success: false, message: '获取会话状态失败' }); + } }); // ============================================ diff --git a/src/routes/filters.ts b/src/routes/filters.ts index fca6026..583262a 100644 --- a/src/routes/filters.ts +++ b/src/routes/filters.ts @@ -100,6 +100,46 @@ router.post('/', authMiddleware, async (req: Request, res: Response) => { } }); +// ============================================ +// 更新滤镜 (PUT) +// ============================================ +router.put('/:id', authMiddleware, async (req: Request, res: Response) => { + try { + const { id } = req.params; + const { title, description, category, filterContent, contentFormat = 'MQTS1', brand, author } = req.body; + + const filter = await prisma.filterShare.findUnique({ + where: { id }, + select: { userId: true }, + }); + + if (!filter) { + return res.status(404).json({ success: false, message: '滤镜不存在' }); + } + + if (filter.userId !== req.user!.userId) { + return res.status(403).json({ success: false, message: '无权修改此滤镜' }); + } + + const updateData: any = {}; + if (title !== undefined) updateData.title = title; + if (description !== undefined) updateData.description = description; + if (category !== undefined) updateData.category = category; + if (filterContent !== undefined) updateData.filterContent = filterContent; + if (contentFormat !== undefined) updateData.contentFormat = contentFormat; + + const updated = await prisma.filterShare.update({ + where: { id }, + data: updateData, + }); + + res.json({ success: true, message: '滤镜已更新', data: updated }); + } catch (error) { + console.error('Update filter_share error:', error); + res.status(500).json({ success: false, message: '更新失败' }); + } +}); + // ============================================ // 删除滤镜 // ============================================ diff --git a/src/routes/vip.ts b/src/routes/vip.ts index a74174a..aec7222 100644 --- a/src/routes/vip.ts +++ b/src/routes/vip.ts @@ -2,6 +2,7 @@ import { Router, Request, Response } from 'express'; import { PrismaClient } from '@prisma/client'; import { z } from 'zod'; import { authMiddleware } from '../middleware/auth'; +import { generateToken } from '../utils/jwt'; const router = Router(); const prisma = new PrismaClient(); @@ -89,8 +90,18 @@ router.post('/activate-vip', authMiddleware, async (req: Request, res: Response) }, }); + // 生成新 token(包含最新的 VIP 状态) + const token = generateToken({ + userId: updatedUser.id, + username: updatedUser.username, + email: updatedUser.email, + isVip: true, + vipLevel: updatedUser.vipLevel, + }); + res.json({ success: true, + token, isVip: true, vipExpireAt: newExpireAt, vipLevel: updatedUser.vipLevel,