/** * 登录检查工具 — 统一拦截未登录用户的功能操作 * * 使用方式: * import { requireLogin } from '@/common/checkLogin.js' * if (!requireLogin()) return * * 页面级调用即可,全局 navigateTo 拦截器(App.vue onLaunch 中注册)作为兜底。 */ /** 无需登录即可访问的页面路径白名单(全局拦截器使用) */ export const PUBLIC_PATHS = [ '/pageSubPack/loginSub/login', '/pageSubPack/loginSub/register-new-user', '/pageSubPack/loginSub/forget-pwd', '/pageSubPack/loginSub/change-pwd', '/pageSubPack/loginSub/privacy', '/pages/navigation/navigation' ] /** * 判断指定路径是否为公开页面(无需登录) * @param {string} url - navigateTo 的目标 url * @returns {boolean} */ export function isPublicPath(url) { if (!url) return true // 去掉查询参数 const path = url.split('?')[0] return PUBLIC_PATHS.some(p => path === p || path.startsWith(p + '?')) } /** * 检查是否已登录;未登录则弹出提示并跳转登录页 * @param {object} [options] * @param {string} [options.message='请先登录'] - 提示文案 * @param {boolean} [options.redirect=true] - 是否自动跳转登录页 * @returns {boolean} 已登录返回 true,否则返回 false */ export function requireLogin(options = {}) { const { message = '请先登录', redirect = true } = options const token = uni.getStorageSync('token') if (token) return true uni.showToast({ title: message, icon: 'none' }) if (redirect) { setTimeout(() => { uni.navigateTo({ url: '/pageSubPack/loginSub/login?mode=pwd' }) }, 1000) } return false }