├── .gitignore ├── README.md ├── conf └── app.ini ├── go.mod ├── go.sum ├── main.go ├── src ├── commons │ ├── constants.go │ ├── fast_file.go │ ├── fast_status.go │ ├── file_utils.go │ ├── http.go │ ├── httplib │ │ └── httplib.go │ ├── pager.go │ └── response.go ├── filters │ └── before.go ├── form │ ├── install.go │ ├── peers.go │ └── user.go ├── models │ ├── models.go │ ├── peers.go │ └── user.go ├── routers │ ├── base.go │ ├── file.go │ ├── home.go │ ├── install.go │ ├── peers.go │ ├── router.go │ ├── setting.go │ └── system.go ├── server │ └── server.go └── setting │ └── setting.go ├── static ├── css │ ├── file.css │ ├── home.css │ ├── install.css │ ├── login.css │ └── style.css ├── img │ ├── alipay.jpg │ ├── favicon.ico │ ├── logo.png │ ├── user.png │ └── wechat.jpg ├── js │ ├── common.js │ ├── file.js │ ├── home.js │ ├── kit.js │ ├── main.js │ └── upload.js └── libs │ ├── echarts │ └── echarts.common.min.js │ ├── font-awesome-4.7.0 │ ├── HELP-US-OUT.txt │ ├── css │ │ ├── font-awesome.css │ │ └── font-awesome.min.css │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ ├── less │ │ ├── animated.less │ │ ├── bordered-pulled.less │ │ ├── core.less │ │ ├── fixed-width.less │ │ ├── font-awesome.less │ │ ├── icons.less │ │ ├── larger.less │ │ ├── list.less │ │ ├── mixins.less │ │ ├── path.less │ │ ├── rotated-flipped.less │ │ ├── screen-reader.less │ │ ├── stacked.less │ │ └── variables.less │ └── scss │ │ ├── _animated.scss │ │ ├── _bordered-pulled.scss │ │ ├── _core.scss │ │ ├── _fixed-width.scss │ │ ├── _icons.scss │ │ ├── _larger.scss │ │ ├── _list.scss │ │ ├── _mixins.scss │ │ ├── _path.scss │ │ ├── _rotated-flipped.scss │ │ ├── _screen-reader.scss │ │ ├── _stacked.scss │ │ ├── _variables.scss │ │ └── font-awesome.scss │ ├── iconfont │ ├── demo.css │ ├── demo_index.html │ ├── iconfont.css │ ├── iconfont.eot │ ├── iconfont.js │ ├── iconfont.svg │ ├── iconfont.ttf │ ├── iconfont.woff │ └── iconfont.woff2 │ ├── jquery │ ├── jquery-3.5.1.min.js │ └── jquery.form.min.js │ ├── layui-v2.5.6 │ └── layui │ │ ├── css │ │ ├── layui.css │ │ ├── layui.mobile.css │ │ └── modules │ │ │ ├── code.css │ │ │ ├── laydate │ │ │ └── default │ │ │ │ └── laydate.css │ │ │ └── layer │ │ │ └── default │ │ │ ├── icon-ext.png │ │ │ ├── icon.png │ │ │ ├── layer.css │ │ │ ├── loading-0.gif │ │ │ ├── loading-1.gif │ │ │ └── loading-2.gif │ │ ├── font │ │ ├── iconfont.eot │ │ ├── iconfont.svg │ │ ├── iconfont.ttf │ │ ├── iconfont.woff │ │ └── iconfont.woff2 │ │ ├── images │ │ └── face │ │ │ ├── 0.gif │ │ │ ├── 1.gif │ │ │ ├── 10.gif │ │ │ ├── 11.gif │ │ │ ├── 12.gif │ │ │ ├── 13.gif │ │ │ ├── 14.gif │ │ │ ├── 15.gif │ │ │ ├── 16.gif │ │ │ ├── 17.gif │ │ │ ├── 18.gif │ │ │ ├── 19.gif │ │ │ ├── 2.gif │ │ │ ├── 20.gif │ │ │ ├── 21.gif │ │ │ ├── 22.gif │ │ │ ├── 23.gif │ │ │ ├── 24.gif │ │ │ ├── 25.gif │ │ │ ├── 26.gif │ │ │ ├── 27.gif │ │ │ ├── 28.gif │ │ │ ├── 29.gif │ │ │ ├── 3.gif │ │ │ ├── 30.gif │ │ │ ├── 31.gif │ │ │ ├── 32.gif │ │ │ ├── 33.gif │ │ │ ├── 34.gif │ │ │ ├── 35.gif │ │ │ ├── 36.gif │ │ │ ├── 37.gif │ │ │ ├── 38.gif │ │ │ ├── 39.gif │ │ │ ├── 4.gif │ │ │ ├── 40.gif │ │ │ ├── 41.gif │ │ │ ├── 42.gif │ │ │ ├── 43.gif │ │ │ ├── 44.gif │ │ │ ├── 45.gif │ │ │ ├── 46.gif │ │ │ ├── 47.gif │ │ │ ├── 48.gif │ │ │ ├── 49.gif │ │ │ ├── 5.gif │ │ │ ├── 50.gif │ │ │ ├── 51.gif │ │ │ ├── 52.gif │ │ │ ├── 53.gif │ │ │ ├── 54.gif │ │ │ ├── 55.gif │ │ │ ├── 56.gif │ │ │ ├── 57.gif │ │ │ ├── 58.gif │ │ │ ├── 59.gif │ │ │ ├── 6.gif │ │ │ ├── 60.gif │ │ │ ├── 61.gif │ │ │ ├── 62.gif │ │ │ ├── 63.gif │ │ │ ├── 64.gif │ │ │ ├── 65.gif │ │ │ ├── 66.gif │ │ │ ├── 67.gif │ │ │ ├── 68.gif │ │ │ ├── 69.gif │ │ │ ├── 7.gif │ │ │ ├── 70.gif │ │ │ ├── 71.gif │ │ │ ├── 8.gif │ │ │ └── 9.gif │ │ ├── lay │ │ └── modules │ │ │ ├── carousel.js │ │ │ ├── code.js │ │ │ ├── colorpicker.js │ │ │ ├── element.js │ │ │ ├── flow.js │ │ │ ├── form.js │ │ │ ├── jquery.js │ │ │ ├── laydate.js │ │ │ ├── layedit.js │ │ │ ├── layer.js │ │ │ ├── laypage.js │ │ │ ├── laytpl.js │ │ │ ├── mobile.js │ │ │ ├── rate.js │ │ │ ├── slider.js │ │ │ ├── table.js │ │ │ ├── transfer.js │ │ │ ├── tree.js │ │ │ ├── upload.js │ │ │ └── util.js │ │ ├── layui.all.js │ │ └── layui.js │ ├── step-lay │ ├── step.css │ └── step.js │ └── template-web │ └── template-web.js └── template ├── file ├── file.tpl └── upload.tpl ├── home └── home.tpl ├── index └── index.tpl ├── install └── install.tpl ├── layout ├── header.tpl └── sider.tpl ├── login └── login.tpl ├── peers ├── add.tpl ├── edit.tpl └── list.tpl └── settings └── user.tpl /.gitignore: -------------------------------------------------------------------------------- 1 | ### Go template 2 | # Binaries for programs and plugins 3 | *.exe 4 | *.exe~ 5 | *.dll 6 | *.so 7 | *.dylib 8 | *.db 9 | *.log 10 | 11 | # Test binary, built with `go test -c` 12 | *.test 13 | 14 | # Output of the go coverage tool, specifically when used with LiteIDE 15 | *.out 16 | 17 | # Dependency directories (remove the comment below to include it) 18 | # vendor/ 19 | .idea 20 | .idea/ 21 | 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## GoFastDfsWeb - Golang版本 2 | > go-fastdfs 是一个简单的分布式文件存储,具有高性能,高可靠,免维护等优点,支持断点续传,分块上传,小文件合并,自动同步,自动修复。本项目为go-fastdfs的web管理端 3 | 4 | [前往 Go-Fastdfs](https://github.com/sjqzhang/go-fastdfs) 5 | 6 | [Go-Fastdfs web管理平台 - Java版本](https://github.com/perfree/go-fastdfs-web) 7 | 8 | ## Conf 9 | conf/app.ini 10 | ``` 11 | [app] 12 | RunMode = release 13 | HttpPort = 8088 14 | SqlFile = DataBase.db 15 | LogFile = go-fastDfs-web-go.log 16 | SessionSecret = 123456 17 | AppVer = dev1.0.0 18 | AppVerDate = 2021-09-29 19 | ``` 20 | ## Run 21 | ``` 22 | go run main.go 23 | ``` 24 | -------------------------------------------------------------------------------- /conf/app.ini: -------------------------------------------------------------------------------- 1 | [app] 2 | RunMode = release 3 | HttpPort = 8088 4 | SqlFile = DataBase.db 5 | LogFile = go-fastDfs-web-go.log 6 | SessionSecret = 123456 7 | AppVer = dev1.0.0 8 | AppVerDate = 2021-09-29 -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module go-fastdfs-web-go 2 | 3 | go 1.15 4 | 5 | require ( 6 | github.com/gin-contrib/sessions v0.0.3 7 | github.com/gin-gonic/gin v1.7.4 8 | github.com/go-ini/ini v1.63.2 9 | github.com/satori/go.uuid v1.2.0 10 | gopkg.in/yaml.v2 v2.2.8 11 | gorm.io/driver/sqlite v1.1.5 12 | gorm.io/gorm v1.21.15 13 | ) 14 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "go-fastdfs-web-go/src/models" 5 | "go-fastdfs-web-go/src/server" 6 | "go-fastdfs-web-go/src/setting" 7 | ) 8 | 9 | func init() { 10 | setting.LoadSetting() 11 | models.InitDataBase() 12 | } 13 | 14 | func main() { 15 | server.Run() 16 | } -------------------------------------------------------------------------------- /src/commons/constants.go: -------------------------------------------------------------------------------- 1 | package commons 2 | 3 | const ( 4 | ApiStatusSuccess = "ok" 5 | ApiReload = "/reload" 6 | ApiStat = "/stat" 7 | ApiUpload = "/upload" 8 | ApiDelete = "/delete" 9 | ApiGetFileInfo = "/get_file_info" 10 | ApiListDir = "/list_dir" 11 | ApiRepairStat = "/repair_stat" 12 | ApiRemoveEmptyDir = "/remove_empty_dir" 13 | ApiBackup = "/backup" 14 | ApiRepair = "/repair" 15 | ApiRepairFileInfo = "/repair_fileinfo" 16 | ApiStatus = "/status" 17 | ApiBigUpload = "/big/upload/" 18 | 19 | ContentTypeForm = "application/x-www-form-urlencoded" 20 | ContentTypeText = "text/plain" 21 | ContentTypeHtml = "text/html" 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /src/commons/fast_file.go: -------------------------------------------------------------------------------- 1 | package commons 2 | 3 | import ( 4 | "encoding/json" 5 | "net/url" 6 | "strings" 7 | "time" 8 | ) 9 | 10 | // GetDirOrFileList 获取文件列表 11 | func GetDirOrFileList(showUrl string, serverAddress string, dir string) ([]map[string]interface{}, error){ 12 | var fileList []map[string]interface{} 13 | postValue := url.Values{} 14 | if dir != "" { 15 | postValue.Set("dir", dir) 16 | } 17 | var httpUtil HttpUtil 18 | result, err := httpUtil.PostForm(serverAddress + ApiListDir, postValue) 19 | if err != nil || result == ""{ 20 | return fileList, err 21 | } 22 | 23 | var resultMap map[string]interface{} 24 | err = json.Unmarshal([]byte(result), &resultMap) 25 | if err != nil { 26 | return fileList, err 27 | } 28 | 29 | if resultMap["status"] == ApiStatusSuccess && resultMap["data"] != nil && len( resultMap["data"].([]interface{})) > 0 { 30 | data := resultMap["data"].([]interface{}) 31 | for _,v := range data { 32 | value := v.(map[string]interface{}) 33 | if value["name"] == "_big" { 34 | continue 35 | } 36 | 37 | fileResult := make(map[string]interface{}) 38 | fileResult["md5"] = value["md5"] 39 | fileResult["path"] = value["path"] 40 | fileResult["name"] = value["name"] 41 | fileResult["is_dir"] = value["is_dir"].(bool) 42 | fileResult["peerAddr"] = showUrl 43 | if value["is_dir"].(bool) { 44 | fileResult["size"] = 0 45 | } else { 46 | fileResult["size"] = FormatFileSize(value["size"].(float64)) 47 | } 48 | mTime := time.Unix(int64(value["mtime"].(float64)), 0).Format("2006-01-02 15:04:05") 49 | fileResult["mTime"] = mTime 50 | fileList = append(fileList, fileResult) 51 | } 52 | } 53 | return fileList, err 54 | } 55 | 56 | // DeleteFile 删除文件 57 | func DeleteFile(peersUrl string, md5 string) bool { 58 | postValue := url.Values{"md5": {md5}} 59 | var httpUtil HttpUtil 60 | result, err := httpUtil.PostForm(peersUrl + ApiDelete, postValue) 61 | if err != nil{ 62 | return false 63 | } 64 | 65 | var resultMap map[string]interface{} 66 | err = json.Unmarshal([]byte(result), &resultMap) 67 | if err != nil { 68 | return false 69 | } 70 | 71 | if resultMap["status"] == ApiStatusSuccess{ 72 | return true 73 | } 74 | return false 75 | } 76 | 77 | // Details 文件信息 78 | func Details(peersUrl string,showUrl string, md5 string) (map[string]interface{}, error) { 79 | postValue := url.Values{"md5": {md5}} 80 | fileResult := make(map[string]interface{}) 81 | var httpUtil HttpUtil 82 | result, err := httpUtil.PostForm(peersUrl + ApiGetFileInfo, postValue) 83 | if err != nil{ 84 | return nil, err 85 | } 86 | 87 | var resultMap map[string]interface{} 88 | err = json.Unmarshal([]byte(result), &resultMap) 89 | if err != nil { 90 | return nil, err 91 | } 92 | 93 | if resultMap["status"] == ApiStatusSuccess{ 94 | resultMap = resultMap["data"].(map[string]interface{}) 95 | fileResult["url"] = showUrl + "/" + strings.Replace(resultMap["path"].(string), "files/", "", 1) + "/" + resultMap["name"].(string) 96 | fileResult["path"] = resultMap["path"] 97 | fileResult["size"] = FormatFileSize(resultMap["size"].(float64)) 98 | fileResult["name"] = resultMap["name"] 99 | fileResult["md5"] = resultMap["md5"] 100 | fileResult["scene"] = resultMap["scene"] 101 | fileResult["timeStamp"] = time.Unix(int64(resultMap["timeStamp"].(float64)), 0).Format("2006-01-02 15:04:05") 102 | return fileResult, nil 103 | } 104 | return nil, err 105 | } -------------------------------------------------------------------------------- /src/commons/fast_status.go: -------------------------------------------------------------------------------- 1 | package commons 2 | 3 | import ( 4 | "time" 5 | ) 6 | 7 | func GetStatus(data map[string]interface{}) (map[string]interface{}, error) { 8 | // 结果集 9 | result := make(map[string]interface{}) 10 | // 声明30天文件大小数据容器 11 | var dayFileSizeList []string 12 | var dayFileCountList []float64 13 | // 声明30天内日期容器 14 | var dayNumList []string 15 | 16 | diskInfo := data["Sys.DiskInfo"].(map[string]interface{}) 17 | result["diskFreeSize"] = FormatFileSize(diskInfo["free"].(float64)) 18 | result["diskTotalSize"] = FormatFileSize(diskInfo["total"].(float64)) 19 | result["diskUsedSize"] = FormatFileSize(diskInfo["used"].(float64)) 20 | result["inodesTotal"] = diskInfo["inodesTotal"].(float64) 21 | result["inodesUsed"] = diskInfo["inodesUsed"].(float64) 22 | result["inodesFree"] = diskInfo["inodesFree"].(float64) 23 | 24 | dayFileSize := 0.0 25 | dayFileCount := 0.0 26 | 27 | fileStats := data["Fs.FileStats"].([]interface{}) 28 | for _, v := range fileStats { 29 | fileStat := v.(map[string]interface{}) 30 | if fileStat["date"] == "all" { 31 | result["totalFileSize"] = FormatFileSize(fileStat["totalSize"].(float64)) 32 | result["totalFileCount"] = fileStat["fileCount"].(float64) 33 | } else { 34 | var formatTime, _ = time.Parse("20060102", fileStat["date"].(string)) 35 | t := time.Now() 36 | beforeMonth := t.AddDate(0, -1, 0) 37 | if formatTime.Unix() <= t.Unix() && formatTime.Unix() >= beforeMonth.Unix() { 38 | dayFileSize += fileStat["totalSize"].(float64) 39 | dayFileCount += fileStat["fileCount"].(float64) 40 | dayFileSizeList = append(dayFileSizeList, FormatFileSizeToMb(fileStat["totalSize"].(float64))) 41 | dayFileCountList = append(dayFileCountList, fileStat["fileCount"].(float64)) 42 | dayNumList = append(dayNumList, fileStat["date"].(string)[6:len(fileStat["date"].(string))]+"日") 43 | } 44 | } 45 | 46 | } 47 | 48 | result["dayFileSize"] = FormatFileSize(dayFileSize) 49 | result["dayFileCount"] = dayFileCount 50 | result["dayFileSizeList"] = dayFileSizeList 51 | result["dayFileCountList"] = dayFileCountList 52 | result["dayNumList"] = dayNumList 53 | return result, nil 54 | } 55 | -------------------------------------------------------------------------------- /src/commons/file_utils.go: -------------------------------------------------------------------------------- 1 | package commons 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | ) 7 | 8 | // FormatFileSize 文件大小格式化 9 | func FormatFileSize(fileSize float64) (size string) { 10 | if fileSize < 1024 { 11 | //return strconv.FormatInt(fileSize, 10) + "B" 12 | return fmt.Sprintf("%.2fB", fileSize/float64(1)) 13 | } else if fileSize < (1024 * 1024) { 14 | return fmt.Sprintf("%.2fKB", fileSize/float64(1024)) 15 | } else if fileSize < (1024 * 1024 * 1024) { 16 | return fmt.Sprintf("%.2fMB", fileSize/float64(1024*1024)) 17 | } else if fileSize < (1024 * 1024 * 1024 * 1024) { 18 | return fmt.Sprintf("%.2fGB", fileSize/float64(1024*1024*1024)) 19 | } else if fileSize < (1024 * 1024 * 1024 * 1024 * 1024) { 20 | return fmt.Sprintf("%.2fTB", fileSize/float64(1024*1024*1024*1024)) 21 | } else { //if fileSize < (1024 * 1024 * 1024 * 1024 * 1024 * 1024) 22 | return fmt.Sprintf("%.2fEB", fileSize/float64(1024*1024*1024*1024*1024)) 23 | } 24 | } 25 | 26 | // FormatFileSizeToMb 文件大小转Mb 27 | func FormatFileSizeToMb(fileSize float64) (size string) { 28 | return fmt.Sprintf("%.2f", fileSize/float64(1024*1024)) 29 | } 30 | 31 | 32 | 33 | // IsDirExists 目录是否存在 34 | func IsDirExists(filename string) bool { 35 | _, err := os.Stat(filename) 36 | if os.IsNotExist(err) { 37 | return false 38 | } 39 | return true 40 | } -------------------------------------------------------------------------------- /src/commons/http.go: -------------------------------------------------------------------------------- 1 | package commons 2 | 3 | import ( 4 | "io/ioutil" 5 | "net/http" 6 | "net/url" 7 | ) 8 | 9 | type HttpUtil struct { 10 | } 11 | 12 | 13 | // PostForm 封装PostForm请求 14 | func (c *HttpUtil) PostForm(url string, data url.Values) (result string, err error) { 15 | h := http.Client{} 16 | resp, err := h.PostForm(url, data) 17 | if err != nil{ 18 | return "", err 19 | } 20 | 21 | defer resp.Body.Close() 22 | body, err := ioutil.ReadAll(resp.Body) 23 | 24 | if err != nil { 25 | return "", err 26 | } 27 | 28 | return string(body), err 29 | } 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/commons/pager.go: -------------------------------------------------------------------------------- 1 | package commons 2 | 3 | // Pager 分页结果集 4 | type Pager struct { 5 | State int 6 | Msg string 7 | Total int64 8 | Data interface{} 9 | } 10 | -------------------------------------------------------------------------------- /src/commons/response.go: -------------------------------------------------------------------------------- 1 | package commons 2 | 3 | import ( 4 | "github.com/gin-gonic/gin" 5 | "net/http" 6 | ) 7 | 8 | type Response struct { 9 | Code int 10 | Msg string 11 | Data interface{} 12 | } 13 | 14 | // SuccessMsgAndData 成功 带msg和data 15 | func (r *Response) SuccessMsgAndData(ctx *gin.Context, msg string, data interface{}) { 16 | res := Response{ 17 | 200, msg, data, 18 | } 19 | ctx.JSON(http.StatusOK, res) 20 | } 21 | 22 | // SuccessMsg 成功 带msg 23 | func (r *Response) SuccessMsg(ctx *gin.Context, msg string) { 24 | res := Response{ 25 | 200, msg, "", 26 | } 27 | ctx.JSON(http.StatusOK, res) 28 | } 29 | 30 | // Success 成功 31 | func (r *Response) Success(ctx *gin.Context) { 32 | res := Response{ 33 | 200, "", "", 34 | } 35 | ctx.JSON(http.StatusOK, res) 36 | } 37 | 38 | // SuccessData 成功 带数据 39 | func (r *Response) SuccessData(ctx *gin.Context, data interface{}) { 40 | res := Response{ 41 | 200, "", data, 42 | } 43 | ctx.JSON(http.StatusOK, res) 44 | } 45 | 46 | // Json json数据 47 | func (r *Response) Json(ctx *gin.Context, code int, msg string, data interface{}) { 48 | res := Response{ 49 | code, msg, data, 50 | } 51 | ctx.JSON(http.StatusOK, res) 52 | } 53 | 54 | // ErrorMsgAndData 失败 带msg和data 55 | func (r *Response) ErrorMsgAndData(ctx *gin.Context, msg string, data interface{}) { 56 | res := Response{ 57 | 500, "", data, 58 | } 59 | ctx.JSON(http.StatusOK, res) 60 | } 61 | 62 | 63 | // Error 失败 64 | func (r *Response) Error(ctx *gin.Context) { 65 | res := Response{ 66 | 500, "", "", 67 | } 68 | ctx.JSON(http.StatusOK, res) 69 | } 70 | 71 | // ErrorData 失败 带数据 72 | func (r *Response) ErrorData(ctx *gin.Context, data interface{}) { 73 | res := Response{ 74 | 500, "", data, 75 | } 76 | ctx.JSON(http.StatusOK, res) 77 | } 78 | 79 | // ErrorMsg 失败 带msg 80 | func (r *Response) ErrorMsg(ctx *gin.Context, msg string) { 81 | res := Response{ 82 | 500, msg, "", 83 | } 84 | ctx.JSON(http.StatusOK, res) 85 | } 86 | 87 | -------------------------------------------------------------------------------- /src/filters/before.go: -------------------------------------------------------------------------------- 1 | package filters 2 | 3 | import ( 4 | "github.com/gin-contrib/sessions" 5 | "github.com/gin-gonic/gin" 6 | "go-fastdfs-web-go/src/models" 7 | "net/http" 8 | "strings" 9 | ) 10 | 11 | // InstallFilter 安装拦截 12 | func InstallFilter() gin.HandlerFunc { 13 | return func(c *gin.Context){ 14 | user := models.User{} 15 | count := user.UserCount() 16 | if count <= 0 && !strings.Contains(c.FullPath(), "/install") { 17 | c.Redirect(http.StatusFound, "/install") 18 | } 19 | if count > 0 && strings.Contains(c.FullPath(), "/install") { 20 | c.Redirect(http.StatusFound, "/") 21 | } 22 | } 23 | } 24 | 25 | // LoginFilter 登录拦截 26 | func LoginFilter() gin.HandlerFunc { 27 | return func(c *gin.Context){ 28 | session := sessions.Default(c) 29 | userId := session.Get("UserId") 30 | if userId == nil && c.FullPath() != "/login" && c.FullPath() != "/doLogin" && !strings.Contains(c.FullPath(), "/install") { 31 | c.Redirect(http.StatusFound, "/login") 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /src/form/install.go: -------------------------------------------------------------------------------- 1 | package form 2 | 3 | import ( 4 | "crypto/md5" 5 | "encoding/hex" 6 | uuid "github.com/satori/go.uuid" 7 | "go-fastdfs-web-go/src/models" 8 | ) 9 | 10 | type InstallForm struct { 11 | Name string `binding:"required,max=50"` 12 | GroupName string `binding:"required,max=50"` 13 | ServerAddress string `binding:"required,max=100,url"` 14 | ShowAddress string `binding:"omitempty,max=100,url"` 15 | Account string `binding:"required,max=30"` 16 | Password string `binding:"required,max=30"` 17 | UserName string `binding:"required,max=30"` 18 | Email string `binding:"required,max=30,email"` 19 | } 20 | 21 | 22 | // GetUser 获取user 23 | func (install *InstallForm) GetUser() models.User { 24 | user := models.User{} 25 | user.Email = install.Email 26 | user.Account = install.Account 27 | user.Name = install.UserName 28 | user.Password = install.Password 29 | user.CredentialsSalt = uuid.NewV4().String() 30 | 31 | m5 := md5.New() 32 | m5.Write([]byte(user.Password)) 33 | m5.Write([]byte(user.CredentialsSalt)) 34 | st := m5.Sum(nil) 35 | user.Password = hex.EncodeToString(st) 36 | return user 37 | } 38 | 39 | // GetPeers 获取Peers 40 | func (install *InstallForm) GetPeers() models.Peers { 41 | peers := models.Peers{} 42 | peers.GroupName = install.GroupName 43 | peers.ServerAddress = install.ServerAddress 44 | peers.ShowAddress = install.ShowAddress 45 | peers.Name = install.Name 46 | return peers 47 | } -------------------------------------------------------------------------------- /src/form/peers.go: -------------------------------------------------------------------------------- 1 | package form 2 | 3 | import ( 4 | "go-fastdfs-web-go/src/models" 5 | "time" 6 | ) 7 | 8 | // PeersForm peers form 9 | type PeersForm struct { 10 | Id int 11 | Name string `binding:"required,max=50"` 12 | GroupName string `binding:"omitempty,max=50"` 13 | ServerAddress string `binding:"required,max=100,url"` 14 | CreateTime time.Time 15 | ShowAddress string `binding:"omitempty,max=100,url"` 16 | } 17 | 18 | // GetPeers 获取Peers 19 | func (p *PeersForm)GetPeers() models.Peers { 20 | peers := models.Peers{ 21 | Id : p.Id, 22 | Name: p.Name, 23 | GroupName: p.GroupName, 24 | ServerAddress: p.ServerAddress, 25 | CreateTime: p.CreateTime, 26 | ShowAddress: p.ShowAddress, 27 | } 28 | return peers 29 | } -------------------------------------------------------------------------------- /src/form/user.go: -------------------------------------------------------------------------------- 1 | package form 2 | 3 | import "go-fastdfs-web-go/src/models" 4 | 5 | type UserForm struct { 6 | Id int `binding:"required"` 7 | Account string 8 | Password string `binding:"required,max=16"` 9 | Name string `binding:"required,max=100"` 10 | Email string `binding:"required,email"` 11 | NewPassword string `binding:"required,max=16"` 12 | } 13 | 14 | func (u *UserForm)GetUser() models.User { 15 | return models.User{ 16 | Id: u.Id, 17 | Account: u.Account, 18 | Password: u.Password, 19 | Name: u.Name, 20 | Email: u.Email, 21 | } 22 | } -------------------------------------------------------------------------------- /src/models/models.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "go-fastdfs-web-go/src/setting" 5 | "gorm.io/driver/sqlite" 6 | "gorm.io/gorm" 7 | "log" 8 | ) 9 | 10 | var db *gorm.DB 11 | 12 | func InitDataBase() { 13 | var err error 14 | db, err = gorm.Open(sqlite.Open(setting.AppSetting.SqlFile), &gorm.Config{}) 15 | if err != nil { 16 | log.Printf("failed to connect database") 17 | } 18 | dbPool, _ := db.DB() 19 | dbPool.SetMaxIdleConns(10) 20 | dbPool.SetMaxOpenConns(100) 21 | _ = db.AutoMigrate(&User{}, &Peers{}) 22 | } -------------------------------------------------------------------------------- /src/models/peers.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "go-fastdfs-web-go/src/commons" 5 | "strconv" 6 | "time" 7 | ) 8 | 9 | // Peers peers table 10 | type Peers struct { 11 | Id int `gorm:"not null;primary key;auto_increment"` 12 | Name string `gorm:"not null;type:varchar(64)"` 13 | GroupName string `gorm:"not null;type:varchar(64)"` 14 | ServerAddress string `gorm:"not null;type:varchar(256)"` 15 | CreateTime time.Time `gorm:"not null;default:null"` 16 | ShowAddress string `gorm:"type:varchar(256)"` 17 | } 18 | 19 | // Save 保存 20 | func (p *Peers) Save(peers *Peers) { 21 | db.Create(peers) 22 | } 23 | 24 | // GetById 根据id查询Peers 25 | func (p *Peers) GetById(id int) (Peers, error) { 26 | var peers Peers 27 | err := db.Model(&Peers{}).Where(&Peers{Id: id}).First(&peers).Error 28 | return peers, err 29 | } 30 | 31 | // GetAllPeers 获取所有Peers 32 | func (p *Peers) GetAllPeers() ([]Peers, error) { 33 | var peers []Peers 34 | err := db.Model(&Peers{}).Find(&peers).Error 35 | return peers, err 36 | } 37 | 38 | // PageList 分页 39 | func (p *Peers) PageList(page string, limit string) commons.Pager { 40 | peersDb := db.Model(&Peers{}) 41 | var count int64 42 | peersDb.Count(&count) 43 | 44 | pageIndex,_ := strconv.Atoi(page) 45 | pageSize,_ := strconv.Atoi(limit) 46 | 47 | var peersList []Peers 48 | peersDb.Offset((pageIndex-1)*pageSize).Limit(pageSize).Find(&peersList) 49 | pager := commons.Pager{} 50 | pager.Msg = "success" 51 | pager.Data = peersList 52 | pager.Total = count 53 | pager.State = 200 54 | return pager 55 | } 56 | 57 | // CheckPeers 检查address是否存在 58 | func (p *Peers) CheckPeers(address string) (Peers, error) { 59 | var peers Peers 60 | err := db.Model(&Peers{}).Where(&Peers{ServerAddress: address}).First(&peers).Error 61 | return peers, err 62 | } 63 | 64 | // Update 更新 65 | func (p *Peers) Update(peers Peers) { 66 | db.Model(&Peers{}).Where(&Peers{Id: peers.Id}).Updates(&peers) 67 | } 68 | 69 | // Del 删除 70 | func (p *Peers) Del(id int) { 71 | db.Delete(&Peers{Id: id}) 72 | } -------------------------------------------------------------------------------- /src/models/user.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "time" 5 | ) 6 | 7 | // User user table 8 | type User struct { 9 | Id int `gorm:"not null;primary key;auto_increment"` 10 | Account string `gorm:"not null;type:varchar(64)"` 11 | Password string `gorm:"not null;type:varchar(64)"` 12 | Name string `gorm:"not null;type:varchar(64)"` 13 | CredentialsSalt string `gorm:"not null;type:varchar(64)"` 14 | Email string `gorm:"not null;type:varchar(64)"` 15 | PeersId int `gorm:"not null;type:varchar(64);default:null"` 16 | CreateTime time.Time `gorm:"not null;default:null"` 17 | UpdateTime time.Time `gorm:"default:null"` 18 | } 19 | 20 | // UserCount 获取用户数量 21 | func (u *User) UserCount() int64 { 22 | var count int64 23 | db.Model(&User{}).Count(&count) 24 | return count 25 | } 26 | 27 | // Save 保存 28 | func (u *User) Save(user *User) { 29 | db.Create(user) 30 | } 31 | 32 | // GetByAccount 根据账户查询User 33 | func (u *User) GetByAccount(account string) (User, error) { 34 | var user User 35 | err := db.Model(&User{}).Where(&User{Account: account}).First(&user).Error 36 | return user, err 37 | } 38 | 39 | // GetById 根据id查询User 40 | func (u *User) GetById(id int) (User, error) { 41 | var user User 42 | err := db.Model(&User{}).Where(&User{Id: id}).First(&user).Error 43 | return user, err 44 | } 45 | 46 | // Update 更新 47 | func (u *User) Update(user User) { 48 | db.Model(&User{}).Where(&User{Id: user.Id}).Updates(&user) 49 | } -------------------------------------------------------------------------------- /src/routers/base.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "github.com/gin-contrib/sessions" 5 | "github.com/gin-gonic/gin" 6 | "go-fastdfs-web-go/src/models" 7 | ) 8 | 9 | type BaseRouter struct { 10 | } 11 | 12 | // GetPeersUrl 获取PeersUrl 13 | func (b *BaseRouter) GetPeersUrl(ctx *gin.Context) (string, error) { 14 | user, err := b.GetUser(ctx) 15 | if err != nil { 16 | return "", err 17 | } 18 | 19 | var peers models.Peers 20 | peers, err = peers.GetById(user.PeersId) 21 | if err != nil { 22 | return "", err 23 | } 24 | 25 | if peers.GroupName != "" { 26 | return peers.ServerAddress + "/" + peers.GroupName, err 27 | } 28 | return peers.ServerAddress, err 29 | } 30 | 31 | // GetPeers 获取Peers 32 | func (b *BaseRouter) GetPeers(ctx *gin.Context) (models.Peers, error) { 33 | user, err := b.GetUser(ctx) 34 | if err != nil { 35 | return models.Peers{}, err 36 | } 37 | 38 | var peers models.Peers 39 | peers, err = peers.GetById(user.PeersId) 40 | if err != nil { 41 | return peers, err 42 | } 43 | return peers, err 44 | } 45 | 46 | // GetUser 获取当前用户 47 | func (b *BaseRouter) GetUser(ctx *gin.Context) (models.User, error) { 48 | session := sessions.Default(ctx) 49 | userId := session.Get("UserId").(int) 50 | var user models.User 51 | return user.GetById(userId) 52 | } 53 | 54 | // GetShowUrl 获取ShowUrl 55 | func (b *BaseRouter) GetShowUrl(ctx *gin.Context) string { 56 | peers, _ := b.GetPeers(ctx) 57 | showUrl := "" 58 | if peers.ShowAddress == "" { 59 | if peers.GroupName == "" { 60 | showUrl = peers.ServerAddress 61 | } else { 62 | showUrl = peers.ServerAddress + "/" + peers.GroupName 63 | } 64 | } else { 65 | if peers.GroupName == "" { 66 | showUrl = peers.ShowAddress 67 | } else { 68 | showUrl = peers.ShowAddress + "/" + peers.GroupName 69 | } 70 | } 71 | return showUrl 72 | } 73 | 74 | // GetShowUrlNotGroup 获取ShowUrl 75 | func (b *BaseRouter) GetShowUrlNotGroup(ctx *gin.Context) string { 76 | peers, _ := b.GetPeers(ctx) 77 | showUrl := "" 78 | if peers.ShowAddress == "" { 79 | showUrl = peers.ServerAddress 80 | } else { 81 | showUrl = peers.ShowAddress 82 | } 83 | return showUrl 84 | } -------------------------------------------------------------------------------- /src/routers/file.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "github.com/gin-gonic/gin" 5 | "go-fastdfs-web-go/src/commons" 6 | "go-fastdfs-web-go/src/commons/httplib" 7 | "io/ioutil" 8 | "net/http" 9 | "os" 10 | ) 11 | 12 | type FileRouter struct { 13 | BaseRouter 14 | commons.Response 15 | } 16 | 17 | // Index 文件列表 18 | func (f *FileRouter)Index(ctx *gin.Context) { 19 | ctx.HTML(http.StatusOK, "file/file.tpl", nil) 20 | } 21 | 22 | // GetDirFile 获取目录/文件列表 23 | func (f *FileRouter) GetDirFile(ctx *gin.Context) { 24 | dir := ctx.PostForm("dir") 25 | url,_ :=f.GetPeersUrl(ctx) 26 | result,_ := commons.GetDirOrFileList(f.GetShowUrl(ctx), url, dir) 27 | f.SuccessData(ctx, result) 28 | } 29 | 30 | // DeleteFile 删除文件 31 | func (f *FileRouter)DeleteFile (ctx *gin.Context) { 32 | md5 := ctx.PostForm("md5") 33 | url,_ :=f.GetPeersUrl(ctx) 34 | if commons.DeleteFile(url, md5) { 35 | f.Success(ctx) 36 | return 37 | } 38 | f.Error(ctx) 39 | } 40 | 41 | // Details 文件信息 42 | func (f *FileRouter)Details (ctx *gin.Context) { 43 | md5 := ctx.PostForm("md5") 44 | url,_ :=f.GetPeersUrl(ctx) 45 | result, err := commons.Details(url,f.GetShowUrl(ctx), md5) 46 | if err != nil { 47 | f.ErrorMsg(ctx, "获取文件信息失败") 48 | return 49 | } 50 | f.SuccessData(ctx, result) 51 | } 52 | 53 | // DownloadFile 下载 54 | func (f *FileRouter) DownloadFile(ctx *gin.Context){ 55 | name := ctx.PostForm("name") 56 | path := ctx.PostForm("path") 57 | peersUrl,_ :=f.GetPeersUrl(ctx) 58 | res, err :=http.Get(peersUrl + "/" + path + "/" + name) 59 | if err !=nil { 60 | panic(err) 61 | } 62 | content, err := ioutil.ReadAll(res.Body) 63 | if err != nil { 64 | panic(err) 65 | } 66 | ctx.Writer.Header().Add("Content-Type", "application/octet-stream") 67 | ctx.Writer.Header().Add("Content-Disposition", "attachment; filename=\""+name+"\"") 68 | _, _ = ctx.Writer.Write(content) 69 | } 70 | 71 | // UploadPage 上传页 72 | func (f *FileRouter) UploadPage(ctx *gin.Context) { 73 | ctx.HTML(http.StatusOK, "file/upload.tpl", gin.H{ 74 | "showAddress" : f.GetShowUrl(ctx), 75 | }) 76 | } 77 | 78 | // Upload 文件上传 79 | func (f *FileRouter)Upload(ctx *gin.Context) { 80 | file, _ := ctx.FormFile("file") 81 | if !commons.IsDirExists("tmp") { 82 | err := os.Mkdir("tmp", 0777) 83 | if err != nil { 84 | f.ErrorMsg(ctx, "创建临时目录失败") 85 | return 86 | } 87 | } 88 | 89 | filePath := "tmp/" + file.Filename 90 | err := ctx.SaveUploadedFile(file, filePath) 91 | if err != nil { 92 | f.ErrorMsg(ctx, "保存临时文件失败") 93 | return 94 | } 95 | 96 | peersUrl,_ :=f.GetPeersUrl(ctx) 97 | scene := ctx.PostForm("scene") 98 | path := ctx.PostForm("path") 99 | 100 | var obj map[string]interface{} 101 | req := httplib.Post(peersUrl + commons.ApiUpload) 102 | req.PostFile("file", filePath) 103 | req.Param("output","json") 104 | req.Param("scene",scene) 105 | req.Param("path",path) 106 | err = req.ToJSON(&obj) 107 | if err != nil { 108 | f.Error(ctx) 109 | return 110 | } 111 | obj["url"] = f.GetShowUrlNotGroup(ctx) + obj["path"].(string) 112 | err = os.Remove(filePath) 113 | f.SuccessData(ctx, obj) 114 | } 115 | -------------------------------------------------------------------------------- /src/routers/home.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/gin-gonic/gin" 6 | "go-fastdfs-web-go/src/commons" 7 | "go-fastdfs-web-go/src/models" 8 | "go-fastdfs-web-go/src/setting" 9 | "net/http" 10 | "net/url" 11 | "runtime" 12 | "strconv" 13 | "time" 14 | ) 15 | 16 | type HomeRouter struct { 17 | BaseRouter 18 | commons.Response 19 | } 20 | 21 | // Home 首页 22 | func (h *HomeRouter)Home(ctx *gin.Context) { 23 | ctx.HTML(http.StatusOK, "home/home.tpl", gin.H{ 24 | "osName" : runtime.GOOS, 25 | "osArch" : runtime.GOARCH, 26 | "version" : setting.AppSetting.AppVer, 27 | "versionDate" : setting.AppSetting.AppVerDate, 28 | }) 29 | } 30 | 31 | // GetStatus 获取状态信息 32 | func (h *HomeRouter) GetStatus(ctx *gin.Context) { 33 | path, err := h.GetPeersUrl(ctx) 34 | if err != nil { 35 | h.ErrorMsg(ctx, "系统异常") 36 | return 37 | } 38 | 39 | result, err := httpUtil.PostForm(path+commons.ApiStatus, nil) 40 | if err != nil { 41 | h.ErrorMsg(ctx, "调取go-fastDfs接口失败") 42 | return 43 | } 44 | 45 | var resultMap map[string]interface{} 46 | err = json.Unmarshal([]byte(result), &resultMap) 47 | if err != nil { 48 | h.ErrorMsg(ctx, "调取go-fastDfs接口失败") 49 | return 50 | } 51 | 52 | if resultMap["status"] == commons.ApiStatusSuccess { 53 | data := resultMap["data"].(map[string]interface{}) 54 | result, err := commons.GetStatus(data) 55 | if err != nil { 56 | h.ErrorMsg(ctx, "数据解析错误") 57 | return 58 | } 59 | h.SuccessData(ctx, result) 60 | return 61 | } 62 | h.ErrorMsg(ctx, "调取go-fastDfs接口失败") 63 | } 64 | 65 | // RepairStat 修正统计信息(30天) 66 | func (h *HomeRouter) RepairStat(ctx *gin.Context) { 67 | count := 0 68 | for i := 0; i > -30; i-- { 69 | beforeDate := time.Now().AddDate(0, 0, i).Format("20060102") 70 | postValue := url.Values{"date": {beforeDate}} 71 | data := make(map[string]interface{}) 72 | data["date"] = beforeDate 73 | path, _ := h.GetPeersUrl(ctx) 74 | result, err := httpUtil.PostForm(path+commons.ApiRepairStat, postValue) 75 | if err != nil { 76 | h.ErrorMsg(ctx, "调取go-fastDfs接口失败") 77 | return 78 | } 79 | var resultMap map[string]interface{} 80 | err = json.Unmarshal([]byte(result), &resultMap) 81 | if err != nil { 82 | h.ErrorMsg(ctx, "调取go-fastDfs接口失败") 83 | return 84 | } 85 | if resultMap["status"] == commons.ApiStatusSuccess { 86 | count++ 87 | } 88 | } 89 | h.SuccessMsg(ctx, "成功修正" + strconv.Itoa(count) + "天数据") 90 | } 91 | 92 | 93 | // RemoveEmptyDir 删除空目录 94 | func (h *HomeRouter) RemoveEmptyDir(ctx *gin.Context) { 95 | path, _ := h.GetPeersUrl(ctx) 96 | result, err := httpUtil.PostForm(path+commons.ApiRemoveEmptyDir, nil) 97 | if err != nil { 98 | h.ErrorMsg(ctx, "调取go-fastDfs接口失败") 99 | return 100 | } 101 | var resultMap map[string]interface{} 102 | err = json.Unmarshal([]byte(result), &resultMap) 103 | if err != nil { 104 | h.ErrorMsg(ctx, "调取go-fastDfs接口失败") 105 | return 106 | } 107 | 108 | if resultMap["status"] == commons.ApiStatusSuccess { 109 | h.SuccessMsg(ctx, "操作成功,正在后台操作,请勿重复使用此功能") 110 | return 111 | } 112 | h.ErrorMsg(ctx, "操作失败,请稍后再试") 113 | } 114 | 115 | // Backup 备份元数据, 30天 116 | func (h *HomeRouter) Backup(ctx *gin.Context) { 117 | count := 0 118 | for i := 0; i > -30; i-- { 119 | beforeDate := time.Now().AddDate(0, 0, i).Format("20060102") 120 | postValue := url.Values{"date": {beforeDate}} 121 | data := make(map[string]interface{}) 122 | data["date"] = beforeDate 123 | path, _ := h.GetPeersUrl(ctx) 124 | result, err := httpUtil.PostForm(path+commons.ApiBackup, postValue) 125 | if err != nil { 126 | h.ErrorMsg(ctx, "调取go-fastDfs接口失败") 127 | return 128 | } 129 | var resultMap map[string]interface{} 130 | err = json.Unmarshal([]byte(result), &resultMap) 131 | if err != nil { 132 | h.ErrorMsg(ctx, "调取go-fastDfs接口失败") 133 | return 134 | } 135 | if resultMap["status"] == commons.ApiStatusSuccess { 136 | count++ 137 | } 138 | } 139 | h.SuccessMsg(ctx, "成功备份" + strconv.Itoa(count) + "天数据") 140 | } 141 | 142 | // Repair 同步失败修复 143 | func (h *HomeRouter) Repair(ctx *gin.Context) { 144 | path, _ := h.GetPeersUrl(ctx) 145 | result, err := httpUtil.PostForm(path+commons.ApiRepair+"?force=1", nil) 146 | if err != nil { 147 | h.ErrorMsg(ctx, "调取go-fastDfs接口失败") 148 | return 149 | } 150 | var resultMap map[string]interface{} 151 | err = json.Unmarshal([]byte(result), &resultMap) 152 | if err != nil { 153 | h.ErrorMsg(ctx, "调取go-fastDfs接口失败") 154 | return 155 | } 156 | 157 | if resultMap["status"] == commons.ApiStatusSuccess { 158 | h.SuccessMsg(ctx, "操作成功,正在后台操作,请勿重复使用此功能") 159 | return 160 | } 161 | h.ErrorMsg(ctx, "操作失败,请稍后再试") 162 | } 163 | 164 | // GetAllPeers 获取所有集群 165 | func (h *HomeRouter) GetAllPeers(ctx *gin.Context) { 166 | var peers models.Peers 167 | peersArr, err := peers.GetAllPeers() 168 | if err != nil { 169 | h.ErrorMsg(ctx, "获取数据失败") 170 | return 171 | } 172 | h.SuccessData(ctx, peersArr) 173 | } 174 | 175 | // SwitchPeers 切换集群 176 | func (h *HomeRouter) SwitchPeers(ctx *gin.Context) { 177 | peers, err := h.GetPeers(ctx) 178 | if err != nil { 179 | h.ErrorMsg(ctx, "系统出错") 180 | return 181 | } 182 | id := ctx.PostForm("id") 183 | if strconv.Itoa(peers.Id) == id { 184 | h.ErrorMsg(ctx, "当前正在使用此集群") 185 | return 186 | } 187 | 188 | user, _ := h.GetUser(ctx) 189 | peersId, _ := strconv.Atoi(id) 190 | user.PeersId = peersId 191 | user.Update(user) 192 | h.SuccessMsg(ctx,"更新成功") 193 | } -------------------------------------------------------------------------------- /src/routers/install.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "github.com/gin-gonic/gin" 7 | "go-fastdfs-web-go/src/commons" 8 | "go-fastdfs-web-go/src/form" 9 | "net/http" 10 | "net/url" 11 | "time" 12 | ) 13 | 14 | var httpUtil = commons.HttpUtil{} 15 | 16 | // InstallRouter 安装Router 17 | type InstallRouter struct { 18 | BaseRouter 19 | commons.Response 20 | } 21 | 22 | // InstallPage 安装页 23 | func (i *InstallRouter) InstallPage(ctx *gin.Context) { 24 | ctx.HTML(http.StatusOK, "install/install.tpl", nil) 25 | } 26 | 27 | // CheckLocalServer 检查本机是否安装goFastDfs 28 | func (i *InstallRouter)CheckLocalServer(ctx *gin.Context) { 29 | postValue := url.Values{"action": {"get"}} 30 | result, err := httpUtil.PostForm("http://127.0.0.1:8080/group1" + commons.ApiReload, postValue) 31 | if err != nil || result == ""{ 32 | result, err = httpUtil.PostForm("http://127.0.0.1:8080" + commons.ApiReload, postValue) 33 | } 34 | 35 | if err != nil || result == "" { 36 | i.Error(ctx) 37 | return 38 | } 39 | 40 | var resultMap map[string]interface{} 41 | err = json.Unmarshal([]byte(result), &resultMap) 42 | if err != nil { 43 | i.Error(ctx) 44 | return 45 | } 46 | 47 | if resultMap["status"] == commons.ApiStatusSuccess { 48 | i.SuccessData(ctx, resultMap) 49 | return 50 | } 51 | i.Error(ctx) 52 | } 53 | 54 | // CheckServer 校验Server 55 | func (i *InstallRouter) CheckServer(ctx *gin.Context) { 56 | var peers form.PeersForm 57 | if err := ctx.ShouldBind(&peers); err != nil { 58 | i.ErrorMsg(ctx, fmt.Sprint(err)) 59 | return 60 | } 61 | // 拼装url 62 | path := peers.ServerAddress 63 | if peers.GroupName != "" { 64 | path += "/" + peers.GroupName 65 | } 66 | path += commons.ApiStatus 67 | 68 | // 测试连接GoFastDfs 69 | result, err := httpUtil.PostForm(path, nil) 70 | if err != nil { 71 | i.ErrorMsg(ctx, "连接GoFastDfs服务失败!请检查服务地址是否正确,以及是否配置白名单!") 72 | return 73 | } 74 | 75 | var resultMap map[string]interface{} 76 | err = json.Unmarshal([]byte(result), &resultMap) 77 | if err != nil { 78 | i.ErrorMsg(ctx, "连接GoFastDfs服务失败!请检查服务地址是否正确,以及是否配置白名单!") 79 | return 80 | } 81 | 82 | 83 | if resultMap["status"] == commons.ApiStatusSuccess { 84 | i.SuccessData(ctx, resultMap) 85 | return 86 | } 87 | 88 | i.ErrorMsg(ctx, "连接GoFastDfs服务失败!请检查服务地址是否正确,以及是否配置白名单!") 89 | } 90 | 91 | // DoInstall 安装 92 | func (i *InstallRouter) DoInstall(ctx *gin.Context) { 93 | var install = form.InstallForm{} 94 | if err := ctx.ShouldBind(&install); err != nil { 95 | i.ErrorMsg(ctx, fmt.Sprint(err)) 96 | return 97 | } 98 | 99 | peers := install.GetPeers() 100 | peers.CreateTime = time.Now() 101 | peers.Save(&peers) 102 | user := install.GetUser() 103 | user.CreateTime = time.Now() 104 | user.PeersId = peers.Id 105 | user.Save(&user) 106 | i.Success(ctx) 107 | } -------------------------------------------------------------------------------- /src/routers/peers.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "github.com/gin-gonic/gin" 7 | "go-fastdfs-web-go/src/commons" 8 | "go-fastdfs-web-go/src/form" 9 | "go-fastdfs-web-go/src/models" 10 | "net/http" 11 | "strconv" 12 | "time" 13 | ) 14 | 15 | type PeersRouter struct { 16 | BaseRouter 17 | commons.Response 18 | } 19 | 20 | // Index 集群管理首页 21 | func (p *PeersRouter) Index(ctx *gin.Context) { 22 | ctx.HTML(http.StatusOK, "peers/list.tpl" , nil) 23 | } 24 | 25 | // PageList 获取集群分页列表 26 | func (p *PeersRouter) PageList(ctx *gin.Context) { 27 | page := ctx.Query("page") 28 | limit := ctx.Query("limit") 29 | var peers models.Peers 30 | pager := peers.PageList(page, limit) 31 | ctx.JSON(http.StatusOK, pager) 32 | } 33 | 34 | // AddPage 集群添加页 35 | func (p *PeersRouter) AddPage(ctx *gin.Context) { 36 | ctx.HTML(http.StatusOK, "peers/add.tpl" , nil) 37 | } 38 | 39 | // DoAdd 添加集群 40 | func (p *PeersRouter) DoAdd(ctx *gin.Context) { 41 | var peersForm form.PeersForm 42 | if err := ctx.ShouldBind(&peersForm); err != nil { 43 | p.ErrorMsg(ctx, fmt.Sprint(err)) 44 | return 45 | } 46 | 47 | var peers models.Peers 48 | _, err := peers.CheckPeers(peersForm.ServerAddress) 49 | if err == nil { 50 | p.ErrorMsg(ctx, "该集群已存在") 51 | return 52 | } 53 | 54 | // 拼装url 55 | path := peersForm.ServerAddress 56 | if peersForm.GroupName != "" { 57 | path += "/" + peersForm.GroupName 58 | } 59 | path += commons.ApiStatus 60 | 61 | // 测试连接GoFastDfs 62 | result, err := httpUtil.PostForm(path, nil) 63 | if err != nil { 64 | p.ErrorMsg(ctx, "连接GoFastDfs服务失败!请检查服务地址是否正确,以及是否配置白名单!") 65 | return 66 | } 67 | 68 | var resultMap map[string]interface{} 69 | err = json.Unmarshal([]byte(result), &resultMap) 70 | if err != nil || resultMap["status"] != commons.ApiStatusSuccess { 71 | p.ErrorMsg(ctx, "连接GoFastDfs服务失败!请检查服务地址是否正确,以及是否配置白名单!") 72 | return 73 | } 74 | 75 | peers = peersForm.GetPeers() 76 | peers.CreateTime = time.Now() 77 | peers.Save(&peers) 78 | 79 | p.SuccessData(ctx, peers) 80 | } 81 | 82 | // EditPage 编辑页面 83 | func (p *PeersRouter) EditPage(ctx *gin.Context) { 84 | id := ctx.Query("id") 85 | peers := models.Peers{} 86 | peers.Id, _ = strconv.Atoi(id) 87 | peers, _ = peers.GetById(peers.Id) 88 | ctx.HTML(http.StatusOK, "peers/edit.tpl", gin.H{ 89 | "peers": peers, 90 | }) 91 | } 92 | 93 | // DoEdit 编辑 94 | func (p *PeersRouter) DoEdit(ctx *gin.Context) { 95 | var peersForm form.PeersForm 96 | if err := ctx.ShouldBind(&peersForm); err != nil { 97 | p.ErrorMsg(ctx, fmt.Sprint(err)) 98 | return 99 | } 100 | 101 | var peers models.Peers 102 | 103 | _, err := peers.CheckPeers(peersForm.ServerAddress) 104 | oldPeers, _ := peers.GetById(peersForm.Id) 105 | if oldPeers.ServerAddress != peersForm.ServerAddress && err == nil { 106 | p.ErrorMsg(ctx, "该集群已存在!") 107 | return 108 | } 109 | 110 | // 拼装url 111 | path := peersForm.ServerAddress 112 | if peersForm.GroupName != "" { 113 | path += "/" + peersForm.GroupName 114 | } 115 | path += commons.ApiStatus 116 | 117 | // 测试连接GoFastDfs 118 | result, err := httpUtil.PostForm(path, nil) 119 | if err != nil { 120 | p.ErrorMsg(ctx, "连接GoFastDfs服务失败!请检查服务地址是否正确,以及是否配置白名单!") 121 | return 122 | } 123 | 124 | var resultMap map[string]interface{} 125 | err = json.Unmarshal([]byte(result), &resultMap) 126 | if err != nil || resultMap["status"] != commons.ApiStatusSuccess { 127 | p.ErrorMsg(ctx, "连接GoFastDfs服务失败!请检查服务地址是否正确,以及是否配置白名单!") 128 | return 129 | } 130 | 131 | peers.Update(peersForm.GetPeers()) 132 | p.SuccessData(ctx, peersForm.GetPeers()) 133 | } 134 | 135 | // Del 删除 136 | func (p *PeersRouter) Del(ctx *gin.Context) { 137 | idStr := ctx.PostForm("id") 138 | id, _ := strconv.Atoi(idStr) 139 | var peers models.Peers 140 | peers.Del(id) 141 | p.Success(ctx) 142 | } -------------------------------------------------------------------------------- /src/routers/router.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "github.com/gin-contrib/sessions" 5 | "github.com/gin-contrib/sessions/cookie" 6 | "github.com/gin-gonic/gin" 7 | "go-fastdfs-web-go/src/filters" 8 | "go-fastdfs-web-go/src/setting" 9 | ) 10 | 11 | type Routers struct { 12 | SystemRouter SystemRouter 13 | InstallRouter InstallRouter 14 | HomeRouter HomeRouter 15 | PeersRouter PeersRouter 16 | FileRouter FileRouter 17 | SettingRouter SettingRouter 18 | 19 | } 20 | 21 | // InitRouter 初始化路由 22 | func (routers *Routers) InitRouter() *gin.Engine { 23 | r := gin.New() 24 | r.Use(gin.Logger()) 25 | r.Use(gin.Recovery()) 26 | store := cookie.NewStore([]byte(setting.AppSetting.SessionSecret)) 27 | store.Options(sessions.Options{ 28 | MaxAge: 60 * 60, 29 | Path: "/", 30 | }) 31 | r.Use(sessions.Sessions("session", store)) 32 | 33 | r.LoadHTMLGlob("./template/**/*.tpl") 34 | r.Static("/static", "./static") 35 | 36 | 37 | r.Use(filters.InstallFilter()) // 安装拦截 38 | r.GET("/install", routers.InstallRouter.InstallPage) 39 | r.GET("/install/checkLocalServer", routers.InstallRouter.CheckLocalServer) 40 | r.POST("/install/checkServer", routers.InstallRouter.CheckServer) 41 | r.POST("/install/doInstall", routers.InstallRouter.DoInstall) 42 | r.GET("/login", routers.SystemRouter.LoginPage) 43 | r.POST("/doLogin", routers.SystemRouter.DoLogin) 44 | r.GET("/logout", routers.SystemRouter.LogOut) 45 | 46 | r.Use(filters.LoginFilter()) // 登录拦截 47 | r.GET("/", routers.SystemRouter.IndexPage) 48 | 49 | r.GET("/home", routers.HomeRouter.Home) 50 | r.POST("/home/getStatus", routers.HomeRouter.GetStatus) 51 | r.POST("/home/repair_stat", routers.HomeRouter.RepairStat) 52 | r.POST("/home/remove_empty_dir", routers.HomeRouter.RemoveEmptyDir) 53 | r.POST("/home/backup", routers.HomeRouter.Backup) 54 | r.POST("/home/repair", routers.HomeRouter.Repair) 55 | r.POST("/home/getAllPeers", routers.HomeRouter.GetAllPeers) 56 | r.POST("/home/switchPeers", routers.HomeRouter.SwitchPeers) 57 | 58 | 59 | r.GET("/peers", routers.PeersRouter.Index) 60 | r.GET("/peers/page", routers.PeersRouter.PageList) 61 | r.GET("/peers/add", routers.PeersRouter.AddPage) 62 | r.POST("/peers/doAdd", routers.PeersRouter.DoAdd) 63 | r.GET("/peers/edit", routers.PeersRouter.EditPage) 64 | r.POST("/peers/doEdit", routers.PeersRouter.DoEdit) 65 | r.POST("/peers/del", routers.PeersRouter.Del) 66 | 67 | r.GET("/file", routers.FileRouter.Index) 68 | r.POST("/file/getDirFile", routers.FileRouter.GetDirFile) 69 | r.POST("/file/deleteFile", routers.FileRouter.DeleteFile) 70 | r.POST("/file/details", routers.FileRouter.Details) 71 | r.POST("/file/downloadFile", routers.FileRouter.DownloadFile) 72 | 73 | r.GET("/file/upload", routers.FileRouter.UploadPage) 74 | r.POST("/file/upload/fileUpload", routers.FileRouter.Upload) 75 | 76 | r.GET("/settings/user", routers.SettingRouter.UserPage) 77 | r.POST("/settings/editUser", routers.SettingRouter.EditUser) 78 | 79 | return r 80 | } -------------------------------------------------------------------------------- /src/routers/setting.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "crypto/md5" 5 | "encoding/hex" 6 | "fmt" 7 | "github.com/gin-gonic/gin" 8 | "go-fastdfs-web-go/src/commons" 9 | "go-fastdfs-web-go/src/form" 10 | "go-fastdfs-web-go/src/models" 11 | "net/http" 12 | ) 13 | 14 | type SettingRouter struct { 15 | BaseRouter 16 | commons.Response 17 | } 18 | 19 | // UserPage 个人资料页 20 | func (s *SettingRouter)UserPage(ctx *gin.Context) { 21 | user, _ := s.GetUser(ctx) 22 | ctx.HTML(http.StatusOK, "settings/user.tpl", gin.H{ 23 | "user" : user, 24 | }) 25 | } 26 | 27 | // EditUser 编辑用户 28 | func (s *SettingRouter) EditUser(ctx *gin.Context) { 29 | var userForm form.UserForm 30 | if err := ctx.ShouldBind(&userForm); err != nil { 31 | s.ErrorMsg(ctx, fmt.Sprint(err)) 32 | return 33 | } 34 | 35 | var user models.User 36 | user, _ = user.GetById(userForm.Id) 37 | m5 := md5.New() 38 | m5.Write([]byte(userForm.Password)) 39 | m5.Write([]byte(user.CredentialsSalt)) 40 | st := m5.Sum(nil) 41 | userForm.Password = hex.EncodeToString(st) 42 | 43 | if user.Password != userForm.Password { 44 | s.ErrorMsg(ctx, "原密码错误") 45 | return 46 | } 47 | 48 | m5 = md5.New() 49 | m5.Write([]byte(userForm.NewPassword)) 50 | m5.Write([]byte(user.CredentialsSalt)) 51 | userForm.Password = hex.EncodeToString(m5.Sum(nil)) 52 | 53 | newUser := userForm.GetUser() 54 | newUser.Update(newUser) 55 | s.Success(ctx) 56 | } -------------------------------------------------------------------------------- /src/routers/system.go: -------------------------------------------------------------------------------- 1 | package routers 2 | 3 | import ( 4 | "crypto/md5" 5 | "encoding/hex" 6 | "github.com/gin-contrib/sessions" 7 | "github.com/gin-gonic/gin" 8 | "go-fastdfs-web-go/src/commons" 9 | "go-fastdfs-web-go/src/models" 10 | "net/http" 11 | ) 12 | 13 | // SystemRouter 系统级router,如首页,登录,退出登陆等 14 | type SystemRouter struct { 15 | BaseRouter 16 | commons.Response 17 | } 18 | 19 | // IndexPage 首页 20 | func (s *SystemRouter) IndexPage(c *gin.Context) { 21 | c.HTML(http.StatusOK, "index/index.tpl", nil) 22 | } 23 | 24 | // LoginPage 登录页 25 | func (s *SystemRouter) LoginPage(c *gin.Context) { 26 | c.HTML(http.StatusOK, "login/login.tpl", nil) 27 | } 28 | 29 | // DoLogin 登录 30 | func (s *SystemRouter) DoLogin(c *gin.Context) { 31 | var user = models.User{} 32 | err := c.Bind(&user) 33 | if err != nil { 34 | s.ErrorMsg(c, "请求参数错误") 35 | return 36 | } 37 | if user.Account == "" { 38 | s.ErrorMsg(c, "账户不能为空") 39 | return 40 | } 41 | if user.Password == "" { 42 | s.ErrorMsg(c, "密码不能为空") 43 | return 44 | } 45 | 46 | password := user.Password 47 | queryUser, err := user.GetByAccount(user.Account) 48 | 49 | if err != nil { 50 | s.ErrorMsg(c, "账户不存在") 51 | return 52 | } 53 | 54 | m5 := md5.New() 55 | m5.Write([]byte(password)) 56 | m5.Write([]byte(queryUser.CredentialsSalt)) 57 | st := m5.Sum(nil) 58 | user.Password = hex.EncodeToString(st) 59 | 60 | if user.Password == queryUser.Password { 61 | session := sessions.Default(c) 62 | session.Set("UserId", queryUser.Id) 63 | _ = session.Save() 64 | s.Success(c) 65 | return 66 | } 67 | s.ErrorMsg(c, "密码错误") 68 | } 69 | 70 | // LogOut 退出 71 | func (s *SystemRouter) LogOut(c *gin.Context) { 72 | session := sessions.Default(c) 73 | session.Delete("UserId") 74 | _ = session.Save() 75 | c.Redirect(http.StatusFound, "/login") 76 | } -------------------------------------------------------------------------------- /src/server/server.go: -------------------------------------------------------------------------------- 1 | package server 2 | 3 | import ( 4 | "fmt" 5 | "github.com/gin-gonic/gin" 6 | "go-fastdfs-web-go/src/routers" 7 | "go-fastdfs-web-go/src/setting" 8 | "io" 9 | "os" 10 | ) 11 | 12 | 13 | // Run 运行服务 14 | func Run() { 15 | gin.SetMode(setting.AppSetting.RunMode) 16 | gin.DisableConsoleColor() 17 | f, _ := os.Create(setting.AppSetting.LogFile) 18 | gin.DefaultWriter = io.MultiWriter(f) 19 | routersInit := new(routers.Routers).InitRouter() 20 | 21 | fmt.Println(setting.AppSetting.HttpPort) 22 | _ = routersInit.Run(fmt.Sprintf(":%d", setting.AppSetting.HttpPort)) 23 | 24 | } -------------------------------------------------------------------------------- /src/setting/setting.go: -------------------------------------------------------------------------------- 1 | package setting 2 | 3 | import ( 4 | "github.com/go-ini/ini" 5 | "log" 6 | ) 7 | 8 | // App 定义App配置文件映射 9 | type App struct { 10 | RunMode string 11 | HttpPort int 12 | SqlFile string 13 | LogFile string 14 | SessionSecret string 15 | AppVer string 16 | AppVerDate string 17 | } 18 | 19 | var AppSetting = &App{} 20 | 21 | var cfg *ini.File 22 | 23 | // LoadSetting 加载配置 24 | func LoadSetting() { 25 | var err error 26 | cfg, err = ini.Load("conf/app.ini") 27 | if err != nil { 28 | log.Fatalf("LoadSetting, fail to parse 'conf/app.ini': %v", err) 29 | } 30 | convert("app", AppSetting) 31 | } 32 | 33 | // convert 配置文件转换 34 | func convert(section string, v interface{}) { 35 | err := cfg.Section(section).MapTo(v) 36 | if err != nil { 37 | log.Fatalf("Cfg.convert %s err: %v", section, err) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /static/css/file.css: -------------------------------------------------------------------------------- 1 | html,body,.layui-container,.layui-row,.layui-col-md12{ 2 | height: 100%; 3 | } 4 | .layui-container{ 5 | padding: 0; 6 | } 7 | .layui-card{ 8 | min-height: 100%; 9 | } 10 | .icon { 11 | width: 1.3em; 12 | height: 1.3em; 13 | vertical-align: -0.5em; 14 | fill: currentColor; 15 | overflow: hidden; 16 | margin-right: 5px; 17 | } 18 | #fileUpload { 19 | display: inline-block; 20 | height: 33px; 21 | line-height: 33px; 22 | padding: 0 18px; 23 | background-color: #627aad; 24 | color: #fff; 25 | white-space: nowrap; 26 | text-align: center; 27 | font-size: 14px; 28 | border: none; 29 | border-radius: 2px; 30 | cursor: pointer; 31 | } 32 | .file-list-header-ul{ 33 | display: table; 34 | width: 100%; 35 | line-height: 30px; 36 | border-bottom: 1px solid #eee; 37 | } 38 | .layui-card-body{ 39 | overflow: auto; 40 | } 41 | .file-list{ 42 | min-width: 950px; 43 | } 44 | .file-list-header-li{ 45 | display: table-cell; 46 | } 47 | .file-list-name{ 48 | width: 55%; 49 | } 50 | .file-list-size{ 51 | width: 15%; 52 | } 53 | .file-list-date{ 54 | width: 15%; 55 | } 56 | .file-list-handle{ 57 | width: 15%; 58 | } 59 | .file-list-file{ 60 | float: left; 61 | } 62 | .file-list-file-box{ 63 | border-bottom: 1px solid #eee; 64 | line-height: 50px; 65 | padding-left: 8px; 66 | } 67 | .file-list-file-box:hover{ 68 | background: #eeeeee; 69 | } 70 | .file-list-file-name{ 71 | width: 55%; 72 | } 73 | .file-list-file-size{ 74 | width: 15%; 75 | } 76 | .file-list-file-date{ 77 | width: 15%; 78 | } 79 | .file-list-file-handle{ 80 | width: 15%; 81 | } 82 | .path-side-btn{ 83 | cursor: pointer; 84 | } 85 | .clear{ clear:both} 86 | .file-details-box{ 87 | padding: 15px; 88 | } 89 | .file-details-box li{ 90 | line-height: 40px; 91 | font-size: 1.1em; 92 | border-bottom: 1px solid #f3f3f3; 93 | word-wrap: break-word; 94 | word-break: normal; 95 | } 96 | .file-details-box li span{ 97 | float: left; 98 | font-weight: 600; 99 | } -------------------------------------------------------------------------------- /static/css/home.css: -------------------------------------------------------------------------------- 1 | .page-view-totla { 2 | font-size: 36px; 3 | color: #666; 4 | line-height: 36px; 5 | padding: 5px 0 10px; 6 | overflow: hidden; 7 | text-overflow: ellipsis; 8 | word-break: break-all; 9 | white-space: nowrap; 10 | } 11 | .shortcut-button{ 12 | width: 100px; 13 | height: 80px; 14 | display: block; 15 | float: left; 16 | margin-left: 10px; 17 | margin-top: 10px; 18 | cursor: pointer; 19 | text-align: center; 20 | } 21 | .shortcut-button-icon{ 22 | display: block; 23 | height: 55px; 24 | text-align: center; 25 | line-height: 55px; 26 | background: #F8F8F8; 27 | } 28 | .shortcut-button:hover{ 29 | color: #2F4056; 30 | } 31 | .layui-layer-page .layui-layer-content{ 32 | overflow: initial!important; 33 | } -------------------------------------------------------------------------------- /static/css/install.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | margin: 0; 3 | min-height: 100%; 4 | line-height: 1.42857143; 5 | color: #58666e; 6 | font-size: 14px; 7 | -webkit-font-smoothing: antialiased; 8 | font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, 9 | Microsoft YaHei, Arial, sans-serif; 10 | background: #f1f1f1; 11 | height: 100%; 12 | } 13 | .layui-fluid{ 14 | padding: 0; 15 | } 16 | .install-title{ 17 | position: relative; 18 | height: 260px; 19 | line-height: 200px; 20 | color: #fff; 21 | border-radius: 2px 2px 0 0; 22 | background-color: #627aad; 23 | text-align: center; 24 | font-weight: bold; 25 | font-size: 18px; 26 | padding-right: 50px; 27 | padding-left: 56px; 28 | } 29 | #stepForm{ 30 | margin: 0 auto; 31 | width: 800px!important; 32 | height: 500px; 33 | background-color: white!important; 34 | padding-top: 50px; 35 | position: absolute; 36 | top: 130px; 37 | left: calc(50% - 400px); 38 | border-radius: 5px; 39 | box-shadow: 0 1px 2px 0 rgba(0,0,0,.1); 40 | } 41 | .layui-card-body{ 42 | padding-top: 40px; 43 | background: #ddd; 44 | } 45 | .layui-card { 46 | box-shadow: none; 47 | } -------------------------------------------------------------------------------- /static/css/login.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | margin: 0; 3 | min-height: 100%; 4 | line-height: 1.42857143; 5 | color: #58666e; 6 | font-size: 14px; 7 | -webkit-font-smoothing: antialiased; 8 | font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, 9 | Microsoft YaHei, Arial, sans-serif; 10 | background: #f1f1f1; 11 | height: 100%; 12 | } 13 | .full{ 14 | height: 100%; 15 | overflow: auto; 16 | width: 100%; 17 | } 18 | .login-top-box{ 19 | height: 50%; 20 | width: 100%; 21 | background: #627aad; 22 | } 23 | .login-box{ 24 | width: 350px; 25 | height: 216px; 26 | background: white; 27 | position: absolute; 28 | left: calc(50% - 175px); 29 | top: calc(50% - 108px); 30 | border-radius: 5px; 31 | box-shadow: 1px 1px 4px #b3b1b1; 32 | padding: 15px; 33 | } 34 | .layui-input-block{ 35 | margin: 0; 36 | } 37 | .login-title{ 38 | text-align: center; 39 | font-size: 22px; 40 | font-weight: 800; 41 | margin-bottom: 10px; 42 | } 43 | .login-btn{ 44 | width: 100%; 45 | background: #627aad; 46 | } -------------------------------------------------------------------------------- /static/css/style.css: -------------------------------------------------------------------------------- 1 | .layui-header{ 2 | left: 200px; 3 | border-bottom: 1px solid; 4 | height: 50px; 5 | position: relative; 6 | } 7 | .header-right{ 8 | right: 200px; 9 | } 10 | .layui-layout-admin .layui-side{ 11 | top: 0; 12 | } 13 | .layui-layout-admin .layui-side{ 14 | background: #333333; 15 | } 16 | .layui-layout-admin .layui-logo{ 17 | position: initial; 18 | height: 50px; 19 | border-bottom: 1px solid #23262e; 20 | color: white; 21 | font-size: 18px; 22 | line-height: 50px; 23 | font-weight: 600; 24 | background-color: #627aad; 25 | } 26 | .layui-layout-admin .layui-header { 27 | background-color: #627aad; 28 | border-color: #e8e8e8; 29 | } 30 | .layui-nav { 31 | background-color: #333333; 32 | } 33 | .layui-side-scroll{ 34 | height: calc(100% - 61px); 35 | } 36 | 37 | .layui-nav .layui-this:after, .layui-nav-bar, .layui-nav-tree .layui-nav-itemed:after{ 38 | height: 2px; 39 | background-color: #1b356b; 40 | display: none; 41 | } 42 | 43 | .layui-nav-tree .layui-nav-bar { 44 | width: 3px; 45 | background-color: #696767; 46 | } 47 | .layui-nav .layui-nav-item{ 48 | line-height: 50px; 49 | } 50 | .f-nav .layui-nav-item a:hover, .layui-nav .layui-this a{ 51 | color: white; 52 | } 53 | .f-nav .layui-nav-item a{ 54 | color: white; 55 | } 56 | .layui-layout-left{ 57 | left: 0; 58 | } 59 | .left-nav{ 60 | padding: 0; 61 | } 62 | .f-nav-content{ 63 | padding-left: 15px; 64 | } 65 | .layui-nav-tree .layui-nav-child a{ 66 | color: rgb(255 253 253 / 80%); 67 | } 68 | 69 | .layui-nav-tree .layui-nav-child a { 70 | padding: 0 30px; 71 | } 72 | 73 | .f-logo-img{ 74 | display: none; 75 | width: 100%!important; 76 | } 77 | 78 | .f-logo-img img{ 79 | width: 30px; 80 | height: 30px; 81 | margin-top: -10px; 82 | } 83 | .layui-header-expand{ 84 | width: calc(100% - 50px); 85 | } 86 | .layui-layer-content>.f-child-side>a{ 87 | color: #c1c1c1; 88 | } 89 | .layui-layer-content>.f-child-side>a:hover{ 90 | color: white; 91 | } 92 | .f-exit-full-btn-icon{ 93 | display: none; 94 | } 95 | .layui-layer-shade { 96 | opacity: 0.1!important; 97 | } 98 | .layui-nav .layui-nav-more{ 99 | border-width: 5px; 100 | } 101 | #theme-list{ 102 | display: none; 103 | } 104 | .theme-list .theme{ 105 | position: relative; 106 | width: 105px; 107 | background: #f2f2f2; 108 | float: left; 109 | margin: 5px; 110 | cursor: pointer; 111 | border: 1px solid #ddd; 112 | } 113 | .theme-list .theme-leftLogo{ 114 | width: 20px; 115 | height: 10px; 116 | background: red; 117 | } 118 | .theme-list .theme-leftSide{ 119 | width: 20px; 120 | height: 60px; 121 | background: #171616; 122 | } 123 | .theme-list .theme-header{ 124 | width: 85px; 125 | height: 10px; 126 | background: #330c0c; 127 | position: absolute; 128 | right: 0; 129 | top: 0; 130 | } 131 | .layui-layout-admin .layui-body { 132 | top: 50px; 133 | bottom:0; 134 | } 135 | .f-iframe-box{ 136 | height: 100%; 137 | overflow: auto; 138 | } 139 | 140 | .f-iframe-box::-webkit-scrollbar { 141 | width: 6px; 142 | height: 6px; 143 | } 144 | 145 | .f-iframe-box::-webkit-scrollbar-thumb { 146 | border-radius: 4px; 147 | background-color: #adabab; 148 | } 149 | 150 | .f-iframe-box::-webkit-scrollbar-track-piece { 151 | background: #e8e8e8; 152 | } 153 | /*#iframe{ 154 | min-height: 100%; 155 | }*/ 156 | 157 | .f-nav .layui-nav-item:before{ 158 | content: ' '; 159 | display: inline-block; 160 | border-bottom: 2px solid #666; 161 | width: 0; 162 | position: absolute; 163 | bottom: 0; 164 | left: 0; 165 | right: 0; 166 | margin: auto; 167 | transition: .4s all; 168 | } 169 | .f-nav .layui-nav-item:hover:before { 170 | width: 100%; 171 | } 172 | .f-nav-item a:before { 173 | content: ' '; 174 | display: block; 175 | height: 0; 176 | border-left: 3px solid #444; 177 | position: absolute; 178 | left: 0; 179 | top: 0; 180 | bottom: 0; 181 | margin: auto; 182 | transition: .4s all; 183 | } 184 | .f-nav-item a:hover:before{ 185 | height: 100%; 186 | } 187 | .layui-nav-tree .layui-nav-item a:hover { 188 | background-color: inherit; 189 | color: white; 190 | } 191 | .layui-nav-tree .f-nav-item{ 192 | padding: 4px 0; 193 | } 194 | .f-nav-item .layui-nav-child dd { 195 | position: relative; 196 | padding: 4px 0; 197 | } 198 | .layui-nav-tree .layui-nav-child dd.layui-this, .layui-nav-tree .layui-nav-child dd.layui-this a, .layui-nav-tree .layui-this, .layui-nav-tree .layui-this>a, .layui-nav-tree .layui-this>a:hover { 199 | background-color: initial; 200 | color:inherit; 201 | } 202 | .f-nav .layui-nav-child{ 203 | top: 50px; 204 | } 205 | .theme-list .theme:before { 206 | content: ''; 207 | position: absolute; 208 | width: 1px; 209 | height: 1px; 210 | border: 1px solid #009688; 211 | top: 0; 212 | bottom: 0; 213 | right: 0; 214 | left: 0; 215 | margin: auto; 216 | transition: .4s all; 217 | opacity: 0; 218 | } 219 | 220 | .theme-list .theme:hover:before { 221 | width: 111px; 222 | height: 80px; 223 | left: -3px; 224 | opacity: 1; 225 | -webkit-border-radius: 3px; 226 | -moz-border-radius: 3px; 227 | border-radius: 3px; 228 | } 229 | .layui-tab{ 230 | margin: 0; 231 | } 232 | .layui-tab-title .layui-this:after{ 233 | border: none; 234 | } 235 | .layui-tab-title li { 236 | line-height: 40px; 237 | min-width: 45px; 238 | padding: 0 10px; 239 | border-right: 1px solid #f6f6f6; 240 | } 241 | .layui-tab-title li:first-child .layui-tab-close{ 242 | display: none; 243 | } 244 | .layui-tab-title .layui-this { 245 | color: #000; 246 | background: #f3f3f3; 247 | } 248 | .layui-tab-title { 249 | border:none; 250 | box-shadow: 0 1px 2px 0 rgba(0,0,0,.1); 251 | } 252 | .layui-tab-content{ 253 | padding: 0; 254 | } 255 | .layui-tab-title li .layui-tab-close{ 256 | border-radius: 50%; 257 | } 258 | .layui-tab-title li .layui-tab-close:hover { 259 | border-radius: 50%; 260 | } 261 | .layui-tab-item { 262 | height: 100%; 263 | background: #f2f2f2; 264 | } 265 | .layui-tab-title li:hover { 266 | background: #f3f3f3; 267 | } 268 | .f-header{ 269 | left: 200px; 270 | position: relative; 271 | } 272 | .layui-nav-tree .layui-nav-child a{ 273 | padding-left: 50px; 274 | } 275 | .f-nav .layui-nav-item .header-right-down-item{ 276 | color: #333; 277 | } 278 | .f-nav .layui-nav-item .header-right-down-item:hover{ 279 | color: black; 280 | } 281 | .layui-nav-child{ 282 | box-shadow: none; 283 | } -------------------------------------------------------------------------------- /static/img/alipay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/img/alipay.jpg -------------------------------------------------------------------------------- /static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/img/favicon.ico -------------------------------------------------------------------------------- /static/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/img/logo.png -------------------------------------------------------------------------------- /static/img/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/img/user.png -------------------------------------------------------------------------------- /static/img/wechat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/img/wechat.jpg -------------------------------------------------------------------------------- /static/js/common.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | let common = function () { 3 | } 4 | common.prototype = { 5 | formatDate: function (time, format) { 6 | let t = new Date(time); 7 | let tf = function(i){return (i < 10 ? '0' : '') + i}; 8 | return format.replace(/yyyy|MM|dd|HH|mm|ss/g, function(a){ 9 | switch(a){ 10 | case 'yyyy': 11 | return tf(t.getFullYear()); 12 | case 'MM': 13 | return tf(t.getMonth() + 1); 14 | case 'mm': 15 | return tf(t.getMinutes()); 16 | case 'dd': 17 | return tf(t.getDate()); 18 | case 'HH': 19 | return tf(t.getHours()); 20 | case 'ss': 21 | return tf(t.getSeconds()); 22 | } 23 | }) 24 | } 25 | } 26 | window.common = new common(); 27 | })(window.jQuery); -------------------------------------------------------------------------------- /static/js/kit.js: -------------------------------------------------------------------------------- 1 | (function($){ 2 | var kit = function(){} 3 | kit.prototype = { 4 | getIconName: function(suffix) { 5 | var iconName; 6 | switch(suffix) { 7 | //图片 8 | case "jpg": 9 | iconName = "img";break; 10 | case "png": 11 | iconName = "img";break; 12 | case "jpeg": 13 | iconName = "img";break; 14 | case "gif": 15 | iconName = "img";break; 16 | case "psd": 17 | iconName = "img";break; 18 | //压缩包 19 | case "rar": 20 | iconName = "zip";break; 21 | case "zip": 22 | iconName = "zip";break; 23 | case "7z": 24 | iconName = "zip";break; 25 | case "tar": 26 | iconName = "zip";break; 27 | case "gz": 28 | iconName = "zip";break; 29 | //ppt 30 | case "ppt": 31 | iconName = "ppt";break; 32 | case "pptx": 33 | iconName = "ppt";break; 34 | //pdf 35 | case "pdf": 36 | iconName = "pdf";break; 37 | //word 38 | case "doc": 39 | iconName = "word";break; 40 | case "docx": 41 | iconName = "word";break; 42 | //excel 43 | case "xls": 44 | iconName = "excel";break; 45 | case "xlsx": 46 | iconName = "excel";break; 47 | //歌曲 48 | case "wave": 49 | iconName = "music";break; 50 | case "mp3": 51 | iconName = "music";break; 52 | case "mpeg-4": 53 | iconName = "music";break; 54 | case "aac": 55 | iconName = "music";break; 56 | case "mpeg": 57 | iconName = "music";break; 58 | //文本 59 | case "txt": 60 | iconName = "txt";break; 61 | //视频 62 | case "avi": 63 | iconName = "video";break; 64 | case "mp4": 65 | iconName = "video";break; 66 | case "3gp": 67 | iconName = "video";break; 68 | case "rmvb": 69 | iconName = "video";break; 70 | case "flv": 71 | iconName = "video";break; 72 | //exe 73 | case "exe": 74 | iconName = "exe";break; 75 | //脚本文件 76 | case "sh": 77 | iconName = "shell";break; 78 | case "bat": 79 | iconName = "shell";break; 80 | //java 81 | case "java": 82 | iconName = "java";break; 83 | //go 84 | case "go": 85 | iconName = "go";break; 86 | //css 87 | case "css": 88 | iconName = "css";break; 89 | //html 90 | case "html": 91 | iconName = "html";break; 92 | //js 93 | case "js": 94 | iconName = "js";break; 95 | //python 96 | case "py": 97 | iconName = "python";break; 98 | //其他 99 | default: 100 | iconName = "other";break; 101 | } 102 | return iconName; 103 | }, 104 | getFileType: function(suffix) { 105 | var fileType; 106 | if(suffix == "jpg" ||suffix == "png" ||suffix == "jpeg" ||suffix == "gif" ||suffix == "psd"){ 107 | fileType = "image"; 108 | }else if(suffix == "rar" ||suffix == "zip" ||suffix == "7z" ||suffix == "tar" ||suffix == "gz"){ 109 | fileType = "zip"; 110 | }else if(suffix == "ppt" ||suffix == "pptx"){ 111 | fileType = "ppt"; 112 | }else if(suffix == "doc" ||suffix == "docx"){ 113 | fileType = "word"; 114 | }else if(suffix == "xls" ||suffix == "xlsx"){ 115 | fileType = "excel"; 116 | }else if(suffix == "wave" ||suffix == "mp3" ||suffix == "mpeg-4" ||suffix == "aac" ||suffix == "mpeg"){ 117 | fileType = "song"; 118 | }else if(suffix == "txt"){ 119 | fileType = "txt"; 120 | }else if(suffix == "avi" ||suffix == "mp4" ||suffix == "3gp" ||suffix == "rmvb" ||suffix == "flv"){ 121 | fileType = "video"; 122 | }else{ 123 | fileType = "other"; 124 | } 125 | return fileType; 126 | } 127 | } 128 | window.kit = new kit(); 129 | })(window.jQuery); -------------------------------------------------------------------------------- /static/js/upload.js: -------------------------------------------------------------------------------- 1 | var xhrOnProgress = function (fun) { 2 | xhrOnProgress.onprogress = fun; //绑定监听 3 | //使用闭包实现监听绑 4 | return function () { 5 | //通过$.ajaxSettings.xhr();获得XMLHttpRequest对象 6 | var xhr = $.ajaxSettings.xhr(); 7 | //判断监听函数是否为函数 8 | if (typeof xhrOnProgress.onprogress !== 'function') 9 | return xhr; 10 | //如果有监听函数并且xhr对象支持绑定时就把监听函数绑定上去 11 | if (xhrOnProgress.onprogress && xhr.upload) { 12 | xhr.upload.onprogress = xhrOnProgress.onprogress; 13 | } 14 | return xhr; 15 | } 16 | } 17 | var count = 0; 18 | layui.use(['upload', 'element'], function () { 19 | var $ = layui.jquery, upload = layui.upload, element = layui.element; 20 | //多文件上传 21 | var demoListView = $('#moreFileList'), uploadListIns = upload.render({ 22 | elem: '#fileList', 23 | url: '/file/upload/fileUpload', 24 | accept: 'file', 25 | multiple: true, 26 | auto: false, 27 | bindAction: '#fileListAction', 28 | xhr: xhrOnProgress, 29 | progress: function (value, obj) { 30 | //上传进度回调 value进度值 31 | $("#moreFileList").find('.layui-progress ').each(function () { 32 | if ($(this).attr("file") === obj.name) { 33 | var progressBarName = $(this).attr("lay-filter"); 34 | var percent = ((value.loaded / value.total) * 100).toFixed(2); 35 | if (percent === 100.00) { 36 | percent = 100; 37 | } 38 | element.progress(progressBarName, percent + '%'); 39 | } 40 | }) 41 | 42 | }, 43 | choose: function (obj) { 44 | //将每次选择的文件追加到文件队列 45 | var files = this.files = obj.pushFile(); 46 | //读取本地文件 47 | demoListView.html(" "); 48 | for (var key in files) { 49 | count++; 50 | var tr = $(['', 51 | '' + files[key].name + '', 52 | '' + (files[key].size / 1014).toFixed(1) + 'kb', 53 | '等待上传', 54 | '' + 55 | '
' + 56 | '
' + 57 | '
' + 58 | '', 59 | '', 60 | '', 61 | '', 62 | '', 63 | ''].join('')); 64 | //单个重传 65 | tr.find('.more-file-reload').on('click', function () { 66 | obj.upload(key, files[key]); 67 | }); 68 | //删除 69 | tr.find('.more-file-delete').on('click', function () { 70 | delete files[key]; 71 | tr.remove(); 72 | uploadListIns.config.elem.next()[0].value = ''; 73 | }); 74 | demoListView.append(tr); 75 | element.render('progress'); 76 | } 77 | ; 78 | }, before: function (obj) { 79 | var scene = $("#scene").val(); 80 | var path = $("#path").val(); 81 | var showUrl = $("#showUrl").val(); 82 | this.data = {'scene': scene, 'path': path, 'showUrl': showUrl}; 83 | }, done: function (res, index, upload) { 84 | //上传成功 85 | if (res.Code === 200) { 86 | var tr = demoListView.find('tr#upload-' + index), tds = tr.children(); 87 | tds.eq(2).html('上传成功'); 88 | tds.eq(3).children(".layui-progress").children(".layui-progress-bar").attr("lay-percent", "100%"); 89 | //清空操作 90 | tds.eq(4).html(''); 91 | if (res.Data !== null) { 92 | tds.eq(4).html('查看链接'); 93 | } 94 | //删除文件队列已经上传成功的文件 95 | return delete this.files[index]; 96 | } else { 97 | var tr = demoListView.find('tr#upload-' + index), tds = tr.children(); 98 | tds.eq(2).html('上传失败'); 99 | //显示重传 100 | tds.eq(4).find('.more-file-reload').removeClass('layui-hide'); 101 | } 102 | this.error(index, upload); 103 | }, error: function (index, upload) { 104 | var tr = demoListView.find('tr#upload-' + index), tds = tr.children(); 105 | tds.eq(2).html('上传失败'); 106 | //显示重传 107 | tds.eq(4).find('.more-file-reload').removeClass('layui-hide'); 108 | } 109 | }); 110 | }) 111 | 112 | function showUrl(url) { 113 | layer.confirm('点击访问:
' + url + '', { 114 | btn: ['确定'], title: '查看链接' 115 | }, function (index, layero) { 116 | layer.close(index); 117 | }); 118 | } -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/HELP-US-OUT.txt: -------------------------------------------------------------------------------- 1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, 2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, 3 | comprehensive icon sets or copy and paste your own. 4 | 5 | Please. Check it out. 6 | 7 | -Dave Gandy 8 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/font-awesome-4.7.0/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/font-awesome-4.7.0/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/font-awesome-4.7.0/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | .sr-only() { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | .sr-only-focusable() { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | @mixin sr-only { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | @mixin sr-only-focusable { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /static/libs/font-awesome-4.7.0/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /static/libs/iconfont/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/iconfont/iconfont.eot -------------------------------------------------------------------------------- /static/libs/iconfont/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/iconfont/iconfont.ttf -------------------------------------------------------------------------------- /static/libs/iconfont/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/iconfont/iconfont.woff -------------------------------------------------------------------------------- /static/libs/iconfont/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/iconfont/iconfont.woff2 -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/css/modules/code.css: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.7 MIT License */ 2 | html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/css/modules/laydate/default/laydate.css: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.7 MIT License */ 2 | .laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:laydate-upbit;animation-name:laydate-upbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@-webkit-keyframes laydate-upbit{from{-webkit-transform:translate3d(0,20px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes laydate-upbit{from{transform:translate3d(0,20px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.laydate-set-ym span,.layui-laydate-header i{padding:0 5px;cursor:pointer}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;color:#999;font-size:18px}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;height:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px 20px}.layui-laydate-footer span{margin-right:15px;display:inline-block;cursor:pointer;font-size:12px}.layui-laydate-footer span:hover{color:#5FB878}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{height:26px;line-height:26px;margin:0 0 0 -1px;padding:0 10px;border:1px solid #C9C9C9;background-color:#fff;white-space:nowrap;vertical-align:top;border-radius:2px}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-0 .laydate-next-m,.layui-laydate-range .laydate-main-list-0 .laydate-next-y,.layui-laydate-range .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#00F7DE}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eaeaea;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px} -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/css/modules/layer/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/css/modules/layer/default/icon-ext.png -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/css/modules/layer/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/css/modules/layer/default/icon.png -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/css/modules/layer/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/css/modules/layer/default/loading-0.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/css/modules/layer/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/css/modules/layer/default/loading-1.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/css/modules/layer/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/css/modules/layer/default/loading-2.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/font/iconfont.eot -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/font/iconfont.ttf -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/font/iconfont.woff -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/font/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/font/iconfont.woff2 -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/0.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/1.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/10.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/11.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/12.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/12.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/13.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/13.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/14.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/14.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/15.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/15.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/16.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/17.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/17.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/18.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/18.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/19.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/19.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/2.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/20.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/20.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/21.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/21.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/22.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/22.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/23.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/23.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/24.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/24.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/25.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/25.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/26.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/26.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/27.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/27.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/28.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/28.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/29.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/29.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/3.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/30.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/30.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/31.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/31.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/32.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/32.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/33.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/33.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/34.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/34.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/35.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/35.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/36.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/36.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/37.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/37.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/38.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/38.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/39.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/39.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/4.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/40.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/40.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/41.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/41.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/42.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/42.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/43.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/43.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/44.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/44.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/45.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/45.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/46.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/46.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/47.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/47.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/48.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/48.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/49.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/49.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/5.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/50.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/50.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/51.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/51.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/52.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/52.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/53.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/53.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/54.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/54.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/55.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/55.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/56.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/56.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/57.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/57.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/58.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/58.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/59.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/59.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/6.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/60.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/60.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/61.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/61.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/62.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/62.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/63.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/63.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/64.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/65.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/65.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/66.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/66.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/67.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/67.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/68.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/68.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/69.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/69.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/7.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/70.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/70.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/71.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/71.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/8.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/images/face/9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/perfree/go-fastdfs-web-go/3c26887771e54e8a258b838e4f7bd284b9a09f9b/static/libs/layui-v2.5.6/layui/images/face/9.gif -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/lay/modules/carousel.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.7 MIT License */ 2 | ;layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
"].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
  1. '+o.replace(/[\r\t\n]+/g,"
  2. ")+"
"),c.find(">.layui-code-h3")[0]||c.prepend('

'+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/lay/modules/element.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.7 MIT License */ 2 | ;layui.define("jquery",function(t){"use strict";var a=layui.$,i=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(t){var i=this;return a.extend(!0,i.config,t),i},s.prototype.on=function(t,a){return layui.onevent.call(this,e,t,a)},s.prototype.tabAdd=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),r='
  • "+(i.title||"unnaming")+"
  • ";return s[0]?s.before(r):n.append(r),o.append('
    '+(i.content||"")+"
    "),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},b.on("click",t.headerElem,function(i){var e=a(this).index();f.tabClick.call(this,i,e,null,t)})},s.prototype.progress=function(t,i){var e="layui-progress",l=a("."+e+"[lay-filter="+t+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",i),s.text(i),this};var o=".layui-nav",r="layui-nav-item",c="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",y="layui-nav-more",h="layui-anim layui-anim-upbit",f={tabClick:function(t,i,s,o){o=o||{};var r=s||a(this),i=i||r.parent().children("li").index(r),c=o.headerElem?r.parent():r.parents(".layui-tab").eq(0),u=o.bodyElem?a(o.bodyElem):c.children(".layui-tab-content").children(".layui-tab-item"),d=r.find("a"),y=c.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(r.addClass(l).siblings().removeClass(l),u.eq(i).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+y+")",{elem:c,index:i})},tabDelete:function(t,i){var n=i||a(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),r=o.children(".layui-tab-content").children(".layui-tab-item"),c=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?f.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&f.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){f.tabAuto()},50),layui.event.call(this,e,"tabDelete("+c+")",{elem:o,index:s})},tabAuto:function(){var t="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),r=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),c=a('');if(n===window&&8!=i.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var t=a(this);if(!t.find("."+l)[0]){var i=a('');i.on("click",f.tabDelete),t.append(i)}}),"string"!=typeof s.attr("lay-unauto"))if(o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(c),s.attr("overflow",""),c.on("click",function(a){o[this.title?"removeClass":"addClass"](t),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(t){var i=a(".layui-tab-title");t!==!0&&"tabmore"===a(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=a(this),i=t.parents(o),n=i.attr("lay-filter"),s=t.parent(),c=t.siblings("."+d),y="string"==typeof s.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||y||c[0]||(i.find("."+l).removeClass(l),s.addClass(l)),i.hasClass(u)&&(c.removeClass(h),c[0]&&(s["none"===c.css("display")?"addClass":"removeClass"](r+"ed"),"all"===i.attr("lay-shrink")&&s.siblings().removeClass(r+"ed"))),layui.event.call(this,e,"nav("+n+")",t)},collapse:function(){var t=a(this),i=t.find(".layui-colla-icon"),l=t.siblings(".layui-colla-content"),s=t.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),r="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var c=s.children(".layui-colla-item").children("."+n);c.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"":""),layui.event.call(this,e,"collapse("+o+")",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){f.tabAuto.call({})},nav:function(){var t=200,e={},s={},p={},b=function(l,o,r){var c=a(this),f=c.find("."+d);o.hasClass(u)?l.css({top:c.position().top,height:c.children("a").outerHeight(),opacity:1}):(f.addClass(h),l.css({left:c.position().left+parseFloat(c.css("marginLeft")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:c.width(),opacity:1})},i.ie&&i.ie<10?0:t),clearTimeout(p[r]),"block"===f.css("display")&&clearTimeout(s[r]),s[r]=setTimeout(function(){f.addClass(n),c.find("."+y).addClass(y+"d")},300))};a(o+l).each(function(i){var l=a(this),o=a(''),h=l.find("."+r);l.find("."+c)[0]||(l.append(o),h.on("mouseenter",function(){b.call(this,o,l,i)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[i]),s[i]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+y).removeClass(y+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[i]),p[i]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),h.find("a").each(function(){var t=a(this),i=(t.parent(),t.siblings("."+d));i[0]&&!t.children("."+y)[0]&&t.append(''),t.off("click",f.clickThis).on("click",f.clickThis)})})},breadcrumb:function(){var t=".layui-breadcrumb";a(t+l).each(function(){var t=a(this),i="lay-separator",e=t.attr(i)||"/",l=t.find("a");l.next("span["+i+"]")[0]||(l.each(function(t){t!==l.length-1&&a(this).after(""+e+"")}),t.css("visibility","visible"))})},progress:function(){var t="layui-progress";a("."+t+l).each(function(){var i=a(this),e=i.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),i.attr("lay-showPercent")&&setTimeout(function(){e.html(''+l+"")},350)})},collapse:function(){var t="layui-collapse";a("."+t+l).each(function(){var t=a(this).find(".layui-colla-item");t.each(function(){var t=a(this),i=t.find(".layui-colla-title"),e=t.find(".layui-colla-content"),l="none"===e.css("display");i.find(".layui-colla-icon").remove(),i.append(''+(l?"":"")+""),i.off("click",f.collapse).on("click",f.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,a){a()})},s.prototype.render=s.prototype.init;var p=new s,b=a(document);p.render();var v=".layui-tab-title li";b.on("click",v,f.tabClick),b.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),t(e,p)}); -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/lay/modules/flow.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.7 MIT License */ 2 | ;layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('
    '+d+"
    ");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),!i&&f.width()&&(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)}); -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/lay/modules/laypage.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.7 MIT License */ 2 | ;layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
    ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
    "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)}); -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/lay/modules/laytpl.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.7 MIT License */ 2 | ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)}); -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/lay/modules/rate.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.7 MIT License */ 2 | ;layui.define("jquery",function(e){"use strict";var a=layui.jquery,l={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var l=this;return l.config=a.extend({},l.config,e),l},on:function(e,a){return layui.onevent.call(this,n,e,a)}},i=function(){var e=this,a=e.config;return{setvalue:function(a){e.setvalue.call(e,a)},config:a}},n="rate",t="layui-rate",o="layui-icon-rate",u="layui-icon-rate-solid",s="layui-icon-rate-half",r="layui-icon-rate-solid layui-icon-rate-half",c="layui-icon-rate-solid layui-icon-rate",f="layui-icon-rate layui-icon-rate-half",v=function(e){var i=this;i.index=++l.index,i.config=a.extend({},i.config,l.config,e),i.render()};v.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},v.prototype.render=function(){var e=this,l=e.config,i=l.theme?'style="color: '+l.theme+';"':"";l.elem=a(l.elem),l.value>l.length&&(l.value=l.length),parseInt(l.value)!==l.value&&(l.half||(l.value=Math.ceil(l.value)-l.value<.5?Math.ceil(l.value):Math.floor(l.value)));for(var n='
      ",s=1;s<=l.length;s++){var r='
    • ";l.half&&parseInt(l.value)!==l.value&&s==Math.ceil(l.value)?n=n+'
    • ":n+=r}n+="
    "+(l.text?''+l.value+"星":"")+"";var c=l.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),l.span=e.elemTemp.next("span"),l.setText&&l.setText(l.value),c.html(e.elemTemp),c.addClass("layui-inline"),l.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,l=a.config;l.value=e,a.render()},v.prototype.action=function(){var e=this,l=e.config,i=e.elemTemp,n=i.find("i").width();i.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(l.value=t,l.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(l.value=l.value-.5)}l.text&&i.next("span").text(l.value+"星"),l.choose&&l.choose(l.value),l.setText&&l.setText(l.value)}),v.on("mousemove",function(e){if(i.find("i").each(function(){a(this).addClass(o).removeClass(r)}),i.find("i:lt("+t+")").each(function(){a(this).addClass(u).removeClass(f)}),l.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(s).removeClass(u)}}),v.on("mouseleave",function(){i.find("i").each(function(){a(this).addClass(o).removeClass(r)}),i.find("i:lt("+Math.floor(l.value)+")").each(function(){a(this).addClass(u).removeClass(f)}),l.half&&parseInt(l.value)!==l.value&&i.children("li:eq("+Math.floor(l.value)+")").children("i").addClass(s).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},l.render=function(e){var a=new v(e);return i.call(a)},e(n,l)}); -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/lay/modules/slider.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.7 MIT License */ 2 | ;layui.define("jquery",function(e){"use strict";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(t,a){return i.value=t,e.slide("set",t,a||0)},config:i}},n="slider",l="layui-disabled",s="layui-slider",r="layui-slider-bar",o="layui-slider-wrap",u="layui-slider-wrap-btn",d="layui-slider-tips",v="layui-slider-input",c="layui-slider-input-txt",p="layui-slider-input-btn",m="layui-slider-hover",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.maxt.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),p=v-r+"%";r+="%",v+="%"}else{"object"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.valuet.max&&(t.value=t.max);var p=Math.floor((t.value-t.min)/(t.max-t.min)*100)+"%"}var m=t.disabled?"#c2c2c2":t.theme,f='
    '+(t.tips?'
    ':"")+'
    '+(t.range?'
    ':"")+"
    ",h=i(t.elem),y=h.next("."+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find("."+o).eq(0).data("value",t.value[0]),e.elemTemp.find("."+o).eq(1).data("value",t.value[1])):e.elemTemp.find("."+o).data("value",t.value),h.html(e.elemTemp),"vertical"===t.type&&e.elemTemp.height(t.height+"px"),t.showstep){for(var g=(t.max-t.min)/t.step,b="",x=1;x')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('
    ');h.css("position","relative"),h.append(w),h.find("."+c).children("input").val(t.value),"vertical"===t.type?w.css({left:0,top:-48}):e.elemTemp.css("margin-right",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find("."+u).addClass(l)):e.slide(),e.elemTemp.find("."+u).on("mouseover",function(){var a="vertical"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find("."+o),l="vertical"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data("value"),u=t.setTips?t.setTips(r):r;e.elemTemp.find("."+d).html(u),"vertical"===t.type?e.elemTemp.find("."+d).css({bottom:s+"%","margin-bottom":"20px",display:"inline-block"}):e.elemTemp.find("."+d).css({left:s+"%",display:"inline-block"})}).on("mouseout",function(){e.elemTemp.find("."+d).css("display","none")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return"vertical"===l.type?l.height:s[0].offsetWidth},h=s.find("."+o),y=s.next("."+v),g=y.children("."+c).children("input").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css("vertical"===l.type?"bottom":"left",e+"%");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;"vertical"===l.type?(s.find("."+d).css({bottom:e+"%","margin-bottom":"20px"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find("."+d).css("left",e+"%"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);"vertical"===l.type?s.find("."+r).css({height:o+"%",bottom:n+"%"}):s.find("."+r).css({width:o+"%",left:n+"%"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children("."+c).children("input").val(g),h.eq(i).data("value",u),s.find("."+d).html(l.setTips?l.setTips(u):u),l.range){var v=[h.eq(0).data("value"),h.eq(1).data("value")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['
    f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(m),s.find("."+d).show(),i.preventDefault()},o=function(){t.removeClass(m),s.find("."+d).hide()};M(r,o)})}),s.on("click",function(e){var t=i("."+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n="vertical"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?"vertical"===l.type?Math.abs(n-parseInt(i(h[0]).css("bottom")))>Math.abs(n-parseInt(i(h[1]).css("bottom")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.children("."+p).children("i").each(function(e){i(this).on("click",function(){g=y.children("."+c).children("input").val(),g=1==e?g-l.stepl.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=el.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children("."+c).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on("change",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)}); -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/lay/modules/transfer.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.7 MIT License */ 2 | ;layui.define(["laytpl","form"],function(e){"use strict";var a=layui.$,t=layui.laytpl,n=layui.form,i="transfer",l={config:{},index:layui[i]?layui[i].index+1e4:0,set:function(e){var t=this;return t.config=a.extend({},t.config,e),t},on:function(e,a){return layui.onevent.call(this,i,e,a)}},r=function(){var e=this,a=e.config,t=a.id||e.index;return r.that[t]=e,r.config[t]=a,{config:a,reload:function(a){e.reload.call(e,a)},getData:function(){return e.getData.call(e)}}},c="layui-hide",o="layui-btn-disabled",d="layui-none",s="layui-transfer-box",u="layui-transfer-header",h="layui-transfer-search",f="layui-transfer-active",y="layui-transfer-data",p=function(e){return e=e||{},['
    ','
    ','","
    ","{{# if(d.data.showSearch){ }}",'","{{# } }}",'
      ',"
      "].join("")},v=['
      ',p({index:0,checkAllName:"layTransferLeftCheckAll"}),'
      ','",'","
      ",p({index:1,checkAllName:"layTransferRightCheckAll"}),"
      "].join(""),x=function(e){var t=this;t.index=++l.index,t.config=a.extend({},t.config,l.config,e),t.render()};x.prototype.config={title:["列表一","列表二"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"无数据",searchNone:"无匹配数据"}},x.prototype.reload=function(e){var t=this;layui.each(e,function(e,a){a.constructor===Array&&delete t.config[e]}),t.config=a.extend(!0,{},t.config,e),t.render()},x.prototype.render=function(){var e=this,n=e.config,i=e.elem=a(t(v).render({data:n,index:e.index})),l=n.elem=a(n.elem);l[0]&&(n.data=n.data||[],n.value=n.value||[],e.key=n.id||e.index,l.html(e.elem),e.layBox=e.elem.find("."+s),e.layHeader=e.elem.find("."+u),e.laySearch=e.elem.find("."+h),e.layData=i.find("."+y),e.layBtn=i.find("."+f+" .layui-btn"),e.layBox.css({width:n.width,height:n.height}),e.layData.css({height:function(){return n.height-e.layHeader.outerHeight()-e.laySearch.outerHeight()-2}()}),e.renderData(),e.events())},x.prototype.renderData=function(){var e=this,a=(e.config,[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,n=["
    • ",'',"
    • "].join("");a[t].views.push(n),delete e.selected}),e.layData.eq(0).html(a[0].views.join("")),e.layData.eq(1).html(a[1].views.join("")),e.renderCheckBtn()},x.prototype.renderForm=function(e){n.render(e,"LAY-transfer-"+this.index)},x.prototype.renderCheckBtn=function(e){var t=this,n=t.config;e=e||{},t.layBox.each(function(i){var l=a(this),r=l.find("."+y),d=l.find("."+u).find('input[type="checkbox"]'),s=r.find('input[type="checkbox"]'),h=0,f=!1;if(s.each(function(){var e=a(this).data("hide");(this.checked||this.disabled||e)&&h++,this.checked&&!e&&(f=!0)}),d.prop("checked",f&&h===s.length),t.layBtn.eq(i)[f?"removeClass":"addClass"](o),!e.stopNone){var p=r.children("li:not(."+c+")").length;t.noneView(r,p?"":n.text.none)}}),t.renderForm("checkbox")},x.prototype.noneView=function(e,t){var n=a('

      '+(t||"")+"

      ");e.find("."+d)[0]&&e.find("."+d).remove(),t.replace(/\s/g,"")&&e.append(n)},x.prototype.setValue=function(){var e=this,t=e.config,n=[];return e.layBox.eq(1).find("."+y+' input[type="checkbox"]').each(function(){var e=a(this).data("hide");e||n.push(this.value)}),t.value=n,e},x.prototype.parseData=function(e){var t=this,n=t.config,i=[];return layui.each(n.data,function(t,l){l=("function"==typeof n.parseData?n.parseData(l):l)||l,i.push(l=a.extend({},l)),layui.each(n.value,function(e,a){a==l.value&&(l.selected=!0)}),e&&e(l)}),n.data=i,t},x.prototype.getData=function(e){var a=this,t=a.config,n=[];return a.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&n.push(t)})}),n},x.prototype.events=function(){var e=this,t=e.config;e.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var t=a(this).prev(),n=t[0].checked,i=t.parents("."+s).eq(0).find("."+y);t[0].disabled||("all"===t.attr("lay-type")&&i.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=n)}),e.renderCheckBtn({stopNone:!0}))}),e.layBtn.on("click",function(){var n=a(this),i=n.data("index"),l=e.layBox.eq(i),r=[];if(!n.hasClass(o)){e.layBox.eq(i).each(function(t){var n=a(this),i=n.find("."+y);i.children("li").each(function(){var t=a(this),n=t.find('input[type="checkbox"]'),i=n.data("hide");n[0].checked&&!i&&(n[0].checked=!1,l.siblings("."+s).find("."+y).append(t.clone()),t.remove(),r.push(n[0].value)),e.setValue()})}),e.renderCheckBtn();var c=l.siblings("."+s).find("."+h+" input");""===c.val()||c.trigger("keyup"),t.onchange&&t.onchange(e.getData(r),i)}}),e.laySearch.find("input").on("keyup",function(){var n=this.value,i=a(this).parents("."+h).eq(0).siblings("."+y),l=i.children("li");l.each(function(){var e=a(this),t=e.find('input[type="checkbox"]'),i=t[0].title.indexOf(n)!==-1;e[i?"removeClass":"addClass"](c),t.data("hide",!i)}),e.renderCheckBtn();var r=l.length===i.children("li."+c).length;e.noneView(i,r?t.text.searchNone:"")})},r.that={},r.config={},l.reload=function(e,a){var t=r.that[e];return t.reload(a),r.call(t)},l.getData=function(e){var a=r.that[e];return a.getData()},l.render=function(e){var a=new x(e);return r.call(a)},e(i,l)}); -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/lay/modules/util.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.7 MIT License */ 2 | ;layui.define("jquery",function(e){"use strict";var t=layui.$,i={fixbar:function(e){var i,n,a="layui-fixbar",o="layui-fixbar-top",r=t(document),l=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"":e.bar1,e.bar2=e.bar2===!0?"":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,""],u=t(['
        ',e.bar1?'
      • '+c[0]+"
      • ":"",e.bar2?'
      • '+c[1]+"
      • ":"",'
      • '+c[2]+"
      • ","
      "].join("")),g=u.find("."+o),s=function(){var t=r.scrollTop();t>=e.showHeight?i||(g.show(),i=1):i&&(g.hide(),i=0)};t("."+a)[0]||("object"==typeof e.css&&u.css(e.css),l.append(u),s(),u.find("li").on("click",function(){var i=t(this),n=i.attr("lay-type");"top"===n&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,n)}),r.on("scroll",function(){clearTimeout(n),n=setTimeout(function(){s()},100)}))},countdown:function(e,t,i){var n=this,a="function"==typeof t,o=new Date(e).getTime(),r=new Date(!t||a?(new Date).getTime():t).getTime(),l=o-r,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=t);var u=setTimeout(function(){n.countdown(e,r+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],t,u),l<=0&&clearTimeout(u),u},timeAgo:function(e,t){var i=this,n=[[],[]],a=(new Date).getTime()-new Date(e).getTime();return a>26784e5?(a=new Date(e),n[0][0]=i.digit(a.getFullYear(),4),n[0][1]=i.digit(a.getMonth()+1),n[0][2]=i.digit(a.getDate()),t||(n[1][0]=i.digit(a.getHours()),n[1][1]=i.digit(a.getMinutes()),n[1][2]=i.digit(a.getSeconds())),n[0].join("-")+" "+n[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=18e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var n=e.length;n/g,">").replace(/'/g,"'").replace(/"/g,""")},event:function(e,n,a){var o=t("body");return a=a||"click",n=i.event[e]=t.extend(!0,i.event[e],n)||{},i.event.UTIL_EVENT_CALLBACK=i.event.UTIL_EVENT_CALLBACK||{},o.off(a,"*["+e+"]",i.event.UTIL_EVENT_CALLBACK[e]),i.event.UTIL_EVENT_CALLBACK[e]=function(){var i=t(this),a=i.attr(e);"function"==typeof n[a]&&n[a].call(this,i)},o.on(a,"*["+e+"]",i.event.UTIL_EVENT_CALLBACK[e]),n}};!function(e,t,i){"$:nomunge";function n(){a=t[l](function(){o.each(function(){var t=e(this),i=t.width(),n=t.height(),a=e.data(this,u);(i!==a.w||n!==a.h)&&t.trigger(c,[a.w=i,a.h=n])}),n()},r[g])}var a,o=e([]),r=e.resize=e.extend(e.resize,{}),l="setTimeout",c="resize",u=c+"-special-event",g="delay",s="throttleWindow";r[g]=250,r[s]=!0,e.event.special[c]={setup:function(){if(!r[s]&&this[l])return!1;var t=e(this);o=o.add(t),e.data(this,u,{w:t.width(),h:t.height()}),1===o.length&&n()},teardown:function(){if(!r[s]&&this[l])return!1;var t=e(this);o=o.not(t),t.removeData(u),o.length||clearTimeout(a)},add:function(t){function n(t,n,o){var r=e(this),l=e.data(this,u)||{};l.w=n!==i?n:r.width(),l.h=o!==i?o:r.height(),a.apply(this,arguments)}if(!r[s]&&this[l])return!1;var a;return e.isFunction(t)?(a=t,n):(a=t.handler,void(t.handler=n))}}}(t,window),e("util",i)}); -------------------------------------------------------------------------------- /static/libs/layui-v2.5.6/layui/layui.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.7 MIT License */ 2 | ;!function(e){"use strict";var t=document,n={modules:{},status:{},timeout:10,event:{}},o=function(){this.v="2.5.7"},r=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,n=t.scripts,o=n.length-1,r=o;r>0;r--)if("interactive"===n[r].readyState){e=n[r].src;break}return e||n[o].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),a=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},i="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",transfer:"modules/transfer",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",colorpicker:"modules/colorpicker",slider:"modules/slider",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};o.prototype.cache=n,o.prototype.define=function(e,t){var o=this,r="function"==typeof e,a=function(){var e=function(e,t){layui[e]=t,n.status[e]=!0};return"function"==typeof t&&t(function(o,r){e(o,r),n.callback[o]=function(){t(e)}}),this};return r&&(t=e,e=[]),!layui["layui.all"]&&layui["layui.mobile"]?a.call(o):(o.use(e,a),o)},o.prototype.use=function(e,o,l){function c(e,t){var o="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||o.test((e.currentTarget||e.srcElement).readyState))&&(n.modules[d]=t,y.removeChild(h),function r(){return++m>1e3*n.timeout/4?a(d+" is not a valid module"):void(n.status[d]?s():setTimeout(r,4))}())}function s(){l.push(layui[d]),e.length>1?p.use(e.slice(1),o,l):"function"==typeof o&&o.apply(layui,l)}var p=this,f=n.dir=n.dir?n.dir:r,y=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(p.each(e,function(t,n){"jquery"===n&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var d=e[0],m=0;if(l=l||[],n.host=n.host||(f.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[d]||!layui["layui.all"]&&layui["layui.mobile"]&&u[d])return s(),p;var v=(u[d]?f+"lay/":/^\{\/\}/.test(p.modules[d])?"":n.base||"")+(p.modules[d]||d)+".js";if(v=v.replace(/^\{\/\}/,""),!n.modules[d]&&layui[d]&&(n.modules[d]=v),n.modules[d])!function g(){return++m>1e3*n.timeout/4?a(d+" is not a valid module"):void("string"==typeof n.modules[d]&&n.status[d]?s():setTimeout(g,4))}();else{var h=t.createElement("script");h.async=!0,h.charset="utf-8",h.src=v+function(){var e=n.version===!0?n.v||(new Date).getTime():n.version||"";return e?"?v="+e:""}(),y.appendChild(h),!h.attachEvent||h.attachEvent.toString&&h.attachEvent.toString().indexOf("[native code")<0||i?h.addEventListener("load",function(e){c(e,v)},!1):h.attachEvent("onreadystatechange",function(e){c(e,v)}),n.modules[d]=v}return p},o.prototype.getStyle=function(t,n){var o=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return o[o.getPropertyValue?"getPropertyValue":"getAttribute"](n)},o.prototype.link=function(e,o,r){var i=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof o&&(r=o);var c=(r||e).replace(/\.|\//g,""),s=u.id="layuicss-"+c,p=0;return u.rel="stylesheet",u.href=e+(n.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(s)||l.appendChild(u),"function"!=typeof o?i:(function f(){return++p>1e3*n.timeout/100?a(e+" timeout"):void(1989===parseInt(i.getStyle(t.getElementById(s),"width"))?function(){o()}():setTimeout(f,100))}(),i)},n.callback={},o.prototype.factory=function(e){if(layui[e])return"function"==typeof n.callback[e]?n.callback[e]:null},o.prototype.addcss=function(e,t,o){return layui.link(n.dir+"css/"+e,t,o)},o.prototype.img=function(e,t,n){var o=new Image;return o.src=e,o.complete?t(o):(o.onload=function(){o.onload=null,"function"==typeof t&&t(o)},void(o.onerror=function(e){o.onerror=null,"function"==typeof n&&n(e)}))},o.prototype.config=function(e){e=e||{};for(var t in e)n[t]=e[t];return this},o.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),o.prototype.extend=function(e){var t=this;e=e||{};for(var n in e)t[n]||t.modules[n]?a("模块名 "+n+" 已被占用"):t.modules[n]=e[n];return t},o.prototype.router=function(e){var t=this,e=e||location.hash,n={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,""),n.href="/"+e,e=e.replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),n.search[t[0]]=t[1]}():n.path.push(t)}),n):n},o.prototype.url=function(e){var t=this,n={pathname:function(){var t=e?function(){var t=(e.match(/\.[^.]+?\/.+/)||[])[0]||"";return t.replace(/^[^\/]+/,"").replace(/\?.+/,"")}():location.pathname;return t.replace(/^\//,"").split("/")}(),search:function(){var n={},o=(e?function(){var t=(e.match(/\?.+/)||[])[0]||"";return t.replace(/\#.+/,"")}():location.search).replace(/^\?+/,"").split("&");return t.each(o,function(e,t){var o=t.indexOf("="),r=function(){return o<0?t.substr(0,t.length):0!==o&&t.substr(0,o)}();r&&(n[r]=o>0?t.substr(o+1):null)}),n}(),hash:t.router(function(){return e?(e.match(/#.+/)||[])[0]||"":location.hash}())};return n},o.prototype.data=function(t,n,o){if(t=t||"layui",o=o||localStorage,e.JSON&&e.JSON.parse){if(null===n)return delete o[t];n="object"==typeof n?n:{key:n};try{var r=JSON.parse(o[t])}catch(a){var r={}}return"value"in n&&(r[n.key]=n.value),n.remove&&delete r[n.key],o[t]=JSON.stringify(r),n.key?r[n.key]:r}},o.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},o.prototype.device=function(t){var n=navigator.userAgent.toLowerCase(),o=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(n.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(n)?"windows":/linux/.test(n)?"linux":/iphone|ipod|ipad|ios/.test(n)?"ios":/mac/.test(n)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((n.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:o("micromessenger")};return t&&!r[t]&&(r[t]=o(t)),r.android=/android/.test(n),r.ios="ios"===r.os,r.mobile=!(!r.android&&!r.ios),r},o.prototype.hint=function(){return{error:a}},o.prototype.each=function(e,t){var n,o=this;if("function"!=typeof t)return o;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;na?1:r * { 91 | background-color: transparent; 92 | } -------------------------------------------------------------------------------- /static/libs/step-lay/step.js: -------------------------------------------------------------------------------- 1 | layui.define(['layer', 'carousel'], function (exports) { 2 | var $ = layui.jquery; 3 | var layer = layui.layer; 4 | var carousel = layui.carousel; 5 | 6 | // 添加步骤条dom节点 7 | var renderDom = function (elem, stepItems, postion) { 8 | var stepDiv = '
      '; 9 | for (var i = 0; i < stepItems.length; i++) { 10 | stepDiv += '
      '; 11 | // 线 12 | if (i < (stepItems.length - 1)) { 13 | if (i < postion) { 14 | stepDiv += '
      '; 15 | } else { 16 | stepDiv += '
      '; 17 | } 18 | } 19 | 20 | // 数字 21 | var number = stepItems[i].number; 22 | if (!number) { 23 | number = i + 1; 24 | } 25 | if (i == postion) { 26 | stepDiv += '
      ' + number + '
      '; 27 | } else if (i < postion) { 28 | stepDiv += '
      '; 29 | } else { 30 | stepDiv += '
      ' + number + '
      '; 31 | } 32 | 33 | // 标题和描述 34 | var title = stepItems[i].title; 35 | var desc = stepItems[i].desc; 36 | if (title || desc) { 37 | stepDiv += '
      '; 38 | if (title) { 39 | stepDiv += '
      ' + title + '
      '; 40 | } 41 | if (desc) { 42 | stepDiv += '
      ' + desc + '
      '; 43 | } 44 | stepDiv += '
      '; 45 | } 46 | stepDiv += '
      '; 47 | } 48 | stepDiv += '
      '; 49 | 50 | $(elem).prepend(stepDiv); 51 | 52 | // 计算每一个条目的宽度 53 | var bfb = 100 / stepItems.length; 54 | $('.step-item').css('width', bfb + '%'); 55 | }; 56 | 57 | var step = { 58 | // 渲染步骤条 59 | render: function (param) { 60 | param.indicator = 'none'; // 不显示指示器 61 | param.arrow = 'always'; // 始终显示箭头 62 | param.autoplay = false; // 关闭自动播放 63 | if (!param.stepWidth) { 64 | param.stepWidth = '400px'; 65 | } 66 | 67 | // 渲染轮播图 68 | carousel.render(param); 69 | 70 | // 渲染步骤条 71 | var stepItems = param.stepItems; 72 | renderDom(param.elem, stepItems, 0); 73 | $('.lay-step').css('width', param.stepWidth); 74 | 75 | //监听轮播切换事件 76 | carousel.on('change(' + param.filter + ')', function (obj) { 77 | $(param.elem).find('.lay-step').remove(); 78 | renderDom(param.elem, stepItems, obj.index); 79 | $('.lay-step').css('width', param.stepWidth); 80 | }); 81 | 82 | // 隐藏左右箭头按钮 83 | $(param.elem).find('.layui-carousel-arrow').css('display', 'none'); 84 | 85 | // 去掉轮播图的背景颜色 86 | $(param.elem).css('background-color', 'transparent'); 87 | }, 88 | // 下一步 89 | next: function (elem) { 90 | $(elem).find('.layui-carousel-arrow[lay-type=add]').trigger('click'); 91 | }, 92 | // 上一步 93 | pre: function (elem) { 94 | $(elem).find('.layui-carousel-arrow[lay-type=sub]').trigger('click'); 95 | } 96 | }; 97 | exports('step', step); 98 | }); 99 | -------------------------------------------------------------------------------- /static/libs/template-web/template-web.js: -------------------------------------------------------------------------------- 1 | !function(){function a(a){return a.replace(t,"").replace(u,",").replace(v,"").replace(w,"").replace(x,"").split(/^$|,+/)}function b(a){return"'"+a.replace(/('|\\)/g,"\\$1").replace(/\r/g,"\\r").replace(/\n/g,"\\n")+"'"}function c(c,d){function e(a){return m+=a.split(/\n/).length-1,k&&(a=a.replace(/[\n\r\t\s]+/g," ").replace(//g,"")),a&&(a=s[1]+b(a)+s[2]+"\n"),a}function f(b){var c=m;if(j?b=j(b,d):g&&(b=b.replace(/\n/g,function(){return m++,"$line="+m+";"})),0===b.indexOf("=")){var e=l&&!/^=[=#]/.test(b);if(b=b.replace(/^=[=#]?|[\s;]*$/g,""),e){var f=b.replace(/\s*\([^\)]+\)/,"");n[f]||/^(include|print)$/.test(f)||(b="$escape("+b+")")}else b="$string("+b+")";b=s[1]+b+s[2]}return g&&(b="$line="+c+";"+b),r(a(b),function(a){if(a&&!p[a]){var b;b="print"===a?u:"include"===a?v:n[a]?"$utils."+a:o[a]?"$helpers."+a:"$data."+a,w+=a+"="+b+",",p[a]=!0}}),b+"\n"}var g=d.debug,h=d.openTag,i=d.closeTag,j=d.parser,k=d.compress,l=d.escape,m=1,p={$data:1,$filename:1,$utils:1,$helpers:1,$out:1,$line:1},q="".trim,s=q?["$out='';","$out+=",";","$out"]:["$out=[];","$out.push(",");","$out.join('')"],t=q?"$out+=text;return $out;":"$out.push(text);",u="function(){var text=''.concat.apply('',arguments);"+t+"}",v="function(filename,data){data=data||$data;var text=$utils.$include(filename,data,$filename);"+t+"}",w="'use strict';var $utils=this,$helpers=$utils.$helpers,"+(g?"$line=0,":""),x=s[0],y="return new String("+s[3]+");";r(c.split(h),function(a){a=a.split(i);var b=a[0],c=a[1];1===a.length?x+=e(b):(x+=f(b),c&&(x+=e(c)))});var z=w+x+y;g&&(z="try{"+z+"}catch(e){throw {filename:$filename,name:'Render Error',message:e.message,line:$line,source:"+b(c)+".split(/\\n/)[$line-1].replace(/^[\\s\\t]+/,'')};}");try{var A=new Function("$data","$filename",z);return A.prototype=n,A}catch(B){throw B.temp="function anonymous($data,$filename) {"+z+"}",B}}var d=function(a,b){return"string"==typeof b?q(b,{filename:a}):g(a,b)};d.version="3.0.0",d.config=function(a,b){e[a]=b};var e=d.defaults={openTag:"<%",closeTag:"%>",escape:!0,cache:!0,compress:!1,parser:null},f=d.cache={};d.render=function(a,b){return q(a,b)};var g=d.renderFile=function(a,b){var c=d.get(a)||p({filename:a,name:"Render Error",message:"Template not found"});return b?c(b):c};d.get=function(a){var b;if(f[a])b=f[a];else if("object"==typeof document){var c=document.getElementById(a);if(c){var d=(c.value||c.innerHTML).replace(/^\s*|\s*$/g,"");b=q(d,{filename:a})}}return b};var h=function(a,b){return"string"!=typeof a&&(b=typeof a,"number"===b?a+="":a="function"===b?h(a.call(a)):""),a},i={"<":"<",">":">",'"':""","'":"'","&":"&"},j=function(a){return i[a]},k=function(a){return h(a).replace(/&(?![\w#]+;)|[<>"']/g,j)},l=Array.isArray||function(a){return"[object Array]"==={}.toString.call(a)},m=function(a,b){var c,d;if(l(a))for(c=0,d=a.length;d>c;c++)b.call(a,a[c],c,a);else for(c in a)b.call(a,a[c],c)},n=d.utils={$helpers:{},$include:g,$string:h,$escape:k,$each:m};d.helper=function(a,b){o[a]=b};var o=d.helpers=n.$helpers;d.onerror=function(a){var b="Template Error\n\n";for(var c in a)b+="<"+c+">\n"+a[c]+"\n\n";"object"==typeof console&&console.error(b)};var p=function(a){return d.onerror(a),function(){return"{Template Error}"}},q=d.compile=function(a,b){function d(c){try{return new i(c,h)+""}catch(d){return b.debug?p(d)():(b.debug=!0,q(a,b)(c))}}b=b||{};for(var g in e)void 0===b[g]&&(b[g]=e[g]);var h=b.filename;try{var i=c(a,b)}catch(j){return j.filename=h||"anonymous",j.name="Syntax Error",p(j)}return d.prototype=i.prototype,d.toString=function(){return i.toString()},h&&b.cache&&(f[h]=d),d},r=n.$each,s="break,case,catch,continue,debugger,default,delete,do,else,false,finally,for,function,if,in,instanceof,new,null,return,switch,this,throw,true,try,typeof,var,void,while,with,abstract,boolean,byte,char,class,const,double,enum,export,extends,final,float,goto,implements,import,int,interface,long,native,package,private,protected,public,short,static,super,synchronized,throws,transient,volatile,arguments,let,yield,undefined",t=/\/\*[\w\W]*?\*\/|\/\/[^\n]*\n|\/\/[^\n]*$|"(?:[^"\\]|\\[\w\W])*"|'(?:[^'\\]|\\[\w\W])*'|[\s\t\n]*\.[\s\t\n]*[$\w\.]+/g,u=/[^\w$]+/g,v=new RegExp(["\\b"+s.replace(/,/g,"\\b|\\b")+"\\b"].join("|"),"g"),w=/^\d[^,]*|,\d[^,]*/g,x=/^,+|,+$/g;e.openTag="{{",e.closeTag="}}";var y=function(a,b){var c=b.split(":"),d=c.shift(),e=c.join(":")||"";return e&&(e=", "+e),"$helpers."+d+"("+a+e+")"};e.parser=function(a,b){a=a.replace(/^\s/,"");var c=a.split(" "),e=c.shift(),f=c.join(" ");switch(e){case"if":a="if("+f+"){";break;case"else":c="if"===c.shift()?" if("+c.join(" ")+")":"",a="}else"+c+"{";break;case"/if":a="}";break;case"each":var g=c[0]||"$data",h=c[1]||"as",i=c[2]||"$value",j=c[3]||"$index",k=i+","+j;"as"!==h&&(g="[]"),a="$each("+g+",function("+k+"){";break;case"/each":a="});";break;case"echo":a="print("+f+");";break;case"print":case"include":a=e+"("+c.join(",")+");";break;default:if(-1!==f.indexOf("|")){var l=b.escape;0===a.indexOf("#")&&(a=a.substr(1),l=!1);for(var m=0,n=a.split("|"),o=n.length,p=l?"$escape":"$string",q=p+"("+n[m++]+")";o>m;m++)q=y(q,n[m]);a="=#"+q}else a=d.helpers[e]?"=#"+e+"("+c.join(",")+");":"="+a}return a},"function"==typeof define?define(function(){return d}):"undefined"!=typeof exports?module.exports=d:this.template=d}(); 2 | -------------------------------------------------------------------------------- /template/file/file.tpl: -------------------------------------------------------------------------------- 1 | {{define "file/file.tpl"}} 2 | 3 | 4 | 5 | 6 | 文件列表 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
      15 |
      16 |
      17 |
      18 |
      19 | 22 |
      23 |
      24 |
      25 | 26 | 27 | 28 |
      29 |
      30 |
      31 |
      32 |
        33 |
      • 文件名
      • 34 |
      • 大小
      • 35 |
      • 创建日期
      • 36 |
      • 操作
      • 37 |
      38 |
      39 |
      40 | 41 |
      42 |
      43 |
      44 |
      45 |
      46 |
      47 |
      48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | {{end}} -------------------------------------------------------------------------------- /template/file/upload.tpl: -------------------------------------------------------------------------------- 1 | {{define "file/upload.tpl"}} 2 | 3 | 4 | 5 | 6 | 控制台 7 | 8 | 9 | 10 | 25 | 26 | 27 |
      28 |
      29 |
      30 | 31 |
      32 |
      上传配置
      33 |
      34 |
      35 | 36 |
      37 | 38 |
      39 |
      40 |
      41 | 42 |
      43 | 44 |
      45 |
      46 |
      47 | 48 |
      49 | 50 |
      51 |
      52 |
      53 |
      54 |
      55 |
      56 |
      57 |
      58 |
      59 | 60 | 61 |
      62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 |
      文件名大小状态上传进度操作
      75 |
      76 |
      77 |
      78 |
      79 |
      80 |
      81 |
      82 | 83 | 84 | 85 | 86 | 87 | {{end}} -------------------------------------------------------------------------------- /template/home/home.tpl: -------------------------------------------------------------------------------- 1 | {{define "home/home.tpl"}} 2 | 3 | 4 | 5 | 6 | 控制台 7 | 8 | 9 | 10 | 11 | 12 | 13 |
      14 |
      15 |
      16 |
      文件总数
      17 |
      18 |

      19 |
      20 |
      21 |
      22 |
      23 |
      24 |
      文件总大小
      25 |
      26 |

      27 |
      28 |
      29 |
      30 |
      31 |
      32 |
      文件总数(30天)
      33 |
      34 |

      35 |
      36 |
      37 |
      38 |
      39 |
      40 |
      文件大小(30天)
      41 |
      42 |

      43 |
      44 |
      45 |
      46 | 47 |
      48 |
      49 |
      磁盘总空间
      50 |
      51 |

      52 |
      53 |
      54 |
      55 |
      56 |
      57 |
      磁盘剩余空间
      58 |
      59 |

      60 |
      61 |
      62 |
      63 |
      64 |
      65 |
      索引节点总数(Linux)
      66 |
      67 |

      68 |
      69 |
      70 |
      71 |
      72 |
      73 |
      剩余索引节点(Linux)
      74 |
      75 |

      76 |
      77 |
      78 |
      79 | 80 | 81 | 82 | 117 |
      118 |
      119 |
      版本信息
      120 |
      121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 |
      当前版本{{.version}}   更新日志
      发布日期{{.versionDate}}
      操作系统{{.osName}}
      系统架构{{.osArch}}
      145 |
      146 |
      147 |
      148 |
      149 |
      150 |
      151 |
      152 |
      153 |
      154 |
      155 |
      156 | 157 | 158 | 159 | 160 | 161 | 162 | {{end}} -------------------------------------------------------------------------------- /template/index/index.tpl: -------------------------------------------------------------------------------- 1 | {{define "index/index.tpl"}} 2 | 3 | 4 | 5 | 6 | Go-FastDfs管理 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
      18 | {{template "layout/header.tpl"}} 19 | {{template "layout/sider.tpl"}} 20 | 21 |
      22 |
      23 |
        24 |
      • 25 |
      26 |
      27 |
      28 | 29 | 32 |
      33 |
      34 |
      35 |
      36 | 37 |
      38 | 39 | 40 | 41 | 42 | 43 | {{end}} -------------------------------------------------------------------------------- /template/layout/header.tpl: -------------------------------------------------------------------------------- 1 | {{define "layout/header.tpl"}} 2 |
      3 | 24 | 25 | 44 |
      45 | {{end}} -------------------------------------------------------------------------------- /template/layout/sider.tpl: -------------------------------------------------------------------------------- 1 | {{define "layout/sider.tpl"}} 2 |
      3 | 6 | 9 |
      10 | 11 | 77 |
      78 |
      79 | {{end}} -------------------------------------------------------------------------------- /template/login/login.tpl: -------------------------------------------------------------------------------- 1 | {{define "login/login.tpl"}} 2 | 3 | 4 | 5 | 6 | 7 | Go-FastDfs管理-登录 8 | 9 | 10 | 11 | 15 | 16 | 17 |
      18 | 19 | 39 |
      40 | 41 | 42 | 43 | 62 | 63 | 64 | {{end}} -------------------------------------------------------------------------------- /template/peers/add.tpl: -------------------------------------------------------------------------------- 1 | {{define "peers/add.tpl"}} 2 | 3 | 4 | 5 | 6 | 添加集群 7 | 8 | 9 | 10 | 11 |
      12 |
      13 |
      14 | 15 |
      16 | 17 |
      18 |
      19 |
      20 | 21 |
      22 | 23 |
      24 |
      如未在GoFastDfs开启按组管理,请不要填写
      25 |
      26 |
      27 | 28 |
      29 | 30 |
      31 |
      32 |
      33 | 34 |
      35 | 36 |
      37 |
      38 |
      39 |
      40 | 41 | 42 |
      43 |
      44 |
      45 |
      46 | 47 | 48 | 68 | 69 | 70 | {{end}} -------------------------------------------------------------------------------- /template/peers/edit.tpl: -------------------------------------------------------------------------------- 1 | {{define "peers/edit.tpl"}} 2 | 3 | 4 | 5 | 6 | 添加集群 7 | 8 | 9 | 10 | 11 | 12 |
      13 |
      14 |
      15 | 16 |
      17 | 18 |
      19 |
      20 |
      21 | 22 |
      23 | 24 |
      25 |
      如未在GoFastDfs开启按组管理,请不要填写
      26 |
      27 |
      28 | 29 |
      30 | 31 | 32 |
      33 |
      34 |
      35 | 36 |
      37 | 38 |
      39 |
      40 |
      41 |
      42 | 43 | 44 |
      45 |
      46 |
      47 |
      48 | 49 | 50 | 70 | 71 | 72 | {{end}} -------------------------------------------------------------------------------- /template/peers/list.tpl: -------------------------------------------------------------------------------- 1 | {{define "peers/list.tpl"}} 2 | 3 | 4 | 5 | 6 | 控制台 7 | 8 | 9 | 10 | 18 | 19 | 20 |
      21 |
      22 |
      23 |
      24 |
      25 |
      26 |
      27 |
      28 |
      29 |
      30 |
      31 | 36 | 40 | 41 | 42 | 115 | 116 | 117 | {{end}} -------------------------------------------------------------------------------- /template/settings/user.tpl: -------------------------------------------------------------------------------- 1 | {{define "settings/user.tpl"}} 2 | 3 | 4 | 5 | 6 | 个人资料 7 | 8 | 9 | 10 | 25 | 26 | 27 |
      28 |
      29 |
      30 |
      31 |
      个人资料
      32 |
      33 |
      34 | 35 |
      36 | 37 |
      38 | 39 |
      40 |
      不可修改。用于登入名
      41 |
      42 |
      43 | 44 |
      45 | 46 |
      47 |
      16位字符以内
      48 |
      49 |
      50 | 51 |
      52 | 53 |
      54 |
      55 |
      56 | 57 |
      58 | 59 |
      60 |
      6-16位,不可包含特殊字符
      61 |
      62 |
      63 | 64 |
      65 | 66 |
      67 |
      6-16位,不可包含特殊字符
      68 |
      69 |
      70 |
      71 | 72 | 73 |
      74 |
      75 |
      76 |
      77 |
      78 |
      79 |
      80 |
      81 | 82 | 83 | 101 | 102 | 103 | {{end}} --------------------------------------------------------------------------------