511 lines
16 KiB
TypeScript
511 lines
16 KiB
TypeScript
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
|
|
import { message } from 'ant-design-vue';
|
|
|
|
const routes: RouteRecordRaw[] = [
|
|
{
|
|
path: '/',
|
|
redirect: '/login',
|
|
},
|
|
{
|
|
path: '/login',
|
|
name: 'Login',
|
|
component: () => import('@/views/auth/LoginView.vue'),
|
|
meta: { requiresAuth: false, title: '登录' },
|
|
},
|
|
{
|
|
path: '/admin',
|
|
component: () => import('@/views/admin/LayoutView.vue'),
|
|
meta: { requiresAuth: true, role: 'admin', title: '超管端' },
|
|
children: [
|
|
{
|
|
path: '',
|
|
redirect: '/admin/dashboard',
|
|
},
|
|
{
|
|
path: 'dashboard',
|
|
name: 'AdminDashboard',
|
|
component: () => import('@/views/admin/DashboardView.vue'),
|
|
meta: { title: '数据看板' },
|
|
},
|
|
{
|
|
path: 'packages',
|
|
name: 'AdminPackages',
|
|
component: () => import('@/views/admin/courses/CourseListView.vue'),
|
|
meta: { title: '课程包管理' },
|
|
},
|
|
{
|
|
path: 'packages/review',
|
|
name: 'AdminPackageReview',
|
|
component: () => import('@/views/admin/courses/CourseReviewView.vue'),
|
|
meta: { title: '审核管理' },
|
|
},
|
|
{
|
|
path: 'packages/:id',
|
|
name: 'AdminPackageDetail',
|
|
component: () => import('@/views/admin/courses/CourseDetailView.vue'),
|
|
meta: { title: '课程包详情' },
|
|
},
|
|
{
|
|
path: 'packages/create',
|
|
name: 'AdminPackageCreate',
|
|
component: () => import('@/views/admin/courses/CourseEditView.vue'),
|
|
meta: { title: '创建课程包' },
|
|
},
|
|
{
|
|
path: 'packages/:id/edit',
|
|
name: 'AdminPackageEdit',
|
|
component: () => import('@/views/admin/courses/CourseEditView.vue'),
|
|
meta: { title: '编辑课程包' },
|
|
},
|
|
{
|
|
path: 'packages/:id/stats',
|
|
name: 'AdminPackageStats',
|
|
component: () => import('@/views/admin/courses/CourseStatsView.vue'),
|
|
meta: { title: '课程数据统计' },
|
|
},
|
|
{
|
|
path: 'tenants',
|
|
name: 'AdminTenants',
|
|
component: () => import('@/views/admin/tenants/TenantListView.vue'),
|
|
meta: { title: '租户管理' },
|
|
},
|
|
{
|
|
path: 'resources',
|
|
name: 'AdminResources',
|
|
component: () => import('@/views/admin/resources/ResourceListView.vue'),
|
|
meta: { title: '资源库管理' },
|
|
},
|
|
// V2 新增路由
|
|
{
|
|
path: 'collections',
|
|
name: 'AdminCollections',
|
|
component: () => import('@/views/admin/collections/CollectionListView.vue'),
|
|
meta: { title: '套餐管理' },
|
|
},
|
|
{
|
|
path: 'collections/create',
|
|
name: 'AdminCollectionCreate',
|
|
component: () => import('@/views/admin/collections/CollectionEditView.vue'),
|
|
meta: { title: '创建套餐' },
|
|
},
|
|
{
|
|
path: 'collections/:id',
|
|
name: 'AdminCollectionDetail',
|
|
component: () => import('@/views/admin/collections/CollectionDetailView.vue'),
|
|
meta: { title: '套餐详情' },
|
|
},
|
|
{
|
|
path: 'collections/:id/edit',
|
|
name: 'AdminCollectionEdit',
|
|
component: () => import('@/views/admin/collections/CollectionEditView.vue'),
|
|
meta: { title: '编辑套餐' },
|
|
},
|
|
{
|
|
path: 'themes',
|
|
name: 'AdminThemes',
|
|
component: () => import('@/views/admin/themes/ThemeListView.vue'),
|
|
meta: { title: '主题字典' },
|
|
},
|
|
{
|
|
path: 'settings',
|
|
name: 'AdminSettings',
|
|
component: () => import('@/views/admin/SettingsView.vue'),
|
|
meta: { title: '系统设置' },
|
|
},
|
|
{
|
|
path: 'profile',
|
|
name: 'AdminProfile',
|
|
component: () => import('@/views/profile/ProfileView.vue'),
|
|
meta: { title: '个人信息' },
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: '/school',
|
|
component: () => import('@/views/school/LayoutView.vue'),
|
|
meta: { requiresAuth: true, role: 'school', title: '学校端' },
|
|
children: [
|
|
{
|
|
path: '',
|
|
redirect: '/school/dashboard',
|
|
},
|
|
{
|
|
path: 'dashboard',
|
|
name: 'SchoolDashboard',
|
|
component: () => import('@/views/school/DashboardView.vue'),
|
|
meta: { title: '数据看板' },
|
|
},
|
|
{
|
|
path: 'teachers',
|
|
name: 'SchoolTeachers',
|
|
component: () => import('@/views/school/teachers/TeacherListView.vue'),
|
|
meta: { title: '教师管理' },
|
|
},
|
|
{
|
|
path: 'students',
|
|
name: 'SchoolStudents',
|
|
component: () => import('@/views/school/students/StudentListView.vue'),
|
|
meta: { title: '学生管理' },
|
|
},
|
|
{
|
|
path: 'parents',
|
|
name: 'SchoolParents',
|
|
component: () => import('@/views/school/parents/ParentListView.vue'),
|
|
meta: { title: '家长管理' },
|
|
},
|
|
{
|
|
path: 'classes',
|
|
name: 'SchoolClasses',
|
|
component: () => import('@/views/school/classes/ClassListView.vue'),
|
|
meta: { title: '班级管理' },
|
|
},
|
|
{
|
|
path: 'courses',
|
|
name: 'SchoolCourses',
|
|
component: () => import('@/views/school/courses-new/CourseCenterView.vue'),
|
|
meta: { title: '课程中心' },
|
|
},
|
|
{
|
|
path: 'courses/:id',
|
|
name: 'SchoolCourseDetail',
|
|
component: () => import('@/views/school/courses/CourseDetailView.vue'),
|
|
meta: { title: '课程详情' },
|
|
},
|
|
{
|
|
path: 'package',
|
|
name: 'SchoolPackage',
|
|
component: () => import('@/views/school/PackageView.vue'),
|
|
meta: { title: '套餐管理' },
|
|
},
|
|
// V2 新增:校本课程包
|
|
{
|
|
path: 'school-courses',
|
|
name: 'SchoolSchoolCourses',
|
|
component: () => import('@/views/school/school-courses/SchoolCourseListView.vue'),
|
|
meta: { title: '校本课程包' },
|
|
},
|
|
{
|
|
path: 'school-courses/create',
|
|
name: 'SchoolSchoolCourseCreate',
|
|
component: () => import('@/views/school/school-courses/SchoolCourseEditView.vue'),
|
|
meta: { title: '创建校本课程包' },
|
|
},
|
|
{
|
|
path: 'school-courses/:id',
|
|
name: 'SchoolSchoolCourseDetail',
|
|
component: () => import('@/views/school/school-courses/SchoolCourseDetailView.vue'),
|
|
meta: { title: '校本课程包详情' },
|
|
},
|
|
{
|
|
path: 'school-courses/:id/edit',
|
|
name: 'SchoolSchoolCourseEdit',
|
|
component: () => import('@/views/school/school-courses/SchoolCourseEditView.vue'),
|
|
meta: { title: '编辑校本课程包' },
|
|
},
|
|
{
|
|
path: 'reports',
|
|
name: 'SchoolReports',
|
|
component: () => import('@/views/school/ReportView.vue'),
|
|
meta: { title: '数据报表' },
|
|
},
|
|
{
|
|
path: 'growth',
|
|
name: 'SchoolGrowth',
|
|
component: () => import('@/views/school/growth/GrowthRecordView.vue'),
|
|
meta: { title: '成长档案' },
|
|
},
|
|
{
|
|
path: 'tasks',
|
|
name: 'SchoolTasks',
|
|
component: () => import('@/views/school/tasks/TaskListView.vue'),
|
|
meta: { title: '阅读任务' },
|
|
},
|
|
{
|
|
path: 'task-templates',
|
|
name: 'SchoolTaskTemplates',
|
|
component: () => import('@/views/school/tasks/TaskTemplateView.vue'),
|
|
meta: { title: '任务模板' },
|
|
},
|
|
{
|
|
path: 'feedback',
|
|
name: 'SchoolFeedback',
|
|
component: () => import('@/views/school/feedback/FeedbackView.vue'),
|
|
meta: { title: '课程反馈' },
|
|
},
|
|
{
|
|
path: 'schedule',
|
|
name: 'SchoolSchedule',
|
|
component: () => import('@/views/school/schedule/index.vue'),
|
|
meta: { title: '课程排期' },
|
|
},
|
|
{
|
|
path: 'operation-logs',
|
|
name: 'SchoolOperationLogs',
|
|
component: () => import('@/views/school/settings/OperationLogView.vue'),
|
|
meta: { title: '操作日志' },
|
|
},
|
|
{
|
|
path: 'settings',
|
|
name: 'SchoolSettings',
|
|
component: () => import('@/views/school/settings/SettingsView.vue'),
|
|
meta: { title: '系统设置' },
|
|
},
|
|
{
|
|
path: 'profile',
|
|
name: 'SchoolProfile',
|
|
component: () => import('@/views/profile/ProfileView.vue'),
|
|
meta: { title: '个人信息' },
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: '/teacher',
|
|
component: () => import('@/views/teacher/LayoutView.vue'),
|
|
meta: { requiresAuth: true, role: 'teacher', title: '教师端' },
|
|
children: [
|
|
{
|
|
path: '',
|
|
redirect: '/teacher/dashboard',
|
|
},
|
|
{
|
|
path: 'dashboard',
|
|
name: 'TeacherDashboard',
|
|
component: () => import('@/views/teacher/DashboardView.vue'),
|
|
meta: { title: '首页' },
|
|
},
|
|
{
|
|
path: 'courses',
|
|
name: 'TeacherCourses',
|
|
component: () => import('@/views/teacher/courses-new/CourseCenterView.vue'),
|
|
meta: { title: '课程中心' },
|
|
},
|
|
{
|
|
path: 'courses/:id',
|
|
name: 'TeacherCourseDetail',
|
|
component: () => import('@/views/teacher/courses/CourseDetailView.vue'),
|
|
meta: { title: '课程详情' },
|
|
},
|
|
{
|
|
path: 'courses/:id/prepare',
|
|
name: 'TeacherCoursePrepare',
|
|
component: () => import('@/views/teacher/courses/PrepareModeView.vue'),
|
|
meta: { title: '备课模式' },
|
|
},
|
|
{
|
|
path: 'lessons',
|
|
name: 'TeacherLessons',
|
|
component: () => import('@/views/teacher/lessons/LessonListView.vue'),
|
|
meta: { title: '上课记录' },
|
|
},
|
|
{
|
|
path: 'lessons/:id',
|
|
name: 'TeacherLesson',
|
|
component: () => import('@/views/teacher/lessons/LessonView.vue'),
|
|
meta: { title: '上课模式' },
|
|
},
|
|
{
|
|
path: 'lessons/:id/records',
|
|
name: 'TeacherLessonRecords',
|
|
component: () => import('@/views/teacher/lessons/LessonRecordsView.vue'),
|
|
meta: { title: '课后记录' },
|
|
},
|
|
{
|
|
path: 'broadcast/thanks',
|
|
name: 'TeacherBroadcastThanks',
|
|
component: () => import('@/views/teacher/lessons/BroadcastThanksView.vue'),
|
|
meta: { title: '谢谢观看' },
|
|
},
|
|
{
|
|
path: 'broadcast/:id',
|
|
name: 'TeacherBroadcast',
|
|
component: () => import('@/views/teacher/lessons/BroadcastView.vue'),
|
|
meta: { title: '展播模式' },
|
|
},
|
|
{
|
|
path: 'classes',
|
|
name: 'TeacherClasses',
|
|
component: () => import('@/views/teacher/classes/ClassListView.vue'),
|
|
meta: { title: '我的班级' },
|
|
},
|
|
{
|
|
path: 'classes/:id/students',
|
|
name: 'TeacherClassStudents',
|
|
component: () => import('@/views/teacher/classes/ClassStudentsView.vue'),
|
|
meta: { title: '班级学生' },
|
|
},
|
|
// V2 新增:校本课程包
|
|
{
|
|
path: 'school-courses',
|
|
name: 'TeacherSchoolCourses',
|
|
component: () => import('@/views/teacher/school-courses/SchoolCourseListView.vue'),
|
|
meta: { title: '校本课程包' },
|
|
},
|
|
{
|
|
path: 'school-courses/create',
|
|
name: 'TeacherSchoolCourseCreate',
|
|
component: () => import('@/views/teacher/school-courses/SchoolCourseEditView.vue'),
|
|
meta: { title: '创建校本课程包' },
|
|
},
|
|
{
|
|
path: 'school-courses/:id',
|
|
name: 'TeacherSchoolCourseDetail',
|
|
component: () => import('@/views/teacher/school-courses/SchoolCourseDetailView.vue'),
|
|
meta: { title: '校本课程包详情' },
|
|
},
|
|
{
|
|
path: 'school-courses/:id/edit',
|
|
name: 'TeacherSchoolCourseEdit',
|
|
component: () => import('@/views/teacher/school-courses/SchoolCourseEditView.vue'),
|
|
meta: { title: '编辑校本课程包' },
|
|
},
|
|
{
|
|
path: 'tasks',
|
|
name: 'TeacherTasks',
|
|
component: () => import('@/views/teacher/tasks/TaskListView.vue'),
|
|
meta: { title: '阅读任务' },
|
|
},
|
|
{
|
|
path: 'feedback',
|
|
name: 'TeacherFeedback',
|
|
component: () => import('@/views/teacher/feedback/FeedbackView.vue'),
|
|
meta: { title: '课程反馈' },
|
|
},
|
|
{
|
|
path: 'schedule',
|
|
name: 'TeacherSchedule',
|
|
component: () => import('@/views/teacher/schedule/ScheduleView.vue'),
|
|
meta: { title: '我的课表' },
|
|
},
|
|
{
|
|
path: 'growth',
|
|
name: 'TeacherGrowth',
|
|
component: () => import('@/views/teacher/growth/GrowthRecordView.vue'),
|
|
meta: { title: '成长档案' },
|
|
},
|
|
{
|
|
path: 'profile',
|
|
name: 'TeacherProfile',
|
|
component: () => import('@/views/profile/ProfileView.vue'),
|
|
meta: { title: '个人信息' },
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: '/parent',
|
|
component: () => import('@/views/parent/LayoutView.vue'),
|
|
meta: { requiresAuth: true, role: 'parent', title: '家长端' },
|
|
children: [
|
|
{
|
|
path: '',
|
|
redirect: '/parent/dashboard',
|
|
},
|
|
{
|
|
path: 'dashboard',
|
|
name: 'ParentDashboard',
|
|
component: () => import('@/views/parent/DashboardView.vue'),
|
|
meta: { title: '首页' },
|
|
},
|
|
{
|
|
path: 'children',
|
|
name: 'ParentChildren',
|
|
component: () => import('@/views/parent/children/ChildrenView.vue'),
|
|
meta: { title: '我的孩子' },
|
|
},
|
|
{
|
|
path: 'children/:id',
|
|
name: 'ParentChildDetail',
|
|
component: () => import('@/views/parent/children/ChildProfileView.vue'),
|
|
meta: { title: '孩子详情' },
|
|
},
|
|
{
|
|
path: 'lessons',
|
|
name: 'ParentLessons',
|
|
component: () => import('@/views/parent/lessons/LessonHistoryView.vue'),
|
|
meta: { title: '阅读记录' },
|
|
},
|
|
{
|
|
path: 'tasks',
|
|
name: 'ParentTasks',
|
|
component: () => import('@/views/parent/tasks/TaskListView.vue'),
|
|
meta: { title: '阅读任务' },
|
|
},
|
|
{
|
|
path: 'growth',
|
|
name: 'ParentGrowth',
|
|
component: () => import('@/views/parent/growth/GrowthRecordView.vue'),
|
|
meta: { title: '成长档案' },
|
|
},
|
|
{
|
|
path: 'profile',
|
|
name: 'ParentProfile',
|
|
component: () => import('@/views/profile/ProfileView.vue'),
|
|
meta: { title: '个人信息' },
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: '/office/WebOffice',
|
|
name: 'WebOffice',
|
|
component: () => import('@/views/office/WebOffice.vue'),
|
|
meta: { requiresAuth: true, title: '在线预览' },
|
|
},
|
|
{
|
|
path: '/weboffice',
|
|
redirect: '/office/WebOffice',
|
|
},
|
|
{
|
|
path: '/404',
|
|
name: 'NotFound',
|
|
component: () => import('@/views/NotFoundView.vue'),
|
|
meta: { title: '页面不存在' },
|
|
},
|
|
{
|
|
path: '/:pathMatch(.*)*',
|
|
redirect: '/404',
|
|
},
|
|
];
|
|
|
|
const router = createRouter({
|
|
history: createWebHistory(import.meta.env.BASE_URL),
|
|
routes,
|
|
});
|
|
|
|
// 路由守卫
|
|
router.beforeEach((to, from, next) => {
|
|
const token = localStorage.getItem('token');
|
|
const userRoleRaw = localStorage.getItem('role');
|
|
// role 转为小写以匹配路由
|
|
const userRole = userRoleRaw ? userRoleRaw.toLowerCase() : null;
|
|
|
|
// 设置页面标题
|
|
if (to.meta.title) {
|
|
document.title = `${to.meta.title} - 幼儿阅读教学服务平台`;
|
|
}
|
|
|
|
// 需要认证但未登录
|
|
if (to.meta.requiresAuth && !token) {
|
|
message.warning('请先登录');
|
|
next('/login');
|
|
return;
|
|
}
|
|
|
|
// 已登录用户访问登录页,跳转到对应首页
|
|
if (to.path === '/login' && token) {
|
|
const defaultRoute = userRole ? `/${userRole}/dashboard` : '/admin/dashboard';
|
|
next(defaultRoute);
|
|
return;
|
|
}
|
|
|
|
// 角色权限检查
|
|
if (to.meta.role && userRole !== to.meta.role) {
|
|
message.error('没有权限访问该页面');
|
|
next(`/${userRole}/dashboard`);
|
|
return;
|
|
}
|
|
|
|
next();
|
|
});
|
|
|
|
export { router };
|
|
export default router;
|