本文檔詳細描述了用戶(hù)認證系統的所有API接口,包括登錄認證、用戶(hù)信息獲取、菜單權限管理等功能。所有接口都已在 src/api/PulsAuth.ts
中實(shí)現。
loginWithPassword(params: LoginParams): Promise<ApiResponse<Record<string, unknown>>>
請求參數:
interface LoginParams {
account: string; // 用戶(hù)賬號
password: string; // 用戶(hù)密碼(MD5加密)
phone?: string; // 手機號(可選)
verifyCode?: string; // 驗證碼(可選)
}
loginWithPhone(params: LoginParams): Promise<ApiResponse<Record<string, unknown>>>
getUserInfo(): Promise<AuthApiResponse<UserAuthInfo>>
接口路徑: POST /api/auth/GetUserInfo
功能描述: 登錄后獲取用戶(hù)Token和基本認證信息
需要認證: ? 是
響應數據結構:
interface UserAuthInfo {
token: string; // 主要JWT Token
xiaoqi_token: string; // 小七系統專(zhuān)用Token
cachexiaoqi_token: string; // 緩存Token
email: string; // 用戶(hù)郵箱
sub: string; // 用戶(hù)唯一標識
exp: string; // Token過(guò)期時(shí)間戳
xiaoqi_keyid: string; // 小七系統用戶(hù)密鑰ID
cachexiaoqi_keyid: string; // 緩存密鑰ID
xiaoqi_type: string; // 小七系統類(lèi)型
cachexiaoqi_type: string; // 緩存類(lèi)型
[key: string]: any; // 其他JWT claims
}
showUserInfos(): Promise<AuthApiResponse<UserDetailInfo>>
接口路徑: POST /api/auth/ShowUserInfos
功能描述: 獲取用戶(hù)完整的個(gè)人信息、企業(yè)信息和權限數據
需要認證: ? 是
響應數據結構:
interface UserDetailInfo {
LoginUser: LoginUser; // 用戶(hù)基本信息
name: string; // 用戶(hù)顯示名稱(chēng)
LoginInfo: LoginInfo; // 登錄會(huì )話(huà)信息
LoginType: number; // 登錄類(lèi)型
LoginCompanies: LoginCompany[]; // 關(guān)聯(lián)企業(yè)列表
LoginDepRoles: any[]; // 部門(mén)角色信息
LoginUserExtend: UserExtend[]; // 用戶(hù)擴展信息
LoginCompaniesExtend: CompanyExtend[]; // 企業(yè)擴展信息
}
showUserMenus(): Promise<AuthApiResponse<MenuItem[]>>
接口路徑: POST /api/auth/ShowUserMenus
功能描述: 根據用戶(hù)權限獲取可訪(fǎng)問(wèn)的菜單列表
需要認證: ? 是
響應數據結構:
interface MenuItem {
id: string; // 菜單ID
parentId?: string; // 父菜單ID
title: string; // 菜單標題
name: string; // 菜單名稱(chēng)
path: string; // 路由路徑
component?: string; // 組件路徑
icon?: string; // 菜單圖標
orderBy: number; // 排序號
isEnabled: number; // 是否啟用
isVisible: number; // 是否可見(jiàn)
menuType: number; // 菜單類(lèi)型 0:目錄 1:菜單 2:按鈕
permission?: string; // 權限標識
children?: MenuItem[]; // 子菜單
meta?: { // 路由元信息
title: string;
icon?: string;
hidden?: boolean;
keepAlive?: boolean;
requiresAuth?: boolean;
};
}
refreshUserToken(refreshToken?: string): Promise<AuthApiResponse<UserAuthInfo>>
接口路徑: POST /api/auth/RefreshToken
功能描述: 當Token即將過(guò)期時(shí)調用此接口刷新Token
需要認證: ? 是
validateToken(): Promise<AuthApiResponse<{valid: boolean, exp: number}>>
接口路徑: POST /api/auth/ValidateToken
功能描述: 驗證當前Token是否有效
需要認證: ? 是
logout(): Promise<AuthApiResponse<any>>
接口路徑: POST /api/auth/Logout
功能描述: 注銷(xiāo)當前用戶(hù)會(huì )話(huà),清除服務(wù)端Token
需要認證: ? 是
getUserPermissions(): Promise<AuthApiResponse<string[]>>
接口路徑: POST /api/auth/GetUserPermissions
功能描述: 獲取當前用戶(hù)的詳細權限信息
需要認證: ? 是
switchCompany(companyId: string): Promise<AuthApiResponse<UserDetailInfo>>
接口路徑: POST /api/auth/SwitchCompany
功能描述: 多企業(yè)用戶(hù)切換當前工作企業(yè)
需要認證: ? 是
interface LoginUser {
Uuid: string; // 用戶(hù)唯一標識
Fluuid?: string; // 父級UUID
Qyuuid: string; // 企業(yè)UUID
Username: string; // 用戶(hù)名
Email: string; // 郵箱
PhoneNumber: string; // 手機號
AuthType: string; // 認證類(lèi)型
Grade: string; // 用戶(hù)等級
Nickname: string; // 昵稱(chēng)
Synopsis: string; // 個(gè)人簡(jiǎn)介
IsEnabled: number; // 是否啟用
IsActive: number; // 是否激活
CreateTime: string; // 創(chuàng )建時(shí)間
}
interface LoginCompany {
CompanyId: string; // 企業(yè)ID
ParentId: string; // 父企業(yè)ID
GroupId: string; // 集團ID
BelongName: string; // 所屬名稱(chēng)
AreaName: string; // 區域名稱(chēng)
Name: string; // 企業(yè)名稱(chēng)
Code: string; // 企業(yè)代碼
Description: string; // 企業(yè)描述
Nsrmc: string; // 納稅人名稱(chēng)
Shxydm: string; // 社會(huì )信用代碼
IsEnabled: number; // 是否啟用
}
interface UserExtend {
Uuid: string; // 擴展信息ID
Fluuid: string; // 關(guān)聯(lián)用戶(hù)ID
UserKey: string; // 擴展鍵名 (如: 'avator', 'slogan')
UserValues: string; // 擴展值
}
import {
loginWithPassword,
getUserInfo,
showUserInfos,
showUserMenus
} from '@/api/PulsAuth';
import { useUserStore } from '@/store/modules/user';
// 用戶(hù)登錄流程
const handleLogin = async (loginForm: LoginParams) => {
try {
// 1. 用戶(hù)登錄
const loginRes = await loginWithPassword(loginForm);
if (loginRes.Result === 1) {
const userStore = useUserStore();
userStore.token = JSON.stringify(loginRes.DataValue);
// 2. 獲取用戶(hù)認證信息
const authRes = await getUserInfo();
if (authRes.Result === 1) {
userStore.setAuthInfo(authRes.DataValue);
}
// 3. 獲取用戶(hù)詳細信息
const userRes = await showUserInfos();
if (userRes.Result === 1) {
userStore.setUserDetails(userRes.DataValue);
}
// 4. 獲取用戶(hù)菜單權限
const menuRes = await showUserMenus();
if (menuRes.Result === 1) {
// 處理菜單數據,更新路由
console.log('用戶(hù)菜單:', menuRes.DataValue);
}
console.log('登錄成功');
}
} catch (error) {
console.error('登錄失敗:', error);
}
};
// Token刷新
const refreshToken = async () => {
try {
const res = await refreshUserToken();
if (res.Result === 1) {
const userStore = useUserStore();
userStore.setAuthInfo(res.DataValue);
return true;
}
} catch (error) {
console.error('Token刷新失敗:', error);
return false;
}
};
// Token驗證
const checkTokenValid = async () => {
try {
const res = await validateToken();
return res.Result === 1 && res.DataValue.valid;
} catch (error) {
return false;
}
};
// 獲取用戶(hù)權限
const checkUserPermissions = async () => {
try {
const res = await getUserPermissions();
if (res.Result === 1) {
const permissions = res.DataValue;
console.log('用戶(hù)權限:', permissions);
return permissions;
}
} catch (error) {
console.error('獲取權限失敗:', error);
return [];
}
};
// 切換企業(yè)
const handleSwitchCompany = async (companyId: string) => {
try {
const res = await switchCompany(companyId);
if (res.Result === 1) {
const userStore = useUserStore();
userStore.setUserDetails(res.DataValue);
console.log('企業(yè)切換成功');
}
} catch (error) {
console.error('企業(yè)切換失敗:', error);
}
};
所有認證相關(guān)接口都配置了以下選項:
withToken: true
- 自動(dòng)攜帶認證TokenisTransformResponse: false
- 保持原始響應格式// 統一錯誤處理
const handleApiError = (error: any) => {
if (error.response?.status === 401) {
// Token過(guò)期,跳轉登錄
router.push('/login');
} else if (error.response?.status === 403) {
// 權限不足
console.error('權限不足');
} else {
console.error('API調用失敗:', error.message);
}
};
所有接口統一使用以下響應格式:
interface AuthApiResponse<T = any> {
Result: number; // 結果狀態(tài) 1:成功 0:失敗
DataValue: T; // 響應數據
MessageCode: string; // 消息代碼
Message: string; // 消息描述
ContentEncoding?: string; // 內容編碼
ContentType?: string; // 內容類(lèi)型
JsonRequestBehavior?: number;
MaxJsonLength?: number;
RecursionLimit?: number;
}