PHPackages                             zclott/lottery - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. zclott/lottery

ActiveLibrary

zclott/lottery
==============

laravel lottery

v1.0.0(5y ago)8351MITJavaScript

Since Jan 23Pushed 5y agoCompare

[ Source](https://github.com/zclott/lottery-for-laravel)[ Packagist](https://packagist.org/packages/zclott/lottery)[ RSS](/packages/zclott-lottery/feed)WikiDiscussions main Synced yesterday

READMEChangelog (1)Dependencies (1)Versions (2)Used By (0)

lottery-for-laravel
===================

[](#lottery-for-laravel)

> ##### laravel版composer抽奖程序插件，包含服务端和前端html(vue和js版大转盘)
>
> [](#laravel版composer抽奖程序插件包含服务端和前端htmlvue和js版大转盘)

#### 程序流程

[](#程序流程)

1. 创建活动
2. 添加活动的奖品
3. 前端展示
4. 抽奖
5. 记录抽奖

- 这些可以简单在自己的cms系统增加个抽奖模块，管理抽奖模块数据，本插件只涉及抽奖行为业务，数据部分直插数据库表。

#### 运行环境

[](#运行环境)

- php &gt;= 5.4
- composer
- laravel || lumen &gt;= 5.1
- mysql
- predis &gt; 1.1.\*

#### 安装

[](#安装)

```
$ composer require zclott/lottery

```

#### 添加 service provider（optional. if laravel &lt; 5.5 || lumen）

[](#添加-service-provideroptional-if-laravel--55--lumen)

```
// laravel < 5.5
Zclott\Lottery\LotteryServiceProvider::class,

// lumen
$app->register(Zclott\Lottery\LotteryServiceProvider::class);
```

#### 添加 alias（optional. if laravel &lt; 5.5）

[](#添加-aliasoptional-if-laravel--55)

```
'Lottery' => Zclott\Lottery\Facades\Pay::class,
```

#### 注册views视图模板

[](#注册views视图模板)

```
$ php artisan vendor:publish --provider=" Zclott\Lottery\LotteryServiceProvider"
```

[![image](https://camo.githubusercontent.com/233d90da8f7b1e20ab8b85fe8f3edb0ed7b28ac051608f55611406ff6d99c7a1/687474703a2f2f7777772e7169616e676275732e636f6d2f7265732f696d616765732f647261772e706e67)](https://camo.githubusercontent.com/233d90da8f7b1e20ab8b85fe8f3edb0ed7b28ac051608f55611406ff6d99c7a1/687474703a2f2f7777772e7169616e676275732e636f6d2f7265732f696d616765732f647261772e706e67)

- tips:静态资源放在static下，vue版的组件放在了vue目录下，js目录是laravel目录的resources/assets/js目录，laravel如何结合vue，可参考： vue版大转盘前端模板参考：

#### 抽奖主类 Lottery.php

[](#抽奖主类-lotteryphp)

- 对外方法

method描述lottery抽奖方法prizeList奖品列表getPrizeRecord获奖记录activityInfo活动详情```
	/**
	 * Lottery  lottery. 抽奖主方法
	 * @param $uid int 用户id
	 * @param $activityId int 活动id
	 * @param $lotteryLimit int 抽奖次数
	*/
	public function lottery($activityId,$uid=null,$lotteryLimit=0)
	{
		$activityInfo = $this->activityInfo($activityId);
		if(!$activityInfo){

			return $this->returnOut(0,'活动不存在');
		}
		if(!$this->checkActivitydate($activityInfo)){

			return $this->returnOut(0,'今天不在活动时间范围哦');
		}
		$prize = new LotteryPrize;
		$prizeObj = $prize->getAllList($activityId);
		if(!$prizeObj){

			return $this->returnOut(0,'奖品不存在');
		}
		//$lotteryLimit == 0时，不限抽奖次数。
		if($uid && $lotteryLimit!=0){
			//获取用户已抽奖次数，默认$lotteryTimes为0
			$lotteryTimes = Redis::hget('lotterytimes', 'lotterytimes_'.$activityId.'_'.$uid)?Redis::hget('lotterytimes', 'lotterytimes_'.$activityId.'_'.$uid):0 ;
			if( $lotteryTimes > $lotteryLimit-1){
				return $this->returnOut(0,'抽奖次数已用完');
			}
			Redis::hincrby('lotterytimes','lotterytimes_'.$activityId.'_'.$uid,1); //记录用户抽奖次数
			//如果是每日限制$lotteryLimit次，则设置第二天0点过期
			//Redis::expire('lotterytimes','lotterytimes_'.$activityId.'_'.$uid,strtotime(date("Y-m-d",time()))+3600*24-time());
		}
		$proArr = []; //所有奖品概率基数数组
		foreach ($prizeObj as $obj) {
			if( $obj->num != 0 && $obj->basenumber!=0) { //奖品数量有限,概率基数不为0时
				//检查奖品数量是否达到抽取上限,达到则设置该奖项的中奖率为0。
				if(!$this->checkPrizeCount($obj)){
					$obj->basenumber = 0;
				}
			}
			$proArr[] = $obj->basenumber;
		}
		$prizeIndex = $this->getRand($proArr); //根据概率获取奖品的索引
		$result = $prizeObj[$prizeIndex]; //中奖奖品
		$record = new LotteryRecord;
		$addData = ['uid'=>$uid,'prizeId'=>$result->id,'prizename'=>$result->name,'activityId'=>$activityInfo->id,'activitytitle'=>$activityInfo->title,'state'=>$result->state,'lotterytime'=>time()];
		if($result->num == 0){ //奖品数量无限制时
			if(!$record->add($addData) ){ //中奖纪录写入数据库表,写入失败时，回退中奖次数
				if($uid && $lotteryLimit!=0){
					Redis::hincrby('lotterytimes','lotterytimes_'.$activityId.'_'.$uid,-1);
				}
			}
		}else{ //奖品数量有限制时
			$lott_num = $result->lott_num + 1 ;//已中奖数量+1
			if(!$record->update($addData,$lott_num) ){ //中奖纪录写入中奖记录表并更新奖品表，失败时，回退中奖次数
				if($uid && $lotteryLimit!=0){
					Redis::hincrby('lotterytimes','lotterytimes_'.$activityId.'_'.$uid,-1);
				}
			}

		}
		$data['id'] = $result->id; //中奖奖品id
		$data['name'] = $result->name; //中奖奖品名称
		$data['state'] = $result->state; //是否为空奖谢谢参与
		$data['index'] = $prizeIndex; //中奖奖品的索引
		return $this->returnOut(0,'',$data);
	}
```

#### 抽奖算法

[](#抽奖算法)

```
	/**
	* Lottery  getRand. 抽奖算法
	* @param array $proArr 所有奖品概率基数数组
	*/
	protected function getRand( $proArr )
	{
		$result = '';
		//$proSum抽奖概率基数之和
		$proSum = array_sum( $proArr );

		foreach ($proArr as $k => $v) {
			//获取当次抽奖概率基数
			$randNum = mt_rand(1, $proSum);
			if ($randNum get('activityId',1);
    	$uid = $request->get('uid',1);
    	$lotteryLimit = $request->get('lotteryLimit',3);;
		$result = Lottery::lottery($activityId,$uid,$lotteryLimit);
		if($result['result']){
			return response()->json(['code'=>0,'data'=>$result['result']]);
		}else{
			return response()->json(['code'=>0,'message'=>$result['message']]);
		}

    }
}
```

#### 备注

[](#备注)

- 这里所有的模型和控制器都给出来了，使用的时候可以不以插件服务提供者方式使用，可将Models和example内代码直接在自己项目的app目录包含应用程序的核心代码内。
- 交流可发至943826443#qq.com,把#换成@. qq:943826443

###  Health Score

26

—

LowBetter than 43% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity14

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity53

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

1935d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/d1d57732436034fcae8f07387d76f8937468d8ed009e449ebd376eaaf97c0f6a?d=identicon)[zclott](/maintainers/zclott)

---

Top Contributors

[![zclott](https://avatars.githubusercontent.com/u/76580584?v=4)](https://github.com/zclott "zclott (6 commits)")

---

Tags

composerlaravellaravel-lotterylotterylottery-laravelphpturntablevue-jslotterydrawturntable

### Embed Badge

![Health badge](/badges/zclott-lottery/health.svg)

```
[![Health](https://phpackages.com/badges/zclott-lottery/health.svg)](https://phpackages.com/packages/zclott-lottery)
```

###  Alternatives

[hi-folks/rando-php

Random generator Library for PHP

12884.3k2](/packages/hi-folks-rando-php)[cloned/luckybox

A library to pick up the one with a specified probability from some items.

157.3k1](/packages/cloned-luckybox)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
