PHPackages                             afubao/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. [Utility &amp; Helpers](/categories/utility)
4. /
5. afubao/lottery

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

afubao/lottery
==============

A lottery module package for ThinkPHP 8

00PHP

Since Feb 4Pushed 3mo agoCompare

[ Source](https://github.com/afubao/lottery-php)[ Packagist](https://packagist.org/packages/afubao/lottery)[ RSS](/packages/afubao-lottery/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

Leo Lottery Package
===================

[](#leo-lottery-package)

一个基于 ThinkPHP 8 的抽奖模块包，提供核心抽奖功能。本包专注于抽奖算法和奖品管理，业务逻辑（如用户抽奖次数管理、IP限制等）由使用者自行实现。

架构设计
----

[](#架构设计)

本包采用**模块化架构设计**，遵循单一职责原则和开闭原则，各组件职责清晰，易于扩展和维护：

- **LotteryService** - 协调器，编排抽奖流程
- **PrizeSelector** - 奖品选择算法（支持权重算法，可扩展其他算法）
- **StockManager** - 统一库存管理（以数据库为准，Redis作为缓存）
- **DistributionStrategy** - 发放策略（支持峰值小时策略，可扩展其他策略）
- **LockManager** - 分布式锁管理
- **CacheManager** - 统一缓存管理（防止缓存击穿）
- **FallbackPrizeProvider** - 兜底奖品提供器
- **DrawResultBuilder** - 抽奖结果构建器

功能特性
----

[](#功能特性)

- ✅ **模块化架构** - 职责清晰，易于扩展和维护
- ✅ **权重概率抽奖算法** - 支持小数权重，自动计算最大因子
- ✅ **可插拔算法** - 支持自定义奖品选择算法（如 Alias 算法）
- ✅ **可插拔策略** - 支持自定义发放策略
- ✅ **奖品规则管理** - 支持时间段、数量限制、权重配置
- ✅ **奖品库存管理** - 自动扣减库存，支持剩余数量控制
- ✅ **抽奖记录管理** - 记录每次抽奖结果，支持关联查询
- ✅ **分布式锁支持** - 使用 Redis 分布式锁防止并发抽奖
- ✅ **奖品发放上限控制** - 支持峰值/非峰值时段不同的发放策略
- ✅ **兜底奖品机制** - 当无实物奖品时自动发放兜底奖品（支持空奖品）
- ✅ **配置化** - 所有关键参数均可通过配置文件调整

环境要求
----

[](#环境要求)

- PHP &gt;= 8.0.0
- ThinkPHP &gt;= 8.0
- ThinkORM &gt;= 3.0
- Redis（用于分布式锁和缓存）
- MySQL/MariaDB（用于数据存储）

安装
--

[](#安装)

### 1. 使用 Composer 安装

[](#1-使用-composer-安装)

```
composer require leo/lottery
```

### 2. 发布配置文件

[](#2-发布配置文件)

配置文件会自动发布到 `config/lottery.php`，如果没有自动发布，可以手动复制：

```
php think vendor:publish leo/lottery
```

或者手动复制：

```
cp vendor/leo/lottery/config/lottery.php config/lottery.php
```

### 3. 绑定接口实现（可选）

[](#3-绑定接口实现可选)

**重要更新**：组件现在提供了 ThinkPHP 默认的 Redis 和 Cache 适配器，如果你使用的是 ThinkPHP 的标准 Redis 和 Cache 配置，**无需手动绑定接口**！

组件会自动检测并使用 ThinkPHP 的 Redis 和 Cache Facade。

#### 3.0 使用默认适配器（推荐）

[](#30-使用默认适配器推荐)

如果你使用的是 ThinkPHP 的标准配置，无需任何操作，组件会自动使用默认适配器。

只需确保你的 `config/cache.php` 和 `config/redis.php`（如果使用）已正确配置。

#### 3.1 自定义适配器（可选）

[](#31-自定义适配器可选)

如果你需要自定义 Redis 或 Cache 实现，可以手动绑定接口。

#### 3.1 创建 Redis 适配器

[](#31-创建-redis-适配器)

创建文件 `app/common/LotteryRedisAdapter.php`：

```
