demos.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. import type { RouteRecordRaw } from 'vue-router';
  2. import { BasicLayout, IFrameView } from '#/layouts';
  3. import { $t } from '#/locales';
  4. const routes: RouteRecordRaw[] = [
  5. {
  6. component: BasicLayout,
  7. meta: {
  8. icon: 'ic:baseline-view-in-ar',
  9. keepAlive: true,
  10. order: 1000,
  11. title: $t('page.demos.title'),
  12. },
  13. name: 'Demos',
  14. path: '/demos',
  15. redirect: '/demos/access',
  16. children: [
  17. // 权限控制
  18. {
  19. meta: {
  20. icon: 'mdi:shield-key-outline',
  21. title: $t('page.demos.access.frontendPermissions'),
  22. },
  23. name: 'Access',
  24. path: 'access',
  25. redirect: '/demos/access/page-control',
  26. children: [
  27. {
  28. name: 'AccessPageControl',
  29. path: 'page-control',
  30. component: () => import('#/views/demos/access/index.vue'),
  31. meta: {
  32. icon: 'mdi:page-previous-outline',
  33. title: $t('page.demos.access.pageAccess'),
  34. },
  35. },
  36. {
  37. name: 'AccessButtonControl',
  38. path: 'button-control',
  39. component: () => import('#/views/demos/access/button-control.vue'),
  40. meta: {
  41. icon: 'mdi:button-cursor',
  42. title: $t('page.demos.access.buttonControl'),
  43. },
  44. },
  45. {
  46. name: 'AccessMenuVisible403',
  47. path: 'menu-visible-403',
  48. component: () =>
  49. import('#/views/demos/access/menu-visible-403.vue'),
  50. meta: {
  51. authority: ['no-body'],
  52. icon: 'mdi:button-cursor',
  53. menuVisibleWithForbidden: true,
  54. title: $t('page.demos.access.menuVisible403'),
  55. },
  56. },
  57. {
  58. name: 'AccessSuperVisible',
  59. path: 'super-visible',
  60. component: () => import('#/views/demos/access/super-visible.vue'),
  61. meta: {
  62. authority: ['super'],
  63. icon: 'mdi:button-cursor',
  64. title: $t('page.demos.access.superVisible'),
  65. },
  66. },
  67. {
  68. name: 'AccessAdminVisible',
  69. path: 'admin-visible',
  70. component: () => import('#/views/demos/access/admin-visible.vue'),
  71. meta: {
  72. authority: ['admin'],
  73. icon: 'mdi:button-cursor',
  74. title: $t('page.demos.access.adminVisible'),
  75. },
  76. },
  77. {
  78. name: 'AccessUserVisible',
  79. path: 'user-visible',
  80. component: () => import('#/views/demos/access/user-visible.vue'),
  81. meta: {
  82. authority: ['user'],
  83. icon: 'mdi:button-cursor',
  84. title: $t('page.demos.access.userVisible'),
  85. },
  86. },
  87. ],
  88. },
  89. // 功能
  90. {
  91. meta: {
  92. icon: 'mdi:feature-highlight',
  93. title: $t('page.demos.features.title'),
  94. },
  95. name: 'Features',
  96. path: 'features',
  97. redirect: '/demos/features/tabs',
  98. children: [
  99. {
  100. name: 'FeatureTabsDemo',
  101. path: 'tabs',
  102. component: () => import('#/views/demos/features/tabs/index.vue'),
  103. meta: {
  104. icon: 'lucide:app-window',
  105. title: $t('page.demos.features.tabs'),
  106. },
  107. },
  108. {
  109. name: 'FeatureTabDetailDemo',
  110. path: 'tabs/detail/:id',
  111. component: () =>
  112. import('#/views/demos/features/tabs/tab-detail.vue'),
  113. meta: {
  114. activePath: '/demos/features/tabs',
  115. hideInMenu: true,
  116. maxNumOfOpenTab: 3,
  117. title: $t('page.demos.features.tabDetail'),
  118. },
  119. },
  120. {
  121. name: 'HideChildrenInMenuParent',
  122. path: 'hide-menu-children',
  123. component: () =>
  124. import('#/views/demos/features/hide-menu-children/parent.vue'),
  125. meta: {
  126. hideChildrenInMenu: true,
  127. icon: 'ic:round-menu',
  128. title: 'page.demos.features.hideChildrenInMenu',
  129. },
  130. children: [
  131. {
  132. name: 'HideChildrenInMenuChildren',
  133. path: 'hide-children-in-menu',
  134. component: () =>
  135. import(
  136. '#/views/demos/features/hide-menu-children/children.vue'
  137. ),
  138. },
  139. ],
  140. },
  141. {
  142. name: 'LoginExpired',
  143. path: 'login-expired',
  144. component: () =>
  145. import('#/views/demos/features/login-expired/index.vue'),
  146. meta: {
  147. icon: 'mdi:encryption-expiration',
  148. title: $t('page.demos.features.loginExpired'),
  149. },
  150. },
  151. ],
  152. },
  153. // 面包屑导航
  154. {
  155. name: 'BreadcrumbDemos',
  156. path: 'breadcrumb',
  157. meta: {
  158. icon: 'lucide:navigation',
  159. title: $t('page.demos.breadcrumb.navigation'),
  160. },
  161. redirect: '/demos/breadcrumb/lateral',
  162. children: [
  163. {
  164. name: 'BreadcrumbLateral',
  165. path: 'lateral',
  166. component: () => import('#/views/demos/breadcrumb/lateral.vue'),
  167. meta: {
  168. icon: 'lucide:navigation',
  169. title: $t('page.demos.breadcrumb.lateral'),
  170. },
  171. },
  172. {
  173. name: 'BreadcrumbLateralDetail',
  174. path: 'lateral-detail',
  175. component: () =>
  176. import('#/views/demos/breadcrumb/lateral-detail.vue'),
  177. meta: {
  178. activePath: '/demos/breadcrumb/lateral',
  179. hideInMenu: true,
  180. title: $t('page.demos.breadcrumb.lateralDetail'),
  181. },
  182. },
  183. {
  184. name: 'BreadcrumbLevel',
  185. path: 'level',
  186. meta: {
  187. icon: 'lucide:navigation',
  188. title: $t('page.demos.breadcrumb.level'),
  189. },
  190. redirect: '/demos/breadcrumb/level/detail',
  191. children: [
  192. {
  193. name: 'BreadcrumbLevelDetail',
  194. path: 'detail',
  195. component: () =>
  196. import('#/views/demos/breadcrumb/level-detail.vue'),
  197. meta: {
  198. title: $t('page.demos.breadcrumb.levelDetail'),
  199. },
  200. },
  201. ],
  202. },
  203. ],
  204. },
  205. // 缺省页
  206. {
  207. meta: {
  208. icon: 'mdi:lightbulb-error-outline',
  209. title: $t('page.demos.fallback.title'),
  210. },
  211. name: 'Fallback',
  212. path: 'fallback',
  213. redirect: '/demos/fallback/403',
  214. children: [
  215. {
  216. name: 'Fallback403',
  217. path: '403',
  218. component: () => import('#/views/_core/fallback/forbidden.vue'),
  219. meta: {
  220. icon: 'mdi:do-not-disturb-alt',
  221. title: '403',
  222. },
  223. },
  224. {
  225. name: 'Fallback404',
  226. path: '404',
  227. component: () => import('#/views/_core/fallback/not-found.vue'),
  228. meta: {
  229. icon: 'mdi:table-off',
  230. title: '404',
  231. },
  232. },
  233. {
  234. name: 'Fallback500',
  235. path: '500',
  236. component: () =>
  237. import('#/views/_core/fallback/internal-error.vue'),
  238. meta: {
  239. icon: 'mdi:server-network-off',
  240. title: '500',
  241. },
  242. },
  243. {
  244. name: 'FallbackOffline',
  245. path: 'offline',
  246. component: () => import('#/views/_core/fallback/offline.vue'),
  247. meta: {
  248. icon: 'mdi:offline',
  249. title: $t('fallback.offline'),
  250. },
  251. },
  252. ],
  253. },
  254. // 菜单徽标
  255. {
  256. meta: {
  257. badgeType: 'dot',
  258. badgeVariants: 'destructive',
  259. icon: 'lucide:circle-dot',
  260. title: $t('page.demos.badge.title'),
  261. },
  262. name: 'BadgeDemo',
  263. path: 'badge',
  264. redirect: '/demos/badge/dot',
  265. children: [
  266. {
  267. name: 'BadgeDotDemo',
  268. component: () => import('#/views/demos/badge/index.vue'),
  269. path: 'dot',
  270. meta: {
  271. badgeType: 'dot',
  272. icon: 'lucide:square-dot',
  273. title: $t('page.demos.badge.dot'),
  274. },
  275. },
  276. {
  277. name: 'BadgeTextDemo',
  278. component: () => import('#/views/demos/badge/index.vue'),
  279. path: 'text',
  280. meta: {
  281. badge: '10',
  282. icon: 'lucide:square-dot',
  283. title: $t('page.demos.badge.text'),
  284. },
  285. },
  286. {
  287. name: 'BadgeColorDemo',
  288. component: () => import('#/views/demos/badge/index.vue'),
  289. path: 'color',
  290. meta: {
  291. badge: 'Hot',
  292. badgeVariants: 'destructive',
  293. icon: 'lucide:square-dot',
  294. title: $t('page.demos.badge.color'),
  295. },
  296. },
  297. ],
  298. },
  299. // 外部链接
  300. {
  301. meta: {
  302. icon: 'ic:round-settings-input-composite',
  303. title: $t('page.demos.outside.title'),
  304. },
  305. name: 'Outside',
  306. path: 'outside',
  307. redirect: '/demos/outside/iframe',
  308. children: [
  309. {
  310. name: 'iframe',
  311. path: 'iframe',
  312. meta: {
  313. icon: 'mdi:newspaper-variant-outline',
  314. title: $t('page.demos.outside.embedded'),
  315. },
  316. redirect: '/demos/outside/iframe/vue-document',
  317. children: [
  318. {
  319. name: 'VueDocument',
  320. path: 'vue-document',
  321. component: IFrameView,
  322. meta: {
  323. icon: 'logos:vue',
  324. iframeSrc: 'https://cn.vuejs.org/',
  325. keepAlive: true,
  326. title: 'Vue',
  327. },
  328. },
  329. {
  330. name: 'Tailwindcss',
  331. path: 'tailwindcss',
  332. component: IFrameView,
  333. meta: {
  334. icon: 'devicon:tailwindcss',
  335. iframeSrc: 'https://tailwindcss.com/',
  336. // keepAlive: true,
  337. title: 'Tailwindcss',
  338. },
  339. },
  340. ],
  341. },
  342. {
  343. name: 'ExternalLink',
  344. path: 'external-link',
  345. meta: {
  346. icon: 'mdi:newspaper-variant-multiple-outline',
  347. title: $t('page.demos.outside.externalLink'),
  348. },
  349. redirect: '/demos/outside/external-link/vite',
  350. children: [
  351. {
  352. name: 'Vite',
  353. path: 'vite',
  354. component: IFrameView,
  355. meta: {
  356. icon: 'logos:vitejs',
  357. link: 'https://vitejs.dev/',
  358. title: 'Vite',
  359. },
  360. },
  361. {
  362. name: 'VueUse',
  363. path: 'vue-use',
  364. component: IFrameView,
  365. meta: {
  366. icon: 'logos:vueuse',
  367. link: 'https://vueuse.org',
  368. title: 'VueUse',
  369. },
  370. },
  371. ],
  372. },
  373. ],
  374. },
  375. // 嵌套菜单
  376. {
  377. meta: {
  378. icon: 'ic:round-menu',
  379. title: $t('page.demos.nested.title'),
  380. },
  381. name: 'Nested',
  382. path: 'nested',
  383. redirect: '/demos/nested/menu1',
  384. children: [
  385. {
  386. name: 'Menu1',
  387. path: 'menu1',
  388. component: () => import('#/views/demos/nested/menu-1.vue'),
  389. meta: {
  390. icon: 'ic:round-menu',
  391. keepAlive: true,
  392. title: $t('page.demos.nested.menu1'),
  393. },
  394. },
  395. {
  396. name: 'Menu2',
  397. path: 'menu2',
  398. meta: {
  399. icon: 'ic:round-menu',
  400. keepAlive: true,
  401. title: $t('page.demos.nested.menu2'),
  402. },
  403. redirect: '/demos/nested/menu2/menu2-1',
  404. children: [
  405. {
  406. name: 'Menu21',
  407. path: 'menu2-1',
  408. component: () => import('#/views/demos/nested/menu-2-1.vue'),
  409. meta: {
  410. icon: 'ic:round-menu',
  411. keepAlive: true,
  412. title: $t('page.demos.nested.menu2_1'),
  413. },
  414. },
  415. ],
  416. },
  417. {
  418. name: 'Menu3',
  419. path: 'menu3',
  420. meta: {
  421. icon: 'ic:round-menu',
  422. title: $t('page.demos.nested.menu3'),
  423. },
  424. redirect: '/demos/nested/menu3/menu3-1',
  425. children: [
  426. {
  427. name: 'Menu31',
  428. path: 'menu3-1',
  429. component: () => import('#/views/demos/nested/menu-3-1.vue'),
  430. meta: {
  431. icon: 'ic:round-menu',
  432. keepAlive: true,
  433. title: $t('page.demos.nested.menu3_1'),
  434. },
  435. },
  436. {
  437. name: 'Menu32',
  438. path: 'menu3-2',
  439. meta: {
  440. icon: 'ic:round-menu',
  441. title: $t('page.demos.nested.menu3_2'),
  442. },
  443. redirect: '/demos/nested/menu3/menu3-2/menu3-2-1',
  444. children: [
  445. {
  446. name: 'Menu321',
  447. path: 'menu3-2-1',
  448. component: () =>
  449. import('#/views/demos/nested/menu-3-2-1.vue'),
  450. meta: {
  451. icon: 'ic:round-menu',
  452. keepAlive: true,
  453. title: $t('page.demos.nested.menu3_2_1'),
  454. },
  455. },
  456. ],
  457. },
  458. ],
  459. },
  460. ],
  461. },
  462. ],
  463. },
  464. ];
  465. export default routes;