This commit is contained in:
arraykeys
2019-08-08 17:13:34 +08:00
parent e8e5966a8c
commit f0bf2d5fec
2885 changed files with 1195993 additions and 12 deletions
+2
View File
@@ -0,0 +1,2 @@
<script>
</script>
+35
View File
@@ -0,0 +1,35 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="/static/index/jquery-2.1.4.min.js"></script>
<link rel="stylesheet" href="/static/index/fonts.googleapis.com.css">
<link rel="stylesheet" href="/static/style/awesome/css/font-awesome.min.css">
<!--bootstrap default theme-->
<!-- <link rel="stylesheet" href="/static/style/bootstrap/default/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/style/bootstrap/default/css/bootstrap-theme.min.css">
<script src="/static/style/bootstrap/default/js/bootstrap.min.js"></script> -->
<!--end-->
<!--bootstrap todc theme-->
<!-- <link rel="stylesheet" href="/static/style/bootstrap/todc/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/style/bootstrap/todc/css/bootstrap-theme.min.css">
<link rel="stylesheet" href="/static/style/bootstrap/todc/css/todc-bootstrap.min.css">
<script src="/static/style/bootstrap/todc/js/bootstrap.min.js"></script> -->
<!--end-->
<!--bootstrap google plus theme-->
<link rel="stylesheet" href="/static/style/bootstrap/default/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/style/bootstrap/googleplus/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/style/bootstrap/googleplus/css/styles.css">
<script src="/static/style/bootstrap/googleplus/js/bootstrap.min.js"></script>
<script src="/static/style/bootstrap/googleplus/js/scripts.js"></script>
<!--end-->
<!--common stuff-->
<script src="/static/style/plugins/notify.min.js"></script>
<script src="/static/style/plugins/bootstrap-confirmation.min.js"></script>
<script src="/static/style/common/common.js"></script>
<link rel="stylesheet" href="/static/style/common/common.css">
<!--end-->
+53
View File
@@ -0,0 +1,53 @@
<!DOCTYPE HTML>
<html>
<head>
<title>出错啦!</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="/static/index/jquery-2.1.4.min.js"></script>
<link rel="stylesheet" href="/static/index/fonts.googleapis.com.css">
<link rel="stylesheet" href="/static/index/common.css">
<link rel="stylesheet" href="/static/style/awesome/css/font-awesome.min.css">
<!--bootstrap google plus theme-->
<link rel="stylesheet" href="/static/style/bootstrap/default/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/style/bootstrap/googleplus/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/style/bootstrap/googleplus/css/styles.css">
<script src="/static/style/bootstrap/googleplus/js/bootstrap.min.js"></script>
<script src="/static/style/bootstrap/googleplus/js/scripts.js"></script>
<!--end-->
<!--common stuff-->
<script src="/static/style/plugins/notify.min.js"></script>
<script src="/static/style/plugins/bootstrap-confirmation.min.js"></script>
<script src="/static/style/common/common.js"></script>
<link rel="stylesheet" href="/static/style/common/common.css">
<!--end-->
</head>
<body>
<div class="panel panel-default">
<div class="panel-body">
<div class="alert alert-danger" role="alert">
<strong><span class="blue bigger-125">
<i class="ace-icon fa fa-random"></i>
</span></strong> 很抱歉,服务器返回错误!
</div>
<div class="space"></div>
<hr>
<div class="space"></div>
<div class="center">
<a href="javascript:history.back()" class="btn btn-default">
<i class="ace-icon fa fa-arrow-left"></i> 返回
</a>
<a target="_parent" href="/main/index" class="btn btn-primary">
<i class="ace-icon fa fa-tachometer"></i> 首页
</a>
</div>
</div>
</div>
</body>
</html>
+31
View File
@@ -0,0 +1,31 @@
<div class="panel panel-default">
<div class="panel-body">
<div class="alert alert-danger" role="alert">
<strong><span class="blue bigger-125">
<i class="ace-icon fa fa-random"></i>
</span></strong> 很抱歉,服务器返回错误!
</div>
<div class="space"></div>
<div>
<h4 class="lighter smaller">以下是具体的错误信息:</h4>
<ul class="list-unstyled spaced inline bigger-110 margin-15">
<li>
<i class="ace-icon fa fa-hand-o-right blue"></i>
<span class="text-danger">{{.errorMessage}}</span>
</li>
</ul>
</div>
<hr>
<div class="space"></div>
<div class="center">
<a href="javascript:history.back()" class="btn btn-default">
<i class="ace-icon fa fa-arrow-left"></i>
返回
</a>
<a target="_parent" href="/main/index" class="btn btn-primary">
<i class="ace-icon fa fa-tachometer"></i>
首页
</a>
</div>
</div>
</div>
+13
View File
@@ -0,0 +1,13 @@
<!DOCTYPE HTML>
<html>
<head>
<title>{{.title}}</title>
{{template "common/head.html" .}}
</head>
<body>
{{.LayoutContent}} {{template "common/foot.html" .}}
</body>
</html>
+24
View File
@@ -0,0 +1,24 @@
<!DOCTYPE HTML>
<html>
<head>
<title>{{.titles}}</title>
{{template "common/head.html" .}}
<script src="/static/style/plugins/jquery.form.min.js"></script>
<link rel="stylesheet" href="/static/style/plugins/icon/icon-selector.css">
<link rel="stylesheet" href="/static/style/plugins/selectaor/fm.selectator.jquery.css">
<script src="/static/style/plugins/icon/icon-selector.js"></script>
<script src="/static/style/plugins/selectaor/fm.selectator.jquery.js"></script>
<link rel="stylesheet" href="/static/style/plugins/datepicker/bootstrap-datepicker3.css">
<script src="/static/style/plugins/datepicker/bootstrap-datepicker.min.js"></script>
<script src="/static/style/plugins/datepicker/bootstrap-datepicker.zh-CN.min.js"></script>
</head>
<body>
{{.LayoutContent}} {{template "common/foot.html" .}}
<script src="/static/style/common/form.js"></script>
</body>
</html>
+225
View File
@@ -0,0 +1,225 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{{.title}}</title>
<link rel="shortcut icon" href="/static/index/favicon2.ico">
<style>
@font-face {
font-family: 'Exo';
font-style: normal;
font-weight: 200;
src: local('Exo ExtraLight'), local('Exo-ExtraLight'), url(/static/index/D3Kro_SQxlEekR5WQVBxG-vvDin1pK8aKteLpeZ5c0A.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
@font-face {
font-family: 'Exo';
font-style: normal;
font-weight: 400;
src: local('Exo Regular'), local('Exo-Regular'), url(/static/index/7V_Hf8uqhTnCHU5pdwV73A.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
body {
margin: 0;
padding: 0;
background: #fff;
color: #fff;
font-family: Arial;
font-size: 12px;
}
.body {
position: absolute;
top: -20px;
left: -20px;
right: 0px;
bottom: 0px;
width: auto;
height: auto;
background-image: url(/static/index/login-bg{{randInt 1 3}}.jpg);
background-size: cover;
-webkit-filter: blur(5px);
z-index: 0;
}
.grad {
position: absolute;
top: -20px;
left: -20px;
right: 0px;
bottom: 0px;
width: auto;
height: auto;
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(100%, rgba(0, 0, 0, 0.65)));
/* Chrome,Safari4+ */
z-index: 1;
opacity: 0.7;
}
.header {
position: absolute;
top: calc(50% - 35px);
left: calc(50% - 455px);
z-index: 2;
}
.header div {
float: left;
color: #fff;
font-family: 'Exo', sans-serif;
font-size: 35px;
font-weight: 200;
}
.header div span {
color: #5379fa !important;
}
.login {
position: absolute;
top: calc(50% - 75px);
left: calc(50% - 50px);
height: 150px;
width: 350px;
padding: 10px;
z-index: 2;
}
.login input[type=text] {
width: 250px;
height: 30px;
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.6);
border-radius: 2px;
color: #fff;
font-family: 'Exo', sans-serif;
font-size: 16px;
font-weight: 400;
padding: 4px;
}
.login input[type=password] {
width: 250px;
height: 30px;
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.6);
border-radius: 2px;
color: #fff;
font-family: 'Exo', sans-serif;
font-size: 16px;
font-weight: 400;
padding: 4px;
margin-top: 10px;
}
.login input[type=submit] {
width: 260px;
height: 35px;
background: #fff;
border: 1px solid #fff;
cursor: pointer;
border-radius: 2px;
color: #a18d6c;
font-family: 'Exo', sans-serif;
font-size: 16px;
font-weight: 400;
padding: 6px;
margin-top: 10px;
}
.login input[type=submit]:hover {
opacity: 0.8;
}
.login input[type=submit]:active {
opacity: 0.6;
}
.login input[type=text]:focus {
outline: none;
border: 1px solid rgba(255, 255, 255, 0.9);
}
.login input[type=password]:focus {
outline: none;
border: 1px solid rgba(255, 255, 255, 0.9);
}
.login input[type=submit] {
width: 252px;
}
::-webkit-input-placeholder {
color: rgba(255, 255, 255, 0.6);
}
::-moz-input-placeholder {
color: rgba(255, 255, 255, 0.6);
}
.login .captcha {
border: none;
width: 80px;
height: 28px;
margin-top: -2px;
}
.login input[type=text].captcha-value {
margin: 10px 10px 0 0;
width: 160px;
}
</style>
<script src="/static/index/prefixfree.min.js"></script>
</head>
<body>
<div class="body"></div>
<div class="grad"></div>
<div class="header">
<div>{{config "String" "sys.name" "" }}<span>Admin</span></div>
</div>
<br>
<form action="/login/login" class="ajaxform" ajaxSuccess="ajaxSuccess">
<div class="login">
<input type="text" placeholder="用户名" name="username" value="root"><br>
<input type="password" placeholder="密码" name="password" value="123abc"><br>
<input type="text" placeholder="验证码" name="captcha" class="captcha-value" value=""><img class="captcha" src="/login/captcha" /><br>
<input type="submit" value="Login">
</div>
</form>
<script src='/static/index/jquery-2.1.4.min.js'></script>
<script src="/static/style/plugins/notify.min.js"></script>
<script src="/static/style/plugins/jquery.form.min.js"></script>
<script src="/static/style/plugins/icon/icon-selector.js"></script>
<link rel="stylesheet" href="/static/style/plugins/icon/icon-selector.css">
<script src="/static/style/common/form.js"></script>
<script>
if (top != self) {
top.location = location;
}
$(".captcha").click(function() {
refreshCode();
});
function ajaxSuccess(data) {
if (!data.code) {
refreshCode();
}
}
function refreshCode() {
$(".captcha-value").val("")
$(".captcha").attr("src", "/login/captcha?_=" + (Math.random() + "").substring(2))
}
</script>
</body>
</html>
+255
View File
@@ -0,0 +1,255 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta charset="UTF-8">
<title>{{.title}}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<link rel="stylesheet" href="/static/index/bootstrap.min.css">
<link rel="stylesheet" href="/static/index/font-awesome.min.css">
<link rel="stylesheet" href="/static/index/fonts.googleapis.com.css">
<link rel="stylesheet" href="/static/index/ace.min.css" class="ace-main-stylesheet" id="main-ace-style">
<link rel="stylesheet" href="/static/index/ace-skins.min.css">
<link rel="stylesheet" href="/static/index/ace-rtl.min.css">
<script src="/static/index/ace-extra.min.js"></script>
<link rel="shortcut icon" href="/static/index/favicon2.ico">
<style>
ul.nav-list {
display: none;
}
ul.nav-list.showul {
display: block
}
.ace-save-state {
animation-duration: 10ms;
animation-delay: 0s;
animation-name: nodeInserted;
}
.nav.navbar-nav li:focus,
.nav.navbar-nav a:focus,
.navbar-header a:focus {
outline: none;
}
.nav-active {
background-color: rgb(40, 40, 40);
}
</style>
</head>
<body class="skin-3 no-skin">
<div id="navbar" class="navbar navbar-default ace-save-state navbar-fixed-top">
<div class="navbar-container ace-save-state" id="navbar-container">
<div class="navbar-header pull-left">
<a href="/main/index.html" class="navbar-brand">
<small>
<img width="26px" style="margin-top:-4px" src="/static/index/favicon.png">
{{config "String" "sys.name" ""}} Admin
</small>
</a>
</div>
<nav role="navigation" class="navbar-menu pull-left collapse navbar-collapse">
<ul class="nav navbar-nav">
{{range .navigators}}
<li>
<a href="javascript:void(0)">
<i class="ace-icon {{.icon}}"></i> {{.name}}
</a>
</li>
{{end}}
</ul>
</nav>
<div class="navbar-buttons navbar-header pull-right" role="navigation">
<ul class="nav ace-nav">
<li class="dark dropdown-modal">
<a data-toggle="dropdown" href="/static/index/#" class="dropdown-toggle">
<img class="nav-user-photo" src="/static/index/user.jpg" alt="Jason's Photo">
<span class="user-info">
<small>Welcome,</small>
{{.loginUser.given_name}}
</span>
<i class="ace-icon fa fa-caret-down"></i>
</a>
<ul class="user-menu dropdown-menu-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close">
<li class="divider"></li>
<li>
<a href="/login/logout.html">
<i class="ace-icon fa fa-power-off"></i> Logout
</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- /.navbar-container -->
</div>
<div class="main-container ace-save-state" id="main-container">
<div id="sidebar" class="sidebar responsive ace-save-state sidebar-fixed sidebar-scroll" data-sidebar="true" data-sidebar-scroll="true" data-sidebar-hover="true">
{{$navigators := .navigators}} {{$menus := .menus}} {{$controllers := .controllers}} {{range $i,$nav := $navigators}}
<ul class="nav nav-list {{if eq $i 0}}showul{{end}}">
{{range $menu := $menus}} {{if eq $nav.privilege_id $menu.parent_id}}
<li class="">
<a href="#" class="dropdown-toggle">
<i class="menu-icon {{.icon}}"></i>
<span class="menu-text">
{{$menu.name}}
</span>
<b class="arrow fa fa-angle-down"></b>
</a>
<b class="arrow"></b>
<ul class="submenu">
{{range $controller := $controllers}} {{if eq $menu.privilege_id $controller.parent_id}}
<li class="">
<a href="/{{$controller.controller}}/{{$controller.action}}">
<i class="menu-icon fa fa-caret-right"></i> {{$controller.name}}
</a>
<b class="arrow"></b>
</li>
{{end}} {{end}}
</ul>
</li>
{{end}} {{end}}
</ul>
<!-- /.nav-list -->
{{end}}
<div class="sidebar-toggle sidebar-collapse" id="sidebar-collapse">
<i id="sidebar-toggle-icon" class="ace-icon fa fa-angle-double-left ace-save-state" data-icon1="ace-icon fa fa-angle-double-left" data-icon2="ace-icon fa fa-angle-double-right"></i>
</div>
</div>
<div class="main-content">
<div class="main-content-inner">
<div style="margin:0;background-color:white;" class="breadcrumbs ace-save-state breadcrumbs-fixed" id="breadcrumbs">
<ul class="breadcrumb" style="border-radius:4px;padding:8px;margin:8px 8px 0;background-color:rgb(231, 242, 248);width:100%;height:100%;">
<li>
<i class="ace-icon fa fa-home home-icon"></i>
<a href="javascript:void(0)" class="navText">后台</a>
</li>
<li>
<a href="javascript:void(0)" class="menuText">首页</a>
</li>
<li class="active controllerText">Welcome</li>
</ul>
<!-- /.breadcrumb -->
</div>
<div class="page-content" style="padding-top: 43px;padding-bottom:0px;">
<div class="row">
<!--<div class="col-xs-12">-->
<!-- PAGE CONTENT BEGINS -->
<iframe id="main" name="main" src="/main/default.html" scrolling="yes" style="overflow-y:auto;border:none;" frameborder="yes" width="100%" height="100%"></iframe>
<!-- PAGE CONTENT ENDS -->
<!--</div>-->
<!-- /.col -->
</div>
<!-- /.row -->
</div>
<!-- /.page-content -->
</div>
</div>
<!-- /.main-content -->
<div class="footer">
<div class="footer-inner">
<div class="footer-content">
<span class="bigger-120">
<span class="blue bolder">{{config "String" "sys.name" ""}}</span> Application © 2017-{{.TimeNowYear}}
</span>
<!-- &nbsp; &nbsp; -->
<!-- <span class="action-buttons">
<a href="/static/index/#">
<i class="ace-icon fa fa-twitter-square light-blue bigger-150"></i>
</a>
<a href="/static/index/#">
<i class="ace-icon fa fa-facebook-square text-primary bigger-150"></i>
</a>
<a href="/static/index/#">
<i class="ace-icon fa fa-rss-square orange bigger-150"></i>
</a>
</span> -->
</div>
</div>
</div>
<a href="/static/index/#" id="btn-scroll-up" class="btn-scroll-up btn btn-sm btn-inverse">
<i class="ace-icon fa fa-angle-double-up icon-only bigger-110"></i>
</a>
</div>
<script src="/static/index/jquery-2.1.4.min.js"></script>
<script src="/static/index/bootstrap.min.js"></script>
<script src="/static/index/ace-elements.min.js"></script>
<script src="/static/index/ace.min.js"></script>
<script type="text/javascript">
$(function() {
var prefix = location.protocol + "//" + location.host
setInterval(function() {
var mainheight = $("#main").contents().find("body").height();
var minHeight = $(window).height() - 200
if (mainheight < minHeight) {
mainheight = minHeight
}
$("#main").height(mainheight);
}, 200);
$('ul.nav-list a').not('.dropdown-toggle').click(function() {
$("ul.nav-list li.active").removeClass('active');
$(this).parent().addClass("active");
var controller = $.trim($(this).text());
var menu = $.trim($(this).parent().parent().parent().find('>a').text());
var index = $('ul.nav-list').index($(this).parent().parent().parent().parent());
var nav = $.trim($('.navbar-menu a').eq(index).text());
if (nav && menu && controller) {
$('.navText').text(nav);
$('.menuText').text(menu);
$('.controllerText').text(controller);
$('.breadcrumbs').removeClass("hide").show()
}
location.href = '/main/index.html#' + (this.href + "").replace(prefix, "");
$('#main').attr('src', this.href);
return false
});
var hash = location.hash;
if (hash) {
var found = false
$('ul.nav-list a').not('.dropdown-toggle').each(function() {
if ((this.href + "").replace(prefix, "") == hash.substring(1)) {
if (found) {
return
}
var index = $('ul.nav-list').index($(this).parent().parent().parent().parent())
$(".sidebar ul.nav").removeClass("showul").eq(index).addClass("showul")
$(this).parent().parent().parent().find('>a').click();
$("ul.nav-list li.active").removeClass('active');
$(this).parent().addClass("active");
$(".navbar-menu>ul>li").eq(index).addClass('nav-active');
$(this).click();
found = true
}
});
}
$(".navbar-menu a").click(function(index) {
$(".navbar-menu>ul>li").not($(this).parent()).removeClass('nav-active');
$(this).parent().addClass('nav-active');
$(".sidebar ul.nav").removeClass("showul").eq($(".navbar-menu a").index(this)).addClass("showul")
});
});
setTimeout(function() {
$("#sidebar").addClass("sidebar-fixed");
$("#breadcrumbs").addClass("breadcrumbs-fixed");
}, 1000);
</script>
</body>
</html>
+1
View File
@@ -0,0 +1 @@
{{template "layout/default.html" .}}
+1
View File
@@ -0,0 +1 @@
{{template "layout/form.html" .}}
View File
+86
View File
@@ -0,0 +1,86 @@
<script src="/static/style/plugins/chart.js"></script>
<div class="panel panel-default container">
<h3>统计情况</h3>
<div class="row">
<div class="col-md-6">
<div style="width:300px;height:300px;">
<canvas id="online"></canvas>
</div>
</div>
<div class="col-md-6">
<div style="width:300px;height:300px;">
<canvas id="traffic"></canvas>
</div>
</div>
</div>
</div>
<script>
var onlineCfg = {
type: 'pie',
data: {
datasets: [{
data: [0, 0, 0, ],
backgroundColor: ["#999", "#123", "#456", ],
}],
labels: ["client", "server", "cluster", ]
},
options: {
title: {
display: true,
text: "在线情况"
},
responsive: true
}
};
var onlineChart = new Chart($("#online"), onlineCfg);
var trafficCfg = {
type: 'pie',
data: {
datasets: [{
data: [0, 0],
backgroundColor: ["#289", "#006621"],
}],
labels: ["已用流量", "剩余流量"]
},
options: {
responsive: true,
title: {
display: true,
text: "流量包使用情况"
},
tooltips: {
callbacks: {
label: function(tooltipItem, chart) {
console.log(tooltipItem, chart)
var label = chart.labels[tooltipItem.index]
return label + ":" + humanFileSize(chart.datasets[tooltipItem.datasetIndex].data[tooltipItem.index])
}
}
}
}
};
var trafficChart = new Chart($("#traffic"), trafficCfg);
$(function() {
var req = function() {
$.post("/main/default", {}, function(data) {
if (data.code) {
var online = data.data["online"]
onlineCfg.data.datasets[0].data = [online["client"], online["server"], online["cluster"]]
onlineChart.update();
var traffic = data.data["traffic"]
trafficCfg.data.datasets[0].data = [traffic["total_use"], traffic["total_left"]]
trafficChart.update();
setTimeout(req, 30000)
}
}, "json");
}
req();
});
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>
View File
+53
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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>&nbsp;&nbsp;&nbsp;&nbsp;
<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>&nbsp;&nbsp;&nbsp;&nbsp;
<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
View File
@@ -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
View File
@@ -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>
+149
View File
@@ -0,0 +1,149 @@
<style>
.forx {
display: none;
}
</style>
{{$privilege:=.privilege}}
<div class="panel panel-default">
<div class="panel-body">
<form class="form-horizontal ajaxform" ajaxSuccess="success" ajaxAlways="always" method="post" action="/privilege/{{.action}}">
<input type="hidden" name="privilege_id" value="{{$privilege.privilege_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="{{$privilege.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">
<label class="radio-inline">
<input type="radio" name="type" value="navigator">
导航
</label>
<label class="radio-inline">
<input type="radio" name="type" value="menu">
菜单
</label>
<label class="radio-inline">
<input type="radio" name="type" value="controller">
控制器
</label>
</div>
</div>
<div class="form-group forx for-menu">
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>上级导航</label>
<div class="col-sm-4">
<select name="parent_n" class="form-control" default="{{$privilege.parent_id}}">
{{range .navigators}}
<option value="{{.privilege_id}}">{{.name}}</option>
{{end}}
</select>
</div>
<div class="col-md-4">
<span class="text-danger"></span>
</div>
</div>
<div class="form-group forx for-controller">
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>上级菜单</label>
<div class="col-sm-4">
<select name="parent_m" class="form-control" default="{{$privilege.parent_id}}">
{{range .menus}}
<option value="{{.privilege_id}}">{{.parent}} -> {{.name}}</option>
{{end}}
</select>
</div>
<div class="col-md-4">
<span class="text-danger"></span>
</div>
</div>
<div class="form-group forx for-controller">
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>控制器名称</label>
<div class="col-sm-4">
<input type="text" name="controller" class="form-control" value="{{$privilege.controller}}">
</div>
<div class="col-md-4">
<span class="text-danger"></span>
</div>
</div>
<div class="form-group forx for-controller">
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>方法名称</label>
<div class="col-sm-4">
<input type="text" name="action" class="form-control" value="{{$privilege.action}}">
</div>
<div class="col-md-4">
<span class="text-danger"></span>
</div>
</div>
<div class="form-group forx for-controller">
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>目标地址</label>
<div class="col-sm-4">
<input type="text" name="target" class="form-control" value="{{$privilege.target}}">
</div>
<div class="col-md-4">
<span class="text-danger"></span>
</div>
</div>
<div class="form-group forx for-controller">
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>菜单项</label>
<div class="col-sm-4">
<label class="radio-inline">
<input type="radio" name="is_display" value="1">
</label>
<label class="radio-inline">
<input type="radio" name="is_display" value="0">
</label>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>排序数字</label>
<div class="col-sm-2">
<input type="text" name="sequence" class="form-control" value="{{$privilege.sequence}}">
</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 name="icon" class="icon-placeholder icon" type="hidden" value="{{$privilege.icon}}" />
<a class="btn btn-md btn-default icon-selector">
<span class="icon icon-placeholder-preview">
<i class="{{$privilege.icon}}"></i>
</span> &nbsp;&nbsp;选择图标...
</a>
</div>
<div class="col-md-4">
</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>
$('[name="type"]').click(function() {
$(".forx").hide();
$('.for-' + this.value).show();
});
$('[name="type"]').each(function() {
if (this.value == '{{$privilege.type}}') {
$(this).attr('checked', true).trigger('click');
}
});
$('[name="is_display"]').each(function() {
if (this.value == '{{$privilege.is_display}}') {
$(this).attr('checked', true).trigger('click');
}
})
</script>
+17
View File
@@ -0,0 +1,17 @@
<div class="panel panel-default" style="margin-bottom:80px;">
<div class="panel-body">
{{range $navigator := .navigators}}
<h4><span class="label label-default">{{$navigator.name}}</span> <span class="small"><a name='edit' href="/privilege/edit?privilege_id={{$navigator.privilege_id}}"></a> | <a data-toggle="confirmation" data-placement="bottom" data-title="确定删除吗?" href='/privilege/delete?privilege_id={{$navigator.privilege_id}}'></a></span></h4>
{{range $menu := $.menus}} {{if eq $menu.parent_id $navigator.privilege_id}}
<ul class="list-group w240 inline-group">
<li class="list-group-item"><strong>{{$menu.name}}</strong> <span class="pull-right"><a name='edit' href='/privilege/edit?privilege_id={{$menu.privilege_id}}'></a> | <a data-toggle="confirmation" data-placement="bottom" data-title="确定删除吗?" href='/privilege/delete?privilege_id={{$menu.privilege_id}}'></a></span></li>
{{range $controller := $.controllers}} {{if eq $controller.parent_id $menu.privilege_id}}
<li class="list-group-item">{{$controller.name}}<span class="pull-right"><a name='edit' href='/privilege/edit?privilege_id={{$controller.privilege_id}}'></a> | <a data-toggle="confirmation" data-placement="bottom" data-title="确定删除吗?" href='/privilege/delete?privilege_id={{$controller.privilege_id}}'></a></span></li>
{{end}} {{end}}
</ul>
{{end}} {{end}} {{end}}
</div>
</div>
<script type="text/javascript">
// Popup.bindIframe('[name="edit"]', '修改权限信息');
</script>
+27
View File
@@ -0,0 +1,27 @@
<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="/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">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-success">保存</button>
</div>
</div>
</form>
</div>
</div>
+40
View File
@@ -0,0 +1,40 @@
<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 w35p">角色名</th>
<th class="center w20p">状态</th>
<th class="center w20p">创建时间</th>
<th class="center">操作</th>
</tr>
</thead>
<tbody>
{{range $role := .roles}}
<tr>
<td class="center">{{$role.role_id}}</td>
<td class="center">{{$role.name}}</td>
<td class="center">
{{if eq $role.is_delete "0"}}
<span class="label label-success">正常</span> {{else}}
<span class="label label-danger">删除</span> {{end}}
</td>
<td class="center">
{{dateFormat $role.create_time "Y-m-d H:i:s"}}
</td>
<td class="center">
<a name="privilege" href="/role_privilege/add?role_id={{$role.role_id}}"><i class="glyphicon glyphicon-lock"> </i>权限</a>
<a name="edit" href="/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="/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>
+52
View File
@@ -0,0 +1,52 @@
<div class="panel panel-default" style="margin-bottom:80px;">
<div class="panel-body">
<ul class="nav">
<h4>修改权限</h4>
</ul>
<form class="form-horizontal ajaxform" ajaxSuccess="success" ajaxAlways="always" method="post" action="/role_privilege/save">
<input type="hidden" name="role_id" value="{{.role_id}}" />
{{range $navigator := .navigators}}
<h4><span class="label label-default">{{$navigator.name}}</span> <span class="small"><input name="privilege_id" type="checkbox" data-type="navigator" value="{{$navigator.privilege_id}}" onclick="Role.privilege(this)" /></span></h4>
{{range $menu := $.menus}} {{if eq $menu.parent_id $navigator.privilege_id}}
<ul class="list-group w240 inline-group">
<li class="list-group-item"><strong>{{$menu.name}}</strong> <span class="pull-right"><input name="privilege_id" type="checkbox" data-type="menu" value="{{$menu.privilege_id}}" onclick="Role.privilege(this)" /></span></li>
{{range $controller := $.controllers}} {{if eq $controller.parent_id $menu.privilege_id}}
<li class="list-group-item">{{$controller.name}}<span class="pull-right"><input name="privilege_id" type="checkbox" data-type="controller" value="{{$controller.privilege_id}}" onclick="Role.privilege(this)" /></span></li>
{{end}} {{end}}
</ul>
{{end}} {{end}} {{end}}
<div class="form-group">
<div class="col-md-8" style="margin-left:10px;">
<button type="submit" class="btn btn-success">保存</button>
</div>
</div>
</form>
</div>
</div>
<script type="text/javascript" src="/static/style/module/role.js"></script>
<script type="text/javascript">
<!--
var navigators = [];
var menus = [];
var controllers = [];
var defaultPrivileges = [];
{{range $navigator := .navigators }}
navigators.push({'privilegeId':'{{$navigator.privilege_id}}', 'name':'{{$navigator.name}}', 'parentId':'{{$navigator.parent_id}}', 'type':'{{$navigator.type}}'});
{{end}}
{{range $menu := .menus }}
menus.push({'privilegeId':'{{$menu.privilege_id}}', 'name':'{{$menu.name}}', 'parentId':'{{$menu.parent_id}}', 'type':'{{$menu.type}}'});
{{end}}
{{range $controller := .controllers }}
controllers.push({'privilegeId':'{{$controller.privilege_id}}', 'name':'{{$controller.name}}', 'parentId':'{{$controller.parent_id}}', 'type':'{{$controller.type}}'});
{{end}}
{{range $rolePrivilege := .rolePrivileges}}
defaultPrivileges.push(parseInt({{$rolePrivilege.privilege_id}}))
{{end}}
Role.defaults(defaultPrivileges);
//-->
</script>
+152
View File
@@ -0,0 +1,152 @@
<div class="page-container">
<form class="form form-horizontal" id="form-article-add">
<div id="tab-system" class="HuiTab">
<div class="tabBar cl">
<span>基本设置</span>
<span>安全设置</span>
<span>邮件设置</span>
<span>其他设置</span>
</div>
<div class="tabCon">
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">
<span class="c-red">*</span>
网站名称:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" id="website-title" placeholder="控制在25个字、50个字节以内" value="" class="input-text">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">
<span class="c-red">*</span>
关键词:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" id="website-Keywords" placeholder="5个左右,8汉字以内,用英文,隔开" value="" class="input-text">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">
<span class="c-red">*</span>
描述:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" id="website-description" placeholder="空制在80个汉字,160个字符以内" value="" class="input-text">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">
<span class="c-red">*</span>
css、js、images路径配置:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" id="website-static" placeholder="默认为空,为相对路径" value="" class="input-text">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">
<span class="c-red">*</span>
上传目录配置:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" id="website-uploadfile" placeholder="默认为uploadfile" value="" class="input-text">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">
<span class="c-red">*</span>
底部版权信息:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" id="website-copyright" placeholder="&copy; 2016 H-ui.net" value="" class="input-text">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">备案号:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" id="website-icp" placeholder="京ICP备00000000号" value="" class="input-text">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">统计代码:</label>
<div class="formControls col-xs-8 col-sm-9">
<textarea class="textarea"></textarea>
</div>
</div>
</div>
<div class="tabCon">
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">允许访问后台的IP列表:</label>
<div class="formControls col-xs-8 col-sm-9">
<textarea class="textarea" name="" id=""></textarea>
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">后台登录失败最大次数:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" class="input-text" value="5" id="" name="">
</div>
</div>
</div>
<div class="tabCon">
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">邮件发送模式:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" class="input-text" value="" id="" name="">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">SMTP服务器:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" id="" value="" class="input-text">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">SMTP 端口:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" class="input-text" value="25" id="" name="">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">邮箱帐号:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" class="input-text" value="5" id="emailName" name="emailName">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">邮箱密码:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="password" id="email-password" value="" class="input-text">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-2">收件邮箱地址:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" id="email-address" value="" class="input-text">
</div>
</div>
</div>
<div class="tabCon">
</div>
</div>
<div class="row cl">
<div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-2">
<button onClick="article_save_submit();" class="btn btn-primary radius" type="submit"><i class="Hui-iconfont">&#xe632;</i> 保存</button>
<button onClick="layer_close();" class="btn btn-default radius" type="button">&nbsp;&nbsp;取消&nbsp;&nbsp;</button>
</div>
</div>
</form>
</div>
<!--请在下方写此页面业务相关的脚本-->
<script type="text/javascript" src="/lib/My97DatePicker/4.8/WdatePicker.js"></script>
<script type="text/javascript" src="/lib/jquery.validation/1.14.0/jquery.validate.js"></script>
<script type="text/javascript" src="/lib/jquery.validation/1.14.0/validate-methods.js"></script>
<script type="text/javascript" src="/lib/jquery.validation/1.14.0/messages_zh.js"></script>
<script type="text/javascript">
$(function() {
$('.skin-minimal input').iCheck({
checkboxClass: 'icheckbox-blue',
radioClass: 'iradio-blue',
increaseArea: '20%'
});
$("#tab-system").Huitab({
index: 0
});
});
</script>
<!--/请在上方写此页面业务相关的脚本-->
+182
View File
@@ -0,0 +1,182 @@
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="panel-body" style="padding: 15px 0;">
<ul class="nav nav-tabs">
<li class="active"><a href="javascript:;">Tab</a></li>
</ul>
</div>
<div class="panel-body" style="padding-left: 9px;">
<div class="row">
<form>
<div class="col-md-3">
<div class="input-group">
<span class="input-group-addon">选择节点</span>
<select class="form-control">
<option value="ad" >jadhgjashdasgdsjagdj</option>
<option value="da" >jadhgjashdasgdsjagdj</option>
</select>
</div>
</div>
<div class="col-md-5">
<div class="form-group">
<button type="button" class="btn btn-primary" name="add_message" data-link="/message/add?node_id={{.node_id}}"><i class="glyphicon glyphicon-plus"></i> 添加消息 </button>
<button type="button" class="btn btn-success" name="test_message" data-link="/message/test?node_id={{.node_id}}" style="margin-left: 5px;"><i class="glyphicon glyphicon-send"></i> 测试消息 </button>
<button onclick="Common.confirm('确定要重启该节点吗?', '/node/reload?node_id={{.node_id}}')" type="button" class="btn btn-danger" style="margin-left: 5px;"><i class="glyphicon glyphicon-refresh"></i> 重启节点 </button>
</div>
</div>
</form>
</div>
</div>
<div class="panel-body" style="padding-left: 9px;">
<div class="row">
<form action="/log/list" method="post">
<div class="col-md-3">
<div class="input-group">
<span class="input-group-addon">节点</span>
<select class="form-control" name="node_id">
<option value="1">dlasdljalks</option>
<option value="1">dlasdljalks</option>
<option value="1">dlasdljalks</option>
</select>
</div>
</div>
<div class="col-md-2">
<div class="input-group">
<span class="input-group-addon">日志类型</span>
<select class="form-control" name="type">
<option value="errror" >ERROR</option>
<option value="info" >INFO</option>
<option value="debug">DEBUG</option>
</select>
</div>
</div>
<div class="col-md-3">
<div class="input-group">
<input class="form-control" name="keyword" type="text" value="adas" placeholder="关键字">
<span class="input-group-btn">
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-search"></i></button>
</span>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<button type="button" class="btn btn-primary" name="log_download" data-link="/log/download?node_id={{.node_id}}"><i class="glyphicon glyphicon-download-alt"></i> 下载日志 </button>
</div>
</div>
</form>
</div>
</div>
<div class="panel-body">
<form class="form-horizontal" method="post" action="" onsubmit="return false">
<input type="hidden" name="node_id" value="">
<div class="form-group">
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>表单</label>
<div class="col-sm-6">
<input type="text" name="url" class="form-control" placeholder="消费接口" required>
</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-6">
<select name="message" class="form-control">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</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">
<label class="radio-inline">
<input type="radio" name="check_code" value="1" checked="checked">
</label>
<label class="radio-inline">
<input type="radio" name="check_code" value="0">
</label>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"><span class="text-danger"> * </span>复选框</label>
<div class="col-sm-4">
<label class="checkbox-inline">
<input type="checkbox" name="check_code" value="1" checked="checked">
</label>
<label class="radio-inline">
<input type="checkbox" name="check_code" value="0">
</label>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"><span class="text-danger"> * </span> textarea </label>
<div class="col-sm-6">
<textarea name="data" class="form-control" rows="6"></textarea><br/>
</div>
<div class="col-md-4">
<span class="text-danger"> * 数据格式如:name=pppp&id=16&[email protected] </span>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">备注</label>
<div class="col-sm-6">
<input type="text" name="comment" class="form-control" placeholder="备注" value="">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="button" name="submit" onclick="Form.ajaxSubmit(this.form, true)" class="btn btn-success">保存</button>
</div>
</div>
</form>
</div>
<hr>
<div class="panel panel-default">
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th class="w10p">消息名称</th>
<th class="w8p">交换器模式</th>
<th>消费接口</th>
<th class="w80">RouteKey</th>
<th class="w90">状态</th>
<th class="w60">超时</th>
<th class="w200">备注</th>
<th class="w100">操作</th>
</tr>
</thead>
<tbody>
<tr>
<td>ad</td>
<td>da</td>
<td>da</td>
<td class="w80">da</td>
<td class="center w90 consumer_status">
<label class="text-info">waiting</label>
</td>
<td class="w60">ad</td>
<td class="w200">ad</td>
<td class="w100 center">
<a name="edit" class="glyphicon glyphicon-edit" data-link="/consumer/edit?node_id=1">修改</a>
<a onclick="Common.confirm('确定要删除吗?', '/consumer/delete?node_id=')" class="remove glyphicon glyphicon-trash">删除</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="panel-footer"></div>
</div>
</div>
</div>
</div>
+29
View File
@@ -0,0 +1,29 @@
<div class="panel panel-default">
<div class="panel-body">
<form class="form-horizontal ajaxform" method="post" action="/user/changepassword">
<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_old" 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="password" name="password" class="form-control" value="">
</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>
+84
View File
@@ -0,0 +1,84 @@
<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="/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="given_name" class="form-control" value="{{$user.given_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">
<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-sm-2 control-label"><span class="text-danger"> * </span>手机号</label>
<div class="col-sm-4">
<input type="text" name="mobile" class="form-control" value="{{$user.mobile}}">
</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>
+61
View File
@@ -0,0 +1,61 @@
<div class="panel panel-default">
<div class="panel-body">
<div class="row">
<form action="/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.username}}</td>
<td class="center">{{$user.given_name}}</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="/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="/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="/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>
+127
View File
@@ -0,0 +1,127 @@
<div class="page-container">
<div class="text-c"> 日期范围:
<input type="text" onfocus="WdatePicker({ maxDate:'#F{$dp.$D(\'datemax\')||\'%y-%M-%d\'}' })" id="datemin" class="input-text Wdate" style="width:120px;"> -
<input type="text" onfocus="WdatePicker({ minDate:'#F{$dp.$D(\'datemin\')}',maxDate:'%y-%M-%d' })" id="datemax" class="input-text Wdate" style="width:120px;">
<input type="text" class="input-text" style="width:250px" placeholder="输入管理员名称" id="" name="">
<button type="submit" class="btn btn-success" id="" name=""><i class="Hui-iconfont">&#xe665;</i> 搜用户</button>
</div>
<div class="cl pd-5 bg-1 bk-gray mt-20"> <span class="l"><a href="javascript:;" onclick="datadel()" class="btn btn-danger radius"><i class="Hui-iconfont">&#xe6e2;</i> 批量删除</a> <a href="javascript:;" onclick="admin_add('添加管理员','/user/add.html','800','500')" class="btn btn-primary radius"><i class="Hui-iconfont">&#xe600;</i> 添加管理员</a></span> <span class="r">共有数据:<strong>54</strong> 条</span> </div>
<table class="table table-border table-bordered table-bg">
<thead>
<tr>
<th scope="col" colspan="9">员工列表</th>
</tr>
<tr class="text-c">
<th width="25"><input type="checkbox" name="" value=""></th>
<th width="40">ID</th>
<th width="150">登录名</th>
<th width="90">手机</th>
<th width="150">邮箱</th>
<th>角色</th>
<th width="130">加入时间</th>
<th width="100">是否已启用</th>
<th width="100">操作</th>
</tr>
</thead>
<tbody>
<tr class="text-c">
<td><input type="checkbox" value="1" name=""></td>
<td>1</td>
<td>admin</td>
<td>13000000000</td>
<td>[email protected]</td>
<td>超级管理员</td>
<td>2014-6-11 11:11:42</td>
<td class="td-status"><span class="label label-success radius">已启用</span></td>
<td class="td-manage"><a style="text-decoration:none" onClick="admin_stop(this,'10001')" href="javascript:;" title="停用"><i class="Hui-iconfont">&#xe631;</i></a> <a title="编辑" href="javascript:;" onclick="admin_edit('管理员编辑','admin-add.html','1','800','500')"
class="ml-5" style="text-decoration:none"><i class="Hui-iconfont">&#xe6df;</i></a> <a title="删除" href="javascript:;" onclick="admin_del(this,'1')" class="ml-5" style="text-decoration:none"><i class="Hui-iconfont">&#xe6e2;</i></a></td>
</tr>
<tr class="text-c">
<td><input type="checkbox" value="2" name=""></td>
<td>2</td>
<td>zhangsan</td>
<td>13000000000</td>
<td>[email protected]</td>
<td>栏目编辑</td>
<td>2014-6-11 11:11:42</td>
<td class="td-status"><span class="label radius">已停用</span></td>
<td class="td-manage"><a style="text-decoration:none" onClick="admin_start(this,'10001')" href="javascript:;" title="启用"><i class="Hui-iconfont">&#xe615;</i></a> <a title="编辑" href="javascript:;" onclick="admin_edit('管理员编辑','admin-add.html','2','800','500')"
class="ml-5" style="text-decoration:none"><i class="Hui-iconfont">&#xe6df;</i></a> <a title="删除" href="javascript:;" onclick="admin_del(this,'1')" class="ml-5" style="text-decoration:none"><i class="Hui-iconfont">&#xe6e2;</i></a></td>
</tr>
</tbody>
</table>
</div>
<!--请在下方写此页面业务相关的脚本-->
<script type="text/javascript" src="/lib/My97DatePicker/4.8/WdatePicker.js"></script>
<script type="text/javascript" src="/lib/datatables/1.10.0/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="/lib/laypage/1.2/laypage.js"></script>
<script type="text/javascript">
/*
参数解释:
title 标题
url 请求的url
id 需要操作的数据id
w 弹出层宽度(缺省调默认值)
h 弹出层高度(缺省调默认值)
*/
/*管理员-增加*/
function admin_add(title, url, w, h) {
layer_show(title, url, w, h);
}
/*管理员-删除*/
function admin_del(obj, id) {
layer.confirm('确认要删除吗?', function(index) {
$.ajax({
type: 'POST',
url: '',
dataType: 'json',
success: function(data) {
$(obj).parents("tr").remove();
layer.msg('已删除!', {
icon: 1,
time: 1000
});
},
error: function(data) {
console.log(data.msg);
},
});
});
}
/*管理员-编辑*/
function admin_edit(title, url, id, w, h) {
layer_show(title, url, w, h);
}
/*管理员-停用*/
function admin_stop(obj, id) {
layer.confirm('确认要停用吗?', function(index) {
//此处请求后台程序,下方是成功后的前台处理……
$(obj).parents("tr").find(".td-manage").prepend('<a onClick="admin_start(this,id)" href="javascript:;" title="启用" style="text-decoration:none"><i class="Hui-iconfont">&#xe615;</i></a>');
$(obj).parents("tr").find(".td-status").html('<span class="label label-default radius">已禁用</span>');
$(obj).remove();
layer.msg('已停用!', {
icon: 5,
time: 1000
});
});
}
/*管理员-启用*/
function admin_start(obj, id) {
layer.confirm('确认要启用吗?', function(index) {
//此处请求后台程序,下方是成功后的前台处理……
$(obj).parents("tr").find(".td-manage").prepend('<a onClick="admin_stop(this,id)" href="javascript:;" title="停用" style="text-decoration:none"><i class="Hui-iconfont">&#xe631;</i></a>');
$(obj).parents("tr").find(".td-status").html('<span class="label label-success radius">已启用</span>');
$(obj).remove();
layer.msg('已启用!', {
icon: 6,
time: 1000
});
});
}
</script>
+58
View File
@@ -0,0 +1,58 @@
<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="/user/profile">
<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" disabled value="{{$user.username}}">
</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="given_name" class="form-control" value="{{$user.given_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">
<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-sm-2 control-label"><span class="text-danger"> * </span>手机号</label>
<div class="col-sm-4">
<input type="text" name="mobile" class="form-control" value="{{$user.mobile}}">
</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>