如何用PHP项目实现用户等级权益?

wen java案例 2

本文目录导读:

如何用PHP项目实现用户等级权益?

  1. 核心设计思路
  2. 数据库设计
  3. PHP核心代码实现
  4. 使用示例
  5. 扩展建议

我来全面讲解如何用PHP项目实现用户等级权益系统。

核心设计思路

用户等级权益系统通常包含:

  1. 等级定义 - 不同等级的名称、条件、权益
  2. 经验值/积分机制 - 用户如何升级
  3. 权益控制 - 检查用户是否有权限使用特定功能

数据库设计

用户表扩展

CREATE TABLE `users` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `username` VARCHAR(50) NOT NULL,
    `points` INT DEFAULT 0,          -- 当前积分/经验值
    `level_id` INT DEFAULT 1,        -- 当前等级ID
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 示例数据
INSERT INTO `users` (`username`, `points`, `level_id`) VALUES
('user1', 1500, 3),
('user2', 200, 1);

等级表

CREATE TABLE `user_levels` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL,           -- 等级名称
    `min_points` INT NOT NULL,              -- 达到该等级所需最小积分
    `icon` VARCHAR(255) DEFAULT '',         -- 等级图标
    `description` TEXT,                     -- 等级描述
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 示例数据
INSERT INTO `user_levels` (`id`, `name`, `min_points`, `description`) VALUES
(1, '普通会员', 0, '基础功能'),
(2, '铜牌会员', 500, '部分高级功能'),
(3, '银牌会员', 1000, '中级功能+优先客服'),
(4, '金牌会员', 2000, '所有功能+专属客服'),
(5, '钻石会员', 5000, '至尊体验+定制服务');

权益表

CREATE TABLE `permissions` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL,           -- 权益名称
    `code` VARCHAR(100) NOT NULL UNIQUE,   -- 权益代码(用于代码判断)
    `description` TEXT
);
-- 示例数据
INSERT INTO `permissions` (`name`, `code`, `description`) VALUES
('查看基础数据', 'view_basic', '查看基本信息和数据'),
('导出Excel', 'export_excel', '导出数据到Excel'),
('批量操作', 'batch_operation', '批量处理数据'),
('高级筛选', 'advanced_filter', '使用高级筛选功能'),
('API接口', 'api_access', '访问API接口'),
('优先客服', 'priority_support', '获得优先客服支持');

等级-权益关联表

CREATE TABLE `level_permissions` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `level_id` INT NOT NULL,
    `permission_id` INT NOT NULL,
    FOREIGN KEY (`level_id`) REFERENCES `user_levels`(`id`),
    FOREIGN KEY (`permission_id`) REFERENCES `permissions`(`id`),
    UNIQUE KEY `unique_level_permission` (`level_id`, `permission_id`)
);
-- 示例数据:不同等级拥有的权益
INSERT INTO `level_permissions` (`level_id`, `permission_id`) VALUES
-- 普通会员(等级1)
(1, 1),  -- 只有查看基础数据
-- 铜牌会员(等级2)
(2, 1), (2, 2),  -- 可以查看和导出
-- 银牌会员(等级3)
(3, 1), (3, 2), (3, 3),  -- 增加了批量操作
-- 金牌会员(等级4)
(4, 1), (4, 2), (4, 3), (4, 4), (4, 6),  -- 增加了高级筛选和优先客服
-- 钻石会员(等级5)
(5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6);  -- 全部权限

经验值记录表(可选)

CREATE TABLE `points_log` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `user_id` INT NOT NULL,
    `points_change` INT NOT NULL,          -- 变动的经验值(正负)
    `reason` VARCHAR(255) NOT NULL,         -- 变动原因
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (`user_id`) REFERENCES `users`(`id`)
);

PHP核心代码实现

管理类

<?php
// UserLevelManager.php
class UserLevelManager {
    private $db;
    public function __construct($db) {
        $this->db = $db;
    }
    /**
     * 获取用户当前等级信息
     */
    public function getUserLevel($userId) {
        $sql = "SELECT u.*, ul.name as level_name, ul.min_points, ul.icon, ul.description 
                FROM users u 
                JOIN user_levels ul ON u.level_id = ul.id 
                WHERE u.id = ?";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([$userId]);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
    /**
     * 获取用户拥有的所有权限
     */
    public function getUserPermissions($userId) {
        $sql = "SELECT p.code, p.name, p.description 
                FROM users u 
                JOIN level_permissions lp ON u.level_id = lp.level_id 
                JOIN permissions p ON lp.permission_id = p.id 
                WHERE u.id = ?";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([$userId]);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    /**
     * 检查用户是否有特定权限
     */
    public function hasPermission($userId, $permissionCode) {
        $permissions = $this->getUserPermissions($userId);
        foreach ($permissions as $perm) {
            if ($perm['code'] === $permissionCode) {
                return true;
            }
        }
        return false;
    }
    /**
     * 添加经验值并检查是否需要升级
     */
    public function addPoints($userId, $points, $reason = '') {
        // 记录经验值变动
        $sql = "UPDATE users SET points = points + ? WHERE id = ?";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([$points, $userId]);
        // 记录日志
        $this->logPointsChange($userId, $points, $reason);
        // 检查升级
        $this->checkLevelUp($userId);
    }
    /**
     * 检查用户是否可以升级
     */
    private function checkLevelUp($userId) {
        // 获取用户当前积分
        $sql = "SELECT points, level_id FROM users WHERE id = ?";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([$userId]);
        $user = $stmt->fetch(PDO::FETCH_ASSOC);
        // 查找用户当前积分对应的最高等级
        $sql = "SELECT id FROM user_levels 
                WHERE min_points <= ? 
                ORDER BY min_points DESC 
                LIMIT 1";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([$user['points']]);
        $newLevel = $stmt->fetchColumn();
        // 如果等级有变化,更新用户等级
        if ($newLevel && $newLevel != $user['level_id']) {
            $sql = "UPDATE users SET level_id = ? WHERE id = ?";
            $stmt = $this->db->prepare($sql);
            $stmt->execute([$newLevel, $userId]);
            // 可以在这里添加升级通知逻辑
            $this->notifyLevelUp($userId, $newLevel);
        }
    }
    /**
     * 记录经验值变动日志
     */
    private function logPointsChange($userId, $points, $reason) {
        $sql = "INSERT INTO points_log (user_id, points_change, reason) VALUES (?, ?, ?)";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([$userId, $points, $reason]);
    }
    /**
     * 获取所有等级及其权益信息
     */
    public function getAllLevelsWithPermissions() {
        $sql = "SELECT ul.*, GROUP_CONCAT(p.name SEPARATOR ', ') as permissions 
                FROM user_levels ul 
                LEFT JOIN level_permissions lp ON ul.id = lp.level_id 
                LEFT JOIN permissions p ON lp.permission_id = p.id 
                GROUP BY ul.id 
                ORDER BY ul.min_points ASC";
        $stmt = $this->db->query($sql);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    /**
     * 获取用户升级进度
     */
    public function getUserProgress($userId) {
        $user = $this->getUserLevel($userId);
        // 查找下一等级
        $sql = "SELECT id, name, min_points FROM user_levels 
                WHERE min_points > ? 
                ORDER BY min_points ASC 
                LIMIT 1";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([$user['points']]);
        $nextLevel = $stmt->fetch(PDO::FETCH_ASSOC);
        return [
            'current_level' => $user,
            'next_level' => $nextLevel,
            'current_points' => $user['points'],
            'progress_percentage' => $nextLevel ? 
                ($user['points'] / $nextLevel['min_points']) * 100 : 100
        ];
    }
    // 简单的通知方法(可以扩展为更复杂的通知系统)
    private function notifyLevelUp($userId, $newLevelId) {
        // 这里可以实现邮件、短信或站内通知
        // 比如记录到通知表
        $sql = "INSERT INTO notifications (user_id, type, message) VALUES (?, 'level_up', ?)";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([$userId, "恭喜你升级到新等级!"]);
    }
}

应用层示例

<?php
// 中间件示例:检查用户是否有特定权限
function checkPermission($requiredPermission) {
    global $db; // 获取数据库连接
    // 假设用户已登录,session中有user_id
    $userId = $_SESSION['user_id'] ?? 0;
    if (!$userId) {
        header('Location: /login.php');
        exit;
    }
    $levelManager = new UserLevelManager($db);
    if (!$levelManager->hasPermission($userId, $requiredPermission)) {
        // 权限不足,返回错误
        http_response_code(403);
        echo json_encode(['error' => '权限不足,需要升级您的等级']);
        exit;
    }
}
// 使用示例
// 在需要权限控制的地方调用
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_GET['action'] === 'export') {
    checkPermission('export_excel');
    // 执行导出操作...
}
// API接口示例
class UserController {
    private $levelManager;
    public function __construct($db) {
        $this->levelManager = new UserLevelManager($db);
    }
    // 获取用户等级信息
    public function getLevelInfo() {
        $userId = $_SESSION['user_id'];
        $levelInfo = $this->levelManager->getUserLevel($userId);
        $progress = $this->levelManager->getUserProgress($userId);
        return [
            'success' => true,
            'data' => [
                'level' => $levelInfo,
                'progress' => $progress
            ]
        ];
    }
    // 增加经验值
    public function addExperience() {
        $userId = $_SESSION['user_id'];
        $points = $_POST['points']; // 注意:这里应该验证来源和合法性
        $reason = $_POST['reason'] ?? '系统奖励';
        $this->levelManager->addPoints($userId, $points, $reason);
        return ['success' => true, 'message' => '经验值已更新'];
    }
}
// 前端显示等级权益
function displayLevelBenefits() {
    global $db;
    $levelManager = new UserLevelManager($db);
    $levels = $levelManager->getAllLevelsWithPermissions();
    echo '<div class="level-benefits">';
    foreach ($levels as $level) {
        echo '<div class="level-card">';
        echo '<h3>' . htmlspecialchars($level['name']) . '</h3>';
        echo '<p>所需积分: ' . $level['min_points'] . '</p>';
        echo '<p>权益: ' . htmlspecialchars($level['permissions']) . '</p>';
        echo '</div>';
    }
    echo '</div>';
}

使用示例

<?php
// 数据库配置
$dsn = 'mysql:host=localhost;dbname=your_database;charset=utf8mb4';
$username = 'root';
$password = '';
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
try {
    $db = new PDO($dsn, $username, $password, $options);
    // 初始化等级管理器
    $levelManager = new UserLevelManager($db);
    // 模拟用户操作
    $userId = 1;
    // 1. 检查用户是否有导出权限
    if ($levelManager->hasPermission($userId, 'export_excel')) {
        echo "用户可以进行Excel导出<br>";
    } else {
        echo "用户无法进行Excel导出,需要升级<br>";
    }
    // 2. 增加经验值(比如完成某个任务)
    $levelManager->addPoints($userId, 200, '完成每日任务');
    echo "经验值已增加<br>";
    // 3. 获取用户升级进度
    $progress = $levelManager->getUserProgress($userId);
    echo "当前等级: " . $progress['current_level']['level_name'] . "<br>";
    echo "当前积分: " . $progress['current_points'] . "<br>";
    if ($progress['next_level']) {
        echo "下个等级所需积分: " . $progress['next_level']['min_points'] . "<br>";
        echo "升级进度: " . number_format($progress['progress_percentage'], 2) . "%<br>";
    }
} catch (PDOException $e) {
    echo "数据库错误: " . $e->getMessage();
}

扩展建议

  1. 等级上限控制:可添加max_level字段控制用户可达到的最高等级
  2. 多重等级系统:支持多个维度的等级系统(如会员等级、活跃等级)
  3. 权益缓存:使用Redis等缓存用户权限,提高性能
  4. 自动化规则:根据用户行为自动发放经验值
  5. 降级机制:设定经验值衰减规则,防止用户长期不活跃

这个系统设计灵活,可以根据实际需求进行调整和扩展。

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