Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
B
beego
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
beego
Commits
f6a1a6c9
Commit
f6a1a6c9
authored
Aug 24, 2014
by
astaxie
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #773 from lei-cao/develop
Added data table admin ui
parents
771179a3
38ee4370
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
169 additions
and
157 deletions
+169
-157
admin.go
admin.go
+60
-62
adminui.go
adminui.go
+101
-91
statistics.go
toolbox/statistics.go
+8
-4
No files found.
admin.go
View file @
f6a1a6c9
...
...
@@ -142,121 +142,116 @@ func listConf(rw http.ResponseWriter, r *http.Request) {
tmpl
.
Execute
(
rw
,
data
)
case
"router"
:
resultList
:=
new
([][]
string
)
content
:=
make
(
map
[
string
]
interface
{}
)
var
result
=
[]
string
{
fmt
.
Sprintf
(
"header"
),
var
fields
=
[]
string
{
fmt
.
Sprintf
(
"Router Pattern"
),
fmt
.
Sprintf
(
"Methods"
),
fmt
.
Sprintf
(
"Controller"
),
}
*
resultList
=
append
(
*
resultList
,
result
)
content
[
"Fields"
]
=
fields
methods
:=
[]
string
{}
methodsData
:=
make
(
map
[
string
]
interface
{})
for
method
,
t
:=
range
BeeApp
.
Handlers
.
routers
{
var
result
=
[]
string
{
fmt
.
Sprintf
(
"success"
),
fmt
.
Sprintf
(
"Method: %s"
,
method
),
fmt
.
Sprintf
(
""
),
fmt
.
Sprintf
(
""
),
}
*
resultList
=
append
(
*
resultList
,
result
)
resultList
:=
new
([][]
string
)
printTree
(
resultList
,
t
)
methods
=
append
(
methods
,
method
)
methodsData
[
method
]
=
resultList
}
data
[
"Content"
]
=
resultList
content
[
"Data"
]
=
methodsData
content
[
"Methods"
]
=
methods
data
[
"Content"
]
=
content
data
[
"Title"
]
=
"Routers"
tmpl
:=
template
.
Must
(
template
.
New
(
"dashboard"
)
.
Parse
(
dashboardTpl
))
tmpl
=
template
.
Must
(
tmpl
.
Parse
(
routerAndFilterTpl
))
tmpl
=
template
.
Must
(
tmpl
.
Parse
(
defaultScriptsTpl
))
tmpl
.
Execute
(
rw
,
data
)
case
"filter"
:
resultList
:=
new
([][]
string
)
content
:=
make
(
map
[
string
]
interface
{}
)
var
result
=
[]
string
{
fmt
.
Sprintf
(
"header"
),
var
fields
=
[]
string
{
fmt
.
Sprintf
(
"Router Pattern"
),
fmt
.
Sprintf
(
"Filter Function"
),
}
*
resultList
=
append
(
*
resultList
,
result
)
content
[
"Fields"
]
=
fields
filterTypes
:=
[]
string
{}
filterTypeData
:=
make
(
map
[
string
]
interface
{})
if
BeeApp
.
Handlers
.
enableFilter
{
var
result
=
[]
string
{
fmt
.
Sprintf
(
"success"
),
fmt
.
Sprintf
(
"Before Router"
),
fmt
.
Sprintf
(
""
),
}
*
resultList
=
append
(
*
resultList
,
result
)
var
filterType
string
if
bf
,
ok
:=
BeeApp
.
Handlers
.
filters
[
BeforeRouter
];
ok
{
filterType
=
"Before Router"
filterTypes
=
append
(
filterTypes
,
filterType
)
resultList
:=
new
([][]
string
)
for
_
,
f
:=
range
bf
{
var
result
=
[]
string
{
fmt
.
Sprintf
(
""
),
fmt
.
Sprintf
(
"%s"
,
f
.
pattern
),
fmt
.
Sprintf
(
"%s"
,
utils
.
GetFuncName
(
f
.
filterFunc
)),
}
*
resultList
=
append
(
*
resultList
,
result
)
}
filterTypeData
[
filterType
]
=
resultList
}
result
=
[]
string
{
fmt
.
Sprintf
(
"success"
),
fmt
.
Sprintf
(
"Before Exec"
),
fmt
.
Sprintf
(
""
),
}
*
resultList
=
append
(
*
resultList
,
result
)
if
bf
,
ok
:=
BeeApp
.
Handlers
.
filters
[
BeforeExec
];
ok
{
filterType
=
"Before Exec"
filterTypes
=
append
(
filterTypes
,
filterType
)
resultList
:=
new
([][]
string
)
for
_
,
f
:=
range
bf
{
var
result
=
[]
string
{
fmt
.
Sprintf
(
""
),
fmt
.
Sprintf
(
"%s"
,
f
.
pattern
),
fmt
.
Sprintf
(
"%s"
,
utils
.
GetFuncName
(
f
.
filterFunc
)),
}
*
resultList
=
append
(
*
resultList
,
result
)
}
filterTypeData
[
filterType
]
=
resultList
}
result
=
[]
string
{
fmt
.
Sprintf
(
"success"
),
fmt
.
Sprintf
(
"AfterExec Exec"
),
fmt
.
Sprintf
(
""
),
}
*
resultList
=
append
(
*
resultList
,
result
)
if
bf
,
ok
:=
BeeApp
.
Handlers
.
filters
[
AfterExec
];
ok
{
filterType
=
"After Exec"
filterTypes
=
append
(
filterTypes
,
filterType
)
resultList
:=
new
([][]
string
)
for
_
,
f
:=
range
bf
{
var
result
=
[]
string
{
fmt
.
Sprintf
(
""
),
fmt
.
Sprintf
(
"%s"
,
f
.
pattern
),
fmt
.
Sprintf
(
"%s"
,
utils
.
GetFuncName
(
f
.
filterFunc
)),
}
*
resultList
=
append
(
*
resultList
,
result
)
}
filterTypeData
[
filterType
]
=
resultList
}
result
=
[]
string
{
fmt
.
Sprintf
(
"success"
),
fmt
.
Sprintf
(
"Finish Router"
),
fmt
.
Sprintf
(
""
),
}
*
resultList
=
append
(
*
resultList
,
result
)
if
bf
,
ok
:=
BeeApp
.
Handlers
.
filters
[
FinishRouter
];
ok
{
filterType
=
"Finish Router"
filterTypes
=
append
(
filterTypes
,
filterType
)
resultList
:=
new
([][]
string
)
for
_
,
f
:=
range
bf
{
var
result
=
[]
string
{
fmt
.
Sprintf
(
""
),
fmt
.
Sprintf
(
"%s"
,
f
.
pattern
),
fmt
.
Sprintf
(
"%s"
,
utils
.
GetFuncName
(
f
.
filterFunc
)),
}
*
resultList
=
append
(
*
resultList
,
result
)
}
filterTypeData
[
filterType
]
=
resultList
}
}
data
[
"Content"
]
=
resultList
content
[
"Data"
]
=
filterTypeData
content
[
"Methods"
]
=
filterTypes
data
[
"Content"
]
=
content
data
[
"Title"
]
=
"Filters"
tmpl
:=
template
.
Must
(
template
.
New
(
"dashboard"
)
.
Parse
(
dashboardTpl
))
tmpl
=
template
.
Must
(
tmpl
.
Parse
(
routerAndFilterTpl
))
...
...
@@ -281,7 +276,6 @@ func printTree(resultList *[][]string, t *Tree) {
if
v
,
ok
:=
l
.
runObject
.
(
*
controllerInfo
);
ok
{
if
v
.
routerType
==
routerTypeBeego
{
var
result
=
[]
string
{
fmt
.
Sprintf
(
""
),
fmt
.
Sprintf
(
"%s"
,
v
.
pattern
),
fmt
.
Sprintf
(
"%s"
,
v
.
methods
),
fmt
.
Sprintf
(
"%s"
,
v
.
controllerType
),
...
...
@@ -289,7 +283,6 @@ func printTree(resultList *[][]string, t *Tree) {
*
resultList
=
append
(
*
resultList
,
result
)
}
else
if
v
.
routerType
==
routerTypeRESTFul
{
var
result
=
[]
string
{
fmt
.
Sprintf
(
""
),
fmt
.
Sprintf
(
"%s"
,
v
.
pattern
),
fmt
.
Sprintf
(
"%s"
,
v
.
methods
),
fmt
.
Sprintf
(
""
),
...
...
@@ -297,7 +290,6 @@ func printTree(resultList *[][]string, t *Tree) {
*
resultList
=
append
(
*
resultList
,
result
)
}
else
if
v
.
routerType
==
routerTypeHandler
{
var
result
=
[]
string
{
fmt
.
Sprintf
(
""
),
fmt
.
Sprintf
(
"%s"
,
v
.
pattern
),
fmt
.
Sprintf
(
""
),
fmt
.
Sprintf
(
""
),
...
...
@@ -352,13 +344,15 @@ func profIndex(rw http.ResponseWriter, r *http.Request) {
func
healthcheck
(
rw
http
.
ResponseWriter
,
req
*
http
.
Request
)
{
data
:=
make
(
map
[
interface
{}]
interface
{})
resultList
:=
new
([][]
string
)
var
result
=
[]
string
{
fmt
.
Sprintf
(
"header"
),
var
result
=
[]
string
{}
fields
:=
[]
string
{
fmt
.
Sprintf
(
"Name"
),
fmt
.
Sprintf
(
"Message"
),
fmt
.
Sprintf
(
"Status"
),
}
*
resultList
=
append
(
*
resultList
,
result
)
resultList
:=
new
([][]
string
)
content
:=
make
(
map
[
string
]
interface
{})
for
name
,
h
:=
range
toolbox
.
AdminCheckList
{
if
err
:=
h
.
Check
();
err
!=
nil
{
...
...
@@ -379,7 +373,9 @@ func healthcheck(rw http.ResponseWriter, req *http.Request) {
*
resultList
=
append
(
*
resultList
,
result
)
}
data
[
"Content"
]
=
resultList
content
[
"Fields"
]
=
fields
content
[
"Data"
]
=
resultList
data
[
"Content"
]
=
content
data
[
"Title"
]
=
"Health Check"
tmpl
:=
template
.
Must
(
template
.
New
(
"dashboard"
)
.
Parse
(
dashboardTpl
))
tmpl
=
template
.
Must
(
tmpl
.
Parse
(
healthCheckTpl
))
...
...
@@ -410,17 +406,17 @@ func taskStatus(rw http.ResponseWriter, req *http.Request) {
}
// List Tasks
content
:=
make
(
map
[
string
]
interface
{})
resultList
:=
new
([][]
string
)
var
result
=
[]
string
{
fmt
.
Sprintf
(
"header"
),
var
result
=
[]
string
{
}
var
fields
=
[]
string
{
fmt
.
Sprintf
(
"Task Name"
),
fmt
.
Sprintf
(
"Task Spec"
),
fmt
.
Sprintf
(
"Task Function"
),
fmt
.
Sprintf
(
""
),
}
*
resultList
=
append
(
*
resultList
,
result
)
for
tname
,
tk
:=
range
toolbox
.
AdminTaskList
{
result
=
[]
string
{
fmt
.
Sprintf
(
""
),
fmt
.
Sprintf
(
"%s"
,
tname
),
fmt
.
Sprintf
(
"%s"
,
tk
.
GetStatus
()),
fmt
.
Sprintf
(
"%s"
,
tk
.
GetPrev
()
.
String
()),
...
...
@@ -428,7 +424,9 @@ func taskStatus(rw http.ResponseWriter, req *http.Request) {
*
resultList
=
append
(
*
resultList
,
result
)
}
data
[
"Content"
]
=
resultList
content
[
"Fields"
]
=
fields
content
[
"Data"
]
=
resultList
data
[
"Content"
]
=
content
data
[
"Title"
]
=
"Tasks"
tmpl
:=
template
.
Must
(
template
.
New
(
"dashboard"
)
.
Parse
(
dashboardTpl
))
tmpl
=
template
.
Must
(
tmpl
.
Parse
(
tasksTpl
))
...
...
adminui.go
View file @
f6a1a6c9
...
...
@@ -61,31 +61,35 @@ var gcAjaxTpl = `
{{end}}
`
var
qpsTpl
=
`
{{define "content"}}
var
qpsTpl
=
`{{define "content"}}
<h1>Requests statistics</h1>
<table class="table table-striped table-hover ">
{{range $i, $slice := .Content}}
<tr>
{{range $j, $elem := $slice}}
{{if eq $i 0}}
<th>
{{else}}
<td>
{{end}}
{{$elem}}
{{if eq $i 0}}
</th>
{{else}}
</td>
{{end}}
{{end}}
<thead>
<tr>
{{range .Content.Fields}}
<th>
{{.}}
</th>
{{end}}
</tr>
</thead>
<tbody>
{{range $i, $elem := .Content.Data}}
<tr>
{{range $elem}}
<td>
{{.}}
</td>
{{end}}
</tr>
{{end}}
</tbody>
</tr>
{{end}}
</table>
{{end}}
`
{{end}}`
var
configTpl
=
`
{{define "content"}}
...
...
@@ -98,49 +102,51 @@ var configTpl = `
{{end}}
`
var
routerAndFilterTpl
=
`
{{define "content"}}
var
routerAndFilterTpl
=
`
{{define "content"}}
<h1>{{.Title}}</h1>
<table class="table table-striped table-hover ">
{{range $i, $slice := .Content}}
<tr>
{{ $header := index $slice 0}}
{{if eq "header" $header }}
{{range $j, $elem := $slice}}
{{if ne $j 0}}
<th>
{{$elem}}
</th>
{{end}}
{{end}}
{{else if eq "success" $header}}
{{range $j, $elem := $slice}}
{{if ne $j 0}}
<th class="success">
{{$elem}}
</th>
{{end}}
{{end}}
{{else}}
{{range $j, $elem := $slice}}
{{if ne $j 0}}
<td>
{{$elem}}
</td>
{{range .Content.Methods}}
<div class="panel panel-default">
<div class="panel-heading lead success"><strong>{{.}}</strong></div>
<div class="panel-body">
<table class="table table-striped table-hover ">
<thead>
<tr>
{{range $.Content.Fields}}
<th>
{{.}}
</th>
{{end}}
</tr>
</thead>
<tbody>
{{$slice := index $.Content.Data .}}
{{range $i, $elem := $slice}}
<tr>
{{range $elem}}
<td>
{{.}}
</td>
{{end}}
</tr>
{{end}}
{{end}}
</tbody>
</tr>
{{end}}
</table>
</div>
</div>
{{end}}
`
var
tasksTpl
=
`
{{define "content"}}
{{end}}`
var
tasksTpl
=
`{{define "content"}}
<h1>{{.Title}}</h1>
...
...
@@ -161,59 +167,51 @@ bg-warning
<table class="table table-striped table-hover ">
{{range $i, $slice := .Content}}
<thead>
<tr>
{{range .Content.Fields}}
<th>
{{.}}
</th>
{{end}}
</tr>
</thead>
{{ $header := index $slice 0}}
{{if eq "header" $header }}
{{range $j, $elem := $slice}}
{{if ne $j 0}}
<th>
{{$elem}}
</th>
{{end}}
{{end}}
<th>
Run Task
</th>
{{else}}
{{range $j, $elem := $slice}}
{{if ne $j 0}}
<tbody>
{{range $i, $slice := .Content.Data}}
<tr>
{{range $slice}}
<td>
{{
$elem
}}
{{
.
}}
</td>
{{end}}
{{end}}
<td>
<a class="btn btn-primary btn-sm" href="/task?taskname={{index $slice 1}}">Run</a>
</td>
{{end}}
</tr>
{{end}}
</tbody>
</table>
{{end}}
`
{{end}}
`
var
healthCheckTpl
=
`
{{define "content"}}
<h1>{{.Title}}</h1>
<table class="table table-striped table-hover ">
{{range $i, $slice := .Content}}
{{ $header := index $slice 0}}
{{if eq "header" $header }}
<thead>
<tr>
{{range $j, $elem := $slice}}
{{if ne $j 0}}
{{range .Content.Fields}}
<th>
{{
$elem
}}
{{
.
}}
</th>
{{end}}
{{end}}
{{end}}
</tr>
{{else}}
</thead>
<tbody>
{{range $i, $slice := .Content.Data}}
{{ $header := index $slice 0}}
{{ if eq "success" $header}}
<tr class="success">
{{else if eq "error" $header}}
...
...
@@ -228,10 +226,13 @@ var healthCheckTpl = `
</td>
{{end}}
{{end}}
<td>
{{$header}}
</td>
</tr>
{{end}}
{{end}}
</tbody>
</table>
{{end}}`
...
...
@@ -251,7 +252,8 @@ Welcome to Beego Admin Dashboard
</title>
<link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
<link href="//cdn.datatables.net/plug-ins/725b2a2115b/integration/bootstrap/3/dataTables.bootstrap.css" rel="stylesheet">
<style type="text/css">
ul.nav li.dropdown:hover > ul.dropdown-menu {
...
...
@@ -336,9 +338,17 @@ Healthcheck
{{template "content" .}}
</div>
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="//code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="//cdn.datatables.net/1.10.2/js/jquery.dataTables.min.js"></script>
<script src="//cdn.datatables.net/plug-ins/725b2a2115b/integration/bootstrap/3/dataTables.bootstrap.js
"></script>
<script type="text/javascript">
$(document).ready(function() {
$('.table').dataTable();
});
</script>
{{template "scripts" .}}
</body>
</html>
...
...
toolbox/statistics.go
View file @
f6a1a6c9
...
...
@@ -83,13 +83,16 @@ func (m *UrlMap) AddStatistics(requestMethod, requestUrl, requestController stri
}
// put url statistics result in io.Writer
func
(
m
*
UrlMap
)
GetMap
()
[][]
string
{
func
(
m
*
UrlMap
)
GetMap
()
map
[
string
]
interface
{}
{
m
.
lock
.
RLock
()
defer
m
.
lock
.
RUnlock
()
var
fields
=
[]
string
{
"requestUrl"
,
"method"
,
"times"
,
"used"
,
"max used"
,
"min used"
,
"avg used"
}
resultLists
:=
make
([][]
string
,
0
)
content
:=
make
(
map
[
string
]
interface
{})
content
[
"Fields"
]
=
fields
var
result
=
[]
string
{
"requestUrl"
,
"method"
,
"times"
,
"used"
,
"max used"
,
"min used"
,
"avg used"
}
resultLists
=
append
(
resultLists
,
result
)
for
k
,
v
:=
range
m
.
urlmap
{
for
kk
,
vv
:=
range
v
{
result
:=
[]
string
{
...
...
@@ -104,7 +107,8 @@ func (m *UrlMap) GetMap() [][]string {
resultLists
=
append
(
resultLists
,
result
)
}
}
return
resultLists
content
[
"Data"
]
=
resultLists
return
content
}
// global statistics data map
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment