diff options
| author | zhanghongqing <[email protected]> | 2022-08-09 16:54:16 +0800 |
|---|---|---|
| committer | zhanghongqing <[email protected]> | 2022-08-09 16:54:16 +0800 |
| commit | b3fa11d4b1b5a68d7b04fde5eb6cfbda557927eb (patch) | |
| tree | a49d344e49fc427fbf4cf00aa4963c4d04cd98a4 /src/main/resources/static | |
| parent | d8a2be0d094ac9ba2d47c81ebf03b3fe6e34a078 (diff) | |
Diffstat (limited to 'src/main/resources/static')
| -rw-r--r-- | src/main/resources/static/404.html | 1638 | ||||
| -rw-r--r-- | src/main/resources/static/admin.html | 865 | ||||
| -rw-r--r-- | src/main/resources/static/error.html | 12 | ||||
| -rw-r--r-- | src/main/resources/static/filemanager.html | 40 | ||||
| -rw-r--r-- | src/main/resources/static/home.html | 118 | ||||
| -rw-r--r-- | src/main/resources/static/index.html | 360 | ||||
| -rw-r--r-- | src/main/resources/static/signin.html | 125 | ||||
| -rw-r--r-- | src/main/resources/static/upload.html | 63 |
8 files changed, 3221 insertions, 0 deletions
diff --git a/src/main/resources/static/404.html b/src/main/resources/static/404.html new file mode 100644 index 0000000..98d38b3 --- /dev/null +++ b/src/main/resources/static/404.html @@ -0,0 +1,1638 @@ +<!DOCTYPE html> +<html lang="cn"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0,user-scalable=no"> + <link rel="shortcut icon" href="/assets/img/file-favicon.png"/> + <title>404</title> + <style> + body { + min-width: 320px; + background: #333 + } + + #head-body { + position: relative; + z-index: 2; + margin: 25px 0 50px 0; + width: 200px; + height: 0; + border-top: 150px solid #555; + border-right: 25px solid transparent; + border-left: 25px solid transparent + } + + #head-body:after { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; + border-color: #555 transparent transparent transparent; + border-style: solid; + border-width: 150px 100px 0 100px; + content: "" + } + + #head-eye { + position: relative; + top: -585px; + left: 67px; + z-index: 12; + width: 32px; + height: 22px; + background: #4CBEFF; + box-shadow: rgba(255, 255, 255, .4) 0 0 15px, rgba(76, 190, 255, .95) 0 0 10px; + -webkit-transform: skew(46deg) rotate(14deg); + -moz-transform: skew(46deg) rotate(14deg); + -o-transform: skew(46deg) rotate(14deg) + } + + #head-eye-2 { + position: relative; + top: -607px; + left: 150px; + z-index: 12; + width: 32px; + height: 22px; + background: #4CBEFF; + box-shadow: rgba(255, 255, 255, .4) 0 0 15px, rgba(76, 190, 255, .95) 0 0 10px; + -webkit-transform: skew(-46deg) rotate(-14deg); + -moz-transform: skew(-46deg) rotate(-14deg); + -o-transform: skew(-46deg) rotate(-14deg) + } + + #head-topcover { + position: relative; + top: -225px; + left: -19px; + z-index: 5; + width: 169px; + height: 0; + border-top: 80px solid #333; + border-right: 60px solid transparent; + border-left: 60px solid transparent + } + + #head-topcover:after { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; + border-color: #333 transparent transparent transparent; + border-style: solid; + border-width: 15px 85px 0 85px; + content: "" + } + + #head-toplogo-bg { + position: relative; + top: -267px; + left: 67px; + z-index: 6; + width: 46px; + height: 0; + border-top: 110px solid #333; + border-right: 35px solid transparent; + border-left: 35px solid transparent + } + + #head-toplogo-bg:after { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; + border-color: #333 transparent transparent transparent; + border-style: solid; + border-width: 30px 23px 0 23px; + content: "" + } + + #head-toplogo { + position: relative; + top: -377px; + left: 75px; + z-index: 7; + width: 40px; + height: 0; + border-top: 105px solid #555; + border-right: 30px solid transparent; + border-left: 30px solid transparent + } + + #head-toplogo:before { + position: absolute; + top: -42px; + left: 10px; + display: block; + width: 0; + height: 0; + border-top: 30px solid #333; + border-right: 10px solid transparent; + border-left: 10px solid transparent; + content: '' + } + + #head-toplogo:after { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; + border-color: #555 transparent transparent transparent; + border-style: solid; + border-width: 28px 20px 0 20px; + content: "" + } + + #head-toplogo-2 { + position: relative; + top: -482px; + left: 75px; + z-index: 8; + width: 30px; + height: 0; + border-top: 37px solid #333; + border-right: 35px solid transparent; + border-left: 35px solid transparent + } + + #head-bottom { + position: relative; + top: -365px; + left: -31px; + z-index: 10; + display: block; + margin: 50px 0; + width: 0; + height: 0; + border-right: 107px solid transparent; + border-bottom: 44px solid #555; + border-left: 60px solid transparent; + color: #555; + -webkit-transform: rotate(236deg); + -moz-transform: rotate(236deg); + -o-transform: rotate(236deg); + -ms-transform: rotate(236deg) + } + + #head-bottom-2 { + position: relative; + top: -460px; + left: 115px; + display: block; + width: 0; + height: 0; + border-right: 60px solid transparent; + border-bottom: 44px solid #555; + border-left: 107px solid transparent; + color: #555; + -webkit-transform: rotate(484deg); + -moz-transform: rotate(484deg); + -o-transform: rotate(484deg); + -ms-transform: rotate(484deg) + } + + #head-sw { + position: relative; + top: -629px; + left: 45px; + z-index: 15; + width: 49px; + height: 8px; + background: #333; + -webkit-transform: skew(-149deg) rotate(9deg); + -moz-transform: skew(-149deg) rotate(9deg); + -o-transform: skew(-149deg) rotate(9deg) + } + + #head-sw:after { + position: absolute; + top: 24px; + left: -6px; + width: 53px; + height: 8px; + background: #333; + content: ""; + -webkit-transform: skew(-174deg) rotate(1deg); + -moz-transform: skew(-174deg) rotate(1deg); + -o-transform: skew(-174deg) rotate(1deg) + } + + #head-sw-2 { + position: relative; + top: -637px; + left: 155px; + z-index: 15; + width: 49px; + height: 8px; + background: #333; + -webkit-transform: skew(279deg) rotate(10deg); + -moz-transform: skew(279deg) rotate(10deg); + -o-transform: skew(279deg) rotate(10deg) + } + + #head-sw-2:after { + position: absolute; + top: -2px; + left: 132px; + width: 45px; + height: 9px; + background: #333; + content: ""; + -webkit-transform: skew(-212deg) rotate(0); + -moz-transform: skew(-212deg) rotate(0); + -o-transform: skew(-212deg) rotate(0) + } + + #t-ov { + overflow: hidden; + margin: 50px auto 20px auto; + width: 250px; + height: 325px + } + + .motime #head-body { + animation: head-body-1 4s cubic-bezier(.25, .1, .25, 1); + -moz-animation: head-body-1 4s cubic-bezier(.25, .1, .25, 1); + -webkit-animation: head-body-1 4s cubic-bezier(.25, .1, .25, 1); + -o-animation: head-body-1 4s cubic-bezier(.25, .1, .25, 1) + } + + @keyframes head-body-1 { + 0% { + top: 350px; + border-top: 150px solid #555; + border-right: 25px solid transparent; + border-left: 25px solid transparent + } + 100% { + top: 0; + border-top: 150px solid #555; + border-right: 25px solid transparent; + border-left: 25px solid transparent + } + } + + @-moz-keyframes head-body-1 { + 0% { + top: 350px; + border-top: 150px solid #555; + border-right: 25px solid transparent; + border-left: 25px solid transparent + } + 100% { + top: 0; + border-top: 150px solid #555; + border-right: 25px solid transparent; + border-left: 25px solid transparent + } + } + + @-webkit-keyframes head-body-1 { + 0% { + top: 350px; + border-top: 150px solid #555; + border-right: 25px solid transparent; + border-left: 25px solid transparent + } + 100% { + top: 0; + border-top: 150px solid #555; + border-right: 25px solid transparent; + border-left: 25px solid transparent + } + } + + @-o-keyframes head-body-1 { + 0% { + top: 350px; + border-top: 150px solid #555; + border-right: 25px solid transparent; + border-left: 25px solid transparent + } + 100% { + top: 0; + border-top: 150px solid #555; + border-right: 25px solid transparent; + border-left: 25px solid transparent + } + } + + .motime #head-toplogo { + animation: head-body-2 2s cubic-bezier(.25, .1, .25, 1); + -moz-animation: head-body-2 2s cubic-bezier(.25, .1, .25, 1); + -webkit-animation: head-body-2 2s cubic-bezier(.25, .1, .25, 1); + -o-animation: head-body-2 2s cubic-bezier(.25, .1, .25, 1) + } + + @keyframes head-body-2 { + 0% { + top: -600px + } + 100% { + top: -377px + } + } + + @-moz-keyframes head-body-2 { + 0% { + top: -600px + } + 100% { + top: -377px + } + } + + @-webkit-keyframes head-body-2 { + 0% { + top: -600px + } + 100% { + top: -377px + } + } + + @-o-keyframes head-body-2 { + 0% { + top: -600px + } + 100% { + top: -377px + } + } + + .motime #head-toplogo-2 { + animation: head-body-3 4s cubic-bezier(1, .5, .25, .1); + -moz-animation: head-body-3 4s cubic-bezier(1, .5, .25, .1); + -webkit-animation: head-body-3 4s cubic-bezier(1, .5, .25, .1); + -o-animation: head-body-3 4s cubic-bezier(1, .5, .25, .1) + } + + @keyframes head-body-3 { + 0% { + top: -800px + } + 100% { + top: -482px + } + } + + @-moz-keyframes head-body-3 { + 0% { + top: -800px + } + 100% { + top: -482px + } + } + + @-webkit-keyframes head-body-3 { + 0% { + top: -800px + } + 100% { + top: -482px + } + } + + @-o-keyframes head-body-3 { + 0% { + top: -800px + } + 100% { + top: -482px + } + } + + .motime #head-eye, .motime #head-eye-2 { + animation: head-body-4 5s cubic-bezier(1, 1, .5, .005); + -moz-animation: head-body-4 5s cubic-bezier(1, 1, .5, .005); + -webkit-animation: head-body-4 5s cubic-bezier(1, 1, .5, .005); + -o-animation: head-body-4 5s cubic-bezier(1, 1, .5, .005) + } + + @keyframes head-body-4 { + 0% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 5% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 10% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 15% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 20% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 25% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 30% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 35% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 40% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 45% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 50% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 55% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 60% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 65% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 70% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 75% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 80% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 85% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 90% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 95% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 100% { + background: #4CBEFF; + -webkit-box-shadow: rgba(255, 255, 255, .4) 0 0 35px, rgba(76, 190, 255, .95) 0 0 25px; + -moz-box-shadow: rgba(255, 255, 255, .4) 0 0 35px, rgba(76, 190, 255, .95) 0 0 25px; + box-shadow: rgba(255, 255, 255, .4) 0 0 35px, rgba(76, 190, 255, .95) 0 0 25px + } + } + + @-moz-keyframes head-body-4 { + 0% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 5% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 10% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 15% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 20% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 25% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 30% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 35% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 40% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 45% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 50% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 55% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 60% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 65% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 70% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 75% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 80% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 85% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 90% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 95% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 100% { + background: #4CBEFF; + -webkit-box-shadow: rgba(255, 255, 255, .4) 0 0 35px, rgba(76, 190, 255, .95) 0 0 25px; + -moz-box-shadow: rgba(255, 255, 255, .4) 0 0 35px, rgba(76, 190, 255, .95) 0 0 25px; + box-shadow: rgba(255, 255, 255, .4) 0 0 35px, rgba(76, 190, 255, .95) 0 0 25px + } + } + + @-webkit-keyframes head-body-4 { + 0% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 5% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 10% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 15% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 20% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 25% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 30% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 35% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 40% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 45% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 50% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 55% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 60% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 65% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 70% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 75% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 80% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 85% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 90% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 95% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 100% { + background: #4CBEFF; + -webkit-box-shadow: rgba(255, 255, 255, .4) 0 0 35px, rgba(76, 190, 255, .95) 0 0 25px; + -moz-box-shadow: rgba(255, 255, 255, .4) 0 0 35px, rgba(76, 190, 255, .95) 0 0 25px; + box-shadow: rgba(255, 255, 255, .4) 0 0 35px, rgba(76, 190, 255, .95) 0 0 25px + } + } + + @-o-keyframes head-body-4 { + 0% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 5% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 10% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 15% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 20% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 25% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 30% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 35% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 40% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 45% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 50% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 55% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 60% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 65% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 70% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 75% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 80% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 85% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 90% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 95% { + background: 0 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none + } + 100% { + background: #4CBEFF; + -webkit-box-shadow: rgba(255, 255, 255, .4) 0 0 35px, rgba(76, 190, 255, .95) 0 0 25px; + -moz-box-shadow: rgba(255, 255, 255, .4) 0 0 35px, rgba(76, 190, 255, .95) 0 0 25px; + box-shadow: rgba(255, 255, 255, .4) 0 0 35px, rgba(76, 190, 255, .95) 0 0 25px + } + } + + .motime #head-bottom { + animation: head-body-5 3s cubic-bezier(.1, .025, .005, .005); + -moz-animation: head-body-5 3s cubic-bezier(.1, .025, .005, .005); + -webkit-animation: head-body-5 3s cubic-bezier(.1, .025, .005, .005); + -o-animation: head-body-5 3s cubic-bezier(.1, .025, .005, .005) + } + + @keyframes head-body-5 { + 0% { + left: 300px + } + 50% { + left: -120px + } + 100% { + left: -31px + } + } + + @-moz-keyframes head-body-5 { + 0% { + left: 300px + } + 50% { + left: -120px + } + 100% { + left: -31px + } + } + + @-webkit-keyframes head-body-5 { + 0% { + left: 300px + } + 50% { + left: -120px + } + 100% { + left: -31px + } + } + + @-o-keyframes head-body-5 { + 0% { + left: 300px + } + 50% { + left: -120px + } + 100% { + left: -31px + } + } + + .motime #head-bottom-2 { + animation: head-body-6 3s cubic-bezier(.1, .025, .005, .005); + -moz-animation: head-body-6 3s cubic-bezier(.1, .025, .005, .005); + -webkit-animation: head-body-6 3s cubic-bezier(.1, .025, .005, .005); + -o-animation: head-body-6 3s cubic-bezier(.1, .025, .005, .005) + } + + @keyframes head-body-6 { + 0% { + left: -300px + } + 50% { + left: 300px + } + 100% { + left: 115px + } + } + + @-moz-keyframes head-body-6 { + 0% { + left: -300px + } + 50% { + left: 300px + } + 100% { + left: 115px + } + } + + @-webkit-keyframes head-body-6 { + 0% { + left: -300px + } + 50% { + left: 300px + } + 100% { + left: 115px + } + } + + @-o-keyframes head-body-6 { + 0% { + left: -300px + } + 50% { + left: 300px + } + 100% { + left: 115px + } + } + + .motime #head-toplogo:before { + animation: head-body-7 3s cubic-bezier(1, 1, .005, .005); + -moz-animation: head-body-7 3s cubic-bezier(1, 1, .005, .005); + -webkit-animation: head-body-7 3s cubic-bezier(1, 1, .5, .005); + -o-animation: head-body-7 3s cubic-bezier(1, 1, .005, .005) + } + + @keyframes head-body-7 { + 0% { + border-top: 30px solid #555 + } + 5% { + border-top: 30px solid #555 + } + 10% { + border-top: 30px solid #555 + } + 15% { + border-top: 30px solid #555 + } + 20% { + border-top: 30px solid #555 + } + 25% { + border-top: 30px solid #555 + } + 30% { + border-top: 30px solid #555 + } + 35% { + border-top: 30px solid #555 + } + 40% { + border-top: 30px solid #555 + } + 45% { + border-top: 30px solid #555 + } + 50% { + border-top: 30px solid #555 + } + 55% { + border-top: 30px solid #555 + } + 60% { + border-top: 30px solid #555 + } + 65% { + border-top: 30px solid #555 + } + 70% { + border-top: 30px solid #555 + } + 75% { + border-top: 30px solid #555 + } + 80% { + border-top: 30px solid #555 + } + 85% { + border-top: 30px solid #555 + } + 90% { + border-top: 30px solid #333 + } + 95% { + border-top: 30px solid #555 + } + 100% { + border-top: 30px solid #333 + } + } + + @-moz-keyframes head-body-7 { + 0% { + border-top: 30px solid #555 + } + 5% { + border-top: 30px solid #555 + } + 10% { + border-top: 30px solid #555 + } + 15% { + border-top: 30px solid #555 + } + 20% { + border-top: 30px solid #555 + } + 25% { + border-top: 30px solid #555 + } + 30% { + border-top: 30px solid #555 + } + 35% { + border-top: 30px solid #555 + } + 40% { + border-top: 30px solid #555 + } + 45% { + border-top: 30px solid #555 + } + 50% { + border-top: 30px solid #555 + } + 55% { + border-top: 30px solid #555 + } + 60% { + border-top: 30px solid #555 + } + 65% { + border-top: 30px solid #555 + } + 70% { + border-top: 30px solid #555 + } + 75% { + border-top: 30px solid #555 + } + 80% { + border-top: 30px solid #555 + } + 85% { + border-top: 30px solid #555 + } + 90% { + border-top: 30px solid #333 + } + 95% { + border-top: 30px solid #555 + } + 100% { + border-top: 30px solid #333 + } + } + + @-webkit-keyframes head-body-7 { + 0% { + border-top: 30px solid #555 + } + 5% { + border-top: 30px solid #555 + } + 10% { + border-top: 30px solid #555 + } + 15% { + border-top: 30px solid #555 + } + 20% { + border-top: 30px solid #555 + } + 25% { + border-top: 30px solid #555 + } + 30% { + border-top: 30px solid #555 + } + 35% { + border-top: 30px solid #555 + } + 40% { + border-top: 30px solid #555 + } + 45% { + border-top: 30px solid #555 + } + 50% { + border-top: 30px solid #555 + } + 55% { + border-top: 30px solid #555 + } + 60% { + border-top: 30px solid #555 + } + 65% { + border-top: 30px solid #555 + } + 70% { + border-top: 30px solid #555 + } + 75% { + border-top: 30px solid #555 + } + 80% { + border-top: 30px solid #555 + } + 85% { + border-top: 30px solid #555 + } + 90% { + border-top: 30px solid #333 + } + 95% { + border-top: 30px solid #555 + } + 100% { + border-top: 30px solid #333 + } + } + + @-o-keyframes head-body-7 { + 0% { + border-top: 30px solid #555 + } + 5% { + border-top: 30px solid #555 + } + 10% { + border-top: 30px solid #555 + } + 15% { + border-top: 30px solid #555 + } + 20% { + border-top: 30px solid #555 + } + 25% { + border-top: 30px solid #555 + } + 30% { + border-top: 30px solid #555 + } + 35% { + border-top: 30px solid #555 + } + 40% { + border-top: 30px solid #555 + } + 45% { + border-top: 30px solid #555 + } + 50% { + border-top: 30px solid #555 + } + 55% { + border-top: 30px solid #555 + } + 60% { + border-top: 30px solid #555 + } + 65% { + border-top: 30px solid #555 + } + 70% { + border-top: 30px solid #555 + } + 75% { + border-top: 30px solid #555 + } + 80% { + border-top: 30px solid #555 + } + 85% { + border-top: 30px solid #555 + } + 90% { + border-top: 30px solid #333 + } + 95% { + border-top: 30px solid #555 + } + 100% { + border-top: 30px solid #333 + } + } + + .wrap { + margin: 0 auto; + width: 200px; + height: 80px + } + + .loading { + position: relative; + width: 185px; + height: 20px; + color: #4CBEFF; + text-align: right; + text-shadow: 0 0 6px #bce4ff; + text-shadow: rgba(255, 255, 255, .4) 0 0 35px, rgba(76, 190, 255, .95) 0 0 25px; + font-family: arial + } + + .loading span { + position: absolute; + right: 30px; + display: block; + width: 200px; + height: 20px; + text-transform: uppercase; + line-height: 20px + } + + .loading span:after { + position: absolute; + top: -2px; + right: -21px; + display: block; + width: 16px; + height: 20px; + background: #4CBEFF; + -webkit-box-shadow: 0 0 15px #bce4ff; + -moz-box-shadow: 0 0 15px #bce4ff; + box-shadow: 0 0 15px #bce4ff; + content: ""; + -moz-animation: blink 5s infinite; + -webkit-animation: blink 5s infinite; + animation: blink 5s infinite + } + + .loading span.title { + -moz-animation: title 12s linear infinite; + -webkit-animation: title 12s linear infinite; + animation: title 12s linear infinite + } + + .loading span.text { + opacity: 0; + -moz-animation: title 12s linear 5s infinite; + -webkit-animation: title 12s linear 5s infinite; + animation: title 12s linear 5s infinite + } + + @-webkit-keyframes title { + 0% { + right: 130px; + opacity: 0 + } + 48% { + right: 130px; + opacity: 0 + } + 52% { + right: 30px; + opacity: 1 + } + 70% { + right: 30px; + opacity: 1 + } + 100% { + right: 30px; + opacity: 0 + } + } + + @-moz-keyframes title { + 0% { + right: 130px; + opacity: 0 + } + 48% { + right: 130px; + opacity: 0 + } + 52% { + right: 30px; + opacity: 1 + } + 70% { + right: 30px; + opacity: 1 + } + 100% { + right: 30px; + opacity: 0 + } + } + + @-webkit-keyframes fade { + 0% { + opacity: 1 + } + 100% { + opacity: 0 + } + } + + @-moz-keyframes fade { + 0% { + opacity: 1 + } + 100% { + opacity: 0 + } + } + + @-webkit-keyframes bg { + 0% { + background-color: #306f99 + } + 50% { + background-color: #19470f + } + 90% { + background-color: #734a10 + } + } + + @-moz-keyframes bg { + 0% { + background-color: #306f99 + } + 50% { + background-color: #19470f + } + 90% { + background-color: #734a10 + } + } + + @-webkit-keyframes blink { + 0% { + opacity: 0 + } + 5% { + opacity: 1 + } + 10% { + opacity: 0 + } + 15% { + opacity: 1 + } + 20% { + opacity: 0 + } + 25% { + opacity: 1 + } + 30% { + opacity: 0 + } + 35% { + opacity: 1 + } + 40% { + right: -21px; + opacity: 0 + } + 45% { + right: 80px; + opacity: 1 + } + 50% { + right: -21px; + opacity: 0 + } + 51% { + right: -21px + } + 55% { + opacity: 1 + } + 60% { + opacity: 0 + } + 65% { + opacity: 1 + } + 70% { + opacity: 0 + } + 75% { + opacity: 1 + } + 80% { + opacity: 0 + } + 85% { + opacity: 1 + } + 90% { + right: -21px; + opacity: 0 + } + 95% { + right: 80px; + opacity: 1 + } + 96% { + right: -21px + } + 100% { + right: -21px; + opacity: 0 + } + } + + @-moz-keyframes blink { + 0% { + opacity: 0 + } + 5% { + opacity: 1 + } + 10% { + opacity: 0 + } + 15% { + opacity: 1 + } + 20% { + opacity: 0 + } + 25% { + opacity: 1 + } + 30% { + opacity: 0 + } + 35% { + opacity: 1 + } + 40% { + right: -21px; + opacity: 0 + } + 45% { + right: 80px; + opacity: 1 + } + 50% { + right: -21px; + opacity: 0 + } + 51% { + right: -21px + } + 55% { + opacity: 1 + } + 60% { + opacity: 0 + } + 65% { + opacity: 1 + } + 70% { + opacity: 0 + } + 75% { + opacity: 1 + } + 80% { + opacity: 0 + } + 85% { + opacity: 1 + } + 90% { + right: -21px; + opacity: 0 + } + 95% { + right: 80px; + opacity: 1 + } + 96% { + right: -21px + } + 100% { + right: -21px; + opacity: 0 + } + } + </style> +</head> +<body> +<div id="t-ov"> + <div class="motime"> + <div id="head-body"></div> + <div id="head-topcover"></div> + <div id="head-toplogo-bg"></div> + <div id="head-toplogo"></div> + <div id="head-toplogo-2"></div> + <div id="head-bottom"></div> + <div id="head-bottom-2"></div> + <div id="head-sw"></div> + <div id="head-sw-2"></div> + <div id="head-eye"></div> + <div id="head-eye-2"></div> + </div> +</div> +<iframe frameborder="0" scrolling="no" src="" width="100%" height="100px"></iframe> +<h1 style="text-align:center"> + <span style="color:#555;font-family:'Microsoft YaHei'">糟糕,找不到数据了</span></h1> +<blockquote> +</blockquote> +</body> +</html>
\ No newline at end of file diff --git a/src/main/resources/static/admin.html b/src/main/resources/static/admin.html new file mode 100644 index 0000000..3befffd --- /dev/null +++ b/src/main/resources/static/admin.html @@ -0,0 +1,865 @@ +<!DOCTYPE html> +<html xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml" lang="cn"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0,user-scalable=no"> + <link rel="shortcut icon" href="/assets/img/file-favicon.png"/> + <!--<link rel="stylesheet" href="/assets/css/foundation.min.css">--> + <link rel="stylesheet" href="/assets/css/bootstrap.min.css"/> + <link rel="stylesheet" href="/assets/css/nav.css"/> + <link rel="stylesheet" href="/assets/css/glyphicons.css"> + <link rel="stylesheet" href="/assets/css/pretty-checkbox.min.css"/> + <script src="/assets/js/popper.min.js"></script> + <script src="/assets/js/jquery-3.3.1.js"></script> + <script src="/assets/js/bootstrap.min.js"></script> + <script src="/assets/js/nav.js"></script> + <script src="/assets/js/layer.js"></script> + <script src="/assets/js/vue.js"></script> + <script src="/assets/js/utils.js"></script> + <!--<script src="/assets/js/jsoneditor.js"></script>--> + <link rel="stylesheet" href="/assets/css/style.css"/> + <title>管理员</title> +</head> +<body id="particles-js" style="overflow-x: hidden;"> +<div class="jq-nav float-left float-sm-left" style="height: 100%;min-height: 100vh;position: fixed;"> + <div class="jq-nav-top"> + <div id="mini" style="border-bottom:1px solid rgba(255,255,255,0.1)"><img src="/assets/img/mini.png"></div> + </div> + <ul> + <li class="jq-nav-item"> + <a href="#upload-manager"><span class="glyphicon glyphicon-cloud-upload"> <b>上传记录</b></span></a> + </li> + <li class="jq-nav-item"> + <a href="#download-manager"><span class="glyphicon glyphicon-cloud-download"> <b>下载记录</b></span></a> + </li> + <li class="jq-nav-item"> + <a href="#file-manager"><span class="glyphicon glyphicon-file"> <b>文件管理</b></span></a> + </li> + <li class="jq-nav-item"> + <a href="#auth-manager"><span class="glyphicon glyphicon-lock"> <b>权限管理</b></span></a> + </li> + <li class="jq-nav-item"> + <a href="#category-manager"><span class="glyphicon glyphicon-filter"> <b>分类管理</b></span></a> + </li> + <li class="jq-nav-item"> + <a href="#user-manager"><span class="glyphicon glyphicon-user"> <b>用户管理</b></span></a> + </li> + <li class="jq-nav-item"> + <a href="filemanager" target="_blank"><span + class="glyphicon glyphicon-folder-close"> <b>远程管理</b></span></a> + </li> + <li class="jq-nav-item"> + <a href="#system-setting"><span class="glyphicon glyphicon-cog"> <b>系统设置</b></span></a> + </li> + </ul> +</div> +<br/> +<div id="container"> + <!--上传记录--> + <div class="row jq-tab" id="upload-manager"> + <file-filter-item></file-filter-item> + <div class="col-12 col-sm-10 offset-sm-1"><br/></div> + <div class="col-12 col-sm-10 offset-sm-1 content-box rounded"> + <br/> + <table class="table table-bordered table-hover table-responsive table-condensed"> + <thead> + <tr> + <th>编号</th> + <th>用户名</th> + <th>邮箱</th> + <th>文件路径</th> + <th>分类名</th> + <th>链接</th> + <th>上传时间</th> + </tr> + </thead> + <tbody> + <tr v-for="(upload,key) in uploaded"> + <td>{{key+1}}</td> + <td>{{upload.username}}</td> + <td>{{upload.email}}</td> + <td><a href="javascript:" onclick="alerts($(event.srcElement).attr('data-title'));" + v-bind:title="upload.localUrl" data-toggle="tooltip" + v-bind:data-title="upload.localUrl">查看</a></td> + <td>{{upload.categoryName}}</td> + <td><a v-bind:href="upload.visitUrl" target="_blank">访问</a></td> + <td>{{new Date(upload.createTime).format('yyyy-MM-dd hh:mm:ss')}}</td> + </tr> + </tbody> + </table> + </div> + <br/> + <button class="btn btn-lg btn-link btn-block" onclick="offset+=1;getUploaded();"><b><i + class="glyphicon glyphicon-arrow-down"></i> 获取更多</b></button> + <br/> + </div> + <!--下载记录--> + <div class="row jq-tab hide" id="download-manager"> + <file-filter-item></file-filter-item> + <div class="col-12 col-sm-10 offset-sm-1"><br/></div> + <div class="col-12 col-sm-10 offset-sm-1 content-box rounded"> + <br/> + <table class="table table-bordered table-hover table-responsive table-condensed"> + <thead> + <tr> + <th>编号</th> + <!--<th>用户编号</th>--> + <!--<th>文件编号</th>--> + <th>用户名</th> + <th>邮箱</th> + <th>文件名</th> + <th>分类</th> + <th>链接</th> + <th>下载时间</th> + </tr> + </thead> + <tbody> + <tr v-for="(download,key) in downloaded"> + <td>{{key+1}}</td> + <!--<td>{{download.userId}}</td>--> + <!--<td>{{download.fileId}}</td>--> + <td>{{download.username}}</td> + <td>{{download.email}}</td> + <td>{{download.fileName}}</td> + <td>{{download.categoryName}}</td> + <td><a v-bind:href="download.visitUrl" target="_blank">访问</a></td> + <td>{{new Date(download.createTime).format('yyyy-MM-dd hh:mm:ss')}}</td> + </tr> + </tbody> + </table> + </div> + <br/> + <button class="btn btn-lg btn-link btn-block" onclick="offset+=1;getDownloaded();"><b><i + class="glyphicon glyphicon-arrow-down"></i> 获取更多</b></button> + <br/> + </div> + <!--文件管理--> + <div class="row jq-tab hide" id="file-manager"> + <file-filter-item></file-filter-item> + <div class="col-12 col-sm-10 offset-sm-1"><br/></div> + <div class="col-12 col-sm-10 offset-sm-1 content-box rounded"> + <br/> + <div class="text-right"> + <button class="btn btn-primary" onclick="showFileShareModal();"><i + class="glyphicon glyphicon-share"></i> 共享 + </button> + <button class="btn btn-success to-upload-button"><i + class="glyphicon glyphicon-cloud-upload"></i> 上传 + </button> + <button class="btn btn-warning" onclick="showFileModal('#file-manager-table','#fileModifiedModal');"><i + class="glyphicon glyphicon-wrench"></i> 修改 + </button> + <button class="btn btn-dark" onclick="showFileModal('#file-manager-table','#fileAuthModal');"><i + class="glyphicon glyphicon-eye-close"></i> 权限 + </button> + <button class="btn btn-danger file-delete"><i class="glyphicon glyphicon-trash"></i> 删除</button> + </div> + <br/> + <table class="table table-bordered table-hover table-responsive table-condensed" id="file-manager-table"> + <thead> + <tr> + <th> + <div class="pretty p-default p-curve p-thick"> + <input type="checkbox" id="file-toggle-box" name="file" title="" + onchange="toggleCheckBoxStatus('file');"/> + <div class="state p-info-o"> + <label></label> + </div> + </div> + </th> + <th>编号</th> + <th>文件编号</th> + <th>用户名</th> + <th>本地路径</th> + <th>分类</th> + <th>链接</th> + <th>下载次数</th> + <th>上传时间</th> + </tr> + </thead> + <tbody> + <tr v-for="(file,key) in files" onclick="toggleRowSelectedStatus(this);"> + <td> + <div class="pretty p-default p-curve p-thick"> + <input type="checkbox" name="file" title=""/> + <div class="state p-info-o"> + <label></label> + </div> + </div> + </td> + <td class="file-index" v-bind:data-key="key">{{key+1}}</td> + <td>{{file.id}}</td> + <td>{{file.username}}</td> + <td><a href="javascript:" onclick="alerts($(event.srcElement).attr('data-title'));" + v-bind:title="file.localUrl" data-toggle="tooltip" + v-bind:data-title="file.localUrl">查看</a></td> + <td>{{file.categoryName}}</td> + <td><a v-bind:href="file.visitUrl" target="_blank">访问</a></td> + <td>{{file.downloadTimes}}</td> + <td>{{new Date(file.createTime).format('yyyy-MM-dd hh:mm:ss')}}</td> + </tr> + </tbody> + </table> + </div> + <br/> + <button class="btn btn-lg btn-link btn-block" onclick="offset+=1;getFile();"><b><i + class="glyphicon glyphicon-arrow-down"></i> 获取更多</b></button> + <br/> + </div> + <!--权限管理--> + <div class="row jq-tab hide" id="auth-manager"> + <div class="col-12 col-sm-10 offset-sm-1 content-box rounded"> + <br/> + <div class="row"> + <div class="col-sm-4 col-6"> + <input type="text" class="form-control auth-search user-filter" placeholder="用户名或邮箱" + onkeyup="fileFilter();"/> + </div> + <div class="col-sm-4 col-6"> + <input type="text" class="form-control auth-search file-name-filter" placeholder="文件名,模糊搜索" + onkeyup="fileFilter();"/> + </div> + </div> + <br/> + </div> + <div class="col-12 col-sm-10 offset-sm-1"><br/></div> + <div class="col-12 col-sm-10 offset-sm-1 content-box rounded"> + <br/> + <div class="text-right"> + <button class="btn btn-primary" data-toggle="modal" data-target="#authAddedModal" + onclick="authFileSearch='';"><i class="glyphicon glyphicon-flash"></i> 新增 + </button> + <button class="btn btn-success" onclick="showFileModal('#auth-manager-table','#authEditModal');"><i + class="glyphicon glyphicon-edit"></i> 编辑 + </button> + <button class="btn btn-danger auth-delete"><i class="glyphicon glyphicon-trash"></i> 删除</button> + </div> + <br/> + <table class="table table-bordered table-hover table-responsive table-condensed" id="auth-manager-table"> + <thead> + <tr> + <th> + <div class="pretty p-default p-curve p-thick"> + <input type="checkbox" id="auth-toggle-box" name="file" title="" + onchange="toggleCheckBoxStatus('auth');"/> + <div class="state p-info-o"> + <label></label> + </div> + </div> + </th> + <th>编号</th> + <th>用户名</th> + <th>文件名</th> + <th>本地路径</th> + <th>下载权限</th> + <th>删除权限</th> + <th>修改权限</th> + <th>可见权限</th> + <th>创建时间</th> + </tr> + </thead> + <tbody> + <tr v-for="(auth,key) in auths" onclick="toggleRowSelectedStatus(this);"> + <td> + <div class="pretty p-default p-curve p-thick"> + <input type="checkbox" name="file" title=""/> + <div class="state p-info-o"> + <label></label> + </div> + </div> + </td> + <td class="auth-index" v-bind:data-key="key">{{key+1}}</td> + <td>{{auth.username}}</td> + <td>{{auth.fileName}}</td> + <td><a href="javascript:" onclick="alerts($(event.srcElement).attr('data-title'));" + v-bind:title="auth.localUrl" data-toggle="tooltip" + v-bind:data-title="auth.localUrl">查看</a></td> + <td class="text-center" v-html="getIconYesOrNo(auth.isDownloadable)"></td> + <td class="text-center" v-html="getIconYesOrNo(auth.isDeletable)"></td> + <td class="text-center" v-html="getIconYesOrNo(auth.isUpdatable)"></td> + <td class="text-center" v-html="getIconYesOrNo(auth.isVisible)"></td> + <td>{{new Date(auth.createTime).format('yyyy-MM-dd hh:mm:ss')}}</td> + </tr> + </tbody> + </table> + </div> + <br/> + <button class="btn btn-lg btn-link btn-block" onclick="offset+=1;getAuth();"><b><i + class="glyphicon glyphicon-arrow-down"></i> 获取更多</b></button> + <br/> + </div> + <!--分类管理--> + <div class="row jq-tab hide" id="category-manager"> + <div class="col-sm-3 col-12 offset-sm-1 padding-0"> + <div class="content-box rounded" style="padding: 0 1rem;"> + <br/> + <h4 class="text-center" id="category-title">添加新分类</h4><br/> + <input type="hidden" value="0" id="category-key"/> + <input type="hidden" value="0" id="category-id"/> + <input class="form-control" id="category-name" title="分类名称" placeholder="新分类名称" type="text"/> + <br/> + <button class="btn btn-primary btn-block" onclick="saveCategory();">保存</button> + <br/> + </div> + <br/> + </div> + <div class="col-sm-6 offset-sm-1 col-12 content-box rounded"> + <br/> + <table class="table table-bordered table-hover table-responsive table-condensed"> + <thead> + <tr> + <th>编号</th> + <th>名称</th> + <th>创建时间</th> + <th class="text-center">动作</th> + </tr> + </thead> + <tbody> + <tr v-for="(category,key) in categories"> + <td class="hide">{{key}}</td> + <td class="category-id">{{category.id}}</td> + <td class="category-name">{{category.name}}</td> + <td>{{new Date(category.createTime).format('yyyy-MM-dd hh:mm:ss')}}</td> + <td class="text-center"> + <a onclick="editCategory();" href="javascript:">编辑</a> +  <a onclick="deleteCategory();" href="javascript:">删除</a> + </td> + </tr> + </tbody> + </table> + <br/> + </div> + </div> + <!--用户管理--> + <div class="row jq-tab hide" id="user-manager"> + <div class="col-12 col-sm-10 offset-sm-1 content-box rounded"> + <br/> + <div class="row"> + <div class="col-sm-5 col-12"> + <input type="text" class="form-control user-filter" placeholder="用户名或邮箱" + onkeyup="fileFilter();"/> + </div> + </div> + <br/> + </div> + <div class="col-12 col-sm-10 offset-sm-1"><br/></div> + <div class="col-12 col-sm-10 offset-sm-1 content-box rounded"> + <br/> + <div class="text-right"> + <button class="btn btn-info" onclick="showFileModal('#user-manager-table','#userFileAuthModal')"><i + class="glyphicon glyphicon-edit"></i> 编辑用户默认文件权限 + </button> + <button class="btn btn-warning" onclick="showFileModal('#user-manager-table','#userAuthModal')"><i + class="glyphicon glyphicon-wrench"></i> 修改用户权限 + </button> + <button class="btn btn-danger" onclick="showFileModal('#user-manager-table','#userPasswordModal');"><i + class="glyphicon glyphicon-warning-sign"></i> 重置用户密码 + </button> + </div> + <br/> + <table class="table table-bordered table-hover table-responsive table-condensed" id="user-manager-table"> + <thead> + <tr> + <th> + <div class="pretty p-default p-curve p-thick"> + <input type="checkbox" id="user-toggle-box" name="file" title="" + onchange="toggleCheckBoxStatus('user');"/> + <div class="state p-info-o"> + <label></label> + </div> + </div> + </th> + <th>编号</th> + <th>头像</th> + <th>用户名</th> + <th>真实名</th> + <th>邮箱</th> + <th>权限</th> + <th>最近登录时间</th> + <th>注册时间</th> + </tr> + </thead> + <tbody> + <tr v-for="(user,key) in users" onclick="toggleRowSelectedStatus(this);"> + <td> + <div class="pretty p-default p-curve p-thick"> + <input type="checkbox" name="file" title=""/> + <div class="state p-info-o"> + <label></label> + </div> + </div> + </td> + <td class="user-index" v-bind:data-key="key">{{key+1}}</td> + <td><img v-bind:src="user.avatar ? user.avatar : '/assets/img/default-user.jpg'" width="30rem" + height="30rem"></td> + <td>{{user.username}}</td> + <td>{{user.realName}}</td> + <td>{{user.email}}</td> + <td>{{user.permission<1?"禁止登录":(user.permission<2?"普通用户":"管理员")}}</td> + <td>{{new Date(user.lastLoginTime).format('yyyy-MM-dd hh:mm:ss')}}</td> + <td>{{new Date(user.createTime).format('yyyy-MM-dd hh:mm:ss')}}</td> + </tr> + </tbody> + </table> + </div> + <br/> + <button class="btn btn-lg btn-link btn-block" onclick="offset+=1;getUser();"><b><i + class="glyphicon glyphicon-arrow-down"></i> 获取更多</b></button> + <br/> + </div> + <!--<div class="row jq-tab hide" id="admin-manager">管理员管理</div>--> + <!--系统设置--> + <div class="row jq-tab hide" id="system-setting"> + <div class="col-12 col-sm-10 offset-sm-1 content-box rounded"> + <br/> + <div class="row"> + <div class="col-12 col-sm-12 text-right"> + <button class="btn btn-outline-info" onclick="saveConfig();"><i + class="glyphicon glyphicon-floppy-disk"></i> 保存 + </button> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-12 col-12" id="json-editor"> + <textarea class="form-control" style="height: 100vh;width: 100%;" title="编辑配置文件" + data-toggle="tooltip"></textarea> + </div> + </div> + <br/> + </div> + </div> + <div class="row text-center" id="footer"></div> +</div> +<br/> +<!--用户权限模态框--> +<div class="modal fade" id="userAuthModal" tabindex="-1" role="dialog" aria-labelledby="userAuthModalLabel" + aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title pull-left" id="userAuthModalLabel">重置用户密码</h4> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-sm-12 col-12"> + <input title="用户名" type="text" class="form-control username" + data-toggle="tooltip"/> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-12 col-12"> + <select class="form-control user-permission" title="用户权限" data-toggle="tooltip"> + <option value="0">禁止登录</option> + <option value="1">普通用户</option> + <option value="2">管理员</option> + </select> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-outline-secondary" onclick="rowIndex-=1;setUsername('#userAuthModal','auth');"><i + class="glyphicon glyphicon-arrow-left"></i> 上个 + </button> + <button class="btn btn-outline-primary" onclick="rowIndex+=1;setUsername('#userAuthModal','auth');">下个 + <i class="glyphicon glyphicon-arrow-right"></i> + </button> + <button type="button" class="btn btn-info" data-dismiss="modal"><i + class="glyphicon glyphicon-remove"></i> 关闭 + </button> + <button type="button" class="btn btn-primary" id="user-auth-update-button" + style="background-color: #9b58b5;border-color: #9b58b5;"><i + class="glyphicon glyphicon-floppy-open"></i> 更新 + </button> + </div> + </div> + </div> +</div> +<!--用户文件权限编辑模态框--> +<div class="modal fade" id="userPasswordModal" tabindex="-1" role="dialog" aria-labelledby="userPasswordModalLabel" + aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title pull-left" id="userPasswordModalLabel">重置用户密码</h4> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-sm-12 col-12"> + <input title="用户名" type="text" class="form-control username" + data-toggle="tooltip"/> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-12 col-12"> + <input title="密码" type="text" maxlength="30" minlength="6" class="form-control user-password" + data-toggle="tooltip"/> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-outline-secondary" onclick="rowIndex-=1;setUsername('#userPasswordModal','');"><i + class="glyphicon glyphicon-arrow-left"></i> 上个 + </button> + <button class="btn btn-outline-primary" onclick="rowIndex+=1;setUsername('#userPasswordModal','');">下个 + <i + class="glyphicon glyphicon-arrow-right"></i> + </button> + <button type="button" class="btn btn-info" data-dismiss="modal"><i + class="glyphicon glyphicon-remove"></i> 关闭 + </button> + <button type="button" class="btn btn-primary" id="user-password-update-button" + style="background-color: #9b58b5;border-color: #9b58b5;"><i + class="glyphicon glyphicon-floppy-open"></i> 更新 + </button> + </div> + </div> + </div> +</div> +<!--用户文件权限编辑模态框--> +<div class="modal fade" id="userFileAuthModal" tabindex="-1" role="dialog" aria-labelledby="userFileAuthModalLabel" + aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title pull-left" id="userFileAuthModalLabel">编辑用户默认文件权限</h4> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-sm-12 col-12"> + <input title="用户名" type="text" class="form-control username" + data-toggle="tooltip"/> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-3 col-6"> + <input title="下载权限" type="number" class="form-control user-downloadable" + data-toggle="tooltip"/> + </div> + <div class="col-sm-3 col-6"> + <input title="上传权限" type="number" class="form-control user-uploadable" + data-toggle="tooltip"/> + </div> + <div class="col-sm-3 col-6"> + <input title="删除权限" type="number" class="form-control user-deletable" + data-toggle="tooltip"/> + </div> + <div class="col-sm-3 col-6"> + <input title="编辑权限" type="number" class="form-control user-updatable" + data-toggle="tooltip"/> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-outline-secondary" onclick="rowIndex-=1;setUserFileAuth();"><i + class="glyphicon glyphicon-arrow-left"></i> 上个 + </button> + <button class="btn btn-outline-primary" onclick="rowIndex+=1;setUserFileAuth();">下个 <i + class="glyphicon glyphicon-arrow-right"></i> + </button> + <button type="button" class="btn btn-info" data-dismiss="modal"><i + class="glyphicon glyphicon-remove"></i> 关闭 + </button> + <button type="button" class="btn btn-primary" id="user-file-auth-update-button" + style="background-color: #9b58b5;border-color: #9b58b5;"><i + class="glyphicon glyphicon-floppy-open"></i> 更新 + </button> + </div> + </div> + </div> +</div> +<!--文件共享模态框--> +<div class="modal fade" id="fileAddedModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" + aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title pull-left" id="myModalLabel">共享服务器本地文件</h4> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + </div> + <div class="modal-body" style="height: 25rem;overflow: auto;"> + <div class="row"> + <div class="col-sm-7 col-7"> + <input type="text" class="form-control" placeholder="选择路径" id="select-url"/> + <br/> + <div id="server-file-list"> + <ul class="list-group" id="server-file-list-group"></ul> + </div> + </div> + <div class="col-sm-5 col-5"> + <input type="text" class="form-control" placeholder="链接前缀,支持规则" id="link-prefix"> + <br/> + <div id="selected-file-list"> + <ul class="list-group" id="selected-file-list-group"></ul> + </div> + </div> + </div> + </div> + <div class="modal-footer"> + <a href="javascript:" class="text-primary server-path-return"><i + class="glyphicon glyphicon-chevron-left"></i> 返回上级</a> + <div class="pretty p-default p-curve p-thick"> + <input type="checkbox" id="share-all-file" placeholder="共享文件夹下所有文件"/> + <div class="state p-info-o text-dark"> + <label>共享文件夹下所有文件(不递归)</label> + </div> + </div> + <button type="button" class="btn btn-info" data-dismiss="modal"><i + class="glyphicon glyphicon-remove"></i> 关闭 + </button> + <button type="button" class="btn btn-primary" id="server-file-share-button" + style="background-color: #9b58b5;border-color: #9b58b5;"><i + class="glyphicon glyphicon-send"></i> 共享文件 + </button> + </div> + </div> + </div> +</div> +<!--文件修改模态框--> +<div class="modal fade" id="fileModifiedModal" tabindex="-1" role="dialog" aria-labelledby="modifiedModalLabel" + aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title pull-left" id="modifiedModalLabel">修改文件路径(包括文件名)</h4> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + </div> + <div class="modal-body"> + <div class="row"> + <input type="hidden" id="file-id" value="0"> + <div class="col-sm-12 col-12"> + <input title="原本地路径" type="text" class="form-control" id="old-file-local-url" disabled + data-toggle="tooltip"/> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-12 col-12"> + <input title="新本地路径" type="text" class="form-control" id="new-file-local-url" + data-toggle="tooltip"/> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-12 col-12"> + <input title="原访问链接" type="text" class="form-control" id="old-file-visit-url" disabled + data-toggle="tooltip"/> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-12 col-12"> + <input title="新访问链接" type="text" class="form-control" id="new-file-visit-url" + data-toggle="tooltip"/> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-outline-secondary" onclick="rowIndex-=1;setModifyFile();"><i + class="glyphicon glyphicon-arrow-left"></i> 上个 + </button> + <button class="btn btn-outline-primary" onclick="rowIndex+=1;setModifyFile();">下个 <i + class="glyphicon glyphicon-arrow-right"></i> + </button> + <button type="button" class="btn btn-info" data-dismiss="modal"><i + class="glyphicon glyphicon-remove"></i> 关闭 + </button> + <button type="button" class="btn btn-primary" id="file-modify-button" + style="background-color: #9b58b5;border-color: #9b58b5;"><i + class="glyphicon glyphicon-floppy-open"></i> 更新 + </button> + </div> + </div> + </div> +</div> +<!--文件权限模态框--> +<div class="modal fade" id="fileAuthModal" tabindex="-1" role="dialog" aria-labelledby="authModalLabel" + aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title pull-left" id="authModalLabel">编辑文件权限</h4> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + </div> + <div class="modal-body"> + <input type="hidden" class="form-control" id="file-auth-id" value="0"> + <div class="row"> + <div class="col-sm-12 col-12"> + <input title="文件本地路径" type="text" class="form-control" id="file-local-url" + data-toggle="tooltip"/> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-3 col-6"> + <input title="下载权限" type="number" class="form-control" id="file-downloadable-auth" + data-toggle="tooltip"/> + </div> + <div class="col-sm-3 col-6"> + <input title="删除权限" type="number" class="form-control" id="file-deletable-auth" + data-toggle="tooltip"/> + </div> + <div class="col-sm-3 col-6"> + <input title="编辑权限" type="number" class="form-control" id="file-updatable-auth" + data-toggle="tooltip"/> + </div> + <div class="col-sm-3 col-6"> + <input title="可见权限" type="number" class="form-control" id="file-visible-auth" + data-toggle="tooltip"/> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-outline-secondary" onclick="rowIndex-=1;setFileAuth();"><i + class="glyphicon glyphicon-arrow-left"></i> 上个 + </button> + <button class="btn btn-outline-primary" onclick="rowIndex+=1;setFileAuth();">下个 <i + class="glyphicon glyphicon-arrow-right"></i> + </button> + <button type="button" class="btn btn-info" data-dismiss="modal"><i + class="glyphicon glyphicon-remove"></i> 关闭 + </button> + <button type="button" class="btn btn-primary" id="file-auth-update-button" + style="background-color: #9b58b5;border-color: #9b58b5;"><i + class="glyphicon glyphicon-floppy-open"></i> 更新 + </button> + </div> + </div> + </div> +</div> +<!--权限编辑模态框--> +<div class="modal fade" id="authEditModal" tabindex="-1" role="dialog" aria-labelledby="authEditModalLabel" + aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title pull-left" id="authEditModalLabel">编辑文件权限</h4> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + </div> + <div class="modal-body"> + <input type="hidden" class="form-control" id="auth-id" value="0"> + <div class="row"> + <div class="col-sm-12 col-12"> + <input title="用户名" type="text" class="form-control" id="auth-username" + data-toggle="tooltip"/> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-12 col-12"> + <input title="文件本地路径" type="text" class="form-control" id="auth-file-local-url" + data-toggle="tooltip"/> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-3 col-6"> + <input title="下载权限" type="number" class="form-control" id="auth-downloadable" + data-toggle="tooltip"/> + </div> + <div class="col-sm-3 col-6"> + <input title="删除权限" type="number" class="form-control" id="auth-deletable" + data-toggle="tooltip"/> + </div> + <div class="col-sm-3 col-6"> + <input title="编辑权限" type="number" class="form-control" id="auth-updatable" + data-toggle="tooltip"/> + </div> + <div class="col-sm-3 col-6"> + <input title="可见权限" type="number" class="form-control" id="auth-visible" + data-toggle="tooltip"/> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-outline-secondary" onclick="rowIndex-=1;setAuth();"><i + class="glyphicon glyphicon-arrow-left"></i> 上个 + </button> + <button class="btn btn-outline-primary" onclick="rowIndex+=1;setAuth();">下个 <i + class="glyphicon glyphicon-arrow-right"></i> + </button> + <button type="button" class="btn btn-info" data-dismiss="modal"><i + class="glyphicon glyphicon-remove"></i> 关闭 + </button> + <button type="button" class="btn btn-primary" id="auth-update-button" + style="background-color: #9b58b5;border-color: #9b58b5;"><i + class="glyphicon glyphicon-floppy-open"></i> 更新 + </button> + </div> + </div> + </div> +</div> +<!--文件共享模态框--> +<div class="modal fade" id="authAddedModal" tabindex="-1" role="dialog" aria-labelledby="authAddedModalLabel" + aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title pull-left" id="authAddedModalLabel">添加权限记录</h4> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + </div> + <div class="modal-body"> + <div class="row" style="height: 10rem;overflow: auto;"> + <div class="col-sm-12 col-12"> + <input type="text" class="form-control" v-on:keyup.enter="searchFileInAuth" + placeholder="通过本地路径搜索文件(模糊搜索)" id="auth-file-search"/> + <br/> + <div id="auth-file-list"> + <ul class="list-group" id="auth-file-list-group"></ul> + </div> + </div> + </div> + <br/> + <div class="row" style="height: 10rem;overflow: auto;"> + <div class="col-sm-12 col-12"> + <input type="text" class="form-control" v-on:keyup.enter="searchUserInAuth" placeholder="搜索用户" + id="auth-user-search"/> + <br/> + <div id="auth-user-list"> + <ul class="list-group" id="auth-user-list-group"></ul> + </div> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-3 col-6"> + <input title="下载权限" type="number" class="form-control" id="auth-downloadable-new" + data-toggle="tooltip" value="1"/> + </div> + <div class="col-sm-3 col-6"> + <input title="删除权限" type="number" class="form-control" id="auth-deletable-new" + data-toggle="tooltip" value="0"/> + </div> + <div class="col-sm-3 col-6"> + <input title="编辑权限" type="number" class="form-control" id="auth-updatable-new" + data-toggle="tooltip" value="0"/> + </div> + <div class="col-sm-3 col-6"> + <input title="可见权限" type="number" class="form-control" id="auth-visible-new" + data-toggle="tooltip" value="1"/> + </div> + </div> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-info" data-dismiss="modal"><i + class="glyphicon glyphicon-remove"></i> 关闭 + </button> + <button type="button" class="btn btn-primary" id="auth-add-button" + style="background-color: #9b58b5;border-color: #9b58b5;"><i + class="glyphicon glyphicon-asterisk"></i> 添加权限记录 + </button> + </div> + </div> + </div> +</div> +<script src="/assets/js/particles.js"></script> +<script src="/assets/js/default.js"></script> +<script src="/assets/js/admin.js"></script> +</body> +</html>
\ No newline at end of file diff --git a/src/main/resources/static/error.html b/src/main/resources/static/error.html new file mode 100644 index 0000000..bdd02dd --- /dev/null +++ b/src/main/resources/static/error.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0,user-scalable=no"> + <link rel="shortcut icon" href="/assets/img/file-favicon.png"/> + <title>错误</title> +</head> +<body> + +</body> +</html>
\ No newline at end of file diff --git a/src/main/resources/static/filemanager.html b/src/main/resources/static/filemanager.html new file mode 100644 index 0000000..c2f5b51 --- /dev/null +++ b/src/main/resources/static/filemanager.html @@ -0,0 +1,40 @@ +<!doctype html> +<html lang="en" data-ng-app="FileManagerApp"> +<head> + <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> + <meta charset="utf-8"> + <title>远程文件管理</title> + <link rel="shortcut icon" href="/assets/img/file-favicon.png"/> + <link rel="stylesheet" href="/assets/css/glyphicons.css"> + <script src="/assets/js/old/jquery.min.js"></script> + <script src="/assets/js/angular.min.js"></script> + <script src="/assets/js/angular-translate.min.js"></script> + <script src="/assets/js/ng-file-upload.min.js"></script> + <script src="/assets/js/old/bootstrap.min.js"></script> + <link rel="stylesheet" href="/assets/css/old/bootstrap.min.css"/> + <link href="/assets/css/angular-filemanager.min.css" rel="stylesheet"> + <script src="/assets/js/angular-filemanager.min.js"></script> + <script type="text/javascript"> + angular.module('FileManagerApp').config(['fileManagerConfigProvider', function (config) { + var defaults = config.$get(); + config.set({ + appName: '远程文件管理', + pickCallback: function (item) { + var msg = 'Picked %s "%s" for external use' + .replace('%s', item.type) + .replace('%s', item.fullPath()); + window.alert(msg); + }, + + allowedActions: angular.extend(defaults.allowedActions, { + pickFiles: false, + pickFolders: false + }) + }); + }]); + </script> +</head> +<body class="ng-cloak" id="particles-js1"> +<angular-filemanager></angular-filemanager> +</body> +</html> diff --git a/src/main/resources/static/home.html b/src/main/resources/static/home.html new file mode 100644 index 0000000..7dac764 --- /dev/null +++ b/src/main/resources/static/home.html @@ -0,0 +1,118 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <!-- Meta tags --> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <!-- Title --> + <title>Websketch - {{ directory }}</title> + <!-- Stylesheets --> + <link rel="stylesheet" href="{{ url_for('sketch', filename='css/bootstrap.min.css') }}"> + <link rel="stylesheet" href="{{ url_for('sketch', filename='vendor/fontawesome-5.1/css/all.min.css') }}"> + <link rel="stylesheet" href="{{ url_for('sketch', filename='vendor/datatable/datatables.min.css') }}"> + <link rel="stylesheet" href="{{ url_for('sketch', filename='css/style.min.css') }}"> +</head> + +<body> +<div class="conn"> + + <!-- Header --> + <header id="header" class="d-flex align_item_center"> + <div onclick="document.location='/'" class="logo_p"> + <img src="{{ url_for('sketch', filename='images/att-globe.svg') }}" alt="att-globe"> + </div> + + <div class="heading_title_p"> + <h2>Directory: {{ directory }}</h2> + </div> + </header> + + <!-- ----- Upload Form ----- --> + <div class="inputUploadP"> + <form method="post" action="/upload" enctype="multipart/form-data" class="uploadForm"> + <!-- -- Upload File -- --> + <div class="uploadFile_P"> + <input type="file" name="file" id="file" class="uploadFile" + data-multiple-caption="{count} files selected" multiple/> + <label for="file"> + <i class="fa fa-upload"></i> + <span>Choose a file…</span> + </label> + <input type="hidden" name="path" value="{{ directory }}"> + </div> + <!-- -- Upload Btn -- --> + <p class="uploadBtn_P"> + <button type="submit" class="uploadBtn btn btn-primary"> + Upload + </button> + </p> + </form> + </div> + + {% if is_subdirectory %} + <section class="backBtn_p"> + <a href="/{{ back }}"> + <i class="fas fa-level-up-alt"></i> + <span>Back</span> + </a> + </section> + {% endif %} + + <!-- Table --> + <section class="table_p table-responsive"> + <table id="tableData" class="table table-hover compact"> + <thead> + <tr> + <th width="4%"><!--Type (Directory or File)--></th> + <th>Name</th> + <th>Size</th> + <th>Last Modified</th> + <th></th> <!-- View file --> + </tr> + </thead> + <tbody> + {% for file in files %} + <tr> + <td> <!-- Icon --> + {% if file.is_dir %} + <button class="file_ic"><i class="far fa-folder"></i></button><!-- Directory icon --> + {% else %} + <button class="file_ic"><i class="far fa-file"></i></button><!-- File icon --> + {% endif %} + </td> + <td> <!-- Name --> + <a href="/{{ file.rel_path }}">{{ file.name }}{% if file.is_dir %}/{% endif %}</a> + </td> + <td data-order="{{ file.size_sort }}"> <!-- File size --> + {{ file.size }} + </td> + <td data-order="{{ file.last_modified_sort }}"> <!-- File last modified --> + {{ file.last_modified }} + </td> + <td> <!-- View file --> + {% if not file.is_dir %} + <a href="/{{ file.rel_path }}?view">View in browser</a> + {% endif %} + </td> + </tr> + {% endfor %} + </tbody> + </table> + </section> + + <footer> + <p> + Websketch V22.03 + </p> + </footer> + +</div> <!-- end class conn --> + +<!-- Scripts --> +<script src="{{ url_for('sketch', filename='js/jquery-3.4.1.min.js') }}"></script> +<script src="{{ url_for('sketch', filename='vendor/datatable/datatables.min.js') }}"></script> +<script src="{{ url_for('sketch', filename='js/main.js') }}"></script> + +</body> +</html>
\ No newline at end of file diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html new file mode 100644 index 0000000..1117230 --- /dev/null +++ b/src/main/resources/static/index.html @@ -0,0 +1,360 @@ +<!DOCTYPE html> +<html lang="cn"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0,user-scalable=no"> + <link rel="shortcut icon" href="/assets/sketch/images/favicon.ico"/> + <link rel="stylesheet" href="/assets/css/bootstrap.min.css"> + <link rel="stylesheet" href="/assets/css/fileinput.min.css"> + <link rel="stylesheet" href="/assets/css/glyphicons.css"> + <script src="/assets/js/popper.min.js"></script> + <script src="/assets/js/jquery-3.3.1.js"></script> + <script src="/assets/js/bootstrap.min.js"></script> + <script src="/assets/js/layer.js"></script> + <script src="/assets/js/vue.js"></script> + <script src="/assets/js/piexif.min.js"></script> + <script src="/assets/js/sortable.min.js"></script> + <script src="/assets/js/purify.min.js"></script> + <script src="/assets/js/fileinput.min.js"></script> + <script src="/assets/js/theme.js"></script> + <script src="/assets/js/utils.js"></script> + <link rel="stylesheet" href="/assets/css/style.css"/> +<!-- websketch--> + <link rel="stylesheet" href="/assets/sketch/css/bootstrap.min.css"> + <link rel="stylesheet" href="/assets/sketch/vendor/fontawesome-5.1/css/all.min.css"> + <link rel="stylesheet" href="/assets/sketch/vendor/datatable/datatables.min.css"> + <link rel="stylesheet" href="/assets/sketch/css/style.min.css"> + +<!-- <script src="/assets/sketch/js/jquery-3.4.1.min.js"></script>--> + + <title>WebSketch</title> +</head> +<body id="particles-js"> +<nav class="navbar navbar-expand-md bg-dark navbar-dark navbar-toggler fixed-top" > + <img src="/assets/sketch/images/att-globe.svg" class="navbar-brand" style="width: 2rem;height: 2.5rem;"/> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse" id="collapsibleNavbar"> + <ul class="navbar-nav nav nav-pills"> + <li class="nav-item"> + <a class="nav-link active" data-toggle="pill" href="#files-tab">文件列表</a> + </li> + <li class="nav-item"> + <a class="nav-link" data-toggle="pill" href="#resource-tab">资源列表</a> + </li> + <li class="nav-item"> + <a class="nav-link" data-toggle="pill" href="#uploaded-tab">我的资源</a> + </li> + <li class="nav-item"> + <a class="nav-link" data-toggle="pill" href="#downloaded-tab">我的下载</a> + </li> + <li class="nav-item"> + <a class="nav-link" data-toggle="pill" href="#bio-tab">我的资料</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="upload" target="_blank">文件上传</a> + </li> + </ul> + </div> + <!--<div class="form-inline w-50"> + <input class="form-control border-dark bg-dark text-white form-control-sm w-100" type="search" + placeholder="搜索" id="search"/> + </div>--> +</nav> +<br/><br/><br/> +<div class="container" id="index"> + <div class="row justify-content-center"> + <div class="col-sm-12 col-10 tab-content"> + <!--文件列表--> + <div class="tab-pane active" id="files-tab"> + <div class="row content-box rounded"> + <!-- Header --> + <header id="header" class="d-flex align_item_center"> + <div onclick="" class="logo_p"> +<!-- <img src="/assets/img/file-favicon.png" class="rounded avatar d-block">--> + <img src="/assets/sketch/images/att-globe.svg" class="rounded avatar d-block"> + </div> + <div class="heading_title_p" style="white-space:nowrap;text-overflow:ellipsis;margin-top: 15px"> + <h3 id="dir_id" value=""></h3> + </div> + </header> + </div> + <div class="row content-box rounded" style="margin-top: 10px"> + <!-- ----- Upload ----- --> + <div class="inputUploadP"> + <!-- -- Upload Btn -- --> + <div class="uploadBtn_P"> + <button type="submit" class="uploadBtn btn btn-primary" onclick="showFileUpload();"> + <i class="fa fa-upload"></i> + Upload + </button> + </div> + </div> + <div class="backBtn_p" style="display: none"> + <a href="javascript:;" id="history_path" value="" onclick="backPage()"> + <i class="fas fa-level-up-alt"></i> + <span>Back</span> + </a> + </div> + + <section class="table_p table-responsive"> + <table id="tableData" class="table table-hover compact"> + <thread> + <tr> + <th width="5%"><!--Type (Directory or File)--></th> + <th width="20%">Name</th> + <th width="20%">Size</th> + <th width="20%">Last Modified</th> +<!-- <th></th> <!– View file –>--> + </tr> + </thread> + <tbody id="files-content"></tbody> + </table> + </section> + </div> + </div> + <!--文件列表 end--> + + <!--资源列表--> + <div class="tab-pane" id="resource-tab"> + <div class="row content-box rounded"> + <div class="col-4"> + <br/> + <select class="form-control content-filter" id="category" title="查找指定分类文件" + data-toggle="tooltip"> + <option value="0">全部</option> + </select> + <br/> + </div> + <div class="col-4"> + <br/> + <select class="form-control content-filter" id="order-by" title="排序方法" data-toggle="tooltip"> + <option value="id">时间</option> + <option value="download_times">热度</option> + <option value="size">大小</option> + </select> + <br/> + </div> + <div class="col-sm-2 col-4"> + <br/> + <select class="form-control content-filter" id="order-way" title="排序方式" data-toggle="tooltip"> + <option value="desc">降序</option> + <option value="asc">升序</option> + </select> + <br/> + </div> + </div> + <br/> + <div id="resources-content"></div> + <button class="btn btn-link btn-block btn-lg" onclick="offset += 1;getPage();"><b><i + class="glyphicon glyphicon-arrow-down"></i> 获取更多</b></button> + <br/><br/> + </div> + <!--我的资源--> + <div class="tab-pane" id="uploaded-tab"> + <div id="uploaded-content"></div> + <button class="btn btn-link btn-block btn-lg" onclick="offset += 1;getPage();"><b><i + class="glyphicon glyphicon-arrow-down"></i> 获取更多</b></button> + <br/><br/> + </div> + <div class="tab-pane" id="downloaded-tab"> + <div id="downloaded-content"></div> + <button class="btn btn-link btn-block btn-lg" onclick="offset += 1;getPage();"><b><i + class="glyphicon glyphicon-arrow-down"></i> 获取更多</b></button> + <br/><br/> + </div> + <!--我的资料--> + <div class="tab-pane text-left" id="bio-tab"> + <!--权限和登陆信息--> + <div class="row content-box rounded"> + <div class="col-sm-1 col-1 col-md-1"></div> + <div class="col-sm-11 col-11 col-md-6"> + <br/> + <div class="row"> + <div class="col-sm-3 col-5 text-right"> + <span class="text-right">权限:</span> + </div> + <div class="col-sm-6 col-7 text-left"> + <div v-if="permission>1"> + <a href="admin" target="_blank">管理员</a> + </div> + <div v-else> + <span class="text-left">普通用户</span> + </div> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-3 col-5 text-right"> + <span class="text-right">登陆时间:</span> + </div> + <div class="col-sm-6 col-7 text-left"> + <span class="text-left">{{loginTime}}</span> + </div> + </div> + <br/> + </div> + </div> + <br/> + <!--基本信息--> + <div class="row content-box rounded"> + <div class="col-sm-1 col-1 col-md-1"></div> + <div class="col-sm-11 col-11 col-md-6"> + <br/> + <div class="row"> + <div class="col-sm-3 col-5 text-right"> + <img onclick="showAvatarModal();" src="/assets/img/default-user.jpg" id="avatar" + class="rounded-circle avatar"/> + </div> + <div class="col-sm-6 col-7 text-left padding-top-3"> + <h3>{{username}}</h3> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-3 col-5 text-right padding-top-1"> + <span class="text-right">真实姓名:</span> + </div> + <div class="col-sm-6 col-7 text-left"> + <input placeholder="我的真实姓名" id="real-name" type="text" class="form-control"/> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-3 col-5 text-right padding-top-1"> + <span class="text-right">邮箱:</span> + </div> + <div class="col-sm-6 col-7 text-left"> + <input placeholder="我的邮箱" id="email" type="email" class="form-control email"/> + <label class="form-check-label text-danger">{{emailErrorTip}}</label> + </div> + </div> + <div class="row verify-code-div" style="display: none;"> + <div class="col-sm-8 offset-sm-1 offset-2 col-10 row"> + <div class="col-sm-7 col-6 col-md-7"> + <input type="number" id="email-verify-code" maxlength="6" + class="form-control email-verify-code" + placeholder="收到的6位验证码"/> + <label class="form-check-label text-danger">{{emailVerifyStatus}}</label> + </div> + <div class="col-sm-4 col-md-54 col-5 offset-1 text-right padding-0"> + <button class="btn btn-outline-info sendVerifyCode btn-block">发送验证码</button> + </div> + </div> + </div> + <div class="row"> + <div class="col-sm-1 col-2"></div> + <div class="col-sm-8 col-10 text-right"> + <button class="btn btn-primary btn-block" onclick="saveInfo();">保存</button> + </div> + </div> + <br/> + </div> + </div> + <br/> + <!--修改密码--> + <div class="row content-box rounded"> + <div class="col-sm-1 col-1 col-md-1"></div> + <div class="col-sm-11 col-11 col-md-6"> + <br/> + <div class="row"> + <div class="col-sm-3 col-5 text-right padding-top-1"> + <span class="text-right">旧密码:</span> + </div> + <div class="col-sm-6 col-7 text-left"> + <input placeholder="旧密码" id="old-password" type="password" class="form-control"/> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-3 col-5 text-right padding-top-1"> + <span class="text-right">新密码:</span> + </div> + <div class="col-sm-6 col-7 text-left"> + <input placeholder="新密码" id="new-password" type="password" + class="password form-control"/> + <label class="form-check-label text-danger">{{passwordVerify}}</label> + </div> + </div> + <div class="row"> + <div class="col-sm-3 col-5 text-right padding-top-1"> + <span class="text-right">确认新密码:</span> + </div> + <div class="col-sm-6 col-7 text-left"> + <input placeholder="确认新密码" id="confirm-new-password" type="password" + class="form-control confirm-password"/> + <label class="form-check-label text-danger">{{passwordConfirm}}</label> + </div> + </div> + <div class="row"> + <div class="col-sm-1 col-2"></div> + <div class="col-sm-8 col-10 text-right"> + <button class="btn btn-warning btn-block" onclick="updatePassword();">修改密码</button> + <br/> + <a href="signin.html#reset" class="btn btn-block btn-danger" target="_blank">忘记密码</a> + </div> + </div> + <br/> + </div> + </div> + <div class="row"><br/></div> + </div> + </div> + </div> + <div class="row text-center" id="footer"></div> +</div> + +<!--文本编辑模态框--> +<div class="modal fade" id="edit-file-modal"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title">文件信息编辑</h4> + <button type="button" class="close" data-dismiss="modal">×</button> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-sm-9"> + <input type="hidden" id="edit-file-id" value="0"> + <input type="text" class="form-control" title="文件名" placeholder="文件名" data-toggle="tooltip" + id="edit-file-name"/> + </div> + <div class="col-sm-3"> + <select class="form-control" id="edit-file-category" title="文件分类" data-toggle="tooltip"> + <option value="0">未分类</option> + </select> + </div> + </div> + <br/> + <div class="row"> + <div class="col-sm-12 col-12"> + <input type="text" class="form-control" id="edit-file-tag" data-toggle="tooltip" + placeholder="文件标签,多个文件标签使用空格分隔" title="文件标签,多个文件标签使用空格分隔"> + </div> + </div> + <br> + <div class="row"> + <div class="col-12 col-sm-12"> + <textarea class="form-control" id="edit-file-description" placeholder="文件描述" title="文件描述" + data-toggle="tooltip"></textarea> + </div> + </div> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-primary" onclick="saveFileInfo();">保存</button> + <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button> + </div> + + </div> + </div> +</div> +<script src="/assets/js/particles.js"></script> +<script src="/assets/js/default.js"></script> +<script src="/assets/js/index.js"></script> + +<!--<script src="/assets/sketch/js/jquery-3.4.1.min.js"></script>--> +<script src="/assets/sketch/vendor/datatable/datatables.min.js"></script> +<!--<script src="/assets/sketch/js/main.js"></script>--> +</body> +</html>
\ No newline at end of file diff --git a/src/main/resources/static/signin.html b/src/main/resources/static/signin.html new file mode 100644 index 0000000..46c4538 --- /dev/null +++ b/src/main/resources/static/signin.html @@ -0,0 +1,125 @@ +<!DOCTYPE html> +<html lang="cn"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0,user-scalable=no"> + <link rel="shortcut icon" href="/assets/img/file-favicon.png"/> + <link rel="stylesheet" href="/assets/css/bootstrap.min.css"> + <link rel="stylesheet" href="/assets/css/glyphicons.css"> + <script src="/assets/js/popper.min.js"></script> + <script src="/assets/js/jquery-3.3.1.js"></script> + <script src="/assets/js/bootstrap.min.js"></script> + <script src="/assets/js/layer.js"></script> + <script src="/assets/js/utils.js"></script> + <script src="/assets/js/vue.js"></script> + <link rel="stylesheet" href="/assets/css/style.css"/> + <title>登录</title> +</head> +<body id="particles-js"> +<div class="container"> + <div class="row"> + <div class="col-1 col-sm-4"></div> + <div id="signin-div" class="col-sm-4 col-10 rounded content-box text-center center-vertical" + style="padding: 2rem 3rem;"> + <div id="login-div"> + <h3>欢迎回来</h3><br/> + <input type="text" id="loginName" class="form-control" placeholder="用户名/电子邮箱" maxlength="50"/> + <br/> + <input type="password" id="password" maxlength="50" class="form-control" placeholder="登录密码"/> + <br/> + <div class="text-left form-inline"> + <input title="remember me" type="checkbox" class="form-control" id="remember" checked/> 记住我 + </div> + <br/> + <button class="btn btn-primary btn-block" onclick="login();">登录</button> + <br/> + <div class="form-inline row"> + <div class="col-sm-6 col-6 col-md-6 text-left"> + <button class="btn btn-link text-success" onclick="switchToRegister();">还没有账号?</button> + </div> + <div class="col-sm-6 col-6 col-md-6 text-right"> + <button class="btn btn-link text-danger" onclick="switchToReset();">忘记密码?</button> + </div> + </div> + </div> + <div id="register-div" style="display: none;"> + <h3>欢迎注册</h3><br/> + <input type="text" id="username" maxlength="50" class="form-control" placeholder="用户名"/> + <label class="form-check-label text-danger">{{description}}</label> + <br/> + <input type="email" id="email" maxlength="100" class="form-control email" placeholder="电子邮箱,可用于登录"> + <label class="form-check-label text-danger">{{emailErrorTip}}</label> + <br/> + <div v-show="emailVerify"> + <div class="form-inline text-justify-all row"> + <div class="col-sm-7 col-6 col-md-7"> + <input type="number" id="email-verify-code" maxlength="6" + class="form-control email-verify-code" + placeholder="收到的6位验证码"/> + </div> + <div class="col-sm-5 col-md-5 col-6 text-right"> + <button class="btn btn-outline-info sendVerifyCode btn-block">发送验证码</button> + </div> + </div> + <label class="form-check-label text-danger">{{emailVerifyStatus}}</label> + <br/> + </div> + <input type="password" id="reg-password" maxlength="50" class="form-control password" + placeholder="请输入你的密码"> + <label class="form-check-label text-danger">{{passwordVerify}}</label> + <br/> + <input type="password" id="confirm-password" max="50" class="form-control confirm-password" + placeholder="请再次输入你的密码"> + <label class="form-check-label text-danger">{{passwordConfirm}}</label> + <br/> + <div class="text-center row"> + <div class="col-6 col-sm-6"> + <button class="btn btn-outline-warning btn-block" onclick="switchToLogin();">已有账号?</button> + </div> + <div class="col-6 col-sm-6"> + <button class="btn btn-primary btn-block" onclick="register();">注册</button> + </div> + </div> + </div> + <div id="reset-div" style="display: none;"> + <h3>重置密码</h3><br/> + <input type="email" class="form-control email" id="res-email" maxlength="100" placeholder="注册的邮箱"/> + <label class="form-check-label text-danger">{{emailErrorTip}}</label> + <br/> + <div class="form-inline text-justify-all row"> + <div class="col-sm-7 col-md-7 col-6"> + <input type="number" id="res-email-verify" maxlength="6" class="form-control email-verify-code" + placeholder="收到的6位验证码"/> + </div> + <div class="col-sm-5 col-md-5 col-6 text-right"> + <button class="btn btn-outline-info sendVerifyCode btn-block">发送验证码</button> + </div> + </div> + <label class="form-check-label text-danger">{{emailVerifyStatus}}</label> + <br/> + <input type="password" id="res-password" maxlength="50" class="form-control password" + placeholder="请设置你的新密码"> + <label class="form-check-label text-danger">{{passwordVerify}}</label> + <br/> + <input type="password" id="res-confirm-password" max="50" class="form-control confirm-password" + placeholder="请确认你的新密码"> + <label class="form-check-label text-danger">{{passwordConfirm}}</label> + <br/> + <div class="text-center row"> + <div class="col-6 col-sm-6"> + <button class="btn btn-outline-primary btn-block" onclick="switchToLogin();">继续登录</button> + </div> + <div class="col-6 col-sm-6"> + <button class="btn btn-danger btn-block" onclick="reset();">重置密码</button> + </div> + </div> + </div> + </div> + </div> + <div class="row text-center" id="footer"></div> +</div> +<script src="/assets/js/particles.js"></script> +<script src="/assets/js/default.js"></script> +<script src="/assets/js/signin.js"></script> +</body> +</html>
\ No newline at end of file diff --git a/src/main/resources/static/upload.html b/src/main/resources/static/upload.html new file mode 100644 index 0000000..142d327 --- /dev/null +++ b/src/main/resources/static/upload.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<html lang="cn"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0,user-scalable=no"> + <link rel="shortcut icon" href="/assets/img/file-favicon.png"/> + <link rel="stylesheet" href="/assets/css/bootstrap.min.css"> + <link rel="stylesheet" href="/assets/css/fileinput.min.css"> + <link rel="stylesheet" href="/assets/css/glyphicons.css"> + <script src="/assets/js/popper.min.js"></script> + <script src="/assets/js/jquery-3.3.1.js"></script> + <script src="/assets/js/bootstrap.min.js"></script> + <script src="/assets/js/layer.js"></script> + <script src="/assets/js/vue.js"></script> + <script src="/assets/js/piexif.min.js"></script> + <script src="/assets/js/sortable.min.js"></script> + <script src="/assets/js/purify.min.js"></script> + <script src="/assets/js/fileinput.min.js"></script> + <script src="/assets/js/theme.js"></script> + <script src="/assets/js/utils.js"></script> + <link rel="stylesheet" href="/assets/css/style.css"/> + <title>上传</title> +</head> +<body id="particles-js"> +<br/> +<div class="container"> + <div class="row"> + <div class="col-sm-12 col-10 offset-1 offset-sm-0"> + <div class="row content-box rounded"> + <div class="col-sm-12 col-12 offset-sm-0"> + <br/> + <div class="row form-inline"> + <div class="col-sm-3 col-5"> + <select id="category-id" class="form-control w-100" title="分类"> + <option value="0">未分类</option> + </select> + </div> + <div class="col-sm-9 col-7"> + <input class="form-control w-100" title="标签" type="text" id="tag" + placeholder="文件标签,多个标签用空格分隔"/> + </div> + </div> + <br/> + </div> + <div class="col-sm-12 col-12 offset-sm-0"> + <textarea class="form-control" rows="5" id="description" title="描述" placeholder="文件描述"></textarea> + </div> + <div class="col-sm-12 col-12 offset-sm-0"><br/> + <input id="file-input" class="form-control file" multiple data-max-file-count="100" name="file" + type="file"/><br/> + </div> + </div> + </div> + </div> + <br/> + <div class="row text-center" id="footer"></div> + <br/> +</div> +<script src="/assets/js/particles.js"></script> +<script src="/assets/js/default.js"></script> +<script src="/assets/js/upload.js"></script> +</body> +</html>
\ No newline at end of file |
