demos.ts 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  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: 'HideChildrenInMenuParent',
  110. path: 'hide-menu-children',
  111. component: () =>
  112. import('#/views/demos/features/hide-menu-children/parent.vue'),
  113. meta: {
  114. hideChildrenInMenu: true,
  115. icon: 'ic:round-menu',
  116. title: 'page.demos.features.hideChildrenInMenu',
  117. },
  118. children: [
  119. {
  120. name: 'HideChildrenInMenuChildren',
  121. path: 'hide-children-in-menu',
  122. component: () =>
  123. import(
  124. '#/views/demos/features/hide-menu-children/children.vue'
  125. ),
  126. },
  127. ],
  128. },
  129. {
  130. name: 'LoginExpired',
  131. path: 'login-expired',
  132. component: () =>
  133. import('#/views/demos/features/login-expired/index.vue'),
  134. meta: {
  135. icon: 'mdi:encryption-expiration',
  136. title: $t('page.demos.features.loginExpired'),
  137. },
  138. },
  139. ],
  140. },
  141. // 面包屑导航
  142. {
  143. name: 'BreadcrumbDemos',
  144. path: 'breadcrumb',
  145. meta: {
  146. icon: 'lucide:navigation',
  147. title: $t('page.demos.breadcrumb.navigation'),
  148. },
  149. redirect: '/demos/breadcrumb/lateral',
  150. children: [
  151. {
  152. name: 'BreadcrumbLateral',
  153. path: 'lateral',
  154. component: () => import('#/views/demos/breadcrumb/lateral.vue'),
  155. meta: {
  156. icon: 'lucide:navigation',
  157. title: $t('page.demos.breadcrumb.lateral'),
  158. },
  159. },
  160. {
  161. name: 'BreadcrumbLateralDetail',
  162. path: 'lateral-detail',
  163. component: () =>
  164. import('#/views/demos/breadcrumb/lateral-detail.vue'),
  165. meta: {
  166. activePath: '/demos/breadcrumb/lateral',
  167. hideInMenu: true,
  168. title: $t('page.demos.breadcrumb.lateralDetail'),
  169. },
  170. },
  171. {
  172. name: 'BreadcrumbLevel',
  173. path: 'level',
  174. meta: {
  175. icon: 'lucide:navigation',
  176. title: $t('page.demos.breadcrumb.level'),
  177. },
  178. redirect: '/demos/breadcrumb/level/detail',
  179. children: [
  180. {
  181. name: 'BreadcrumbLevelDetail',
  182. path: 'detail',
  183. component: () =>
  184. import('#/views/demos/breadcrumb/level-detail.vue'),
  185. meta: {
  186. title: $t('page.demos.breadcrumb.levelDetail'),
  187. },
  188. },
  189. ],
  190. },
  191. ],
  192. },
  193. // 缺省页
  194. {
  195. meta: {
  196. icon: 'mdi:lightbulb-error-outline',
  197. title: $t('page.demos.fallback.title'),
  198. },
  199. name: 'Fallback',
  200. path: 'fallback',
  201. redirect: '/demos/fallback/403',
  202. children: [
  203. {
  204. name: 'Fallback403',
  205. path: '403',
  206. component: () => import('#/views/_core/fallback/forbidden.vue'),
  207. meta: {
  208. icon: 'mdi:do-not-disturb-alt',
  209. title: '403',
  210. },
  211. },
  212. {
  213. name: 'Fallback404',
  214. path: '404',
  215. component: () => import('#/views/_core/fallback/not-found.vue'),
  216. meta: {
  217. icon: 'mdi:table-off',
  218. title: '404',
  219. },
  220. },
  221. {
  222. name: 'Fallback500',
  223. path: '500',
  224. component: () =>
  225. import('#/views/_core/fallback/internal-error.vue'),
  226. meta: {
  227. icon: 'mdi:server-network-off',
  228. title: '500',
  229. },
  230. },
  231. {
  232. name: 'FallbackOffline',
  233. path: 'offline',
  234. component: () => import('#/views/_core/fallback/offline.vue'),
  235. meta: {
  236. icon: 'mdi:offline',
  237. title: $t('fallback.offline'),
  238. },
  239. },
  240. ],
  241. },
  242. // 菜单徽标
  243. {
  244. meta: {
  245. badgeType: 'dot',
  246. badgeVariants: 'destructive',
  247. icon: 'lucide:circle-dot',
  248. title: $t('page.demos.badge.title'),
  249. },
  250. name: 'BadgeDemo',
  251. path: 'badge',
  252. redirect: '/demos/badge/dot',
  253. children: [
  254. {
  255. name: 'BadgeDotDemo',
  256. component: () => import('#/views/demos/badge/index.vue'),
  257. path: 'dot',
  258. meta: {
  259. badgeType: 'dot',
  260. icon: 'lucide:square-dot',
  261. title: $t('page.demos.badge.dot'),
  262. },
  263. },
  264. {
  265. name: 'BadgeTextDemo',
  266. component: () => import('#/views/demos/badge/index.vue'),
  267. path: 'text',
  268. meta: {
  269. badge: '10',
  270. icon: 'lucide:square-dot',
  271. title: $t('page.demos.badge.text'),
  272. },
  273. },
  274. {
  275. name: 'BadgeColorDemo',
  276. component: () => import('#/views/demos/badge/index.vue'),
  277. path: 'color',
  278. meta: {
  279. badge: 'Hot',
  280. badgeVariants: 'destructive',
  281. icon: 'lucide:square-dot',
  282. title: $t('page.demos.badge.color'),
  283. },
  284. },
  285. ],
  286. },
  287. // 外部链接
  288. {
  289. meta: {
  290. icon: 'ic:round-settings-input-composite',
  291. title: $t('page.demos.outside.title'),
  292. },
  293. name: 'Outside',
  294. path: 'outside',
  295. redirect: '/demos/outside/iframe',
  296. children: [
  297. {
  298. name: 'iframe',
  299. path: 'iframe',
  300. meta: {
  301. icon: 'mdi:newspaper-variant-outline',
  302. title: $t('page.demos.outside.embedded'),
  303. },
  304. redirect: '/demos/outside/iframe/vue-document',
  305. children: [
  306. {
  307. name: 'VueDocument',
  308. path: 'vue-document',
  309. component: IFrameView,
  310. meta: {
  311. icon: 'logos:vue',
  312. iframeSrc: 'https://cn.vuejs.org/',
  313. keepAlive: true,
  314. title: 'Vue',
  315. },
  316. },
  317. {
  318. name: 'Tailwindcss',
  319. path: 'tailwindcss',
  320. component: IFrameView,
  321. meta: {
  322. icon: 'devicon:tailwindcss',
  323. iframeSrc: 'https://tailwindcss.com/',
  324. // keepAlive: true,
  325. title: 'Tailwindcss',
  326. },
  327. },
  328. ],
  329. },
  330. {
  331. name: 'ExternalLink',
  332. path: 'external-link',
  333. meta: {
  334. icon: 'mdi:newspaper-variant-multiple-outline',
  335. title: $t('page.demos.outside.externalLink'),
  336. },
  337. redirect: '/demos/outside/external-link/vite',
  338. children: [
  339. {
  340. name: 'Vite',
  341. path: 'vite',
  342. component: IFrameView,
  343. meta: {
  344. icon: 'logos:vitejs',
  345. link: 'https://vitejs.dev/',
  346. title: 'Vite',
  347. },
  348. },
  349. {
  350. name: 'VueUse',
  351. path: 'vue-use',
  352. component: IFrameView,
  353. meta: {
  354. icon: 'logos:vueuse',
  355. link: 'https://vueuse.org',
  356. title: 'VueUse',
  357. },
  358. },
  359. ],
  360. },
  361. ],
  362. },
  363. // 嵌套菜单
  364. {
  365. meta: {
  366. icon: 'ic:round-menu',
  367. title: $t('page.demos.nested.title'),
  368. },
  369. name: 'Nested',
  370. path: 'nested',
  371. redirect: '/demos/nested/menu1',
  372. children: [
  373. {
  374. name: 'Menu1',
  375. path: 'menu1',
  376. component: () => import('#/views/demos/nested/menu-1.vue'),
  377. meta: {
  378. icon: 'ic:round-menu',
  379. keepAlive: true,
  380. title: $t('page.demos.nested.menu1'),
  381. },
  382. },
  383. {
  384. name: 'Menu2',
  385. path: 'menu2',
  386. meta: {
  387. icon: 'ic:round-menu',
  388. keepAlive: true,
  389. title: $t('page.demos.nested.menu2'),
  390. },
  391. redirect: '/demos/nested/menu2/menu2-1',
  392. children: [
  393. {
  394. name: 'Menu21',
  395. path: 'menu2-1',
  396. component: () => import('#/views/demos/nested/menu-2-1.vue'),
  397. meta: {
  398. icon: 'ic:round-menu',
  399. keepAlive: true,
  400. title: $t('page.demos.nested.menu2_1'),
  401. },
  402. },
  403. ],
  404. },
  405. {
  406. name: 'Menu3',
  407. path: 'menu3',
  408. meta: {
  409. icon: 'ic:round-menu',
  410. title: $t('page.demos.nested.menu3'),
  411. },
  412. redirect: '/demos/nested/menu3/menu3-1',
  413. children: [
  414. {
  415. name: 'Menu31',
  416. path: 'menu3-1',
  417. component: () => import('#/views/demos/nested/menu-3-1.vue'),
  418. meta: {
  419. icon: 'ic:round-menu',
  420. keepAlive: true,
  421. title: $t('page.demos.nested.menu3_1'),
  422. },
  423. },
  424. {
  425. name: 'Menu32',
  426. path: 'menu3-2',
  427. meta: {
  428. icon: 'ic:round-menu',
  429. title: $t('page.demos.nested.menu3_2'),
  430. },
  431. redirect: '/demos/nested/menu3/menu3-2/menu3-2-1',
  432. children: [
  433. {
  434. name: 'Menu321',
  435. path: 'menu3-2-1',
  436. component: () =>
  437. import('#/views/demos/nested/menu-3-2-1.vue'),
  438. meta: {
  439. icon: 'ic:round-menu',
  440. keepAlive: true,
  441. title: $t('page.demos.nested.menu3_2_1'),
  442. },
  443. },
  444. ],
  445. },
  446. ],
  447. },
  448. ],
  449. },
  450. ],
  451. },
  452. ];
  453. export default routes;