|
|
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);
|
|
|
},
|
|
|
});
|
|
|
});
|
|
|
}
|