init
This commit is contained in:
+53
@@ -0,0 +1,53 @@
|
||||
<style>
|
||||
.forx {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
{{$area:=.area}} {{$regions:=.regions}}
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<form class="form-horizontal ajaxform" ajaxSuccess="success" ajaxAlways="always" method="post" action="/web/area/{{.action}}">
|
||||
<input type="hidden" name="area_id" value="{{$area.area_id}}">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>区域名称</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="name" class="form-control" value="{{$area.name}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>类型</label>
|
||||
<div class="col-sm-4">
|
||||
<select name="cs_type" class="form-control" default="{{$area.cs_type}}">
|
||||
<option value="server">Server</option>
|
||||
<option value="client">Client</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>访问控制</label>
|
||||
<div class="col-sm-4">
|
||||
<select name="is_forbidden" class="form-control" default="{{$area.is_forbidden}}">
|
||||
<option value="1">禁止</option>
|
||||
<option value="0">允许</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-success">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,67 @@
|
||||
{{$areas:=.areas}}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<form action="/web/area/list" method="get">
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-md-5"></div>
|
||||
<div class="col-md-3">
|
||||
<select class="form-control" name="type">
|
||||
<option value="name">区域名称</option>
|
||||
<option value="cs_type">类型[server|client]</option>
|
||||
<option value="is_forbidden">访问控制[0禁止|1允许]</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<input class="form-control" name="id" type="text" placeholder="">
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-default"><i class="glyphicon glyphicon-search"></i></button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w5p">ID</th>
|
||||
<th class="center w15p">区域名称</th>
|
||||
<th class="center w10p">类型</th>
|
||||
<th class="center w15p">访问控制</th>
|
||||
<th class="center w15p">创建时间</th>
|
||||
<th class="center w15p">更新时间</th>
|
||||
<th class="center">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range $area := $areas}}
|
||||
<tr>
|
||||
<td class="center">{{$area.area_id}}</td>
|
||||
<td class="center">{{$area.name}}</td>
|
||||
<td class="center">{{$area.cs_type}}</td>
|
||||
<td class="center">{{if eq $area.is_forbidden "1"}}
|
||||
<span class="label label-warning">禁止</span> {{else}}
|
||||
<span class="label label-success">允许</span> {{end}}
|
||||
</td>
|
||||
<td class="center">
|
||||
{{dateFormat $area.create_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
<td class="center">
|
||||
{{dateFormat $area.update_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
<td class="center">
|
||||
<a name="edit" href="/web/area/edit?area_id={{$area.area_id}}"><i class="glyphicon glyphicon-pencil"> </i>修改</a>
|
||||
<a name="delete" data-toggle="confirmation" data-placement="left" data-title="确定删除吗?" href="/web/area/delete?area_id={{$area.area_id}}"><i class="glyphicon glyphicon-remove"> </i>删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="panel-footer">
|
||||
</div>
|
||||
</div>
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
<style>
|
||||
.forx {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
{{$client:=.client}}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<form class="form-horizontal ajaxform" ajaxSuccess="success" ajaxAlways="always" method="post" action="/web/client/{{.action}}">
|
||||
<input type="hidden" name="client_id" value="{{$client.client_id}}">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>Client名称</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="name" class="form-control" value="{{$client.name}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * 请将汉字限制在15个以内</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>本地网络Host</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="local_host" class="form-control" value="{{$client.local_host}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * 需要暴露的Client所在网络的host,只要是Client可以访问的IP或者域名都可以</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>本地网络端口</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="local_port" class="form-control" value="{{$client.local_port}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * 对应上面的:本地网络Host,需要暴露的端口</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-success">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,76 @@
|
||||
<style>
|
||||
.token{word-break: break-all;}
|
||||
</style>
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<i class="label label-default">类型</i>
|
||||
<a class="label {{if ne $.userID `0`}}label-danger{{else}}label-default{{end}}" href="/web/client/list">用户</a>
|
||||
<a class="label {{if eq $.userID `0`}}label-danger{{else}}label-default{{end}}" href="/web/client/list?user_id=0">系统</a>
|
||||
</div>
|
||||
{{if ne $.userID "0"}}
|
||||
<div class="col-md-3 pull-right">
|
||||
<form action="/web/client/list" method="get">
|
||||
<div class="input-group">
|
||||
<input class="form-control" name="user_id" type="text" placeholder="UserID">
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-default"><i class="glyphicon glyphicon-search"></i></button>
|
||||
</span>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w10p">ID</th>
|
||||
<th class="center w10p">名称</th>
|
||||
<th class="center w20p">Token</th>
|
||||
<th class="center w10p">{{if ne $.userID "0"}}UserID{{else}}类型{{end}}</th>
|
||||
{{if eq $.userID "0"}}
|
||||
<th class="center w15p">本地网络</th>
|
||||
<th class="center w15p">创建时间</th>
|
||||
<th class="center">操作</th>
|
||||
{{else}}
|
||||
<th class="center w15p">创建时间</th>
|
||||
{{end}}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range $client := .clients}}
|
||||
<tr>
|
||||
<td class="center">{{$client.client_id}}</td>
|
||||
<td class="center">{{$client.name}}</td>
|
||||
<td class="center token">{{$client.token}}</td>
|
||||
<td class="center">
|
||||
{{if eq $client.user_id "0"}} <span class="label label-info">系统</span> {{else}} {{$client.user_id}} {{end}}
|
||||
</td>
|
||||
{{if eq $client.user_id "0"}}
|
||||
<td class="center">{{$client.local_host}}:{{$client.local_port}}</td>
|
||||
<td class="center">
|
||||
{{dateFormat $client.create_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
<td class="center">
|
||||
<a name="edit" href="/web/client/edit?client_id={{$client.client_id}}"><i class="glyphicon glyphicon-pencil"> </i>修改</a>
|
||||
<a data-toggle="confirmation" data-placement="left" data-title="确定重置token吗?(Client会被下线)" href="/web/client/reset?client_id={{$client.client_id}}"><i class="glyphicon glyphicon-refresh"> </i>重置</a>
|
||||
<a name="delete" data-toggle="confirmation" data-placement="left" data-title="确定删除吗?" href="/web/client/delete?client_id={{$client.client_id}}"><i class="glyphicon glyphicon-remove"> </i>删除</a>
|
||||
</td>
|
||||
{{else}}
|
||||
<td class="center">
|
||||
{{dateFormat $client.create_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
{{end}}
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="panel-footer pagebar">
|
||||
<div class="pull-right">{{str2html .page}}</div>
|
||||
<div style="clear:both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
<style>
|
||||
.forx {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
{{$cluster:=.cluster}} {{$regions:=.regions}}
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<form class="form-horizontal ajaxform" ajaxSuccess="success" ajaxAlways="always" method="post" action="/web/cluster/{{.action}}">
|
||||
<input type="hidden" name="cluster_id" value="{{$cluster.cluster_id}}">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>名称</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="name" class="form-control" value="{{$cluster.name}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * 请将汉字限制在15个以内</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>IP(内)</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="ip" class="form-control" value="{{$cluster.ip}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>区域</label>
|
||||
<div class="col-sm-4">
|
||||
<select name="region_id" class="form-control" default="{{$cluster.region_id}}">
|
||||
<option value="">请选择区域</option>
|
||||
{{range $k,$item := $regions}}
|
||||
<option value="{{$item.region_id}}">{{$item.parent}} -> {{$item.name}}</option>
|
||||
{{end}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-success">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,55 @@
|
||||
{{$regions:=.regions}} {{$clusters:=.clusters}}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w5p">ID</th>
|
||||
<th class="center w15p">区域</th>
|
||||
<th class="center w10p">名称</th>
|
||||
<th class="center w10p">IP</th>
|
||||
<th class="center w8p">SYSCONN</th>
|
||||
<th class="center w5p">CONN</th>
|
||||
<th class="center w7p">网速</th>
|
||||
<th class="center w15p">更新时间</th>
|
||||
<th class="center w5p">状态</th>
|
||||
<th class="center">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range $k,$region:=$regions}} {{range $cluster := $clusters}} {{if eq $region.region_id $cluster.region_id}}
|
||||
<tr>
|
||||
<td class="center">{{$cluster.cluster_id}}</td>
|
||||
<td class="center">
|
||||
{{$region.parent}}:{{$region.name}}
|
||||
</td>
|
||||
<td class="center">{{$cluster.name}}</td>
|
||||
<td class="center">{{$cluster.ip}}</td>
|
||||
<td class="center">{{$cluster.system_conn_number}}</td>
|
||||
<td class="center">{{$cluster.tunnel_conn_number}}</td>
|
||||
<td class="center">{{$cluster.bandwidth_human}}/s</td>
|
||||
<td class="center">
|
||||
{{dateFormat $cluster.update_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
<td class="center">
|
||||
{{if eq $cluster.is_disable "0"}}
|
||||
<span class="label label-success">正常</span> {{else}}
|
||||
<span class="label label-danger">禁用</span> {{end}}
|
||||
</td>
|
||||
<td class="center">
|
||||
<a name="edit" href="/web/cluster/statistic?cluster_id={{$cluster.cluster_id}}"><i class="glyphicon glyphicon-pencil"> </i>统计</a>
|
||||
<a name="edit" href="/web/cluster/edit?cluster_id={{$cluster.cluster_id}}"><i class="glyphicon glyphicon-pencil"> </i>修改</a>
|
||||
<a name="delete" data-toggle="confirmation" data-placement="left" data-title="确定删除吗?" href="/web/cluster/delete?cluster_id={{$cluster.cluster_id}}"><i class="glyphicon glyphicon-remove"> </i>删除</a> {{if eq $cluster.is_disable "0"}}
|
||||
<a name="forbidden" data-toggle="confirmation" data-placement="left" data-title="确定禁用吗?" href="/web/cluster/forbidden?cluster_id={{$cluster.cluster_id}}"><i class="fa fa-ban"> </i>禁用</a> {{else}}
|
||||
<a name="review" data-toggle="confirmation" data-placement="left" data-title="确定恢复吗?" href="/web/cluster/review?cluster_id={{$cluster.cluster_id}}"><i class="glyphicon glyphicon-ok"> </i>恢复</a> {{end}}
|
||||
</td>
|
||||
</tr>
|
||||
{{end}} {{end}} {{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="panel-footer">
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,429 @@
|
||||
<table class="table table-bordered table-hover">
|
||||
<caption class="h3">系统全局统计</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w15p">系统连接数</th>
|
||||
<th class="center w15p">Cluster连接数</th>
|
||||
<th class="center w15p">网速</th>
|
||||
<th class="center w15p">更新时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="system">
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table class="table table-bordered table-hover">
|
||||
<caption class="h3">隧道全局统计</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w5p">Tunnels</th>
|
||||
<th class="center w5p">Servers</th>
|
||||
<th class="center w5p">Clients</th>
|
||||
<th class="center w10p">Connections</th>
|
||||
<th class="center w20p">Upload</th>
|
||||
<th class="center w20p">Download</th>
|
||||
<th class="center w20p">Total</th>
|
||||
<th class="center w15p">更新时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="total">
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table class="table table-bordered table-hover">
|
||||
<caption class="h3">隧道统计<small>速度排列,前20个</small></caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w8p">TunnelID</th>
|
||||
<th class="center w10p">Connections</th>
|
||||
<th class="center w20p">Upload</th>
|
||||
<th class="center w25p">Download</th>
|
||||
<th class="center w25p">Total</th>
|
||||
<th class="center w12p">Limit</th>
|
||||
<th class="center w15p">更新时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="list">
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table class="table table-bordered table-hover">
|
||||
<caption class="h3">隧道统计<small>连接数排列,前20个</small></caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w8p">TunnelID</th>
|
||||
<th class="center w10p">Connections</th>
|
||||
<th class="center w20p">Upload</th>
|
||||
<th class="center w25p">Download</th>
|
||||
<th class="center w25p">Total</th>
|
||||
<th class="center w12p">Limit</th>
|
||||
<th class="center w15p">更新时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="list-conn">
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
<script>
|
||||
var clasterID = '{{$.clusterID}}';
|
||||
$(function() {
|
||||
var req = function(lastData) {
|
||||
$.post("/web/cluster/statistic", {
|
||||
cluster_id: clasterID
|
||||
}, function(data) {
|
||||
if (!data.code) {
|
||||
return
|
||||
}
|
||||
data = data.data
|
||||
if (!lastData) {
|
||||
lastData = data
|
||||
}
|
||||
systemRender(lastData, data);
|
||||
totalRender(lastData, data);
|
||||
listRender(lastData, data,false);
|
||||
listRender(lastData, data,true);
|
||||
setTimeout(function() {
|
||||
req(data)
|
||||
}, interval * 1000)
|
||||
}, "json");
|
||||
}
|
||||
req(null);
|
||||
});
|
||||
var interval = 3
|
||||
var listShowLimit = 20
|
||||
|
||||
function totalRender(lastData, data) {
|
||||
var total = data.Total.UploadBytes + data.Total.DownloadBytes;
|
||||
var lastTotal = lastData.Total.UploadBytes + lastData.Total.DownloadBytes;
|
||||
var lastUploadBytes = lastData.Total.UploadBytes
|
||||
var lastDownloadBytes = lastData.Total.DownloadBytes
|
||||
var uploadSpeed = humanFileSize(parseInt((data.Total.UploadBytes - lastUploadBytes) / interval)) + "/s"
|
||||
var downloadSpeed = humanFileSize(parseInt((data.Total.DownloadBytes - lastDownloadBytes) / interval)) + "/s"
|
||||
var totalSpeed = humanFileSize(parseInt((data.Total.UploadBytes + data.Total.DownloadBytes - lastTotal) / interval)) + "/s"
|
||||
|
||||
var html = '<tr>\
|
||||
<td class="center">' + data.Total.Tunnels + '</td>\
|
||||
<td class="center">' + data.Total.Servers + '</td>\
|
||||
<td class="center">' + data.Total.Clients + '</td>\
|
||||
<td class="center">' + data.Total.Connections + '</td>\
|
||||
<td class="center">' + data.Total.UploadBytes + " / " + humanFileSize(data.Total.UploadBytes) + " (" + uploadSpeed + ')</td>\
|
||||
<td class="center">' + data.Total.DownloadBytes + " / " + humanFileSize(data.Total.DownloadBytes) + " (" + downloadSpeed + ')</td>\
|
||||
<td class="center">' + total + " / " + humanFileSize(total) + " (" + totalSpeed + ')</td>\
|
||||
<td class="center">' + date("Y/m/d H:i:s", new Date().getTime() / 1000) + '</td>\
|
||||
</tr>';
|
||||
$(".total").html(html);
|
||||
|
||||
}
|
||||
|
||||
function listRender(lastData, data,isConn) {
|
||||
if(isConn){
|
||||
$(".list-conn").html("");
|
||||
}else{
|
||||
$(".list").html("");
|
||||
}
|
||||
var html = "";
|
||||
var list = sortMap(lastData.Traffic, data.Traffic, listShowLimit,isConn)
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
var TunnelID = list[i]["TunnelID"]
|
||||
var item = data.Traffic[TunnelID]
|
||||
var lastItem = lastData.Traffic[TunnelID]
|
||||
if (!lastItem) {
|
||||
continue;
|
||||
}
|
||||
var total = item["positive"] + item["negative"];
|
||||
var lastTotal = lastItem["positive"] + lastItem["negative"];
|
||||
var lastUploadBytes = lastItem["positive"];
|
||||
var lastDownloadBytes = lastItem["negative"];
|
||||
var uploadSpeed = humanFileSize(parseInt((item["positive"] - lastUploadBytes) / interval));
|
||||
var downloadSpeed = humanFileSize(parseInt((item["negative"] - lastDownloadBytes) / interval));
|
||||
var totalSpeed = humanFileSize(parseInt((total - lastTotal) / interval));
|
||||
var conns = item["connections"];
|
||||
html += '<tr>\
|
||||
<td class="center">' + TunnelID + '</td>\
|
||||
<td class="center">' + conns + '</td>\
|
||||
<td class="center">' + item["positive"] + " / " + humanFileSize(item["positive"]) + " (" + uploadSpeed + '/s)</td>\
|
||||
<td class="center">' + item["negative"] + " / " + humanFileSize(item["negative"]) + " (" + downloadSpeed + '/s)</td>\
|
||||
<td class="center">' + total + " / " + humanFileSize(total) + " (" + totalSpeed + '/s)</td>\
|
||||
<td class="center">' + item["limit"] + " / " + humanFileSize(item["limit"]) + '</td>\
|
||||
<td class="center">' + date("Y/m/d H:i:s", new Date().getTime() / 1000) + '</td>\
|
||||
</tr>';
|
||||
}
|
||||
if (html) {
|
||||
if(isConn){
|
||||
$(".list-conn").html(html);
|
||||
}else{
|
||||
$(".list").html(html);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function systemRender(lastData, data) {
|
||||
var sysconn = data.cluster.system_conn_number;
|
||||
var clusterconn = data.cluster.tunnel_conn_number;
|
||||
var speed = humanFileSize(parseInt(data.cluster.bandwidth)) + "/s"
|
||||
var updatetime = data.cluster.update_time;
|
||||
var html = '<tr>\
|
||||
<td class="center">' + sysconn + '</td>\
|
||||
<td class="center">' + clusterconn + '</td>\
|
||||
<td class="center">' + speed + '</td>\
|
||||
<td class="center">' + date("Y/m/d H:i:s", updatetime) + '</td>\
|
||||
</tr>';
|
||||
$(".system").html(html);
|
||||
}
|
||||
|
||||
function humanFileSize(size) {
|
||||
var i = parseInt(Math.floor(Math.log(size) / Math.log(1024)));
|
||||
i = size > 0 ? i : 0;
|
||||
return (size / Math.pow(1024, i)).toFixed(2) * 1 + ['B', 'KB', 'MB', 'GB', 'TB'][i];
|
||||
}
|
||||
|
||||
function sortMap(lastTraffic, traffic, limit,isConn) {
|
||||
var TunnelIDMap = {}
|
||||
var totalMap = {}
|
||||
for (var TunnelID in traffic) {
|
||||
if (!traffic.hasOwnProperty(TunnelID)) {
|
||||
continue;
|
||||
}
|
||||
var total =0
|
||||
var p = 0
|
||||
if (lastTraffic[TunnelID]) {
|
||||
if(!isConn){
|
||||
p = lastTraffic[TunnelID]["positive"] + lastTraffic[TunnelID]["negative"];
|
||||
total= traffic[TunnelID]["positive"] + traffic[TunnelID]["negative"] - p;
|
||||
}else{
|
||||
total=traffic[TunnelID]["connections"];
|
||||
}
|
||||
}
|
||||
TunnelIDMap[TunnelID] = total
|
||||
totalMap[total] = true
|
||||
}
|
||||
var totalArr = []
|
||||
for (var total in totalMap) {
|
||||
if (!totalMap.hasOwnProperty(total)) {
|
||||
continue;
|
||||
}
|
||||
totalArr.push(total)
|
||||
}
|
||||
totalArr = totalArr.sort(function(a, b) {
|
||||
return b - a;
|
||||
});
|
||||
var newTraffic = []
|
||||
for (var i = 0; i < totalArr.length; i++) {
|
||||
for (var TunnelID in TunnelIDMap) {
|
||||
if (!TunnelIDMap.hasOwnProperty(TunnelID)) {
|
||||
continue;
|
||||
}
|
||||
if (totalArr[i] == TunnelIDMap[TunnelID]) {
|
||||
var item = traffic[TunnelID]
|
||||
item["TunnelID"] = TunnelID
|
||||
newTraffic.push(item)
|
||||
}
|
||||
}
|
||||
}
|
||||
return newTraffic.slice(0, limit)
|
||||
}
|
||||
|
||||
function date(format, timestamp) {
|
||||
var that = this;
|
||||
var jsdate, f;
|
||||
// Keep this here (works, but for code commented-out below for file size reasons)
|
||||
// var tal= [];
|
||||
var txt_words = [
|
||||
'Sun', 'Mon', 'Tues', 'Wednes', 'Thurs', 'Fri', 'Satur',
|
||||
'January', 'February', 'March', 'April', 'May', 'June',
|
||||
'July', 'August', 'September', 'October', 'November', 'December'
|
||||
];
|
||||
// trailing backslash -> (dropped)
|
||||
// a backslash followed by any character (including backslash) -> the character
|
||||
// empty string -> empty string
|
||||
var formatChr = /\\?(.?)/gi;
|
||||
var formatChrCb = function(t, s) {
|
||||
return f[t] ? f[t]() : s;
|
||||
};
|
||||
var _pad = function(n, c) {
|
||||
n = String(n);
|
||||
while (n.length < c) {
|
||||
n = '0' + n;
|
||||
}
|
||||
return n;
|
||||
};
|
||||
f = {
|
||||
// Day
|
||||
d: function() { // Day of month w/leading 0; 01..31
|
||||
return _pad(f.j(), 2);
|
||||
},
|
||||
D: function() { // Shorthand day name; Mon...Sun
|
||||
return f.l()
|
||||
.slice(0, 3);
|
||||
},
|
||||
j: function() { // Day of month; 1..31
|
||||
return jsdate.getDate();
|
||||
},
|
||||
l: function() { // Full day name; Monday...Sunday
|
||||
return txt_words[f.w()] + 'day';
|
||||
},
|
||||
N: function() { // ISO-8601 day of week; 1[Mon]..7[Sun]
|
||||
return f.w() || 7;
|
||||
},
|
||||
S: function() { // Ordinal suffix for day of month; st, nd, rd, th
|
||||
var j = f.j();
|
||||
var i = j % 10;
|
||||
if (i <= 3 && parseInt((j % 100) / 10, 10) == 1) {
|
||||
i = 0;
|
||||
}
|
||||
return ['st', 'nd', 'rd'][i - 1] || 'th';
|
||||
},
|
||||
w: function() { // Day of week; 0[Sun]..6[Sat]
|
||||
return jsdate.getDay();
|
||||
},
|
||||
z: function() { // Day of year; 0..365
|
||||
var a = new Date(f.Y(), f.n() - 1, f.j());
|
||||
var b = new Date(f.Y(), 0, 1);
|
||||
return Math.round((a - b) / 864e5);
|
||||
},
|
||||
|
||||
// Week
|
||||
W: function() { // ISO-8601 week number
|
||||
var a = new Date(f.Y(), f.n() - 1, f.j() - f.N() + 3);
|
||||
var b = new Date(a.getFullYear(), 0, 4);
|
||||
return _pad(1 + Math.round((a - b) / 864e5 / 7), 2);
|
||||
},
|
||||
|
||||
// Month
|
||||
F: function() { // Full month name; January...December
|
||||
return txt_words[6 + f.n()];
|
||||
},
|
||||
m: function() { // Month w/leading 0; 01...12
|
||||
return _pad(f.n(), 2);
|
||||
},
|
||||
M: function() { // Shorthand month name; Jan...Dec
|
||||
return f.F()
|
||||
.slice(0, 3);
|
||||
},
|
||||
n: function() { // Month; 1...12
|
||||
return jsdate.getMonth() + 1;
|
||||
},
|
||||
t: function() { // Days in month; 28...31
|
||||
return (new Date(f.Y(), f.n(), 0))
|
||||
.getDate();
|
||||
},
|
||||
|
||||
// Year
|
||||
L: function() { // Is leap year?; 0 or 1
|
||||
var j = f.Y();
|
||||
return j % 4 === 0 & j % 100 !== 0 | j % 400 === 0;
|
||||
},
|
||||
o: function() { // ISO-8601 year
|
||||
var n = f.n();
|
||||
var W = f.W();
|
||||
var Y = f.Y();
|
||||
return Y + (n === 12 && W < 9 ? 1 : n === 1 && W > 9 ? -1 : 0);
|
||||
},
|
||||
Y: function() { // Full year; e.g. 1980...2010
|
||||
return jsdate.getFullYear();
|
||||
},
|
||||
y: function() { // Last two digits of year; 00...99
|
||||
return f.Y()
|
||||
.toString()
|
||||
.slice(-2);
|
||||
},
|
||||
|
||||
// Time
|
||||
a: function() { // am or pm
|
||||
return jsdate.getHours() > 11 ? 'pm' : 'am';
|
||||
},
|
||||
A: function() { // AM or PM
|
||||
return f.a()
|
||||
.toUpperCase();
|
||||
},
|
||||
B: function() { // Swatch Internet time; 000..999
|
||||
var H = jsdate.getUTCHours() * 36e2;
|
||||
// Hours
|
||||
var i = jsdate.getUTCMinutes() * 60;
|
||||
// Minutes
|
||||
var s = jsdate.getUTCSeconds(); // Seconds
|
||||
return _pad(Math.floor((H + i + s + 36e2) / 86.4) % 1e3, 3);
|
||||
},
|
||||
g: function() { // 12-Hours; 1..12
|
||||
return f.G() % 12 || 12;
|
||||
},
|
||||
G: function() { // 24-Hours; 0..23
|
||||
return jsdate.getHours();
|
||||
},
|
||||
h: function() { // 12-Hours w/leading 0; 01..12
|
||||
return _pad(f.g(), 2);
|
||||
},
|
||||
H: function() { // 24-Hours w/leading 0; 00..23
|
||||
return _pad(f.G(), 2);
|
||||
},
|
||||
i: function() { // Minutes w/leading 0; 00..59
|
||||
return _pad(jsdate.getMinutes(), 2);
|
||||
},
|
||||
s: function() { // Seconds w/leading 0; 00..59
|
||||
return _pad(jsdate.getSeconds(), 2);
|
||||
},
|
||||
u: function() { // Microseconds; 000000-999000
|
||||
return _pad(jsdate.getMilliseconds() * 1000, 6);
|
||||
},
|
||||
|
||||
// Timezone
|
||||
e: function() { // Timezone identifier; e.g. Atlantic/Azores, ...
|
||||
// The following works, but requires inclusion of the very large
|
||||
// timezone_abbreviations_list() function.
|
||||
/* return that.date_default_timezone_get();
|
||||
*/
|
||||
throw 'Not supported (see source code of date() for timezone on how to add support)';
|
||||
},
|
||||
I: function() { // DST observed?; 0 or 1
|
||||
// Compares Jan 1 minus Jan 1 UTC to Jul 1 minus Jul 1 UTC.
|
||||
// If they are not equal, then DST is observed.
|
||||
var a = new Date(f.Y(), 0);
|
||||
// Jan 1
|
||||
var c = Date.UTC(f.Y(), 0);
|
||||
// Jan 1 UTC
|
||||
var b = new Date(f.Y(), 6);
|
||||
// Jul 1
|
||||
var d = Date.UTC(f.Y(), 6); // Jul 1 UTC
|
||||
return ((a - c) !== (b - d)) ? 1 : 0;
|
||||
},
|
||||
O: function() { // Difference to GMT in hour format; e.g. +0200
|
||||
var tzo = jsdate.getTimezoneOffset();
|
||||
var a = Math.abs(tzo);
|
||||
return (tzo > 0 ? '-' : '+') + _pad(Math.floor(a / 60) * 100 + a % 60, 4);
|
||||
},
|
||||
P: function() { // Difference to GMT w/colon; e.g. +02:00
|
||||
var O = f.O();
|
||||
return (O.substr(0, 3) + ':' + O.substr(3, 2));
|
||||
},
|
||||
T: function() {
|
||||
return 'PRC';
|
||||
},
|
||||
Z: function() { // Timezone offset in seconds (-43200...50400)
|
||||
return -jsdate.getTimezoneOffset() * 60;
|
||||
},
|
||||
|
||||
// Full Date/Time
|
||||
c: function() { // ISO-8601 date.
|
||||
return 'Y-m-d\\TH:i:sP'.replace(formatChr, formatChrCb);
|
||||
},
|
||||
r: function() { // RFC 2822
|
||||
return 'D, d M Y H:i:s O'.replace(formatChr, formatChrCb);
|
||||
},
|
||||
U: function() { // Seconds since UNIX epoch
|
||||
return jsdate / 1000 | 0;
|
||||
}
|
||||
};
|
||||
this.date = function(format, timestamp) {
|
||||
that = this;
|
||||
jsdate = (timestamp === undefined ? new Date() : // Not provided
|
||||
(timestamp instanceof Date) ? new Date(timestamp) : // JS Date()
|
||||
new Date(timestamp * 1000) // UNIX timestamp (auto-convert to int)
|
||||
);
|
||||
return format.replace(formatChr, formatChrCb);
|
||||
};
|
||||
return this.date(format, timestamp);
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,71 @@
|
||||
<style>
|
||||
.btn-warning,
|
||||
.label-warning,
|
||||
.progress-bar-warning {
|
||||
color: white;
|
||||
}
|
||||
</style>
|
||||
{{$conns:=.conns}}
|
||||
|
||||
<div class="panel panel-default" style="margin-bottom:80px;">
|
||||
<form action="/web/conn/list" method="get">
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-md-5"></div>
|
||||
<div class="col-md-2">
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<select class="form-control" name="col">
|
||||
<option value="user_id">UserID</option>
|
||||
<option value="cluster_id">ClusterID</option>
|
||||
<option value="server_id">ServerID</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<input class="form-control" name="keyword" type="text" placeholder="">
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-default"><i class="glyphicon glyphicon-search"></i></button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w5p">隧道ID</th>
|
||||
<th class="center w10p">ClusterID</th>
|
||||
<th class="center w5p">ServerID</th>
|
||||
<th class="center w5p">UserID</th>
|
||||
<th class="center w5p"><a href="?orderby=count&col={{$.col}}&keyword={{$.keyword}}&page={{$.p}}" title="连接数倒序排序">连接数</a></th>
|
||||
<th class="center w10p"><a href="?orderby=upload&col={{$.col}}&keyword={{$.keyword}}&page={{$.p}}" title="上传速度倒序排序">上传速度</a></th>
|
||||
<th class="center w10p"><a href="?orderby=download&col={{$.col}}&keyword={{$.keyword}}&page={{$.p}}" title="下载速度倒序排序">下载速度</a></th>
|
||||
<th class="center w10p"><a href="?orderby=update_time&col={{$.col}}&keyword={{$.keyword}}&page={{$.p}}" title="更新时间倒序排序">更新时间</a></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range $conn := .conns}}
|
||||
<tr>
|
||||
<td class="center">{{$conn.tunnel_id}}</td>
|
||||
<td class="center">{{$conn.cluster_id}}</td>
|
||||
<td class="center">{{$conn.server_id}}</td>
|
||||
<td class="center">{{$conn.user_id}}</td>
|
||||
<td class="center">{{$conn.count}}</td>
|
||||
<td class="center">{{$conn.upload}}</td>
|
||||
<td class="center">{{$conn.download}}</td>
|
||||
<td class="center">
|
||||
{{dateFormat $conn.update_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="panel-footer pagebar">
|
||||
<div class="pull-right">{{str2html .page}}</div>
|
||||
<div style="clear:both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
<style>
|
||||
.forx {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
{{$ip_list:=.ip_list}} {{$regions:=.regions}}
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<form class="form-horizontal ajaxform" ajaxSuccess="success" ajaxAlways="always" method="post" action="/web/IpList/{{.action}}">
|
||||
<input type="hidden" name="ip_list_id" value="{{$ip_list.ip_list_id}}">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>IP</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="ip" class="form-control" value="{{$ip_list.ip}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>类型</label>
|
||||
<div class="col-sm-4">
|
||||
<select name="cs_type" class="form-control" default="{{$ip_list.cs_type}}">
|
||||
<option value="server">Server</option>
|
||||
<option value="client">Client</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>访问控制</label>
|
||||
<div class="col-sm-4">
|
||||
<select name="is_forbidden" class="form-control" default="{{$ip_list.is_forbidden}}">
|
||||
<option value="1">禁止</option>
|
||||
<option value="0">允许</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-success">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,67 @@
|
||||
{{$ip_lists:=.ip_lists}}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<form action="/web/IpList/list" method="get">
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-md-5"></div>
|
||||
<div class="col-md-3">
|
||||
<select class="form-control" name="type">
|
||||
<option value="ip">IP</option>
|
||||
<option value="cs_type">类型[server|client]</option>
|
||||
<option value="is_forbidden">访问控制[0禁止|1允许]</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<input class="form-control" name="id" type="text" placeholder="">
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-default"><i class="glyphicon glyphicon-search"></i></button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w5p">ID</th>
|
||||
<th class="center w15p">IP</th>
|
||||
<th class="center w10p">类型</th>
|
||||
<th class="center w15p">访问控制</th>
|
||||
<th class="center w15p">创建时间</th>
|
||||
<th class="center w15p">更新时间</th>
|
||||
<th class="center">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range $ip_list := $ip_lists}}
|
||||
<tr>
|
||||
<td class="center">{{$ip_list.ip_list_id}}</td>
|
||||
<td class="center">{{$ip_list.ip}}</td>
|
||||
<td class="center">{{$ip_list.cs_type}}</td>
|
||||
<td class="center">{{if eq $ip_list.is_forbidden "1"}}
|
||||
<span class="label label-warning">禁止</span> {{else}}
|
||||
<span class="label label-success">允许</span> {{end}}
|
||||
</td>
|
||||
<td class="center">
|
||||
{{dateFormat $ip_list.create_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
<td class="center">
|
||||
{{dateFormat $ip_list.update_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
<td class="center">
|
||||
<a name="edit" href="/web/IpList/edit?ip_list_id={{$ip_list.ip_list_id}}"><i class="glyphicon glyphicon-pencil"> </i>修改</a>
|
||||
<a name="delete" data-toggle="confirmation" data-placement="left" data-title="确定删除吗?" href="/web/IpList/delete?ip_list_id={{$ip_list.ip_list_id}}"><i class="glyphicon glyphicon-remove"> </i>删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="panel-footer">
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,65 @@
|
||||
{{$onlines:=.onlines}}
|
||||
|
||||
<div class="panel panel-default" style="margin-bottom:80px;">
|
||||
<form action="/web/online/list" method="get">
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-md-5"></div>
|
||||
<div class="col-md-2">
|
||||
<input class="form-control" name="cs" type="hidden" value="{{.cs}}">
|
||||
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<select class="form-control" name="type">
|
||||
<option value="cluster_id">ClusterID</option>
|
||||
<option value="user_id">UserID</option>
|
||||
<option value="cs_id">{{if eq $.cs "server"}}ServerID{{else}}ClientID{{end}}</option>
|
||||
<option value="cs_ip">上线IP</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<input class="form-control" name="keyword" type="text" placeholder="">
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-default"><i class="glyphicon glyphicon-search"></i></button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w5p">ID</th>
|
||||
<th class="center w5p">UserID</th>
|
||||
<th class="center w5p">ClusterID</th>
|
||||
<th class="center w5p">上线IP</th>
|
||||
<th class="center w10p">{{if eq $.cs "server"}}ServerID{{else}}ClientID{{end}}</th>
|
||||
<!-- <th class="center w10p">类型</th> -->
|
||||
<th class="center w15p">上线时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range $online := .onlines}}
|
||||
<tr>
|
||||
<td class="center">{{$online.online_id}}</td>
|
||||
<td class="center">{{$online.user_id}}{{if eq $online.user_id "0"}}<small> (系统)</small>{{end}}</td>
|
||||
<td class="center">{{$online.cluster_id}}</td>
|
||||
<td class="center">{{$online.cs_ip}}</td>
|
||||
<td class="center">{{$online.cs_id}}</td>
|
||||
<!-- <td class="center">{{$online.cs_type}}</td> -->
|
||||
<td class="center">
|
||||
{{dateFormat $online.create_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="panel-footer pagebar">
|
||||
<div class="pull-right">{{str2html .page}}</div>
|
||||
<div style="clear:both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
<style>
|
||||
.forx {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
{{$package:=.package}}
|
||||
<div class="panel panel-default" style="padding-bottom:200px;">
|
||||
<div class="panel-body">
|
||||
<form class="form-horizontal ajaxform" ajaxSuccess="success" ajaxAlways="always" method="post" action="/web/package/{{.action}}">
|
||||
<input type="hidden" name="package_id" value="{{$package.package_id}}">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>流量包来源</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="comment" class="form-control" value="{{$package.comment}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * 请将汉字限制在10个以内</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>UserID</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="user_id" class="form-control" value="{{$package.user_id}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>流量剩余字节数</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="bytes_left" class="form-control bytes_left" value="{{$package.bytes_left}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * <span class="bytes_left_human"></span></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>生效时间</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="start_time" class="form-control datepicker" value='{{if $package.start_time}}{{dateFormat $package.start_time "Y-m-d"}}{{end}}'>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>失效时间</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="end_time" class="form-control datepicker" value='{{if $package.end_time}}{{dateFormat $package.end_time "Y-m-d"}}{{end}}'>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-success">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$(function() {
|
||||
$('.datepicker').datepicker({
|
||||
language: 'zh-CN',
|
||||
format: 'yyyy-mm-dd',
|
||||
});
|
||||
var format = function() {
|
||||
var val = $(".bytes_left").val();
|
||||
$(".bytes_left_human").html(humanFileSize(val ? parseInt(val) : 0));
|
||||
};
|
||||
$(".bytes_left").keyup(function() {
|
||||
format();
|
||||
});
|
||||
format();
|
||||
});
|
||||
|
||||
function humanFileSize(size) {
|
||||
var i = parseInt(Math.floor(Math.log(size) / Math.log(1024)));
|
||||
i = size > 0 ? i : 0;
|
||||
return (size / Math.pow(1024, i)).toFixed(2) * 1 + ['B', 'KB', 'MB', 'GB', 'TB'][i];
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,78 @@
|
||||
<style>
|
||||
.btn-warning,
|
||||
.label-warning,
|
||||
.progress-bar-warning {
|
||||
color: white;
|
||||
}
|
||||
</style>
|
||||
{{$packages:=.packages}}
|
||||
|
||||
<div class="panel panel-default" style="margin-bottom:80px;">
|
||||
<form action="/web/package/list" method="get">
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-md-5"></div>
|
||||
<div class="col-md-2">
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<input class="form-control" name="keyword" type="text" placeholder="UserID">
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-default"><i class="glyphicon glyphicon-search"></i></button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w5p">ID</th>
|
||||
<th class="center w5p">UserID</th>
|
||||
<th class="center w10p">流量包大小</th>
|
||||
<th class="center w5p">已用流量</th>
|
||||
<th class="center w5p">状态</th>
|
||||
<th class="center w10p">生效时间</th>
|
||||
<th class="center w10p">过期时间</th>
|
||||
<th class="center w10p">更新时间</th>
|
||||
<th class="center w5p">获取方式</th>
|
||||
<th class="center w5p">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range $package := .packages}}
|
||||
<tr>
|
||||
<td class="center">{{$package.package_id}}</td>
|
||||
<td class="center">{{$package.user_id}}</td>
|
||||
<td class="center">{{$package.bytes_total_human}}</td>
|
||||
<td class="center">{{$package.bytes_use_human}}</td>
|
||||
<td class="center">{{str2html $package.status}}</td>
|
||||
<td class="center">
|
||||
{{dateFormat $package.start_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
<td class="center">
|
||||
{{dateFormat $package.end_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
<td class="center">
|
||||
{{dateFormat $package.update_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
<td class="center">{{$package.comment}}</td>
|
||||
<td class="center">
|
||||
<a name="edit" href="/web/package/edit?package_id={{$package.package_id}}"><i class="glyphicon glyphicon-pencil"> </i>修改</a>
|
||||
<!-- <a name="delete" data-toggle="confirmation" data-placement="left" data-title="确定删除吗?" href="/web/package/delete?package_id={{$package.package_id}}"><i class="glyphicon glyphicon-remove"> </i>删除</a> -->
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="panel-footer pagebar">
|
||||
<div class="pull-right">{{str2html .page}}</div>
|
||||
<div style="clear:both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
<style>
|
||||
.forx {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
{{$region:=.region}} {{$regions:=.regions}}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<form class="form-horizontal ajaxform" ajaxSuccess="success" ajaxAlways="always" method="post" action="/web/region/{{.action}}">
|
||||
<input type="hidden" name="region_id" value="{{$region.region_id}}">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>区域名称</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="name" class="form-control" value="{{$region.name}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * 请将汉字限制在15个以内</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>上级区域</label>
|
||||
<div class="col-sm-4">
|
||||
<select name="parent_id" class="form-control" default="{{$region.parent_id}}">
|
||||
<option value="0">顶级区域</option>
|
||||
{{range $k,$item := $regions}}
|
||||
{{if $region.region_id}}
|
||||
{{if ne $item.region_id $region.region_id}}
|
||||
<option value="{{$item.region_id}}">{{$item.name}}</option>
|
||||
{{end}}
|
||||
{{else}}
|
||||
<option value="{{$item.region_id}}">{{$item.name}}</option>
|
||||
{{end}}
|
||||
|
||||
{{end}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-success">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,14 @@
|
||||
{{$regions:=.regions}}
|
||||
|
||||
<div class="panel panel-default" style="margin-bottom:80px;">
|
||||
<div class="panel-body">
|
||||
{{range $region := $regions}} {{if eq $region.parent_id "0"}}
|
||||
<ul class="list-group w240 inline-group">
|
||||
<li class="list-group-item"><strong>{{$region.name}}</strong> <span class="pull-right"><a name='edit' href='/web/region/edit?region_id={{$region.region_id}}'>改</a> | <a data-toggle="confirmation" data-placement="bottom" data-title="确定删除吗?" href='/web/region/delete?region_id={{$region.region_id}}'>删</a></span></li>
|
||||
{{range $item := $regions}} {{if eq $item.parent_id $region.region_id}}
|
||||
<li class="list-group-item">{{$item.name}}<span class="pull-right"><a name='edit' href='/web/region/edit?region_id={{$item.region_id}}'>改</a> | <a data-toggle="confirmation" data-placement="bottom" data-title="确定删除吗?" href='/web/region/delete?region_id={{$item.region_id}}'>删</a></span></li>
|
||||
{{end}} {{end}}
|
||||
</ul>
|
||||
{{end}} {{end}}
|
||||
</div>
|
||||
</div>
|
||||
+91
@@ -0,0 +1,91 @@
|
||||
<style>
|
||||
.forx {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
{{$role:=.role}}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<form class="form-horizontal ajaxform" ajaxSuccess="success" ajaxAlways="always" method="post" action="/web/role/{{.action}}">
|
||||
<input type="hidden" name="role_id" value="{{$role.role_id}}">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>角色名称</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="name" class="form-control" value="{{$role.name}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * 请将汉字限制在15个以内</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>带宽</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="bandwidth" class="form-control bytes_limit" value="{{$role.bandwidth}}">
|
||||
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * 带宽限制,单位字节byte,0不限制</span>
|
||||
<br>
|
||||
<span class="bytes_limit_human"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-md-2 control-label"><span class="text-danger"> * </span>Server登录区域</label>
|
||||
<div class="col-md-4">
|
||||
<select class="form-control" name="server_area" size="1" default="{{$role.server_area}}">
|
||||
<option value="all">全部</option>
|
||||
<option value="china">中国</option>
|
||||
<option value="foreign">国外</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-md-2 control-label"><span class="text-danger"> * </span>Client登录区域</label>
|
||||
<div class="col-md-4">
|
||||
<select id="roles_selector" class="form-control" name="client_area" size="1" default="{{$role.client_area}}">
|
||||
<option value="all">全部</option>
|
||||
<option value="china">中国</option>
|
||||
<option value="foreign">国外</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-md-2 control-label"><span class="text-danger"> * </span>隧道模式</label>
|
||||
<div class="col-md-4">
|
||||
<label for="tunnel_mode01">普通
|
||||
<input {{if $.tunnel_mode_arr}} {{range $v:=$.tunnel_mode_arr}} {{if eq $v "0"}}checked{{end}} {{end}} {{end}} type="checkbox" id="tunnel_mode01" value="0" class="form-control" name="tunnel_mode">
|
||||
</label>
|
||||
<label for="tunnel_mode02">特殊
|
||||
<input {{if $.tunnel_mode_arr}} {{range $v:=$.tunnel_mode_arr}} {{if eq $v "2"}}checked{{end}} {{end}} {{end}} type="checkbox" id="tunnel_mode02" value="2" class="form-control" name="tunnel_mode">
|
||||
</label>
|
||||
<label for="tunnel_mode03">高级
|
||||
<input {{if $.tunnel_mode_arr}} {{range $v:=$.tunnel_mode_arr}} {{if eq $v "1"}}checked{{end}} {{end}} {{end}} type="checkbox" id="tunnel_mode03" value="1" class="form-control" name="tunnel_mode">
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-success">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$(function() {
|
||||
var format = function() {
|
||||
var val = $(".bytes_limit").val();
|
||||
$(".bytes_limit_human").html(humanFileSize(val ? parseInt(val) : 0));
|
||||
};
|
||||
$(".bytes_limit").keyup(function() {
|
||||
format();
|
||||
});
|
||||
format();
|
||||
});
|
||||
|
||||
function humanFileSize(size) {
|
||||
var i = parseInt(Math.floor(Math.log(size) / Math.log(1024)));
|
||||
i = size > 0 ? i : 0;
|
||||
return (size / Math.pow(1024, i)).toFixed(2) * 1 + ['B', 'KB', 'MB', 'GB', 'TB'][i];
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,48 @@
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w10p">ID</th>
|
||||
<th class="center w10p">角色名</th>
|
||||
<th class="center w10p">带宽限制</th>
|
||||
<th class="center w10p">Server区域</th>
|
||||
<th class="center w10p">Client区域</th>
|
||||
<th class="center w10p">隧道模式</th>
|
||||
<th class="center w15p">创建时间</th>
|
||||
<th class="center w20p">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range $role := .roles}}
|
||||
<tr>
|
||||
<td class="center">{{$role.role_id}}</td>
|
||||
<td class="center">{{$role.name}}</td>
|
||||
<td class="center">{{$role.bandwidth_human}}</td>
|
||||
<td class="center">
|
||||
{{if eq $role.server_area "china"}}中国{{end}} {{if eq $role.server_area "foreign"}}国外{{end}} {{if eq $role.server_area "all"}}全部{{end}}
|
||||
</td>
|
||||
<td class="center">
|
||||
{{if eq $role.client_area "china"}}中国{{end}} {{if eq $role.client_area "foreign"}}国外{{end}} {{if eq $role.client_area "all"}}全部{{end}}
|
||||
</td>
|
||||
<td class="center">
|
||||
{{$role.tunnel_mode_human}}
|
||||
</td>
|
||||
<td class="center">
|
||||
{{dateFormat $role.create_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
<td class="center">
|
||||
<a name="privilege" href="/web/role/regions?role_id={{$role.role_id}}"><i class="glyphicon glyphicon-lock"> </i>区域</a>
|
||||
<a name="edit" href="/web/role/edit?role_id={{$role.role_id}}"><i class="glyphicon glyphicon-pencil"> </i>修改</a>
|
||||
<a name="delete" data-toggle="confirmation" data-placement="left" data-title="确定删除吗?" href="/web/role/delete?role_id={{$role.role_id}}"><i class="glyphicon glyphicon-remove"> </i>删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="panel-footer">
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,44 @@
|
||||
<script src="/static/style/plugins/jquery.form.min.js"></script>
|
||||
<script src="/static/style/common/form.js"></script>
|
||||
{{$regions:=.regions}}
|
||||
<form method="post" class="ajaxform" action="/web/role/regions" ajaxPre="checkForm">
|
||||
<input type="hidden" name="role_id" value="{{.roleId}}">
|
||||
<div class="panel panel-default" style="margin-bottom:80px;">
|
||||
<div class="panel-body">
|
||||
{{range $region := $regions}} {{if eq $region.parent_id "0"}}
|
||||
<ul class="list-group w240 inline-group">
|
||||
<li class="list-group-item">
|
||||
<strong><input type="checkbox" class="region-group" style="margin-bottom:3px;" />
|
||||
{{$region.name}}</strong> <span class="pull-right"><a name='edit' href='/web/region/edit?region_id={{$region.region_id}}'>改</a> | <a data-toggle="confirmation" data-placement="bottom" data-title="确定删除吗?" href='/web/region/delete?region_id={{$region.region_id}}'>删</a></span>
|
||||
</li>
|
||||
{{range $item := $regions}} {{if eq $item.parent_id $region.region_id}}
|
||||
<li class="list-group-item">
|
||||
<input type="checkbox" class="region-id" {{range $k,$v:=$.regionIds}} {{if eq $v $item.region_id}}checked="checked" {{end}} {{end}} name="region-ids" style="margin-bottom:3px;" value="{{$item.region_id}}" /> {{$item.name}}
|
||||
|
||||
<span class="pull-right"><a name='edit' href='/web/region/edit?region_id={{$item.region_id}}'>改</a> | <a data-toggle="confirmation" data-placement="bottom" data-title="确定删除吗?" href='/web/region/delete?region_id={{$item.region_id}}'>删</a></span></li>
|
||||
{{end}} {{end}}
|
||||
</ul>
|
||||
{{end}} {{end}}
|
||||
<div style="width:90%;text-align:center;"><input type="submit" class="btn btn-primary save" value="保存"></div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script>
|
||||
function checkForm() {
|
||||
var regionIds = [];
|
||||
$(".region-id").each(function() {
|
||||
if (this.checked) {
|
||||
regionIds.push(this.value)
|
||||
}
|
||||
});
|
||||
return true
|
||||
}
|
||||
$(".region-group").click(function() {
|
||||
$(this).parent().parent().parent().find(".region-id").prop("checked", this.checked);
|
||||
});
|
||||
$(".region-group").each(function() {
|
||||
if ($(this).parent().parent().parent().find(".region-id").not(":checked").length == 0) {
|
||||
$(this).prop("checked", true)
|
||||
}
|
||||
});
|
||||
</script>
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
<style>
|
||||
.forx {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
{{$server:=.server}}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<form class="form-horizontal ajaxform" ajaxSuccess="success" ajaxAlways="always" method="post" action="/web/server/{{.action}}">
|
||||
<input type="hidden" name="server_id" value="{{$server.server_id}}">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>Server名称</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="name" class="form-control" value="{{$server.name}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * 请将汉字限制在15个以内</span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>UserID</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="user_id" class="form-control" value="{{$server.user_id}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * 留空为系统Server</span>
|
||||
</div>
|
||||
</div> -->
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-success">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,66 @@
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<i class="label label-default">类型</i>
|
||||
<a class="label {{if ne $.userID `0`}}label-danger{{else}}label-default{{end}}" href="/web/server/list">用户</a>
|
||||
<a class="label {{if eq $.userID `0`}}label-danger{{else}}label-default{{end}}" href="/web/server/list?user_id=0">系统</a>
|
||||
</div>
|
||||
{{if ne $.userID "0"}}
|
||||
<div class="col-md-3 pull-right">
|
||||
<form action="/web/server/list" method="get">
|
||||
<div class="input-group">
|
||||
<input class="form-control" name="user_id" type="text" placeholder="UserID">
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-default"><i class="glyphicon glyphicon-search"></i></button>
|
||||
</span>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w10p">ID</th>
|
||||
<th class="center w15p">名称</th>
|
||||
<th class="center w30p">Token</th>
|
||||
<th class="center w10p">UserID</th>
|
||||
<th class="center w15p">创建时间</th>
|
||||
{{if eq $.userID "0"}}
|
||||
<th class="center">操作</th>
|
||||
{{end}}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range $server := .servers}}
|
||||
<tr>
|
||||
<td class="center">{{$server.server_id}}</td>
|
||||
<td class="center">{{$server.name}}</td>
|
||||
<td class="center">{{$server.token}}</td>
|
||||
<td class="center">
|
||||
{{if eq $server.user_id "0"}} <span class="label label-info">系统</span> {{else}} {{$server.user_id}} {{end}}
|
||||
</td>
|
||||
<td class="center">
|
||||
{{dateFormat $server.create_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
|
||||
{{if eq $server.user_id "0"}}
|
||||
<td class="center">
|
||||
<a name="edit" href="/web/server/edit?server_id={{$server.server_id}}"><i class="glyphicon glyphicon-pencil"> </i>修改</a>
|
||||
<a data-toggle="confirmation" data-placement="left" data-title="确定重置token吗?(Server会被下线)" href="/web/server/reset?server_id={{$server.server_id}}"><i class="glyphicon glyphicon-refresh"> </i>重置</a>
|
||||
<a name="delete" data-toggle="confirmation" data-placement="left" data-title="确定删除吗?" href="/web/server/delete?server_id={{$server.server_id}}"><i class="glyphicon glyphicon-remove"> </i>删除</a>
|
||||
</td>
|
||||
{{end}}
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="panel-footer pagebar">
|
||||
<div class="pull-right">{{str2html .page}}</div>
|
||||
<div style="clear:both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,67 @@
|
||||
{{$tunnels:=.tunnels}}
|
||||
|
||||
<div class="panel panel-default" style="margin-bottom:80px;">
|
||||
<form action="/web/tunnel/list" method="get">
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-md-5"></div>
|
||||
<div class="col-md-3">
|
||||
<select class="form-control" name="type">
|
||||
<option value="user_id">用户ID</option>
|
||||
<option value="server_id">ServerID</option>
|
||||
<option value="client_id">ClientID</option>
|
||||
<option value="cluster_id">ClusterID</option>
|
||||
<option value="mode">模式[0普通|1高级|2特殊]</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<input class="form-control" name="id" type="text" placeholder="ID">
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-default"><i class="glyphicon glyphicon-search"></i></button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w5p">ID</th>
|
||||
<th class="center w5p">模式</th>
|
||||
<th class="center w5p">用户ID</th>
|
||||
<th class="center w5p">ServerID</th>
|
||||
<th class="center w5p">ClientID</th>
|
||||
<th class="center w5p">ClusterID</th>
|
||||
<th class="center w5p">协议</th>
|
||||
<th class="center w10p">监听</th>
|
||||
<th class="center w10p">本地</th>
|
||||
<th class="center w5p">带宽</th>
|
||||
<th class="center w15p">更新时间</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range $tunnel := .tunnels}}
|
||||
<tr>
|
||||
<td class="center">{{$tunnel.tunnel_id}}</td>
|
||||
<td class="center">{{if eq $tunnel.mode "0"}}普通{{else}}{{if eq $tunnel.mode "1"}}高级{{else}}特殊{{end}}{{end}}</td>
|
||||
<td class="center">{{$tunnel.user_id}}</td>
|
||||
<td class="center">{{$tunnel.server_id}}</td>
|
||||
<td class="center">{{$tunnel.client_id}}</td>
|
||||
<td class="center">{{$tunnel.cluster_id}}</td>
|
||||
<td class="center">{{$tunnel.protocol}}</td>
|
||||
<td class="center">{{$tunnel.server_listen_ip}}{{$tunnel.server_listen_port}}</td>
|
||||
<td class="center">{{$tunnel.client_local_host}}{{$tunnel.client_local_port}}</td>
|
||||
<td class="center">{{$tunnel.bandwidth_human}}</td>
|
||||
<td class="center">{{dateFormat $tunnel.update_time "Y-m-d H:i:s"}}</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="panel-footer pagebar">
|
||||
<div class="pull-right">{{str2html .page}}</div>
|
||||
<div style="clear:both;"></div>
|
||||
</div>
|
||||
</div>
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
<style>
|
||||
.forx {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.selectator_element {
|
||||
border-radius: 0;
|
||||
}
|
||||
</style>
|
||||
{{$user:=.user}}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<form class="form-horizontal ajaxform" ajaxSuccess="success" ajaxAlways="always" method="post" action="/web/user/{{.action}}">
|
||||
<input type="hidden" name="user_id" value="{{$user.user_id}}">
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>登录名</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="username" class="form-control" {{if eq .action "edit"}}disabled{{end}} value="{{$user.username}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * 请限制在15个字符以内</span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>昵称</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="nickname" class="form-control" value="{{$user.nickname}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>密码</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="password" name="password" class="form-control" value="">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>邮箱</label>
|
||||
<div class="col-sm-4">
|
||||
<input type="text" name="email" class="form-control" value="{{$user.email}}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<span class="text-danger"> * </span>
|
||||
</div>
|
||||
</div> -->
|
||||
<div class="form-group">
|
||||
<label class="col-md-2 control-label"><span class="text-danger"> * </span>角色</label>
|
||||
<div class="col-md-4">
|
||||
<select id="roles_selector" class="form-control" name="role_ids" size="1" multiple style="padding: 0;">
|
||||
{{range $role := .roles}}
|
||||
<option value="{{$role.role_id}}" {{if eq $role.is_default "1"}} selected {{end}}>{{$role.name}}</option>
|
||||
{{end}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-success">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
$(function() {
|
||||
$('#roles_selector').selectator({
|
||||
showAllOptionsOnFocus: true
|
||||
});
|
||||
})
|
||||
</script>
|
||||
@@ -0,0 +1,61 @@
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<form action="/web/user/list" method="get">
|
||||
<div class="col-md-3 col-md-offset-9">
|
||||
<div class="input-group">
|
||||
<input class="form-control" name="keyword" type="text" value="{{.keyword}}" placeholder="用户名">
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-search"></i></button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="center w8p">ID</th>
|
||||
<th class="center w11p">昵称</th>
|
||||
<th class="center w11p">登录名</th>
|
||||
<th class="center w20p">角色</th>
|
||||
<th class="center w15p">邮箱</th>
|
||||
<th class="center w8p">状态</th>
|
||||
<th class="center w11p">创建时间</th>
|
||||
<th class="center">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range $user := .users}}
|
||||
<tr>
|
||||
<td class="center">{{$user.user_id}}</td>
|
||||
<td class="center">{{$user.nickname}}</td>
|
||||
<td class="center">{{$user.username}}</td>
|
||||
<td>
|
||||
{{range $userId, $roleName := $.userRoles}} {{if eq $userId $user.user_id}} {{$roleName}} {{end}} {{end}}
|
||||
</td>
|
||||
<td class="center">{{$user.email}}</td>
|
||||
<td class="center">
|
||||
{{if eq $user.is_forbidden "0"}}
|
||||
<span class="label label-success">正常</span> {{else}}
|
||||
<span class="label label-danger">屏蔽</span> {{end}}
|
||||
</td>
|
||||
<td class="center">
|
||||
{{dateFormat $user.create_time "Y-m-d H:i:s"}}
|
||||
</td>
|
||||
<td class="center">
|
||||
<a name="edit" href="/web/user/edit?user_id={{$user.user_id}}"><i class="glyphicon glyphicon-pencil"> </i>修改</a> {{if eq $user.is_forbidden "0"}}
|
||||
<a name="forbidden" data-toggle="confirmation" data-placement="left" data-title="确定禁用吗?" href="/web/user/forbidden?user_id={{$user.user_id}}"><i class="glyphicon glyphicon-remove"> </i>禁用</a> {{else}}
|
||||
<a name="review" data-toggle="confirmation" data-placement="left" data-title="确定恢复吗?" href="/web/user/review?user_id={{$user.user_id}}"><i class="glyphicon glyphicon-ok"> </i>恢复</a> {{end}}
|
||||
</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="panel-footer pagebar">
|
||||
{{str2html .page}}
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user