diff --git a/README.md b/README.md index e864635..84b4b50 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # OneNav -使用PHP + SQLite 3开发的书签管理器(导航),界面简洁,安装简单,使用方便。 +OneNav是一款开源免费的书签(导航)管理程序,由xiaoz使用使用PHP + SQLite 3开发,界面简洁,安装简单,使用方便。OneNav可帮助你你将浏览器书签集中式管理,解决跨设备、跨平台、跨浏览器之间同步和访问困难问题,做到一处部署,随处访问。 ![](https://i.bmp.ovh/imgs/2020/12/40f222b7da7a89c9.png) @@ -22,6 +22,8 @@ * 支持API * 支持Docker部署 * 支持uTools插件 +* 支持二级分类 +* 支持Chromium内核的[浏览器扩展](https://dwz.ovh/4kxn2)(插件) ## 安装 @@ -29,7 +31,7 @@ 1. 需安装PHP环境,并确保支持SQLite3 2. 下载源码解压到站点根目录 -3. 访问首页自动完成安装 +3. 访问首页根据提示初始化用户名/密码 4. 访问后台:`http://IP/index.php?c=login` **Docker部署:** @@ -38,12 +40,11 @@ docker run -itd --name="onenav" -p 80:80 \ -e USER='xiaoz' -e PASSWORD='xiaoz.me' \ -v /data/onenav:/data/wwwroot/default/data \ - helloz/onenav + helloz/onenav:0.9.19 ``` - -* `USER`:设置用户名,上述设置为`xiaoz` -* `PASSWORD`:设置密码,上述设置为`xiaoz.me` +* 第一个`80`是自定义访问端口,可以自行修改,第二个`80`是容器端口,请勿修改 * `/data/onenav`:本机挂载目录,用于持久存储Onenav数据 +* `0.9.19`:改成OneNav最新版本号,可以通过[releases](https://github.com/helloxz/onenav/releases)查看最新版本号 > 更多说明,请参考帮助文档:https://dwz.ovh/onenav @@ -64,6 +65,8 @@ docker run -itd --name="onenav" -p 80:80 \ ## 鸣谢 +感谢`@落幕`/`@百素`/`@itushan`的代码贡献及主题开发,以及其它OneNav贡献者和使用者,名字太多无法一一列举,还请谅解。 + OneNav诞生离不开以下项目,在此表示感谢(排名不分先后)。 * [WebStackPage](https://github.com/WebStackPage/WebStackPage.github.io) diff --git a/class/Api.php b/class/Api.php index 02c325a..ab27e77 100755 --- a/class/Api.php +++ b/class/Api.php @@ -15,15 +15,20 @@ class Api { /** * name:创建分类目录 */ - public function add_category($token,$name,$property = 0,$weight = 0,$description = '',$font_icon = ''){ + public function add_category($token,$name,$property = 0,$weight = 0,$description = '',$font_icon = '',$fid = 0){ $this->auth($token); + //分类名称不允许为空 + if( empty($name) ) { + $this->err_msg(-2000,'分类名称不能为空!'); + } $data = [ 'name' => htmlspecialchars($name,ENT_QUOTES), 'add_time' => time(), 'weight' => $weight, 'property' => $property, 'description' => htmlspecialchars($description,ENT_QUOTES), - 'font_icon' => $font_icon + 'font_icon' => $font_icon, + 'fid' => $fid ]; //插入分类目录 $this->db->insert("on_categorys",$data); @@ -47,25 +52,36 @@ class Api { * 修改分类目录 * */ - public function edit_category($token,$id,$name,$property = 0,$weight = 0,$description = '',$font_icon = ''){ + public function edit_category($token,$id,$name,$property = 0,$weight = 0,$description = '',$font_icon = '',$fid = 0){ $this->auth($token); + $fid = intval($fid); //如果id为空 if( empty($id) ){ $this->err_msg(-1003,'The category ID cannot be empty!'); } //如果分类名为空 - elseif( empty($name) ){ + elseif( empty($name ) ){ $this->err_msg(-1004,'The category name cannot be empty!'); } + //更新数据库 else{ + //根据分类ID查询改分类下面是否已经存在子分类,如果存在子分类了则不允许设置为子分类,实用情况:一级分类下存在二级分类,无法再将改一级分类修改为二级分类 + $count = $this->db->count("on_categorys", [ + "fid" => $id + ]); + //改分类下的子分类数量大于0,并且将父级ID修改为其它分类 + if( ( $count > 0 ) && ( $fid !== 0 ) ) { + $this->err_msg(-2000,'修改失败,该分类下已存在子分类!'); + } $data = [ 'name' => htmlspecialchars($name,ENT_QUOTES), 'up_time' => time(), 'weight' => $weight, 'property' => $property, 'description' => htmlspecialchars($description,ENT_QUOTES), - 'font_icon' => $font_icon + 'font_icon' => $font_icon, + 'fid' => $fid ]; $re = $this->db->update('on_categorys',$data,[ 'id' => $id]); //var_dump( $this->db->log() ); @@ -136,13 +152,17 @@ class Api { */ protected function auth($token){ //计算正确的token:用户名 + TOKEN - $token_yes = md5(USER.TOKEN); + $SecretKey = @$this->db->get('on_options','*',[ 'key' => 'SecretKey' ])['value']; + $token_yes = md5(USER.$SecretKey); //如果token为空,则验证cookie if(empty($token)) { if( !$this->is_login() ) { $this->err_msg(-1002,'Authorization failure!'); } } + else if ( empty($SecretKey) ) { + $this->err_msg(-2000,'请先生成SecretKey!'); + } else if($token != $token_yes){ $this->err_msg(-1002,'Authorization failure!'); } @@ -169,8 +189,8 @@ class Api { $data = [ 'fid' => $fid, 'title' => htmlspecialchars($title,ENT_QUOTES), - 'url' => $url, - 'url_standby' => $url_standby, + 'url' => htmlspecialchars($url,ENT_QUOTES), + 'url_standby' => htmlspecialchars($url_standby,ENT_QUOTES), 'description' => htmlspecialchars($description,ENT_QUOTES), 'add_time' => time(), 'weight' => $weight, @@ -315,9 +335,9 @@ class Api { //$this->check_link($fid,$title,$url); $this->check_link([ 'fid' => $fid, - 'title' => $title, - 'url' => $url, - 'url_standby' => $url_standby + 'title' => htmlspecialchars($title,ENT_QUOTES), + 'url' => htmlspecialchars($url,ENT_QUOTES), + 'url_standby' => htmlspecialchars($url_standby,ENT_QUOTES) ]); //查询ID是否存在 $count = $this->db->count('on_links',[ 'id' => $id]); @@ -411,12 +431,16 @@ class Api { if( empty($url) ){ $this->err_msg(-1009,'URL cannot be empty!'); } - //链接不合法 - if( !filter_var($url, FILTER_VALIDATE_URL) ) { + //通过正则匹配链接是否合法,支持http/https/ftp/magnet:?|ed2k|tcp/udp/thunder/rtsp/rtmp/sftp + $pattern = "/^(http:\/\/|https:\/\/|ftp:\/\/|ftps:\/\/|magnet:?|ed2k:\/\/|tcp:\/\/|udp:\/\/|thunder:\/\/|rtsp:\/\/|rtmp:\/\/|sftp:\/\/).+/"; + // if( !filter_var($url, FILTER_VALIDATE_URL) ) { + // $this->err_msg(-1010,'URL is not valid!'); + // } + if ( !preg_match($pattern,$url) ) { $this->err_msg(-1010,'URL is not valid!'); } //备用链接不合法 - if ( ( !empty($url_standby) ) && ( !filter_var($url_standby, FILTER_VALIDATE_URL) ) ) { + if ( ( !empty($url_standby) ) && ( !preg_match($pattern, $url_standby) ) ) { $this->err_msg(-1010,'URL is not valid!'); } return true; @@ -425,16 +449,30 @@ class Api { * 查询分类目录 */ public function category_list($page,$limit){ + $token = @$_POST['token']; $offset = ($page - 1) * $limit; //如果成功登录,则查询所有 if( $this->is_login() ){ - $sql = "SELECT * FROM on_categorys ORDER BY weight DESC,id DESC LIMIT {$limit} OFFSET {$offset}"; + $sql = "SELECT *,(SELECT name FROM on_categorys WHERE id = a.fid LIMIT 1) AS fname FROM on_categorys as a ORDER BY weight DESC,id DESC LIMIT {$limit} OFFSET {$offset}"; + //统计总数 + $count = $this->db->count('on_categorys','*'); + } + //如果存在token,则验证 + else if( !empty($token) ) { + $this->auth($token); + //查询所有分类 + $sql = "SELECT *,(SELECT name FROM on_categorys WHERE id = a.fid LIMIT 1) AS fname FROM on_categorys as a ORDER BY weight DESC,id DESC LIMIT {$limit} OFFSET {$offset}"; + //统计总数 + $count = $this->db->count('on_categorys','*'); } else{ - $sql = "SELECT * FROM on_categorys WHERE property = 0 ORDER BY weight DESC,id DESC LIMIT {$limit} OFFSET {$offset}"; + $sql = "SELECT *,(SELECT name FROM on_categorys WHERE id = a.fid LIMIT 1) AS fname FROM on_categorys as a WHERE property = 0 ORDER BY weight DESC,id DESC LIMIT {$limit} OFFSET {$offset}"; + //统计总数 + $count = $this->db->count('on_categorys','*',[ + "property" => 0 + ]); } - //统计总数 - $count = $this->db->count('on_categorys','*'); + //原生查询 $datas = $this->db->query($sql)->fetchAll(); $datas = [ @@ -445,6 +483,27 @@ class Api { ]; exit(json_encode($datas)); } + /** + * 生成 + */ + public function create_sk() { + //验证是否登录 + $this->auth(''); + $sk = md5(USER.USER.time()); + + $result = $this->set_option_bool('SecretKey',$sk); + if( $result ){ + $datas = [ + 'code' => 0, + 'data' => $sk + ]; + exit(json_encode($datas)); + } + else{ + $this->err_msg(-2000,'SecretKey生成失败!'); + } + + } /** * 查询链接 * 接收一个数组作为参数 @@ -616,9 +675,16 @@ class Api { public function get_link_info($token,$url){ $this->auth($token); //检查链接是否合法 + $pattern = "/^(http:\/\/|https:\/\/).*/"; //链接不合法 - if( !filter_var($url, FILTER_VALIDATE_URL) ) { - $this->err_msg(-1010,'URL is not valid!'); + if( empty($url) ) { + $this->err_msg(-2000,'URL不能为空!'); + } + if( !preg_match($pattern,$url) ){ + $this->err_msg(-1010,'只支持识别http/https协议的链接!'); + } + else if( !filter_var($url, FILTER_VALIDATE_URL) ) { + $this->err_msg(-2000,'只支持识别http/https协议的链接!'); } //获取网站标题 $c = curl_init(); @@ -896,6 +962,55 @@ class Api { } } + /** + * 更新option,返回BOOL值 + */ + protected function set_option_bool($key,$value = '') { + $key = htmlspecialchars(trim($key)); + //如果key是空的 + if( empty($key) ) { + return FALSE; + } + + $count = $this->db->count("on_options", [ + "key" => $key + ]); + + //如果数量是0,则插入,否则就是更新 + if( $count === 0 ) { + try { + $this->db->insert("on_options",[ + "key" => $key, + "value" => $value + ]); + $data = [ + "code" => 0, + "data" => "设置成功!" + ]; + return TRUE; + } catch (\Throwable $th) { + return FALSE; + } + } + //更新数据 + else if( $count === 1 ) { + try { + $this->db->update("on_options",[ + "value" => $value + ],[ + "key" => $key + ]); + $data = [ + "code" => 0, + "data" => "设置已更新!" + ]; + return TRUE; + } catch (\Throwable $th) { + return FALSE; + } + } + + } } diff --git a/config.simple.php b/config.simple.php index e72ee02..19684a0 100755 --- a/config.simple.php +++ b/config.simple.php @@ -8,14 +8,14 @@ $db = new medoo([ ]); //用户名 -define('USER','xiaoz'); +define('USER','{username}'); //密码 -define('PASSWORD','xiaoz.me'); +define('PASSWORD','{password}'); //邮箱,用于后台Gravatar头像显示 -define('EMAIL','337003006@qq.com'); -//token参数,API需要使用 +define('EMAIL','{email}'); +//token参数,API需要使用,0.9.19版本这个废弃了,请通过后台设置 define('TOKEN','xiaoz.me'); -//主题风格 +//主题风格,0.9.18废弃了,请通过后台设置 define('TEMPLATE','default'); //站点信息 diff --git a/controller/admin.php b/controller/admin.php index 1bf42f8..819af4e 100755 --- a/controller/admin.php +++ b/controller/admin.php @@ -22,20 +22,43 @@ $version = get_version(); $page = empty($_GET['page']) ? 'index' : $_GET['page']; //如果页面是修改edit_category -if ($page == 'edit_category') { +if ( $page == 'edit_category' ) { //获取id $id = intval($_GET['id']); //查询单条分类信息 - $category = $db->get('on_categorys','*',[ 'id' => $id ]); + $sql = "SELECT *,(SELECT name FROM on_categorys WHERE id = a.fid LIMIT 1) AS fname FROM on_categorys AS a WHERE id = $id"; + $category_one = $db->query($sql)->fetchAll()[0]; + //$category_one = $db->get('on_categorys','*',[ 'id' => $id ]); + //查询父级分类 + $categorys = $db->select('on_categorys','*',[ + 'fid' => 0, + 'ORDER' => ['weight' => 'DESC'] + ]); //checked按钮 - if( $category['property'] == 1 ) { - $category['checked'] = 'checked'; + if( $category_one['property'] == 1 ) { + $category_one['checked'] = 'checked'; } else{ - $category['checked'] = ''; + $category_one['checked'] = ''; } } +//添加分类页面 +if ( $page == 'add_category' ) { + //查询父级分类 + $categorys = $db->select('on_categorys','*',[ + 'fid' => 0, + 'ORDER' => ['weight' => 'DESC'] + ]); +} + +//API设置页面 +if( $page == 'setting/api' ) { + //查询SecretKey + $SecretKey = $db->get('on_options','*',[ 'key' => 'SecretKey' ])['value']; + +} + //如果页面是修改link if ($page == 'edit_link') { //查询所有分类信息,用于分类框选择 diff --git a/controller/api.php b/controller/api.php index 11cf2bc..7e62aee 100755 --- a/controller/api.php +++ b/controller/api.php @@ -36,6 +36,8 @@ function add_category($api){ $name = $_POST['name']; //获取私有属性 $property = empty($_POST['property']) ? 0 : 1; + //获取分级ID + $fid = intval($_POST['fid']); //获取权重 $weight = empty($_POST['weight']) ? 0 : intval($_POST['weight']); //获取描述 @@ -44,7 +46,7 @@ function add_category($api){ $description = htmlspecialchars($description); //获取字体图标 $font_icon = htmlspecialchars($_POST['font_icon'],ENT_QUOTES); - $api->add_category($token,$name,$property,$weight,$description,$font_icon); + $api->add_category($token,$name,$property,$weight,$description,$font_icon,$fid); } /** * 修改分类目录入口 @@ -52,7 +54,8 @@ function add_category($api){ function edit_category($api){ //获取ID $id = intval($_POST['id']); - + //获取父级ID + $fid = intval($_POST['fid']); //获取token $token = $_POST['token']; //获取分类名称 @@ -67,7 +70,7 @@ function edit_category($api){ $description = htmlspecialchars($description); //字体图标 $font_icon = htmlspecialchars($_POST['font_icon'],ENT_QUOTES); - $api->edit_category($token,$id,$name,$property,$weight,$description,$font_icon); + $api->edit_category($token,$id,$name,$property,$weight,$description,$font_icon,$fid); } /** * 删除分类目录 @@ -259,6 +262,8 @@ function set_site($api) { $data['description'] = htmlspecialchars($_POST['description']); //获取自定义header $data['custom_header'] = $_POST['custom_header']; + //获取自定义footer + $data['custom_footer'] = $_POST['custom_footer']; //序列化存储 $value = serialize($data); @@ -277,10 +282,44 @@ function set_transition_page($api) { $data['admin_stay_time'] = intval($_POST['admin_stay_time']); //序列化存储 - $value = serialize($data); - - - + $value = serialize($data); $api->set_option('s_transition_page',$value); +} + +//生成create_sk +function create_sk($api) { + $api->create_sk(); +} + +//获取onenav最新版本号 +function get_latest_version() { + try { + $curl = curl_init("https://git.xiaoz.me/xiaoz/onenav/raw/branch/main/version.txt"); + + curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.50"); + curl_setopt($curl, CURLOPT_FAILONERROR, true); + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); + #设置超时时间,最小为1s(可选) + curl_setopt($curl , CURLOPT_TIMEOUT, 5); + + $html = curl_exec($curl); + curl_close($curl); + $data = [ + "code" => 200, + "msg" => "", + "data" => $html + ]; + + } catch (\Throwable $th) { + $data = [ + "code" => 200, + "msg" => "", + "data" => "" + ]; + } + exit(json_encode($data)); } \ No newline at end of file diff --git a/controller/index.php b/controller/index.php index e9fc113..375195f 100755 --- a/controller/index.php +++ b/controller/index.php @@ -2,13 +2,30 @@ /** * 首页模板入口 */ - //如果已经登录,获取所有分类和链接 if( is_login() ){ - //查询分类目录 + //查询所有分类目录 $categorys = $db->select('on_categorys','*',[ "ORDER" => ["weight" => "DESC"] ]); + //查询一级分类目录,分类fid为0的都是一级分类 + $category_parent = $db->select('on_categorys','*',[ + "fid" => 0, + "ORDER" => ["weight" => "DESC"] + ]); + //根据分类ID查询二级分类,分类fid大于0的都是二级分类 + function get_category_sub($id) { + global $db; + $id = intval($id); + + $category_sub = $db->select('on_categorys','*',[ + "fid" => $id, + "ORDER" => ["weight" => "DESC"] + ]); + + return $category_sub; + } + //根据category id查询链接 function get_links($fid) { global $db; @@ -29,6 +46,25 @@ else{ "property" => 0, "ORDER" => ["weight" => "DESC"] ]); + //查询一级分类目录,分类fid为0的都是一级分类 + $category_parent = $db->select('on_categorys','*',[ + "fid" => 0, + 'property' => 0, + "ORDER" => ["weight" => "DESC"] + ]); + //根据分类ID查询二级分类,分类fid大于0的都是二级分类 + function get_category_sub($id) { + global $db; + $id = intval($id); + + $category_sub = $db->select('on_categorys','*',[ + "fid" => $id, + 'property' => 0, + "ORDER" => ["weight" => "DESC"] + ]); + + return $category_sub; + } //根据category id查询链接 function get_links($fid) { global $db; diff --git a/controller/init.php b/controller/init.php new file mode 100644 index 0000000..73a9cbf --- /dev/null +++ b/controller/init.php @@ -0,0 +1,110 @@ + + */ + + /** + * 安装前先检查环境 + */ +function check_env() { + //获取组件信息 + $ext = get_loaded_extensions(); + //检查PHP版本,需要大于5.6小于8.0 + $php_version = floatval(PHP_VERSION); + + if( ( $php_version < 5.6 ) || ( $php_version > 8 ) ) { + exit("当前PHP版本{$php_version}不满足要求,需要5.6 <= PHP <= 7.4"); + } + + //检查是否支持pdo_sqlite + if ( !array_search('pdo_sqlite',$ext) ) { + exit("不支持PDO_SQLITE组件,请先开启!"); + } + //如果配置文件存在 + if( file_exists("data/config.php") ) { + exit("配置文件已存在,无需再次初始化!"); + } + return TRUE; +} + +/** + * 安装OneNav + */ +function install() { + if( !file_exists('./data/config.php') ) { + //复制配置文件 + //加载初始化模板 + require("templates/admin/init.php"); + exit(); + } + else { + + } +} + +function err_msg($code,$err_msg){ + $data = [ + 'code' => $code, + 'err_msg' => $err_msg + ]; + //返回json类型 + header('Content-Type:application/json; charset=utf-8'); + exit(json_encode($data)); +} +/** + * 初始化设置OneNav + */ +function init($data){ + //判断参数是否为空 + if( empty($data['username']) || empty($data['password']) ) { + err_msg(-2000,'用户名或密码不能为空!'); + } + $config_file = "data/config.php"; + //检查配置文件是否存在,存在则不允许设置 + if( file_exists($config_file) ) { + err_msg(-2000,'配置文件已存在,无需再次初始化!'); + } + //复制配置文件 + + //读取配置文件内容 + $content = file_get_contents("config.simple.php"); + //替换内容 + $content = str_replace('{email}',$data['email'],$content); + $content = str_replace('{username}',$data['username'],$content); + $content = str_replace('{password}',$data['password'],$content); + + //写入配置文件 + if( !file_put_contents($config_file,$content) ) { + err_msg(-2000,'写入配置文件失败,请检查目录权限!'); + } + else{ + //成功并返回json格式 + $data = [ + 'code' => 200, + 'msg' => "初始化完成!" + ]; + header('Content-Type:application/json; charset=utf-8'); + exit(json_encode($data)); + } +} + +$c = @$_GET['c']; + +check_env(); + +if ( $c == 'init' ) { + //接收POST参数 + $email = htmlspecialchars(trim($_POST['email'])); + $username = htmlspecialchars(trim($_POST['username'])); + $password = htmlspecialchars(trim($_POST['password'])); + $data = [ + "email" => $email, + "username" => $username, + "password" => $password + ]; + init($data); +} +else{ + install(); +} diff --git a/data/update.log b/data/update.log index 5c0794a..c01bf44 100755 --- a/data/update.log +++ b/data/update.log @@ -73,4 +73,27 @@ CREATE INDEX on_options_key_IDX ON on_options ("key"); 2. 主题新增 info.json 对主题进行描述 3. 移除自定义Javascript,改用站点设置的自定义header 4. 部分资源已经本地化 -5. baisuTwo适配OneNav 0.9.18 \ No newline at end of file +5. baisuTwo适配OneNav 0.9.18 + +20220422 +1. 后台新增版本检测 +2. defautl和baisuTwo主题适配二级分类 +3. 新增Chrome浏览器插件支持 +4. 后台新增API设置 +5. 修复站点设置,低分辨率底部被遮挡 +6. 静态资源进一步本地化 +7. 添加自定义footer +8. 支持添加多种协议的链接 +9. 完成后台二级目录功能 +10. 修复category_list接口API调用不显示私有链接 + +20220423 +1. 新增环境检测 +2. 新增用户初始化设置界面 +3. 新增版本更新检查 +4. 修复未登录情况下不显示分类的BUG + +20220424 +1. 默认主题新增夜间模式切换 +2. 修复修改分类无法更新的BUG +3. 优化后台底部窗口遮挡问题 \ No newline at end of file diff --git a/db/onenav.simple.db3 b/db/onenav.simple.db3 index 6ed4ea7..43851ab 100644 Binary files a/db/onenav.simple.db3 and b/db/onenav.simple.db3 differ diff --git a/db/sql/20220419.sql b/db/sql/20220419.sql new file mode 100644 index 0000000..7ba9759 --- /dev/null +++ b/db/sql/20220419.sql @@ -0,0 +1 @@ +ALTER TABLE on_categorys ADD fid INTEGER DEFAULT 0 NOT NULL; \ No newline at end of file diff --git a/index.php b/index.php index d1bf67e..49e57a3 100755 --- a/index.php +++ b/index.php @@ -3,6 +3,7 @@ * name:入口文件 */ error_reporting(E_ALL^E_NOTICE^E_WARNING^E_DEPRECATED); +header("content-Type: text/html; charset=Utf-8"); //获取控制器 $c = @$_GET['c']; //进行过滤 @@ -10,23 +11,16 @@ $c = strip_tags($c); //读取版本号 //$version = @file_get_contents("./functions/version.txt"); //载入配置文件 +//如果配置文件不存在,则载入初始化文件 if( !file_exists('./data/config.php') ) { - echo "
正在准备安装,请稍等...
"; - //复制配置文件 - if ( copy('config.simple.php','data/config.php') ) { - echo "安装完毕,默认用户名:xiaoz,密码:xiaoz.me,5s后跳转到登录页面。"; - //跳转到登录页面 - header("Refresh:5;url=/index.php?c=login"); - exit(); - } else{ - exit("复制配置文件失败,请检查权限是否正常,或手动将站点目录下的config.simple.php复制为data/config.php
"); - } - + include_once("controller/init.php"); //exit('