index.ts 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. import {createRouter, createWebHistory, type Router, type RouteRecordRaw} from 'vue-router'
  2. import LoginView from '../view/LoginView.vue'
  3. import UserLayout from '../layout/UserLayout.vue'
  4. import AdminLayout from "../layout/AdminLayout.vue";
  5. import UserView from "../view/UserView.vue";
  6. import BookingView from '../view/booking/BookingView.vue'
  7. import BoardingBookingView from '../view/booking/BoardingBookingView.vue'
  8. import GroomingBookingView from '../view/booking/GroomingBookingView.vue'
  9. import OrderListView from '../view/order/OrderListView.vue'
  10. import OrderDetailView from '../view/order/OrderDetailView.vue'
  11. import PetListView from '../view/pet/PetListView.vue'
  12. import PetCreateView from '../view/pet/PetCreateView.vue'
  13. import PetDetailView from '../view/pet/PetDetailView.vue'
  14. import PetEditView from '../view/pet/PetEditView.vue'
  15. import ProfileView from '../view/profile/ProfileView.vue'
  16. import ProfileEditView from '../view/profile/ProfileEditView.vue'
  17. import PasswordEditView from '../view/profile/PasswordEditView.vue'
  18. import AdminOrderListView from '../view/admin/AdminOrderListView.vue'
  19. import AdminOrderDetailView from '../view/admin/AdminOrderDetailView.vue'
  20. import AdminRoomCalendarView from '../view/admin/AdminRoomCalendarView.vue'
  21. import AdminScheduleListView from '../view/admin/AdminScheduleListView.vue'
  22. import AdminPackageListView from '../view/admin/AdminPackageListView.vue'
  23. import AdminPackageCreateView from '../view/admin/AdminPackageCreateView.vue'
  24. import AdminPackageEditView from '../view/admin/AdminPackageEditView.vue'
  25. import AdminUserDetailView from '../view/admin/AdminUserDetailView.vue'
  26. import {
  27. User,
  28. Calendar,
  29. List,
  30. Avatar,
  31. EditPen,
  32. Tickets,
  33. Coin,
  34. } from '@element-plus/icons-vue'
  35. import {useLoginUserStore} from "../store";
  36. import {ElMessage} from "element-plus";
  37. export const userRoutes: RouteRecordRaw[] = [
  38. {
  39. path: '/',
  40. name: 'commonLayout',
  41. component: UserLayout,
  42. children: [
  43. // 预约
  44. {
  45. path: '/booking',
  46. name: 'booking',
  47. component: BookingView,
  48. meta: {
  49. title: '服务预约',
  50. icon: Calendar
  51. }
  52. },
  53. {
  54. path: '/booking/boarding',
  55. name: 'boardingBooking',
  56. component: BoardingBookingView,
  57. meta: { title: '寄养预约', requiresAuth: true }
  58. },
  59. {
  60. path: '/booking/grooming',
  61. name: 'groomingBooking',
  62. component: GroomingBookingView,
  63. meta: { title: '洗护预约', requiresAuth: true }
  64. },
  65. // 订单
  66. {
  67. path: '/orders',
  68. name: 'orderList',
  69. component: OrderListView,
  70. meta: {
  71. title: '我的订单',
  72. icon: Tickets,
  73. requiresAuth: true
  74. }
  75. },
  76. {
  77. path: '/orders/:id',
  78. name: 'orderDetail',
  79. component: OrderDetailView,
  80. meta: { title: '订单详情', requiresAuth: true }
  81. },
  82. // 宠物
  83. {
  84. path: '/pets',
  85. name: 'petList',
  86. component: PetListView,
  87. meta: {
  88. title: '宠物档案',
  89. icon: Avatar,
  90. requiresAuth: true
  91. }
  92. },
  93. {
  94. path: '/pets/new',
  95. name: 'petCreate',
  96. component: PetCreateView,
  97. meta: { title: '新增宠物', requiresAuth: true }
  98. },
  99. {
  100. path: '/pets/:id',
  101. name: 'petDetail',
  102. component: PetDetailView,
  103. meta: { title: '宠物详情', requiresAuth: true }
  104. },
  105. {
  106. path: '/pets/:id/edit',
  107. name: 'petEdit',
  108. component: PetEditView,
  109. meta: { title: '编辑宠物', requiresAuth: true }
  110. },
  111. // 个人中心
  112. {
  113. path: '/profile',
  114. name: 'profile',
  115. component: ProfileView,
  116. meta: {
  117. title: '个人中心',
  118. icon: User,
  119. requiresAuth: true
  120. }
  121. },
  122. {
  123. path: '/profile/edit',
  124. name: 'profileEdit',
  125. component: ProfileEditView,
  126. meta: { title: '修改资料', requiresAuth: true }
  127. },
  128. {
  129. path: '/profile/password',
  130. name: 'passwordEdit',
  131. component: PasswordEditView,
  132. meta: { title: '修改密码', requiresAuth: true }
  133. },
  134. ],
  135. },
  136. ]
  137. export const adminRoutes: RouteRecordRaw[] = [
  138. {
  139. path: '/admin',
  140. name: 'adminLayout',
  141. component: AdminLayout,
  142. children: [
  143. {
  144. path: '/admin/orders',
  145. name: 'adminOrderList',
  146. component: AdminOrderListView,
  147. meta: {
  148. title: '订单审核',
  149. icon: List
  150. }
  151. },
  152. {
  153. path: '/admin/orders/:id',
  154. name: 'adminOrderDetail',
  155. component: AdminOrderDetailView,
  156. meta: { title: '订单审核详情' }
  157. },
  158. {
  159. path: '/admin/rooms',
  160. name: 'adminRooms',
  161. component: AdminRoomCalendarView,
  162. meta: {
  163. title: '房态管理',
  164. icon: Calendar
  165. }
  166. },
  167. {
  168. path: '/admin/schedules',
  169. name: 'adminSchedules',
  170. component: AdminScheduleListView,
  171. meta: {
  172. title: '排班管理',
  173. icon: EditPen
  174. }
  175. },
  176. {
  177. path: '/admin/packages',
  178. name: 'adminPackageList',
  179. component: AdminPackageListView,
  180. meta: {
  181. title: '套餐配置',
  182. icon: Coin
  183. }
  184. },
  185. {
  186. path: '/admin/packages/new',
  187. name: 'adminPackageCreate',
  188. component: AdminPackageCreateView,
  189. meta: { title: '新增套餐' }
  190. },
  191. {
  192. path: '/admin/packages/:id/edit',
  193. name: 'adminPackageEdit',
  194. component: AdminPackageEditView,
  195. meta: { title: '编辑套餐' }
  196. },
  197. {
  198. path: '/admin/users',
  199. name: 'adminUsers',
  200. component: UserView,
  201. meta: {
  202. title: '用户管理',
  203. icon: User
  204. }
  205. },
  206. {
  207. path: '/admin/users/:id',
  208. name: 'adminUserDetail',
  209. component: AdminUserDetailView,
  210. meta: { title: '用户详情' }
  211. },
  212. ],
  213. meta: {
  214. requiresAdmin: true
  215. }
  216. }
  217. ]
  218. const router: Router = createRouter({
  219. history: createWebHistory(),
  220. routes: [
  221. {
  222. path: '/login',
  223. name: 'login',
  224. component: LoginView
  225. },
  226. ...userRoutes,
  227. ...adminRoutes
  228. ],
  229. });
  230. router.beforeEach((to, _from, next) => {
  231. const loginUserStore = useLoginUserStore()
  232. const requiresAuth = to.matched.some(record => record.meta.requiresAuth)
  233. const requiresAdmin = to.matched.some(record => record.meta.requiresAdmin)
  234. if (requiresAuth || requiresAdmin) {
  235. if (!loginUserStore.loginUser.isLogin) {
  236. ElMessage.warning('请先登录')
  237. next({path: '/login', query: {redirect: to.fullPath}})
  238. } else if (requiresAdmin && loginUserStore.loginUser.user?.role !== 'admin') {
  239. ElMessage.error('无权访问')
  240. next('/booking')
  241. } else {
  242. next()
  243. }
  244. } else {
  245. next()
  246. }
  247. })
  248. export default router