使用PHP开发的简约导航/书签管理系统。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

366 lines
15 KiB

4 years ago
<?php include_once('header.php'); ?>
<?php include_once('left.php'); ?>
<div class="layui-body">
<!-- 内容主体区域 -->
3 years ago
<div class="layui-row content-body place-holder">
11 months ago
<!-- 说明提示框 -->
<div class="layui-col-lg12">
<div class="page-msg">
<ol>
<li>仅 default2/5iux/heimdall/tushan2/webstack 支持自定义图标,其余主题均自动获取链接图标。</li>
11 months ago
<li>分类的私有属性优先级高于链接的私有属性</li>
<li>权重数字越大,链接排序越靠前</li>
11 months ago
</ol>
</div>
</div>
<!-- 说明提示框END -->
3 years ago
<!-- 表单上面的按钮 -->
<div class="lay-col-lg12">
<form class="layui-form layui-form-pane" action="">
<div class="layui-form-item">
<div class="layui-inline">
2 years ago
<div class="layui-input-inline">
<select name="fid" lay-verify="" lay-search id = "fid">
<option value="">请选择一个分类</option>
<?php foreach( $categorys AS $category ){ ?>
<option value="<?php echo $category['id'] ?>"><?php echo $category['name']; ?></option>
<?php } ?>
</select>
</div>
<div class="layui-input-inline" style="width: 100px;">
<button class="layui-btn" lay-submit lay-filter="screen_link">查询此分类下的链接</button>
</div>
3 years ago
</div>
2 years ago
<div style="width:50px;display: inline-block;"></div>
<!-- 顶部搜索 -->
<div class="layui-inline" style="border-right:1px solid #ccc;">
2 years ago
<div class="layui-input-inline">
1 year ago
<input type="text" name="keyword" id="keyword" placeholder="请输入关键词" autocomplete="off" class="layui-input">
2 years ago
</div>
<div class="layui-input-inline" style="width: 70px;">
2 years ago
<button class="layui-btn" lay-submit lay-filter="search_keyword">搜索</button>
</div>
3 years ago
</div>
2 years ago
<!-- 顶部搜索END -->
<!-- 批量检测 -->
<div class="layui-inline">
<div class="layui-input-inline">
<button class="layui-btn" lay-submit lay-filter="batch_check">批量检测</button>
</div>
</div>
<!-- 批量检测END -->
3 years ago
</div>
</form>
3 years ago
</div>
3 years ago
<!-- 表单上面的按钮END -->
4 years ago
<div class="layui-col-lg12">
3 years ago
<table id="link_list" lay-filter="mylink" lay-data="{id: 'mylink_reload'}"></table>
4 years ago
<!-- 开启表格头部工具栏 -->
<script type="text/html" id="linktool">
<div class="layui-btn-container">
4 years ago
<button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="getCheckData">删除选中</button>
3 years ago
<button class="layui-btn layui-btn-sm" lay-event="readmoredata">批量修改分类</button>
3 years ago
<button class="layui-btn layui-btn-sm" lay-event="set_private">设为私有</button>
<button class="layui-btn layui-btn-sm" lay-event="set_public">设为公有</button>
2 years ago
<button class="layui-btn layui-btn-sm" lay-event="reset_query">重置查询</button>
4 years ago
<!-- <button class="layui-btn layui-btn-sm" lay-event="getCheckLength">获取选中数目</button>
<button class="layui-btn layui-btn-sm" lay-event="isAll">验证是否全选</button> -->
</div>
</script>
<!-- 开启表格头部工具栏END -->
</div>
<script type="text/html" id="link_operate">
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del" onclick = "">删除</a>
</script>
3 years ago
<!-- 表单下面的按钮 -->
2 years ago
<button style="margin-top:16px;" class="layui-btn layui-btn-sm" lay-submit onclick = "export_link()">导出所有链接</button>
3 years ago
<!-- 表单下面的按钮END -->
4 years ago
</div>
<!-- 内容主题区域END -->
</div>
2 years ago
<script>
2 years ago
layui.use(['table','form'], function(){
2 years ago
var table = layui.table;
2 years ago
var form = layui.form;
2 years ago
// 编辑单行
table.on('edit(mylink)',function(obj){
var field = obj.field; // 得到字段
var value = obj.value; // 得到修改后的值
var data = obj.data; // 得到所在行所有键值
// 获取到权重并判断是否合法
let weight = data.weight;
if( /^[-+]?\d*\.?\d+$/.test(weight) == false ) {
layer.msg("权重必须为数字!",{icon:5});
return obj.reedit();
}
// 获取到标题并判断是否合法
let title = data.title.trim();
if( title.length == 0 ) {
layer.msg("标题不能为空!",{icon:5});
return obj.reedit();
}
// 请求后端API
$.ajax({
url: '/index.php?c=api&method=edit_link_row',
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json',
dataType: 'json',
success: function(response) {
// 请求成功后执行的代码
if( response.code == 0 ) {
layer.msg("已修改!",{icon:1});
}
else{
layer.msg(response.msg,{icon:5});
}
},
error: function(xhr, status, error) {
// 请求出错时执行的代码
console.log(error);
layer.msg("修改失败!",{icon:5});
}
});
2 years ago
});
// 提交批量检测
form.on('submit(batch_check)', function(data){
let content = `
<ul>
<li>1. 此功能仅订阅用户可用!</li>
<li>2. 检测较为耗时,检测期间请勿关闭和刷新此页面!</li>
<li>3. 检测结果仅供参考,无法确保100%准确,具体以实际访问为准!</li>
</ul>
`;
// 弹出确认提示
layer.confirm(content, {
btn: ['开始检测','取消'],
title: '即将对链接进行批量检测!',
area: ['400px', 'auto']
}, function(){
// 关闭确认提示
layer.closeAll('dialog');
// 显示全局加载
var index = layer.load(1);
$.ajax({
url: '/index.php?c=api&method=batch_check_links',
type: 'GET',
success: function(response) {
// 请求成功后执行的代码
if( response.code == 200 ) {
// 关闭全局加载
layer.close(index);
layer.msg("批量检测成功!",{icon:1});
// 2s后重新载入页面
setTimeout(function(){
location.reload();
},2000);
}
else{
layer.msg(response.msg,{icon:5});
// 关闭全局加载
layer.close(index);
}
},
error: function(xhr, status, error) {
layer.close(index);
// 请求出错时执行的代码
console.log(error);
layer.msg("批量检测失败!",{icon:5});
}
});
}, function(){
// 取消后执行的代码
});
return false;
});
2 years ago
// 提交搜索
form.on('submit(search_keyword)', function(data){
console.log(data.field);
let keyword = data.field.keyword;
1 year ago
if( keyword.length < 2 ) {
layer.msg("关键词过短!",{icon:5});
return false;
}
2 years ago
//渲染链接列表
table.render({
elem: '#link_list'
,height: 530
,url: 'index.php?c=api&method=global_search&keyword=' + keyword //数据接口
,method: 'post'
,toolbar: '#linktool'
,cols: [[ //表头
{type:'checkbox'} //开启复选框
,{field: 'id', title: 'ID', width:80, sort: true}
,{field: 'font_icon', title: '图标', width:60, templet:function(d){
if(d.font_icon == null || d.font_icon == "")
{
return '<img src="static/images/default.png" width="28" height="28">';
}
else
{
let random = getRandStr(4);
let font_icon = d.font_icon;
return `<img src="${font_icon}?random=${random}" width="28" height="28">`;
}
}}
// ,{field: 'fid', title: '分类ID',sort:true, width:90}
,{field: 'category_name', title: '所属分类',sort:true,width:120}
,{field: 'url', title: 'URL',width:140,templet:function(d){
var url = '<a target = "_blank" href = "' + d.url + '" title = "' + d.url + '">' + d.url + '</a>';
return url;
}}
,{field: 'title', title: '链接标题', width:140,edit: 'text'}
,{field: 'add_time', title: '添加时间', width:148, sort: true,templet:function(d){
var add_time = timestampToTime(d.add_time);
return add_time;
}}
,{field: 'up_time', title: '修改时间', width:148,sort:true,templet:function(d){
if(d.up_time == null){
return '';
}
else{
var up_time = timestampToTime(d.up_time);
return up_time;
}
}}
,{field: 'check_status', title: '状态', width: 80,sort:true,templet:function(d){
let title = `检测时间:${d.last_checked_time}`;
if(d.check_status == 1) {
return `<span title="${title}" class="link-status-text layui-badge layui-bg-green">正常</span>`;
}
else if(d.check_status == 2) {
return `<span title="${title}" class="link-status-text layui-badge">异常</span>`;
}
else if(d.check_status == 3) {
return `<span title="${title}" class="link-status-text layui-badge layui-bg-cyan">未知</span>`;
}
else {
return `<span title="${title}" class="link-status-text layui-badge layui-bg-gray">未检测</span>`;
}
}}
2 years ago
,{field: 'property', title: '私有', width: 80, sort: true,templet: function(d){
if(d.property == 1) {
return '<button type="button" class="layui-btn layui-btn-xs"></button>';
}
else {
return '<button type="button" class="layui-btn layui-btn-xs layui-btn-danger"></button>';
}
}}
,{field: 'weight', title: '权重', width: 75,sort:true,edit: 'text'}
2 years ago
,{field: 'click', title: '点击数',width:90,sort:true}
,{fixed: 'right', title:'操作', toolbar: '#link_operate'}
]]
});
// 渲染链接列表END
return false;
});
2 years ago
});
2 years ago
// 重置查询
function reset_query(){
// 清空关键词
$("#keyword").val("");
layui.use(['table'], function(){
var table = layui.table;
//渲染链接列表
table.render({
elem: '#link_list'
,height: 530
,url: 'index.php?c=api&method=link_list'
,method: 'post'
,page: true //开启分页
,toolbar: '#linktool'
,cols: [[ //表头
{type:'checkbox'} //开启复选框
,{field: 'id', title: 'ID', width:80, sort: true}
,{field: 'font_icon', title: '图标', width:60, templet:function(d){
if(d.font_icon == null || d.font_icon == "")
{
return '<img src="static/images/default.png" width="28" height="28">';
}
else
{
let random = getRandStr(4);
let font_icon = d.font_icon;
return `<img src="${font_icon}?random=${random}" width="28" height="28">`;
}
}}
// ,{field: 'fid', title: '分类ID',sort:true, width:90}
,{field: 'category_name', title: '所属分类',sort:true,width:120}
,{field: 'url', title: 'URL',width:140,templet:function(d){
var url = '<a target = "_blank" href = "' + d.url + '" title = "' + d.url + '">' + d.url + '</a>';
return url;
}}
,{field: 'title', title: '链接标题', width:140,edit: 'text'}
,{field: 'add_time', title: '添加时间', width:148, sort: true,templet:function(d){
var add_time = timestampToTime(d.add_time);
return add_time;
}}
,{field: 'up_time', title: '修改时间', width:148,sort:true,templet:function(d){
if(d.up_time == null){
return '';
}
else{
var up_time = timestampToTime(d.up_time);
return up_time;
}
}}
,{field: 'check_status', title: '状态', width: 80,sort:true,templet:function(d){
let title = `检测时间:${d.last_checked_time}`;
if(d.check_status == 1) {
return `<span title="${title}" class="link-status-text layui-badge layui-bg-green">正常</span>`;
}
else if(d.check_status == 2) {
return `<span title="${title}" class="link-status-text layui-badge">异常</span>`;
}
else if(d.check_status == 3) {
return `<span title="${title}" class="link-status-text layui-badge layui-bg-cyan">未知</span>`;
}
else {
return `<span title="${title}" class="link-status-text layui-badge layui-bg-gray">未检测</span>`;
}
}}
2 years ago
,{field: 'property', title: '私有', width: 80, sort: true,templet: function(d){
if(d.property == 1) {
return '<button type="button" class="layui-btn layui-btn-xs"></button>';
}
else {
return '<button type="button" class="layui-btn layui-btn-xs layui-btn-danger"></button>';
}
}}
,{field: 'weight', title: '权重', width: 75,sort:true,edit: 'text'}
2 years ago
,{field: 'click', title: '点击数',width:90,sort:true}
,{fixed: 'right', title:'操作', toolbar: '#link_operate'}
]]
});
// 渲染链接列表END
})
}
2 years ago
</script>
4 years ago
<?php include_once('footer.php'); ?>