要设计一个系统,用户通过分享邀请新用户注册并购买商品后返佣金,MySQL表结构可以设计如下:
1. 用户表(users)记录每个用户的基本信息,包括邀请人信息。
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, inviter_id INT, -- 邀请人ID,引用users表中的id created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );id: 用户唯一ID。username: 用户名。email: 用户邮箱。inviter_id: 邀请人ID(可为空,表示没有邀请人)。created_at: 用户注册时间。2. 订单表(orders)
记录用户下的订单信息,关键字段包括下单用户和订单总金额。
CREATE TABLE orders ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, -- 下单用户ID,引用users表中的id total_amount DECIMAL(10, 2) NOT NULL, -- 订单总金额 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );id: 订单唯一ID。user_id: 下单的用户ID,关联users表的id。total_amount: 订单总金额。created_at: 订单创建时间。3. 佣金表(commissions)
记录每个用户通过邀请下单获得的佣金情况。
CREATE TABLE commissions ( id INT AUTO_INCREMENT PRIMARY KEY, inviter_id INT NOT NULL, -- 邀请人ID,引用users表中的id invitee_id INT NOT NULL, -- 被邀请人ID,引用users表中的id order_id INT NOT NULL, -- 被邀请人下的订单ID,引用orders表中的id commission_amount DECIMAL(10, 2) NOT NULL, -- 佣金金额 status ENUM('pending', 'paid') DEFAULT 'pending', -- 佣金状态:未结算或已结算 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );id: 佣金记录ID。inviter_id: 邀请人的用户ID。invitee_id: 被邀请人的用户ID。order_id: 被邀请人生成的订单ID,关联orders表的id。commission_amount: 佣金金额,通常根据订单金额的百分比计算。status: 佣金状态,pending表示等待支付,paid表示已经支付。created_at: 佣金记录生成时间。4. 结算记录表(commission_payouts)
记录佣金结算的情况。
CREATE TABLE commission_payouts ( id INT AUTO_INCREMENT PRIMARY KEY, inviter_id INT NOT NULL, -- 邀请人ID,引用users表中的id total_commission DECIMAL(10, 2) NOT NULL, -- 结算总金额 payout_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 结算时间 );id: 结算记录ID。inviter_id: 结算给邀请人的用户ID。total_commission: 结算给邀请人的总佣金金额。payout_date: 佣金支付日期。5. 佣金计算逻辑
假设邀请奖励是订单金额的 5%,可以在订单生成时,自动计算佣金并插入到佣金表中。
function processCommission($invitee_id, $order_id, $total_amount) { // 连接数据库 $conn = new mysqli("localhost", "username", "password", "database"); // 查找被邀请人的邀请人ID $sql = "SELECT inviter_id FROM users WHERE id = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("i", $invitee_id); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { $row = $result->fetch_assoc(); $inviter_id = $row['inviter_id']; if ($inviter_id) { // 计算佣金 (5% 的订单总金额) $commission_amount = $total_amount * 0.05; // 插入佣金记录 $sql = "INSERT INTO commissions (inviter_id, invitee_id, order_id, commission_amount, status) VALUES (?, ?, ?, ?, 'pending')"; $stmt = $conn->prepare($sql); $stmt->bind_param("iiid", $inviter_id, $invitee_id, $order_id, $commission_amount); $stmt->execute(); } } $stmt->close(); $conn->close(); }6. 结算佣金
可以定期执行批量支付佣金(例如每月结算一次),并将相应佣金状态标记为已支付。
function settleCommissions($inviter_id) { // 连接数据库 $conn = new mysqli("localhost", "username", "password", "database"); // 获取邀请人所有待支付的佣金 $sql = "SELECT SUM(commission_amount) AS total_commission FROM commissions WHERE inviter_id = ? AND status = 'pending'"; $stmt = $conn->prepare($sql); $stmt->bind_param("i", $inviter_id); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); $total_commission = $row['total_commission']; if ($total_commission > 0) { // 插入结算记录 $sql = "INSERT INTO commission_payouts (inviter_id, total_commission) VALUES (?, ?)"; $stmt = $conn->prepare($sql); $stmt->bind_param("id", $inviter_id, $total_commission); $stmt->execute(); // 更新佣金状态为已支付 $sql = "UPDATE commissions SET status = 'paid' WHERE inviter_id = ? AND status = 'pending'"; $stmt = $conn->prepare($sql); $stmt->bind_param("i", $inviter_id); $stmt->execute(); } $stmt->close(); $conn->close(); }
这样一个系统可以记录用户邀请信息、生成佣金、并支持定期结算佣金。
网友回复