mirror of
https://github.com/tznb1/TwoNav.git
synced 2025-08-10 08:51:49 +00:00
Compare commits
2 Commits
v2.0.09-20
...
v2.0.11-20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0ef96aba23 | ||
|
|
d1f4530ded |
398
system/ATool.php
Normal file
398
system/ATool.php
Normal file
@@ -0,0 +1,398 @@
|
||||
<?php
|
||||
//管理员应急工具箱
|
||||
error_reporting(E_ALL^E_NOTICE^E_WARNING^E_DEPRECATED);
|
||||
define('DIR',dirname(__DIR__));
|
||||
define('config_path', DIR . '/data/ATool_config.php'); ;
|
||||
|
||||
//判断配置文件是否存在
|
||||
if(is_file(config_path)){
|
||||
require config_path;
|
||||
if(empty($config['key'])){
|
||||
exit('未读取到Key');
|
||||
}
|
||||
require DIR."/system/Msg.php";
|
||||
}else{
|
||||
require DIR.'/system/public.php';
|
||||
Reset_Config();
|
||||
}
|
||||
|
||||
//switch状态
|
||||
if($config['switch'] === 1){
|
||||
|
||||
}else{
|
||||
$msg['title'] = 'ATool未开启';
|
||||
$msg['methodTitle'] = '开启方式:';
|
||||
$msg['content'] = '1. 登录您的云服务器或虚拟主机<br /> 2. 进入TwoNav的程序目录<br /> 3. 编辑 data/ATool_config.php 将"switch" => 0 改为 "switch" => 1 <br /> 4. 复制Key的内容,保存后刷新此页面,使用Key验证即可进入ATool';
|
||||
require DIR.'/templates/admin/other/error.php';
|
||||
exit;
|
||||
}
|
||||
|
||||
session_name('ATool_SSID');
|
||||
session_start();
|
||||
|
||||
if(!empty($_GET['type'])){
|
||||
if($_GET['type'] == 'verify'){
|
||||
if(isset($_SESSION['verify']) && $_SESSION['verify'] === true){
|
||||
msg(-1,'您已经验证过了,无需重复验证!');
|
||||
}else{
|
||||
if(!empty($_POST['Key']) && $_POST['Key'] === md5($config['key'])){
|
||||
$_SESSION['verify'] = true;
|
||||
msg(1,'验证成功');
|
||||
}else{
|
||||
msg(-1,'Key错误');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//判断是否已验证
|
||||
if(isset($_SESSION['verify']) && $_SESSION['verify'] === true){
|
||||
$db = Load_db();
|
||||
$global_config = unserialize( get_db("global_config", "v", ["k" => "o_config"]) );
|
||||
}else{
|
||||
msg(-1,'鉴权失败');
|
||||
}
|
||||
|
||||
if($_GET['type'] == 'logout'){
|
||||
$_SESSION['verify'] = false;
|
||||
Reset_Config();
|
||||
msg(1,'退出成功');
|
||||
}elseif($_GET['type'] == 'user_list'){
|
||||
$query = $_POST['query'];
|
||||
$UserGroup = @$_POST['UserGroup'];
|
||||
$page = empty(intval($_REQUEST['page'])) ? 1 : intval($_REQUEST['page']);
|
||||
$limit = empty(intval($_REQUEST['limit'])) ? 50 : intval($_REQUEST['limit']);
|
||||
$offset = ($page - 1) * $limit; //起始行号
|
||||
//用户组筛选
|
||||
if(!empty($UserGroup)){
|
||||
$where['AND']['UserGroup'] = $UserGroup;
|
||||
}
|
||||
//关键字筛选
|
||||
if(!empty($query)){
|
||||
$where['AND']['OR'] = ["User[~]" => $query,"Email[~]" => $query,"RegIP[~]" => $query];
|
||||
}
|
||||
//统计条数
|
||||
$count = count_db('global_user',$where);
|
||||
//权重排序(数字小的排前面)
|
||||
$where['ORDER']['RegTime'] = 'DESC';
|
||||
//分页
|
||||
$where['LIMIT'] = [$offset,$limit];
|
||||
//查询
|
||||
$datas = select_db('global_user',['ID','User','UserGroup','Email','RegIP','RegTime','Login'],$where);
|
||||
if(!empty($datas)){
|
||||
$user_group = select_db('user_group',['name','code'],'');//读用户组
|
||||
$user_group = array_column($user_group, 'name', 'code');//以代号为键
|
||||
$user_group['root'] = '站长';
|
||||
$user_group['default'] = '默认';
|
||||
foreach ($datas as $key => $data){
|
||||
$datas[$key]['UserGroupName'] = $user_group[$data['UserGroup']]??'Null';
|
||||
}
|
||||
}
|
||||
msgA(['code'=>1,'msg'=>'获取成功','count'=>$count,'data'=>$datas]);
|
||||
}elseif($_GET['type'] == 'set_pwd'){
|
||||
if(!has_db('global_user',['ID'=>$_POST['ID']])){
|
||||
msg(-1,'用户不存在!');
|
||||
}
|
||||
//空字符串md5 防止意外出现空密码
|
||||
if( $_POST['new_pwd']== 'd41d8cd98f00b204e9800998ecf8427e'){
|
||||
msg(-1,'密码不能为空');
|
||||
}
|
||||
$RegTime = get_db('global_user','RegTime',['ID'=>$_POST['ID']]);
|
||||
update_db('global_user',['Password'=>Get_MD5_Password($_POST['new_pwd'],$RegTime)],["ID" => $_POST['ID'] ],[1,'修改成功']);
|
||||
}elseif($_GET['type'] == 'set_root'){
|
||||
update_db('global_user',['UserGroup'=>'root'],["ID" => $_POST['ID'] ],[1,'修改成功']);
|
||||
//设为允许注册
|
||||
}elseif($_GET['type'] == 'set_allow_register'){
|
||||
$global_config['RegOption'] = 1;
|
||||
update_db("global_config", ["v" => $global_config], ["k" => "o_config"],[1,'设置成功']);
|
||||
//关闭维护模式
|
||||
}elseif($_GET['type'] == 'set_close_Maintenance'){
|
||||
$global_config['Maintenance'] = 0;
|
||||
update_db("global_config", ["v" => $global_config], ["k" => "o_config"],[1,'设置成功']);
|
||||
//重置静态路径
|
||||
}elseif($_GET['type'] == 'Set_Libs'){
|
||||
$global_config['Libs'] = "./static";
|
||||
update_db("global_config", ["v" => $global_config], ["k" => "o_config"],[1,'设置成功']);
|
||||
//清理缓存
|
||||
}elseif($_GET['type'] == 'Set_clear_cache'){
|
||||
clearstatcache();
|
||||
if(function_exists("opcache_reset")){
|
||||
opcache_reset(); //清理PHP缓存
|
||||
}
|
||||
msgA(['code'=>1,'msg'=>'操作成功']);
|
||||
}
|
||||
msgA(['code'=>-1,'msg'=>'请求类型错误']);
|
||||
}else{
|
||||
//判断是否已验证
|
||||
if(isset($_SESSION['verify']) && $_SESSION['verify'] === true){
|
||||
$db = Load_db();
|
||||
$global_config = unserialize( get_db("global_config", "v", ["k" => "o_config"]) );
|
||||
echo_Atool();
|
||||
}else{
|
||||
echo_verify();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//载入数据库
|
||||
function Load_db(){
|
||||
require DIR."/data/config.php";
|
||||
require DIR.'/system/Medoo.php';
|
||||
if($db_config['type'] == 'sqlite'){
|
||||
try {
|
||||
$db_config['path'] = DIR."/data/".$db_config['file'];
|
||||
$db = new Medoo\Medoo(['type'=>'sqlite','database'=>$db_config['path']]);
|
||||
}catch (Exception $e) {
|
||||
Amsg(-1,'载入数据库失败'.$db_config['path']);
|
||||
}
|
||||
}elseif($db_config['type'] == 'mysql'){
|
||||
try {
|
||||
$db = new Medoo\Medoo(['type' => 'mysql',
|
||||
'host' => $db_config['host'],
|
||||
'port' => $db_config['port'],
|
||||
'database' => $db_config['name'],
|
||||
'username' => $db_config['user'],
|
||||
'password' => $db_config['password']
|
||||
]);
|
||||
}catch (Exception $e) {
|
||||
Amsg(-1,'链接数据库失败!');
|
||||
}
|
||||
}
|
||||
require DIR.'/system/public.php';
|
||||
return $db;
|
||||
}
|
||||
|
||||
function echo_Atool(){
|
||||
global $global_config;
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>ATool 工具箱</title>
|
||||
<link rel="stylesheet" href="../static/Layui/v2.6.8/css/layui.css">
|
||||
<style>
|
||||
html, body {min-width: 1200px;background-color: #fff;position: relative;}
|
||||
.page-wrapper {width: 900px;margin: 0 auto;padding: 0 15px;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="page-wrapper">
|
||||
<fieldset class="layui-elem-field layui-field-title">
|
||||
<legend> ATool 工具箱 </legend>
|
||||
</fieldset>
|
||||
<div class="layui-btn-container" style="display: inline-block;">
|
||||
<button id="logout" class="layui-btn layui-btn-sm layui-btn-primary"><i class="layui-icon layui-icon-snowflake"></i>安全退出</button>
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" href="../index.php?c=<?php echo $global_config['Login'];?>" target="_blank"><i class="layui-icon layui-icon-username"></i>打开登录页</a>
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" href="../index.php?c=<?php echo $global_config['Register'];?>" target="_blank"><i class="layui-icon layui-icon-add-1"></i>打开注册页</a>
|
||||
<button type="set_allow_register" class="set layui-btn layui-btn-sm layui-btn-primary"><i class="layui-icon layui-icon-set-sm"></i>允许注册</button>
|
||||
<button type="set_close_Maintenance" class="set layui-btn layui-btn-sm layui-btn-primary"><i class="layui-icon layui-icon-set-sm"></i>关闭维护模式</button>
|
||||
<button type="Set_Libs" class="set layui-btn layui-btn-sm layui-btn-primary"><i class="layui-icon layui-icon-set-sm"></i>重置静态路径</button>
|
||||
<button type="Set_clear_cache" class="set layui-btn layui-btn-sm layui-btn-primary"><i class="layui-icon layui-icon-set-sm"></i>清除缓存</button>
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" href="https://gitee.com/tznb/TwoNav/wikis/pages?sort_id=7993451&doc_id=3767990" target="_blank"><i class="layui-icon layui-icon-align-left"></i>帮助</a>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="layui-inline layui-form" style="padding-bottom: 5px;">
|
||||
<div class="layui-input-inline" style=" width: 150px; ">
|
||||
<select id="UserGroup" name="UserGroup" >
|
||||
<option value="" selected>全部</option>
|
||||
<option value="root">站长</option>
|
||||
<option value="default">默认</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline layui-form" style="padding-bottom: 5px;">
|
||||
<label class="layui-form-label layui-hide-sm" style="width:60px;padding-left: 5px;padding-right: 5px;">关键字:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input class="layui-input" name="keyword" id="keyword" placeholder='请输入账号/邮箱/注册IP' value=''autocomplete="off" >
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="layui-inline layui-form" style="padding-bottom: 5px;">
|
||||
<button class="layui-btn layui-btn-normal " id="search" style="height: 36px;">搜索</button>
|
||||
</div>
|
||||
<table id="table" lay-filter="table"></table>
|
||||
</div>
|
||||
<!-- 表格操作列 -->
|
||||
<script type="text/html" id="tablebar">
|
||||
<div class="layui-btn-group">
|
||||
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="set_pwd">改密码</a>
|
||||
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="set_root">设站长</a>
|
||||
</div>
|
||||
</script>
|
||||
<script src="../static/Layui/v2.6.8/layui.js"></script>
|
||||
<script src="../static/jquery/jquery-3.6.0.min.js"></script>
|
||||
<script src="../static/jquery/jquery.md5.js"></script>
|
||||
<script src="../templates/admin/js/public.js?v=<?php echo time();?>"></script>
|
||||
<script>
|
||||
layui.use(['layer','table'], function () {
|
||||
var $ = layui.jquery;
|
||||
var layer = layui.layer;
|
||||
var table = layui.table;
|
||||
var cols = [[
|
||||
{field:'ID',title:'ID',width:60,sort:true}
|
||||
,{title:'操作',toolbar:'#tablebar',width:130}
|
||||
,{field:'User',title:'账号',minWidth:120,templet:function(d){
|
||||
return '<a style="color:#3c78d8" title="打开用户主页" target="_blank" href="../?u='+d.User+'">'+d.User+'</a>'
|
||||
}}
|
||||
,{field:'UserGroupName',title:'用户组',minWidth:90}
|
||||
,{field:'Email',title:'Email',minWidth:170}
|
||||
,{field:'RegIP',title:'注册IP',minWidth:140,templet:function(d){
|
||||
return '<a style="color:#3c78d8" title="查询归属地" target="_blank" href="//ip.rss.ink/result/'+d.RegIP+'">'+d.RegIP+'</a>'
|
||||
}}
|
||||
,{field:'RegTime',title: '注册时间',minWidth:100,templet:function(d){
|
||||
return d.RegTime == null ? '' : timestampToTime(d.RegTime,true);
|
||||
}}
|
||||
]]
|
||||
//用户表渲染
|
||||
table.render({
|
||||
elem: '#table'
|
||||
,height: '500'
|
||||
,url: './ATool.php?type=user_list'
|
||||
,page: true
|
||||
,limit:50
|
||||
,even:true
|
||||
,loading:true
|
||||
,id:'table'
|
||||
,method: 'post'
|
||||
,response: {statusCode: 1 }
|
||||
,cols: cols
|
||||
});
|
||||
//关键字回车
|
||||
$('#keyword').keydown(function (e){if(e.keyCode === 13){search();}});
|
||||
//搜索按钮点击
|
||||
$('#search').on('click', function(){search();});
|
||||
//搜索
|
||||
function search(){
|
||||
var UserGroup = document.getElementById("UserGroup").value;
|
||||
var keyword = document.getElementById("keyword").value;
|
||||
table.reload('table', {
|
||||
url: './ATool.php?type=user_list'
|
||||
,method: 'post'
|
||||
,request: {pageName: 'page',limitName: 'limit'}
|
||||
,where: {query:keyword,UserGroup:UserGroup}
|
||||
,page: {curr: 1}
|
||||
});
|
||||
}
|
||||
//行工具
|
||||
table.on('tool(table)', function (obj) {
|
||||
console.log(obj.data);
|
||||
var data = obj.data;
|
||||
if (obj.event == 'set_pwd') {
|
||||
layer.prompt({formType: 3,value: '',title: '请输入新密码'}, function(value, index, elem){
|
||||
$.post('./ATool.php?type=set_pwd',{ID:data.ID,new_pwd:$.md5(value)},function(data,status){
|
||||
if(data.code == 1) {
|
||||
layer.close(index);
|
||||
layer.msg(data.msg, {icon: 1});
|
||||
}else{
|
||||
layer.msg(data.msg, {icon: 5});
|
||||
}
|
||||
});
|
||||
});
|
||||
}else if(obj.event == 'set_root'){
|
||||
$.post('./ATool.php?type=set_root',{ID:data.ID},function(data,status){
|
||||
if(data.code == 1) {
|
||||
table.reload('table');
|
||||
layer.msg(data.msg, {icon: 1});
|
||||
}else{
|
||||
layer.msg(data.msg, {icon: 5});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
$('.set').click(function () {
|
||||
let type = $(this).attr("type");
|
||||
$.post('./ATool.php?type='+type,function(re,status){
|
||||
if(re.code == 1) {
|
||||
layer.msg(re.msg, {icon: 6,time: 600,end: function() {window.location.reload();return false;}});
|
||||
}else{
|
||||
layer.msg(re.msg, {icon: 5});
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
$('#logout').click(function () {
|
||||
layer.confirm('退出后ATool将被关闭并重置Key',{icon: 3, title:'为了您的站点安全:'}, function(index){
|
||||
$.post('./ATool.php?type=logout',function(re,status){
|
||||
if(re.code == 1) {
|
||||
layer.msg(re.msg, {icon: 6,time: 600,end: function() {window.location.reload();return false;}});
|
||||
}else{
|
||||
layer.msg(re.msg, {icon: 5});
|
||||
}
|
||||
});
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
<?php exit;
|
||||
}
|
||||
|
||||
//输出验证页面
|
||||
function echo_verify(){ ?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>ATool 工具箱</title>
|
||||
<link rel="stylesheet" href="../static/Layui/v2.6.8/css/layui.css">
|
||||
<link rel="stylesheet" href="../static/Other/login.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="main-body">
|
||||
<div class="login-main">
|
||||
<div class="login-top">
|
||||
<span>ATool 工具箱</span>
|
||||
<span class="bg1"></span>
|
||||
<span class="bg2"></span>
|
||||
</div>
|
||||
<form class="layui-form login-bottom">
|
||||
<div class="center">
|
||||
<div class="item">
|
||||
<span class="icon icon-3"></span>
|
||||
<input type="password" name="Key" lay-verify="required" placeholder="请输入Key">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" style="text-align:center; width:100%;height:100%;margin:0px;">
|
||||
<button class="login-btn" lay-submit="" lay-filter="verify">验证</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<script src = "../static/jquery/jquery-3.6.0.min.js"></script>
|
||||
<script src = "../static/Layui/v2.6.8/layui.js"></script>
|
||||
<script src = '../static/jquery/jquery.md5.js'></script>
|
||||
<script>
|
||||
layui.use(['form','jquery'], function () {
|
||||
var form = layui.form,layer = layui.layer;
|
||||
form.on('submit(verify)', function (data) {
|
||||
data.field.Key = $.md5(data.field.Key);
|
||||
$.post('./ATool.php?type=verify',data.field,function(re,status){
|
||||
if(re.code == 1) {
|
||||
layer.msg(re.msg, {icon: 6,time: 600,end: function() {window.location.reload();return false;}});
|
||||
}else{
|
||||
layer.msg(re.msg, {icon: 5});
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
<?php exit;
|
||||
}
|
||||
|
||||
function Reset_Config(){
|
||||
clearstatcache();
|
||||
if(function_exists("opcache_reset")){
|
||||
opcache_reset(); //清理PHP缓存
|
||||
}
|
||||
$text = '<?php $config = array( "key" => "'.Get_Rand_Str(32).'", "switch" => 0 );?>';
|
||||
if(!file_put_contents(config_path,$text)) {
|
||||
exit('写初始配置失败,请检查data目录权限');
|
||||
}
|
||||
}
|
||||
@@ -846,6 +846,9 @@ function write_site_setting(){
|
||||
'link_model'=>['v'=>['direct','Privacy','Privacy_js','Privacy_meta','301','302','Transition'],'msg'=>'链接模式参数错误'],
|
||||
'link_icon'=>['int'=>true,'min'=>0,'max'=>6,'msg'=>'链接图标参数错误'],
|
||||
'site_icon'=>['empty'=>true],
|
||||
'top_link'=>['int'=>true,'min'=>0,'max'=>20,'msg'=>'热门链接参数错误'],
|
||||
'new_link'=>['int'=>true,'min'=>0,'max'=>20,'msg'=>'最新链接参数错误'],
|
||||
'max_link'=>['int'=>true,'min'=>0,'max'=>100,'msg'=>'输出上限参数错误'],
|
||||
'custom_header'=>['empty'=>true],
|
||||
'custom_footer'=>['empty'=>true]
|
||||
];
|
||||
@@ -865,6 +868,7 @@ function write_site_setting(){
|
||||
//留空时尝试删除图标
|
||||
if(empty($s_site['site_icon']) && !empty($site['site_icon_file']) && is_file($site['site_icon_file'])){
|
||||
@unlink($site['site_icon_file']);
|
||||
$s_site['site_icon_file'] = '';
|
||||
}
|
||||
update_db("user_config",["v"=>$s_site],["k"=>'s_site',"uid"=>UID],[1,'保存成功']);
|
||||
}
|
||||
|
||||
@@ -422,6 +422,9 @@ function write_regcode(){
|
||||
}elseif($_GET['type'] == 'set'){
|
||||
write_global_config('reg_tips',$_POST['content'],'注册提示');
|
||||
msg(1,'保存成功');
|
||||
}elseif($_GET['type'] == 'del'){
|
||||
delete_db("regcode_list",[ "id" => json_decode($_POST['id'])]);
|
||||
msg(1,'删除成功');
|
||||
}
|
||||
|
||||
msg(-1,'无效的请求类型');
|
||||
|
||||
@@ -50,7 +50,7 @@ $theme_config_db = unserialize($theme_config_db);
|
||||
$theme_config = empty($theme_config_db) ? $theme_config : array_merge ($theme_config,$theme_config_db);
|
||||
//主题版本(调试时追加时间戳)
|
||||
$theme_ver = !Debug?$theme_info['version']:$theme_info['version'].'.'.time();
|
||||
|
||||
$site['ex_theme'] = in_array($theme,['snail-nav','heimdall']); //例外主题,不支持热门网址/最新网址/输出上限
|
||||
//分类查找条件
|
||||
$categorys = []; //声明一个空数组
|
||||
$content = ['cid(id)','name','property','font_icon','icon','description'];//需要的内容
|
||||
@@ -70,6 +70,10 @@ $fid_s = array_column($fid_s,null,'cid');
|
||||
//根据分类ID查询二级分类
|
||||
function get_category_sub($id) {
|
||||
global $site,$share,$data;
|
||||
//禁止搜索非数字
|
||||
if(intval($id) == 0){
|
||||
return;
|
||||
}
|
||||
//书签分享>限定范围内的分类ID
|
||||
if(!empty($share)){
|
||||
$where['cid'] = $data;
|
||||
@@ -92,7 +96,7 @@ function get_category_sub($id) {
|
||||
|
||||
//根据分类id查找链接
|
||||
function get_links($fid) {
|
||||
global $site,$fid_s,$share,$data;
|
||||
global $site,$fid_s,$share,$data,$u;
|
||||
$where = [];
|
||||
$where = ["uid"=> UID];
|
||||
$where['fid'] = intval($fid);
|
||||
@@ -101,6 +105,7 @@ function get_links($fid) {
|
||||
$where['ORDER']['lid'] = 'ASC';
|
||||
if(!is_login){
|
||||
$where['property'] = 0;
|
||||
|
||||
}
|
||||
//书签分享>私有可见
|
||||
if(isset($share['pv']) && $share['pv'] == 1){
|
||||
@@ -111,8 +116,29 @@ function get_links($fid) {
|
||||
$where['lid'] = $data;
|
||||
unset($where['fid']);
|
||||
}
|
||||
|
||||
//虚拟分类,根据特定条件查找
|
||||
if($fid == 'top_link' || $fid == 'new_link' ){
|
||||
unset($where['ORDER']);
|
||||
if(!is_login) {
|
||||
$where['fid'] = get_open_category();
|
||||
}else{
|
||||
unset($where['fid']);
|
||||
}
|
||||
if($fid == 'top_link'){
|
||||
$where['ORDER']['click'] = 'DESC';
|
||||
$where['LIMIT'] = $site['top_link'];
|
||||
}elseif($fid == 'new_link'){
|
||||
$where['ORDER']['add_time'] = 'DESC';
|
||||
$where['LIMIT'] = $site['new_link'];
|
||||
}
|
||||
$where['ORDER']['lid'] = 'DESC';
|
||||
//输出上限&不在子页面&例外主题
|
||||
}elseif($site['max_link'] > 0 && empty(Get('oc')) && !$site['ex_theme']){
|
||||
$count = count_db('user_links',$where);
|
||||
$where['LIMIT'] = $site['max_link'];
|
||||
}
|
||||
$links = select_db('user_links',['lid(id)','fid','property','title','url(real_url)','url_standby','description','icon','click','pid'],$where);
|
||||
//var_dump($fid_s);exit;
|
||||
foreach ($links as $key => $link) {
|
||||
$click = false; $lock = false;
|
||||
|
||||
@@ -147,6 +173,11 @@ function get_links($fid) {
|
||||
//获取图标链接
|
||||
$links[$key]['ico'] = $lock ? $GLOBALS['libs'].'/Other/lock.svg' : geticourl($site['link_icon'],$link);
|
||||
}
|
||||
if($site['max_link'] > 0 && $count > $site['max_link'] && empty(Get('oc')) && !$site['ex_theme']){
|
||||
$oc_url = "./index.php?u={$u}&oc={$fid}" . (empty($_GET['theme']) ? '':"&theme={$_GET['theme']}");
|
||||
array_push($links,['id'=>0,'title'=>'查看全部','url'=>$oc_url,'real_url'=>$oc_url,'description'=>'该分类共有'.$count.'条数据','ico'=>'./favicon.ico']);
|
||||
}
|
||||
|
||||
return $links;
|
||||
}
|
||||
|
||||
@@ -204,17 +235,38 @@ if($category_parent == []){
|
||||
$categorys = array_merge ($categorys,$category_subitem);
|
||||
}
|
||||
}
|
||||
//书签分享/例外主题禁止热门和最新
|
||||
if(empty($_GET['share']) && !$site['ex_theme']){
|
||||
//非指定分类页面
|
||||
if(empty(Get('oc'))){
|
||||
//热门链接
|
||||
if($site['top_link'] > 0){
|
||||
$top_link = ['name' => "热门网址","font_icon" =>"fa fa-bookmark-o" , "id" => 'top_link' ,"description" => ""];
|
||||
array_unshift($category_parent,$top_link);
|
||||
array_unshift($categorys,$top_link);
|
||||
}
|
||||
//最新链接
|
||||
if($site['new_link'] > 0){
|
||||
$new_link = ['name' => "最新网址","font_icon" =>"fa fa-bookmark-o" , "id" => 'new_link' ,"description" => ""];
|
||||
array_unshift($category_parent,$new_link);
|
||||
array_unshift($categorys,$new_link);
|
||||
}
|
||||
}else{
|
||||
unset($where['fid']);
|
||||
$where['cid'] = Get('oc');
|
||||
$categorys = select_db('user_categorys',$content,$where);
|
||||
$category_parent = $categorys;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//访问统计
|
||||
write_user_count(date('Ym'),'index_Ym');
|
||||
write_user_count(date('Ymd'),'index_Ymd');
|
||||
//var_dump($site);
|
||||
//var_dump(is_login);
|
||||
//var_dump($theme_info);
|
||||
//var_dump($categorys);
|
||||
|
||||
//载入模板
|
||||
require($index_path);
|
||||
|
||||
//辅助函数
|
||||
//取分类图标(六零系主题在用)
|
||||
function get_category($content){
|
||||
if(empty($content)){
|
||||
return '';
|
||||
@@ -225,7 +277,17 @@ function get_category($content){
|
||||
return $content;
|
||||
}
|
||||
}
|
||||
|
||||
//获取公开分类(返回数组cid)
|
||||
function get_open_category(){
|
||||
$where['uid'] = UID;
|
||||
$where['fid'] = 0;
|
||||
$where['status'] = 1;
|
||||
$where['property'] = 0;
|
||||
$categorys = select_db('user_categorys','cid',$where);
|
||||
$where['fid'] = $categorys;
|
||||
$categorys = array_merge ($categorys,select_db('user_categorys','cid',$where));
|
||||
return $categorys;
|
||||
}
|
||||
//获取图标URL
|
||||
function geticourl($icon,$link){
|
||||
if( !empty( $link['icon']) ){
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
if(!defined('DIR')){header('HTTP/1.1 404 Not Found');header("status: 404 Not Found");exit;}
|
||||
|
||||
//初始化
|
||||
session_name('TwoNav_initial');
|
||||
session_start();
|
||||
|
||||
//判断请求类型
|
||||
|
||||
@@ -1 +1 @@
|
||||
v2.0.09-20230410
|
||||
v2.0.11-20230414
|
||||
@@ -35,13 +35,16 @@ function _GET(letiable,top = false){
|
||||
return false;
|
||||
}
|
||||
//时间戳格式化
|
||||
function timestampToTime(timestamp) {
|
||||
function timestampToTime(timestamp,ymd = false) {
|
||||
let date = new Date(timestamp * 1000);
|
||||
let y = date.getFullYear();
|
||||
let m = date.getMonth() + 1;
|
||||
m = m < 10 ? ('0' + m) : m;
|
||||
let d = date.getDate();
|
||||
d = d < 10 ? ('0' + d) : d;
|
||||
if(ymd){
|
||||
return y + '-' + m + '-' + d;
|
||||
}
|
||||
let h = date.getHours();
|
||||
h = h < 10 ? ('0' + h) : h;
|
||||
let minute = date.getMinutes();
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
<div class="content">
|
||||
<p class="result"><?php echo $msg['big_title'] ??''; ?></p>
|
||||
<div class="method">
|
||||
<p class="methodTitle">可能原因:</p>
|
||||
<p class="methodTitle"><?php echo $msg['methodTitle'] ??'可能原因:'; ?></p>
|
||||
<div class="methodItems">
|
||||
<?php echo $msg['content']; ?>
|
||||
</div>
|
||||
|
||||
@@ -67,6 +67,42 @@
|
||||
<div class="layui-form-mid layui-word-aux">所有API接口均由其他大佬提供!若有异常请尝试更换接口!</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<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>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">在主页显示热门网址(点击排行)</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">最新网址</label>
|
||||
<div class="layui-input-inline" >
|
||||
<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>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">在主页显示最新的网址(创建时间)</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">输出上限</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="number" name="max_link" class="layui-input" value="0" placeholder="输入范围: 0-100" lay-verify="required">
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">限制每个分类下显示多少链接,0表示不限制</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">站点图标</label>
|
||||
<div class="layui-input-block">
|
||||
@@ -97,14 +133,18 @@
|
||||
<?php } ?>
|
||||
<div class="layui-form-item">
|
||||
<button class="layui-btn layui-btn-primary layui-border-black" id="help" sort_id="7968924">帮助</button>
|
||||
<?php if($global_config['Default_User'] != U ){ ?>
|
||||
<button class="layui-btn layui-btn-primary layui-border-black" id="sdhp" data=>设为默认主页</button>
|
||||
<?php } ?>
|
||||
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="save">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<script src = "<?php echo $libs;?>/jquery/jquery-3.6.0.min.js"></script>
|
||||
<script src = "./templates/admin/js/public.js?v=<?php echo $Ver;?>"></script>
|
||||
<script src="<?php echo $libs;?>/jquery/jquery-3.6.0.min.js"></script>
|
||||
<script src="<?php echo $libs;?>/jquery/jQueryCookie.js"></script>
|
||||
<script src="./templates/admin/js/public.js?v=<?php echo $Ver;?>"></script>
|
||||
<?php load_static('js.layui');?>
|
||||
<script>
|
||||
layui.use(['jquery','form','upload'], function () {
|
||||
@@ -136,6 +176,18 @@ layui.use(['jquery','form','upload'], function () {
|
||||
layer.msg("权限不足", {icon: 2});
|
||||
});
|
||||
|
||||
$("#sdhp").text( getCookie("Default_User") == u ? '取消默认主页' : '设为默认主页')
|
||||
$('#sdhp').click(function () {
|
||||
if(getCookie("Default_User") == u){
|
||||
$.removeCookie("Default_User");
|
||||
$("#sdhp").text('设为默认主页')
|
||||
}else{
|
||||
$.cookie("Default_User",u);
|
||||
$("#sdhp").text('取消默认主页')
|
||||
}
|
||||
layer.msg("设置成功", {icon: 1});
|
||||
return false;
|
||||
});
|
||||
//监听提交
|
||||
form.on('submit(save)', function (data) {
|
||||
$.post('./index.php?c=api&method=write_site_setting&u='+u,data.field,function(data,status){
|
||||
|
||||
@@ -250,11 +250,12 @@ require 'header.php';
|
||||
<?php }?>
|
||||
<tr>
|
||||
<td>用户交流</td>
|
||||
<td>QQ群:695720839</td>
|
||||
<td><a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=LaIzFK2hfTYBZGR0cKvW3xZL6aNgcSXH&jump_from=webapi&authKey=LHh1NtAiGdK0wNyoZiHWrzAZTWWq26YgAwX0Ak7rBWchh6Y5ocUX/0cCXLMXvq/k" title="TwoNav - 技术交流">QQ群:695720839</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>技术支持</td>
|
||||
<td>QQ:271152681</td>
|
||||
<td><a target="_blank" href="tencent://message/?uin=271152681">QQ:271152681</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>专属地址</td>
|
||||
|
||||
@@ -16,6 +16,7 @@ $user_groups = select_db('user_group',['id','code','name'],'');
|
||||
<script type="text/html" id="toolbar">
|
||||
<div class="layui-btn-group" >
|
||||
<button class="layui-btn layui-btn-sm" lay-event="generate">生成注册码</button>
|
||||
<button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="del">删除</button>
|
||||
<button class="layui-btn layui-btn-sm" lay-event="refresh">刷新</button>
|
||||
<button class="layui-btn layui-btn-sm" lay-event="set">设置</button>
|
||||
</div>
|
||||
@@ -81,7 +82,8 @@ layui.use(['table','layer','form'], function(){
|
||||
|
||||
|
||||
var cols=[[ //表头
|
||||
{field:'id',title:'id',width:80,sort:true}
|
||||
{type:'checkbox'}
|
||||
,{field:'id',title:'id',width:80,sort:true}
|
||||
,{field:'regcode',title:'注册码',width:120,sort:true}
|
||||
,{field:'UserGroupName',title:'用户组',width:120,sort:true}
|
||||
,{field:'url',title:'注册链接',minWidth:400,sort:true,templet:function(d){
|
||||
@@ -152,6 +154,25 @@ layui.use(['table','layer','form'], function(){
|
||||
content: $('.Set')
|
||||
});
|
||||
break;
|
||||
case 'del':
|
||||
if( checkStatus.data.length == 0 && ['LAYTABLE_COLS','LAYTABLE_EXPORT','LAYTABLE_PRINT'].indexOf(obj.event) == -1 ) {
|
||||
layer.msg('未选中任何数据!');
|
||||
return;
|
||||
}
|
||||
layer.confirm('确认删除?',{icon: 3, title:'温馨提示'}, function(index){
|
||||
tableIds = checkStatus.data.map(function (value) {return value.id;});
|
||||
tableIds = JSON.stringify(tableIds);
|
||||
$.post(get_api('write_regcode','del') ,{"id":tableIds},function(data,status){
|
||||
if(data.code == 1){
|
||||
table.reload('table');
|
||||
layer.msg(data.msg, {icon: 1});
|
||||
}else{
|
||||
layer.msg(data.msg, {icon: 5});
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
break;
|
||||
};
|
||||
});
|
||||
//自定义表单验证
|
||||
|
||||
@@ -2,6 +2,29 @@
|
||||
<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.11-20230414</h4>
|
||||
<ul>
|
||||
<li>修复热门网址/最新网址的一些问题</li>
|
||||
<li>新增Atool工具 (应急工具),用于强行修改密码/配置等 <a href="https://gitee.com/tznb/TwoNav/wikis/pages?sort_id=7993451&doc_id=3767990" target="_blank">使用说明</a></li>
|
||||
<li>调整安装脚本session_name避免与其他面板冲突(如小皮面板,造成安装提示无法满足)</li>
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
<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.10-20230413</h4>
|
||||
<ul>
|
||||
<li>支持删除注册管理生成的注册码</li>
|
||||
<li>站点设置增加设为默认用户按钮(储存在浏览器Cookie,不影响其他用户)</li>
|
||||
<li>站点设置增加热门链接/最新链接/输出上限</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">
|
||||
|
||||
Reference in New Issue
Block a user