diff --git a/package.json b/package.json
index a48c4db..171f007 100644
--- a/package.json
+++ b/package.json
@@ -9,9 +9,11 @@
"preview": "vite preview"
},
"dependencies": {
+ "naive-ui": "^2.39.0",
"vue": "^3.4.35"
},
"devDependencies": {
+ "@types/node": "^22.1.0",
"@vitejs/plugin-vue": "^5.1.2",
"typescript": "^5.5.3",
"vite": "^5.4.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b222ea5..3f4d689 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,19 +8,25 @@ importers:
.:
dependencies:
+ naive-ui:
+ specifier: ^2.39.0
+ version: 2.39.0(vue@3.4.37(typescript@5.5.4))
vue:
specifier: ^3.4.35
version: 3.4.37(typescript@5.5.4)
devDependencies:
+ '@types/node':
+ specifier: ^22.1.0
+ version: 22.1.0
'@vitejs/plugin-vue':
specifier: ^5.1.2
- version: 5.1.2(vite@5.4.0)(vue@3.4.37(typescript@5.5.4))
+ version: 5.1.2(vite@5.4.0(@types/node@22.1.0))(vue@3.4.37(typescript@5.5.4))
typescript:
specifier: ^5.5.3
version: 5.5.4
vite:
specifier: ^5.4.0
- version: 5.4.0
+ version: 5.4.0(@types/node@22.1.0)
vue-tsc:
specifier: ^2.0.29
version: 2.0.29(typescript@5.5.4)
@@ -40,10 +46,27 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
+ '@babel/runtime@7.25.0':
+ resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/types@7.25.2':
resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==}
engines: {node: '>=6.9.0'}
+ '@css-render/plugin-bem@0.15.14':
+ resolution: {integrity: sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==}
+ peerDependencies:
+ css-render: ~0.15.14
+
+ '@css-render/vue3-ssr@0.15.14':
+ resolution: {integrity: sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==}
+ peerDependencies:
+ vue: ^3.0.11
+
+ '@emotion/hash@0.8.0':
+ resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
+
'@esbuild/aix-ppc64@0.21.5':
resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
engines: {node: '>=12'}
@@ -185,6 +208,9 @@ packages:
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+ '@juggle/resize-observer@3.4.0':
+ resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==}
+
'@rollup/rollup-android-arm-eabi@4.20.0':
resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==}
cpu: [arm]
@@ -277,6 +303,18 @@ packages:
'@types/estree@1.0.5':
resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+ '@types/katex@0.16.7':
+ resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==}
+
+ '@types/lodash-es@4.17.12':
+ resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+
+ '@types/lodash@4.17.7':
+ resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==}
+
+ '@types/node@22.1.0':
+ resolution: {integrity: sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==}
+
'@vitejs/plugin-vue@5.1.2':
resolution: {integrity: sha512-nY9IwH12qeiJqumTCLJLE7IiNx7HZ39cbHaysEUd+Myvbz9KAqd2yq+U01Kab1R/H1BmiyM2ShTYlNH32Fzo3A==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -333,6 +371,9 @@ packages:
'@vue/shared@3.4.37':
resolution: {integrity: sha512-nIh8P2fc3DflG8+5Uw8PT/1i17ccFn0xxN/5oE9RfV5SVnd7G0XEFRwakrnNFE/jlS95fpGXDVG5zDETS26nmg==}
+ async-validator@4.2.5:
+ resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -342,9 +383,24 @@ packages:
computeds@0.0.1:
resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==}
+ css-render@0.15.14:
+ resolution: {integrity: sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==}
+
+ csstype@3.0.11:
+ resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==}
+
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+ date-fns-tz@2.0.1:
+ resolution: {integrity: sha512-fJCG3Pwx8HUoLhkepdsP7Z5RsucUi+ZBOxyM5d0ZZ6c4SdYustq0VMmOu6Wf7bli+yS/Jwp91TOCqn9jMcVrUA==}
+ peerDependencies:
+ date-fns: 2.x
+
+ date-fns@2.30.0:
+ resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
+ engines: {node: '>=0.11'}
+
de-indent@1.0.2:
resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
@@ -360,6 +416,9 @@ packages:
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+ evtd@0.2.4:
+ resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==}
+
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -369,6 +428,16 @@ packages:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
+ highlight.js@11.10.0:
+ resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==}
+ engines: {node: '>=12.0.0'}
+
+ lodash-es@4.17.21:
+ resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
magic-string@0.30.11:
resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
@@ -379,6 +448,11 @@ packages:
muggle-string@0.4.1:
resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+ naive-ui@2.39.0:
+ resolution: {integrity: sha512-5oUJzRG+rtLSH8eRU+fJvVYiQids2BxF9jp+fwGoAqHOptEINrBlgBu9uy+95RHE5FLJ7Q/z41o+qkoGnUrKxQ==}
+ peerDependencies:
+ vue: ^3.0.0
+
nanoid@3.3.7:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -394,11 +468,17 @@ packages:
resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==}
engines: {node: ^10 || ^12 || >=14}
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
rollup@4.20.0:
resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
+ seemly@0.3.8:
+ resolution: {integrity: sha512-MW8Qs6vbzo0pHmDpFSYPna+lwpZ6Zk1ancbajw/7E8TKtHdV+1DfZZD+kKJEhG/cAoB/i+LiT+5msZOqj0DwRA==}
+
semver@7.6.3:
resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
engines: {node: '>=10'}
@@ -412,11 +492,22 @@ packages:
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'}
+ treemate@0.3.11:
+ resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==}
+
typescript@5.5.4:
resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==}
engines: {node: '>=14.17'}
hasBin: true
+ undici-types@6.13.0:
+ resolution: {integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==}
+
+ vdirs@0.1.8:
+ resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==}
+ peerDependencies:
+ vue: ^3.0.11
+
vite@5.4.0:
resolution: {integrity: sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -448,6 +539,11 @@ packages:
terser:
optional: true
+ vooks@0.2.12:
+ resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==}
+ peerDependencies:
+ vue: ^3.0.0
+
vscode-uri@3.0.8:
resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
@@ -465,6 +561,11 @@ packages:
typescript:
optional: true
+ vueuc@0.4.58:
+ resolution: {integrity: sha512-Wnj/N8WbPRSxSt+9ji1jtDHPzda5h2OH/0sFBhvdxDRuyCZbjGg3/cKMaKqEoe+dErTexG2R+i6Q8S/Toq1MYg==}
+ peerDependencies:
+ vue: ^3.0.11
+
snapshots:
'@babel/helper-string-parser@7.24.8': {}
@@ -475,12 +576,26 @@ snapshots:
dependencies:
'@babel/types': 7.25.2
+ '@babel/runtime@7.25.0':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
'@babel/types@7.25.2':
dependencies:
'@babel/helper-string-parser': 7.24.8
'@babel/helper-validator-identifier': 7.24.7
to-fast-properties: 2.0.0
+ '@css-render/plugin-bem@0.15.14(css-render@0.15.14)':
+ dependencies:
+ css-render: 0.15.14
+
+ '@css-render/vue3-ssr@0.15.14(vue@3.4.37(typescript@5.5.4))':
+ dependencies:
+ vue: 3.4.37(typescript@5.5.4)
+
+ '@emotion/hash@0.8.0': {}
+
'@esbuild/aix-ppc64@0.21.5':
optional: true
@@ -552,6 +667,8 @@ snapshots:
'@jridgewell/sourcemap-codec@1.5.0': {}
+ '@juggle/resize-observer@3.4.0': {}
+
'@rollup/rollup-android-arm-eabi@4.20.0':
optional: true
@@ -602,9 +719,21 @@ snapshots:
'@types/estree@1.0.5': {}
- '@vitejs/plugin-vue@5.1.2(vite@5.4.0)(vue@3.4.37(typescript@5.5.4))':
+ '@types/katex@0.16.7': {}
+
+ '@types/lodash-es@4.17.12':
dependencies:
- vite: 5.4.0
+ '@types/lodash': 4.17.7
+
+ '@types/lodash@4.17.7': {}
+
+ '@types/node@22.1.0':
+ dependencies:
+ undici-types: 6.13.0
+
+ '@vitejs/plugin-vue@5.1.2(vite@5.4.0(@types/node@22.1.0))(vue@3.4.37(typescript@5.5.4))':
+ dependencies:
+ vite: 5.4.0(@types/node@22.1.0)
vue: 3.4.37(typescript@5.5.4)
'@volar/language-core@2.4.0-alpha.18':
@@ -691,6 +820,8 @@ snapshots:
'@vue/shared@3.4.37': {}
+ async-validator@4.2.5: {}
+
balanced-match@1.0.2: {}
brace-expansion@2.0.1:
@@ -699,8 +830,23 @@ snapshots:
computeds@0.0.1: {}
+ css-render@0.15.14:
+ dependencies:
+ '@emotion/hash': 0.8.0
+ csstype: 3.0.11
+
+ csstype@3.0.11: {}
+
csstype@3.1.3: {}
+ date-fns-tz@2.0.1(date-fns@2.30.0):
+ dependencies:
+ date-fns: 2.30.0
+
+ date-fns@2.30.0:
+ dependencies:
+ '@babel/runtime': 7.25.0
+
de-indent@1.0.2: {}
entities@5.0.0: {}
@@ -733,11 +879,19 @@ snapshots:
estree-walker@2.0.2: {}
+ evtd@0.2.4: {}
+
fsevents@2.3.3:
optional: true
he@1.2.0: {}
+ highlight.js@11.10.0: {}
+
+ lodash-es@4.17.21: {}
+
+ lodash@4.17.21: {}
+
magic-string@0.30.11:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
@@ -748,6 +902,29 @@ snapshots:
muggle-string@0.4.1: {}
+ naive-ui@2.39.0(vue@3.4.37(typescript@5.5.4)):
+ dependencies:
+ '@css-render/plugin-bem': 0.15.14(css-render@0.15.14)
+ '@css-render/vue3-ssr': 0.15.14(vue@3.4.37(typescript@5.5.4))
+ '@types/katex': 0.16.7
+ '@types/lodash': 4.17.7
+ '@types/lodash-es': 4.17.12
+ async-validator: 4.2.5
+ css-render: 0.15.14
+ csstype: 3.1.3
+ date-fns: 2.30.0
+ date-fns-tz: 2.0.1(date-fns@2.30.0)
+ evtd: 0.2.4
+ highlight.js: 11.10.0
+ lodash: 4.17.21
+ lodash-es: 4.17.21
+ seemly: 0.3.8
+ treemate: 0.3.11
+ vdirs: 0.1.8(vue@3.4.37(typescript@5.5.4))
+ vooks: 0.2.12(vue@3.4.37(typescript@5.5.4))
+ vue: 3.4.37(typescript@5.5.4)
+ vueuc: 0.4.58(vue@3.4.37(typescript@5.5.4))
+
nanoid@3.3.7: {}
path-browserify@1.0.1: {}
@@ -760,6 +937,8 @@ snapshots:
picocolors: 1.0.1
source-map-js: 1.2.0
+ regenerator-runtime@0.14.1: {}
+
rollup@4.20.0:
dependencies:
'@types/estree': 1.0.5
@@ -782,22 +961,39 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.20.0
fsevents: 2.3.3
+ seemly@0.3.8: {}
+
semver@7.6.3: {}
source-map-js@1.2.0: {}
to-fast-properties@2.0.0: {}
+ treemate@0.3.11: {}
+
typescript@5.5.4: {}
- vite@5.4.0:
+ undici-types@6.13.0: {}
+
+ vdirs@0.1.8(vue@3.4.37(typescript@5.5.4)):
+ dependencies:
+ evtd: 0.2.4
+ vue: 3.4.37(typescript@5.5.4)
+
+ vite@5.4.0(@types/node@22.1.0):
dependencies:
esbuild: 0.21.5
postcss: 8.4.41
rollup: 4.20.0
optionalDependencies:
+ '@types/node': 22.1.0
fsevents: 2.3.3
+ vooks@0.2.12(vue@3.4.37(typescript@5.5.4)):
+ dependencies:
+ evtd: 0.2.4
+ vue: 3.4.37(typescript@5.5.4)
+
vscode-uri@3.0.8: {}
vue-tsc@2.0.29(typescript@5.5.4):
@@ -816,3 +1012,14 @@ snapshots:
'@vue/shared': 3.4.37
optionalDependencies:
typescript: 5.5.4
+
+ vueuc@0.4.58(vue@3.4.37(typescript@5.5.4)):
+ dependencies:
+ '@css-render/vue3-ssr': 0.15.14(vue@3.4.37(typescript@5.5.4))
+ '@juggle/resize-observer': 3.4.0
+ css-render: 0.15.14
+ evtd: 0.2.4
+ seemly: 0.3.8
+ vdirs: 0.1.8(vue@3.4.37(typescript@5.5.4))
+ vooks: 0.2.12(vue@3.4.37(typescript@5.5.4))
+ vue: 3.4.37(typescript@5.5.4)
diff --git a/src/App.vue b/src/App.vue
index a4b1cfd..e3ceefa 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,11 +1,20 @@
-
- miao
-
+
+
+ {{ title }}
+
+
+ miao
-
+
diff --git a/src/class/virtualDirectory.ts b/src/class/virtualDirectory.ts
new file mode 100644
index 0000000..fe2684c
--- /dev/null
+++ b/src/class/virtualDirectory.ts
@@ -0,0 +1,51 @@
+import type { stats, file, directory } from '@/types/type.ts'
+
+class VirtualFile {
+ constructor(info: file, parent: VirtualDirectory) {
+ this.name = info.name
+ this.size = info.size
+ this.stats = info.stats
+ this.parent = parent
+ }
+ name: string
+ size: number
+ stats: stats
+ parent: VirtualDirectory
+ get path() {
+ return `${this.parent.path}${this.name}`
+ }
+}
+
+class VirtualDirectory {
+ constructor(info: directory, parent: VirtualDirectory) {
+ this.name = info.name
+ this.type = info.type
+ this.stats = info.stats
+ this.parent = parent ?? undefined
+ // 这里要改
+ this.content = info.content.map((v) => {
+ if (v.type === 'file') {
+ return new VirtualFile(v, this)
+ } else {
+ return new VirtualDirectory(v, this)
+ }
+ })
+ }
+ name: string
+ content: (VirtualFile | VirtualDirectory)[]
+ type: 'directory'
+ stats: stats
+ parent?: VirtualDirectory
+
+ /**
+ * 相对于根目录的路径, 如: "/", "/123/321/"
+ * @returns {string}
+ */
+ get path(): string {
+ if (!this.parent) {
+ return '/'
+ }
+ return `${this.parent.path}${this.name}/`
+ }
+}
+export default VirtualDirectory
diff --git a/src/config.ts b/src/config.ts
new file mode 100644
index 0000000..688b0fa
--- /dev/null
+++ b/src/config.ts
@@ -0,0 +1,3 @@
+export default {
+ baseUrl: 'http://127.0.0.1:17705/'
+}
\ No newline at end of file
diff --git a/src/types/type.ts b/src/types/type.ts
new file mode 100644
index 0000000..afda4f7
--- /dev/null
+++ b/src/types/type.ts
@@ -0,0 +1,21 @@
+export type stats = {
+ atimeMs: number // 上次访问时间(毫秒)
+ birthtimeMs: number // 创建时间(毫秒)
+ ctimeMs: number // 状态更改时间(毫秒)
+ mtimeMs: number // 上次修改时间(毫秒)
+}
+
+export type file = {
+ name: string
+ size: number
+ type: 'file'
+ stats: stats
+}
+
+export type directory = {
+ name: string
+ content: (file | directory)[]
+ type: 'directory'
+ stats: stats
+ parent?: directory
+}
\ No newline at end of file
diff --git a/tsconfig.app.json b/tsconfig.app.json
index c54e602..50d990a 100644
--- a/tsconfig.app.json
+++ b/tsconfig.app.json
@@ -1,24 +1,28 @@
{
- "compilerOptions": {
- "target": "ES2020",
- "useDefineForClassFields": true,
- "module": "ESNext",
- "lib": ["ES2020", "DOM", "DOM.Iterable"],
- "skipLibCheck": true,
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "module": "ESNext",
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "skipLibCheck": true,
- /* Bundler mode */
- "moduleResolution": "bundler",
- "allowImportingTsExtensions": true,
- "isolatedModules": true,
- "moduleDetection": "force",
- "noEmit": true,
- "jsx": "preserve",
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "preserve",
- /* Linting */
- "strict": true,
- "noUnusedLocals": true,
- "noUnusedParameters": true,
- "noFallthroughCasesInSwitch": true
- },
- "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["src/*"]
+ }
+ },
+ "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
}
diff --git a/tsconfig.json b/tsconfig.json
index 1ffef60..f6df6c7 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,7 +1,7 @@
{
- "files": [],
- "references": [
- { "path": "./tsconfig.app.json" },
- { "path": "./tsconfig.node.json" }
- ]
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" }
+ ]
}
diff --git a/vite.config.ts b/vite.config.ts
index 05c1740..a3047ed 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,7 +1,13 @@
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
+import { resolve } from 'path'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [vue()],
+ plugins: [vue()],
+ resolve: {
+ alias: {
+ '@': resolve(__dirname, 'src')
+ }
+ }
})