2026-01-14 12:50:00 +08:00
|
|
|
|
// app/api/admin/route.ts
|
2026-01-31 23:25:14 +08:00
|
|
|
|
// 后台管理API入口:登录与鉴权(账号密码从环境变量读取,默认 admin / admin123)
|
2026-01-14 12:50:00 +08:00
|
|
|
|
|
|
|
|
|
|
import { NextRequest, NextResponse } from 'next/server'
|
2026-01-31 23:25:14 +08:00
|
|
|
|
import {
|
|
|
|
|
|
verifyAdminToken,
|
|
|
|
|
|
getAdminTokenFromRequest,
|
|
|
|
|
|
verifyAdminCredentials,
|
|
|
|
|
|
getAdminCredentials,
|
|
|
|
|
|
createAdminToken,
|
|
|
|
|
|
getAdminCookieName,
|
|
|
|
|
|
getAdminCookieOptions,
|
|
|
|
|
|
} from '@/lib/admin-auth'
|
2026-01-14 12:50:00 +08:00
|
|
|
|
|
2026-01-31 23:25:14 +08:00
|
|
|
|
function requireAdmin(req: NextRequest): boolean {
|
|
|
|
|
|
const token = getAdminTokenFromRequest(req)
|
|
|
|
|
|
return verifyAdminToken(token)
|
2026-01-14 12:50:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-31 23:25:14 +08:00
|
|
|
|
// GET: 获取后台概览数据(需已登录)
|
2026-01-14 12:50:00 +08:00
|
|
|
|
export async function GET(req: NextRequest) {
|
2026-01-31 23:25:14 +08:00
|
|
|
|
if (!requireAdmin(req)) {
|
2026-01-14 12:50:00 +08:00
|
|
|
|
return NextResponse.json(
|
2026-01-31 23:25:14 +08:00
|
|
|
|
{ error: '未授权访问,请先登录' },
|
2026-01-14 12:50:00 +08:00
|
|
|
|
{ status: 401 }
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取所有模块的概览数据
|
|
|
|
|
|
const overview = {
|
|
|
|
|
|
content: {
|
|
|
|
|
|
totalChapters: 65,
|
|
|
|
|
|
totalWords: 120000,
|
|
|
|
|
|
publishedChapters: 60,
|
|
|
|
|
|
draftChapters: 5,
|
|
|
|
|
|
lastUpdate: new Date().toISOString()
|
|
|
|
|
|
},
|
|
|
|
|
|
payment: {
|
|
|
|
|
|
totalRevenue: 12800.50,
|
|
|
|
|
|
todayRevenue: 560.00,
|
|
|
|
|
|
totalOrders: 128,
|
|
|
|
|
|
todayOrders: 12,
|
|
|
|
|
|
averagePrice: 100.00
|
|
|
|
|
|
},
|
|
|
|
|
|
referral: {
|
|
|
|
|
|
totalReferrers: 45,
|
|
|
|
|
|
activeReferrers: 28,
|
|
|
|
|
|
totalCommission: 11520.45,
|
|
|
|
|
|
paidCommission: 8500.00,
|
|
|
|
|
|
pendingCommission: 3020.45
|
|
|
|
|
|
},
|
|
|
|
|
|
users: {
|
|
|
|
|
|
totalUsers: 1200,
|
|
|
|
|
|
purchasedUsers: 128,
|
|
|
|
|
|
activeUsers: 456,
|
|
|
|
|
|
todayNewUsers: 23
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return NextResponse.json(overview)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-31 23:25:14 +08:00
|
|
|
|
// POST: 管理员登录(账号密码从环境变量 ADMIN_USERNAME / ADMIN_PASSWORD 读取,默认 admin / admin123)
|
2026-01-14 12:50:00 +08:00
|
|
|
|
export async function POST(req: NextRequest) {
|
|
|
|
|
|
const body = await req.json()
|
|
|
|
|
|
const { username, password } = body
|
|
|
|
|
|
|
2026-01-31 23:25:14 +08:00
|
|
|
|
if (!username || !password) {
|
|
|
|
|
|
return NextResponse.json(
|
|
|
|
|
|
{ error: '请输入用户名和密码' },
|
|
|
|
|
|
{ status: 400 }
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!verifyAdminCredentials(String(username).trim(), String(password))) {
|
|
|
|
|
|
return NextResponse.json(
|
|
|
|
|
|
{ error: '用户名或密码错误' },
|
|
|
|
|
|
{ status: 401 }
|
|
|
|
|
|
)
|
2026-01-14 12:50:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-31 23:25:14 +08:00
|
|
|
|
const token = createAdminToken()
|
|
|
|
|
|
const res = NextResponse.json({
|
|
|
|
|
|
success: true,
|
|
|
|
|
|
user: { id: 'admin', username: getAdminCredentials().username, role: 'admin', name: '卡若' },
|
|
|
|
|
|
})
|
|
|
|
|
|
const opts = getAdminCookieOptions()
|
|
|
|
|
|
res.cookies.set(getAdminCookieName(), token, opts)
|
|
|
|
|
|
return res
|
2026-01-14 12:50:00 +08:00
|
|
|
|
}
|