瀏覽代碼

feat:增加一级侧边菜单

luoy 1 周之前
父節點
當前提交
3e7a935bd5

+ 1 - 0
.env

@@ -6,6 +6,7 @@ VITE_PUBLIC_PATH = /
 
 # 后端请求前缀
 VITE_API_URL = http://192.168.10.101:9999
+# VITE_API_URL = http://192.168.3.17:9999
 
 # OAUTH2 密码模式客户端信息
 VITE_OAUTH2_PASSWORD_CLIENT='pig:pig'

+ 333 - 42
package-lock.json

@@ -15,16 +15,20 @@
 				"@wangeditor-next/editor-for-vue": "5.1.14",
 				"autoprefixer": "10.4.20",
 				"axios": "1.7.9",
+				"chalk": "^5.4.1",
 				"child_process": "^1.0.2",
 				"china-area-data": "^5.0.1",
 				"codemirror": "5.65.18",
 				"crypto-js": "4.2.0",
 				"dayjs": "^1.11.13",
+				"dotenv": "^17.2.1",
 				"driver.js": "1.3.1",
 				"echarts": "5.5.1",
 				"echarts-countries-js": "^1.0.5",
 				"element-plus": "2.8.7",
+				"fs": "0.0.1-security",
 				"js-cookie": "3.0.5",
+				"less": "^4.4.1",
 				"mitt": "3.0.1",
 				"nprogress": "0.2.0",
 				"ora": "^8.2.0",
@@ -36,6 +40,7 @@
 				"sortablejs": "1.15.6",
 				"splitpanes": "3.1.8",
 				"ssh2": "^1.16.0",
+				"ssh2-sftp-client": "^12.0.1",
 				"tailwindcss": "3.4.17",
 				"vue": "3.5.13",
 				"vue-clipboard3": "2.0.0",
@@ -60,7 +65,6 @@
 				"glob": "9.3.5",
 				"pinia-plugin-persist": "1.0.0",
 				"prettier": "3.4.2",
-				"sass": "1.58.3",
 				"terser": "5.36.0",
 				"typescript": "5.6.3",
 				"unplugin-auto-import": "0.18.6",
@@ -2457,8 +2461,7 @@
 		"node_modules/buffer-from": {
 			"version": "1.1.2",
 			"resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
-			"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-			"dev": true
+			"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
 		},
 		"node_modules/buildcheck": {
 			"version": "0.0.6",
@@ -2533,16 +2536,12 @@
 			]
 		},
 		"node_modules/chalk": {
-			"version": "4.1.2",
-			"resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
-			"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-			"dev": true,
-			"dependencies": {
-				"ansi-styles": "^4.1.0",
-				"supports-color": "^7.1.0"
-			},
+			"version": "5.6.0",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz",
+			"integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==",
+			"license": "MIT",
 			"engines": {
-				"node": ">=10"
+				"node": "^12.17.0 || ^14.13 || >=16.0.0"
 			},
 			"funding": {
 				"url": "https://github.com/chalk/chalk?sponsor=1"
@@ -2676,6 +2675,21 @@
 			"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
 			"dev": true
 		},
+		"node_modules/concat-stream": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+			"integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
+			"engines": [
+				"node >= 6.0"
+			],
+			"license": "MIT",
+			"dependencies": {
+				"buffer-from": "^1.0.0",
+				"inherits": "^2.0.3",
+				"readable-stream": "^3.0.2",
+				"typedarray": "^0.0.6"
+			}
+		},
 		"node_modules/confbox": {
 			"version": "0.1.8",
 			"resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz",
@@ -2691,6 +2705,18 @@
 				"node": "^14.18.0 || >=16.10.0"
 			}
 		},
+		"node_modules/copy-anything": {
+			"version": "2.0.6",
+			"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
+			"integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+			"license": "MIT",
+			"dependencies": {
+				"is-what": "^3.14.1"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/mesqueeb"
+			}
+		},
 		"node_modules/cpu-features": {
 			"version": "0.0.10",
 			"resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz",
@@ -2821,6 +2847,18 @@
 			"resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz",
 			"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
 		},
+		"node_modules/dotenv": {
+			"version": "17.2.1",
+			"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.1.tgz",
+			"integrity": "sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==",
+			"license": "BSD-2-Clause",
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://dotenvx.com"
+			}
+		},
 		"node_modules/driver.js": {
 			"version": "1.3.1",
 			"resolved": "https://registry.npmmirror.com/driver.js/-/driver.js-1.3.1.tgz",
@@ -2947,6 +2985,19 @@
 				"url": "https://github.com/fb55/entities?sponsor=1"
 			}
 		},
+		"node_modules/errno": {
+			"version": "0.1.8",
+			"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+			"integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+			"license": "MIT",
+			"optional": true,
+			"dependencies": {
+				"prr": "~1.0.1"
+			},
+			"bin": {
+				"errno": "cli.js"
+			}
+		},
 		"node_modules/es-define-property": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
@@ -3209,6 +3260,23 @@
 				"concat-map": "0.0.1"
 			}
 		},
+		"node_modules/eslint/node_modules/chalk": {
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+			"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+			"dev": true,
+			"license": "MIT",
+			"dependencies": {
+				"ansi-styles": "^4.1.0",
+				"supports-color": "^7.1.0"
+			},
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/chalk?sponsor=1"
+			}
+		},
 		"node_modules/eslint/node_modules/eslint-visitor-keys": {
 			"version": "4.2.0",
 			"resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
@@ -3509,6 +3577,12 @@
 				"url": "https://github.com/sponsors/rawify"
 			}
 		},
+		"node_modules/fs": {
+			"version": "0.0.1-security",
+			"resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
+			"integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==",
+			"license": "ISC"
+		},
 		"node_modules/fs-extra": {
 			"version": "10.1.0",
 			"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
@@ -3676,7 +3750,7 @@
 			"version": "4.2.11",
 			"resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
 			"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
-			"dev": true
+			"devOptional": true
 		},
 		"node_modules/graphemer": {
 			"version": "1.4.0",
@@ -3686,9 +3760,10 @@
 		},
 		"node_modules/has-flag": {
 			"version": "4.0.0",
-			"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
 			"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
 			"dev": true,
+			"license": "MIT",
 			"engines": {
 				"node": ">=8"
 			}
@@ -3715,6 +3790,19 @@
 				"node": ">= 0.4"
 			}
 		},
+		"node_modules/iconv-lite": {
+			"version": "0.6.3",
+			"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+			"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+			"license": "MIT",
+			"optional": true,
+			"dependencies": {
+				"safer-buffer": ">= 2.1.2 < 3.0.0"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
 		"node_modules/ignore": {
 			"version": "5.3.2",
 			"resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz",
@@ -3724,6 +3812,19 @@
 				"node": ">= 4"
 			}
 		},
+		"node_modules/image-size": {
+			"version": "0.5.5",
+			"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+			"integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+			"license": "MIT",
+			"optional": true,
+			"bin": {
+				"image-size": "bin/image-size.js"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
 		"node_modules/immer": {
 			"version": "9.0.21",
 			"resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz",
@@ -3737,7 +3838,9 @@
 			"version": "4.3.7",
 			"resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.7.tgz",
 			"integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==",
-			"dev": true
+			"dev": true,
+			"optional": true,
+			"peer": true
 		},
 		"node_modules/import-fresh": {
 			"version": "3.3.0",
@@ -3764,6 +3867,12 @@
 				"node": ">=0.8.19"
 			}
 		},
+		"node_modules/inherits": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+			"license": "ISC"
+		},
 		"node_modules/is-binary-path": {
 			"version": "2.1.0",
 			"resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -3866,6 +3975,12 @@
 			"resolved": "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz",
 			"integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
 		},
+		"node_modules/is-what": {
+			"version": "3.14.1",
+			"resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
+			"integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+			"license": "MIT"
+		},
 		"node_modules/isexe": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
@@ -3963,6 +4078,32 @@
 				"json-buffer": "3.0.1"
 			}
 		},
+		"node_modules/less": {
+			"version": "4.4.1",
+			"resolved": "https://registry.npmjs.org/less/-/less-4.4.1.tgz",
+			"integrity": "sha512-X9HKyiXPi0f/ed0XhgUlBeFfxrlDP3xR4M7768Zl+WXLUViuL9AOPPJP4nCV0tgRWvTYvpNmN0SFhZOQzy16PA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"copy-anything": "^2.0.1",
+				"parse-node-version": "^1.0.1",
+				"tslib": "^2.3.0"
+			},
+			"bin": {
+				"lessc": "bin/lessc"
+			},
+			"engines": {
+				"node": ">=14"
+			},
+			"optionalDependencies": {
+				"errno": "^0.1.1",
+				"graceful-fs": "^4.1.2",
+				"image-size": "~0.5.0",
+				"make-dir": "^2.1.0",
+				"mime": "^1.4.1",
+				"needle": "^3.1.0",
+				"source-map": "~0.6.0"
+			}
+		},
 		"node_modules/levn": {
 			"version": "0.4.1",
 			"resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz",
@@ -4100,18 +4241,6 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/log-symbols/node_modules/chalk": {
-			"version": "5.4.1",
-			"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
-			"integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
-			"license": "MIT",
-			"engines": {
-				"node": "^12.17.0 || ^14.13 || >=16.0.0"
-			},
-			"funding": {
-				"url": "https://github.com/chalk/chalk?sponsor=1"
-			}
-		},
 		"node_modules/log-symbols/node_modules/is-unicode-supported": {
 			"version": "1.3.0",
 			"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
@@ -4137,6 +4266,40 @@
 				"@jridgewell/sourcemap-codec": "^1.5.0"
 			}
 		},
+		"node_modules/make-dir": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+			"integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+			"license": "MIT",
+			"optional": true,
+			"dependencies": {
+				"pify": "^4.0.1",
+				"semver": "^5.6.0"
+			},
+			"engines": {
+				"node": ">=6"
+			}
+		},
+		"node_modules/make-dir/node_modules/pify": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+			"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+			"license": "MIT",
+			"optional": true,
+			"engines": {
+				"node": ">=6"
+			}
+		},
+		"node_modules/make-dir/node_modules/semver": {
+			"version": "5.7.2",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+			"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+			"license": "ISC",
+			"optional": true,
+			"bin": {
+				"semver": "bin/semver"
+			}
+		},
 		"node_modules/math-intrinsics": {
 			"version": "1.1.0",
 			"resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -4170,6 +4333,19 @@
 				"node": ">=8.6"
 			}
 		},
+		"node_modules/mime": {
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+			"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+			"license": "MIT",
+			"optional": true,
+			"bin": {
+				"mime": "cli.js"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
 		"node_modules/mime-db": {
 			"version": "1.52.0",
 			"resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
@@ -4300,6 +4476,23 @@
 			"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
 			"dev": true
 		},
+		"node_modules/needle": {
+			"version": "3.3.1",
+			"resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz",
+			"integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
+			"license": "MIT",
+			"optional": true,
+			"dependencies": {
+				"iconv-lite": "^0.6.3",
+				"sax": "^1.2.4"
+			},
+			"bin": {
+				"needle": "bin/needle"
+			},
+			"engines": {
+				"node": ">= 4.4.x"
+			}
+		},
 		"node_modules/next-tick": {
 			"version": "1.1.0",
 			"resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz",
@@ -4430,18 +4623,6 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/ora/node_modules/chalk": {
-			"version": "5.4.1",
-			"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
-			"integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
-			"license": "MIT",
-			"engines": {
-				"node": "^12.17.0 || ^14.13 || >=16.0.0"
-			},
-			"funding": {
-				"url": "https://github.com/chalk/chalk?sponsor=1"
-			}
-		},
 		"node_modules/ora/node_modules/emoji-regex": {
 			"version": "10.4.0",
 			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
@@ -4512,6 +4693,15 @@
 				"node": ">=6"
 			}
 		},
+		"node_modules/parse-node-version": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+			"integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.10"
+			}
+		},
 		"node_modules/path-exists": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
@@ -4885,6 +5075,13 @@
 			"resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
 			"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
 		},
+		"node_modules/prr": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+			"integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+			"license": "MIT",
+			"optional": true
+		},
 		"node_modules/punycode": {
 			"version": "2.3.1",
 			"resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
@@ -4935,6 +5132,20 @@
 				"pify": "^2.3.0"
 			}
 		},
+		"node_modules/readable-stream": {
+			"version": "3.6.2",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+			"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+			"license": "MIT",
+			"dependencies": {
+				"inherits": "^2.0.3",
+				"string_decoder": "^1.1.1",
+				"util-deprecate": "^1.0.1"
+			},
+			"engines": {
+				"node": ">= 6"
+			}
+		},
 		"node_modules/readdirp": {
 			"version": "3.6.0",
 			"resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
@@ -5064,6 +5275,26 @@
 				"queue-microtask": "^1.2.2"
 			}
 		},
+		"node_modules/safe-buffer": {
+			"version": "5.2.1",
+			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+			"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/feross"
+				},
+				{
+					"type": "patreon",
+					"url": "https://www.patreon.com/feross"
+				},
+				{
+					"type": "consulting",
+					"url": "https://feross.org/support"
+				}
+			],
+			"license": "MIT"
+		},
 		"node_modules/safer-buffer": {
 			"version": "2.1.2",
 			"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -5072,9 +5303,12 @@
 		},
 		"node_modules/sass": {
 			"version": "1.58.3",
-			"resolved": "https://registry.npmmirror.com/sass/-/sass-1.58.3.tgz",
+			"resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz",
 			"integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==",
 			"dev": true,
+			"license": "MIT",
+			"optional": true,
+			"peer": true,
 			"dependencies": {
 				"chokidar": ">=3.0.0 <4.0.0",
 				"immutable": "^4.0.0",
@@ -5087,6 +5321,13 @@
 				"node": ">=12.0.0"
 			}
 		},
+		"node_modules/sax": {
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
+			"integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+			"license": "ISC",
+			"optional": true
+		},
 		"node_modules/screenfull": {
 			"version": "6.0.2",
 			"resolved": "https://registry.npmmirror.com/screenfull/-/screenfull-6.0.2.tgz",
@@ -5244,7 +5485,7 @@
 			"version": "0.6.1",
 			"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
 			"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-			"dev": true,
+			"devOptional": true,
 			"engines": {
 				"node": ">=0.10.0"
 			}
@@ -5295,6 +5536,23 @@
 				"nan": "^2.20.0"
 			}
 		},
+		"node_modules/ssh2-sftp-client": {
+			"version": "12.0.1",
+			"resolved": "https://registry.npmjs.org/ssh2-sftp-client/-/ssh2-sftp-client-12.0.1.tgz",
+			"integrity": "sha512-ICJ1L2PmBel2Q2ctbyxzTFZCPKSHYYD6s2TFZv7NXmZDrDNGk8lHBb/SK2WgXLMXNANH78qoumeJzxlWZqSqWg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"concat-stream": "^2.0.0",
+				"ssh2": "^1.16.0"
+			},
+			"engines": {
+				"node": ">=18.20.4"
+			},
+			"funding": {
+				"type": "individual",
+				"url": "https://square.link/u/4g7sPflL"
+			}
+		},
 		"node_modules/stdin-discarder": {
 			"version": "0.2.2",
 			"resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz",
@@ -5307,6 +5565,15 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
+		"node_modules/string_decoder": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+			"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+			"license": "MIT",
+			"dependencies": {
+				"safe-buffer": "~5.2.0"
+			}
+		},
 		"node_modules/string-width": {
 			"version": "5.1.2",
 			"resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz",
@@ -5469,9 +5736,10 @@
 		},
 		"node_modules/supports-color": {
 			"version": "7.2.0",
-			"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
 			"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
 			"dev": true,
+			"license": "MIT",
 			"dependencies": {
 				"has-flag": "^4.0.0"
 			},
@@ -5653,6 +5921,12 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
+		"node_modules/typedarray": {
+			"version": "0.0.6",
+			"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+			"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+			"license": "MIT"
+		},
 		"node_modules/typescript": {
 			"version": "5.6.3",
 			"resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.6.3.tgz",
@@ -5930,6 +6204,23 @@
 				"vite": ">=2.0.0"
 			}
 		},
+		"node_modules/vite-plugin-compression/node_modules/chalk": {
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+			"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+			"dev": true,
+			"license": "MIT",
+			"dependencies": {
+				"ansi-styles": "^4.1.0",
+				"supports-color": "^7.1.0"
+			},
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/chalk?sponsor=1"
+			}
+		},
 		"node_modules/vite-plugin-top-level-await": {
 			"version": "1.4.4",
 			"resolved": "https://registry.npmmirror.com/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.4.4.tgz",

+ 1 - 1
package.json

@@ -35,6 +35,7 @@
 		"element-plus": "2.8.7",
 		"fs": "0.0.1-security",
 		"js-cookie": "3.0.5",
+		"less": "^4.4.1",
 		"mitt": "3.0.1",
 		"nprogress": "0.2.0",
 		"ora": "^8.2.0",
@@ -71,7 +72,6 @@
 		"glob": "9.3.5",
 		"pinia-plugin-persist": "1.0.0",
 		"prettier": "3.4.2",
-		"sass": "1.58.3",
 		"terser": "5.36.0",
 		"typescript": "5.6.3",
 		"unplugin-auto-import": "0.18.6",

+ 8 - 2
src/layout/navMenu/horizontal.vue

@@ -3,7 +3,13 @@
 		<el-scrollbar @wheel.native.prevent="onElMenuHorizontalScroll" ref="elMenuHorizontalScrollRef">
 			<el-menu router :default-active="state.defaultActive" :ellipsis="false" background-color="transparent" mode="horizontal">
 				<template v-for="val in menuLists">
-					<el-sub-menu :index="val.path" v-if="val.children && val.children.length > 0" :key="val.path">
+					<el-menu-item v-if="val.children && val.children.length > 0" :index="val.path" :key="val.path">
+						<template #title>
+							<SvgIcon :name="val.meta.icon" />
+							{{ other.setMenuI18n(val) }}
+						</template>
+					</el-menu-item>
+					<!-- <el-sub-menu :index="val.path" v-else-if="val.children && val.children.length > 0" :key="val.path">
 						<template #title>
 							<navIcon v-if="val.path == '/marketing'" :val=val style="margin-right: 8px;" />
 							<navIcon v-else-if="val.path == '/system'" :val=val style="margin-right: 8px;" />
@@ -11,7 +17,7 @@
 							<span>{{ other.setMenuI18n(val) }}</span>
 						</template>
 						<SubItem :chil="val.children" />
-					</el-sub-menu>
+					</el-sub-menu> -->
 					<template v-else>
 						<el-menu-item :index="val.path" :key="val.path">
 							<template #title v-if="!val.meta.isLink || (val.meta.isLink && val.meta.isIframe)">

+ 37 - 4
src/layout/routerView/parent.vue

@@ -1,17 +1,18 @@
 <template>
-	<div class="layout-parent">
+	<div class="layout-parent" style="display: flex;flex-direction: row">
+		<Vertical v-if="isShowLeftMenu" :menuList="menuLeftList" />
 		<router-view v-slot="{ Component }">
 			<transition :name="setTransitionName" mode="out-in">
 				<keep-alive>
-					<component :is="Component" :key="state.refreshRouterViewKey" class="w100" v-show="!isIframePage" v-if="route.meta.isKeepAlive" />
+					<component :is="Component" :key="state.refreshRouterViewKey" :class="isShowLeftMenu ? 'w100vh-210' : 'w100'" v-show="!isIframePage" v-if="route.meta.isKeepAlive" />
 				</keep-alive>
 			</transition>
 			<transition :name="setTransitionName" mode="out-in">
-				<component :is="Component" :key="state.refreshRouterViewKey" class="w100" v-show="!isIframePage" v-if="!route.meta.isKeepAlive" />
+				<component :is="Component" :key="state.refreshRouterViewKey" :class="isShowLeftMenu ? 'w100vh-210' : 'w100'" v-show="!isIframePage" v-if="!route.meta.isKeepAlive" />
 			</transition>
 		</router-view>
 		<transition :name="setTransitionName" mode="out-in">
-			<Iframes class="w100" v-show="isIframePage" :refreshKey="state.iframeRefreshKey" :name="setTransitionName" :list="state.iframeList" />
+			<Iframes :class="isShowLeftMenu ? 'w100vh-210' : 'w100'" v-show="isIframePage" :refreshKey="state.iframeRefreshKey" :name="setTransitionName" :list="state.iframeList" />
 		</transition>
 	</div>
 </template>
@@ -21,9 +22,14 @@ import { useKeepALiveNames } from '/@/stores/keepAliveNames';
 import { useThemeConfig } from '/@/stores/themeConfig';
 import { Session } from '/@/utils/storage';
 import mittBus from '/@/utils/mitt';
+import { useRoutesList } from '/@/stores/routesList';
+import other from '/@/utils/other';
+const routeStores = useRoutesList();
+console.log(routeStores.routesList, 'routeStores.routesList');
 
 // 引入组件
 const Iframes = defineAsyncComponent(() => import('/@/layout/routerView/iframes.vue'));
+const Vertical = defineAsyncComponent(() => import('/@/layout/navMenu/vertical.vue'));
 
 // 定义变量内容
 const route = useRoute();
@@ -38,6 +44,15 @@ const state = reactive<ParentViewState>({
 	keepAliveNameList: [],
 	iframeList: [],
 });
+const menuLeftList = computed(() => { 
+	const parentName = route.path.split('/')[1];
+	const parentRoute = routeStores.routesList.filter((item: RouteItem) => item.path.includes(parentName));
+	return parentRoute[0].children || [];
+});
+console.log(other.isMobile(), '移动');
+const isShowLeftMenu = computed(() => {
+	return !other.isMobile() && menuLeftList.value.length > 0;
+});
 
 // 设置主界面切换动画
 const setTransitionName = computed(() => {
@@ -100,3 +115,21 @@ watch(
 	}
 );
 </script>
+<style lang="scss" scoped>
+	.w100vh-210 {
+		width: calc(100vw - 210px);
+		left: 210px !important;
+	}
+	.el-menu--vertical {
+		width: 210px !important;
+		height: calc(100vh - 95px) !important;
+		border: 1px solid #DDE4ED !important;
+		// margin-top: -30px;
+		margin: 5px 0;
+		background-color: #fff;
+		:deep(.el-menu-item), :deep(.el-sub-menu__title) {
+			color: #646464 !important;
+		}
+	}
+
+</style>

+ 1 - 2
src/router/backEnd.ts

@@ -136,7 +136,7 @@ export function backEndComponent(routes: any) {
 			item.component = dynamicImport(dynamicViewsModules, item.path.split('/:')[0]);
 		}
 		item.children && backEndComponent(item.children);
-		if (item.children) {
+		if (item.children && !['/count/index'].includes(item.path)) {
 			item.redirect = item.children[0].path;
 		}
 		return item;
@@ -151,7 +151,6 @@ export function backEndComponent(routes: any) {
  */
 export function dynamicImport(dynamicViewsModules: Record<string, Function>, component: string) {
 	const keys = Object.keys(dynamicViewsModules);
-
 	const matchKeys = keys.filter((key) => {
 		const k = key.replace(/..\/views|../, '');
 		return k.startsWith(`${component}.vue`) || k.startsWith(`/${component}.vue`);

+ 6 - 0
src/router/index.ts

@@ -60,6 +60,7 @@ export function formatTwoStageRoutes(arr: any) {
 	if (arr.length <= 0) return false;
 	const newArr: any = [];
 	const cacheList: Array<string> = [];
+	// console.log('abcd', arr);
 	arr.forEach((v: any) => {
 		if (v.path === '/') {
 			newArr.push({ component: v.component, name: v.name, path: v.path, redirect: v.redirect, meta: v.meta, children: [] });
@@ -69,6 +70,9 @@ export function formatTwoStageRoutes(arr: any) {
 				v.meta['isDynamic'] = true;
 				v.meta['isDynamicPath'] = v.path;
 			}
+			// if (v.path.indexOf('SE') > -1) {
+			// 	v.meta['isAside'] = true;
+			// }
 			newArr[0].children.push({ ...v });
 			// 存 name 值,keep-alive 中 include 使用,实现路由的缓存
 			// 路径:/@/layout/routerView/parent.vue
@@ -79,6 +83,7 @@ export function formatTwoStageRoutes(arr: any) {
 			}
 		}
 	});
+	console.log(newArr);
 	return newArr;
 }
 
@@ -87,6 +92,7 @@ router.beforeEach(async (to, from, next) => {
 	NProgress.configure({ showSpinner: false });
 	if (to.name) NProgress.start();
 	const token = Session.getToken();
+	// console.log(to.meta, 'to.meta');
 	if (to.meta.isAuth !== undefined && !to.meta.isAuth) {
 		next();
 		NProgress.done();

+ 12 - 0
src/views/count/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <!-- <Vertical :menuList="[routeStores.routesList.find(item => item.path === '/count/index')]" /> -->
+   <div>123</div>
+</template>
+
+<script lang="ts" setup>
+import { useRoutesList } from '/@/stores/routesList';
+const routeStores = useRoutesList();
+console.log(routeStores);
+// 引入组件
+const Vertical = defineAsyncComponent(() => import('/@/layout/navMenu/vertical.vue'));
+</script>

+ 7 - 0
src/views/count/main/trend/index.vue

@@ -0,0 +1,7 @@
+<template>
+   <div>trend</div>
+</template>
+
+<script lang="ts" setup>
+
+</script>

+ 7 - 0
src/views/count/user/adduser/index.vue

@@ -0,0 +1,7 @@
+<template>
+   <div>adduser</div>
+</template>
+
+<script lang="ts" setup>
+
+</script>