- 后端: users表新增VIP字段, 4个VIP API (purchase/status/profile/members) - 后端: hot接口改按user_tracks阅读量排序 - 后端: orders表支持vip产品类型, migrate新增vip_fields迁移 - 小程序「我的」: 推广中心改为我的收益, 头像VIP标识, VIP入口卡片 - 小程序「我的」: 最近阅读显示真实章节名称 - 小程序首页: 去掉内容概览, 新增创业老板排行(4列网格) - 小程序首页: 精选推荐从hot接口获取, goToRead增加track记录 - 新增页面: VIP详情页, 会员详情页 - 开发文档精简为10个标准目录, 创建SKILL.md, 需求日志规范化 Co-authored-by: Cursor <cursoragent@cursor.com>
68 lines
2.1 KiB
TypeScript
68 lines
2.1 KiB
TypeScript
/**
|
||
* VIP会员列表 - 用于「创业老板排行」展示
|
||
*/
|
||
import { NextRequest, NextResponse } from 'next/server'
|
||
import { query } from '@/lib/db'
|
||
|
||
export async function GET(request: NextRequest) {
|
||
const limit = parseInt(new URL(request.url).searchParams.get('limit') || '20')
|
||
const memberId = new URL(request.url).searchParams.get('id')
|
||
|
||
try {
|
||
// 查询单个会员详情
|
||
if (memberId) {
|
||
const rows = await query(
|
||
`SELECT id, nickname, avatar, vip_name, vip_project, vip_contact, vip_avatar, vip_bio,
|
||
is_vip, vip_expire_date, created_at
|
||
FROM users WHERE id = ? AND is_vip = TRUE AND vip_expire_date > NOW()`,
|
||
[memberId]
|
||
) as any[]
|
||
|
||
if (!rows.length) {
|
||
return NextResponse.json({ success: false, error: '会员不存在或已过期' }, { status: 404 })
|
||
}
|
||
|
||
const m = rows[0]
|
||
return NextResponse.json({
|
||
success: true,
|
||
data: {
|
||
id: m.id,
|
||
name: m.vip_name || m.nickname || '创业者',
|
||
avatar: m.vip_avatar || m.avatar || '',
|
||
project: m.vip_project || '',
|
||
contact: m.vip_contact || '',
|
||
bio: m.vip_bio || '',
|
||
joinDate: m.created_at
|
||
}
|
||
})
|
||
}
|
||
|
||
// 获取VIP会员列表(已填写资料的优先排前面)
|
||
const members = await query(
|
||
`SELECT id, nickname, avatar, vip_name, vip_project, vip_avatar, vip_bio
|
||
FROM users
|
||
WHERE is_vip = TRUE AND vip_expire_date > NOW()
|
||
ORDER BY
|
||
CASE WHEN vip_name IS NOT NULL AND vip_name != '' THEN 0 ELSE 1 END,
|
||
vip_expire_date DESC
|
||
LIMIT ?`,
|
||
[limit]
|
||
) as any[]
|
||
|
||
return NextResponse.json({
|
||
success: true,
|
||
data: members.map((m: any) => ({
|
||
id: m.id,
|
||
name: m.vip_name || m.nickname || '创业者',
|
||
avatar: m.vip_avatar || m.avatar || '',
|
||
project: m.vip_project || '',
|
||
bio: m.vip_bio || ''
|
||
})),
|
||
total: members.length
|
||
})
|
||
} catch (error) {
|
||
console.error('[VIP Members]', error)
|
||
return NextResponse.json({ success: false, error: '查询失败', data: [], total: 0 })
|
||
}
|
||
}
|