做运营、搞活动、发福利,最头疼的是什么?

不是策划方案,不是文案设计,而是怎么把兑换码安全、可控地发到用户手里。用第三方平台?数据在别人手上不放心。自己开发?为了个几百人的小活动搭一套后端太重了。Excel表格手动发?效率低还容易出错。

最近刚好有个社群福利活动需要发一批激活码,我花半天时间撸了一套极简卡密领取系统,亲测好用,今天整理出来分享给大家。

✨ 为什么选择这套系统?

特性 说明
零数据库依赖 基于SQLite,不需要装MySQL,上传PHP文件就能跑
IP防刷机制 每IP每日限领N次,自带倒计时,有效防止薅羊毛
开箱即用 5个PHP文件 + 1个目录,部署不超过3分钟
后台全功能 批量导入/生成卡密、库存管理、IP重置、数据看板一应俱全
现代化UI 深色科技风前端 + 响应式后台,告别上古时代的丑陋界面
事务安全 数据库事务锁+随机取卡,高并发下不会超发、重复发

🖥️ 效果预览

用户端:打开页面自动显示剩余库存和今日可领次数,点击按钮即可领取,卡密支持一键复制。次数用完后自动展示次日刷新倒计时,体验丝滑。

管理后台:左侧导航涵盖数据概览、添加卡密、生成卡密、卡密列表、IP管理五大模块。首页仪表盘实时展示核心运营指标,最近领取记录一目了然。

🚀 3分钟极速部署

环境要求

  • PHP ≥ 7.0(需开启 pdo_sqlite 扩展)
  • 任意Web服务器(Nginx / Apache / 宝塔面板均可)

部署步骤

# 1. 将源码上传到服务器
card-system/
├── index.php      # 用户领取页
├── admin.php      # 后台管理
├── api.php        # 接口文件
├── config.php     # ⚠️ 配置文件
├── init.php       # 初始化脚本(用完删)
└── data/          # 数据库目录(确保可写)

# 2. 赋予data目录写权限
chmod -R 755 data/

# 3. 浏览器访问初始化
http://your-domain.com/init.php
# 看到 "初始化成功" 即完成

# 4. 修改管理密码(必做!)
# 编辑 config.php → ADMIN_PASSWORD

# 5. 删除 init.php,防止被恶意重置
rm init.php

没错,就这么简单。没有composer install,没有npm build,没有环境变量配置

🔧 核心功能详解

1. 灵活的卡密管理

  • 手动导入:支持换行符、逗号分隔,自动去重
  • 批量生成:自定义前缀、长度、数量,自动生成 XXXX-XXXX-XXXX-XXXX 格式
  • 状态追踪:每张卡密记录使用IP、使用时间、创建时间,全链路可追溯

2. IP限制与重置

默认每个IP每天限领3次(可在 config.php 中修改 DAILY_LIMIT)。后台提供两种重置方式:

  • 单个重置:针对误封用户精准解封
  • 全局重置:输入 all 一键清空所有IP记录,适合活动重启场景

3. 数据安全设计

  • 领取接口使用数据库事务,避免并发导致的重复发放
  • 管理员Session 2小时自动过期
  • 卡密通过 RANDOM() 随机抽取,无法被预测顺序

⚠️ 生产环境安全清单

分享代码的同时,必须强调几个安全要点:

  1. 务必修改默认密码config.php 中的 ADMIN_PASSWORD 改成强密码
  2. 保护数据库文件:在 data/ 目录下创建 .htaccess,写入 Deny from all,防止db文件被直接下载
  3. 启用HTTPS:卡密属于敏感信息,明文传输等于裸奔
  4. 删除初始化脚本init.php 用完即删,否则任何人都可以重置你的数据库
  5. 定期备份:只需备份 data/cards.db 这一个文件

💡 适用场景

  • 社群/论坛签到福利发放
  • 软件激活码/邀请码分发
  • 线下活动兑换券核销
  • 内测资格限量抢注
  • 任何需要"凭码兑换"的轻量级场景

📝 写在最后

这套系统的设计哲学就是 "够用就好"。它没有用户注册登录、没有支付对接、没有复杂的权限体系——因为这些对于一场短期活动来说都是负担。

如果你也在为活动发卡密发愁,不妨试试这套方案。代码量不大,结构清晰,二次开发也很方便。觉得有用的话,欢迎点赞收藏,也期待你在评论区分享自己的使用体验和改良建议!

📎 获取源码:完整代码已在上方文章/本博客附件中提供,复制保存为对应文件名即可使用。

⚖️ 免责声明:本系统仅供学习交流,请勿用于非法用途。生产使用前请自行做好安全加固和数据备份。

image.png

image.png

image.png

image.png

image.png