v2.0.12-20230417

This commit is contained in:
MI15\Win
2023-04-17 16:26:10 +08:00
parent 0ef96aba23
commit fa292ba2ab
22 changed files with 506 additions and 126 deletions

View File

@@ -22,7 +22,8 @@ if($db_config['type'] == 'sqlite'){
'port' => $db_config['port'],
'database' => $db_config['name'],
'username' => $db_config['user'],
'password' => $db_config['password']
'password' => $db_config['password'],
'charset' => 'utf8mb4'
]);
}catch (Exception $e) {
Amsg(-1,'链接数据库失败!');

28
system/MySQL/20230417.php Normal file
View File

@@ -0,0 +1,28 @@
<?php if(!defined('DIR')){header('HTTP/1.1 404 Not Found');header("status: 404 Not Found");exit;}
$sql ="
ALTER DATABASE {$GLOBALS['db_config']['name']} DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE global_config CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE global_user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE purview_list CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE regcode_list CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE updatadb_logs CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE user_apply CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE user_categorys CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE user_config CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE user_count CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE user_group CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE user_links CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE user_log CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE user_login_info CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE user_pwd_group CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE user_share CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
INSERT INTO `purview_list` (`code`, `name`, `description`) VALUES
('link_extend', '链接扩展', '允许使用链接扩展字段'),
('theme_in', '主题设置', '后台显示主题设置菜单'),
('theme_set', '主题配置', '允许自定义主题配置');
";
if(exe_sql($sql)){
insert_db('updatadb_logs',['file_name'=>$file_name,'update_time'=>time(),'status'=>'TRUE','extra'=>'']);
}else{
msg(-1,'数据库更新失败');
}

View File

@@ -5,7 +5,7 @@ CREATE TABLE IF NOT EXISTS `global_config` (
`v` text NOT NULL COMMENT '',
`d` varchar(32) DEFAULT '' COMMENT '描述',
UNIQUE KEY `k` (`k`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 用户配置
DROP TABLE IF EXISTS `user_config`;
@@ -17,7 +17,7 @@ CREATE TABLE IF NOT EXISTS `user_config` (
`t` varchar(32) NOT NULL COMMENT '类型',
`d` varchar(32) DEFAULT '' COMMENT '描述',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
-- 统计
@@ -27,7 +27,7 @@ CREATE TABLE IF NOT EXISTS `user_count` (
`k` varchar(32) NOT NULL COMMENT '',
`v` bigint(10) UNSIGNED DEFAULT '0' COMMENT '',
`t` varchar(32) NOT NULL COMMENT '类型'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 数据库升级记录
@@ -40,8 +40,9 @@ CREATE TABLE IF NOT EXISTS `updatadb_logs` (
`extra` varchar(512) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `file_name` (`file_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
INSERT INTO "updatadb_logs" ("id", "file_name", "update_time", "status", "extra") VALUES ('1', '20230417.php', '1681719049', 'TRUE', '');
-- 创建用户表
DROP TABLE IF EXISTS `global_user`;
@@ -64,7 +65,7 @@ CREATE TABLE IF NOT EXISTS `global_user` (
PRIMARY KEY (`ID`),
UNIQUE KEY `User` (`User`),
UNIQUE KEY `Email` (`Email`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
-- 用户分类表
DROP TABLE IF EXISTS `user_categorys`;
@@ -85,7 +86,7 @@ CREATE TABLE IF NOT EXISTS `user_categorys` (
`icon` text NOT NULL DEFAULT '' COMMENT '个性图标',
`extend` text NOT NULL COMMENT '扩展',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户分类';
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户分类';
INSERT INTO `user_categorys` (`id`, `cid`, `fid`, `uid`, `pid`, `status`, `property`, `name`, `add_time`, `up_time`, `weight`, `description`, `font_icon`, `icon`, `extend`) VALUES
(1, 1, 0, 0, 0, 1, 0, '默认分类', 1672502400, 1672502400, 0, 'TwoNav默认分类', 'fa fa-book', '', '');
@@ -112,7 +113,7 @@ CREATE TABLE IF NOT EXISTS `user_links` (
`up_time` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '修改时间',
`extend` text NOT NULL COMMENT '扩展',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户链接';
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户链接';
INSERT INTO `user_links` (`id`, `lid`, `uid`, `fid`, `pid`, `status`, `property`, `title`, `url`, `url_standby`, `weight`, `description`, `icon`, `click`, `add_time`, `up_time`, `extend`) VALUES
@@ -134,7 +135,7 @@ CREATE TABLE IF NOT EXISTS `user_login_info` (
`expire_time` int(10) UNSIGNED NOT NULL COMMENT '过期时间',
`cookie_key` varchar(32) NOT NULL COMMENT 'cookie_key',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
-- 日志表
DROP TABLE IF EXISTS `user_log`;
@@ -148,7 +149,7 @@ CREATE TABLE IF NOT EXISTS `user_log` (
`content` text NOT NULL COMMENT '请求内容',
`description` varchar(128) NOT NULL COMMENT '描述',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='日志';
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='日志';
-- 用户组
DROP TABLE IF EXISTS `user_group`;
@@ -162,7 +163,7 @@ CREATE TABLE IF NOT EXISTS `user_group` (
`codes` text NOT NULL COMMENT '允许代号',
PRIMARY KEY (`id`),
UNIQUE KEY `code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 权限列表
DROP TABLE IF EXISTS `purview_list`;
@@ -172,7 +173,7 @@ CREATE TABLE IF NOT EXISTS `purview_list` (
`name` varchar(64) NOT NULL COMMENT '名称',
`description` varchar(128) NOT NULL COMMENT '描述',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `purview_list` (`code`, `name`, `description`) VALUES
('Upload_icon', '上传图标', '允许上传分类和链接图标'),
@@ -185,7 +186,10 @@ INSERT INTO `purview_list` (`code`, `name`, `description`) VALUES
('link', '链接管理', '允许添加/编辑/删除链接(未勾选时只读)'),
('apply', '收录管理', '允许使用收录功能'),
('link_pwd', '加密管理', '允许使用加密管理(未勾选时只读)'),
('guestbook', '留言板', '允许使用留言板功能');
('guestbook', '留言板', '允许使用留言板功能'),
('link_extend', '链接扩展', '允许使用链接扩展字段'),
('theme_in', '主题设置', '后台显示主题设置菜单'),
('theme_set', '主题配置', '允许自定义主题配置');
-- 注册码列表
DROP TABLE IF EXISTS `regcode_list`;
@@ -199,7 +203,7 @@ CREATE TABLE IF NOT EXISTS `regcode_list` (
`use_time` int(10) UNSIGNED NOT NULL COMMENT '使用时间',
PRIMARY KEY (`id`),
UNIQUE KEY `regcode` (`regcode`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 加密分组
DROP TABLE IF EXISTS `user_pwd_group`;
@@ -212,7 +216,7 @@ CREATE TABLE IF NOT EXISTS `user_pwd_group` (
`description` varchar(128) NOT NULL DEFAULT '' COMMENT '描述',
`display` int(1) UNSIGNED NOT NULL DEFAULT '1' COMMENT '主页显示',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 收录申请
DROP TABLE IF EXISTS `user_apply`;
@@ -231,7 +235,7 @@ CREATE TABLE IF NOT EXISTS `user_apply` (
`category_name` varchar(512) NOT NULL DEFAULT '' COMMENT '分类名',
`description` varchar(512) NOT NULL DEFAULT '' COMMENT '描述',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 书签分享
DROP TABLE IF EXISTS `user_share`;
@@ -250,5 +254,5 @@ CREATE TABLE IF NOT EXISTS `user_share` (
`data` text NOT NULL COMMENT '数据',
`pv` int(1) NOT NULL COMMENT '私有可见',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

View File

@@ -0,0 +1,12 @@
<?php if(!defined('DIR')){header('HTTP/1.1 404 Not Found');header("status: 404 Not Found");exit;}
$sql =<<<EOF
INSERT INTO `purview_list` (`code`, `name`, `description`) VALUES
('link_extend', '链接扩展', '允许使用链接扩展字段'),
('theme_in', '主题设置', '后台显示主题设置菜单'),
('theme_set', '主题配置', '允许自定义主题配置');
EOF;
if(exe_sql($sql)){
insert_db('updatadb_logs',['file_name'=>$file_name,'update_time'=>time(),'status'=>'TRUE','extra'=>'']);
}else{
msg(-1,'数据库更新失败');
}

View File

@@ -35,6 +35,7 @@ CREATE TABLE IF NOT EXISTS "updatadb_logs" (
"extra" TEXT(512) NOT NULL DEFAULT "",
CONSTRAINT "file_name" UNIQUE ("file_name" ASC)
);
INSERT INTO "updatadb_logs" ("id", "file_name", "update_time", "status", "extra") VALUES ('1', '20230417.php', '1681719049', 'TRUE', '');
-- 创建用户表
CREATE TABLE IF NOT EXISTS "global_user" (
@@ -158,7 +159,10 @@ INSERT INTO `purview_list` (`code`, `name`, `description`) VALUES
('link', '链接管理', '允许添加/编辑/删除链接(未勾选时只读)'),
('apply', '收录管理', '允许使用收录功能'),
('link_pwd', '加密管理', '允许使用加密管理(未勾选时只读)'),
('guestbook', '留言板', '允许使用留言板功能');
('guestbook', '留言板', '允许使用留言板功能'),
('link_extend', '链接扩展', '允许使用链接扩展字段'),
('theme_in', '主题设置', '后台显示主题设置菜单'),
('theme_set', '主题配置', '允许自定义主题配置');
-- 注册码列表
CREATE TABLE IF NOT EXISTS "regcode_list" (

View File

@@ -197,9 +197,14 @@ if( $page == 'theme_home' || $page == 'theme_login' || $page == 'theme_transit'
//菜单接口
if ($page == 'menu') {
$menu = array(
['title'=>'站点设置','href'=>'SiteSetting','icon'=>'fa fa-cog'],
['title'=>'主题设置','href'=>'theme_home','icon'=>'fa fa-magic'],
$menu = [];
if(check_purview('site_info',1)){
array_push($menu,['title'=>'站点设置','href'=>'SiteSetting','icon'=>'fa fa-cog']);
}
if(check_purview('theme_in',1)){
array_push($menu,['title'=>'主题设置','href'=>'theme_home','icon'=>'fa fa-magic']);
}
array_push($menu,
['title'=>'分类管理','href'=>'category_list','icon'=>'fa fa-list-ul'],
['title'=>'加密管理','href'=>'pwd_group','icon'=>'fa fa-lock'],
['title'=>'链接管理','icon'=>'fa fa-folder-open-o','href'=>'','child'=>

View File

@@ -282,6 +282,18 @@ function write_category(){
//读链接列表
function read_link_list(){
if($_GET['type'] == 'extend_list'){
if($GLOBALS['global_config']['link_extend'] != 1 || !check_purview('link_extend',1)){
msgA(['code'=>1,'msg'=>'无权限','count'=>0,'data'=>[]]);
}
$list = get_db("user_config","v",["k"=>"s_extend_list","uid"=>UID]);
if(empty($list)){
msgA(['code'=>1,'msg'=>'无数据','count'=>0,'data'=>[]]);
}
$list = unserialize($list);
msgA(['code'=>1,'msg'=>'获取成功','count'=>count($list),'data'=>$list]);
}
$query = $_POST['query'];
$fid = intval(@$_POST['fid']); //获取分类ID
$page = empty(intval($_REQUEST['page'])) ? 1 : intval($_REQUEST['page']);
@@ -541,6 +553,22 @@ function write_link(){
'icon' => $icon
];
//扩展字段
if($GLOBALS['global_config']['link_extend'] == 1 && check_purview('link_extend',1)){
$list = get_db("user_config","v",["k"=>"s_extend_list","uid"=>UID]);
if(!empty($list)){
$list = unserialize($list);
$extend = [];
foreach($list as $field){
$name = "_{$field['name']}";
if(isset($_POST[$name])){
$data['extend'][$name] = $_POST[$name];
}
}
}
}
//非必须参数,未传递参数时
if(isset($_POST['icon'])){
//指定本地图标时检测是否存在
@@ -641,12 +669,86 @@ function write_link(){
if(empty($fid)){msg(-1,'分类ID错误');}
//加一个查找分类是否存在
update_db('user_links',['fid'=>$fid],['uid'=>UID ,"lid" => json_decode($_POST['lid']) ],[1,'设置成功']);
}
//图标拉取(不完善,未开放使用)
}elseif($_GET['type'] === 'icon_pull'){
$link = get_db('user_links','url',['uid'=>UID,'lid'=>$_POST['id']]);
if(empty($link)){
msg(-1,'请求的链接id不存在');
}
$s_site = unserialize(get_db("user_config","v",["k"=>"s_site","uid"=>UID]));
if(empty($s_site['link_icon']) || $s_site['link_icon'] == 0){
msg(-1,'站点设置链接图标不能是离线图标!请先修改配置!');
}
$icon = $s_site['link_icon'];
if($icon ==2){
function base64($url){
$urls = parse_url($url);
$scheme = empty( $urls['scheme'] ) ? 'http://' : $urls['scheme'].'://'; //获取请求协议
$host = $urls['host']; //获取主机名
$port = empty( $urls['port'] ) ? '' : ':'.$urls['port']; //获取端口
$new_url = $scheme.$host.$port;
return base64_encode($new_url);
}
$api = 'https://favicon.rss.ink/v1/'.base64($link);
}elseif($icon ==4){
$api = 'https://api.15777.cn/get.php?url='.$link;
}elseif($icon ==5){
$api = 'https://favicon.cccyun.cc/'.$link;
}elseif($icon ==6){
$api = 'https://api.iowen.cn/favicon/'.parse_url($link)['host'].'.png';
}elseif($icon ==7){
$api = 'https://toolb.cn/favicon/'.parse_url($link)['host'];
}
if(downFile($api,$_POST['id'].'.ico',DIR ."/data/user/".U."/favicon/")){
update_db('user_links',['icon'=>"./data/user/".U.'/favicon/'.$_POST['id'].'.ico'],['uid'=>UID ,"lid" => $_POST['id'] ],[1,'获取成功']);
}
msg(-1,'获取失败');
}elseif($_GET['type'] == 'extend_list'){
if($GLOBALS['global_config']['link_extend'] != 1 ||!check_purview('link_extend',1)){
msg(-1,'无权限');
}
$lists = json_decode($_POST['list'],true);
$weight = [];
foreach ($lists as $data ){
if(empty($data['weight']) || !preg_match('/^\d$/', $data['weight'])){
msgA( ['code' => -1,'msg' => '序号错误,请输入正整数'] );
}
if(empty($data['title']) || check_xss($data['title'])){
msgA( ['code' => -1,'msg' => '标题不能为空'] );
}
if(empty($data['name']) || check_xss($data['name']) || !preg_match('/^[A-Za-z0-9]{3,18}$/',$data['name'])){
msgA( ['code' => -1,'msg' => '字段名错误,请输入长度3-18的字母/数字'] );
}
if(!in_array($data['type'],['text','textarea'])){
msgA( ['code' => -1,'msg' => '类型错误'] );
}
}
if(is_Duplicated($lists,'weight')){
msg(-1,'序号不能重复');
}elseif(is_Duplicated($lists,'title')){
msg(-1,'标题不能重复');
}elseif(is_Duplicated($lists,'name')){
msg(-1,'字段名不能重复');
}
$datas = [];
foreach ($lists as $key => $data ){
array_push($datas,['title'=>$data['title'],'name'=>$data['name'],'weight'=>$data['weight'],'type'=>$data['type'],'default'=> "{$data['default']}"]);
}
//根据序号排序
usort($datas, function($a, $b) {
return $a['weight'] - $b['weight'];
});
write_user_config('s_extend_list',$datas,'config','链接扩展字段');
msgA( ['code' => 1,'msg' => '保存成功','datas'=>$datas] );
}
msg(-1,'操作类型错误');
}
//写安全设置
function write_security_setting(){
global $USER_DB;
@@ -844,7 +946,7 @@ function write_site_setting(){
'keywords'=>['empty'=>true],
'description'=>['empty'=>true],
'link_model'=>['v'=>['direct','Privacy','Privacy_js','Privacy_meta','301','302','Transition'],'msg'=>'链接模式参数错误'],
'link_icon'=>['int'=>true,'min'=>0,'max'=>6,'msg'=>'链接图标参数错误'],
'link_icon'=>['int'=>true,'min'=>0,'max'=>10,'msg'=>'链接图标参数错误'],
'site_icon'=>['empty'=>true],
'top_link'=>['int'=>true,'min'=>0,'max'=>20,'msg'=>'热门链接参数错误'],
'new_link'=>['int'=>true,'min'=>0,'max'=>20,'msg'=>'最新链接参数错误'],
@@ -1123,6 +1225,9 @@ function write_theme(){
//配置主题信息
}elseif($_GET['type'] == 'config'){
if(!check_purview('theme_set',1)){
msg(-1,"无权限!");
}
if(empty($_POST)){
msg(-1,"POST请求数据不能为空");
}

View File

@@ -505,6 +505,7 @@ function write_sys_settings(){
//扩展功能-(全局开关)
'apply'=>['int'=>true,'min'=>0,'max'=>1,'msg'=>'收录管理参数错误'],
'guestbook'=>['int'=>true,'min'=>0,'max'=>1,'msg'=>'留言管理参数错误'],
'link_extend'=>['int'=>true,'min'=>0,'max'=>1,'msg'=>'链接扩展参数错误'],
];
$o_config = [];
foreach ($datas as $key => $data){

View File

@@ -18,7 +18,7 @@ if(empty($link)){
//站点设置和站点图标
$site = unserialize(get_db('user_config','v',['uid'=>UID,'k'=>'s_site']));
$favicon = ( !empty($site['site_icon_file'])) ? $site['site_icon'] : './favicon.ico';
$site['Title'] = $site['title'].(empty($site['subtitle'])?'':' - '.$site['subtitle']);
//取登录状态
$is_login = is_login();
@@ -111,10 +111,6 @@ if(!is_file($transit_path)){
$copyright = empty($global_config['copyright'])?'<a target="_blank" href="https://gitee.com/tznb/twonav">Copyright © TwoNav</a>':$global_config['copyright'];
$ICP = empty($global_config['ICP'])?'':'<a target="_blank" href="https://beian.miit.gov.cn">'.$global_config['ICP'].'</a>';
//读取站点配置
$s_site = unserialize(get_db("user_config","v",["k"=>"s_site","uid"=>UID]));
//var_dump($link,$transit_path,$category_parent,$category_ancestor,$s_site);
//统计点击数
write_user_count(date('Ym'),'click_Ym');
@@ -124,19 +120,21 @@ update_db("user_links", ["click[+]"=>1],['uid'=>UID,'lid'=>$id]);
//读取过渡页设置
$transition_page = unserialize(get_db("user_config","v",["t"=>"config","k"=>"s_transition_page","uid"=>UID]));
//载入站点设置
$site = unserialize(get_db('user_config','v',['uid'=>UID,'k'=>'s_site']));
//读取用户主题配置
$theme_config_db = unserialize(get_db('user_config','v',['t'=>'theme','k'=>$s_templates['transit'],'uid'=>UID]));
//读取默认主题配置
$theme_info = json_decode(@file_get_contents($dir_path.'/info.json'),true);
$theme_config = empty($theme_info['config']) ? []:$theme_info['config'];
$theme_ver = !Debug?$theme_info['version']:$theme_info['version'].'.'.time();
//合并配置数据
$theme_config = empty($theme_config_db) ? $theme_config : array_merge ($theme_config??[],$theme_config_db??[]);
//如果主题信息声明支持扩展字段
if($global_config['link_extend'] == 1 && check_purview('link_extend',1) && in_array($theme_info['support']['link_extend'],["true","1"])){
$extend = empty($link['extend']) ? [] : unserialize($link['extend']);
}
//如果存在备用链接,则强制载入过渡页
if(!empty($link['url_standby'])) {

View File

@@ -69,7 +69,7 @@ $fid_s = array_column($fid_s,null,'cid');
//根据分类ID查询二级分类
function get_category_sub($id) {
global $site,$share,$data;
global $share,$data;
//禁止搜索非数字
if(intval($id) == 0){
return;
@@ -265,76 +265,3 @@ write_user_count(date('Ym'),'index_Ym');
write_user_count(date('Ymd'),'index_Ymd');
//载入模板
require($index_path);
//取分类图标(六零系主题在用)
function get_category($content){
if(empty($content)){
return '';
}
if(substr($content, 0,4) == '<svg'){
return 'data:image/svg+xml;base64,'.base64_encode($content);
}else{
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']) ){
if(substr($link['icon'], 0,4) == '<svg'){
return('data:image/svg+xml;base64,'.base64_encode($link['icon']));
}else{
return($link['icon']);
}
}
if ($site['link_icon'] == 'default'){
return($GLOBALS['libs'].'/Other/default.ico');
}elseif ($icon ==1){
return('./favicon/index2.php?url='.$link['real_url']);
}elseif($icon ==2){
return('//favicon.rss.ink/v1/'.base64($link['real_url']));
}elseif($icon ==4){
return('//api.15777.cn/get.php?url='.$link['real_url']);
}elseif($icon ==5){
return('//favicon.cccyun.cc/'.$link['real_url']);
}elseif($icon ==6){
return('//api.iowen.cn/favicon/'.parse_url($link['real_url'])['host'].'.png');
}elseif($icon ==0){
return('./system/ico.php?text='.mb_strtoupper(mb_substr($link['title'], 0, 1)));
}else{
return('./favicon/index2.php?url='.$link['real_url']);
}//如果参数错误则使用本地服务器
}
//将URL转换为base64编码
function base64($url){
$urls = parse_url($url);
$scheme = empty( $urls['scheme'] ) ? 'http://' : $urls['scheme'].'://'; //获取请求协议
$host = $urls['host']; //获取主机名
$port = empty( $urls['port'] ) ? '' : ':'.$urls['port']; //获取端口
$new_url = $scheme.$host.$port;
return base64_encode($new_url);
}
//是否启用收录
function is_apply(){
global $global_config;
$apply_user = unserialize( get_db("user_config", "v", ["k" => "apply","uid"=>UID]));
return ($global_config['apply'] == 1 && $apply_user['apply'] == 1);
}
//是否启用留言
function is_guestbook(){
global $global_config;
$guestbook_user = unserialize( get_db("user_config", "v", ["k" => "guestbook","uid"=>UID]) );
return ($global_config['guestbook'] == 1 && $guestbook_user['allow'] == 1);
}

View File

@@ -582,7 +582,18 @@ function getindexurl(){
$HOST = $http_type.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
return($HOST);
}
//检查数组指定字段是否有重复值
function is_Duplicated($array, $field){
$values = [];
foreach($array as $item){
if(in_array($item[$field], $values)){
return true;
}else{
$values[] = $item[$field];
}
}
return false;
}
//检查权限(有权限返回true 没有权限时根传递参数1是返回false 2是直接返回错误信息)
function check_purview($name,$return_type){
global $USER_DB;

View File

@@ -12,3 +12,84 @@ if(empty($s_templates)){
$s_templates = $global_templates;
insert_db("user_config", ["uid" => UID,"k"=>"s_templates","v"=>$global_templates,"t"=>"config","d" => '默认模板']);
}
//载入辅助函数
if(empty($c) || in_array($c,['index','click'])){
//将URL转换为base64编码
function base64($url){
$urls = parse_url($url);
$scheme = empty( $urls['scheme'] ) ? 'http://' : $urls['scheme'].'://'; //获取请求协议
$host = $urls['host']; //获取主机名
$port = empty( $urls['port'] ) ? '' : ':'.$urls['port']; //获取端口
$new_url = $scheme.$host.$port;
return base64_encode($new_url);
}
//是否启用收录
function is_apply(){
global $global_config;
$apply_user = unserialize( get_db("user_config", "v", ["k" => "apply","uid"=>UID]));
return ($global_config['apply'] == 1 && $apply_user['apply'] == 1);
}
//是否启用留言
function is_guestbook(){
global $global_config;
$guestbook_user = unserialize( get_db("user_config", "v", ["k" => "guestbook","uid"=>UID]) );
return ($global_config['guestbook'] == 1 && $guestbook_user['allow'] == 1);
}
//获取图标URL
function geticourl($icon,$link){
if( !empty( $link['icon']) ){
if(substr($link['icon'], 0,4) == '<svg'){
return('data:image/svg+xml;base64,'.base64_encode($link['icon']));
}else{
return($link['icon']);
}
}
if ($site['link_icon'] == 'default'){
return($GLOBALS['libs'].'/Other/default.ico');
}elseif ($icon ==1){
return('./favicon/index2.php?url='.$link['real_url']);
}elseif($icon ==2){
return('//favicon.rss.ink/v1/'.base64($link['real_url']));
}elseif($icon ==4){
return('//api.15777.cn/get.php?url='.$link['real_url']);
}elseif($icon ==5){
return('//favicon.cccyun.cc/'.$link['real_url']);
}elseif($icon ==6){
return('//api.iowen.cn/favicon/'.parse_url($link['real_url'])['host'].'.png');
}elseif($icon ==7){
return('https://toolb.cn/favicon/'.parse_url($link['real_url'])['host']);
}elseif($icon ==8){
return('https://apis.jxcxin.cn/api/Favicon?url='.$link['real_url']);
}elseif($icon ==0){
return('./system/ico.php?text='.mb_strtoupper(mb_substr($link['title'], 0, 1)));
}else{
return('./favicon/index2.php?url='.$link['real_url']);
}//如果参数错误则使用本地服务器
}
//取分类图标(六零系主题在用)
function get_category($content){
if(empty($content)){
return '';
}
if(substr($content, 0,4) == '<svg'){
return 'data:image/svg+xml;base64,'.base64_encode($content);
}else{
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;
}
}

View File

@@ -1 +1 @@
v2.0.11-20230414
v2.0.12-20230417

View File

@@ -165,7 +165,7 @@ layui.use(['form','table','dropdown','miniTab'], function () {
}
var checkStatus = table.checkStatus(obj.config.id);
if( checkStatus.data.length == 0 && ['LAYTABLE_COLS','LAYTABLE_EXPORT','LAYTABLE_PRINT','batch'].indexOf(event) == -1 ) {
if( checkStatus.data.length == 0 && ['LAYTABLE_COLS','LAYTABLE_EXPORT','LAYTABLE_PRINT','batch','link_extend'].indexOf(event) == -1 ) {
layer.msg('未选中任何数据!');
return;
}
@@ -248,9 +248,63 @@ layui.use(['form','table','dropdown','miniTab'], function () {
return true;
}
})
}else if(event === 'icon_pull'){
let i = 0;
let total = checkStatus.data.length;
layer.load(1, {shade:[0.3,'#fff']});//加载层
let msg_id = layer.msg('正在拉取中', {icon: 16,time: 1000*300});
icon_pull(i);
function icon_pull(id){
if(i >= total){
layer.closeAll();
layer.alert('拉取完毕',{icon:1,title:'信息',anim: 2,shadeClose: false,closeBtn: 0});
return true;
}
$("#layui-layer"+ msg_id+" .layui-layer-padding").html('<i class="layui-layer-ico layui-layer-ico16"></i>[ ' + i + ' / ' + total + ' ] 正在拉取图标');
$.post(get_api('write_link','icon_pull'),{id:checkStatus.data[i].lid},function(data,status){
if(data.code == 1){
i ++;
icon_pull(i);
} else{
layer.closeAll();
layer.alert(data.msg,{icon:5,title:'信息',anim: 2,shadeClose: false,closeBtn: 0});
}
});
}
}else if(event === 'link_extend'){
extend_data = '';
index = layer.open({type: 1,scrollbar: false,shadeClose: true,title: '编辑扩展字段',area : ['100%', '100%'],content: $('.link_extend')});
$.post(get_api('read_link_list','extend_list'),function(data,status){
if(data.code == 1){
extend_data = data.data;
table.reload('link_extend_list', {data: extend_data});
} else{
layer.msg(data.msg);
}
});
}
});
table.render({
elem: '#link_extend_list'
,height: 'full-150'
,data: {}
,response: {statusCode: 1 }
,method: 'post'
,page: false
,limit: 1000
,even:true
,id:'link_extend_list'
,loading:true
,cols: [[
{field:'weight',title:'序号',edit:'text',width:80}
,{field:'title',title:'标题',edit:'text',width:256}
,{field:'name',title:'字段名',edit:'text',width:256}
,{field:'type',title:'类型',edit:'text',width:256}
,{field:'default',title:'默认值',edit:'text',width:256}
,{ title:'操作',toolbar:'#link_extend_toolbar',align:'center',width:118}
]]
});
//监听工具条
table.on('tool(table)', function (obj) {
var data = obj.data;
@@ -375,4 +429,58 @@ layui.use(['form','table','dropdown','miniTab'], function () {
});
}
//自定义字段行事件
table.on('tool(link_extend_list)', function (obj) {
var data = obj.data;
var row = $(obj.tr).attr("data-index"); //获取行索引
if (obj.event === 'del') {
layer.confirm('确认移除?',{icon: 3, title:'温馨提示'}, function(index){
obj.del();
layer.close(index);
layer.msg("移除成功,点击保存后生效!",{icon:1});
});
}
});
//添加字段
$('#add_field').click(function () {
let data = table.cache.link_extend_list;
let max_weight = 0;
//找出最大的一个排序值
for (let i = 0; i < data.length; i++) {
if( parseInt(data[i].weight) > max_weight ){
max_weight = parseInt(data[i].weight);
}
}
data.push({
"title": "请输入标题",
"name":"请输入字段名(大小写字母或数字)",
"weight":(max_weight + 1),
"type":"请输入 text 或 textarea",
"default":""
});
table.reload('link_extend_list', {data: data});
return false;
});
//保存字段
$('#save_field').click(function () {
var data = [];
var tableBak = table.cache.link_extend_list;
for (var i = 0; i < tableBak.length; i++) {
//过滤掉被删除的空数据
if(typeof tableBak[i].LAY_TABLE_INDEX == 'number'){
data.push(tableBak[i]);
}
}
$.post(get_api('write_link','extend_list') ,{list:JSON.stringify(data)},function(data,status){
if(data.code == 1){
table.reload("link_extend_list",{data:data.datas});
layer.msg('保存成功', {icon: 1});
} else{
layer.msg(data.msg,{icon:5});
}
});
return false;
});
});

View File

@@ -62,6 +62,8 @@
<option value="4" >api.15777.cn</option>
<option value="5" >favicon.cccyun.cc</option>
<option value="6" >api.iowen.cn</option>
<!--<option value="7" >toolb.cn</option>-->
<!--<option value="8" >apis.jxcxin.cn</option>-->
</select>
</div>
<div class="layui-form-mid layui-word-aux">所有API接口均由其他大佬提供!若有异常请尝试更换接口!</div>

View File

@@ -99,7 +99,11 @@ $title='编辑链接';$awesome=true; require 'header.php';
<textarea name="description" id="description" placeholder="请输入内容" class="layui-textarea"></textarea>
</div>
</div>
<?php
//判断全局是否开启扩展
if($global_config['link_extend'] && check_purview('link_extend',1)){
require 'link_extend.php';
}?>
<div class="layui-form-item">
<div class="layui-input-block layui-btn-group">
<button class="layui-btn layui-btn-warm" type="button" id="close" >关闭</button>

View File

@@ -0,0 +1,47 @@
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>扩展字段</legend>
</fieldset>
<?php
//读取扩展字段列表
$list = get_db("user_config","v",["k"=>"s_extend_list","uid"=>UID]);
//不为空则渲染
if(!empty($list)){
$list = unserialize($list);
$extend_data = get_db('user_links','extend',['uid'=>UID,'lid'=>$link['lid']]);
$extend_data = empty($extend_data) ? [] : unserialize($extend_data);
foreach ($list as $data) {
$field = "_".$data['name'];
$data['value'] = isset($extend_data[$field]) ? $extend_data[$field] : $data['default'];
if($data['type'] == 'text'){
echo_text($data);
}elseif($data['type'] == 'textarea'){
echo_textarea($data);
}
}
}
function echo_text($data){ ?>
<div class="layui-form-item">
<label class="layui-form-label"><?php echo $data['title']?></label>
<div class="layui-input-block">
<input type="text" name="_<?php echo $data['name']?>" autocomplete="off" value="<?php echo $data['value']?>" class="layui-input">
</div>
</div>
<?php
}
function echo_textarea($data){ ?>
<div class="layui-form-item">
<label class="layui-form-label"><?php echo $data['title']?></label>
<div class="layui-input-block">
<textarea name="_<?php echo $data['name']?>" class="layui-textarea"><?php echo $data['value']?></textarea>
</div>
</div>
<?php
}
?>

View File

@@ -65,7 +65,12 @@
<button class="layui-btn layui-btn-sm layui-btn-normal layui-hide-xs" lay-event="batch_public" id="batch_public">设为公开</button>
<button class="layui-btn layui-btn-sm layui-btn-normal layui-hide-xs" lay-event="batch_start" id="batch_start">设为启用</button>
<button class="layui-btn layui-btn-sm layui-btn-normal layui-hide-xs" lay-event="batch_disable" id="batch_disable">设为禁用</button>
<button class="layui-btn layui-btn-sm layui-btn-normal layui-btn-danger layui-hide-xs" lay-event="testing" id="testing" <?php echo $global_config['offline']?'style="display:none;"':''?> >检测</button>
<?php if($global_config['link_extend'] == 1 && check_purview('link_extend',1)){ ?>
<button class="layui-btn layui-btn-sm layui-btn-normal layui-btn-danger layui-hide-xs" lay-event="link_extend" id="link_extend">扩展字段</button>
<?php }?>
<?php if($global_config['offline'] != 1 ){ ?>
<button class="layui-btn layui-btn-sm layui-btn-normal layui-btn-danger layui-hide-xs" lay-event="testing" id="testing">检测</button>
<?php }?>
<button class="layui-btn layui-btn-sm layui-btn-normal layui-btn-danger" layuimini-content-href="link_sort" data-title="链接排序">排序模式</button>
</div>
</script>
@@ -73,25 +78,35 @@
<script src = "./templates/admin/js/public.js?v=<?php echo $Ver;?>"></script>
<?php load_static('js');?>
<script src = "./templates/admin/js/link_list.js?v=<?php echo $Ver;?>"></script>
<ul class="batch_category" style = "margin-top:18px;display:none;padding-right: 10px;" >
<ul class="batch_category" style="margin-top:18px;display:none;padding-right: 10px;">
<form class="layui-form" lay-filter="batch_category">
<div class="layui-form-item">
<label class="layui-form-label">父级分类</label>
<div class="layui-input-block">
<select id="batch_category_fid">
<select id="batch_category_fid">
</select>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="batch_category" id="batch_category" >确定修改</button>
<button class="layui-btn layui-btn-warm" type="button" id="close" >关闭</button>
</div>
</div>
</form>
</form>
</ul>
<ul class="link_extend" style="margin-top: 18px;display:none;padding-right: 10px;padding-left: 10px;">
<div class="layui-btn-container">
<button class="layui-btn" lay-submit id="add_field">新增字段</button>
<button class="layui-btn" lay-submit id="save_field">保存</button>
<button class="layui-btn layui-btn-primary" style="color: red;">数据变更需要点击保存!确定好需要的字段后请勿随意修改,以免造成数据错乱!</button>
</div>
<table id="link_extend_list" lay-filter="link_extend_list"></table>
<script type="text/html" id="link_extend_toolbar">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm layui-btn-danger del" lay-event="del">移除</button>
</div>
</script>
</ul>
</body>
</html>

View File

@@ -179,7 +179,16 @@ $title='系统设置';require(dirname(__DIR__).'/header.php');
</div>
<div class="layui-form-mid layui-word-aux">此处关闭时即使用户组允许也无法使用!</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">链接扩展</label>
<div class="layui-input-inline">
<select name="link_extend">
<option value="0" selected="">关闭</option>
<option value="1" >开启</option>
</select>
</div>
<div class="layui-form-mid layui-word-aux">自定义链接的扩展信息(需自行添加字段,目前仅用于自定义过渡页)</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block"><button class="layui-btn layui-btn-normal" lay-submit lay-filter="save">确认保存</button></div>
</div>

View File

@@ -339,16 +339,17 @@ layui.use(['form','table','laydate','tableSelect'], function () {
}else if(obj.event === 'edit'){
form.val('data', data);
form.val('data', {'pv':data.pv == 1});
console.log(data.data);
data.data = ts_selected_format(data.data,/"/g);
let ts = ts_selected_format(data.data);
if(data.type == '1'){
$('#category_data').val(data.data);
$('#category_data').attr("ts-selected",data.data.replace('[', '').replace(']', ''));
$('#category_data').attr("ts-selected",ts);
type = 'category';
$('#cf').show();
$('#lf').hide();
}else if(data.type == '2'){
$('#link_data').val(data.data);
$('#link_data').attr("ts-selected",data.data.replace('[', '').replace(']', ''));
$('#link_data').attr("ts-selected",ts);
type = 'link';
$('#cf').hide();
$('#lf').show();
@@ -358,7 +359,9 @@ layui.use(['form','table','laydate','tableSelect'], function () {
}
});
function ts_selected_format(v,z = /"|\[|\]/g){
return v.replace(z,'')
}
//书签选择
function load_tableSelect(searchPlaceholder,name,url,elem,limit,limits){ tableSelect.render({
@@ -386,7 +389,7 @@ layui.use(['form','table','laydate','tableSelect'], function () {
id.push(item.id);
})
elem.val(id.join(","));
$(elem).val(JSON.stringify(id));
$(elem).val(ts_selected_format(JSON.stringify(id),/"/g) );
}
})}
load_tableSelect('分类名称搜索','分类名',get_api('read_share','categorys'),'#category_data',9999,[9999]);

View File

@@ -52,6 +52,7 @@ $color = ($s_templates['home_pc'] == $key || $s_templates['home_pad'] == $key ?"
<div class="layui-card-header" style="height: auto;" id="home">
<div class="layui-btn-group" id="<?php echo $key;?>">
<?php
$theme_set = check_purview('theme_set',1);
if($online){ //如果是在线主题则显示下载
echo $Space.'<button type="button" class="layui-btn layui-btn-sm layui-btn-danger" id="dw">下载</button>'."\n";
}elseif($theme['info']['up'] == 1){ //如果有更新则同时显示下载和使用
@@ -64,7 +65,7 @@ $color = ($s_templates['home_pc'] == $key || $s_templates['home_pad'] == $key ?"
if(!$online){ //本地主题显示预览
echo $Space.'<button type="button" class="layui-btn layui-btn-sm layui-btn-normal" id="preview">预览</button>'."\n";
}
if($theme['info']['config'] == '1'){ //支持配置的主题显示配置
if($theme['info']['config'] == '1' && $theme_set){ //支持配置的主题显示配置
echo $Space.'<button type="button" class="layui-btn layui-btn-sm layui-btn-normal" id="config">配置</button>'."\n";
}
if($USER_DB['UserGroup'] === 'root' && !$online){ //管理员&本地主题>显示删除

View File

@@ -2,6 +2,20 @@
<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.12-20230417</h4>
<ul>
<li>优化书签分享的兼容性</li>
<li>新增链接自定义扩展信息(用于自定义过渡页模板)</li>
<li>[数据库更新] 调整MySQL字符集编码(utf8改为utf8mb4,使其兼容Emoji字符)</li>
<li>[数据库更新] 用户组权限列表新增3个选项</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">
@@ -9,7 +23,7 @@
<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>
<li>调整安装脚本session_name避免特定环境冲突</li>
</ul>
</div>
</li>