@blocklet/ui-react
Version:
Some useful front-end web components that can be used in Blocklets.
121 lines (99 loc) • 5.88 kB
Markdown
# UserSessions
`UserSessions` 组件渲染一个全面的数据表格,用于显示和管理用户的登录会话。它清晰地概览了用户在各种设备上的所有活跃、已过期和离线会话,让用户能够控制其账户安全。
该组件被设计成一个即插即用的解决方案,供需要实现会话管理功能的开发者使用。它负责处理数据获取、分页、UI 渲染以及登出特定会话等操作。
## 功能
- **会话筛选:** 用户可以轻松按状态(`online`、`expired` 或 `offline`)筛选会话。
- **详细信息:** 每个会话条目都会显示解析后的 user-agent 数据,包括操作系统、设备类型(浏览器)和钱包操作系统。
- **IP 地理位置:** 根据上次登录的 IP 地址自动解析并显示地理区域。
- **会话终止:** 允许用户终止除当前会话之外的任何会话。
- **批量操作:** 包含“全部登出”功能,可终止特定状态下的所有会話。
- **响应式设计:** 适应不同屏幕尺寸,确保在桌面和移动设备上提供一致的用户体验。
## 工作原理
`UserSessions` 组件通过调用开发者提供的函数来请求会话数据。这种设计将组件与任何特定的后端实现解耦,从而提供了更大的灵活性。
<!-- DIAGRAM_IMAGE_START:sequence:16:9:1765962229 -->

<!-- DIAGRAM_IMAGE_END -->
## 用法
要使用 `UserSessions` 组件,您必须提供一个 `user` 对象和一个 `getUserSessions` 函数。`getUserSessions` 函数负责从您的后端服务获取会话数据。
```javascript Integration Example icon=lucide:code
import { UserSessions } from '@arcblock/blocklet-ui-react';
import { client } from './libs/client'; // 您的 API 客户端实例
// 正在显示其会话的用户对象。
const currentUser = {
did: 'z1...',
name: 'Alice',
// other user properties
};
/**
* 此函数从您的后端获取会话数据。
* UserSessions 组件在需要新数据时会调用此函数。
*
* @param {object} params - 查询参数。
* @param {number} params.page - 当前页码。
* @param {number} params.pageSize - 每页的项目数。
* @param {string} params.status - 用于筛选的会话状态('online'、'expired'、'offline')。
* @returns {Promise<{ list: UserSession[], paging: { total: number } }>} 一个解析为会话数据的 Promise。
*/
const fetchUserSessions = async ({ page, pageSize, status }) => {
const response = await client.user.getSessions({
page,
pageSize,
status,
});
// 确保返回格式符合组件的要求
return {
list: response?.list || [],
paging: {
total: response?.paging?.total || 0,
},
};
};
export default function MyAccountSessionsPage() {
return (
<div>
<h2>管理您的登录会话</h2>
<UserSessions
user={currentUser}
getUserSessions={fetchUserSessions}
/>
</div>
);
}
```
## 属性
`UserSessions` 组件接受以下属性以自定义其行为和外观。
<x-field-group>
<x-field data-name="user" data-type="User" data-required="true">
<x-field-desc markdown>正在显示其会话的用户对象。组件需要此对象为会话列表提供上下文。</x-field-desc>
</x-field>
<x-field data-name="getUserSessions" data-type="function" data-required="true">
<x-field-desc markdown>一个异步函数,负责从您的后端获取分页的会话数据。它接收一个包含 `page`、`pageSize` 和 `status` 的对象,并且必须返回一个解析为 `{ list: UserSession[], paging: { total: number } }` 形状对象的 `Promise`。</x-field-desc>
</x-field>
<x-field data-name="showAction" data-type="boolean" data-default="true" data-required="false">
<x-field-desc markdown>控制包含登出按钮的“操作”列的可见性。设置为 `false` 可创建只读视图。</x-field-desc>
</x-field>
<x-field data-name="showUser" data-type="boolean" data-default="true" data-required="false">
<x-field-desc markdown>控制“用户”列的可见性。这在需要为每个会话识别用户的多用户或管理上下文中很有用。</x-field-desc>
</x-field>
<x-field data-name="showOffline" data-type="boolean" data-default="false" data-required="false">
<x-field-desc markdown>决定“离线”筛选选项在 UI 中是否可用。离线会话通常代表当前不活跃的长期会话。</x-field-desc>
</x-field>
<x-field data-name="showAppPid" data-type="boolean" data-default="false" data-required="false">
<x-field-desc markdown>控制“应用 Pid”列的可见性,该列可以显示与会话关联的 Blocklet 的程序 ID。</x-field-desc>
</x-field>
</x-field-group>
## 显示信息
该组件在数据表格中为每个会话渲染以下信息:
| 列 | 描述 |
| :--- | :--- |
| **平台** | 从会话的 user-agent 字符串派生的操作系统和版本(例如 `Windows/10`)。 |
| **设备类型** | 用于会话的浏览器或应用程序(例如 `Chrome/108.0.0`)。 |
| **钱包操作系统** | 连接的 DID 钱包的操作系统(如果可用)。 |
| **应用 Pid** | 创建会话的 Blocklet 的程序 ID。(`showAppPid` 为 `true` 时可见)。 |
| **用户** | 与会话关联的用户。(`showUser` 为 `true` 时可见)。 |
| **创建于** | 会话最初创建时的时间戳。 |
| **上次活跃** | 上次活动的时间戳。对于已过期的会话,此列显示“已过期”。 |
| **上次登录 IP** | 会话的最后已知 IP 地址及其解析的地理区域。 |
| **操作** | 提供一个用于登出该会话的按钮。(`showAction` 为 `true` 时可见)。 |
---
要获得完整的用户管理界面,请考虑在 [UserCenter](./components-user-management-user-center.md) 组件中使用 `UserSessions` 组件。