Browse Source

feat: 添加路由守卫,修改目录

Gaokun Wang 1 tuần trước cách đây
mục cha
commit
837e865116

+ 1 - 1
index.html

@@ -2,7 +2,7 @@
 <html>
   <head>
     <meta charset="UTF-8" />
-    <title>测试性用软件</title>
+    <title>测试性用软件</title>
     <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
     <meta
       http-equiv="Content-Security-Policy"

+ 397 - 1
package-lock.json

@@ -18,6 +18,7 @@
         "elkjs": "^0.10.0",
         "mxgraph": "^4.2.2",
         "mxgraph-js": "^1.0.1",
+        "nprogress": "^0.2.0",
         "tailwindcss": "^4.1.10",
         "tdesign-vue-next": "^1.13.2"
       },
@@ -35,6 +36,7 @@
         "eslint-plugin-vue": "^10.0.0",
         "lint-staged": "^16.1.0",
         "prettier": "^3.5.3",
+        "sass-embedded": "^1.89.2",
         "typescript": "^5.8.3",
         "unplugin-auto-import": "^19.3.0",
         "unplugin-vue-components": "^28.7.0",
@@ -329,6 +331,13 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@bufbuild/protobuf": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmmirror.com/@bufbuild/protobuf/-/protobuf-2.5.2.tgz",
+      "integrity": "sha512-foZ7qr0IsUBjzWIq+SuBLfdQCpJ1j8cTuNNT4owngTHoN5KsJb8L9t65fzz7SCeSWzescoOil/0ldqiL041ABg==",
+      "devOptional": true,
+      "license": "(Apache-2.0 AND BSD-3-Clause)"
+    },
     "node_modules/@develar/schema-utils": {
       "version": "2.6.5",
       "resolved": "https://registry.npmmirror.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz",
@@ -3045,6 +3054,13 @@
         "ieee754": "^1.1.13"
       }
     },
+    "node_modules/buffer-builder": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/buffer-builder/-/buffer-builder-0.2.0.tgz",
+      "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==",
+      "devOptional": true,
+      "license": "MIT/X11"
+    },
     "node_modules/buffer-crc32": {
       "version": "0.2.13",
       "resolved": "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
@@ -3563,6 +3579,13 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/colorjs.io": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmmirror.com/colorjs.io/-/colorjs.io-0.5.2.tgz",
+      "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==",
+      "devOptional": true,
+      "license": "MIT"
+    },
     "node_modules/combined-stream": {
       "version": "1.0.8",
       "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -5461,7 +5484,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
+      "devOptional": true,
       "license": "MIT",
       "engines": {
         "node": ">=8"
@@ -5673,6 +5696,13 @@
         "node": ">= 4"
       }
     },
+    "node_modules/immutable": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.3.tgz",
+      "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==",
+      "devOptional": true,
+      "license": "MIT"
+    },
     "node_modules/import-fresh": {
       "version": "3.3.1",
       "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz",
@@ -7466,6 +7496,12 @@
         "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
       }
     },
+    "node_modules/nprogress": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz",
+      "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==",
+      "license": "MIT"
+    },
     "node_modules/nth-check": {
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz",
@@ -8266,6 +8302,23 @@
         "queue-microtask": "^1.2.2"
       }
     },
+    "node_modules/rxjs": {
+      "version": "7.8.2",
+      "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz",
+      "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+      "devOptional": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/rxjs/node_modules/tslib": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+      "devOptional": true,
+      "license": "0BSD"
+    },
     "node_modules/safe-buffer": {
       "version": "5.2.1",
       "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -8304,6 +8357,319 @@
         "truncate-utf8-bytes": "^1.0.0"
       }
     },
+    "node_modules/sass-embedded": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded/-/sass-embedded-1.89.2.tgz",
+      "integrity": "sha512-Ack2K8rc57kCFcYlf3HXpZEJFNUX8xd8DILldksREmYXQkRHI879yy8q4mRDJgrojkySMZqmmmW1NxrFxMsYaA==",
+      "devOptional": true,
+      "license": "MIT",
+      "dependencies": {
+        "@bufbuild/protobuf": "^2.5.0",
+        "buffer-builder": "^0.2.0",
+        "colorjs.io": "^0.5.0",
+        "immutable": "^5.0.2",
+        "rxjs": "^7.4.0",
+        "supports-color": "^8.1.1",
+        "sync-child-process": "^1.0.2",
+        "varint": "^6.0.0"
+      },
+      "bin": {
+        "sass": "dist/bin/sass.js"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      },
+      "optionalDependencies": {
+        "sass-embedded-android-arm": "1.89.2",
+        "sass-embedded-android-arm64": "1.89.2",
+        "sass-embedded-android-riscv64": "1.89.2",
+        "sass-embedded-android-x64": "1.89.2",
+        "sass-embedded-darwin-arm64": "1.89.2",
+        "sass-embedded-darwin-x64": "1.89.2",
+        "sass-embedded-linux-arm": "1.89.2",
+        "sass-embedded-linux-arm64": "1.89.2",
+        "sass-embedded-linux-musl-arm": "1.89.2",
+        "sass-embedded-linux-musl-arm64": "1.89.2",
+        "sass-embedded-linux-musl-riscv64": "1.89.2",
+        "sass-embedded-linux-musl-x64": "1.89.2",
+        "sass-embedded-linux-riscv64": "1.89.2",
+        "sass-embedded-linux-x64": "1.89.2",
+        "sass-embedded-win32-arm64": "1.89.2",
+        "sass-embedded-win32-x64": "1.89.2"
+      }
+    },
+    "node_modules/sass-embedded-android-arm": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.89.2.tgz",
+      "integrity": "sha512-oHAPTboBHRZlDBhyRB6dvDKh4KvFs+DZibDHXbkSI6dBZxMTT+Yb2ivocHnctVGucKTLQeT7+OM5DjWHyynL/A==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-android-arm64": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.89.2.tgz",
+      "integrity": "sha512-+pq7a7AUpItNyPu61sRlP6G2A8pSPpyazASb+8AK2pVlFayCSPAEgpwpCE9A2/Xj86xJZeMizzKUHxM2CBCUxA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-android-riscv64": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.89.2.tgz",
+      "integrity": "sha512-HfJJWp/S6XSYvlGAqNdakeEMPOdhBkj2s2lN6SHnON54rahKem+z9pUbCriUJfM65Z90lakdGuOfidY61R9TYg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-android-x64": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.89.2.tgz",
+      "integrity": "sha512-BGPzq53VH5z5HN8de6jfMqJjnRe1E6sfnCWFd4pK+CAiuM7iw5Fx6BQZu3ikfI1l2GY0y6pRXzsVLdp/j4EKEA==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-darwin-arm64": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.89.2.tgz",
+      "integrity": "sha512-UCm3RL/tzMpG7DsubARsvGUNXC5pgfQvP+RRFJo9XPIi6elopY5B6H4m9dRYDpHA+scjVthdiDwkPYr9+S/KGw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-darwin-x64": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.89.2.tgz",
+      "integrity": "sha512-D9WxtDY5VYtMApXRuhQK9VkPHB8R79NIIR6xxVlN2MIdEid/TZWi1MHNweieETXhWGrKhRKglwnHxxyKdJYMnA==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-arm": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.89.2.tgz",
+      "integrity": "sha512-leP0t5U4r95dc90o8TCWfxNXwMAsQhpWxTkdtySDpngoqtTy3miMd7EYNYd1znI0FN1CBaUvbdCMbnbPwygDlA==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-arm64": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.89.2.tgz",
+      "integrity": "sha512-2N4WW5LLsbtrWUJ7iTpjvhajGIbmDR18ZzYRywHdMLpfdPApuHPMDF5CYzHbS+LLx2UAx7CFKBnj5LLjY6eFgQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-arm": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.89.2.tgz",
+      "integrity": "sha512-Z6gG2FiVEEdxYHRi2sS5VIYBmp17351bWtOCUZ/thBM66+e70yiN6Eyqjz80DjL8haRUegNQgy9ZJqsLAAmr9g==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-arm64": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.89.2.tgz",
+      "integrity": "sha512-nTyuaBX6U1A/cG7WJh0pKD1gY8hbg1m2SnzsyoFG+exQ0lBX/lwTLHq3nyhF+0atv7YYhYKbmfz+sjPP8CZ9lw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-riscv64": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.89.2.tgz",
+      "integrity": "sha512-N6oul+qALO0SwGY8JW7H/Vs0oZIMrRMBM4GqX3AjM/6y8JsJRxkAwnfd0fDyK+aICMFarDqQonQNIx99gdTZqw==",
+      "cpu": [
+        "riscv64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-musl-x64": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.89.2.tgz",
+      "integrity": "sha512-K+FmWcdj/uyP8GiG9foxOCPfb5OAZG0uSVq80DKgVSC0U44AdGjvAvVZkrgFEcZ6cCqlNC2JfYmslB5iqdL7tg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-riscv64": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.89.2.tgz",
+      "integrity": "sha512-g9nTbnD/3yhOaskeqeBQETbtfDQWRgsjHok6bn7DdAuwBsyrR3JlSFyqKc46pn9Xxd9SQQZU8AzM4IR+sY0A0w==",
+      "cpu": [
+        "riscv64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-linux-x64": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.89.2.tgz",
+      "integrity": "sha512-Ax7dKvzncyQzIl4r7012KCMBvJzOz4uwSNoyoM5IV6y5I1f5hEwI25+U4WfuTqdkv42taCMgpjZbh9ERr6JVMQ==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-win32-arm64": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.89.2.tgz",
+      "integrity": "sha512-j96iJni50ZUsfD6tRxDQE2QSYQ2WrfHxeiyAXf41Kw0V4w5KYR/Sf6rCZQLMTUOHnD16qTMVpQi20LQSqf4WGg==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded-win32-x64": {
+      "version": "1.89.2",
+      "resolved": "https://registry.npmmirror.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.89.2.tgz",
+      "integrity": "sha512-cS2j5ljdkQsb4PaORiClaVYynE9OAPZG/XjbOMxpQmjRIf7UroY4PEIH+Waf+y47PfXFX9SyxhYuw2NIKGbEng==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-embedded/node_modules/supports-color": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "devOptional": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
+      }
+    },
     "node_modules/sax": {
       "version": "1.4.1",
       "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.1.tgz",
@@ -8711,6 +9077,29 @@
         "node": ">=8"
       }
     },
+    "node_modules/sync-child-process": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/sync-child-process/-/sync-child-process-1.0.2.tgz",
+      "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==",
+      "devOptional": true,
+      "license": "MIT",
+      "dependencies": {
+        "sync-message-port": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/sync-message-port": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/sync-message-port/-/sync-message-port-1.1.3.tgz",
+      "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==",
+      "devOptional": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
     "node_modules/synckit": {
       "version": "0.11.8",
       "resolved": "https://registry.npmmirror.com/synckit/-/synckit-0.11.8.tgz",
@@ -9375,6 +9764,13 @@
         "node": ">= 0.10"
       }
     },
+    "node_modules/varint": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/varint/-/varint-6.0.0.tgz",
+      "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==",
+      "devOptional": true,
+      "license": "MIT"
+    },
     "node_modules/vite": {
       "version": "6.3.5",
       "resolved": "https://registry.npmmirror.com/vite/-/vite-6.3.5.tgz",

+ 2 - 0
package.json

@@ -30,6 +30,7 @@
     "elkjs": "^0.10.0",
     "mxgraph": "^4.2.2",
     "mxgraph-js": "^1.0.1",
+    "nprogress": "^0.2.0",
     "tailwindcss": "^4.1.10",
     "tdesign-vue-next": "^1.13.2"
   },
@@ -47,6 +48,7 @@
     "eslint-plugin-vue": "^10.0.0",
     "lint-staged": "^16.1.0",
     "prettier": "^3.5.3",
+    "sass-embedded": "^1.89.2",
     "typescript": "^5.8.3",
     "unplugin-auto-import": "^19.3.0",
     "unplugin-vue-components": "^28.7.0",

+ 20 - 3
src/App.vue

@@ -1,7 +1,24 @@
 <template>
-  <router-view v-slot="{ Component }">
-    <component :is="Component" />
-  </router-view>
+    <t-config-provider :global-config="globalConfig">
+      <router-view v-slot="{ Component }">
+        <component :is="Component" />
+      </router-view>
+  </t-config-provider>
 </template>
 <script setup lang="ts">
+import { merge } from 'lodash-es'
+import { GlobalConfigProvider } from 'tdesign-vue-next'
+// 全局配置
+const customConfig: GlobalConfigProvider = {
+  table: {
+    empty: '空数据'
+  },
+  pagination: {
+    itemsPerPage: '{size} 条/页',
+    jumpTo: '总页数',
+    page: '10',
+    total: '共 {total} 条数据'
+  }
+}
+const globalConfig = merge(customConfig)
 </script>

BIN
src/assets/images/404.png


+ 17 - 2
src/assets/style/base.css

@@ -1,6 +1,21 @@
 :root {
-  --ev-c-primary: #005571;
-  --ev-c-dark: #003D4C;
+  --ev-c-primary: #1a73e8;
+  --ev-c-dark: #0d47a1;
+  --ev-c-secondary: #26a69a;
+  --ev-c-background: #f5f7fa;
+  --ev-c-sidebar: #2c3e50;
+  --ev-c-card: #ffffff;
+  --ev-c-text: #333333;
+  --ev-c-text-light: #757575;
+  --ev-c-border: #e0e0e0;
+  --ev-c-success: #4caf50;
+  --ev-c-warning: #ff9800;
+  --ev-c-danger: #f44336;
+  --ev-c-node-start: #4caf50;
+  --ev-c-node-end: #f44336;
+  --ev-c-node-action: #2196f3;
+  --ev-c-node-condition: #ff9800;
+  --ev-c-node-loop: #9c27b0;
 
   --ev-c-white: #ffffff;
   --ev-c-white-soft: #f8f8f8;

+ 1 - 0
src/assets/style/main.css

@@ -1,5 +1,6 @@
 @import "tailwindcss";
 @import './base.css';
+@import 'tdesign-vue-next/es/style/index.css';
 html,
 body,
 #app {

+ 86 - 0
src/layouts/index.vue

@@ -0,0 +1,86 @@
+<template>
+  <div class="app-container">
+    <div class="head-menu">
+      <t-head-menu :default-value="activeMenu">
+        <t-menu-item value="/case" :to="'/case'"> 测试用例 </t-menu-item>
+        <t-menu-item value="/case-list" :to="'/case-list'"> 测试用例列表 </t-menu-item>
+      </t-head-menu>
+    </div>
+    <div class="main-container">
+      <router-view v-slot="{ Component, route }">
+        <transition name="fade">
+          <component :is="Component" :key="route.path" />
+        </transition>
+      </router-view>
+    </div>
+    <div class="status-bar">
+      <div id="version-info">版本: {{ version }}</div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="tsx" name="Layout">
+import { HeadMenuProps } from 'tdesign-vue-next';
+
+const version = ref('v1.0.0')
+const currentRoute = useRoute()
+const activeMenu = computed(() => {
+  const { meta, path } = unref(currentRoute)
+  // 如果设置路径,侧边栏将高亮显示您设置的路径
+  if (meta.activeMenu) {
+    return meta.activeMenu as string
+  }
+  return path
+})
+</script>
+<style lang="scss" scoped>
+.app-container {
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+}
+
+.main-container {
+  position: relative;
+  height: calc(100vh - 90px);
+  overflow-y: auto;
+}
+
+.status-bar {
+  display: flex;
+  justify-content: center;
+  padding: 8px 20px;
+  font-size: 12px;
+  background: linear-gradient(135deg, var(--ev-c-primary), var(--ev-c-dark));
+  color: var(--ev-c-white);
+}
+</style>
+<style>
+.t-head-menu {
+  background: linear-gradient(135deg, var(--ev-c-primary), var(--ev-c-dark));
+}
+
+.t-menu {
+  font-size: 16px;
+  font-weight: 700 !important;
+
+}
+
+.t-menu__item {
+  color: var(--ev-c-white);
+}
+
+.t-menu__item:hover {
+  background-color: rgba(255, 255, 255, 0.15) !important;
+  /* color: var(--ev-c-white); */
+}
+
+.t-menu__item.t-is-active {
+  color: var(--ev-c-white);
+  background-color: rgba(255, 255, 255, 0.2);
+}
+
+.t-menu__content {
+  font-weight: 700 !important;
+}
+</style>

+ 11 - 3
src/main.ts

@@ -2,6 +2,14 @@ import '@/assets/style/main.css'
 import router from "./router";
 import { createApp } from 'vue'
 import App from './App.vue'
-const app = createApp(App)
-app.use(router)
-app.mount('#app')
+import { setupAuthRoutes } from '@/router/before'
+
+// 创建实例
+const setupAll = async () => {
+  const app = createApp(App)
+  app.use(router)
+  app.use(setupAuthRoutes)
+  app.mount('#app')
+}
+
+setupAll()

+ 14 - 0
src/router/before.ts

@@ -0,0 +1,14 @@
+import router from '@/router'
+import  { done, start }  from '@/utils/nprogress'
+const WHITE_LIST = ['/case','/case-list']
+export const setupAuthRoutes = () => {
+  router.beforeEach(async (to, from, next) => {
+    start()
+      if (WHITE_LIST.includes(to.path)) return next()
+      // 重定向登录页面
+      next(`/case`)
+  })
+  router.afterEach(() => {
+    done() // 结束Progress
+  })
+}

+ 29 - 3
src/router/constant-router-map.ts

@@ -1,9 +1,35 @@
 import { RouteRecordRaw } from 'vue-router'
+export const Layout = () => import('@/layouts/index.vue')
 
 const routes: Array<RouteRecordRaw> = [
-    { path: '/:pathMatch(.*)*', component: () => import("@/views/error/404.vue") },
-    { path: '/home', name: '总览', component: () => import('@/views/home/index.vue') },
-    { path: '/', name: 'Demo', component: () => import('@/views/demo/index.vue') }
+  { path: '/:pathMatch(.*)*', component: () => import("@/views/error/404.vue") },
+  { path: '/home', name: '总览', component: () => import('@/views/home/index.vue') },
+  {
+    path: '',
+    component: Layout,
+    meta: {},
+    children: [
+      {
+        path: '/demo',
+        name: 'Demo',
+        meta: {  hidden: false, title: '测试用例'},
+        component: () => import('@/views/demo/index.vue')
+      },
+      {
+        path: '/case',
+        name: 'TestCase',
+        meta: {  hidden: false, title: '测试用例'},
+        component: () => import('@/views/test/index.vue')
+      },
+      {
+        path: '/case-list',
+        name: 'TestCaseList',
+        meta: {  hidden: false, title: '测试用例'},
+        component: () => import('@/views/test/list.vue')
+      }
+    ]
+
+  }
 ]
 
 export default routes

+ 4 - 0
src/types/auto-components.d.ts

@@ -11,5 +11,9 @@ declare module 'vue' {
     RouterLink: typeof import('vue-router')['RouterLink']
     RouterView: typeof import('vue-router')['RouterView']
     TButton: typeof import('tdesign-vue-next')['Button']
+    TConfigProvider: typeof import('tdesign-vue-next')['ConfigProvider']
+    THeadMenu: typeof import('tdesign-vue-next')['HeadMenu']
+    TIcon: typeof import('tdesign-vue-next')['Icon']
+    TMenuItem: typeof import('tdesign-vue-next')['MenuItem']
   }
 }

+ 24 - 0
src/utils/nprogress.ts

@@ -0,0 +1,24 @@
+// /src/utils/nprogress.ts
+import NProgress from 'nprogress';
+import 'nprogress/nprogress.css';
+
+//全局进度条的配置
+NProgress.configure({
+	easing: 'ease', // 动画方式
+	speed: 300, // 递增进度条的速度
+	showSpinner: false, // 是否显示加载ico
+	trickleSpeed: 200, // 自动递增间隔
+	minimum: 0.3, // 更改启动时使用的最小百分比
+	parent: 'body' //指定进度条的父容器
+});
+
+// 打开进度条
+export const start = () => {
+	NProgress.start();
+};
+
+// 关闭进度条
+export const done = () => {
+	NProgress.done();
+};
+

+ 1 - 1
src/views/error/404.vue

@@ -4,7 +4,7 @@
     <div class="flex flex-col">
       <h2>404</h2>
       <h4>抱歉,您访问的页面不存在~😂😂</h4>
-      <!-- <t-button @click="router.back"> 返回上一页 </t-button> -->
+      <t-button @click="router.back"> 返回上一页 </t-button>
     </div>
   </div>
 </template>

+ 9 - 0
src/views/test/index.vue

@@ -0,0 +1,9 @@
+<template>
+  <div>
+    <h1>测试用例</h1>
+    <TButton>{{ text }}</TButton>
+  </div>
+</template>
+<script setup lang="ts">
+const text = ref('TEST')
+</script>

+ 9 - 0
src/views/test/list.vue

@@ -0,0 +1,9 @@
+<template>
+  <div>
+    <h1>测试用例列表</h1>
+    <TButton>{{ text }}</TButton>
+  </div>
+</template>
+<script setup lang="ts">
+const text = ref('测试用例列表')
+</script>