PHP后端代码
<?php
namespace app\mobile\controller;
use think\Config;
use think\Controller;
use think\Url;
use think\Db;
use think\Exception;
use think\Log;
use think\Session;
class Test extends Controller
{
public $lottery_name = 'mike';
public function indexAction($load=false)
{
echo 3;exit;
}
public function doLotteryAction(){
$mobile = 111;
$lotteryCode = request()->param('lottery_code', $this->lottery_name);
$lottery = Db::table('lottery')->where(['code'=>$lotteryCode, 'valid'=>1])->find();
$date = date("Y-m-d H:i:s");
if($date<$lottery['start_time']){
$return['result'] = 0;
$return['message'] = '活动尚未开始';
return json($return);
}
if($date>=$lottery['end_time']){
$return['result'] = 0;
$return['message'] = '活动已结束';
return json($return);
}
if(false){
$return['result'] = 0;
$return['message'] = '您当前已无抽奖次数';
return json($return);
}
$where = [
'lottery_code'=>$lotteryCode,
'probability'=>['gt',0],//概率必须大于0
'stock' =>['gt', 0],//奖品必须大于0个
];
$options = Db::table('lottery_options')->where($where)->order('id asc')->select();
$probability_all = 0;//概率总和
foreach($options as $k=>$option){
$probability_all += $option['probability'];
}
$num = rand(0, $probability_all);
$bingoOption = [];//抽中的奖品
$lastPro = 0;
foreach($options as $option){
$lastPro += $option["probability"];
if ($lastPro >= $num)
{
$bingoOption = $option;
break;
}
}
if(!$bingoOption){
$return['result'] = 0;
$return['message'] = '抽奖失败,奖池已无奖品';
return json($return);
}
print_r($bingoOption);exit;
$lotteryData = [
'option_id' => $bingoOption['id'],
'lottery_options_name' => $bingoOption['name'],
'mobile' => $mobile,
'created_at' => $date,
'ip' => request()->ip(0, true),
];
Db::startTrans();
try{
//奖品池数量减1
Db::table('lottery_options')->where(['id' => $bingoOption['id']])->setDec('stock',1);
//写入抽奖记录
$historyId = Db::table('lottery_history')->insertGetId($lotteryData);
Db::commit();
$return['result'] = 1;
$return['data'] = [
'id' => $bingoOption['id'],
'name' => $bingoOption['name'],
'history_id' => $historyId,
];
}catch(Exception $e){
Log::error($e->getMessage());
Db::rollback();
$return['result'] = 0;
$return['message'] = '抽奖失败,请重试';
}
return json($return);
}
}
SQL
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for lottery
-- ----------------------------
DROP TABLE IF EXISTS `lottery`;
CREATE TABLE `lottery` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(50) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`start_time` datetime DEFAULT NULL,
`end_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for lottery_history
-- ----------------------------
DROP TABLE IF EXISTS `lottery_history`;
CREATE TABLE `lottery_history` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`option_id` int(11) DEFAULT NULL,
`mobile` varchar(50) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`ip` char(15) DEFAULT NULL,
`lottery_options_name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for lottery_options
-- ----------------------------
DROP TABLE IF EXISTS `lottery_options`;
CREATE TABLE `lottery_options` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`lottery_code` varchar(50) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`probability` int(255) DEFAULT NULL,
`stock` int(11) DEFAULT NULL,
`remark` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;