要实现精细化的好友裂变,首先需要设计一套能够支持多级关系追踪、状态记录及防刷的数据结构。这里我们以MySQL为例,构建核心的三张表。
除了基础字段,必须包含唯一邀请码和上级ID字段。邀请码建议使用混淆算法生成的字符串,避免直接暴露自增ID。
```sql CREATE TABLE `users` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `mobile` varchar(20) NOT NULL COMMENT '手机号', `invite_code` varchar(12) NOT NULL COMMENT '用户专属邀请码', `inviter_id` bigint(20) DEFAULT 0 COMMENT '直接邀请人ID', `register_ip` varchar(50) DEFAULT NULL COMMENT '注册IP', `status` tinyint(1) DEFAULT 1 COMMENT '状态 1:正常 0:封禁', `created_at` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_mobile` (`mobile`), UNIQUE KEY `uk_invite_code` (`invite_code`), KEY `idx_inviter_id` (`inviter_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```为了支持精细化运营(如统计二级下级数量、查找共同祖先),需要一张关系表记录具体的绑定路径和层级。
```sql CREATE TABLE `user_relations` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_id` bigint(20) NOT NULL COMMENT '当前用户ID', `ancestor_id` bigint(20) NOT NULL COMMENT '祖先用户ID', `level` tinyint(2) NOT NULL COMMENT '层级差 1:直推 2:间推', `created_at` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_user_ancestor` (`user_id`, `ancestor_id`), KEY `idx_ancestor_level` (`ancestor_id`, `level`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```每一笔奖励的发放都必须留痕,用于后续对账和风控分析。
```sql CREATE TABLE `reward_logs` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_id` bigint(20) NOT NULL COMMENT '获奖人ID', `source_user_id` bigint(20) DEFAULT NULL COMMENT '触发奖励的行为来源用户ID', `reward_type` tinyint(2) NOT NULL COMMENT '奖励类型 1:积分 2:优惠券 3:现金', `amount` decimal(10,2) NOT NULL COMMENT '金额/数量', `reason` varchar(255) DEFAULT NULL COMMENT '奖励原因说明', `created_at` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```我们使用Python Flask框架演示核心逻辑,重点在于邀请码生成、关系绑定和事务处理。
邀请码需要保证唯一性和一定的复杂度。这里实现一个基于进制转换的简单混淆算法。
```python import random import string def generate_invite_code(user_id): 将ID转换为62进制字符串(0-9a-zA-Z) alphabet = string.digits + string.ascii_letters base = len(alphabet) code = '' while user_id > 0: user_id, rem = divmod(user_id, base) code = alphabet[rem] + code 补齐6位,不足补随机字符,防止通过ID推算 code = code.rjust(6, '0') 简单混淆:前后插入随机字符 prefix = random.choice(string.ascii_uppercase) suffix = random.choice(string.digits) return f"{prefix}{code}{suffix}" ```这是裂变最核心的环节,必须在一个数据库事务中完成,防止出现数据不一致。同时要处理“不能邀请自己”和“防止循环嵌套”的逻辑。
```python from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy import datetime app = Flask(__name__) 配置数据库连接,请替换为实际连接字符串 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://user:pass@127.0.0.1:3306/crack_db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) 假设已定义对应的ORM Model类:User, UserRelation, RewardLog @app.route('/api/register', methods=['POST']) def register(): mobile = request.json.get('mobile') invite_code = request.json.get('invite_code') 邀请人的码 ip = request.remote_addr if not mobile: return jsonify({'code': 400, 'msg': '手机号必填'}), 400 try: 开启事务 1. 查找邀请人 inviter = None if invite_code: inviter = User.query.filter_by(invite_code=invite_code).first() 2. 创建新用户 new_user = User(mobile=mobile, register_ip=ip) 生成邀请码逻辑(假设此处调用上面的函数) new_user.invite_code = generate_invite_code(random.randint(10000, 99999)) if inviter: 防止自己邀请自己 if inviter.mobile == mobile: return jsonify({'code': 400, 'msg': '不能邀请自己'}), 400 new_user.inviter_id = inviter.id db.session.add(new_user) db.session.flush() 获取new_user.id 3. 绑定关系链(精细化:记录层级) 3.1 绑定直接关系 (Level 1) direct_relation = UserRelation(user_id=new_user.id, ancestor_id=inviter.id, level=1) db.session.add(direct_relation) 3.2 查找邀请人的上级,绑定间接关系 (Level 2) 假设只做二级裂变,获取邀请人的直推祖先 parent_relations = UserRelation.query.filter_by(user_id=inviter.id, level=1).all() for rel in parent_relations: 防止循环嵌套(比如A邀请B,B又回头邀请A的上级) if rel.ancestor_id != new_user.id: indirect_relation = UserRelation(user_id=new_user.id, ancestor_id=rel.ancestor_id, level=2) db.session.add(indirect_relation) 4. 发放间接奖励(精细化:间推奖励) 此处调用发奖函数 grant_reward(rel.ancestor_id, 2, '间推注册奖励') 5. 发放直接奖励 grant_reward(inviter.id, 1, '直推注册奖励') else: db.session.add(new_user) db.session.commit() return jsonify({'code': 200, 'msg': '注册成功', 'data': {'invite_code': new_user.invite_code}}) except Exception as e: db.session.rollback() return jsonify({'code': 500, 'msg': str(e)}), 500 def grant_reward(user_id, level, reason): 实际业务中这里会调用积分系统或优惠券系统 这里仅做数据库记录 amount = 10.0 if level == 1 else 5.0 直推10元,间推5元 log = RewardLog(user_id=user_id, reward_type=3, amount=amount, reason=reason) db.session.add(log) ```裂变系统最大的风险是黑产羊毛党。必须在代码层面加入严格的限制,这里使用Redis实现频率限制和IP/设备校验。
限制单个IP在短时间内的注册次数,防止批量脚本注册。
```python import redis 连接Redis r = redis.Redis(host='localhost', port=6379, db=0) def check_rate_limit(ip, action='register', limit=5, period=3600): """ ip: 客户端IP action: 操作标识 limit: 限制次数 period: 时间周期(秒) """ key = f"rate_limit:{action}:{ip}" current = r.incr(key) if current == 1: r.expire(key, period) if current > limit: return False 超过限制 return True 在注册接口中使用 @app.route('/api/register', methods=['POST']) def register_with_security(): ip = request.remote_addr if not check_rate_limit(ip, 'register', limit=3, period=3600): return jsonify({'code': 429, 'msg': '操作过于频繁,请稍后再试'}), 429 ... 继续原有注册逻辑 ```
前端应采集设备指纹(如DeviceId),后端校验该设备是否已经注册过。如果同一个DeviceId对应多个账号,则标记为异常。
```python @app.route('/api/register', methods=['POST']) def register_device_check(): device_id = request.headers.get('X-Device-ID') if not device_id: return jsonify({'code': 400, 'msg': '设备信息缺失'}), 400 查询该设备ID是否已存在 exist_user = User.query.filter_by(device_id=device_id).first() if exist_user: 记录风控日志 return jsonify({'code': 403, 'msg': '该设备已注册过账号'}), 403 正常注册流程中将device_id存入User表 ... ```为了让用户能够裂变,前端需要生成带有邀请码的专属链接,并调用微信JS-SDK或其他平台的分享接口。
前端页面加载时,从后端获取用户信息,动态生成分享链接。
```html新用户通过链接访问落地页时,前端需要解析URL中的invite_code,并将其存储。当用户点击“注册”按钮时,将该码传给后端接口。
完成代码开发后,按照以下步骤进行本地验证和部署。
确保服务器已安装Python 3.8+、MySQL 5.7+、Redis 5.0+。
创建requirements.txt并安装依赖:
运行安装命令:pip install -r requirements.txt
将上述代码保存为app.py,直接运行:
invite_code。invite_code调用注册接口。users表,B的inviter_id应为A的ID。user_relations表,应存在一条B指向A且level=1的记录。reward_logs表,A应获得一笔“直推注册奖励”。invite_code注册用户C。验证A是否获得“间推注册奖励”,验证关系表中C指向A且level=2的记录是否存在。易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图