github.com/astaxie/beego@v1.12.3/adminui.go (about) 1 // Copyright 2014 beego Author. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package beego 16 17 var indexTpl = ` 18 {{define "content"}} 19 <h1>Beego Admin Dashboard</h1> 20 <p> 21 For detail usage please check our document: 22 </p> 23 <p> 24 <a target="_blank" href="http://beego.me/docs/module/toolbox.md">Toolbox</a> 25 </p> 26 <p> 27 <a target="_blank" href="http://beego.me/docs/advantage/monitor.md">Live Monitor</a> 28 </p> 29 {{.Content}} 30 {{end}}` 31 32 var profillingTpl = ` 33 {{define "content"}} 34 <h1>{{.Title}}</h1> 35 <pre id="content"> 36 <div>{{.Content}}</div> 37 </pre> 38 {{end}}` 39 40 var defaultScriptsTpl = `` 41 42 var gcAjaxTpl = ` 43 {{define "scripts"}} 44 <script type="text/javascript"> 45 var app = app || {}; 46 (function() { 47 app.$el = $('#content'); 48 app.getGc = function() { 49 var that = this; 50 $.ajax("/prof?command=gc%20summary&format=json").done(function(data) { 51 that.$el.append($('<p>' + data.Content + '</p>')); 52 }); 53 }; 54 $(document).ready(function() { 55 setInterval(function() { 56 app.getGc(); 57 }, 3000); 58 }); 59 })(); 60 </script> 61 {{end}} 62 ` 63 64 var qpsTpl = `{{define "content"}} 65 <h1>Requests statistics</h1> 66 <table class="table table-striped table-hover "> 67 <thead> 68 <tr> 69 {{range .Content.Fields}} 70 <th> 71 {{.}} 72 </th> 73 {{end}} 74 </tr> 75 </thead> 76 77 <tbody> 78 {{range $i, $elem := .Content.Data}} 79 80 <tr> 81 <td>{{index $elem 0}}</td> 82 <td>{{index $elem 1}}</td> 83 <td>{{index $elem 2}}</td> 84 <td data-order="{{index $elem 3}}">{{index $elem 4}}</td> 85 <td data-order="{{index $elem 5}}">{{index $elem 6}}</td> 86 <td data-order="{{index $elem 7}}">{{index $elem 8}}</td> 87 <td data-order="{{index $elem 9}}">{{index $elem 10}}</td> 88 </tr> 89 {{end}} 90 </tbody> 91 92 </table> 93 {{end}}` 94 95 var configTpl = ` 96 {{define "content"}} 97 <h1>Configurations</h1> 98 <pre> 99 {{range $index, $elem := .Content}} 100 {{$index}}={{$elem}} 101 {{end}} 102 </pre> 103 {{end}} 104 ` 105 106 var routerAndFilterTpl = `{{define "content"}} 107 108 109 <h1>{{.Title}}</h1> 110 111 {{range .Content.Methods}} 112 113 <div class="panel panel-default"> 114 <div class="panel-heading lead success"><strong>{{.}}</strong></div> 115 <div class="panel-body"> 116 <table class="table table-striped table-hover "> 117 <thead> 118 <tr> 119 {{range $.Content.Fields}} 120 <th> 121 {{.}} 122 </th> 123 {{end}} 124 </tr> 125 </thead> 126 127 <tbody> 128 {{$slice := index $.Content.Data .}} 129 {{range $i, $elem := $slice}} 130 131 <tr> 132 {{range $elem}} 133 <td> 134 {{.}} 135 </td> 136 {{end}} 137 </tr> 138 139 {{end}} 140 </tbody> 141 142 </table> 143 </div> 144 </div> 145 {{end}} 146 147 148 {{end}}` 149 150 var tasksTpl = `{{define "content"}} 151 152 <h1>{{.Title}}</h1> 153 154 {{if .Message }} 155 {{ $messageType := index .Message 0}} 156 <p class="message 157 {{if eq "error" $messageType}} 158 bg-danger 159 {{else if eq "success" $messageType}} 160 bg-success 161 {{else}} 162 bg-warning 163 {{end}} 164 "> 165 {{index .Message 1}} 166 </p> 167 {{end}} 168 169 170 <table class="table table-striped table-hover "> 171 <thead> 172 <tr> 173 {{range .Content.Fields}} 174 <th> 175 {{.}} 176 </th> 177 {{end}} 178 </tr> 179 </thead> 180 181 <tbody> 182 {{range $i, $slice := .Content.Data}} 183 <tr> 184 {{range $slice}} 185 <td> 186 {{.}} 187 </td> 188 {{end}} 189 <td> 190 <a class="btn btn-primary btn-sm" href="/task?taskname={{index $slice 0}}">Run</a> 191 </td> 192 </tr> 193 {{end}} 194 </tbody> 195 </table> 196 197 {{end}}` 198 199 var healthCheckTpl = ` 200 {{define "content"}} 201 202 <h1>{{.Title}}</h1> 203 <table class="table table-striped table-hover "> 204 <thead> 205 <tr> 206 {{range .Content.Fields}} 207 <th> 208 {{.}} 209 </th> 210 {{end}} 211 </tr> 212 </thead> 213 <tbody> 214 {{range $i, $slice := .Content.Data}} 215 {{ $header := index $slice 0}} 216 {{ if eq "success" $header}} 217 <tr class="success"> 218 {{else if eq "error" $header}} 219 <tr class="danger"> 220 {{else}} 221 <tr> 222 {{end}} 223 {{range $j, $elem := $slice}} 224 {{if ne $j 0}} 225 <td> 226 {{$elem}} 227 </td> 228 {{end}} 229 {{end}} 230 <td> 231 {{$header}} 232 </td> 233 </tr> 234 {{end}} 235 236 </tbody> 237 </table> 238 {{end}}` 239 240 // The base dashboardTpl 241 var dashboardTpl = ` 242 <!DOCTYPE html> 243 <html lang="en"> 244 <head> 245 <!-- Meta, title, CSS, favicons, etc. --> 246 <meta charset="utf-8"> 247 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 248 <meta name="viewport" content="width=device-width, initial-scale=1"> 249 250 <title> 251 252 Welcome to Beego Admin Dashboard 253 254 </title> 255 256 <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet"> 257 <link href="//cdn.datatables.net/plug-ins/725b2a2115b/integration/bootstrap/3/dataTables.bootstrap.css" rel="stylesheet"> 258 259 <style type="text/css"> 260 ul.nav li.dropdown:hover > ul.dropdown-menu { 261 display: block; 262 } 263 #logo { 264 width: 102px; 265 height: 32px; 266 margin-top: 5px; 267 } 268 .message { 269 padding: 15px; 270 } 271 </style> 272 273 </head> 274 <body> 275 276 <header class="navbar navbar-default navbar-static-top bs-docs-nav" id="top" role="banner"> 277 <div class="container"> 278 <div class="navbar-header"> 279 <button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse"> 280 <span class="sr-only">Toggle navigation</span> 281 <span class="icon-bar"></span> 282 <span class="icon-bar"></span> 283 <span class="icon-bar"></span> 284 </button> 285 286 <a href="/"> 287 <img id="logo" src="data:image/png;base64,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"/> 288 </a> 289 290 </div> 291 <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation"> 292 <ul class="nav navbar-nav"> 293 <li> 294 <a href="/qps"> 295 Requests statistics 296 </a> 297 </li> 298 <li> 299 300 <li class="dropdown"> 301 <a href="#" class="dropdown-toggle disabled" data-toggle="dropdown">Performance profiling<span class="caret"></span></a> 302 <ul class="dropdown-menu" role="menu"> 303 304 <li><a href="/prof?command=lookup goroutine">lookup goroutine</a></li> 305 <li><a href="/prof?command=lookup heap">lookup heap</a></li> 306 <li><a href="/prof?command=lookup threadcreate">lookup threadcreate</a></li> 307 <li><a href="/prof?command=lookup block">lookup block</a></li> 308 <li><a href="/prof?command=get cpuprof">get cpuprof</a></li> 309 <li><a href="/prof?command=get memprof">get memprof</a></li> 310 <li><a href="/prof?command=gc summary">gc summary</a></li> 311 312 </ul> 313 </li> 314 315 <li> 316 <a href="/healthcheck"> 317 Healthcheck 318 </a> 319 </li> 320 321 <li> 322 <a href="/task" class="dropdown-toggle disabled" data-toggle="dropdown">Tasks</a> 323 </li> 324 325 <li class="dropdown"> 326 <a href="#" class="dropdown-toggle disabled" data-toggle="dropdown">Config Status<span class="caret"></span></a> 327 <ul class="dropdown-menu" role="menu"> 328 <li><a href="/listconf?command=conf">Configs</a></li> 329 <li><a href="/listconf?command=router">Routers</a></li> 330 <li><a href="/listconf?command=filter">Filters</a></li> 331 </ul> 332 </li> 333 </ul> 334 </nav> 335 </div> 336 </header> 337 338 <div class="container"> 339 {{template "content" .}} 340 </div> 341 342 <script src="//code.jquery.com/jquery-1.11.1.min.js"></script> 343 <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> 344 <script src="//cdn.datatables.net/1.10.2/js/jquery.dataTables.min.js"></script> 345 <script src="//cdn.datatables.net/plug-ins/725b2a2115b/integration/bootstrap/3/dataTables.bootstrap.js 346 "></script> 347 348 <script type="text/javascript"> 349 $(document).ready(function() { 350 $('.table').dataTable(); 351 }); 352 </script> 353 {{template "scripts" .}} 354 </body> 355 </html> 356 `