Initial commit

This commit is contained in:
net909
2023-09-28 16:21:06 +08:00
parent 498772eb04
commit ba7be004c0
640 changed files with 87745 additions and 0 deletions
+110
View File
@@ -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>
+101
View File
@@ -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>
+239
View File
@@ -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>
+84
View File
@@ -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>
+99
View File
@@ -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>
+238
View File
@@ -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>
+99
View File
@@ -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>
+225
View File
@@ -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>&nbsp;&nbsp;工具总数</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>&nbsp;&nbsp;留言总数</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>&nbsp;&nbsp;用户总数</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>&nbsp;&nbsp;今日新增用户</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>&nbsp;&nbsp;服务器信息</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>&nbsp;&nbsp;版本信息</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>
+243
View File
@@ -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>
+82
View File
@@ -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>
+97
View File
@@ -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>
+331
View File
@@ -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>
+164
View File
@@ -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>
+173
View File
@@ -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>
+213
View File
@@ -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">
&emsp;确认安装&emsp;
</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;">&#xe605;</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>
+236
View File
@@ -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>
+167
View File
@@ -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>
+154
View File
@@ -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>
+227
View File
@@ -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>