wip: 临时提交

This commit is contained in:
Ray.Hao
2025-05-28 23:39:26 +08:00
parent b2333e8b70
commit 9fba279490
37 changed files with 536 additions and 3128 deletions

View File

@@ -1,7 +1,24 @@
import { useUserStore } from "@/store/modules/user";
import { useUserStore } from "@/store/modules/user.store";
import { Storage } from "./storage";
import { ACCESS_TOKEN_KEY, REFRESH_TOKEN_KEY } from "@/constants";
/**
* 认证工具函数
*
* 使用示例:
*
* 1. 检查登录状态并自动跳转:
* if (!checkLogin()) return; // 未登录会自动跳转到登录页
*
* 2. 静默检查登录状态:
* if (!isLoggedIn()) {
* // 处理未登录逻辑,不会自动跳转
* }
*
* 3. 强制要求登录:
* requireLogin(); // 清除无效状态并跳转到登录页
*/
/**
* 获取访问令牌
* @returns 返回访问令牌如果不存在则返回null
@@ -44,21 +61,82 @@ export function clearTokens(): void {
/**
* 检查用户登录状态,未登录则跳转到登录页面
* @param silent 是否静默检查,不跳转登录页面
* @returns 返回用户是否已登录
*/
export function checkLogin(): boolean {
export function checkLogin(silent: boolean = false): boolean {
const userStore = useUserStore();
const accessToken = getAccessToken();
if (!userStore.userInfo) {
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
const currentPagePath = `/${currentPage.route}`;
// 检查 token 和用户信息是否都存在
const isLoggedIn = !!(accessToken && userStore.userInfo);
uni.navigateTo({
url: `/pages/login/index?redirect=${encodeURIComponent(currentPagePath)}`,
});
return false;
if (!isLoggedIn && !silent) {
try {
// 获取当前页面路径
let currentPagePath = "/pages/index/index"; // 默认路径
const pages = getCurrentPages();
if (pages && pages.length > 0) {
const currentPage = pages[pages.length - 1];
if (currentPage && currentPage.route) {
currentPagePath = `/${currentPage.route}`;
// 处理页面参数 - 使用类型断言
const pageOptions = (currentPage as any).options;
if (pageOptions && Object.keys(pageOptions).length > 0) {
const params = new URLSearchParams(pageOptions as Record<string, string>);
currentPagePath += `?${params.toString()}`;
}
}
}
// 跳转到登录页面
uni.navigateTo({
url: `/pages/login/index?redirect=${encodeURIComponent(currentPagePath)}`,
fail: (error) => {
console.error("跳转登录页面失败:", error);
// 如果 navigateTo 失败,尝试使用 reLaunch
uni.reLaunch({
url: "/pages/login/index",
});
},
});
} catch (error) {
console.error("检查登录状态时发生错误:", error);
// 发生错误时,尝试直接跳转到登录页
uni.reLaunch({
url: "/pages/login/index",
});
}
}
return true;
return isLoggedIn;
}
/**
* 检查用户是否已登录(静默检查,不跳转)
* @returns 返回用户是否已登录
*/
export function isLoggedIn(): boolean {
return checkLogin(true);
}
/**
* 强制用户登录,清除无效的登录状态
*/
export function requireLogin(): void {
const userStore = useUserStore();
const accessToken = getAccessToken();
if (!accessToken || !userStore.userInfo) {
// 清除可能存在的无效状态
clearTokens();
userStore.logout();
// 跳转到登录页
uni.reLaunch({
url: "/pages/login/index",
});
}
}

View File

@@ -1,5 +1,5 @@
import { getAccessToken, clearTokens } from "@/utils/auth";
import { ResultCodeEnum } from "@/enums/ResultCodeEnum";
import { ApiCode } from "@/enums/api-code.enum";
export default function request<T>(options: UniApp.RequestOptions): Promise<T> {
// H5 使用 VITE_APP_BASE_API 作为代理路径,其他平台使用 VITE_APP_API_URL 作为请求路径
@@ -21,11 +21,11 @@ export default function request<T>(options: UniApp.RequestOptions): Promise<T> {
const resData = response.data as ResponseData<T>;
// 业务状态码 00000 表示成功
if (resData.code === ResultCodeEnum.SUCCESS) {
if (resData.code === ApiCode.SUCCESS) {
resolve(resData.data);
}
// 令牌失效或过期处理
else if (resData.code === ResultCodeEnum.TOKEN_INVALID) {
else if (resData.code === ApiCode.TOKEN_INVALID) {
console.log("令牌失效或过期处理");
clearTokens();
// 跳转到登录页