用户管理表 (User Management)
users 表是系统的核心用户表,记录了所有已注册用户的基本信息和认证数据。
表结构
完整的 users 表定义:
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
address VARCHAR(42) UNIQUE NOT NULL, -- 钱包地址
nonce BIGINT DEFAULT 1, -- 用于签名验证
referral_code VARCHAR(16), -- 用户生成的邀请码
referrer_address VARCHAR(42), -- 上级邀请人地址
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
字段详解
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
id | UUID | PRIMARY KEY | 用户唯一标识(主键) 使用 gen_random_uuid() 自动生成 |
address | VARCHAR(42) | UNIQUE, NOT NULL | 用户的以太坊钱包地址 格式:0x 开头的 42 字符地址 作为用户登录凭证 |
nonce | BIGINT | DEFAULT 1 | 用于签名验证的随机数 每次登录后递增,防止重放攻击 |
referral_code | VARCHAR(16) | - | 用户的专属邀请码 用于邀请其他用户注册 |
referrer_address | VARCHAR(42) | - | 邀请人的钱包地址 记录上级推荐关系 |
created_at | TIMESTAMPTZ | DEFAULT NOW() | 用户注册时间(带时区) |
updated_at | TIMESTAMPTZ | DEFAULT NOW() | 用户信息最后更新时间 |
字段说明
1. address(钱包地址)
用户的唯一标识符,使用以太坊钱包地址:
- 格式:0x 开头的 42 字符十六进制字符串
- 唯一性:每个地址只能注册一次
- 用途:
- 用户登录凭证
- 资产归属标识
- 邀请关系追踪
- 示例:
0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb
2. nonce(签名随机数)
用于 EIP-712 签名验证的递增数字:
- 初始值:用户注册时为 1
- 递增规则:每次成功登录后 +1
- 安全作用:
- 防止重放攻击
- 确保每次登录签名唯一
- 可用于强制用户重新登录(修改 nonce)
- 登录流程:
- 前端请求当前 nonce
- 使用 nonce 构造签名消息
- 用户用钱包签名
- 后端验证签名并递增 nonce
3. referral_code(邀请码)
用户的专属邀请码:
- 生成规则:注册时自动生成(8-16 位字符)
- 唯一性:全局唯一
- 用途:
- 邀请其他用户注册
- 追踪推广效果
- 计算推荐奖励
- 示例:
ABC123XY、REF8K9M2
4. referrer_address(推荐人地址)
邀请该用户注册的上级地址:
- 设置时机:用户通过邀请链接注册时填充
- 不可修改:一旦设置不可更改
- 用途:
- 建立推荐关系树
- 计算推荐奖励
- 统计推广效果
- NULL 值:直接注册的用户(无推荐人)
示例数据
示例 1:普通用户注册
-- 用户通过邀请码 REF8K9M2 注册
INSERT INTO users (
address,
nonce,
referral_code,
referrer_address
) VALUES (
'0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',
1,
'NEW123ABC',
'0x1234567890123456789012345678901234567890' -- 推荐人地址
);
示例 2:无推荐人的用户
-- 用户直接注册,无推荐人
INSERT INTO users (
address,
referral_code
) VALUES (
'0xAbCdEf1234567890AbCdEf1234567890AbCdEf12',
'DIRECT001'
);
-- 查询结果:
-- id: 自动生成的 UUID
-- address: 0xAbCdEf1234567890AbCdEf1234567890AbCdEf12
-- nonce: 1
-- referral_code: DIRECT001
-- referrer_address: NULL
示例 3:用户登录后更新 nonce
-- 用户成功登录后,递增 nonce
UPDATE users
SET nonce = nonce + 1,
updated_at = NOW()
WHERE address = '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb';
-- 更新后的 nonce: 2
查询示例
1. 根据钱包地址查询用户
SELECT
id,
address,
nonce,
referral_code,
referrer_address,
created_at
FROM users
WHERE address = '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb';
2. 查询用户的邀请码
-- 用于生成邀请链接
SELECT
address,
referral_code
FROM users
WHERE id = 'user_uuid_here';
3. 查询用户的下级用户(直推)
-- 查询某用户邀请的所有下级
SELECT
u2.id,
u2.address,
u2.created_at,
u2.referral_code
FROM users u1
JOIN users u2 ON u1.address = u2.referrer_address
WHERE u1.address = '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb'
ORDER BY u2.created_at DESC;
4. 统计用户的推荐人数
SELECT
u.address,
u.referral_code,
COUNT(referred.id) AS total_referrals
FROM users u
LEFT JOIN users referred ON u.address = referred.referrer_address
WHERE u.address = '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb'
GROUP BY u.address, u.referral_code;