PHP 用户分组管理

wen PHP项目 6

本文目录导读:

PHP 用户分组管理

  1. 数据库设计
  2. 配置文件 (config.php)
  3. 数据库操作类 (core/Database.php)
  4. 用户类 (core/User.php)
  5. 分组类 (core/Group.php)
  6. 权限类 (core/Permission.php)
  7. 用户管理页面 (admin/users.php)
  8. 分组管理页面 (admin/groups.php)

我来为你创建一个完整的PHP用户分组管理系统,这个系统包含用户管理、分组管理和权限控制功能。

数据库设计

-- 创建数据库
CREATE DATABASE IF NOT EXISTS user_group_system;
USE user_group_system;
-- 用户表
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    real_name VARCHAR(50),
    status TINYINT DEFAULT 1 COMMENT '1:启用 0:禁用',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 分组表
CREATE TABLE groups (
    id INT PRIMARY KEY AUTO_INCREMENT,
    group_name VARCHAR(50) UNIQUE NOT NULL,
    description VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 用户-分组关联表
CREATE TABLE user_groups (
    user_id INT NOT NULL,
    group_id INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (user_id, group_id),
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (group_id) REFERENCES groups(id) ON DELETE CASCADE
);
-- 权限表
CREATE TABLE permissions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    permission_name VARCHAR(50) UNIQUE NOT NULL,
    description VARCHAR(255)
);
-- 分组-权限关联表
CREATE TABLE group_permissions (
    group_id INT NOT NULL,
    permission_id INT NOT NULL,
    PRIMARY KEY (group_id, permission_id),
    FOREIGN KEY (group_id) REFERENCES groups(id) ON DELETE CASCADE,
    FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE
);
-- 插入初始数据
INSERT INTO groups (group_name, description) VALUES
('admin', '管理员组'),
('user', '普通用户组'),
('vip', 'VIP用户组');
INSERT INTO permissions (permission_name, description) VALUES
('user_view', '查看用户'),
('user_edit', '编辑用户'),
('user_delete', '删除用户'),
('group_manage', '管理分组');
-- 管理员组拥有所有权限
INSERT INTO group_permissions (group_id, permission_id)
SELECT g.id, p.id FROM groups g, permissions p WHERE g.group_name = 'admin';

配置文件 (config.php)

<?php
// 数据库配置
define('DB_HOST', 'localhost');
define('DB_NAME', 'user_group_system');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_CHARSET', 'utf8mb4');
// 会话配置
define('SESSION_NAME', 'user_group_system');
define('SESSION_LIFETIME', 3600); // 1小时
// 其他配置
define('BASE_URL', 'http://localhost/user_group_system/');
define('DEFAULT_GROUP', 'user'); // 默认用户组
// 启动会话
session_name(SESSION_NAME);
session_set_cookie_params(SESSION_LIFETIME);
session_start();
// 错误报告
error_reporting(E_ALL);
ini_set('display_errors', 1);

数据库操作类 (core/Database.php)

<?php
class Database {
    private static $instance = null;
    private $connection;
    private function __construct() {
        try {
            $dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET;
            $this->connection = new PDO($dsn, DB_USER, DB_PASS);
            $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            die("数据库连接失败: " . $e->getMessage());
        }
    }
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    public function getConnection() {
        return $this->connection;
    }
    public function prepare($query) {
        return $this->connection->prepare($query);
    }
    public function lastInsertId() {
        return $this->connection->lastInsertId();
    }
}

用户类 (core/User.php)

<?php
require_once 'Database.php';
class User {
    private $db;
    public function __construct() {
        $this->db = Database::getInstance()->getConnection();
    }
    // 用户注册
    public function register($username, $email, $password, $real_name = '') {
        try {
            // 检查用户名或邮箱是否已存在
            $checkQuery = "SELECT id FROM users WHERE username = ? OR email = ?";
            $stmt = $this->db->prepare($checkQuery);
            $stmt->execute([$username, $email]);
            if ($stmt->rowCount() > 0) {
                return ['success' => false, 'message' => '用户名或邮箱已存在'];
            }
            // 密码加密
            $hashedPassword = password_hash($password, PASSWORD_DEFAULT);
            // 插入用户
            $query = "INSERT INTO users (username, email, password, real_name) VALUES (?, ?, ?, ?)";
            $stmt = $this->db->prepare($query);
            $stmt->execute([$username, $email, $hashedPassword, $real_name]);
            $userId = $this->db->lastInsertId();
            // 添加到默认用户组
            $this->addToDefaultGroup($userId);
            return ['success' => true, 'message' => '注册成功', 'user_id' => $userId];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => '注册失败: ' . $e->getMessage()];
        }
    }
    // 用户登录
    public function login($username, $password) {
        try {
            $query = "SELECT * FROM users WHERE username = ? OR email = ? AND status = 1";
            $stmt = $this->db->prepare($query);
            $stmt->execute([$username, $username]);
            $user = $stmt->fetch();
            if ($user && password_verify($password, $user['password'])) {
                $_SESSION['user_id'] = $user['id'];
                $_SESSION['username'] = $user['username'];
                $_SESSION['real_name'] = $user['real_name'];
                return ['success' => true, 'message' => '登录成功', 'user' => $user];
            }
            return ['success' => false, 'message' => '用户名或密码错误'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => '登录失败: ' . $e->getMessage()];
        }
    }
    // 获取用户信息
    public function getUser($userId) {
        $query = "SELECT id, username, email, real_name, status, created_at 
                  FROM users WHERE id = ?";
        $stmt = $this->db->prepare($query);
        $stmt->execute([$userId]);
        return $stmt->fetch();
    }
    // 获取用户的所有分组
    public function getUserGroups($userId) {
        $query = "SELECT g.* FROM groups g 
                  INNER JOIN user_groups ug ON g.id = ug.group_id 
                  WHERE ug.user_id = ?";
        $stmt = $this->db->prepare($query);
        $stmt->execute([$userId]);
        return $stmt->fetchAll();
    }
    // 获取用户的所有权限
    public function getUserPermissions($userId) {
        $query = "SELECT DISTINCT p.permission_name 
                  FROM permissions p 
                  INNER JOIN group_permissions gp ON p.id = gp.permission_id 
                  INNER JOIN user_groups ug ON gp.group_id = ug.group_id 
                  WHERE ug.user_id = ?";
        $stmt = $this->db->prepare($query);
        $stmt->execute([$userId]);
        return $stmt->fetchAll(PDO::FETCH_COLUMN);
    }
    // 添加用户到分组
    public function addToGroup($userId, $groupId) {
        try {
            // 检查是否已在分组中
            $checkQuery = "SELECT * FROM user_groups WHERE user_id = ? AND group_id = ?";
            $stmt = $this->db->prepare($checkQuery);
            $stmt->execute([$userId, $groupId]);
            if ($stmt->rowCount() > 0) {
                return ['success' => false, 'message' => '用户已在该分组中'];
            }
            $query = "INSERT INTO user_groups (user_id, group_id) VALUES (?, ?)";
            $stmt = $this->db->prepare($query);
            $stmt->execute([$userId, $groupId]);
            return ['success' => true, 'message' => '添加到分组成功'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => '添加失败: ' . $e->getMessage()];
        }
    }
    // 从分组移除
    public function removeFromGroup($userId, $groupId) {
        try {
            $query = "DELETE FROM user_groups WHERE user_id = ? AND group_id = ?";
            $stmt = $this->db->prepare($query);
            $stmt->execute([$userId, $groupId]);
            return ['success' => true, 'message' => '从分组移除成功'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => '移除失败: ' . $e->getMessage()];
        }
    }
    // 添加到默认分组
    private function addToDefaultGroup($userId) {
        $query = "SELECT id FROM groups WHERE group_name = ?";
        $stmt = $this->db->prepare($query);
        $stmt->execute([DEFAULT_GROUP]);
        $group = $stmt->fetch();
        if ($group) {
            $this->addToGroup($userId, $group['id']);
        }
    }
    // 获取所有用户
    public function getAllUsers() {
        $query = "SELECT id, username, email, real_name, status, created_at FROM users";
        $stmt = $this->db->prepare($query);
        $stmt->execute();
        return $stmt->fetchAll();
    }
    // 更新用户信息
    public function updateUser($userId, $data) {
        try {
            $allowedFields = ['email', 'real_name', 'status'];
            $updates = [];
            $values = [];
            foreach ($allowedFields as $field) {
                if (isset($data[$field])) {
                    $updates[] = "$field = ?";
                    $values[] = $data[$field];
                }
            }
            if (empty($updates)) {
                return ['success' => false, 'message' => '没有要更新的字段'];
            }
            $values[] = $userId;
            $query = "UPDATE users SET " . implode(', ', $updates) . " WHERE id = ?";
            $stmt = $this->db->prepare($query);
            $stmt->execute($values);
            return ['success' => true, 'message' => '用户信息更新成功'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => '更新失败: ' . $e->getMessage()];
        }
    }
    // 删除用户
    public function deleteUser($userId) {
        try {
            $query = "DELETE FROM users WHERE id = ?";
            $stmt = $this->db->prepare($query);
            $stmt->execute([$userId]);
            return ['success' => true, 'message' => '用户删除成功'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => '删除失败: ' . $e->getMessage()];
        }
    }
    // 权限检查
    public function hasPermission($permission) {
        if (!isset($_SESSION['user_id'])) {
            return false;
        }
        $permissions = $this->getUserPermissions($_SESSION['user_id']);
        return in_array($permission, $permissions);
    }
    // 检查是否管理员
    public function isAdmin($userId = null) {
        $userId = $userId ?? $_SESSION['user_id'] ?? null;
        if (!$userId) return false;
        $groups = $this->getUserGroups($userId);
        foreach ($groups as $group) {
            if ($group['group_name'] === 'admin') {
                return true;
            }
        }
        return false;
    }
}

分组类 (core/Group.php)

<?php
require_once 'Database.php';
class Group {
    private $db;
    public function __construct() {
        $this->db = Database::getInstance()->getConnection();
    }
    // 创建分组
    public function createGroup($groupName, $description = '') {
        try {
            // 检查分组名是否已存在
            $checkQuery = "SELECT id FROM groups WHERE group_name = ?";
            $stmt = $this->db->prepare($checkQuery);
            $stmt->execute([$groupName]);
            if ($stmt->rowCount() > 0) {
                return ['success' => false, 'message' => '分组名已存在'];
            }
            $query = "INSERT INTO groups (group_name, description) VALUES (?, ?)";
            $stmt = $this->db->prepare($query);
            $stmt->execute([$groupName, $description]);
            return ['success' => true, 'message' => '分组创建成功', 'group_id' => $this->db->lastInsertId()];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => '创建失败: ' . $e->getMessage()];
        }
    }
    // 获取所有分组
    public function getAllGroups() {
        $query = "SELECT g.*, COUNT(ug.user_id) as user_count 
                  FROM groups g 
                  LEFT JOIN user_groups ug ON g.id = ug.group_id 
                  GROUP BY g.id";
        $stmt = $this->db->prepare($query);
        $stmt->execute();
        return $stmt->fetchAll();
    }
    // 获取分组详情
    public function getGroup($groupId) {
        $query = "SELECT * FROM groups WHERE id = ?";
        $stmt = $this->db->prepare($query);
        $stmt->execute([$groupId]);
        return $stmt->fetch();
    }
    // 更新分组
    public function updateGroup($groupId, $groupName, $description = '') {
        try {
            $query = "UPDATE groups SET group_name = ?, description = ? WHERE id = ?";
            $stmt = $this->db->prepare($query);
            $stmt->execute([$groupName, $description, $groupId]);
            return ['success' => true, 'message' => '分组更新成功'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => '更新失败: ' . $e->getMessage()];
        }
    }
    // 删除分组
    public function deleteGroup($groupId) {
        try {
            // 检查是否有用户在此分组
            $checkQuery = "SELECT COUNT(*) as count FROM user_groups WHERE group_id = ?";
            $stmt = $this->db->prepare($checkQuery);
            $stmt->execute([$groupId]);
            $result = $stmt->fetch();
            if ($result['count'] > 0) {
                return ['success' => false, 'message' => '该分组下还有用户,无法删除'];
            }
            $query = "DELETE FROM groups WHERE id = ?";
            $stmt = $this->db->prepare($query);
            $stmt->execute([$groupId]);
            return ['success' => true, 'message' => '分组删除成功'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => '删除失败: ' . $e->getMessage()];
        }
    }
    // 分配权限到分组
    public function assignPermission($groupId, $permissionId) {
        try {
            $query = "INSERT INTO group_permissions (group_id, permission_id) VALUES (?, ?)";
            $stmt = $this->db->prepare($query);
            $stmt->execute([$groupId, $permissionId]);
            return ['success' => true, 'message' => '权限分配成功'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => '权限分配失败: ' . $e->getMessage()];
        }
    }
    // 移除分组权限
    public function removePermission($groupId, $permissionId) {
        try {
            $query = "DELETE FROM group_permissions WHERE group_id = ? AND permission_id = ?";
            $stmt = $this->db->prepare($query);
            $stmt->execute([$groupId, $permissionId]);
            return ['success' => true, 'message' => '权限移除成功'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => '权限移除失败: ' . $e->getMessage()];
        }
    }
    // 获取分组用户列表
    public function getGroupUsers($groupId) {
        $query = "SELECT u.* FROM users u 
                  INNER JOIN user_groups ug ON u.id = ug.user_id 
                  WHERE ug.group_id = ?";
        $stmt = $this->db->prepare($query);
        $stmt->execute([$groupId]);
        return $stmt->fetchAll();
    }
    // 获取分组权限列表
    public function getGroupPermissions($groupId) {
        $query = "SELECT p.* FROM permissions p 
                  INNER JOIN group_permissions gp ON p.id = gp.permission_id 
                  WHERE gp.group_id = ?";
        $stmt = $this->db->prepare($query);
        $stmt->execute([$groupId]);
        return $stmt->fetchAll();
    }
}

权限类 (core/Permission.php)

<?php
require_once 'Database.php';
class Permission {
    private $db;
    public function __construct() {
        $this->db = Database::getInstance()->getConnection();
    }
    // 获取所有权限
    public function getAllPermissions() {
        $query = "SELECT * FROM permissions";
        $stmt = $this->db->prepare($query);
        $stmt->execute();
        return $stmt->fetchAll();
    }
    // 创建权限
    public function createPermission($permissionName, $description = '') {
        try {
            $query = "INSERT INTO permissions (permission_name, description) VALUES (?, ?)";
            $stmt = $this->db->prepare($query);
            $stmt->execute([$permissionName, $description]);
            return ['success' => true, 'message' => '权限创建成功'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => '权限创建失败: ' . $e->getMessage()];
        }
    }
    // 删除权限
    public function deletePermission($permissionId) {
        try {
            // 先删除关联
            $query = "DELETE FROM group_permissions WHERE permission_id = ?";
            $stmt = $this->db->prepare($query);
            $stmt->execute([$permissionId]);
            // 再删除权限
            $query = "DELETE FROM permissions WHERE id = ?";
            $stmt = $this->db->prepare($query);
            $stmt->execute([$permissionId]);
            return ['success' => true, 'message' => '权限删除成功'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => '权限删除失败: ' . $e->getMessage()];
        }
    }
}

用户管理页面 (admin/users.php)

<?php
session_start();
require_once '../core/User.php';
require_once '../core/Group.php';
$userObj = new User();
$groupObj = new Group();
// 检查登录状态和权限
if (!isset($_SESSION['user_id']) || !$userObj->isAdmin()) {
    header('Location: ../login.php');
    exit;
}
$success_message = '';
$error_message = '';
// 处理用户操作
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $action = $_POST['action'] ?? '';
    switch ($action) {
        case 'add_group':
            $user_id = $_POST['user_id'];
            $group_id = $_POST['group_id'];
            $result = $userObj->addToGroup($user_id, $group_id);
            if ($result['success']) {
                $success_message = $result['message'];
            } else {
                $error_message = $result['message'];
            }
            break;
        case 'remove_group':
            $user_id = $_POST['user_id'];
            $group_id = $_POST['group_id'];
            $result = $userObj->removeFromGroup($user_id, $group_id);
            if ($result['success']) {
                $success_message = $result['message'];
            } else {
                $error_message = $result['message'];
            }
            break;
        case 'update_status':
            $user_id = $_POST['user_id'];
            $status = $_POST['status'];
            $result = $userObj->updateUser($user_id, ['status' => $status]);
            if ($result['success']) {
                $success_message = $result['message'];
            } else {
                $error_message = $result['message'];
            }
            break;
        case 'delete_user':
            $user_id = $_POST['user_id'];
            $result = $userObj->deleteUser($user_id);
            if ($result['success']) {
                $success_message = $result['message'];
            } else {
                $error_message = $result['message'];
            }
            break;
    }
}
// 获取所有用户和分组
$users = $userObj->getAllUsers();
$groups = $groupObj->getAllGroups();
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">用户管理 - 管理系统</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        body {
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            min-height: 100vh;
            padding: 20px;
        }
        .container {
            max-width: 1200px;
            margin: 0 auto;
            background: #fff;
            border-radius: 15px;
            box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
            overflow: hidden;
        }
        .header {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            padding: 20px 30px;
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
        .header h1 {
            font-size: 24px;
            font-weight: 600;
        }
        .nav {
            padding: 15px 30px;
            background: #f8f9fa;
            border-bottom: 1px solid #dee2e6;
        }
        .nav a {
            color: #667eea;
            text-decoration: none;
            padding: 8px 15px;
            border-radius: 5px;
            margin-right: 10px;
            transition: all 0.3s;
        }
        .nav a:hover {
            background: #667eea;
            color: white;
        }
        .nav a.active {
            background: #667eea;
            color: white;
        }
        .message {
            padding: 15px 30px;
            margin: 0;
            border-radius: 0;
        }
        .success {
            background: #d4edda;
            color: #155724;
            border: 1px solid #c3e6cb;
        }
        .error {
            background: #f8d7da;
            color: #721c24;
            border: 1px solid #f5c6cb;
        }
        .content {
            padding: 30px;
        }
        .stats {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
            gap: 20px;
            margin-bottom: 30px;
        }
        .stat-card {
            background: #fff;
            border: 1px solid #e0e0e0;
            border-radius: 10px;
            padding: 20px;
            text-align: center;
            transition: transform 0.3s, box-shadow 0.3s;
        }
        .stat-card:hover {
            transform: translateY(-5px);
            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
        }
        .stat-number {
            font-size: 36px;
            font-weight: bold;
            color: #667eea;
            margin-bottom: 10px;
        }
        .stat-label {
            color: #666;
            font-size: 14px;
            text-transform: uppercase;
            letter-spacing: 1px;
        }
        .table-wrapper {
            overflow-x: auto;
            background: #fff;
            border-radius: 10px;
            border: 1px solid #dee2e6;
        }
        table {
            width: 100%;
            border-collapse: collapse;
        }
        th {
            background: #f8f9fa;
            padding: 15px;
            text-align: left;
            font-weight: 600;
            color: #333;
            border-bottom: 2px solid #dee2e6;
        }
        td {
            padding: 15px;
            border-bottom: 1px solid #f0f0f0;
            vertical-align: middle;
        }
        tr:last-child td {
            border-bottom: none;
        }
        tr:hover td {
            background: #f8f9fa;
        }
        .badge {
            display: inline-block;
            padding: 5px 10px;
            border-radius: 20px;
            font-size: 12px;
            margin: 2px;
        }
        .badge-primary {
            background: #667eea;
            color: white;
        }
        .badge-success {
            background: #28a745;
            color: white;
        }
        .badge-danger {
            background: #dc3545;
            color: white;
        }
        .badge-warning {
            background: #ffc107;
            color: #333;
        }
        .btn {
            display: inline-block;
            padding: 8px 15px;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            font-size: 14px;
            transition: all 0.3s;
            margin: 2px;
        }
        .btn-primary {
            background: #667eea;
            color: white;
        }
        .btn-primary:hover {
            background: #5a67d8;
            transform: translateY(-2px);
        }
        .btn-danger {
            background: #dc3545;
            color: white;
        }
        .btn-danger:hover {
            background: #c82333;
        }
        .btn-sm {
            padding: 5px 10px;
            font-size: 12px;
        }
        .btn-success {
            background: #28a745;
            color: white;
        }
        .btn-success:hover {
            background: #218838;
        }
        .select {
            padding: 8px;
            border: 1px solid #dee2e6;
            border-radius: 5px;
            font-size: 14px;
        }
        .form-inline {
            display: inline-flex;
            gap: 5px;
            align-items: center;
        }
        @media (max-width: 768px) {
            .container {
                border-radius: 0;
            }
            .header {
                flex-direction: column;
                text-align: center;
                gap: 10px;
            }
            .content {
                padding: 15px;
            }
            .stats {
                grid-template-columns: 1fr;
            }
            .form-inline {
                flex-direction: column;
                align-items: flex-start;
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h1>👥 用户管理</h1>
            <div>欢迎, <?php echo htmlspecialchars($_SESSION['username']); ?></div>
        </div>
        <div class="nav">
            <a href="dashboard.php" class="<?php echo basename($_SERVER['PHP_SELF']) === 'dashboard.php' ? 'active' : ''; ?>">仪表板</a>
            <a href="users.php" class="<?php echo basename($_SERVER['PHP_SELF']) === 'users.php' ? 'active' : ''; ?>">用户管理</a>
            <a href="groups.php" class="<?php echo basename($_SERVER['PHP_SELF']) === 'groups.php' ? 'active' : ''; ?>">分组管理</a>
            <a href="../logout.php">退出登录</a>
        </div>
        <?php if ($success_message): ?>
            <div class="message success"><?php echo $success_message; ?></div>
        <?php endif; ?>
        <?php if ($error_message): ?>
            <div class="message error"><?php echo $error_message; ?></div>
        <?php endif; ?>
        <div class="content">
            <div class="stats">
                <div class="stat-card">
                    <div class="stat-number"><?php echo count($users); ?></div>
                    <div class="stat-label">用户总数</div>
                </div>
                <div class="stat-card">
                    <div class="stat-number"><?php echo count($groups); ?></div>
                    <div class="stat-label">分组总数</div>
                </div>
                <div class="stat-card">
                    <div class="stat-number"><?php echo count(array_filter($users, function($user) { return $user['status'] == 1; })); ?></div>
                    <div class="stat-label">启用用户</div>
                </div>
                <div class="stat-card">
                    <div class="stat-number"><?php echo count(array_filter($users, function($user) { return $user['status'] == 0; })); ?></div>
                    <div class="stat-label">禁用用户</div>
                </div>
            </div>
            <div class="table-wrapper">
                <table>
                    <thead>
                        <tr>
                            <th>ID</th>
                            <th>用户名</th>
                            <th>邮箱</th>
                            <th>真实姓名</th>
                            <th>分组</th>
                            <th>状态</th>
                            <th>创建时间</th>
                            <th>操作</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($users as $user): ?>
                        <tr>
                            <td><?php echo $user['id']; ?></td>
                            <td><strong><?php echo htmlspecialchars($user['username']); ?></strong></td>
                            <td><?php echo htmlspecialchars($user['email']); ?></td>
                            <td><?php echo htmlspecialchars($user['real_name']); ?></td>
                            <td>
                                <?php 
                                $userGroups = $userObj->getUserGroups($user['id']);
                                foreach ($userGroups as $group): 
                                    $badgeClass = $group['group_name'] === 'admin' ? 'badge-danger' : 'badge-primary';
                                ?>
                                    <span class="badge <?php echo $badgeClass; ?>">
                                        <?php echo htmlspecialchars($group['group_name']); ?>
                                    </span>
                                <?php endforeach; ?>
                                <?php if (!$userObj->isAdmin($user['id'])): ?>
                                    <form method="POST" style="display: inline; margin-top: 5px;">
                                        <input type="hidden" name="user_id" value="<?php echo $user['id']; ?>">
                                        <input type="hidden" name="action" value="add_group">
                                        <div class="form-inline">
                                            <select name="group_id" class="select" required>
                                                <option value="">选择分组</option>
                                                <?php foreach ($groups as $group): ?>
                                                    <?php if (!in_array($group['group_name'], array_column($userGroups, 'group_name'))): ?>
                                                        <option value="<?php echo $group['id']; ?>"><?php echo htmlspecialchars($group['group_name']); ?></option>
                                                    <?php endif; ?>
                                                <?php endforeach; ?>
                                            </select>
                                            <button type="submit" class="btn btn-sm btn-primary">添加</button>
                                        </div>
                                    </form>
                                <?php endif; ?>
                            </td>
                            <td>
                                <span class="badge <?php echo $user['status'] == 1 ? 'badge-success' : 'badge-warning'; ?>">
                                    <?php echo $user['status'] == 1 ? '启用' : '禁用'; ?>
                                </span>
                                <form method="POST" style="display: inline; margin-left: 5px;">
                                    <input type="hidden" name="user_id" value="<?php echo $user['id']; ?>">
                                    <input type="hidden" name="action" value="update_status">
                                    <input type="hidden" name="status" value="<?php echo $user['status'] == 1 ? 0 : 1; ?>">
                                    <button type="submit" class="btn btn-sm <?php echo $user['status'] == 1 ? 'btn-warning' : 'btn-success'; ?>">
                                        <?php echo $user['status'] == 1 ? '禁用' : '启用'; ?>
                                    </button>
                                </form>
                            </td>
                            <td><?php echo date('Y-m-d', strtotime($user['created_at'])); ?></td>
                            <td>
                                <div class="form-inline">
                                    <?php foreach ($userGroups as $group): ?>
                                        <?php if ($group['group_name'] !== 'admin'): ?>
                                            <form method="POST">
                                                <input type="hidden" name="user_id" value="<?php echo $user['id']; ?>">
                                                <input type="hidden" name="group_id" value="<?php echo $group['id']; ?>">
                                                <input type="hidden" name="action" value="remove_group">
                                                <button type="submit" class="btn btn-sm btn-danger" title="从<?php echo htmlspecialchars($group['group_name']); ?>组移除">移除</button>
                                            </form>
                                        <?php endif; ?>
                                    <?php endforeach; ?>
                                    <?php if (!$userObj->isAdmin($user['id']) && $user['id'] != $_SESSION['user_id']): ?>
                                        <form method="POST" onsubmit="return confirm('确定要删除此用户吗?');">
                                            <input type="hidden" name="user_id" value="<?php echo $user['id']; ?>">
                                            <input type="hidden" name="action" value="delete_user">
                                            <button type="submit" class="btn btn-sm btn-danger">删除</button>
                                        </form>
                                    <?php endif; ?>
                                </div>
                            </td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
</html>

分组管理页面 (admin/groups.php)

<?php
session_start();
require

抱歉,评论功能暂时关闭!