diff --git a/docs/device-session-management-design.html b/docs/device-session-management-design.html index ddf6337..731b14f 100644 --- a/docs/device-session-management-design.html +++ b/docs/device-session-management-design.html @@ -141,15 +141,74 @@ INDEX (user_id), INDEX (device_id), UNIQUE (refresh_jti) -

3.2 devices 表加列(同迁移)

+

3.2 devices 表(完整字段)

+

既有 7 列(000001 建表 + 000015 加 dp_uuid)+ 本方案新增 2 列(000016)。完整 schema:

+
+devices(
+  id          INTEGER PK AUTOINCREMENT,         -- 000001  内部自增主键
+  uuid        TEXT NOT NULL UNIQUE,             -- 000001  客户端生成的稳定设备 UUID(API 对外用它)
+  user_id     NOT NULL,                         -- 000001  FK users.id(设备归属用户)
+  name        TEXT NOT NULL,                    -- 000001  设备名(主机名/机型,≤64 runes)
+  platform    TEXT NOT NULL CHECK(...),         -- 000001  ios|android|windows|macos|linux *
+  last_seen   DATETIME NULL,                    -- 000001  数据面最后活跃(connect + ReportUsage touch)→ 在线判定
+  created_at  DATETIME NOT NULL,                -- 000001  设备首次注册时间
+  dp_uuid     CHAR(36) NULL UNIQUE,             -- 000015  每设备数据面凭证(sing-box VLESS user uuid)
+  client_version    TEXT NULL,                  -- 000016  最近上报的客户端版本(列表展示)         ← 新增
+  totp_trusted_until DATETIME NULL              -- 000016  预留:2FA「信任设备」过期点;清除登录时清空 ← 新增
+)
+INDEX (user_id)              -- 000001
+UNIQUE INDEX (dp_uuid)       -- 000015(NULL 不冲突,存量待回填)
+
- + - - + + + + + + + + + +
类型用途
类型来源用途
client_versionTEXT NULL该设备最近上报的客户端版本,列表展示
totp_trusted_untilDATETIME NULL预留:未来 2FA「信任设备」过期点;清除登录信息时一并清空
idINTEGER PK000001内部自增主键(sessions/usage_device_daily 用 device_id 引用它)
uuidTEXT UNIQUE000001客户端生成的稳定设备 UUID;/v1/me/devices/{uuid} 路径参数即它
user_idFK users.id000001设备归属用户
nameTEXT000001设备名(主机名/机型,normalizeName 截断 ≤64 runes)
platformTEXT CHECK000001平台枚举。*现有 CHECK 仅 4 值,需 000016 放宽加 linux
last_seenDATETIME NULL000001数据面最后活跃;<3min=在线。由 connect + ReportUsage touch
created_atDATETIME000001设备首次注册时间(≠最后登录,后者取 session.created_at)
dp_uuidCHAR(36) NULL UNIQUE000015每设备数据面凭证;EnsureDeviceDpUUID 首连铸入,作 sing-box VLESS user uuid
client_versionTEXT NULL000016 新增该设备最近上报的客户端版本,列表展示
totp_trusted_untilDATETIME NULL000016 新增预留:未来 2FA「信任设备」过期点;清除登录信息时一并清空
-

既有列:uuid / user_id / name / platform / last_seen / created_at / dp_uuid(000015)设备「最后登录时间」= 该设备最近一条 session.created_at(不复用 last_seen,后者是数据面活跃度)。

+

*platform CHECK 放宽:000001 的约束是 CHECK(platform IN ('ios','android','windows','macos'))不含 linux,但桌面客户端支持 Linux。000016 需重建该约束加入 'linux'(SQLite 改 CHECK 要走「建新表→拷数据→换名」;MySQL 同步改)。

+ +

3.2.1 字段释疑(name 来源 / 三个时间戳 / 设备 id 与限额)

+ +
+name 怎么来:由客户端在登录/注册时填好上报(不是服务端造)。客户端用 device_info_plus 按平台取一个可读名: + + + + + + + + +
平台取值示例
macOS / Linux主机名(Platform.localHostnameWangjia-MacBook-Pro
Windows计算机名(WindowsDeviceInfo.computerNameDESKTOP-7F3K
iOS设备名/机型(IosDeviceInfo.name.utsname.machineiPhone 15
Android厂商 + 机型(manufacturer + modelXiaomi 13
+服务端 RegisterIfAbsentnormalizeName 截断 ≤64 runes 存库。后续可允许用户在「我的设备」里改名(PATCH,二期可选)。 +
+ +
+② 三个时间戳别混——分别答「装没装过 / 此刻在不在用 / 上次什么时候登的」: + +
+ +
+③ 设备 id 与「按设备控制登录数」(你提的将来需求,本设计已为其留好抓手): + +

3.3 usage_device_daily(已存在,本方案使其真正写入)