You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

68 lines
2.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import {
ERROR404_PATH,
isPathExists,
LOGIN_PATH,
removeQueryString,
routes,
} from "@/router";
import { useAuthStore } from "@/store/modules/auth";
// 白名单路由
const whiteList = ["/"];
routes.forEach((item) => {
if (item.needLogin !== true) {
whiteList.push(item.path);
}
});
// 调试:打印白名单
console.log("权限白名单:", whiteList);
/**
* 权限校验
* @param {String} path
* @returns
*/
export function hasPerm(path = "") {
console.log("hasPerm检查路径:", path);
if (!isPathExists(path) && path !== '/') {
uni.redirectTo({
url: ERROR404_PATH,
});
return false;
}
const authStore = useAuthStore();
const cleanPath = removeQueryString(path);
// 在白名单中或有token直接放行
const inWhiteList = whiteList.includes(cleanPath);
const hasPermission = inWhiteList || authStore.isLoggedIn;
console.log("路径:", cleanPath, "在白名单:", inWhiteList, "已登录:", authStore.isLoggedIn, "有权限:", hasPermission);
if (!hasPermission) {
// 将用户的目标路径传递过去,这样可以实现用户登录之后,直接跳转到目标页面
console.log("无权限,跳转登录页");
uni.redirectTo({
url: `${LOGIN_PATH}?redirect=${encodeURIComponent(path)}`,
});
}
return hasPermission;
}
export function setupPermission() {
// 注意拦截uni.switchTab本身没有问题。但是在微信小程序端点击tabbar的底层逻辑并不是触发uni.switchTab。
// 所以误认为拦截无效此类场景的解决方案是在tabbar页面的页面生命周期onShow中处理。
["navigateTo", "redirectTo", "reLaunch", "switchTab"].forEach((item) => {
// https://uniapp.dcloud.net.cn/api/interceptor.html
uni.addInterceptor(item, {
// 页面跳转前进行拦截, invoke根据返回值进行判断是否继续执行跳转
invoke(args) {
// args为所拦截api中的参数比如拦截的是uni.redirectTo(OBJECT)则args对应的是OBJECT参数
return hasPerm(args.url);
},
});
});
}