demos.ts 15 KB

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