Files
leaudit-platform-frontend/app/api/login/login-client.ts
T
LiangShiyong 2edde8a8ab feat: 1. 完善全局路由的访问权限的验证。 2. 完善接口返回的树形路由结构 3.优化评查点列表的查询,改用表连接的方式,废弃使用数据库的rpc函数,同时进行地区隔离和权限隔离。
4. 删除冗余的评查文件列表。      5.完善上传文档 页面初始化查询数据的时候 查询文件类型(改成动态指定)  6. 添加获取入口模块的查询接口。    7.完善服务端中判断token的有效性,失效则跳转到登录页。
8. 重构layout和sidebar的页面,改成由动态权限路由来渲染对应的菜单栏。       9.重构入口页面,通过动态查询根据不同地区的人返回不同的入口。
2025-11-20 01:35:30 +08:00

157 lines
3.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 登录客户端
* 调用后端 /auth/login 接口,传递 OAuth 用户信息,获取 JWT token
*/
import { API_BASE_URL } from "~/config/api-config";
/**
* 登录请求参数(OAuth 方式)
*/
export interface LoginRequest {
userInfo: {
sub: string;
username?: string;
nickname?: string;
email?: string;
phone_number?: string;
ou_id?: string;
ou_name?: string;
is_leader?: boolean;
[key: string]: unknown;
};
expiresIn: number;
area?: string;
}
/**
* 登录响应
*/
export interface LoginResponse {
success: boolean;
data?: {
access_token: string;
token_type: string;
expires_in: number;
issued_time: string; // 🔑 后端返回的签发时间,格式:"2025-11-18 17:41:06"
user_info: {
user_id?: string;
username: string;
nick_name: string;
email?: string;
phone_number?: string;
ou_id: string;
ou_name: string;
is_leader: boolean;
user_role: string;
sub: string;
area?: string; // 🔑 用户所属地区
};
};
error?: string;
message?: string;
}
/**
* 调用后端登录接口(OAuth 方式)
*
* @param loginData 登录数据(OAuth 用户信息)
* @returns 登录响应(包含 JWT token
*/
export async function loginWithOAuth(loginData: LoginRequest): Promise<LoginResponse> {
const loginUrl = `${API_BASE_URL}/auth/login`;
console.log("📝 [Login Client] 调用后端 OAuth 登录接口:", loginUrl);
try {
const response = await fetch(loginUrl, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify(loginData)
});
if (!response.ok) {
const errorData = await response.json().catch(() => ({}));
console.error("❌ [Login Client] OAuth 登录请求失败:", response.status, errorData);
return {
success: false,
error: errorData.error || errorData.message || `登录失败: ${response.status}`
};
}
const data = await response.json();
console.log("✅ [Login Client] OAuth 登录成功");
return data;
} catch (error) {
console.error("❌ [Login Client] OAuth 登录请求异常:", error);
return {
success: false,
error: error instanceof Error ? error.message : "网络请求失败"
};
}
}
/**
* 密码登录请求参数
*/
export interface PasswordLoginRequest {
username: string;
password: string;
}
/**
* 调用后端登录接口(密码方式)
*
* @param username 用户名
* @param password 密码
* @returns 登录响应(包含 JWT token
*/
export async function loginWithPassword(
username: string,
password: string
): Promise<LoginResponse> {
const loginUrl = `${API_BASE_URL}/auth/login`;
console.log("📝 [Login Client] 调用后端密码登录接口:", loginUrl);
try {
const response = await fetch(loginUrl, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({
username,
password
})
});
if (!response.ok) {
const errorData = await response.json().catch(() => ({}));
console.error("❌ [Login Client] 密码登录请求失败:", response.status, errorData);
return {
success: false,
error: errorData.error || errorData.message || `登录失败: ${response.status}`
};
}
const data = await response.json();
console.log("✅ [Login Client] 密码登录成功");
return data;
} catch (error) {
console.error("❌ [Login Client] 密码登录请求异常:", error);
return {
success: false,
error: error instanceof Error ? error.message : "网络请求失败"
};
}
}