discuz自定义接口开发——一键发帖,自动发帖,站外发帖(主题)

需求:

现有一个公司内部使用的办公系统,需要将每天的活动信息汇总成报表数据自动发布到论坛的某个板块中。之前做了discuz论坛与办公系统的同步登陆功能,使用的Ucenter。查看了相关的api接口,没有找到一键发布论坛帖子的相关设置,所以网上找了相关的信息,自己动手丰衣足食

论坛是discuz,另一个系统是用的Thinkphp32。接触过这两个系统并做过Ucenter同步登陆功能的朋友,应该看着比较明白。

简单了解discuz论坛数据库表结构:

discuz发表主题(帖子)涉及到的几个表:(这里列出了主要的几个相关的表) 
        1、主题表 pre_forum_thread:这个表一个主要数据就是 tid 主题ID
        2、post 分表协调表 pre_forum_post_tableid:这里需要获取一个自增的 pid
        3、帖子表 pre_forum_post :记录主题pid、fid、tid、title、content等主要信息
        4、版块表 pre_forum_forum:这里主要更新版块的主题、帖子数量
        5、帖子主题审核数据表 pre_forum_thread_moderate:这个可以根据自己状况决定,并不是必须的
        6、用户统计表 pre_common_member_count:主要是更新用户的主题数量
        自己处理发帖主要涉及到了上面6个数据库表,其中第5个不是必须的。

想了解discuz 数据库相关信息可以查看:http://www.dz7.com.cn/library/database/

大致数据插入的流程:

        第一步:向 主题表 pre_forum_thread 中插入版块ID、用户ID、用户名、帖子标题、发帖时间等信息。
        第二步:获取第一步插入表 pre_forum_thread 的数据ID,作为主题ID,即 tid 
        第三步:向 post 分表协调表 pre_forum_post_tableid 插入一条数据,这张表中只有一个自增字段 pid 
        第四步:获取 第三步 插入表 pre_forum_post_tableid 的数据ID,作为 pid 
        第五部:向帖子表 pre_forum_post 中插入帖子相关信息,这里需要注意的是: pid为第四部的pid值,tid为第二步的tid值 
        第六部:更新版块 pre_forum_forum 相关主题、帖子数量信息 
        第七步:更新用户 pre_common_member_count 帖子数量信息 
     注:discuz发帖过程主要就是以上7个步骤,通过这几个步骤就可以完成对实现discuz的发帖流程,其中设计到一些积分等其他信息的可以自己加上。 如果这里可以明白的话,下面的就不用看了,自己学着操作就好。

具体的操作:

1.修改扩展文件    UcApi.class.php

这里的扩展文件是Thinkphp未实现Ucenter同步登陆加载的扩展文件

/**
     * [sendForumPost 一键自动发布主题接口]
     * @param  [type] $title   [帖子标题]
     * @param  [type] $content [帖子内容]
     * @return [type]       [description]
     */
    public function sendForumPost($title,$content){
        $uid = 1;//公共信息,使用admin用户的id
        $forumId=112;//主题板块id|112=通知与公告
        $result = send_forum_post($uid,$title,$content,$forumId);
        return $result;
    }

由于固定发个帖子,所以我直接将主题板块id和用户名称,用户id,先写成固定的,大家可以根据自己实际情况灵活设置。

在UcApi.class.php文件中,调用的方法多数是来源于uc_client引入的函数文件client.php

2.修改Ucenter客户端uc_client文件 client.php

这里是模仿创建用户接口流程。在UcApi.class.php文件中接口方法sendForumPost调用自定义内置方法send_forum_post()。


function send_forum_post($uid,$title,$content,$forumId){
	$return = call_user_func(UC_API_FUNC, 'user', 'send_forum', array('title'=>$title,'content'=>$content,'forumId'=>$forumId, 'uid'=>$uid));
	return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
}

这里的call_user_func是一个内置函数。

参数一:数据操作方式。mysql代表直连数据库,还包括其他两种方式:uc_api_mysql 、uc_api_post。

参数二:需要调用的控制器名称,这里调用的是user.php

参数三:调用指定控制器中的方法名称。对应的方法前面会拼接一个on

参数四:向方法中传入的参数数据,这是使用的必须是数组。

3.修改Ucenter客户端uc_client控制器文件 user.php

function onsend_forum(){
    $this->init_input();
    $title = $this->input('title');
    $content = htmlspecialchars($this->input('content'));
	$forumId = $this->input('forumId');
	$uid = $this->input('uid');
	$time = time();
	// 开始入库操作
	// 	第一步:向 主题表 pre_forum_thread 中插入版块ID、用户ID、用户名、帖子标题、发帖时间等信息。
    $this->db->query("INSERT INTO `".UC_DBNAME."`.pre_forum_thread SET fid='$forumId', authorid='$uid', author='admin', subject='$title', dateline='$time', lastpost='$time', lastposter='admin'");  
    //  第二步:获取第一步插入表 pre_forum_thread 的数据ID,作为主题ID,即 tid 
	$tid = $this->db->insert_id();
	//  第三步:向 post 分表协调表 pre_forum_post_tableid 插入一条数据,这张表中只有一个自增字段 pid 
    $this->db->query("INSERT INTO `".UC_DBNAME."`.pre_forum_post_tableid SET pid=''");
    //  第四步:获取 第三步 插入表 pre_forum_post_tableid 的数据ID,作为 pid 
	$pid = $this->db->insert_id();
	//  第五部:向帖子表 pre_forum_post 中插入帖子相关信息,这里需要注意的是: pid为第四部的pid值,tid为第二步的tid值
    $this->db->query("INSERT INTO `".UC_DBNAME."`.pre_forum_post SET pid='$pid', fid='$forumId', tid='$tid', author='admin', authorid='$uid', subject='$title', dateline='$time', message='$content'");
    //  第六部:更新版块 pre_forum_forum 相关主题、帖子数量信息 
	$this->db->query("UPDATE `".UC_DBNAME."`.pre_forum_forum SET posts=posts+1,threads=threads+1 WHERE fid='$forumId'");
    //  第七步:更新用户 pre_common_member_count 帖子数量信息 
	$this->db->query("UPDATE `".UC_DBNAME."`.pre_common_member_count SET posts=posts+1,threads=threads+1 WHERE uid='$uid'");
    
	return $tid;

	// --------------------- 
	// 作者:区块链攻城狮 
	// 来源:CSDN 
	// 原文:https://blog.csdn.net/weixin_42799222/article/details/90899369 
	// 版权声明:本文为博主原创文章,转载请附上博文链接!
}

这里核心的操作数据库的操作就是前面提到的七个步骤,如果不能直接用,可以参考借鉴。如有问题,或者哪里没说明白,可以评论留言。

可有偿提供支持:

discuz论坛服务器搭建

其他论坛内容向discuz论坛做数据导入

discuz插件开发

或者其他技术支持

联系QQ:951488865

发布了40 篇原创文章 · 获赞 41 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/weixin_42799222/article/details/90899369