一、Discuz介绍

Discuz是国内比较知名的开源论坛了,后来被腾讯收购,Discuz在设计时就考虑了生态体系的建设,支持插件设计,可以让广大开发者朋友来一起建设生态,不得不说设计者是很有商业头脑的。

回到话题,我们为什么要学习Discuz的插件设计呢,因为假如我们哪天自己想做一套系统,也要支持插件,可以借鉴下相关的设计。

源代码:

https://gitee.com/ComsenzDiscuz/DiscuzX/tree/v3.4-20190917/

插件市场:https://addon.dismall.com/

具体如何安装就不在这里说明了,可以参考官网的说明。

二、插件系统的需 求和场景

在分析Discuz的插件设计之前,我们还是要大概分析下如果设计一个支持插件的系统,系统应该支持哪些功能。

1、安装和反安装

插件安装的过程可能是Mysql中加一些表、将插件的代码覆盖放置到系统可以调用到的地方;

反安装是反过来,如何干净地将插件从系统中删除自己。

2、插件的启用和禁用

这个就不用说了,有些插件可能有些bug,或者和其它插件冲突了,需要临时禁用掉,后面修复问题再启用。

3、插件的加载顺序

因为插件之间可能有加载先后顺序,或者说一个插件依赖另一个插件,就需要设置插件的加载顺序了,这个应该算是用的比较少的场景。

4、插件的自我描述

提供插件名称等信息来描述自己。

5、可以在某个地方以可视化的方式设置插件的参数

插件一般来说是比较通用的,有一些自定义的参数配置,需要在一个地方设置这些插件。

6、能够将自己的接口注入到系统中

插件可能会提供一些接口,这些接口能够被前台的页面调用到,即在浏览器中可以访问。

7、模版的渲染能力

插件必须能渲染自己的页面,可以直接生成页面让前台用户访问。

8、傻瓜式的安装

因为使用网站的人不一定都懂代码,尽量简单、傻瓜式安装,不要有太多安装和运维成本。

9、完善的扩展点

一个设计好的插件应该提供很多扩展点,让插件能够在系统的原有流程上扩充一些能力。

举个例子,支付方式,可以一个插件提供微信,另一个插件提供支付宝的。

在发布帖子后,系统应该要有一种机制让插件捕捉到这个事件,以便做一些操作,像提高用户活跃度,增加积分等操作。

做的更灵活些,甚至可以提供一种机制替换系统的默认实现。

三、Discuz插件机制实现分析

Discuz插件都是放在 upload/source/plugin目录下,我们一个个来分析实现机制。

以下是其中一个插件的代码目录截图:

1、安装和反安装

在插件的根目录提供 install.php和uninstall.php,系统安装和反安装的时候调用相应的文件就行了。

2、插件配置

主要是以xml的方式提供。

<?xml version="1.0" encoding="ISO-8859-1"?><root>  <item id="Title"><![CDATA[Discuz! Plugin]]></item>  <item id="Data">    <item id="plugin">      <item id="available"><![CDATA[1]]></item>      <item id="adminid"><![CDATA[1]]></item>      <item id="name"><![CDATA[微信登录]]></item>      <item id="identifier"><![CDATA[wechat]]></item>      <item id="description"><![CDATA[]]></item>      <item id="datatables"><![CDATA[]]></item>      <item id="directory"><![CDATA[wechat/]]></item>      <item id="copyright"><![CDATA[Comsenz Inc.]]></item>      <item id="version"><![CDATA[1.1.7]]></item>      <item id="__modules">        <item id="1">          <item id="name"><![CDATA[wechat]]></item>          <item id="param"><![CDATA[]]></item>          <item id="menu"><![CDATA[]]></item>          <item id="url"><![CDATA[]]></item>          <item id="type"><![CDATA[11]]></item>          <item id="adminid"><![CDATA[0]]></item>          <item id="displayorder"><![CDATA[0]]></item>          <item id="navtitle"><![CDATA[]]></item>          <item id="navicon"><![CDATA[]]></item>          <item id="navsubname"><![CDATA[]]></item>          <item id="navsuburl"><![CDATA[]]></item>

xml中可以对插件加以说明,关键参数是identifier,这个是插件唯一标识,不能重复。

并且提供参数配置的能力,所有这些符合相应的规范,Discuz自动会加载相应的参数,并且提供保存参数和获取参数的能力。

3、接口注入及页面访问

https://www.xxx.com/plugin.php?id=wechat:sign&operation=qiandao&infloat=1&inajax=1

上面是访问插件 wechat中sign模块,模块以.inc.php结尾,即在插件中查找 sign.inc.php,然后把请求转由该文件处理。

至于如何代码中引入其它文件,系统根目录通过 DISCUZ_ROOT 引用,plugin的目录也确定了,所以只要加上插件自己的目录就可以引用了。

require_once DISCUZ_ROOT . './source/plugin/wechat/wsq.class.php';

渲染页面也是一样,按上面的格式访问,把插件和模块传给plugin.php,然后在相应模块输出页面就可以达到渲染页面的效果了。

4、模板渲染

include_once template('wechat:wechat_threadqr');

用template函数就可引用自己的模板了,参数格式如下

插件:模板名

模板名以.htm结束,里面可以用PHP代码。

5、插件安装

Discuz安装插件有2种方式,1种是在线安装,1种是下载代码到本地安装。

在线安装通过在后台应用中心操作,前提是你必须登录相应的账号,因为有的插件是必须付费的。

安装的过程无非就是把远程插件代码下载到本地,然后解压缩,再按照本地的安装流程操作就行。可以看到整个安装过程是比较傻瓜式的,不需要懂太多的技术。

RabbitMQ跨机房迁移数据零丢失

故障演练利器之ChaosBlade介绍

从一次线上故障来看redis删除机制

直播评论系统分析设计

一次线上Mysql死锁分析

插件系统分析及Discuz插件实现相关推荐

  1. dz.27z.co index.php,dc vip中心 专业版v2.2.1 discuz插件 dzvip插件 vip会员插件 积分充值插件...

    dc vip中心 专业版v2.2.1 Discuz插件 dzvip插件 vip会员插件 积分充值插件 Discuz插件:[DC]VIP中心 专业版v2.2.1.本VIP插件可为普通用户提供额外的操作权 ...

  2. dz php7.1语言包,discuz 插件语言包

    插件语言包 Discuz现在有四个编码的的源代码,分别是GBK,BIG5,UTF8SC,UTF8TC,所以下载安装时,要选择对应编码的源代码包.可以看出DZ也没有方法整合四个编码的源代码,所以在插件开 ...

  3. discuz插件,discuz采集插件,discuz插件工具

    discuz插件,是discuz作为国内最大的论坛类型CMS经常使用到的一些功能,因为其本身功能满足不了站长们的需求,所以更多的是通过discuz插件来实现.特别是网站SEO优化方面,discuz插件 ...

  4. Discuz插件下载-免费Discuz下载安装-Discuz插件附安装教程

    Discuz(Crossday Discuz! Board)是一套通用的社区论坛软件系统.自2001年6月面世以来,Discuz!已拥有15年以上的应用历史和200多万网站用户案例,是全球成熟度最高. ...

  5. discuz插件伪静态如何设置,根据独游魔盒设置经验进行讲解

    刚开始的时候也是没打算做伪静态的,因为我不是程序员出身,虽然懂一点代码,但是对于伪静态的实现还是不大了解.但是一个栏目做了一年之后,百度还是没有收录(在创建栏目之初就已经被谷歌收录,这里可以看出来百度 ...

  6. python微信好友助力_微信好友助力活动,discuz插件

    [实例简介] 微信营销,好友助力活动discuz插件,有需要的小伙伴抓紧了,价值200元 [实例截图] [核心代码] tom微信好友助力2.3 └── tom微信好友助力2.3 └── tom_wei ...

  7. Discuz!插件模板实现DIY的方法

    Discuz系统模板里的DIY功能相信使用过该系统的人都非常熟悉了,那么怎么在开发插件的时候再插件的模块里面实现DIY功能呢,本文将介绍具体的实现方法: 示例插件: nimba_diypage/ ni ...

  8. Discuz插件 微信购买会员用户组V2.180418商业版

    介绍 Discuz插件 微信购买会员用户组V2.180418商业版,支持支付宝,微信付款方式购买功能等 功能描述 尽管网络时代已经经过无数次的变革,但是收费会员制至今仍然是一个网站重要的盈利点,上至 ...

  9. rcp(插件开发)插件B需要引用插件A中的jar包-如何处理依赖关系

    如果插件B需要引用插件A中的jar 通常需要以下几步: 1.插件B要依赖插件A 2.在插件B的build path中添加插件A的jar包 3.插件A的runtime导出插件B中使用jar的packag ...

最新文章

  1. 应用程序启动器 标记为信任_为什么您今天不能信任应用程序-以及如何解决它...
  2. 为什么要采购订单而不采购库存?
  3. 将所有单个json标注文件合并成一个总的json标注文件(COCO数据集格式)
  4. python中的内置函数怎么学_python内部函数学习(九)
  5. [JSP暑假实训] 一.MyEclipse安装及JAVA基础知识
  6. python基本语法:列表(列表和元组的区别)
  7. 【Python3网络爬虫开发实战】 1.2.2-Selenium的安装
  8. LINUX之samba服务器的安装与配置(基于redhat 6.3发行版)
  9. c语言谢延红主编答案,C语言程序设计课程改革与实践.doc
  10. 普通程序员如何向人工智能方向转型?
  11. 2020保研夏令营之路——武大网安、北理计算机、中科院信工所六室
  12. torch.nn.Module.named_buffers(prefix=‘‘, recurse=True)
  13. python的os为啥找不到文件_python – pyenchant在Mac OS X上找不到字典文件
  14. 11.2 逃课是个需要严肃对待的问题——《逆袭大学》连载
  15. Northleaf扩大业务开发团队,任命Chris O’Connor 为澳大利亚和新西兰地区董事总经理
  16. BMC Eaglestream利用PECI计算CPU、Memory功耗
  17. 汽车外饰360vr实景展示有哪些应用场景?
  18. OpenCV截取一段视频
  19. python程序的控制结构思维导图_python学习之路2(程序的控制结构)
  20. 新版谷歌眼镜专利曝光:终于像普通眼镜了

热门文章

  1. html5 放鞭炮效果,flash如何制作鞭炮的爆炸效果
  2. docker-desktop和docer历史版本下载
  3. 配置云服务器+bt面板搭建自己的服务器
  4. 图的建立——邻接矩阵
  5. 求最小公倍数(华为机试,Go)
  6. ascii码中的A的代码是什么?
  7. draw.io diagrams 画图 插入latex数学公式
  8. 2021年高考成绩查询达州,四川省达州市2021年普通高校招生网上报名入口
  9. 浅谈web1.0和web2.0的主要区别。
  10. 一套系统要不要这样贵,5亿美元