import {createRouter, createWebHistory, type Router, type RouteRecordRaw} from 'vue-router' import LoginView from '../view/LoginView.vue' import UserLayout from '../layout/UserLayout.vue' import AdminLayout from "../layout/AdminLayout.vue"; import UserView from "../view/UserView.vue"; import BookingView from '../view/booking/BookingView.vue' import BoardingBookingView from '../view/booking/BoardingBookingView.vue' import GroomingBookingView from '../view/booking/GroomingBookingView.vue' import OrderListView from '../view/order/OrderListView.vue' import OrderDetailView from '../view/order/OrderDetailView.vue' import PetListView from '../view/pet/PetListView.vue' import PetCreateView from '../view/pet/PetCreateView.vue' import PetDetailView from '../view/pet/PetDetailView.vue' import PetEditView from '../view/pet/PetEditView.vue' import ProfileView from '../view/profile/ProfileView.vue' import ProfileEditView from '../view/profile/ProfileEditView.vue' import PasswordEditView from '../view/profile/PasswordEditView.vue' import AdminOrderListView from '../view/admin/AdminOrderListView.vue' import AdminOrderDetailView from '../view/admin/AdminOrderDetailView.vue' import AdminRoomCalendarView from '../view/admin/AdminRoomCalendarView.vue' import AdminScheduleListView from '../view/admin/AdminScheduleListView.vue' import AdminPackageListView from '../view/admin/AdminPackageListView.vue' import AdminPackageCreateView from '../view/admin/AdminPackageCreateView.vue' import AdminPackageEditView from '../view/admin/AdminPackageEditView.vue' import AdminUserDetailView from '../view/admin/AdminUserDetailView.vue' import { User, Calendar, List, Avatar, EditPen, Tickets, Coin, } from '@element-plus/icons-vue' import {useLoginUserStore} from "../store"; import {ElMessage} from "element-plus"; export const userRoutes: RouteRecordRaw[] = [ { path: '/', name: 'commonLayout', component: UserLayout, children: [ // 预约 { path: '/booking', name: 'booking', component: BookingView, meta: { title: '服务预约', icon: Calendar } }, { path: '/booking/boarding', name: 'boardingBooking', component: BoardingBookingView, meta: { title: '寄养预约', requiresAuth: true } }, { path: '/booking/grooming', name: 'groomingBooking', component: GroomingBookingView, meta: { title: '洗护预约', requiresAuth: true } }, // 订单 { path: '/orders', name: 'orderList', component: OrderListView, meta: { title: '我的订单', icon: Tickets, requiresAuth: true } }, { path: '/orders/:id', name: 'orderDetail', component: OrderDetailView, meta: { title: '订单详情', requiresAuth: true } }, // 宠物 { path: '/pets', name: 'petList', component: PetListView, meta: { title: '宠物档案', icon: Avatar, requiresAuth: true } }, { path: '/pets/new', name: 'petCreate', component: PetCreateView, meta: { title: '新增宠物', requiresAuth: true } }, { path: '/pets/:id', name: 'petDetail', component: PetDetailView, meta: { title: '宠物详情', requiresAuth: true } }, { path: '/pets/:id/edit', name: 'petEdit', component: PetEditView, meta: { title: '编辑宠物', requiresAuth: true } }, // 个人中心 { path: '/profile', name: 'profile', component: ProfileView, meta: { title: '个人中心', icon: User, requiresAuth: true } }, { path: '/profile/edit', name: 'profileEdit', component: ProfileEditView, meta: { title: '修改资料', requiresAuth: true } }, { path: '/profile/password', name: 'passwordEdit', component: PasswordEditView, meta: { title: '修改密码', requiresAuth: true } }, ], }, ] export const adminRoutes: RouteRecordRaw[] = [ { path: '/admin', name: 'adminLayout', component: AdminLayout, children: [ { path: '/admin/orders', name: 'adminOrderList', component: AdminOrderListView, meta: { title: '订单审核', icon: List } }, { path: '/admin/orders/:id', name: 'adminOrderDetail', component: AdminOrderDetailView, meta: { title: '订单审核详情' } }, { path: '/admin/rooms', name: 'adminRooms', component: AdminRoomCalendarView, meta: { title: '房态管理', icon: Calendar } }, { path: '/admin/schedules', name: 'adminSchedules', component: AdminScheduleListView, meta: { title: '排班管理', icon: EditPen } }, { path: '/admin/packages', name: 'adminPackageList', component: AdminPackageListView, meta: { title: '套餐配置', icon: Coin } }, { path: '/admin/packages/new', name: 'adminPackageCreate', component: AdminPackageCreateView, meta: { title: '新增套餐' } }, { path: '/admin/packages/:id/edit', name: 'adminPackageEdit', component: AdminPackageEditView, meta: { title: '编辑套餐' } }, { path: '/admin/users', name: 'adminUsers', component: UserView, meta: { title: '用户管理', icon: User } }, { path: '/admin/users/:id', name: 'adminUserDetail', component: AdminUserDetailView, meta: { title: '用户详情' } }, ], meta: { requiresAdmin: true } } ] const router: Router = createRouter({ history: createWebHistory(), routes: [ { path: '/login', name: 'login', component: LoginView }, ...userRoutes, ...adminRoutes ], }); router.beforeEach((to, _from, next) => { const loginUserStore = useLoginUserStore() const requiresAuth = to.matched.some(record => record.meta.requiresAuth) const requiresAdmin = to.matched.some(record => record.meta.requiresAdmin) if (requiresAuth || requiresAdmin) { if (!loginUserStore.loginUser.isLogin) { ElMessage.warning('请先登录') next({path: '/login', query: {redirect: to.fullPath}}) } else if (requiresAdmin && loginUserStore.loginUser.user?.role !== 'admin') { ElMessage.error('无权访问') next('/booking') } else { next() } } else { next() } }) export default router