demos.ts 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. import type { RouteRecordRaw } from 'vue-router';
  2. import { IFrameView } from '#/layouts';
  3. import { $t } from '#/locales';
  4. const routes: RouteRecordRaw[] = [
  5. {
  6. meta: {
  7. icon: 'ic:baseline-view-in-ar',
  8. keepAlive: true,
  9. order: 1000,
  10. title: $t('demos.title'),
  11. },
  12. name: 'Demos',
  13. path: '/demos',
  14. children: [
  15. // 权限控制
  16. {
  17. meta: {
  18. icon: 'mdi:shield-key-outline',
  19. title: $t('demos.access.frontendPermissions'),
  20. },
  21. name: 'AccessDemos',
  22. path: '/demos/access',
  23. children: [
  24. {
  25. name: 'AccessPageControlDemo',
  26. path: '/demos/access/page-control',
  27. component: () => import('#/views/demos/access/index.vue'),
  28. meta: {
  29. icon: 'mdi:page-previous-outline',
  30. title: $t('demos.access.pageAccess'),
  31. },
  32. },
  33. {
  34. name: 'AccessButtonControlDemo',
  35. path: '/demos/access/button-control',
  36. component: () => import('#/views/demos/access/button-control.vue'),
  37. meta: {
  38. icon: 'mdi:button-cursor',
  39. title: $t('demos.access.buttonControl'),
  40. },
  41. },
  42. {
  43. name: 'AccessMenuVisible403Demo',
  44. path: '/demos/access/menu-visible-403',
  45. component: () =>
  46. import('#/views/demos/access/menu-visible-403.vue'),
  47. meta: {
  48. authority: ['no-body'],
  49. icon: 'mdi:button-cursor',
  50. menuVisibleWithForbidden: true,
  51. title: $t('demos.access.menuVisible403'),
  52. },
  53. },
  54. {
  55. name: 'AccessSuperVisibleDemo',
  56. path: '/demos/access/super-visible',
  57. component: () => import('#/views/demos/access/super-visible.vue'),
  58. meta: {
  59. authority: ['super'],
  60. icon: 'mdi:button-cursor',
  61. title: $t('demos.access.superVisible'),
  62. },
  63. },
  64. {
  65. name: 'AccessAdminVisibleDemo',
  66. path: '/demos/access/admin-visible',
  67. component: () => import('#/views/demos/access/admin-visible.vue'),
  68. meta: {
  69. authority: ['admin'],
  70. icon: 'mdi:button-cursor',
  71. title: $t('demos.access.adminVisible'),
  72. },
  73. },
  74. {
  75. name: 'AccessUserVisibleDemo',
  76. path: '/demos/access/user-visible',
  77. component: () => import('#/views/demos/access/user-visible.vue'),
  78. meta: {
  79. authority: ['user'],
  80. icon: 'mdi:button-cursor',
  81. title: $t('demos.access.userVisible'),
  82. },
  83. },
  84. ],
  85. },
  86. // 功能
  87. {
  88. meta: {
  89. icon: 'mdi:feature-highlight',
  90. title: $t('demos.features.title'),
  91. },
  92. name: 'FeaturesDemos',
  93. path: '/demos/features',
  94. children: [
  95. {
  96. name: 'LoginExpiredDemo',
  97. path: '/demos/features/login-expired',
  98. component: () =>
  99. import('#/views/demos/features/login-expired/index.vue'),
  100. meta: {
  101. icon: 'mdi:encryption-expiration',
  102. title: $t('demos.features.loginExpired'),
  103. },
  104. },
  105. {
  106. name: 'IconsDemo',
  107. path: '/demos/features/icons',
  108. component: () => import('#/views/demos/features/icons/index.vue'),
  109. meta: {
  110. icon: 'lucide:annoyed',
  111. title: $t('demos.features.icons'),
  112. },
  113. },
  114. {
  115. name: 'WatermarkDemo',
  116. path: '/demos/features/watermark',
  117. component: () =>
  118. import('#/views/demos/features/watermark/index.vue'),
  119. meta: {
  120. icon: 'lucide:tags',
  121. title: $t('demos.features.watermark'),
  122. },
  123. },
  124. {
  125. name: 'FeatureTabsDemo',
  126. path: '/demos/features/tabs',
  127. component: () => import('#/views/demos/features/tabs/index.vue'),
  128. meta: {
  129. icon: 'lucide:app-window',
  130. title: $t('demos.features.tabs'),
  131. },
  132. },
  133. {
  134. name: 'FeatureTabDetailDemo',
  135. path: '/demos/features/tabs/detail/:id',
  136. component: () =>
  137. import('#/views/demos/features/tabs/tab-detail.vue'),
  138. meta: {
  139. activePath: '/demos/features/tabs',
  140. hideInMenu: true,
  141. maxNumOfOpenTab: 3,
  142. title: $t('demos.features.tabDetail'),
  143. },
  144. },
  145. {
  146. name: 'HideChildrenInMenuParentDemo',
  147. path: '/demos/features/hide-menu-children',
  148. meta: {
  149. hideChildrenInMenu: true,
  150. icon: 'ic:round-menu',
  151. title: $t('demos.features.hideChildrenInMenu'),
  152. },
  153. children: [
  154. {
  155. name: 'HideChildrenInMenuDemo',
  156. path: '',
  157. component: () =>
  158. import(
  159. '#/views/demos/features/hide-menu-children/parent.vue'
  160. ),
  161. meta: {
  162. // hideInMenu: true,
  163. title: $t('demos.features.hideChildrenInMenu'),
  164. },
  165. },
  166. {
  167. name: 'HideChildrenInMenuChildrenDemo',
  168. path: '/demos/features/hide-menu-children/children',
  169. component: () =>
  170. import(
  171. '#/views/demos/features/hide-menu-children/children.vue'
  172. ),
  173. meta: {
  174. activePath: '/demos/features/hide-menu-children',
  175. title: $t('demos.features.hideChildrenInMenu'),
  176. },
  177. },
  178. ],
  179. },
  180. {
  181. name: 'FullScreenDemo',
  182. path: '/demos/features/full-screen',
  183. component: () =>
  184. import('#/views/demos/features/full-screen/index.vue'),
  185. meta: {
  186. icon: 'lucide:fullscreen',
  187. title: $t('demos.features.fullScreen'),
  188. },
  189. },
  190. {
  191. name: 'FileDownloadDemo',
  192. path: '/demos/features/file-download',
  193. component: () =>
  194. import('#/views/demos/features/file-download/index.vue'),
  195. meta: {
  196. icon: 'lucide:hard-drive-download',
  197. title: $t('demos.features.fileDownload'),
  198. },
  199. },
  200. {
  201. name: 'ClipboardDemo',
  202. path: '/demos/features/clipboard',
  203. component: () =>
  204. import('#/views/demos/features/clipboard/index.vue'),
  205. meta: {
  206. icon: 'lucide:copy',
  207. title: $t('demos.features.clipboard'),
  208. },
  209. },
  210. {
  211. name: 'MenuQueryDemo',
  212. path: '/demos/menu-query',
  213. component: () =>
  214. import('#/views/demos/features/menu-query/index.vue'),
  215. meta: {
  216. icon: 'lucide:curly-braces',
  217. query: {
  218. id: 1,
  219. },
  220. title: $t('demos.features.menuWithQuery'),
  221. },
  222. },
  223. {
  224. name: 'NewWindowDemo',
  225. path: '/demos/new-window',
  226. component: () =>
  227. import('#/views/demos/features/new-window/index.vue'),
  228. meta: {
  229. icon: 'lucide:app-window',
  230. openInNewWindow: true,
  231. title: $t('demos.features.openInNewWindow'),
  232. },
  233. },
  234. {
  235. name: 'VueQueryDemo',
  236. path: '/demos/features/vue-query',
  237. component: () =>
  238. import('#/views/demos/features/vue-query/index.vue'),
  239. meta: {
  240. icon: 'lucide:git-pull-request-arrow',
  241. title: 'Tanstack Query',
  242. },
  243. },
  244. ],
  245. },
  246. // 面包屑导航
  247. {
  248. name: 'BreadcrumbDemos',
  249. path: '/demos/breadcrumb',
  250. meta: {
  251. icon: 'lucide:navigation',
  252. title: $t('demos.breadcrumb.navigation'),
  253. },
  254. children: [
  255. {
  256. name: 'BreadcrumbLateralDemo',
  257. path: '/demos/breadcrumb/lateral',
  258. component: () => import('#/views/demos/breadcrumb/lateral.vue'),
  259. meta: {
  260. icon: 'lucide:navigation',
  261. title: $t('demos.breadcrumb.lateral'),
  262. },
  263. },
  264. {
  265. name: 'BreadcrumbLateralDetailDemo',
  266. path: '/demos/breadcrumb/lateral-detail',
  267. component: () =>
  268. import('#/views/demos/breadcrumb/lateral-detail.vue'),
  269. meta: {
  270. activePath: '/demos/breadcrumb/lateral',
  271. hideInMenu: true,
  272. title: $t('demos.breadcrumb.lateralDetail'),
  273. },
  274. },
  275. {
  276. name: 'BreadcrumbLevelDemo',
  277. path: '/demos/breadcrumb/level',
  278. meta: {
  279. icon: 'lucide:navigation',
  280. title: $t('demos.breadcrumb.level'),
  281. },
  282. children: [
  283. {
  284. name: 'BreadcrumbLevelDetailDemo',
  285. path: '/demos/breadcrumb/level/detail',
  286. component: () =>
  287. import('#/views/demos/breadcrumb/level-detail.vue'),
  288. meta: {
  289. title: $t('demos.breadcrumb.levelDetail'),
  290. },
  291. },
  292. ],
  293. },
  294. ],
  295. },
  296. // 缺省页
  297. {
  298. meta: {
  299. icon: 'mdi:lightbulb-error-outline',
  300. title: $t('demos.fallback.title'),
  301. },
  302. name: 'FallbackDemos',
  303. path: '/demos/fallback',
  304. children: [
  305. {
  306. name: 'Fallback403Demo',
  307. path: '/demos/fallback/403',
  308. component: () => import('#/views/_core/fallback/forbidden.vue'),
  309. meta: {
  310. icon: 'mdi:do-not-disturb-alt',
  311. title: '403',
  312. },
  313. },
  314. {
  315. name: 'Fallback404Demo',
  316. path: '/demos/fallback/404',
  317. component: () => import('#/views/_core/fallback/not-found.vue'),
  318. meta: {
  319. icon: 'mdi:table-off',
  320. title: '404',
  321. },
  322. },
  323. {
  324. name: 'Fallback500Demo',
  325. path: '/demos/fallback/500',
  326. component: () =>
  327. import('#/views/_core/fallback/internal-error.vue'),
  328. meta: {
  329. icon: 'mdi:server-network-off',
  330. title: '500',
  331. },
  332. },
  333. {
  334. name: 'FallbackOfflineDemo',
  335. path: '/demos/fallback/offline',
  336. component: () => import('#/views/_core/fallback/offline.vue'),
  337. meta: {
  338. icon: 'mdi:offline',
  339. title: $t('ui.fallback.offline'),
  340. },
  341. },
  342. ],
  343. },
  344. // 菜单徽标
  345. {
  346. meta: {
  347. badgeType: 'dot',
  348. badgeVariants: 'destructive',
  349. icon: 'lucide:circle-dot',
  350. title: $t('demos.badge.title'),
  351. },
  352. name: 'BadgeDemos',
  353. path: '/demos/badge',
  354. children: [
  355. {
  356. name: 'BadgeDotDemo',
  357. component: () => import('#/views/demos/badge/index.vue'),
  358. path: '/demos/badge/dot',
  359. meta: {
  360. badgeType: 'dot',
  361. icon: 'lucide:square-dot',
  362. title: $t('demos.badge.dot'),
  363. },
  364. },
  365. {
  366. name: 'BadgeTextDemo',
  367. component: () => import('#/views/demos/badge/index.vue'),
  368. path: '/demos/badge/text',
  369. meta: {
  370. badge: '10',
  371. icon: 'lucide:square-dot',
  372. title: $t('demos.badge.text'),
  373. },
  374. },
  375. {
  376. name: 'BadgeColorDemo',
  377. component: () => import('#/views/demos/badge/index.vue'),
  378. path: '/demos/badge/color',
  379. meta: {
  380. badge: 'Hot',
  381. badgeVariants: 'destructive',
  382. icon: 'lucide:square-dot',
  383. title: $t('demos.badge.color'),
  384. },
  385. },
  386. ],
  387. },
  388. // 菜单激活图标
  389. {
  390. meta: {
  391. activeIcon: 'fluent-emoji:radioactive',
  392. icon: 'bi:radioactive',
  393. title: $t('demos.activeIcon.title'),
  394. },
  395. name: 'ActiveIconDemos',
  396. path: '/demos/active-icon',
  397. children: [
  398. {
  399. name: 'ActiveIconDemo',
  400. component: () => import('#/views/demos/active-icon/index.vue'),
  401. path: '/demos/active-icon/children',
  402. meta: {
  403. activeIcon: 'fluent-emoji:radioactive',
  404. icon: 'bi:radioactive',
  405. title: $t('demos.activeIcon.children'),
  406. },
  407. },
  408. ],
  409. },
  410. // 外部链接
  411. {
  412. meta: {
  413. icon: 'ic:round-settings-input-composite',
  414. title: $t('demos.outside.title'),
  415. },
  416. name: 'OutsideDemos',
  417. path: '/demos/outside',
  418. children: [
  419. {
  420. name: 'IframeDemos',
  421. path: '/demos/outside/iframe',
  422. meta: {
  423. icon: 'mdi:newspaper-variant-outline',
  424. title: $t('demos.outside.embedded'),
  425. },
  426. children: [
  427. {
  428. name: 'VueDocumentDemo',
  429. path: '/demos/outside/iframe/vue-document',
  430. component: IFrameView,
  431. meta: {
  432. icon: 'logos:vue',
  433. iframeSrc: 'https://cn.vuejs.org/',
  434. keepAlive: true,
  435. title: 'Vue',
  436. },
  437. },
  438. {
  439. name: 'TailwindcssDemo',
  440. path: '/demos/outside/iframe/tailwindcss',
  441. component: IFrameView,
  442. meta: {
  443. icon: 'devicon:tailwindcss',
  444. iframeSrc: 'https://tailwindcss.com/',
  445. // keepAlive: true,
  446. title: 'Tailwindcss',
  447. },
  448. },
  449. ],
  450. },
  451. {
  452. name: 'ExternalLinkDemos',
  453. path: '/demos/outside/external-link',
  454. meta: {
  455. icon: 'mdi:newspaper-variant-multiple-outline',
  456. title: $t('demos.outside.externalLink'),
  457. },
  458. children: [
  459. {
  460. name: 'ViteDemo',
  461. path: '/demos/outside/external-link/vite',
  462. component: IFrameView,
  463. meta: {
  464. icon: 'logos:vitejs',
  465. link: 'https://vitejs.dev/',
  466. title: 'Vite',
  467. },
  468. },
  469. {
  470. name: 'VueUseDemo',
  471. path: '/demos/outside/external-link/vue-use',
  472. component: IFrameView,
  473. meta: {
  474. icon: 'logos:vueuse',
  475. link: 'https://vueuse.org',
  476. title: 'VueUse',
  477. },
  478. },
  479. ],
  480. },
  481. ],
  482. },
  483. // 嵌套菜单
  484. {
  485. meta: {
  486. icon: 'ic:round-menu',
  487. title: $t('demos.nested.title'),
  488. },
  489. name: 'NestedDemos',
  490. path: '/demos/nested',
  491. children: [
  492. {
  493. name: 'Menu1Demo',
  494. path: '/demos/nested/menu1',
  495. component: () => import('#/views/demos/nested/menu-1.vue'),
  496. meta: {
  497. icon: 'ic:round-menu',
  498. keepAlive: true,
  499. title: $t('demos.nested.menu1'),
  500. },
  501. },
  502. {
  503. name: 'Menu2Demo',
  504. path: '/demos/nested/menu2',
  505. meta: {
  506. icon: 'ic:round-menu',
  507. keepAlive: true,
  508. title: $t('demos.nested.menu2'),
  509. },
  510. children: [
  511. {
  512. name: 'Menu21Demo',
  513. path: '/demos/nested/menu2/menu2-1',
  514. component: () => import('#/views/demos/nested/menu-2-1.vue'),
  515. meta: {
  516. icon: 'ic:round-menu',
  517. keepAlive: true,
  518. title: $t('demos.nested.menu2_1'),
  519. },
  520. },
  521. ],
  522. },
  523. {
  524. name: 'Menu3Demo',
  525. path: '/demos/nested/menu3',
  526. meta: {
  527. icon: 'ic:round-menu',
  528. title: $t('demos.nested.menu3'),
  529. },
  530. children: [
  531. {
  532. name: 'Menu31Demo',
  533. path: '/demos/nested/menu3/menu3-1',
  534. component: () => import('#/views/demos/nested/menu-3-1.vue'),
  535. meta: {
  536. icon: 'ic:round-menu',
  537. keepAlive: true,
  538. title: $t('demos.nested.menu3_1'),
  539. },
  540. },
  541. {
  542. name: 'Menu32Demo',
  543. path: '/demos/nested/menu3/menu3-2',
  544. meta: {
  545. icon: 'ic:round-menu',
  546. title: $t('demos.nested.menu3_2'),
  547. },
  548. children: [
  549. {
  550. name: 'Menu321Demo',
  551. path: '/demos/nested/menu3/menu3-2/menu3-2-1',
  552. component: () =>
  553. import('#/views/demos/nested/menu-3-2-1.vue'),
  554. meta: {
  555. icon: 'ic:round-menu',
  556. keepAlive: true,
  557. title: $t('demos.nested.menu3_2_1'),
  558. },
  559. },
  560. ],
  561. },
  562. ],
  563. },
  564. ],
  565. },
  566. ],
  567. },
  568. ];
  569. export default routes;