admin.php中无法设置打开email页面
<?php
session_start();

require_once '../config.php';
require_once 'download_images.php';

if (empty($_SESSION['admin']['id'])) {
    header("Location: admin_login.php");
    exit;
}
$_SESSION['admin']['last_act'] = time();

$session_admin_id = (int)$_SESSION['admin']['id'];

try {
    $auth_stmt = $pdo->prepare("SELECT id, username, email FROM admins WHERE id = ? LIMIT 1");
    $auth_stmt->execute([$session_admin_id]);
    $current_admin = $auth_stmt->fetch(PDO::FETCH_ASSOC);

    if (!$current_admin) {
        unset($_SESSION['admin']);
        header("Location: admin_login.php?error=" . urlencode("账号不存在或已被撤销！"));
        exit;
    }
    $_SESSION['admin']['username'] = $current_admin['username'];
} catch (PDOException $e) {
    die("系统异常，服务暂时不可用。");
}

function sanitizeString($input, $maxLength = 255) {
    $str = trim((string)$input);
    return mb_substr($str, 0, $maxLength, 'UTF-8');
}

function safeUrl($url) {
    return trim((string)$url);
}

function e($str) {
    return htmlspecialchars((string)$str, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}

function cleanUnusedImages($oldContent, $newContent, $pdo) {
    preg_match_all('/\/uploads\/img\/([a-zA-Z0-9_\-]+\.(?:jpg|jpeg|png|gif|webp))/i', $oldContent, $oldMatches);
    preg_match_all('/\/uploads\/img\/([a-zA-Z0-9_\-]+\.(?:jpg|jpeg|png|gif|webp))/i', $newContent, $newMatches);

    $oldImages = array_unique($oldMatches[1] ?? []);
    $newImages = array_unique($newMatches[1] ?? []);

    $removedImages = array_diff($oldImages, $newImages);

    foreach ($removedImages as $imgName) {
        $stmt = $pdo->prepare("SELECT COUNT(*) FROM posts WHERE content LIKE ?");
        $stmt->execute(['%' . $imgName . '%']);
        $count = $stmt->fetchColumn();

        if ($count == 0) {
            $filePath = __DIR__ . '/../uploads/img/' . $imgName;
            if (file_exists($filePath)) {
                @unlink($filePath);
            }
        }
    }
}

$msg = $_SESSION['admin_msg'] ?? '';
$msg_type = $_SESSION['admin_msg_type'] ?? 'success';
unset($_SESSION['admin_msg'], $_SESSION['admin_msg_type']);

$allowed_tabs = ['dashboard', 'posts', 'new_post', 'categories', 'users', 'comments', 'settings', 'ad_settings', 'menus', 'admins'];
$tab = sanitizeString($_GET['tab'] ?? 'dashboard', 30);
if (!in_array($tab, $allowed_tabs, true)) {
    $tab = 'dashboard';
}

function getIpLocation($ip) {
    static $cache = [];
    $ip = trim((string)$ip);

    if (empty($ip)) return '未知 IP';
    if (isset($cache[$ip])) return $cache[$ip];

    if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
        return $cache[$ip] = '本地局域网 / 本机';
    }

    $ch = curl_init("http://ip-api.com/json/" . urlencode($ip) . "?lang=zh-CN");
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 3,
        CURLOPT_CONNECTTIMEOUT => 2,
        CURLOPT_USERAGENT      => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
        CURLOPT_FOLLOWLOCATION => true
    ]);
    $response = curl_exec($ch);
    curl_close($ch);

    if ($response) {
        $data = json_decode($response, true);
        if (isset($data['status']) && $data['status'] === 'success') {
            $loc = implode(' ', array_filter([$data['country'] ?? '', $data['regionName'] ?? '', $data['city'] ?? '']));
            return $cache[$ip] = ($loc ?: '未知归属地');
        }
    }

    return $cache[$ip] = '未知 IP 归属地';
}

function redirectWithMsg($url, $message, $type = 'success') {
    $_SESSION['admin_msg'] = $message;
    $_SESSION['admin_msg_type'] = $type;
    header("Location: " . $url);
    exit;
}

function getPaginationRange($currentPage, $totalPages, $adjacents = 2) {
    $pages = [];
    if ($totalPages <= 1) return $pages;

    $start = max(1, $currentPage - $adjacents);
    $end = min($totalPages, $currentPage + $adjacents);

    if ($start > 1) {
        $pages[] = 1;
        if ($start > 2) {
            $pages[] = '...';
        }
    }

    for ($i = $start; $i <= $end; $i++) {
        $pages[] = $i;
    }

    if ($end < $totalPages) {
        if ($end < $totalPages - 1) {
            $pages[] = '...';
        }
        $pages[] = $totalPages;
    }

    return $pages;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $action = sanitizeString($_POST['action'] ?? '', 50);

    try {
        if ($action === 'save_settings') {
            $fields = ['site_title', 'site_subtitle', 'seo_keywords', 'seo_description', 'site_logo', 'site_favicon', 'copyright', 'icp_code', 'footer_js', 'site_enabled', 'site_closed_message','email_settings', 'registration_enabled', 'allowed_email_domains', 'site_start_year'];
            $stmt = $pdo->prepare("INSERT INTO settings (setting_key, setting_value) VALUES (?, ?) ON DUPLICATE KEY UPDATE setting_value = ?");
            
            foreach ($fields as $field) {
                $val = $_POST[$field] ?? '';
                if ($field !== 'footer_js' && $field !== 'seo_description' && $field !== 'site_closed_message') {
                    $val = sanitizeString($val, 500);
                } else {
                    $val = mb_substr(trim((string)$val), 0, 5000, 'UTF-8');
                }
                $stmt->execute([$field, $val, $val]);
            }
            redirectWithMsg("admin.php?tab=settings", "网站配置与 SEO 设置更新成功！");
        }

        if ($action === 'save_ad_settings') {
            $ad_image = safeUrl($_POST['ad_image'] ?? '');
            $ad_link = safeUrl($_POST['ad_link'] ?? '');
            $ad_enabled = isset($_POST['ad_enabled']) ? '1' : '0';
            
            $stmt = $pdo->prepare("INSERT INTO settings (setting_key, setting_value) VALUES (?, ?) ON DUPLICATE KEY UPDATE setting_value = ?");
            $stmt->execute(['ad_image', $ad_image, $ad_image]);
            $stmt->execute(['ad_link', $ad_link, $ad_link]);
            $stmt->execute(['ad_enabled', $ad_enabled, $ad_enabled]);
            
            redirectWithMsg("admin.php?tab=ad_settings", "侧边栏图片广告设置已成功更新！");
        }

        if ($action === 'save_menu') {
            $m_id = isset($_POST['menu_id']) ? (int)$_POST['menu_id'] : 0;
            $title = sanitizeString($_POST['menu_title'] ?? '', 100);
            $url = safeUrl($_POST['menu_url'] ?? '');
            $sort = (int)($_POST['sort_order'] ?? 0);
            
            if ($title !== '' && $url !== '') {
                if ($m_id > 0) {
                    $stmt = $pdo->prepare("UPDATE menus SET title = ?, url = ?, sort_order = ? WHERE id = ?");
                    $stmt->execute([$title, $url, $sort, $m_id]);
                    redirectWithMsg("admin.php?tab=menus", "菜单修改成功！");
                } else {
                    $stmt = $pdo->prepare("INSERT INTO menus (title, url, sort_order) VALUES (?, ?, ?)");
                    $stmt->execute([$title, $url, $sort]);
                    redirectWithMsg("admin.php?tab=menus", "菜单添加成功！");
                }
            } else {
                redirectWithMsg("admin.php?tab=menus", "菜单名称和有效的链接地址不能为空！", "error");
            }
        }

        if ($action === 'save_category') {
            $cat_id = isset($_POST['cat_id']) ? (int)$_POST['cat_id'] : 0;
            $cat_name = sanitizeString($_POST['cat_name'] ?? '', 50);
            $sort = (int)($_POST['sort_order'] ?? 0);

            if ($cat_name !== '') {
                if ($cat_id > 0) {
                    $stmt = $pdo->prepare("UPDATE categories SET name = ?, sort_order = ? WHERE id = ?");
                    $stmt->execute([$cat_name, $sort, $cat_id]);
                    redirectWithMsg("admin.php?tab=categories", "分类修改成功！");
                } else {
                    $stmt = $pdo->prepare("INSERT INTO categories (name, sort_order) VALUES (?, ?)");
                    $stmt->execute([$cat_name, $sort]);
                    redirectWithMsg("admin.php?tab=categories", "分类添加成功！");
                }
            } else {
                redirectWithMsg("admin.php?tab=categories", "分类名称不能为空！", "error");
            }
        }

        if ($action === 'save_post') {
            $title = sanitizeString($_POST['title'] ?? '', 200);
            $category_id = (int)($_POST['category_id'] ?? 0);
            $raw_content = mb_substr((string)($_POST['content'] ?? ''), 0, 5000000, 'UTF-8');
            $is_top = isset($_POST['is_top']) ? 1 : 0;
            $is_hot = isset($_POST['is_hot']) ? 1 : 0;
            
            $ad_enabled = isset($_POST['ad_enabled']) ? 1 : 0;
            $ad_type = $_POST['ad_type'] ?? 'image';
            $ad_image = safeUrl($_POST['ad_image'] ?? '');
            $ad_text = sanitizeString($_POST['ad_text'] ?? '', 255);
            $ad_link = safeUrl($_POST['ad_link'] ?? '');

            $id = !empty($_POST['id']) ? (int)$_POST['id'] : null;

            if ($title === '') {
                redirectWithMsg("admin.php?tab=new_post" . ($id ? "&edit_post={$id}" : ""), "文章标题不能为空！", "error");
            }

            $content = function_exists('localizeExternalImages') ? localizeExternalImages($raw_content) : $raw_content;

            if ($id > 0) {
                $old_stmt = $pdo->prepare("SELECT content FROM posts WHERE id = ? LIMIT 1");
                $old_stmt->execute([$id]);
                $old_content = $old_stmt->fetchColumn() ?: '';

                $stmt = $pdo->prepare("UPDATE posts SET title = ?, category_id = ?, content = ?, is_top = ?, is_hot = ?, ad_enabled = ?, ad_type = ?, ad_image = ?, ad_text = ?, ad_link = ? WHERE id = ?");
                $stmt->execute([$title, $category_id, $content, $is_top, $is_hot, $ad_enabled, $ad_type, $ad_image, $ad_text, $ad_link, $id]);
                
                cleanUnusedImages($old_content, $content, $pdo);

                redirectWithMsg("admin.php?tab=posts", "文章修改成功！");
            } else {
                $stmt = $pdo->prepare("INSERT INTO posts (title, category_id, content, is_top, is_hot, ad_enabled, ad_type, ad_image, ad_text, ad_link) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
                $stmt->execute([$title, $category_id, $content, $is_top, $is_hot, $ad_enabled, $ad_type, $ad_image, $ad_text, $ad_link]);
                redirectWithMsg("admin.php?tab=posts", "文章发布成功！");
            }
        }

        // 新增：保存修改后的评论内容
        if ($action === 'update_comment') {
            $c_id = (int)($_POST['comment_id'] ?? 0);
            $c_content = sanitizeString($_POST['comment_content'] ?? '', 2000);
            if ($c_id > 0 && $c_content !== '') {
                $stmt = $pdo->prepare("UPDATE comments SET content = ? WHERE id = ?");
                $stmt->execute([$c_content, $c_id]);
                redirectWithMsg("admin.php?tab=comments", "评论内容修改成功！");
            } else {
                redirectWithMsg("admin.php?tab=comments", "评论内容不能为空！", "error");
            }
        }

        if ($action === 'change_admin_pwd') {
            $old_pwd = (string)($_POST['old_password'] ?? '');
            $new_pwd = (string)($_POST['new_password'] ?? '');

            $stmt = $pdo->prepare("SELECT password FROM admins WHERE id = ? LIMIT 1");
            $stmt->execute([$session_admin_id]);
            $pwd_row = $stmt->fetch(PDO::FETCH_ASSOC);

            if ($pwd_row && password_verify($old_pwd, $pwd_row['password'])) {
                if (strlen($new_pwd) < 6) {
                    redirectWithMsg("admin.php?tab=admins", "新密码不能少于 6 个字符！", "error");
                }
                $new_hash = password_hash($new_pwd, PASSWORD_DEFAULT);
                
                $pdo->prepare("UPDATE admins SET password = ? WHERE id = ?")->execute([$new_hash, $session_admin_id]);
                redirectWithMsg("admin.php?tab=admins", "密码修改成功，请牢记新密码！");
            } else {
                redirectWithMsg("admin.php?tab=admins", "原密码输入不正确！", "error");
            }
        }

        if ($action === 'add_admin') {
            $new_user = sanitizeString($_POST['admin_username'] ?? '', 50);
            $new_email = sanitizeString($_POST['admin_email'] ?? '', 100);
            $new_pass = (string)($_POST['admin_password'] ?? '');

            if ($new_user === '' || $new_pass === '') {
                redirectWithMsg("admin.php?tab=admins", "账号和密码不能为空！", "error");
            }

            $check = $pdo->prepare("SELECT id FROM admins WHERE username = ? LIMIT 1");
            $check->execute([$new_user]);
            if ($check->fetch()) {
                redirectWithMsg("admin.php?tab=admins", "该管理员账号已存在！", "error");
            }

            $pass_hash = password_hash($new_pass, PASSWORD_DEFAULT);
            
            $pdo->prepare("INSERT INTO admins (username, password, email) VALUES (?, ?, ?)")->execute([$new_user, $pass_hash, $new_email]);
            redirectWithMsg("admin.php?tab=admins", "管理员账号 " . e($new_user) . " 添加成功！");
        }

    } catch (PDOException $e) {
        redirectWithMsg("admin.php?tab=" . urlencode($tab), "数据库操作失败", "error");
    }
}

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    try {
        if (isset($_GET['action']) && $_GET['action'] === 'logout') {
            unset($_SESSION['admin']);
            session_destroy();
            header("Location: admin_login.php");
            exit;
        }

        if (isset($_GET['delete_category'])) {
            $del_cat_id = (int)$_GET['delete_category'];
            $pdo->prepare("DELETE FROM categories WHERE id = ?")->execute([$del_cat_id]);
            $pdo->prepare("UPDATE posts SET category_id = 0 WHERE category_id = ?")->execute([$del_cat_id]);
            redirectWithMsg("admin.php?tab=categories", "分类已彻底删除，关联文章已归为未分类！");
        }

        if (isset($_GET['delete_menu'])) {
            $pdo->prepare("DELETE FROM menus WHERE id = ?")->execute([(int)$_GET['delete_menu']]);
            redirectWithMsg("admin.php?tab=menus", "菜单已删除！");
        }

        if (isset($_GET['delete_post'])) {
            $del_post_id = (int)$_GET['delete_post'];
            
            $del_stmt = $pdo->prepare("SELECT content FROM posts WHERE id = ? LIMIT 1");
            $del_stmt->execute([$del_post_id]);
            $del_content = $del_stmt->fetchColumn() ?: '';

            $pdo->prepare("DELETE FROM posts WHERE id = ?")->execute([$del_post_id]);
            $pdo->prepare("DELETE FROM comments WHERE post_id = ?")->execute([$del_post_id]);

            cleanUnusedImages($del_content, '', $pdo);

            redirectWithMsg("admin.php?tab=posts", "文章及其关联评论已彻底删除！");
        }

        if (isset($_GET['delete_user'])) {
            $pdo->prepare("DELETE FROM users WHERE id = ?")->execute([(int)$_GET['delete_user']]);
            redirectWithMsg("admin.php?tab=users", "普通用户账号已彻底删除！");
        }

        if (isset($_GET['delete_admin'])) {
            $del_admin_id = (int)$_GET['delete_admin'];
            if ($del_admin_id === $session_admin_id) {
                redirectWithMsg("admin.php?tab=admins", "您不能删除当前的登录账号！", "error");
            }
            $pdo->prepare("DELETE FROM admins WHERE id = ?")->execute([$del_admin_id]);
            redirectWithMsg("admin.php?tab=admins", "管理员账号已被注销！");
        }

        if (isset($_GET['approve_comment'])) {
            $pdo->prepare("UPDATE comments SET status = 'approved' WHERE id = ?")->execute([(int)$_GET['approve_comment']]);
            redirectWithMsg("admin.php?tab=comments", "评论审核通过！");
        }

        // 不通过/拒绝评论 -> 物理删除
        if (isset($_GET['delete_comment'])) {
            $pdo->prepare("DELETE FROM comments WHERE id = ?")->execute([(int)$_GET['delete_comment']]);
            redirectWithMsg("admin.php?tab=comments", "评论已拒绝并从数据库中删除！");
        }

    } catch (PDOException $e) {
        redirectWithMsg("admin.php?tab=" . urlencode($tab), "操作失败", "error");
    }
}

try {
    $categories = $pdo->query("SELECT * FROM categories ORDER BY sort_order ASC, id ASC")->fetchAll(PDO::FETCH_ASSOC);

    $posts_per_page = 10;
    $total_posts_count = (int)$pdo->query("SELECT COUNT(*) FROM posts")->fetchColumn();
    $total_posts_pages = max(1, ceil($total_posts_count / $posts_per_page));
    
    $posts_page = max(1, min((int)($_GET['p_page'] ?? 1), $total_posts_pages));
    $posts_offset = ($posts_page - 1) * $posts_per_page;

    $stmt_posts = $pdo->prepare("SELECT p.*, c.name as category_name FROM posts p LEFT JOIN categories c ON p.category_id = c.id ORDER BY p.is_top DESC, p.id DESC LIMIT :limit OFFSET :offset");
    $stmt_posts->bindValue(':limit', $posts_per_page, PDO::PARAM_INT);
    $stmt_posts->bindValue(':offset', $posts_offset, PDO::PARAM_INT);
    $stmt_posts->execute();
    $posts = $stmt_posts->fetchAll(PDO::FETCH_ASSOC);

    $users = $pdo->query("SELECT * FROM users ORDER BY id DESC LIMIT 1000")->fetchAll(PDO::FETCH_ASSOC);
    
    // 更新：加载所有文章中的评论集中管理
    $comments_per_page = 10;
    $total_comments_count = (int)$pdo->query("SELECT COUNT(*) FROM comments")->fetchColumn();
    $total_comments_pages = max(1, ceil($total_comments_count / $comments_per_page));
    $comments_page = max(1, min((int)($_GET['c_page'] ?? 1), $total_comments_pages));
    $comments_offset = ($comments_page - 1) * $comments_per_page;

    $stmt_all_comments = $pdo->prepare("SELECT c.*, p.title as post_title FROM comments c JOIN posts p ON c.post_id = p.id ORDER BY c.id DESC LIMIT :limit OFFSET :offset");
    $stmt_all_comments->bindValue(':limit', $comments_per_page, PDO::PARAM_INT);
    $stmt_all_comments->bindValue(':offset', $comments_offset, PDO::PARAM_INT);
    $stmt_all_comments->execute();
    $all_comments = $stmt_all_comments->fetchAll(PDO::FETCH_ASSOC);

    $pending_comments_count = (int)$pdo->query("SELECT COUNT(*) FROM comments WHERE status = 'pending'")->fetchColumn();

    $menus = $pdo->query("SELECT * FROM menus ORDER BY sort_order ASC, id ASC")->fetchAll(PDO::FETCH_ASSOC);

    $settings_raw = $pdo->query("SELECT * FROM settings")->fetchAll(PDO::FETCH_ASSOC);
    $settings = [];
    foreach ($settings_raw as $s) {
        $settings[$s['setting_key']] = $s['setting_value'];
    }

    $admins = $pdo->query("SELECT id, username, email, created_at, last_login, last_login_ip FROM admins ORDER BY id ASC")->fetchAll(PDO::FETCH_ASSOC);

    $edit_post = null;
    if (isset($_GET['edit_post'])) {
        $stmt = $pdo->prepare("SELECT * FROM posts WHERE id = ? LIMIT 1");
        $stmt->execute([(int)$_GET['edit_post']]);
        $edit_post = $stmt->fetch(PDO::FETCH_ASSOC);
        $tab = 'new_post';
    }

    $edit_category = null;
    if (isset($_GET['edit_category'])) {
        $stmt = $pdo->prepare("SELECT * FROM categories WHERE id = ? LIMIT 1");
        $stmt->execute([(int)$_GET['edit_category']]);
        $edit_category = $stmt->fetch(PDO::FETCH_ASSOC);
        $tab = 'categories';
    }

    $edit_menu = null;
    if (isset($_GET['edit_menu'])) {
        $stmt = $pdo->prepare("SELECT * FROM menus WHERE id = ? LIMIT 1");
        $stmt->execute([(int)$_GET['edit_menu']]);
        $edit_menu = $stmt->fetch(PDO::FETCH_ASSOC);
        $tab = 'menus';
    }

    $total_user_count = count($users);
    $total_pending_comment = $pending_comments_count;

} catch (PDOException $e) {
    die("数据加载失败");
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>后台管理控制台</title>
    <link rel="stylesheet" href="admin/admin.css">
    <?php if ($tab === 'new_post'): ?>
        <link href="../edit/quill.snow.css" rel="stylesheet">
    <?php endif; ?>
    <script src="admin/admin.js" defer></script>
</head>
<body>

<div class="mobile-header">
    <button id="menuToggleBtn" class="menu-toggle-btn" type="button">☰ 导航菜单</button>
    <span class="mobile-header-title">📜 博客管理后台</span>
</div>

<?php include 'admin_sidebar.php'; ?>

<div class="main-content">
    <?php if ($msg): ?>
        <div class="msg <?= $msg_type === 'error' ? 'msg-error' : 'msg-success' ?>">
            <?= $msg_type === 'error' ? '❌' : '✅' ?> <?= e($msg) ?>
        </div>
    <?php endif; ?>

    <?php if ($tab === 'dashboard'): ?>
    <div class="card">
        <h2><span>🏠 管理仪表盘</span></h2>
        <div class="dashboard-grid">
            <div class="stat-card">
                <div class="stat-num"><?= $total_posts_count ?></div>
                <div class="stat-label">文章总数</div>
            </div>
            <div class="stat-card">
                <div class="stat-num"><?= $total_user_count ?></div>
                <div class="stat-label">注册用户</div>
            </div>
            <div class="stat-card">
                <div class="stat-num"><?= $total_pending_comment ?></div>
                <div class="stat-label">待审核评论</div>
            </div>
            <div class="stat-card">
                <div class="stat-num"><?= count($admins) ?></div>
                <div class="stat-label">管理员账号</div>
            </div>
        </div>
        <div class="quick-title">常用快捷操作</div>
        <div class="quick-grid">
            <a href="admin.php?tab=new_post" class="quick-btn">✍️ 发布新文章</a>
            <a href="admin.php?tab=posts" class="quick-btn">📝 文章列表</a>
            <a href="admin.php?tab=categories" class="quick-btn">📁 管理分类</a>
            <a href="admin.php?tab=menus" class="quick-btn">📌 导航菜单</a>
            <a href="admin.php?tab=comments" class="quick-btn">💬 评论管理</a>
            <a href="admin.php?tab=settings" class="quick-btn">⚙️ 全局配置</a>
            
        </div>
    </div>
    <?php endif; ?>

    <?php if ($tab === 'new_post'): ?>
        <?php include 'admin_new_post.php'; ?>
    <?php endif; ?>
<?php if ($tab === 'email_settings'): ?>
    <?php include 'admin_email_settings.php'; ?>
<?php endif; ?>
    <?php if ($tab === 'posts'): ?>
        <div class="card">
            <h2>
                <span>📰 文章列表 (共 <?= $total_posts_count ?> 篇)</span>
                <a href="admin.php?tab=new_post" class="btn btn-primary-highlight">✍️ 发表文章</a>
            </h2>
            <div class="table-responsive">
                <table class="posts-table">
                    <thead>
                        <tr>
                            <th style="width: 60px;">ID</th>
                            <th>标题</th>
                            <th style="width: 120px;">所属分类</th>
                            <th style="width: 100px;">状态</th>
                            <th style="width: 90px;">独立广告</th>
                            <th style="width: 70px;">点赞</th>
                            <th style="width: 160px;">发布时间</th>
                            <th style="width: 140px;">操作</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php if (empty($posts)): ?>
                            <tr><td colspan="8" style="text-align: center; color: #999;">暂无已发表的文章</td></tr>
                        <?php endif; ?>
                        <?php foreach ($posts as $p): ?>
                        <tr>
                            <td data-label="ID"><?= (int)$p['id'] ?></td>
                            <td data-label="标题" class="td-post-title">
                                <a href="../post.php?id=<?= (int)$p['id'] ?>" target="_blank" title="<?= e($p['title']) ?>"><?= e($p['title']) ?></a>
                            </td>
                            <td data-label="所属分类"><span class="badge-ip"><?= e($p['category_name'] ?? '未分类') ?></span></td>
                            <td data-label="状态">
                                <?php if ($p['is_top']): ?><span class="badge-top">[置顶]</span> <?php endif; ?>
                                <?php if ($p['is_hot']): ?><span class="badge-hot">[热点]</span> <?php endif; ?>
                            </td>
                            <td data-label="独立广告">
                                <?= !empty($p['ad_enabled']) ? '<span class="badge-enabled">[已开启]</span>' : '<span class="badge-none">[无]</span>' ?>
                            </td>
                            <td data-label="点赞"><?= (int)$p['likes'] ?></td>
                            <td data-label="发布时间"><?= e($p['created_at']) ?></td>
                            <td data-label="操作" class="td-actions">
                                <a href="admin.php?tab=new_post&edit_post=<?= (int)$p['id'] ?>" class="btn btn-edit">编辑</a>
                                <a href="admin.php?tab=posts&delete_post=<?= (int)$p['id'] ?>&p_page=<?= $posts_page ?>" class="btn btn-danger" onclick="return confirm('确认彻底删除吗？')">删除</a>
                            </td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            </div>

            <?php if ($total_posts_pages > 1): ?>
                <div class="pagination">
                    <?php if ($posts_page > 1): ?>
                        <a href="admin.php?tab=posts&p_page=<?= $posts_page - 1 ?>">« 上一页</a>
                    <?php else: ?>
                        <span class="disabled">« 上一页</span>
                    <?php endif; ?>

                    <?php 
                    $p_range = getPaginationRange($posts_page, $total_posts_pages);
                    foreach ($p_range as $pg): 
                    ?>
                        <?php if ($pg === '...'): ?>
                            <span class="dots">...</span>
                        <?php elseif ($pg == $posts_page): ?>
                            <span class="active"><?= $pg ?></span>
                        <?php else: ?>
                            <a href="admin.php?tab=posts&p_page=<?= $pg ?>"><?= $pg ?></a>
                        <?php endif; ?>
                    <?php endforeach; ?>

                    <?php if ($posts_page < $total_posts_pages): ?>
                        <a href="admin.php?tab=posts&p_page=<?= $posts_page + 1 ?>">下一页 »</a>
                    <?php else: ?>
                        <span class="disabled">下一页 »</span>
                    <?php endif; ?>
                </div>
            <?php endif; ?>
        </div>
    <?php endif; ?>

    <?php if ($tab === 'categories'): ?>
        <div class="card">
            <h2><span>📁 <?= $edit_category ? '编辑分类' : '添加分类' ?></span></h2>
            <form method="POST" class="form-inline-menu">
                <input type="hidden" name="action" value="save_category">
                <?php if ($edit_category): ?>
                    <input type="hidden" name="cat_id" value="<?= (int)$edit_category['id'] ?>">
                <?php endif; ?>
                <input type="text" name="cat_name" placeholder="分类名称" value="<?= e($edit_category['name'] ?? '') ?>" required class="input-w150">
                <input type="number" name="sort_order" placeholder="排序号" value="<?= (int)($edit_category['sort_order'] ?? 0) ?>" class="input-w80">
                <button type="submit" class="btn"><?= $edit_category ? '保存修改' : '添加分类' ?></button>
                <?php if ($edit_category): ?>
                    <a href="admin.php?tab=categories" class="btn btn-edit text-decoration-none">取消编辑</a>
                <?php endif; ?>
            </form>

            <div class="table-responsive">
                <table>
                    <tr><th>ID</th><th>排序</th><th>分类名称</th><th>创建时间</th><th>操作</th></tr>
                    <?php foreach ($categories as $cat): ?>
                    <tr>
                        <td><?= (int)$cat['id'] ?></td>
                        <td><?= (int)$cat['sort_order'] ?></td>
                        <td><strong><?= e($cat['name']) ?></strong></td>
                        <td><?= e($cat['created_at']) ?></td>
                        <td>
                            <a href="admin.php?tab=categories&edit_category=<?= (int)$cat['id'] ?>" class="btn btn-edit">修改</a>
                            <a href="admin.php?tab=categories&delete_category=<?= (int)$cat['id'] ?>" class="btn btn-danger" onclick="return confirm('确认删除该分类吗？关联文章将被置为未分类')">删除</a>
                        </td>
                    </tr>
                    <?php endforeach; ?>
                </table>
            </div>
        </div>
    <?php endif; ?>

    <?php if ($tab === 'users'): ?>
        <div class="card">
            <h2><span>👥 注册普通用户列表 (共 <?= count($users) ?> 人)</span></h2>
            <div class="table-responsive">
                <table>
                    <tr>
                        <th>ID</th>
                        <th>用户名</th>
                        <th>邮箱</th>
                        <th>QQ</th>
                        <th>性别</th>
                        <th>注册时间</th>
                        <th>最后登录时间</th>
                        <th>登录 IP</th>
                        <th>IP 归属地</th>
                        <th>操作</th>
                    </tr>
                    <?php foreach ($users as $u): ?>
                    <?php 
                        $login_ip = $u['last_login_ip'] ?? '';
                        $ip_location = !empty($login_ip) ? getIpLocation($login_ip) : '-';
                    ?>
                    <tr>
                        <td><?= (int)$u['id'] ?></td>
                        <td><strong><?= e($u['username']) ?></strong></td>
                        <td><?= e($u['email'] ?? '-') ?></td>
                        <td><?= e($u['qq'] ?? '-') ?></td>
                        <td><?= e($u['gender'] ?? 'unknown') ?></td>
                        <td><?= e($u['created_at']) ?></td>
                        <td><?= e($u['last_login'] ?? '未登录') ?></td>
                        <td><?= $login_ip ? '<span class="badge-ip">' . e($login_ip) . '</span>' : '-' ?></td>
                        <td><?= e($ip_location) ?></td>
                        <td>
                            <a href="admin.php?tab=users&delete_user=<?= (int)$u['id'] ?>" class="btn btn-danger" onclick="return confirm('确认删除该普通用户账号吗？')">删除账号</a>
                        </td>
                    </tr>
                    <?php endforeach; ?>
                </table>
            </div>
        </div>
    <?php endif; ?>

    <?php if ($tab === 'comments'): ?>
    <?php include 'admin_comments.php'; ?>
<?php endif; ?>
        

    <?php if ($tab === 'ad_settings'): ?>
        <?php include 'admin_ad_settings.php'; ?>
    <?php endif; ?>

    <?php if ($tab === 'menus'): ?>
        <div class="card">
            <h2><span>📌 <?= $edit_menu ? '编辑首页导航菜单' : '添加首页导航菜单' ?></span></h2>
            <form method="POST" class="form-inline-menu">
                <input type="hidden" name="action" value="save_menu">
                <?php if ($edit_menu): ?>
                    <input type="hidden" name="menu_id" value="<?= (int)$edit_menu['id'] ?>">
                <?php endif; ?>
                <input type="text" name="menu_title" placeholder="菜单名称" value="<?= e($edit_menu['title'] ?? '') ?>" required class="input-w150">
                <input type="text" name="menu_url" placeholder="链接地址" value="<?= e($edit_menu['url'] ?? '') ?>" required>
                <input type="number" name="sort_order" placeholder="排序号" value="<?= (int)($edit_menu['sort_order'] ?? 0) ?>" class="input-w80">
                <button type="submit" class="btn"><?= $edit_menu ? '保存修改' : '添加菜单' ?></button>
                <?php if ($edit_menu): ?>
                    <a href="admin.php?tab=menus" class="btn btn-edit text-decoration-none">取消编辑</a>
                <?php endif; ?>
            </form>

            <div class="table-responsive">
                <table>
                    <tr><th>排序</th><th>菜单名称</th><th>跳转链接</th><th>操作</th></tr>
                    <?php if (empty($menus)): ?>
                        <tr><td colspan="4" style="text-align: center; color: #999;">暂无导航菜单</td></tr>
                    <?php endif; ?>
                    <?php foreach ($menus as $m): ?>
                    <tr>
                        <td><?= (int)$m['sort_order'] ?></td>
                        <td><strong><?= e($m['title']) ?></strong></td>
                        <td><?= e($m['url']) ?></td>
                        <td>
                            <a href="admin.php?tab=menus&edit_menu=<?= (int)$m['id'] ?>" class="btn btn-edit">修改</a>
                            <a href="admin.php?tab=menus&delete_menu=<?= (int)$m['id'] ?>" class="btn btn-danger" onclick="return confirm('删除该菜单吗？')">删除</a>
                        </td>
                    </tr>
                    <?php endforeach; ?>
                </table>
            </div>
        </div>
    <?php endif; ?>

    <?php if ($tab === 'settings'): ?>
        <div class="card">
            <h2><span>⚙️ 全局配置与站点控制台</span></h2>
            <form method="POST">
                <input type="hidden" name="action" value="save_settings">
                
                <div class="settings-grid-container">
                    <div class="setting-section-card">
                        <div class="setting-section-title">🛡️ 核心站点控制</div>
                        
                        <div class="form-group-refined">
                            <label>全站运行状态：</label>
                            <div style="margin-top: 6px;">
                                <label style="margin-right: 15px;"><input type="radio" name="site_enabled" value="1" <?= (!isset($settings['site_enabled']) || $settings['site_enabled'] == '1') ? 'checked' : '' ?>> 🟢 正常开启</label>
                                <label><input type="radio" name="site_enabled" value="0" <?= (isset($settings['site_enabled']) && $settings['site_enabled'] == '0') ? 'checked' : '' ?>> 🔴 维护模式</label>
                            </div>
                        </div>

                        <div class="form-group-refined">
                            <label>维护提示语：</label>
                            <textarea name="site_closed_message" rows="2" placeholder="维护中..."><?= e($settings['site_closed_message'] ?? '网站维护升级中，暂不可访问。') ?></textarea>
                        </div>

                        <div class="form-group-refined">
                            <label>用户开放注册状态：</label>
                            <div style="margin-top: 6px;">
                                <label style="margin-right: 15px;"><input type="radio" name="registration_enabled" value="1" <?= (!isset($settings['registration_enabled']) || $settings['registration_enabled'] == '1') ? 'checked' : '' ?>> 🟢 允许注册</label>
                                <label><input type="radio" name="registration_enabled" value="0" <?= (isset($settings['registration_enabled']) && $settings['registration_enabled'] == '0') ? 'checked' : '' ?>> 🔴 停止注册</label>
                            </div>
                        </div>

                        <div class="form-group-refined">
                            <label>允许注册的邮箱后缀：</label>
                            <input type="text" name="allowed_email_domains" value="<?= e($settings['allowed_email_domains'] ?? '@126.com;@163.com;@qq.com;@gmail.com;') ?>">
                            <div class="form-hint-sub">多个用英文分号 ; 隔开</div>
                        </div>
                    </div>

                    <div class="setting-section-card">
                        <div class="setting-section-title">🔍 基础信息与 SEO 设置</div>
                        
                        <div class="form-group-refined">
                            <label>网站主标题 (Site Title)：</label>
                            <input type="text" name="site_title" value="<?= e($settings['site_title'] ?? '') ?>" placeholder="例：我的个人博客">
                        </div>

                        <div class="form-group-refined">
                            <label>网站副标题 (Site Subtitle)：</label>
                            <input type="text" name="site_subtitle" value="<?= e($settings['site_subtitle'] ?? '') ?>" placeholder="例：技术与生活">
                        </div>

                        <div class="form-group-refined">
                            <label>运营开始年份：</label>
                            <input type="text" name="site_start_year" value="<?= e($settings['site_start_year'] ?? '2022') ?>" placeholder="例：2022">
                            <div class="form-hint-sub">用于页脚版权动态计算年份区间</div>
                        </div>

                        <div class="form-group-refined">
                            <label>SEO 关键词 (Keywords)：</label>
                            <input type="text" name="seo_keywords" value="<?= e($settings['seo_keywords'] ?? '') ?>">
                        </div>

                        <div class="form-group-refined">
                            <label>SEO 网站描述 (Description)：</label>
                            <textarea name="seo_description" rows="2"><?= e($settings['seo_description'] ?? '') ?></textarea>
                        </div>
                    </div>

                    <div class="setting-section-card">
                        <div class="setting-section-title">🎨 品牌与视觉样式</div>
                        
                        <div class="form-group-refined">
                            <label>网站 Logo URL 地址：</label>
                            <input type="text" name="site_logo" value="<?= e($settings['site_logo'] ?? '') ?>">
                        </div>

                        <div class="form-group-refined">
                            <label>网站 Favicon URL 地址：</label>
                            <input type="text" name="site_favicon" value="<?= e($settings['site_favicon'] ?? '') ?>">
                        </div>

                        <div class="form-group-refined">
                            <label>版权信息 (Copyright)：</label>
                            <input type="text" name="copyright" value="<?= e($settings['copyright'] ?? '') ?>">
                        </div>

                        <div class="form-group-refined">
                            <label>ICP 备案号：</label>
                            <input type="text" name="icp_code" value="<?= e($settings['icp_code'] ?? '') ?>">
                        </div>
                    </div>

                    <div class="setting-section-card full-width-section">
                        <div class="setting-section-title">⚡ 高级扩展与自定义脚本</div>
                        
                        <div class="form-group-refined">
                            <label>页脚 JS 自定义代码：</label>
                            <textarea name="footer_js" rows="3"><?= e($settings['footer_js'] ?? '') ?></textarea>
                        </div>
                    </div>
                </div>

                <div style="text-align: right; margin-top: 15px;">
                    <button type="submit" class="btn" style="padding: 10px 24px; font-size: 15px;">保存所有全局配置</button>
                </div>
            </form>
        </div>
    <?php endif; ?>

    <?php if ($tab === 'admins'): ?>
        <div class="card">
            <h2><span>🔒 修改我的登录密码</span></h2>
            <form method="POST" class="form-max-400">
                <input type="hidden" name="action" value="change_admin_pwd">
                
                <div class="form-group">
                    <label>当前原密码：</label>
                    <input type="password" name="old_password" required>
                </div>
                <div class="form-group">
                    <label>新密码：</label>
                    <input type="password" name="new_password" placeholder="建议包含字母与数字" required>
                </div>
                <button type="submit" class="btn">修改密码</button>
            </form>
        </div>

        <div class="card">
            <h2><span>➕ 添加管理员账号</span></h2>
            <form method="POST" class="form-max-400">
                <input type="hidden" name="action" value="add_admin">
                
                <div class="form-group">
                    <label>账号：</label>
                    <input type="text" name="admin_username" required>
                </div>
                <div class="form-group">
                    <label>邮箱：</label>
                    <input type="text" name="admin_email">
                </div>
                <div class="form-group">
                    <label>密码：</label>
                    <input type="password" name="admin_password" required>
                </div>
                <button type="submit" class="btn">添加管理员</button>
            </form>
        </div>

        <div class="card">
            <h2><span>🛡️ 当前管理员列表</span></h2>
            <div class="table-responsive">
                <table>
                    <tr>
                        <th>ID</th>
                        <th>管理员账号</th>
                        <th>邮箱</th>
                        <th>注册时间</th>
                        <th>最后登录时间</th>
                        <th>最后登录 IP</th>
                        <th>操作</th>
                    </tr>
                    <?php foreach ($admins as $ad): ?>
                    <tr>
                        <td><?= (int)$ad['id'] ?></td>
                        <td><strong><?= e($ad['username']) ?></strong></td>
                        <td><?= e($ad['email'] ?? '-') ?></td>
                        <td><?= e($ad['created_at']) ?></td>
                        <td><?= e($ad['last_login'] ?? '未登录') ?></td>
                        <td><?= $ad['last_login_ip'] ? '<span class="badge-ip">' . e($ad['last_login_ip']) . '</span>' : '-' ?></td>
                        <td>
                            <?php if ((int)$ad['id'] !== $session_admin_id): ?>
                                <a href="admin.php?tab=admins&delete_admin=<?= (int)$ad['id'] ?>" class="btn btn-danger" onclick="return confirm('确认要注销该管理员账号吗？')">注销</a>
                            <?php else: ?>
                                <span class="text-muted">(当前账号)</span>
                            <?php endif; ?>
                        </td>
                    </tr>
                    <?php endforeach; ?>
                </table>
            </div>
        </div>
    <?php endif; ?>

</div>

<div class="sidebar-overlay" id="sidebarOverlay"></div>

</body>
</html>