feat: 产品菜单路由权限

This commit is contained in:
rd
2025-07-08 16:55:04 +08:00
parent ead209da4d
commit f87e5ff020
26 changed files with 263 additions and 102 deletions

View File

@ -5,6 +5,8 @@
import type { Router } from 'vue-router';
import NProgress from 'nprogress';
import { goUserLogin } from '@/utils/user';
// import router from '@/router';
import { checkRoutePermission } from '@/permission/permission';
import { useUserStore } from '@/stores/modules/user';
@ -13,15 +15,25 @@ export default function setupUserLoginInfoGuard(router: Router) {
NProgress.start();
const userStore = useUserStore();
const routeName = to?.name as string;
const requiresAuth = to?.meta?.requiresAuth || false;
const isLogin = !!userStore.isLogin;
const requireLogin = to?.meta?.requireLogin || false;
if (requiresAuth && !isLogin) {
if (requireLogin && !userStore.isLogin) {
goUserLogin();
next();
return;
}
if (requiresAuth) {
const hasPermission = checkRoutePermission(routeName);
if (!hasPermission) {
AMessage.error('您没有权限访问该页面');
next('/');
return;
}
}
next();
});
router.afterEach((to) => {

View File

@ -4,7 +4,7 @@
*/
import { createRouter, createWebHistory } from 'vue-router';
import { appRoutes } from './routes';
import { REDIRECT_MAIN, NOT_FOUND_ROUTE } from './routes/base';
import { NOT_FOUND_ROUTE } from './routes/base';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
import { MENU_GROUP_IDS } from './constants';
@ -21,6 +21,7 @@ export const router = createRouter({
component: () => import('@/views/components/login'),
meta: {
requiresAuth: false,
requireLogin: false,
},
},
{
@ -29,7 +30,8 @@ export const router = createRouter({
component: () => import('@/views/components/workplace'),
meta: {
hideSidebar: true,
requiresAuth: true,
requiresAuth: false,
requireLogin: true,
id: MENU_GROUP_IDS.WORK_BENCH_ID,
},
},
@ -37,20 +39,22 @@ export const router = createRouter({
path: '/permission',
name: 'permission',
component: () => import('@/views/components/permission/choose-enterprise.vue'),
meta: {
requiresAuth: true,
},
},
{
path: '/auth',
name: 'auth',
component: () => import('@/views/components/permission/auth.vue'),
meta: {
requiresAuth: false,
requireLogin: true,
},
},
// {
// path: '/auth',
// name: 'auth',
// component: () => import('@/views/components/permission/auth.vue'),
// meta: {
// requiresAuth: false,
// requireLogin: true,
// },
// },
...appRoutes,
REDIRECT_MAIN,
// REDIRECT_MAIN,
NOT_FOUND_ROUTE,
],
scrollBehavior() {

View File

@ -1,28 +1,35 @@
import type { RouteRecordRaw } from 'vue-router';
import { REDIRECT_ROUTE_NAME } from '@/router/constants';
export const REDIRECT_MAIN: RouteRecordRaw = {
path: '/redirect',
name: 'redirect',
meta: {
requiresAuth: true,
hideInMenu: true,
},
children: [
{
path: '/redirect/:path',
name: REDIRECT_ROUTE_NAME,
component: () => import('@/layouts/Basic.vue'),
meta: {
requiresAuth: true,
hideInMenu: true,
},
},
],
};
// export const REDIRECT_MAIN: RouteRecordRaw = {
// path: '/redirect',
// name: 'redirect',
// meta: {
// requiresAuth: false,
// requireLogin: false,
// hideInMenu: true,
// },
// children: [
// {
// path: '/redirect/:path',
// name: REDIRECT_ROUTE_NAME,
// component: () => import('@/layouts/Basic.vue'),
// meta: {
// requiresAuth: false,
// requireLogin: false,
// hideInMenu: true,
// },
// },
// ],
// };
export const NOT_FOUND_ROUTE: RouteRecordRaw = {
path: '/:pathMatch(.*)*',
name: 'notFound',
component: () => import('@/layouts/NotFound.vue'),
meta: {
requiresAuth: false,
hideInMenu: true,
hideSidebar: true,
},
};

View File

@ -1,5 +1,5 @@
import type { RouteRecordNormalized } from 'vue-router';
import { REDIRECT_MAIN, NOT_FOUND_ROUTE } from './base';
// import { REDIRECT_MAIN, NOT_FOUND_ROUTE } from './base';
import { MENU_GROUP_IDS } from '@/router/constants';
const modules = import.meta.glob('./modules/*.ts', { eager: true });
@ -17,6 +17,6 @@ function formatModules(_modules: any, result: RouteRecordNormalized[]) {
return result;
}
export const appRoutes: any[] = formatModules(modules, []);
export const appRoutes: RouteRecordNormalized[] = formatModules(modules, []);
// export const appExternalRoutes: RouteRecordNormalized[] = formatModules(externalModules, []);

View File

@ -15,8 +15,8 @@ const COMPONENTS: AppRouteRecordRaw[] = [
locale: '全域数据引擎',
icon: IconBookmark,
requiresAuth: true,
requireLogin: true,
roles: ['*'],
requiresSidebar: true,
id: MENU_GROUP_IDS.DATA_ENGINE_ID,
},
children: [
@ -26,6 +26,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '行业热门话题洞察',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/components/dataEngine/hotTranslation.vue'),
@ -36,6 +37,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '行业词云',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/components/dataEngine/hotCloud.vue'),
@ -46,6 +48,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '行业关键词动向',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/components/dataEngine/keyWord.vue'),
@ -56,6 +59,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '用户痛点观察',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/components/dataEngine/userPainPoints.vue'),
@ -66,6 +70,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '重点品牌动向',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/components/dataEngine/keyBrandMovement.vue'),
@ -76,6 +81,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '用户画像',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/components/dataEngine/userPersona.vue'),

View File

@ -15,8 +15,8 @@ const COMPONENTS: AppRouteRecordRaw[] = [
locale: '管理中心',
icon: IconBookmark,
requiresAuth: true,
requireLogin: true,
roles: ['*'],
requiresSidebar: true,
id: MENU_GROUP_IDS.MANAGEMENT_ID,
},
children: [
@ -27,6 +27,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '个人信息',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
},
@ -37,6 +38,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '企业信息',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
},
@ -47,6 +49,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '账号管理',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
},

View File

@ -19,8 +19,8 @@ const COMPONENTS: AppRouteRecordRaw[] = [
locale: '品牌资产管理',
icon: IconRepository,
requiresAuth: true,
requireLogin: true,
roles: ['*'],
requiresSidebar: true,
id: MENU_GROUP_IDS.PROPERTY_ID,
},
children: [
@ -30,6 +30,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '品牌信息',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/property-marketing/brands/brand-materials/index.vue'),
@ -44,8 +45,8 @@ const COMPONENTS: AppRouteRecordRaw[] = [
locale: '账号资源中心',
icon: IconMediaAccount,
requiresAuth: true,
requireLogin: true,
roles: ['*'],
requiresSidebar: true,
id: MENU_GROUP_IDS.PROPERTY_ID,
},
children: [
@ -55,6 +56,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '账号管理',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/property-marketing/media-account/account-manage'),
@ -65,6 +67,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '账号数据看板',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/property-marketing/media-account/account-dashboard'),
@ -75,6 +78,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '账号详情',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
hideInMenu: true,
activeMenu: 'MediaAccountAccountDashboard',
@ -91,8 +95,8 @@ const COMPONENTS: AppRouteRecordRaw[] = [
locale: '投放资源中心',
icon: IconPutAccount,
requiresAuth: true,
requireLogin: true,
roles: ['*'],
requiresSidebar: true,
id: MENU_GROUP_IDS.PROPERTY_ID,
},
children: [
@ -102,6 +106,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '账户管理',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/property-marketing/put-account/account-manage'),
@ -112,6 +117,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '账户数据',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/property-marketing/put-account/account-data'),
@ -122,6 +128,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '投放表现分析',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/property-marketing/put-account/account-dashboard'),
@ -132,6 +139,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '平台投放指南',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/property-marketing/put-account/investment-guidelines'),
@ -146,8 +154,8 @@ const COMPONENTS: AppRouteRecordRaw[] = [
locale: '智能方案管理',
icon: IconIntelligentSolution,
requiresAuth: true,
requireLogin: true,
roles: ['*'],
requiresSidebar: true,
id: MENU_GROUP_IDS.PROPERTY_ID,
},
children: [
@ -157,6 +165,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '业务洞察报告',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/property-marketing/intelligent-solution/businessAnalysisReport'),
@ -167,6 +176,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
meta: {
locale: '竟品对比报告',
requiresAuth: true,
requireLogin: true,
roles: ['*'],
},
component: () => import('@/views/property-marketing/intelligent-solution/competitiveProductAnalysisReport'),

View File

@ -14,5 +14,6 @@ declare module 'vue-router' {
noAffix?: boolean; // if set true, the tag will not affix in the tab-bar
ignoreCache?: boolean; // if set true, the page will not be cached
hideSidebar?: boolean;
requireLogin?: boolean; // 是否需要登陆才能访问
}
}