
婚礼照片互动与抽奖系统是一套面向婚礼现场的自托管活动系统,由 ImDong 以 MIT 许可证开源。前端基于 Vue、后端基于 Laravel,页面与 API 同域部署,源码托管在 GitHub 公开可查,照片存放在阿里云 OSS,围绕约 200 人、单日活动的场景设计,也可以作为聚会、年会等小型活动二次开发的起点。它把宾客传图、现场浏览、工作人员审核和大屏开奖串成一条完整链路,是一个需要部署到自有服务器的开源软件,而不是打开网址就能参加的现成网页服务。

场景痛点
办过现场活动的人都知道,宾客掏出手机拍了一圈,照片却散落在各自相册和聊天群里,主持人想在仪式后半段抽个奖暖场,只能现场翻群图、手工记名字,节奏全乱。用现成的群抽奖又拿不到照片素材,传图环节还得另找平台,两场动作拼在一起常常对不上。这套软件工具把上传、展示、审核和开奖收回同一场地内,组织者不必为一场单日活动临时拼凑多个网页;工具推荐里这类面向具体场景的自建系统比通用平台更贴合现场流程,效率工具要解决的正是组织者临场手忙脚乱的那一段,数字生活里的一场热闹,背后靠的是提前把流程理顺。
主要功能特点
| 模块 | 已实现能力 |
|---|---|
| 手机号登记 | 支持中国大陆手机号,同一号码可在多个浏览器登记并持有独立 Token;浏览器保存身份,后端存储 Token 哈希 |
| 照片上传 | 多图选择、逐张校验、进度展示、失败重试;使用 STS 临时凭证直传 OSS |
| 文件去重 | 同时记录原始文件与上传文件的 SHA-256,跨用户检查重复文件,不依赖文件名 |
| 大图处理 | 超过 20 MiB 的图片先在浏览器压缩,再上传展示版本和原始文件;后端另有大图转码处理,保留原始对象 |
| 我的照片 | 查看自己的上传记录和审核状态;后端提供上传成功、待审核、通过、拒绝的统计接口 |
| 照片墙 | 审核通过的照片、游标分页、大图预览、点赞和取消点赞;前后端均限制本人给本人照片点赞 |
| 审核后台 | 密码登录、逐张审核、下一张预加载、剩余数量、审核日志、撤销最近一次审核 |
| 现场大屏 | 动态照片云、候选图片预加载、逐个揭晓中奖照片与手机号尾号、历史中奖结果恢复、展示照片定时刷新 |
| 加权抽奖 | 审核等级与点赞共同决定权重,先抽用户再抽照片;候选快照、事务内保存结果、重复执行返回已保存结果 |
| 运维基础 | 数据库迁移、开发用 Docker Compose、应用及数据库健康检查、PHPUnit 自动化测试 |
实现上的几个特点:
- 照片直传:常规上传绕过应用服务器,后端负责业务校验、临时凭证与完成确认。大图完成确认时,服务器仍可能从 OSS 下载原图并转码。
- 结果与动画分离:后端先确定并持久化中奖结果,前端随后播放动画,动画帧率不参与随机计算。
- 候选快照固定:准备轮次时冻结候选照片、权重与设置,之后的上传、审核、点赞不改变该轮快照。
- 按用户去重中奖:同一轮每个手机号最多中奖一次,可配置排除历史中奖者,以及每人进入候选池的照片数量。
- 图片按场景展示:统一生成 OSS 签名图片地址,提供照片云、缩略图、画廊、审核、抽奖预设;签名按配置时区在次日零点到期。
- 轻量部署:当前业务不依赖常驻队列 Worker、业务定时任务或 Redis;数据库与 OSS 是主要持久化依赖。
手机号登记与临时凭证直传
宾客在入口页输入中国大陆手机号即可登记,同一号码在多个浏览器登记会持有独立身份令牌,浏览器保存身份,后端只存令牌哈希。选图支持一次多张,逐张校验、显示进度、失败可重试。浏览器拿到后端签发的 STS 临时凭证后直传 OSS,应用服务器只做校验和完成确认,不绕道转发大文件,临时凭证限定上传目录与写入权限。
文件哈希去重与大图压缩
系统同时记录原始文件与展示文件的 SHA-256 哈希,跨用户检查重复,按文件本身而非文件名判断,改了名字重复传也能识别。超过 20 MiB 的图片先在浏览器端压缩,再分别上传展示版与原始对象,后端转码并保留原件。去重停留在文件级别,没有人脸上传比对,也没有感知哈希,裁剪、截图、重编码会被当作不同文件。
我的照片与审核通过才公开的照片墙
宾客可在自己页面查看上传记录与审核状态,待审核与被拒绝的照片不上墙、不参与抽奖。照片墙只展示审核为普通或好的照片,游标分页加载,点开看大图,支持点赞与取消点赞,前后端都禁止本人给自己照片点赞。照片走统一 OSS 签名地址展示,签名次日零点到期,不用把桶设成公开可读,从上传到上墙始终隔着工作人员这一关。
后台逐张审核与快捷键
工作人员用管理员密码登录后台逐张决定去留:快捷键 1 标普通、2 标好评、0 丢弃、U 撤销最近一次,下一张预加载减少等待,界面显示剩余数量并留存审核日志,好评照片获得更高抽奖权重。后台与公开入口分开,审核只对持密码者开放。需要注意公开的抽奖写接口未加管理员令牌,这一点放在使用边界单独说明,上线前要先处理。
大屏动态照片云与加权开奖
大屏把候选照片聚成动态照片云预加载,开奖时逐个揭晓中奖照片与手机号尾号。权重由审核等级与点赞决定:普通照片基础权重 1.0,好评 1.8;有效点赞按点赞人审核情况分 0.25、1.0、1.25 三档,本人点赞不计,点赞加成封顶 0.6。先按用户总权重抽人,再从其照片抽展示照片,随机数取自后端安全随机源,开奖动画不参与计算,历史中奖结果可恢复。
候选快照冻结与结果幂等
准备轮次时冻结候选照片、权重和设置,之后新上传、新点赞、新审核都不改快照。同轮移除已中奖用户及其全部候选照片,默认排除历史中奖者,每人最多 15 张进候选池,这是上限而非上传上限。中奖记录事务内保存,重复执行返回同一份结果,前端按顺序播放;这套自动化只覆盖开奖计算,现场仍需提前演练。
部署形态与使用边界
生产按 Nginx、PHP-FPM、MySQL 与 OSS 部署,不依赖 Redis。无多租户与多活动隔离,也无运营后台,数据库存完整手机号,保留策略自定。手机号不验证归属,抽奖写接口公开,面向受控现场,挂公网前需补身份验证与开奖权限。作为实用软件定位的活动工具,它在有趣软件里定制程度较高;酷软趣站视角下,约 200 人是设计场景而非压测承诺。
官方网站
GitHub https://github.com/imdong/wedding-photo-lottery
下载地址
https://pan.quark.cn/s/bbb1329e47bf
相关推荐







