summaryrefslogtreecommitdiff
path: root/src/main/resources/static
diff options
context:
space:
mode:
authorzhanghongqing <[email protected]>2022-08-09 16:54:16 +0800
committerzhanghongqing <[email protected]>2022-08-09 16:54:16 +0800
commitb3fa11d4b1b5a68d7b04fde5eb6cfbda557927eb (patch)
treea49d344e49fc427fbf4cf00aa4963c4d04cd98a4 /src/main/resources/static
parentd8a2be0d094ac9ba2d47c81ebf03b3fe6e34a078 (diff)
initializeHEADmain
Diffstat (limited to 'src/main/resources/static')
-rw-r--r--src/main/resources/static/404.html1638
-rw-r--r--src/main/resources/static/admin.html865
-rw-r--r--src/main/resources/static/error.html12
-rw-r--r--src/main/resources/static/filemanager.html40
-rw-r--r--src/main/resources/static/home.html118
-rw-r--r--src/main/resources/static/index.html360
-rw-r--r--src/main/resources/static/signin.html125
-rw-r--r--src/main/resources/static/upload.html63
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">&nbsp;<b>上传记录</b></span></a>
+ </li>
+ <li class="jq-nav-item">
+ <a href="#download-manager"><span class="glyphicon glyphicon-cloud-download">&nbsp;<b>下载记录</b></span></a>
+ </li>
+ <li class="jq-nav-item">
+ <a href="#file-manager"><span class="glyphicon glyphicon-file">&nbsp;<b>文件管理</b></span></a>
+ </li>
+ <li class="jq-nav-item">
+ <a href="#auth-manager"><span class="glyphicon glyphicon-lock">&nbsp;<b>权限管理</b></span></a>
+ </li>
+ <li class="jq-nav-item">
+ <a href="#category-manager"><span class="glyphicon glyphicon-filter">&nbsp;<b>分类管理</b></span></a>
+ </li>
+ <li class="jq-nav-item">
+ <a href="#user-manager"><span class="glyphicon glyphicon-user">&nbsp;<b>用户管理</b></span></a>
+ </li>
+ <li class="jq-nav-item">
+ <a href="filemanager" target="_blank"><span
+ class="glyphicon glyphicon-folder-close">&nbsp;<b>远程管理</b></span></a>
+ </li>
+ <li class="jq-nav-item">
+ <a href="#system-setting"><span class="glyphicon glyphicon-cog">&nbsp;<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>
+ &emsp;<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">&times;</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">&times;</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">&times;</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">&times;</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">&times;</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">&times;</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">&times;</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">&times;</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> &lt;!&ndash; View file &ndash;&gt;-->
+ </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">&times;</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/>&nbsp;记住我
+ </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