wsj
2026-10-17 bc1e862b8a487589dae756e3e1c5a5644c7986f5
src/api/auth.ts
@@ -1,47 +1,56 @@
import type { LoginParams, LoginResult, UserInfo } from '@/types/auth';
import { ApiError, request } from '@/api/request';
import type {
  LoginParams,
  LoginResult,
  TenantLoginData,
  UserInfo,
} from '@/types/auth';
interface MockAccount {
interface TenantLoginRequest {
  phone: string;
  password: string;
  user: UserInfo;
  tenantCode: string;
}
/**
 * 演示环境下的本地账号。
 * 真实项目请替换为后端登录接口。
 */
const MOCK_ACCOUNTS: Record<string, MockAccount> = {
  admin: {
    password: 'admin123',
    user: {
      id: 1,
      username: 'admin',
      nickname: '超级管理员',
      role: 'admin',
    },
  },
  user: {
    password: 'user123',
    user: {
      id: 2,
      username: 'user',
      nickname: '普通运营',
      role: 'user',
    },
  },
const toUserInfo = (data: TenantLoginData, params: LoginParams): UserInfo => {
  const phone = data.phone ?? params.phone.trim();
  const loginType = data.loginType?.toLowerCase() ?? '';
  return {
    id: data.employeeId ?? 0,
    username: phone,
    nickname: data.employeeName ?? phone,
    role: loginType.includes('admin') ? 'admin' : 'user',
    tenant: data.tenantCode ?? params.tenant.trim(),
    phone,
  };
};
const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
/** 租户登录。 */
export const loginApi = async (params: LoginParams): Promise<LoginResult> => {
  await delay(500);
  const data = await request<TenantLoginRequest, TenantLoginData>(
    {
      url: '/auth/tenant-login',
      method: 'POST',
      data: {
        phone: params.phone.trim(),
        password: params.password,
        tenantCode: params.tenant.trim(),
      },
    },
    {
      // 登录有副作用,不合并;错误由登录页统一提示。
      merge: false,
      showError: false,
    },
  );
  const account = MOCK_ACCOUNTS[params.username];
  if (!account || account.password !== params.password) {
    throw new Error('用户名或密码错误');
  if (!data?.token) {
    throw new ApiError('登录响应中未找到 token', { data });
  }
  return {
    token: `mock-token-${account.user.id}-${Date.now()}`,
    user: account.user,
    token: data.token,
    user: toUserInfo(data, params),
  };
};