diff --git a/index.php b/index.php index 3911c48..13d0a5b 100644 --- a/index.php +++ b/index.php @@ -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,'链接数据库失败!'); diff --git a/system/MySQL/20230417.php b/system/MySQL/20230417.php new file mode 100644 index 0000000..5541260 --- /dev/null +++ b/system/MySQL/20230417.php @@ -0,0 +1,28 @@ +$file_name,'update_time'=>time(),'status'=>'TRUE','extra'=>'']); +}else{ + msg(-1,'数据库更新失败'); +} diff --git a/system/MySQL/install.sql b/system/MySQL/install.sql index c290ce3..315f728 100644 --- a/system/MySQL/install.sql +++ b/system/MySQL/install.sql @@ -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; diff --git a/system/SQLite/20230417.php b/system/SQLite/20230417.php new file mode 100644 index 0000000..2d37a07 --- /dev/null +++ b/system/SQLite/20230417.php @@ -0,0 +1,12 @@ +$file_name,'update_time'=>time(),'status'=>'TRUE','extra'=>'']); +}else{ + msg(-1,'数据库更新失败'); +} diff --git a/system/SQLite/install.sql b/system/SQLite/install.sql index 6659cdc..eb03f60 100644 --- a/system/SQLite/install.sql +++ b/system/SQLite/install.sql @@ -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" ( diff --git a/system/admin.php b/system/admin.php index 0486ae6..253b781 100644 --- a/system/admin.php +++ b/system/admin.php @@ -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'=> diff --git a/system/api.php b/system/api.php index 2c8e3ea..cb0836c 100644 --- a/system/api.php +++ b/system/api.php @@ -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请求数据不能为空!"); } diff --git a/system/api_root.php b/system/api_root.php index 3236cc8..561c716 100644 --- a/system/api_root.php +++ b/system/api_root.php @@ -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){ diff --git a/system/click.php b/system/click.php index 4b05da4..67f1bc2 100644 --- a/system/click.php +++ b/system/click.php @@ -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'])?'Copyright © TwoNav':$global_config['copyright']; $ICP = empty($global_config['ICP'])?'':''.$global_config['ICP'].''; -//读取站点配置 -$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'])) { diff --git a/system/index.php b/system/index.php index d501605..966a101 100644 --- a/system/index.php +++ b/system/index.php @@ -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; @@ -264,77 +264,4 @@ if(empty($_GET['share']) && !$site['ex_theme']){ 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) == ' "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); - -} \ No newline at end of file +require($index_path); \ No newline at end of file diff --git a/system/public.php b/system/public.php index fb582e7..cbac419 100644 --- a/system/public.php +++ b/system/public.php @@ -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; diff --git a/system/templates.php b/system/templates.php index 882125d..735febe 100644 --- a/system/templates.php +++ b/system/templates.php @@ -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) == '= 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 + ' / ' + 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; + }); + }); diff --git a/templates/admin/page/SiteSetting.php b/templates/admin/page/SiteSetting.php index 8a4fc5d..84dbd94 100644 --- a/templates/admin/page/SiteSetting.php +++ b/templates/admin/page/SiteSetting.php @@ -62,6 +62,8 @@ + +
所有API接口均由其他大佬提供!若有异常请尝试更换接口!
diff --git a/templates/admin/page/link_edit.php b/templates/admin/page/link_edit.php index 5cfbeac..fcc8f6f 100644 --- a/templates/admin/page/link_edit.php +++ b/templates/admin/page/link_edit.php @@ -99,7 +99,11 @@ $title='编辑链接';$awesome=true; require 'header.php'; - +
diff --git a/templates/admin/page/link_extend.php b/templates/admin/page/link_extend.php new file mode 100644 index 0000000..acd8971 --- /dev/null +++ b/templates/admin/page/link_extend.php @@ -0,0 +1,47 @@ +
+ 扩展字段 +
+"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){ ?> +
+ +
+ +
+
+ +
+ +
+ +
+
+ + + diff --git a/templates/admin/page/link_list.php b/templates/admin/page/link_list.php index b4bc0a5..ec1fa27 100644 --- a/templates/admin/page/link_list.php +++ b/templates/admin/page/link_list.php @@ -65,7 +65,12 @@ - + + + + + +
@@ -73,25 +78,35 @@ -
此处关闭时即使用户组允许也无法使用!
- +
+ +
+ +
+
自定义链接的扩展信息(需自行添加字段,目前仅用于自定义过渡页)
+
diff --git a/templates/admin/page/share.php b/templates/admin/page/share.php index 3f36fb6..3fb3e4a 100644 --- a/templates/admin/page/share.php +++ b/templates/admin/page/share.php @@ -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]); diff --git a/templates/admin/page/theme_home.php b/templates/admin/page/theme_home.php index ff8a3b7..dafea04 100644 --- a/templates/admin/page/theme_home.php +++ b/templates/admin/page/theme_home.php @@ -52,6 +52,7 @@ $color = ($s_templates['home_pc'] == $key || $s_templates['home_pad'] == $key ?"
下载'."\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.''."\n"; } - if($theme['info']['config'] == '1'){ //支持配置的主题显示配置 + if($theme['info']['config'] == '1' && $theme_set){ //支持配置的主题显示配置 echo $Space.''."\n"; } if($USER_DB['UserGroup'] === 'root' && !$online){ //管理员&本地主题>显示删除 diff --git a/templates/admin/page/updatelog.php b/templates/admin/page/updatelog.php index 1ab7009..2bc82d6 100644 --- a/templates/admin/page/updatelog.php +++ b/templates/admin/page/updatelog.php @@ -2,6 +2,20 @@
+
  • + +
    +

    v2.0.12-20230417

    +
      +
    • 优化书签分享的兼容性
    • +
    • 新增链接自定义扩展信息(用于自定义过渡页模板)
    • +
    • [数据库更新] 调整MySQL字符集编码(utf8改为utf8mb4,使其兼容Emoji字符)
    • +
    • [数据库更新] 用户组权限列表新增3个选项
    • +
    • 调整用户无权限配置站点信息时隐藏入口
    • +
    • 修复已知问题
    • +
    +
    +
  • @@ -9,7 +23,7 @@
    • 修复热门网址/最新网址的一些问题
    • 新增Atool工具 (应急工具),用于强行修改密码/配置等 使用说明
    • -
    • 调整安装脚本session_name避免与其他面板冲突(如小皮面板,造成安装提示无法满足)
    • +
    • 调整安装脚本session_name避免特定环境冲突