先上示例地址: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;
}