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  `