php实现转盘抽奖
PHP 实现转盘抽奖
数据库设计
创建奖品表存储奖品信息,包含字段如id、name、probability(中奖概率)、image(图片路径)等。概率建议使用小数形式(如0.1表示10%)。
CREATE TABLE prizes (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
probability DECIMAL(5,4) NOT NULL,
image VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
概率算法实现
使用加权随机算法根据概率分配中奖结果。先计算总概率,再生成随机数匹配区间。
function getPrize() {
$prizes = DB::table('prizes')->get();
$totalProbability = array_sum(array_column($prizes, 'probability'));
$rand = mt_rand(1, 10000) / 10000 * $totalProbability;
$current = 0;
foreach ($prizes as $prize) {
$current += $prize->probability;
if ($rand <= $current) {
return $prize;
}
}
return null; // 未中奖情况
}
前端交互处理
使用jQuery或AJAX实现异步请求抽奖接口,通过CSS动画模拟转盘旋转效果。
$('#start-btn').click(function() {
$.post('/lottery/draw', function(response) {
// 计算旋转角度(根据奖品ID确定停止位置)
let angle = 360 * 5 + (response.prize_id * 45);
$('#wheel').css('transform', `rotate(${angle}deg)`);
// 显示中奖结果
setTimeout(() => {
alert('恭喜获得: ' + response.prize_name);
}, 5000);
});
});
防刷机制
通过会话控制抽奖频率,限制用户每日抽奖次数。
session_start();
if (!isset($_SESSION['lottery_count'])) {
$_SESSION['lottery_count'] = 0;
}
if ($_SESSION['lottery_count'] >= 3) {
die(json_encode(['error' => '今日抽奖次数已用完']));
}
$_SESSION['lottery_count']++;
完整流程示例
- 用户点击抽奖按钮触发AJAX请求
- PHP后端执行概率计算并返回中奖结果
- 前端根据返回结果播放对应动画
- 中奖结果记录到数据库
- 更新用户剩余抽奖次数
// 抽奖接口示例
Route::post('/lottery/draw', function() {
$user = auth()->user();
if ($user->today_draws >= 3) {
return response()->json(['error' => '已达每日限制']);
}
$prize = getPrize();
$user->increment('today_draws');
if ($prize) {
DB::table('user_prizes')->insert([
'user_id' => $user->id,
'prize_id' => $prize->id,
'won_at' => now()
]);
}
return response()->json([
'prize_id' => $prize->id ?? 0,
'prize_name' => $prize->name ?? '谢谢参与'
]);
});






