From 11be4d032c5b1b40d8fe91baa7f838595e081937 Mon Sep 17 00:00:00 2001
From: pqdong <40668796+pq-dong@users.noreply.github.com>
Date: Wed, 30 Apr 2025 16:21:02 +0800
Subject: [PATCH] =?UTF-8?q?ADD=EF=BC=9Ause=20token=20for=20check=20permiss?=
 =?UTF-8?q?ion?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 .gitignore          |   3 +-
 components.d.ts     |   1 +
 src/config.ts       |   6 +++
 src/pages/Login.vue | 120 ++++++++++++++++++++++++++++++++++++++++++++
 src/router.ts       |  16 ++++++
 5 files changed, 145 insertions(+), 1 deletion(-)
 create mode 100644 src/pages/Login.vue
diff --git a/.gitignore b/.gitignore
index a3bbd943..f6132c14 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,4 +32,5 @@ coverage
 /playwright-report/
 /playwright/.cache/
 # Webkit with playwright creates a salt file
-salt
\ No newline at end of file
+salt
+package-lock.json
diff --git a/components.d.ts b/components.d.ts
index 3e65c3cc..57c3a65a 100644
--- a/components.d.ts
+++ b/components.d.ts
@@ -118,6 +118,7 @@ declare module '@vue/runtime-core' {
     KeycodeInfo: typeof import('./src/tools/keycode-info/keycode-info.vue')['default']
     ListConverter: typeof import('./src/tools/list-converter/list-converter.vue')['default']
     LocaleSelector: typeof import('./src/modules/i18n/components/locale-selector.vue')['default']
+    Login: typeof import('./src/pages/Login.vue')['default']
     LoremIpsumGenerator: typeof import('./src/tools/lorem-ipsum-generator/lorem-ipsum-generator.vue')['default']
     MacAddressGenerator: typeof import('./src/tools/mac-address-generator/mac-address-generator.vue')['default']
     MacAddressLookup: typeof import('./src/tools/mac-address-lookup/mac-address-lookup.vue')['default']
diff --git a/src/config.ts b/src/config.ts
index fa2421ef..461a89ea 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -27,6 +27,12 @@ export const config = figue({
       default: 'development',
       env: 'VITE_VERCEL_ENV',
     },
+    token: {
+      doc: 'Application token',
+      format: 'string',
+      default: '',
+      env: 'VITE_TOKEN',
+    },
   },
   plausible: {
     isTrackerEnabled: {
diff --git a/src/pages/Login.vue b/src/pages/Login.vue
new file mode 100644
index 00000000..2c271ee6
--- /dev/null
+++ b/src/pages/Login.vue
@@ -0,0 +1,120 @@
+
+
+
+  
+
+
+
diff --git a/src/router.ts b/src/router.ts
index da0c4f1e..8d71ca1d 100644
--- a/src/router.ts
+++ b/src/router.ts
@@ -26,6 +26,11 @@ const router = createRouter({
       name: 'home',
       component: HomePage,
     },
+    {
+      path: '/login',
+      name: 'login',
+      component: () => import('./pages/Login.vue'),
+    },
     {
       path: '/about',
       name: 'about',
@@ -38,4 +43,15 @@ const router = createRouter({
   ],
 });
 
+if (config.app.token){
+  router.beforeEach((to, from, next) => {
+    const isLoggedIn = localStorage.getItem('isLoggedIn') === 'true';
+    if (to.path !== '/login' && !isLoggedIn) {
+      next('/login');
+    } else {
+      next();
+    }
+  });
+}
+
 export default router;