docs(design): 补 device uuid 生成机制(随机UUIDv4+安全存储+重装影响)

§3.2.1 ④:uuid=客户端首启 Uuid().v4() 随机生成、立即写 flutter_secure_storage
跨重启恒定;不绑硬件ID(五端唯一可靠合规);各平台安全区存储 + 卸载重装影响
(iOS Keychain 保留/Android 清);对设备计数的含义。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-28 23:46:37 +08:00
parent c1994ad048
commit a3731ce11c
+11 -1
View File
@@ -204,12 +204,22 @@ UNIQUE INDEX (dp_uuid) -- 000015NULL 不冲突,存量待回填)
<div class="card root">
<b>③ 设备 id 与「按设备控制登录数」</b>(你提的将来需求,本设计已为其留好抓手):
<ul>
<li><b>设备身份键</b> = <code>(user_id, devices.uuid)</code><code>uuid</code> 客户端生成、持久化在 <code>flutter_secure_storage</code>同一台机器重装 app 内仍稳定 → 一台真实设备恒等一行 <code>devices</code>,不因重登重复计数。</li>
<li><b>设备身份键</b> = <code>(user_id, devices.uuid)</code><code>uuid</code> 客户端首启生成的随机 UUID v4持久化在 <code>flutter_secure_storage</code>同一安装内跨重启/更新恒定 → 一台真恒等一行 <code>devices</code>,不因重登重复计数(生成方式见下 ④)</li>
<li><b>限额抓手已就绪</b><code>RegisterIfAbsent(userID, deviceUUID, name, platform, <u>maxDevices</u>)</code> 在注册新设备时已会<b>按套餐上限校验设备数</b><code>maxDevices</code> 来自计划:免费 1 / PRO 5,对应 <code>Me.devicesMax</code>)。超限时拒绝注册新设备(返回「设备数已达上限」),即「按设备控制用户能登录的设备数」。</li>
<li><b>两种限额口径</b>(将来按需选):<b>(a) 累计设备数</b>——devices 行数 ≤ 上限(当前 RegisterIfAbsent 口径,超了要先「清除登录信息」踢掉旧设备);<b>(b) 同时在线/登录数</b>——以 <code>sessions</code>(未撤销)或 <code>last_seen</code> 在线数为准,限「并发」而非「累计」。<code>sessions</code> 表 + <code>devices.id</code> 同时支持这两种统计。</li>
</ul>
</div>
<div class="card">
<b><code>uuid</code> 怎么生成</b>(替换现有硬编码 <code>_kDeviceId='mac-001'</code>):
<ul>
<li><b>随机 UUID v4</b>,不绑硬件标识——客户端首启用安全随机数生成(Dart <code>uuid</code> 包的 <code>Uuid().v4()</code>128 位随机),<u>立即写入 <code>flutter_secure_storage</code></u>key 如 <code>device_id</code>);之后每次启动先读,读到就复用。</li>
<li><b>为什么不用硬件 ID</b>:iOS 无稳定硬件序列号、Android 限制 <code>ANDROID_ID</code>、桌面 MAC 地址易变/隐私敏感——「随机 UUID + 安全存储持久化」是跨五端唯一可靠且合规的做法。</li>
<li><b>存储位置</b>=各平台安全区:iOS/macOS Keychain、Android Keystore 加密的 EncryptedSharedPreferences、Windows DPAPI 凭据库。普通卸载重装的影响:<span class="warn-c">iOS Keychain 通常<b>跨重装保留</b>uuid 不变);Android 卸载即清</span>(重装会得新 uuid,算一台新设备)。</li>
<li><b>对设备计数的含义</b>:正常使用(重启/更新)uuid 恒定,计数准;卸载重装在部分平台会多记一台——故「累计设备数」超限时需用户「清除登录信息」手动清旧设备,或将来加「30 天未活跃自动回收」。</li>
</ul>
</div>
<h3>3.3 <code>usage_device_daily</code>(已存在,本方案使其真正写入)</h3>
<pre>
usage_device_daily(user_id, device_id, date, bytes_up, bytes_down, minutes_used)