Go抽奖系统 是一个基于 Go 语言开发的高扩展性抽奖平台,支持多种业务场景的抽奖逻辑,包括年会抽奖、彩票摇号、微信摇一摇、支付宝集福、微博抢红包、大转盘抽奖等。系统采用分层架构设计,实现了数据模型、业务逻辑、数据访问和 Web 服务的解耦,支持快速扩展新的抽奖场景和功能模块。
项目结构:
lottery/
├── bootstrap/ # 应用引导与配置(初始化框架、中间件)
├── comm/ # 公共工具包(认证、加密、时间处理等)
├── conf/ # 配置中心(数据库、Redis、系统参数)
├── dao/ # 数据访问层(Xorm ORM 操作数据库)
├── datasource/ # 数据源初始化(MySQL、Redis连接池)
├── models/ # 数据模型(自动生成 + 业务模型)
├── services/ # 业务逻辑层(封装核心业务规则)
├── web/ # Web 层(控制器、路由、视图)
│ ├── controllers/ # MVC 控制器
│ ├── routes/ # 路由配置
│ └── views/ # 前端视图(HTML模板)
├── lottery_demo/ # 抽奖场景示例(独立运行模块)
├── gen_models.go # 模型生成工具
└── main.go # 应用入口
| 模块 | 技术/工具 | 说明 |
|---|---|---|
| 框架 | Iris | 高性能 Web 框架,支持 MVC 模式和中间件,用于路由和请求处理 |
| 数据库 | MySQL + Xorm | 关系型数据库存储业务数据,Xorm 实现 ORM 操作 |
| 缓存 | Redis + redigo | 存储会话状态、高频数据,提升并发性能 |
| 代码生成 | gorm-gen | 自动生成数据模型,减少重复编码 |
| 安全机制 | MD5 签名 + AES 加密 | Cookie 认证、敏感数据加密 |
| 日志系统 | log 标准库 |
记录中奖日志、操作审计信息 |
- 年会抽奖:支持批量导入用户、单次抽奖,用户中奖后从列表移除(
lottery_demo/1annualMeeting)。 - 彩票摇号:模拟即开型彩票和双色球随机摇号(
lottery_demo/2ticket)。 - 微信摇一摇:多类型奖品(虚拟币、优惠券、实物)、概率配置和库存管理(
lottery_demo/3wechatShake)。 - 支付宝集福:动态配置福卡概率,支持自定义各福卡中奖比例(
lottery_demo/4alipayFuku)。 - 微博抢红包:多线程抢红包,金额随机分配,支持高并发场景(
lottery_demo/5weiboRedpack)。 - 大转盘抽奖:限量奖品、概率区间匹配,原子操作保证库存安全(
lottery_demo/6roulette)。
- 用户认证:基于 Cookie 的会话管理,支持自动生成签名和过期时间验证(
comm/func_web.go)。 - 黑名单系统:
- IP 黑名单:禁止特定 IP 参与抽奖(
models/LtBlackip+services/BlackipService)。 - 用户黑名单:记录被封禁用户,限制其抽奖权限(
models/LtUser+services/UserService)。
- IP 黑名单:禁止特定 IP 参与抽奖(
- 抽奖码管理:生成、验证和管理抽奖码(
models/LtCode+services/CodeService)。
- 奖品管理:定义奖品类型、库存、概率、活动时间等(
models/LtGift+services/GiftService)。 - 中奖记录:存储中奖详情,支持按时间、用户、奖品查询(
models/LtResult+services/ResultService)。 - 每日次数限制:通过
LtUserday模型限制用户每日抽奖次数,防止刷奖。
- 依赖安装:
go mod tidy
- 数据库配置:
- 创建数据库
lottery,执行gen_models.txt生成表结构(或手动创建)。 - 修改
conf/db.txt中的 MySQL 连接参数。
- 创建数据库
- Redis 配置:
- 确保本地 Redis 服务运行,或修改
conf/redis.txt指向远程实例。
- 确保本地 Redis 服务运行,或修改
-
开发模式:
go run main.txt
访问
http://localhost:8080查看首页,点击链接进入抽奖页面。 -
生产模式:
# 编译二进制文件 go build -o lottery # 启动服务 ./lottery --port=8080
-
获取奖品列表:
curl http://localhost:8080/gifts
返回 JSON 格式的有效奖品列表。
-
微信摇一摇抽奖:
curl http://localhost:8080/lucky
返回中奖结果(包含奖品名称、类型、剩余数量)。
- 创建场景目录:在
lottery_demo下新建文件夹(如7new_lottery)。 - 实现业务逻辑:
- 在
services/中定义场景相关服务(如奖品校验、概率计算)。 - 使用
dao/操作相关数据模型(如新增中奖记录)。
- 在
- 编写控制器:在
web/controllers/中创建控制器,处理 HTTP 请求。 - 配置路由:在
web/routes/routers.txt中注册新路由。
使用 gen_models.txt 工具生成模型:
go run gen_models.txt- 自动根据数据库表结构生成
models/目录下的结构体,包含 GORM 标签和表名映射。
- 数据库索引:为高频查询字段(如
LtResult.uid、LtCode.code)添加索引。 - Redis 缓存:
- 缓存用户会话和奖品列表,减少数据库压力。
- 使用
datasource/rdhelper.txt中的连接池实现高效缓存操作。
- 连接池调优:调整 Xorm 和 Redis 的连接池参数,适应高并发场景。
- 核心配置文件:
conf/ ├── db.txt # MySQL 连接配置 ├── redis.txt # Redis 连接配置 └── project.txt # 系统参数(时间格式、加密秘钥) - 敏感信息:生产环境建议通过环境变量注入数据库密码、Redis 密码等敏感信息。
- 日志路径:中奖日志写入
/var/log/lottery_demo.log(可在各场景中自定义日志路径)。 - 监控指标:
- 接口响应时间、错误率(通过 Iris 中间件实现)。
- 数据库连接数、Redis 内存使用情况。
- 项目确实部分使用AI辅助完成,所以完成度一般
- 会继续完善
项目地址:https://github.com/SBHHX/lottery
文档更新时间:2025年6月2日