Initial commit
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>404</title>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta http-equiv="Access-Control-Allow-Origin" content="*">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="format-detection" content="telephone=no">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<style>
|
||||
.error .clip .shadow {height:180px;}
|
||||
.error .clip:nth-of-type(2) .shadow {width:130px;}
|
||||
.error .clip:nth-of-type(1) .shadow,.error .clip:nth-of-type(3) .shadow {width:250px;}
|
||||
.error .digit {width:150px;height:150px;line-height:150px;font-size:120px;font-weight:bold;}
|
||||
.error h2 {font-size:32px;}
|
||||
.error .msg {top:-190px;left:30%;width:80px;height:80px;line-height:80px;font-size:32px;}
|
||||
.error span.triangle {top:70%;right:0%;border-left:20px solid #535353;border-top:15px solid transparent;border-bottom:15px solid transparent;}
|
||||
.error .container-error-404 {top: 50%;margin-top: 250px;position:relative;height:250px;padding-top:40px;}
|
||||
.error .container-error-404 .clip {display:inline-block;transform:skew(-45deg);}
|
||||
.error .clip .shadow {overflow:hidden;}
|
||||
.error .clip:nth-of-type(2) .shadow {overflow:hidden;position:relative;box-shadow:inset 20px 0px 20px -15px rgba(150,150,150,0.8),20px 0px 20px -15px rgba(150,150,150,0.8);}
|
||||
.error .clip:nth-of-type(3) .shadow:after,.error .clip:nth-of-type(1) .shadow:after {content:"";position:absolute;right:-8px;bottom:0px;z-index:9999;height:100%;width:10px;background:linear-gradient(90deg,transparent,rgba(173,173,173,0.8),transparent);border-radius:50%;}
|
||||
.error .clip:nth-of-type(3) .shadow:after {left:-8px;}
|
||||
.error .digit {position:relative;top:8%;color:white;background:#1E9FFF;border-radius:50%;display:inline-block;transform:skew(45deg);}
|
||||
.error .clip:nth-of-type(2) .digit {left:-10%;}
|
||||
.error .clip:nth-of-type(1) .digit {right:-20%;}
|
||||
.error .clip:nth-of-type(3) .digit {left:-20%;}
|
||||
.error h2 {font-size:24px;color:#A2A2A2;font-weight:bold;padding-bottom:20px;}
|
||||
.error .tohome {font-size:16px;color:#07B3F9;}
|
||||
.error .msg {position:relative;z-index:9999;display:block;background:#535353;color:#A2A2A2;border-radius:50%;font-style:italic;}
|
||||
.error .triangle {position:absolute;z-index:999;transform:rotate(45deg);content:"";width:0;height:0;}
|
||||
@media(max-width:767px) {.error .clip .shadow {height:100px;}
|
||||
.error .clip:nth-of-type(2) .shadow {width:80px;}
|
||||
.error .clip:nth-of-type(1) .shadow,.error .clip:nth-of-type(3) .shadow {width:100px;}
|
||||
.error .digit {width:80px;height:80px;line-height:80px;font-size:52px;}
|
||||
.error h2 {font-size:18px;}
|
||||
.error .msg {top:-110px;left:15%;width:40px;height:40px;line-height:40px;font-size:18px;}
|
||||
.error span.triangle {top:70%;right:-3%;border-left:10px solid #535353;border-top:8px solid transparent;border-bottom:8px solid transparent;}
|
||||
.error .container-error-404 {height:150px;}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="error">
|
||||
<div class="container-floud">
|
||||
<div style="text-align: center">
|
||||
<div class="container-error-404">
|
||||
<div class="clip">
|
||||
<div class="shadow">
|
||||
<span class="digit thirdDigit"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clip">
|
||||
<div class="shadow">
|
||||
<span class="digit secondDigit"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clip">
|
||||
<div class="shadow">
|
||||
<span class="digit firstDigit"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="msg">OH!
|
||||
<span class="triangle"></span>
|
||||
</div>
|
||||
</div>
|
||||
<h2 class="h1">很抱歉,你访问的页面找不到了</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script>
|
||||
function randomNum() {
|
||||
return Math.floor(Math.random() * 9) + 1;
|
||||
}
|
||||
|
||||
var loop1, loop2, loop3, time = 30, i = 0, number;
|
||||
loop3 = setInterval(function () {
|
||||
if (i > 40) {
|
||||
clearInterval(loop3);
|
||||
document.querySelector('.thirdDigit').textContent = 4;
|
||||
} else {
|
||||
document.querySelector('.thirdDigit').textContent = randomNum();
|
||||
i++;
|
||||
}
|
||||
}, time);
|
||||
loop2 = setInterval(function () {
|
||||
if (i > 80) {
|
||||
clearInterval(loop2);
|
||||
document.querySelector('.secondDigit').textContent = 0;
|
||||
} else {
|
||||
document.querySelector('.secondDigit').textContent = randomNum();
|
||||
i++;
|
||||
}
|
||||
}, time);
|
||||
loop1 = setInterval(function () {
|
||||
if (i > 100) {
|
||||
clearInterval(loop1);
|
||||
document.querySelector('.firstDigit').textContent = 4;
|
||||
} else {
|
||||
document.querySelector('.firstDigit').textContent = randomNum();
|
||||
i++;
|
||||
}
|
||||
}, time);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,101 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>管理员配置</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../css/public.css" media="all">
|
||||
<style>
|
||||
body {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="layui-form layuimini-form" lay-filter="account-info">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form">
|
||||
<blockquote class="layui-elem-quote">管理员配置</blockquote>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">用户名:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="username" class="layui-input"
|
||||
lay-verify="required"
|
||||
lay-reqtext="用户名不能为空">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">旧密码:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="password" name="oldpwd" placeholder="请输入当前的管理员密码" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">新密码:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="password" name="newpwd" placeholder="不修改请留空" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">重输密码:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="password" name="newpwd2" placeholder="不修改请留空" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn " lay-submit lay-filter="saveBtn">确认修改</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="template_tpl">
|
||||
{{#for(const item of d){}}
|
||||
<option value="{{item}}">{{item}}</option>
|
||||
{{# }}}
|
||||
</script>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../js/common.js" charset="utf-8"></script>
|
||||
<script src="../js/api.js" charset="utf-8"></script>
|
||||
<script>
|
||||
|
||||
const init = () => {
|
||||
//layer.load(1)
|
||||
httpGet('/admin/system/get?key=admin_username').then(res => {
|
||||
if (res.status === 'ok') {
|
||||
layui.form.val('account-info', {'username' : res.data})
|
||||
}
|
||||
})
|
||||
}
|
||||
layui.use(['form'], function () {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
laytpl = layui.laytpl,
|
||||
$ = layui.$;
|
||||
init();
|
||||
|
||||
//监听提交
|
||||
form.on('submit(saveBtn)', function (data) {
|
||||
layer.load(1)
|
||||
httpPost('/admin/system/setpwd', data.field).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('修改成功');
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,239 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>分类管理</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../css/public.css" media="all">
|
||||
<script src="../js/common.js" charset="utf-8"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="layuimini-container">
|
||||
<div class="layuimini-main">
|
||||
|
||||
<fieldset class="table-search-fieldset">
|
||||
<legend>搜索信息</legend>
|
||||
<div style="margin: 10px 10px 10px 10px">
|
||||
<form class="layui-form layui-form-pane" action="" lay-filter="data-search">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">分类标题</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="title" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit
|
||||
lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索
|
||||
</button>
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit
|
||||
lay-filter="data-refresh-btn"><i class="layui-icon layui-icon-refresh"></i> 重 置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add"> 添加</button>
|
||||
<button class="layui-btn layui-btn-sm layui-btn-danger data-delete-btn" lay-event="delete"> 删除</button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
|
||||
|
||||
<script type="text/html" id="currentTableBar">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
|
||||
</script>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../js/api.js" charset="utf-8"></script>
|
||||
<script>
|
||||
layui.use(['form', 'table'], function () {
|
||||
var $ = layui.jquery,
|
||||
form = layui.form,
|
||||
table = layui.table;
|
||||
|
||||
table.render({
|
||||
elem: '#currentTableId',
|
||||
url: '/admin/category/list',
|
||||
toolbar: '#toolbarDemo',
|
||||
defaultToolbar: ['filter', 'exports', 'print', {
|
||||
title: '提示',
|
||||
layEvent: 'LAYTABLE_TIPS',
|
||||
icon: 'layui-icon-tips'
|
||||
}],
|
||||
cols: [[
|
||||
{type: 'checkbox', fixed: 'left'}
|
||||
, {field: 'id', width: 80, title: 'ID', sort: true, fixed: 'left'},
|
||||
{field: 'title', width: 200, title: '分类标题', sort: true, align: 'center', edit: 'text'},
|
||||
{field: 'icon', width: 150, title: '分类ICON', sort: true, align: 'center', edit: 'text'},
|
||||
{field: 'weight', width: 100, title: '权重', sort: true, align: 'center', edit: 'text'},
|
||||
{field: 'enable', width: 100, title: '是否显示', align: 'center', templet: function (res) {
|
||||
return `<input type="checkbox" name="enable" value="${res.enable}" data-id="${res.id}" lay-skin="switch" lay-text="显示|隐藏" lay-filter="enable_switch" ${res.enable == 1 ? 'checked' : ''}>`}
|
||||
},
|
||||
{field: 'create_time', width: 200, title: '创建时间', sort: true, align: 'center'},
|
||||
{field: 'update_time', width: 200, title: '修改时间', sort: true, align: 'center'},
|
||||
{title: '操作', width: 200, toolbar: '#currentTableBar', align: "center", fixed: 'right'}
|
||||
]],
|
||||
limits: [10, 15, 20, 25, 50, 100],
|
||||
limit: 15,
|
||||
page: true,
|
||||
skin: 'line',
|
||||
response: parse_table.response,
|
||||
parseData: parse_table.parseData
|
||||
});
|
||||
|
||||
// 监听搜索操作
|
||||
form.on('submit(data-search-btn)', function (data) {
|
||||
//执行搜索重载
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
// 监听重置操作
|
||||
form.on('submit(data-refresh-btn)', function (data) {
|
||||
data.field.title = '';
|
||||
form.val('data-search', data.field)
|
||||
//执行搜索重载
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* toolbar监听事件
|
||||
*/
|
||||
table.on('toolbar(currentTableFilter)', function (obj) {
|
||||
if (obj.event === 'add') { // 监听添加操作
|
||||
var index = layer.open({
|
||||
title: '添加分类',
|
||||
type: 2,
|
||||
shade: 0.2,
|
||||
maxmin: true,
|
||||
shadeClose: true,
|
||||
area: ['100%', '100%'],
|
||||
content: '../page/category/add.html',
|
||||
end: function (index, layero) {
|
||||
table.reload('currentTableId')
|
||||
return false;
|
||||
}
|
||||
});
|
||||
$(window).on("resize", function () {
|
||||
layer.full(index);
|
||||
});
|
||||
} else if (obj.event === 'delete') { // 监听删除操作
|
||||
var checkStatus = table.checkStatus('currentTableId')
|
||||
, data = checkStatus.data;
|
||||
|
||||
layer.confirm('你确实要删除选中的记录吗?', function (index) {
|
||||
layer.load(1)
|
||||
let tasks = []
|
||||
for (const k in data) {
|
||||
tasks.push(
|
||||
httpGet('/admin/category/delete?id=' + data[k].id).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('删除成功')
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
}
|
||||
}))
|
||||
}
|
||||
layer.close(index);
|
||||
Promise.all(tasks).finally(() => layer.closeAll('loading'))
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//监听表格复选框选择
|
||||
table.on('checkbox(currentTableFilter)', function (obj) {
|
||||
console.log(obj)
|
||||
});
|
||||
|
||||
//监听显示隐藏操作
|
||||
form.on('switch(enable_switch)', function (obj) {
|
||||
layer.load(1)
|
||||
httpPost('/admin/category/enable', {
|
||||
id: $(obj.elem).data('id'),
|
||||
enable: obj.elem.checked ? 1 : 0
|
||||
}).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
});
|
||||
|
||||
table.on('tool(currentTableFilter)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'edit') {
|
||||
|
||||
var index = layer.open({
|
||||
title: '编辑分类信息',
|
||||
type: 2,
|
||||
shade: 0.2,
|
||||
maxmin: true,
|
||||
shadeClose: true,
|
||||
area: ['100%', '100%'],
|
||||
content: '../page/category/edit.html?id=' + data.id,
|
||||
end: function (index, layero) {
|
||||
table.reload('currentTableId')
|
||||
return false;
|
||||
}
|
||||
});
|
||||
$(window).on("resize", function () {
|
||||
layer.full(index);
|
||||
});
|
||||
return false;
|
||||
} else if (obj.event === 'delete') {
|
||||
layer.confirm('你确实要删除此记录吗?', function (index) {
|
||||
layer.load(1)
|
||||
httpGet('/admin/category/delete?id=' + data.id).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
obj.del();
|
||||
}
|
||||
}).finally(() => layer.closeAll('loading'))
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
//触发单元格编辑
|
||||
table.on('edit(currentTableFilter)', function (obj) {
|
||||
layer.load(1)
|
||||
httpPost('/admin/category/edit', obj.data).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
}
|
||||
}).finally(() => {
|
||||
table.reload('currentTableFilter')
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,84 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>添加分类</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../../css/public.css" media="all">
|
||||
<style>
|
||||
body {
|
||||
background-color: #ffffff;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form layuimini-form" lay-filter="plugin-info">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类标题:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="title" placeholder="分类标题"
|
||||
lay-verify="required" lay-reqtext="分类标题不得为空"
|
||||
class="layui-input"/>
|
||||
<tip>分类标题,随便取一个吧,相信天才的你一定能都做到</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类ICON:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="icon" placeholder="分类ICON"
|
||||
lay-verify="required" lay-reqtext="分类ICON不得为空"
|
||||
class="layui-input" value="icon ni ni-box"/>
|
||||
<tip>填写示例:icon ni ni-box,<a href="https://dashlite.net/demo6/components/misc/nioicon.html" target="_blank" rel="noreferrer">查询地址</a></tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">权重:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="weight" placeholder="请填写权重" value=""
|
||||
lay-verify="required" lay-reqtext="权重不能为空"
|
||||
class="layui-input" required>
|
||||
<tip>填数字,数字越大排名越前。</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" style="display: none">
|
||||
<label class="layui-form-label">是否显示:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" value="1" name="enable" lay-skin="switch" lay-filter="switchTest" lay-text="ON|OFF" checked>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="saveBtn">确认添加</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../../js/api.js?v=1.0.0" charset="utf-8"></script>
|
||||
<script src="../../js/common.js?v=1.0.0" charset="utf-8"></script>
|
||||
<script>
|
||||
layui.use(['form'], function () {
|
||||
var form = layui.form,
|
||||
layer = layui.layer;
|
||||
//监听提交
|
||||
form.on('submit(saveBtn)', function (data) {
|
||||
layer.load(1)
|
||||
data.field.enable = data.field.enable ? 1 : 0;
|
||||
httpPost('/admin/category/add', data.field).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('添加成功');
|
||||
const index = parent.layer.getFrameIndex(window.name);
|
||||
parent.layer.close(index);
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,99 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>编辑分类</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../../css/public.css" media="all">
|
||||
<style>
|
||||
body {
|
||||
background-color: #ffffff;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form layuimini-form" lay-filter="category-info">
|
||||
<div class="layui-form-item" style="display: none">
|
||||
<label class="layui-form-label">id:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="id" placeholder="请填写入插件id" class="layui-input"
|
||||
required disabled/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类标题:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="title" placeholder="分类标题"
|
||||
lay-verify="required" lay-reqtext="分类标题不得为空"
|
||||
class="layui-input"/>
|
||||
<tip>分类标题,随便取一个吧,相信天才的你一定能都做到</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类ICON:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="icon" placeholder="分类ICON"
|
||||
lay-verify="required" lay-reqtext="分类ICON不得为空"
|
||||
class="layui-input"/>
|
||||
<tip>填写示例:icon ni ni-box,<a href="https://dashlite.net/demo6/components/misc/nioicon.html" target="_blank" rel="noreferrer">查询地址</a></tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">权重:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="weight" placeholder="请填写权重" value=""
|
||||
lay-verify="required" lay-reqtext="权重不能为空"
|
||||
class="layui-input" required>
|
||||
<tip>填数字,数字越大排名越前。</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" style="display: none">
|
||||
<label class="layui-form-label">是否显示:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" value="1" name="enable" lay-skin="switch" lay-filter="switchTest" lay-text="ON|OFF">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="saveBtn">确认保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../../js/api.js?v=1.0.0" charset="utf-8"></script>
|
||||
<script src="../../js/common.js?v=1.0.0" charset="utf-8"></script>
|
||||
<script>
|
||||
const init = () => {
|
||||
//layer.load(1)
|
||||
httpGet('/admin/category/get?id=' + getQueryString('id')).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
layui.form.val('category-info', res.data)
|
||||
}
|
||||
}).finally(layer.closeAll('loading'))
|
||||
}
|
||||
layui.use(['form'], function () {
|
||||
var form = layui.form,
|
||||
layer = layui.layer;
|
||||
init()
|
||||
//监听提交
|
||||
form.on('submit(saveBtn)', function (data) {
|
||||
layer.load(1)
|
||||
data.field.enable = data.field.enable ? 1 : 0;
|
||||
httpPost('/admin/category/edit', data.field).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
init()
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,238 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>留言管理</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../css/public.css" media="all">
|
||||
<script src="../js/common.js" charset="utf-8"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="layuimini-container">
|
||||
<div class="layuimini-main">
|
||||
|
||||
<fieldset class="table-search-fieldset">
|
||||
<legend>搜索信息</legend>
|
||||
<div style="margin: 10px 10px 10px 10px">
|
||||
<form class="layui-form layui-form-pane" action="" lay-filter="data-search">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">留言内容</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="content" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">用户UID</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="uid" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit
|
||||
lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索
|
||||
</button>
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit
|
||||
lay-filter="data-refresh-btn"><i class="layui-icon layui-icon-refresh"></i> 重 置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm layui-btn-danger data-delete-btn" lay-event="delete"> 删除</button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
|
||||
|
||||
<script type="text/html" id="currentTableBar">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="uidColumn">
|
||||
<a href="javascript:;" layuimini-content-href="page/user.html?uid={{d.uid}}" data-title="用户管理">{{d.uid}}</a>
|
||||
</script>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../js/lay-config.js?v=2.0.0" charset="utf-8"></script>
|
||||
<script src="../js/api.js" charset="utf-8"></script>
|
||||
<script>
|
||||
layui.use(['form', 'table', 'miniTab'], function () {
|
||||
var $ = layui.jquery,
|
||||
form = layui.form,
|
||||
table = layui.table,
|
||||
miniTab = layui.miniTab;
|
||||
|
||||
miniTab.listen();
|
||||
|
||||
table.render({
|
||||
elem: '#currentTableId',
|
||||
url: '/admin/comment/list',
|
||||
toolbar: '#toolbarDemo',
|
||||
defaultToolbar: ['filter', 'exports', 'print', {
|
||||
title: '提示',
|
||||
layEvent: 'LAYTABLE_TIPS',
|
||||
icon: 'layui-icon-tips'
|
||||
}],
|
||||
cols: [[
|
||||
{type: 'checkbox', fixed: 'left'}
|
||||
, {field: 'id', width: 80, title: 'ID', sort: true, fixed: 'left'},
|
||||
{field: 'uid', width: 80, title: 'UID', align: 'center', templet: "#uidColumn"},
|
||||
{field: 'email', width: 80, title: '邮箱', align: 'center'},
|
||||
{field: 'content', width: 250, title: '留言内容', edit: 'text'},
|
||||
{field: 'reply', width: 250, title: '回复内容', edit: 'text'},
|
||||
{field: 'enable', width: 100, title: '是否显示', align: 'center', templet: function (res) {
|
||||
return `<input type="checkbox" name="enable" value="${res.enable}" data-id="${res.id}" lay-skin="switch" lay-text="显示|隐藏" lay-filter="enable_switch" ${res.enable == 1 ? 'checked' : ''}>`}
|
||||
},
|
||||
{field: 'create_time', width: 200, title: '创建时间', sort: true, align: 'center'},
|
||||
{field: 'update_time', width: 200, title: '修改时间', sort: true, align: 'center'},
|
||||
{title: '操作', width: 200, toolbar: '#currentTableBar', align: "center", fixed: 'right'}
|
||||
]],
|
||||
limits: [10, 15, 20, 25, 50, 100],
|
||||
limit: 15,
|
||||
page: true,
|
||||
skin: 'line',
|
||||
response: parse_table.response,
|
||||
parseData: parse_table.parseData
|
||||
});
|
||||
|
||||
// 监听搜索操作
|
||||
form.on('submit(data-search-btn)', function (data) {
|
||||
//执行搜索重载
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
// 监听重置操作
|
||||
form.on('submit(data-refresh-btn)', function (data) {
|
||||
data.field.content = '';
|
||||
data.field.uid = '';
|
||||
form.val('data-search', data.field)
|
||||
//执行搜索重载
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* toolbar监听事件
|
||||
*/
|
||||
table.on('toolbar(currentTableFilter)', function (obj) {
|
||||
if (obj.event === 'delete') { // 监听删除操作
|
||||
var checkStatus = table.checkStatus('currentTableId')
|
||||
, data = checkStatus.data;
|
||||
|
||||
layer.confirm('你确实要删除选中的记录吗?', function (index) {
|
||||
layer.load(1)
|
||||
let tasks = []
|
||||
for (const k in data) {
|
||||
tasks.push(
|
||||
httpGet('/admin/comment/delete?id=' + data[k].id).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('删除成功')
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
}
|
||||
}))
|
||||
}
|
||||
layer.close(index);
|
||||
Promise.all(tasks).finally(() => layer.closeAll('loading'))
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//监听表格复选框选择
|
||||
table.on('checkbox(currentTableFilter)', function (obj) {
|
||||
console.log(obj)
|
||||
});
|
||||
|
||||
table.on('tool(currentTableFilter)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'edit') {
|
||||
|
||||
var index = layer.open({
|
||||
title: '编辑留言信息',
|
||||
type: 2,
|
||||
shade: 0.2,
|
||||
maxmin: true,
|
||||
shadeClose: true,
|
||||
area: ['100%', '100%'],
|
||||
content: '../page/comment/edit.html?id=' + data.id,
|
||||
end: function (index, layero) {
|
||||
table.reload('currentTableId')
|
||||
return false;
|
||||
}
|
||||
});
|
||||
$(window).on("resize", function () {
|
||||
layer.full(index);
|
||||
});
|
||||
return false;
|
||||
} else if (obj.event === 'delete') {
|
||||
layer.confirm('你确实要删除此记录吗?', function (index) {
|
||||
layer.load(1)
|
||||
httpGet('/admin/comment/delete?id=' + data.id).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
obj.del();
|
||||
}
|
||||
}).finally(() => layer.closeAll('loading'))
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//监听显示隐藏操作
|
||||
form.on('switch(enable_switch)', function (obj) {
|
||||
layer.load(1)
|
||||
httpPost('/admin/comment/enable', {
|
||||
id: $(obj.elem).data('id'),
|
||||
enable: obj.elem.checked ? 1 : 0
|
||||
}).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
});
|
||||
|
||||
//触发单元格编辑
|
||||
table.on('edit(currentTableFilter)', function (obj) {
|
||||
layer.load(1)
|
||||
httpPost('/admin/comment/edit', obj.data).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
}
|
||||
}).finally(() => {
|
||||
table.reload('currentTableFilter')
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,99 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>编辑留言</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../../css/public.css" media="all">
|
||||
<style>
|
||||
body {
|
||||
background-color: #ffffff;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form layuimini-form" lay-filter="comment-info">
|
||||
<div class="layui-form-item" style="display: none">
|
||||
<label class="layui-form-label">id:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="id" placeholder="请填写入插件id" class="layui-input"
|
||||
required disabled/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">电子邮箱:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="email" placeholder="电子邮箱"
|
||||
class="layui-input" readonly/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">操作IP:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="ip" placeholder="操作IP"
|
||||
class="layui-input" readonly/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">留言内容:</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="content" placeholder="留言内容" class="layui-textarea" lay-verify="required"
|
||||
lay-reqtext="留言内容不能为空"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">回复内容:</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="reply" placeholder="回复内容" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否显示:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" value="1" name="enable" lay-skin="switch" lay-filter="switchTest" lay-text="ON|OFF">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="saveBtn">确认保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../../js/api.js?v=1.0.0" charset="utf-8"></script>
|
||||
<script src="../../js/common.js?v=1.0.0" charset="utf-8"></script>
|
||||
<script>
|
||||
const init = () => {
|
||||
//layer.load(1)
|
||||
httpGet('/admin/comment/get?id=' + getQueryString('id')).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
layui.form.val('comment-info', res.data)
|
||||
}
|
||||
}).finally(layer.closeAll('loading'))
|
||||
}
|
||||
layui.use(['form'], function () {
|
||||
var form = layui.form,
|
||||
layer = layui.layer;
|
||||
init()
|
||||
//监听提交
|
||||
form.on('submit(saveBtn)', function (data) {
|
||||
layer.load(1)
|
||||
data.field.enable = data.field.enable ? 1 : 0;
|
||||
httpPost('/admin/comment/edit', data.field).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
init()
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,225 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>主页</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../lib/font-awesome-4.7.0/css/font-awesome.min.css" media="all">
|
||||
<link rel="stylesheet" href="../css/public.css" media="all">
|
||||
<style>
|
||||
.top-panel {
|
||||
border: 1px solid #eceff9;
|
||||
border-radius: 5px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.top-panel > .layui-card-body {
|
||||
height: 60px;
|
||||
}
|
||||
|
||||
.top-panel-number {
|
||||
line-height: 60px;
|
||||
font-size: 30px;
|
||||
border-right: 1px solid #eceff9;
|
||||
}
|
||||
|
||||
.top-panel-tips {
|
||||
line-height: 30px;
|
||||
font-size: 12px
|
||||
}
|
||||
|
||||
.layuimini-notice:hover {
|
||||
background: #f6f6f6;
|
||||
}
|
||||
|
||||
.layuimini-notice {
|
||||
padding: 7px 16px;
|
||||
clear: both;
|
||||
font-size: 12px !important;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
transition: background 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
.layuimini-notice-title, .layuimini-notice-label {
|
||||
padding-right: 70px !important;
|
||||
text-overflow: ellipsis !important;
|
||||
overflow: hidden !important;
|
||||
white-space: nowrap !important;
|
||||
}
|
||||
|
||||
.layuimini-notice-title {
|
||||
line-height: 28px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.layuimini-notice-extra {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
margin-top: -8px;
|
||||
right: 16px;
|
||||
display: inline-block;
|
||||
height: 16px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="layuimini-main">
|
||||
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-xs12 layui-col-md3">
|
||||
|
||||
<div class="layui-card top-panel">
|
||||
<div class="layui-card-header"><i class="layui-icon layui-icon-app"></i> 工具总数</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space5 statistics_count">
|
||||
<div class="top-panel-number" id="count1">
|
||||
0
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="layui-col-xs12 layui-col-md3">
|
||||
|
||||
<div class="layui-card top-panel">
|
||||
<div class="layui-card-header"><i class="layui-icon layui-icon-dialogue"></i> 留言总数</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space5 statistics_count">
|
||||
<div class="top-panel-number" id="count2">
|
||||
0
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="layui-col-xs12 layui-col-md3">
|
||||
|
||||
<div class="layui-card top-panel">
|
||||
<div class="layui-card-header"><i class="layui-icon layui-icon-user"></i> 用户总数</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space5 statistics_count">
|
||||
<div class="top-panel-number" id="count3">
|
||||
0
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="layui-col-xs12 layui-col-md3">
|
||||
|
||||
<div class="layui-card top-panel">
|
||||
<div class="layui-card-header"><i class="layui-icon layui-icon-friends"></i> 今日新增用户</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space5 statistics_count">
|
||||
<div class="top-panel-number" id="count4">
|
||||
0
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-xs12 layui-col-sm8">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header"><i class="layui-icon layui-icon-about"></i> 服务器信息</div>
|
||||
<div class="layui-card-body layui-text" id="system_info">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-xs12 layui-col-sm4">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header"><i class="layui-icon layui-icon-about"></i> 版本信息</div>
|
||||
<div class="layui-card-body layui-text" id="version_info">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<script type="text/html" id="system_info_tpl">
|
||||
<table class="layui-table">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>框架版本</td>
|
||||
<td>{{d.framework_version}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>PHP版本</td>
|
||||
<td>{{d.php_version}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>MySQL版本</td>
|
||||
<td>{{d.mysql_version}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>WEB软件</td>
|
||||
<td>{{d.software}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>操作系统</td>
|
||||
<td>{{d.os}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>服务器时间</td>
|
||||
<td>{{d.date}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</script>
|
||||
|
||||
<!--</div>-->
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
|
||||
<script src="../js/common.js" charset="utf-8"></script>
|
||||
<script src="../js/api.js" charset="utf-8"></script>
|
||||
<script>
|
||||
layui.use(['layer'], function () {
|
||||
var $ = layui.jquery,
|
||||
layer = layui.layer,
|
||||
laytpl = layui.laytpl;
|
||||
|
||||
|
||||
httpGet('/admin/system/analysis').then(res => {
|
||||
$("#count1").text(res.data.count1);
|
||||
$("#count2").text(res.data.count2);
|
||||
$("#count3").text(res.data.count3);
|
||||
$("#count4").text(res.data.count4);
|
||||
})
|
||||
|
||||
httpGet('/admin/system/info').then(res => {
|
||||
const view = document.getElementById('system_info');
|
||||
const getTpl = document.getElementById('system_info_tpl').innerHTML
|
||||
laytpl(getTpl).render(res.data, function (html) {
|
||||
view.innerHTML = html;
|
||||
});
|
||||
$.ajax({
|
||||
url: res.data.checkupdate,
|
||||
type: 'get',
|
||||
dataType: 'jsonp',
|
||||
jsonpCallback: 'callback'
|
||||
}).done(function(data){
|
||||
$("#version_info").html(data.msg);
|
||||
})
|
||||
})
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,243 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>友链管理</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../css/public.css" media="all">
|
||||
<script src="../js/common.js" charset="utf-8"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="layuimini-container">
|
||||
<div class="layuimini-main">
|
||||
|
||||
<fieldset class="table-search-fieldset">
|
||||
<legend>搜索信息</legend>
|
||||
<div style="margin: 10px 10px 10px 10px">
|
||||
<form class="layui-form layui-form-pane" action="" lay-filter="data-search">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">搜索友链</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="keyword" autocomplete="off" placeholder="链接名称或地址" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit
|
||||
lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索
|
||||
</button>
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit
|
||||
lay-filter="data-refresh-btn"><i class="layui-icon layui-icon-refresh"></i> 重 置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add"> 添加</button>
|
||||
<button class="layui-btn layui-btn-sm layui-btn-danger data-delete-btn" lay-event="delete"> 删除</button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
|
||||
|
||||
<script type="text/html" id="currentTableBar">
|
||||
<a class="layui-btn layui-btn-xs layui-btn-warm data-count-jump" lay-event="jump">访问</a>
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
|
||||
</script>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../js/api.js" charset="utf-8"></script>
|
||||
<script>
|
||||
layui.use(['form', 'table'], function () {
|
||||
var $ = layui.jquery,
|
||||
form = layui.form,
|
||||
table = layui.table;
|
||||
|
||||
table.render({
|
||||
elem: '#currentTableId',
|
||||
url: '/admin/link/list',
|
||||
toolbar: '#toolbarDemo',
|
||||
defaultToolbar: ['filter', 'exports', 'print', {
|
||||
title: '提示',
|
||||
layEvent: 'LAYTABLE_TIPS',
|
||||
icon: 'layui-icon-tips'
|
||||
}],
|
||||
cols: [[
|
||||
{type: 'checkbox', fixed: 'left'}
|
||||
, {field: 'id', width: 80, title: 'ID', sort: true, fixed: 'left'},
|
||||
{field: 'name', width: 160, title: '名称', edit: 'text'},
|
||||
{field: 'url', width: 250, title: '地址', edit: 'text'},
|
||||
{field: 'weight', width: 80, title: '权重', sort: true, align: 'center', edit: 'text'},
|
||||
{field: 'enable', width: 100, title: '是否显示', align: 'center', templet: function (res) {
|
||||
return `<input type="checkbox" name="enable" value="${res.enable}" data-id="${res.id}" lay-skin="switch" lay-text="显示|隐藏" lay-filter="enable_switch" ${res.enable == 1 ? 'checked' : ''}>`}
|
||||
},
|
||||
{field: 'create_time', width: 200, title: '创建时间', sort: true, align: 'center'},
|
||||
{field: 'update_time', width: 200, title: '修改时间', sort: true, align: 'center'},
|
||||
{title: '操作', width: 220, toolbar: '#currentTableBar', align: "center", fixed: 'right'}
|
||||
]],
|
||||
limits: [10, 15, 20, 25, 50, 100],
|
||||
limit: 15,
|
||||
page: true,
|
||||
skin: 'line',
|
||||
response: parse_table.response,
|
||||
parseData: parse_table.parseData
|
||||
});
|
||||
|
||||
// 监听搜索操作
|
||||
form.on('submit(data-search-btn)', function (data) {
|
||||
//执行搜索重载
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
// 监听重置操作
|
||||
form.on('submit(data-refresh-btn)', function (data) {
|
||||
data.field.keyword = '';
|
||||
form.val('data-search', data.field)
|
||||
//执行搜索重载
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* toolbar监听事件
|
||||
*/
|
||||
table.on('toolbar(currentTableFilter)', function (obj) {
|
||||
if (obj.event === 'add') { // 监听添加操作
|
||||
var index = layer.open({
|
||||
title: '添加友链',
|
||||
type: 2,
|
||||
shade: 0.2,
|
||||
maxmin: true,
|
||||
shadeClose: true,
|
||||
area: ['100%', '100%'],
|
||||
content: '../page/link/add.html',
|
||||
end: function (index, layero) {
|
||||
table.reload('currentTableId')
|
||||
return false;
|
||||
}
|
||||
});
|
||||
$(window).on("resize", function () {
|
||||
layer.full(index);
|
||||
});
|
||||
} else if (obj.event === 'delete') { // 监听删除操作
|
||||
var checkStatus = table.checkStatus('currentTableId')
|
||||
, data = checkStatus.data;
|
||||
|
||||
layer.confirm('你确实要删除选中的友链吗?', function (index) {
|
||||
layer.load(1)
|
||||
let tasks = []
|
||||
for (const k in data) {
|
||||
tasks.push(
|
||||
httpGet('/admin/link/delete?id=' + data[k].id).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('删除成功')
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
}
|
||||
}))
|
||||
}
|
||||
layer.close(index);
|
||||
Promise.all(tasks).finally(() => layer.closeAll('loading'))
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//监听表格复选框选择
|
||||
table.on('checkbox(currentTableFilter)', function (obj) {
|
||||
console.log(obj)
|
||||
});
|
||||
|
||||
table.on('tool(currentTableFilter)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'edit') {
|
||||
|
||||
var index = layer.open({
|
||||
title: '编辑友链信息',
|
||||
type: 2,
|
||||
shade: 0.2,
|
||||
maxmin: true,
|
||||
shadeClose: true,
|
||||
area: ['100%', '100%'],
|
||||
content: '../page/link/edit.html?id=' + data.id,
|
||||
end: function (index, layero) {
|
||||
table.reload('currentTableId')
|
||||
return false;
|
||||
}
|
||||
});
|
||||
$(window).on("resize", function () {
|
||||
layer.full(index);
|
||||
});
|
||||
return false;
|
||||
} else if (obj.event === 'delete') {
|
||||
layer.confirm('你确实要删除此友链吗?', function (index) {
|
||||
layer.load(1)
|
||||
httpGet('/admin/link/delete?id=' + data.id).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
obj.del();
|
||||
}
|
||||
}).finally(() => layer.closeAll('loading'))
|
||||
layer.close(index);
|
||||
});
|
||||
} else if (obj.event === 'jump') {
|
||||
window.open(data.url);
|
||||
}
|
||||
});
|
||||
|
||||
//监听显示隐藏操作
|
||||
form.on('switch(enable_switch)', function (obj) {
|
||||
layer.load(1)
|
||||
httpPost('/admin/link/enable', {
|
||||
id: $(obj.elem).data('id'),
|
||||
enable: obj.elem.checked ? 1 : 0
|
||||
}).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
});
|
||||
|
||||
//触发单元格编辑
|
||||
table.on('edit(currentTableFilter)', function (obj) {
|
||||
layer.load(1)
|
||||
httpPost('/admin/link/edit', obj.data).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
}
|
||||
}).finally(() => {
|
||||
table.reload('currentTableFilter')
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,82 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>添加友链</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../../css/public.css" media="all">
|
||||
<style>
|
||||
body {
|
||||
background-color: #ffffff;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form layuimini-form" lay-filter="plugin-info">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">名称:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="name" placeholder="友链名称"
|
||||
lay-verify="required" lay-reqtext="名称不得为空"
|
||||
class="layui-input"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">地址:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="url" placeholder="友链地址" value=""
|
||||
lay-verify="required" lay-reqtext="地址不能为空"
|
||||
class="layui-input" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">权重:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="weight" placeholder="请填写权重" value=""
|
||||
lay-verify="required" lay-reqtext="权重不能为空"
|
||||
class="layui-input" required>
|
||||
<tip>填数字,数字越大排名越前。</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否显示:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" value="1" name="enable" lay-skin="switch" lay-filter="switchTest" lay-text="ON|OFF" checked>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="saveBtn">确认添加</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../../js/api.js?v=1.0.0" charset="utf-8"></script>
|
||||
<script src="../../js/common.js?v=1.0.0" charset="utf-8"></script>
|
||||
<script>
|
||||
layui.use(['form'], function () {
|
||||
var form = layui.form,
|
||||
layer = layui.layer;
|
||||
//监听提交
|
||||
form.on('submit(saveBtn)', function (data) {
|
||||
layer.load(1)
|
||||
data.field.enable = data.field.enable ? 1 : 0;
|
||||
httpPost('/admin/link/add', data.field).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('添加成功');
|
||||
const index = parent.layer.getFrameIndex(window.name);
|
||||
parent.layer.close(index);
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,97 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>编辑友链</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../../css/public.css" media="all">
|
||||
<style>
|
||||
body {
|
||||
background-color: #ffffff;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form layuimini-form" lay-filter="category-info">
|
||||
<div class="layui-form-item" style="display: none">
|
||||
<label class="layui-form-label">id:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="id" placeholder="请填写入插件id" class="layui-input"
|
||||
required disabled/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">名称:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="name" placeholder="友链名称"
|
||||
lay-verify="required" lay-reqtext="名称不得为空"
|
||||
class="layui-input"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">地址:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="url" placeholder="友链地址" value=""
|
||||
lay-verify="required" lay-reqtext="地址不能为空"
|
||||
class="layui-input" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">权重:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="weight" placeholder="请填写权重" value=""
|
||||
lay-verify="required" lay-reqtext="权重不能为空"
|
||||
class="layui-input" required>
|
||||
<tip>填数字,数字越大排名越前。</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否显示:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" value="1" name="enable" lay-skin="switch" lay-filter="switchTest" lay-text="ON|OFF" checked>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="saveBtn">确认保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../../js/api.js?v=1.0.0" charset="utf-8"></script>
|
||||
<script src="../../js/common.js?v=1.0.0" charset="utf-8"></script>
|
||||
<script>
|
||||
const init = () => {
|
||||
//layer.load(1)
|
||||
httpGet('/admin/link/get?id=' + getQueryString('id')).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
layui.form.val('category-info', res.data)
|
||||
}
|
||||
}).finally(layer.closeAll('loading'))
|
||||
}
|
||||
layui.use(['form'], function () {
|
||||
var form = layui.form,
|
||||
layer = layui.layer;
|
||||
init()
|
||||
//监听提交
|
||||
form.on('submit(saveBtn)', function (data) {
|
||||
layer.load(1)
|
||||
data.field.enable = data.field.enable ? 1 : 0;
|
||||
httpPost('/admin/link/edit', data.field).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
init()
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,331 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>插件管理</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../css/public.css" media="all">
|
||||
<script src="../js/common.js" charset="utf-8"></script>
|
||||
<style>
|
||||
/*修复table中select显示不完整*/
|
||||
.layui-table-cell>.layui-form-select>.layui-select-title>.layui-input {
|
||||
height: 30px;
|
||||
}
|
||||
.layui-table-cell>.layui-form-select dl dd {
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
[data-field='category'] .layui-table-cell {
|
||||
overflow: visible !important;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="layuimini-container">
|
||||
<div class="layuimini-main">
|
||||
|
||||
<fieldset class="table-search-fieldset">
|
||||
<legend>搜索信息</legend>
|
||||
<div style="margin: 10px 10px 10px 10px">
|
||||
<form class="layui-form layui-form-pane" action="" lay-filter="data-search">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">插件标题</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="title" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">别名路由</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="alias" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">插件分类</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="category_id" id="categories" class="layui-input">
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit
|
||||
lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索
|
||||
</button>
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit
|
||||
lay-filter="data-refresh-btn"><i class="layui-icon layui-icon-refresh"></i> 重 置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<script id="categoies_tpl" type="text/html">
|
||||
<select name="category_id">
|
||||
<option value="0">全部</option>
|
||||
{{# layui.each(d, function(index, item){ }}
|
||||
<option value="{{ item.id }}">{{ item.title }}</option>
|
||||
{{# }); }}
|
||||
</select>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add"> 添加</button>
|
||||
<button class="layui-btn layui-btn-sm layui-btn-danger data-delete-btn" lay-event="delete"> 删除</button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
|
||||
|
||||
<script type="text/html" id="currentTableBar">
|
||||
<a class="layui-btn layui-btn-warn layui-btn-xs data-count-open" lay-event="open"><i class="layui-icon layui-icon-play"></i></a>
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
|
||||
</script>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../js/api.js" charset="utf-8"></script>
|
||||
<script>
|
||||
|
||||
|
||||
layui.use(['form', 'table'], function () {
|
||||
var $ = layui.jquery,
|
||||
form = layui.form,
|
||||
laytpl = layui.laytpl,
|
||||
table = layui.table;
|
||||
|
||||
httpGet('/admin/category/list').then(res => {
|
||||
var getTpl = document.getElementById('categoies_tpl').innerHTML,
|
||||
view = document.getElementById('categories');
|
||||
laytpl(getTpl).render(res.data.items, function (html) {
|
||||
view.innerHTML = html;
|
||||
form.render();
|
||||
});
|
||||
})
|
||||
|
||||
table.render({
|
||||
elem: '#currentTableId',
|
||||
url: '/admin/plugin/list',
|
||||
toolbar: '#toolbarDemo',
|
||||
defaultToolbar: ['filter', 'exports', 'print', {
|
||||
title: '提示',
|
||||
layEvent: 'LAYTABLE_TIPS',
|
||||
icon: 'layui-icon-tips'
|
||||
}],
|
||||
cols: [[
|
||||
{type: 'checkbox', fixed: 'left'}
|
||||
, {field: 'id', width: 80, title: 'ID', sort: true, fixed: 'left'},
|
||||
{field: 'title', width: 150, title: '插件标题', sort: true, align: 'center', edit: 'text'},
|
||||
{field: 'alias', width: 150, title: '别名路由', sort: true, align: 'center', edit: 'text'},
|
||||
{field: 'class', width: 150, title: '插件类名', sort: true, align: 'center', edit: 'text'},
|
||||
{
|
||||
field: 'enable', width: 120, title: '是否启用', align: 'center', templet: function (res) {
|
||||
return `<input type="checkbox" name="enable" value="${res.enable}" data-id="${res.id}" lay-skin="switch" lay-text="启用|禁用" lay-filter="enable_switch" ${res.enable == 1 ? 'checked' : ''}>`
|
||||
}
|
||||
},
|
||||
{field: 'weight', width: 80, title: '权重', sort: true, align: 'center', edit: 'text'},
|
||||
{
|
||||
field: 'category', width: 150, title: '分类', align: 'center', templet: function (res) {
|
||||
return `<select name="category" data-id="${res.id}" data-value="${res.category_id}" lay-filter="category_select"></select>`
|
||||
}
|
||||
},
|
||||
{field: 'level', width: 80, title: '等级', sort: true, align: 'center', edit: 'text'},
|
||||
{field: 'request_count', width: 100, title: '请求次数', sort: true, align: 'center'},
|
||||
{field: 'create_time', width: 200, title: '安装时间', sort: true, align: 'center'},
|
||||
{field: 'update_time', width: 200, title: '修改时间', sort: true, align: 'center'},
|
||||
{title: '操作', minWidth: 170, toolbar: '#currentTableBar', align: "center", fixed: 'right'}
|
||||
]],
|
||||
limits: [10, 15, 20, 25, 50, 100],
|
||||
limit: 15,
|
||||
page: true,
|
||||
skin: 'line',
|
||||
response: parse_table.response,
|
||||
parseData: parse_table.parseData,
|
||||
done: function (res, curr, count) {
|
||||
httpGet('/admin/category/list').then(res => {
|
||||
let categories = res.data.items
|
||||
let html = '<option value="0">默认组</option>'
|
||||
for (const category of categories) {
|
||||
html += `<option value="${category.id}">${category.title}</option>`
|
||||
}
|
||||
let doms = $('select[name="category"]');
|
||||
doms.html(html)
|
||||
for (dom of doms) {
|
||||
$(dom).val($(dom).data('value'));
|
||||
}
|
||||
form.render('select');
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
// 监听搜索操作
|
||||
form.on('submit(data-search-btn)', function (data) {
|
||||
//执行搜索重载
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
// 监听重置操作
|
||||
form.on('submit(data-refresh-btn)', function (data) {
|
||||
data.field.title = '';
|
||||
data.field.alias = '';
|
||||
data.field.category_id = 0;
|
||||
form.val('data-search', data.field)
|
||||
//执行搜索重载
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* toolbar监听事件
|
||||
*/
|
||||
table.on('toolbar(currentTableFilter)', function (obj) {
|
||||
if (obj.event === 'add') { // 监听添加操作
|
||||
var index = layer.open({
|
||||
title: '添加插件信息',
|
||||
type: 2,
|
||||
shade: 0.2,
|
||||
maxmin: true,
|
||||
shadeClose: true,
|
||||
area: ['100%', '100%'],
|
||||
content: '../page/plugin/add.html',
|
||||
end: function (index, layero) {
|
||||
table.reload('currentTableId')
|
||||
return false;
|
||||
}
|
||||
});
|
||||
$(window).on("resize", function () {
|
||||
layer.full(index);
|
||||
});
|
||||
} else if (obj.event === 'delete') { // 监听删除操作
|
||||
var checkStatus = table.checkStatus('currentTableId')
|
||||
, data = checkStatus.data;
|
||||
|
||||
layer.confirm('你确实要删除选中的插件吗?', function (index) {
|
||||
layer.load(1)
|
||||
let tasks = []
|
||||
for (const k in data) {
|
||||
tasks.push(
|
||||
httpGet('/admin/plugin/delete?id=' + data[k].id).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
table.reload('currentTableId')
|
||||
}
|
||||
}))
|
||||
}
|
||||
layer.close(index);
|
||||
Promise.all(tasks).finally(() => layer.closeAll('loading'))
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//监听表格复选框选择
|
||||
table.on('checkbox(currentTableFilter)', function (obj) {
|
||||
console.log(obj)
|
||||
});
|
||||
|
||||
table.on('tool(currentTableFilter)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'edit') {
|
||||
|
||||
var index = layer.open({
|
||||
title: '编辑插件',
|
||||
type: 2,
|
||||
shade: 0.2,
|
||||
maxmin: true,
|
||||
shadeClose: true,
|
||||
area: ['100%', '100%'],
|
||||
content: '../page/plugin/edit.html?id=' + data.id,
|
||||
end: function (index, layero) {
|
||||
table.reload('currentTableId')
|
||||
return false;
|
||||
}
|
||||
});
|
||||
$(window).on("resize", function () {
|
||||
layer.full(index);
|
||||
});
|
||||
return false;
|
||||
} else if (obj.event === 'delete') {
|
||||
layer.confirm('你确实要删除此插件吗?', function (index) {
|
||||
layer.load(1)
|
||||
httpGet('/admin/plugin/delete?id=' + data.id).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
obj.del();
|
||||
}
|
||||
}).finally(() => layer.closeAll('loading'))
|
||||
layer.close(index);
|
||||
});
|
||||
} else if (obj.event === 'open') {
|
||||
if(data.alias.substring(0,1) == '/' || data.alias.substring(0,7) == 'http://' || data.alias.substring(0,8) == 'https://'){
|
||||
window.open(data.alias);
|
||||
}else{
|
||||
window.open('/'+data.alias);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//监听插件启用禁用操作
|
||||
form.on('switch(enable_switch)', function (obj) {
|
||||
layer.load(1)
|
||||
httpPost('/admin/plugin/enable', {
|
||||
id: $(obj.elem).data('id'),
|
||||
enable: obj.elem.checked ? 1 : 0
|
||||
}).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
});
|
||||
|
||||
//触发单元格编辑
|
||||
table.on('edit(currentTableFilter)', function (obj) {
|
||||
layer.load(1)
|
||||
httpPost('/admin/plugin/edit', obj.data).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
}
|
||||
}).finally(() => {
|
||||
table.reload('currentTableFilter')
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
});
|
||||
form.on('select(category_select)', function (data) {
|
||||
layer.load(1)
|
||||
httpPost('/admin/plugin/enable', {
|
||||
id: $(data.elem).data('id'),
|
||||
category_id: data.value,
|
||||
}).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
}
|
||||
}).finally(() => {
|
||||
table.reload('currentTableFilter')
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,164 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>添加插件</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../../css/public.css" media="all">
|
||||
<style>
|
||||
body {
|
||||
background-color: #ffffff;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form layuimini-form" lay-filter="plugin-info">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">插件分类:</label>
|
||||
<div class="layui-input-block">
|
||||
<select lay-verify="required" name="category_id" id="categories" lay-verify="required" lay-reqtext="请选择分类">
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">插件标题:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" placeholder="填写插件的标题" lay-verify="required" lay-reqtext="插件标题不能为空"
|
||||
class="layui-input"
|
||||
required/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">路由别名:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="alias" placeholder="请输入路由别名" value=""
|
||||
lay-verify="required" lay-reqtext="路由别名不能为空"
|
||||
class="layui-input" required>
|
||||
<tip>也就是浏览器地址栏,域名后面的那一串</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">插件类名:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="class" placeholder="请填写插件类名" value=""
|
||||
lay-verify="required" lay-reqtext="插件类名不能为空"
|
||||
class="layui-input" required>
|
||||
<tip>插件的类名,包名+插件名,例如:utility\example。</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">插件关键词:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="keyword" placeholder="插件关键词可留空" value=""
|
||||
class="layui-input">
|
||||
<tip>用于搜索的关键词,多个用英文逗号,隔开</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">插件权重:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="weight" placeholder="请填写插件权重" value="0"
|
||||
lay-verify="required" lay-reqtext="插件权重不能为空"
|
||||
class="layui-input" required>
|
||||
<tip>填数字,数字越大排名越前。</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" style="display: none">
|
||||
<label class="layui-form-label">是否启用:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" value="1" name="enable" lay-skin="switch" lay-filter="switchTest" lay-text="ON|OFF" checked>
|
||||
<tip>禁用则不会在前台显示。</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否强制登录:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" value="1" name="login" lay-skin="switch" lay-filter="switchTest" lay-text="ON|OFF">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">用户等级限制:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="level" placeholder="填写用户等级数字" value="0"
|
||||
lay-verify="required" lay-reqtext="用户等级限制不能为空"
|
||||
class="layui-input" required>
|
||||
<tip>用户等级小于该数字的不会显示该工具</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" style="display: none">
|
||||
<label class="layui-form-label">插件描述:</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="desc" placeholder="插件描述" class="layui-textarea"></textarea>
|
||||
<tip>插件描述信息,介绍一下这个插件是干什么的吧!</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="saveBtn">确认保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script id="categoies_tpl" type="text/html">
|
||||
<select lay-verify="required" name="category_id">
|
||||
<option value="0">默认组</option>
|
||||
{{# layui.each(d, function(index, item){ }}
|
||||
<option value="{{ item.id }}">{{ item.title }}</option>
|
||||
{{# }); }}
|
||||
</select>
|
||||
</script>
|
||||
<script id="templates_tpl" type="text/html">
|
||||
<select lay-verify="required" name="category_id">
|
||||
<option value="default">default</option>
|
||||
{{# layui.each(d, function(index, item){ }}
|
||||
<option value="{{ item }}">{{ item }}</option>
|
||||
{{# }); }}
|
||||
</select>
|
||||
</script>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../../js/api.js?v=1.0.0" charset="utf-8"></script>
|
||||
<script src="../../js/common.js?v=1.0.0" charset="utf-8"></script>
|
||||
<script>
|
||||
|
||||
layui.use(['form'], function () {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
laytpl = layui.laytpl,
|
||||
$ = layui.$;
|
||||
|
||||
//layer.load(1)
|
||||
let tasks = []
|
||||
tasks.push(httpGet('/admin/category/list').then(res => {
|
||||
var getTpl = document.getElementById('categoies_tpl').innerHTML,
|
||||
view = document.getElementById('categories');
|
||||
laytpl(getTpl).render(res.data.items, function (html) {
|
||||
view.innerHTML = html;
|
||||
form.render();
|
||||
});
|
||||
}))
|
||||
Promise.all(tasks).finally(() => {
|
||||
//layer.closeAll('loading')
|
||||
})
|
||||
//监听提交
|
||||
form.on('submit(saveBtn)', function (data) {
|
||||
layer.load(1)
|
||||
data.field.enable = data.field.enable ? 1 : 0;
|
||||
data.field.login = data.field.login ? 1 : 0;
|
||||
httpPost('/admin/plugin/add', data.field).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('添加成功', {icon: 1});
|
||||
const index = parent.layer.getFrameIndex(window.name);
|
||||
parent.layer.close(index);
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,173 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>编辑插件</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../../css/public.css" media="all">
|
||||
<style>
|
||||
body {
|
||||
background-color: #ffffff;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<form class="layui-form layuimini-form" lay-filter="plugin-info">
|
||||
<div class="layui-form-item" style="display: none">
|
||||
<label class="layui-form-label">id:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="id" placeholder="请填写入插件id" class="layui-input"
|
||||
required disabled/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">插件分类:</label>
|
||||
<div class="layui-input-block">
|
||||
<select lay-verify="required" name="category_id" id="categories" lay-verify="required" lay-reqtext="请选择分类">
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">插件标题:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" placeholder="填写插件的标题" lay-verify="required" lay-reqtext="插件标题不能为空"
|
||||
class="layui-input"
|
||||
required/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">路由别名:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="alias" placeholder="请输入路由别名" value=""
|
||||
lay-verify="required" lay-reqtext="路由别名不能为空"
|
||||
class="layui-input" required>
|
||||
<tip>也就是浏览器地址栏,域名后面的那一串</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">插件类名:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="class" placeholder="请填写插件类名" value=""
|
||||
lay-verify="required" lay-reqtext="插件类名不能为空"
|
||||
class="layui-input" required>
|
||||
<tip>插件的类名,包名+插件名,例如:utility\example。</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">插件关键词:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="keyword" placeholder="插件关键词可留空" value=""
|
||||
class="layui-input">
|
||||
<tip>用于搜索的关键词,多个用英文逗号,隔开</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">插件权重:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="weight" placeholder="请填写插件权重" value="0"
|
||||
lay-verify="required" lay-reqtext="插件权重不能为空"
|
||||
class="layui-input" required>
|
||||
<tip>填数字,数字越大排名越前。</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" style="display: none">
|
||||
<label class="layui-form-label">是否启用:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" value="1" name="enable" lay-skin="switch" lay-filter="switchTest" lay-text="ON|OFF">
|
||||
<tip>禁用则不会在前台显示。</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否强制登录:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" value="1" name="login" lay-skin="switch" lay-filter="switchTest" lay-text="ON|OFF">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">用户等级限制:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="level" placeholder="填写用户等级数字" value="0"
|
||||
lay-verify="required" lay-reqtext="用户等级限制不能为空"
|
||||
class="layui-input" required>
|
||||
<tip>用户等级小于该数字的不会显示该工具</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" style="display: none">
|
||||
<label class="layui-form-label">插件描述:</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="desc" placeholder="插件描述" class="layui-textarea"></textarea>
|
||||
<tip>插件描述信息,介绍一下这个插件是干什么的吧!</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="saveBtn">确认保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<script id="categoies_tpl" type="text/html">
|
||||
<select lay-verify="required" name="category_id">
|
||||
<option value="0">默认组</option>
|
||||
{{# layui.each(d, function(index, item){ }}
|
||||
<option value="{{ item.id }}">{{ item.title }}</option>
|
||||
{{# }); }}
|
||||
</select>
|
||||
</script>
|
||||
<script id="templates_tpl" type="text/html">
|
||||
<select lay-verify="required" name="category_id">
|
||||
<option value="default">default</option>
|
||||
{{# layui.each(d, function(index, item){ }}
|
||||
<option value="{{ item }}">{{ item }}</option>
|
||||
{{# }); }}
|
||||
</select>
|
||||
</script>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../../js/api.js?v=1.0.0" charset="utf-8"></script>
|
||||
<script src="../../js/common.js?v=1.0.0" charset="utf-8"></script>
|
||||
<script>
|
||||
|
||||
layui.use(['form'], function () {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
laytpl = layui.laytpl,
|
||||
$ = layui.$;
|
||||
//layer.load(1)
|
||||
let tasks = []
|
||||
tasks.push(
|
||||
httpGet('/admin/category/list').then(res => {
|
||||
var getTpl = document.getElementById('categoies_tpl').innerHTML,
|
||||
view = document.getElementById('categories');
|
||||
laytpl(getTpl).render(res.data.items, function (html) {
|
||||
view.innerHTML = html;
|
||||
form.render();
|
||||
});
|
||||
}))
|
||||
Promise.all(tasks).finally(() => {
|
||||
httpGet('/admin/plugin/get?id=' + getQueryString('id')).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
form.val('plugin-info', res.data);
|
||||
}
|
||||
})
|
||||
})
|
||||
//监听提交
|
||||
form.on('submit(saveBtn)', function (data) {
|
||||
layer.load(1)
|
||||
data.field.enable = data.field.enable ? 1 : 0;
|
||||
data.field.login = data.field.login ? 1 : 0;
|
||||
httpPost('/admin/plugin/edit', data.field).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,213 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>安装新插件</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../../css/public.css" media="all">
|
||||
<link rel="stylesheet" href="../../js/lay-module/step-lay/step.css" media="all">
|
||||
</head>
|
||||
<body>
|
||||
<div class="layuimini-container">
|
||||
<div class="layuimini-main">
|
||||
|
||||
<div class="layui-fluid">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body" style="padding-top: 40px;">
|
||||
<div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto;">
|
||||
<div carousel-item>
|
||||
<div>
|
||||
<form class="layui-form"
|
||||
style="margin: 0 auto;max-width: 460px;padding-top: 40px;text-align: center">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-upload-drag" id="plugin-upload" style="margin: auto">
|
||||
<i class="layui-icon layui-icon-upload"></i>
|
||||
<p>点击上传,或将文件拖拽到此处</p>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div>
|
||||
<form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;"
|
||||
lay-filter="plugin-info">
|
||||
<div class="layui-form-item" style="display: none">
|
||||
<label class="layui-form-label">id:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="id" placeholder="请填写入插件id" class="layui-input"
|
||||
required disabled/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">插件分类:</label>
|
||||
<div class="layui-input-block">
|
||||
<select lay-verify="required" name="category_id" id="categories">
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">插件标题:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" placeholder="填写插件的标题" lay-verify="required" lay-reqtext="插件标题不能为空" class="layui-input"
|
||||
required/>
|
||||
<tip>填写插件的标题。</tip>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">路由别名:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="alias" placeholder="请输入路由别名" value=""
|
||||
class="layui-input" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">插件类名:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="class" placeholder="请填写插件类名" value=""
|
||||
class="layui-input" required disabled>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">插件描述:</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="desc" placeholder="插件描述" value=""
|
||||
class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button type="button" class="layui-btn layui-btn-primary pre">上一步</button>
|
||||
<button class="layui-btn" lay-submit lay-filter="formStep2">
|
||||
 确认安装 
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div>
|
||||
<div style="text-align: center;margin-top: 90px;">
|
||||
<i class="layui-icon layui-circle"
|
||||
style="color: white;font-size:30px;font-weight:bold;background: #52C41A;padding: 20px;line-height: 80px;"></i>
|
||||
<div style="font-size: 24px;color: #333;font-weight: 500;margin-top: 30px;">
|
||||
安装成功
|
||||
</div>
|
||||
<div style="font-size: 14px;color: #666;margin-top: 20px;">哎呦,你很不错哦</div>
|
||||
</div>
|
||||
<div style="text-align: center;margin-top: 50px;">
|
||||
<button class="layui-btn next">再安装一个</button>
|
||||
<a id="viewPlugin" href="/" target="_blank"
|
||||
class="layui-btn layui-btn-primary">查看插件</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div style="color: #666;margin-top: 30px;margin-bottom: 40px;padding-left: 30px;">
|
||||
<h3>说明</h3><br>
|
||||
<h4>安装新插件</h4>
|
||||
<p>上传符合插件格式的zip压缩包</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<script id="categoies_tpl" type="text/html">
|
||||
<select lay-verify="required" name="category_id">
|
||||
<option value="0">默认组</option>
|
||||
{{# layui.each(d, function(index, item){ }}
|
||||
<option value="{{ item.id }}">{{ item.title }}</option>
|
||||
{{# }); }}
|
||||
</select>
|
||||
</script>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
|
||||
<script src="../../js/api.js" charset="utf-8"></script>
|
||||
<script src="../../js/common.js" charset="utf-8"></script>
|
||||
<script>
|
||||
layui.use(['form', 'step'], function () {
|
||||
var $ = layui.$,
|
||||
form = layui.form,
|
||||
step = layui.step,
|
||||
upload = layui.upload,
|
||||
layer = layui.layer,
|
||||
laytpl = layui.laytpl;
|
||||
|
||||
httpGet('/admin/category/list').then(res => {
|
||||
var getTpl = document.getElementById('categoies_tpl').innerHTML,
|
||||
view = document.getElementById('categories');
|
||||
laytpl(getTpl).render(res.data.items, function (html) {
|
||||
view.innerHTML = html;
|
||||
});
|
||||
})
|
||||
step.render({
|
||||
elem: '#stepForm',
|
||||
filter: 'stepForm',
|
||||
width: '100%', //设置容器宽度
|
||||
stepWidth: '750px',
|
||||
height: '700px',
|
||||
stepItems: [{
|
||||
title: '上传插件包'
|
||||
}, {
|
||||
title: '填写插件信息'
|
||||
}, {
|
||||
title: '完成'
|
||||
}]
|
||||
});
|
||||
//拖拽上传
|
||||
upload.render({
|
||||
elem: '#plugin-upload'
|
||||
, url: '/admin/plugin/upload'
|
||||
, accept: 'file'
|
||||
, acceptMime: 'application/zip'
|
||||
, before: function (obj) {
|
||||
layer.load(1);
|
||||
}
|
||||
, done: function (res) {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('上传成功');
|
||||
form.val("plugin-info", res.data);
|
||||
step.next('#stepForm');
|
||||
|
||||
} else {
|
||||
$message.error(res.message);
|
||||
}
|
||||
layer.closeAll('loading');
|
||||
}, error: function () {
|
||||
$message.error('上传失败');
|
||||
layer.closeAll('loading');
|
||||
}
|
||||
});
|
||||
form.on('submit(formStep)', function (data) {
|
||||
step.next('#stepForm');
|
||||
return false;
|
||||
});
|
||||
|
||||
form.on('submit(formStep2)', function (data) {
|
||||
layer.load(1);
|
||||
let pluginInfo = form.val("plugin-info");
|
||||
httpPost('/admin/plugin/edit', pluginInfo).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
step.next('#stepForm');
|
||||
$('#viewPlugin').attr('href', '/' + pluginInfo.alias)
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.pre').click(function () {
|
||||
step.pre('#stepForm');
|
||||
});
|
||||
|
||||
$('.next').click(function () {
|
||||
step.next('#stepForm');
|
||||
});
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,236 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>系统配置</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../css/public.css" media="all">
|
||||
<style>
|
||||
body {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="layui-form layuimini-form" lay-filter="system-info">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form">
|
||||
<blockquote class="layui-elem-quote">系统配置</blockquote>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">网站标题:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" placeholder="请输入网站标题" class="layui-input"
|
||||
lay-verify="required"
|
||||
lay-reqtext="网站标题不能为空">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">网站副标题:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="subtitle" placeholder="请输入网站副标题" class="layui-input"
|
||||
lay-verify="required"
|
||||
lay-reqtext="网站副标题不能为空">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">关键字:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="keywords" placeholder="请输入keywords" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">网站描述:</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="description" placeholder="请输入description" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">首页底部代码:</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="foot_code" placeholder="请输入首页底部代码,用于展示备案号等" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">全局顶部代码:</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="head_banner" placeholder="位于首页与工具页顶部,用于显示广告" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">全局底部代码:</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="foot_banner" placeholder="位于首页与工具页底部,用于显示广告或统计代码" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">用户IP地址获取方式</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="ip_type" id="ip_type">
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<blockquote class="layui-elem-quote">模板选择</blockquote>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">模板选择</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="template" lay-verify="required" id="template">
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<blockquote class="layui-elem-quote">登录配置</blockquote>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">接口地址:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="oauth_appurl" placeholder="请输入聚合登录接口地址" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">APPID:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="oauth_appid" placeholder="请输入APPID" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">APPKEY:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="oauth_appkey" placeholder="请输入APPKEY" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">QQ登录:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" value="1" name="oauth_openqq" lay-skin="switch" lay-filter="switchTest" lay-text="ON|OFF">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">微信登录:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" value="1" name="oauth_openwx" lay-skin="switch" lay-filter="switchTest" lay-text="ON|OFF">
|
||||
</div>
|
||||
</div>
|
||||
<blockquote class="layui-elem-quote">极验滑动验证码V4配置</blockquote>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">极验ID:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="captcha_id" placeholder="请输入极验ID" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">极验KEY:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="captcha_key" placeholder="请输入极验KEY" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<blockquote class="layui-elem-quote">CDN地址配置
|
||||
</blockquote>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">CDNJS源:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="cdn_cdnjs" placeholder="请输入CDNJS源" class="layui-input"
|
||||
lay-verify="required"
|
||||
lay-reqtext="CDNJS源不能为空">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">NPM CDN源:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="cdn_npm" placeholder="请输入NPM CDN源" class="layui-input"
|
||||
lay-verify="required"
|
||||
lay-reqtext="NPM CDN源不能为空">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn " lay-submit lay-filter="saveBtn">确认保存</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="template_tpl">
|
||||
{{#for(const item of d){}}
|
||||
<option value="{{item}}">{{item}}</option>
|
||||
{{# }}}
|
||||
</script>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../js/common.js" charset="utf-8"></script>
|
||||
<script src="../js/api.js" charset="utf-8"></script>
|
||||
<script>
|
||||
|
||||
const init = () => {
|
||||
//layer.load(1)
|
||||
let tasks = []
|
||||
tasks.push(
|
||||
httpGet('/admin/system/templates').then(res => {
|
||||
const getTpl = document.getElementById('template_tpl').innerHTML,
|
||||
view = document.getElementById('template');
|
||||
layui.laytpl(getTpl).render(res.data, function (html) {
|
||||
console.log(html)
|
||||
view.innerHTML = html;
|
||||
layui.form.render();
|
||||
});
|
||||
})
|
||||
)
|
||||
tasks.push(
|
||||
httpGet('/admin/system/iptype').then(res => {
|
||||
$("select[name='ip_type']").empty();
|
||||
$.each(res.data, function(k, item){
|
||||
$("select[name='ip_type']").append('<option value="'+k+'">'+ item.name +' - '+ item.ip +' '+ item.city +'</option>');
|
||||
})
|
||||
})
|
||||
)
|
||||
Promise.all(tasks).finally(() => {
|
||||
httpGet('/admin/system/all').then(res => {
|
||||
if (res.status === 'ok') {
|
||||
let arr = {};
|
||||
const data = res.data;
|
||||
for (const k in data) {
|
||||
arr[data[k]['key']] = data[k]['value']
|
||||
}
|
||||
arr.oauth_openqq = arr.oauth_openqq == '1';
|
||||
arr.oauth_openwx = arr.oauth_openwx == '1';
|
||||
layui.form.val('system-info', arr);
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
layui.use(['form'], function () {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
laytpl = layui.laytpl,
|
||||
$ = layui.$;
|
||||
init();
|
||||
|
||||
//监听提交
|
||||
form.on('submit(saveBtn)', function (data) {
|
||||
layer.load(1)
|
||||
data.field.oauth_openqq = data.field.oauth_openqq ? 1 : 0;
|
||||
data.field.oauth_openwx = data.field.oauth_openwx ? 1 : 0;
|
||||
let arr = []
|
||||
for (const k in data.field) {
|
||||
arr.push({
|
||||
'key': k,
|
||||
'value': data.field[k],
|
||||
})
|
||||
}
|
||||
httpPost('/admin/system/set', arr).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,167 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>在线升级</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../css/public.css" media="all">
|
||||
<style>
|
||||
body {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
|
||||
.console {
|
||||
height: 100%;
|
||||
background-color: #3F3F3F;
|
||||
color: #eee;
|
||||
font-size: 12px;
|
||||
padding: .5rem;
|
||||
}
|
||||
|
||||
.ota-console {
|
||||
max-width: 600px;
|
||||
max-height: 400px;
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="layui-form layuimini-form" lay-filter="ota-info">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form">
|
||||
<blockquote class="layui-elem-quote">在线升级</blockquote>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">当前版本:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="current_version" class="layui-input" readonly>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">最新版本:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="version" class="layui-input" readonly>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">新版特性:</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="message" class="layui-textarea" readonly></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" onclick="init()">检查更新</button>
|
||||
<button id="update" class="layui-btn" lay-submit lay-filter="submit">立即更新</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../js/common.js" charset="utf-8"></script>
|
||||
<script src="../js/api.js" charset="utf-8"></script>
|
||||
<script>
|
||||
|
||||
const init = () => {
|
||||
layer.load(1)
|
||||
let tasks = []
|
||||
tasks.push(
|
||||
httpGet('/admin/update/check').then(res => {
|
||||
if (res.status === 'ok') {
|
||||
let release = res.data;
|
||||
layui.form.val('ota-info', release)
|
||||
if (release.current_version === release.version) {
|
||||
$('#update').hide()
|
||||
} else {
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: false,
|
||||
closeBtn: false,
|
||||
area: '300px;',
|
||||
shade: 0.8,
|
||||
id: 'ota_check',
|
||||
btn: ['立即更新', '残忍拒绝'],
|
||||
btnAlign: 'c',
|
||||
moveType: 1,
|
||||
content: `<div style="padding: 50px; line-height: 22px; background-color: #393D49; color: #fff; font-weight: 300;">发现有新版本发布</div>`,
|
||||
yes: function (index) {
|
||||
$('#update').click();
|
||||
layer.close(index);
|
||||
}
|
||||
});
|
||||
$('#update').show()
|
||||
}
|
||||
}
|
||||
}))
|
||||
Promise.all(tasks).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
}
|
||||
const writeln = (message) => {
|
||||
let html = $('#console').html();
|
||||
|
||||
message = message.replaceAll("\n", '<br/>')
|
||||
message = `[${dateFormat(new Date())}] ${message}`
|
||||
html = html + '<br/>' + message
|
||||
html = html.replace(/^<br[\s]*\/>+|<br[\s]*\/>+$/g, '');
|
||||
$('#console').html(html);
|
||||
|
||||
}
|
||||
const openConsole = () => {
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: '在线更新',
|
||||
area: ['85vw', '400px'],
|
||||
skin: 'ota-console',
|
||||
shade: 0.8,
|
||||
id: 'ota_update',
|
||||
content: `<div class="console" id="console"></div>`,
|
||||
yes: function (index) {
|
||||
$('#update').click();
|
||||
layer.close(index);
|
||||
}
|
||||
});
|
||||
}
|
||||
layui.use(['form'], function () {
|
||||
var form = layui.form,
|
||||
layer = layui.layer,
|
||||
$ = layui.$;
|
||||
init();
|
||||
//监听提交
|
||||
form.on('submit(submit)', function (data) {
|
||||
layer.load(1)
|
||||
openConsole();
|
||||
writeln('开始更新~')
|
||||
let tasks = [
|
||||
httpGet('/admin/update/update'),
|
||||
httpGet('/admin/update/database'),
|
||||
httpGet('/admin/update/script'),
|
||||
];
|
||||
const run = async function () {
|
||||
for (let task of tasks) {
|
||||
const res = await task()
|
||||
writeln(res.message)
|
||||
if (res.status !== 'ok') {
|
||||
writeln('终止更新~')
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
run().then(() => writeln('更新完毕~'))
|
||||
} finally {
|
||||
layer.closeAll('loading')
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,154 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>上传记录</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../css/public.css" media="all">
|
||||
<script src="../js/common.js" charset="utf-8"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="layuimini-container">
|
||||
<div class="layuimini-main">
|
||||
|
||||
<fieldset class="table-search-fieldset">
|
||||
<legend>搜索信息</legend>
|
||||
<div style="margin: 10px 10px 10px 10px">
|
||||
<form class="layui-form layui-form-pane" action="" lay-filter="data-search">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">文件链接</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="fileurl" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">用户UID</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="uid" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">上传IP</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="ip" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit
|
||||
lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索
|
||||
</button>
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit
|
||||
lay-filter="data-refresh-btn"><i class="layui-icon layui-icon-refresh"></i> 重 置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
|
||||
|
||||
<script type="text/html" id="currentTableBar">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-open" lay-event="open">查看</a>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="uidColumn">
|
||||
<a href="javascript:;" layuimini-content-href="page/user.html?uid={{d.uid}}" data-title="用户管理">{{d.uid}}</a>
|
||||
</script>
|
||||
|
||||
<a style="display: none;" href="" id="vurl" rel="noreferrer" target="_blank"></a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../js/lay-config.js?v=2.0.0" charset="utf-8"></script>
|
||||
<script src="../js/api.js" charset="utf-8"></script>
|
||||
<script>
|
||||
layui.use(['form', 'table', 'miniTab'], function () {
|
||||
var $ = layui.jquery,
|
||||
form = layui.form,
|
||||
table = layui.table,
|
||||
miniTab = layui.miniTab;
|
||||
|
||||
miniTab.listen();
|
||||
|
||||
table.render({
|
||||
elem: '#currentTableId',
|
||||
url: '/admin/comment/uploadlog',
|
||||
toolbar: '#toolbarDemo',
|
||||
defaultToolbar: ['filter', 'exports', 'print', {
|
||||
title: '提示',
|
||||
layEvent: 'LAYTABLE_TIPS',
|
||||
icon: 'layui-icon-tips'
|
||||
}],
|
||||
cols: [[
|
||||
{field: 'id', width: 80, title: 'ID', sort: true, fixed: 'left'},
|
||||
{field: 'uid', width: 80, title: 'UID', align: 'center', templet: "#uidColumn"},
|
||||
{field: 'type', width: 80, title: '类型', align: 'center'},
|
||||
{field: 'source', width: 100, title: '来源', align: 'center'},
|
||||
{field: 'filename', width: 200, title: '文件名称'},
|
||||
{field: 'fileurl', width: 300, title: '文件链接'},
|
||||
{field: 'ip', width: 150, title: '上传IP'},
|
||||
{field: 'addtime', width: 200, title: '上传时间', align: 'center'},
|
||||
{title: '操作', width: 120, toolbar: '#currentTableBar', align: "center", fixed: 'right'}
|
||||
]],
|
||||
limits: [10, 15, 20, 25, 50, 100],
|
||||
limit: 15,
|
||||
page: true,
|
||||
skin: 'line',
|
||||
response: parse_table.response,
|
||||
parseData: parse_table.parseData
|
||||
});
|
||||
|
||||
// 监听搜索操作
|
||||
form.on('submit(data-search-btn)', function (data) {
|
||||
//执行搜索重载
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
// 监听重置操作
|
||||
form.on('submit(data-refresh-btn)', function (data) {
|
||||
data.field.fileurl = '';
|
||||
data.field.uid = '';
|
||||
data.field.ip = '';
|
||||
form.val('data-search', data.field)
|
||||
//执行搜索重载
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
table.on('tool(currentTableFilter)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'open') {
|
||||
$("#vurl").attr("href",data.fileurl);
|
||||
document.getElementById("vurl").click();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,227 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>用户管理</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<link rel="stylesheet" href="//cdn.staticfile.org/layui/2.6.3/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="../css/public.css" media="all">
|
||||
<script src="../js/common.js" charset="utf-8"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="layuimini-container">
|
||||
<div class="layuimini-main">
|
||||
|
||||
<fieldset class="table-search-fieldset">
|
||||
<legend>搜索信息</legend>
|
||||
<div style="margin: 10px 10px 10px 10px">
|
||||
<form class="layui-form layui-form-pane" action="" lay-filter="data-search">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">ID</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="id" autocomplete="off" class="layui-input" placeholder="用户ID或第三方账号UID">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">用户名</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="username" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit
|
||||
lay-filter="data-search-btn"><i class="layui-icon layui-icon-search"></i> 搜 索
|
||||
</button>
|
||||
<button type="submit" class="layui-btn layui-btn-primary" lay-submit
|
||||
lay-filter="data-refresh-btn"><i class="layui-icon layui-icon-refresh"></i> 重 置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm layui-btn-danger data-delete-btn" lay-event="delete"> 删除</button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
|
||||
|
||||
<script type="text/html" id="currentTableBar">
|
||||
<a class="layui-btn layui-btn-warn layui-btn-xs data-count-login" lay-event="login">登录</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
|
||||
</script>
|
||||
<script type="text/html" id="imagePreview">
|
||||
<img style="cursor: zoom-in" onclick="imagePreview('{{d.avatar_url}}')" height="30px"
|
||||
src="{{d.avatar_url}}" alt="">
|
||||
</script>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<script src="//cdn.staticfile.org/layui/2.6.3/layui.js" charset="utf-8"></script>
|
||||
<script src="../js/api.js" charset="utf-8"></script>
|
||||
<script>
|
||||
|
||||
layui.use(['form', 'table'], function () {
|
||||
var $ = layui.jquery,
|
||||
form = layui.form,
|
||||
table = layui.table;
|
||||
|
||||
whereData = {}
|
||||
if(getQueryString('uid')){
|
||||
form.val('data-search', {id: getQueryString('uid')});
|
||||
whereData = {id:getQueryString('uid')}
|
||||
}
|
||||
|
||||
table.render({
|
||||
elem: '#currentTableId',
|
||||
where: whereData,
|
||||
url: '/admin/user/list',
|
||||
toolbar: '#toolbarDemo',
|
||||
defaultToolbar: ['filter', 'exports', 'print', {
|
||||
title: '提示',
|
||||
layEvent: 'LAYTABLE_TIPS',
|
||||
icon: 'layui-icon-tips'
|
||||
}],
|
||||
cols: [[
|
||||
{type: 'checkbox', fixed: 'left'}
|
||||
, {field: 'id', width: 100, title: 'ID', sort: true, fixed: 'left'},
|
||||
{field: 'avatar_url', width: 100, title: '头像', align: 'center', templet: '#imagePreview'},
|
||||
{field: 'username', width: 200, title: '用户名', sort: true, align: 'center'},
|
||||
{field: 'type', width: 80, title: '方式', sort: true, align: 'center'},
|
||||
{field: 'openid', width: 200, title: '第三方账号UID', sort: true, align: 'center'},
|
||||
{
|
||||
field: 'enable', width: 120, title: '用户状态', align: 'center', templet: function (res) {
|
||||
return `<input type="checkbox" name="enable" value="${res.enable}" data-id="${res.id}" lay-skin="switch" lay-text="正常|禁止" lay-filter="enable_switch" ${res.enable == 1 ? 'checked' : ''}>`
|
||||
}
|
||||
},
|
||||
{field: 'level', width: 80, title: '等级', sort: true, edit: true, align: 'center'},
|
||||
{field: 'create_time', width: 200, title: '注册时间', sort: true, align: 'center'},
|
||||
{field: 'update_time', width: 200, title: '登录时间', sort: true, align: 'center'},
|
||||
{title: '操作', width: 120, toolbar: '#currentTableBar', align: "center", fixed: 'right'}
|
||||
]],
|
||||
limits: [10, 15, 20, 25, 50, 100],
|
||||
limit: 15,
|
||||
page: true,
|
||||
skin: 'line',
|
||||
response: parse_table.response,
|
||||
parseData: parse_table.parseData
|
||||
});
|
||||
|
||||
// 监听搜索操作
|
||||
form.on('submit(data-search-btn)', function (data) {
|
||||
//执行搜索重载
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
// 监听重置操作
|
||||
form.on('submit(data-refresh-btn)', function (data) {
|
||||
data.field.id = '';
|
||||
data.field.username = '';
|
||||
form.val('data-search', data.field)
|
||||
//执行搜索重载
|
||||
table.reload('currentTableId', {
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
, where: data.field
|
||||
}, 'data');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* toolbar监听事件
|
||||
*/
|
||||
table.on('toolbar(currentTableFilter)', function (obj) {
|
||||
if (obj.event === 'delete') { // 监听删除操作
|
||||
var checkStatus = table.checkStatus('currentTableId')
|
||||
, data = checkStatus.data;
|
||||
|
||||
layer.confirm('你确实要删除选中的用户吗?', function (index) {
|
||||
layer.load(1)
|
||||
let tasks = []
|
||||
for (const k in data) {
|
||||
tasks.push(
|
||||
httpGet('/admin/user/delete?id=' + data[k].id).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
table.reload('currentTableId')
|
||||
}
|
||||
}))
|
||||
}
|
||||
layer.close(index);
|
||||
Promise.all(tasks).finally(() => layer.closeAll('loading'))
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//监听表格复选框选择
|
||||
table.on('checkbox(currentTableFilter)', function (obj) {
|
||||
console.log(obj)
|
||||
});
|
||||
|
||||
//监听插件启用禁用操作
|
||||
form.on('switch(enable_switch)', function (obj) {
|
||||
layer.load(1)
|
||||
httpPost('/admin/user/enable', {
|
||||
id: $(obj.elem).data('id'),
|
||||
enable: obj.elem.checked ? 1 : 0
|
||||
}).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
}
|
||||
}).finally(() => {
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
});
|
||||
|
||||
table.on('tool(currentTableFilter)', function (obj) {
|
||||
var data = obj.data;
|
||||
if (obj.event === 'delete') {
|
||||
layer.confirm('你确实要删除此用户吗?', function (index) {
|
||||
layer.load(1)
|
||||
httpGet('/admin/user/delete?id=' + data.id).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
obj.del();
|
||||
}
|
||||
}).finally(() => layer.closeAll('loading'))
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
else if (obj.event === 'login') {
|
||||
layer.confirm('确定以'+data.username+'用户登录到网站吗', function (index) {
|
||||
window.open('/admin/user/slogin?id=' + data.id);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
//触发单元格编辑
|
||||
table.on('edit(currentTableFilter)', function (obj) {
|
||||
layer.load(1)
|
||||
httpPost('/admin/user/edit', obj.data).then(res => {
|
||||
if (res.status === 'ok') {
|
||||
$message.success('保存成功');
|
||||
}
|
||||
}).finally(() => {
|
||||
table.reload('currentTableFilter')
|
||||
layer.closeAll('loading')
|
||||
})
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user