先上示例地址:https://demo.ecms.maiyapai.com/ecmsapi/index.php?mod=news&act=index
测试说明
测试前,安装好帝国万能API插件v1.0版
文章采集时需要在news数据模型中添加一个字段 urlmd5。字段设置为下图所示:
新闻详情接口
<?php
defined('ECMSAPI_MOD') or exit;
$id = $api->param('id' , 0 , 'intval'); // 获取文章id
if($id === 0){
$api->load('fun')->json(0 , '参数错误');
}
$news = $api->load('table')->get('news' , $id); // 通过id获取新闻数据
if(false !== $news){
$api->load('fun')->json(1 , $news);
}else{
$errorinfo = $api->load('table')->getError(); //获取错误信息
$api->load('fun')->json(0 , $errorinfo);
}
新闻列表接口
<?php
defined('ECMSAPI_MOD') or exit;
/*
* 为了安全 传用的参数我们必须经过严格的格式化处理
*/
$page = $api->param('page' , 1 , 'intval'); // 当前页码
$pagesize = $api->param('pagesize' , 10 , 'intval'); // 每页显示数据量
$classid = $api->param('classid' , 0 , 'intval'); // 指定栏目id 本示例只作栏目与所属用户筛选两个条件 实际应用中根据自身需求添加条件
$userid = $api->param('userid' , 0 , 'intval'); // 指定用户id
$fun = $api->load('fun'); // 加载一个辅助函数类 方便后面的调用 不需要重复的拼写 $api->load('fun')
$page = $fun->toInt($page , 1); // 页码应该不小于1
$pagesize = $fun->toInt($pagesize , 1 , 100); // 每页显示数据量范围应该在1~100 若不加限制 当数据达到10W+级时,直接将pagesize设置为 10W 接口将直接崩溃
/*
* $class_r 是帝国官方自带的栏目缓存数组 我们通过它来获取栏目相关信息
*/
// 栏目id不为0的情况下 判断栏目是否存在 不存在 将栏目id设置为0
if($classid !== 0 && !isset($class_r[$classid])){
$classid = 0;
}
// 定义查询条件 $map
$map = '1=1';
// 当栏目id不为0时 添加对应的筛选条件
if($classid !== 0){
$classdata = $class_r[$classid]; // 获取栏目信息
if($classdata['islast']){
// 当栏目为终级栏目时
$map .= ' and classid = '.$classid;
}else{
// 当栏目为非终级栏目时
$sonclass = $classdata['sonclass']; //获取所包含的子栏目id
$sonclass = $api->load('fun')->toNumArray($sonclass); // 将字符串转成数组
$sonclass = implode(',' , $sonclass); // 将所包含的子栏目id转化成 1,2,3,5格式
if($sonclass !== ''){
$map .= ' and classid in('.$sonclass.')';
}
}
}
// 当用户id不为0时 添加对应的筛选条件 ismember = 1 前台会员添加 ismember = 0 后台管理员添加
if($userid !== 0){
$map .= ' and ismember = 1 and userid='.$userid;
}
// 获取当前条件下的总数据量
$total = $api->load('db')->total('[!db.pre!]ecms_news' , $map);
// 获取总页数
$totalpage = $total > 0 ? ceil($total/$pagesize) : 1;
// 获取当前页的数据
$rows = $total > 0 || $page > $totalpage ? $api->load('db')->select('[!db.pre!]ecms_news' , '*' , $map , $pagesize.','.$page , 'id desc') : [];
// 输出json结构数据 前面我们定义了$fun 所以 $fun->json 同等于 $api->load('fun')->json
$fun->json(1 , [
'total' => $total,
'page' => $page,
'pagesize' => $pagesize,
'totalpage' => $totalpage,
'classid' => $classid,
'userid' => $userid,
'rows' => $rows
]);
新闻删除接口
<?php
defined('ECMSAPI_MOD') or exit;
if(!$api->isPost()){
// 非post提交,直接返回错误信息
$api->load('fun')->json(0 , '非法提交');
}
// 获取已登陆用户数据
$user = $api->load('user')->getSession();
if(!$user){
// 未登陆,回错误信息
$api->load('fun')->json(0 , '权限不足,请先登陆');
}
$id = $api->post('id' , 0 , 'intval');
if($id === 0){
$api->load('fun')->json(0 , '请指定新闻ID');
}
$news = $api->load('table')->get('news' , $id);
if(false === $news){
// 没有获取到数据时返回错误提示
$api->load('fun')->json(0 , $api->load('table')->getError());
}
// 验证当前新闻是否为该会员所发布的
if((int)$news['ismember'] !== 1 || (int)$news['userid'] !== (int)$user['userid']){
$api->load('fun')->json(0 , '该新闻不是你发布的,无权删除');
}
// 删除数据
$result = $api->load('table')->delete('news' ,$id);
if(false === $result){
// 删除失败时返回提示信息
$api->load('fun')->json(0 , $api->load('table')->getError());
}
// 开始删除生成静态的文件 这里只是简单的删除 (如果有分页附件等情况 可以直接使用帝国内置函数去删除)
$filepath = ECMS_PATH . $news['titleurl'];
// 删除文件
@unlink($filepath);
// 返回删除成功的提示
$api->load('fun')->json(1 , '删除成功');
新闻采集接口
<?php
defined('ECMSAPI_MOD') or exit;
$url = $api->param('url' , '' , 'trim'); // 获取站长网内容链接
// 验证地址是否合法
preg_match('#https:\/\/www.chinaz.com\/(\d+)\/(\d+)\/(\d+)\.shtml#i', $url, $match);
// 没有匹配到正确的地址 返回错误信息
if(empty($match)){
$api->load('fun')->json(0 , '请输入正确的url地址');
}
// 将匹配到的url赋值到$url
$url = $match[0];
// 远程抓取html源码 复杂的站点建议采用curl组件去抓取
$html = file_get_contents($url);
// 定义入库数据默认数据
$data = [
'checked' => 1, // 发布后自动审核
'classid' => 1, // 栏目
'urlmd5' => md5($url)
];
// 获取当前用户登陆情况 若有用户登陆 则将信息对应到用户上
$user = $api->load('user')->getSession();
if($user){
$data['userid'] = $user['userid']; // 发布者id
$data['username'] = $user['username']; // 发布者帐号
$data['ismember'] = 1; // 前台用户发布标记
}else{
$data['userid'] = 1; // 发布者id
$data['username'] = 'admin'; // 发布者帐号
}
// 查询地址是否已采集 通过新建的字段urlmd5来判断
$total = $api->load('db')->total('[!db.pre!]ecms_news' , 'urlmd5 = "'.$data['urlmd5'].'"');
if($total > 0){
$api->load('fun')->json(0 , '此地址已采集过啦');
}
// cutCode 截取字符串函数 保存在自定义函数库中
$data['title'] = cutCode($html , '<meta property="og:title" content="' , '"'); // 标题
$data['titlepic'] = cutCode($html , '<meta property="og:image" content="' , '"'); // 标题图片
$data['smalltext'] = cutCode($html , '<meta name="description" content="' , '">'); // 简介
$data['newstext'] = cutCode($html , '<div id="article-content" class="pcontent">' , '</div>'); // 内容
// 加载table核心类 写入到数据库
$id = $api->load('table')->insert('news', $data); // 使用insert方法写数据
if(false !== $id){
// 入库成功后 自动生成
// 检测是否引用了生成静态函数所在文件 未引用则加载
if( !function_exists('GetHtml') ){
require_once(ECMS_PATH . '/e/class/t_functions.php');
require(ECMS_PATH . '/e/class/functions.php');
}
$news = $api->load('table')->get('news', $id); // 获取当前发布的文章信息
GetHtml($news['classid'] , $news['id'] , $news , 1 , 0); // 生成静态文件
$api->load('fun')->json(1 , $news); // 返回json信息
}else{
$errorinfo = $api->load('table')->getError(); // 获取错误信息
$api->load('fun')->json(0 , $errorinfo); // 返回错误信息
}
自定义函数库内容
<?php
// 截取字符串
function cutCode($code = '' , $start = '' , $end = ''){
if($code === '' || $start === '' || $end === ''){
return '';
};
$i = strpos($code , $start);
$j = strpos($code , $end);
if( false === $i || false === $j){
return '';
};
$temp = explode($start ,$code);
$temp = explode($end , $temp[1]);
return $temp[0];
}
// 批量截取字符串
function cutCodes($code = '' , $start = '' , $end = ''){
if($code === '' || $start === '' || $end === ''){
return [];
}
$i = strpos($code , $start);
$j = strpos($code , $end);
if( false === $i || false === $j){
return [];
}
$temp = explode($start , $code);
$len = count($temp);
$result = [];
for($i = 1 ; $i<$len ; $i++){
$t = explode($end , $temp[$i]);
$result[] = $t[0];
}
return $result;
}