Files
pk10/App/Controllers/Admin/SettingsController.php
T
li 4a94fe36cf feat: 重构代码架构 + 新增报表/跟单/输赢统计功能
- 拆分 HomeController → TransactionController, ReportWebController, FollowPlanController
- 新增 Service 层: TransactionService, ReportService, FollowPlanService
- pk10.php JS 抽离为 4 个独立文件 (sound/race/bet/poll)
- 前台新增报表查询页面 (/report) + 跟单计划页面 (/follow-plan)
- 后台新增跟单计划管理 + 用户输赢明细统计
- 封盘状态显示倒计时 (x:xx)
- 音效仅在开奖弹窗打开时播放
- 路由按模块分组整理
- autoload 支持 App\Services 命名空间
2026-03-27 18:41:06 +08:00

275 lines
8.4 KiB
PHP
Executable File
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.
<?php
namespace App\Controllers\Admin;
use App\Core\AdminBaseController;
use Db\Database;
use \Exception;
class SettingsController extends AdminBaseController {
protected $db;
protected $uploadConfig;
public function __construct() {
$this->checkLogin();
$this->db = new Database();
$this->initSettingsTable();
$this->uploadConfig = [
'upload_dir' => dirname(dirname(dirname(__DIR__))) . '/Static/img/',
'max_size' => 5 * 1024 * 1024, // 5MB
'allowed_mimes' => [
'image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/x-icon', 'image/vnd.microsoft.icon'
]
];
}
/**
* 初始化系统设置表
*/
private function initSettingsTable() {
try {
$this->db->query("
CREATE TABLE IF NOT EXISTS `system_settings` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`setting_key` varchar(100) NOT NULL,
`setting_value` text,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_setting_key` (`setting_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
");
} catch (Exception $e) {
// 表已存在或其他错误,忽略
}
}
/**
* 系统设置页面
*/
public function index() {
$settings = $this->getAllSettings();
$this->render('Admin/settings.php', [
'title' => '系统设置',
'settings' => $settings
]);
}
/**
* 获取所有设置
*/
public function get() {
header('Content-Type: application/json');
try {
$settings = $this->getAllSettings();
echo json_encode([
'status' => 'success',
'data' => $settings
]);
exit;
} catch (Exception $e) {
$this->jsonError('获取设置失败: ' . $e->getMessage());
}
}
/**
* 保存系统设置
*/
public function save() {
header('Content-Type: application/json');
$this->checkAdmin();
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
$this->jsonError('仅支持POST请求');
}
try {
$data = json_decode(file_get_contents('php://input'), true);
if (!$data) {
$data = $_POST;
}
// 处理logo上传(只支持site_logo和site_favicon
$logoTypes = ['site_logo', 'site_favicon'];
foreach ($logoTypes as $logoType) {
$fileKey = $logoType . '_file';
if (isset($_FILES[$fileKey]) && $_FILES[$fileKey]['error'] === UPLOAD_ERR_OK) {
$_POST['logo_type'] = $logoType;
$logoUrl = $this->handleLogoUpload($_FILES[$fileKey]);
$this->saveSetting($logoType, $logoUrl);
}
}
// 保存其他设置
$allowedKeys = [
'site_title', 'site_description', 'site_keywords',
'site_logo', 'site_favicon', 'site_copyright',
'smtp_host', 'smtp_port', 'smtp_user', 'smtp_pass',
'smtp_from', 'smtp_from_name', 'smtp_encryption',
'customer_service_url',
];
foreach ($allowedKeys as $key) {
if (isset($data[$key])) {
$this->saveSetting($key, $data[$key]);
}
}
// 清除SettingsHelper缓存
\App\Core\SettingsHelper::clearCache();
echo json_encode([
'status' => 'success',
'message' => '设置保存成功',
'data' => $this->getAllSettings()
]);
exit;
} catch (Exception $e) {
$this->jsonError('保存设置失败: ' . $e->getMessage());
}
}
/**
* 处理logo上传
*/
private function handleLogoUpload($file) {
// 验证文件大小
if ($file['size'] > $this->uploadConfig['max_size']) {
throw new Exception('文件过大,最大支持5MB');
}
// 验证文件类型
$finfo = new \finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file($file['tmp_name']);
if (!in_array($mime, $this->uploadConfig['allowed_mimes'])) {
throw new Exception('不支持的文件类型,仅允许: JPG, PNG, GIF, WEBP, ICO');
}
// 确保上传目录存在
$uploadDir = rtrim($this->uploadConfig['upload_dir'], '/') . '/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
// 生成文件名
$originalName = basename($file['name']);
$originalExt = pathinfo($originalName, PATHINFO_EXTENSION);
$filename = 'logo_' . date('YmdHis') . '_' . uniqid() . '.' . $originalExt;
$targetPath = $uploadDir . $filename;
// 移动文件
if (!move_uploaded_file($file['tmp_name'], $targetPath)) {
throw new Exception('文件上传失败');
}
// 返回相对路径(不含域名,兼容任何域名/端口)
return '/Static/img/' . $filename;
}
/**
* 获取单个设置值
*/
private function getSetting($key, $default = '') {
try {
$setting = $this->db->get('system_settings', 'setting_value', [
'setting_key' => $key
]);
return $setting !== false ? $setting : $default;
} catch (Exception $e) {
return $default;
}
}
/**
* 保存单个设置
*/
private function saveSetting($key, $value) {
try {
$existing = $this->db->get('system_settings', 'id', [
'setting_key' => $key
]);
if ($existing) {
// 更新
$this->db->update('system_settings', [
'setting_value' => $value
], [
'setting_key' => $key
]);
} else {
// 插入
$this->db->insert('system_settings', [
'setting_key' => $key,
'setting_value' => $value
]);
}
} catch (Exception $e) {
throw new Exception('保存设置失败: ' . $e->getMessage());
}
}
/**
* 获取所有设置(以关联数组形式返回)
*/
private function getAllSettings() {
try {
$settings = $this->db->select('system_settings', ['setting_key', 'setting_value']);
$result = [];
foreach ($settings as $setting) {
$result[$setting['setting_key']] = $setting['setting_value'];
}
// 设置默认值
$defaults = [
'site_title' => 'Tài Xỉu Online - TM68',
'site_description' => 'Trang game tài xỉu đổi thưởng, nạp rút nhanh chóng',
'site_keywords' => 'tài xỉu, game online, đổi thưởng',
'site_logo' => '/Static/tm68/logo_tm68.png.png',
'site_favicon' => '/Static/css/favicon.ico',
'site_copyright' => '© 2024 TM68. All rights reserved.'
];
foreach ($defaults as $key => $default) {
if (!isset($result[$key])) {
$result[$key] = $default;
}
}
return $result;
} catch (Exception $e) {
return [];
}
}
/**
* SMTP 测试发信
*/
public function smtpTest() {
header('Content-Type: application/json');
$this->checkAdmin();
$data = json_decode(file_get_contents('php://input'), true);
$email = trim($data['email'] ?? '');
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->jsonError('Invalid email');
}
\App\Core\SettingsHelper::clearCache();
$result = \App\Core\Mailer::test($email);
echo json_encode($result);
exit;
}
/**
* JSON错误响应
*/
private function jsonError($message) {
echo json_encode([
'status' => 'error',
'message' => $message
]);
exit;
}
}