用户列表页面用于管理系统用户账号,包括本地用户和域用户的查看、创建、编辑、删除等操作。支持用户状态管理(启用/禁用)、密码重置等功能。
Page (页面)
└── Main Container (主容器)
├── Header Region (头部区域)
│ └── Tabs Component (选项卡组件)
│ ├── Tab Item: 用户列表
│ ├── Tab Item: 角色列表
│ ├── Tab Item: 域用户组
│ └── Tab Item: LDAP
│
├── Content Region (内容区域)
│ └── Table Section (表格分区)
│ ├── Table Component (表格组件)
│ │ ├── Column: 用户名称
│ │ ├── Column: 角色
│ │ ├── Column: 用户类型
│ │ ├── Column: 账号状态 (Switch)
│ │ └── Column: 锁定状态
│ │
│ └── Pagination Component (分页组件)
│ ├── Total Count Display
│ ├── Page Size Selector
│ ├── Page Navigation
│ └── Page Jump Input
│
└── Footer Region (底部区域)
└── Action Toolbar (操作工具栏)
├── Button: 重置密码
├── Button: 刷新
├── Button: 删除
├── Button: 编辑
└── Button: 新建 (Primary)
| 组件 | 用途 | 选择理由 |
|---|---|---|
| Tabs | 顶部导航选项卡 | - 提供标准的选项卡导航 - 自动处理选中状态 - 支持路由集成 - 清晰的视觉分隔 - 适合管理多个相关页面 |
| Table | 用户数据展示 | - 强大的数据表格组件 - 内置排序、筛选功能 - 支持行选择 - 自动处理分页数据 - 列宽自适应 - 固定列支持 |
| Switch | 账号状态开关 | - 直观的开关交互 - 即时生效反馈 - 支持加载状态 - 适合布尔值切换 - 占用空间小 |
| Pagination | 分页控制 | - 完整的分页功能 - 支持页码跳转 - 每页条数选择 - 总数显示 - 国际化支持 |
| Button | 操作按钮 | - 提供多种按钮样式 - 支持加载状态 - 图标支持 - 自动防重复点击 - 主题一致性 |
| Space | 按钮组间距 | - 统一管理按钮间距 - 响应式布局 - 自动对齐 |
| Modal | 弹窗对话框 | - 用于编辑/新建用户 - 模态交互 - 表单提交 - 确认删除操作 |
| Popconfirm | 操作确认 | - 删除确认提示 - 轻量级确认 - 避免误操作 |
选择 Tabs 作为顶部导航的原因:
选择 Ant Design Table 的原因:
使用 Switch 而不是按钮来控制账号状态的原因:
[x] 用户列表展示
[x] 分页功能
[x] 数据加载
[x] 新建用户
[x] 编辑用户
[x] 删除用户
[x] 重置密码
[x] 账号状态管理
[x] 刷新列表
[x] 行选择
[x] 批量操作
需求描述:
交互流程:
数据结构:
interface User {
id: string;
username: string; // 用户名称
role: string; // 角色
userType: 'local' | 'domain'; // 用户类型
isEnabled: boolean; // 账号状态
isLocked: boolean; // 锁定状态
lastLoginTime?: string; // 最后登录时间
createdAt: string; // 创建时间
updatedAt: string; // 更新时间
}
interface UserListResponse {
data: User[];
total: number;
page: number;
pageSize: number;
}
边界情况:
需求描述:
交互流程:
验证规则:
安全考虑:
边界情况:
需求描述:
交互流程:
表单字段:
interface CreateUserForm {
username: string; // 3-20字符,字母数字下划线
displayName?: string; // 显示名称
role: string; // 角色ID
userType: 'local' | 'domain';
password: string; // 8-20字符,包含大小写+数字
confirmPassword: string; // 与password一致
email?: string; // 邮箱格式
phone?: string; // 电话格式
}
验证规则:
边界情况:
需求描述:
交互流程:
可编辑字段:
不可编辑字段:
权限限制:
边界情况:
需求描述:
交互流程:
确认对话框内容:
确定要删除用户 "${username}" 吗?确定要删除选中的 ${count} 个用户吗?删除后将无法恢复,且该用户的所有会话将被终止。删除限制:
安全措施:
边界情况:
需求描述:
交互流程:
密码生成规则:
安全考虑:
权限要求:
边界情况:
需求描述:
交互流程:
保持状态:
使用场景:
需求描述:
交互流程:
选择状态管理:
interface SelectionState {
selectedRowKeys: string[]; // 选中的用户ID数组
selectedRows: User[]; // 选中的用户对象数组
}
批量操作:
边界情况:
需求描述:
交互流程:
路由集成:
/system/users?tab=user-list状态管理:
// states/userManagementSlice.ts
interface UserManagementState {
// 用户列表数据
users: {
data: User[];
total: number;
loading: boolean;
error: string | null;
};
// 分页状态
pagination: {
current: number;
pageSize: number;
};
// 搜索和筛选
filters: {
keyword: string;
role: string | null;
userType: 'all' | 'local' | 'domain';
status: 'all' | 'enabled' | 'disabled';
};
// 排序
sorter: {
field: string | null;
order: 'ascend' | 'descend' | null;
};
// 选择状态
selection: {
selectedRowKeys: string[];
selectedRows: User[];
};
// 当前 Tab
activeTab: 'user-list' | 'role-list' | 'domain-group' | 'ldap';
// 模态框状态
modals: {
createUser: boolean;
editUser: boolean;
resetPassword: boolean;
};
// 当前编辑的用户
currentUser: User | null;
}
// 异步 Thunks
export const fetchUsers = createAsyncThunk(
'userManagement/fetchUsers',
async (params: FetchUsersParams) => {
const response = await getUserList(params);
return response;
}
);
export const createUser = createAsyncThunk(
'userManagement/createUser',
async (userData: CreateUserForm) => {
const response = await createUserAPI(userData);
return response;
}
);
export const updateUser = createAsyncThunk(
'userManagement/updateUser',
async ({ id, data }: { id: string; data: UpdateUserForm }) => {
const response = await updateUserAPI(id, data);
return response;
}
);
export const deleteUsers = createAsyncThunk(
'userManagement/deleteUsers',
async (userIds: string[]) => {
await deleteUsersAPI(userIds);
return userIds;
}
);
export const toggleUserStatus = createAsyncThunk(
'userManagement/toggleUserStatus',
async ({ id, isEnabled }: { id: string; isEnabled: boolean }) => {
await updateUserStatusAPI(id, isEnabled);
return { id, isEnabled };
}
);
export const resetPassword = createAsyncThunk(
'userManagement/resetPassword',
async ({ id, password }: { id: string; password?: string }) => {
const response = await resetPasswordAPI(id, password);
return response;
}
);
```typescript // API/user.ts
// 获取用户列表 export interface FetchUsersParams { page: number; pageSize: number; keyword?: string; role?: string; userType?: 'local' | 'domain'; status?: 'enabled' | 'disabled'; sortField?: string; sortOrder?: 'asc' | 'desc'; }
export const getUserList = (params: FetchUsersParams): Promise => { return request.get('/api/system/users', { params }); };
// 创建用户 export interface CreateUserForm { username: string; displayName?: string; role: string; userType: 'local' | 'domain'; password: string; email?: string; phone?: string; }
export const createUserAPI = (data: CreateUserForm): Promise => { return request.post('/api/system/users', data); };
// 更新用户 export interface UpdateUserForm { displayName?: string; role?: string; email?: string; phone?: string; remark?: string; }
export const updateUserAPI = (id: string, data: UpdateUserForm): Promise => {
return request.put(/api/system/users/${id}, data);
};
// 删除用户 export const deleteUsersAPI = (userIds: string[]): Promise => { return request.delete('/api/system/users', { data: { userIds } }); };
// 更新用户状态
export const updateUserStatusAPI = (id: string, isEnabled: boolean): Promise => {
return request.patch(/api/system/users/${id}/status, { isEnabled });
};
// 重置密码 export interface ResetPasswordResponse { newPassword: string; // 新密码(仅一次性返回) }
export const resetPasswordAPI = (
id: string,
password?: string
): Promise => {
return request.post(/api/system/users/${id}/reset-password, { password });
};
// 检查用户名是否存在 export const checkUsernameExists = (username: string): Promise => {