mirror of
https://shylinux.com/x/operation
synced 2025-07-01 21:21:19 +08:00
add some
This commit is contained in:
parent
5e996d2d70
commit
046db80c71
@ -18,12 +18,7 @@ func (s Table) Inputs(m *ice.Message, arg ...string) {
|
|||||||
case model.USER_DASHBOARD_ROLE:
|
case model.USER_DASHBOARD_ROLE:
|
||||||
s.InputsListRole(m, UserDashboardRoleList, arg...)
|
s.InputsListRole(m, UserDashboardRoleList, arg...)
|
||||||
case model.DASHBOARD_TYPE:
|
case model.DASHBOARD_TYPE:
|
||||||
for v, k := range DashboardTypeList {
|
s.InputsListSkip(m, DashboardTypeList, kit.Select("0", "-1", m.IsTech()), arg...)
|
||||||
if m.IsTech() || v > 0 {
|
|
||||||
m.Push(arg[0], v).Push(model.NAME, k)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m.SortInt(arg[0]).DisplayInputKeyNameIconTitle()
|
|
||||||
default:
|
default:
|
||||||
s.Table.Inputs(m, arg...)
|
s.Table.Inputs(m, arg...)
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
package dashboard
|
package dashboard
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gorm.io/driver/mysql"
|
|
||||||
"gorm.io/gorm"
|
|
||||||
"gorm.io/gorm/logger"
|
|
||||||
|
|
||||||
"shylinux.com/x/ice"
|
"shylinux.com/x/ice"
|
||||||
"shylinux.com/x/icebergs/base/aaa"
|
"shylinux.com/x/icebergs/base/aaa"
|
||||||
"shylinux.com/x/icebergs/base/ctx"
|
"shylinux.com/x/icebergs/base/ctx"
|
||||||
@ -12,7 +8,7 @@ import (
|
|||||||
"shylinux.com/x/icebergs/base/web"
|
"shylinux.com/x/icebergs/base/web"
|
||||||
kit "shylinux.com/x/toolkits"
|
kit "shylinux.com/x/toolkits"
|
||||||
|
|
||||||
"shylinux.com/x/mysql-story/src/db"
|
"shylinux.com/x/mysql-story/src/db/mysql"
|
||||||
"shylinux.com/x/operation/src/dashboard/model"
|
"shylinux.com/x/operation/src/dashboard/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -31,16 +27,14 @@ func (s dashboard) List(m *ice.Message, arg ...string) {
|
|||||||
if DashboardType(kit.Int(m.Append(model.DASHBOARD_TYPE))) == DashboardPlace {
|
if DashboardType(kit.Int(m.Append(model.DASHBOARD_TYPE))) == DashboardPlace {
|
||||||
if s.IsLeader(m) {
|
if s.IsLeader(m) {
|
||||||
m.Action(s.Schema)
|
m.Action(s.Schema)
|
||||||
}
|
|
||||||
s.UserPlaceInit(m)
|
s.UserPlaceInit(m)
|
||||||
|
}
|
||||||
} else if m.Append(model.USERNAME) == "" {
|
} else if m.Append(model.USERNAME) == "" {
|
||||||
m.SetAppend().EchoInfoButton("", s.Config)
|
m.SetAppend().EchoInfoButton("", s.Config)
|
||||||
} else {
|
} else {
|
||||||
if s.IsLeader(m) {
|
if s.IsLeader(m) {
|
||||||
m.PushAction(s.Config).Action(s.Config, s.Schema)
|
m.PushAction(s.Config).Action(s.Config)
|
||||||
s.UserPlaceInit(m)
|
s.UserPlaceInit(m)
|
||||||
} else {
|
|
||||||
m.Action()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -49,25 +43,17 @@ func (s dashboard) Config(m *ice.Message, arg ...string) {
|
|||||||
s.UserPlaceInit(m)
|
s.UserPlaceInit(m)
|
||||||
}
|
}
|
||||||
func (s dashboard) Schema(m *ice.Message, arg ...string) {
|
func (s dashboard) Schema(m *ice.Message, arg ...string) {
|
||||||
db := m.Configv(db.DB).(*gorm.DB)
|
m.Display("/plugin/table.js")
|
||||||
s.Show(m, db.Raw(`
|
s.Show(m, s.Open(m).Raw(`
|
||||||
select TABLE_SCHEMA,TABLE_NAME,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH from information_schema.TABLES
|
select TABLE_SCHEMA,TABLE_NAME,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH from information_schema.TABLES
|
||||||
where TABLE_SCHEMA != 'mysql' AND TABLE_SCHEMA != 'information_schema' AND TABLE_SCHEMA != 'performance_schema'
|
where TABLE_SCHEMA != 'mysql' AND TABLE_SCHEMA != 'information_schema' AND TABLE_SCHEMA != 'performance_schema'
|
||||||
order by DATA_LENGTH desc
|
order by DATA_LENGTH desc
|
||||||
`))
|
`))
|
||||||
m.Display("/plugin/table.js")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { ice.TeamCtxCmd(dashboard{}) }
|
func init() { ice.TeamCtxCmd(dashboard{}) }
|
||||||
|
|
||||||
func (s dashboard) Open(msg *ice.Message, cb func(*gorm.DB)) {
|
func (s dashboard) scan(m *ice.Message, dashboard_uid string, cb func(*ice.Message, ice.Maps)) {
|
||||||
dsn := kit.Format("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True",
|
|
||||||
msg.Append(model.USERNAME), msg.Append(model.PASSWORD), msg.Append(model.HOST), msg.Append(model.PORT), msg.Append(model.DATABASE))
|
|
||||||
if db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)}); !msg.Warn(err) {
|
|
||||||
cb(db)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func (s dashboard) Scan(m *ice.Message, dashboard_uid string, cb func(*ice.Message, ice.Maps)) {
|
|
||||||
msg := m.Cmd(s, s.Select, model.UID, dashboard_uid)
|
msg := m.Cmd(s, s.Select, model.UID, dashboard_uid)
|
||||||
switch DashboardType(kit.Int(msg.Append(model.TYPE))) {
|
switch DashboardType(kit.Int(msg.Append(model.TYPE))) {
|
||||||
case DashboardPlace:
|
case DashboardPlace:
|
||||||
@ -78,14 +64,14 @@ func (s dashboard) Scan(m *ice.Message, dashboard_uid string, cb func(*ice.Messa
|
|||||||
cb(msg, value)
|
cb(msg, value)
|
||||||
})
|
})
|
||||||
case DashboardMySQL:
|
case DashboardMySQL:
|
||||||
s.Open(m, func(db *gorm.DB) {
|
if db, err := mysql.Open(msg); !msg.Warn(err) {
|
||||||
m.Table(func(value ice.Maps) {
|
m.Table(func(value ice.Maps) {
|
||||||
db = db.Table(s.TableName(kit.Join(kit.Slice(kit.Split(value[ctx.INDEX], "."), -2), ".")))
|
db = db.Table(s.TableName(kit.Join(kit.Slice(kit.Split(value[ctx.INDEX], "."), -2), ".")))
|
||||||
kit.If(value[model.QUERY], func(p string) { s.Where(m, db, kit.Simple(kit.UnMarshal(p))...) })
|
kit.If(value[model.QUERY], func(p string) { s.Where(m, db, kit.Simple(kit.UnMarshal(p))...) })
|
||||||
msg := s.Rows(m.Spawn(), db.Select(kit.Select("count(*)", value[mdb.FIELD])))
|
msg := s.Rows(m.Spawn(), db.Select(kit.Select("count(*)", value[mdb.FIELD])))
|
||||||
cb(msg, value)
|
cb(msg, value)
|
||||||
})
|
})
|
||||||
})
|
}
|
||||||
case DashboardRedis:
|
case DashboardRedis:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@ const (
|
|||||||
UID = "uid"
|
UID = "uid"
|
||||||
NAME = "name"
|
NAME = "name"
|
||||||
TYPE = "type"
|
TYPE = "type"
|
||||||
ROLE = "role"
|
|
||||||
TITLE = "title"
|
TITLE = "title"
|
||||||
CONTENT = "content"
|
CONTENT = "content"
|
||||||
CREATED_AT = "created_at"
|
CREATED_AT = "created_at"
|
||||||
@ -23,8 +22,6 @@ const (
|
|||||||
USERNAME = "username"
|
USERNAME = "username"
|
||||||
PASSWORD = "password"
|
PASSWORD = "password"
|
||||||
DATABASE = "database"
|
DATABASE = "database"
|
||||||
TABLES = "tables"
|
|
||||||
FIELDS = "fields"
|
|
||||||
QUERY = "query"
|
QUERY = "query"
|
||||||
VALUE = "value"
|
VALUE = "value"
|
||||||
SCORE = "score"
|
SCORE = "score"
|
||||||
@ -52,6 +49,7 @@ type Summary struct {
|
|||||||
Field string `gorm:"type:varchar(255)"`
|
Field string `gorm:"type:varchar(255)"`
|
||||||
Value float32 `gorm:"default:0"`
|
Value float32 `gorm:"default:0"`
|
||||||
Score float32 `gorm:"default:0"`
|
Score float32 `gorm:"default:0"`
|
||||||
|
Unit string `gorm:"type:varchar(16)"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { db.CmdModels("", &UserDashboard{}, &Dashboard{}, &Summary{}) }
|
func init() { db.CmdModels("", &UserDashboard{}, &Dashboard{}, &Summary{}) }
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
$output>div.item { text-align:center; padding:10px; float:left; }
|
$output>div.item { text-align:center; padding:10px; float:left; }
|
||||||
$output>div.item div.value { font-size:24px; }
|
$output>div.item div.value { font-size:24px; white-space:pre; }
|
||||||
|
$output>div.item div.value span.unit { font-size:12px; }
|
||||||
$output>div.item div.title { font-size:12px; }
|
$output>div.item div.title { font-size:12px; }
|
@ -11,35 +11,22 @@ type summary struct {
|
|||||||
Table
|
Table
|
||||||
dashboard dashboard
|
dashboard dashboard
|
||||||
order string `data:"2"`
|
order string `data:"2"`
|
||||||
create string `name:"create space* index* query field title score" role:"leader"`
|
create string `name:"create space* index* query field title score unit" role:"leader"`
|
||||||
modify string `name:"modify space* index* query field title score" role:"leader"`
|
modify string `name:"modify space* index* query field title score unit" role:"leader"`
|
||||||
remove string `name:"remove" role:"leader"`
|
remove string `name:"remove" role:"leader"`
|
||||||
scan string `name:"scan" role:"leader"`
|
scan string `name:"scan" role:"leader"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s summary) Scan(m *ice.Message, arg ...string) {
|
func (s summary) Scan(m *ice.Message, arg ...string) {
|
||||||
dashboard_uid := kit.Select(m.Option(model.DASHBOARD_UID), arg, 0)
|
dashboard_uid := kit.Select(m.Option(model.DASHBOARD_UID), arg, 0)
|
||||||
s.dashboard.Scan(s.List(m, dashboard_uid), dashboard_uid, func(msg *ice.Message, value ice.Maps) {
|
s.dashboard.scan(s.List(m, dashboard_uid), dashboard_uid, func(msg *ice.Message, value ice.Maps) {
|
||||||
s.Update(m, kit.Dict(model.VALUE, msg.Append(msg.Append(ice.MSG_APPEND))), model.UID, value[model.UID])
|
s.Update(m, kit.Dict(model.VALUE, msg.Append(msg.Append(ice.MSG_APPEND))), model.UID, value[model.UID])
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
func (s summary) List(m *ice.Message, arg ...string) *ice.Message {
|
|
||||||
if len(arg) == 0 {
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
s.Orders(m, model.SCORE, s.Desc(model.CREATED_AT))
|
|
||||||
s.Select(m, model.DASHBOARD_UID, arg[0])
|
|
||||||
if s.IsLeader(m) {
|
|
||||||
m.PushAction(s.Modify, s.Remove).Action(s.Create, s.Scan, s.Schema)
|
|
||||||
} else {
|
|
||||||
m.Action()
|
|
||||||
}
|
|
||||||
return s.Button(m, "").Display("").DisplayCSS("")
|
|
||||||
}
|
|
||||||
func (s summary) Schema(m *ice.Message, arg ...string) {
|
func (s summary) Schema(m *ice.Message, arg ...string) {
|
||||||
databases := map[string]bool{}
|
|
||||||
tables := map[string]bool{}
|
|
||||||
stats := map[string]int{}
|
stats := map[string]int{}
|
||||||
|
tables := map[string]bool{}
|
||||||
|
databases := map[string]bool{}
|
||||||
m.Cmd(s.dashboard, s.Schema).Table(func(value ice.Maps) {
|
m.Cmd(s.dashboard, s.Schema).Table(func(value ice.Maps) {
|
||||||
if !databases[value["TABLE_SCHEMA"]] {
|
if !databases[value["TABLE_SCHEMA"]] {
|
||||||
databases[value["TABLE_SCHEMA"]] = true
|
databases[value["TABLE_SCHEMA"]] = true
|
||||||
@ -59,4 +46,19 @@ func (s summary) Schema(m *ice.Message, arg ...string) {
|
|||||||
m.Display("").DisplayCSS("")
|
m.Display("").DisplayCSS("")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s summary) List(m *ice.Message, arg ...string) *ice.Message {
|
||||||
|
if len(arg) == 0 {
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
s.Orders(m, model.SCORE, s.Desc(model.CREATED_AT))
|
||||||
|
s.Select(m, model.DASHBOARD_UID, arg[0])
|
||||||
|
if s.IsLeader(m) {
|
||||||
|
m.PushAction(s.Modify, s.Remove).Action(s.Create, s.Scan, s.Schema)
|
||||||
|
s.Button(m, "")
|
||||||
|
} else {
|
||||||
|
m.Action()
|
||||||
|
}
|
||||||
|
return m.Display("").DisplayCSS("")
|
||||||
|
}
|
||||||
|
|
||||||
func init() { ice.TeamCtxCmd(summary{}) }
|
func init() { ice.TeamCtxCmd(summary{}) }
|
||||||
|
@ -2,12 +2,20 @@ Volcanos(chat.ONIMPORT, {
|
|||||||
_init: function(can, msg) { var width = can.onimport.width(can, 80, msg.Length())
|
_init: function(can, msg) { var width = can.onimport.width(can, 80, msg.Length())
|
||||||
can.page.Append(can, can._output, msg.Table(function(value) {
|
can.page.Append(can, can._output, msg.Table(function(value) {
|
||||||
return {view: html.ITEM, style: {width: width}, list: [
|
return {view: html.ITEM, style: {width: width}, list: [
|
||||||
{view: [html.VALUE, "", can.base.trimSuffix(can.base.Size(value.value), "B")]}, {view: [html.TITLE, "", value.title||value.index.split(".").pop()]},
|
{view: html.VALUE, list: can.onimport[value.unit||"unit"](can, value.value, value.unit||"")},
|
||||||
], oncontextmenu: function(event) {
|
{view: html.TITLE, list: [{text: value.title||value.index.split(".").pop()}]},
|
||||||
can.onkeymap.prevent(event), can.user.carteItem(event, can, value)
|
]}
|
||||||
}}
|
|
||||||
}))
|
}))
|
||||||
},
|
},
|
||||||
|
money: function(can, value) { return can.onimport.unit(can, value, "元") },
|
||||||
|
order: function(can, value) { return can.onimport.unit(can, value, "单") },
|
||||||
|
stock: function(can, value) { return can.onimport.unit(can, value, "件") },
|
||||||
|
size: function(can, value) { return [{text: can.base.Size(value)}] },
|
||||||
|
unit: function(can, value, unit) { var v = parseFloat(value)
|
||||||
|
if (v > 100000000) { return [{text: (v/100000000).toFixed(2)}, {text: ["亿"+unit, "", "unit"]}] }
|
||||||
|
if (v > 10000) { return [{text: (v/10000).toFixed(2)}, {text: ["万"+unit, "", "unit"]}] }
|
||||||
|
return [{text: value}, {text: [unit, "", "unit"]}]
|
||||||
|
},
|
||||||
width: function(can, min, length) {
|
width: function(can, min, length) {
|
||||||
var count = (parseInt(can.ConfWidth()/min)); if (length < count) { count = length }
|
var count = (parseInt(can.ConfWidth()/min)); if (length < count) { count = length }
|
||||||
return can.ConfWidth()/(count||1)
|
return can.ConfWidth()/(count||1)
|
||||||
|
@ -6,7 +6,6 @@ const (
|
|||||||
UID = "uid"
|
UID = "uid"
|
||||||
NAME = "name"
|
NAME = "name"
|
||||||
TYPE = "type"
|
TYPE = "type"
|
||||||
ROLE = "role"
|
|
||||||
TITLE = "title"
|
TITLE = "title"
|
||||||
CONTENT = "content"
|
CONTENT = "content"
|
||||||
USER_UID = "user_uid"
|
USER_UID = "user_uid"
|
||||||
|
@ -36,11 +36,9 @@ func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message {
|
|||||||
})
|
})
|
||||||
return s.Table.RewriteAppend(m)
|
return s.Table.RewriteAppend(m)
|
||||||
}
|
}
|
||||||
func (s Table) CheckRole(m *ice.Message, arg ...string) *ice.Message {
|
func (s Table) CheckRole(m *ice.Message, arg ...string) {
|
||||||
role := UserCloudRole(s.UserPlaceRole(m))
|
role := UserCloudRole(s.UserPlaceRole(m))
|
||||||
m.WarnNotRight(!kit.IsIn(role.String(), append(arg, UserCloudCreator.String())...), role.String())
|
m.WarnNotRight(!kit.IsIn(role.String(), append(arg, UserCloudCreator.String())...), role.String())
|
||||||
m.Option(model.USER_ROLE, kit.Format(role))
|
|
||||||
return m
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Tables struct{ Table }
|
type Tables struct{ Table }
|
||||||
|
@ -6,11 +6,9 @@ const (
|
|||||||
UID = "uid"
|
UID = "uid"
|
||||||
NAME = "name"
|
NAME = "name"
|
||||||
TYPE = "type"
|
TYPE = "type"
|
||||||
ROLE = "role"
|
|
||||||
TITLE = "title"
|
TITLE = "title"
|
||||||
CONTENT = "content"
|
CONTENT = "content"
|
||||||
USER_UID = "user_uid"
|
USER_UID = "user_uid"
|
||||||
USER_ROLE = "user_role"
|
|
||||||
USER_CLOUD_ROLE = "user_cloud_role"
|
USER_CLOUD_ROLE = "user_cloud_role"
|
||||||
CLOUD_UID = "cloud_uid"
|
CLOUD_UID = "cloud_uid"
|
||||||
CLOUD_NAME = "cloud_name"
|
CLOUD_NAME = "cloud_name"
|
||||||
|
@ -6,7 +6,6 @@ const (
|
|||||||
UID = "uid"
|
UID = "uid"
|
||||||
NAME = "name"
|
NAME = "name"
|
||||||
TYPE = "type"
|
TYPE = "type"
|
||||||
ROLE = "role"
|
|
||||||
LEVEL = "level"
|
LEVEL = "level"
|
||||||
STATUS = "status"
|
STATUS = "status"
|
||||||
TITLE = "title"
|
TITLE = "title"
|
||||||
|
@ -15,10 +15,10 @@ type Portal struct {
|
|||||||
|
|
||||||
func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) {
|
func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) {
|
||||||
defer s.DashboardCreate(m, "")()
|
defer s.DashboardCreate(m, "")()
|
||||||
s.DashboardInsert(m, "1", "需求总量", issue{}, "")
|
s.DashboardInsert(m, "1", "需求总量", "个", issue{}, "")
|
||||||
s.DashboardInsert(m, "2", "需求待办", issue{}, "", "story_uid = ? AND status != ? AND status != ?", m.Option(model.STORY_UID), IssueRejected, IssueFinish)
|
s.DashboardInsert(m, "2", "需求待办", "个", issue{}, "", "story_uid = ? AND status != ? AND status != ?", m.Option(model.STORY_UID), IssueRejected, IssueFinish)
|
||||||
s.DashboardInsert(m, "3", "任务总量", task{}, "")
|
s.DashboardInsert(m, "3", "任务总量", "个", task{}, "")
|
||||||
s.DashboardInsert(m, "4", "任务待办", task{}, "", "story_uid = ? AND status != ?", m.Option(model.STORY_UID), TaskFinish)
|
s.DashboardInsert(m, "4", "任务待办", "个", task{}, "", "story_uid = ? AND status != ?", m.Option(model.STORY_UID), TaskFinish)
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { gonganxitong.PortalCmd(Portal{Portal: guanlixitong.NewPortal(userStory{}, story{})}) }
|
func init() { gonganxitong.PortalCmd(Portal{Portal: guanlixitong.NewPortal(userStory{}, story{})}) }
|
||||||
|
@ -6,7 +6,6 @@ const (
|
|||||||
UID = "uid"
|
UID = "uid"
|
||||||
NAME = "name"
|
NAME = "name"
|
||||||
TYPE = "type"
|
TYPE = "type"
|
||||||
ROLE = "role"
|
|
||||||
TITLE = "title"
|
TITLE = "title"
|
||||||
CONTENT = "content"
|
CONTENT = "content"
|
||||||
USER_UID = "user_uid"
|
USER_UID = "user_uid"
|
||||||
|
@ -14,8 +14,8 @@ type Portal struct {
|
|||||||
|
|
||||||
func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) {
|
func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) {
|
||||||
defer s.DashboardCreate(m, "")()
|
defer s.DashboardCreate(m, "")()
|
||||||
s.DashboardInsert(m, "1", "文件数量", file{}, "")
|
s.DashboardInsert(m, "1", "文件数量", "个", file{}, "")
|
||||||
s.DashboardInsert(m, "2", "文件大小", file{}, "SUM(size)")
|
s.DashboardInsert(m, "2", "文件大小", "size", file{}, "SUM(size)")
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { gonganxitong.PortalCmd(Portal{Portal: guanlixitong.NewPortal(userStorage{}, storage{})}) }
|
func init() { gonganxitong.PortalCmd(Portal{Portal: guanlixitong.NewPortal(userStorage{}, storage{})}) }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user