8.2 ) ) { exit("当前PHP版本{$php_version}不满足要求,支持范围7.3 - 8.2"); } //检查是否支持pdo_sqlite if ( !array_search('pdo_sqlite',$ext) ) { exit("不支持PDO_SQLite组件(即使您使用MySQL数据库,本程序其他功能也需要它,例如导出数据/本地备份/导入数据等)!"); } $ha = '
一键诊断 查看phpinfo'; if (!is_dir('./data')) mkdir('./data',0755,true) or exit('

创建data目录失败,请检查权限!

'.$ha); if (!is_dir('./data/temp')) mkdir('./data/temp',0755,true) or exit('

创建temp目录失败,请检查权限!

'.$ha); if (!is_dir('./data/user')) mkdir('./data/user',0755,true) or exit('

创建user目录失败,请检查权限!

'.$ha); $_SESSION['initial'] = TRUE; //标记满足安装条件 } //安转前诊断(get参数diagnosis不为空时) function diagnosis() { $log=''; $log .= "服务器时间:" . date("Y-m-d H:i:s") ."
"; $log .= "系统信息:" . php_uname('s').','.php_uname('r') ."
"; $log .= "当前版本:" . file_get_contents('./system/version.txt') . "
"; //检查PHP版本,需要大于5.6小于8.0 $php_version = floatval(PHP_VERSION); $log .= "PHP版本:{$php_version}
"; $log .= "Web版本:{$_SERVER['SERVER_SOFTWARE']}
"; if( ( $php_version < 7.3 ) || ( $php_version > 8.1 ) ) { $log .= "PHP版本:不满足要求,需要7.3 <= PHP <= 8.1 )
"; } //获取加载的模块 $ext = get_loaded_extensions(); $path = './data/test_'.time().'.txt'; if(file_put_contents($path, '测试文本,可以删除!由一键诊断生成!')){ if(unlink($path)){ $log = $log ."data目录:正常
"; }else{ $log = $log ."data目录:创建文件成功,删除文件失败
"; } }else{ $log = $log ."data目录:异常,请检查权限!
"; } if(function_exists("opcache_reset")){ $log = $log ."opcache: 已安装
"; } $log .= "脚本权限:" . get_current_user()."/".substr(sprintf("%o",fileperms("index.php")),-4)."
"; $log .= in_array("pdo_sqlite",$ext) ? "PDO_Sqlite:支持
" : "PDO_Sqlite:不支持 (导入db3)
"; $log .= in_array("curl",$ext) ? "curl:支持
" : "curl:不支持 (链接识别/在线更新/主题下载/订阅等)
"; $log .= in_array("mbstring",$ext) ? "mbstring:支持
" : "mbstring:不支持 (链接识别)
"; $log .= in_array("Phar",$ext) ? "Phar:支持
" : "Phar:不支持 (在线更新/主题下载)
"; $log .= in_array("hash",$ext) ? "hash:支持
" : "hash:不支持 (书签分享/生成注册码)
"; $log .= in_array("session",$ext) ? "session:支持
" : "session:不支持 (影响较大)
"; $log .= "可用模块:".implode(" ",$ext)."
"; exit($log); } //执行安装 function install(){ global $db; if(!preg_match("/^[a-zA-Z0-9]+$/",$_POST['User'])) msg(-1,'账号只能是4到13位的数字和字母!'); // sqlite if($_POST['db_type'] === 'sqlite'){ if(!preg_match("/^data.*\.db3$/",$_POST['db_file'])){ msg(-1,'SQLite文件名错误,必须以data开头.db3结尾!'); } if(!class_exists('SQLite3')){ msg(-1,'不支持SQLite3'); } $path = DIR.'/data/'.$_POST['db_file']; //强制重装(清空数据库) if($_GET['f'] =='yes'){ try { if( !unlink($path)) msg(-1,'删除数据库失败'); }catch (Exception $e) { msg(-1,'删除数据库失败:'.$e->getMessage()); } }else if(file_exists($path)){ msg(-2,'检测到您已安装过,如需重装点击是(将清空所有数据)'); } //创建数据表(由于Medoo不支持执行多条SQLite语句,故使用php自带的扩展) try { $sql = file_get_contents(DIR."/system/SQLite/install.sql"); class MyDB extends SQLite3 {function __construct() {} } $db2 = new MyDB(); $db2 -> open($path); if(!$db2) msg(-1,'打开SQLite3数据库失败:'.$db2->lastErrorMsg()); $result = $db2->exec($sql); if(!$result) msg(-1,'安装失败:'.$db2->lastErrorMsg()); $db2->close(); } catch(Exception $e){ msg(-1,'初始化SQLite3失败:'.$e->getMessage()); } $config = ' "sqlite", //类型 "file" => "'.$_POST['db_file'].'" //文件 ); ?>'; if(!file_put_contents(DIR.'/data/config.php',$config)) msg(-1,'保存配置失败!'); //sqlite初始化代码 require (DIR.'/system/Medoo.php'); //载入框架 try { $db = new Medoo\Medoo(['type'=>'sqlite','database'=>$path]); }catch (Exception $e) { msg(-1,'载入数据库失败:'.$e->getMessage()); //无法载入数据库 } Write_Config(); } // mysql if($_POST['db_type'] === 'mysql'){ if( !isset($_POST['db_host']) || !isset($_POST['db_port']) || !isset($_POST['db_name']) || !isset($_POST['db_user']) || !isset($_POST['db_password']) ){ msg(-1,'MySQL配置错误,请检查..'); } require (DIR.'/system/Medoo.php'); //载入框架 try { $db = new Medoo\Medoo([ 'type' => 'mysql', 'host' => $_POST['db_host'], 'port' => $_POST['db_port'], 'database' => $_POST['db_name'], 'username' => $_POST['db_user'], 'password' => $_POST['db_password'], 'charset' => 'utf8mb4' ]); //判断版本,目前基于5.6.50开发,其他版本兼容性未知,若您需要强制安装请屏蔽检测 if(version_compare($db->info ()['version'],'5.6.0','<')) msg(-1,'MySQL数据库版本不能低于5.6,当前版本:'.$db->info ()['version']); //链接成功.. }catch (Exception $e) { $E = $e->getMessage(); if(strstr($E,'[1044]') || strstr($E,'[1049]')){ msg(-1,'数据库链接失败,请检查库名!'); }elseif(strstr($E,'[2002]')){ msg(-1,'数据库链接失败,请检查地址和网络!'); }elseif(strstr($E,'[1045]')){ msg(-1,'数据库链接失败,请检查账号密码!'); }else{ msg(-1,'数据库链接失败:'.$E); } } //检查是否存在表 try { $re = $db->query("SHOW TABLES LIKE 'global_config'")->fetchAll(); }catch (Exception $e) { msg(-1,'查询数据失败:'.$e->getMessage()); } //强制重装(会清空数据库) if(!empty($re) && $_GET['f'] != 'yes'){ msg(-2,'您已安装过,如需重装点击确定(将清空所有数据)'); } $config = ' "mysql", //类型 "host" => "'.$_POST['db_host'].'", //地址 "port" => '.$_POST['db_port'].', //端口 "name" => "'.$_POST['db_name'].'", //库名 "user" => "'.$_POST['db_user'].'", //账号 "password" => "'.$_POST['db_password'].'" //密码 ); ?>'; if(!file_put_contents(DIR.'/data/config.php',$config)) msg(-1,'保存配置失败!'); //创建数据表 try { $sql = file_get_contents(DIR."/system/MySQL/install.sql"); $re = $db->query($sql)->fetchAll(); }catch (Exception $e) { msg(-1,'install.sql执行失败-1:'.$e->getMessage()); } //写到配置文件 Write_Config(); //写初始配置 } //不支持的数据库类型 msg(-1,'请求错误'); } //写入配置 function Write_Config(){ global $USER_DB,$db; //记录建站时间 insert_db("global_config", ["k" => "build","v" => ['date'=>date("Y-m-d"),'time'=>date("H:i:s"),'int'=>time()],"d" => '建站时间']); //默认安全配置 $LoginConfig['Password2'] = '';//二级密码 $LoginConfig['api_model'] = 'security'; //API模式 $LoginConfig['KeySecurity'] = '0'; //key安全 $LoginConfig['KeyClear'] = '7'; //key清理 $LoginConfig['HttpOnly'] = '1'; //HttpOnly $LoginConfig['Session'] = '360'; //登录保持 $LoginConfig['Login'] = '0'; //登录入口 //写入管理员账户 $RegTime = time(); $re = insert_db("global_user", [ "FID"=>0, "User"=>$_POST['User'], "Password"=>Get_MD5_Password(md5($_POST['Password']),$RegTime), "UserGroup"=>'root', "Email"=>$_POST['Email'], "Token"=>'', "RegIP"=>Get_IP(), "RegTime"=>$RegTime, "Login"=>Get_Exclusive_Login($_POST['User']), "LoginConfig"=>$LoginConfig ]); $uid = $db->id(); //取管理员账号id //写默认安全配置 insert_db("global_config", ["k" => "LoginConfig","v" => $LoginConfig,"d" => '默认安全配置']); //默认站点配置 $s_site['title'] = '我的书签'; //站点标题 $s_site['subtitle'] = 'TwoNav'; //副标题 $s_site['logo'] = '我的书签'; //站点logo $s_site['keywords'] = 'TwoNav,开源导航,开源书签,简洁导航,云链接,个人导航,个人书签,扩展,多用户,落幕'; //关键字 $s_site['description'] = 'TwoNav 是一款使用PHP + SQLite3/MySQL 开发的简约导航/书签管理器。'; //描述 $s_site['link_model'] = '302'; //链接模式 $s_site['link_icon'] = '0'; //链接图标 $s_site['custom_header'] = ''; //头部代码 $s_site['custom_footer'] = ''; //底部代码 //写入默认站点配置 insert_db("global_config", ["k" => "s_site","v" => $s_site,"d" => '默认站点配置']); //写入用户站点配置 insert_db("user_config", ["uid"=>$uid, "k" => "s_site","v" => $s_site,"d" => '站点配置','t'=>'config']); //默认模板 $templates['home_pc'] = 'default'; $templates['home_pad'] = 'default'; $templates['login'] = 'default'; $templates['transit'] = 'default'; //写到用户模板配置 insert_db("user_config", ["uid"=>$uid, "k" => "s_templates","v" => $templates,"d" => '默认模板','t'=>'config']); //写入全局 insert_db("global_config", ["k" => "s_templates","v" => $templates,"d" => '默认模板']); //写站点配置 $o_config['Login'] = 'login'; //登录入口 $o_config['Register'] = 'register'; //注册入口 $o_config['RegOption'] = '0'; //注册配置 $o_config['Libs'] = './static'; //静态库路径 $o_config['Default_User'] = $_POST['User']; //默认用户 $o_config['XSS_WAF'] = '0'; //防XSS脚本 $o_config['SQL_WAF'] = '0'; //防SQL注入 $o_config['offline'] = '0'; //离线模式 $o_config['Debug'] = '0'; //调试模式 $o_config['Maintenance'] = '0'; //维护模式 $o_config['Sub_domain'] = '0'; //二级域名 $o_config['copyright'] = ''; //版权信息 $o_config['c_code'] = '0'; //禁用默认用户使用自定义代码 insert_db("global_config", ["k" => "o_config","v" => $o_config,"d" => '网站配置']); //读取信息(注册后默认已经登录) $USER_DB = get_db("global_user", "*", ["User"=>$_POST['User']]); Set_key($USER_DB); //复制默认分类和链接 $time = time(); $categorys = select_db('user_categorys','*',['uid'=>0]); foreach ($categorys as $key => $data){ $categorys[$key]['uid'] = $USER_DB['ID']; $categorys[$key]['add_time'] = $time; $categorys[$key]['up_time'] = $time; unset($categorys[$key]['id']); } insert_db('user_categorys',$categorys); $category_id = intval(max_db('user_categorys','cid',['uid'=>$USER_DB['ID']])) +1; insert_db("user_config", ["uid"=>$USER_DB['ID'],"k"=>"category_id","v"=>$category_id,"t"=>"max_id","d"=>'分类ID']); $inks = select_db('user_links','*',['uid'=>0]); foreach ($inks as $key => $data){ $inks[$key]['uid'] = $USER_DB['ID']; $inks[$key]['add_time'] = $time; $inks[$key]['up_time'] = $time; unset($inks[$key]['id']); } insert_db('user_links',$inks); $link_id = intval(max_db('user_links','lid',['uid'=>$USER_DB['ID']])) +1; insert_db("user_config", ["uid"=>$USER_DB['ID'],"k"=>"link_id","v"=>$link_id,"t"=>"max_id","d"=>'链接ID']); //初始ID insert_db("user_config", ["uid"=>$USER_DB['ID'],"k"=>"pwd_group_id","v"=>1,"t"=>"max_id","d"=>'加密组ID']); header('Content-Type:application/json; charset=utf-8'); exit(json_encode(['code'=>1,'User'=>$_POST['User'],'Password'=>$_POST['Password'],'msg'=>'安装成功' ])); } ?> TwoNav 安装引导 '>
安装方式:全新安装      
推荐配置:Nginx-1.20 + PHP-8.1