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='存储库表';
|