v2版本正式上线测试版

This commit is contained in:
george
2018-07-13 17:53:34 +08:00
parent 092ecf605b
commit 7bbe5585d8
661 changed files with 40153 additions and 2053 deletions

108
views/admin/add.html Normal file
View File

@@ -0,0 +1,108 @@
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<div style="margin: 10px 0px">
<blockquote class="layui-elem-quote">
说明新建管理员默认密码为:george518
</blockquote>
</div>
<form class="layui-form" action="" method="post" >
<div class="layui-form-item">
<label class="layui-form-label">登录账号</label>
<div class="layui-input-inline">
<input type="text" name="login_name" id="login_name" lay-verify="required" autocomplete="off" placeholder="登录账号" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux">*英文数字或_,6位以上</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">真实姓名</label>
<div class="layui-input-inline">
<input type="text" name="real_name" id="real_name" lay-verify="required" autocomplete="off" placeholder="真实姓名" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">手机号码</label>
<div class="layui-input-inline">
<input type="text" name="phone" lay-verify="phone|required" autocomplete="off" placeholder="手机号码" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">电子邮箱</label>
<div class="layui-input-inline">
<input type="text" name="email" id="email" lay-verify="email" autocomplete="off" placeholder="电子邮箱" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">选择角色</label>
<div class="layui-input-block">
{{range $k, $v := .role}}
<input type="checkbox" name="role_ids" lay-filter="role_ids" title="{{$v.role_name}}" value="{{$v.id}}">
{{end}}
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
<input type="hidden" value="" id="roleids" name="roleids">
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
<script>
var $;
layui.config({
base : "js/"
}).use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var role_ids = [];
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
form.on('checkbox(role_ids)', function(data){
if(data.elem.checked==true){
role_ids.push(data.value)
}else{
$.each(role_ids,function(index,item){
// index是索引值即下标 item是每次遍历得到的值
if(item==data.value){
role_ids.splice(index,1);
}
});
}
$("#roleids").val(role_ids.join(","));
});
form.on('submit(sub)', function(data){
var form_data = $("form").serialize();
$.post('{{urlfor "AdminController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.location.reload()
})
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
</script>

116
views/admin/edit.html Normal file
View File

@@ -0,0 +1,116 @@
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<form class="layui-form" action="" method="post" >
<div class="layui-form-item">
<label class="layui-form-label">登录账号</label>
<div class="layui-input-inline">
<input type="text" name="login_name" readonly id="login_name" lay-verify="required" autocomplete="off" placeholder="登录账号" class="layui-input" value="{{.admin.login_name}}">
</div>
<div class="layui-form-mid layui-word-aux">*登录不允许修改</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">真实姓名</label>
<div class="layui-input-inline">
<input type="text" name="real_name" id="real_name" lay-verify="required" autocomplete="off" placeholder="真实姓名" class="layui-input" value="{{.admin.real_name}}">
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">手机号码</label>
<div class="layui-input-inline">
<input type="text" name="phone" lay-verify="phone|required" autocomplete="off" placeholder="手机号码" class="layui-input" value="{{.admin.phone}}">
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">电子邮箱</label>
<div class="layui-input-inline">
<input type="text" name="email" id="email" lay-verify="email" autocomplete="off" placeholder="电子邮箱" class="layui-input" value="{{.admin.email}}">
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">重置密码</label>
<div class="layui-input-inline">
<input type="radio" name="reset_pwd" value="1" title="重置">
<input type="radio" name="reset_pwd" value="2" title="不重置" checked>
</div>
<div class="layui-form-mid layui-word-aux">默认密码:george518</div>
</div>
{{if ne .admin.id 1}}
<div class="layui-form-item">
<label class="layui-form-label">选择角色</label>
<div class="layui-input-block">
{{range $k, $v := .role}}
<input type="checkbox" name="role_ids" lay-filter="role_ids" title="{{$v.role_name}}" value="{{$v.id}}" {{if $v.checked}}checked{{end}}>
{{end}}
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
{{end}}
<input type="hidden" id="roleids" name="roleids" value="{{.admin.role_ids}}">
<input type="hidden" id="id" name="id" value="{{.admin.id}}">
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
<script>
var $;
layui.config({
base : "js/"
}).use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var role_ids_str = "{{.admin.role_ids}}"
var role_ids = role_ids_str.split(",");
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
form.on('checkbox(role_ids)', function(data){
if(data.elem.checked==true){
role_ids.push(data.value)
}else{
$.each(role_ids,function(index,item){
// index是索引值即下标 item是每次遍历得到的值
if(item==data.value){
role_ids.splice(index,1);
}
});
}
$("#roleids").val(role_ids.join(","));
});
form.on('submit(sub)', function(data){
var form_data = $("form").serialize();
$.post('{{urlfor "AdminController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.history.go(-1)
})
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
</script>

118
views/admin/list.html Normal file
View File

@@ -0,0 +1,118 @@
<div class="layui-layout layui-layout-admin" style="padding-left: 20px;">
<div class="layui-row" style="margin-top: 20px;">
<div class="layui-col-xs6">
<a class="layui-btn" data-type="tabAdd" href="/admin/add">新增</a>
</div>
<div class="layui-col-xs6 search_text">
<form class="layui-form" action="" onsubmit="javascript:return false;">
<div class="demoTable">
<div class="layui-inline" style="width: 40%">
<input class="layui-input" name="realName" id="realName" autocomplete="off" placeholder="真实姓名" >
</div>
<button class="layui-btn" data-type="reload">查询</button>
</div>
</form>
</div>
</div>
<table class="layui-hide" id="table_list" lay-filter="table_filter">
</table>
<script type="text/html" id="bar">
<!-- <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看</a> -->
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="status">|</a>
</script>
</div>
<script>
layui.use(['table','form','element'], function(){
var table = layui.table;
var form = layui.form;
var element = layui.element;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
//方法级渲染
table.render({
elem: '#table_list'
,url: '/admin/table'
,cols: [[
// {checkbox: true, fixed: true},
{field:'id', title: 'ID', align:'center',sort: true, width:150}
,{field:'login_name',title: '登录账号'}
,{field:'real_name', title: '真实姓名'}
,{field:'phone', title: '联系电话'}
,{field:'email', title: '电子邮箱'}
,{field:'status_text', title: '状态'}
,{fixed: 'right', width:160, align:'center', toolbar: '#bar'}
]]
,id: 'listReload'
,page: true
,height: "full-130"
});
var $ = layui.$, active = {
reload: function(){
table.reload('listReload', {
where: {
realName: $('#realName').val(),
}
});
}
};
//监听工具条
table.on('tool(table_filter)', function(obj){
var data = obj.data;
if(obj.event === 'edit'){
window.location.href="/admin/edit?id="+data.id
} else if(obj.event === 'status'){
acts = "禁用";
status = "disable";
if (data.status === 0) {
acts = '启用';
status = "enable";
}
if (data.id==1 && obj.event === 'disable') {
layer.msg('超级管理员不允许操作');
return false;
}
layer.confirm('真的'+acts+'【'+data.login_name+'账号么', function(index){
var jsData = {'id':data.id,'status':status}
$.post('{{urlfor "AdminController.AjaxDel"}}', jsData, function (out) {
if (out.status == 0) {
layer.alert(out.message, {icon: 1},function(index){
layer.close(index);
window.location.reload();
});
} else {
layer.msg(out.message)
}
}, "json");
// obj.del();
layer.close(index);
})
}else{
layer.msg('操作不存在');
}
});
$('.demoTable .layui-btn').on('click', function(){
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
});
</script>

383
views/auth/list.html Normal file
View File

@@ -0,0 +1,383 @@
<script type="text/javascript" src="/static/admin/js/jquery.min.js"></script>
<script type="text/javascript" src="/static/zTree3/js/jquery.ztree.core.js"></script>
<script type="text/javascript" src="/static/zTree3/js/jquery.ztree.excheck.js"></script>
<script type="text/javascript" src="/static/zTree3/js/jquery.ztree.exedit.js"></script>
<div class="layui-row">
<div style="margin: 10px 20px">
<blockquote class="layui-elem-quote">
说明新增权限请直接填写相关数据保存即可修改和删除请点击左侧权限树选择要修改的权限节点
</blockquote>
</div>
<div class="layui-col-md5 zTreeDemoBackground" style="margin-left: 20px;margin-right: 0px">
<ul id="treeDemo" class="ztree" style="height:320px; width: auto; margin-bottom: 10px;">
</ul>
</div>
<div class="layui-col-md7">
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<form class="layui-form" action="" onsubmit="javascript:;" name="form" method="post">
<div class="layui-form-item">
<label class="layui-form-label">权限名称</label>
<div class="layui-input-inline">
<input type="text" name="auth_name" lay-verify="required" autocomplete="off" placeholder="请输入权限名称" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">上级权限</label>
<div class="layui-input-inline" style="width: 210px;">
<input type="text" name="pname" lay-verify="required" autocomplete="off" placeholder="请选择" disabled value="所有权限" class="layui-input" id="pname">
</div>
<div class="layui-input-inline" style="width: 50px;">
<input type="text" name="pid" autocomplete="off" placeholder="0" id="pid" class="layui-input" readonly value="1">
</div>
<div class="layui-form-mid layui-word-aux">
<button id="menuBtn" type="button" class="layui-btn layui-btn-xs layui-btn-normal" >选择顶级分类</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">菜单地址</label>
<div class="layui-input-inline">
<input type="text" name="auth_url" lay-verify="required" autocomplete="off" placeholder="/home" class="layui-input" value="/">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">图标字体</label>
<div class="layui-input-inline">
<input type="text" name="icon" autocomplete="off" placeholder="fa-bar-chart-o" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux"><a href="http://fontawesome.dashgame.com" target="_blank">点击这里参考</a></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序</label>
<div class="layui-input-inline">
<input type="text" name="sort" lay-verify="required" autocomplete="off" placeholder="999" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否显示</label>
<div class="layui-input-inline">
<input type="radio" name="is_show" value="0" title="隐藏" checked>
<input type="radio" name="is_show" value="1" title="显示">
</div>
<div class="layui-form-mid layui-word-aux">是否左侧导航栏显示</div>
</div>
<input type="hidden" name="id" class="layui-input" id="id" value="0">
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit="" lay-filter="add">新增</button>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="edit">修改</button>
<a class="layui-btn layui-btn-danger" href="javascript:;" id="del" lay-submit="">删除</a>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
</div>
</div>
<div id="menuContent" class="menuContent" style="display:none; position: absolute;">
<ul id="treeMenu" class="ztree" style="margin-top:0; width:200px; height: 200px"></ul>
</div>
<script>
var $,form;
layui.use(['form','element','layer'],function(){
form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
$ = layui.$;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
form.on("submit",function(data) {
var sub_type = data.elem.getAttribute("lay-filter")
console.log(sub_type)
if(sub_type=="add"){
$("#id").val(0);
}else{
if($("#id").val()=="0"){
layer.msg("修改先请在左侧权限树选择节点")
return false
}
}
console.log($("form").serialize());
$.post('{{urlfor "AuthController.AjaxSave"}}', $("form").serialize(), function (out) {
if (out.status == 0) {
// layer.msg("操作成功")
layer.alert('你成功了', {icon: 1},function(index){
window.location.reload();
});
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
form.render();
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
});
</script>
<script type="text/javascript">
var zNodes = [{ id:1, pId:0, name:"数据错误"}];
$(document).ready(function(){
// $("form[name=form]").parent().find("input[type=radio]").eq(1).attr("checked", true);
var setting = {
// edit: {
// enable: true
// },
data: {
simpleData: {
enable: true
}
},
callback: {
beforeDrag: beforeDrag,
onClick: editOnClick
}
};
function editOnClick(e, treeId, treeNode) {
var zTree = $.fn.zTree.getZTreeObj("treeDemo"),
nodes = zTree.getSelectedNodes();
if(nodes[0].id==1){
alert('不允许修改根节点');
return;
}
if(nodes[0].parentTId){
var parentInfo = zTree.getNodeByTId(nodes[0].parentTId);
pid = parentInfo.id;
pname = parentInfo.name;
}
var id = nodes[0].id;
$("#pid").val(nodes[0].pId);
$("#id").val(nodes[0].id);
$("#pname").val(pname);
$("form[name=form]").find("input[name=auth_name]").val(nodes[0].name);
$.ajax({
type: "POST",
url: "/auth/getnode",
data: {id:id},
dataType: 'json',
success: function(data) {
if(data.code==0){
$("form[name=form]").find("input[name=auth_url]").val(data.data.auth_url);
$("form[name=form]").find("input[name=icon]").val(data.data.icon);
$("form[name=form]").find("input[name=sort]").val(data.data.sort);
var is_show = data.data.is_show
$("form[name=form]").find("input[type=radio][value="+is_show+"]").attr("checked", true);
$("form[name=form]").find("input[type=radio][value="+is_show+"]").click();
form.render();
}
}
});
}
function beforeDrag(treeId, treeNodes) {
return false;
}
function setEdit() {
var zTree = $.fn.zTree.getZTreeObj("treeDemo");
}
// //增加节点
var newCount = 1;
var maxId = 0;
function add(e) {
var maxId = $('#max_id').val();
var zTree = $.fn.zTree.getZTreeObj("treeDemo"),
isParent = e.data.isParent,
nodes = zTree.getSelectedNodes(),
treeNode = nodes[0];
if (treeNode) {
treeNode = zTree.addNodes(treeNode, {id:(maxId -(-newCount)), pId:treeNode.id, isParent:isParent, name:"new node" + treeNode.id + (newCount++)});
} else {
treeNode = zTree.addNodes(null, {id:(maxId -(-newCount)), pId:0, isParent:isParent, name:"new node" + (newCount++)});
}
if (treeNode) {
zTree.editName(treeNode[0]);
} else {
alert("叶子节点被锁定,无法增加子节点");
}
};
function showCode(str) {
var code = $("#code");
code.empty();
for (var i=0, l=str.length; i<l; i++) {
code.append("<li>"+str[i]+"</li>");
}
}
//加载树
refresh_tree();
function refresh_tree()
{
var time = Date.parse(new Date());
$.ajax({
type: "POST",
url: "/auth/getnodes",
data: {time:time},
dataType: 'json',
success: function(data) {
if(data.code==0){
zNodes = data.data;
$.fn.zTree.init($("#treeDemo"), setting, zNodes);
$.fn.zTree.init($("#treeMenu"), menu, zNodes);
}
}
});
setEdit();
$("#remove").bind("change", setEdit);
$("#rename").bind("change", setEdit);
$("#removeTitle").bind("propertychange", setEdit)
.bind("input", setEdit);
$("#renameTitle").bind("propertychange", setEdit)
.bind("input", setEdit);
}
// //新增 type=1
// $('#submit_add_button').on('click',function(){
// var data = $('form[name=form_add]').serialize();
// ajaxRequest({'nodes':data,'type':1},'/auth/auth/save_auth','submit_add_button','POST',0);
// });
// //新增 type=2
// $('#submit_edit_button').on('click',function(){
// var data = $('form[name=form_add]').serialize();
// ajaxRequest({'nodes':data,'type':2},'/auth/auth/save_auth','submit_edit_button','POST',0);
// });
//删除
$('#del').on('click',function(){
var id = $("#id").val();
if (id==0) {
layer.msg('请在左侧权限树选择节点');
return false;
}
layer.confirm('确认要删除吗', {icon: 3, title:'提示'}, function(index){
$.post('{{urlfor "AuthController.AjaxDel"}}', {id:id}, function (out) {
if (out.status == 0) {
// layer.msg("操作成功")
layer.alert('你删除成功了', {icon: 1},function(index){
window.location.reload();
});
} else {
layer.msg(out.message)
}
}, "json");
});
return false;
});
// //清空
// $('#submit_cancel_button').on('click',function(){
// var fields = ['id','pid','pname','name','menu_url','sort'];
// $.each(fields,function(k,v) {
// $("form[name=form_add]").find("input[name="+v+"]").val('');
// });
// });
//以下是下拉选择框
var menu = {
view: {
dblClickExpand: false
},
data: {
simpleData: {
enable: true
}
},
callback: {
// beforeClick: beforeClick,
onClick: onClick
}
};
function beforeClick(treeId, treeNode) {
var check = (treeNode && !treeNode.isParent);
if (!check) alert("不能选择");
return check;
}
function onClick(e, treeId, treeNode) {
var zTree = $.fn.zTree.getZTreeObj("treeMenu"),
nodes = zTree.getSelectedNodes(),
v = "";
nodes.sort(function compare(a,b){return a.id-b.id;});
for (var i=0, l=nodes.length; i<l; i++) {
v += nodes[i].name + ",";
}
if (v.length > 0 ) v = v.substring(0, v.length-1);
var pid = $("#pid");
$("#pid").val(nodes[0].id);
$("#pname").val(v);
hideMenu()
}
$("#menuBtn").on("click",function(){
showMenu()
})
function showMenu() {
var pname = $("#pname");
var paOffset = $("#pname").offset();
// var sideOffset = $("#left_side").width();
// console.log(sideOffset.left)
$("#menuContent").css({left:(paOffset.left) + "px", top:(paOffset.top - pname.outerHeight()+70) + "px"}).slideDown("fast");
$("body").bind("mousedown", onBodyDown);
}
function hideMenu() {
$("#menuContent").fadeOut("fast");
$("body").unbind("mousedown", onBodyDown);
}
function onBodyDown(event) {
if (!(event.target.id == "menuBtn" || event.target.id == "menuContent" || $(event.target).parents("#menuContent").length>0)) {
hideMenu();
}
}
});
</script>

57
views/ban/add.html Normal file
View File

@@ -0,0 +1,57 @@
<style>
.nav-title{
display: none;
}
</style>
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<form class="layui-form" action="" method="post" >
<div class="layui-form-item">
<div class="layui-input-inline mw400">
<textarea name="code" id="code" placeholder="请输入禁用命令" class="layui-textarea"></textarea>
</div>
</div>
<input type="hidden" name="id" id="id" value="0">
<div class="layui-form-item">
<div class="layui-input-inline mw400">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
<script>
var $;
layui.use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
form.on('submit(sub)', function(data){
var form_data = data.field;
$.post('{{urlfor "BanController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.parent.layer.closeAll();
window.parent.location.reload();
})
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
</script>

57
views/ban/edit.html Normal file
View File

@@ -0,0 +1,57 @@
<style>
.nav-title{
display: none;
}
</style>
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<form class="layui-form" action="" method="post" >
<div class="layui-form-item">
<div class="layui-input-inline mw400">
<textarea name="code" id="code" placeholder="请输入禁用命令" class="layui-textarea">{{.ban.code}}</textarea>
</div>
</div>
<input type="hidden" name="id" id="id" value="{{.ban.id}}">
<div class="layui-form-item">
<div class="layui-input-inline mw400">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
<script>
var $;
layui.use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
form.on('submit(sub)', function(data){
var form_data = data.field;
$.post('{{urlfor "BanController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.parent.layer.closeAll();
window.parent.location.reload();
})
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
</script>

128
views/ban/list.html Normal file
View File

@@ -0,0 +1,128 @@
<div class="layui-layout layui-layout-admin" style="padding-left: 20px;">
<div class="layui-row" style="margin-top: 20px;">
<div class="layui-col-xs6">
<a class="layui-btn" data-type="tabAdd" id="tabAdd" href="javascript:void(0)">新增</a>
</div>
<div class="layui-col-xs6 search_text">
<form class="layui-form" action="" onsubmit="javascript:return false;">
<div class="demoTable">
<div class="layui-inline" style="width: 40%">
<input class="layui-input" name="code" id="code" autocomplete="off" placeholder="禁用命令" >
</div>
<button class="layui-btn" data-type="reload">查询</button>
</div>
</form>
</div>
</div>
<table class="layui-hide" id="table_list" lay-filter="table_filter">
</table>
<script type="text/html" id="bar">
<!-- <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看</a> -->
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
</div>
<script>
layui.use(['table','form','element'], function(){
var table = layui.table;
var form = layui.form;
var element = layui.element;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
//方法级渲染
table.render({
elem: '#table_list'
,url: '/ban/table'
,cols: [[
// {checkbox: true, fixed: true},
{field:'id', title: 'ID', align:'center',sort: true, width:150}
,{field:'code',title: '禁用命令'}
,{field:'create_time', title: '创建时间'}
,{fixed: 'right', width:160, align:'center', toolbar: '#bar'}
]]
,id: 'listReload'
,page: true
,height: "full-130"
});
var $ = layui.$, active = {
reload: function(){
table.reload('listReload', {
where: {
code: $('#code').val(),
}
});
}
};
$("#tabAdd").on("click",function() {
layer.open({
type: 2,
shade: 0.3,
id:1,
title:"新增禁用命令",
content: '/ban/add',
area:['500px','250px'],
cancel:function(){
window.location.reload();
layer.close(index);
}
});
})
//监听工具条
table.on('tool(table_filter)', function(obj){
var data = obj.data;
if(obj.event === 'edit'){
layer.open({
type: 2,
shade: 0.3,
id:1,
title:"编辑禁用命令",
content: '/ban/edit?id='+data.id,
area:['500px','250px'],
cancel:function(){
window.location.reload();
layer.close(index);
}
});
} else if(obj.event === 'del'){
layer.confirm('真的删除'+data.code+'命令么', function(index){
var jsData = {'id':data.id,'status':status}
$.post('{{urlfor "BanController.AjaxDel"}}', jsData, function (out) {
if (out.status == 0) {
layer.alert(out.message, {icon: 1},function(index){
layer.close(index);
window.location.reload();
});
} else {
layer.msg(out.message)
}
}, "json");
// obj.del();
layer.close(index);
})
}else{
layer.msg('操作不存在');
}
});
$('.demoTable .layui-btn').on('click', function(){
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
});
</script>

View File

@@ -1,67 +1,62 @@
<!-- 新增任务 -->
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
</div>
</div>
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<div style="margin: 10px 0px">
<blockquote class="layui-elem-quote">
说明新建任务分组
</blockquote>
</div>
<form class="layui-form" action="" method="post" >
<div class="layui-form-item">
<label class="layui-form-label">分组名称</label>
<div class="layui-input-inline" style="min-width: 200px;">
<input type="text" name="group_name" id="group_name" lay-verify="required" autocomplete="off" placeholder="任务分组" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分组说明</label>
<div class="layui-input-inline" style="min-width: 400px;">
<textarea name="description" id="description" placeholder="请输入内容" class="layui-textarea"></textarea>
</div>
<!--content-list-->
<div class="content-list">
<form action="{{urlfor "GroupController.Add"}}" method="post" class="form-horizontal">
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="group_name">分类名称</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="group_name" value="" required />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="description">分类说明</label>
<div class="col-sm-5" >
<textarea name="description" class="form-control" id="description" rows="3"></textarea>
</div>
<div class="col-sm-4" style="padding-top:5px;">
</div>
</div>
<br />
<div class="modal-footer" style="text-align:center">
<button type="submit" class="btn btn-primary submit_attr_button">保存</button>
<button type="button" class="btn btn-default reback">返回</button>
</div>
</form>
</div>
</div>
</div>
<input type="hidden" id="id" value="0">
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
<script>
$(function () {
$("form").submit(function () {
// $(".alert").hide();
$("button[type='submit']").attr('disabled', true);
$.post('{{urlfor "GroupController.Add"}}', $(this).serialize(), function (out) {
if (out.status == 0) {
window.location.href = '{{urlfor "GroupController.List"}}';
} else {
alert_message(out.msg,"alert-danger","alert-success");
$("button[type='submit']").attr('disabled', false);
}
}, "json");
return false;
});
});
var $;
layui.use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
form.on('submit(sub)', function(data){
var form_data = $("form").serialize();
$.post('{{urlfor "GroupController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.history.go(-1)
})
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
</script>

View File

@@ -1,67 +1,62 @@
<!-- 新增任务 -->
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
</div>
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<div style="margin: 10px 0px">
<blockquote class="layui-elem-quote">
说明编辑任务分组
</blockquote>
</div>
<form class="layui-form" action="" method="post" >
<div class="layui-form-item">
<label class="layui-form-label">分组名称</label>
<div class="layui-input-inline" style="min-width: 200px;">
<input type="text" value="{{.group.group_name}}" name="group_name" id="group_name" lay-verify="required" autocomplete="off" placeholder="任务分组" class="layui-input" >
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分组说明</label>
<div class="layui-input-inline" style="min-width: 400px;">
<textarea name="description" id="description" placeholder="请输入内容" class="layui-textarea">{{.group.description}}</textarea>
</div>
</div>
<input type="hidden" id="id" name="id" value="{{.group.id}}">
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</div>
<!--content-list-->
<div class="content-list">
<form action="{{urlfor "GroupController.Edit"}}" method="post" class="form-horizontal">
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="group_name">分类名称</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="group_name" value="{{.group.GroupName}}" required />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="description">分类说明</label>
<div class="col-sm-5" >
<textarea name="description" class="form-control" id="description" rows="3">{{.group.Description}}</textarea>
</div>
<div class="col-sm-4" style="padding-top:5px;">
</div>
</div>
<br />
<input type="hidden" name="id" value="{{.group.Id}}" />
<div class="modal-footer" style="text-align:center">
<button type="submit" class="btn btn-primary submit_attr_button">保存</button>
<button type="button" class="btn btn-default reback">返回</button>
</div>
</form>
</div>
</div>
</form>
</div>
<script>
$(function () {
$("form").submit(function () {
$("button[type='submit']").attr('disabled', true);
$.post('{{urlfor "GroupController.Edit"}}', $(this).serialize(), function (out) {
if (out.status == 0) {
window.location.href = '{{urlfor "GroupController.List"}}';
} else {
alert_message(out.msg,"alert-danger","alert-success");
$("button[type='submit']").attr('disabled', false);
}
}, "json");
return false;
var $;
layui.use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
form.on('submit(sub)', function(data){
var form_data = $("form").serialize();
$.post('{{urlfor "GroupController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.history.go(-1)
})
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
});
</script>

View File

@@ -1,113 +1,105 @@
<!-- 分组列表 -->
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
</div>
</div>
<div class="layui-layout layui-layout-admin" style="padding-left: 20px;">
<div class="layui-row" style="margin-top: 20px;">
<div class="layui-col-xs6">
<a class="layui-btn" data-type="tabAdd" href="/group/add">新增</a>
</div>
<div class="clearfix"></div>
</div>
<!--content-list-->
<div class="content-list">
<div class="search-box row">
<div class="col-md-4">
<div class="btn-group pull-left" role="group" aria-label="...">
<a href='{{urlfor "GroupController.Add"}}' class="btn btn-primary"><span class="glyphicon glyphicon-plus"></span> 新增分类</a>
<div class="btn-group" role="group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-edit"></span> 批量操作
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="javascript:;" onclick="javascript:batch('delete');"><span class="glyphicon glyphicon-remove-sign" aria-hidden="true"></span> 删除</a></li>
</ul>
<div class="layui-col-xs6 search_text">
<form class="layui-form" action="" onsubmit="javascript:return false;">
<div class="demoTable">
<div class="layui-inline" style="width: 40%">
<input class="layui-input" name="groupName" id="groupName" autocomplete="off" placeholder="分组名称" >
</div>
<button class="layui-btn" data-type="reload">查询</button>
</div>
</div>
<div class="col-md-8">
<div class=" btn-large pull-right" >
</div>
</div>
</form>
</div>
</div>
<div class="clearfix"></div>
<div class="table-margin">
<form id="form-list" method="post" action="">
<table class="table table-bordered table-header">
<thead>
<tr>
<td><input type="checkbox" name="all_check" /></td>
<td>ID</td>
<td width="20%">分类名称</td>
<td>描述</td>
<td width="25%">操作</td>
</tr>
</thead>
<tbody>
{{range $k,$v := .list}}
<tr>
<td class="chk"><input type="checkbox" name="ids" value="{{$v.Id}}" /></td>
<td class="center">{{$v.Id}}</td>
<td>{{$v.GroupName}}</td>
<td>{{$v.Description}}</td>
<td>
<a class="btn btn-info btn-xs" href="{{urlfor "GroupController.Edit"}}?id={{$v.Id}}">
<span class="glyphicon glyphicon-file" aria-hidden="true"></span> 编辑
</a>
</td>
</tr>
{{end}}
</tbody>
<tfoot>
<tr>
<td colspan="7">
<div class="pull-right">
{{str2html .pageBar}}
</div>
</td>
</tr>
</tfoot>
</table>
</form>
</div>
</div>
</div>
<table class="layui-hide" id="table_list" lay-filter="table_filter">
</table>
<script type="text/html" id="bar">
<!-- <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看</a> -->
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
</div>
<script>
function batch(action) {
if ($("input[name='ids']:checked").size() < 1) {
alert_message("请选择要操作的任务","alert-danger","alert-success");
} else {
if(action=='delete'){
if(!confirm("确定要删除所选吗?")) return;
}
var url = "{{urlfor "GroupController.Batch"}}";
$.post(url + "?action=" + action, $("#form-list").serialize(), function(out) {
if (out.status != 0) {
alert_message(out.msg,"alert-danger","alert-success");
} else {
window.location.reload();
}
}, "json");
}
return false;
}
//点击行换色
$('tbody tr').click(function(){
$(this).addClass("warning").siblings().removeClass("warning");
});
layui.use(['table','form','element'], function(){
var table = layui.table;
var form = layui.form;
var element = layui.element;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
//方法级渲染
table.render({
elem: '#table_list'
,url: '/group/table'
,cols: [[
// {checkbox: true, fixed: true},
{field:'id', title: 'ID', align:'center',sort: true, width:150}
,{field:'group_name',title: '分组名称'}
,{field:'description', title: '分组说明'}
,{field:'create_time', title: '创建时间'}
,{field:'update_time', title: '更新时间'}
,{fixed: 'right', width:160, align:'center', toolbar: '#bar'}
]]
,id: 'listReload'
,page: true
,height: "full-130"
});
var $ = layui.$, active = {
reload: function(){
table.reload('listReload', {
where: {
groupName: $('#groupName').val(),
}
});
}
};
//监听工具条
table.on('tool(table_filter)', function(obj){
var data = obj.data;
if(obj.event === 'edit'){
window.location.href="/group/edit?id="+data.id
} else if(obj.event === 'del'){
layer.confirm('真的删除'+data.group_name+'分组么', function(index){
var jsData = {'id':data.id}
$.post('{{urlfor "GroupController.AjaxDel"}}', jsData, function (out) {
if (out.status == 0) {
layer.alert('删除成功了', {icon: 1},function(index){
layer.close(index);
window.location.reload();
});
} else {
layer.msg(out.message)
return
}
}, "json");
// obj.del();
layer.close(index);
})
}else{
layer.msg('操作不存在');
}
});
$('.demoTable .layui-btn').on('click', function(){
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
});
</script>

View File

@@ -1,86 +0,0 @@
<!-- 分组列表 -->
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
</div>
</div>
</div>
<div class="clearfix"></div>
</div>
<!--content-list-->
<div class="content-list">
<div class="widget-content">
<h4>Cron表达式说明</h4>
<hr />
<p>
Cron表达式是一个字符串字符串以空格隔开分为5或6个域每一个域代表一个含义系统支持的表达式格式如下<br />
<pre>Seconds Minutes Hours DayofMonth Month [DayofWeek]</pre>
其中 DayofWeek 为可选域
</p>
<p>
每一个域可出现的字符如下
<ul>
<li><b>Seconds:</b> 可出现"* / , -"四个字符有效范围为0-59的整数</li>
<li><b>Minutes:</b> 可出现"* / , -"四个字符有效范围为0-59的整数 </li>
<li><b>Hours:</b> 可出现"* / , -"四个字符有效范围为0-23的整数 </li>
<li><b>DayofMonth:</b> 可出现"* / , - ?"五个字符有效范围为0-31的整数</li>
<li><b>Month:</b> 可出现", - * /"四个字符有效范围为1-12的整数或JAN-DEC</li>
<li><b>DayofWeek:</b> 可出现"* / , - ?"五个字符有效范围为0-6的整数或SUN-SAT两个范围0表示星期天1表示星期一 依次类推 </li>
</ul>
</p>
<p>
各个字符的含义如下
<ul>
<li>* 表示匹配该域的任意值假如在Minutes域使用*, 即表示每分钟都会触发事件</li>
<li>? 字符仅被用于天和天星期两个子表达式表示不指定值当2个子表达式其中之一被指定了值以后为了避免冲突需要将另一个子表达式的值设为?</li>
<li>- 表示范围例如在Minutes域使用5-20表示从5分到20分钟每分钟触发一次</li>
<li>/ 表示起始时间开始触发然后每隔固定时间触发一次例如在Minutes域使用5/20,则意味着5分钟触发一次而2545等分别触发一次</li>
<li>, 表示列出枚举值值例如在Minutes域使用5,20则意味着在5和20分每分钟触发一次</li>
</ul>
</p>
<p>
一些例子
<pre>
0 0 10,14,16 * * ? 每天上午10点下午2点4点触发
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时触发
0 0 12 ? * WED 表示每个星期三中午12点触发
0 0 12 * * ? 每天中午12点触发
0 15 10 ? * * 每天上午10:15触发
0 15 10 * * ? 每天上午10:15触发
0 15 10 * * ? * 每天上午10:15触发
0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
0 15 10 15 * ? 每月15日上午10:15触发
0 15 10 L * ? 每月最后一日的上午10:15触发
</pre>
</p>
</div>
</div>
</div>

173
views/home/start.html Normal file
View File

@@ -0,0 +1,173 @@
<div class="layui-row ml20" >
<style>
.info-box {
height: 85px;
background-color: white;
background-color: #ecf0f5;
}
.info-box .info-box-icon {
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
display: block;
float: left;
height: 85px;
width: 85px;
text-align: center;
font-size: 45px;
line-height: 85px;
background: rgba(0, 0, 0, 0.2);
}
.info-box .info-box-content {
padding: 5px 10px;
margin-left: 85px;
}
.info-box-content .info-box-text{
font-size: 18px;
width: 100%;
display: block;
text-align: center;
color: #999;
margin: 10px auto;
}
.info-box-content .info-box-number{
font-size: 24px;
width: 100%;
display: block;
text-align: center;
}
</style>
<div>
<div class="layui-row">
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-body">
<div class="layui-row layui-col-space15">
<div class="layui-col-md3">
<div class="info-box">
<span class="info-box-icon" style="background-color:#00a65a !important;color:white;"><i class="fa fa-check" aria-hidden="true"></i></span>
<div class="info-box-content">
<span class="info-box-text">最近执行成功</span>
<span class="info-box-number">{{.okJob}}</span>
</div>
</div>
</div>
<div class="layui-col-md3">
<div class="info-box">
<span class="info-box-icon" style="background-color:#dd4b39 !important;color:white;"><i class="fa fa-exclamation" aria-hidden="true"></i></span>
<div class="info-box-content">
<span class="info-box-text">最近执行失败</span>
<span class="info-box-number">{{.failJob}}</span>
</div>
</div>
</div>
<div class="layui-col-md3">
<div class="info-box">
<span class="info-box-icon" style="background-color:#f39c12 !important;color:white;"><i class="fa fa-hourglass" aria-hidden="true"></i></span>
<div class="info-box-content">
<span class="info-box-text">即将执行的任务</span>
<span class="info-box-number">{{.startJob}}</span>
</div>
</div>
</div>
<div class="layui-col-md3">
<div class="info-box">
<span class="info-box-icon" style="background-color:#00c0ef !important;color:white;"><i class="fa fa-database" aria-hidden="true"></i></span>
<div class="info-box-content">
<span class="info-box-text">定时任务总数量</span>
<span class="info-box-number">{{.totalJob}}</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">最近执行的任务</div>
<div class="layui-card-body" style="height: 300px; padding-bottom: 10px; overflow: auto">
<table class="layui-table" lay-size="sm">
<colgroup>
<col width="50">
<col >
<col >
<col>
</colgroup>
<thead>
<tr>
<th>序号</th>
<th>任务名称</th>
<th>开始时间</th>
<th>执行结果</th>
</tr>
</thead>
<tbody>
{{range $k, $v := .recentLogs}}
<tr>
<td>{{$k}}</td>
<td><a href="{{urlfor "TaskLogController.Detail" "id" $v.id}}" class="news-item-title">
{{$v.task_name}} # {{$v.id}}
</a></td>
<td>{{$v.start_time}}</td>
<td>{{if eq $v.status 0}}
正常
{{else if eq $v.status -1}}
<span style="color:red">异常</span>
{{else}}
<span style="color:red">超时</span>
{{end}}</td>
</tr>
{{else}}
<tr>
<td colspan="3">暂无信息</td>
</tr>
{{end}}
</tbody>
</table>
</div>
</div>
</div>
<div class="layui-col-md6">
<div class="layui-card" style="background: #fff">
<div class="layui-card-header">即将执行的任务</div>
<div class="layui-card-body">
<table class="layui-table" lay-size="sm">
<colgroup>
<col>
<col>
</colgroup>
<thead>
<tr>
<th>任务名称</th>
<th>执行时间</th>
</tr>
</thead>
<tbody>
{{range $k, $v := .jobs}}
<tr>
<td><a href="{{urlfor "TaskController.Logs" "id" $v.task_id}}" class="news-item-title">{{$v.task_name}}-{{$v.task_group}} # {{$v.task_id}}</a></td>
<td>{{$v.next_time}}</td>
</tr>
{{else}}
<tr>
<td colspan="2">暂无信息</td>
</tr>
{{end}}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>

File diff suppressed because one or more lines are too long

70
views/login/login.html Normal file
View File

@@ -0,0 +1,70 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<link rel="shortcut icon" href="/static/img/favicon.ico">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>{{.siteName}} 登录</title>
<link rel="stylesheet" href="/static/layui/css/layui.css?t=1504439386550" media="all">
<link rel="stylesheet" href="/static/login/css/login.css?t=1504439386551" media="all">
</head>
<!--登录超时跳出框架显示登录页 start-->
<script>
if(self.location !== top.location){
top.location = self.location;
}
</script>
<!--登录超时跳出框架显示登录页 end-->
<body>
<div class="layui-carousel video_mask bg-img" id="login_carousel" >
<div class="login layui-anim layui-anim-up">
<h1>PPGo_Job管理后台</h1></p>
<form class="layui-form" action="javascript:void(0);" name="form" method="post">
<div class="layui-form-item">
<input type="text" name="username" lay-verify="required" placeholder="请输入账号" autocomplete="off" value="{{.username}}" class="layui-input">
</div>
<div class="layui-form-item">
<input type="password" name="password" lay-verify="required" placeholder="请输入密码" autocomplete="off" value="" class="layui-input">
</div>
<button class="layui-btn login_btn" lay-submit="" lay-filter="login">登陆系统</button>
</form>
</div>
</div>
<script src="/static/layui/layui.js?t=1504439386550" charset="utf-8"></script>
<!-- <script src="https://cdn.bootcss.com/jquery/1.8.3/jquery.js"></script>-->
<script type="text/javascript">
layui.use(['layer','form'], function(){
var $ = layui.$;
var form = layui.form;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
form.on('submit(login)', function(data){
var form_data = $("form").serialize();
$.post('{{urlfor "LoginController.LoginIn"}}', form_data, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.location.href="/home"
})
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
})
</script>
</body>
</html>

View File

@@ -1,141 +0,0 @@
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
</div>
</div>
</div>
<div class="clearfix"></div>
</div>
<!--content-list-->
<div class="content-list">
<div class="row" style="height: 120px">
<div class="col-md-3">
<div class="content" style="height: 110px;">
<div class="w30 left-icon pull-left">
<span class="glyphicon glyphicon-ok green"></span>
</div>
<div class="w70 right-title pull-right">
<div class="title-content">
<p>最近执行成功</p>
<h3 class="number">{{.okJob}}</h3>
</div>
</div>
<div class="clearfix"></div>
</div>
</div>
<div class="col-md-3">
<div class="content" style="height: 110px;">
<div class="w30 left-icon pull-left">
<span class="glyphicon glyphicon-remove" style="background:#d9534f"></span>
</div>
<div class="w70 right-title pull-right">
<div class="title-content">
<p>最近执行失败</p>
<h3 class="number">{{.failJob}}</h3>
</div>
</div>
<div class="clearfix"></div>
</div>
</div>
<div class="col-md-3">
<div class="content" style="height: 110px;">
<div class="w30 left-icon pull-left">
<span class="glyphicon glyphicon-hourglass orange"></span>
</div>
<div class="w70 right-title pull-right">
<div class="title-content">
<p>即将执行的任务</p>
<h3 class="number">{{.startJob}}</h3>
</div>
</div>
<div class="clearfix"></div>
</div>
</div>
<div class="col-md-3">
<div class="content" style="height: 110px;">
<div class="w30 left-icon pull-left">
<span class="glyphicon glyphicon-stats violet"></span>
</div>
<div class="w70 right-title pull-right">
<div class="title-content">
<p>定时任务总数量</p>
<h3 class="number">{{.totalJob}}</h3>
</div>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
<!--信息列表-->
<div class="row newslist" style="margin-top:20px;">
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
最近执行的任务
<a href="/" class="pull-right">
<span class="glyphicon glyphicon-refresh"></span>
</a>
</div>
{{range $k, $v := .recentLogs}}
<div class="panel-body">
<div class="w45 pull-left">
<a href="{{urlfor "TaskController.ViewLog" "id" $v.id}}" class="news-item-title">
{{$v.task_name}} # {{$v.id}}
</a>
</div>
<div class="w45 pull-left">{{$v.start_time}} </div>
<div class="w10 pull-left">
{{if eq $v.status 0}}
正常
{{else if eq $v.status -1}}
<span style="color:red">异常</span>
{{else}}
<span style="color:red">超时</span>
{{end}}
</div>
</div>
{{else}}
<div class="panel-body">
<div style="width: 100%">暂无信息</div>
</div>
{{end}}
</div>
</div>
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
即将执行的任务
<a href="/" class="pull-right"><span class="glyphicon glyphicon-refresh"></span></a>
</div>
{{range $k, $v := .jobs}}
<div class="panel-body">
<div class="w50 pull-left">
<a href="{{urlfor "TaskController.Logs" "id" $v.task_id}}" class="news-item-title">{{$v.task_name}}-{{$v.task_group}} # {{$v.task_id}}</a>
</div>
<div class="w50 pull-left">{{$v.next_time}}</div>
</div>
{{else}}
<div class="panel-body">
<div style="width: 100%">暂无信息</div>
</div>
{{end}}
</div>
</div>
</div>
</div>
</div>

View File

@@ -1,90 +0,0 @@
<!-- 个人资料 -->
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
</div>
</div>
</div>
</div>
<!--content-list-->
<div class="content-list">
<form action="{{urlfor "MainController.Profile"}}" method="post" class="form-horizontal">
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="user_name">用户名</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="user_name" value="{{.user.UserName}}" disabled="" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="email">Email</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="email" value="{{.user.Email}}" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="password1">新密码</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="password1" value="" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
<i>不修改密码请留空</i>
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="password2">确认密码</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="password2" value="" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
</div>
<br />
<div class="modal-footer" style="text-align:center">
<button type="submit" class="btn btn-primary submit_attr_button">保存</button>
<button type="button" class="btn btn-default reback">返回</button>
</div>
</form>
</div>
</div>
<script>
$(function () {
$("form").submit(function () {
// console.log($(this).serialize());
//$("button[type='submit']").attr('disabled', true);
$.post('{{urlfor "MainController.Profile"}}', $(this).serialize(), function (out) {
if (out.status == 0) {
alert("保存成功");
window.location.href = '{{urlfor "MainController.Index"}}';
} else {
alert_message(out.msg,"alert-danger","alert-success");
$("button[type='submit']").attr('disabled', false);
}
}, "json");
return false;
});
});
</script>

View File

@@ -1,349 +1,46 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">
<title>定时任务管理后台</title>
<link href="/static/bootstrap/css/bootstrap.min.css" title="" rel="stylesheet" />
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>{{.siteName}}</title>
{{if .zTree}}
<link rel="stylesheet" href="/static/zTree3/css/demo.css?t=5" type="text/css">
<link rel="stylesheet" href="/static/zTree3/css/zTreeStyle/zTreeStyle.css" type="text/css">
{{end}}
<link rel="stylesheet" href="/static/layui/css/layui.css">
<link rel="stylesheet" href="/static/admin/css/app.css?t=2">
<link rel="stylesheet" href="/static/font-awesome/css/font-awesome.min.css" media="all">
</head>
<body>
<!-- 公共头部 start-->
<div class="nav-title">
<div class="tl fl">
<a onclick="javascript:history.go(-1);" style="font-size: 14px;"><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
{{.pageTitle}}
</div>
<div class="tr fr">
<button class="layui-btn layui-btn-radius layui-btn-primary layui-btn-xs" onclick="javascript:history.go(-1);"><i class="fa fa-arrow-left" aria-hidden="true"></i></button>
<button class="layui-btn layui-btn-radius layui-btn-primary layui-btn-xs" onclick="javascript:window.location.reload();"><i class="fa fa-refresh" aria-hidden="true"></i></button>
<link title="" href="/static/css/style.css" rel="stylesheet" type="text/css" />
<link title="blue" href="/static/css/dermadefault.css" rel="stylesheet" type="text/css"/>
<link title="green" href="/static/css/dermagreen.css" rel="stylesheet" type="text/css" disabled="disabled"/>
<link title="orange" href="/static/css/dermaorange.css" rel="stylesheet" type="text/css" disabled="disabled"/>
<link href="/static/css/templatecss.css" rel="stylesheet" title="" type="text/css" />
<script src="/static/js/jquery-1.11.1.min.js" type="text/javascript"></script>
<script src="/static/js/jquery.cookie.js" type="text/javascript"></script>
<script src="/static/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
</head>
<body>
<nav class="nav navbar-default navbar-mystyle navbar-fixed-top">
<div class="navbar-header">
<button class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand mystyle-brand">
<span class="glyphicon glyphicon-time"></span>
</a>
</div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li class="li-border">
<a class="mystyle-color" href="#" style="font-size: 20px">定时任务管理后台 <span style="font-size: 12px">V1.2</span></a>
</li>
</ul>
<ul class="nav navbar-nav pull-right">
<li class="li-border">
<a class="mystyle-color" href="#" id="server-time" style="font-size: 10px"></a>
</li>
</ul>
<ul class="nav navbar-nav pull-right">
<li class="li-border">
<a href="#" class="mystyle-color">
<span class="glyphicon glyphicon-bell"></span>
<span class="topbar-num">0</span>
</a>
</li>
<li class="dropdown li-border">
<a href="#" class="dropdown-toggle mystyle-color" data-toggle="dropdown">
帮助文档<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li><a href="/help">帮助文档</a></li>
</ul>
</li>
<li class="dropdown li-border">
<a href="#" class="dropdown-toggle mystyle-color" data-toggle="dropdown">
{{.loginUserName}}<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li><a href="/logout">退出</a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle mystyle-color" data-toggle="dropdown">
换肤<span class="caret"></span>
</a>
<ul class="dropdown-menu changecolor">
<li id="blue"><a href="#">蓝色</a></li>
<li class="divider"></li>
<li id="green"><a href="#">绿色</a></li>
<li class="divider"></li>
<li id="orange"><a href="#">橙色</a></li>
</ul>
</li>
</ul>
</div>
</nav>
</div>
</div>
<!-- 公共头部 end-->
<script src="/static/layui/layui.js"></script>
{{.LayoutContent}}
<div class="down-main">
<div class="left-main left-full">
<div class="sidebar-fold">
<span class="glyphicon glyphicon-menu-hamburger"></span>
</div>
<script>
<div class="subNavBox">
<div class="sBox">
<ul class="navContent" >
<li {{if eq .curRoute "main.index"}}class="active"{{end}} id="home_page">
<a href="/">
<span class="sublist-icon glyphicon glyphicon-home"></span><span class="sub-title">系统首页</span>
</a>
</li>
</ul>
</div>
</div>
<div class="subNavBox">
<div class="sBox">
<div class="subNav sublist-down">
<span class="title-icon glyphicon glyphicon-chevron-down"></span>
<span class="sublist-title">任务管理</span>
</div>
<ul class="navContent" style="display:block">
<li {{if eq .menuTag "task"}}class="active"{{end}}>
<div class="showtitle" style="width:100px;">
任务列表
</div>
<a href="/task/list">
<span class="sublist-icon glyphicon glyphicon-th-list"></span>
<span class="sub-title">任务列表</span>
</a>
</li>
layui.use(['table','form','element'], function(){
var table = layui.table;
var form = layui.form;
var element = layui.element;
<li {{if eq .menuTag "group"}}class="active"{{end}}>
<div class="showtitle" style="width:100px;">
任务分类
</div>
<a href="/group/list">
<span class="sublist-icon glyphicon glyphicon-bookmark"></span>
<span class="sub-title">任务分类</span>
</a>
</li>
<li {{if eq .curRoute "help.index"}}class="active"{{end}}>
<div class="showtitle" style="width:100px;">
使用帮助
</div>
<a href="/help">
<span class="sublist-icon glyphicon glyphicon-question-sign"></span>
<span class="sub-title">使用帮助</span>
</a>
</li>
</ul>
</div>
</div>
});
<div class="subNavBox">
<div class="sBox">
<div class="subNav sublist-down">
<span class="title-icon glyphicon glyphicon-chevron-down"></span>
<span class="sublist-title">资源管理</span>
</div>
<ul class="navContent" >
<li {{if eq .menuTag "server"}}class="active"{{end}}>
<div class="showtitle" style="width:100px;">
服务器
</div>
<a href="/server/list">
<span class="sublist-icon glyphicon glyphicon-hdd"></span>
<span class="sub-title">服务器</span>
</a>
</li>
</ul>
</div>
</div>
<div class="subNavBox">
<div class="sBox">
<div class="subNav sublist-down">
<span class="title-icon glyphicon glyphicon-chevron-down"></span>
<span class="sublist-title">账户管理</span>
</div>
<ul class="navContent" >
<li {{if eq .curRoute "main.profile"}}class="active"{{end}}>
<div class="showtitle" style="width:100px;">
资料修改
</div>
<a href="/profile">
<span class="sublist-icon glyphicon glyphicon-user"></span>
<span class="sub-title">资料修改</span>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="right-product view-product right-full">
<!--message start-->
<div class="message">
<div class="alert alert-danger box" role="alert" style="padding: 0px; line-height: 40px">
<div class="col-sm-1 pull-right">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
</div>
<div class="col-sm-11 pull-left">
<strong id="message">保存成功</strong>
</div>
</div>
</div>
<!--message end-->
{{.LayoutContent}}
</div>
</div>
<script type="text/javascript">
function alert_message(message,addClass,removeClass)
{
$('.box').addClass(addClass);
$('.box').removeClass(removeClass);
$("#message").html(message);
$('.message').fadeIn(1000);
$('.message').fadeOut(5000);
}
$(function(){
/*换肤*/
$(".dropdown .changecolor li").click(function(){
var style = $(this).attr("id");
$("link[title!='']").attr("disabled","disabled");
$("link[title='"+style+"']").removeAttr("disabled");
$.cookie('mystyle', style, { expires: 7 }); // 存储一个带7天期限的 cookie
})
var cookie_style = $.cookie("mystyle");
if(cookie_style!=null){
$("link[title!='']").attr("disabled","disabled");
$("link[title='"+cookie_style+"']").removeAttr("disabled");
}
/*左侧导航栏显示隐藏功能*/
$(".subNav").click(function(){
/*显示*/
if($(this).find("span:first-child").attr('class')=="title-icon glyphicon glyphicon-chevron-down")
{
$(this).find("span:first-child").removeClass("glyphicon-chevron-down");
$(this).find("span:first-child").addClass("glyphicon-chevron-up");
$(this).removeClass("sublist-down");
$(this).addClass("sublist-up");
}
/*隐藏*/
else
{
$(this).find("span:first-child").removeClass("glyphicon-chevron-up");
$(this).find("span:first-child").addClass("glyphicon-chevron-down");
$(this).removeClass("sublist-up");
$(this).addClass("sublist-down");
}
// 修改数字控制速度, slideUp(500)控制卷起速度
$(this).next(".navContent").slideToggle(300).siblings(".navContent").slideUp(300);
})
/*左侧导航栏缩进功能*/
$(".left-main .sidebar-fold").click(function(){
if($(this).parent().attr('class')=="left-main left-full")
{
$(this).parent().removeClass("left-full");
$(this).parent().addClass("left-off");
$(this).parent().parent().find(".right-product").removeClass("right-full");
$(this).parent().parent().find(".right-product").addClass("right-off");
}
else
{
$(this).parent().removeClass("left-off");
$(this).parent().addClass("left-full");
$(this).parent().parent().find(".right-product").removeClass("right-off");
$(this).parent().parent().find(".right-product").addClass("right-full");
}
})
/*左侧鼠标移入提示功能*/
$(".sBox ul li").mouseenter(function(){
if($(this).find("span:last-child").css("display")=="none")
{$(this).find("div").show();}
}).mouseleave(function(){$(this).find("div").hide();})
});
/*刷新*/
$(".refresh").on("click",function() {
window.location.reload();
});
/*返回上一页*/
$(".reback").on("click",function() {
window.history.go(-1);
});
/*全选*/
$("input[name=all_check]").click(function(){
var all_status = this.checked;
//全选
if(all_status == true){
$(".chk").find("input[type=checkbox]").each(function(){
if($(this).val()>0){
$(this).prop("checked",true);
}
});
}
if(all_status == false){
//反选
$(".chk").find("input[type=checkbox]:checked").each(function(){
if($(this).val()>0){
$(this).prop("checked",false);
}
});
}
});
</script>
//服务器时间
Date.prototype.Format = function (fmt) {
var o = {
"M+": this.getMonth() + 1,
"d+": this.getDate(),
"h+": this.getHours(),
"m+": this.getMinutes(),
"s+": this.getSeconds(),
"q+": Math.floor((this.getMonth() + 3) / 3),
"S": this.getMilliseconds()
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
$(function () {
$('.subnavbar').find ('li').each (function (i) {
var mod = i % 3;
if (mod === 2) {
$(this).addClass ('subnavbar-open-right');
}
});
initTime = new Date().getTime();
$.getJSON("/gettime", function(out) {
setTime(initTime, out.time);
});
});
function setTime(initTime,serverTime) {
ellapsedTime = new Date().getTime()-initTime;
$('#server-time').html('当前服务器时间: <strong>'+new Date(serverTime+ellapsedTime).Format("yyyy-MM-dd hh:mm:ss")+'</strong>');
setTimeout('setTime('+initTime+','+serverTime+');',500);
}
</script>
</body>
</html>
</body>
</html>

View File

@@ -1,93 +0,0 @@
<!DOCTYPE html>
<html class="login_page_html">
<head>
<meta charset="UTF-8">
<title>登录</title>
<link rel='shortcut icon' href="/static/img/favicon.png"/>
<link rel="stylesheet" type="text/css" href="/static/login/style.css" />
<link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
</head>
<!--登录超时跳出框架显示登录页 start-->
<script>
if(self.location !== top.location){
top.location = self.location;
}
</script>
<style type="text/css">
/**
* 提示信息框
*/
.message{
width: 100%;
height: 100%;
position: fixed;
left: 0px;
top: 0px;
z-index: 9999;
display: none;
}
.message .box{
position: absolute;
left: 0%;
top: 0%;
width: 100%;
height: 40px;
text-align: center;
}
</style>
<!--登录超时跳出框架显示登录页 end-->
<body class="login_page">
<div class="login_page_bg">
<div class="login_page_panel">
<h1 style="color: #fff;font-size: 40px;text-align:center;">定时任务管理</h1>
<form action="/login" method="post">
<div class="username">
<input type="text" name="username" id="username" class="box_sizing" autofocus="autofocus" autocomplete="off" placeholder="账号" required />
</div>
<div class="password">
<input type="password" name="password" id="password" class="box_sizing" placeholder="密码" required />
</div>
<div class="remember" style="margin-top: 10px;color: #fff">
<input type="checkbox" name="remember" id="remember" value="yes"> &nbsp;&nbsp;一周内自动登录
</div>
<div class="login_button">
<button id="login_button" class="box_sizing">&nbsp;&nbsp;</button>
</div>
</form>
</div>
</div>
<!--message start-->
<div class="message">
<div class="alert alert-danger box" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<strong id="message">保存成功</strong>
</div>
</div>
<!--message end-->
<script src="/static/js/jquery-1.11.1.min.js"></script>
<script src="/static/bootstrap/js/bootstrap.js"></script>
<script type="text/javascript">
//alert-success alert-danger
function alert_message(message,addClass,removeClass)
{
$('.box').addClass(addClass);
$('.box').removeClass(removeClass);
$("#message").html(message);
$('.message').fadeIn(1000);
$('.message').fadeOut(4000);
}
var error_info = "{{.flash.error}}";
if(error_info)
{
alert_message(error_info,"alert-danger","alert-success");
}
</script>
</body>
</html>

196
views/public/main.html Normal file
View File

@@ -0,0 +1,196 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>{{.siteName}}</title>
<link rel="stylesheet" href="/static/layui/css/layui.css">
<link rel="stylesheet" href="/static/admin/css/main.css?t=10">
<link rel="stylesheet" href="/static/font-awesome/css/font-awesome.min.css" media="all">
</head>
<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
<div class="layui-header">
<div class="layui-logo">{{.siteName}}{{.version}}</div>
<!-- 头部区域可配合layui已有的水平导航 -->
<ul class="layui-nav layui-layout-left">
</ul>
<ul class="layui-nav layui-layout-right pp-nav-item" >
<li class="layui-nav-item"><a href="/login_out">使用手册</a></li>
<li class="layui-nav-item pp-nav-item" >
<a href="javascript:;">
<img src="/static/admin/images/header.jpg" class="layui-nav-img"> {{.loginUserName}}
</a>
<dl class="layui-nav-child pp-nav-child">
{{/*<dd><a href="/user/edit">资料修改</a></dd>*/}}
<dd><a href="/login_out">华丽退出</a></dd>
</dl>
</li>
</ul>
</div>
<div class="layui-side layui-bg-black pp-side">
<div class="layui-side-scroll" style="width: 100%">
<div class="pp-side-fold"><i class="fa fa-navicon" aria-hidden="true"></i></div>
<!-- 左侧导航区域可配合layui已有的垂直导航 -->
<ul class="layui-nav layui-nav-tree" lay-filter="nav-side">
<li class="layui-nav-item layui-nav-itemed layui-this">
<a data-url="start.html" data-icon="fa-home" data-title="系统首页" data-id="0" class="pointer">
<i class="fa fa-home back_space1"></i><span>系统首页</span>
</a>
</li>
{{range $index, $elem := .SideMenu1}}
{{if $elem}}
<li class="layui-nav-item">
<a class="" href="javascript:;">
<i class="fa {{$elem.Icon}}"></i> &nbsp;&nbsp;<span>{{$elem.AuthName}}</span>
</a>
<dl class="layui-nav-child pp-nav-childs">
{{range $i, $e := $.SideMenu2}}
{{if eq $e.Pid $elem.Id}}
<dd>
<a data-url="{{$e.AuthUrl}}" data-icon="&#xe715;" data-title="{{$e.AuthName}}" class="pointer" data-id="{{$e.Id}}">
<i class="fa {{$e.Icon}}"></i> &nbsp;&nbsp;<span>{{$e.AuthName}}</span>
</a>
</dd>
{{end}}
{{end}}
</dl>
</li>
{{end}}
{{end}}
</ul>
</div>
</div>
<div class="layui-body" style="overflow: hidden;">
<!-- 内容主体区域 -->
<div class="layui-tab pp-tab" lay-filter="main_tab" lay-allowClose="true">
<ul class="layui-tab-title" style="background: #efefef">
<li class="pp-tab-li layui-this" id="default_tab" lay-id="0"><i class="fa fa-home back_space1"></i>系统首页</li>
</ul>
<div class="layui-tab-content" style="padding: 0px; ">
<div class="layui-tab-item layui-show" style="margin: 0px;overflow:hidden;">
<iframe src="/home/start" frameborder="0" scrolling="yes"></iframe>
</div>
</div>
</div>
</div>
<div class="layui-footer" style="border-top: 2px solid #e4e4e4">
<!-- 底部固定区域 -->
© Power by <a href="http://www.haodaquan.com" target="_blank">PPGo_Job V2</a>
</div>
</div>
<script src="/static/layui/layui.js"></script>
<script>
//JavaScript代码区域
var $;
layui.use(['element','jquery','layer'], function(){
var element = layui.element;
$ = layui.jquery;
var layer = layui.layer;
var width,height;
//frame大小适应开始
resizeFrame();
window.onresize = function(){
resizeFrame();
}
function resizeFrame()
{
height = $(".layui-body").height()-40;
width = $(".layui-body").width();
$(".ayui-tab-content").width(width);
$(".ayui-tab-content").height(height);
$(".layui-tab-item").height(height);
$(".layui-tab-item").find("iframe").height(height);
$(".layui-tab-item").find("iframe").width(width);
}
//frame大小适应结束
//左侧菜单栏缩放
$('.pp-side-fold').on('click',function(){
var side_width = $(".layui-side").width();
if (side_width>50) {
$(".layui-side").width(50);
$(this).parent().find('span').hide();
$(".layui-body").addClass('pp-main');
$(".layui-footer").addClass('pp-main');
$(".layui-nav-child").find('dd').addClass('pp-ddsided');
$(".layui-nav-child").find('a').addClass('pp-pointer');
resizeFrame();
}else{
$(".layui-side").width(200);
$(this).parent().find('span').show();
$(".layui-body").removeClass('pp-main');
$(".layui-footer").removeClass('pp-main');
$(".layui-nav-child").find('dd').removeClass('pp-ddsided');
$(".layui-nav-child").find('a').removeClass('pp-pointer');
resizeFrame();
}
})
//添加标签
element.on('nav(nav-side)', function(elem){
var url = elem.attr('data-url');
var title = elem.attr('data-title');
var id = elem.attr('data-id');
var icon = elem.attr('data-icon');
if (!url || !title || !id) {
return;
}
//判断是否存在
var is_exist = 0;
$(".layui-tab-title").find("li").each(function(){
var nav_id = $(this).attr("lay-id");
if (nav_id==id) {
is_exist = 1
}
})
if (is_exist==1) {
element.tabChange("main_tab", id);
}else{
var content = '<iframe src="'+url+'" scrolling="yes" width="'+width+'" height="'+height+'" frameborder="0"></iframe>';
title = '<i class="fa '+icon+' back_space1"></i>'+title;
element.tabAdd('main_tab', {
title: title
,content: content //支持传入html
,id: id
});
element.tabChange("main_tab", id);
}
});
//tab标签选中菜单栏状态
$(".layui-tab-title").on("click","li",function(){
var id = $(this).attr('lay-id');
if (!id) {return;}
var sid = 0;
$(".layui-nav-item").find("a").each(function(){
sid = $(this).attr("data-id");
if (sid==id) {
$(this).click();
}
})
})
//tips
$(".pp-nav-childs").find('a').hover(function(){
layer.tips($(this).attr('data-title'), $(this),{time:1000});
});
element.render();
// $("#default_tab").html('<i class="fa fa-home back_space1"></i>系统首页');
});
</script>
</body>
</html>

234
views/role/add.html Normal file
View File

@@ -0,0 +1,234 @@
<script type="text/javascript" src="/static/admin/js/jquery.min.js"></script>
<script type="text/javascript" src="/static/zTree3/js/jquery.ztree.core.js"></script>
<script type="text/javascript" src="/static/zTree3/js/jquery.ztree.excheck.js"></script>
<script type="text/javascript" src="/static/zTree3/js/jquery.ztree.exedit.js"></script>
<div class="layui-row">
<div style="margin: 10px 20px">
<blockquote class="layui-elem-quote">
说明新增角色
</blockquote>
</div>
<div class="layui-col-md12">
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<form class="layui-form" action="" onsubmit="javascript:;" name="form" method="post">
<div class="layui-form-item">
<label class="layui-form-label">菜单操作</label>
<div class="layui-input-inline mw400 zTreeDemoBackground">
<ul id="treeDemo" class="ztree" style="height:320px; width: auto; margin-bottom: 10px;">
</ul>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">资源分组</label>
<div class="layui-input-inline mw400 ">
<input type="checkbox" name="server_group_id" lay-filter="server_group_id" title="本地服务器组" value="0" lay-skin="primary" checked>
{{range $k, $v := .serverGroup}}
<input type="checkbox" name="server_group_id" lay-filter="server_group_id" title="{{$v.GroupName}}" value="{{$v.GroupId}}" lay-skin="primary">
{{end}}
<input type="hidden" name="server_group_ids" id="server_group_ids" value="">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">任务分组</label>
<div class="layui-input-inline mw400 ">
{{range $k, $v := .taskGroup}}
<input type="checkbox" name="task_group_id" lay-filter="task_group_id" title="{{$v}}" value="{{$k}}" lay-skin="primary">
{{end}}
<input type="hidden" name="task_group_ids" id="task_group_ids" value="">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">角色名称</label>
<div class="layui-input-inline mw400">
<input type="text" name="role_name" id="role_name" lay-verify="required" autocomplete="off" placeholder="请输入角色名称" class="layui-input">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label ">备注</label>
<div class="layui-input-inline mw400">
<textarea name="detail" id="detail" placeholder="请输入内容" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit="" lay-filter="save">保存</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
</div>
</div>
<script>
var $,form;
layui.config({
base : "js/"
}).use(['form','element','layer','jquery'],function(){
form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
$ = layui.jquery;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
// layer = layui.layer
var server_group_ids = [];
form.on('checkbox(server_group_id)', function(data){
if(data.elem.checked==true){
server_group_ids.push(data.value)
}else{
$.each(server_group_ids,function(index,item){
// index是索引值即下标 item是每次遍历得到的值
if(item==data.value){
server_group_ids.splice(index,1);
}
});
}
$("#server_group_ids").val(server_group_ids.join(","));
});
var task_group_ids = [];
form.on('checkbox(task_group_id)', function(data){
if(data.elem.checked==true){
task_group_ids.push(data.value)
}else{
$.each(task_group_ids,function(index,item){
// index是索引值即下标 item是每次遍历得到的值
if(item==data.value){
task_group_ids.splice(index,1);
}
});
}
$("#task_group_ids").val(task_group_ids.join(","));
});
$("form").submit(function () {
var role_name = $("#role_name").val();
if(!role_name){
layer.msg('请填写角色名称');
return false;
}
var detail = $("#detail").val();
var treeObj = $.fn.zTree.getZTreeObj("treeDemo");
var nodes = treeObj.getCheckedNodes(true);
var nodes_data = nodes_select_data(nodes,{});
var server_group_ids = $("#server_group_ids").val();
var task_group_ids = $("#task_group_ids").val();
if (!task_group_ids){
layer.msg('请选择任务分组');
return false;
}
var data = {'role_name':role_name,'detail':detail,'nodes_data':nodes_data,'server_group_ids':server_group_ids,'task_group_ids':task_group_ids}
$.post('{{urlfor "RoleController.AjaxSave"}}', data, function (out) {
if (out.status == 0) {
layer.alert('保存成功了', {icon: 1},function(index){
window.history.go(-1)
});
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
form.render();
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
});
</script>
<script type="text/javascript">
var zNodes = [{ id:1, pId:0, name:"数据错误"}];
// $(document).ready(function(){
var setting = {
check: {
enable: true
},
data: {
simpleData: {
enable: true
}
}
};
//加载树
refresh_tree();
function refresh_tree()
{
var time = Date.parse(new Date());
$.ajax({
type: "POST",
url: "/auth/getnodes",
data: {time:time},
dataType: 'json',
success: function(data) {
if(data.code==0){
zNodes = data.data;
$.fn.zTree.init($("#treeDemo"), setting, zNodes);
}
}
});
setCheck();
$("#py").bind("change", setCheck);
$("#sy").bind("change", setCheck);
$("#pn").bind("change", setCheck);
$("#sn").bind("change", setCheck);
}
function nodes_select_data(obj,nodes)
{
var nodes_str = '';
$.each(obj,function(k,v){
if(!v['name']) return nodes;
node_id = v["id"]
var i = 0;
for (var j in nodes) { i++}
nodes_str += v['id']+","
});
return nodes_str;
}
function setCheck() {
type = { "Y" : "ps", "N" : "ps" };
setting.check.chkboxType = type;
}
function showCode(str) {
var code = $("#code");
code.empty();
for (var i=0, l=str.length; i<l; i++) {
code.append("<li>"+str[i]+"</li>");
}
}
function formSubmit() {
}
// });
</script>

250
views/role/edit.html Normal file
View File

@@ -0,0 +1,250 @@
<script type="text/javascript" src="/static/admin/js/jquery.min.js"></script>
<script type="text/javascript" src="/static/zTree3/js/jquery.ztree.core.js"></script>
<script type="text/javascript" src="/static/zTree3/js/jquery.ztree.excheck.js"></script>
<script type="text/javascript" src="/static/zTree3/js/jquery.ztree.exedit.js"></script>
<div class="layui-row">
<div style="margin: 10px 20px">
<blockquote class="layui-elem-quote">
修改角色以及角色权限
</blockquote>
</div>
<div class="layui-col-md7">
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<form class="layui-form" action="" onsubmit="javascript:;" name="form" method="post">
<div class="layui-form-item">
<label class="layui-form-label">菜单操作</label>
<div class="layui-input-inline mw400 zTreeDemoBackground">
<ul id="treeDemo" class="ztree" style="height:320px; width: auto; margin-bottom: 10px;">
</ul>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">资源分组</label>
<div class="layui-input-inline mw400 ">
<input type="checkbox" name="server_group_id" lay-filter="server_group_id" title="本地服务器组" value="0" lay-skin="primary" checked>
{{range $k, $v := .serverGroup}}
<input type="checkbox" name="server_group_id" lay-filter="server_group_id" title="{{$v.GroupName}}" value="{{$v.GroupId}}" {{range $ks,$vs:=$.server_group_ids}} {{if eq $v.GroupId $vs}}checked{{end}}{{end}} lay-skin="primary">
{{end}}
<input type="hidden" name="server_group_ids" id="server_group_ids" value="{{.role.server_group_ids}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">任务分组</label>
<div class="layui-input-inline mw400 ">
{{range $k, $v := .taskGroup}}
<input type="checkbox" name="task_group_id" lay-filter="task_group_id" title="{{$v}}" value="{{$k}}" {{range $ks,$vs:=$.task_group_ids}} {{if eq $k $vs}}checked{{end}}{{end}} lay-skin="primary">
{{end}}
<input type="hidden" name="task_group_ids" id="task_group_ids" value="{{.role.task_group_ids}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">角色名称</label>
<div class="layui-input-inline">
<input type="text" name="role_name" id="role_name" lay-verify="required" autocomplete="off" placeholder="请输入角色名称" class="layui-input" value="{{.role.role_name}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">备注</label>
<div class="layui-input-block">
<textarea name="detail" id="detail" placeholder="请输入内容" class="layui-textarea">{{.role.detail}}</textarea>
</div>
</div>
<input type="hidden" value="{{.role.id}}" name="id" id="id">
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit="" lay-filter="save">保存</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
</div>
</div>
<script>
var $,form;
layui.config({
base : "js/"
}).use(['form','element','layer','jquery'],function(){
form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
$ = layui.jquery;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
var server_group_ids_str = $("#server_group_ids").val();
var server_group_ids = server_group_ids_str.split(",");
form.on('checkbox(server_group_id)', function(data){
if(data.elem.checked==true){
server_group_ids.push(data.value)
}else{
$.each(server_group_ids,function(index,item){
// index是索引值即下标 item是每次遍历得到的值
if(item==data.value){
server_group_ids.splice(index,1);
}
});
}
$("#server_group_ids").val(server_group_ids.join(","));
});
var task_group_ids_str = $("#task_group_ids").val();
var task_group_ids = task_group_ids_str.split(",");
form.on('checkbox(task_group_id)', function(data){
if(data.elem.checked==true){
task_group_ids.push(data.value)
}else{
$.each(task_group_ids,function(index,item){
// index是索引值即下标 item是每次遍历得到的值
if(item==data.value){
task_group_ids.splice(index,1);
}
});
}
$("#task_group_ids").val(task_group_ids.join(","));
});
$("form").submit(function () {
var role_name = $("#role_name").val();
if(!role_name){
layer.msg('请填写角色名称');
return false;
}
var id = $("#id").val()
var detail = $("#detail").val();
var treeObj = $.fn.zTree.getZTreeObj("treeDemo");
var nodes = treeObj.getCheckedNodes(true);
var nodes_data = nodes_select_data(nodes,{});
var server_group_ids = $("#server_group_ids").val();
var task_group_ids = $("#task_group_ids").val();
if (!task_group_ids){
layer.msg('请选择任务分组');
return false;
}
var data = {'role_name':role_name,'id':id,'detail':detail,'nodes_data':nodes_data,'server_group_ids':server_group_ids,'task_group_ids':task_group_ids}
$.post('{{urlfor "RoleController.AjaxSave"}}', data, function (out) {
if (out.status == 0) {
layer.alert('保存成功了', {icon: 1},function(index){
layer.close(index);
window.location.href="/role/list"
});
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
form.render();
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
});
</script>
<script type="text/javascript">
var zNodes = [{ id:1, pId:0, name:"数据错误"}];
var checked = {{.auth}}
// console.log(checked)
// $(document).ready(function(){
var setting = {
check: {
enable: true
},
data: {
simpleData: {
enable: true
}
}
};
//加载树
refresh_tree();
function refresh_tree()
{
var time = Date.parse(new Date());
$.ajax({
type: "POST",
url: "/auth/getnodes",
data: {time:time},
dataType: 'json',
success: function(data) {
if(data.code==0){
zNodes = init_checked(data.data);
$.fn.zTree.init($("#treeDemo"), setting, zNodes);
}
}
});
setCheck();
$("#py").bind("change", setCheck);
$("#sy").bind("change", setCheck);
$("#pn").bind("change", setCheck);
$("#sn").bind("change", setCheck);
}
function init_checked(zNodes) {
$.each(zNodes,function(k,v){
if($.inArray(v.id,checked)>=0){
v.checked = true;
}
});
return zNodes;
}
function nodes_select_data(obj,nodes)
{
var nodes_str = '';
$.each(obj,function(k,v){
if(!v['name']) return nodes;
node_id = v["id"]
var i = 0;
for (var j in nodes) { i++}
nodes_str += v['id']+","
});
return nodes_str;
}
function setCheck() {
type = { "Y" : "ps", "N" : "ps" };
setting.check.chkboxType = type;
}
function showCode(str) {
var code = $("#code");
code.empty();
for (var i=0, l=str.length; i<l; i++) {
code.append("<li>"+str[i]+"</li>");
}
}
function formSubmit() {
}
// });
</script>

95
views/role/list.html Normal file
View File

@@ -0,0 +1,95 @@
<div class="layui-layout layui-layout-admin" style="padding-left: 20px;">
<div class="layui-row" style="margin-top: 20px;">
<div class="layui-col-xs6">
<a class="layui-btn" data-type="tabAdd" href="/role/add">新增</a>
</div>
<div class="layui-col-xs6 search_text">
<form class="layui-form" action="" onsubmit="javascript:return false;">
<div class="demoTable">
<div class="layui-inline" style="width: 40%">
<input class="layui-input" name="roleName" id="roleName" autocomplete="off" placeholder="角色名称" >
</div>
<button class="layui-btn" data-type="reload">查询</button>
</div>
</form>
</div>
</div>
<table class="layui-hide" id="table_list" lay-filter="table_filter">
</table>
<script type="text/html" id="bar">
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
</div>
<script>
layui.use(['table','form','element'], function(){
var table = layui.table;
var form = layui.form;
var element = layui.element;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
//方法级渲染
table.render({
elem: '#table_list'
,url: '/role/table'
,cols: [[
// {checkbox: true, fixed: true},
{field:'id', title: 'ID', align:'center',sort: true, width:150}
,{field:'role_name',title: '角色名称'}
,{field:'detail', title: '备注'}
,{fixed: 'right', width:160, align:'center', toolbar: '#bar'}
]]
,id: 'listReload'
,page: true
,height: "full-130"
});
var $ = layui.$, active = {
reload: function(){
table.reload('listReload', {
where: {
roleName: $('#roleName').val(),
}
});
}
};
$('.demoTable .layui-btn').on('click', function(){
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
//监听工具条
table.on('tool(table_filter)', function(obj){
var data = obj.data;
if(obj.event === 'detail'){
//layer.msg('ID'+ data.id + ' 的查看操作');
} else if(obj.event === 'del'){
layer.confirm('真的删除'+data.role_name+'角色么', function(index){
var jsData = {'id':data.id}
$.post('{{urlfor "RoleController.AjaxDel"}}', jsData, function (out) {
if (out.status == 0) {
layer.alert('删除成功了', {icon: 1},function(index){
layer.close(index);
window.location.reload();
});
} else {
layer.msg(out.message)
}
}, "json");
obj.del();
layer.close(index);
});
} else if(obj.event === 'edit'){
window.location.href="/role/edit?id="+data.id
}
});
});
</script>

View File

@@ -1,158 +1,174 @@
<!-- 新增服务器 -->
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
</div>
</div>
</div>
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<div style="margin: 10px 0px">
<blockquote class="layui-elem-quote">
说明提交之前请先测试服务器资源是否可以连通
</blockquote>
</div>
<form class="layui-form" action="" method="post" >
<!--content-list-->
<div class="content-list">
<form action="{{urlfor "ServerController.Add"}}" method="post" class="form-horizontal">
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="server_name">服务器名</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="server_name" value="" required />
<div class="layui-form-item">
<label class="layui-form-label mw200">所属分组</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
{{range $k, $v := .serverGroup}}
<option value="{{$k}}">{{$v}}</option>
{{end}}
</select>
</div>
<div class="col-sm-6" style="padding-top:5px;">
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">服务器名称</label>
<div class="layui-input-inline mw400">
<input type="text" name="server_name" id="server_name" lay-verify="required" autocomplete="off" placeholder="服务器名称" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="server_account">登录账</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="root" name="server_account" value="" required />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="server_ip">服务器IP</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="server_ip" value="" required />
</div>
<div class="col-sm-6" style="padding-top:5px;">
<div class="layui-form-item">
<label class="layui-form-label mw200">登录账</label>
<div class="layui-input-inline mw400">
<input type="text" name="server_account" id="server_account" lay-verify="required" autocomplete="off" placeholder="root" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="port">服务器ssh端口</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="22" name="port" value="" required />
<div class="layui-form-item">
<label class="layui-form-label mw200">IP地址</label>
<div class="layui-input-inline mw400">
<input type="text" name="server_ip" id="server_ip" lay-verify="required" autocomplete="off" placeholder="192.168.1.12" class="layui-input" value="">
</div>
<div class="col-sm-6" style="padding-top:5px;">
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item" style="display: none">
<label class="layui-form-label mw200">外网IP</label>
<div class="layui-input-inline mw400">
<input type="text" name="server_outer_ip" id="server_outer_ip" lay-verify="required" autocomplete="off" placeholder="200.200.200.12" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">端口号</label>
<div class="layui-input-inline mw400">
<input type="text" name="port" id="port" lay-verify="required" autocomplete="off" placeholder="22" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="type">验证类型</label>
<div class="col-sm-6" >
<label class="radio-inline">
<input type="radio" name="type" value="0" > 密码
</label>
<label class="radio-inline">
<input type="radio" name="type" value="1" checked > 密钥
</label>
</div>
<div class="col-sm-3" style="padding-top:5px;">
<div class="layui-form-item">
<label class="layui-form-label mw200">验证登录类型</label>
<div class="layui-input-inline mw400">
<input type="radio" name="type" lay-verify="type" value="0" title="密码" checked>
<input type="radio" name="type" lay-verify="type" value="1" title="密钥" >
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="form-group hide" style="margin-top: 15px" id="password">
<label class="col-sm-3 control-label" for="password">服务器密码</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="password" value="" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
<div class="layui-form-item password">
<label class="layui-form-label mw200">密码</label>
<div class="layui-input-inline mw400">
<input type="text" name="password" id="password" lay-verify="" autocomplete="off" placeholder="服务器登录密码" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="form-group " style="margin-top: 15px" id="private_key_src">
<label class="col-sm-3 control-label" for="private_key_src">钥地址</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="/Users/haodaquan/.ssh/pp_rsa" name="private_key_src" value="" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
<div class="layui-form-item key" style="display:none;">
<label class="layui-form-label mw200">钥地址</label>
<div class="layui-input-inline mw400">
<input type="text" name="public_key_src" id="public_key_src" lay-verify="" autocomplete="off" placeholder="/Users/haodaquan/.ssh/pp_rsa.pub" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux"><span id="des" style="cursor: pointer">说明</span></div>
</div>
<div class="form-group " style="margin-top: 15px" id="public_key_src">
<label class="col-sm-3 control-label" for="public_key_src">钥地址</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="/Users/haodaquan/.ssh/pp_rsa.pub" name="public_key_src" value="" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
<i style="font-size: 12px">公钥和私钥地址请在本地服务器生成,命令ssh-keygen -t rsa -f pp_rsa</i>
<div class="layui-form-item key" style="display:none;">
<label class="layui-form-label mw200">钥地址</label>
<div class="layui-input-inline mw400">
<input type="text" name="private_key_src" id="private_key_src" lay-verify="" autocomplete="off" placeholder="/Users/haodaquan/.ssh/pp_rsa" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="detail">说明</label>
<div class="col-sm-5" >
<textarea name="detail" class="form-control" id="detail" rows="3"></textarea>
<div class="layui-form-item">
<label class="layui-form-label mw200">资源说明</label>
<div class="layui-input-inline mw400">
<textarea name="detail" id="detail" placeholder="请输入内容" class="layui-textarea"></textarea>
</div>
<div class="col-sm-4" style="padding-top:5px;">
</div>
<input type="hidden" name="id" id="id" value="0">
<div class="layui-form-item">
<label class="layui-form-label mw200"></label>
<div class="layui-input-inline mw400">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
<button class="layui-btn layui-btn-primary" id="test" lay-filter="test">测试</button>
</div>
</div>
<br />
<div class="modal-footer" style="text-align:center">
<button type="submit" class="btn btn-primary submit_attr_button">保存</button>
<button type="button" class="btn btn-default reback">返回</button>
</div>
</form>
</div>
</form>
</div>
<script>
$(function () {
$("form").submit(function () {
// $(".alert").hide();
$("button[type='submit']").attr('disabled', true);
$.post('{{urlfor "ServerController.Add"}}', $(this).serialize(), function (out) {
var $;
layui.use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
form.on('radio', function(data){
if(data.value==1){
$(".key").show();
$(".password").hide();
}else{
$(".password").show();
$(".key").hide();
}
});
$("#des").on('click',function () {
layer.tips('公钥和私钥地址请在本地服务器生成,命令ssh-keygen -t rsa -f pp_rsa', '#des', {
tips: [1, '#0FA6D8'] //还可配置颜色
});
})
form.on('submit(sub)', function(data){
var form_data = $("form").serialize();
$.post('{{urlfor "ServerController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
window.location.href = '{{urlfor "ServerController.List"}}';
layer.msg("操作成功",{icon: 1},function () {
window.history.go(-1)
})
} else {
alert_message(out.msg,"alert-danger","alert-success");
$("button[type='submit']").attr('disabled', false);
layer.msg(out.message)
}
}, "json");
return false;
});
$("input[name='type']").click(function () {
if ($(this).val() > 0) {
$("#password").addClass('hide');
$("#public_key_src").removeClass('hide');
$("#private_key_src").removeClass('hide');
} else {
$("#password").removeClass('hide');
$("#public_key_src").addClass('hide');
$("#private_key_src").addClass('hide');
}
$("#test").on('click', function(data){
layer.load();
var form_data = $("form").serialize();
$.post('{{urlfor "ServerController.AjaxTestServer"}}', form_data, function (out) {
layer.msg(out.message)
}, "json");
setTimeout(function(){
layer.closeAll('loading');
}, 2000);
return false;
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
</script>

171
views/server/copy.html Normal file
View File

@@ -0,0 +1,171 @@
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
{{/*<div style="margin: 10px 0px">*/}}
{{/*<blockquote class="layui-elem-quote">*/}}
{{/*说明:创建新的服务器资源*/}}
{{/*</blockquote>*/}}
{{/*</div>*/}}
<form class="layui-form" action="" method="post" >
<div class="layui-form-item">
<label class="layui-form-label mw200">所属分组</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
{{range $k, $v := .serverGroup}}
<option value="{{$k}}" {{if eq $.server.group_id $k}} selected {{end}}>{{$v}}</option>
{{end}}
</select>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">服务器名称</label>
<div class="layui-input-inline mw400">
<input type="text" name="server_name" id="server_name" lay-verify="required" autocomplete="off" placeholder="服务器名称" class="layui-input" value="{{.server.server_name}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">登录账号</label>
<div class="layui-input-inline mw400">
<input type="text" name="server_account" id="server_account" lay-verify="required" autocomplete="off" placeholder="root" class="layui-input" value="{{.server.server_account}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">内网IP</label>
<div class="layui-input-inline mw400">
<input type="text" name="server_ip" id="server_ip" lay-verify="required" autocomplete="off" placeholder="192.168.1.12" class="layui-input" value="{{.server.server_ip}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">外网IP</label>
<div class="layui-input-inline mw400">
<input type="text" name="server_outer_ip" id="server_outer_ip" lay-verify="required" autocomplete="off" placeholder="200.200.200.12" class="layui-input" value="{{.server.server_outer_ip}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">端口号</label>
<div class="layui-input-inline mw400">
<input type="text" name="port" id="port" lay-verify="required" autocomplete="off" placeholder="22" class="layui-input" value="{{.server.port}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">验证登录类型</label>
<div class="layui-input-inline mw400">
<input type="radio" name="type" lay-verify="type" value="0" title="密码" {{if eq .server.type 0}}checked{{end}}>
<input type="radio" name="type" lay-verify="type" value="1" title="密钥" {{if eq .server.type 1}}checked{{end}}>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item password" style="{{if eq .server.type 1}}display:none{{end}}">
<label class="layui-form-label mw200">密码</label>
<div class="layui-input-inline mw400">
<input type="text" name="password" id="password" lay-verify="" autocomplete="off" placeholder="服务器登录密码" class="layui-input" value="{{.server.password}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item key" style="{{if eq .server.type 0}}display:none{{end}}">
<label class="layui-form-label mw200">公钥地址</label>
<div class="layui-input-inline mw400">
<input type="text" name="public_key_src" id="public_key_src" lay-verify="" autocomplete="off" placeholder="/Users/haodaquan/.ssh/pp_rsa.pub" class="layui-input" value="{{.server.public_key_src}}">
</div>
<div class="layui-form-mid layui-word-aux"><span id="des" style="cursor: pointer">说明</span></div>
</div>
<div class="layui-form-item key" style="{{if eq .server.type 0}}display:none{{end}}">
<label class="layui-form-label mw200">私钥地址</label>
<div class="layui-input-inline mw400">
<input type="text" name="private_key_src" id="private_key_src" lay-verify="" autocomplete="off" placeholder="/Users/haodaquan/.ssh/pp_rsa" class="layui-input" value="{{.server.private_key_src}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">资源说明</label>
<div class="layui-input-inline mw400">
<textarea name="detail" id="detail" placeholder="请输入内容" class="layui-textarea">{{.server.detail}}</textarea>
</div>
</div>
<input type="hidden" name="id" id="id" value="0">
<div class="layui-form-item">
<label class="layui-form-label mw200"></label>
<div class="layui-input-inline mw400">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
<button class="layui-btn layui-btn-primary" id="test" lay-filter="test">测试</button>
</div>
</div>
</form>
</div>
<script>
var $;
layui.use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
form.on('radio', function(data){
if(data.value==1){
$(".key").show();
$(".password").hide();
}else{
$(".password").show();
$(".key").hide();
}
});
$("#des").on('click',function () {
layer.tips('公钥和私钥地址请在本地服务器生成,命令ssh-keygen -t rsa -f pp_rsa', '#des', {
tips: [1, '#0FA6D8'] //还可配置颜色
});
})
form.on('submit(sub)', function(data){
var form_data = $("form").serialize();
$.post('{{urlfor "ServerController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.location.href = "/server/list"
})
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
$("#test").on('click', function(data){
layer.load();
var form_data = $("form").serialize();
$.post('{{urlfor "ServerController.AjaxTestServer"}}', form_data, function (out) {
layer.msg(out.message)
}, "json");
setTimeout(function(){
layer.closeAll('loading');
}, 2000);
return false;
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
</script>

View File

@@ -1,160 +1,172 @@
<!-- 新增服务器 -->
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
</div>
</div>
</div>
</div>
<!--content-list-->
<div class="content-list">
<form action="{{urlfor "ServerController.Edit"}}" method="post" class="form-horizontal">
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="server_name">服务器名</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="server_name" value="{{.server.ServerName}}" required />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="server_name">登录账户</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="root" name="server_account" value="{{.server.ServerAccount}}" required />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="server_ip">服务器IP</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="server_ip" value="{{.server.ServerIp}}" required />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="port">服务器ssh端口</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="port" value="{{.server.Port}}" required />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="type">验证类型</label>
<div class="col-sm-6" >
<label class="radio-inline">
<input type="radio" name="type" value="0" {{if eq .server.Type 0}}checked{{end}}> 密码
</label>
<label class="radio-inline">
<input type="radio" name="type" value="1" {{if eq .server.Type 1}}checked{{end}}> 密钥
</label>
</div>
<div class="col-sm-3" style="padding-top:5px;">
</div>
</div>
<div class="form-group {{if eq .server.Type 1}}hide{{end}}" style="margin-top: 15px" id="password">
<label class="col-sm-3 control-label" for="password">服务器密码</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="/Users/haodaquan/.ssh/pp_rsa" name="password" value="{{.server.Password}}" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
</div>
<div class="form-group {{if eq .server.Type 0}}hide{{end}}" style="margin-top: 15px" id="private_key_src">
<label class="col-sm-3 control-label" for="private_key_src">私钥地址</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="/Users/haodaquan/.ssh/pp_rsa.pub" name="private_key_src" value="{{.server.PrivateKeySrc}}" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
</div>
<div class="form-group {{if eq .server.Type 0}}hide{{end}}" style="margin-top: 15px" id="public_key_src">
<label class="col-sm-3 control-label" for="public_key_src">公钥地址</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="public_key_src" value="{{.server.PublicKeySrc}}" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="detail">说明</label>
<div class="col-sm-5" >
<textarea name="detail" class="form-control" id="detail" rows="3">{{.server.Detail}}</textarea>
</div>
<div class="col-sm-4" style="padding-top:5px;">
</div>
</div>
<br />
<div class="modal-footer" style="text-align:center">
<input type="hidden" name="id" value="{{.server.Id}}" />
<button type="submit" class="btn btn-primary submit_attr_button">保存</button>
<button type="button" class="btn btn-default reback">返回</button>
</div>
</form>
</div>
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<div style="margin: 10px 0px">
<blockquote class="layui-elem-quote">
说明创建新的服务器资源之前请先测试服务器是否可以连通
</blockquote>
</div>
<form class="layui-form" action="" method="post" >
<div class="layui-form-item">
<label class="layui-form-label mw200">所属分组</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
{{range $k, $v := .serverGroup}}
<option value="{{$k}}" {{if eq $.server.group_id $k}} selected {{end}}>{{$v}}</option>
{{end}}
</select>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">服务器名称</label>
<div class="layui-input-inline mw400">
<input type="text" name="server_name" id="server_name" lay-verify="required" autocomplete="off" placeholder="服务器名称" class="layui-input" value="{{.server.server_name}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">登录账号</label>
<div class="layui-input-inline mw400">
<input type="text" name="server_account" id="server_account" lay-verify="required" autocomplete="off" placeholder="root" class="layui-input" value="{{.server.server_account}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">IP地址</label>
<div class="layui-input-inline mw400">
<input type="text" name="server_ip" id="server_ip" lay-verify="required" autocomplete="off" placeholder="192.168.1.12" class="layui-input" value="{{.server.server_ip}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item" style="display: none">
<label class="layui-form-label mw200">外网IP</label>
<div class="layui-input-inline mw400">
<input type="text" name="server_outer_ip" id="server_outer_ip" lay-verify="required" autocomplete="off" placeholder="200.200.200.12" class="layui-input" value="{{.server.server_outer_ip}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">端口号</label>
<div class="layui-input-inline mw400">
<input type="text" name="port" id="port" lay-verify="required" autocomplete="off" placeholder="22" class="layui-input" value="{{.server.port}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">验证登录类型</label>
<div class="layui-input-inline mw400">
<input type="radio" name="type" lay-verify="type" value="0" title="密码" {{if eq .server.type 0}}checked{{end}}>
<input type="radio" name="type" lay-verify="type" value="1" title="密钥" {{if eq .server.type 1}}checked{{end}}>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item password" style="{{if eq .server.type 1}}display:none{{end}}">
<label class="layui-form-label mw200">密码</label>
<div class="layui-input-inline mw400">
<input type="text" name="password" id="password" lay-verify="" autocomplete="off" placeholder="服务器登录密码" class="layui-input" value="{{.server.password}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item key" style="{{if eq .server.type 0}}display:none{{end}}">
<label class="layui-form-label mw200">公钥地址</label>
<div class="layui-input-inline mw400">
<input type="text" name="public_key_src" id="public_key_src" lay-verify="" autocomplete="off" placeholder="/Users/haodaquan/.ssh/pp_rsa.pub" class="layui-input" value="{{.server.public_key_src}}">
</div>
<div class="layui-form-mid layui-word-aux"><span id="des" style="cursor: pointer">说明</span></div>
</div>
<div class="layui-form-item key" style="{{if eq .server.type 0}}display:none{{end}}">
<label class="layui-form-label mw200">私钥地址</label>
<div class="layui-input-inline mw400">
<input type="text" name="private_key_src" id="private_key_src" lay-verify="" autocomplete="off" placeholder="/Users/haodaquan/.ssh/pp_rsa" class="layui-input" value="{{.server.private_key_src}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">资源说明</label>
<div class="layui-input-inline mw400">
<textarea name="detail" id="detail" placeholder="请输入内容" class="layui-textarea">{{.server.detail}}</textarea>
</div>
</div>
<input type="hidden" name="id" id="id" value="{{.server.id}}">
<div class="layui-form-item">
<label class="layui-form-label mw200"></label>
<div class="layui-input-inline mw400">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
<button class="layui-btn layui-btn-primary" id="test" lay-filter="test">测试</button>
</div>
</div>
</form>
</div>
<script>
$(function () {
$("form").submit(function () {
// $(".alert").hide();
$("button[type='submit']").attr('disabled', true);
$.post('{{urlfor "ServerController.Edit"}}', $(this).serialize(), function (out) {
var $;
layui.use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
form.on('radio', function(data){
if(data.value==1){
$(".key").show();
$(".password").hide();
}else{
$(".password").show();
$(".key").hide();
}
});
$("#des").on('click',function () {
layer.tips('公钥和私钥地址请在本地服务器生成,命令ssh-keygen -t rsa -f pp_rsa', '#des', {
tips: [1, '#0FA6D8'] //还可配置颜色
});
})
form.on('submit(sub)', function(data){
var form_data = $("form").serialize();
$.post('{{urlfor "ServerController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
window.location.href = '{{urlfor "ServerController.List"}}';
layer.msg("操作成功",{icon: 1},function () {
window.history.go(-1)
})
} else {
alert_message(out.msg,"alert-danger","alert-success");
$("button[type='submit']").attr('disabled', false);
layer.msg(out.message)
}
}, "json");
return false;
});
$("input[name='type']").click(function () {
if ($(this).val() > 0) {
$("#password").addClass('hide');
$("#public_key_src").removeClass('hide');
$("#private_key_src").removeClass('hide');
} else {
$("#password").removeClass('hide');
$("#public_key_src").addClass('hide');
$("#private_key_src").addClass('hide');
}
$("#test").on('click', function(data){
layer.load();
var form_data = $("form").serialize();
$.post('{{urlfor "ServerController.AjaxTestServer"}}', form_data, function (out) {
layer.msg(out.message)
}, "json");
setTimeout(function(){
layer.closeAll('loading');
}, 2000);
return false;
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
</script>

View File

@@ -1,121 +1,106 @@
<!-- 分组列表 -->
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
</div>
</div>
<div class="layui-layout layui-layout-admin" style="padding-left: 20px;">
<div class="layui-row" style="margin-top: 20px;">
<div class="layui-col-xs6">
<a class="layui-btn" data-type="tabAdd" href="/server/add">新增</a>
</div>
<div class="clearfix"></div>
</div>
<!--content-list-->
<div class="content-list">
<div class="search-box row">
<div class="col-md-4">
<div class="btn-group pull-left" role="group" aria-label="...">
<a href='{{urlfor "ServerController.Add"}}' class="btn btn-primary"><span class="glyphicon glyphicon-plus"></span> 新增服务器</a>
<div class="btn-group" role="server">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-edit"></span> 批量操作
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="javascript:;" onclick="javascript:batch('delete');"><span class="glyphicon glyphicon-remove-sign" aria-hidden="true"></span> 删除</a></li>
</ul>
<div class="layui-col-xs6 search_text">
<form class="layui-form" action="" onsubmit="javascript:return false;">
<div class="demoTable">
<div class="layui-inline" style="width: 40%">
<input class="layui-input" name="serverName" id="serverName" autocomplete="off" placeholder="资源名称" >
</div>
<button class="layui-btn" data-type="reload">查询</button>
</div>
</div>
<div class="col-md-8">
<div class=" btn-large pull-right" >
</div>
</div>
</div>
<div class="clearfix"></div>
<div class="table-margin">
<form id="form-list" method="post" action="">
<table class="table table-bordered table-header">
<thead>
<tr>
<td><input type="checkbox" name="all_check" /></td>
<td>ID</td>
<td width="20%">服务器名称</td>
<td width="">IP地址</td>
<td width="">端口号</td>
<td width="">验证类型</td>
<td width="20%">备注</td>
<td width="">创建时间</td>
<td width="10%">操作</td>
</tr>
</thead>
<tbody>
{{range $k,$v := .list}}
<tr>
<td class="chk"><input type="checkbox" name="ids" value="{{$v.id}}" /></td>
<td class="center">{{$v.id}}</td>
<td>{{$v.server_name}}</td>
<td>{{$v.server_ip}}</td>
<td>{{$v.port}}</td>
<td>{{$v.type}}</td>
<td>{{$v.detail}}</td>
<td>{{$v.create_time}}</td>
<td>
<a class="btn btn-info btn-xs" href="{{urlfor "ServerController.Edit"}}?id={{$v.id}}">
<span class="glyphicon glyphicon-file" aria-hidden="true"></span> 编辑
</a>
</td>
</tr>
{{end}}
</tbody>
<tfoot>
<tr>
<td colspan="9">
<div class="pull-right">
{{str2html .pageBar}}
</div>
</td>
</tr>
</tfoot>
</table>
</form>
</div>
</div>
<table class="layui-hide" id="table_list" lay-filter="table_filter">
</table>
<script type="text/html" id="bar">
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="copy">复制</a>
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
</div>
<script>
function batch(action) {
if ($("input[name='ids']:checked").size() < 1) {
alert_message("请选择要操作的任务","alert-danger","alert-success");
} else {
if(action=='delete'){
if(!confirm("确定要删除所选吗?")) return;
}
var url = "{{urlfor "ServerController.Batch"}}";
$.post(url + "?action=" + action, $("#form-list").serialize(), function(out) {
if (out.status != 0) {
alert_message(out.msg,"alert-danger","alert-success");
} else {
window.location.reload();
}
}, "json");
}
return false;
}
//点击行换色
$('tbody tr').click(function(){
$(this).addClass("warning").siblings().removeClass("warning");
layui.use(['table','form','element'], function(){
var table = layui.table;
var form = layui.form;
var element = layui.element;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
//方法级渲染
table.render({
elem: '#table_list'
,url: '/server/table'
,cols: [[
// {checkbox: true, fixed: true},
{field:'id', title: 'ID', align:'center',sort: true, width:150}
,{field:'server_name',title: '资源名称'}
,{field:'group_name',title: '分组名称'}
,{field:'type', title: '登录类型'}
,{field:'detail', title: '备注'}
// ,{field:'status_text', title: '状态'}
,{fixed: 'right', width:160, align:'center', toolbar: '#bar'}
]]
,id: 'listReload'
,page: true
,height: "full-130"
});
var $ = layui.$, active = {
reload: function(){
table.reload('listReload', {
where: {
serverName: $('#serverName').val(),
}
});
}
};
//监听工具条
table.on('tool(table_filter)', function(obj){
var data = obj.data;
if(obj.event === 'edit'){
window.location.href="/server/edit?id="+data.id
} else if(obj.event === 'del'){
layer.confirm('真的删除'+data.server_name+'服务器资源么', function(index){
var jsData = {'id':data.id}
$.post('{{urlfor "ServerController.AjaxDel"}}', jsData, function (out) {
if (out.status == 0) {
layer.alert(out.message, {icon: 1},function(index){
layer.close(index);
window.location.reload();
});
} else {
layer.msg(out.message)
}
}, "json");
// obj.del();
layer.close(index);
})
} else if(obj.event === 'copy'){
window.location.href="/server/copy?id="+data.id
}else{
layer.msg('操作不存在');
}
});
$('.demoTable .layui-btn').on('click', function(){
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
});
</script>

View File

@@ -0,0 +1,62 @@
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<div style="margin: 10px 0px">
<blockquote class="layui-elem-quote">
说明新建资源分组
</blockquote>
</div>
<form class="layui-form" action="" method="post" >
<div class="layui-form-item">
<label class="layui-form-label">分组名称</label>
<div class="layui-input-inline" style="min-width: 200px;">
<input type="text" name="group_name" id="group_name" lay-verify="required" autocomplete="off" placeholder="资源分组" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分组说明</label>
<div class="layui-input-inline" style="min-width: 400px;">
<textarea name="description" id="description" placeholder="请输入内容" class="layui-textarea"></textarea>
</div>
</div>
<input type="hidden" id="id" value="0">
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
<script>
var $;
layui.use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
form.on('submit(sub)', function(data){
var form_data = $("form").serialize();
$.post('{{urlfor "ServerGroupController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.history.go(-1)
})
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
</script>

View File

@@ -0,0 +1,62 @@
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<div style="margin: 10px 0px">
<blockquote class="layui-elem-quote">
说明新建资源分组
</blockquote>
</div>
<form class="layui-form" action="" method="post" >
<div class="layui-form-item">
<label class="layui-form-label">分组名称</label>
<div class="layui-input-inline" style="min-width: 200px;">
<input type="text" value="{{.group.group_name}}" name="group_name" id="group_name" lay-verify="required" autocomplete="off" placeholder="资源分组" class="layui-input" >
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分组说明</label>
<div class="layui-input-inline" style="min-width: 400px;">
<textarea name="description" id="description" placeholder="请输入内容" class="layui-textarea">{{.group.description}}</textarea>
</div>
</div>
<input type="hidden" id="id" name="id" value="{{.group.id}}">
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
<script>
var $;
layui.use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
form.on('submit(sub)', function(data){
var form_data = $("form").serialize();
$.post('{{urlfor "ServerGroupController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.history.go(-1)
})
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
</script>

105
views/servergroup/list.html Normal file
View File

@@ -0,0 +1,105 @@
<div class="layui-layout layui-layout-admin" style="padding-left: 20px;">
<div class="layui-row" style="margin-top: 20px;">
<div class="layui-col-xs6">
<a class="layui-btn" data-type="tabAdd" href="/servergroup/add">新增</a>
</div>
<div class="layui-col-xs6 search_text">
<form class="layui-form" action="" onsubmit="javascript:return false;">
<div class="demoTable">
<div class="layui-inline" style="width: 40%">
<input class="layui-input" name="groupName" id="groupName" autocomplete="off" placeholder="分组名称" >
</div>
<button class="layui-btn" data-type="reload">查询</button>
</div>
</form>
</div>
</div>
<table class="layui-hide" id="table_list" lay-filter="table_filter">
</table>
<script type="text/html" id="bar">
<!-- <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看</a> -->
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
</div>
<script>
layui.use(['table','form','element'], function(){
var table = layui.table;
var form = layui.form;
var element = layui.element;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
//方法级渲染
table.render({
elem: '#table_list'
,url: '/servergroup/table'
,cols: [[
// {checkbox: true, fixed: true},
{field:'id', title: 'ID', align:'center',sort: true, width:150}
,{field:'group_name',title: '分组名称'}
,{field:'description', title: '分组说明'}
,{field:'create_time', title: '创建时间'}
,{field:'update_time', title: '更新时间'}
,{fixed: 'right', width:160, align:'center', toolbar: '#bar'}
]]
,id: 'listReload'
,page: true
,height: "full-130"
});
var $ = layui.$, active = {
reload: function(){
table.reload('listReload', {
where: {
groupName: $('#groupName').val(),
}
});
}
};
//监听工具条
table.on('tool(table_filter)', function(obj){
var data = obj.data;
if(obj.event === 'edit'){
window.location.href="/servergroup/edit?id="+data.id
} else if(obj.event === 'del'){
layer.confirm('真的删除'+data.group_name+'分组么', function(index){
var jsData = {'id':data.id}
$.post('{{urlfor "ServerGroupController.AjaxDel"}}', jsData, function (out) {
if (out.status == 0) {
layer.alert('删除成功了', {icon: 1},function(index){
layer.close(index);
window.location.reload();
});
} else {
layer.msg(out.message)
return
}
}, "json");
// obj.del();
layer.close(index);
})
}else{
layer.msg('操作不存在');
}
});
$('.demoTable .layui-btn').on('click', function(){
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
});
</script>

View File

@@ -1,143 +1,127 @@
<!-- 新增任务 -->
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<form class="layui-form" action="" method="post" >
<div class="layui-form-item">
<label class="layui-form-label mw200">任务名称</label>
<div class="layui-input-inline mw400">
<input type="text" name="task_name" id="task_name" lay-verify="required" autocomplete="off" placeholder="任务名称" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">所属分组</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
{{range $k, $v := .taskGroup}}
<option value="{{$k}}">{{$v}}</option>
{{end}}
</select>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">服务器资源</label>
<div class="layui-inline">
<div class="layui-input-inline">
<select name="server_id">
<option value="0">本地服务器</option>
{{range $k, $v := .serverGroup}}
<optgroup label="{{$v.GroupName}}">
{{range $kk, $vv := $v.Servers}}
<option value="{{$kk}}">{{$vv}}</option>
{{end}}
</optgroup>
{{end}}
</select>
</div>
</div>
</div>
</div>
<!--content-list-->
<div class="content-list">
<form action="{{urlfor "TaskController.Add"}}" method="post" class="form-horizontal">
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="task_name">任务名称</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="不需要带分组名称" name="task_name" value="" required />
</div>
<div class="col-sm-6" style="padding-top:5px;">
<i style="color:red">*</i>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">任务说明</label>
<div class="layui-input-inline mw400">
<textarea name="description" id="description" rows="2" placeholder="请输入内容" class="layui-textarea"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">是否单例</label>
<div class="layui-input-inline ">
<input type="radio" name="concurrent" lay-verify="concurrent" value="0" title="是" checked>
<input type="radio" name="concurrent" lay-verify="concurrent" value="1" title="否" >
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="description">任务说明</label>
<div class="col-sm-5" >
<textarea name="description" class="form-control" id="description" rows="3" placeholder="注明执行周期"></textarea>
</div>
<div class="col-sm-4" style="padding-top:5px;">
</div>
</div>
<div class="layui-form-mid layui-word-aux"><i class="fa fa-info-circle" aria-hidden="true" id="des"></i></div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="group_id">任务分组</label>
<div class="col-sm-3" >
<select name="group_id" class="form-control">
<option value="0">未分组</option>
{{range $k, $v := .groups}}
<option value="{{$v.Id}}">{{$v.GroupName}}</option>
{{end}}
</select>
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">时间表达式</label>
<div class="layui-input-inline mw400">
<input type="text" name="cron_spec" id="cron_spec" lay-verify="required" autocomplete="off" placeholder="时间表达式" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux"><a href="/help" target="_blank"><i class="fa fa-question-circle" aria-hidden="true"></i></a></div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="server_id">服务器</label>
<div class="col-sm-3" >
<select name="server_id" class="form-control">
<option value="0">本地服务器</option>
{{range $ks, $vs := .servers}}
<option value="{{$vs.Id}}">{{$vs.ServerName}}</option>
{{end}}
</select>
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">命令脚本</label>
<div class="layui-input-inline mw400">
<textarea name="command" id="command" rows="5" placeholder="请输入命令内容" class="layui-textarea"></textarea>
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="concurrent">是否单例</label>
<div class="col-sm-3" >
<label class="radio-inline">
<input type="radio" name="concurrent" value="0" checked>
</label>
<label class="radio-inline">
<input type="radio" name="concurrent" value="1">
</label>
</div>
<div class="col-sm-6" style="padding-top:5px;">
<i style="font-size: 12px">设为的话如果该任务在上一个时间点还没执行完则略过不执行</i>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">超时设置</label>
<div class="layui-input-inline">
<input type="text" name="timeout" id="timeout" lay-verify="required" autocomplete="off" placeholder="单位:秒,默认一天" class="layui-input" value="">
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="cron_spec">时间表达式</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="cron_spec" value="" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
<a href="{{urlfor "HelpController.Index"}}" target="_blank"><i style="font-size: 12px">支持秒级定时详见参见使用帮助</i></a>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<input type="hidden" name="id" id="id" value="0">
<div class="layui-form-item">
<label class="layui-form-label mw200"></label>
<div class="layui-input-inline mw400">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="command">命令脚本</label>
<div class="col-sm-5" >
<textarea name="command" class="form-control" id="command" rows="3" placeholder="支持bash命令和shell文件"></textarea>
</div>
<div class="col-sm-4" style="padding-top:5px;">
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="timeout">超时设置</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="秒,默认一天" name="timeout" value="" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
</div>
<br />
<div class="modal-footer" style="text-align:center">
<button type="submit" class="btn btn-primary submit_attr_button">保存</button>
<button type="button" class="btn btn-default reback">返回</button>
</div>
</form>
</div>
</div>
</div>
</form>
</div>
<script>
$(function () {
$("form").submit(function () {
$("button[type='submit']").attr('disabled', true);
$.post('{{urlfor "TaskController.Add"}}', $(this).serialize(), function (out) {
if (out.status == 0) {
window.location.href = '{{urlfor "TaskController.List"}}';
} else {
alert_message(out.msg,"alert-danger","alert-success");
$("button[type='submit']").attr('disabled', false);
}
}, "json");
return false;
});
layui.use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
$("#des").on('click',function () {
layer.tips('设为的话如果该任务在上一个时间点还没执行完则略过不执行', '#des', {
tips: [1, '#0FA6D8'] //还可配置颜色
});
})
});
form.on('submit(sub)', function(data){
var form_data = data.field;
$.post('{{urlfor "TaskController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.history.go(-1)
})
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
</script>

160
views/task/auditlist.html Normal file
View File

@@ -0,0 +1,160 @@
<div class="layui-layout layui-layout-admin" style="padding-left: 20px;">
<div class="layui-row" style="margin-top: 20px;">
<div class="layui-col-xs6">
<div class="layui-btn-group">
<a class="layui-btn" data-type="tabAdd" href="/task/add">新增任务</a>
<button class="layui-btn batch" data-type="batchaudit" >审核通过</button>
<button class="layui-btn layui-btn-danger batch" data-type="batchnopass" >审核不通过</button>
</div>
</div>
<div class="layui-col-xs6 search_text">
<form class="layui-form" action="" onsubmit="javascript:return false;">
<div class="demoTable">
<div class="layui-inline" style="width: 40%">
<input class="layui-input" name="taskName" id="taskName" autocomplete="off" placeholder="任务名称" >
</div>
<button class="layui-btn" data-type="reload" id="reload">查询</button>
</div>
</form>
</div>
</div>
<table class="layui-hide" id="table_list" lay-filter="table_filter">
</table>
<script type="text/html" id="bar">
{{/*<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="status">启|停</a>*/}}
{{/*<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>*/}}
<a class="layui-btn layui-btn-xs" lay-event="detail">查看</a>
<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</a>
{{/*<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="run">测试</a>*/}}
{{/*<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="log">日志</a>*/}}
</script>
</div>
<script>
layui.use(['table','form','element'], function(){
var table = layui.table;
var form = layui.form;
var element = layui.element;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
//方法级渲染
table.render({
elem: '#table_list'
,url: '/task/table?status=2'
,cols: [[
{checkbox: true, fixed: true},
{field:'id', title: 'ID', align:'center',sort: true, width:50}
,{field:'task_name',title: '任务名称'}
,{field:'description',title: '任务说明'}
,{field:'pre_time', width:170,title: '上次执行时间'}
,{field:'execute_times', width:70,title: '次数'}
,{fixed:'right', width:150, align:'center', title:'操作', toolbar: '#bar'}
]]
,id: 'listReload'
,page: true
,height: "full-130"
});
var $ = layui.$, active = {
reload: function(){
table.reload('listReload', {
where: {
taskName: $('#taskName').val(),
}
});
}
};
//监听工具条
table.on('tool(table_filter)', function(obj){
var data = obj.data;
if(obj.event === 'edit'){
window.location.href="/task/edit?id="+data.id
} else if(obj.event === 'log'){
window.location.href="/tasklog/list?task_id="+data.id;
}else if (obj.event==='detail'){
window.location.href='/task/detail?id='+data.id;
}else if (obj.event==='del'){
layer.confirm("确认要删除这条任务吗?", {icon: 3, title:'提示'}, function(index){
layer.load();
$.post('/task/ajaxdel', {id:data.id}, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
$('#reload').click();
})
} else {
layer.msg(out.message)
return
}
}, "json");
setTimeout(function(){
layer.closeAll('loading');
}, 2000);
layer.close(index);
});
}else{
layer.msg('操作不存在')
}
});
$(".batch").on('click',function (obj) {
var action = $(this).attr('data-type');
var checkStatus = table.checkStatus('listReload');
var data = checkStatus.data;
if(data.length<1){
layer.msg("请选择操作数据");
return;
}
var msg = "确认审核通过这些任务吗";
var msgok = "审核通过的任务已经被转移到【任务列表】,请前去操作";
if (action=='batchnopass'){
msg = "确定审核不通过这些任务吗";
msgok = "操作成功";
}
layer.confirm(msg, {icon: 3, title:'提示'}, function(index){
var ids = "";
$.each(data,function (k,v) {
ids += v.id+",";
});
ids = ids.substr(0,ids.length-1);
layer.load();
$.post('/task/ajax'+action, {"ids":ids}, function (out) {
if (out.status == 0) {
layer.msg(msgok,{icon: 1},function () {
$('#reload').click();
})
} else {
layer.msg(out.message)
return
}
}, "json");
setTimeout(function(){
layer.closeAll('loading');
}, 2000);
layer.close(index);
});
return ;
})
$('.demoTable .layui-btn').on('click', function(){
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
});
</script>

View File

@@ -1,144 +1,127 @@
<!-- 新增任务 -->
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<form class="layui-form" action="" method="post" >
<div class="layui-form-item">
<label class="layui-form-label mw200">任务名称</label>
<div class="layui-input-inline mw400">
<input type="text" name="task_name" id="task_name" lay-verify="required" autocomplete="off" placeholder="任务名称" class="layui-input" value="{{.task.TaskName}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">所属分组</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
{{range $k, $v := .taskGroup}}
<option value="{{$k}}" {{if eq $k $.task.GroupId}}selected{{end}}>{{$v}}</option>
{{end}}
</select>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">服务器资源</label>
<div class="layui-inline">
<div class="layui-input-inline">
<select name="server_id">
<option value="0">本地服务器</option>
{{range $k, $v := .serverGroup}}
<optgroup label="{{$v.GroupName}}">
{{range $kk, $vv := $v.Servers}}
<option value="{{$kk}}" {{if eq $kk $.task.ServerId}}selected{{end}} >{{$vv}}</option>
{{end}}
</optgroup>
{{end}}
</select>
</div>
</div>
</div>
</div>
<!--content-list-->
<div class="content-list">
<form action="{{urlfor "TaskController.Add"}}" method="post" class="form-horizontal">
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="task_name">任务名称</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="task_name" value="{{.task.TaskName}}" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">任务说明</label>
<div class="layui-input-inline mw400">
<textarea name="description" id="description" rows="2" placeholder="请输入内容" class="layui-textarea">{{.task.Description}}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">是否单例</label>
<div class="layui-input-inline ">
<input type="radio" name="concurrent" lay-verify="concurrent" value="0" title="是" {{if eq .task.Concurrent 0}}checked{{end}}>
<input type="radio" name="concurrent" lay-verify="concurrent" value="1" title="否" {{if eq .task.Concurrent 1}}checked{{end}}>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="task_name">任务说明</label>
<div class="col-sm-5" >
<textarea name="description" class="form-control" id="description" rows="3">{{.task.Description}}</textarea>
</div>
<div class="col-sm-4" style="padding-top:5px;">
</div>
</div>
<div class="layui-form-mid layui-word-aux"><i class="fa fa-info-circle" aria-hidden="true" id="des"></i></div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="task_name">任务分组</label>
<div class="col-sm-3" >
<select name="group_id" class="form-control">
<option value="0">未分组</option>
{{range $k, $v := .groups}}
<option value="{{$v.Id}}" {{if eq $v.Id $.task.GroupId}}selected{{end}}>{{$v.GroupName}}</option>
{{end}}
</select>
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">时间表达式</label>
<div class="layui-input-inline mw400">
<input type="text" name="cron_spec" id="cron_spec" lay-verify="required" autocomplete="off" placeholder="时间表达式" class="layui-input" value="{{.task.CronSpec}}">
</div>
<div class="layui-form-mid layui-word-aux"><a href="/help" target="_blank"><i class="fa fa-question-circle" aria-hidden="true"></i></a></div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="server_id">服务器</label>
<div class="col-sm-3" >
<select name="server_id" class="form-control">
<option value="0">本地服务器</option>
{{range $ks, $vs := .servers}}
<option value="{{$vs.Id}}" {{if eq $vs.Id $.task.ServerId}}selected{{end}}>{{$vs.ServerName}}</option>
{{end}}
</select>
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">命令脚本</label>
<div class="layui-input-inline mw400">
<textarea name="command" id="command" rows="10" placeholder="请输入内容" class="layui-textarea">{{.task.Command}}</textarea>
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="concurrent">是否单例</label>
<div class="col-sm-3" >
<label class="radio-inline">
<input type="radio" name="concurrent" value="0" {{if eq .task.Concurrent 0}}checked{{end}}>
</label>
<label class="radio-inline">
<input type="radio" name="concurrent" value="1" {{if eq .task.Concurrent 1}}checked{{end}}>
</label>
</div>
<div class="col-sm-6" style="padding-top:5px;">
<i>设为的话如果该任务在上一个时间点还没执行完则略过不执行</i>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">超时设置</label>
<div class="layui-input-inline mw400">
<input type="text" name="timeout" id="timeout" lay-verify="required" autocomplete="off" placeholder="单位:秒,默认一天" class="layui-input" value="{{.task.Timeout}}">
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="cron_spec">时间表达式</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="cron_spec" value="{{.task.CronSpec}}" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
<a href="{{urlfor "HelpController.Index"}}" target="_blank">参见使用帮助</a>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<input type="hidden" name="id" id="id" value="0">
<div class="layui-form-item">
<label class="layui-form-label mw200"></label>
<div class="layui-input-inline mw400">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="task_name">命令脚本</label>
<div class="col-sm-5" >
<textarea name="command" class="form-control" id="command" rows="3">{{.task.Command}}</textarea>
</div>
<div class="col-sm-4" style="padding-top:5px;">
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="cron_spec">超时设置</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="秒" name="timeout" value="{{.task.Timeout}}" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
单位秒不设置的话默认超时时间为1天
</div>
</div>
<br />
<div class="modal-footer" style="text-align:center">
<button type="submit" class="btn btn-primary submit_attr_button">保存</button>
<button type="button" class="btn btn-default reback">返回</button>
</div>
</form>
</div>
</div>
</div>
</form>
</div>
<script>
$(function () {
$("form").submit(function () {
$("button[type='submit']").attr('disabled', true);
$.post('{{urlfor "TaskController.Add"}}', $(this).serialize(), function (out) {
if (out.status == 0) {
window.location.href = '{{urlfor "TaskController.List"}}';
} else {
alert_message(out.msg,"alert-danger","alert-success");
$("button[type='submit']").attr('disabled', false);
layui.use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
}, "json");
return false;
$("#des").on('click',function () {
layer.tips('设为的话如果该任务在上一个时间点还没执行完则略过不执行', '#des', {
tips: [1, '#0FA6D8'] //还可配置颜色
});
})
form.on('submit(sub)', function(data){
var form_data = data.field;
$.post('{{urlfor "TaskController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.history.go(-1)
})
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
});
</script>

184
views/task/detail.html Normal file
View File

@@ -0,0 +1,184 @@
<style>
.layui-form-item{
margin-bottom: 0px;
}
legend{
font-size: 14px !important;
color: #009688;
font-weight: bold !important;
}
</style>
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<div class="layui-btn-container mw200">
{{if eq $.task.Status 2}}
<button lay-submit class="layui-btn layui-btn-sm " lay-filter="audit">审核通过</button>
<button lay-submit class="layui-btn layui-btn-sm layui-btn-danger" lay-filter="nopass">审核不通过</button>
{{end}}
{{if eq $.task.Status 1}}
<button lay-submit class="layui-btn layui-btn-sm layui-btn-danger" lay-filter="pause">暂停任务</button>
{{end}}
{{if eq $.task.Status 0}}
<button lay-submit class="layui-btn layui-btn-sm layui-btn-danger" lay-filter="start">启动任务</button>
{{end}}
<button lay-submit class="layui-btn layui-btn-sm " lay-filter="edit">编辑任务</button>
<button lay-submit class="layui-btn layui-btn-sm " lay-filter="run">测试执行</button>
<button lay-submit class="layui-btn layui-btn-sm " lay-filter="log">任务日志</button>
<button lay-submit class="layui-btn layui-btn-sm " lay-filter="copy">复制任务</button>
</div>
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;padding-right: 10px;">
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
<legend>{{.task.TaskName}}#{{.task.Id}}任务详细</legend>
</fieldset>
<table class="layui-table" lay-skin="nob" lay-size="sm">
<colgroup>
<col width="80">
<col width="400">
<col>
</colgroup>
<tbody>
<tr>
<td>任务说明</td>
<td>{{.task.TaskName}}</td>
<td></td>
</tr>
<tr>
<td>任务状态</td>
<td>{{.TextStatus|str2html}}</td>
<td></td>
</tr>
<tr>
<td>执行次数</td>
<td>{{.task.ExecuteTimes}}</td>
<td></td>
</tr>
<tr>
<td>服务资源</td>
<td> {{.serverName}}</td>
<td></td>
</tr>
<tr>
<td>是否单例</td>
<td>{{if eq .task.Concurrent 0}}{{end}} {{if eq .task.Concurrent 1}}{{end}}</td>
<td></td>
</tr>
<tr>
<td>执行时间</td>
<td> {{.task.CronSpec}}</td>
<td></td>
</tr>
<tr>
<td>命令脚本</td>
<td>{{.task.Command}}</td>
<td></td>
</tr>
<tr>
<td>超时设置</td>
<td>{{.task.Timeout}}</td>
<td></td>
</tr>
<tr>
<td>创建时间</td>
<td>{{.CreateTime}}</td>
<td></td>
</tr>
<tr>
<td>创建人</td>
<td>{{.task.CreateId}}</td>
<td></td>
</tr>
<tr>
<td>修改时间</td>
<td>{{.UpdateTime}}</td>
<td></td>
</tr>
<tr>
<td>最后修改人</td>
<td>{{.task.UpdateId}}</td>
<td></td>
</tr>
</tbody>
</table>
<input type="hidden" name="id" id="id" value="{{.task.Id}}">
</div>
</div>
<script>
layui.use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var id = $("#id").val();
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
$('.layui-btn-container button').on('click',function () {
var event = $(this).attr('lay-filter');
if (event==='edit'){
var status =" {{.task.Status}}";
if(status==1){
layer.msg("运行状态无法编辑任务,请先暂停任务");
return;
}
window.location.href="/task/edit?id="+id
}else if(event==='log'){
window.location.href="/tasklog/list?task_id="+id;
}else if(event==='copy'){
window.location.href="/task/copy?id="+id;
}else if (event==='run'){
layer.confirm("测试执行任务,注意不要超时,请确认执行", {icon: 3, title:'提示'}, function(index){
layer.load();
$.post('/task/ajaxrun', {id:id}, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.location.href="/tasklog/list?task_id="+id
})
} else {
layer.msg(out.message)
return
}
}, "json");
setTimeout(function(){
layer.closeAll('loading');
}, 2000);
layer.close(index);
});
}else if (event==='audit' || event==='start' || event==='pause' || event==="nopass"){
$.post('/task/ajax'+event, {id:id}, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.location.reload()
})
} else {
layer.msg(out.message)
return
}
}, "json");
return
}else{
layer.msg("操作不存在")
}
})
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
</script>

View File

@@ -1,145 +1,138 @@
<!-- 新增任务 -->
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<form class="layui-form" action="javascript:return false;" method="post" >
<div class="layui-form-item">
<label class="layui-form-label mw200">任务名称</label>
<div class="layui-input-inline mw400">
<input type="text" name="task_name" id="task_name" lay-verify="required" autocomplete="off" placeholder="任务名称" class="layui-input" value="{{.task.TaskName}}">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">所属分组</label>
<div class="layui-input-inline">
<select name="group_id" lay-verify="required">
{{range $k, $v := .taskGroup}}
<option value="{{$k}}" {{if eq $k $.task.GroupId}}selected{{end}}>{{$v}}</option>
{{end}}
</select>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">服务器资源</label>
<div class="layui-inline">
<div class="layui-input-inline">
<select name="server_id">
<option value="0">本地服务器</option>
{{range $k, $v := .serverGroup}}
<optgroup label="{{$v.GroupName}}">
{{range $kk, $vv := $v.Servers}}
<option value="{{$kk}}" {{if eq $kk $.task.ServerId}}selected{{end}} >{{$vv}}</option>
{{end}}
</optgroup>
{{end}}
</select>
</div>
</div>
</div>
</div>
<!--content-list-->
<div class="content-list">
<form action="{{urlfor "TaskController.Add"}}" method="post" class="form-horizontal">
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="task_name">任务名称</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="task_name" value="{{.task.TaskName}}" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">任务说明</label>
<div class="layui-input-inline mw400">
<textarea name="description" id="description" rows="2" placeholder="请输入内容" class="layui-textarea">{{.task.Description}}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">是否单例</label>
<div class="layui-input-inline ">
<input type="radio" name="concurrent" lay-verify="concurrent" value="0" title="是" {{if eq .task.Concurrent 0}}checked{{end}}>
<input type="radio" name="concurrent" lay-verify="concurrent" value="1" title="否" {{if eq .task.Concurrent 1}}checked{{end}}>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="task_name">任务说明</label>
<div class="col-sm-5" >
<textarea name="description" class="form-control" id="description" rows="3">{{.task.Description}}</textarea>
</div>
<div class="col-sm-4" style="padding-top:5px;">
</div>
</div>
<div class="layui-form-mid layui-word-aux"><i class="fa fa-info-circle" aria-hidden="true" id="des"></i></div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="task_name">任务分组</label>
<div class="col-sm-3" >
<select name="group_id" class="form-control">
<option value="0">未分组</option>
{{range $k, $v := .groups}}
<option value="{{$v.Id}}" {{if eq $v.Id $.task.GroupId}}selected{{end}}>{{$v.GroupName}}</option>
{{end}}
</select>
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">时间表达式</label>
<div class="layui-input-inline mw400">
<input type="text" name="cron_spec" id="cron_spec" lay-verify="required" autocomplete="off" placeholder="时间表达式" class="layui-input" value="{{.task.CronSpec}}">
</div>
<div class="layui-form-mid layui-word-aux"><a href="/help" target="_blank"><i class="fa fa-question-circle" aria-hidden="true"></i></a></div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="server_id">服务器</label>
<div class="col-sm-3" >
<select name="server_id" class="form-control">
<option value="0">本地服务器</option>
{{range $ks, $vs := .servers}}
<option value="{{$vs.Id}}" {{if eq $vs.Id $.task.ServerId}}selected{{end}}>{{$vs.ServerName}}</option>
{{end}}
</select>
</div>
<div class="col-sm-6" style="padding-top:5px;">
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">命令脚本</label>
<div class="layui-input-inline mw400">
<textarea name="command" id="command" rows="10" placeholder="请输入内容" class="layui-textarea">{{.task.Command}}</textarea>
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="concurrent">是否单例</label>
<div class="col-sm-3" >
<label class="radio-inline">
<input type="radio" name="concurrent" value="0" {{if eq .task.Concurrent 0}}checked{{end}}>
</label>
<label class="radio-inline">
<input type="radio" name="concurrent" value="1" {{if eq .task.Concurrent 1}}checked{{end}}>
</label>
</div>
<div class="col-sm-6" style="padding-top:5px;">
<i>设为的话如果该任务在上一个时间点还没执行完则略过不执行</i>
</div>
<div class="layui-form-item">
<label class="layui-form-label mw200">超时设置</label>
<div class="layui-input-inline mw400">
<input type="text" name="timeout" id="timeout" lay-verify="required" autocomplete="off" placeholder="单位:秒,默认一天" class="layui-input" value="{{.task.Timeout}}">
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="cron_spec">时间表达式</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="" name="cron_spec" value="{{.task.CronSpec}}" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
<a href="{{urlfor "HelpController.Index"}}" target="_blank">参见使用帮助</a>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<input type="hidden" name="id" id="id" value="{{.task.Id}}">
<div class="layui-form-item">
<label class="layui-form-label mw200"></label>
<div class="layui-input-inline mw400">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="task_name">命令脚本</label>
<div class="col-sm-5" >
<textarea name="command" class="form-control" id="command" rows="3">{{.task.Command}}</textarea>
</div>
<div class="col-sm-4" style="padding-top:5px;">
</div>
</div>
<div class="form-group" style="margin-top: 15px">
<label class="col-sm-3 control-label" for="cron_spec">超时设置</label>
<div class="col-sm-3" >
<input type="text" class="form-control input-sm" placeholder="秒" name="timeout" value="{{.task.Timeout}}" />
</div>
<div class="col-sm-6" style="padding-top:5px;">
单位秒不设置的话默认超时时间为1天
</div>
</div>
<br />
<input type="hidden" name="id" value="{{.task.Id}}" />
<div class="modal-footer" style="text-align:center">
<button type="submit" class="btn btn-primary submit_attr_button">保存</button>
<button type="button" class="btn btn-default reback">返回</button>
</div>
</form>
</div>
</div>
</div>
</form>
</div>
<script>
$(function () {
$("form").submit(function () {
$("button[type='submit']").attr('disabled', true);
$.post('{{urlfor "TaskController.Edit"}}', $(this).serialize(), function (out) {
if (out.status == 0) {
window.location.href = '{{urlfor "TaskController.List"}}';
} else {
alert_message(out.msg,"alert-danger","alert-success");
$("button[type='submit']").attr('disabled', false);
}
}, "json");
return false;
layui.use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
$("#des").on('click',function () {
layer.tips('设为的话如果该任务在上一个时间点还没执行完则略过不执行', '#des', {
tips: [1, '#0FA6D8'] //还可配置颜色
});
})
form.on('submit(sub)', function(data){
var msg = "编辑任务需要重新审核,是否确认需要编辑?";
layer.confirm(msg, {icon: 3, title:'提示'}, function(index){
layer.load();
var form_data = data.field;
$.post('{{urlfor "TaskController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
layer.msg("操作成功,可去【任务审核】中查看该任务",{icon: 1},function () {
window.location.href="/task/auditlist"
})
} else {
layer.msg(out.message)
return
}
}, "json");
setTimeout(function(){
layer.closeAll('loading');
}, 2000);
layer.close(index);
});
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
});
</script>

View File

@@ -1,170 +1,161 @@
<!-- 任务列表 -->
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
</div>
<div class="layui-layout layui-layout-admin" style="padding-left: 20px;">
<div class="layui-row" style="margin-top: 20px;">
<div class="layui-col-xs6">
<div class="layui-btn-group">
<a class="layui-btn" data-type="tabAdd" href="/task/add">新增</a>
<button class="layui-btn batch" data-type="batchstart" >启动</button>
<button class="layui-btn layui-btn-danger batch" data-type="batchpause" >暂停</button>
</div>
</div>
<div class="clearfix"></div>
</div>
<!--content-list-->
<div class="content-list">
<div class="search-box row">
<div class="col-md-4">
<div class="btn-group pull-left" role="group" aria-label="...">
<a href='{{urlfor "TaskController.Add"}}' class="btn btn-primary"><span class="glyphicon glyphicon-plus"></span> 新增任务</a>
<div class="btn-group" role="group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-edit"></span> 批量操作
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="javascript:;" onclick="javascript:batch('active');"><span class="glyphicon glyphicon-expand" aria-hidden="true"></span> 激活</a></li>
<li><a href="javascript:;" onclick="javascript:batch('pause');"><span class="glyphicon glyphicon-pause" aria-hidden="true"></span> 暂停</a></li>
<li class="divider"></li>
<li><a href="javascript:;" onclick="javascript:batch('delete');"><span class="glyphicon glyphicon-remove-sign" aria-hidden="true"></span> 删除</a></li>
</ul>
<div class="layui-col-xs6 search_text">
<form class="layui-form" action="" onsubmit="javascript:return false;">
<div class="demoTable">
<div class="layui-inline" style="width: 40%">
<input class="layui-input" name="taskName" id="taskName" autocomplete="off" placeholder="任务名称" >
</div>
<button class="layui-btn" data-type="reload" id="reload">查询</button>
</div>
</div>
<div class="col-md-8">
<div class=" btn-large pull-right" >
<form method="post" name="s" action="{{urlfor "TaskController.List"}}">
<select name="groupid" class="btn-large form-control">
<option value="99">全部分组</option>
{{range $k, $v := .groups}}
<option value="{{$v.Id}}" {{if eq $v.Id $.groupid}}selected{{end}} >{{$v.GroupName}}</option>
{{end}}
</select>
</form>
</div>
</div>
</form>
</div>
</div>
<div class="clearfix"></div>
<div class="table-margin">
<form id="form-list" method="post" action="">
<table class="table table-bordered table-header">
<thead>
<tr>
<td><input type="checkbox" name="all_check" /></td>
<td>ID</td>
<td width="20%">任务名称</td>
<td>服务器</td>
<td>任务说明</td>
<td>上次执行时间</td>
<td>下次执行时间</td>
<td width="25%">操作</td>
</tr>
</thead>
<tbody>
{{range $k,$v := .list}}
<tr {{if eq $v.is_odd 0 }} style="background: #FFFFFF " {{else}} style="background: #f8f8f8" {{end}}>
<td class="chk"><input type="checkbox" name="ids" value="{{$v.id}}" /></td>
<td> {{$v.id}} </td>
<td>
{{if eq $v.running 0}}
<span class="glyphicon glyphicon-minus-sign brand-danger" aria-hidden="true"></span>
{{else}}
<span class="glyphicon glyphicon-ok-sign brand-success " aria-hidden="true"></span>
{{end}}
{{$v.group_name}}-{{$v.name}}
</td>
<td> {{$v.server_name}} </td>
<td> {{$v.description}} </td>
<td> {{$v.prev_time}} </td>
<td> {{$v.next_time}} </td>
<td>
{{if eq $v.status 0}}
<a class="btn btn-danger btn-xs" href="{{urlfor "TaskController.Start"}}?id={{$v.id}}">
<span class="glyphicon glyphicon-expand" aria-hidden="true"></span> 激活
</a>
<a class="btn btn-info btn-xs" href="{{urlfor "TaskController.Edit"}}?id={{$v.id}}">
<span class="glyphicon glyphicon-edit" aria-hidden="true"></span> 编辑
</a>
{{else}}
<a class="btn btn-success btn-xs" href="{{urlfor "TaskController.Pause"}}?id={{$v.id}}">
<span class="glyphicon glyphicon-pause" aria-hidden="true"></span> 暂停
</a>
<a class="btn btn-default btn-xs" href="javascript:void(0)" onclick="alert('激活状态无法编辑任务,请先暂停任务');">
<span class="glyphicon glyphicon-edit" aria-hidden="true"></span> 编辑
</a>
{{end}}
<a class="btn btn-info btn-run btn-xs" href="{{urlfor "TaskController.Run"}}?id={{$v.id}}">
<span class="glyphicon glyphicon-flash" aria-hidden="true"></span> 执行
</a>
<a class="btn btn-info btn-xs" href="{{urlfor "TaskController.Logs"}}?id={{$v.id}}">
<span class="glyphicon glyphicon-file" aria-hidden="true"></span> 日志
</a>
<a class="btn btn-info btn-xs" href="{{urlfor "TaskController.Copy"}}?id={{$v.id}}">
<span class="glyphicon glyphicon-copy" aria-hidden="true"></span> 复制
</a>
</td>
</tr>
{{end}}
</tbody>
<tfoot>
<tr>
<td colspan="8">
<div class="pull-right">
{{str2html .pageBar}}
</div>
</td>
</tr>
</tfoot>
</table>
</form>
</div>
</div>
</div>
<table class="layui-hide" id="table_list" lay-filter="table_filter">
</table>
<script type="text/html" id="bar">
{{/*<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="status">启|停</a>*/}}
{{/*<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>*/}}
<a class="layui-btn layui-btn-xs " lay-event="detail">详细</a>
<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="run">测试</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="log">日志</a>
</script>
</div>
<script>
$(function() {
$('[data-toggle="tooltip"]').tooltip()
$("select[name='groupid']").change(function () {
$("form[name='s']").submit();
});
$(".btn-run").click(function () {
return confirm("该功能建议只用来做任务测试,确定要立即执行该任务吗?");
});
});
function batch(action) {
if ($("input[name=ids]:checked").size() < 1) {
alert_message("请选择要操作的任务","alert-danger","alert-success");
} else {
if(action=='delete'){
if(!confirm("确定要删除所选吗?")) return;
layui.use(['table','form','element'], function(){
var table = layui.table;
var form = layui.form;
var element = layui.element;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
var url = "{{urlfor "TaskController.Batch"}}";
$.post(url + "?action=" + action, $("#form-list").serialize(), function(out) {
if (out.status != 0) {
alert_message(out.msg,"alert-danger","alert-success");
} else {
window.location.reload();
//方法级渲染
table.render({
elem: '#table_list'
,url: '/task/table'
,cols: [[
{checkbox: true, fixed: true},
{field:'id', title: 'ID', align:'center',sort: true, width:50}
,{field:'task_name',title: '任务名称'}
,{field:'description',title: '任务说明'}
,{field:'next_time', width:170,title: '下次执行时间'}
,{field:'pre_time', width:170,title: '上次执行时间'}
,{field:'execute_times', width:70,title: '次数'}
,{fixed: 'right', width:260, align:'center', title:'操作', toolbar: '#bar'}
]]
,id: 'listReload'
,page: true
,height: "full-130"
});
var $ = layui.$, active = {
reload: function(){
table.reload('listReload', {
where: {
taskName: $('#taskName').val(),
}
});
}
}, "json");
}
return false;
}
//点击行换色
$('tbody tr').click(function(){
$(this).addClass("warning").siblings().removeClass("warning");
});
};
//监听工具条
table.on('tool(table_filter)', function(obj){
var data = obj.data;
if(obj.event === 'edit'){
window.location.href="/task/edit?id="+data.id
} else if(obj.event === 'log'){
window.location.href="/tasklog/list?task_id="+data.id;
}else if (obj.event==='detail'){
window.location.href='/task/detail?id='+data.id;
}else if (obj.event==='run'){
layer.confirm("测试执行任务,注意不要超时,请确认执行", {icon: 3, title:'提示'}, function(index){
layer.load();
$.post('/task/ajaxrun', {id:data.id}, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
window.location.href="/tasklog/list?task_id="+data.id
})
} else {
layer.msg(out.message)
return
}
}, "json");
setTimeout(function(){
layer.closeAll('loading');
}, 2000);
layer.close(index);
});
}else if (obj.event==='status'){
layer.msg("状态")
}else{
layer.msg('操作不存在')
}
});
$(".batch").on('click',function (obj) {
var action = $(this).attr('data-type');
var checkStatus = table.checkStatus('listReload');
var data = checkStatus.data;
if(data.length<1){
layer.msg("请选择操作数据");
return;
}
var msg = "确认启动这些任务吗";
if (action=='batchpause'){
msg = "确定暂定这些任务吗";
}
layer.confirm(msg, {icon: 3, title:'提示'}, function(index){
var ids = "";
$.each(data,function (k,v) {
ids += v.id+",";
});
ids = ids.substr(0,ids.length-1);
layer.load();
$.post('/task/ajax'+action, {"ids":ids}, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
$('#reload').click();
})
} else {
layer.msg(out.message)
return
}
}, "json");
setTimeout(function(){
layer.closeAll('loading');
}, 2000);
layer.close(index);
});
return ;
})
$('.demoTable .layui-btn').on('click', function(){
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
});
</script>

View File

@@ -1,130 +0,0 @@
<!-- 新增任务 -->
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
</div>
</div>
</div>
</div>
<!--content-list-->
<div class="content-list">
<div class="search-box row">
<p>
<h5>{{.task.TaskName}} #{{.task.Id}}</h5>
<pre>{{.task.Command}}</pre>
</p>
</div>
<hr />
<div class="mt20"></div>
<div class="search-box row">
<div class="col-md-4">
<div class="btn-group pull-left" role="group" aria-label="...">
<div class="btn-group" role="group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
批量操作
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="javascript:;" onclick="javascript:batch('delete');"> <span class="glyphicon glyphicon-remove-sign"></span> 删除</a></li>
</ul>
</div>
<button type="button" class="btn btn-default reback">返回</button>
</div>
</div>
<div class="col-md-8">
</div>
</div>
<div class="clearfix"></div>
<div class="table-margin">
<form id="form-list" method="post" action="">
<table class="table table-bordered table-header">
<thead>
<tr>
<td><input type="checkbox" name="all_check" /></td>
<td>ID</td>
<td width="20%">开始时间</td>
<td>执行时间</td>
<td>输出</td>
<td>状态</td>
<td width="10%">操作</td>
</tr>
</thead>
<tbody>
{{range $k,$v := .list}}
<tr>
<td class="chk"><input type="checkbox" name="ids" value="{{$v.id}}" /></td>
<td> {{$v.id}} </td>
<td> {{$v.start_time}} </td>
<td>{{$v.process_time}} </td>
<td>{{$v.ouput_size}}</td>
<td>
{{if eq $v.status 0}}
<span class="glyphicon glyphicon-ok-sign brand-success" aria-hidden="true"> </span>正常
{{else if eq $v.status -1}}
<span class="glyphicon glyphicon-remove-sign brand-danger" aria-hidden="true"> </span> 出错
{{else if eq $v.status -2}}
<span class="glyphicon glyphicon-exclamation-sign brand-warning" aria-hidden="true"> </span> 超时
{{end}}
</td>
<td>
<a class="btn btn-info btn-xs" href="{{urlfor "TaskController.ViewLog"}}?id={{$v.id}}">
<i class="glyphicon glyphicon-file"></i> 详情
</a>
</td>
</tr>
{{end}}
</tbody>
<tfoot>
<tr>
<td colspan="7">
<div class="pull-right">
{{str2html .pageBar}}
</div>
</td>
</tr>
</tfoot>
</table>
</form>
</div>
</div>
</div>
<script>
function batch(action) {
if ($("input[name='ids']:checked").size() < 1) {
alert_message("请选择要操作的任务","alert-danger","alert-success");
} else {
if (!confirm("确实要删除所选吗?")) return;
var url = "{{urlfor "TaskController.LogBatch"}}";
$.post(url + "?action=" + action, $("#form-list").serialize(), function(out) {
if (out.status != 0) {
alert_message(out.msg,"alert-danger","alert-success");
} else {
window.location.reload();
}
}, "json");
}
return false;
}
</script>

View File

@@ -1,47 +0,0 @@
<!-- 新增任务 -->
<div class="container-fluid">
<div class="info-center">
<!--title-->
<div class="info-center">
<div class="page-header">
<div class="pull-left">
<h4>{{.pageTitle}}</h4>
</div>
<div class="pull-right">
<!-- <button type="button" class="btn btn-mystyle btn-sm refresh">刷新</button>
<button type="button" class="btn btn-mystyle btn-sm reback">返回</button> -->
</div>
</div>
</div>
</div>
<!--content-list-->
<div class="content-list">
<div class="search-box row">
<h4>{{.task.TaskName}}</h4>
日志ID#{{.data.id}} <br />
执行时间{{.data.start_time}} <br />
执行耗时{{.data.process_time}} <br />
输出大小{{.data.ouput_size}}
<hr />
<h4>任务命令</h4>
<pre class="pre-scrollable">{{.task.Command}}</pre>
<hr />
<h4>执行输出</h4>
<pre class="pre-scrollable">{{.data.output}}</pre>
<h4>错误输出</h4>
<pre class="pre-scrollable">{{.data.error}}</pre>
<hr />
<div class="btn-group">
<button class="btn btn-default reback"><span class="icon-chevron-left"></span> </button>
</div>
</div>
</div>
</div>

185
views/tasklog/detail.html Normal file
View File

@@ -0,0 +1,185 @@
<style>
.layui-form-item{
margin-bottom: 0px;
}
legend{
font-size: 14px !important;
color: #009688;
font-weight: bold !important;
}
</style>
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;padding-right: 10px;">
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
<legend>{{.task.TaskName}}#{{.task.Id}}日志</legend>
</fieldset>
<table class="layui-table" lay-skin="nob" lay-size="sm">
<colgroup>
<col width="80">
<col width="400">
<col>
</colgroup>
<tbody>
<tr>
<td>日志ID</td>
<td>#{{.taskLog.id}}</td>
<td></td>
</tr>
<tr>
<td>执行时间</td>
<td>{{.taskLog.start_time}}</td>
<td></td>
</tr>
<tr>
<td>执行耗时</td>
<td>{{.taskLog.process_time}}</td>
<td></td>
</tr>
<tr>
<td>输出大小</td>
<td>{{.taskLog.ouput_size}}</td>
<td></td>
</tr>
<tr>
<td>运行结果</td>
<td>{{.taskLog.status|str2html}}</td>
<td></td>
</tr>
</tbody>
</table>
</div>
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;padding-right: 10px;">
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
<legend>任务命令</legend>
</fieldset>
<pre class="layui-code">{{.task.Command}}</pre>
</div>
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;padding-right: 10px;">
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
<legend>执行输出</legend>
</fieldset>
<pre class="layui-code">{{.taskLog.ouput}}</pre>
</div>
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;padding-right: 10px;">
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
<legend>错误输出</legend>
</fieldset>
<pre class="layui-code">{{.taskLog.error}}</pre>
</div>
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;padding-right: 10px;">
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
<legend>{{.task.TaskName}}#{{.task.Id}}任务详细</legend>
</fieldset>
<table class="layui-table" lay-skin="nob" lay-size="sm">
<colgroup>
<col width="80">
<col width="400">
<col>
</colgroup>
<tbody>
<tr>
<td>任务名称</td>
<td> {{.task.TaskName}}</td>
<td></td>
</tr>
<tr>
<td>任务说明</td>
<td>{{.task.TaskName}}</td>
<td></td>
</tr>
<tr>
<td>任务状态</td>
<td>{{.TextStatus|str2html}}</td>
<td></td>
</tr>
<tr>
<td>执行次数</td>
<td>{{.task.ExecuteTimes}}</td>
<td></td>
</tr>
<tr>
<td>服务资源</td>
<td> {{.serverName}}</td>
<td></td>
</tr>
<tr>
<td>是否单例</td>
<td>{{if eq .task.Concurrent 0}}{{end}} {{if eq .task.Concurrent 1}}{{end}}</td>
<td></td>
</tr>
<tr>
<td>执行时间</td>
<td> {{.task.CronSpec}}</td>
<td></td>
</tr>
<tr>
<td>命令脚本</td>
<td>{{.task.Command}}</td>
<td></td>
</tr>
<tr>
<td>超时设置</td>
<td>{{.task.Timeout}}</td>
<td></td>
</tr>
<tr>
<td>创建时间</td>
<td>{{.CreateTime}}</td>
<td></td>
</tr>
<tr>
<td>创建人</td>
<td>{{.task.CreateId}}</td>
<td></td>
</tr>
<tr>
<td>修改时间</td>
<td>{{.UpdateTime}}</td>
<td></td>
</tr>
<tr>
<td>最后修改人</td>
<td>{{.task.UpdateId}}</td>
<td></td>
</tr>
</tbody>
</table>
</div>
<script>
layui.use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
</script>

125
views/tasklog/list.html Normal file
View File

@@ -0,0 +1,125 @@
<div class="layui-layout layui-layout-admin" style="padding-left: 20px;">
<div class="layui-row" style="margin-top: 20px;">
<div class="layui-col-xs6">
<button class="layui-btn layui-btn-danger" data-type="tabDel" id="tabDel">批量删除</button>
</div>
<div class="layui-col-xs6 search_text">
<form class="layui-form" action="" onsubmit="javascript:return false;">
<div class="demoTable">
<div class="layui-inline" style="width: 20%;text-align: left">
<select name="status" lay-filter="status">
<option value="9">全部</option>
<option value="-1">正常</option>
<option value="-2">错误</option>
</select>
</div>
<button class="layui-btn" data-type="reload" id="reload">查询</button>
</div>
</form>
</div>
</div>
<table class="layui-hide" id="table_list" lay-filter="table_filter">
</table>
<script type="text/html" id="bar">
<a class="layui-btn layui-btn-xs layui-btn-primary" lay-event="detail">详细</a>
</script>
</div>
<script>
layui.use(['table','form','element'], function(){
var table = layui.table;
var error_info = "{{.flash.error}}";
if(error_info){
layer.msg(error_info,{icon: 2,shade:0.3},function () {
window.history.go(-1)
})
return;
}
//方法级渲染
table.render({
elem: '#table_list'
,url: "/tasklog/table?task_id={{.task_id}}"
,cols: [[
{checkbox: true, fixed: true}
,{field:'id', title: 'ID', align:'center',sort: true, width:150}
,{field:'task_id', title: '任务ID', align:'center',sort: true, width:150}
,{field:'start_time',title: '开始时间'}
,{field:'process_time',width:100, title: '执行时间'}
,{field:'ouput_size',title: '输出'}
,{field:'status', width:170,title: '状态'}
,{fixed: 'right', align:'center', title:'操作', toolbar: '#bar'}
]]
,id: 'listReload'
,page: true
,height: "full-130"
});
var $ = layui.$, active = {
reload: function(){
table.reload('listReload', {
where: {
status: $("select[name=status]").val()
}
});
}
};
$("#tabDel").on("click",function (obj) {
var checkStatus = table.checkStatus('listReload');
var data = checkStatus.data;
if(data.length<1){
layer.msg("请选择操作数据");
return
}
layer.confirm('是否确认删除选中项', {icon: 3, title:'提示'}, function(index){
//do something
var ids = "";
$.each(data,function (k,v) {
ids += v.id+",";
});
ids = ids.substr(0,ids.length-1)
$.post('/tasklog/ajaxdel', {ids:ids}, function (out) {
if (out.status == 0) {
layer.msg("操作成功",{icon: 1},function () {
$('#reload').click();
})
} else {
layer.msg(out.message)
}
}, "json");
layer.close(index);
});
return;
})
//监听工具条
table.on('tool(table_filter)', function(obj){
var data = obj.data;
if(obj.event === 'detail'){
window.location.href="/tasklog/detail?id="+data.id
} else{
layer.msg('操作不存在')
}
});
$('.demoTable .layui-btn').on('click', function(){
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
});
</script>

112
views/user/edit.html Normal file
View File

@@ -0,0 +1,112 @@
<div class="layui-layout layui-layout-admin" style="padding-left: 40px;margin-top: 20px;">
<form class="layui-form" action="" method="post" >
<div class="layui-form-item">
<label class="layui-form-label">登录账号</label>
<div class="layui-input-inline">
<input type="text" name="login_name" readonly id="login_name" lay-verify="required" autocomplete="off" placeholder="登录账号" class="layui-input" value="{{.admin.login_name}}">
</div>
<div class="layui-form-mid layui-word-aux">*登录不允许修改</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">真实姓名</label>
<div class="layui-input-inline">
<input type="text" name="real_name" id="real_name" lay-verify="required" autocomplete="off" placeholder="真实姓名" class="layui-input" value="{{.admin.real_name}}">
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">手机号码</label>
<div class="layui-input-inline">
<input type="text" name="phone" lay-verify="phone|required" autocomplete="off" placeholder="手机号码" class="layui-input" value="{{.admin.phone}}">
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">电子邮箱</label>
<div class="layui-input-inline">
<input type="text" name="email" id="email" lay-verify="email" autocomplete="off" placeholder="电子邮箱" class="layui-input" value="{{.admin.email}}">
</div>
<div class="layui-form-mid layui-word-aux">*</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否修改</label>
<div class="layui-input-inline">
<input type="radio" name="reset_pwd" lay-verify="reset_pwd" value="1" title="是">
<input type="radio" name="reset_pwd" lay-verify="reset_pwd" value="2" title="否" checked>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item password" style="display:none;">
<label class="layui-form-label">旧密码</label>
<div class="layui-input-inline">
<input type="password" name="password_old" id="password_old" lay-verify="" autocomplete="off" placeholder="旧密码" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item password" style="display:none;">
<label class="layui-form-label">设置密码</label>
<div class="layui-input-inline">
<input type="password" name="password_new1" id="password_new1" lay-verify="" autocomplete="off" placeholder="新密码" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item password" style="display:none;">
<label class="layui-form-label">重复密码</label>
<div class="layui-input-inline">
<input type="password" name="password_new2" id="password_new2" lay-verify="" autocomplete="off" placeholder="新密码" class="layui-input" value="">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<input type="hidden" id="id" name="id" value="{{.admin.id}}">
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit="" lay-filter="sub">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</div>
<script>
var $;
layui.config({
base : "js/"
}).use(['form','element','layer','jquery'],function(){
var form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
var $ = layui.jquery;
form.on('radio', function(data){
if(data.value==1){
$(".password").show()
}else{
$(".password").hide()
}
});
form.on('submit(sub)', function(data){
var form_data = $("form").serialize();
$.post('{{urlfor "UserController.AjaxSave"}}', form_data, function (out) {
if (out.status == 0) {
layer.msg("操作成功,请重新登录",{icon: 1},function () {
top.location.href="/login_out"
})
} else {
layer.msg(out.message)
}
}, "json");
return false;
});
//但是如果你的HTML是动态生成的自动渲染就会失效
//因此你需要在相应的地方,执行下述方法来手动渲染,跟这类似的还有 element.init();
form.render();
});
</script>