如何自己做一个接口功能?

如沐春 · 19次点击 · 2天前

网友要求写一个随机获取一篇文章的功能接口。

这对于我而言实在太简单了。。。

废话不多说,直接上教程。


写教程之前,还是要跟大家说一下二次开发的流程:

1 选择一种二次开发的方法(  控制器覆盖 or 控制器方法钩子  【插件开发之控制器方法覆盖 | 极致CMS帮助文档】)

这次我就选用【控制器方法钩子】的方式二开。

2 熟悉功能所需要的技巧

查询数据库,随机获取一条数据的方法,支持多种查询,相关的表有哪些


下面上手来做:

1 在app/home/plugins/下面创建一个文件HomeController.php 

写入下面代码:

namespace app\home\plugins;


use frphp\extend\Page;
use app\home\c\CommonController;
class HomeController extends CommonController
{
	
	public function getRandData(){
		
		
		
	}


}


image.png


2 写相关的功能

随机获取一条内容:

$one = M('article')->find('isshow=1','rand()');
//或者 $one = M()->findSql(' select * from jz_article where isshow=1 order by rand() limit 1');

根据栏目随机获取一条内容:

$tid = 1;//这里设置栏目ID
$biaoshi = $this->classtypedata[$tid]['molds'];//获取模型标识-表名称
$one = M($biaoshi)->find('isshow=1 and tid='.$tid,'rand()');

随机获取 N 条内容:

$tid = 1;//这里设置栏目ID
$num = 2;//这里设置条数
$biaoshi = $this->classtypedata[$tid]['molds'];
$lists = M($biaoshi)->findAll('isshow=1 and tid='.$tid,'rand()',null,$num);


根据推荐字段jzattr查询内容

$tid = 1;//这里设置栏目ID
$num = 2;//这里设置条数
$jzattr = 1;//推荐属性:1置顶2热点3推荐
$biaoshi = $this->classtypedata[$tid]['molds'];
//表中存储的数据如:,1, 或者 ,1,3, 那么查询的时候就要使用like来查询
$sql = "isshow=1 and tid=".$tid." and jzattr like '%,1,%' ";//注意使用双引号
$lists = M($biaoshi)->findAll($sql,'rand()',null,$num);


结合上面的内容,我们写道方法里面:

public function getRandData(){
        $tid = $this->frparam('tid');//这里设置栏目ID
	$num = $this->frparam('num');//这里设置条数
	$jzattr = $this->frparam('attr');//推荐属性:1置顶2热点3推荐
	//这里需要对每个参数进行判断,如果有参数则进行处理,如果没有则给一个默认或者不筛选
	$sql = " isshow=1 ";//必须显示的才输出
	if($tid){
		$sql .= " and tid=".$tid;
		$biaoshi = $this->classtypedata[$tid]['molds'];
		
	}else{
		$biaoshi = 'article';
	}
	if($jzattr){
		$sql .= " and jzattr like '%".$jzattr."%' ";
	}
	// 给默认值1条
	if(!$num){
		$num = 1;
	}
		
	$lists = M($biaoshi)->findAll($sql,'rand()',null,$num);
	JsonReturn(['code'=>0,'data'=>$lists,'msg'=>'success']);
}


ok,完成。

请求链接为:

http://域名/home/getRandData

http://域名/home/getRandData?tid=1

http://域名/home/getRandData?tid=1&num=2

http://域名/home/getRandData?tid=1&num=2&attr=1


image.png


总结:还是挺简单的,主要还是看基础吧,懂一点数据库知识。


后续:有人可能会疑惑,为什么我顶级栏目id传进去,没法输出子栏目的数据?因为查询的时候没用查询子栏目,所以这里需要处理一下。

//$sql .= " and tid=".$tid;
//获取当前栏目和子栏目的数据,对这个数据陌生的,可以参考:classtypedata数据格式 | 极致CMS帮助文档
$ids = $this->classtypedata[$tid]['children']['ids'];
$sql .= " and tid in(".implode(',',$ids).")";


如何限制显示字段?

$lists = M($biaoshi)->findAll($sql,'rand()','id,title,keywords,body,hits',$num);


被收藏 0  ∙  0 赞  
加入收藏
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站