首页 / 应用软件 / 详细指南,开发网站活动在线抽奖与中奖结果公证展示系统

详细指南,开发网站活动在线抽奖与中奖结果公证展示系统

详细指南:开发网站活动在线抽奖与中奖结果公证展示系统

摘要

随着互联网活动的日益普及,在线抽奖已成为企业营销、社区互动和用户增长的重要手段。然而,如何确保抽奖过程的公平性和中奖结果的公信力,一直是组织者面临的挑战。本文将详细介绍如何通过WordPress程序的代码二次开发,实现一个功能完善的在线抽奖与中奖结果公证展示系统。我们将从系统设计、功能实现、安全性保障到用户体验优化等多个维度进行全面解析,帮助开发者构建一个既实用又可信赖的在线抽奖平台。


一、系统概述与需求分析

1.1 在线抽奖系统的核心价值

在线抽奖系统不仅是一个简单的随机选择工具,更是一个集用户参与、活动管理、结果公证和营销推广于一体的综合平台。一个优秀的在线抽奖系统应具备以下特点:

  • 公平性:确保每个参与者有平等的获奖机会
  • 透明性:抽奖过程和中奖结果可追溯、可验证
  • 易用性:用户参与简单,管理后台操作便捷
  • 可扩展性:支持多种抽奖规则和活动形式
  • 安全性:防止作弊和恶意攻击

1.2 系统功能需求

基于WordPress开发在线抽奖系统,我们需要实现以下核心功能:

  1. 用户参与模块:注册、登录、参与抽奖
  2. 抽奖活动管理:创建、编辑、删除抽奖活动
  3. 抽奖规则设置:参与条件、中奖人数、奖品设置
  4. 实时抽奖引擎:公平的随机算法实现
  5. 中奖结果展示:可视化展示中奖结果
  6. 公证验证系统:提供抽奖过程的可验证证据
  7. 数据统计与分析:参与数据、中奖率等统计

1.3 技术选型与架构设计

选择WordPress作为开发基础有以下优势:

  • 成熟的用户管理系统
  • 丰富的插件生态和主题支持
  • 良好的扩展性和二次开发能力
  • 广泛的技术社区支持

系统架构采用WordPress核心+自定义插件+定制主题的模式,确保系统稳定性的同时提供高度定制化功能。


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

2.1 开发环境配置

在开始开发前,需要准备以下环境:

  1. 本地开发环境:推荐使用XAMPP、MAMP或Local by Flywheel
  2. WordPress安装:最新稳定版WordPress
  3. 代码编辑器:VS Code、PHPStorm等
  4. 版本控制:Git
  5. 调试工具:Query Monitor、Debug Bar等WordPress调试插件

2.2 创建自定义插件

我们将创建一个独立插件来管理所有抽奖功能:

<?php
/**
 * Plugin Name: 在线抽奖与公证系统
 * Plugin URI: https://yourwebsite.com/
 * Description: 功能完整的在线抽奖与中奖结果公证展示系统
 * Version: 1.0.0
 * Author: Your Name
 * License: GPL v2 or later
 */

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

// 定义插件常量
define('LOTTERY_PLUGIN_PATH', plugin_dir_path(__FILE__));
define('LOTTERY_PLUGIN_URL', plugin_dir_url(__FILE__));
define('LOTTERY_VERSION', '1.0.0');

// 初始化插件
require_once LOTTERY_PLUGIN_PATH . 'includes/class-lottery-core.php';

function lottery_init() {
    $lottery = new Lottery_Core();
    $lottery->init();
}
add_action('plugins_loaded', 'lottery_init');

2.3 数据库设计

我们需要创建自定义数据表来存储抽奖活动、参与记录和中奖信息:

// 在插件激活时创建数据表
function lottery_create_tables() {
    global $wpdb;
    
    $charset_collate = $wpdb->get_charset_collate();
    
    // 抽奖活动表
    $table_activities = $wpdb->prefix . 'lottery_activities';
    $sql_activities = "CREATE TABLE IF NOT EXISTS $table_activities (
        id INT(11) NOT NULL AUTO_INCREMENT,
        title VARCHAR(255) NOT NULL,
        description TEXT,
        start_date DATETIME NOT NULL,
        end_date DATETIME NOT NULL,
        status ENUM('draft', 'active', 'ended', 'cancelled') DEFAULT 'draft',
        rules TEXT,
        prizes TEXT,
        winner_count INT(11) DEFAULT 1,
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id)
    ) $charset_collate;";
    
    // 参与记录表
    $table_participants = $wpdb->prefix . 'lottery_participants';
    $sql_participants = "CREATE TABLE IF NOT EXISTS $table_participants (
        id INT(11) NOT NULL AUTO_INCREMENT,
        activity_id INT(11) NOT NULL,
        user_id INT(11),
        user_email VARCHAR(255),
        user_name VARCHAR(255),
        ip_address VARCHAR(45),
        user_agent TEXT,
        participation_code VARCHAR(100) UNIQUE,
        status ENUM('valid', 'invalid') DEFAULT 'valid',
        participated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id),
        INDEX activity_user (activity_id, user_id),
        FOREIGN KEY (activity_id) REFERENCES $table_activities(id) ON DELETE CASCADE
    ) $charset_collate;";
    
    // 中奖记录表
    $table_winners = $wpdb->prefix . 'lottery_winners';
    $sql_winners = "CREATE TABLE IF NOT EXISTS $table_winners (
        id INT(11) NOT NULL AUTO_INCREMENT,
        activity_id INT(11) NOT NULL,
        participant_id INT(11) NOT NULL,
        prize_level INT(11),
        prize_name VARCHAR(255),
        awarded_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        verification_hash VARCHAR(255),
        PRIMARY KEY (id),
        FOREIGN KEY (activity_id) REFERENCES $table_activities(id) ON DELETE CASCADE,
        FOREIGN KEY (participant_id) REFERENCES $table_participants(id) ON DELETE CASCADE
    ) $charset_collate;";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql_activities);
    dbDelta($sql_participants);
    dbDelta($sql_winners);
}
register_activation_hook(__FILE__, 'lottery_create_tables');

三、核心功能模块开发

3.1 抽奖活动管理模块

3.1.1 后台管理界面

创建抽奖活动管理后台页面:

class Lottery_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',
            'lottery-management',
            array($this, 'render_admin_page'),
            'dashicons-tickets-alt',
            30
        );
        
        add_submenu_page(
            'lottery-management',
            '抽奖活动',
            '活动列表',
            'manage_options',
            'lottery-activities',
            array($this, 'render_activities_page')
        );
        
        add_submenu_page(
            'lottery-management',
            '添加抽奖活动',
            '添加活动',
            'manage_options',
            'lottery-add-activity',
            array($this, 'render_add_activity_page')
        );
    }
    
    public function render_activities_page() {
        include LOTTERY_PLUGIN_PATH . 'admin/views/activities-list.php';
    }
    
    public function render_add_activity_page() {
        include LOTTERY_PLUGIN_PATH . 'admin/views/activity-form.php';
    }
    
    public function enqueue_admin_scripts($hook) {
        if (strpos($hook, 'lottery') !== false) {
            wp_enqueue_style('lottery-admin-style', LOTTERY_PLUGIN_URL . 'assets/css/admin.css');
            wp_enqueue_script('lottery-admin-script', LOTTERY_PLUGIN_URL . 'assets/js/admin.js', array('jquery', 'jquery-ui-datepicker'), LOTTERY_VERSION, true);
            wp_enqueue_style('jquery-ui-style', '//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css');
        }
    }
}

3.1.2 活动表单与数据保存

// 处理活动表单提交
function lottery_save_activity() {
    if (!isset($_POST['lottery_nonce']) || !wp_verify_nonce($_POST['lottery_nonce'], 'lottery_save_activity')) {
        wp_die('安全验证失败');
    }
    
    global $wpdb;
    $table_name = $wpdb->prefix . 'lottery_activities';
    
    $data = array(
        'title' => sanitize_text_field($_POST['title']),
        'description' => wp_kses_post($_POST['description']),
        'start_date' => sanitize_text_field($_POST['start_date']),
        'end_date' => sanitize_text_field($_POST['end_date']),
        'status' => sanitize_text_field($_POST['status']),
        'winner_count' => intval($_POST['winner_count']),
        'rules' => wp_json_encode($_POST['rules']),
        'prizes' => wp_json_encode($_POST['prizes'])
    );
    
    if (isset($_POST['activity_id']) && !empty($_POST['activity_id'])) {
        // 更新现有活动
        $wpdb->update($table_name, $data, array('id' => intval($_POST['activity_id'])));
        $message = '活动更新成功';
    } else {
        // 创建新活动
        $wpdb->insert($table_name, $data);
        $message = '活动创建成功';
    }
    
    wp_redirect(admin_url('admin.php?page=lottery-activities&message=' . urlencode($message)));
    exit;
}
add_action('admin_post_lottery_save_activity', 'lottery_save_activity');

3.2 用户参与模块

3.2.1 前端参与界面

创建短代码让用户可以在任何页面参与抽奖:

class Lottery_Shortcodes {
    
    public function __construct() {
        add_shortcode('lottery_participation', array($this, 'render_participation_form'));
        add_shortcode('lottery_results', array($this, 'render_results_display'));
    }
    
    public function render_participation_form($atts) {
        $atts = shortcode_atts(array(
            'activity_id' => 0,
            'title' => '参与抽奖'
        ), $atts);
        
        $activity_id = intval($atts['activity_id']);
        
        if (!$activity_id) {
            return '<p>错误:未指定抽奖活动</p>';
        }
        
        // 检查活动状态
        $activity = $this->get_activity($activity_id);
        
        if (!$activity) {
            return '<p>错误:抽奖活动不存在</p>';
        }
        
        // 检查活动时间
        $current_time = current_time('mysql');
        if ($current_time < $activity->start_date) {
            return '<div class="lottery-notice">抽奖活动尚未开始</div>';
        }
        
        if ($current_time > $activity->end_date) {
            return '<div class="lottery-notice">抽奖活动已结束</div>';
        }
        
        // 检查用户是否已参与
        $user_id = get_current_user_id();
        $has_participated = $this->check_participation($activity_id, $user_id);
        
        if ($has_participated) {
            return '<div class="lottery-notice">您已参与本次抽奖,请等待开奖结果</div>';
        }
        
        // 渲染参与表单
        ob_start();
        include LOTTERY_PLUGIN_PATH . 'public/views/participation-form.php';
        return ob_get_clean();
    }
    
    private function get_activity($activity_id) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'lottery_activities';
        return $wpdb->get_row($wpdb->prepare(
            "SELECT * FROM $table_name WHERE id = %d AND status = 'active'",
            $activity_id
        ));
    }
    
    private function check_participation($activity_id, $user_id) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'lottery_participants';
        
        if ($user_id) {
            return $wpdb->get_var($wpdb->prepare(
                "SELECT COUNT(*) FROM $table_name WHERE activity_id = %d AND user_id = %d",
                $activity_id, $user_id
            ));
        }
        
        return false;
    }
}

3.2.2 参与表单处理

// 处理用户参与请求
function lottery_handle_participation() {
    // 验证nonce
    if (!isset($_POST['lottery_nonce']) || !wp_verify_nonce($_POST['lottery_nonce'], 'lottery_participate')) {
        wp_send_json_error(array('message' => '安全验证失败'));
    }
    
    $activity_id = intval($_POST['activity_id']);
    
    // 验证活动
    $activity = lottery_get_activity($activity_id);
    if (!$activity || $activity->status !== 'active') {
        wp_send_json_error(array('message' => '抽奖活动无效或已结束'));
    }
    
    // 检查时间
    $current_time = current_time('mysql');
    if ($current_time < $activity->start_date || $current_time > $activity->end_date) {
        wp_send_json_error(array('message' => '不在抽奖活动时间内'));
    }
    
    // 获取用户信息
    $user_id = get_current_user_id();
    $user_email = '';
    $user_name = '';
    
    if ($user_id) {
        $user = get_userdata($user_id);
        $user_email = $user->user_email;
        $user_name = $user->display_name;
    } else {
        // 匿名用户需要提供邮箱
        if (empty($_POST['user_email']) || !is_email($_POST['user_email'])) {
            wp_send_json_error(array('message' => '请输入有效的邮箱地址'));
        }
        $user_email = sanitize_email($_POST['user_email']);
        $user_name = !empty($_POST['user_name']) ? sanitize_text_field($_POST['user_name']) : '';
    }
    
    // 检查是否已参与
    if (lottery_check_participation($activity_id, $user_id, $user_email)) {
        wp_send_json_error(array('message' => '您已经参与过本次抽奖'));
    }
    
    // 生成参与码
    $participation_code = lottery_generate_participation_code();
    
    // 保存参与记录
    global $wpdb;
    $table_name = $wpdb->prefix . 'lottery_participants';
    
    $data = array(
        'activity_id' => $activity_id,
        'user_id' => $user_id,
        'user_email' => $user_email,
        'user_name' => $user_name,
        'ip_address' => lottery_get_client_ip(),
        'user_agent' => $_SERVER['HTTP_USER_AGENT'],
        'participation_code' => $participation_code
    );
    
    $result = $wpdb->insert($table_name, $data);
    
    if ($result) {
        // 发送确认邮件
        lottery_send_participation_email($user_email, $activity, $participation_code);
        
        wp_send_json_success(array(
            'message' => '参与成功!您的参与码是:' . $participation_code,
            'code' => $participation_code
        ));
    } else {
        wp_send_json_error(array('message' => '参与失败,请稍后重试'));
    }
}
add_action('wp_ajax_lottery_participate', 'lottery_handle_participation');
add_action('wp_ajax_nopriv_lottery_participate', 'lottery_handle_participation');

3.3 抽奖引擎与随机算法

3.3.1 公平随机算法实现

class Lottery_Draw_Engine {
    
    /**
     * 执行抽奖
     * @param int $activity_id 活动ID
     * @param int $winner_count 中奖人数
     * @return array 中奖者列表
     */
    public function draw_winners($activity_id, $winner_count) {
        // 获取所有有效参与者
        $participants = $this->get_valid_participants($activity_id);
        
        if (empty($participants)) {
            return array('success' => false, 'message' => '没有有效参与者');
        }
        
        if (count($participants) < $winner_count) {
            return array('success' => false, 'message' => '参与者数量少于中奖人数');
        }
        
        // 使用加密安全的随机数生成器
        $winners = $this->secure_random_draw($participants, $winner_count);
        
        // 记录中奖结果
        $result = $this->record_winners($activity_id, $winners);
        
        // 生成可验证的抽奖证明
        $verification_data = $this->generate_verification_data($activity_id, $participants, $winners);
        
        return array(
            'success' => true,
            'winners' => $winners,
            'verification_hash' => $verification_data['hash'],
            'verification_data' => $verification_data['data']
        );
    }
    
    /**
     * 加密安全的随机抽选算法
     */
    private function secure_random_draw($participants, $winner_count) {
        $total = count($participants);
        $winners = array();
        $selected_indices = array();
        
        // 使用加密安全的随机数生成器
        while (count($winners) < $winner_count) {
            // 生成随机索引
            $random_index = random_int(0, $total - 1);
            
            // 确保不重复选择
            if (!in_array($random_index, $selected_indices)) {
                $selected_indices[] = $random_index;
                $winners[] = $participants[$random_index];
            }
        }
        
        return $winners;
    }
    
    /**
     * 生成可验证的抽奖证明
     */
    private function generate_verification_data($activity_id, $participants, $winners) {
        // 创建抽奖数据快照
        $snapshot = array(
            'activity_id' => $activity_id,
            'draw_time' => current_time('mysql'),
            'total_participants' => count($participants),
            'participant_ids' => array_column($participants, 'id'),
            'winner_ids' => array_column($winners, 'id'),
            'server_seed' => bin2hex(random_bytes(32)),
            'client_seed' => $this->get_client_seed($activity_id)
        );
        
        // 计算验证哈希
        $hash_data = json_encode($snapshot);
        $verification_hash = hash('sha256', $hash_data);
        
        // 保存验证数据
        $this->save_verification_data($activity_id, $hash_data, $verification_hash);
        
        return array(
            'hash' => $verification_hash,
            'data' => $snapshot
        );
    }
    
    /**
     * 获取客户端种子(基于活动数据)
     */
    private function get_client_seed($activity_id) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'lottery_activities';
        
        $activity = $wpdb->get_row($wpdb->prepare(
            "SELECT title, start_date, end_date FROM $table_name WHERE id = %d",
            $activity_id
        ));
        
        if ($activity) {
            return hash('sha256', $activity->title . $activity->start_date . $activity->end_date);
        }
        
        return hash('sha256', (string) $activity_id);
    }
}

3.3.2 批量抽奖与结果处理

// 后台执行抽奖的接口
function lottery_execute_draw() {
    if (!current_user_can('manage_options')) {
        wp_die('权限不足');
    }
    
    $activity_id = intval($_POST['activity_id']);
    
    // 验证活动状态
    $activity = lottery_get_activity($activity_id);
    if (!$activity || $activity->status !== 'active') {
        wp_send_json_error(array('message' => '活动状态不允许抽奖'));
    }
    
    // 检查是否已开奖
    if (lottery_has_winners($activity_id)) {
        wp_send_json_error(array('message' => '该活动已开奖'));
    }
    
    // 执行抽奖
    $draw_engine = new Lottery_Draw_Engine();
    $result = $draw_engine->draw_winners($activity_id, $activity->winner_count);
    
    if ($result['success']) {
        // 更新活动状态
        lottery_update_activity_status($activity_id, 'ended');
        
        // 发送中奖通知
        lottery_send_winner_notifications($activity_id, $result['winners']);
        
        wp_send_json_success(array(
            'message' => '抽奖完成',
            'winners' => $result['winners'],
            'verification_hash' => $result['verification_hash']
        ));
    } else {
        wp_send_json_error(array('message' => $result['message']));
    }
}
add_action('wp_ajax_lottery_execute_draw', 'lottery_execute_draw');

3.4 中奖结果公证展示系统

3.4.1 可视化结果展示

class Lottery_Results_Display {
    
    public function render_results($activity_id) {
        $activity = lottery_get_activity($activity_id);
        $winners = lottery_get_winners($activity_id);
        $verification_data = lottery_get_verification_data($activity_id);
        
        ob_start();
        ?>
        <div class="lottery-results-container">
            <div class="lottery-results-header">
                <h2><?php echo esc_html($activity->title); ?> - 中奖结果</h2>
                <div class="lottery-meta">
                    <span class="lottery-date">开奖时间: <?php echo date('Y-m-d H:i:s', strtotime($verification_data['draw_time'])); ?></span>
                    <span class="lottery-participants">参与人数: <?php echo $verification_data['total_participants']; ?></span>
                </div>
            </div>
            
            <div class="lottery-verification-section">
                <h3>抽奖公正性验证</h3>
                <div class="verification-info">
                    <p>验证哈希: <code class="verification-hash"><?php echo esc_html($verification_data['hash']); ?></code></p>
                    <button class="btn-verify" onclick="lotteryShowVerificationDetails()">查看验证详情</button>
                </div>
                
                <div id="verification-details" style="display: none;">
                    <h4>抽奖数据快照</h4>
                    <pre><?php echo json_encode($verification_data['data'], JSON_PRETTY_PRINT); ?></pre>
                    <p>您可以使用SHA256哈希验证器验证上述数据的哈希值是否匹配。</p>
                </div>
            </div>
            
            <div class="lottery-winners-section">
                <h3>中奖名单</h3>
                <?php if (!empty($winners)): ?>
                    <div class="winners-list">
                        <?php foreach ($winners as $index => $winner): ?>
                            <div class="winner-item">
                                <div class="winner-rank"><?php echo $index + 1; ?></div>
                                <div class="winner-info">
                                    <h4><?php echo esc_html($winner->prize_name); ?></h4>
                                    <p class="winner-name">
                                        <?php 
                                        if ($winner->user_name) {
                                            echo esc_html(mb_substr($winner->user_name, 0, 1) . '**');
                                        } else {
                                            echo esc_html(substr($winner->user_email, 0, 3) . '***' . substr($winner->user_email, strpos($winner->user_email, '@')));
                                        }
                                        ?>
                                    </p>
                                    <p class="winner-code">参与码: <?php echo esc_html($winner->participation_code); ?></p>
                                </div>
                            </div>
                        <?php endforeach; ?>
                    </div>
                <?php else: ?>
                    <p class="no-winners">暂无中奖者</p>
                <?php endif; ?>
            </div>
            
            <div class="lottery-statistics">
                <h3>抽奖统计</h3>
                <div class="stats-grid">
                    <div class="stat-item">
                        <span class="stat-label">总参与人数</span>
                        <span class="stat-value"><?php echo $verification_data['total_participants']; ?></span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">中奖人数</span>
                        <span class="stat-value"><?php echo count($winners); ?></span>
                    </div>
                    <div class="stat-item">
                        <span class="stat-label">中奖率</span>
                        <span class="stat-value">
                            <?php 
                            if ($verification_data['total_participants'] > 0) {
                                echo round((count($winners) / $verification_data['total_participants']) * 100, 2) . '%';
                            } else {
                                echo '0%';
                            }
                            ?>
                        </span>
                    </div>
                </div>
            </div>
        </div>
        
        <script>
        function lotteryShowVerificationDetails() {
            var details = document.getElementById('verification-details');
            if (details.style.display === 'none') {
                details.style.display = 'block';
            } else {
                details.style.display = 'none';
            }
        }
        </script>
        <?php
        return ob_get_clean();
    }
}

3.4.2 验证系统实现

class Lottery_Verification_System {
    
    /**
     * 验证抽奖结果的真实性
     */
    public function verify_draw_result($activity_id, $user_provided_hash = '') {
        global $wpdb;
        
        // 获取存储的验证数据
        $table_name = $wpdb->prefix . 'lottery_verification';
        $verification = $wpdb->get_row($wpdb->prepare(
            "SELECT * FROM $table_name WHERE activity_id = %d",
            $activity_id
        ));
        
        if (!$verification) {
            return array(
                'valid' => false,
                'message' => '未找到该活动的验证数据'
            );
        }
        
        // 计算哈希
        $calculated_hash = hash('sha256', $verification->verification_data);
        
        // 验证哈希
        if ($user_provided_hash && $user_provided_hash !== $calculated_hash) {
            return array(
                'valid' => false,
                'message' => '哈希值不匹配,数据可能被篡改'
            );
        }
        
        // 解析验证数据
        $verification_data = json_decode($verification->verification_data, true);
        
        // 验证参与者数据
        $participants_valid = $this->verify_participants(
            $activity_id, 
            $verification_data['participant_ids']
        );
        
        // 验证中奖者数据
        $winners_valid = $this->verify_winners(
            $activity_id, 
            $verification_data['winner_ids']
        );
        
        // 重新计算哈希验证
        $recalculated_hash = hash('sha256', json_encode($verification_data));
        
        return array(
            'valid' => $participants_valid && $winners_valid && ($recalculated_hash === $calculated_hash),
            'message' => $participants_valid && $winners_valid ? '验证通过' : '数据验证失败',
            'verification_data' => $verification_data,
            'stored_hash' => $verification->hash_value,
            'calculated_hash' => $calculated_hash
        );
    }
    
    /**
     * 提供公开的验证接口
     */
    public function public_verification_endpoint() {
        if (!isset($_GET['activity_id']) || !isset($_GET['hash'])) {
            wp_send_json_error(array('message' => '缺少必要参数'));
        }
        
        $activity_id = intval($_GET['activity_id']);
        $hash = sanitize_text_field($_GET['hash']);
        
        $result = $this->verify_draw_result($activity_id, $hash);
        
        wp_send_json(array(
            'success' => $result['valid'],
            'data' => $result
        ));
    }
}

四、前端界面与用户体验优化

4.1 响应式设计实现

/* assets/css/lottery-public.css */
.lottery-container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 20px;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
}

/* 参与表单样式 */
.lottery-participation-form {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    border-radius: 15px;
    padding: 40px;
    color: white;
    box-shadow: 0 20px 40px rgba(0,0,0,0.1);
}

.lottery-form-title {
    font-size: 2.5rem;
    margin-bottom: 10px;
    text-align: center;
}

.lottery-form-description {
    text-align: center;
    opacity: 0.9;
    margin-bottom: 30px;
}

.form-group {
    margin-bottom: 20px;
}

.form-control {
    width: 100%;
    padding: 12px 15px;
    border: none;
    border-radius: 8px;
    font-size: 16px;
    background: rgba(255,255,255,0.9);
}

.btn-participate {
    background: #ff6b6b;
    color: white;
    border: none;
    padding: 15px 30px;
    border-radius: 8px;
    font-size: 18px;
    font-weight: bold;
    cursor: pointer;
    width: 100%;
    transition: transform 0.3s, box-shadow 0.3s;
}

.btn-participate:hover {
    transform: translateY(-2px);
    box-shadow: 0 10px 20px rgba(255,107,107,0.3);
}

/* 结果展示样式 */
.lottery-results-container {
    background: white;
    border-radius: 15px;
    overflow: hidden;
    box-shadow: 0 10px 30px rgba(0,0,0,0.1);
}

.lottery-results-header {
    background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
    color: white;
    padding: 30px;
    text-align: center;
}

.winners-list {
    padding: 20px;
}

.winner-item {
    display: flex;
    align-items: center;
    padding: 20px;
    margin-bottom: 15px;
    background: #f8f9fa;
    border-radius: 10px;
    border-left: 5px solid #4facfe;
    transition: transform 0.3s;
}

.winner-item:hover {
    transform: translateX(10px);
    background: #e9ecef;
}

.winner-rank {
    font-size: 24px;
    font-weight: bold;
    color: #4facfe;
    margin-right: 20px;
    min-width: 50px;
}

.winner-info h4 {
    margin: 0 0 5px 0;
    color: #333;
}

.winner-name {
    font-size: 18px;
    font-weight: bold;
    color: #555;
    margin: 0 0 5px 0;
}

.winner-code {
    font-family: monospace;
    color: #666;
    font-size: 14px;
    margin: 0;
}

/* 统计信息样式 */
.lottery-statistics {
    padding: 30px;
    background: #f8f9fa;
}

.stats-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 20px;
}

.stat-item {
    background: white;
    padding: 20px;
    border-radius: 10px;
    text-align: center;
    box-shadow: 0 5px 15px rgba(0,0,0,0.05);
}

.stat-label {
    display: block;
    color: #666;
    font-size: 14px;
    margin-bottom: 5px;
}

.stat-value {
    display: block;
    font-size: 32px;
    font-weight: bold;
    color: #4facfe;
}

/* 响应式设计 */
@media (max-width: 768px) {
    .lottery-container {
        padding: 10px;
    }
    
    .lottery-participation-form {
        padding: 20px;
    }
    
    .lottery-form-title {
        font-size: 1.8rem;
    }
    
    .winner-item {
        flex-direction: column;
        text-align: center;
    }
    
    .winner-rank {
        margin-right: 0;
        margin-bottom: 10px;
    }
    
    .stats-grid {
        grid-template-columns: 1fr;
    }
}

/* 动画效果 */
@keyframes fadeIn {
    from { opacity: 0; transform: translateY(20px); }
    to { opacity: 1; transform: translateY(0); }
}

.lottery-results-container {
    animation: fadeIn 0.6s ease-out;
}

.winner-item {
    animation: fadeIn 0.5s ease-out;
    animation-fill-mode: both;
}

.winner-item:nth-child(1) { animation-delay: 0.1s; }
.winner-item:nth-child(2) { animation-delay: 0.2s; }
.winner-item:nth-child(3) { animation-delay: 0.3s; }
.winner-item:nth-child(4) { animation-delay: 0.4s; }
.winner-item:nth-child(5) { animation-delay: 0.5s; }

4.2 实时状态更新

// assets/js/lottery-public.js
jQuery(document).ready(function($) {
    
    // 参与抽奖
    $('.lottery-participation-form').on('submit', function(e) {
        e.preventDefault();
        
        var form = $(this);
        var submitBtn = form.find('.btn-participate');
        var originalText = submitBtn.text();
        
        // 显示加载状态
        submitBtn.prop('disabled', true).text('提交中...');
        
        // 收集表单数据
        var formData = form.serialize();
        
        $.ajax({
            url: lottery_ajax.ajax_url,
            type: 'POST',
            data: {
                action: 'lottery_participate',
                nonce: lottery_ajax.nonce,
                form_data: formData
            },
            success: function(response) {
                if (response.success) {
                    // 显示成功消息
                    form.html(`
                        <div class="participation-success">
                            <div class="success-icon">🎉</div>
                            <h3>参与成功!</h3>
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5274.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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