feat: 新增文件管理前端页面初版
| @@ -36,6 +36,7 @@ module.exports = { | ||||
|     }, | ||||
|   }, | ||||
|   rules: { | ||||
|     'import/prefer-default-export': 'off', | ||||
|     'prettier/prettier': 1, | ||||
|     // Vue: Recommended rules to be closed or modify | ||||
|     'vue/require-default-prop': 0, | ||||
|   | ||||
| @@ -48,6 +48,7 @@ | ||||
|     "pinia": "^2.1.7", | ||||
|     "query-string": "^8.1.0", | ||||
|     "sortablejs": "^1.15.0", | ||||
|     "v-viewer": "^1.6.4", | ||||
|     "vue": "^3.3.7", | ||||
|     "vue-codemirror": "^6.1.1", | ||||
|     "vue-cropper": "^1.1.1", | ||||
| @@ -55,7 +56,8 @@ | ||||
|     "vue-i18n": "^9.6.5", | ||||
|     "vue-json-pretty": "^2.2.4", | ||||
|     "vue-router": "^4.2.5", | ||||
|     "vue3-colorpicker": "^2.2.2" | ||||
|     "vue3-colorpicker": "^2.2.2", | ||||
|     "xgplayer": "^3.0.11" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@arco-plugins/vite-vue": "^1.4.5", | ||||
| @@ -87,6 +89,7 @@ | ||||
|     "prettier": "^3.0.3", | ||||
|     "rollup": "^4.3.0", | ||||
|     "rollup-plugin-visualizer": "^5.9.2", | ||||
|     "sass": "^1.69.5", | ||||
|     "stylelint": "^15.11.0", | ||||
|     "stylelint-config-prettier": "^9.0.5", | ||||
|     "stylelint-config-rational-order": "^0.1.2", | ||||
|   | ||||
							
								
								
									
										177
									
								
								continew-admin-ui/pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						| @@ -59,6 +59,9 @@ dependencies: | ||||
|   sortablejs: | ||||
|     specifier: ^1.15.0 | ||||
|     version: 1.15.0 | ||||
|   v-viewer: | ||||
|     specifier: ^1.6.4 | ||||
|     version: 1.6.4 | ||||
|   vue: | ||||
|     specifier: ^3.3.7 | ||||
|     version: 3.3.7(typescript@5.2.2) | ||||
| @@ -83,6 +86,9 @@ dependencies: | ||||
|   vue3-colorpicker: | ||||
|     specifier: ^2.2.2 | ||||
|     version: 2.2.2(@aesoper/normal-utils@0.1.5)(@popperjs/core@2.11.8)(@vueuse/core@10.5.0)(gradient-parser@1.0.2)(lodash-es@4.17.21)(tinycolor2@1.6.0)(vue-types@4.2.1)(vue@3.3.7) | ||||
|   xgplayer: | ||||
|     specifier: ^3.0.11 | ||||
|     version: 3.0.11(core-js@3.34.0) | ||||
|  | ||||
| devDependencies: | ||||
|   '@arco-plugins/vite-vue': | ||||
| @@ -172,6 +178,9 @@ devDependencies: | ||||
|   rollup-plugin-visualizer: | ||||
|     specifier: ^5.9.2 | ||||
|     version: 5.9.2(rollup@4.3.0) | ||||
|   sass: | ||||
|     specifier: ^1.69.5 | ||||
|     version: 1.69.5 | ||||
|   stylelint: | ||||
|     specifier: ^15.11.0 | ||||
|     version: 15.11.0(typescript@5.2.2) | ||||
| @@ -198,7 +207,7 @@ devDependencies: | ||||
|     version: 0.25.2(rollup@4.3.0)(vue@3.3.7) | ||||
|   vite: | ||||
|     specifier: ^4.5.0 | ||||
|     version: 4.5.0(@types/node@18.15.10)(less@4.2.0) | ||||
|     version: 4.5.0(@types/node@18.15.10)(less@4.2.0)(sass@1.69.5) | ||||
|   vite-plugin-compression: | ||||
|     specifier: ^0.5.1 | ||||
|     version: 0.5.1(vite@4.5.0) | ||||
| @@ -1929,7 +1938,7 @@ packages: | ||||
|       '@babel/core': 7.23.2 | ||||
|       '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.2) | ||||
|       '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.23.2) | ||||
|       vite: 4.5.0(@types/node@18.15.10)(less@4.2.0) | ||||
|       vite: 4.5.0(@types/node@18.15.10)(less@4.2.0)(sass@1.69.5) | ||||
|       vue: 3.3.7(typescript@5.2.2) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
| @@ -1942,7 +1951,7 @@ packages: | ||||
|       vite: ^4.0.0 | ||||
|       vue: ^3.2.25 | ||||
|     dependencies: | ||||
|       vite: 4.5.0(@types/node@18.15.10)(less@4.2.0) | ||||
|       vite: 4.5.0(@types/node@18.15.10)(less@4.2.0)(sass@1.69.5) | ||||
|       vue: 3.3.7(typescript@5.2.2) | ||||
|     dev: true | ||||
|  | ||||
| @@ -2230,7 +2239,7 @@ packages: | ||||
|     dev: true | ||||
|  | ||||
|   /anymatch@3.1.3: | ||||
|     resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} | ||||
|     resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, tarball: https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz} | ||||
|     engines: {node: '>= 8'} | ||||
|     dependencies: | ||||
|       normalize-path: 3.0.0 | ||||
| @@ -2501,7 +2510,7 @@ packages: | ||||
|     dev: true | ||||
|  | ||||
|   /binary-extensions@2.2.0: | ||||
|     resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} | ||||
|     resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, tarball: https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz} | ||||
|     engines: {node: '>=8'} | ||||
|     dev: true | ||||
|  | ||||
| @@ -2540,7 +2549,7 @@ packages: | ||||
|     dev: true | ||||
|  | ||||
|   /braces@2.3.2: | ||||
|     resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} | ||||
|     resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==, tarball: https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz} | ||||
|     engines: {node: '>=0.10.0'} | ||||
|     dependencies: | ||||
|       arr-flatten: 1.1.0 | ||||
| @@ -2805,7 +2814,7 @@ packages: | ||||
|     dev: true | ||||
|  | ||||
|   /chokidar@3.5.3: | ||||
|     resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} | ||||
|     resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, tarball: https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz} | ||||
|     engines: {node: '>= 8.10.0'} | ||||
|     dependencies: | ||||
|       anymatch: 3.1.3 | ||||
| @@ -3059,6 +3068,11 @@ packages: | ||||
|       toggle-selection: 1.0.6 | ||||
|     dev: false | ||||
|  | ||||
|   /core-js@3.34.0: | ||||
|     resolution: {integrity: sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==, tarball: https://registry.npmmirror.com/core-js/-/core-js-3.34.0.tgz} | ||||
|     requiresBuild: true | ||||
|     dev: false | ||||
|  | ||||
|   /core-util-is@1.0.3: | ||||
|     resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} | ||||
|     dev: true | ||||
| @@ -3718,6 +3732,13 @@ packages: | ||||
|       d3-zoom: 3.0.0 | ||||
|     dev: false | ||||
|  | ||||
|   /d@1.0.1: | ||||
|     resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, tarball: https://registry.npmmirror.com/d/-/d-1.0.1.tgz} | ||||
|     dependencies: | ||||
|       es5-ext: 0.10.62 | ||||
|       type: 1.2.0 | ||||
|     dev: false | ||||
|  | ||||
|   /dagre-d3@0.6.4: | ||||
|     resolution: {integrity: sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==} | ||||
|     dependencies: | ||||
| @@ -3734,6 +3755,12 @@ packages: | ||||
|       lodash: 4.17.21 | ||||
|     dev: false | ||||
|  | ||||
|   /danmu.js@1.1.13: | ||||
|     resolution: {integrity: sha512-knFd0/cB2HA4FFWiA7eB2suc5vCvoHdqio33FyyCSfP7C+1A+zQcTvnvwfxaZhrxsGj4qaQI2I8XiTqedRaVmg==, tarball: https://registry.npmmirror.com/danmu.js/-/danmu.js-1.1.13.tgz} | ||||
|     dependencies: | ||||
|       event-emitter: 0.3.5 | ||||
|     dev: false | ||||
|  | ||||
|   /dargs@7.0.0: | ||||
|     resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} | ||||
|     engines: {node: '>=8'} | ||||
| @@ -3946,6 +3973,10 @@ packages: | ||||
|       robust-predicates: 3.0.2 | ||||
|     dev: false | ||||
|  | ||||
|   /delegate@3.2.0: | ||||
|     resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==, tarball: https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz} | ||||
|     dev: false | ||||
|  | ||||
|   /dir-glob@2.2.2: | ||||
|     resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} | ||||
|     engines: {node: '>=4'} | ||||
| @@ -4093,6 +4124,10 @@ packages: | ||||
|       pify: 3.0.0 | ||||
|     dev: true | ||||
|  | ||||
|   /downloadjs@1.4.7: | ||||
|     resolution: {integrity: sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q==, tarball: https://registry.npmmirror.com/downloadjs/-/downloadjs-1.4.7.tgz} | ||||
|     dev: false | ||||
|  | ||||
|   /duplexer3@0.1.5: | ||||
|     resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} | ||||
|     dev: true | ||||
| @@ -4287,6 +4322,31 @@ packages: | ||||
|       is-symbol: 1.0.4 | ||||
|     dev: true | ||||
|  | ||||
|   /es5-ext@0.10.62: | ||||
|     resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==, tarball: https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz} | ||||
|     engines: {node: '>=0.10'} | ||||
|     requiresBuild: true | ||||
|     dependencies: | ||||
|       es6-iterator: 2.0.3 | ||||
|       es6-symbol: 3.1.3 | ||||
|       next-tick: 1.1.0 | ||||
|     dev: false | ||||
|  | ||||
|   /es6-iterator@2.0.3: | ||||
|     resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==, tarball: https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz} | ||||
|     dependencies: | ||||
|       d: 1.0.1 | ||||
|       es5-ext: 0.10.62 | ||||
|       es6-symbol: 3.1.3 | ||||
|     dev: false | ||||
|  | ||||
|   /es6-symbol@3.1.3: | ||||
|     resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==, tarball: https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz} | ||||
|     dependencies: | ||||
|       d: 1.0.1 | ||||
|       ext: 1.7.0 | ||||
|     dev: false | ||||
|  | ||||
|   /esbuild-android-64@0.14.54: | ||||
|     resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==, tarball: https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz} | ||||
|     engines: {node: '>=12'} | ||||
| @@ -4811,6 +4871,17 @@ packages: | ||||
|     engines: {node: '>= 0.6'} | ||||
|     dev: true | ||||
|  | ||||
|   /event-emitter@0.3.5: | ||||
|     resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, tarball: https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz} | ||||
|     dependencies: | ||||
|       d: 1.0.1 | ||||
|       es5-ext: 0.10.62 | ||||
|     dev: false | ||||
|  | ||||
|   /eventemitter3@4.0.7: | ||||
|     resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, tarball: https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz} | ||||
|     dev: false | ||||
|  | ||||
|   /eventemitter3@5.0.1: | ||||
|     resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} | ||||
|     dev: true | ||||
| @@ -4955,6 +5026,12 @@ packages: | ||||
|       sort-keys-length: 1.0.1 | ||||
|     dev: true | ||||
|  | ||||
|   /ext@1.7.0: | ||||
|     resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==, tarball: https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz} | ||||
|     dependencies: | ||||
|       type: 2.7.2 | ||||
|     dev: false | ||||
|  | ||||
|   /extend-shallow@2.0.1: | ||||
|     resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} | ||||
|     engines: {node: '>=0.10.0'} | ||||
| @@ -5466,7 +5543,7 @@ packages: | ||||
|     dev: true | ||||
|  | ||||
|   /glob-parent@3.1.0: | ||||
|     resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} | ||||
|     resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==, tarball: https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz} | ||||
|     dependencies: | ||||
|       is-glob: 3.1.0 | ||||
|       path-dirname: 1.0.2 | ||||
| @@ -5970,6 +6047,10 @@ packages: | ||||
|       replace-ext: 1.0.1 | ||||
|     dev: true | ||||
|  | ||||
|   /immutable@4.3.4: | ||||
|     resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==, tarball: https://registry.npmmirror.com/immutable/-/immutable-4.3.4.tgz} | ||||
|     dev: true | ||||
|  | ||||
|   /import-fresh@2.0.0: | ||||
|     resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} | ||||
|     engines: {node: '>=4'} | ||||
| @@ -6117,7 +6198,7 @@ packages: | ||||
|     dev: true | ||||
|  | ||||
|   /is-binary-path@2.1.0: | ||||
|     resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} | ||||
|     resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, tarball: https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz} | ||||
|     engines: {node: '>=8'} | ||||
|     dependencies: | ||||
|       binary-extensions: 2.2.0 | ||||
| @@ -6260,7 +6341,7 @@ packages: | ||||
|     dev: true | ||||
|  | ||||
|   /is-glob@3.1.0: | ||||
|     resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} | ||||
|     resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==, tarball: https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz} | ||||
|     engines: {node: '>=0.10.0'} | ||||
|     dependencies: | ||||
|       is-extglob: 2.1.1 | ||||
| @@ -7428,6 +7509,10 @@ packages: | ||||
|     dev: true | ||||
|     optional: true | ||||
|  | ||||
|   /next-tick@1.1.0: | ||||
|     resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, tarball: https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz} | ||||
|     dev: false | ||||
|  | ||||
|   /nice-try@1.0.5: | ||||
|     resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} | ||||
|     dev: true | ||||
| @@ -8459,7 +8544,7 @@ packages: | ||||
|     dev: true | ||||
|  | ||||
|   /readdirp@3.6.0: | ||||
|     resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} | ||||
|     resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, tarball: https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz} | ||||
|     engines: {node: '>=8.10.0'} | ||||
|     dependencies: | ||||
|       picomatch: 2.3.1 | ||||
| @@ -8807,6 +8892,16 @@ packages: | ||||
|   /safer-buffer@2.1.2: | ||||
|     resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} | ||||
|  | ||||
|   /sass@1.69.5: | ||||
|     resolution: {integrity: sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==, tarball: https://registry.npmmirror.com/sass/-/sass-1.69.5.tgz} | ||||
|     engines: {node: '>=14.0.0'} | ||||
|     hasBin: true | ||||
|     dependencies: | ||||
|       chokidar: 3.5.3 | ||||
|       immutable: 4.3.4 | ||||
|       source-map-js: 1.0.2 | ||||
|     dev: true | ||||
|  | ||||
|   /sax@1.2.4: | ||||
|     resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} | ||||
|     requiresBuild: true | ||||
| @@ -9023,7 +9118,7 @@ packages: | ||||
|     dev: false | ||||
|  | ||||
|   /source-map-js@1.0.2: | ||||
|     resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} | ||||
|     resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, tarball: https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz} | ||||
|     engines: {node: '>=0.10.0'} | ||||
|  | ||||
|   /source-map-resolve@0.5.3: | ||||
| @@ -9723,6 +9818,11 @@ packages: | ||||
|     resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} | ||||
|     dev: true | ||||
|  | ||||
|   /throttle-debounce@2.3.0: | ||||
|     resolution: {integrity: sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==, tarball: https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-2.3.0.tgz} | ||||
|     engines: {node: '>=8'} | ||||
|     dev: false | ||||
|  | ||||
|   /through2@4.0.2: | ||||
|     resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} | ||||
|     dependencies: | ||||
| @@ -9909,6 +10009,14 @@ packages: | ||||
|     engines: {node: '>=10'} | ||||
|     dev: true | ||||
|  | ||||
|   /type@1.2.0: | ||||
|     resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, tarball: https://registry.npmmirror.com/type/-/type-1.2.0.tgz} | ||||
|     dev: false | ||||
|  | ||||
|   /type@2.7.2: | ||||
|     resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, tarball: https://registry.npmmirror.com/type/-/type-2.7.2.tgz} | ||||
|     dev: false | ||||
|  | ||||
|   /typed-array-buffer@1.0.0: | ||||
|     resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} | ||||
|     engines: {node: '>= 0.4'} | ||||
| @@ -10173,6 +10281,14 @@ packages: | ||||
|     hasBin: true | ||||
|     dev: true | ||||
|  | ||||
|   /v-viewer@1.6.4: | ||||
|     resolution: {integrity: sha512-LVkiUHpmsbsZXebeNXnu8krRCi5i2n07FeLFxoIVGhw8lVvTBO0ffpbDC6mLEuacCjrIh09HjIqpciwUtWE8lQ==, tarball: https://registry.npmmirror.com/v-viewer/-/v-viewer-1.6.4.tgz} | ||||
|     engines: {node: '>=4', npm: '>=3'} | ||||
|     dependencies: | ||||
|       throttle-debounce: 2.3.0 | ||||
|       viewerjs: 1.11.6 | ||||
|     dev: false | ||||
|  | ||||
|   /validate-npm-package-license@3.0.4: | ||||
|     resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} | ||||
|     dependencies: | ||||
| @@ -10222,6 +10338,10 @@ packages: | ||||
|       vfile-message: 1.1.1 | ||||
|     dev: true | ||||
|  | ||||
|   /viewerjs@1.11.6: | ||||
|     resolution: {integrity: sha512-TlhdSp2oEOLFXvEp4psKaeTjR5zBjTRcM/sHUN8PkV1UWuY8HKC8n7GaVdW5Xqnwdr/F1OmzLik1QwDjI4w/nw==, tarball: https://registry.npmmirror.com/viewerjs/-/viewerjs-1.11.6.tgz} | ||||
|     dev: false | ||||
|  | ||||
|   /vite-plugin-compression@0.5.1(vite@4.5.0): | ||||
|     resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} | ||||
|     peerDependencies: | ||||
| @@ -10230,7 +10350,7 @@ packages: | ||||
|       chalk: 4.1.2 | ||||
|       debug: 4.3.4 | ||||
|       fs-extra: 10.1.0 | ||||
|       vite: 4.5.0(@types/node@18.15.10)(less@4.2.0) | ||||
|       vite: 4.5.0(@types/node@18.15.10)(less@4.2.0)(sass@1.69.5) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|     dev: true | ||||
| @@ -10245,7 +10365,7 @@ packages: | ||||
|       '@types/eslint': 8.21.3 | ||||
|       eslint: 8.53.0 | ||||
|       rollup: 2.79.1 | ||||
|       vite: 4.5.0(@types/node@18.15.10)(less@4.2.0) | ||||
|       vite: 4.5.0(@types/node@18.15.10)(less@4.2.0)(sass@1.69.5) | ||||
|     dev: true | ||||
|  | ||||
|   /vite-plugin-imagemin@0.6.1(vite@4.5.0): | ||||
| @@ -10276,7 +10396,7 @@ packages: | ||||
|       imagemin-webp: 6.1.0 | ||||
|       jpegtran-bin: 6.0.1 | ||||
|       pathe: 0.2.0 | ||||
|       vite: 4.5.0(@types/node@18.15.10)(less@4.2.0) | ||||
|       vite: 4.5.0(@types/node@18.15.10)(less@4.2.0)(sass@1.69.5) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|     dev: true | ||||
| @@ -10294,7 +10414,7 @@ packages: | ||||
|       pathe: 0.2.0 | ||||
|       svg-baker: 1.7.0 | ||||
|       svgo: 2.8.0 | ||||
|       vite: 4.5.0(@types/node@18.15.10)(less@4.2.0) | ||||
|       vite: 4.5.0(@types/node@18.15.10)(less@4.2.0)(sass@1.69.5) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|     dev: true | ||||
| @@ -10306,7 +10426,7 @@ packages: | ||||
|       svgo: 3.0.2 | ||||
|     dev: true | ||||
|  | ||||
|   /vite@4.5.0(@types/node@18.15.10)(less@4.2.0): | ||||
|   /vite@4.5.0(@types/node@18.15.10)(less@4.2.0)(sass@1.69.5): | ||||
|     resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} | ||||
|     engines: {node: ^14.18.0 || >=16.0.0} | ||||
|     hasBin: true | ||||
| @@ -10339,6 +10459,7 @@ packages: | ||||
|       less: 4.2.0 | ||||
|       postcss: 8.4.31 | ||||
|       rollup: 3.29.4 | ||||
|       sass: 1.69.5 | ||||
|     optionalDependencies: | ||||
|       fsevents: 2.3.2 | ||||
|     dev: true | ||||
| @@ -10630,6 +10751,28 @@ packages: | ||||
|     resolution: {integrity: sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w==} | ||||
|     dev: true | ||||
|  | ||||
|   /xgplayer-subtitles@3.0.11(core-js@3.34.0): | ||||
|     resolution: {integrity: sha512-m/fk9TeeLuwqnryHTqo5SVVS3w9A27hHe7R1HxWQlk5ZZ5H2CxAXn4dv/PU+gI61DWG3sNkjftlq5duHJtdz2g==, tarball: https://registry.npmmirror.com/xgplayer-subtitles/-/xgplayer-subtitles-3.0.11.tgz} | ||||
|     peerDependencies: | ||||
|       core-js: '>=3.12.1' | ||||
|     dependencies: | ||||
|       core-js: 3.34.0 | ||||
|       eventemitter3: 4.0.7 | ||||
|     dev: false | ||||
|  | ||||
|   /xgplayer@3.0.11(core-js@3.34.0): | ||||
|     resolution: {integrity: sha512-n7qpUG46IVjcYWCFq9WLe4OQpIZvtT67lObu6RPgxbMm8IMGCscTVdbWQjRbgrlsvTVfes3zTfjyaymuS5g17g==, tarball: https://registry.npmmirror.com/xgplayer/-/xgplayer-3.0.11.tgz} | ||||
|     peerDependencies: | ||||
|       core-js: '>=3.12.1' | ||||
|     dependencies: | ||||
|       core-js: 3.34.0 | ||||
|       danmu.js: 1.1.13 | ||||
|       delegate: 3.2.0 | ||||
|       downloadjs: 1.4.7 | ||||
|       eventemitter3: 4.0.7 | ||||
|       xgplayer-subtitles: 3.0.11(core-js@3.34.0) | ||||
|     dev: false | ||||
|  | ||||
|   /xml-name-validator@4.0.0: | ||||
|     resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} | ||||
|     engines: {node: '>=12'} | ||||
|   | ||||
							
								
								
									
										24
									
								
								continew-admin-ui/src/api/system/file.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,24 @@ | ||||
| import axios from 'axios'; | ||||
|  | ||||
| const BASE_URL = '/system/file'; | ||||
|  | ||||
| export interface FileItem { | ||||
|   id: string | ||||
|   type: string | ||||
|   name: string | ||||
|   extendName: string | ||||
|   src: string | null | ||||
|   updateTime: string | ||||
|   isDir: boolean | ||||
|   filePath: string | ||||
|   [propName: string]: any // 一个 interface 中任意属性只能有一个 | ||||
| } | ||||
|  | ||||
| interface PageRes<T> { | ||||
|   records: T; | ||||
|   total: number; | ||||
| } | ||||
|  | ||||
| export function getFileList() { | ||||
|   return axios.get<PageRes<FileItem[]>>(`${BASE_URL}/file`); | ||||
| } | ||||
| Before Width: | Height: | Size: 298 B After Width: | Height: | Size: 298 B | 
							
								
								
									
										14
									
								
								continew-admin-ui/src/assets/icons/svg/file-css.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,14 @@ | ||||
| <svg t="1642407662269" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" | ||||
|   p-id="19932" width="200" height="200"> | ||||
|   <path d="M847.872 240.128v688c0 26.56-21.408 48-48 48h-576c-26.56 0-48-21.44-48-48v-832c0-26.592 21.44-48 48-48h432z" | ||||
|     fill="#E9EDED" p-id="19933"></path> | ||||
|   <path d="M160 768.128v160c0 35.456 28.544 64 64 64h576c35.456 0 64-28.544 64-64v-160H160z" fill="#4BBFEB" | ||||
|     p-id="19934"></path> | ||||
|   <path d="M847.872 240.128h-144c-26.56 0-48-21.44-48-48v-144" fill="#4BBFEB" p-id="19935"></path> | ||||
|   <path | ||||
|     d="M432.256 320.128c-35.2 0-64 28.8-64 64v32c0 18.016-14.016 32-32 32a16 16 0 0 0-15.936 12.992 16 16 0 0 0 0 0.064 16 16 0 0 0 4.736 14.56 16 16 0 0 0 2.496 1.92 16 16 0 0 0 4.448 1.92 16 16 0 0 0 3.136 0.48 16 16 0 0 0 1.12 0.064c17.984 0 32 13.984 32 32v32c0 35.2 28.8 64 64 64a16 16 0 1 0 0-32c-18.016 0-32-13.984-32-32v-32c0-19.136-8.736-36.256-22.208-48a63.68 63.68 0 0 0 22.208-48v-32c0-18.016 13.984-32 32-32a16 16 0 1 0 0-32z m157.856 0a16 16 0 0 0 1.632 32c18.016 0 32 13.984 32 32v32c0 19.168 8.736 36.224 22.208 48-13.44 11.744-22.208 28.864-22.208 48v32c0 18.016-13.984 32-32 32a16 16 0 1 0 0 32c35.2 0 64-28.8 64-64v-32c0-18.016 14.016-32 32-32a16 16 0 0 0 10.368-3.616 16 16 0 0 0 1.216-1.152 16 16 0 0 0-11.584-27.232c-17.984 0-32-13.984-32-32v-32c0-35.2-28.8-64-64-64a16 16 0 0 0-1.6 0z" | ||||
|     fill="#4BBFEB" p-id="19936"></path> | ||||
|   <path | ||||
|     d="M334.496 800.128a16 16 0 0 0-3.36 0.672c-41.664 3.712-75.008 37.44-75.008 79.328 0 42.08 33.696 75.904 75.616 79.296a16 16 0 0 0 4.64 0.704h32a16 16 0 1 0 0-32h-29.824c-28.544 0-50.432-21.44-50.432-48s21.888-48 50.432-48h29.568a16 16 0 1 0 0-32h-32a16 16 0 0 0-1.6 0z m128 0a16 16 0 0 0-1.984 0.384c-24.64 1.92-44.384 22.528-44.384 47.616 0 25.28 20.064 46.08 44.992 47.68a16 16 0 0 0 3.008 0.32h32c9.152 0 16 6.848 16 16 0 9.152-6.848 16-16 16h-64a16 16 0 1 0 0 32h64a16 16 0 0 0 3.296-0.384 48.096 48.096 0 0 0 44.704-47.616c0-25.152-19.84-45.888-44.576-47.68a16 16 0 0 0-3.424-0.32h-32a15.616 15.616 0 0 1-16-16c0-9.152 6.848-16 16-16h64a16 16 0 1 0 0-32h-62.88a16 16 0 0 0-1.12 0 16 16 0 0 0-1.6 0z m159.744 0a16 16 0 0 0-1.984 0.384c-24.64 1.92-44.384 22.528-44.384 47.616 0 25.28 20.096 46.08 44.992 47.68a16 16 0 0 0 3.008 0.32h32c9.152 0 16 6.848 16 16 0 9.152-6.848 16-16 16h-64a16 16 0 1 0 0 32h64a16 16 0 0 0 3.328-0.384 48.096 48.096 0 0 0 44.672-47.616c0-25.152-19.84-45.888-44.544-47.68a16 16 0 0 0-3.456-0.32h-32a15.616 15.616 0 0 1-16-16c0-9.152 6.848-16 16-16h64a16 16 0 1 0 0-32h-62.88a16 16 0 0 0-1.12 0 16 16 0 0 0-1.6 0z" | ||||
|     fill="#E9EDED" p-id="19937"></path> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.5 KiB | 
							
								
								
									
										1
									
								
								continew-admin-ui/src/assets/icons/svg/file-dir.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1627885889837" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="17560" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M0 139.636364a46.545455 46.545455 0 0 1 46.545455-46.545455h354.897454a51.2 51.2 0 0 1 47.057455 31.034182L473.6 182.679273 977.454545 182.690909a46.545455 46.545455 0 0 1 46.545455 46.545455v546.909091a46.545455 46.545455 0 0 1-46.545455 46.545454H46.545455a46.545455 46.545455 0 0 1-46.545455-46.545454V139.636364z" fill="#FFA000" p-id="17561"></path><path d="M0 276.945455m46.545455 0l930.90909 0q46.545455 0 46.545455 46.545454l0 558.545455q0 46.545455-46.545455 46.545454l-930.90909 0q-46.545455 0-46.545455-46.545454l0-558.545455q0-46.545455 46.545455-46.545454Z" fill="#FFCA28" p-id="17562"></path></svg> | ||||
| After Width: | Height: | Size: 989 B | 
							
								
								
									
										11
									
								
								continew-admin-ui/src/assets/icons/svg/file-excel.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,11 @@ | ||||
| <svg t="1642407332637" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6055" | ||||
|   width="200" height="200"> | ||||
|   <path | ||||
|     d="M967.111111 281.6V910.222222c0 62.577778-51.2 113.777778-113.777778 113.777778H170.666667c-62.577778 0-113.777778-51.2-113.777778-113.777778V113.777778c0-62.577778 51.2-113.777778 113.777778-113.777778h514.844444L967.111111 281.6z" | ||||
|     fill="#62C558" p-id="6056"></path> | ||||
|   <path d="M685.511111 224.711111V0L967.111111 281.6H742.4c-31.288889 0-56.888889-25.6-56.888889-56.888889" | ||||
|     fill="#2A8121" p-id="6057"></path> | ||||
|   <path | ||||
|     d="M682.666667 724.024889L638.691556 768 341.333333 470.670222 385.308444 426.666667zM454.087111 611.128889l44.088889 44.088889L385.422222 768 341.333333 723.911111zM682.666667 470.755556l-113.066667 113.066666-44.088889-44.088889L638.577778 426.666667z" | ||||
|     fill="#FFFFFF" p-id="6058"></path> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 894 B | 
							
								
								
									
										20
									
								
								continew-admin-ui/src/assets/icons/svg/file-exe.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,20 @@ | ||||
| <svg t="1642408099555" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" | ||||
|   p-id="53361" width="200" height="200"> | ||||
|   <path | ||||
|     d="M967.111111 281.6V910.222222c0 62.862222-50.915556 113.777778-113.777778 113.777778H170.666667c-62.862222 0-113.777778-50.915556-113.777778-113.777778V113.777778c0-62.862222 50.915556-113.777778 113.777778-113.777778h514.844444L967.111111 281.6z" | ||||
|     fill="#BABABA" p-id="53362"></path> | ||||
|   <path d="M685.511111 167.822222V0L967.111111 281.6H799.288889c-62.862222 0-113.777778-50.915556-113.777778-113.777778" | ||||
|     fill="#979797" p-id="53363"></path> | ||||
|   <path | ||||
|     d="M586.865778 521.671111a148.650667 148.650667 0 0 1-3.754667 49.265778l44.629333 22.556444a164.664889 164.664889 0 0 1-10.154666 26.254223l-4.266667 8.448a162.986667 162.986667 0 0 1-15.104 23.751111l-44.657778-22.528a149.048889 149.048889 0 0 1-37.404444 32.312889l15.587555 47.388444a192.910222 192.910222 0 0 1-62.179555 20.48l-15.587556-47.416889a148.053333 148.053333 0 0 1-49.322666-3.783111l-22.528 44.657778a163.612444 163.612444 0 0 1-26.254223-10.154667l-8.448-4.266667a158.350222 158.350222 0 0 1-23.751111-15.132444l22.528-44.600889a147.569778 147.569778 0 0 1-32.312889-37.461333l-47.416888 15.644444a195.868444 195.868444 0 0 1-12.856889-30.264889l-7.594667-31.943111 47.416889-15.616a148.650667 148.650667 0 0 1 3.754667-49.294222l-44.600889-22.528c2.190222-7.452444 4.892444-14.904889 8.078222-21.959111l8.533333-16.952889c3.84-6.769778 8.220444-13.368889 12.885334-19.569778l44.629333 22.528c10.353778-12.515556 23.04-23.608889 37.432889-32.284444l-15.587556-47.416889c9.557333-5.034667 19.626667-9.386667 30.236445-12.885333L410.737778 341.333333l15.587555 47.416889a147.370667 147.370667 0 0 1 49.322667 3.754667l22.528-44.629333c7.452444 2.190222 14.876444 4.920889 21.959111 8.106666l4.266667 2.048 8.504889 4.266667 4.181333 2.275555c6.741333 3.754667 13.368889 8.135111 19.569778 12.828445l-22.528 44.657778a147.911111 147.911111 0 0 1 32.284444 37.404444l47.416889-15.587555a195.527111 195.527111 0 0 1 20.451556 62.179555l-47.416889 15.587556z" | ||||
|     fill="#FFFFFF" p-id="53364"></path> | ||||
|   <path | ||||
|     d="M520.618667 508.984889a84.707556 84.707556 0 1 1-160.938667 52.963555 84.707556 84.707556 0 0 1 160.938667-52.963555" | ||||
|     fill="#BABABA" p-id="53365"></path> | ||||
|   <path | ||||
|     d="M742.371556 771.84c-4.864 6.826667-10.865778 12.743111-17.521778 17.436444l9.557333 23.096889c-3.896889 2.56-8.106667 4.807111-12.401778 6.656l-4.408889 1.792a79.644444 79.644444 0 0 1-13.454222 4.067556l-9.557333-23.096889c-7.992889 1.365333-16.440889 1.422222-24.746667 0l-9.557333 23.04a97.792 97.792 0 0 1-30.208-12.515556l9.557333-23.04a74.524444 74.524444 0 0 1-17.464889-17.521777l-23.096889 9.557333a82.488889 82.488889 0 0 1-6.627555-12.430222l-1.792-4.380445a80.554667 80.554667 0 0 1-4.096-13.454222l23.096889-9.557333a75.264 75.264 0 0 1 0-24.746667l-23.068445-9.557333a98.986667 98.986667 0 0 1 5.006223-15.644445l7.566222-14.592 23.04 9.557334c4.835556-6.826667 10.894222-12.743111 17.521778-17.436445l-9.557334-23.096889c3.271111-2.104889 6.741333-4.039111 10.24-5.688889l8.789334-3.612444c3.640889-1.308444 7.452444-2.389333 11.235555-3.214222l9.557333 23.096889c8.021333-1.365333 16.440889-1.422222 24.718223 0l9.585777-23.068445c5.233778 1.223111 10.496 2.844444 15.644445 5.006222l14.592 7.537778-9.585778 23.04c6.826667 4.892444 12.771556 10.894222 17.436445 17.521778l23.096888-9.528889c2.133333 3.271111 4.067556 6.712889 5.688889 10.24l0.967111 2.161778 1.792 4.380444 0.853334 2.218667c1.336889 3.640889 2.417778 7.480889 3.214222 11.264l-23.096889 9.557333c1.393778 7.964444 1.422222 16.440889 0 24.718223l23.04 9.557333a96 96 0 0 1-12.515555 30.236444l-23.04-9.557333z" | ||||
|     fill="#FFFFFF" p-id="53366"></path> | ||||
|   <path | ||||
|     d="M721.408 745.415111a42.382222 42.382222 0 1 1-78.250667-32.455111 42.382222 42.382222 0 0 1 78.222223 32.426667" | ||||
|     fill="#BABABA" p-id="53367"></path> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 3.8 KiB | 
							
								
								
									
										14
									
								
								continew-admin-ui/src/assets/icons/svg/file-html.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,14 @@ | ||||
| <svg t="1642407647664" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" | ||||
|   p-id="19787" width="200" height="200"> | ||||
|   <path d="M847.872 240.128v688c0 26.56-21.408 48-48 48h-576c-26.56 0-48-21.44-48-48v-832c0-26.592 21.44-48 48-48h432z" | ||||
|     fill="#E9EDED" p-id="19788"></path> | ||||
|   <path d="M160 768.128v160c0 35.456 28.544 64 64 64h576c35.456 0 64-28.544 64-64v-160H160z" fill="#F05542" | ||||
|     p-id="19789"></path> | ||||
|   <path d="M847.872 240.128h-144c-26.56 0-48-21.44-48-48v-144" fill="#F05542" p-id="19790"></path> | ||||
|   <path | ||||
|     d="M432.736 384.064a16 16 0 0 0-10.976 4.8l-96.96 95.776a16 16 0 0 0-0.416 0.416 16 16 0 0 0 1.664 23.808l95.68 94.56a16 16 0 1 0 22.528-22.72l-85.568-84.576 85.568-84.48a16 16 0 0 0-11.52-27.584z m157.824 0a16 16 0 0 0-11.008 27.552l85.504 84.48-85.504 84.576a16 16 0 1 0 22.496 22.752l95.648-94.56a16 16 0 0 0 5.44-17.504 16 16 0 0 0-1.28-2.912 16 16 0 0 0-0.608-1.12 16 16 0 0 0-0.192-0.256 16 16 0 0 0-0.192-0.256 16 16 0 0 0-0.8-0.992 16 16 0 0 0-0.192-0.256 16 16 0 0 0-0.864-0.96 16 16 0 0 0-0.064 0l-0.64-0.544a16 16 0 0 0-0.48-0.512l-95.776-94.688a16 16 0 0 0-11.488-4.8z" | ||||
|     fill="#F05542" p-id="19791"></path> | ||||
|   <path | ||||
|     d="M654.88 799.744a16 16 0 0 0-11.84 6.624L608 853.312l-35.136-46.944-0.128 0.064a16 16 0 0 0-13.056-6.368 16 16 0 0 0-15.744 16.192v127.68a16 16 0 1 0 32 0v-80.128l15.936 21.248a16 16 0 0 0 28.864 4.448l19.2-25.6v80.032a16 16 0 1 0 32 0v-126.816a16 16 0 0 0-15.424-17.376 16 16 0 0 0-1.632 0z m-383.136 0.32a16 16 0 0 0-15.744 16.192V943.936a16 16 0 1 0 32 0v-47.808h64v47.808a16 16 0 1 0 32 0v-61.312a16 16 0 0 0 0-5.12v-61.248a16 16 0 0 0-16.256-16.192 16 16 0 0 0-15.744 16.192v47.872H288v-47.872a16 16 0 0 0-16.256-16.192z m192 0a16 16 0 0 0-1.6 0.064H432a16 16 0 1 0 0 32h16v111.808a16 16 0 1 0 32 0v-111.808h16a16 16 0 1 0 0-32h-30.304a16 16 0 0 0-1.92-0.064z m255.936 0a16 16 0 0 0-15.744 16.192v126.496a16 16 0 0 0 0.64 5.824 16 16 0 0 0 0 0.064 16 16 0 0 0 0.096 0.416 16 16 0 0 0 0.448 1.12 16 16 0 0 0 0.864 1.824 16 16 0 0 0 0.64 0.992 16 16 0 0 0 0.192 0.32 16 16 0 0 0 0.736 0.96 16 16 0 0 0 0.832 0.864 16 16 0 0 0 0.352 0.416 16 16 0 0 0 0.832 0.704 16 16 0 0 0 0.448 0.384 16 16 0 0 0 0.352 0.32 16 16 0 0 0 1.12 0.736 16 16 0 0 0 2.464 1.248 16 16 0 0 0 0.864 0.32 16 16 0 0 0 5.376 0.864h63.552a16 16 0 1 0 0-32h-47.808v-111.872a16 16 0 0 0-16.256-16.192z" | ||||
|     fill="#E9EDED" p-id="19792"></path> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.4 KiB | 
							
								
								
									
										1
									
								
								continew-admin-ui/src/assets/icons/svg/file-image-a.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M26 33l5-6v6h-5zm0 0l-3-4-4 4h7zm11 9H11a2 2 0 01-2-2V8a2 2 0 012-2h21l7 7v27a2 2 0 01-2 2zM17 19h1v1h-1v-1z"/></svg> | ||||
| After Width: | Height: | Size: 202 B | 
| @@ -1 +1,11 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M26 33l5-6v6h-5zm0 0l-3-4-4 4h7zm11 9H11a2 2 0 01-2-2V8a2 2 0 012-2h21l7 7v27a2 2 0 01-2 2zM17 19h1v1h-1v-1z"/></svg> | ||||
| <svg t="1642407370336" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6354" | ||||
|   width="200" height="200"> | ||||
|   <path | ||||
|     d="M952.888889 281.6V910.222222c0 62.862222-50.915556 113.777778-113.777778 113.777778H156.444444c-62.862222 0-113.777778-50.915556-113.777777-113.777778V113.777778c0-62.862222 50.915556-113.777778 113.777777-113.777778h514.844445L952.888889 281.6z" | ||||
|     fill="#85BCFF" p-id="6355"></path> | ||||
|   <path d="M676.664889 167.822222V0l281.6 281.6h-167.822222c-62.862222 0-113.777778-50.915556-113.777778-113.777778" | ||||
|     fill="#529EE0" p-id="6356"></path> | ||||
|   <path | ||||
|     d="M685.824 363.804444a53.76 53.76 0 0 1 53.731556 53.731556v307.029333a53.76 53.76 0 0 1-53.731556 53.731556H309.76a53.731556 53.731556 0 0 1-53.731556-53.76V417.564444c0-29.667556 24.035556-53.731556 53.731556-53.731555H685.795556z m-72.903111 149.674667l-138.183111 146.545778-80.583111-62.805333-92.131556 94.208v31.402666c0 11.548444 10.325333 20.906667 23.04 20.906667h345.400889c12.714667 0 23.04-9.386667 23.04-20.906667v-125.610666l-80.583111-83.740445z m-227.896889-85.532444a32.085333 32.085333 0 1 0 0 64.142222 32.085333 32.085333 0 0 0 0-64.142222z" | ||||
|     fill="#FFFFFF" p-id="6357"></path> | ||||
| </svg> | ||||
| Before Width: | Height: | Size: 202 B After Width: | Height: | Size: 1.2 KiB | 
							
								
								
									
										14
									
								
								continew-admin-ui/src/assets/icons/svg/file-js.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,14 @@ | ||||
| <svg t="1642408007951" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" | ||||
|   p-id="50023" width="200" height="200"> | ||||
|   <path d="M847.872 240.128v688c0 26.56-21.408 48-48 48h-576c-26.56 0-48-21.44-48-48v-832c0-26.592 21.44-48 48-48h432z" | ||||
|     fill="#E9EDED" p-id="50024"></path> | ||||
|   <path d="M160 768.128v160c0 35.456 28.544 64 64 64h576c35.456 0 64-28.544 64-64v-160H160z" fill="#25B39E" | ||||
|     p-id="50025"></path> | ||||
|   <path d="M847.872 240.128h-144c-26.56 0-48-21.44-48-48v-144" fill="#25B39E" p-id="50026"></path> | ||||
|   <path | ||||
|     d="M432.256 320.128c-35.2 0-64 28.8-64 64v32c0 18.016-14.016 32-32 32a16 16 0 0 0-3.2 0.256 16 16 0 0 0-12.384 11.232 16 16 0 0 0-0.352 1.504 16 16 0 0 0 0 0.064 16 16 0 0 0 15.936 18.944c17.984 0 32 13.984 32 32v32c0 35.2 28.8 64 64 64a16 16 0 1 0 0-32c-18.016 0-32-13.984-32-32v-32c0-19.136-8.736-36.256-22.208-48a63.68 63.68 0 0 0 22.208-48v-32c0-18.016 13.984-32 32-32a16 16 0 1 0 0-32z m157.856 0a16 16 0 0 0 1.632 32c18.016 0 32 13.984 32 32v32c0 19.168 8.736 36.224 22.208 48-13.44 11.744-22.208 28.864-22.208 48v32c0 18.016-13.984 32-32 32a16 16 0 1 0 0 32c35.2 0 64-28.8 64-64v-32c0-18.016 14.016-32 32-32a16 16 0 0 0 10.368-3.616 16 16 0 0 0 1.216-1.152 16 16 0 0 0-11.584-27.232c-17.984 0-32-13.984-32-32v-32c0-35.2-28.8-64-64-64a16 16 0 0 0-1.6 0zM512 367.936a32 32 0 0 0-32 32 32 32 0 0 0 32 32 32 32 0 0 0 32-32 32 32 0 0 0-32-32z m0 96a32 32 0 0 0-32 32 32 32 0 0 0 16.256 27.872l-14.4 28.864a16 16 0 1 0 28.64 14.272l24-48.256a32 32 0 0 0 9.44-21.504 16 16 0 0 0 0-0.192 32 32 0 0 0 0.064-1.056 32 32 0 0 0-32-32z" | ||||
|     fill="#25B39E" p-id="50027"></path> | ||||
|   <path | ||||
|     d="M335.872 800a16 16 0 0 0-15.744 16.256V912c0 9.152-6.848 16-16 16a15.616 15.616 0 0 1-16-16 16 16 0 0 0-16.256-16.192 16 16 0 0 0-15.744 16.192c0 26.304 21.696 48 48 48 24.768 0 45.12-19.296 47.488-43.52a16 16 0 0 0 0.512-4.224v-96a16 16 0 0 0-16.256-16.256z m94.4 0.128a16 16 0 0 0-2.016 0.384c-24.64 1.92-44.384 22.528-44.384 47.616 0 25.28 20.096 46.08 44.992 47.68a16 16 0 0 0 3.008 0.32h32c9.152 0 16 6.848 16 16 0 9.152-6.848 16-16 16h-64a16 16 0 1 0 0 32h64a16 16 0 0 0 3.328-0.384 48.096 48.096 0 0 0 44.672-47.616c0-25.152-19.84-45.888-44.544-47.68a16 16 0 0 0-3.456-0.32h-30.88a16 16 0 0 0-1.12 0 15.616 15.616 0 0 1-16-16c0-9.152 6.848-16 16-16h64a16 16 0 1 0 0-32h-62.88a16 16 0 0 0-1.12 0 16 16 0 0 0-1.6 0z" | ||||
|     fill="#E9EDED" p-id="50028"></path> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.4 KiB | 
							
								
								
									
										14
									
								
								continew-admin-ui/src/assets/icons/svg/file-json.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,14 @@ | ||||
| <svg t="1642407743753" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" | ||||
|   p-id="20514" width="200" height="200"> | ||||
|   <path d="M847.872 240.128v688c0 26.56-21.408 48-48 48h-576c-26.56 0-48-21.44-48-48v-832c0-26.592 21.44-48 48-48h432z" | ||||
|     fill="#E9EDED" p-id="20515"></path> | ||||
|   <path d="M160 768.128v160c0 35.456 28.544 64 64 64h576c35.456 0 64-28.544 64-64v-160H160z" fill="#F17F53" | ||||
|     p-id="20516"></path> | ||||
|   <path d="M847.872 240.128h-144c-26.56 0-48-21.44-48-48v-144" fill="#F17F53" p-id="20517"></path> | ||||
|   <path | ||||
|     d="M432.256 320.128c-35.2 0-64 28.8-64 64v32c0 18.016-14.016 32-32 32a16 16 0 0 0-15.936 12.992 16 16 0 0 0 0 0.064 16 16 0 0 0 4.736 14.56 16 16 0 0 0 2.496 1.92 16 16 0 0 0 4.448 1.92 16 16 0 0 0 3.136 0.48 16 16 0 0 0 1.12 0.064c17.984 0 32 13.984 32 32v32c0 35.2 28.8 64 64 64a16 16 0 1 0 0-32c-18.016 0-32-13.984-32-32v-32c0-19.136-8.736-36.256-22.208-48a63.68 63.68 0 0 0 22.208-48v-32c0-18.016 13.984-32 32-32a16 16 0 1 0 0-32z m125.856 0a16 16 0 0 0 1.632 32c18.016 0 32 13.984 32 32v32c0 19.168 8.736 36.224 22.208 48-13.44 11.744-22.208 28.864-22.208 48v32c0 18.016-13.984 32-32 32a16 16 0 1 0 0 32c35.2 0 64-28.8 64-64v-32c0-18.016 14.016-32 32-32a16 16 0 0 0 10.368-3.616 16 16 0 0 0 1.216-1.152 16 16 0 0 0-11.584-27.232c-17.984 0-32-13.984-32-32v-32c0-35.2-28.8-64-64-64a16 16 0 0 0-1.6 0zM496 384a16 16 0 0 0-16 16 16 16 0 0 0 16 16 16 16 0 0 0 16-16 16 16 0 0 0-16-16z m-0.256 63.808A16 16 0 0 0 480 464v96a16 16 0 1 0 32 0v-96a16 16 0 0 0-16.256-16.192z" | ||||
|     fill="#F17F53" p-id="20518"></path> | ||||
|   <path | ||||
|     d="M720.576 799.616a16 16 0 0 0-1.632 0.064 16 16 0 0 0-15.008 17.312v126.816a16 16 0 1 0 32 0v-80l66.624 88.96a16 16 0 0 0 0.064 0.096l0.448 0.576a16 16 0 0 0 28.864-9.6v-127.68a16 16 0 0 0-16.256-16.224 16 16 0 0 0-15.744 16.256v79.68l-67.136-89.6a16 16 0 0 0-12.224-6.656zM303.744 800a16 16 0 0 0-15.744 16.256V912c0 9.152-6.848 16-16 16a15.616 15.616 0 0 1-16-16 16 16 0 0 0-16.256-16.192A16 16 0 0 0 224 912c0 26.304 21.696 48 48 48 24.768 0 45.152-19.296 47.488-43.52a16 16 0 0 0 0.512-4.224v-96A16 16 0 0 0 303.744 800z m288.256 0a80.256 80.256 0 0 0-80 80c0 44 36 80 80 80s80-36 80-80-36-80-80-80z m-193.888 0.128a16 16 0 0 0-1.984 0.384c-24.64 1.92-44.384 22.528-44.384 47.616 0 25.28 20.096 46.08 44.992 47.68a16 16 0 0 0 3.008 0.32h32c9.152 0 16 6.848 16 16 0 9.152-6.848 16-16 16h-64a16 16 0 1 0 0 32h64a16 16 0 0 0 3.328-0.384 48.096 48.096 0 0 0 44.672-47.616c0-25.152-19.84-45.888-44.544-47.68a16 16 0 0 0-3.456-0.32h-30.88a16 16 0 0 0-1.12 0 15.616 15.616 0 0 1-16-16c0-9.152 6.88-16 16-16h64a16 16 0 1 0 0-32h-62.88a16 16 0 0 0-1.12 0 16 16 0 0 0-1.6 0zM592 832c26.688 0 48 21.312 48 48s-21.312 48-48 48-48-21.312-48-48 21.312-48 48-48z" | ||||
|     fill="#E9EDED" p-id="20519"></path> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.7 KiB | 
							
								
								
									
										11
									
								
								continew-admin-ui/src/assets/icons/svg/file-music.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,11 @@ | ||||
| <svg t="1642407502942" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7293" | ||||
|   width="200" height="200"> | ||||
|   <path | ||||
|     d="M967.111111 281.6V910.222222c0 62.862222-50.915556 113.777778-113.777778 113.777778H170.666667c-62.862222 0-113.777778-50.915556-113.777778-113.777778V113.777778c0-62.862222 50.915556-113.777778 113.777778-113.777778h514.844444L967.111111 281.6z" | ||||
|     fill="#A15FDE" p-id="7294"></path> | ||||
|   <path d="M685.511111 196.266667V0L967.111111 281.6H770.844444a85.333333 85.333333 0 0 1-85.333333-85.333333" | ||||
|     fill="#C386F0" p-id="7295"></path> | ||||
|   <path | ||||
|     d="M669.980444 426.268444v236.999112c0 26.254222-31.857778 47.587556-71.082666 47.587555-39.253333 0-70.741333-21.333333-70.741334-47.587555 0-26.282667 31.516444-47.587556 70.741334-47.587556 14.848 0 28.728889 3.100444 40.163555 8.334222v-165.916444l-205.767111 48.497778v211.057777c0 26.254222-32.142222 47.559111-71.992889 47.559111-39.850667 0-72.305778-21.333333-72.305777-47.559111 0-26.282667 32.426667-47.587556 72.305777-47.587555a96.711111 96.711111 0 0 1 41.102223 8.647111V474.168889c0-14.222222 9.870222-26.88 23.779555-29.980445l205.795556-47.900444a30.862222 30.862222 0 0 1 38.001777 29.980444" | ||||
|     fill="#FFFFFF" p-id="7296"></path> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.2 KiB | 
							
								
								
									
										11
									
								
								continew-admin-ui/src/assets/icons/svg/file-other.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,11 @@ | ||||
| <svg t="1642408119178" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" | ||||
|   p-id="53519" width="200" height="200"> | ||||
|   <path | ||||
|     d="M967.111111 281.6V910.222222c0 62.862222-50.915556 113.777778-113.777778 113.777778H170.666667c-62.862222 0-113.777778-50.915556-113.777778-113.777778V113.777778c0-62.862222 50.915556-113.777778 113.777778-113.777778h514.844444L967.111111 281.6z" | ||||
|     fill="#BABABA" p-id="53520"></path> | ||||
|   <path d="M685.511111 167.822222V0L967.111111 281.6H799.288889c-62.862222 0-113.777778-50.915556-113.777778-113.777778" | ||||
|     fill="#979797" p-id="53521"></path> | ||||
|   <path | ||||
|     d="M733.667556 632.689778a111.104 111.104 0 0 1-110.819556 110.819555h-221.667556a111.132444 111.132444 0 0 1-110.848-110.819555 111.047111 111.047111 0 0 1 99.754667-110.279111A122.197333 122.197333 0 0 1 512 407.694222a122.197333 122.197333 0 0 1 121.912889 114.716445 111.160889 111.160889 0 0 1 99.754667 110.279111" | ||||
|     fill="#FFFFFF" p-id="53522"></path> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 992 B | 
							
								
								
									
										1
									
								
								continew-admin-ui/src/assets/icons/svg/file-pdf-a.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M11 42h26a2 2 0 002-2V13.828a2 2 0 00-.586-1.414l-5.828-5.828A2 2 0 0031.172 6H11a2 2 0 00-2 2v32a2 2 0 002 2z"/><path d="M22.305 21.028c.874 1.939 3.506 6.265 4.903 8.055 1.747 2.237 3.494 2.685 4.368 2.237.873-.447 1.21-4.548-7.425-2.685-7.523 1.623-7.424 3.58-6.988 4.476.728 1.193 2.522 2.627 5.678-6.266C25.699 18.79 24.489 17 23.277 17c-1.409 0-2.538.805-.972 4.028z"/></svg> | ||||
| After Width: | Height: | Size: 466 B | 
| @@ -1 +1,11 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M11 42h26a2 2 0 002-2V13.828a2 2 0 00-.586-1.414l-5.828-5.828A2 2 0 0031.172 6H11a2 2 0 00-2 2v32a2 2 0 002 2z"/><path d="M22.305 21.028c.874 1.939 3.506 6.265 4.903 8.055 1.747 2.237 3.494 2.685 4.368 2.237.873-.447 1.21-4.548-7.425-2.685-7.523 1.623-7.424 3.58-6.988 4.476.728 1.193 2.522 2.627 5.678-6.266C25.699 18.79 24.489 17 23.277 17c-1.409 0-2.538.805-.972 4.028z"/></svg> | ||||
| <svg t="1642407248989" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5608" | ||||
|   width="200" height="200"> | ||||
|   <path | ||||
|     d="M967.111111 281.6V910.222222c0 62.577778-51.2 113.777778-113.777778 113.777778H170.666667c-62.577778 0-113.777778-51.2-113.777778-113.777778V113.777778c0-62.577778 51.2-113.777778 113.777778-113.777778h514.844444L967.111111 281.6z" | ||||
|     fill="#D23B41" p-id="5609"></path> | ||||
|   <path d="M685.511111 224.711111V0L967.111111 281.6H742.4c-31.288889 0-56.888889-25.6-56.888889-56.888889" | ||||
|     fill="#9C171C" p-id="5610"></path> | ||||
|   <path | ||||
|     d="M680.277333 662.698667c-11.889778-1.194667-23.751111-3.640889-35.640889-9.728 10.666667-2.133333 20.110222-2.133333 30.776889-2.133334 23.751111 0 28.330667 5.774222 28.330667 9.443556-6.997333 2.417778-15.246222 3.356444-23.466667 2.417778z m-120.945777-15.530667c-25.884444 5.802667-54.556444 14.336-80.440889 23.779556v-2.446223l-2.446223 1.223111c13.084444-26.197333 25.002667-53.333333 35.640889-80.753777l0.938667 1.223111 1.194667-2.133334c13.112889 20.110222 29.866667 40.220444 47.530666 57.884445h-3.640889l1.223112 1.223111zM497.777778 417.450667c1.223111-1.223111 3.669333-1.223111 4.551111-1.223111h3.697778a96.739556 96.739556 0 0 1-1.251556 61.553777c-8.220444-18.915556-11.861333-40.220444-6.997333-60.330666zM352.142222 770.275556l-3.669333 1.223111a96.768 96.768 0 0 1 42.666667-34.417778c-9.443556 15.502222-22.556444 27.392-38.997334 33.194667z m324.494222-155.107556c-25.002667 0-49.664 3.669333-74.666666 8.248889a353.365333 353.365333 0 0 1-73.415111-94.776889c20.110222-66.417778 21.333333-111.217778 5.774222-132.551111a39.253333 39.253333 0 0 0-30.748445-15.502222c-15.246222-1.223111-29.582222 6.087111-36.579555 18.887111-21.333333 35.640889 9.443556 105.415111 23.779555 134.058666-16.782222 50.887111-36.864 99.328-63.089777 146.858667-112.412444 48.440889-114.858667 77.994667-114.858667 88.661333 0 13.084444 7.310222 26.197333 20.110222 32 4.864 3.640889 11.889778 4.835556 17.976889 4.835556 29.582222 0 64-33.194667 100.551111-98.389333 46.307556-18.887111 92.615111-34.133333 141.084445-44.8a153.941333 153.941333 0 0 0 87.722666 35.356444c20.110222 0 59.107556 0 59.107556-40.220444 1.223111-15.530667-6.997333-41.443556-62.748445-42.666667z" | ||||
|     fill="#FFFFFF" p-id="5611"></path> | ||||
| </svg> | ||||
| Before Width: | Height: | Size: 466 B After Width: | Height: | Size: 2.3 KiB | 
							
								
								
									
										12
									
								
								continew-admin-ui/src/assets/icons/svg/file-ppt.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,12 @@ | ||||
| <svg t="1642407349568" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6204" | ||||
|   width="200" height="200"> | ||||
|   <path | ||||
|     d="M967.111111 281.6V910.222222c0 62.577778-51.2 113.777778-113.777778 113.777778H170.666667c-62.577778 0-113.777778-51.2-113.777778-113.777778V113.777778c0-62.577778 51.2-113.777778 113.777778-113.777778h514.844444L967.111111 281.6z" | ||||
|     fill="#F16C41" p-id="6205"></path> | ||||
|   <path d="M685.511111 224.711111V0L967.111111 281.6H742.4c-31.288889 0-56.888889-25.6-56.888889-56.888889" | ||||
|     fill="#CD4B29" p-id="6206"></path> | ||||
|   <path | ||||
|     d="M525.880889 648.135111a88.32 88.32 0 0 1-68.750222-32.995555 87.04 87.04 0 0 1-19.626667-55.381334c0-21.048889 7.253333-40.248889 19.626667-55.381333a88.234667 88.234667 0 0 1 68.750222-32.995556 88.490667 88.490667 0 0 1 88.376889 88.376889 88.519111 88.519111 0 0 1-88.376889 88.376889m0-235.690667c-24.945778 0-48.327111 6.087111-68.750222 17.294223a143.075556 143.075556 0 0 0-58.88 56.945777v146.119112a143.132444 143.132444 0 0 0 58.88 56.974222c20.423111 11.178667 43.804444 17.265778 68.750222 17.265778a147.342222 147.342222 0 0 0 147.285333-147.285334 147.342222 147.342222 0 0 0-147.285333-147.342222" | ||||
|     fill="#FFFFFF" p-id="6207"></path> | ||||
|   <path d="M398.222222 824.888889h58.908445V412.444444H398.222222z" fill="#FFFFFF" p-id="6208"></path> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										16
									
								
								continew-admin-ui/src/assets/icons/svg/file-rar.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,16 @@ | ||||
| <svg t="1642407407406" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6649" | ||||
|   width="200" height="200"> | ||||
|   <path | ||||
|     d="M967.111111 281.6V910.222222c0 62.862222-50.915556 113.777778-113.777778 113.777778H170.666667c-62.862222 0-113.777778-50.915556-113.777778-113.777778V113.777778c0-62.862222 50.915556-113.777778 113.777778-113.777778h514.844444L967.111111 281.6z" | ||||
|     fill="#FFC63A" p-id="6650"></path> | ||||
|   <path d="M685.511111 167.822222V0L967.111111 281.6H799.288889c-62.862222 0-113.777778-50.915556-113.777778-113.777778" | ||||
|     fill="#DD9F08" p-id="6651"></path> | ||||
|   <path | ||||
|     d="M436.565333 68.437333h68.437334V0h-68.437334zM505.002667 136.874667h68.437333V68.437333h-68.437333zM436.565333 205.312h68.437334V136.874667h-68.437334zM505.002667 273.749333h68.437333V205.312h-68.437333z" | ||||
|     fill="#FFFFFF" p-id="6652"></path> | ||||
|   <path d="M436.565333 342.158222h68.437334V273.720889h-68.437334zM505.002667 410.624h68.437333V342.186667h-68.437333z" | ||||
|     fill="#FFFFFF" p-id="6653"></path> | ||||
|   <path | ||||
|     d="M436.565333 479.032889h68.437334v-68.437333h-68.437334zM505.002667 547.470222h68.437333v-68.437333h-68.437333zM470.784 762.225778h68.437333v-68.437334h-68.437333v68.437334z m-34.218667-136.874667v136.874667c0 18.915556 15.331556 34.218667 34.218667 34.218666h68.437333c18.915556 0 34.218667-15.303111 34.218667-34.218666v-136.874667h-136.874667z" | ||||
|     fill="#FFFFFF" p-id="6654"></path> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										11
									
								
								continew-admin-ui/src/assets/icons/svg/file-txt.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,11 @@ | ||||
| <svg t="1642407315436" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5906" | ||||
|   width="200" height="200"> | ||||
|   <path | ||||
|     d="M967.111111 281.6V910.222222c0 62.862222-50.915556 113.777778-113.777778 113.777778H170.666667c-62.862222 0-113.777778-50.915556-113.777778-113.777778V113.777778c0-62.862222 50.915556-113.777778 113.777778-113.777778h514.844444L967.111111 281.6z" | ||||
|     fill="#6D9FE5" p-id="5907"></path> | ||||
|   <path d="M685.511111 167.822222V0L967.111111 281.6H799.288889c-62.862222 0-113.777778-50.915556-113.777778-113.777778" | ||||
|     fill="#4B80CB" p-id="5908"></path> | ||||
|   <path | ||||
|     d="M344.177778 485.575111h312.888889V426.666667h-312.888889zM471.153778 770.019556h58.908444v-284.444445h-58.908444z" | ||||
|     fill="#FFFFFF" p-id="5909"></path> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 785 B | 
							
								
								
									
										1
									
								
								continew-admin-ui/src/assets/icons/svg/file-video-a.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M37 42H11a2 2 0 01-2-2V8a2 2 0 012-2h21l7 7v27a2 2 0 01-2 2z"/><path d="M22 27.796v-6l5 3-5 3z"/></svg> | ||||
| After Width: | Height: | Size: 188 B | 
| @@ -1 +1,14 @@ | ||||
| <svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="4"><path d="M37 42H11a2 2 0 01-2-2V8a2 2 0 012-2h21l7 7v27a2 2 0 01-2 2z"/><path d="M22 27.796v-6l5 3-5 3z"/></svg> | ||||
| <svg t="1642407389455" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6501" | ||||
|   width="200" height="200"> | ||||
|   <path | ||||
|     d="M967.111111 281.6V910.222222c0 62.862222-50.915556 113.777778-113.777778 113.777778H170.666667c-62.862222 0-113.777778-50.915556-113.777778-113.777778V113.777778c0-62.862222 50.915556-113.777778 113.777778-113.777778h514.844444L967.111111 281.6z" | ||||
|     fill="#C386F0" p-id="6502"></path> | ||||
|   <path | ||||
|     d="M284.444444 398.222222m42.666667 0l298.666667 0q42.666667 0 42.666666 42.666667l0 234.666667q0 42.666667-42.666666 42.666666l-298.666667 0q-42.666667 0-42.666667-42.666666l0-234.666667q0-42.666667 42.666667-42.666667Z" | ||||
|     fill="#FFFFFF" p-id="6503"></path> | ||||
|   <path | ||||
|     d="M738.417778 457.841778a31.971556 31.971556 0 0 1 48.014222 27.676444v154.538667c0 24.632889-26.652444 40.021333-47.985778 27.704889L684.430222 636.586667V488.96z" | ||||
|     fill="#FFFFFF" p-id="6504"></path> | ||||
|   <path d="M685.511111 167.822222V0L967.111111 281.6H799.288889c-62.862222 0-113.777778-50.915556-113.777778-113.777778" | ||||
|     fill="#A15FDE" p-id="6505"></path> | ||||
| </svg> | ||||
| Before Width: | Height: | Size: 188 B After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										13
									
								
								continew-admin-ui/src/assets/icons/svg/file-wps.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,13 @@ | ||||
| <svg t="1642407280584" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5757" | ||||
|   width="200" height="200"> | ||||
|   <path | ||||
|     d="M967.111111 281.6V910.222222c0 62.577778-51.2 113.777778-113.777778 113.777778H170.666667c-62.577778 0-113.777778-51.2-113.777778-113.777778V113.777778c0-62.577778 51.2-113.777778 113.777778-113.777778h514.844444L967.111111 281.6z" | ||||
|     fill="#4F6BF6" p-id="5758"></path> | ||||
|   <path d="M581.262222 755.626667h59.363556L739.555556 439.04h-59.335112z" fill="#FFFFFF" p-id="5759"></path> | ||||
|   <path d="M685.511111 224.711111V0L967.111111 281.6H742.4c-31.288889 0-56.888889-25.6-56.888889-56.888889" | ||||
|     fill="#243EBB" p-id="5760"></path> | ||||
|   <path | ||||
|     d="M640.625778 755.626667h-59.363556l-98.929778-277.020445h59.335112zM442.737778 755.626667h-59.363556L284.444444 439.04h59.335112z" | ||||
|     fill="#FFFFFF" p-id="5761"></path> | ||||
|   <path d="M383.374222 755.626667h59.363556l98.929778-277.020445h-59.335112z" fill="#FFFFFF" p-id="5762"></path> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 995 B | 
							
								
								
									
										1
									
								
								continew-admin-ui/src/assets/icons/svg/file-zip.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg t="1642421944380" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="865" width="200" height="200"><path d="M97.9 376h828.4v269.2H97.9z" fill="#F95F5D" p-id="866"></path><path d="M926.3 376V161.5c0-26.6-23.8-50.3-52.1-50.3H149.9c-28.3 0-52.1 23.7-52.1 50.3V376h828.5z m0 0" fill="#55C7F7" p-id="867"></path><path d="M97.9 645.2v214.5c0 26.6 23.6 50.3 51.7 50.3h725c28.1 0 51.7-23.7 51.7-50.3V645.2H97.9z m0 0" fill="#7ECF3B" p-id="868"></path><path d="M421.8 111.2h184.9V910H421.8z" fill="#FDAF42" p-id="869"></path><path d="M606.7 457.4v112.4H413V457.4h193.7m31.1-45.9H381.9c-4.4 0-11.8 4.4-11.8 11.8v179c0 4.4 4.4 11.8 11.8 11.8h255.9c4.4 0 11.8-4.4 11.8-11.8v-179c-2.9-8.8-7.4-11.8-11.8-11.8z m0 0" fill="#FFFFFF" p-id="870"></path></svg> | ||||
| After Width: | Height: | Size: 787 B | 
							
								
								
									
										1
									
								
								continew-admin-ui/src/assets/icons/svg/menu-file.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| <svg t="1684652847211" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2238" width="200" height="200"><path d="M0 0m372.363636 0l279.272728 0q372.363636 0 372.363636 372.363636l0 279.272728q0 372.363636-372.363636 372.363636l-279.272728 0q-372.363636 0-372.363636-372.363636l0-279.272728q0-372.363636 372.363636-372.363636Z" fill="#F7A647" p-id="2239"></path><path d="M232.727273 303.872C232.727273 290.327273 243.781818 279.272727 257.326545 279.272727h148.631273c5.620364 0 10.984727 2.292364 14.848 6.283637l50.897455 52.805818c1.186909 1.233455 2.210909 2.594909 3.037091 4.049454h259.874909c31.138909 0 56.657455 25.460364 56.657454 56.610909V688.058182c0 31.150545-25.518545 56.669091-56.657454 56.669091H289.396364C258.245818 744.727273 232.727273 719.208727 232.727273 688.058182V303.872zM726.702545 556.218182h-239.825454a10.216727 10.216727 0 0 0-10.205091 10.205091v25.390545c0 5.620364 4.584727 10.205091 10.205091 10.205091h239.825454a10.216727 10.216727 0 0 0 10.205091-10.205091v-25.390545a10.216727 10.216727 0 0 0-10.205091-10.205091z m-0.058181-87.691637h-239.825455a10.216727 10.216727 0 0 0-10.205091 10.205091h-0.069818v25.390546c0 5.632 4.573091 10.216727 10.205091 10.216727h239.895273a10.216727 10.216727 0 0 0 10.205091-10.216727V478.72a10.216727 10.216727 0 0 0-10.205091-10.205091z" fill="#FFFFFF" p-id="2240"></path></svg> | ||||
| After Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										47
									
								
								continew-admin-ui/src/constant/file.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,47 @@ | ||||
| /** @desc 文件模块-映射 */ | ||||
|  | ||||
| export interface fileTypeListItem { | ||||
|   name: string | ||||
|   value: number | ||||
|   menuIcon: string | ||||
|   icon: string | ||||
| } | ||||
|  | ||||
| // 文件分类 | ||||
| export const fileTypeList: fileTypeListItem[] = [ | ||||
|   { name: '全部', value: 0, menuIcon: 'menu-file', icon: 'icon-stamp' }, | ||||
|   { name: '图片', value: 1, menuIcon: 'file-image', icon: 'icon-file-image' }, | ||||
|   { name: '文档', value: 2, menuIcon: 'file-txt', icon: 'icon-file' }, | ||||
|   { name: '视频', value: 3, menuIcon: 'file-video', icon: 'icon-video-camera' }, | ||||
|   { name: '音频', value: 4, menuIcon: 'file-music', icon: 'icon-file-audio' }, | ||||
|   { name: '其他', value: 5, menuIcon: 'file-other', icon: 'icon-bulb' } | ||||
| ] | ||||
|  | ||||
| export interface FileExtendNameIconMap { | ||||
|   [key: string]: string | ||||
| } | ||||
|  | ||||
| // 文件类型图标 Map 映射 | ||||
| export const fileExtendNameIconMap: FileExtendNameIconMap = { | ||||
|   mp3: 'file-music', | ||||
|   mp4: 'file-video', | ||||
|   dir: 'file-dir', | ||||
|   ppt: 'file-ppt', | ||||
|   doc: 'file-wps', | ||||
|   docx: 'file-wps', | ||||
|   xls: 'file-excel', | ||||
|   xlsx: 'file-excel', | ||||
|   txt: 'file-txt', | ||||
|   rar: 'file-rar', | ||||
|   zip: 'file-zip', | ||||
|   html: 'file-html', | ||||
|   css: 'file-css', | ||||
|   js: 'file-js', | ||||
|   other: 'file-other' // 未知文件 | ||||
| } | ||||
|  | ||||
| // 图片类型 | ||||
| export const imageTypeList = ['jpg', 'png', 'gif', 'jpeg'] | ||||
|  | ||||
| // WPS、Office文件类型 | ||||
| export const officeFileType = ['ppt', 'pptx', 'doc', 'docx', 'xls', 'xlsx'] | ||||
| @@ -8,6 +8,7 @@ import localeAnnouncement from '@/views/system/announcement/locale/en-US'; | ||||
| import localeMessage from '@/views/system/message/locale/en-US'; | ||||
| import localeDict from '@/views/system/dict/locale/en-US'; | ||||
| import localeConfig from '@/views/system/config/locale/en-US'; | ||||
| import localeFile from '@/views/system/file/locale/en-US'; | ||||
|  | ||||
| import localeGenerator from '@/views/tool/generator/locale/en-US'; | ||||
|  | ||||
| @@ -66,6 +67,7 @@ export default { | ||||
|   ...localeMessage, | ||||
|   ...localeDict, | ||||
|   ...localeConfig, | ||||
|   ...localeFile, | ||||
|  | ||||
|   ...localeGenerator, | ||||
|  | ||||
|   | ||||
| @@ -8,6 +8,7 @@ import localeAnnouncement from '@/views/system/announcement/locale/zh-CN'; | ||||
| import localeMessage from '@/views/system/message/locale/zh-CN'; | ||||
| import localeDict from '@/views/system/dict/locale/zh-CN'; | ||||
| import localeConfig from '@/views/system/config/locale/zh-CN'; | ||||
| import localeFile from '@/views/system/file/locale/zh-CN'; | ||||
|  | ||||
| import localeGenerator from '@/views/tool/generator/locale/zh-CN'; | ||||
|  | ||||
| @@ -66,6 +67,7 @@ export default { | ||||
|   ...localeMessage, | ||||
|   ...localeDict, | ||||
|   ...localeConfig, | ||||
|   ...localeFile, | ||||
|  | ||||
|   ...localeGenerator, | ||||
|  | ||||
|   | ||||
| @@ -84,6 +84,15 @@ const System: AppRouteRecordRaw = { | ||||
|         requiresAuth: true, | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       name: 'File', | ||||
|       path: '/system/file', | ||||
|       component: () => import('@/views/system/file/index.vue'), | ||||
|       meta: { | ||||
|         locale: 'menu.system.file.list', | ||||
|         requiresAuth: true, | ||||
|       }, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
|  | ||||
|   | ||||
							
								
								
									
										42
									
								
								continew-admin-ui/src/store/modules/file.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,42 @@ | ||||
| import { defineStore } from 'pinia'; | ||||
| import { ref, computed } from 'vue'; | ||||
| import type { FileItem } from '@/api/system/file'; | ||||
|  | ||||
| type TViewMode = 'grid' | 'list'; | ||||
|  | ||||
| const storeSetup = () => { | ||||
|   const viewMode = ref<TViewMode>('grid'); // 视图: grid宫格模式 list列表模式 | ||||
|   const isBatchMode = ref(false); // 是否批量操作 | ||||
|   const selectedFileList = ref<FileItem[]>([]); | ||||
|   const selectedFileIds = computed(() => | ||||
|     selectedFileList.value.map((i) => i.id), | ||||
|   ); | ||||
|  | ||||
|   // 改变视图模式 | ||||
|   const changeViewMode = () => { | ||||
|     viewMode.value = viewMode.value === 'grid' ? 'list' : 'grid'; | ||||
|   }; | ||||
|  | ||||
|   // 添加选中的文件到文件勾选列表 | ||||
|   const addSelectedFileItem = (item: FileItem) => { | ||||
|     if (selectedFileIds.value.includes(item.id)) { | ||||
|       const index = selectedFileList.value.findIndex((i) => i.id === item.id); | ||||
|       selectedFileList.value.splice(index, 1); | ||||
|     } else { | ||||
|       selectedFileList.value.push(item); | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   return { | ||||
|     viewMode, | ||||
|     isBatchMode, | ||||
|     selectedFileList, | ||||
|     selectedFileIds, | ||||
|     changeViewMode, | ||||
|     addSelectedFileItem, | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| export const useFileStore = defineStore('file', storeSetup, { | ||||
|   // persist: { storage: localStorage, paths: ['viewMode', 'selectedFileList'] }, | ||||
| }); | ||||
| @@ -0,0 +1,176 @@ | ||||
| <template> | ||||
|   <a-modal | ||||
|     v-model:visible="visible" | ||||
|     title="移动到" | ||||
|     width="90%" | ||||
|     modal-animation-name="el-dialog" | ||||
|     mask-animation-name="el-mask" | ||||
|     :modal-style="{ maxWidth: '500px' }" | ||||
|     @close="cancel" | ||||
|     @before-ok="save" | ||||
|   > | ||||
|     <a-form | ||||
|       ref="FormRef" | ||||
|       :model="form" | ||||
|       :style="{ width: '100%' }" | ||||
|       auto-label-width | ||||
|     > | ||||
|       <a-form-item | ||||
|         field="path" | ||||
|         label="目标路径" | ||||
|         :rules="[{ required: true, message: '请输入目标路径' }]" | ||||
|       > | ||||
|         <a-input v-model="form.path" placeholder="请输入" /> | ||||
|       </a-form-item> | ||||
|     </a-form> | ||||
|     <section class="tree-box"> | ||||
|       <a-tree | ||||
|         show-line | ||||
|         size="mini" | ||||
|         block-node | ||||
|         :data="treeData" | ||||
|         @select="handleClickNode" | ||||
|       > | ||||
|         <template #switcher-icon="node, { expanded }"> | ||||
|           <GiSvgIcon | ||||
|             v-if="node.children && expanded" | ||||
|             class="switcher-icon" | ||||
|             name="plus-square" | ||||
|             :size="16" | ||||
|           /> | ||||
|           <GiSvgIcon | ||||
|             v-else-if="node.children && !expanded" | ||||
|             class="switcher-icon" | ||||
|             name="minus-square" | ||||
|             :size="16" | ||||
|             style="transform: rotate(0deg)" | ||||
|           /> | ||||
|           <icon-drive-file v-else :size="16" /> | ||||
|         </template> | ||||
|         <template #icon> | ||||
|           <GiSvgIcon name="menu-zip" :size="16"></GiSvgIcon> | ||||
|         </template> | ||||
|       </a-tree> | ||||
|     </section> | ||||
|   </a-modal> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
|   import type { FormInstance, Modal, TreeInstance } from '@arco-design/web-vue'; | ||||
|   import type { FileItem } from '@/api/system/file'; | ||||
|   import { onMounted, reactive, ref } from 'vue'; | ||||
|   // import GiSvgIcon from '@/components/GiSvgIcon/index.vue'; | ||||
|  | ||||
|   interface Props { | ||||
|     fileInfo: FileItem; | ||||
|     onClose: () => void; | ||||
|   } | ||||
|   const props = withDefaults(defineProps<Props>(), {}); | ||||
|  | ||||
|   const visible = ref(false); | ||||
|   type TForm = { path: string }; | ||||
|   const form: TForm = reactive({ path: '/' }); | ||||
|   const treeData = ref<object[]>([]); | ||||
|  | ||||
|   treeData.value = [ | ||||
|     { | ||||
|       title: '图片文件夹', | ||||
|       key: '0-0', | ||||
|       children: [ | ||||
|         { | ||||
|           title: '图片文件夹1', | ||||
|           key: '0-0-0', | ||||
|           children: [ | ||||
|             { title: '图片文件夹1-1', key: '0-0-0-0' }, | ||||
|             { title: '图片文件夹1-2', key: '0-0-0-1' }, | ||||
|             { title: '图片文件夹1-3', key: '0-0-0-2' }, | ||||
|           ], | ||||
|         }, | ||||
|         { | ||||
|           title: '新建文件夹', | ||||
|           key: '0-0-1', | ||||
|         }, | ||||
|         { | ||||
|           title: '视频文件夹', | ||||
|           key: '0-0-2', | ||||
|           children: [ | ||||
|             { title: '视频文件夹1', key: '0-0-2-0' }, | ||||
|             { title: '视频文件夹2', key: '0-0-2-1' }, | ||||
|           ], | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|     { | ||||
|       title: '音频文件夹', | ||||
|       key: '0-1', | ||||
|     }, | ||||
|     { | ||||
|       title: '音频文件夹1', | ||||
|       key: '0-2', | ||||
|       children: [ | ||||
|         { | ||||
|           title: '音频文件夹1-1', | ||||
|           key: '0-2-0', | ||||
|           children: [ | ||||
|             { title: '音频文件夹1-1-1', key: '0-2-0-0' }, | ||||
|             { title: '音频文件夹1-1-2', key: '0-2-0-1' }, | ||||
|           ], | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   ]; | ||||
|  | ||||
|   onMounted(() => { | ||||
|     visible.value = true; | ||||
|   }); | ||||
|  | ||||
|   const handleClickNode: TreeInstance['onSelect'] = (selectedKeys, data) => { | ||||
|     form.path = `/${data.selectedNodes[0].title}`; | ||||
|   }; | ||||
|  | ||||
|   const cancel = () => { | ||||
|     visible.value = false; | ||||
|     props.onClose(); | ||||
|   }; | ||||
|  | ||||
|   // 模拟接口 | ||||
|   const saveApi = (): Promise<boolean> => { | ||||
|     return new Promise((resolve) => { | ||||
|       setTimeout(() => { | ||||
|         resolve(true); | ||||
|       }, 2000); | ||||
|     }); | ||||
|   }; | ||||
|  | ||||
|   const FormRef = ref<FormInstance | null>(null); | ||||
|   const save: InstanceType<typeof Modal>['onBeforeOk'] = async () => { | ||||
|     const flag = await FormRef.value?.validate(); | ||||
|     if (flag) return false; | ||||
|     return saveApi(); | ||||
|   }; | ||||
| </script> | ||||
|  | ||||
| <style lang="less" scoped> | ||||
|   .label { | ||||
|     color: var(--color-text-2); | ||||
|   } | ||||
|   .switcher-icon { | ||||
|     fill: var(--color-text-2); | ||||
|   } | ||||
|   :deep(.arco-form-item-label-col > label) { | ||||
|     white-space: nowrap; | ||||
|   } | ||||
|   :deep(.arco-tree-node-switcher-icon) { | ||||
|     display: flex; | ||||
|     justify-content: center; | ||||
|     align-items: center; | ||||
|   } | ||||
|   .tree-box { | ||||
|     width: 100%; | ||||
|     height: 300px; | ||||
|     padding: 10px 16px; | ||||
|     box-sizing: border-box; | ||||
|     border: 1px solid var(--color-border); | ||||
|     overflow: auto; | ||||
|   } | ||||
| </style> | ||||
| @@ -0,0 +1,85 @@ | ||||
| <template> | ||||
|   <a-modal | ||||
|     v-model:visible="visible" | ||||
|     title="重命名" | ||||
|     width="90%" | ||||
|     modal-animation-name="el-fade" | ||||
|     :modal-style="{ maxWidth: '500px' }" | ||||
|     @close="cancel" | ||||
|     @before-ok="save" | ||||
|   > | ||||
|     <a-row justify="center" align="center"> | ||||
|       <a-form | ||||
|         ref="FormRef" | ||||
|         :model="form" | ||||
|         auto-label-width | ||||
|         :style="{ width: '80%' }" | ||||
|       > | ||||
|         <a-form-item | ||||
|           field="name" | ||||
|           label="文件名称" | ||||
|           :rules="[{ required: true, message: '请输入文件名称' }]" | ||||
|         > | ||||
|           <a-input v-model="form.name" placeholder="请输入" allow-clear /> | ||||
|         </a-form-item> | ||||
|       </a-form> | ||||
|     </a-row> | ||||
|   </a-modal> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
|   import type { FormInstance, Modal } from '@arco-design/web-vue'; | ||||
|   import type { FileItem } from '@/api/system/file'; | ||||
|   import { onMounted, reactive, ref } from 'vue'; | ||||
|  | ||||
|   interface Props { | ||||
|     fileInfo: FileItem; | ||||
|     onClose: () => void; | ||||
|   } | ||||
|   const props = withDefaults(defineProps<Props>(), {}); | ||||
|  | ||||
|   const visible = ref(false); | ||||
|   type Form = { name: string }; | ||||
|   const form: Form = reactive({ | ||||
|     name: '', | ||||
|   }); | ||||
|  | ||||
|   onMounted(() => { | ||||
|     form.name = props.fileInfo?.name || ''; | ||||
|     visible.value = true; | ||||
|   }); | ||||
|  | ||||
|   const cancel = () => { | ||||
|     visible.value = false; | ||||
|     props.onClose(); | ||||
|   }; | ||||
|  | ||||
|   // 模拟接口 | ||||
|   const saveApi = (): Promise<boolean> => { | ||||
|     return new Promise((resolve) => { | ||||
|         setTimeout(() => { | ||||
|           resolve(true); | ||||
|         }, 2000) | ||||
|       } | ||||
|     ); | ||||
|   }; | ||||
|  | ||||
|   const FormRef = ref<FormInstance | null>(null); | ||||
|   const save: InstanceType<typeof Modal>['onBeforeOk'] = async () => { | ||||
|     const flag = await FormRef.value?.validate(); | ||||
|     if (flag) return false; | ||||
|     return saveApi(); | ||||
|   }; | ||||
| </script> | ||||
|  | ||||
| <style lang="less" scoped> | ||||
|   .label { | ||||
|     color: var(--color-text-2); | ||||
|   } | ||||
|   :deep(.arco-form-item) { | ||||
|     margin-bottom: 0; | ||||
|   } | ||||
|   :deep(.arco-form-item-label-col > label) { | ||||
|     white-space: nowrap; | ||||
|   } | ||||
| </style> | ||||
| @@ -0,0 +1,148 @@ | ||||
| <template> | ||||
|   <transition name="slide-dynamic-origin"> | ||||
|     <div | ||||
|       v-show="visible" | ||||
|       ref="audioRef" | ||||
|       class="audio-preview-wrapper" | ||||
|       :style="audioStyle" | ||||
|     > | ||||
|       <section style="padding: 10px 14px 14px 14px"> | ||||
|         <div ref="audioHeadRef" class="head"> | ||||
|           <div class="name"> | ||||
|             <icon-music :size="16" spin /> | ||||
|             <span | ||||
|               >{{ props.fileInfo?.name }}.{{ props.fileInfo?.extendName }}</span | ||||
|             > | ||||
|           </div> | ||||
|           <div class="close-icon" @click="close"> | ||||
|             <icon-close :size="12" /> | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|         <!-- 音频组件 --> | ||||
|         <audio class="audio" :src="audioSrc" controls autoplay></audio> | ||||
|       </section> | ||||
|     </div> | ||||
|   </transition> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
|   import { useDraggable, useWindowSize, useElementSize } from '@vueuse/core'; | ||||
|   import type { FileItem } from '@/api/system/file'; | ||||
|   import { computed, onMounted, ref } from 'vue'; | ||||
|  | ||||
|   interface Props { | ||||
|     fileInfo: FileItem; | ||||
|     onClose: () => void; | ||||
|   } | ||||
|   const props = withDefaults(defineProps<Props>(), {}); | ||||
|  | ||||
|   const visible = ref(false); | ||||
|   const audioRef = ref<HTMLElement | null>(null); | ||||
|   const audioHeadRef = ref<HTMLElement | null>(null); | ||||
|  | ||||
|   const audioSrc = computed(() => { | ||||
|     return props.fileInfo?.src || ''; | ||||
|   }); | ||||
|  | ||||
|   onMounted(() => { | ||||
|     visible.value = true; | ||||
|   }); | ||||
|  | ||||
|   const { width: windowWidth, height: windowHeight } = useWindowSize(); | ||||
|   const { width: boxWidth, height: boxHeight } = useElementSize(audioRef); | ||||
|  | ||||
|   const axis = ref({ top: 40, left: windowWidth.value - boxWidth.value }); | ||||
|   const obj = JSON.parse(sessionStorage.getItem('AudioDialogXY') as string); | ||||
|   if (obj && obj.top && obj.left) { | ||||
|     axis.value.top = obj.top; | ||||
|     axis.value.left = obj.left; | ||||
|   } | ||||
|   const { x, y } = useDraggable(audioRef, { | ||||
|     initialValue: { x: axis.value.left - boxWidth.value, y: axis.value.top }, | ||||
|   }); | ||||
|  | ||||
|   const audioStyle = computed(() => { | ||||
|     let left: number | string = x.value; | ||||
|     let top: number | string = y.value; | ||||
|     if (x.value > windowWidth.value - boxWidth.value) { | ||||
|       left = windowWidth.value - boxWidth.value; | ||||
|     } | ||||
|     if (x.value < 0) { | ||||
|       left = 0; | ||||
|     } | ||||
|     if (y.value > windowHeight.value - boxHeight.value) { | ||||
|       top = windowHeight.value - boxHeight.value; | ||||
|     } | ||||
|     if (y.value < 0) { | ||||
|       top = 0; | ||||
|     } | ||||
|     sessionStorage.setItem('AudioDialogXY', JSON.stringify({ top, left })); | ||||
|     return { | ||||
|       left: `${left}px`, | ||||
|       top: `${top}px`, | ||||
|     }; | ||||
|   }); | ||||
|  | ||||
|   const close = () => { | ||||
|     visible.value = false; | ||||
|     props.onClose(); | ||||
|   }; | ||||
| </script> | ||||
|  | ||||
| <style lang="less" scoped> | ||||
|   .audio-preview-wrapper { | ||||
|     width: 300px; | ||||
|     position: fixed; | ||||
|     border-radius: 8px; | ||||
|     box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); | ||||
|     background: linear-gradient(to right, rgb(var(--primary-6)), rgb(var(--primary-2))); | ||||
|     z-index: 9999; | ||||
|     .head { | ||||
|       color: #fff; | ||||
|       font-size: 16px; | ||||
|       margin-bottom: 10px; | ||||
|       display: flex; | ||||
|       justify-content: space-between; | ||||
|       align-items: center; | ||||
|       cursor: move; | ||||
|       user-select: none; | ||||
|       &:active { | ||||
|         cursor: move; | ||||
|       } | ||||
|       .name { | ||||
|         display: flex; | ||||
|         align-items: center; | ||||
|         > span { | ||||
|           margin-left: 8px; | ||||
|         } | ||||
|       } | ||||
|       .close-icon { | ||||
|         width: 24px; | ||||
|         height: 24px; | ||||
|         display: flex; | ||||
|         justify-content: center; | ||||
|         align-items: center; | ||||
|         border-radius: 50%; | ||||
|         background: rgba(0, 0, 0, 0); | ||||
|         transition: all 0.2s; | ||||
|         cursor: pointer; | ||||
|         svg { | ||||
|           transition: all 0.2s; | ||||
|         } | ||||
|         &:hover { | ||||
|           background: rgba(0, 0, 0, 0.1); | ||||
|           svg { | ||||
|             transform: scale(1.3); | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     .audio { | ||||
|       width: 100%; | ||||
|       &::-webkit-media-controls-enclosure { | ||||
|         background: #fff; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
| @@ -0,0 +1,45 @@ | ||||
| <template> | ||||
|   <a-modal | ||||
|     v-model:visible="visible" | ||||
|     title="视频播放" | ||||
|     width="auto" | ||||
|     draggable | ||||
|     @close="close" | ||||
|   > | ||||
|     <div id="videoId"></div> | ||||
|   </a-modal> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
|   import Player from 'xgplayer'; | ||||
|   import type { FileItem } from '@/api/system/file'; | ||||
|   import { nextTick, onMounted, ref } from 'vue'; | ||||
|  | ||||
|   interface Props { | ||||
|     fileInfo: FileItem; | ||||
|     onClose: () => void; | ||||
|   } | ||||
|   const props = withDefaults(defineProps<Props>(), {}); | ||||
|  | ||||
|   const visible = ref(false); | ||||
|  | ||||
|   onMounted(() => { | ||||
|     visible.value = true; | ||||
|     nextTick(() => { | ||||
|       // eslint-disable-next-line no-new | ||||
|       new Player({ | ||||
|         id: 'videoId', | ||||
|         url: props.fileInfo?.src || '', | ||||
|         lang: 'zh-cn', | ||||
|         autoplay: true, | ||||
|         closeVideoClick: true, | ||||
|         videoInit: true, | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   const close = () => { | ||||
|     visible.value = false; | ||||
|     props.onClose(); | ||||
|   }; | ||||
| </script> | ||||
							
								
								
									
										68
									
								
								continew-admin-ui/src/views/system/file/components/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,68 @@ | ||||
| import type { Component } from 'vue'; | ||||
| import { createApp } from 'vue'; | ||||
| import ArcoVueIcon from '@arco-design/web-vue/es/icon'; | ||||
| import ArcoVue from '@arco-design/web-vue'; | ||||
| import { FileItem } from '@/api/system/file'; | ||||
|  | ||||
| import FileMoveModal from './FileMoveModal/index.vue'; | ||||
| import FileRenameModal from './FileRenameModal/index.vue'; | ||||
| import PreviewVideoModal from './PreviewVideoModal/index.vue'; | ||||
| import PreviewAudioModal from './PreviewAudioModal/index.vue'; | ||||
|  | ||||
| function createModal<T extends { callback?: () => void }>( | ||||
|   component: Component, | ||||
|   options?: T, | ||||
| ) { | ||||
|   // 创建一个挂载容器 | ||||
|   const el: HTMLElement = document.createElement('div'); | ||||
|   // 挂载组件 | ||||
|   document.body.appendChild(el); | ||||
|  | ||||
|   // 实例化组件, createApp 第二个参数是 props | ||||
|   const instance = createApp(component, { | ||||
|     ...options, | ||||
|     onClose: () => { | ||||
|       setTimeout(() => { | ||||
|         instance.unmount(); | ||||
|         document.body.removeChild(el); | ||||
|         // options?.callback && options?.callback(); | ||||
|       }, 350); | ||||
|     }, | ||||
|   }); | ||||
|  | ||||
|   instance.use(ArcoVue); | ||||
|   instance.use(ArcoVueIcon); | ||||
|   instance.mount(el); | ||||
| } | ||||
|  | ||||
| type TFileOptions = { fileInfo: FileItem; callback?: () => void }; | ||||
|  | ||||
| /** 打开 文件移动 弹窗 */ | ||||
| export function openFileMoveModal(fileItem: FileItem) { | ||||
|   return createModal<TFileOptions>(FileMoveModal, { fileInfo: fileItem }); | ||||
| } | ||||
|  | ||||
| /** 打开 文件重命名 弹窗 */ | ||||
| export function openFileRenameModal(fileItem: FileItem) { | ||||
|   return createModal<TFileOptions>(FileRenameModal, { fileInfo: fileItem }); | ||||
| } | ||||
|  | ||||
| /** 预览 视频文件 弹窗 */ | ||||
| export function previewFileVideoModal(fileItem: FileItem) { | ||||
|   return createModal<TFileOptions>(PreviewVideoModal, { fileInfo: fileItem }); | ||||
| } | ||||
|  | ||||
| /** 预览 音频文件 弹窗 */ | ||||
| let fileAudioId = ''; | ||||
| export function previewFileAudioModal(fileItem: FileItem) { | ||||
|   if (fileAudioId) return; // 防止重复打开 | ||||
|   fileAudioId = fileItem.id; | ||||
|   // eslint-disable-next-line consistent-return | ||||
|   return createModal<TFileOptions>(PreviewAudioModal, { | ||||
|     fileInfo: fileItem, | ||||
|     // 关闭的回调 | ||||
|     callback: () => { | ||||
|       fileAudioId = ''; | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
							
								
								
									
										138
									
								
								continew-admin-ui/src/views/system/file/detail/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,138 @@ | ||||
| <template> | ||||
|   <div class="file-detail"> | ||||
|     <a-row :gutter="[14, 14]" align="stretch" class="wrap"> | ||||
|       <a-col :xs="24" :sm="24" :md="16" :lg="18" :xl="19" :xxl="19"> | ||||
|         <div class="left"> | ||||
|           <a-row justify="space-between"> | ||||
|             <a-button @click="back"><icon-left /></a-button> | ||||
|           </a-row> | ||||
|           <div class="view-box"> | ||||
| <!--            <PreImage></PreImage>--> | ||||
|           </div> | ||||
|         </div> | ||||
|       </a-col> | ||||
|       <a-col :xs="24" :sm="24" :md="8" :lg="6" :xl="5" :xxl="5"> | ||||
|         <div class="right"> | ||||
|           <a-descriptions | ||||
|             title="文件详情" | ||||
|             :column="1" | ||||
|             size="mini" | ||||
|             table-layout="fixed" | ||||
|             layout="inline-horizontal" | ||||
|           > | ||||
|             <a-descriptions-item label="名称:">头像01</a-descriptions-item> | ||||
|             <a-descriptions-item label="类型:">jpg</a-descriptions-item> | ||||
|             <a-descriptions-item label="路径:">/</a-descriptions-item> | ||||
|             <a-descriptions-item label="文件大小:">256K</a-descriptions-item> | ||||
|             <a-descriptions-item label="创建人:">admin</a-descriptions-item> | ||||
|             <a-descriptions-item label="创建时间:" | ||||
|               >2022-05-18 15:25:08</a-descriptions-item | ||||
|             > | ||||
|             <a-descriptions-item label="文件ID:" | ||||
|               >1511952522629615617</a-descriptions-item | ||||
|             > | ||||
|             <a-descriptions-item label="标签:"> | ||||
|               <a-space wrap> | ||||
|                 <a-tag size="small" color="red">头像</a-tag> | ||||
|                 <a-tag size="small" color="orangered">图片</a-tag> | ||||
|                 <a-tag size="small" color="purple">JPG</a-tag> | ||||
|                 <a-tag size="small" color="blue">壁纸</a-tag> | ||||
|                 <a-tag size="small" color="orange">4K</a-tag> | ||||
|                 <a-tag size="small" color="green">风景</a-tag> | ||||
|               </a-space> | ||||
|             </a-descriptions-item> | ||||
|             <a-descriptions-item label="说明:" | ||||
|               >基于 v-viewer vue3 | ||||
|               实现自定义按钮的图片预览,其他功能可自行扩展</a-descriptions-item | ||||
|             > | ||||
|           </a-descriptions> | ||||
|  | ||||
|           <a-row justify="end" style="margin-top: 30px"> | ||||
|             <a-space> | ||||
|               <a-button> | ||||
|                 <template #icon><icon-download :size="16" /></template> | ||||
|               </a-button> | ||||
|               <a-button> | ||||
|                 <template #icon><icon-share-alt :size="16" /></template> | ||||
|               </a-button> | ||||
|               <a-button> | ||||
|                 <template #icon><icon-drag-arrow :size="16" /></template> | ||||
|               </a-button> | ||||
|               <a-button> | ||||
|                 <template #icon><icon-delete :size="16" /></template> | ||||
|               </a-button> | ||||
|             </a-space> | ||||
|           </a-row> | ||||
|         </div> | ||||
|       </a-col> | ||||
|     </a-row> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
|   import { useRouter } from 'vue-router'; | ||||
|   // import PreImage from './PreImage.vue'; | ||||
|  | ||||
|   defineOptions({ name: 'FileDetail' }); | ||||
|   const router = useRouter(); | ||||
|  | ||||
|   const back = () => { | ||||
|     router.back(); | ||||
|   }; | ||||
| </script> | ||||
|  | ||||
| <style lang="less" scoped> | ||||
|   :deep(.arco-descriptions) { | ||||
|     .arco-descriptions-title { | ||||
|       margin-bottom: 12px; | ||||
|     } | ||||
|     .arco-descriptions-item { | ||||
|       display: flex; | ||||
|       margin-bottom: 8px; | ||||
|       .arco-descriptions-item-label-inline { | ||||
|         white-space: nowrap; | ||||
|         font-size: 12px; | ||||
|       } | ||||
|       .arco-descriptions-item-value-inline { | ||||
|         font-size: 12px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   .file-detail { | ||||
|     flex: 1; | ||||
|     padding: 16px; | ||||
|     padding-bottom: 0; | ||||
|     box-sizing: border-box; | ||||
|     overflow: hidden; | ||||
|     overflow-y: auto; | ||||
|     .wrap { | ||||
|       height: 100%; | ||||
|     } | ||||
|     .left, | ||||
|     .right { | ||||
|       background-color: var(--color-bg-1); | ||||
|       padding: 16px; | ||||
|       box-sizing: border-box; | ||||
|       overflow: hidden; | ||||
|       box-sizing: border-box; | ||||
|     } | ||||
|     .left { | ||||
|       height: 100%; | ||||
|       display: flex; | ||||
|       flex-direction: column; | ||||
|       .view-box { | ||||
|         min-height: 400px; | ||||
|         flex: 1; | ||||
|         overflow: hidden; | ||||
|         margin-top: $margin; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .right { | ||||
|       // width: 300px; | ||||
|       // height: fit-content; | ||||
|       // margin: $margin; | ||||
|       // margin-left: 0; | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										43
									
								
								continew-admin-ui/src/views/system/file/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,43 @@ | ||||
| <template> | ||||
|   <a-row align="stretch" :gutter="14" class="file-manage"> | ||||
|     <a-col | ||||
|       :xs="0" | ||||
|       :sm="8" | ||||
|       :md="7" | ||||
|       :lg="6" | ||||
|       :xl="5" | ||||
|       :xxl="4" | ||||
|       flex="220px" | ||||
|       class="h-full ov-hidden" | ||||
|     > | ||||
|       <FileAside></FileAside> | ||||
|     </a-col> | ||||
|     <a-col | ||||
|       :xs="24" | ||||
|       :sm="16" | ||||
|       :md="17" | ||||
|       :lg="18" | ||||
|       :xl="19" | ||||
|       :xxl="20" | ||||
|       flex="1" | ||||
|       class="h-full ov-hidden" | ||||
|     > | ||||
|       <FileMain></FileMain> | ||||
|     </a-col> | ||||
|   </a-row> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
|   import FileAside from './main/FileAside.vue'; | ||||
|   import FileMain from './main/FileMain/index.vue'; | ||||
|  | ||||
|   defineOptions({ name: 'FileIndex' }); | ||||
| </script> | ||||
|  | ||||
| <style lang="less" scoped> | ||||
|   .file-manage { | ||||
|     flex: 1; | ||||
|     padding: 16px; | ||||
|     overflow: hidden; | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										3
									
								
								continew-admin-ui/src/views/system/file/locale/en-US.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,3 @@ | ||||
| export default { | ||||
|   'menu.system.file.list': 'File management', | ||||
| }; | ||||
							
								
								
									
										3
									
								
								continew-admin-ui/src/views/system/file/locale/zh-CN.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,3 @@ | ||||
| export default { | ||||
|   'menu.system.file.list': '文件管理(尚在开发)', | ||||
| }; | ||||
							
								
								
									
										70
									
								
								continew-admin-ui/src/views/system/file/main/FileAside.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,70 @@ | ||||
| <template> | ||||
|   <div> | ||||
|     <a-card | ||||
|       :title="$t('menu.system.file.list')" | ||||
|       :bordered="false" | ||||
|       :body-style="{ padding: 0 }" | ||||
|     > | ||||
|       <a-menu :default-open-keys="['0']" :selected-keys="[selectedKey]"> | ||||
|         <a-sub-menu key="0"> | ||||
|           <template #icon> | ||||
|             <icon-apps></icon-apps> | ||||
|           </template> | ||||
|           <template #title>文件类型</template> | ||||
|           <a-menu-item | ||||
|             v-for="item in fileTypeList" | ||||
|             :key="item.value.toString()" | ||||
|           > | ||||
|             <template #icon> | ||||
|               <svg-icon | ||||
|                 :icon-class="item.menuIcon" | ||||
|                 style="height: 28px; width: 28px" | ||||
|               ></svg-icon> | ||||
|             </template> | ||||
|             <span>{{ item.name }}</span> | ||||
|           </a-menu-item> | ||||
|         </a-sub-menu> | ||||
|       </a-menu> | ||||
|     </a-card> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
|   import { ref, watch } from 'vue'; | ||||
|   import { useRoute, useRouter } from 'vue-router'; | ||||
|   import { fileTypeList, type fileTypeListItem } from '@/constant/file'; | ||||
|  | ||||
|   const route = useRoute(); | ||||
|   const router = useRouter(); | ||||
|  | ||||
|   const selectedKey = ref('0'); | ||||
|  | ||||
|   // 监听路由变化 | ||||
|   watch( | ||||
|     () => route.query, | ||||
|     () => { | ||||
|       if (route.query.fileType) { | ||||
|         selectedKey.value = route.query.fileType as string; | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       immediate: true, | ||||
|     }, | ||||
|   ); | ||||
|  | ||||
|   // 点击事件 | ||||
|   const onClickItem = (item: fileTypeListItem) => { | ||||
|     router.push({ path: '/file', query: { fileType: item.value } }); | ||||
|   }; | ||||
| </script> | ||||
|  | ||||
| <style lang="less" scoped> | ||||
|   :deep(.arco-card) { | ||||
|     .arco-card-header { | ||||
|       border-bottom-style: dashed; | ||||
|       margin: 0 16px; | ||||
|       padding-left: 0; | ||||
|       padding-right: 0; | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
| @@ -0,0 +1,173 @@ | ||||
| <template> | ||||
|   <div class="file-grid"> | ||||
|     <a-grid | ||||
|       :cols="{ xs: 4, sm: 4, md: 5, lg: 7, xl: 8, xxl: 9 }" | ||||
|       :col-gap="12" | ||||
|       :row-gap="12" | ||||
|     > | ||||
|       <a-trigger | ||||
|         v-for="item in data" | ||||
|         :key="item.id" | ||||
|         trigger="contextMenu" | ||||
|         align-point | ||||
|         animation-name="slide-dynamic-origin" | ||||
|         auto-fit-transform-origin | ||||
|         position="bl" | ||||
|         update-at-scroll | ||||
|         scroll-to-close | ||||
|       > | ||||
|         <a-grid-item> | ||||
|           <div class="file-grid-item" @click.stop="handleClickFile(item)"> | ||||
|             <div class="wrapper"> | ||||
|               <div class="file-icon"> | ||||
|                 <FileImg :data="item"></FileImg> | ||||
|               </div> | ||||
|               <p class="gi_line_1 file-name">{{ getFileName(item) }}</p> | ||||
|             </div> | ||||
|             <!-- 勾选模式 --> | ||||
|             <section | ||||
|               v-show="props.isBatchMode" | ||||
|               class="check-mode" | ||||
|               :class="{ checked: props.selectedFileIds.includes(item.id) }" | ||||
|               @click.stop="handleCheckFile(item)" | ||||
|             > | ||||
|               <a-checkbox | ||||
|                 class="checkbox" | ||||
|                 :model-value="props.selectedFileIds.includes(item.id)" | ||||
|                 @change="handleCheckFile(item)" | ||||
|               ></a-checkbox> | ||||
|             </section> | ||||
|           </div> | ||||
|         </a-grid-item> | ||||
|         <template #content> | ||||
|           <FileRightMenu | ||||
|             :file-info="item" | ||||
|             @click="handleRightMenuItemClick($event, item)" | ||||
|           ></FileRightMenu> | ||||
|         </template> | ||||
|       </a-trigger> | ||||
|     </a-grid> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
|   import type { FileItem } from '@/api/system/file'; | ||||
|   import FileImg from './FileImg.vue'; | ||||
|   import FileRightMenu from './FileRightMenu.vue'; | ||||
|  | ||||
|   interface Props { | ||||
|     data?: FileItem[]; | ||||
|     selectedFileIds?: string[]; | ||||
|     isBatchMode?: boolean; | ||||
|   } | ||||
|  | ||||
|   const props = withDefaults(defineProps<Props>(), { | ||||
|     data: () => [], // 文件数据 | ||||
|     selectedFileIds: () => [], // 批量模式下选中的文件id数组 | ||||
|     isBatchMode: false, // 是否是批量模式 | ||||
|   }); | ||||
|  | ||||
|   const emit = defineEmits(['click', 'check', 'rightMenuClick']); | ||||
|  | ||||
|   // 文件名称带后缀 | ||||
|   const getFileName = (item: FileItem) => { | ||||
|     return `${item.name}${item.extendName ? `.${item.extendName}` : ''}`; | ||||
|   }; | ||||
|  | ||||
|   // 点击事件 | ||||
|   const handleClickFile = (item: FileItem) => { | ||||
|     emit('click', item); | ||||
|   }; | ||||
|  | ||||
|   // 选中事件 | ||||
|   const handleCheckFile = (item: FileItem) => { | ||||
|     emit('check', item); | ||||
|   }; | ||||
|  | ||||
|   // 右键菜单点击事件 | ||||
|   const handleRightMenuItemClick = (mode: string, item: FileItem) => { | ||||
|     emit('rightMenuClick', mode, item); | ||||
|   }; | ||||
| </script> | ||||
|  | ||||
| <style lang="less" scoped> | ||||
|   .file-grid { | ||||
|     flex: 1; | ||||
|     margin-top: 12px; | ||||
|     overflow: scroll; | ||||
|     background: var(--color-bg-2); | ||||
|   } | ||||
|  | ||||
|   .file-grid-item { | ||||
|     width: 100%; | ||||
|     height: 100px; | ||||
|     display: flex; | ||||
|     justify-content: center; | ||||
|     align-items: center; | ||||
|     position: relative; | ||||
|     cursor: pointer; | ||||
|     &:hover { | ||||
|       background: var(--color-primary-light-1); | ||||
|     } | ||||
|     &:active { | ||||
|       svg, | ||||
|       img { | ||||
|         transform: scale(0.9); | ||||
|       } | ||||
|     } | ||||
|     .check-mode { | ||||
|       position: absolute; | ||||
|       left: 0; | ||||
|       right: 0; | ||||
|       top: 0; | ||||
|       bottom: 0; | ||||
|       background: rgba(0, 0, 0, 0.1); | ||||
|       z-index: 9; | ||||
|       &.checked { | ||||
|         background: none; | ||||
|       } | ||||
|       .checkbox { | ||||
|         position: absolute; | ||||
|         top: 5px; | ||||
|         left: 5px; | ||||
|         padding-left: 0; | ||||
|       } | ||||
|     } | ||||
|     .wrapper { | ||||
|       width: 76%; | ||||
|       max-width: 100px; | ||||
|       height: 100%; | ||||
|       position: relative; | ||||
|       overflow: hidden; | ||||
|       z-index: 1; | ||||
|       display: flex; | ||||
|       flex-direction: column; | ||||
|       justify-content: center; | ||||
|       align-items: center; | ||||
|       .file-icon { | ||||
|         width: 100%; | ||||
|         height: 60px; | ||||
|         display: flex; | ||||
|         justify-content: center; | ||||
|         overflow: hidden; | ||||
|         .img { | ||||
|           width: auto; | ||||
|           height: 100%; | ||||
|           transition: all 0.3s; | ||||
|         } | ||||
|         .svg-img { | ||||
|           height: 100%; | ||||
|           transition: all 0.3s; | ||||
|         } | ||||
|       } | ||||
|       .file-name { | ||||
|         width: 100%; | ||||
|         font-size: 12px; | ||||
|         margin-top: 8px; | ||||
|         padding: 0 5px; | ||||
|         text-align: center; | ||||
|         box-sizing: border-box; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
| @@ -0,0 +1,47 @@ | ||||
| <template> | ||||
|   <img v-if="isImage" class="img" :src="props.data.src || ''" /> | ||||
|   <GiSvgIcon v-else size="100%" :name="getFileImg"></GiSvgIcon> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
|   import { fileExtendNameIconMap, imageTypeList } from '@/constant/file'; | ||||
|   import type { FileItem } from '@/api/system/file'; | ||||
|   import { computed } from 'vue'; | ||||
|  | ||||
|   interface Props { | ||||
|     data: FileItem; | ||||
|   } | ||||
|  | ||||
|   const props = withDefaults(defineProps<Props>(), {}); | ||||
|  | ||||
|   // 是否是图片类型文件 | ||||
|   const isImage = computed(() => { | ||||
|     return imageTypeList.includes(props.data.extendName.toLowerCase()); | ||||
|   }); | ||||
|  | ||||
|   // 获取文件图标,如果是图片这显示图片 | ||||
|   const getFileImg = computed<string>(() => { | ||||
|     if (props.data?.isDir) { | ||||
|       return fileExtendNameIconMap.dir || ''; | ||||
|     } | ||||
|     if (imageTypeList.includes(props.data.extendName.toLowerCase())) { | ||||
|       return props.data.src || ''; | ||||
|     } | ||||
|     if ( | ||||
|       !Object.keys(fileExtendNameIconMap).includes( | ||||
|         props.data.extendName.toLowerCase(), | ||||
|       ) | ||||
|     ) { | ||||
|       return fileExtendNameIconMap.other || ''; | ||||
|     } | ||||
|     return fileExtendNameIconMap[props.data.extendName.toLowerCase()] || ''; | ||||
|   }); | ||||
| </script> | ||||
|  | ||||
| <style lang="less" scoped> | ||||
|   img { | ||||
|     width: 100%; | ||||
|     height: 100%; | ||||
|     object-fit: cover; | ||||
|   } | ||||
| </style> | ||||
| @@ -0,0 +1,138 @@ | ||||
| <template> | ||||
|   <div class="file-list"> | ||||
|     <a-table | ||||
|       row-key="id" | ||||
|       :scroll="{ x: '100%', y: '100%', minWidth: 600 }" | ||||
|       :data="props.data" | ||||
|       :bordered="false" | ||||
|       :pagination="false" | ||||
|       :row-selection="isBatchMode ? rowSelection : undefined" | ||||
|     > | ||||
|       <template #columns> | ||||
|         <a-table-column title="名称"> | ||||
|           <template #cell="{ record }"> | ||||
|             <a-trigger | ||||
|               trigger="contextMenu" | ||||
|               align-point | ||||
|               animation-name="slide-dynamic-origin" | ||||
|               auto-fit-transform-origin | ||||
|               position="bl" | ||||
|               update-at-scroll | ||||
|               scroll-to-close | ||||
|             > | ||||
|               <div class="file-name" @click="handleRowClick(record)"> | ||||
|                 <div class="file-image"> | ||||
|                   <FileImg :data="record"></FileImg> | ||||
|                 </div> | ||||
|                 <span>{{ record.name }}</span> | ||||
|               </div> | ||||
|               <template #content> | ||||
|                 <FileRightMenu | ||||
|                   :file-info="record" | ||||
|                   @click="handleRightMenuItemClick($event, record)" | ||||
|                 ></FileRightMenu> | ||||
|               </template> | ||||
|             </a-trigger> | ||||
|           </template> | ||||
|         </a-table-column> | ||||
|         <a-table-column | ||||
|           title="扩展名" | ||||
|           data-index="extendName" | ||||
|           :width="100" | ||||
|         ></a-table-column> | ||||
|         <a-table-column | ||||
|           title="更改时间" | ||||
|           data-index="updateTime" | ||||
|           :width="200" | ||||
|         ></a-table-column> | ||||
|         <a-table-column title="操作" :width="120" align="center"> | ||||
|           <template #cell="{ record }"> | ||||
|             <a-popover | ||||
|               trigger="click" | ||||
|               position="bottom" | ||||
|               content-class="more-option" | ||||
|               :content-style="{ 'padding': 0, 'margin-top': 0 }" | ||||
|             > | ||||
|               <a-button type="text"><icon-more :size="16" /></a-button> | ||||
|               <template #content> | ||||
|                 <FileRightMenu | ||||
|                   :file-info="record" | ||||
|                   :show-class-style="false" | ||||
|                   @click="handleRightMenuItemClick($event, record)" | ||||
|                 ></FileRightMenu> | ||||
|               </template> | ||||
|             </a-popover> | ||||
|           </template> | ||||
|         </a-table-column> | ||||
|       </template> | ||||
|     </a-table> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
|   import type { TableRowSelection } from '@arco-design/web-vue'; | ||||
|   import type { FileItem } from '@/api/system/file'; | ||||
|   import { reactive } from 'vue'; | ||||
|   import FileImg from './FileImg.vue'; | ||||
|   import FileRightMenu from './FileRightMenu.vue'; | ||||
|  | ||||
|   interface Props { | ||||
|     data?: FileItem[]; | ||||
|     isBatchMode?: boolean; | ||||
|   } | ||||
|  | ||||
|   const props = withDefaults(defineProps<Props>(), { | ||||
|     data: () => [], // 文件数据 | ||||
|     isBatchMode: false, // 是否是批量模式 | ||||
|   }); | ||||
|  | ||||
|   const rowSelection: TableRowSelection = reactive({ | ||||
|     type: 'checkbox', | ||||
|     showCheckedAll: true, | ||||
|   }); | ||||
|  | ||||
|   const emit = defineEmits(['click', 'rightMenuClick']); | ||||
|  | ||||
|   // 行点击事件 | ||||
|   const handleRowClick = (row: FileItem) => { | ||||
|     emit('click', row); | ||||
|   }; | ||||
|  | ||||
|   // 右键菜单点击事件 | ||||
|   const handleRightMenuItemClick = (mode: string, item: FileItem) => { | ||||
|     emit('rightMenuClick', mode, item); | ||||
|   }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
|   .more-option { | ||||
|     .arco-popover-content { | ||||
|       margin-top: 0 !important; | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
|  | ||||
| <style lang="less" scoped> | ||||
|   :deep(.arco-table-td .arco-table-cell) { | ||||
|     padding-top: 0; | ||||
|     padding-bottom: 0; | ||||
|   } | ||||
|   .file-list { | ||||
|     width: 100%; | ||||
|     padding-top: 12px; | ||||
|     overflow: hidden; | ||||
|     .file-name { | ||||
|       height: 100%; | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       padding-top: 6px; | ||||
|       padding-bottom: 6px; | ||||
|       cursor: pointer; | ||||
|       .file-image { | ||||
|         width: 30px; | ||||
|         height: 30px; | ||||
|         margin-right: 10px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
| @@ -0,0 +1,91 @@ | ||||
| <template> | ||||
|   <GiOption :class="{ option: showClassStyle }"> | ||||
|     <GiOptionItem @click="onClickItem('rename')"> | ||||
|       <template #icon><GiSvgIcon name="menu-edit"></GiSvgIcon> </template> | ||||
|       <span>重命名</span> | ||||
|     </GiOptionItem> | ||||
|     <GiOptionItem @click="onClickItem('move')"> | ||||
|       <template #icon><GiSvgIcon name="menu-move"></GiSvgIcon> </template> | ||||
|       <span>移动到</span> | ||||
|     </GiOptionItem> | ||||
|     <GiOptionItem @click="onClickItem('download')"> | ||||
|       <template #icon><GiSvgIcon name="menu-download"></GiSvgIcon> </template> | ||||
|       <span>下载</span> | ||||
|     </GiOptionItem> | ||||
|     <a-popover | ||||
|       v-if="props.fileInfo.extendName === 'zip'" | ||||
|       position="right" | ||||
|       :content-style="{ padding: 0, overflow: 'hidden', width: '150px' }" | ||||
|       :arrow-style="{ display: 'none' }" | ||||
|     > | ||||
|       <GiOptionItem more> | ||||
|         <template #icon><GiSvgIcon name="menu-zip"></GiSvgIcon> </template> | ||||
|         <span>解压</span> | ||||
|       </GiOptionItem> | ||||
|       <template #content> | ||||
|         <GiOption> | ||||
|           <GiOptionItem @click="onClickItem('zip1')"> | ||||
|             <template #icon><GiSvgIcon name="file-rar"></GiSvgIcon> </template> | ||||
|             <span>解压到当前目录</span> | ||||
|           </GiOptionItem> | ||||
|           <GiOptionItem @click="onClickItem('zip2')"> | ||||
|             <template #icon><GiSvgIcon name="file-rar"></GiSvgIcon> </template> | ||||
|             <span>解压到其他目录</span> | ||||
|           </GiOptionItem> | ||||
|         </GiOption> | ||||
|       </template> | ||||
|     </a-popover> | ||||
|     <GiOptionItem @click="onClickItem('detail')"> | ||||
|       <template #icon><GiSvgIcon name="menu-detail"></GiSvgIcon> </template> | ||||
|       <span>详情</span> | ||||
|     </GiOptionItem> | ||||
|     <GiOptionItem @click="onClickItem('delete')"> | ||||
|       <template #icon><GiSvgIcon name="menu-delete"></GiSvgIcon> </template> | ||||
|       <span>删除</span> | ||||
|     </GiOptionItem> | ||||
|   </GiOption> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
|   import type { FileItem } from '@/api/system/file'; | ||||
|   // import GiOption from '@/components/GiOption/index.vue'; | ||||
|   // import GiOptionItem from '@/components/GiOptionItem/index.vue'; | ||||
|  | ||||
|   interface Props { | ||||
|     fileInfo?: FileItem; | ||||
|     showClassStyle?: boolean; | ||||
|   } | ||||
|  | ||||
|   const props = withDefaults(defineProps<Props>(), { | ||||
|     fileInfo: () => ({ | ||||
|       id: '', | ||||
|       type: '', | ||||
|       name: '', | ||||
|       extendName: '', | ||||
|       src: '', | ||||
|       updateTime: '', | ||||
|       isDir: false, | ||||
|       filePath: '', | ||||
|     }), // 文件数据 | ||||
|     showClassStyle: true, | ||||
|   }); | ||||
|  | ||||
|   const emit = defineEmits(['click']); | ||||
|  | ||||
|   const onClickItem = (mode: string) => { | ||||
|     emit('click', mode); | ||||
|   }; | ||||
| </script> | ||||
|  | ||||
| <style lang="less" scoped> | ||||
|   .option { | ||||
|     box-shadow: | ||||
|       0 2px 4px rgba(0, 0, 0, 0.12), | ||||
|       0 0 6px rgba(0, 0, 0, 0.04); | ||||
|     border-radius: 4px; | ||||
|     overflow: hidden; | ||||
|     border: 1px solid var(--color-border-2); | ||||
|     box-sizing: border-box; | ||||
|     background: var(--color-bg-popup); | ||||
|   } | ||||
| </style> | ||||
							
								
								
									
										213
									
								
								continew-admin-ui/src/views/system/file/main/FileMain/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,213 @@ | ||||
| <template> | ||||
|   <div class="file-main"> | ||||
|     <a-row justify="space-between" class="row-operate"> | ||||
|       <!-- 左侧区域 --> | ||||
|       <a-space wrap> | ||||
|         <a-button type="primary" shape="round"> | ||||
|           <template #icon><icon-upload /></template> | ||||
|           <template #default>上传</template> | ||||
|         </a-button> | ||||
|         <a-input-group> | ||||
|           <a-space> | ||||
|             <a-input placeholder="输入文件名称搜索" allow-clear> </a-input> | ||||
|             <a-button type="primary"> | ||||
|               <template #icon><icon-search /></template>查询 | ||||
|             </a-button> | ||||
|             <a-button> | ||||
|               <template #icon><icon-refresh /></template>重置 | ||||
|             </a-button> | ||||
|           </a-space> | ||||
|         </a-input-group> | ||||
|       </a-space> | ||||
|  | ||||
|       <!-- 右侧区域 --> | ||||
|       <a-space wrap> | ||||
|         <a-button | ||||
|           v-if="isBatchMode" | ||||
|           :disabled="!fileStore.selectedFileIds.length" | ||||
|           type="primary" | ||||
|           status="danger" | ||||
|           @click="handleMulDelete" | ||||
|           ><template #icon><icon-delete /></template | ||||
|         ></a-button> | ||||
|         <a-button type="primary" @click="isBatchMode = !isBatchMode"> | ||||
|           <template #icon><icon-select-all /></template> | ||||
|           <template #default>{{ | ||||
|             isBatchMode ? '取消批量' : '批量操作' | ||||
|           }}</template> | ||||
|         </a-button> | ||||
|         <a-button-group> | ||||
|           <a-tooltip content="视图" position="bottom"> | ||||
|             <a-button @click="fileStore.changeViewMode"> | ||||
|               <template #icon> | ||||
|                 <icon-apps v-if="fileStore.viewMode === 'grid'" /> | ||||
|                 <icon-list v-else /> | ||||
|               </template> | ||||
|             </a-button> | ||||
|           </a-tooltip> | ||||
|         </a-button-group> | ||||
|       </a-space> | ||||
|     </a-row> | ||||
|  | ||||
|     <!-- 文件列表-宫格模式 --> | ||||
|     <a-spin class="file-wrap" :loading="loading"> | ||||
|       <FileGrid | ||||
|         v-show="fileList.length && fileStore.viewMode == 'grid'" | ||||
|         :data="fileList" | ||||
|         :is-batch-mode="isBatchMode" | ||||
|         :selected-file-ids="fileStore.selectedFileIds" | ||||
|         @click="handleClickFile" | ||||
|         @check="handleCheckFile" | ||||
|         @rightMenuClick="handleRightMenuClick" | ||||
|       ></FileGrid> | ||||
|  | ||||
|       <!-- 文件列表-列表模式 --> | ||||
|       <FileList | ||||
|         v-show="fileList.length && fileStore.viewMode == 'list'" | ||||
|         :data="fileList" | ||||
|         :is-batch-mode="isBatchMode" | ||||
|         @click="handleClickFile" | ||||
|         @rightMenuClick="handleRightMenuClick" | ||||
|       ></FileList> | ||||
|  | ||||
|       <a-empty v-show="!fileList.length"></a-empty> | ||||
|     </a-spin> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
|   import { Message, Modal } from '@arco-design/web-vue'; | ||||
|   import { api as viewerApi } from 'v-viewer'; | ||||
|   import { fileTypeList, imageTypeList } from '@/constant/file'; | ||||
|   import { useFileStore } from '@/store/modules/file'; | ||||
|   import type { FileItem } from '@/api/system/file'; | ||||
|   import { getFileList } from '@/api/system/file'; | ||||
|   import { onBeforeRouteUpdate, useRoute, useRouter } from 'vue-router'; | ||||
|   import { onMounted, ref } from 'vue'; | ||||
|   import FileGrid from './FileGrid.vue'; | ||||
|   import FileList from './FileList.vue'; | ||||
|   import { | ||||
|     openFileMoveModal, | ||||
|     openFileRenameModal, | ||||
|     previewFileVideoModal, | ||||
|     previewFileAudioModal, | ||||
|   } from '../../components/index'; | ||||
|  | ||||
|   const route = useRoute(); | ||||
|   const router = useRouter(); | ||||
|  | ||||
|   const fileStore = useFileStore(); | ||||
|  | ||||
|   const loading = ref(false); | ||||
|   // 文件列表数据 | ||||
|   const fileList = ref<FileItem[]>([]); | ||||
|   const fileType = ref('0'); | ||||
|   // 批量操作 | ||||
|   const isBatchMode = ref(false); | ||||
|   fileType.value = route.query.fileType?.toString() || '0'; | ||||
|  | ||||
|   const getListData = async () => { | ||||
|     try { | ||||
|       loading.value = true; | ||||
|       isBatchMode.value = false; | ||||
|       // const res = await getFileList({ fileType: fileType.value }); | ||||
|       // fileList.value = res.data; | ||||
|     } finally { | ||||
|       loading.value = false; | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   onMounted(() => { | ||||
|     getListData(); | ||||
|   }); | ||||
|  | ||||
|   onBeforeRouteUpdate((to) => { | ||||
|     if (!to.query.fileType) return; | ||||
|     fileType.value = to.query.fileType?.toString(); | ||||
|     getListData(); | ||||
|   }); | ||||
|  | ||||
|   // 点击文件 | ||||
|   const handleClickFile = (item: FileItem) => { | ||||
|     Message.success(`点击了文件-${item.name}`); | ||||
|     if (imageTypeList.includes(item.extendName)) { | ||||
|       if (item.src) { | ||||
|         const imgList: string[] = fileList.value | ||||
|           .filter((i) => imageTypeList.includes(i.extendName)) | ||||
|           .map((a) => a.src || ''); | ||||
|         const index = imgList.findIndex((i) => i === item.src); | ||||
|         if (imgList.length) { | ||||
|           viewerApi({ | ||||
|             options: { | ||||
|               initialViewIndex: index, | ||||
|             }, | ||||
|             images: imgList, | ||||
|           }); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     if (item.extendName === 'mp4') { | ||||
|       previewFileVideoModal(item); | ||||
|     } | ||||
|     if (item.extendName === 'mp3') { | ||||
|       previewFileAudioModal(item); | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   // 勾选文件 | ||||
|   const handleCheckFile = (item: FileItem) => { | ||||
|     fileStore.addSelectedFileItem(item); | ||||
|   }; | ||||
|   // 鼠标右键 | ||||
|   const handleRightMenuClick = (mode: string, fileInfo: FileItem) => { | ||||
|     Message.success(`点击了${mode}`); | ||||
|     if (mode === 'delete') { | ||||
|       Modal.warning({ | ||||
|         title: '提示', | ||||
|         content: '是否删除该文件?', | ||||
|         hideCancel: false, | ||||
|       }); | ||||
|     } | ||||
|     if (mode === 'rename') { | ||||
|       openFileRenameModal(fileInfo); | ||||
|     } | ||||
|     if (mode === 'move') { | ||||
|       openFileMoveModal(fileInfo); | ||||
|     } | ||||
|     if (mode === 'detail') { | ||||
|       router.push({ path: '/file/detail' }); | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   // 批量删除 | ||||
|   const handleMulDelete = () => { | ||||
|     Modal.warning({ | ||||
|       title: '提示', | ||||
|       content: '是否确认删除?', | ||||
|       hideCancel: false, | ||||
|     }); | ||||
|   }; | ||||
| </script> | ||||
|  | ||||
| <style lang="less" scoped> | ||||
|   .file-main { | ||||
|     height: 100%; | ||||
|     background: var(--color-bg-1); | ||||
|     border-radius: 2px; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     overflow: hidden; | ||||
|     .row-operate { | ||||
|       border-bottom: 1px dashed var(--color-border-3); | ||||
|       margin: 20px 16px; | ||||
|     } | ||||
|     .file-wrap { | ||||
|       flex: 1; | ||||
|       padding: 0 16px 16px; | ||||
|       box-sizing: border-box; | ||||
|       overflow: hidden; | ||||
|       display: flex; | ||||
|       flex-direction: column; | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
| @@ -23,3 +23,9 @@ databaseChangeLog: | ||||
|       file: db/changelog/v1.3.0/continew-admin_column.sql | ||||
|   - include: | ||||
|       file: db/changelog/v1.3.0/continew-admin_data.sql | ||||
|   - include: | ||||
|       file: db/changelog/v2.2.0/continew-admin_table.sql | ||||
|   - include: | ||||
|       file: db/changelog/v2.2.0/continew-admin_column.sql | ||||
|   - include: | ||||
|       file: db/changelog/v2.2.0/continew-admin_data.sql | ||||
| @@ -0,0 +1,2 @@ | ||||
| -- liquibase formatted sql | ||||
|  | ||||
| @@ -0,0 +1,17 @@ | ||||
| -- liquibase formatted sql | ||||
|  | ||||
| -- changeset Charles7c:1 | ||||
| -- 初始化默认菜单 | ||||
| INSERT IGNORE INTO `sys_menu` | ||||
| (`id`, `title`, `parent_id`, `type`, `path`, `name`, `component`, `icon`, `is_external`, `is_cache`, `is_hidden`, `permission`, `sort`, `status`, `create_user`, `create_time`, `update_user`, `update_time`) | ||||
| VALUES | ||||
| (1090, '文件管理', 1000, 2, '/system/file', 'File', 'system/file/index', 'file', b'0', b'0', b'0', 'system:file:list', 9, 1, 1, NOW(), NULL, NULL), | ||||
| (1091, '文件上传', 1090, 3, NULL, NULL, NULL, NULL, b'0', b'0', b'0', 'system:file:upload', 1, 1, 1, NOW(), NULL, NULL), | ||||
| (1092, '文件修改', 1090, 3, NULL, NULL, NULL, NULL, b'0', b'0', b'0', 'system:file:update', 2, 1, 1, NOW(), NULL, NULL), | ||||
| (1093, '文件删除', 1090, 3, NULL, NULL, NULL, NULL, b'0', b'0', b'0', 'system:file:delete', 3, 1, 1, NOW(), NULL, NULL), | ||||
| (1094, '文件下载', 1090, 3, NULL, NULL, NULL, NULL, b'0', b'0', b'0', 'system:file:download', 4, 1, 1, NOW(), NULL, NULL), | ||||
| (1100, '存储管理', 1000, 2, '/system/storage', 'Storage', 'system/storage/index', 'storage', b'0', b'0', b'1', 'system:storage:list', 10, 1, 1, NOW(), NULL, NULL), | ||||
| (1101, '存储新增', 1100, 3, NULL, NULL, NULL, NULL, b'0', b'0', b'0', 'system:storage:add', 1, 1, 1, NOW(), NULL, NULL), | ||||
| (1102, '存储修改', 1100, 3, NULL, NULL, NULL, NULL, b'0', b'0', b'0', 'system:storage:update', 2, 1, 1, NOW(), NULL, NULL), | ||||
| (1103, '存储删除', 1100, 3, NULL, NULL, NULL, NULL, b'0', b'0', b'0', 'system:storage:delete', 3, 1, 1, NOW(), NULL, NULL), | ||||
| (1104, '存储导出', 1100, 3, NULL, NULL, NULL, NULL, b'0', b'0', b'0', 'system:storage:export', 4, 1, 1, NOW(), NULL, NULL); | ||||
| @@ -0,0 +1,44 @@ | ||||
| -- liquibase formatted sql | ||||
|  | ||||
| -- changeset Charles7c:1 | ||||
| CREATE TABLE IF NOT EXISTS `sys_file` ( | ||||
|     `id`            bigint(20)   NOT NULL                    COMMENT 'ID', | ||||
|     `name`          varchar(255) NOT NULL                    COMMENT '名称', | ||||
|     `size`          bigint(20)   NOT NULL                    COMMENT '大小(字节)', | ||||
|     `url`           varchar(512) NOT NULL                    COMMENT 'URL', | ||||
|     `extension`     varchar(100) DEFAULT NULL                COMMENT '扩展名', | ||||
|     `mime_type`     varchar(100) DEFAULT NULL                COMMENT 'MIME类型', | ||||
|     `category`      tinyint(1)   UNSIGNED NOT NULL DEFAULT 1 COMMENT '类型(1:其他;2:图片;3:文档;4:视频;5:音频)', | ||||
|     `storage_id`    bigint(20)   NOT NULL                    COMMENT '存储库ID', | ||||
|     `create_user`   bigint(20)   NOT NULL                    COMMENT '创建人', | ||||
|     `create_time`   datetime     NOT NULL                    COMMENT '创建时间', | ||||
|     `update_user`   bigint(20)   DEFAULT NULL                COMMENT '修改人', | ||||
|     `update_time`   datetime     DEFAULT NULL                COMMENT '修改时间', | ||||
|     PRIMARY KEY (`id`) USING BTREE, | ||||
|     INDEX `idx_category`(`category`) USING BTREE, | ||||
|     INDEX `idx_create_user`(`create_user`) USING BTREE, | ||||
|     INDEX `idx_update_user`(`update_user`) USING BTREE | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件表'; | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS `sys_storage` ( | ||||
|     `id`          bigint(20)   AUTO_INCREMENT              COMMENT 'ID', | ||||
|     `name`        varchar(100) NOT NULL                    COMMENT '名称', | ||||
|     `code`        varchar(30)  NOT NULL                    COMMENT '编码', | ||||
|     `access_key`  varchar(255) DEFAULT NULL                COMMENT 'Access Key(访问密钥)', | ||||
|     `secret_key`  varchar(255) DEFAULT NULL                COMMENT 'Secret Key(私有访问密钥)', | ||||
|     `endpoint`    varchar(255) DEFAULT NULL                COMMENT 'Endpoint(终端节点)', | ||||
|     `bucket_name` varchar(255) DEFAULT NULL                COMMENT '桶名称', | ||||
|     `domain`      varchar(255) DEFAULT NULL                COMMENT '自定义域名', | ||||
|     `description` varchar(200) DEFAULT NULL                COMMENT '描述', | ||||
|     `is_default`  bit(1)       NOT NULL DEFAULT b'0'       COMMENT '是否为默认存储', | ||||
|     `sort`        int          NOT NULL DEFAULT 999        COMMENT '排序', | ||||
|     `status`      tinyint(1)   UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1:启用;2:禁用)', | ||||
|     `create_user` bigint(20)   NOT NULL                    COMMENT '创建人', | ||||
|     `create_time` datetime     NOT NULL                    COMMENT '创建时间', | ||||
|     `update_user` bigint(20)   DEFAULT NULL                COMMENT '修改人', | ||||
|     `update_time` datetime     DEFAULT NULL                COMMENT '修改时间', | ||||
|     PRIMARY KEY (`id`) USING BTREE, | ||||
|     UNIQUE INDEX `uk_code`(`code`) USING BTREE, | ||||
|     INDEX `idx_create_user`(`create_user`) USING BTREE, | ||||
|     INDEX `idx_update_user`(`update_user`) USING BTREE | ||||
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='存储库表'; | ||||