diff --git a/go.mod b/go.mod index 19e0b60..bb6f8d5 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,6 @@ require ( github.com/labstack/gommon v0.3.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pkg/sftp v1.12.0 - github.com/shirou/gopsutil v3.20.10+incompatible github.com/spf13/viper v1.7.1 golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a gorm.io/driver/mysql v1.0.1 diff --git a/main.go b/main.go index 9911adb..6171f1a 100644 --- a/main.go +++ b/main.go @@ -11,6 +11,7 @@ import ( "next-terminal/pkg/handle" "next-terminal/pkg/model" "next-terminal/pkg/utils" + "strconv" "time" ) @@ -34,9 +35,7 @@ func Run() error { return err } - users := model.FindAllUser() - - if len(users) == 0 { + if len(model.FindAllUser()) == 0 { var pass []byte if pass, err = utils.Encoder.Encode([]byte("admin")); err != nil { @@ -71,6 +70,18 @@ func Run() error { return err } + if err := config.DB.AutoMigrate(&model.Num{}); err != nil { + return err + } + + if len(model.FindAllTemp()) == 0 { + for i := 0; i <= 30; i++ { + if err := model.CreateNewTemp(&model.Num{I: strconv.Itoa(i)}); err != nil { + return err + } + } + } + config.Cache = cache.New(5*time.Minute, 10*time.Minute) config.Store = config.NewStore() e := api.SetupRoutes() diff --git a/pkg/api/overview.go b/pkg/api/overview.go index e885def..4a44751 100644 --- a/pkg/api/overview.go +++ b/pkg/api/overview.go @@ -1,41 +1,10 @@ package api import ( - "next-terminal/pkg/model" - "fmt" "github.com/labstack/echo/v4" - "github.com/shirou/gopsutil/cpu" - "github.com/shirou/gopsutil/load" - "github.com/shirou/gopsutil/mem" - "time" + "next-terminal/pkg/model" ) -type OverviewStatus struct { - Load Load `json:"load"` - Memory Memory `json:"memory"` - CPU CPU `json:"cpu"` -} - -type Load struct { - Load1 float64 `json:"load1"` - Load5 float64 `json:"load5"` - Load15 float64 `json:"load15"` -} - -type Memory struct { - Total uint64 `json:"total"` - Available uint64 `json:"available"` - UsedPercent float64 `json:"usedPercent"` - Used uint64 `json:"used"` -} - -type CPU struct { - PhysicalCount int `json:"physicalCount"` - LogicalCount int `json:"logicalCount"` - Percent float64 `json:"percent"` - ModelName string `json:"modelName"` -} - type Counter struct { User int64 `json:"user"` Asset int64 `json:"asset"` @@ -43,44 +12,6 @@ type Counter struct { OnlineSession int64 `json:"onlineSession"` } -func OverviewStatusEndPoint(c echo.Context) error { - info, _ := load.Avg() - memory, _ := mem.VirtualMemory() - infoStats, _ := cpu.Info() - physicalCount, _ := cpu.Counts(false) - logicalCount, _ := cpu.Counts(true) - cps, _ := cpu.Percent(time.Second, false) - - fmt.Printf("%+v\n", info) - fmt.Printf("%+v\n", memory) - fmt.Printf("%+v\n", infoStats) - fmt.Printf("%+v\n", physicalCount) - fmt.Printf("%+v\n", logicalCount) - fmt.Printf("%+v\n", cps) - - overviewStatus := OverviewStatus{ - Load: Load{ - Load1: info.Load1, - Load5: info.Load5, - Load15: info.Load15, - }, - Memory: Memory{ - Total: memory.Total, - Available: memory.Available, - UsedPercent: memory.UsedPercent, - Used: memory.Used, - }, - CPU: CPU{ - PhysicalCount: physicalCount, - LogicalCount: logicalCount, - Percent: cps[0], - ModelName: infoStats[0].ModelName, - }, - } - - return Success(c, overviewStatus) -} - func OverviewCounterEndPoint(c echo.Context) error { countUser, _ := model.CountUser() countOnlineSession, _ := model.CountOnlineSession() @@ -96,3 +27,17 @@ func OverviewCounterEndPoint(c echo.Context) error { return Success(c, counter) } + +func OverviewSessionPoint(c echo.Context) (err error) { + d := c.QueryParam("d") + var results []model.D + if d == "m" { + results, err = model.CountSessionByDay(30) + } else { + results, err = model.CountSessionByDay(7) + } + if err != nil { + return err + } + return Success(c, results) +} diff --git a/pkg/api/property.go b/pkg/api/property.go index 38a662d..264d817 100644 --- a/pkg/api/property.go +++ b/pkg/api/property.go @@ -1,13 +1,13 @@ package api import ( - "next-terminal/pkg/model" "fmt" "github.com/labstack/echo/v4" + "next-terminal/pkg/model" ) func PropertyGetEndpoint(c echo.Context) error { - properties := model.FindAllProperties() + properties := model.FindAllTemp() return Success(c, properties) } diff --git a/pkg/api/routes.go b/pkg/api/routes.go index 7e830db..bef0e52 100644 --- a/pkg/api/routes.go +++ b/pkg/api/routes.go @@ -97,8 +97,8 @@ func SetupRoutes() *echo.Echo { e.GET("/properties", PropertyGetEndpoint) e.PUT("/properties", PropertyUpdateEndpoint) - e.GET("/overview/status", OverviewStatusEndPoint) e.GET("/overview/counter", OverviewCounterEndPoint) + e.GET("/overview/sessions", OverviewSessionPoint) return e } diff --git a/pkg/api/test/ps.go b/pkg/api/test/ps.go deleted file mode 100644 index f9ae4ab..0000000 --- a/pkg/api/test/ps.go +++ /dev/null @@ -1,33 +0,0 @@ -package main - -func main() { - //v, _ := mem.VirtualMemory() - //c, _ := cpu.Info() - //cc, _ := cpu.Percent(time.Second, false) - //d, _ := disk.Usage("/") - //n, _ := host.Info() - //nv, _ := net.IOCounters(true) - //boottime, _ := host.BootTime() - //btime := time.Unix(int64(boottime), 0).Format("2006-01-02 15:04:05") - // - //fmt.Printf(" Mem : %v MB Free: %v MB Used:%v Usage:%f%%\n", v.Total/1024/1024, v.Available/1024/1024, v.Used/1024/1024, v.UsedPercent) - //if len(c) > 1 { - // for _, sub_cpu := range c { - // modelname := sub_cpu.ModelName - // cores := sub_cpu.Cores - // fmt.Printf(" CPU : %v %v cores \n", modelname, cores) - // } - //} else { - // sub_cpu := c[0] - // modelname := sub_cpu.ModelName - // cores := sub_cpu.Cores - // fmt.Printf(" CPU : %v %v cores \n", modelname, cores) - // - //} - //fmt.Printf(" Network: %v bytes / %v bytes\n", nv[0].BytesRecv, nv[0].BytesSent) - //fmt.Printf(" SystemBoot:%v\n", btime) - //fmt.Printf(" CPU Used : used %f%% \n", cc[0]) - //fmt.Printf(" HD : %v GB Free: %v GB Usage:%f%%\n", d.Total/1024/1024/1024, d.Free/1024/1024/1024, d.UsedPercent) - //fmt.Printf(" OS : %v(%v) %v \n", n.Platform, n.PlatformFamily, n.PlatformVersion) - //fmt.Printf(" Hostname : %v \n", n.Hostname) -} diff --git a/pkg/model/num.go b/pkg/model/num.go new file mode 100644 index 0000000..8f983c8 --- /dev/null +++ b/pkg/model/num.go @@ -0,0 +1,25 @@ +package model + +import ( + "next-terminal/pkg/config" +) + +type Num struct { + I string `gorm:"primary_key" json:"i"` +} + +func (r *Num) TableName() string { + return "nums" +} + +func FindAllTemp() (o []Num) { + if config.DB.Find(&o).Error != nil { + return nil + } + return +} + +func CreateNewTemp(o *Num) (err error) { + err = config.DB.Create(o).Error + return +} diff --git a/pkg/model/session.go b/pkg/model/session.go index 63e19f7..fdcaadd 100644 --- a/pkg/model/session.go +++ b/pkg/model/session.go @@ -3,6 +3,7 @@ package model import ( "next-terminal/pkg/config" "next-terminal/pkg/utils" + "time" ) const ( @@ -136,3 +137,31 @@ func CountOnlineSession() (total int64, err error) { err = config.DB.Where("status = ?", Connected).Find(&Session{}).Count(&total).Error return } + +type D struct { + Day string `json:"day"` + Count int `json:"count"` + Protocol string `json:"protocol"` +} + +func CountSessionByDay(day int) (results []D, err error) { + + today := time.Now().Format("20060102") + sql := "select t1.`day`, count(t2.id) as count\nfrom (\n SELECT @date := DATE_ADD(@date, INTERVAL - 1 DAY) day\n FROM (SELECT @date := DATE_ADD('" + today + "', INTERVAL + 1 DAY) FROM nums) as t0\n LIMIT ?\n )\n as t1\n left join\n (\n select DATE(s.connected_time) as day, s.id\n from sessions as s\n WHERE protocol = ? and DATE(connected_time) <= '" + today + "'\n AND DATE(connected_time) > DATE_SUB('" + today + "', INTERVAL ? DAY)\n ) as t2 on t1.day = t2.day\ngroup by t1.day" + + protocols := []string{"rdp", "ssh", "vnc", "telnet"} + + for i := range protocols { + var result []D + err = config.DB.Raw(sql, day, protocols[i], day).Scan(&result).Error + if err != nil { + return nil, err + } + for j := range result { + result[j].Protocol = protocols[i] + } + results = append(results, result...) + } + + return +} diff --git a/web/package-lock.json b/web/package-lock.json index 6768a5a..745e97a 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -4,6 +4,18 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@ant-design/charts": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@ant-design/charts/-/charts-1.0.13.tgz", + "integrity": "sha512-QAkwgr5/Zf1mPqKJNammog0EIFTfaOBMRVHHADLM8n8mdGiCm6k00+9KTsPquMyX9Mg5KaMPYq+6uqlTnqHflQ==", + "dev": true, + "requires": { + "@antv/g2plot": "^2.2.11", + "@antv/g6": "^3.6.0", + "@antv/util": "^2.0.9", + "react-content-loader": "^5.0.4" + } + }, "@ant-design/colors": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-5.0.0.tgz", @@ -35,87 +47,6 @@ "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz", "integrity": "sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ==" }, - "@ant-design/pro-field": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ant-design/pro-field/-/pro-field-1.1.2.tgz", - "integrity": "sha512-2OI92nT8ETUG1GHDNUWId5pm2rJoqmmlYlsxLUQtoFJREkDFy52Dfs96A+pOHrZ//EuHtmYNP1YkJMdyh0nXFw==", - "requires": { - "@ant-design/icons": "^4.2.1", - "@ant-design/pro-provider": "1.2.1", - "@ant-design/pro-utils": "1.2.0", - "classnames": "^2.2.6", - "lodash.tonumber": "^4.0.3", - "moment": "^2.27.0", - "rc-util": "^5.4.0", - "swr": "^0.3.6" - } - }, - "@ant-design/pro-form": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@ant-design/pro-form/-/pro-form-1.6.2.tgz", - "integrity": "sha512-B+f5CXhJ4CgWfMx/YWFRXrXTE2/2bHmj8QppwwxrQBxc9CX9ksHiwPgOhc/wZv2Pn9pxdrPwpobdZps/yDkJeQ==", - "requires": { - "@ant-design/icons": "^4.2.1", - "@ant-design/pro-field": "1.1.2", - "@ant-design/pro-provider": "1.2.1", - "@ant-design/pro-utils": "1.2.0", - "classnames": "^2.2.6", - "omit.js": "^2.0.2", - "rc-resize-observer": "^0.2.3", - "use-media-antd-query": "^1.0.3" - }, - "dependencies": { - "use-media-antd-query": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/use-media-antd-query/-/use-media-antd-query-1.0.3.tgz", - "integrity": "sha512-r8UnYLYYKwQIEIkWQQYs/ohJ0pqNGel9nbWHj5VBCtXtixT0ozj+X9PBlskv2HEOPfBLfnJrazpLgIyziXCU8A==", - "requires": { - "react-responsive": "^8.0.1" - } - } - } - }, - "@ant-design/pro-provider": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@ant-design/pro-provider/-/pro-provider-1.2.1.tgz", - "integrity": "sha512-k2kT7zb1QhzJQvCuhfKXUwJJV6KsvyNtxbguDA3zoiK57EEAMRyxuiLMeNk6ejeY/Kak3l9yx2YiANuRRzU6Vg==", - "requires": { - "rc-util": "^5.0.1" - } - }, - "@ant-design/pro-table": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/@ant-design/pro-table/-/pro-table-2.11.4.tgz", - "integrity": "sha512-xGIIcflu5CMllBFRsO2MjXRPEIgd7K7oE0whFiFTAMHU/R9WJfpXPsyZp77fOqqcBJv/2R+s97S6mQyFULGNEQ==", - "requires": { - "@ant-design/icons": "^4.1.0", - "@ant-design/pro-field": "1.1.2", - "@ant-design/pro-form": "1.6.2", - "@ant-design/pro-provider": "1.2.1", - "@ant-design/pro-utils": "1.2.0", - "classnames": "^2.2.6", - "dnd-core": "^10.0.2", - "moment": "^2.24.0", - "omit.js": "^2.0.2", - "rc-resize-observer": "^0.2.1", - "rc-util": "^5.0.1", - "react-dnd": "^11.1.3", - "react-dnd-html5-backend": "^11.1.3", - "unstated-next": "^1.1.0", - "use-json-comparison": "^1.0.5", - "use-media-antd-query": "1.0.2" - } - }, - "@ant-design/pro-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ant-design/pro-utils/-/pro-utils-1.2.0.tgz", - "integrity": "sha512-k5Mo1Ma8cTB2aMSXI6VA5YwNO4BxGmUIugUrQJVRcu3OupTle1bYJf7tePUpPyN++Oe5AbSHwXl+c0CtfF01hA==", - "requires": { - "@ant-design/pro-provider": "1.2.1", - "fast-deep-equal": "^3.1.3", - "rc-util": "^5.0.6" - } - }, "@ant-design/react-slick": { "version": "0.27.14", "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.27.14.tgz", @@ -128,6 +59,358 @@ "resize-observer-polyfill": "^1.5.0" } }, + "@antv/adjust": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@antv/adjust/-/adjust-0.2.3.tgz", + "integrity": "sha512-rihqcCdS7piQnK1nRlCvbIaj2QeaqghxINXiMpTJp+0c9cKlTUwL7/2r+gv9YN5R0P1WzSHTmK2Sn+bQCJDo0Q==", + "dev": true, + "requires": { + "@antv/util": "~2.0.0", + "tslib": "^1.10.0" + } + }, + "@antv/attr": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@antv/attr/-/attr-0.3.2.tgz", + "integrity": "sha512-31PfcVKeQdPBmr/QD+IC0NB/FbdtVKOXBCNMepFc5/dEs7jphmgG1V4tfAJmcXIHubCTHOjpscTrDIvoKSGvMQ==", + "dev": true, + "requires": { + "@antv/color-util": "^2.0.1", + "@antv/util": "~2.0.0", + "tslib": "^1.10.0" + } + }, + "@antv/color-util": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@antv/color-util/-/color-util-2.0.6.tgz", + "integrity": "sha512-KnPEaAH+XNJMjax9U35W67nzPI+QQ2x27pYlzmSIWrbj4/k8PGrARXfzDTjwoozHJY8qG62Z+Ww6Alhu2FctXQ==", + "dev": true, + "requires": { + "@antv/util": "^2.0.9", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "@antv/component": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/@antv/component/-/component-0.8.6.tgz", + "integrity": "sha512-/6hvHj8CzVyfHij3oYgzxQswXpGoZDT1whOJUd+KNKTn/detVj7tFUmPODEeM4akA/b9JZ+gBErQfUihZFjalQ==", + "dev": true, + "requires": { + "@antv/dom-util": "~2.0.1", + "@antv/g-base": "~0.5.0", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.7", + "@antv/scale": "~0.3.1", + "@antv/util": "~2.0.0", + "fecha": "~4.2.0", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "@antv/coord": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@antv/coord/-/coord-0.3.0.tgz", + "integrity": "sha512-lm5Ct+r62mFVqhziKoDFN3PQjnkNBMOoOG+kBsPq3M3GqlQt5Jc7euOHMFcYSZM9HJmsKkGcih6EWDVVliMEZg==", + "dev": true, + "requires": { + "@antv/matrix-util": "^3.1.0-beta.2", + "@antv/util": "~2.0.3", + "tslib": "^1.10.0" + } + }, + "@antv/dom-util": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@antv/dom-util/-/dom-util-2.0.3.tgz", + "integrity": "sha512-dUHsUT4U9X1T1/Y9bH3jRMe0MzvWJk2jSQm1vm3w9NX+Ra0ftq5VUBiGTNbthm3nFwG0fFFjip904rYjl50g4A==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "@antv/event-emitter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@antv/event-emitter/-/event-emitter-0.1.2.tgz", + "integrity": "sha512-6C6NJOdoNVptCr5y9BVOhKkCgW7LFs/SpcRyAExUeSjAm0zJqcqNkSIRGsXYhj4PJI+CZICHzGwwiSnIsE68Ug==", + "dev": true + }, + "@antv/g-base": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@antv/g-base/-/g-base-0.5.4.tgz", + "integrity": "sha512-cbx8F8pcUM4S1/Q/aptIMfUI22d1HASGCDCAc0OrnDqXoQVV3i8jhYKHOSOY04J50flDLKdYS94MgK7HnpKWyA==", + "dev": true, + "requires": { + "@antv/event-emitter": "^0.1.1", + "@antv/g-math": "^0.1.6", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.5", + "@antv/util": "~2.0.0", + "@types/d3-timer": "^1.0.9", + "d3-ease": "^1.0.5", + "d3-interpolate": "^1.3.2", + "d3-timer": "^1.0.9", + "detect-browser": "^5.1.0", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "@antv/g-canvas": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@antv/g-canvas/-/g-canvas-0.5.6.tgz", + "integrity": "sha512-r6f6KqYuNZWunf2Vnf1ACopn8aic6TBFhaN3XuckenhQNqR+/PI/4Mft7z14zo7WH58X2Xs2Npq9awJXBEUzaw==", + "dev": true, + "requires": { + "@antv/g-base": "^0.5.3", + "@antv/g-math": "^0.1.6", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "~2.0.5", + "@antv/util": "~2.0.0", + "gl-matrix": "^3.0.0", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "@antv/g-math": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@antv/g-math/-/g-math-0.1.7.tgz", + "integrity": "sha512-xGyXaloD1ynfp7gS4VuV+MjSptZIwHvLHr8ekXJSFAeWPYLu84yOW2wOZHDdp1bzDAIuRv6xDBW58YGHrWsFcA==", + "dev": true, + "requires": { + "@antv/util": "~2.0.0", + "gl-matrix": "^3.0.0" + } + }, + "@antv/g-svg": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@antv/g-svg/-/g-svg-0.5.6.tgz", + "integrity": "sha512-Xve1EUGk4HMbl2nq4ozR4QLh6GyoZ8Xw/+9kHYI4B5P2lIUQU95MuRsaLFfW5NNpZDx85ZeH97tqEmC9L96E7A==", + "dev": true, + "requires": { + "@antv/g-base": "^0.5.3", + "@antv/g-math": "^0.1.6", + "@antv/util": "~2.0.0", + "detect-browser": "^5.0.0", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "@antv/g2": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@antv/g2/-/g2-4.1.4.tgz", + "integrity": "sha512-oMeEv4oE0OAoN+2fL0ikoVgT27zgfpi6w/PW1F8I9CzwxbtbGNpeVlJhXeuVvUqaupU7Nylfo/gSgehiVptFFA==", + "dev": true, + "requires": { + "@antv/adjust": "^0.2.1", + "@antv/attr": "^0.3.1", + "@antv/color-util": "^2.0.2", + "@antv/component": "^0.8.0", + "@antv/coord": "^0.3.0", + "@antv/dom-util": "^2.0.2", + "@antv/event-emitter": "~0.1.0", + "@antv/g-base": "^0.5.0", + "@antv/g-canvas": "^0.5.0", + "@antv/g-svg": "^0.5.0", + "@antv/matrix-util": "^3.1.0-beta.1", + "@antv/path-util": "^2.0.3", + "@antv/scale": "^0.3.1", + "@antv/util": "~2.0.5", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "@antv/g2plot": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@antv/g2plot/-/g2plot-2.3.3.tgz", + "integrity": "sha512-rQ3CwoQ/oXDC3N7dHLku74SHFYcbuRK7yy+iFJh0UW1jrwQPG5o5GBjLnnTtVhjdtXWSDFxgOXwJNKOdW2+/dg==", + "dev": true, + "requires": { + "@antv/event-emitter": "^0.1.2", + "@antv/g2": "^4.1.0", + "d3-hierarchy": "^2.0.0", + "d3-regression": "^1.3.5", + "d3-sankey": "^0.12.3", + "dayjs": "^1.8.36", + "size-sensor": "^1.0.1", + "tslib": "^1.13.0" + } + }, + "@antv/g6": { + "version": "3.8.5", + "resolved": "https://registry.npmjs.org/@antv/g6/-/g6-3.8.5.tgz", + "integrity": "sha512-q+Fomc5ogcdcJ9usgYUVHzB8lFR5XHi4+O1BBFzA4ERgaF255xtrIpP631cD2wjByDq/9MbBCSpFqeOgBg2eOg==", + "dev": true, + "requires": { + "@ant-design/colors": "^4.0.5", + "@antv/dom-util": "^2.0.1", + "@antv/event-emitter": "~0.1.0", + "@antv/g-base": "^0.5.1", + "@antv/g-canvas": "^0.5.2", + "@antv/g-math": "^0.1.1", + "@antv/g-svg": "^0.5.1", + "@antv/hierarchy": "^0.6.2", + "@antv/matrix-util": "^2.0.4", + "@antv/path-util": "^2.0.3", + "@antv/scale": "^0.3.1", + "@antv/util": "~2.0.5", + "color": "^3.1.3", + "d3-force": "^2.0.1", + "dagre": "^0.8.5", + "insert-css": "^2.0.0", + "ml-matrix": "^6.5.0" + }, + "dependencies": { + "@ant-design/colors": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-4.0.5.tgz", + "integrity": "sha512-3mnuX2prnWOWvpFTS2WH2LoouWlOgtnIpc6IarWN6GOzzLF8dW/U8UctuvIPhoboETehZfJ61XP+CGakBEPJ3Q==", + "dev": true, + "requires": { + "tinycolor2": "^1.4.1" + } + }, + "@antv/matrix-util": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@antv/matrix-util/-/matrix-util-2.0.7.tgz", + "integrity": "sha512-bogifQY8jplWtSTZsPqBOdBlDdkM7IwDqYL8eMYL8OaSyOPCS7l9bnEQjQ9qTAwfCd7wHTuPoCnCpbiR8BYFvQ==", + "dev": true, + "requires": { + "@antv/gl-matrix": "^2.7.1", + "@antv/util": "^2.0.7", + "tslib": "^1.10.0" + } + } + } + }, + "@antv/gl-matrix": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@antv/gl-matrix/-/gl-matrix-2.7.1.tgz", + "integrity": "sha512-oOWcVNlpELIKi9x+Mm1Vwbz8pXfkbJKykoCIOJ/dNK79hSIANbpXJ5d3Rra9/wZqK6MC961B7sybFhPlLraT3Q==", + "dev": true + }, + "@antv/hierarchy": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@antv/hierarchy/-/hierarchy-0.6.6.tgz", + "integrity": "sha512-ivb9j5aJOogjjU9k7WZXWznevMyqgBbP/Xq2rfXsQFLk4ArABt2ewU6a6jndPOiycGDxppZ8kaYjli70i4HluA==", + "dev": true, + "requires": { + "@antv/util": "^2.0.7" + } + }, + "@antv/matrix-util": { + "version": "3.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@antv/matrix-util/-/matrix-util-3.1.0-beta.2.tgz", + "integrity": "sha512-Efwp0ZHxVDK/8RUa/RRWN7HKFHJmjn7Oq5HaNBbCmsxd7JTla3Zsoq1AZrjWMDlq0lplo77urclwI+XIW8NEHw==", + "dev": true, + "requires": { + "@antv/util": "^2.0.9", + "gl-matrix": "^3.3.0", + "tslib": "^1.10.0" + } + }, + "@antv/path-util": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@antv/path-util/-/path-util-2.0.9.tgz", + "integrity": "sha512-kunEz4dNheQMVn4rVFsoBDx+n9Knfi3uRLvDk9SojZAqpninsjFhdoiYtbExwJGz1FYGtiV10Y6N1tp73kZFcg==", + "dev": true, + "requires": { + "@antv/util": "^2.0.9", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "@antv/scale": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@antv/scale/-/scale-0.3.6.tgz", + "integrity": "sha512-lmuGmC2nhHVJqtnBgj/atbvnYovgO6zN3+qmdNAgJFSx7/tsxwcA/9gsKawtbk5PL7nRVITsu/bHqK0MNj2wsA==", + "dev": true, + "requires": { + "@antv/util": "~2.0.3", + "fecha": "~4.2.0", + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, + "@antv/util": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@antv/util/-/util-2.0.10.tgz", + "integrity": "sha512-cO6F5qyGVdwG21lunhoDhupR+I+eLYAePgDzM2bjU3LwE3akfyymhOlHE8wcONsPEVRLQ3sTOtd+FojO6g01gw==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } + }, "@babel/code-frame": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", @@ -1998,21 +2281,6 @@ } } }, - "@react-dnd/asap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.0.tgz", - "integrity": "sha512-0XhqJSc6pPoNnf8DhdsPHtUhRzZALVzYMTzRwV4VI6DJNJ/5xxfL9OQUwb8IH5/2x7lSf7nAZrnzUD+16VyOVQ==" - }, - "@react-dnd/invariant": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-2.0.0.tgz", - "integrity": "sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw==" - }, - "@react-dnd/shallowequal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz", - "integrity": "sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==" - }, "@rollup/plugin-node-resolve": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", @@ -2227,6 +2495,12 @@ "@babel/types": "^7.3.0" } }, + "@types/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-ZnAbquVqy+4ZjdW0cY6URp+qF/AzTVNda2jYyOzpR2cPT35FTXl78s15Bomph9+ckOiI1TtkljnWkwbIGAb6rg==", + "dev": true + }, "@types/eslint": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.5.tgz", @@ -2258,15 +2532,6 @@ "@types/node": "*" } }, - "@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "requires": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, "@types/html-minifier-terser": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", @@ -2336,25 +2601,11 @@ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==" }, - "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" - }, "@types/q": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" }, - "@types/react": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.0.tgz", - "integrity": "sha512-aj/L7RIMsRlWML3YB6KZiXB3fV2t41+5RBGYF8z+tAKU43Px8C3cYUZsDvf1/+Bm4FK21QWBrDutu8ZJ/70qOw==", - "requires": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, "@types/resolve": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", @@ -4756,11 +5007,6 @@ "semver": "^7.3.2" } }, - "css-mediaquery": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", - "integrity": "sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA=" - }, "css-prefers-color-scheme": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", @@ -4972,11 +5218,6 @@ } } }, - "csstype": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz", - "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==" - }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", @@ -4991,6 +5232,109 @@ "type": "^1.0.1" } }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==", + "dev": true + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==", + "dev": true + }, + "d3-dispatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", + "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==", + "dev": true + }, + "d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==", + "dev": true + }, + "d3-force": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-2.1.1.tgz", + "integrity": "sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==", + "dev": true, + "requires": { + "d3-dispatch": "1 - 2", + "d3-quadtree": "1 - 2", + "d3-timer": "1 - 2" + } + }, + "d3-hierarchy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz", + "integrity": "sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==", + "dev": true + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "dev": true, + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "dev": true + }, + "d3-quadtree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz", + "integrity": "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==", + "dev": true + }, + "d3-regression": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/d3-regression/-/d3-regression-1.3.5.tgz", + "integrity": "sha512-gVxMjvgi0oE/dRWan2g1TI4/HkYcXFLVyf2MAGxUbVuM36GlOeCmM1SdbZa9lXmi4XKIsHMsARPCrD/x0xsWNQ==", + "dev": true + }, + "d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "dev": true, + "requires": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dev": true, + "requires": { + "d3-path": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", + "dev": true + }, + "dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "dev": true, + "requires": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, "damerau-levenshtein": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", @@ -5187,11 +5531,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, - "dequal": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", - "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==" - }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -5206,6 +5545,12 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.2.0.tgz", + "integrity": "sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA==", + "dev": true + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -5265,16 +5610,6 @@ "path-type": "^4.0.0" } }, - "dnd-core": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-10.0.2.tgz", - "integrity": "sha512-PrxEjxF0+6Y1n1n1Z9hSWZ1tvnDXv9syL+BccV1r1RC08uWNsyetf8AnWmUF3NgYPwy0HKQJwTqGkZK+1NlaFA==", - "requires": { - "@react-dnd/asap": "^4.0.0", - "@react-dnd/invariant": "^2.0.0", - "redux": "^4.0.4" - } - }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -6667,6 +7002,12 @@ "bser": "2.1.1" } }, + "fecha": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", + "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==", + "dev": true + }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -7109,6 +7450,21 @@ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, + "g2": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/g2/-/g2-2.3.13.tgz", + "integrity": "sha512-N4LzRWoheJ7IORe8+GedzecyYG/OAl+avRoBorxtkXaQEvsPgPyEUW3GZSj1lchVTM8KzH19JLaUN3klsoaLZQ==", + "dev": true + }, + "g2-react": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/g2-react/-/g2-react-1.3.2.tgz", + "integrity": "sha1-djEVyFGy6yzV4IzfKy1A62Dtvd4=", + "dev": true, + "requires": { + "prop-types": "^15.5.7" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7160,6 +7516,12 @@ "assert-plus": "^1.0.0" } }, + "gl-matrix": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", + "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==", + "dev": true + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -7222,6 +7584,15 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, + "graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -7626,11 +7997,6 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" }, - "hyphenate-style-name": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -7912,6 +8278,15 @@ } } }, + "is-any-array": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-0.1.0.tgz", + "integrity": "sha512-6Kkl1RnvfdkmXM6ZlP+kELGBMA74Nq5pSOm9gIKDaPRe9KQlIJzonrOgq0Jzn/iElB6F2/olpLgWYeVySzrSRg==", + "dev": true, + "requires": { + "rollup": "^1.31.1" + } + }, "is-arguments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", @@ -10068,16 +10443,6 @@ "lodash._reinterpolate": "^3.0.0" } }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" - }, - "lodash.tonumber": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/lodash.tonumber/-/lodash.tonumber-4.0.3.tgz", - "integrity": "sha1-C5azGzVnJ5Prf1pj7nkfG56QJdk=" - }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -10157,14 +10522,6 @@ "object-visit": "^1.0.0" } }, - "matchmediaquery": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", - "integrity": "sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ==", - "requires": { - "css-mediaquery": "^0.1.2" - } - }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -10463,6 +10820,44 @@ "minimist": "^1.2.5" } }, + "ml-array-max": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ml-array-max/-/ml-array-max-1.2.0.tgz", + "integrity": "sha512-3UH7XCdjINxbtBWj1EuHMeI242Q3uLuC4rTpSybBWUpGjnG/BefAFxmTolUCuXDM59mJ/G/re80CQbaVIuMjQA==", + "dev": true, + "requires": { + "is-any-array": "^0.1.0" + } + }, + "ml-array-min": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ml-array-min/-/ml-array-min-1.2.0.tgz", + "integrity": "sha512-Wgf2+lCndLy1SbeOZSUqlkxD9T1CXPT7CIlNGAZRRQI35wsqvfuNtLNH4qKFx8kNjlq3VGXKOSBHeiXR31vaTA==", + "dev": true, + "requires": { + "is-any-array": "^0.1.0" + } + }, + "ml-array-rescale": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/ml-array-rescale/-/ml-array-rescale-1.3.2.tgz", + "integrity": "sha512-kiXwdVCGrer7rLnjR6Q9ZgP6e9rbnmQvYVUMLXyqNg4+zOs+jek8yBupqPZPDr+NvlSE5OuMnfAbP1oA63kHBA==", + "dev": true, + "requires": { + "is-any-array": "^0.1.0", + "ml-array-max": "^1.2.0", + "ml-array-min": "^1.2.0" + } + }, + "ml-matrix": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.5.3.tgz", + "integrity": "sha512-wXrn+ccApJ6gHktxmosOzs6B6M0huadahDpcgPYIAJggpqN7CtV4Vd7zpW6Lel/1oM5yCULcrbRJ1A5gF/GYDA==", + "dev": true, + "requires": { + "ml-array-rescale": "^1.3.2" + } + }, "moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", @@ -13060,6 +13455,12 @@ "whatwg-fetch": "^3.4.1" } }, + "react-content-loader": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/react-content-loader/-/react-content-loader-5.1.4.tgz", + "integrity": "sha512-hTq7pZi2GKCK6a9d3u6XStozm0QGCEjw8cSqQReiWnh2up6IwCha5R5TF0o6SY5qUDpByloEZEZtnFxpJyENFw==", + "dev": true + }, "react-contexify": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/react-contexify/-/react-contexify-4.1.1.tgz", @@ -13154,49 +13555,6 @@ } } }, - "react-dnd": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-11.1.3.tgz", - "integrity": "sha512-8rtzzT8iwHgdSC89VktwhqdKKtfXaAyC4wiqp0SywpHG12TTLvfOoL6xNEIUWXwIEWu+CFfDn4GZJyynCEuHIQ==", - "requires": { - "@react-dnd/shallowequal": "^2.0.0", - "@types/hoist-non-react-statics": "^3.3.1", - "dnd-core": "^11.1.3", - "hoist-non-react-statics": "^3.3.0" - }, - "dependencies": { - "dnd-core": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-11.1.3.tgz", - "integrity": "sha512-QugF55dNW+h+vzxVJ/LSJeTeUw9MCJ2cllhmVThVPEtF16ooBkxj0WBE5RB+AceFxMFo1rO6bJKXtqKl+JNnyA==", - "requires": { - "@react-dnd/asap": "^4.0.0", - "@react-dnd/invariant": "^2.0.0", - "redux": "^4.0.4" - } - } - } - }, - "react-dnd-html5-backend": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-11.1.3.tgz", - "integrity": "sha512-/1FjNlJbW/ivkUxlxQd7o3trA5DE33QiRZgxent3zKme8DwF4Nbw3OFVhTRFGaYhHFNL1rZt6Rdj1D78BjnNLw==", - "requires": { - "dnd-core": "^11.1.3" - }, - "dependencies": { - "dnd-core": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-11.1.3.tgz", - "integrity": "sha512-QugF55dNW+h+vzxVJ/LSJeTeUw9MCJ2cllhmVThVPEtF16ooBkxj0WBE5RB+AceFxMFo1rO6bJKXtqKl+JNnyA==", - "requires": { - "@react-dnd/asap": "^4.0.0", - "@react-dnd/invariant": "^2.0.0", - "redux": "^4.0.4" - } - } - } - }, "react-dom": { "version": "16.14.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", @@ -13228,17 +13586,6 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" }, - "react-responsive": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-8.1.1.tgz", - "integrity": "sha512-kvgOGU4m64ALsDiNKgImW6xtbdx/aSuw8sTCHC8RsBlkXsDA/gMoZkYboZuk4V9DhX6bCFh4gBH2UqlYVPLvcA==", - "requires": { - "hyphenate-style-name": "^1.0.0", - "matchmediaquery": "^0.3.0", - "prop-types": "^15.6.1", - "shallow-equal": "^1.1.0" - } - }, "react-router": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", @@ -13441,15 +13788,6 @@ "minimatch": "3.0.4" } }, - "redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", - "requires": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" - } - }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -14398,11 +14736,6 @@ "kind-of": "^6.0.2" } }, - "shallow-equal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", - "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" - }, "shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -14487,6 +14820,12 @@ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, + "size-sensor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/size-sensor/-/size-sensor-1.0.1.tgz", + "integrity": "sha512-QTy7MnuugCFXIedXRpUSk9gUnyNiaxIdxGfUjr8xxXOqIB3QvBUYP9+b51oCg2C4dnhaeNk/h57TxjbvoJrJUA==", + "dev": true + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -15284,19 +15623,6 @@ "util.promisify": "~1.0.0" } }, - "swr": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/swr/-/swr-0.3.9.tgz", - "integrity": "sha512-lyN4SjBzpoW4+v3ebT7JUtpzf9XyzrFwXIFv+E8ZblvMa5enSNaUBs4EPkL8gGA/GDMLngEmB53o5LaNboAPfg==", - "requires": { - "dequal": "2.0.2" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -15576,6 +15902,12 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, + "tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", + "dev": true + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -15911,11 +16243,6 @@ } } }, - "unstated-next": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unstated-next/-/unstated-next-1.1.0.tgz", - "integrity": "sha512-AAn47ZncPvgBGOvMcn8tSRxsrqwf2VdAPxLASTuLJvZt4rhKfDvUkmYZLGfclImSfTVMv7tF4ynaVxin0JjDCA==" - }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -15986,19 +16313,6 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, - "use-json-comparison": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/use-json-comparison/-/use-json-comparison-1.0.5.tgz", - "integrity": "sha512-P/AgEKXphcN0L/8G5wLfbEz88mZQ9ayHS1OVESZaS2nxkN/msDWTGE8E1e9HXOWCZ9yoAfDrbVKAmTYpsYupFA==" - }, - "use-media-antd-query": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/use-media-antd-query/-/use-media-antd-query-1.0.2.tgz", - "integrity": "sha512-9exG6pzEtkwtJIM2loE5/lBdNeJHoX0/CYA8NVwC0UPaiCcpHKAEyj9sEa+dju7ERPaU0//gG8+Q6I7Jr265Eg==", - "requires": { - "react-responsive": "^8.0.1" - } - }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", @@ -16102,18 +16416,6 @@ "extsprintf": "^1.2.0" } }, - "video-react": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/video-react/-/video-react-0.14.1.tgz", - "integrity": "sha512-R5ClJo58iJcQLS+bGNmuAMc/fx9/xcJ6oLrAlbuu7MGI49Jh7b7o79aUdQMZvzuynT1NvhVmD4N/fTOEmWNDlg==", - "requires": { - "@babel/runtime": "^7.4.5", - "classnames": "^2.2.6", - "lodash.throttle": "^4.1.1", - "prop-types": "^15.7.2", - "redux": "^4.0.1" - } - }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", diff --git a/web/package.json b/web/package.json index 7e55f06..219ee45 100644 --- a/web/package.json +++ b/web/package.json @@ -36,6 +36,9 @@ ], "homepage": ".", "devDependencies": { + "@ant-design/charts": "^1.0.13", + "g2": "^2.3.13", + "g2-react": "^1.3.2", "umi-request": "^1.3.5", "xterm-addon-attach": "^0.6.0", "xterm-addon-fit": "^0.4.0" diff --git a/web/src/components/asset/Asset.js b/web/src/components/asset/Asset.js index 6caba46..fbdbbd7 100644 --- a/web/src/components/asset/Asset.js +++ b/web/src/components/asset/Asset.js @@ -1,5 +1,4 @@ import React, {Component} from 'react'; -import "video-react/dist/video-react.css"; import { Badge, diff --git a/web/src/components/credential/Credential.js b/web/src/components/credential/Credential.js index 419b41f..ec709dc 100644 --- a/web/src/components/credential/Credential.js +++ b/web/src/components/credential/Credential.js @@ -1,5 +1,4 @@ import React, {Component} from 'react'; -import "video-react/dist/video-react.css"; import {Button, Col, Divider, Input, Layout, Modal, PageHeader, Row, Space, Table, Tooltip, Typography} from "antd"; import qs from "qs"; diff --git a/web/src/components/dashboard/Dashboard.js b/web/src/components/dashboard/Dashboard.js index 3763855..fe471e5 100644 --- a/web/src/components/dashboard/Dashboard.js +++ b/web/src/components/dashboard/Dashboard.js @@ -1,10 +1,11 @@ import React, {Component} from 'react'; -import {Layout, PageHeader, Card, Row, Col, Progress, Typography, Popover, Statistic} from "antd"; -import {DesktopOutlined, IdcardOutlined, LikeOutlined, LinkOutlined, UserOutlined} from '@ant-design/icons'; +import {Card, Col, Layout, PageHeader, Radio, Row, Statistic, Typography} from "antd"; +import {DesktopOutlined, IdcardOutlined, LinkOutlined, UserOutlined} from '@ant-design/icons'; import {itemRender} from '../../utils/utils' import request from "../../common/request"; import './Dashboard.css' import {Link} from "react-router-dom"; +import {Area} from '@ant-design/charts'; const {Content} = Layout; const {Title, Paragraph} = Typography; @@ -24,78 +25,59 @@ const routes = [ class Dashboard extends Component { state = { - status: { - load: { - load1: 0, - load5: 0, - load15: 0, - }, - cpu: { - percent: 0, - logicalCount: 0, - physicalCount: 0 - }, - memory: { - usedPercent: 0, - available: 0, - total: 0, - used: 0 - } - }, - interval: null, - counter: {} + counter: {}, + d: 'w', + session: [], } componentDidMount() { this.getCounter(); - this.getStatus(); - - this.setState({ - interval: setInterval(() => this.getStatus(), 5000) - }) + this.getD(); } componentWillUnmount() { - if (this.state.interval != null) { - clearInterval(this.state.interval); - } - } - getStatus = async () => { - let result = await request.get('/overview/status'); - if (result.code === 1) { - this.setState({ - status: result.data - }) - } } getCounter = async () => { let result = await request.get('/overview/counter'); - if (result.code === 1) { + if (result['code'] === 1) { this.setState({ - counter: result.data + counter: result['data'] }) } } + getD = async () => { + let result = await request.get('/overview/sessions?d=' + this.state.d); + if (result['code'] === 1) { + this.setState({ + session: result['data'] + }) + console.log('set session', this.state.session) + } + } + + handleChangeD = (e) => { + let d = e.target.value; + this.setState({ + d: d + }, () => this.getD()) + } + render() { - const loadContent = ( -
-

最近1分钟负载:{this.state.status.load['load1'].toFixed(1)}

-

最近5分钟负载:{this.state.status.load['load5'].toFixed(1)}

-

最近15分钟负载:{this.state.status.load['load15'].toFixed(1)}

-
- ); + const config = { + data: this.state.session, + xField: 'day', + yField: 'count', + seriesField: 'protocol', + }; - const cpuContent = ( -
-

CPU型号:{this.state.status.cpu['modelName']}

-

物理核心:{this.state.status.cpu['physicalCount']}

-

逻辑核心:{this.state.status.cpu['logicalCount']}

-
- ); + const buttonRadio = + 按周 + 按月 + return ( <> @@ -150,41 +132,8 @@ class Dashboard extends Component {
- - - - 负载状态 - - - - - 运行流畅 - - - CPU使用率 - - - - {this.state.status.cpu['logicalCount']}核心 - - - 内存使用率 - - - - {Math.floor(this.state.status.memory['used'] / 1024 / 1024)} - / - {Math.floor(this.state.status.memory['total'] / 1024 / 1024)} - (MB) - - - - - - + +
diff --git a/web/src/components/session/OfflineSession.js b/web/src/components/session/OfflineSession.js index c9a2cf3..6e55cde 100644 --- a/web/src/components/session/OfflineSession.js +++ b/web/src/components/session/OfflineSession.js @@ -1,5 +1,4 @@ import React, {Component} from 'react'; -import "video-react/dist/video-react.css"; import { Button, @@ -238,14 +237,14 @@ class OfflineSession extends Component { render: (id, record, index) => { return index + 1; } - }, { - title: '用户昵称', - dataIndex: 'creatorName', - key: 'creatorName' }, { title: '来源IP', dataIndex: 'clientIp', key: 'clientIp' + }, { + title: '用户昵称', + dataIndex: 'creatorName', + key: 'creatorName' }, { title: '资产名称', dataIndex: 'assetName', @@ -369,6 +368,13 @@ class OfflineSession extends Component { + + { return index + 1; } - }, { - title: '用户昵称', - dataIndex: 'creatorName', - key: 'creatorName' }, { title: '来源IP', dataIndex: 'clientIp', key: 'clientIp' + }, { + title: '用户昵称', + dataIndex: 'creatorName', + key: 'creatorName' }, { title: '资产名称', dataIndex: 'assetName', @@ -371,6 +370,13 @@ class OnlineSession extends Component { + +