1	import type { AppRouteRecordRaw } from "@/types/router";
2
3	/**
4	 * Static routes that don't require authentication
5	 */
6	export const staticRoutes: AppRouteRecordRaw[] = [
7	  {
8	    path: "/login",
9	    name: "Login",
10	    component: () => import("@/views/login/index.vue"),
11	    meta: {
12	      title: "login.title",
13	      requiresAuth: false,
14	      hidden: true,
15	    },
16	  },
17	  {
18	    path: "/404",
19	    name: "NotFound",
20	    component: () => import("@/views/error/404.vue"),
21	    meta: {
22	      title: "error.404",
23	      requiresAuth: false,
24	      hidden: true,
25	    },
26	  },
27	  {
28	    path: "/403",
29	    name: "Forbidden",
30	    component: () => import("@/views/error/403.vue"),
31	    meta: {
32	      title: "error.403",
33	      requiresAuth: false,
34	      hidden: true,
35	    },
36	  },
37	  {
38	    path: "/500",
39	    name: "ServerError",
40	    component: () => import("@/views/error/500.vue"),
41	    meta: {
42	      title: "error.500",
43	      requiresAuth: false,
44	      hidden: true,
45	    },
46	  },
47	];
48
49	/**
50	 * Basic routes that require authentication
51	 */
52	export const basicRoutes: AppRouteRecordRaw[] = [
53	  {
54	    path: "/",
55	    name: "Root",
56	    redirect: "/dashboard",
57	    component: () => import("@/components/Layout/AdminLayout.vue"),
58	    meta: {
59	      title: "Dashboard",
60	      requiresAuth: true,
61	    },
62	    children: [
63	      {
64	        path: "/redirect/:path(.*)",
65	        name: "Redirect",
66	        component: () => import("@/views/redirect/index.vue"),
67	        meta: {
68	          title: "Redirect",
69	          hidden: true,
70	        },
71	      },
72	      {
73	        path: "dashboard",
74	        name: "Dashboard",
75	        component: () => import("@/views/dashboard/index.vue"),
76	        meta: {
77	          title: "menu.dashboard",
78	          icon: "DashboardOutlined",
79	          requiresAuth: true,
80	          affix: true,
81	          order: 1,
82	        },
83	      },
84	      {
85	        path: "profile",
86	        name: "Profile",
87	        component: () => import("@/views/profile/index.vue"),
88	        meta: {
89	          title: "menu.profile",
90	          icon: "UserOutlined",
91	          requiresAuth: true,
92	          hidden: true,
93	        },
94	      },
95	      {
96	        path: "notifications",
97	        name: "Notifications",
98	        component: () => import("@/views/notification/index.vue"),
99	        meta: {
100	          title: "layout.notifications",
101	          icon: "BellOutlined",
102	          requiresAuth: true,
103	          hidden: true,
104	        },
105	      },
106	      {
107	        path: "about",
108	        name: "About",
109	        component: () => import("@/views/about/index.vue"),
110	        meta: {
111	          title: "menu.about",
112	          icon: "InfoCircleOutlined",
113	          requiresAuth: true,
114	          order: 5,
115	        },
116	      },
117	    ],
118	  },
119	];
120
121	/**
122	 * Async routes that require permission checking
123	 */
124	export const asyncRoutes: AppRouteRecordRaw[] = [
125	  {
126	    path: "/system",
127	    name: "System",
128	    redirect: "/system/user",
129	    component: () => import("@/components/Layout/AdminLayout.vue"),
130	    meta: {
131	      title: "menu.system",
132	      icon: "SettingOutlined",
133	      requiresAuth: true,
134	      order: 2,
135	    },
136	    children: [
137	      {
138	        path: "user",
139	        name: "SystemUser",
140	        component: () => import("@/views/system/user/index.vue"),
141	        meta: {
142	          title: "menu.user",
143	          icon: "UserOutlined",
144	          requiresAuth: true,
145	        },
146	      },
147	      {
148	        path: "role",
149	        name: "SystemRole",
150	        component: () => import("@/views/system/role/index.vue"),
151	        meta: {
152	          title: "menu.role",
153	          icon: "TeamOutlined",
154	          requiresAuth: true,
155	        },
156	      },
157	      {
158	        path: "dept",
159	        name: "SystemDept",
160	        component: () => import("@/views/system/dept/index.vue"),
161	        meta: {
162	          title: "menu.dept",
163	          icon: "ApartmentOutlined",
164	          requiresAuth: true,
165	        },
166	      },
167	      {
168	        path: "menu",
169	        name: "SystemMenu",
170	        component: () => import("@/views/system/menu/index.vue"),
171	        meta: {
172	          title: "menu.menu",
173	          icon: "MenuOutlined",
174	          requiresAuth: true,
175	        },
176	      },
177	      {
178	        path: "permission",
179	        name: "SystemPermission",
180	        component: () => import("@/views/system/permission/index.vue"),
181	        meta: {
182	          title: "menu.permission",
183	          icon: "SafetyCertificateOutlined",
184	          requiresAuth: true,
185	        },
186	      },
187	      {
188	        path: "dict",
189	        name: "SystemDict",
190	        component: () => import("@/views/system/dict/index.vue"),
191	        meta: {
192	          title: "menu.dict",
193	          icon: "BookOutlined",
194	          requiresAuth: true,
195	        },
196	      },
197	    ],
198	  },
199	  {
200	    path: "/asset",
201	    name: "Asset",
202	    redirect: "/asset/device",
203	    component: () => import("@/components/Layout/AdminLayout.vue"),
204	    meta: {
205	      title: "menu.asset",
206	      icon: "HddOutlined",
207	      requiresAuth: true,
208	      order: 3,
209	    },
210	    children: [
211	      {
212	        path: "device",
213	        name: "AssetDevice",
214	        component: () => import("@/views/asset/device/index.vue"),
215	        meta: { title: "menu.assetDevice", icon: "DesktopOutlined", requiresAuth: true },
216	      },
217	      {
218	        path: "license",
219	        name: "AssetLicense",
220	        component: () => import("@/views/asset/license/index.vue"),
221	        meta: { title: "menu.assetLicense", icon: "SafetyOutlined", requiresAuth: true },
222	      },
223	      {
224	        path: "accessory",
225	        name: "AssetAccessory",
226	        component: () => import("@/views/asset/accessory/index.vue"),
227	        meta: { title: "menu.assetAccessory", icon: "ToolOutlined", requiresAuth: true },
228	      },
229	      {
230	        path: "consumable",
231	        name: "AssetConsumable",
232	        component: () => import("@/views/asset/consumable/index.vue"),
233	        meta: { title: "menu.assetConsumable", icon: "ExperimentOutlined", requiresAuth: true },
234	      },
235	      {
236	        path: "depreciation",
237	        name: "AssetDepreciation",
238	        component: () => import("@/views/asset/depreciation/index.vue"),
239	        meta: { title: "menu.assetDepreciation", icon: "ClockCircleOutlined", requiresAuth: true },
240	      },
241	      {
242	        path: "offering",
243	        name: "AssetOffering",
244	        component: () => import("@/views/asset/offering/index.vue"),
245	        meta: { title: "menu.assetOffering", icon: "CloudServerOutlined", requiresAuth: true },
246	      },
247	    ],
248	  },
249	  {
250	    path: "/examples",
251	    name: "Examples",
252	    redirect: "/examples/table",
253	    component: () => import("@/components/Layout/AdminLayout.vue"),
254	    meta: {
255	      title: "menu.examples",
256	      icon: "AppstoreOutlined",
257	      requiresAuth: true,
258	      order: 99,
259	    },
260	    children: [
261	      {
262	        path: "quick-start",
263	        name: "ExamplesQuickStartGroup",
264	        redirect: "/examples/pro-table-advanced",
265	        component: () => import("@/components/RouteView.vue"),
266	        meta: {
267	          title: "menu.examplesQuickStart",
268	          icon: "ThunderboltOutlined",
269	          requiresAuth: true,
270	          order: 1,
271	        },
272	        children: [
273	          {
274	            path: "/examples/pro-table-advanced",
275	            name: "ExamplesProTableAdvanced",
276	            component: () =>
277	              import("@/views/examples/scaffold/pro-table-advanced/index.vue"),
278	            meta: {
279	              title: "menu.proTableAdvanced",
280	              icon: "TableOutlined",
281	              requiresAuth: true,
282	              order: 1,
283	            },
284	          },
285	          {
286	            path: "/examples/complex-form",
287	            name: "ExamplesComplexForm",
288	            component: () =>
289	              import("@/views/examples/scaffold/complex-form/index.vue"),
290	            meta: {
291	              title: "menu.complexForm",
292	              icon: "FormOutlined",
293	              requiresAuth: true,
294	              order: 2,
295	            },
296	          },
297	          {
298	            path: "/examples/master-detail",
299	            name: "ExamplesMasterDetail",
300	            component: () =>
301	              import("@/views/examples/scaffold/master-detail/index.vue"),
302	            meta: {
303	              title: "menu.masterDetail",
304	              icon: "ProfileOutlined",
305	              requiresAuth: true,
306	              order: 3,
307	            },
308	          },
309	          {
310	            path: "/examples/virtual-table",
311	            name: "ExamplesVirtualTable",
312	            component: () =>
313	              import("@/views/examples/scaffold/virtual-table/index.vue"),
314	            meta: {
315	              title: "menu.virtualTable",
316	              icon: "TableOutlined",
317	              requiresAuth: true,
318	              order: 4,
319	            },
320	          },
321	        ],
322	      },
323	      {
324	        path: "form-input",
325	        name: "ExamplesFormInputGroup",
326	        redirect: "/examples/form",
327	        component: () => import("@/components/RouteView.vue"),
328	        meta: {
329	          title: "menu.examplesFormInput",
330	          icon: "FormOutlined",
331	          requiresAuth: true,
332	          order: 2,
333	        },
334	        children: [
335	          {
336	            path: "/examples/form",
337	            name: "ExamplesForm",
338	            component: () => import("@/views/examples/form/index.vue"),
339	            meta: {
340	              title: "menu.form",
341	              icon: "FormOutlined",
342	              requiresAuth: true,
343	              order: 1,
344	            },
345	          },
346	          {
347	            path: "/examples/json-input",
348	            name: "ExamplesJsonInput",
349	            component: () => import("@/views/examples/json-input/index.vue"),
350	            meta: {
351	              title: "menu.jsonInput",
352	              icon: "CodeOutlined",
353	              requiresAuth: true,
354	              order: 2,
355	            },
356	          },
357	          {
358	            path: "/examples/i18n-input",
359	            name: "ExamplesI18nInput",
360	            component: () => import("@/views/examples/i18n-input/index.vue"),
361	            meta: {
362	              title: "menu.i18nInput",
363	              icon: "GlobalOutlined",
364	              requiresAuth: true,
365	              order: 3,
366	            },
367	          },
368	          {
369	            path: "/examples/advanced-filter",
370	            name: "ExamplesAdvancedFilter",
371	            component: () =>
372	              import("@/views/examples/scaffold/advanced-filter/index.vue"),
373	            meta: {
374	              title: "menu.advancedFilter",
375	              icon: "ControlOutlined",
376	              requiresAuth: true,
377	              order: 4,
378	            },
379	          },
380	        ],
381	      },
382	      {
383	        path: "content-editors",
384	        name: "ExamplesContentGroup",
385	        redirect: "/examples/editor",
386	        component: () => import("@/components/RouteView.vue"),
387	        meta: {
388	          title: "menu.examplesContent",
389	          icon: "EditOutlined",
390	          requiresAuth: true,
391	          order: 3,
392	        },
393	        children: [
394	          {
395	            path: "/examples/editor",
396	            name: "ExamplesEditor",
397	            component: () => import("@/views/examples/editor/index.vue"),
398	            meta: {
399	              title: "menu.editor",
400	              icon: "EditOutlined",
401	              requiresAuth: true,
402	              order: 1,
403	            },
404	          },
405	          {
406	            path: "/examples/milkdown",
407	            name: "ExamplesMilkdown",
408	            component: () => import("@/views/examples/milkdown/index.vue"),
409	            meta: {
410	              title: "menu.milkdown",
411	              icon: "FileMarkdownOutlined",
412	              requiresAuth: true,
413	              order: 2,
414	            },
415	          },
416	          {
417	            path: "/examples/code-editor",
418	            name: "ExamplesCodeEditor",
419	            component: () => import("@/views/examples/code-editor/index.vue"),
420	            meta: {
421	              title: "menu.codeEditor",
422	              icon: "CodeOutlined",
423	              requiresAuth: true,
424	              order: 3,
425	            },
426	          },
427	        ],
428	      },
429	      {
430	        path: "basic-interaction",
431	        name: "ExamplesInteractionGroup",
432	        redirect: "/examples/table",
433	        component: () => import("@/components/RouteView.vue"),
434	        meta: {
435	          title: "menu.examplesInteraction",
436	          icon: "AppstoreAddOutlined",
437	          requiresAuth: true,
438	          order: 4,
439	        },
440	        children: [
441	          {
442	            path: "/examples/table",
443	            name: "ExamplesTable",
444	            component: () => import("@/views/examples/table/index.vue"),
445	            meta: {
446	              title: "menu.table",
447	              icon: "TableOutlined",
448	              requiresAuth: true,
449	              order: 1,
450	            },
451	          },
452	          {
453	            path: "/examples/modal",
454	            name: "ExamplesModal",
455	            component: () => import("@/views/examples/modal/index.vue"),
456	            meta: {
457	              title: "menu.modal",
458	              icon: "ExpandOutlined",
459	              requiresAuth: true,
460	              order: 2,
461	            },
462	          },
463	          {
464	            path: "/examples/icon",
465	            name: "ExamplesIcon",
466	            component: () => import("@/views/examples/icon/index.vue"),
467	            meta: {
468	              title: "menu.icon",
469	              icon: "SmileOutlined",
470	              requiresAuth: true,
471	              order: 3,
472	            },
473	          },
474	          {
475	            path: "/examples/spin",
476	            name: "ExamplesSpin",
477	            component: () => import("@/views/examples/spin/index.vue"),
478	            meta: {
479	              title: "menu.spin",
480	              icon: "LoadingOutlined",
481	              requiresAuth: true,
482	              order: 4,
483	            },
484	          },
485	          {
486	            path: "/examples/captcha",
487	            name: "ExamplesCaptcha",
488	            component: () => import("@/views/examples/captcha/index.vue"),
489	            meta: {
490	              title: "menu.captcha",
491	              icon: "SafetyCertificateOutlined",
492	              requiresAuth: true,
493	              order: 5,
494	            },
495	          },
496	          {
497	            path: "/examples/watermark",
498	            name: "ExamplesWatermark",
499	            component: () => import("@/views/examples/watermark/index.vue"),
500	            meta: {
501	              title: "menu.watermark",
502	              icon: "HighlightOutlined",
503	              requiresAuth: true,
504	              order: 6,
505	            },
506	          },
507	          {
508	            path: "/examples/splitter",
509	            name: "ExamplesSplitter",
510	            component: () => import("@/views/examples/splitter/index.vue"),
511	            meta: {
512	              title: "menu.splitter",
513	              icon: "ColumnHeightOutlined",
514	              requiresAuth: true,
515	              order: 7,
516	            },
517	          },
518	          {
519	            path: "/examples/tour",
520	            name: "ExamplesTour",
521	            component: () => import("@/views/examples/tour/index.vue"),
522	            meta: {
523	              title: "menu.tour",
524	              icon: "CompassOutlined",
525	              requiresAuth: true,
526	              order: 8,
527	            },
528	          },
529	          {
530	            path: "/examples/qrcode",
531	            name: "ExamplesQRCode",
532	            component: () => import("@/views/examples/qrcode/index.vue"),
533	            meta: {
534	              title: "menu.qrcode",
535	              icon: "QrcodeOutlined",
536	              requiresAuth: true,
537	              order: 9,
538	            },
539	          },
540	          {
541	            path: "/examples/segmented",
542	            name: "ExamplesSegmented",
543	            component: () => import("@/views/examples/segmented/index.vue"),
544	            meta: {
545	              title: "menu.segmented",
546	              icon: "AppstoreOutlined",
547	              requiresAuth: true,
548	              order: 10,
549	            },
550	          },
551	          {
552	            path: "/examples/color-picker",
553	            name: "ExamplesColorPicker",
554	            component: () => import("@/views/examples/color-picker/index.vue"),
555	            meta: {
556	              title: "menu.colorPicker",
557	              icon: "BgColorsOutlined",
558	              requiresAuth: true,
559	              order: 11,
560	            },
561	          },
562	        ],
563	      },
564	      {
565	        path: "business-scaffold",
566	        name: "ExamplesBusinessScaffoldGroup",
567	        redirect: "/examples/upload-system",
568	        component: () => import("@/components/RouteView.vue"),
569	        meta: {
570	          title: "menu.examplesBusinessScaffold",
571	          icon: "ProfileOutlined",
572	          requiresAuth: true,
573	          order: 5,
574	        },
575	        children: [
576	          {
577	            path: "/examples/upload-system",
578	            name: "ExamplesUploadSystem",
579	            component: () =>
580	              import("@/views/examples/scaffold/upload-system/index.vue"),
581	            meta: {
582	              title: "menu.uploadSystem",
583	              icon: "CloudUploadOutlined",
584	              requiresAuth: true,
585	              order: 1,
586	            },
587	          },
588	          {
589	            path: "/examples/state-cache",
590	            name: "ExamplesStateCache",
591	            component: () =>
592	              import("@/views/examples/scaffold/state-cache/index.vue"),
593	            meta: {
594	              title: "menu.stateCache",
595	              icon: "DatabaseOutlined",
596	              requiresAuth: true,
597	              order: 2,
598	            },
599	          },
600	          {
601	            path: "/examples/import-export",
602	            name: "ExamplesImportExport",
603	            component: () =>
604	              import("@/views/examples/scaffold/import-export/index.vue"),
605	            meta: {
606	              title: "menu.importExport",
607	              icon: "FileTextOutlined",
608	              requiresAuth: true,
609	              order: 3,
610	            },
611	          },
612	        ],
613	      },
614	      {
615	        path: "security-engineering",
616	        name: "ExamplesSecurityEngineeringGroup",
617	        redirect: "/examples/request-auth",
618	        component: () => import("@/components/RouteView.vue"),
619	        meta: {
620	          title: "menu.examplesSecurityEngineering",
621	          icon: "SafetyOutlined",
622	          requiresAuth: true,
623	          order: 6,
624	        },
625	        children: [
626	          {
627	            path: "/examples/request-auth",
628	            name: "ExamplesRequestAuth",
629	            component: () =>
630	              import("@/views/examples/scaffold/request-auth/index.vue"),
631	            meta: {
632	              title: "menu.requestAuth",
633	              icon: "SafetyOutlined",
634	              requiresAuth: true,
635	              order: 1,
636	            },
637	          },
638	          {
639	            path: "/examples/rbac-flow",
640	            name: "ExamplesRbacFlow",
641	            component: () => import("@/views/examples/scaffold/rbac/index.vue"),
642	            meta: {
643	              title: "menu.rbacFlow",
644	              icon: "SafetyCertificateOutlined",
645	              requiresAuth: true,
646	              order: 2,
647	            },
648	          },
649	          {
650	            path: "/examples/observability",
651	            name: "ExamplesObservability",
652	            component: () =>
653	              import("@/views/examples/scaffold/observability/index.vue"),
654	            meta: {
655	              title: "menu.observability",
656	              icon: "LineChartOutlined",
657	              requiresAuth: true,
658	              order: 3,
659	            },
660	          },
661	          {
662	            path: "/examples/testing",
663	            name: "ExamplesTesting",
664	            component: () =>
665	              import("@/views/examples/scaffold/testing/index.vue"),
666	            meta: {
667	              title: "menu.testing",
668	              icon: "CheckCircleOutlined",
669	              requiresAuth: true,
670	              order: 4,
671	            },
672	          },
673	        ],
674	      },
675	      {
676	        path: "integration-navigation",
677	        name: "ExamplesIntegrationGroup",
678	        redirect: "/examples/external/iframe/typescript",
679	        component: () => import("@/components/RouteView.vue"),
680	        meta: {
681	          title: "menu.examplesIntegration",
682	          icon: "LinkOutlined",
683	          requiresAuth: true,
684	          order: 7,
685	        },
686	        children: [
687	          {
688	            path: "iframe",
689	            name: "ExamplesExternalIframe",
690	            redirect: "/examples/external/iframe/typescript",
691	            component: () => import("@/components/RouteView.vue"),
692	            meta: {
693	              title: "menu.externalIframe",
694	              icon: "AppstoreAddOutlined",
695	              requiresAuth: true,
696	              order: 1,
697	            },
698	            children: [
699	              {
700	                path: "/examples/external/iframe/typescript",
701	                name: "ExamplesExternalIframeTypescript",
702	                component: () =>
703	                  import("@/views/examples/external/iframe/typescript.vue"),
704	                meta: {
705	                  title: "menu.externalTypescript",
706	                  icon: "CodeOutlined",
707	                  requiresAuth: true,
708	                  order: 1,
709	                },
710	              },
711	              {
712	                path: "/examples/external/iframe/antdv-next",
713	                name: "ExamplesExternalIframeAntdvNext",
714	                component: () =>
715	                  import("@/views/examples/external/iframe/antdv-next.vue"),
716	                meta: {
717	                  title: "menu.externalAntdvNext",
718	                  icon: "AntDesignOutlined",
719	                  requiresAuth: true,
720	                  order: 2,
721	                },
722	              },
723	            ],
724	          },
725	          {
726	            path: "link",
727	            name: "ExamplesExternalLink",
728	            component: () => import("@/components/RouteView.vue"),
729	            meta: {
730	              title: "menu.externalLink",
731	              icon: "LinkOutlined",
732	              requiresAuth: true,
733	              order: 2,
734	            },
735	            children: [
736	              {
737	                path: "/examples/external/link/vite",
738	                name: "ExamplesExternalLinkVite",
739	                component: () =>
740	                  import("@/views/examples/external/link/vite.vue"),
741	                meta: {
742	                  title: "menu.externalVite",
743	                  icon: "ThunderboltOutlined",
744	                  requiresAuth: true,
745	                  externalLink: "https://vite.dev",
746	                  order: 1,
747	                },
748	              },
749	              {
750	                path: "/examples/external/link/vue",
751	                name: "ExamplesExternalLinkVue",
752	                component: () =>
753	                  import("@/views/examples/external/link/vue.vue"),
754	                meta: {
755	                  title: "menu.externalVue",
756	                  icon: "CoffeeOutlined",
757	                  requiresAuth: true,
758	                  externalLink: "https://vuejs.org",
759	                  order: 2,
760	                },
761	              },
762	            ],
763	          },
764	        ],
765	      },
766	      {
767	        path: "exception-pages",
768	        name: "ExamplesExceptionGroup",
769	        redirect: "/examples/exception/403",
770	        component: () => import("@/components/RouteView.vue"),
771	        meta: {
772	          title: "menu.examplesExceptionPages",
773	          icon: "WarningOutlined",
774	          requiresAuth: true,
775	          order: 8,
776	        },
777	        children: [
778	          {
779	            path: "/examples/exception/403",
780	            name: "ExamplesException403",
781	            component: () => import("@/views/examples/exception/403.vue"),
782	            meta: {
783	              title: "menu.exception403",
784	              icon: "StopOutlined",
785	              requiresAuth: true,
786	              order: 1,
787	            },
788	          },
789	          {
790	            path: "/examples/exception/404",
791	            name: "ExamplesException404",
792	            component: () => import("@/views/examples/exception/404.vue"),
793	            meta: {
794	              title: "menu.exception404",
795	              icon: "FileUnknownOutlined",
796	              requiresAuth: true,
797	              order: 2,
798	            },
799	          },
800	          {
801	            path: "/examples/exception/500",
802	            name: "ExamplesException500",
803	            component: () => import("@/views/examples/exception/500.vue"),
804	            meta: {
805	              title: "menu.exception500",
806	              icon: "BugOutlined",
807	              requiresAuth: true,
808	              order: 3,
809	            },
810	          },
811	        ],
812	      },
813	    ],
814	  },
815	];
816
817	/**
818	 * Catch-all route
819	 */
820	export const notFoundRoute: AppRouteRecordRaw = {
821	  path: "/:pathMatch(.*)*",
822	  name: "NotFoundCatchAll",
823	  redirect: "/404",
824	  meta: {
825	    title: "Not Found",
826	    requiresAuth: false,
827	    hidden: true,
828	  },
829	};
830

import type { AppRouteRecordRaw } from "@/types/router";

/**
 * Static routes that don't require authentication
 */
export const staticRoutes: AppRouteRecordRaw[] = [
  {
    path: "/login",
    name: "Login",
    component: () => import("@/views/login/index.vue"),
    meta: {
      title: "login.title",
      requiresAuth: false,
      hidden: true,
    },
  },
  {
    path: "/404",
    name: "NotFound",
    component: () => import("@/views/error/404.vue"),
    meta: {
      title: "error.404",
      requiresAuth: false,
      hidden: true,
    },
  },
  {
    path: "/403",
    name: "Forbidden",
    component: () => import("@/views/error/403.vue"),
    meta: {
      title: "error.403",
      requiresAuth: false,
      hidden: true,
    },
  },
  {
    path: "/500",
    name: "ServerError",
    component: () => import("@/views/error/500.vue"),
    meta: {
      title: "error.500",
      requiresAuth: false,
      hidden: true,
    },
  },
];

/**
 * Basic routes that require authentication
 */
export const basicRoutes: AppRouteRecordRaw[] = [
  {
    path: "/",
    name: "Root",
    redirect: "/dashboard",
    component: () => import("@/components/Layout/AdminLayout.vue"),
    meta: {
      title: "Dashboard",
      requiresAuth: true,
    },
    children: [
      {
        path: "/redirect/:path(.*)",
        name: "Redirect",
        component: () => import("@/views/redirect/index.vue"),
        meta: {
          title: "Redirect",
          hidden: true,
        },
      },
      {
        path: "dashboard",
        name: "Dashboard",
        component: () => import("@/views/dashboard/index.vue"),
        meta: {
          title: "menu.dashboard",
          icon: "DashboardOutlined",
          requiresAuth: true,
          affix: true,
          order: 1,
        },
      },
      {
        path: "profile",
        name: "Profile",
        component: () => import("@/views/profile/index.vue"),
        meta: {
          title: "menu.profile",
          icon: "UserOutlined",
          requiresAuth: true,
          hidden: true,
        },
      },
      {
        path: "notifications",
        name: "Notifications",
        component: () => import("@/views/notification/index.vue"),
        meta: {
          title: "layout.notifications",
          icon: "BellOutlined",
          requiresAuth: true,
          hidden: true,
        },
      },
      {
        path: "about",
        name: "About",
        component: () => import("@/views/about/index.vue"),
        meta: {
          title: "menu.about",
          icon: "InfoCircleOutlined",
          requiresAuth: true,
          order: 5,
        },
      },
    ],
  },
];

/**
 * Async routes that require permission checking
 */
export const asyncRoutes: AppRouteRecordRaw[] = [
  {
    path: "/system",
    name: "System",
    redirect: "/system/user",
    component: () => import("@/components/Layout/AdminLayout.vue"),
    meta: {
      title: "menu.system",
      icon: "SettingOutlined",
      requiresAuth: true,
      order: 2,
    },
    children: [
      {
        path: "user",
        name: "SystemUser",
        component: () => import("@/views/system/user/index.vue"),
        meta: {
          title: "menu.user",
          icon: "UserOutlined",
          requiresAuth: true,
        },
      },
      {
        path: "role",
        name: "SystemRole",
        component: () => import("@/views/system/role/index.vue"),
        meta: {
          title: "menu.role",
          icon: "TeamOutlined",
          requiresAuth: true,
        },
      },
      {
        path: "dept",
        name: "SystemDept",
        component: () => import("@/views/system/dept/index.vue"),
        meta: {
          title: "menu.dept",
          icon: "ApartmentOutlined",
          requiresAuth: true,
        },
      },
      {
        path: "menu",
        name: "SystemMenu",
        component: () => import("@/views/system/menu/index.vue"),
        meta: {
          title: "menu.menu",
          icon: "MenuOutlined",
          requiresAuth: true,
        },
      },
      {
        path: "permission",
        name: "SystemPermission",
        component: () => import("@/views/system/permission/index.vue"),
        meta: {
          title: "menu.permission",
          icon: "SafetyCertificateOutlined",
          requiresAuth: true,
        },
      },
      {
        path: "dict",
        name: "SystemDict",
        component: () => import("@/views/system/dict/index.vue"),
        meta: {
          title: "menu.dict",
          icon: "BookOutlined",
          requiresAuth: true,
        },
      },
    ],
  },
  {
    path: "/asset",
    name: "Asset",
    redirect: "/asset/device",
    component: () => import("@/components/Layout/AdminLayout.vue"),
    meta: {
      title: "menu.asset",
      icon: "HddOutlined",
      requiresAuth: true,
      order: 3,
    },
    children: [
      {
        path: "device",
        name: "AssetDevice",
        component: () => import("@/views/asset/device/index.vue"),
        meta: { title: "menu.assetDevice", icon: "DesktopOutlined", requiresAuth: true },
      },
      {
        path: "license",
        name: "AssetLicense",
        component: () => import("@/views/asset/license/index.vue"),
        meta: { title: "menu.assetLicense", icon: "SafetyOutlined", requiresAuth: true },
      },
      {
        path: "accessory",
        name: "AssetAccessory",
        component: () => import("@/views/asset/accessory/index.vue"),
        meta: { title: "menu.assetAccessory", icon: "ToolOutlined", requiresAuth: true },
      },
      {
        path: "consumable",
        name: "AssetConsumable",
        component: () => import("@/views/asset/consumable/index.vue"),
        meta: { title: "menu.assetConsumable", icon: "ExperimentOutlined", requiresAuth: true },
      },
      {
        path: "depreciation",
        name: "AssetDepreciation",
        component: () => import("@/views/asset/depreciation/index.vue"),
        meta: { title: "menu.assetDepreciation", icon: "ClockCircleOutlined", requiresAuth: true },
      },
      {
        path: "offering",
        name: "AssetOffering",
        component: () => import("@/views/asset/offering/index.vue"),
        meta: { title: "menu.assetOffering", icon: "CloudServerOutlined", requiresAuth: true },
      },
    ],
  },
  {
    path: "/examples",
    name: "Examples",
    redirect: "/examples/table",
    component: () => import("@/components/Layout/AdminLayout.vue"),
    meta: {
      title: "menu.examples",
      icon: "AppstoreOutlined",
      requiresAuth: true,
      order: 99,
    },
    children: [
      {
        path: "quick-start",
        name: "ExamplesQuickStartGroup",
        redirect: "/examples/pro-table-advanced",
        component: () => import("@/components/RouteView.vue"),
        meta: {
          title: "menu.examplesQuickStart",
          icon: "ThunderboltOutlined",
          requiresAuth: true,
          order: 1,
        },
        children: [
          {
            path: "/examples/pro-table-advanced",
            name: "ExamplesProTableAdvanced",
            component: () =>
              import("@/views/examples/scaffold/pro-table-advanced/index.vue"),
            meta: {
              title: "menu.proTableAdvanced",
              icon: "TableOutlined",
              requiresAuth: true,
              order: 1,
            },
          },
          {
            path: "/examples/complex-form",
            name: "ExamplesComplexForm",
            component: () =>
              import("@/views/examples/scaffold/complex-form/index.vue"),
            meta: {
              title: "menu.complexForm",
              icon: "FormOutlined",
              requiresAuth: true,
              order: 2,
            },
          },
          {
            path: "/examples/master-detail",
            name: "ExamplesMasterDetail",
            component: () =>
              import("@/views/examples/scaffold/master-detail/index.vue"),
            meta: {
              title: "menu.masterDetail",
              icon: "ProfileOutlined",
              requiresAuth: true,
              order: 3,
            },
          },
          {
            path: "/examples/virtual-table",
            name: "ExamplesVirtualTable",
            component: () =>
              import("@/views/examples/scaffold/virtual-table/index.vue"),
            meta: {
              title: "menu.virtualTable",
              icon: "TableOutlined",
              requiresAuth: true,
              order: 4,
            },
          },
        ],
      },
      {
        path: "form-input",
        name: "ExamplesFormInputGroup",
        redirect: "/examples/form",
        component: () => import("@/components/RouteView.vue"),
        meta: {
          title: "menu.examplesFormInput",
          icon: "FormOutlined",
          requiresAuth: true,
          order: 2,
        },
        children: [
          {
            path: "/examples/form",
            name: "ExamplesForm",
            component: () => import("@/views/examples/form/index.vue"),
            meta: {
              title: "menu.form",
              icon: "FormOutlined",
              requiresAuth: true,
              order: 1,
            },
          },
          {
            path: "/examples/json-input",
            name: "ExamplesJsonInput",
            component: () => import("@/views/examples/json-input/index.vue"),
            meta: {
              title: "menu.jsonInput",
              icon: "CodeOutlined",
              requiresAuth: true,
              order: 2,
            },
          },
          {
            path: "/examples/i18n-input",
            name: "ExamplesI18nInput",
            component: () => import("@/views/examples/i18n-input/index.vue"),
            meta: {
              title: "menu.i18nInput",
              icon: "GlobalOutlined",
              requiresAuth: true,
              order: 3,
            },
          },
          {
            path: "/examples/advanced-filter",
            name: "ExamplesAdvancedFilter",
            component: () =>
              import("@/views/examples/scaffold/advanced-filter/index.vue"),
            meta: {
              title: "menu.advancedFilter",
              icon: "ControlOutlined",
              requiresAuth: true,
              order: 4,
            },
          },
        ],
      },
      {
        path: "content-editors",
        name: "ExamplesContentGroup",
        redirect: "/examples/editor",
        component: () => import("@/components/RouteView.vue"),
        meta: {
          title: "menu.examplesContent",
          icon: "EditOutlined",
          requiresAuth: true,
          order: 3,
        },
        children: [
          {
            path: "/examples/editor",
            name: "ExamplesEditor",
            component: () => import("@/views/examples/editor/index.vue"),
            meta: {
              title: "menu.editor",
              icon: "EditOutlined",
              requiresAuth: true,
              order: 1,
            },
          },
          {
            path: "/examples/milkdown",
            name: "ExamplesMilkdown",
            component: () => import("@/views/examples/milkdown/index.vue"),
            meta: {
              title: "menu.milkdown",
              icon: "FileMarkdownOutlined",
              requiresAuth: true,
              order: 2,
            },
          },
          {
            path: "/examples/code-editor",
            name: "ExamplesCodeEditor",
            component: () => import("@/views/examples/code-editor/index.vue"),
            meta: {
              title: "menu.codeEditor",
              icon: "CodeOutlined",
              requiresAuth: true,
              order: 3,
            },
          },
        ],
      },
      {
        path: "basic-interaction",
        name: "ExamplesInteractionGroup",
        redirect: "/examples/table",
        component: () => import("@/components/RouteView.vue"),
        meta: {
          title: "menu.examplesInteraction",
          icon: "AppstoreAddOutlined",
          requiresAuth: true,
          order: 4,
        },
        children: [
          {
            path: "/examples/table",
            name: "ExamplesTable",
            component: () => import("@/views/examples/table/index.vue"),
            meta: {
              title: "menu.table",
              icon: "TableOutlined",
              requiresAuth: true,
              order: 1,
            },
          },
          {
            path: "/examples/modal",
            name: "ExamplesModal",
            component: () => import("@/views/examples/modal/index.vue"),
            meta: {
              title: "menu.modal",
              icon: "ExpandOutlined",
              requiresAuth: true,
              order: 2,
            },
          },
          {
            path: "/examples/icon",
            name: "ExamplesIcon",
            component: () => import("@/views/examples/icon/index.vue"),
            meta: {
              title: "menu.icon",
              icon: "SmileOutlined",
              requiresAuth: true,
              order: 3,
            },
          },
          {
            path: "/examples/spin",
            name: "ExamplesSpin",
            component: () => import("@/views/examples/spin/index.vue"),
            meta: {
              title: "menu.spin",
              icon: "LoadingOutlined",
              requiresAuth: true,
              order: 4,
            },
          },
          {
            path: "/examples/captcha",
            name: "ExamplesCaptcha",
            component: () => import("@/views/examples/captcha/index.vue"),
            meta: {
              title: "menu.captcha",
              icon: "SafetyCertificateOutlined",
              requiresAuth: true,
              order: 5,
            },
          },
          {
            path: "/examples/watermark",
            name: "ExamplesWatermark",
            component: () => import("@/views/examples/watermark/index.vue"),
            meta: {
              title: "menu.watermark",
              icon: "HighlightOutlined",
              requiresAuth: true,
              order: 6,
            },
          },
          {
            path: "/examples/splitter",
            name: "ExamplesSplitter",
            component: () => import("@/views/examples/splitter/index.vue"),
            meta: {
              title: "menu.splitter",
              icon: "ColumnHeightOutlined",
              requiresAuth: true,
              order: 7,
            },
          },
          {
            path: "/examples/tour",
            name: "ExamplesTour",
            component: () => import("@/views/examples/tour/index.vue"),
            meta: {
              title: "menu.tour",
              icon: "CompassOutlined",
              requiresAuth: true,
              order: 8,
            },
          },
          {
            path: "/examples/qrcode",
            name: "ExamplesQRCode",
            component: () => import("@/views/examples/qrcode/index.vue"),
            meta: {
              title: "menu.qrcode",
              icon: "QrcodeOutlined",
              requiresAuth: true,
              order: 9,
            },
          },
          {
            path: "/examples/segmented",
            name: "ExamplesSegmented",
            component: () => import("@/views/examples/segmented/index.vue"),
            meta: {
              title: "menu.segmented",
              icon: "AppstoreOutlined",
              requiresAuth: true,
              order: 10,
            },
          },
          {
            path: "/examples/color-picker",
            name: "ExamplesColorPicker",
            component: () => import("@/views/examples/color-picker/index.vue"),
            meta: {
              title: "menu.colorPicker",
              icon: "BgColorsOutlined",
              requiresAuth: true,
              order: 11,
            },
          },
        ],
      },
      {
        path: "business-scaffold",
        name: "ExamplesBusinessScaffoldGroup",
        redirect: "/examples/upload-system",
        component: () => import("@/components/RouteView.vue"),
        meta: {
          title: "menu.examplesBusinessScaffold",
          icon: "ProfileOutlined",
          requiresAuth: true,
          order: 5,
        },
        children: [
          {
            path: "/examples/upload-system",
            name: "ExamplesUploadSystem",
            component: () =>
              import("@/views/examples/scaffold/upload-system/index.vue"),
            meta: {
              title: "menu.uploadSystem",
              icon: "CloudUploadOutlined",
              requiresAuth: true,
              order: 1,
            },
          },
          {
            path: "/examples/state-cache",
            name: "ExamplesStateCache",
            component: () =>
              import("@/views/examples/scaffold/state-cache/index.vue"),
            meta: {
              title: "menu.stateCache",
              icon: "DatabaseOutlined",
              requiresAuth: true,
              order: 2,
            },
          },
          {
            path: "/examples/import-export",
            name: "ExamplesImportExport",
            component: () =>
              import("@/views/examples/scaffold/import-export/index.vue"),
            meta: {
              title: "menu.importExport",
              icon: "FileTextOutlined",
              requiresAuth: true,
              order: 3,
            },
          },
        ],
      },
      {
        path: "security-engineering",
        name: "ExamplesSecurityEngineeringGroup",
        redirect: "/examples/request-auth",
        component: () => import("@/components/RouteView.vue"),
        meta: {
          title: "menu.examplesSecurityEngineering",
          icon: "SafetyOutlined",
          requiresAuth: true,
          order: 6,
        },
        children: [
          {
            path: "/examples/request-auth",
            name: "ExamplesRequestAuth",
            component: () =>
              import("@/views/examples/scaffold/request-auth/index.vue"),
            meta: {
              title: "menu.requestAuth",
              icon: "SafetyOutlined",
              requiresAuth: true,
              order: 1,
            },
          },
          {
            path: "/examples/rbac-flow",
            name: "ExamplesRbacFlow",
            component: () => import("@/views/examples/scaffold/rbac/index.vue"),
            meta: {
              title: "menu.rbacFlow",
              icon: "SafetyCertificateOutlined",
              requiresAuth: true,
              order: 2,
            },
          },
          {
            path: "/examples/observability",
            name: "ExamplesObservability",
            component: () =>
              import("@/views/examples/scaffold/observability/index.vue"),
            meta: {
              title: "menu.observability",
              icon: "LineChartOutlined",
              requiresAuth: true,
              order: 3,
            },
          },
          {
            path: "/examples/testing",
            name: "ExamplesTesting",
            component: () =>
              import("@/views/examples/scaffold/testing/index.vue"),
            meta: {
              title: "menu.testing",
              icon: "CheckCircleOutlined",
              requiresAuth: true,
              order: 4,
            },
          },
        ],
      },
      {
        path: "integration-navigation",
        name: "ExamplesIntegrationGroup",
        redirect: "/examples/external/iframe/typescript",
        component: () => import("@/components/RouteView.vue"),
        meta: {
          title: "menu.examplesIntegration",
          icon: "LinkOutlined",
          requiresAuth: true,
          order: 7,
        },
        children: [
          {
            path: "iframe",
            name: "ExamplesExternalIframe",
            redirect: "/examples/external/iframe/typescript",
            component: () => import("@/components/RouteView.vue"),
            meta: {
              title: "menu.externalIframe",
              icon: "AppstoreAddOutlined",
              requiresAuth: true,
              order: 1,
            },
            children: [
              {
                path: "/examples/external/iframe/typescript",
                name: "ExamplesExternalIframeTypescript",
                component: () =>
                  import("@/views/examples/external/iframe/typescript.vue"),
                meta: {
                  title: "menu.externalTypescript",
                  icon: "CodeOutlined",
                  requiresAuth: true,
                  order: 1,
                },
              },
              {
                path: "/examples/external/iframe/antdv-next",
                name: "ExamplesExternalIframeAntdvNext",
                component: () =>
                  import("@/views/examples/external/iframe/antdv-next.vue"),
                meta: {
                  title: "menu.externalAntdvNext",
                  icon: "AntDesignOutlined",
                  requiresAuth: true,
                  order: 2,
                },
              },
            ],
          },
          {
            path: "link",
            name: "ExamplesExternalLink",
            component: () => import("@/components/RouteView.vue"),
            meta: {
              title: "menu.externalLink",
              icon: "LinkOutlined",
              requiresAuth: true,
              order: 2,
            },
            children: [
              {
                path: "/examples/external/link/vite",
                name: "ExamplesExternalLinkVite",
                component: () =>
                  import("@/views/examples/external/link/vite.vue"),
                meta: {
                  title: "menu.externalVite",
                  icon: "ThunderboltOutlined",
                  requiresAuth: true,
                  externalLink: "https://vite.dev",
                  order: 1,
                },
              },
              {
                path: "/examples/external/link/vue",
                name: "ExamplesExternalLinkVue",
                component: () =>
                  import("@/views/examples/external/link/vue.vue"),
                meta: {
                  title: "menu.externalVue",
                  icon: "CoffeeOutlined",
                  requiresAuth: true,
                  externalLink: "https://vuejs.org",
                  order: 2,
                },
              },
            ],
          },
        ],
      },
      {
        path: "exception-pages",
        name: "ExamplesExceptionGroup",
        redirect: "/examples/exception/403",
        component: () => import("@/components/RouteView.vue"),
        meta: {
          title: "menu.examplesExceptionPages",
          icon: "WarningOutlined",
          requiresAuth: true,
          order: 8,
        },
        children: [
          {
            path: "/examples/exception/403",
            name: "ExamplesException403",
            component: () => import("@/views/examples/exception/403.vue"),
            meta: {
              title: "menu.exception403",
              icon: "StopOutlined",
              requiresAuth: true,
              order: 1,
            },
          },
          {
            path: "/examples/exception/404",
            name: "ExamplesException404",
            component: () => import("@/views/examples/exception/404.vue"),
            meta: {
              title: "menu.exception404",
              icon: "FileUnknownOutlined",
              requiresAuth: true,
              order: 2,
            },
          },
          {
            path: "/examples/exception/500",
            name: "ExamplesException500",
            component: () => import("@/views/examples/exception/500.vue"),
            meta: {
              title: "menu.exception500",
              icon: "BugOutlined",
              requiresAuth: true,
              order: 3,
            },
          },
        ],
      },
    ],
  },
];

/**
 * Catch-all route
 */
export const notFoundRoute: AppRouteRecordRaw = {
  path: "/:pathMatch(.*)*",
  name: "NotFoundCatchAll",
  redirect: "/404",
  meta: {
    title: "Not Found",
    requiresAuth: false,
    hidden: true,
  },
};


<claude-mem-context>
# Recent Activity

### Feb 11, 2026

| ID   | Time    | T   | Title                                                               | Read |
| ---- | ------- | --- | ------------------------------------------------------------------- | ---- |
| #349 | 5:41 PM | 🔵  | Router Guards with Dynamic Route Generation and Permission Checking | ~589 |
| #347 | "       | 🔵  | Route Structure with Three-Tier Organization                        | ~443 |
| #343 | 5:40 PM | 🔵  | Router Configuration with Guard System                              | ~292 |

</claude-mem-context>

<claude-mem-context>
# Recent Activity

<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->

### Feb 11, 2026

| ID   | Time    | T   | Title                                                               | Read |
| ---- | ------- | --- | ------------------------------------------------------------------- | ---- |
| #349 | 5:41 PM | 🔵  | Router Guards with Dynamic Route Generation and Permission Checking | ~589 |
| #347 | "       | 🔵  | Route Structure with Three-Tier Organization                        | ~443 |
| #343 | 5:40 PM | 🔵  | Router Configuration with Guard System                              | ~292 |

</claude-mem-context>


Let me now read the zh-CN.ts i18n file to understand the pattern for menu translations: