mirror of
https://shylinux.com/x/operation
synced 2025-04-25 01:08:04 +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:
|
||||
s.InputsListRole(m, UserDashboardRoleList, arg...)
|
||||
case model.DASHBOARD_TYPE:
|
||||
for v, k := range DashboardTypeList {
|
||||
if m.IsTech() || v > 0 {
|
||||
m.Push(arg[0], v).Push(model.NAME, k)
|
||||
}
|
||||
}
|
||||
m.SortInt(arg[0]).DisplayInputKeyNameIconTitle()
|
||||
s.InputsListSkip(m, DashboardTypeList, kit.Select("0", "-1", m.IsTech()), arg...)
|
||||
default:
|
||||
s.Table.Inputs(m, arg...)
|
||||
}
|
||||
|
@ -1,10 +1,6 @@
|
||||
package dashboard
|
||||
|
||||
import (
|
||||
"gorm.io/driver/mysql"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/logger"
|
||||
|
||||
"shylinux.com/x/ice"
|
||||
"shylinux.com/x/icebergs/base/aaa"
|
||||
"shylinux.com/x/icebergs/base/ctx"
|
||||
@ -12,7 +8,7 @@ import (
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
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"
|
||||
)
|
||||
|
||||
@ -31,16 +27,14 @@ func (s dashboard) List(m *ice.Message, arg ...string) {
|
||||
if DashboardType(kit.Int(m.Append(model.DASHBOARD_TYPE))) == DashboardPlace {
|
||||
if s.IsLeader(m) {
|
||||
m.Action(s.Schema)
|
||||
s.UserPlaceInit(m)
|
||||
}
|
||||
s.UserPlaceInit(m)
|
||||
} else if m.Append(model.USERNAME) == "" {
|
||||
m.SetAppend().EchoInfoButton("", s.Config)
|
||||
} else {
|
||||
if s.IsLeader(m) {
|
||||
m.PushAction(s.Config).Action(s.Config, s.Schema)
|
||||
m.PushAction(s.Config).Action(s.Config)
|
||||
s.UserPlaceInit(m)
|
||||
} else {
|
||||
m.Action()
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -49,25 +43,17 @@ func (s dashboard) Config(m *ice.Message, arg ...string) {
|
||||
s.UserPlaceInit(m)
|
||||
}
|
||||
func (s dashboard) Schema(m *ice.Message, arg ...string) {
|
||||
db := m.Configv(db.DB).(*gorm.DB)
|
||||
s.Show(m, db.Raw(`
|
||||
m.Display("/plugin/table.js")
|
||||
s.Show(m, s.Open(m).Raw(`
|
||||
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'
|
||||
order by DATA_LENGTH desc
|
||||
`))
|
||||
m.Display("/plugin/table.js")
|
||||
}
|
||||
|
||||
func init() { ice.TeamCtxCmd(dashboard{}) }
|
||||
|
||||
func (s dashboard) Open(msg *ice.Message, cb func(*gorm.DB)) {
|
||||
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)) {
|
||||
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)
|
||||
switch DashboardType(kit.Int(msg.Append(model.TYPE))) {
|
||||
case DashboardPlace:
|
||||
@ -78,14 +64,14 @@ func (s dashboard) Scan(m *ice.Message, dashboard_uid string, cb func(*ice.Messa
|
||||
cb(msg, value)
|
||||
})
|
||||
case DashboardMySQL:
|
||||
s.Open(m, func(db *gorm.DB) {
|
||||
if db, err := mysql.Open(msg); !msg.Warn(err) {
|
||||
m.Table(func(value ice.Maps) {
|
||||
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))...) })
|
||||
msg := s.Rows(m.Spawn(), db.Select(kit.Select("count(*)", value[mdb.FIELD])))
|
||||
cb(msg, value)
|
||||
})
|
||||
})
|
||||
}
|
||||
case DashboardRedis:
|
||||
}
|
||||
}
|
||||
|
@ -3,31 +3,28 @@ package model
|
||||
import "shylinux.com/x/mysql-story/src/db"
|
||||
|
||||
const (
|
||||
UID = "uid"
|
||||
NAME = "name"
|
||||
TYPE = "type"
|
||||
ROLE = "role"
|
||||
TITLE = "title"
|
||||
CONTENT = "content"
|
||||
CREATED_AT = "created_at"
|
||||
USER_UID = "user_uid"
|
||||
UID = "uid"
|
||||
NAME = "name"
|
||||
TYPE = "type"
|
||||
TITLE = "title"
|
||||
CONTENT = "content"
|
||||
CREATED_AT = "created_at"
|
||||
USER_UID = "user_uid"
|
||||
USER_DASHBOARD_ROLE = "user_dashboard_role"
|
||||
DASHBOARD_UID = "dashboard_uid"
|
||||
DASHBOARD_NAME = "dashboard_name"
|
||||
DASHBOARD_TYPE = "dashboard_type"
|
||||
SUMMARY_UID = "summary_uid"
|
||||
COMPANY_UID = "company_uid"
|
||||
CITY_UID = "city_uid"
|
||||
HOST = "host"
|
||||
PORT = "port"
|
||||
USERNAME = "username"
|
||||
PASSWORD = "password"
|
||||
DATABASE = "database"
|
||||
TABLES = "tables"
|
||||
FIELDS = "fields"
|
||||
QUERY = "query"
|
||||
VALUE = "value"
|
||||
SCORE = "score"
|
||||
SUMMARY_UID = "summary_uid"
|
||||
COMPANY_UID = "company_uid"
|
||||
CITY_UID = "city_uid"
|
||||
HOST = "host"
|
||||
PORT = "port"
|
||||
USERNAME = "username"
|
||||
PASSWORD = "password"
|
||||
DATABASE = "database"
|
||||
QUERY = "query"
|
||||
VALUE = "value"
|
||||
SCORE = "score"
|
||||
)
|
||||
|
||||
type UserDashboard struct {
|
||||
@ -46,12 +43,13 @@ type Dashboard struct {
|
||||
type Summary struct {
|
||||
db.ModelContent
|
||||
DashboardUID string `gorm:"type:char(32);index"`
|
||||
Space string `gorm:"type:varchar(64)"`
|
||||
Index string `gorm:"type:varchar(128)"`
|
||||
Query string `gorm:"type:varchar(255)"`
|
||||
Field string `gorm:"type:varchar(255)"`
|
||||
Value float32 `gorm:"default:0"`
|
||||
Score float32 `gorm:"default:0"`
|
||||
Space string `gorm:"type:varchar(64)"`
|
||||
Index string `gorm:"type:varchar(128)"`
|
||||
Query string `gorm:"type:varchar(255)"`
|
||||
Field string `gorm:"type:varchar(255)"`
|
||||
Value float32 `gorm:"default:0"`
|
||||
Score float32 `gorm:"default:0"`
|
||||
Unit string `gorm:"type:varchar(16)"`
|
||||
}
|
||||
|
||||
func init() { db.CmdModels("", &UserDashboard{}, &Dashboard{}, &Summary{}) }
|
||||
|
@ -1,3 +1,4 @@
|
||||
$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; }
|
@ -10,36 +10,23 @@ import (
|
||||
type summary struct {
|
||||
Table
|
||||
dashboard dashboard
|
||||
order string `data:"2"`
|
||||
create string `name:"create space* index* query field title score" role:"leader"`
|
||||
modify string `name:"modify space* index* query field title score" role:"leader"`
|
||||
remove string `name:"remove" role:"leader"`
|
||||
scan string `name:"scan" role:"leader"`
|
||||
order string `data:"2"`
|
||||
create string `name:"create space* index* query field title score unit" role:"leader"`
|
||||
modify string `name:"modify space* index* query field title score unit" role:"leader"`
|
||||
remove string `name:"remove" role:"leader"`
|
||||
scan string `name:"scan" role:"leader"`
|
||||
}
|
||||
|
||||
func (s summary) Scan(m *ice.Message, arg ...string) {
|
||||
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])
|
||||
})
|
||||
}
|
||||
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) {
|
||||
databases := map[string]bool{}
|
||||
tables := map[string]bool{}
|
||||
stats := map[string]int{}
|
||||
tables := map[string]bool{}
|
||||
databases := map[string]bool{}
|
||||
m.Cmd(s.dashboard, s.Schema).Table(func(value ice.Maps) {
|
||||
if !databases[value["TABLE_SCHEMA"]] {
|
||||
databases[value["TABLE_SCHEMA"]] = true
|
||||
@ -59,4 +46,19 @@ func (s summary) Schema(m *ice.Message, arg ...string) {
|
||||
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{}) }
|
||||
|
@ -2,12 +2,20 @@ Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) { var width = can.onimport.width(can, 80, msg.Length())
|
||||
can.page.Append(can, can._output, msg.Table(function(value) {
|
||||
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()]},
|
||||
], oncontextmenu: function(event) {
|
||||
can.onkeymap.prevent(event), can.user.carteItem(event, can, value)
|
||||
}}
|
||||
{view: html.VALUE, list: can.onimport[value.unit||"unit"](can, value.value, value.unit||"")},
|
||||
{view: html.TITLE, list: [{text: value.title||value.index.split(".").pop()}]},
|
||||
]}
|
||||
}))
|
||||
},
|
||||
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) {
|
||||
var count = (parseInt(can.ConfWidth()/min)); if (length < count) { count = length }
|
||||
return can.ConfWidth()/(count||1)
|
||||
|
@ -6,7 +6,6 @@ const (
|
||||
UID = "uid"
|
||||
NAME = "name"
|
||||
TYPE = "type"
|
||||
ROLE = "role"
|
||||
TITLE = "title"
|
||||
CONTENT = "content"
|
||||
USER_UID = "user_uid"
|
||||
|
@ -36,11 +36,9 @@ func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message {
|
||||
})
|
||||
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))
|
||||
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 }
|
||||
|
@ -6,11 +6,9 @@ const (
|
||||
UID = "uid"
|
||||
NAME = "name"
|
||||
TYPE = "type"
|
||||
ROLE = "role"
|
||||
TITLE = "title"
|
||||
CONTENT = "content"
|
||||
USER_UID = "user_uid"
|
||||
USER_ROLE = "user_role"
|
||||
USER_CLOUD_ROLE = "user_cloud_role"
|
||||
CLOUD_UID = "cloud_uid"
|
||||
CLOUD_NAME = "cloud_name"
|
||||
|
@ -6,7 +6,6 @@ const (
|
||||
UID = "uid"
|
||||
NAME = "name"
|
||||
TYPE = "type"
|
||||
ROLE = "role"
|
||||
LEVEL = "level"
|
||||
STATUS = "status"
|
||||
TITLE = "title"
|
||||
|
@ -15,10 +15,10 @@ type Portal struct {
|
||||
|
||||
func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) {
|
||||
defer s.DashboardCreate(m, "")()
|
||||
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, "3", "任务总量", task{}, "")
|
||||
s.DashboardInsert(m, "4", "任务待办", task{}, "", "story_uid = ? AND status != ?", m.Option(model.STORY_UID), TaskFinish)
|
||||
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, "3", "任务总量", "个", task{}, "")
|
||||
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{})}) }
|
||||
|
@ -6,7 +6,6 @@ const (
|
||||
UID = "uid"
|
||||
NAME = "name"
|
||||
TYPE = "type"
|
||||
ROLE = "role"
|
||||
TITLE = "title"
|
||||
CONTENT = "content"
|
||||
USER_UID = "user_uid"
|
||||
|
@ -14,8 +14,8 @@ type Portal struct {
|
||||
|
||||
func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) {
|
||||
defer s.DashboardCreate(m, "")()
|
||||
s.DashboardInsert(m, "1", "文件数量", file{}, "")
|
||||
s.DashboardInsert(m, "2", "文件大小", file{}, "SUM(size)")
|
||||
s.DashboardInsert(m, "1", "文件数量", "个", file{}, "")
|
||||
s.DashboardInsert(m, "2", "文件大小", "size", file{}, "SUM(size)")
|
||||
}
|
||||
|
||||
func init() { gonganxitong.PortalCmd(Portal{Portal: guanlixitong.NewPortal(userStorage{}, storage{})}) }
|
||||
|
Loading…
x
Reference in New Issue
Block a user