Spaces:
Sleeping
Sleeping
| import { Router, type Response } from 'express'; | |
| import { verifyAdmin } from './auth.js'; | |
| import db from '../lib/db.js'; | |
| import { getQueueStatus } from '../lib/queue.js'; | |
| import { aiCircuitBreaker } from '../lib/circuit-breaker.js'; | |
| const router = Router(); | |
| /** | |
| * 获取所有订单 (管理员) | |
| */ | |
| router.get('/orders', verifyAdmin, (req: any, res) => { | |
| const orders = db.prepare(` | |
| SELECT o.*, u.email as user_email, p.name as product_name | |
| FROM orders o | |
| JOIN users u ON o.user_id = u.id | |
| JOIN products p ON o.product_id = p.id | |
| ORDER BY o.created_at DESC | |
| `).all(); | |
| res.json({ success: true, orders }); | |
| }); | |
| /** | |
| * 获取所有用户 (管理员) | |
| */ | |
| router.get('/users', verifyAdmin, (req: any, res) => { | |
| const users = db.prepare('SELECT id, email, name, role, plan, quota_remaining, created_at FROM users').all(); | |
| res.json({ success: true, users }); | |
| }); | |
| /** | |
| * 更新产品信息 (管理员) | |
| */ | |
| router.post('/products/update', verifyAdmin, (req: any, res) => { | |
| const { id, name, price, stock, description } = req.body; | |
| try { | |
| db.prepare(` | |
| UPDATE products | |
| SET name = ?, price = ?, stock = ?, description = ? | |
| WHERE id = ? | |
| `).run(name, price, stock, description, id); | |
| res.json({ success: true, message: '产品已更新' }); | |
| } catch (err: any) { | |
| res.status(500).json({ success: false, error: err.message }); | |
| } | |
| }); | |
| /** | |
| * 重置产品库存 (管理员) | |
| */ | |
| router.post('/products/reset-stock', verifyAdmin, (req: any, res) => { | |
| const { id, stock = 10 } = req.body; | |
| try { | |
| db.prepare('UPDATE products SET stock = ? WHERE id = ?').run(stock, id); | |
| res.json({ success: true, message: '库存已重置' }); | |
| } catch (err: any) { | |
| res.status(500).json({ success: false, error: err.message }); | |
| } | |
| }); | |
| /** | |
| * 清除审计日志 (管理员) | |
| */ | |
| router.post('/system/clear-logs', verifyAdmin, (req: any, res) => { | |
| try { | |
| db.prepare('DELETE FROM audit_logs').run(); | |
| res.json({ success: true, message: '日志已清除' }); | |
| } catch (err: any) { | |
| res.status(500).json({ success: false, error: err.message }); | |
| } | |
| }); | |
| /** | |
| * 获取所有知识库 (管理员监控) | |
| */ | |
| router.get('/knowledge/all', verifyAdmin, (req: any, res) => { | |
| const kbs = db.prepare(` | |
| SELECT k.*, u.email as user_email | |
| FROM knowledge_bases k | |
| JOIN users u ON k.user_id = u.id | |
| ORDER BY k.created_at DESC | |
| `).all(); | |
| res.json({ success: true, kbs }); | |
| }); | |
| /** | |
| * 获取系统全量指标 (管理员) | |
| */ | |
| router.get('/system/dashboard', verifyAdmin, async (req: any, res) => { | |
| const queueStatus = await getQueueStatus(); | |
| const totalOrders = db.prepare('SELECT count(*) as count FROM orders').get() as any; | |
| const totalRevenue = db.prepare("SELECT sum(amount) as sum FROM orders WHERE status = 'paid'").get() as any; | |
| const activeUsers = db.prepare('SELECT count(*) as count FROM users').get() as any; | |
| // 获取最近 7 天的订单趋势 | |
| const orderTrend = db.prepare(` | |
| SELECT date(created_at) as date, count(*) as count, sum(amount) as revenue | |
| FROM orders | |
| WHERE created_at >= date('now', '-7 days') | |
| GROUP BY date(created_at) | |
| ORDER BY date ASC | |
| `).all(); | |
| res.json({ | |
| success: true, | |
| metrics: { | |
| totalOrders: totalOrders.count, | |
| totalRevenue: totalRevenue.sum || 0, | |
| activeUsers: activeUsers.count, | |
| }, | |
| trend: orderTrend, | |
| queue: queueStatus, | |
| circuitBreaker: aiCircuitBreaker.getStatus(), | |
| }); | |
| }); | |
| export default router; | |