├── .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 | '' +
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(['',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
"].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('- '+o.replace(/[\r\t\n]+/g,"
- ")+"
"),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('");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=['"].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 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
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 |
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 |
22 |
30 |
38 |
46 |
47 |
55 |
63 |
71 |
79 |
80 |
81 |
82 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 | 当前版本 |
129 | {{.version}} 更新日志 |
130 |
131 |
132 | 发布日期 |
133 | {{.versionDate}} |
134 |
135 |
136 | 操作系统 |
137 | {{.osName}} |
138 |
139 |
140 | 系统架构 |
141 | {{.osArch}} |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
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 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 | {{end}}
--------------------------------------------------------------------------------
/template/layout/header.tpl:
--------------------------------------------------------------------------------
1 | {{define "layout/header.tpl"}}
2 |
45 | {{end}}
--------------------------------------------------------------------------------
/template/layout/sider.tpl:
--------------------------------------------------------------------------------
1 | {{define "layout/sider.tpl"}}
2 |
3 |
4 | Go-FastDfs 管理
5 |
6 |
7 |

8 |
9 |
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 |
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 |
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 |
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 |
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 |
81 |
82 |
83 |
101 |
102 |
103 | {{end}}
--------------------------------------------------------------------------------