|
|
@@ -289,6 +289,13 @@ const routes = [
|
|
|
name: 'DanShopOrder',
|
|
|
component: () => import('@/views/admin/OrderManage.vue'),
|
|
|
meta: { title: 'DanShop订单' }
|
|
|
+ },
|
|
|
+ // ========== 活动管理(活动管理员) ==========
|
|
|
+ {
|
|
|
+ path: 'activities',
|
|
|
+ name: 'Activities',
|
|
|
+ component: () => import('@/views/admin/Activities.vue'),
|
|
|
+ meta: { title: '活动管理' }
|
|
|
}
|
|
|
]
|
|
|
}
|
|
|
@@ -352,42 +359,47 @@ router.beforeEach(async (to, from, next) => {
|
|
|
return next('/login')
|
|
|
}
|
|
|
|
|
|
- // 4. 登录后首页重定向:规划师跳转到工作台(使用 replace 避免历史栈膨胀)
|
|
|
- if (to.path === '/dashboard' && role === 'teacher') {
|
|
|
- return next({ path: '/teacher-dashboard', replace: true })
|
|
|
+ // 4. 登录后首页重定向
|
|
|
+ const roleHomeMap = {
|
|
|
+ 'teacher': '/teacher-dashboard',
|
|
|
+ 'nutritionist': '/dashboard',
|
|
|
+ 'activity_admin': '/dashboard',
|
|
|
+ 'article_admin': '/dashboard'
|
|
|
+ }
|
|
|
+ if (to.path === '/dashboard' && roleHomeMap[role]) {
|
|
|
+ return next({ path: roleHomeMap[role], replace: true })
|
|
|
}
|
|
|
|
|
|
- // 5. 规划师专属路由检查
|
|
|
- const teacherRoutes = [
|
|
|
- 'TeacherDashboard', 'TeacherFamilies', 'TeacherTeam',
|
|
|
- 'TeacherPackages', 'TeacherOrders', 'TeacherMessages',
|
|
|
- 'TeacherAssessment', 'GuidePackages', 'GuideFamilyTask',
|
|
|
- 'TeacherConsult'
|
|
|
- ]
|
|
|
- if (teacherRoutes.includes(to.name)) {
|
|
|
- if (!role || role !== 'teacher') {
|
|
|
- console.warn('Access denied: Teacher role required for', to.name)
|
|
|
- return next({ path: '/dashboard', query: { accessDenied: 'teacher-only' }, replace: true })
|
|
|
- }
|
|
|
+ // 5. 角色专属路由定义
|
|
|
+ const roleRoutes = {
|
|
|
+ teacher: [
|
|
|
+ 'TeacherDashboard', 'TeacherFamilies', 'TeacherTeam',
|
|
|
+ 'TeacherPackages', 'TeacherOrders', 'TeacherMessages',
|
|
|
+ 'TeacherAssessment', 'GuidePackages', 'GuideFamilyTask',
|
|
|
+ 'TeacherConsult'
|
|
|
+ ],
|
|
|
+ nutritionist: [
|
|
|
+ 'Dashboard', 'Tasks', 'TaskTemplates'
|
|
|
+ ],
|
|
|
+ activity_admin: [
|
|
|
+ 'Dashboard', 'Activities'
|
|
|
+ ],
|
|
|
+ article_admin: [
|
|
|
+ 'Dashboard', 'ArticleCategory', 'ArticleManage', 'ArticleEdit'
|
|
|
+ ]
|
|
|
+ }
|
|
|
+
|
|
|
+ // 管理员可访问所有路由(无视角色限制)
|
|
|
+ if (role === 'admin') {
|
|
|
+ return next()
|
|
|
}
|
|
|
|
|
|
- // 6. 管理员专属路由检查(规划师不可访问)
|
|
|
- const adminRoutes = [
|
|
|
- 'Families', 'Children', 'Points',
|
|
|
- 'Tasks', 'TaskTemplates', 'Rewards',
|
|
|
- 'Users', 'PackageAudit', 'GuideAudit', 'OperationLogs',
|
|
|
- 'ServiceTypes', 'ServiceContents', 'PackageTemplates',
|
|
|
- 'AssessmentAdmin', 'VendorReview',
|
|
|
- 'ProductManage', 'OrderManage', 'SysConfig', 'EnergySandbox',
|
|
|
- 'ArticleCategory', 'ArticleManage', 'ArticleEdit',
|
|
|
- 'EducationSystems',
|
|
|
- 'ZodiacConfigs', 'BaziConfigs', 'BloodTypeConfigs',
|
|
|
- 'DanShopCategory', 'DanShopProfitRule', 'DanShopLogistics',
|
|
|
- 'DanShopProduct', 'DanShopOrder'
|
|
|
- ]
|
|
|
- if (adminRoutes.includes(to.name) && role === 'teacher') {
|
|
|
- console.warn('Access denied: Admin role required for', to.name)
|
|
|
- return next({ path: '/teacher-dashboard', query: { accessDenied: 'admin-only' }, replace: true })
|
|
|
+ // 检查当前路由是否在当前角色的允许列表中
|
|
|
+ const allowedRoutes = roleRoutes[role] || []
|
|
|
+ if (to.name && !allowedRoutes.includes(to.name)) {
|
|
|
+ const fallbackPath = roleHomeMap[role] || '/dashboard'
|
|
|
+ console.warn(`Access denied: Role "${role}" cannot access route "${to.name}"`)
|
|
|
+ return next({ path: fallbackPath, query: { accessDenied: 'role-restricted' }, replace: true })
|
|
|
}
|
|
|
|
|
|
return next()
|