| | |
| | | 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), |
| | | }; |
| | | }; |