|
|
@@ -1,5 +1,7 @@
|
|
|
<script setup lang="ts">
|
|
|
import { onLaunch, onShow, onHide } from "@dcloudio/uni-app";
|
|
|
+import { API_CONFIG } from './utils/config';
|
|
|
+import { handleUnauthorized, clearAuth } from './utils/auth';
|
|
|
|
|
|
/**
|
|
|
* 应用启动
|
|
|
@@ -39,11 +41,62 @@ const LOGIN_WHITE_LIST = [
|
|
|
'pages/products/products',
|
|
|
];
|
|
|
|
|
|
+/**
|
|
|
+ * 验证token是否有效
|
|
|
+ * 调用后端用户信息接口校验token,返回true/false
|
|
|
+ */
|
|
|
+const verifyToken = (): Promise<boolean> => {
|
|
|
+ return new Promise((resolve) => {
|
|
|
+ const token = uni.getStorageSync('accessToken');
|
|
|
+ if (!token) {
|
|
|
+ resolve(false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const url = `${API_CONFIG.baseUrl}/login/user-info`;
|
|
|
+ uni.request({
|
|
|
+ url,
|
|
|
+ method: 'POST',
|
|
|
+ header: {
|
|
|
+ 'Content-Type': 'application/json',
|
|
|
+ 'accessToken': token
|
|
|
+ },
|
|
|
+ timeout: 10000,
|
|
|
+ success: (res: any) => {
|
|
|
+ if (res.statusCode === 200) {
|
|
|
+ const data = res.data;
|
|
|
+ if (data && (data.code === 200 || data.code === 0)) {
|
|
|
+ // token有效
|
|
|
+ resolve(true);
|
|
|
+ } else if (data && data.code === 401) {
|
|
|
+ // token无效或已过期
|
|
|
+ console.log('[App] token无效:', data.message);
|
|
|
+ resolve(false);
|
|
|
+ } else {
|
|
|
+ // 其他业务错误,保守起见仍视为token有效
|
|
|
+ console.warn('[App] 验证token返回异常状态:', data?.code, data?.message);
|
|
|
+ resolve(true);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 网络或服务异常,不阻断用户使用,保守视为token有效
|
|
|
+ console.warn('[App] 验证token网络异常, statusCode:', res.statusCode);
|
|
|
+ resolve(true);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ fail: (err: any) => {
|
|
|
+ // 网络请求失败,保守视为token有效,不阻断用户使用
|
|
|
+ console.warn('[App] 验证token请求失败:', err.errMsg);
|
|
|
+ resolve(true);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
/**
|
|
|
* 检查登录状态
|
|
|
- * 如果未登录且当前不在白名单页面,则跳转到登录页
|
|
|
+ * 如果未登录或token无效且当前不在白名单页面,则跳转到登录页
|
|
|
*/
|
|
|
-const checkLoginStatus = (launchOptions?: any) => {
|
|
|
+const checkLoginStatus = async (launchOptions?: any) => {
|
|
|
const token = uni.getStorageSync('accessToken');
|
|
|
|
|
|
// 优先从启动参数获取目标页面路径(onLaunch时getCurrentPages为空)
|
|
|
@@ -56,13 +109,31 @@ const checkLoginStatus = (launchOptions?: any) => {
|
|
|
|
|
|
console.log('[App] 检查登录状态 - token:', token ? '已存在' : '不存在', ', 目标页面:', currentPath);
|
|
|
|
|
|
- // 如果没有token且不在白名单页面,跳转到登录页
|
|
|
const isWhiteListed = LOGIN_WHITE_LIST.some(path => currentPath.indexOf(path) !== -1);
|
|
|
- if (!token && !isWhiteListed) {
|
|
|
- console.log('[App] 未登录,跳转到登录页');
|
|
|
- uni.reLaunch({
|
|
|
- url: '/pages/login/login'
|
|
|
- });
|
|
|
+
|
|
|
+ // 没有token
|
|
|
+ if (!token) {
|
|
|
+ if (!isWhiteListed) {
|
|
|
+ console.log('[App] 未登录,跳转到登录页');
|
|
|
+ uni.reLaunch({ url: '/pages/login/login' });
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 有token,向后端验证是否有效
|
|
|
+ console.log('[App] token存在,验证token有效性...');
|
|
|
+ const isValid = await verifyToken();
|
|
|
+
|
|
|
+ if (!isValid && !isWhiteListed) {
|
|
|
+ // token无效且不在白名单 -> 触发全局未授权处理
|
|
|
+ console.log('[App] token无效,触发全局未授权处理');
|
|
|
+ handleUnauthorized();
|
|
|
+ } else if (!isValid && isWhiteListed) {
|
|
|
+ // 白名单页面只清除数据不跳转(不触发全局未授权处理的重定向)
|
|
|
+ console.log('[App] token无效,清除登录数据(当前在白名单页面)');
|
|
|
+ clearAuth();
|
|
|
+ } else {
|
|
|
+ console.log('[App] token有效');
|
|
|
}
|
|
|
};
|
|
|
</script>
|