重构 monorepo 并完善网页端订阅与首页体验
- 迁移为 frontend-web、frontend-electron、backend-web 与 docker 部署结构 - 网页端:订阅门禁二次弹窗、套餐/支付组件化、顶栏分组对齐 - 首页:最近文件与模板库布局优化,缩略图对齐,下载与删除操作 - 新增管理后台、支付与云端文件 API,更新 README 与项目规范 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
<?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 SettingsController
|
||||
{
|
||||
public function list(int $adminId): void
|
||||
{
|
||||
$stmt = Db::pdo()->query('SELECT `key`, `value`, updated_at FROM settings ORDER BY `key`');
|
||||
AuditService::log($adminId, 'settings.list', 'settings');
|
||||
Json::ok(['items' => $stmt->fetchAll()]);
|
||||
}
|
||||
|
||||
public function set(int $adminId): void
|
||||
{
|
||||
$body = Json::readBody();
|
||||
$key = (string)($body['key'] ?? '');
|
||||
$value = (string)($body['value'] ?? '');
|
||||
if ($key === '') {
|
||||
Json::fail('bad_request', 'key 必填', 400);
|
||||
}
|
||||
$stmt = Db::pdo()->prepare(
|
||||
'INSERT INTO settings (`key`, `value`, updated_at) VALUES (:k, :v, :ts) '
|
||||
. 'ON DUPLICATE KEY UPDATE `value`=VALUES(`value`), updated_at=VALUES(updated_at)'
|
||||
);
|
||||
$stmt->execute(['k' => $key, 'v' => $value, 'ts' => date('Y-m-d H:i:s')]);
|
||||
AuditService::log($adminId, 'settings.set', 'setting:' . $key, ['value' => $value]);
|
||||
Json::ok(['key' => $key]);
|
||||
}
|
||||
|
||||
public function setBatch(int $adminId): void
|
||||
{
|
||||
$body = Json::readBody();
|
||||
$items = $body['items'] ?? null;
|
||||
if (!is_array($items) || $items === []) {
|
||||
Json::fail('bad_request', 'items 须为非空数组', 400);
|
||||
}
|
||||
$pdo = Db::pdo();
|
||||
$stmt = $pdo->prepare(
|
||||
'INSERT INTO settings (`key`, `value`, updated_at) VALUES (:k, :v, :ts) '
|
||||
. 'ON DUPLICATE KEY UPDATE `value`=VALUES(`value`), updated_at=VALUES(updated_at)'
|
||||
);
|
||||
$saved = [];
|
||||
$now = date('Y-m-d H:i:s');
|
||||
foreach ($items as $item) {
|
||||
if (!is_array($item)) {
|
||||
continue;
|
||||
}
|
||||
$key = trim((string)($item['key'] ?? ''));
|
||||
if ($key === '') {
|
||||
continue;
|
||||
}
|
||||
$value = (string)($item['value'] ?? '');
|
||||
$stmt->execute(['k' => $key, 'v' => $value, 'ts' => $now]);
|
||||
$saved[] = $key;
|
||||
}
|
||||
if ($saved === []) {
|
||||
Json::fail('bad_request', '无有效配置项', 400);
|
||||
}
|
||||
AuditService::log($adminId, 'settings.set_batch', 'settings', ['keys' => $saved]);
|
||||
Json::ok(['keys' => $saved]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user