Files
soul-yongping/next-project/app/api/referral/visit/route.ts
2026-02-09 14:43:35 +08:00

101 lines
3.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 推荐访问记录API
* 用于统计「通过链接进的人数」
* 不需要用户登录即可记录
*/
import { NextRequest, NextResponse } from 'next/server'
import { query } from '@/lib/db'
/**
* POST - 记录推荐访问
*/
export async function POST(request: NextRequest) {
try {
const body = await request.json()
const { referralCode, visitorOpenId, visitorId, source, page } = body
if (!referralCode) {
return NextResponse.json({
success: false,
error: '推荐码不能为空'
}, { status: 400 })
}
// 查找推荐人
const referrers = await query(
'SELECT id FROM users WHERE referral_code = ?',
[referralCode]
) as any[]
if (referrers.length === 0) {
return NextResponse.json({
success: false,
error: '推荐码无效'
}, { status: 400 })
}
const referrerId = referrers[0].id
// 记录访问(允许重复访问记录,用于统计总访问次数)
try {
await query(`
INSERT INTO referral_visits (
referrer_id, visitor_id, visitor_openid, source, page, created_at
) VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
`, [
referrerId,
visitorId || null,
visitorOpenId || null,
source || 'miniprogram',
page || ''
])
console.log(`[Referral Visit] 记录访问: 推荐人=${referrerId}, 访客openId=${visitorOpenId?.slice(0,10) || 'unknown'}`)
} catch (insertError) {
// 表可能不存在,尝试创建
console.log('[Referral Visit] 插入失败,尝试创建表...')
await query(`
CREATE TABLE IF NOT EXISTS referral_visits (
id INT AUTO_INCREMENT PRIMARY KEY,
referrer_id VARCHAR(50) NOT NULL COMMENT '推广者ID',
visitor_id VARCHAR(50) COMMENT '访客ID可能为空',
visitor_openid VARCHAR(100) COMMENT '访客openId',
source VARCHAR(50) DEFAULT 'miniprogram' COMMENT '来源miniprogram/web/share',
page VARCHAR(200) COMMENT '落地页路径',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_referrer_id (referrer_id),
INDEX idx_visitor_id (visitor_id),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
`)
// 重试插入
await query(`
INSERT INTO referral_visits (
referrer_id, visitor_id, visitor_openid, source, page, created_at
) VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
`, [
referrerId,
visitorId || null,
visitorOpenId || null,
source || 'miniprogram',
page || ''
])
}
return NextResponse.json({
success: true,
message: '访问已记录'
})
} catch (error) {
console.error('[Referral Visit] 错误:', error)
// 即使出错也返回成功,不影响用户体验
return NextResponse.json({
success: true,
message: '已处理'
})
}
}