yfs/common/router.js
2025-04-24 12:27:14 +08:00

255 lines
6.6 KiB
JavaScript
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.

/**
* 通用路由守卫
*/
import { whiteList } from '@/common/config.js'
/**
* 判断用户是否已登录
* @returns {Boolean} true表示已登录false表示未登录
*/
function isLogin() {
// 从本地存储获取用户token或其他登录凭证
const token = uni.getStorageSync('token');
return !!token;
}
/**
* 判断URL是否在白名单中
* @param {String} url 需要检查的URL
* @returns {Boolean} 是否在白名单中
*/
function isInWhiteList(url) {
if (!url) return false;
// 去除URL开头的斜杠以便与白名单匹配
const cleanUrl = url.startsWith('/') ? url.substring(1) : url;
// 提取路径部分(不含参数)
const pathPart = cleanUrl.split('?')[0];
// 检查是否在白名单中
return whiteList.some(item => {
// 确保白名单项目不带/开头,以实现一致的比较
const cleanItem = item.startsWith('/') ? item.substring(1) : item;
return pathPart === cleanItem || pathPart.startsWith(cleanItem + '/') || pathPart.startsWith(cleanItem + '?');
});
}
/**
* 返回上一页,如果上一页是登录页则跳过它
* @returns {Promise} 返回操作结果的Promise
*/
export function navigateBack(delta = 1) {
return new Promise((resolve, reject) => {
const pages = getCurrentPages();
// 如果页面栈不足,直接返回首页
if (pages.length <= 1) {
return navigateTo('/pages/shouye/index', {}, 'reLaunch')
.then(resolve)
.catch(reject);
}
// 查看前一个页面是否是登录页
if (pages.length > 1 && pages[pages.length - 2].route === 'pages/user/login') {
// 如果前一个页面是登录页,则返回两步
uni.navigateBack({
delta: 2,
success: resolve,
fail: reject
});
} else {
// 正常返回
uni.navigateBack({
delta,
success: resolve,
fail: reject
});
}
});
}
/**
* 通用路由跳转方法
* @param {Object} options 跳转配置
* @param {String} options.url 跳转地址
* @param {Object} options.params 请求参数,可选
* @param {String} options.type 跳转方式可选navigateTo(默认)、switchTab、redirectTo、reLaunch
* @returns {Promise} 返回一个Promise对象
*/
export function routerTo(options) {
return new Promise((resolve, reject) => {
// 处理参数
let { url, params, type } = options;
// 判断url是否存在
if (!url || url.length === 0) {
reject('跳转地址不能为空');
return;
}
// 拼接参数
if (params && Object.keys(params).length > 0) {
const queryString = Object.keys(params)
.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
.join('&');
url += (url.indexOf('?') === -1 ? '?' : '&') + queryString;
}
// 检查是否需要登录
const needLogin = !isInWhiteList(url);
if (needLogin && !isLogin()) {
// 需要登录但未登录,跳转到登录页面
// 先保存当前URL用于登录后重定向
uni.setStorageSync('redirect', url);
// 使用navigateTo而非redirectTo保留页面栈
uni.navigateTo({
url: '/pages/user/login',
success: () => {
console.log('跳转到登录页面成功,保存的重定向地址:', url);
},
fail: (err) => {
console.error('跳转到登录页面失败:', err);
reject(err);
}
});
// 拒绝当前的导航请求
return reject(new Error('需要登录'));
}
// 根据type选择跳转方式
if (type) {
// 指定了跳转方式,直接使用
switch (type) {
case 'switchTab':
uni.switchTab({
url,
success: resolve,
fail: reject
});
break;
case 'redirectTo':
uni.redirectTo({
url,
success: resolve,
fail: reject
});
break;
case 'reLaunch':
uni.reLaunch({
url,
success: resolve,
fail: reject
});
break;
case 'navigateTo':
default:
uni.navigateTo({
url,
success: resolve,
fail: reject
});
break;
}
} else {
// console.log('url',url,params,type,isInWhiteList(url),isLogin());
// 未指定跳转方式先尝试navigateTo失败后尝试switchTab
uni.navigateTo({
url,
success: resolve,
fail: (err) => {
// navigateTo失败尝试switchTab
uni.switchTab({
url,
success: resolve,
fail: (switchErr) => {
// 两种方式都失败,返回错误
reject(switchErr);
}
});
}
});
}
});
}
/**
* 简化版路由跳转方法
* @param {String} url 跳转地址
* @param {Object} params 请求参数,可选
* @param {String} type 跳转方式,可选
* @returns {Promise} 返回Promise对象
*/
export function navigateTo(url, params = {}, type = '') {
return routerTo({
url,
params,
type
});
}
/**
* 收集白名单路径
* @param {String} path 需要添加到白名单的路径
* @returns {Array} 返回更新后的白名单数组
*/
export function collectWhitePath(path) {
// 缓存的键名
const WHITELIST_CACHE_KEY = 'APP_WHITELIST_PATHS';
// 从缓存中获取现有白名单
let cachedWhitelist = uni.getStorageSync(WHITELIST_CACHE_KEY) || [];
// 如果不是数组,则初始化为空数组
if (!Array.isArray(cachedWhitelist)) {
cachedWhitelist = [];
}
// 检查路径是否已存在于白名单中
if (path && path.trim() && !cachedWhitelist.includes(path)) {
// 添加新路径到白名单
cachedWhitelist.push(path);
// 保存更新后的白名单到缓存
uni.setStorageSync(WHITELIST_CACHE_KEY, cachedWhitelist);
console.log('添加白名单路径成功:', path);
}
return cachedWhitelist;
}
/**
* 获取已收集的白名单路径
* @returns {Array} 返回缓存中的白名单数组
*/
export function getCollectedWhitePaths() {
const WHITELIST_CACHE_KEY = 'APP_WHITELIST_PATHS';
return uni.getStorageSync(WHITELIST_CACHE_KEY) || [];
}
/**
* 清空已收集的白名单路径
* @returns {Boolean} 返回操作结果
*/
export function clearCollectedWhitePaths() {
const WHITELIST_CACHE_KEY = 'APP_WHITELIST_PATHS';
uni.setStorageSync(WHITELIST_CACHE_KEY, []);
return true;
}
// 更新默认导出
export default {
routerTo,
navigateTo,
navigateBack,
collectWhitePath,
getCollectedWhitePaths,
clearCollectedWhitePaths
};