首页 / 应用软件 / 详细指南,开发网站会员每日签到与连续登录奖励积分体系

详细指南,开发网站会员每日签到与连续登录奖励积分体系

详细指南:开发网站会员每日签到与连续登录奖励积分体系

摘要

在当今互联网时代,用户参与度和忠诚度是网站成功的关键因素之一。每日签到与连续登录奖励体系作为一种有效的用户激励策略,已被广泛应用于各类网站和应用程序中。本文将详细介绍如何通过WordPress程序的代码二次开发,实现一个功能完善的会员每日签到与连续登录奖励积分体系。我们将从系统设计、数据库结构、前端界面到后端逻辑进行全面讲解,帮助您打造一个能够提升用户活跃度的实用工具。


一、系统需求分析与设计

1.1 功能需求分析

在开始开发之前,我们需要明确系统应具备的核心功能:

  1. 每日签到功能:用户每天可进行一次签到,获得基础积分奖励
  2. 连续登录奖励:根据用户连续登录天数提供递增的积分奖励
  3. 签到日历展示:直观显示用户本月签到情况
  4. 积分记录查询:用户可查看自己的积分获取和消费记录
  5. 奖励规则配置:管理员可灵活配置签到奖励规则
  6. 用户等级体系:根据积分或连续签到天数划分用户等级
  7. 断签处理机制:定义连续签到中断后的处理规则

1.2 技术架构设计

本系统将基于WordPress平台开发,主要技术栈包括:

  • 前端:HTML5、CSS3、JavaScript(jQuery)、AJAX
  • 后端:PHP(WordPress核心API)
  • 数据库:MySQL(WordPress数据库)
  • 安全机制:WordPress非ces、数据验证与清理

1.3 数据库设计

我们需要在WordPress现有数据库结构基础上,添加以下自定义表:

-- 用户签到记录表
CREATE TABLE wp_signin_records (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT(20) NOT NULL,
    sign_date DATE NOT NULL,
    sign_time DATETIME NOT NULL,
    points_earned INT NOT NULL,
    continuous_days INT NOT NULL,
    UNIQUE KEY user_date (user_id, sign_date)
);

-- 用户积分总表
CREATE TABLE wp_user_points (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT(20) NOT NULL UNIQUE,
    total_points INT DEFAULT 0,
    current_points INT DEFAULT 0,
    last_sign_date DATE,
    continuous_days INT DEFAULT 0,
    max_continuous_days INT DEFAULT 0
);

-- 积分变动记录表
CREATE TABLE wp_points_log (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT(20) NOT NULL,
    points_change INT NOT NULL,
    change_type VARCHAR(50) NOT NULL,
    change_reason VARCHAR(255),
    change_time DATETIME NOT NULL,
    related_id BIGINT(20)
);

二、开发环境搭建与准备工作

2.1 开发环境配置

  1. 本地开发环境:安装XAMPP/MAMP或Local by Flywheel
  2. WordPress安装:下载最新版WordPress并完成基本配置
  3. 代码编辑器:推荐使用VS Code、PHPStorm或Sublime Text
  4. 浏览器开发者工具:用于调试前端代码

2.2 创建WordPress插件

我们将以插件形式实现签到功能,确保与主题的独立性:

  1. wp-content/plugins/目录下创建新文件夹daily-signin-rewards
  2. 创建主插件文件daily-signin-rewards.php
<?php
/**
 * Plugin Name: 每日签到与连续登录奖励系统
 * Plugin URI: https://yourwebsite.com/
 * Description: 为WordPress网站添加会员每日签到与连续登录奖励积分功能
 * Version: 1.0.0
 * Author: 您的名称
 * License: GPL v2 or later
 * Text Domain: daily-signin
 */

// 防止直接访问
if (!defined('ABSPATH')) {
    exit;
}

// 定义插件常量
define('DSR_VERSION', '1.0.0');
define('DSR_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('DSR_PLUGIN_URL', plugin_dir_url(__FILE__));

// 初始化插件
require_once DSR_PLUGIN_DIR . 'includes/class-dsr-core.php';

function dsr_init() {
    $plugin = new DSR_Core();
    $plugin->run();
}
add_action('plugins_loaded', 'dsr_init');

2.3 创建数据库表

在插件激活时创建所需数据库表:

// 在class-dsr-core.php中添加
class DSR_Core {
    // ... 其他代码
    
    public function activate() {
        $this->create_tables();
        $this->set_default_options();
    }
    
    private function create_tables() {
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();
        
        // 创建签到记录表
        $table_name = $wpdb->prefix . 'signin_records';
        $sql = "CREATE TABLE IF NOT EXISTS $table_name (
            id INT AUTO_INCREMENT PRIMARY KEY,
            user_id BIGINT(20) NOT NULL,
            sign_date DATE NOT NULL,
            sign_time DATETIME NOT NULL,
            points_earned INT NOT NULL,
            continuous_days INT NOT NULL,
            UNIQUE KEY user_date (user_id, sign_date)
        ) $charset_collate;";
        
        // 创建其他表...
        
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
    }
}

三、核心功能模块开发

3.1 用户签到功能实现

3.1.1 签到逻辑处理

class DSR_Signin_Handler {
    
    // 处理用户签到请求
    public function process_signin($user_id) {
        // 检查用户是否已签到
        if ($this->has_signed_today($user_id)) {
            return array(
                'success' => false,
                'message' => '您今天已经签到过了,请明天再来!'
            );
        }
        
        // 获取连续签到天数
        $continuous_days = $this->calculate_continuous_days($user_id);
        $continuous_days++;
        
        // 计算本次签到应得积分
        $points = $this->calculate_points($continuous_days);
        
        // 记录签到
        $this->record_signin($user_id, $points, $continuous_days);
        
        // 更新用户积分
        $this->update_user_points($user_id, $points, $continuous_days);
        
        // 记录积分变动
        $this->log_points_change($user_id, $points, 'daily_signin', '每日签到奖励');
        
        return array(
            'success' => true,
            'points' => $points,
            'continuous_days' => $continuous_days,
            'message' => sprintf('签到成功!获得%d积分,已连续签到%d天', $points, $continuous_days)
        );
    }
    
    // 检查用户今天是否已签到
    private function has_signed_today($user_id) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'signin_records';
        $today = current_time('Y-m-d');
        
        $count = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM $table_name WHERE user_id = %d AND sign_date = %s",
            $user_id, $today
        ));
        
        return $count > 0;
    }
    
    // 计算连续签到天数
    private function calculate_continuous_days($user_id) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'user_points';
        
        $result = $wpdb->get_row($wpdb->prepare(
            "SELECT last_sign_date, continuous_days FROM $table_name WHERE user_id = %d",
            $user_id
        ));
        
        if (!$result) {
            return 0;
        }
        
        $last_sign_date = $result->last_sign_date;
        $yesterday = date('Y-m-d', strtotime('-1 day'));
        
        // 如果昨天签到过,连续天数加1,否则重置为0
        if ($last_sign_date == $yesterday) {
            return $result->continuous_days;
        } else {
            return 0;
        }
    }
    
    // 计算签到积分(可根据连续天数递增)
    private function calculate_points($continuous_days) {
        $base_points = get_option('dsr_base_points', 10);
        
        // 连续签到奖励规则
        $continuous_bonus = 0;
        if ($continuous_days >= 7) {
            $continuous_bonus = get_option('dsr_week_bonus', 20);
        } elseif ($continuous_days >= 30) {
            $continuous_bonus = get_option('dsr_month_bonus', 50);
        }
        
        return $base_points + $continuous_bonus;
    }
}

3.1.2 AJAX签到接口

// 添加AJAX处理钩子
add_action('wp_ajax_dsr_signin', 'dsr_ajax_signin');
add_action('wp_ajax_nopriv_dsr_signin', 'dsr_ajax_signin_nopriv');

function dsr_ajax_signin() {
    // 安全检查
    check_ajax_referer('dsr_signin_nonce', 'nonce');
    
    // 验证用户登录状态
    if (!is_user_logged_in()) {
        wp_send_json_error(array('message' => '请先登录'));
        return;
    }
    
    $user_id = get_current_user_id();
    $signin_handler = new DSR_Signin_Handler();
    $result = $signin_handler->process_signin($user_id);
    
    if ($result['success']) {
        wp_send_json_success($result);
    } else {
        wp_send_json_error(array('message' => $result['message']));
    }
}

function dsr_ajax_signin_nopriv() {
    wp_send_json_error(array('message' => '请先登录'));
}

3.2 签到界面与交互设计

3.2.1 前端签到组件

<!-- 在插件中创建签到界面模板 -->
<div class="dsr-signin-container">
    <div class="dsr-signin-header">
        <h3>每日签到</h3>
        <p class="dsr-user-stats">
            当前积分: <span id="dsr-current-points">0</span> | 
            连续签到: <span id="dsr-continuous-days">0</span>天
        </p>
    </div>
    
    <div class="dsr-signin-calendar">
        <div class="dsr-calendar-header">
            <button class="dsr-prev-month">&lt;</button>
            <h4 id="dsr-current-month">2023年10月</h4>
            <button class="dsr-next-month">&gt;</button>
        </div>
        <div class="dsr-calendar-days">
            <!-- 通过JavaScript动态生成日历 -->
        </div>
    </div>
    
    <div class="dsr-signin-action">
        <button id="dsr-signin-btn" class="dsr-signin-button">
            <span class="dsr-button-text">立即签到</span>
            <span class="dsr-button-points">+10积分</span>
        </button>
        <p class="dsr-signin-tip" id="dsr-signin-status">今日尚未签到</p>
    </div>
    
    <div class="dsr-rewards-rules">
        <h4>签到规则</h4>
        <ul>
            <li>每日签到可获得10基础积分</li>
            <li>连续签到7天额外奖励20积分</li>
            <li>连续签到30天额外奖励50积分</li>
            <li>中断签到后连续天数将重新计算</li>
        </ul>
    </div>
</div>

3.2.2 日历生成与签到状态显示

// 前端JavaScript代码
jQuery(document).ready(function($) {
    // 初始化签到系统
    function initSigninSystem() {
        // 获取用户签到数据
        $.ajax({
            url: dsr_ajax.ajax_url,
            type: 'POST',
            data: {
                action: 'dsr_get_signin_data',
                nonce: dsr_ajax.nonce
            },
            success: function(response) {
                if (response.success) {
                    updateUserStats(response.data);
                    renderCalendar(response.data.calendar);
                    updateSigninButton(response.data.signed_today);
                }
            }
        });
        
        // 绑定签到按钮事件
        $('#dsr-signin-btn').on('click', function() {
            if ($(this).hasClass('signed')) {
                return;
            }
            
            $.ajax({
                url: dsr_ajax.ajax_url,
                type: 'POST',
                data: {
                    action: 'dsr_signin',
                    nonce: dsr_ajax.signin_nonce
                },
                success: function(response) {
                    if (response.success) {
                        showSigninSuccess(response.data);
                    } else {
                        alert(response.data.message);
                    }
                }
            });
        });
    }
    
    // 渲染签到日历
    function renderCalendar(calendarData) {
        const $calendar = $('.dsr-calendar-days');
        $calendar.empty();
        
        // 生成日历标题行(星期)
        const weekdays = ['日', '一', '二', '三', '四', '五', '六'];
        weekdays.forEach(day => {
            $calendar.append(`<div class="dsr-weekday">${day}</div>`);
        });
        
        // 生成日期格子
        calendarData.days.forEach(day => {
            let dayClass = 'dsr-calendar-day';
            if (day.is_today) dayClass += ' dsr-today';
            if (day.signed) dayClass += ' dsr-signed';
            if (!day.in_month) dayClass += ' dsr-other-month';
            
            const dayHtml = `
                <div class="${dayClass}" data-date="${day.date}">
                    <div class="dsr-day-number">${day.day}</div>
                    ${day.signed ? '<div class="dsr-signed-icon">✓</div>' : ''}
                    ${day.points ? `<div class="dsr-day-points">+${day.points}</div>` : ''}
                </div>
            `;
            
            $calendar.append(dayHtml);
        });
    }
    
    // 显示签到成功效果
    function showSigninSuccess(data) {
        const $btn = $('#dsr-signin-btn');
        $btn.addClass('signed').html('今日已签到');
        $('#dsr-signin-status').text('签到成功!');
        
        // 显示积分动画
        const $points = $('#dsr-current-points');
        const currentPoints = parseInt($points.text());
        const newPoints = currentPoints + data.points;
        
        animatePoints(currentPoints, newPoints, $points);
        $('#dsr-continuous-days').text(data.continuous_days);
        
        // 显示签到成功提示
        const $tip = $('<div class="dsr-success-tip">签到成功!+' + data.points + '积分</div>');
        $('.dsr-signin-action').append($tip);
        setTimeout(() => $tip.fadeOut(), 3000);
    }
    
    // 初始化
    initSigninSystem();
});

3.3 积分管理与等级系统

3.3.1 用户等级计算

class DSR_Level_System {
    
    // 根据积分计算用户等级
    public function calculate_level($points) {
        $levels = $this->get_levels_config();
        
        foreach ($levels as $level => $requirement) {
            if ($points >= $requirement['min_points']) {
                $current_level = $level;
            } else {
                break;
            }
        }
        
        return isset($current_level) ? $current_level : 1;
    }
    
    // 获取等级配置
    private function get_levels_config() {
        return array(
            1 => array('name' => '新手', 'min_points' => 0, 'icon' => '⭐'),
            2 => array('name' => '青铜', 'min_points' => 100, 'icon' => '🥉'),
            3 => array('name' => '白银', 'min_points' => 500, 'icon' => '🥈'),
            4 => array('name' => '黄金', 'min_points' => 2000, 'icon' => '🥇'),
            5 => array('name' => '铂金', 'min_points' => 5000, 'icon' => '💎'),
            6 => array('name' => '钻石', 'min_points' => 10000, 'icon' => '👑'),
            7 => array('name' => '至尊', 'min_points' => 20000, 'icon' => '🏆')
        );
    }
    
    // 获取用户等级信息
    public function get_user_level_info($user_id) {
        $points = $this->get_user_points($user_id);
        $level = $this->calculate_level($points);
        $levels = $this->get_levels_config();
        
        $current_level_info = $levels[$level];
        $next_level = $level + 1;
        $next_level_info = isset($levels[$next_level]) ? $levels[$next_level] : null;
        
        return array(
            'level' => $level,
            'level_name' => $current_level_info['name'],
            'level_icon' => $current_level_info['icon'],
            'current_points' => $points,
            'next_level_points' => $next_level_info ? $next_level_info['min_points'] : null,
            'points_to_next' => $next_level_info ? $next_level_info['min_points'] - $points : 0,
            'progress_percentage' => $next_level_info ? 
                min(100, round(($points / $next_level_info['min_points']) * 100, 2)) : 100
        );
    }
}

3.3

3.3.2 积分消费与兑换功能

class DSR_Points_Exchange {
    
    // 处理积分兑换请求
    public function process_exchange($user_id, $item_id, $quantity = 1) {
        // 获取兑换物品信息
        $exchange_item = $this->get_exchange_item($item_id);
        
        if (!$exchange_item) {
            return array(
                'success' => false,
                'message' => '兑换物品不存在'
            );
        }
        
        // 检查库存
        if ($exchange_item['stock'] !== -1 && $exchange_item['stock'] < $quantity) {
            return array(
                'success' => false,
                'message' => '库存不足'
            );
        }
        
        // 计算所需总积分
        $total_points_needed = $exchange_item['points'] * $quantity;
        
        // 检查用户积分是否足够
        $user_points = $this->get_user_available_points($user_id);
        if ($user_points < $total_points_needed) {
            return array(
                'success' => false,
                'message' => '积分不足,还需要' . ($total_points_needed - $user_points) . '积分'
            );
        }
        
        // 执行兑换
        $exchange_id = $this->record_exchange($user_id, $item_id, $quantity, $total_points_needed);
        
        // 扣除积分
        $this->deduct_points($user_id, $total_points_needed, $exchange_id);
        
        // 更新库存
        if ($exchange_item['stock'] !== -1) {
            $this->update_item_stock($item_id, $quantity);
        }
        
        // 发送兑换成功通知
        $this->send_exchange_notification($user_id, $exchange_item, $quantity);
        
        return array(
            'success' => true,
            'exchange_id' => $exchange_id,
            'message' => '兑换成功!' . $exchange_item['name'] . '×' . $quantity
        );
    }
    
    // 获取可兑换物品列表
    public function get_exchange_items($category = 'all') {
        global $wpdb;
        $table_name = $wpdb->prefix . 'dsr_exchange_items';
        
        $where = "status = 'publish'";
        if ($category !== 'all') {
            $where .= $wpdb->prepare(" AND category = %s", $category);
        }
        
        $items = $wpdb->get_results(
            "SELECT * FROM $table_name WHERE $where ORDER BY sort_order ASC, id DESC",
            ARRAY_A
        );
        
        return $items;
    }
}

四、后台管理功能开发

4.1 管理菜单与界面

class DSR_Admin {
    
    public function __construct() {
        add_action('admin_menu', array($this, 'add_admin_menu'));
        add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
    }
    
    // 添加管理菜单
    public function add_admin_menu() {
        add_menu_page(
            '签到系统',
            '签到系统',
            'manage_options',
            'dsr-dashboard',
            array($this, 'render_dashboard'),
            'dashicons-calendar-alt',
            30
        );
        
        add_submenu_page(
            'dsr-dashboard',
            '签到统计',
            '签到统计',
            'manage_options',
            'dsr-statistics',
            array($this, 'render_statistics')
        );
        
        add_submenu_page(
            'dsr-dashboard',
            '奖励设置',
            '奖励设置',
            'manage_options',
            'dsr-settings',
            array($this, 'render_settings')
        );
        
        add_submenu_page(
            'dsr-dashboard',
            '积分兑换',
            '积分兑换',
            'manage_options',
            'dsr-exchange',
            array($this, 'render_exchange')
        );
        
        add_submenu_page(
            'dsr-dashboard',
            '用户积分',
            '用户积分',
            'manage_options',
            'dsr-users',
            array($this, 'render_users')
        );
    }
    
    // 渲染仪表盘
    public function render_dashboard() {
        ?>
        <div class="wrap dsr-admin-dashboard">
            <h1>签到系统仪表盘</h1>
            
            <div class="dsr-stats-cards">
                <div class="dsr-stat-card">
                    <h3>今日签到人数</h3>
                    <p class="dsr-stat-number"><?php echo $this->get_today_signin_count(); ?></p>
                </div>
                
                <div class="dsr-stat-card">
                    <h3>本月签到总数</h3>
                    <p class="dsr-stat-number"><?php echo $this->get_month_signin_count(); ?></p>
                </div>
                
                <div class="dsr-stat-card">
                    <h3>总发放积分</h3>
                    <p class="dsr-stat-number"><?php echo $this->get_total_points_given(); ?></p>
                </div>
                
                <div class="dsr-stat-card">
                    <h3>活跃用户数</h3>
                    <p class="dsr-stat-number"><?php echo $this->get_active_users_count(); ?></p>
                </div>
            </div>
            
            <div class="dsr-charts-section">
                <h2>最近30天签到趋势</h2>
                <canvas id="dsr-signin-chart" width="800" height="300"></canvas>
            </div>
            
            <div class="dsr-recent-activity">
                <h2>最近签到记录</h2>
                <table class="wp-list-table widefat fixed striped">
                    <thead>
                        <tr>
                            <th>用户</th>
                            <th>签到时间</th>
                            <th>获得积分</th>
                            <th>连续天数</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php $this->display_recent_signins(); ?>
                    </tbody>
                </table>
            </div>
        </div>
        <?php
    }
}

4.2 奖励规则设置界面

// 奖励设置页面
public function render_settings() {
    // 保存设置
    if (isset($_POST['submit']) && check_admin_referer('dsr_settings_save')) {
        $this->save_settings($_POST);
        echo '<div class="notice notice-success"><p>设置已保存!</p></div>';
    }
    
    $settings = $this->get_settings();
    ?>
    <div class="wrap">
        <h1>签到奖励设置</h1>
        
        <form method="post" action="">
            <?php wp_nonce_field('dsr_settings_save'); ?>
            
            <table class="form-table">
                <tr>
                    <th scope="row">基础积分</th>
                    <td>
                        <input type="number" name="base_points" 
                               value="<?php echo esc_attr($settings['base_points']); ?>" 
                               min="1" max="1000" />
                        <p class="description">用户每日签到可获得的基础积分</p>
                    </td>
                </tr>
                
                <tr>
                    <th scope="row">连续签到7天奖励</th>
                    <td>
                        <input type="number" name="week_bonus" 
                               value="<?php echo esc_attr($settings['week_bonus']); ?>" 
                               min="0" max="1000" />
                        <p class="description">连续签到7天时的额外奖励积分</p>
                    </td>
                </tr>
                
                <tr>
                    <th scope="row">连续签到30天奖励</th>
                    <td>
                        <input type="number" name="month_bonus" 
                               value="<?php echo esc_attr($settings['month_bonus']); ?>" 
                               min="0" max="5000" />
                        <p class="description">连续签到30天时的额外奖励积分</p>
                    </td>
                </tr>
                
                <tr>
                    <th scope="row">补签卡消耗积分</th>
                    <td>
                        <input type="number" name="re_sign_cost" 
                               value="<?php echo esc_attr($settings['re_sign_cost']); ?>" 
                               min="0" max="1000" />
                        <p class="description">使用补签卡需要消耗的积分</p>
                    </td>
                </tr>
                
                <tr>
                    <th scope="row">断签规则</th>
                    <td>
                        <select name="break_rule">
                            <option value="reset" <?php selected($settings['break_rule'], 'reset'); ?>>
                                完全重置
                            </option>
                            <option value="keep_half" <?php selected($settings['break_rule'], 'keep_half'); ?>>
                                保留一半连续天数
                            </option>
                            <option value="keep_max" <?php selected($settings['break_rule'], 'keep_max'); ?>>
                                保留历史最高记录
                            </option>
                        </select>
                        <p class="description">连续签到中断后的处理方式</p>
                    </td>
                </tr>
                
                <tr>
                    <th scope="row">特殊日期奖励</th>
                    <td>
                        <textarea name="special_dates" rows="5" cols="50"><?php 
                            echo esc_textarea($settings['special_dates']); 
                        ?></textarea>
                        <p class="description">格式:日期=奖励积分,每行一个,如:01-01=100(元旦)</p>
                    </td>
                </tr>
            </table>
            
            <?php submit_button('保存设置'); ?>
        </form>
    </div>
    <?php
}

五、高级功能扩展

5.1 补签卡功能

class DSR_ReSign_Card {
    
    // 使用补签卡
    public function use_resign_card($user_id, $target_date) {
        // 检查目标日期是否合法
        if (!$this->is_valid_resign_date($target_date)) {
            return array(
                'success' => false,
                'message' => '该日期不可补签'
            );
        }
        
        // 检查是否已签到
        if ($this->has_signed_on_date($user_id, $target_date)) {
            return array(
                'success' => false,
                'message' => '该日期已签到'
            );
        }
        
        // 检查补签卡数量
        $card_count = $this->get_user_resign_card_count($user_id);
        if ($card_count < 1) {
            return array(
                'success' => false,
                'message' => '补签卡不足'
            );
        }
        
        // 消耗补签卡
        $this->deduct_resign_card($user_id, 1);
        
        // 执行补签
        $signin_handler = new DSR_Signin_Handler();
        $result = $signin_handler->process_resign($user_id, $target_date);
        
        if ($result['success']) {
            // 记录补签日志
            $this->log_resign_usage($user_id, $target_date);
            
            return array(
                'success' => true,
                'message' => '补签成功!',
                'data' => $result
            );
        }
        
        return $result;
    }
    
    // 购买补签卡
    public function buy_resign_card($user_id, $quantity = 1) {
        $card_price = get_option('dsr_resign_card_price', 100);
        $total_cost = $card_price * $quantity;
        
        // 检查用户积分
        $user_points = $this->get_user_points($user_id);
        if ($user_points < $total_cost) {
            return array(
                'success' => false,
                'message' => '积分不足'
            );
        }
        
        // 扣除积分
        $this->deduct_points($user_id, $total_cost);
        
        // 增加补签卡
        $this->add_resign_cards($user_id, $quantity);
        
        // 记录交易
        $this->log_card_purchase($user_id, $quantity, $total_cost);
        
        return array(
            'success' => true,
            'message' => "成功购买{$quantity}张补签卡,消耗{$total_cost}积分"
        );
    }
}

5.2 签到提醒与推送

class DSR_Notifications {
    
    // 发送每日签到提醒
    public function send_daily_reminder() {
        // 获取今天未签到的活跃用户
        $users = $this->get_unsigned_active_users();
        
        foreach ($users as $user) {
            // 发送站内信
            $this->send_site_message($user->ID);
            
            // 发送邮件提醒(如果用户开启了邮件通知)
            if ($this->user_wants_email($user->ID)) {
                $this->send_email_reminder($user);
            }
            
            // 发送微信/APP推送(如果有集成)
            if ($this->has_wechat_integration()) {
                $this->send_wechat_push($user->ID);
            }
        }
    }
    
    // 发送连续签到成就通知
    public function send_achievement_notification($user_id, $achievement_type, $data) {
        $user = get_userdata($user_id);
        $message = '';
        
        switch ($achievement_type) {
            case 'continuous_7':
                $message = "恭喜您连续签到7天!获得额外奖励积分。";
                break;
            case 'continuous_30':
                $message = "恭喜您连续签到30天!获得月度签到王称号。";
                break;
            case 'total_points':
                $message = "恭喜您总积分达到{$data['points']}!升级为{$data['level']}。";
                break;
        }
        
        // 添加站内通知
        $this->add_site_notification($user_id, $message, 'achievement');
        
        // 发送邮件
        $this->send_achievement_email($user, $message);
    }
}

5.3 社交分享激励

class DSR_Social_Share {
    
    // 处理社交分享奖励
    public function process_share_reward($user_id, $platform, $content_type) {
        // 检查今日是否已分享
        if ($this->has_shared_today($user_id, $platform)) {
            return array(
                'success' => false,
                'message' => '今日已通过此平台分享'
            );
        }
        
        // 获取分享奖励积分
        $points = $this->get_share_points($platform, $content_type);
        
        // 记录分享
        $this->record_share($user_id, $platform, $content_type, $points);
        
        // 奖励积分
        $this->add_points($user_id, $points, 'social_share', "{$platform}分享奖励");
        
        return array(
            'success' => true,
            'points' => $points,
            'message' => "分享成功!获得{$points}积分"
        );
    }
    
    // 获取分享按钮HTML
    public function get_share_buttons($post_id = null) {
        $post_id = $post_id ?: get_the_ID();
        $share_url = get_permalink($post_id);
        $title = get_the_title($post_id);
        
        $buttons = array(
            'wechat' => array(
                'name' => '微信',
                'icon' => 'wechat',
                'url' => 'javascript:;',
                'class' => 'dsr-share-wechat',
                'points' => 5
            ),
            'weibo' => array(
                'name' => '微博',
                'icon' => 'weibo',
                'url' => "http://service.weibo.com/share/share.php?url={$share_url}&title={$title}",
                'class' => 'dsr-share-weibo',
                'points' => 10
            ),
            'qq' => array(
                'name' => 'QQ',
                'icon' => 'qq',
                'url' => "https://connect.qq.com/widget/shareqq/index.html?url={$share_url}&title={$title}",
                'class' => 'dsr-share-qq',
                'points' => 8
            )
        );
        
        ob_start();
        ?>
        <div class="dsr-share-buttons">
            <p>分享到社交网络可获得额外积分:</p>
            <div class="dsr-share-platforms">
                <?php foreach ($buttons as $platform => $button): ?>
                <a href="<?php echo $button['url']; ?>" 
                   class="dsr-share-button <?php echo $button['class']; ?>"
                   data-platform="<?php echo $platform; ?>"
                   data-points="<?php echo $button['points']; ?>"
                   target="_blank">
                    <span class="dsr-share-icon"><?php echo $button['icon']; ?></span>
                    <span class="dsr-share-text"><?php echo $button['name']; ?></span>
                    <span class="dsr-share-points">+<?php echo $button['points']; ?>积分</span>
                </a>
                <?php endforeach; ?>
            </div>
        </div>
        <?php
        return ob_get_clean();
    }
}

六、性能优化与安全加固

6.1 数据库查询优化

class DSR_Optimizer {
    
    // 使用缓存优化频繁查询
    public function get_user_points_cached($user_id) {
        $cache_key = "dsr_user_points_{$user_id}";
        $points = wp_cache_get($cache_key, 'dsr');
        
        if (false === $points) {
            global $wpdb;
            $table_name = $wpdb->prefix . 'user_points';
            
            $points = $wpdb->get_var($wpdb->prepare(
                "SELECT current_points FROM $table_name WHERE user_id = %d",
                $user_id
            ));
            
            if (is_null($points)) {
                $points = 0;
            }
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5314.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

工作时间:周一至周五,9:00-17:30,节假日休息
返回顶部