This commit is contained in:
IT 老营长 @云轩领航-创始人 2024-09-20 20:53:35 +08:00
parent 5e996d2d70
commit 046db80c71
13 changed files with 78 additions and 95 deletions

View File

@ -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...)
}

View File

@ -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:
}
}

View File

@ -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{}) }

View File

@ -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; }

View File

@ -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{}) }

View File

@ -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)

View File

@ -6,7 +6,6 @@ const (
UID = "uid"
NAME = "name"
TYPE = "type"
ROLE = "role"
TITLE = "title"
CONTENT = "content"
USER_UID = "user_uid"

View File

@ -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 }

View File

@ -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"

View File

@ -6,7 +6,6 @@ const (
UID = "uid"
NAME = "name"
TYPE = "type"
ROLE = "role"
LEVEL = "level"
STATUS = "status"
TITLE = "title"

View File

@ -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{})}) }

View File

@ -6,7 +6,6 @@ const (
UID = "uid"
NAME = "name"
TYPE = "type"
ROLE = "role"
TITLE = "title"
CONTENT = "content"
USER_UID = "user_uid"

View File

@ -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{})}) }