v2.0.28-20230624

This commit is contained in:
MI15\Win
2023-06-24 13:58:46 +08:00
parent 4bc10f7c25
commit 184fc0de6b
12 changed files with 125 additions and 71 deletions

View File

@@ -306,7 +306,7 @@ function read_link_list(){
$list = unserialize($list);
msgA(['code'=>1,'msg'=>'获取成功','count'=>count($list),'data'=>$list]);
}
$field = ['lid','fid','pid(pwd_id)','status','property','title','url','url_standby','weight','description','icon','click','add_time','up_time'];
$query = $_POST['query'];
$fid = intval(@$_POST['fid']); //获取分类ID
$page = empty(intval($_REQUEST['page'])) ? 1 : intval($_REQUEST['page']);
@@ -334,14 +334,20 @@ function read_link_list(){
//统计条数
$count = count_db('user_links',$where);
//权重排序(数字小的排前面)
$where['ORDER']['weight'] = 'ASC';
$where['ORDER']['lid'] = 'ASC';
//前端指定排序方式,过滤字段名和方式
if(!empty($_POST['order']) && !empty($_POST['field']) && in_array($_POST['field'],$field) && in_array($_POST['order'],['ASC','DESC'])){
$where['ORDER'][$_POST['field']] = $_POST['order'];
}else{
//默认排序方式 权重排序(数字小的排前面)
$where['ORDER']['weight'] = 'ASC';
$where['ORDER']['lid'] = 'ASC';
}
//分页
$where['LIMIT'] = [$offset,$limit];
//查询
$datas = select_db('user_links',['lid','fid','pid(pwd_id)','status','property','title','url','url_standby','weight','description','icon','click','add_time','up_time'],$where);
$datas = select_db('user_links',$field,$where);
msgA(['code'=>1,'msg'=>'获取成功','count'=>$count,'data'=>$datas]);
}
@@ -821,6 +827,10 @@ function write_apply(){
$s['apply'] = intval($_POST['apply']); // 功能选项0.关闭 1.需要审核 2.无需审核
$s['Notice'] = $_POST['Notice']??''; // 公告
$s['submit_limit'] = intval($_POST['submit_limit']); //提交限制
$s['iconurl'] = $_POST['iconurl'];
$s['description'] = $_POST['description'];
$s['email'] = $_POST['email'];
if($s['apply'] < 0 || $s['apply'] > 2 ){
msg(-1,'参数错误!');
}elseif(strlen($s['Notice']) > 512){
@@ -966,8 +976,8 @@ function write_site_setting(){
'main_link_priority'=>['int'=>true,'min'=>0,'max'=>3,'msg'=>'主链优先参数错误'],
'link_icon'=>['int'=>true,'min'=>0,'max'=>30,'msg'=>'链接图标参数错误'],
'site_icon'=>['empty'=>true],
'top_link'=>['int'=>true,'min'=>0,'max'=>20,'msg'=>'热门链接参数错误'],
'new_link'=>['int'=>true,'min'=>0,'max'=>20,'msg'=>'最新链接参数错误'],
'top_link'=>['int'=>true,'min'=>0,'max'=>100,'msg'=>'热门链接参数错误'],
'new_link'=>['int'=>true,'min'=>0,'max'=>100,'msg'=>'最新链接参数错误'],
'max_link'=>['int'=>true,'min'=>0,'max'=>100,'msg'=>'输出上限参数错误'],
'custom_header'=>['empty'=>true],
'custom_footer'=>['empty'=>true]

View File

@@ -44,22 +44,22 @@ foreach($_POST as $key =>$value){
$title = $_POST['title'];
$url = $_POST['url'];
$iconurl = $_POST['iconurl'];
$description = $_POST['description'];
$iconurl = $_POST['iconurl'] ?? '';
$description = $_POST['description'] ?? '';
$category_id = intval ($_POST['category_id']);
$email = $_POST['email'];
$email = $_POST['email'] ?? '';
$user_ip = Get_IP();
if( !filter_var($url, FILTER_VALIDATE_URL) ) {
msg(-1,'URL无效!');
}elseif( !empty($iconurl) && !filter_var($iconurl, FILTER_VALIDATE_URL) ){
}elseif(!empty($apply['iconurl']) && !filter_var($iconurl, FILTER_VALIDATE_URL) ){
msg(-1,'网站图标无效!');
}elseif(!preg_match('/^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/',$email)){
}elseif(!empty($apply['email']) && !preg_match('/^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/',$email)){
msg(-1,'联系邮箱无效!');
}elseif(!isset($_POST['category_id'])){
msg(-1,'分类ID不能为空!');
}elseif(!isset($_POST['title'])){
msg(-1,'网站标题不能为空!');
}elseif(!isset($_POST['description'])){
}elseif(!empty($apply['description']) && empty($_POST['description'])){
msg(-1,'网站描述不能为空!');
}
//获取和检查分类信息

View File

@@ -234,7 +234,7 @@ function echo_pwds(){
}
//检查链接
function check_link($fid,$title,$url,$url_standby_s=''){
$pattern = "/^(http:\/\/|https:\/\/|ftp:\/\/|ftps:\/\/|sftp:\/\/|magnet:?|ed2k:\/\/|thunder:\/\/|tcp:\/\/|udp:\/\/|rtsp:\/\/).+/";
$pattern = "/^(http:\/\/|https:\/\/|ftp:\/\/|ftps:\/\/|sftp:\/\/|magnet:?|ed2k:\/\/|thunder:\/\/|tcp:\/\/|udp:\/\/|rtsp:\/\/|wsa:\/\/|vmrc:\/\/).+/";
$length_limit = unserialize(get_db("global_config","v",["k"=>"length_limit"]));
if (empty($fid)) msg(-1,'分类id(fid)不能为空');
if (empty($title)) msg(-1,'名称不能为空');

View File

@@ -1 +1 @@
v2.0.27-20230618
v2.0.28-20230624

View File

@@ -82,6 +82,15 @@
}
limit = false; //取消修改限制
layer.closeAll('loading'); //关闭加载层
//加载加密分组数据
$.post(get_api('read_pwd_group_list'),{'page':'1','limit':'9999'},function(data,status){
if(data.code == 1){
pwds = [];
for(var i =0;i<data.count;i++){
pwds['pid_'+data.data[i].pid] = {'pwd':data.data[i].password,'name':data.data[i].name};
}
}
});
}
});
};

View File

@@ -216,7 +216,7 @@ function preview_icon(icon =''){
}else if(icon.substr(0,4) == '<svg'){
$('#icon_img').attr('src','data:image/svg+xml;base64,'+ btoa(icon.replace(/[\u00A0-\u2666]/g, function(c) {return '&#' + c.charCodeAt(0) + ';';})) );
}else{
$('#icon_img').attr('src',icon + '?t=' + Math.random() ) ;
$('#icon_img').attr('src',icon + (icon.indexOf('?') !== -1 ? '&_t=' : '?_t=') + Math.random() ) ;
}
}
}

View File

@@ -9,6 +9,7 @@ layui.use(['form','table','dropdown','miniTab'], function () {
var api = get_api('read_link_list'); //列表接口
var limit = localStorage.getItem(u + "_limit") || 50; //尝试读取本地记忆数据,没有就默认50
var pwds = [];
var field,order;
miniTab.listen();
//渲染表格
renderTable1();
@@ -24,11 +25,11 @@ layui.use(['form','table','dropdown','miniTab'], function () {
}
});
}
var img_src;
var cols=[ //表头
{type:'checkbox'} //开启复选框
,{field: 'lid', title: 'ID', width:80, sort: true,hide:true}
,{field: 'category_name', title: '所属分类',sort:true,width:140,event: 'edit_category',templet:function(d){
,{field: 'fid', title: '所属分类',sort:true,width:140,event: 'edit_category',templet:function(d){
//检查是否存在,避免特殊情况报错
if (categorys && categorys[d.fid] && categorys[d.fid].font_icon && categorys[d.fid].name) {
return '<i class="' + categorys[d.fid].font_icon + '"></i> ' + categorys[d.fid].name;
@@ -36,24 +37,38 @@ layui.use(['form','table','dropdown','miniTab'], function () {
return 'Null';
}
}}
,{field: 'title', title: '链接标题', width:200, edit: 'text'}
,{field: 'icon', title: '图标', width:60, templet:function(d){
if(d.icon == null || d.icon == ""){
return '<img src="./templates/admin/img/ie.svg" width="28" height="28">';
}else{
if(d.icon.substr(0,5) =='data:') {
img_src = d.icon;
}else if(d.icon.substr(0,4) == '<svg'){
img_src = 'data:image/svg+xml;base64,'+ btoa(d.icon.replace(/[\u00A0-\u2666]/g, function(c) {return '&#' + c.charCodeAt(0) + ';';}));
}else{
img_src = d.icon + (d.icon.indexOf('?') !== -1 ? '&_t=' : '?_t=') + Date.now();
}
return '<img src="' + img_src + '" width="28" height="28">';
}
}}
,{field: 'title', title: '链接标题',sort:true, width:200, edit: 'text'}
,{ title:'操作', toolbar: '#tablebar',width:110}
,{field:'pwd_id',title:'密码',width:70,templet: function(d){
return d.pwd_id>0?'<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="pwd">查看</a>':'';
}}
return d.pwd_id>0?'<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="pwd">查看</a>':'';
}}
,{field: 'property', title: '私有', width: 100, sort: true,templet: function(d){
return "<input type='checkbox' value='" + d.lid + "' lay-filter='property' lay-skin='switch' lay-text='私有|公开' " + (d.property == 1?"checked":"" )+ ">";
}}
,{field: 'status', title: '状态', width: 100, sort: true,templet: function(d){
return "<input type='checkbox' value='" + d.lid + "' lay-filter='status' lay-skin='switch' lay-text='启用|禁用' " + (d.status == 1?"checked":"" )+ ">";
}}
,{field: 'url', title: 'URL',templet:function(d){
return '<a color="" target = "_blank" href = "' + d.url + '" title = "' + d.url + '" referrerpolicy="same-origin" >' + d.url + '</a>';
,{field: 'url',sort:true, title: 'URL',templet:function(d){
return '<a color="" target = "_blank" href = "' + d.url + '" title = "' + d.url + '" referrerpolicy="same-origin" >' + d.url + '</a>';
}}
,{field: 'click', title: '点击数',width:90,sort:true}
,{field: 'add_time', title: '添加时间', width:160, sort: true,templet:function(d){
var add_time = timestampToTime(d.add_time);
return add_time;
var add_time = timestampToTime(d.add_time);
return add_time;
}}
,{field: 'up_time', title: '修改时间', width:160,sort:true,templet:function(d){
return d.up_time == null ?'':timestampToTime(d.up_time);
@@ -122,6 +137,12 @@ layui.use(['form','table','dropdown','miniTab'], function () {
});
}
});
// 监听表格排序事件
table.on('sort(table)', function(obj) {
field = obj.field; // 排序字段
order = obj.type == null ? '' : obj.type.toUpperCase(); // 排序方式asc,desc转为大写,null则默认排序
link_search();
});
};
function link_search(){
@@ -136,7 +157,7 @@ layui.use(['form','table','dropdown','miniTab'], function () {
pageName: 'page' //页码的参数名称
,limitName: 'limit' //每页数据量的参数名
}
,where: {query:keyword,fid:fid,property:property,status:status}
,where: {query:keyword,fid:fid,property:property,status:status,field:field,order:order}
,page: {curr: 1}
});
}

View File

@@ -84,31 +84,19 @@
</div>
<div class="layui-form-item">
<label class="layui-form-label">热门网址</label>
<label class="layui-form-label">最新网址</label>
<div class="layui-input-inline" >
<select name="top_link">
<option value="0" selected>不显示</option>
<option value="5" >显示5条</option>
<option value="10" >显示10条</option>
<option value="15" >显示15条</option>
<option value="20" >显示20条</option>
</select>
<input type="number" name="new_link" class="layui-input" value="0" placeholder="输入范围: 0-100" lay-verify="required">
</div>
<div class="layui-form-mid layui-word-aux">在主页显示热门网址(点击排行)</div>
<div class="layui-form-mid layui-word-aux">在主页显示最新的网址(创建时间)</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">最新网址</label>
<label class="layui-form-label">热门网址</label>
<div class="layui-input-inline" >
<select name="new_link">
<option value="0" selected>不显示</option>
<option value="5" >显示5条</option>
<option value="10" >显示10条</option>
<option value="15" >显示15条</option>
<option value="20" >显示20条</option>
</select>
<input type="number" name="top_link" class="layui-input" value="0" placeholder="输入范围: 0-100" lay-verify="required">
</div>
<div class="layui-form-mid layui-word-aux">在主页显示最新的网址(创建时间)</div>
<div class="layui-form-mid layui-word-aux">在主页显示热门网址(点击排行)</div>
</div>
<div class="layui-form-item">

View File

@@ -50,7 +50,15 @@ $title='收录管理';$awesome=true; require dirname(__DIR__).'/header.php';
</div>
<div class="layui-form-mid layui-word-aux">单位:次,指最近24小时内可以提交多少次(为了防止恶意提交,删除记录可以恢复次数)</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">必填选项</label>
<div class="layui-input-block" style="margin-left: 32px;">
<input type="checkbox" name="iconurl" title="图标" >
<input type="checkbox" name="description" title="描述" >
<input type="checkbox" name="email" title="邮箱" >
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">使用说明</label>
<div class="layui-form-mid ">部分主题没有收录入口,请自行添加到链接或者底部等你认为合适的地方!前往<a style="color:#3c78d8" target="_blank" href="./index.php?c=apply&u=<?php echo $u?>" target="_blank">申请收录</a></div>
@@ -348,7 +356,7 @@ table.on('toolbar(apply_list)', function(obj){
var data = checkStatus.data;
switch(obj.event){
case 'conf':
if(document.body.clientWidth < 768){area = ['100%' , '100%'];}else{area = ['768px' , '500px'];}
if(document.body.clientWidth < 768){area = ['100%' , '100%'];}else{area = ['768px' , '520px'];}
layer.open({
type: 1,
scrollbar: false,

View File

@@ -15,6 +15,7 @@
body{background-color:rgba(0, 0, 51, 0.8);}
.title{max-width: 400px;height: auto;margin-left: auto;margin-right: auto;margin-top:5em;}
.title h1{color:#FFFFFF;text-align: center;}
.required {color: red;margin-left: 5px;float: right;}
</style>
</head>
<body>
@@ -29,32 +30,21 @@
<div class="layui-form-item" style="color: #fbfbfb;">
<?php echo $apply['Notice'];?>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站标题</label>
<div class="layui-input-block">
<input type="text" name="title" required lay-verify="required" placeholder="例如 百度一下" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站标题<span class="required">*</span></label>
<div class="layui-input-block">
<input type="text" name="title" required lay-verify="required" placeholder="例如 百度一下" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站链接</label>
<div class="layui-input-block">
<input type="url" name="url" required lay-verify="required|url" placeholder="例如 https://www.baidu.com" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站链接<span class="required">*</span></label>
<div class="layui-input-block">
<input type="url" name="url" required lay-verify="required|url" placeholder="例如 https://www.baidu.com" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站图标</label>
<div class="layui-input-block">
<input type="url" name="iconurl" required lay-verify="url" placeholder="例如 https://www.baidu.com/favicon.ico" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站描述</label>
<div class="layui-input-block">
<input type="text" name="description" placeholder="例如 搜索引擎" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站分类</label>
<label class="layui-form-label">网站分类<span class="required">*</span></label>
<div class="layui-input-block">
<select name="category_id" lay-verify="required" lay-search>
<option ></option>
@@ -62,10 +52,22 @@
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站图标</label>
<div class="layui-input-block">
<input type="url" name="iconurl" lay-verify="url" placeholder="例如 https://www.baidu.com/favicon.ico" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站描述</label>
<div class="layui-input-block">
<input type="text" name="description" placeholder="例如 搜索引擎" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">联系邮箱</label>
<div class="layui-input-block">
<input type="text" name="email" lay-verify="required" placeholder="例如 admin@qq.com" autocomplete="off" class="layui-input">
<input type="text" name="email" placeholder="例如 admin@qq.com" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">

View File

@@ -48,7 +48,7 @@
<span id = "testing_tip" style = "display:none;">测试中...</span>
<span id = "subscribe" style = "display:none;"><?php echo is_subscribe('bool')?'1':'0' ?></span>
<table id="table" class="layui-table" lay-filter="table" style="margin: -3px 0;"></table>
<table id="table" class="layui-table" lay-filter="table" style="margin: 1px 0;"></table>
</div>
</div>
<!-- 操作列 -->

View File

@@ -2,6 +2,22 @@
<body>
<div class="layuimini-container">
<div class="layuimini-main" style=" margin-left: 20px;">
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">
<h4 class="layui-timeline-title">v2.0.28-20230624</h4>
<ul>
<li>[优化] 收录管理允许用户自行设置必填项</li>
<li>[优化] 可添加的链接类型新增wsa和vmrc</li>
<li>[优化] 站点设置中热门网址和最新网址由下拉选项改为直接输入,范围:0-100</li>
<li>[修复] 分类列表无法查看加密分类的bug</li>
<li>[模板] 主页模板 WebStack-Hugo, 修复开启拖拽排序造成悬停提示失效的bug,禁止拖拽查看全部</li>
<li>[模板] 过度模板可能无法设置的bug</li>
<li>[新增] 链接列表添加图标显示 (仅显示自定义图标,未定义时显示ie图标)</li>
<li>[优化] 链接列表排序由前端当前页排序改为后端全局排序</li>
</ul>
</div>
</li>
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">