重构 monorepo 并完善网页端订阅与首页体验

- 迁移为 frontend-web、frontend-electron、backend-web 与 docker 部署结构
- 网页端:订阅门禁二次弹窗、套餐/支付组件化、顶栏分组对齐
- 首页:最近文件与模板库布局优化,缩略图对齐,下载与删除操作
- 新增管理后台、支付与云端文件 API,更新 README 与项目规范

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
24kycj
2026-06-08 18:17:39 +08:00
parent 5814b7bc0e
commit 88c6ce8ccc
511 changed files with 189528 additions and 22804 deletions
@@ -0,0 +1,48 @@
<?php
declare(strict_types=1);
namespace Soon\Api\Admin\Controllers;
use Soon\Api\Core\Db;
use Soon\Api\Core\Json;
use Soon\Api\Services\AuditService;
final class StatsController
{
public function summary(int $adminId): void
{
$pdo = Db::pdo();
AuditService::log($adminId, 'stats.summary', 'dashboard');
$recentStmt = $pdo->query(
'SELECT o.id, o.order_no, o.amount_cents, o.status, o.created_at, u.email '
. 'FROM pay_orders o LEFT JOIN users u ON u.id = o.user_id '
. 'ORDER BY o.id DESC LIMIT 5'
);
Json::ok([
'users' => (int)$pdo->query('SELECT COUNT(*) FROM users')->fetchColumn(),
'orders' => (int)$pdo->query('SELECT COUNT(*) FROM pay_orders')->fetchColumn(),
'orders_today' => (int)$pdo->query(
"SELECT COUNT(*) FROM pay_orders WHERE DATE(created_at) = CURDATE()"
)->fetchColumn(),
'orders_pending' => (int)$pdo->query(
"SELECT COUNT(*) FROM pay_orders WHERE status = 'pending'"
)->fetchColumn(),
'refunds_pending' => (int)$pdo->query(
"SELECT COUNT(*) FROM pay_orders WHERE refund_status = 'pending'"
)->fetchColumn(),
'active_subscriptions' => (int)$pdo->query(
"SELECT COUNT(*) FROM subscriptions WHERE status = 'active'"
)->fetchColumn(),
'files_total' => (int)$pdo->query(
'SELECT COUNT(*) FROM soon_files WHERE deleted_at IS NULL'
)->fetchColumn(),
'revenue_today_cents' => (int)$pdo->query(
"SELECT COALESCE(SUM(amount_cents), 0) FROM pay_orders "
. "WHERE status = 'paid' AND paid_at IS NOT NULL AND DATE(paid_at) = CURDATE()"
)->fetchColumn(),
'recent_orders' => $recentStmt->fetchAll(),
]);
}
}