554 lines
15 KiB
TypeScript
554 lines
15 KiB
TypeScript
/**
|
||
* filekorolheader: 用户管理API接口 - 用户数据查询接口服务
|
||
* 功能:API请求封装、数据转换、错误处理、分页查询
|
||
* 路径:/central-config/tenant/user-management/components/userManagementApi
|
||
* 规范:遵循crop-x/docs/开发项目规范.md,使用SDK API调用,TypeScript类型安全
|
||
*/
|
||
|
||
import { getAuthToken } from "@/utils/token";
|
||
import {
|
||
listSystemUsersApiV1UsersSystemUsersGet,
|
||
createSystemUserApiV1UsersSystemUsersPost,
|
||
getSystemUserApiV1UsersSystemUsersUserIdGet,
|
||
activateSystemUserApiV1UsersSystemUsersUserIdActivatePost,
|
||
deactivateSystemUserApiV1UsersSystemUsersUserIdDeactivatePost,
|
||
deleteSystemUserApiV1UsersSystemUsersUserIdDelete,
|
||
} from "@/lib/api/sdk.gen";
|
||
|
||
// API返回的用户数据类型
|
||
export interface UserData {
|
||
id: string;
|
||
tenant_id: string;
|
||
email: string;
|
||
username: string;
|
||
full_name: string | null;
|
||
phone: string | null;
|
||
is_active?: boolean;
|
||
status?: string;
|
||
is_superuser: boolean;
|
||
is_verified: boolean;
|
||
created_at: string;
|
||
updated_at: string;
|
||
last_login_at: string | null;
|
||
avatar_url: string | null;
|
||
bio: string | null;
|
||
display_name: string | null;
|
||
department_id: string | null;
|
||
department_name: string | null;
|
||
scope: string;
|
||
company_name: string | null;
|
||
}
|
||
|
||
// API响应接口
|
||
export interface UsersApiResponse {
|
||
data: UserData[];
|
||
total: number;
|
||
page: number;
|
||
size: number;
|
||
total_pages: number;
|
||
has_next: boolean;
|
||
has_prev: boolean;
|
||
}
|
||
|
||
// 查询参数接口
|
||
export interface UsersQueryParams {
|
||
search?: string;
|
||
is_active?: boolean;
|
||
page?: number;
|
||
size?: number;
|
||
order_by?: string;
|
||
sort_order?: 'asc' | 'desc';
|
||
}
|
||
|
||
// 页面使用的用户数据类型(转换后的)
|
||
export interface User {
|
||
id: string;
|
||
username: string;
|
||
email: string;
|
||
fullName: string | null;
|
||
phone: string | null;
|
||
isActive: boolean;
|
||
isSuperuser: boolean;
|
||
isVerified: boolean;
|
||
createdAt: string;
|
||
updatedAt: string;
|
||
lastLoginAt: string | null;
|
||
avatarUrl: string | null;
|
||
bio: string | null;
|
||
displayName: string | null;
|
||
departmentId: string | null;
|
||
departmentName: string | null;
|
||
scope: string;
|
||
companyName: string | null;
|
||
tenantId: string;
|
||
}
|
||
|
||
/**
|
||
* 获取用户列表数据
|
||
*/
|
||
export async function fetchUsers(params: UsersQueryParams = {}): Promise<UsersApiResponse> {
|
||
try {
|
||
// 构建查询参数对象
|
||
const queryParams: any = {};
|
||
|
||
if (params.search) queryParams.search = params.search;
|
||
if (params.is_active !== undefined) queryParams.is_active = params.is_active;
|
||
if (params.page) queryParams.page = params.page;
|
||
if (params.size) queryParams.size = params.size;
|
||
if (params.order_by) queryParams.order_by = params.order_by;
|
||
if (params.sort_order) queryParams.sort_order = params.sort_order;
|
||
|
||
// 默认参数
|
||
if (!params.page) queryParams.page = 1;
|
||
if (!params.size) queryParams.size = 10;
|
||
if (!params.sort_order) queryParams.sort_order = 'desc';
|
||
|
||
// 使用SDK API调用用户查询接口,添加缓存破坏器和认证头部
|
||
const token = getAuthToken();
|
||
console.log('用户管理API调用参数:', queryParams);
|
||
|
||
const response = await listSystemUsersApiV1UsersSystemUsersGet({
|
||
query: {
|
||
...queryParams,
|
||
// 添加时间戳防止缓存
|
||
_t: Date.now(),
|
||
},
|
||
headers: token ? {
|
||
'Authorization': `Bearer ${token}`,
|
||
} : undefined,
|
||
});
|
||
|
||
if (response.error) {
|
||
throw new Error(`API error: ${response.error.message || 'Unknown error'}`);
|
||
}
|
||
|
||
const data = response.data as any;
|
||
console.log('用户管理API响应:', data);
|
||
|
||
// 转换响应数据格式以匹配现有的接口
|
||
// API返回的数据结构: { data: [...], total: 25, page: 1, size: 10, ... }
|
||
return {
|
||
data: data?.data || [], // 注意:实际数据在 data.data 中
|
||
total: data?.total || 0,
|
||
page: data?.page || 1,
|
||
size: data?.size || 10,
|
||
total_pages: data?.total_pages || 0,
|
||
has_next: data?.has_next || false,
|
||
has_prev: data?.has_prev || false,
|
||
};
|
||
} catch (error) {
|
||
console.error('Failed to fetch users:', error);
|
||
throw error;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 将API数据转换为页面所需的用户数据格式
|
||
* 优先显示display_name,其次full_name,最后username
|
||
*/
|
||
export function transformUserData(user: UserData): User {
|
||
return {
|
||
id: user.id,
|
||
username: user.username,
|
||
email: user.email,
|
||
fullName: user.full_name,
|
||
phone: user.phone,
|
||
isActive: user.is_active !== undefined ? user.is_active : user.status === 'active',
|
||
isSuperuser: user.is_superuser,
|
||
isVerified: user.is_verified,
|
||
createdAt: formatDate(user.created_at),
|
||
updatedAt: formatDate(user.updated_at),
|
||
lastLoginAt: user.last_login_at ? formatDate(user.last_login_at) : null,
|
||
avatarUrl: user.avatar_url,
|
||
bio: user.bio,
|
||
displayName: user.display_name || user.full_name || user.username,
|
||
departmentId: user.department_id,
|
||
departmentName: user.department_name,
|
||
scope: user.scope,
|
||
companyName: user.company_name,
|
||
tenantId: user.tenant_id,
|
||
};
|
||
}
|
||
|
||
/**
|
||
* 格式化日期
|
||
*/
|
||
function formatDate(dateString: string): string {
|
||
try {
|
||
const date = new Date(dateString);
|
||
return date.toLocaleString('zh-CN', {
|
||
year: 'numeric',
|
||
month: '2-digit',
|
||
day: '2-digit',
|
||
hour: '2-digit',
|
||
minute: '2-digit',
|
||
}).replace(/\//g, '-');
|
||
} catch (error) {
|
||
return dateString;
|
||
}
|
||
}
|
||
|
||
// Pagination state interface for page components
|
||
export interface PaginationState {
|
||
page: number;
|
||
size: number;
|
||
total: number;
|
||
totalPages: number;
|
||
hasNext: boolean;
|
||
hasPrev: boolean;
|
||
}
|
||
|
||
// 创建用户请求参数接口
|
||
export interface CreateUserRequest {
|
||
email: string;
|
||
username: string;
|
||
full_name: string;
|
||
phone: string;
|
||
password: string;
|
||
is_superuser: boolean;
|
||
tenant_id?: string; // 系统管理员不传,企业管理员必传
|
||
}
|
||
|
||
// 创建用户响应数据类型
|
||
export interface CreateUserResponse {
|
||
id: string;
|
||
email: string;
|
||
username: string;
|
||
full_name: string;
|
||
phone: string;
|
||
is_superuser: boolean;
|
||
tenant_id?: string;
|
||
is_active: boolean;
|
||
created_at: string;
|
||
updated_at: string;
|
||
}
|
||
|
||
/**
|
||
* 创建系统用户(系统管理员或企业管理员)
|
||
*
|
||
* @param userData 用户创建数据
|
||
* @returns 创建成功的用户数据
|
||
*/
|
||
export async function createUser(userData: CreateUserRequest): Promise<CreateUserResponse> {
|
||
try {
|
||
console.log(`[API] createUser 创建用户:`, userData);
|
||
|
||
// 获取认证token
|
||
const token = getAuthToken();
|
||
|
||
// 构建请求参数
|
||
const requestData: any = {
|
||
email: userData.email,
|
||
username: userData.username,
|
||
full_name: userData.full_name,
|
||
phone: userData.phone,
|
||
password: userData.password,
|
||
is_superuser: userData.is_superuser,
|
||
};
|
||
|
||
// 只有企业管理员才传tenant_id
|
||
if (userData.tenant_id) {
|
||
requestData.tenant_id = userData.tenant_id;
|
||
}
|
||
|
||
// 调用SDK API创建系统用户
|
||
const response = await createSystemUserApiV1UsersSystemUsersPost({
|
||
body: requestData,
|
||
headers: token ? {
|
||
'Authorization': `Bearer ${token}`,
|
||
} : undefined,
|
||
});
|
||
|
||
if (response.error) {
|
||
// 处理API错误,提取错误信息
|
||
const errorMessage = response.error.message || '创建用户失败';
|
||
console.error('[API] createUser 创建用户失败:', response.error);
|
||
throw new Error(errorMessage);
|
||
}
|
||
|
||
const data = response.data as any;
|
||
console.log('[API] createUser 创建用户成功:', data);
|
||
|
||
// 返回创建成功的用户数据
|
||
return {
|
||
id: data.id,
|
||
email: data.email,
|
||
username: data.username,
|
||
full_name: data.full_name,
|
||
phone: data.phone,
|
||
is_superuser: data.is_superuser,
|
||
tenant_id: data.tenant_id,
|
||
is_active: data.is_active,
|
||
created_at: data.created_at,
|
||
updated_at: data.updated_at,
|
||
};
|
||
|
||
} catch (error) {
|
||
console.error('[API] createUser 创建用户异常:', error);
|
||
|
||
// 如果是已知错误,直接抛出
|
||
if (error instanceof Error) {
|
||
throw error;
|
||
}
|
||
|
||
// 未知错误包装成标准错误格式
|
||
throw new Error('创建用户失败,请稍后重试');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 验证用户创建数据
|
||
*
|
||
* @param userData 用户数据
|
||
* @returns 验证结果
|
||
*/
|
||
export function validateUserData(userData: CreateUserRequest): { isValid: boolean; errors: string[] } {
|
||
const errors: string[] = [];
|
||
|
||
// 邮箱验证
|
||
if (!userData.email) {
|
||
errors.push('邮箱不能为空');
|
||
} else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(userData.email)) {
|
||
errors.push('邮箱格式不正确');
|
||
}
|
||
|
||
// 用户名验证
|
||
if (!userData.username) {
|
||
errors.push('用户名不能为空');
|
||
} else if (userData.username.length < 3) {
|
||
errors.push('用户名长度至少3位');
|
||
}
|
||
|
||
// 姓名验证
|
||
if (!userData.full_name) {
|
||
errors.push('姓名不能为空');
|
||
}
|
||
|
||
// 电话验证
|
||
if (!userData.phone) {
|
||
errors.push('电话不能为空');
|
||
} else if (!/^1[3-9]\d{9}$/.test(userData.phone)) {
|
||
errors.push('请输入正确的手机号码');
|
||
}
|
||
|
||
// 密码验证
|
||
if (!userData.password) {
|
||
errors.push('密码不能为空');
|
||
} else if (userData.password.length < 6) {
|
||
errors.push('密码长度至少6位');
|
||
}
|
||
|
||
// 企业管理员需要tenant_id
|
||
if (!userData.is_superuser && !userData.tenant_id) {
|
||
errors.push('企业管理员必须选择所属企业');
|
||
}
|
||
|
||
return {
|
||
isValid: errors.length === 0,
|
||
errors
|
||
};
|
||
}
|
||
|
||
/**
|
||
* 获取用户详情信息
|
||
*
|
||
* @param userId 用户ID
|
||
* @returns 用户详情数据
|
||
*/
|
||
export async function fetchUserDetails(userId: string): Promise<UserData> {
|
||
try {
|
||
console.log(`[API] fetchUserDetails 获取用户详情: ${userId}`);
|
||
|
||
// 获取认证token
|
||
const token = getAuthToken();
|
||
|
||
// 调用SDK API获取用户详情
|
||
const response = await getSystemUserApiV1UsersSystemUsersUserIdGet({
|
||
path: {
|
||
user_id: userId,
|
||
},
|
||
headers: token ? {
|
||
'Authorization': `Bearer ${token}`,
|
||
} : undefined,
|
||
});
|
||
|
||
if (response.error) {
|
||
const errorMessage = response.error.message || '获取用户详情失败';
|
||
console.error('[API] fetchUserDetails 获取用户详情失败:', response.error);
|
||
throw new Error(errorMessage);
|
||
}
|
||
|
||
const data = response.data as any;
|
||
console.log('[API] fetchUserDetails 获取用户详情成功:', data);
|
||
|
||
// 返回用户详情数据
|
||
return {
|
||
id: data.id,
|
||
tenant_id: data.tenant_id,
|
||
email: data.email,
|
||
username: data.username,
|
||
full_name: data.full_name,
|
||
phone: data.phone,
|
||
is_active: data.is_active,
|
||
status: data.is_active ? 'active' : 'inactive',
|
||
is_superuser: data.is_superuser,
|
||
is_verified: data.is_verified,
|
||
created_at: data.created_at,
|
||
updated_at: data.updated_at,
|
||
last_login_at: data.last_login_at,
|
||
avatar_url: data.avatar_url,
|
||
bio: data.bio,
|
||
display_name: data.display_name,
|
||
department_id: data.department_id,
|
||
department_name: data.department_name,
|
||
scope: data.scope || 'system',
|
||
company_name: data.company_name,
|
||
};
|
||
|
||
} catch (error) {
|
||
console.error('[API] fetchUserDetails 获取用户详情异常:', error);
|
||
|
||
// 如果是已知错误,直接抛出
|
||
if (error instanceof Error) {
|
||
throw error;
|
||
}
|
||
|
||
// 未知错误包装成标准错误格式
|
||
throw new Error('获取用户详情失败,请稍后重试');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 激活系统用户
|
||
*
|
||
* @param userId 用户ID
|
||
* @returns 操作结果
|
||
*/
|
||
export async function activateUser(userId: string): Promise<void> {
|
||
try {
|
||
console.log(`[API] activateUser 激活用户: ${userId}`);
|
||
|
||
// 获取认证token
|
||
const token = getAuthToken();
|
||
|
||
// 调用SDK API激活用户
|
||
const response = await activateSystemUserApiV1UsersSystemUsersUserIdActivatePost({
|
||
path: {
|
||
user_id: userId,
|
||
},
|
||
headers: token ? {
|
||
'Authorization': `Bearer ${token}`,
|
||
} : undefined,
|
||
});
|
||
|
||
if (response.error) {
|
||
// 处理API错误,提取错误信息
|
||
const errorMessage = response.error.message || '激活用户失败';
|
||
console.error('[API] activateUser 激活用户失败:', response.error);
|
||
throw new Error(errorMessage);
|
||
}
|
||
|
||
console.log('[API] activateUser 激活用户成功:', userId);
|
||
|
||
} catch (error) {
|
||
console.error('[API] activateUser 激活用户异常:', error);
|
||
|
||
// 如果是已知错误,直接抛出
|
||
if (error instanceof Error) {
|
||
throw error;
|
||
}
|
||
|
||
// 未知错误包装成标准错误格式
|
||
throw new Error('激活用户失败,请稍后重试');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 停用系统用户
|
||
*
|
||
* @param userId 用户ID
|
||
* @returns 操作结果
|
||
*/
|
||
export async function deactivateUser(userId: string): Promise<void> {
|
||
try {
|
||
console.log(`[API] deactivateUser 停用用户: ${userId}`);
|
||
|
||
// 获取认证token
|
||
const token = getAuthToken();
|
||
|
||
// 调用SDK API停用用户
|
||
const response = await deactivateSystemUserApiV1UsersSystemUsersUserIdDeactivatePost({
|
||
path: {
|
||
user_id: userId,
|
||
},
|
||
headers: token ? {
|
||
'Authorization': `Bearer ${token}`,
|
||
} : undefined,
|
||
});
|
||
|
||
if (response.error) {
|
||
// 处理API错误,提取错误信息
|
||
const errorMessage = response.error.message || '停用用户失败';
|
||
console.error('[API] deactivateUser 停用用户失败:', response.error);
|
||
throw new Error(errorMessage);
|
||
}
|
||
|
||
console.log('[API] deactivateUser 停用用户成功:', userId);
|
||
|
||
} catch (error) {
|
||
console.error('[API] deactivateUser 停用用户异常:', error);
|
||
|
||
// 如果是已知错误,直接抛出
|
||
if (error instanceof Error) {
|
||
throw error;
|
||
}
|
||
|
||
// 未知错误包装成标准错误格式
|
||
throw new Error('停用用户失败,请稍后重试');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 删除系统用户
|
||
*
|
||
* @param userId 用户ID
|
||
* @returns 操作结果
|
||
*/
|
||
export async function deleteUser(userId: string): Promise<void> {
|
||
try {
|
||
console.log(`[API] deleteUser 删除用户: ${userId}`);
|
||
|
||
// 获取认证token
|
||
const token = getAuthToken();
|
||
|
||
// 调用SDK API删除用户
|
||
const response = await deleteSystemUserApiV1UsersSystemUsersUserIdDelete({
|
||
path: {
|
||
user_id: userId,
|
||
},
|
||
headers: token ? {
|
||
'Authorization': `Bearer ${token}`,
|
||
} : undefined,
|
||
});
|
||
|
||
if (response.error) {
|
||
// 处理API错误,提取错误信息
|
||
const errorMessage = response.error.message || '删除用户失败';
|
||
console.error('[API] deleteUser 删除用户失败:', response.error);
|
||
throw new Error(errorMessage);
|
||
}
|
||
|
||
console.log('[API] deleteUser 删除用户成功:', userId);
|
||
|
||
} catch (error) {
|
||
console.error('[API] deleteUser 删除用户异常:', error);
|
||
|
||
// 如果是已知错误,直接抛出
|
||
if (error instanceof Error) {
|
||
throw error;
|
||
}
|
||
|
||
// 未知错误包装成标准错误格式
|
||
throw new Error('删除用户失败,请稍后重试');
|
||
}
|
||
} |