* blog:xiaoz.me */ class Api { protected $db; public function __construct($db){ $this->db = $db; //返回json类型 header('Content-Type:application/json; charset=utf-8'); } /** * name:创建分类目录 */ public function add_category($token,$name,$property = 0,$weight = 0,$description = ''){ $this->auth($token); $data = [ 'name' => $name, 'add_time' => time(), 'weight' => $weight, 'property' => $property, 'description' => $description ]; //插入分类目录 $this->db->insert("on_categorys",$data); //返回ID $id = $this->db->id(); //如果id为空(NULL),说明插入失败了,姑且认为是name重复导致 if( empty($id) ){ $this->err_msg(-1000,'Categorie already exist!'); } else{ //成功并返回json格式 $data = [ 'code' => 0, 'id' => intval($id) ]; exit(json_encode($data)); } } /** * 修改分类目录 * */ public function edit_category($token,$id,$name,$property = 0,$weight = 0,$description = ''){ $this->auth($token); //如果id为空 if( empty($id) ){ $this->err_msg(-1003,'The category ID cannot be empty!'); } //如果分类名为空 elseif( empty($name) ){ $this->err_msg(-1004,'The category name cannot be empty!'); } //更新数据库 else{ $data = [ 'name' => $name, 'up_time' => time(), 'weight' => $weight, 'property' => $property, 'description' => $description ]; $re = $this->db->update('on_categorys',$data,[ 'id' => $id]); //var_dump( $this->db->log() ); //获取影响行数 $row = $re->rowCount(); if($row) { $data = [ 'code' => 0, 'msg' => 'successful' ]; exit(json_encode($data)); } else{ $this->err_msg(-1005,'The category name already exists!'); } } } /** * 删除分类目录 */ public function del_category($token,$id) { //验证授权 $this->auth($token); //如果id为空 if( empty($id) ){ $this->err_msg(-1003,'The category ID cannot be empty!'); } //如果分类目录下存在数据 $count = $this->db->count("on_links", [ "fid" => $id ]); //如果分类目录下存在数据,则不允许删除 if($count > 0) { $this->err_msg(-1006,'The category is not empty and cannot be deleted!'); } else{ $data = $this->db->delete('on_categorys',[ 'id' => $id] ); //返回影响行数 $row = $data->rowCount(); if($row) { $data = [ 'code' => 0, 'msg' => 'successful' ]; exit(json_encode($data)); } else{ $this->err_msg(-1007,'The category delete failed!'); } } } /** * name:返回错误(json) * */ protected 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)); } /** * name:验证方法 */ protected function auth($token){ //计算正确的token:用户名 + TOKEN $token_yes = md5(USER.TOKEN); //如果token为空,则验证cookie if(empty($token)) { if( !$this->is_login() ) { $this->err_msg(-1002,'Authorization failure!'); } } else if($token != $token_yes){ $this->err_msg(-1002,'Authorization failure!'); } else{ return true; } } /** * name:添加链接 */ public function add_link($token,$fid,$title,$url,$description = '',$weight = 0,$property = 0){ $this->auth($token); $fid = intval($fid); //检测链接是否合法 $this->check_link($fid,$title,$url); //合并数据 $data = [ 'fid' => $fid, 'title' => $title, 'url' => $url, 'description' => $description, 'add_time' => time(), 'weight' => $weight, 'property' => $property ]; //插入数据库 $re = $this->db->insert('on_links',$data); //返回影响行数 $row = $re->rowCount(); //如果为真 if( $row ){ $id = $this->db->id(); $data = [ 'code' => 0, 'id' => $id ]; exit(json_encode($data)); } //如果插入失败 else{ $this->err_msg(-1011,'The URL already exists!'); } } /** * name:修改链接 */ public function edit_link($token,$id,$fid,$title,$url,$description = '',$weight = 0,$property = 0){ $this->auth($token); $fid = intval($fid); //检测链接是否合法 $this->check_link($fid,$title,$url); //查询ID是否存在 $count = $this->db->count('on_links',[ 'id' => $id]); //如果id不存在 if( (empty($id)) || ($count == false) ) { $this->err_msg(-1010,'link id not exists!'); } //合并数据 $data = [ 'fid' => $fid, 'title' => $title, 'url' => $url, 'description' => $description, 'up_time' => time(), 'weight' => $weight, 'property' => $property ]; //插入数据库 $re = $this->db->update('on_links',$data,[ 'id' => $id]); //返回影响行数 $row = $re->rowCount(); //如果为真 if( $row ){ $id = $this->db->id(); $data = [ 'code' => 0, 'msg' => 'successful' ]; exit(json_encode($data)); } //如果插入失败 else{ $this->err_msg(-1011,'The URL already exists!'); } } /** * 删除链接 */ public function del_link($token,$id){ //验证token是否合法 $this->auth($token); //查询ID是否存在 $count = $this->db->count('on_links',[ 'id' => $id]); //如果id不存在 if( (empty($id)) || ($count == false) ) { $this->err_msg(-1010,'link id not exists!'); } else{ $re = $this->db->delete('on_links',[ 'id' => $id] ); if($re) { $data = [ 'code' => 0, 'msg' => 'successful' ]; exit(json_encode($data)); } else{ $this->err_msg(-1010,'link id not exists!'); } } } /** * 验证链接合法性 */ protected function check_link($fid,$title,$url){ //如果父及(分类)ID不存在 if( empty($fid )) { $this->err_msg(-1007,'The category id(fid) not exist!'); } //如果父及ID不存在数据库中 //验证分类目录是否存在 $count = $this->db->count("on_categorys", [ "id" => $fid ]); if ( empty($count) ){ $this->err_msg(-1007,'The category not exist!'); } //如果链接标题为空 if( empty($title) ){ $this->err_msg(-1008,'The title cannot be empty!'); } //链接不能为空 if( empty($url) ){ $this->err_msg(-1009,'URL cannot be empty!'); } //链接不合法 if( !filter_var($url, FILTER_VALIDATE_URL) ) { $this->err_msg(-1010,'URL is not valid!'); } return true; } /** * 查询分类目录 */ public function category_list($page,$limit){ $offset = ($page - 1) * $limit; //如果成功登录,则查询所有 if( $this->is_login() ){ $sql = "SELECT * FROM on_categorys ORDER BY weight DESC,id DESC LIMIT {$limit} OFFSET {$offset}"; } else{ $sql = "SELECT * FROM on_categorys WHERE property = 0 ORDER BY weight DESC,id DESC LIMIT {$limit} OFFSET {$offset}"; } //统计总数 $count = $this->db->count('on_categorys','*'); //原生查询 $datas = $this->db->query($sql)->fetchAll(); $datas = [ 'code' => 0, 'msg' => '', 'count' => $count, 'data' => $datas ]; exit(json_encode($datas)); } /** * 查询链接 */ public function link_list($page,$limit,$token = ''){ $offset = ($page - 1) * $limit; //如果成功登录,但token为空 if( ($this->is_login()) && (empty($token)) ){ //统计总数 $count = $this->db->count('on_links','*'); $sql = "SELECT *,(SELECT name FROM on_categorys WHERE id = on_links.fid) AS category_name FROM on_links ORDER BY weight DESC,id DESC LIMIT {$limit} OFFSET {$offset}"; } //如果token验证通过 elseif( (!empty($token)) && ($this->auth($token)) ) { //统计总数 $count = $this->db->count('on_links','*'); $sql = "SELECT *,(SELECT name FROM on_categorys WHERE id = on_links.fid) AS category_name FROM on_links ORDER BY weight DESC,id DESC LIMIT {$limit} OFFSET {$offset}"; } else{ //统计总数 $count = $this->db->count('on_links','*',[ 'property' => 0 ]); $sql = "SELECT *,(SELECT name FROM on_categorys WHERE id = on_links.fid) AS category_name FROM on_links WHERE property = 0 ORDER BY weight DESC,id DESC LIMIT {$limit} OFFSET {$offset}"; } //原生查询 $datas = $this->db->query($sql)->fetchAll(); $datas = [ 'code' => 0, 'msg' => '', 'count' => $count, 'data' => $datas ]; exit(json_encode($datas)); } /** * 验证是否登录 */ protected function is_login(){ $key = md5(USER.PASSWORD.$this->getIP().'onenav'); //获取session $session = $_COOKIE['key']; //如果已经成功登录 if($session == $key) { return true; } else{ return false; } } /** * 获取链接信息 */ public function get_link_info($token,$url){ $this->auth($token); //检查链接是否合法 //链接不合法 if( !filter_var($url, FILTER_VALIDATE_URL) ) { $this->err_msg(-1010,'URL is not valid!'); } //获取网站标题 $c = curl_init(); curl_setopt($c, CURLOPT_URL, $url); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false); //设置超时时间 curl_setopt($c , CURLOPT_TIMEOUT, 10); $data = curl_exec($c); curl_close($c); $pos = strpos($data,'utf-8'); if($pos===false){$data = iconv("gbk","utf-8",$data);} preg_match("/