Discuz! X是腾讯旗下康盛公司(Comsenz)推出的一个以社区为基础的专业建站平台,让论坛(BBS)、社交网络(SNS)、门户(Portal)、群组(Group)、开放平台(Open Platform)应用充分融合于一体,帮助网站实现一站式服务,在国内应用很普遍,是非常成熟的建站应用。学习discuz不仅对于php web者有重要的指导意义,对java web搭建完善的建站系统也有重要的学习和参考价值,并且很多界面元素可以直接应用。我们以Discuz!x3.2为基础,初步学习一下它的源码。
一 、目录结构 Discuz!x虽然然目录和文件都很多,但是实际上结构还是很清晰,大多数情况下通过文件名和目录就能知道某个文件的作用。比如: \source\class\discuz\discuz_censor.php 用来处理敏感词过滤的类 \source\function\function_credit.php 处理积分操作的函数库 \source\module\forum\forum_viewthread.php 处理帖子显示页面的模块 另外,source目录下的class、function、module、include、admincp这几个文件夹下的程序文件命名要遵守如下规则:文件名前缀为所在目录的名字加上下划线(_)目录结构详细: /┬── api 外部接口 │ ├── connect 腾讯互联 │ ├── db UCenter数据库备份接口 │ ├── google Google引擎使用 │ ├── javascript 数据和广告的 JS调用 │ ├── manyou manyou应用及搜索等相关服务 │ └── trade 在线支付接口 ├── archiver 论坛静态化 ├── config 站点配置文件 ├── data 数据缓存及附件 │ ├── attachment 上传的文件目录 │ │ ├── album 相册专用 │ │ ├── block DIY专用 │ │ ├── common 公共上传 │ │ ├── forum 论坛附件专用 │ │ ├── group 群组图标和头部图片专用 │ │ ├── portal 门户上传文件专用 │ │ ├── profile 个人资料专用 │ │ └── temp 临时文件 │ ├── avatar 视频认证专用 │ ├── backup 站点数据备份 │ ├── cache 数据缓存 │ ├── diy DIY模块缓存 │ ├── ipdata Discuz!IP库 │ ├── log 站点日志,前/后台管理日志、错误日志等 │ ├── plugindata 插件缓存数据 │ ├── template 模板缓存目录 │ └── threadcache 帖子缓存 ├── install 安装目录 ├── source 代码主目录 │ ├── admincp 后台程序 │ │ ├── cloud Discuz!云平台 │ │ ├── menu 菜单 │ │ └── moderate 审核功能 │ ├── archiver 论坛静态化功能代码 │ ├── class 类文件目录 │ │ ├── adv 站点广告功能 │ │ ├── block DIY模块功能文件 │ │ ├── cache 缓存类 │ │ ├── db 数据库类 │ │ ├── discuz discuz类 │ │ ├── forum 论坛 │ │ ├── helper 存放从function_core分离出来的一部分函数 │ │ ├── lib 工具类的集合类 │ │ ├── magic 道具 │ │ ├── memory 内存类 │ │ ├── secqaa 验证问答 │ │ ├── table 数据表操作类 │ │ └── task 站点任务功能 │ ├── function 函数文件 │ │ └── cache 缓存功能拆分目录 │ ├── include 被包含的文件 │ │ ├── collection 淘帖 │ │ ├── cron 计划任务 │ │ ├── misc 杂项 │ │ ├── modcp 前台论坛管理 │ │ ├── portalcp 前台门户管理 │ │ ├── post 帖子相关 │ │ ├── search 搜索功能 │ │ ├── space 家园和个人相关功能 │ │ ├── spacecp 个人设置相关 │ │ ├── table 编码转换数据 │ │ ├── thread 查看主题相关 │ │ └── topicadmin 前台主题管理 │ ├── language 站点语言包 │ │ ├── adv 广告 │ │ ├── block DIY模块 │ │ ├── forum 论坛 │ │ ├── group 群组 │ │ ├── home 家园 │ │ ├── magic 道具 │ │ ├── member 登录注册页面语言 │ │ ├── mobile 手机访问功能语言 │ │ ├── portal 门户语言 │ │ ├── ranklist 排行榜语言 │ │ ├── search 搜索 │ │ ├── secqaa 安全问答 │ │ ├── tag 标签 │ │ ├── task 任务 │ │ └── userapp manyou应用 │ ├── module 功能模块 │ │ ├── connect 腾讯互联 │ │ ├── forum 论坛 │ │ ├── group 群组 │ │ ├── home 家园 │ │ ├── member 登录注册 │ │ ├── misc 杂项 │ │ ├── portal 门户 │ │ ├── search 搜索 │ │ └── userapp 应用 │ └── plugin 插件目录 │ ├── cloudstat Discuz!云平台 │ ├── myapp Manyou应用 │ ├── myrepeats 马甲功能 │ ├── qqconnect 腾讯互联 │ └── soso_smilies 腾讯搜搜表情 ├── static 非PHP文件 │ ├── image 界面图片 │ ├── js 站点JS脚本 │ ├── space 空间皮肤 │ └── topic 门户皮肤 ├── template 模板目录 │ └── default 默认风格 ├── uc_client UCenter客户端程序 └── uc_server UCenter服务端程序
二、重要表结构
pre_common_addon 插件扩展中心服务商表 pre_common_admincp_cmenu 后台管理面板,自定义常用菜单表 pre_common_admincp_group 后台团队职务名称表 pre_common_admincp_member 后台管理员成员表 pre_common_admincp_perm 后台团队职务权限分配表 pre_common_admincp_session 后台管理面板登录session表 pre_common_admingroup 后台管理组权限分配表 pre_common_adminnote 管理团队留言表 pre_common_advertisement 广告位管理表 pre_common_advertisement_custom 广告位自定义名称 pre_common_banned 禁止IP表 pre_common_block DIY模块表 pre_common_block_favorite DIY模块收藏表:门户管理的模块管理里使用 pre_common_block_item DIY模块属性表 pre_common_block_item_data DIY模块数据表 pre_common_block_permission DIY模块权限表 pre_common_block_pic DIY模块图片表 pre_common_block_style DIY模块风格表 pre_common_block_xml 模块XML扩展类数据表 pre_common_cache 公用缓存表 pre_common_card 充值卡表 pre_common_connect_guest QQ互联游客表 pre_common_credit_log 积分记录表 pre_common_credit_log_field 积分记录详细信息 3.0版本增加 pre_common_credit_rule 积分策略表 pre_common_credit_rule_log 积分策略生效记录 pre_common_credit_rule_log_field 积分策略生效记录扩展 pre_common_cron 计划任务表 pre_common_devicetoken 设备数据表 3.0增加 pre_common_district 地区列表 pre_common_diy_data DIY数据表 pre_common_domain 应用域名分配表 pre_common_failedlogin 普通登录失败日志表 pre_common_friendlink 友情链接表 pre_common_grouppm 群发短信列表内容 pre_common_invite 邀请码表 pre_common_magic 道具表 pre_common_magiclog 道具日志表 pre_common_mailcron 邮件计划任务表 pre_common_mailqueue 邮件发送队列表 pre_common_member 用户表,密码是随机生成记录,实际记录在UCenter pre_common_member_action_log 用户表操作日志表 pre_common_member_connect 用户QQ互联表 pre_common_member_count 用户数据统计表 pre_common_member_crime 用户惩罚操作表 pre_common_member_field_forum 用户论坛设置表 pre_common_member_field_home 用户家园设置表 pre_common_member_forum_buylog 论坛购买日志 pre_common_member_grouppm 用户群发消息状态表 pre_common_member_log 用户操作日志表 pre_common_member_magic 用户道具配置表 pre_common_member_medal 用户勋章表 pre_common_member_newprompt 用户新提醒表 pre_common_member_profile 用户个人信息表 pre_common_member_profile_setting 用户个人信息设置表 pre_common_member_security 个人信息修改审核 pre_common_member_stat_field 用户状态字段表 pre_common_member_status 用户状态表 pre_common_member_validate 用户认证审核 pre_common_member_verify 用户认证设置 pre_common_member_verify_info 用户认证信息 pre_common_moderate 审核数据表 pre_common_myapp 漫游应用表 pre_common_myapp_count 漫游应用数据统计表 pre_common_myinvite 漫游邀请表 pre_common_mytask 用户任务表 pre_common_nav 导航菜单表 pre_common_onlinetime 在线时间表 pre_common_optimizer 优化表 pre_common_patch 漏洞补丁表 pre_common_plugin 插件表 pre_common_pluginvar 插件参数表 pre_common_process 高速缓存表 pre_common_regip 注册IP表,防重复注册 最多五次 pre_common_relatedlink 相关链接 pre_common_report 举报表 pre_common_searchindex 搜索索引表 pre_common_secquestion 密码问答问题表 pre_common_session 用户登录session表 pre_common_setting 网站设置参数表 pre_common_smiley 表情表 pre_common_sphinxcounter sphinx搜索程序用表 pre_common_stat 统计表 pre_common_statuser 统计用户表 pre_common_style 风格表 pre_common_stylevar 风格参数表 pre_common_syscache 系统参数缓存表 pre_common_tag tag表 pre_common_tagitem tag内容表 pre_common_task 用户任务表 pre_common_taskvar 任务参数表 pre_common_template 模板表 pre_common_template_block 模板模块表 pre_common_template_permission 模板权限表 pre_common_uin_black UIN 黑名单 pre_common_usergroup 用户组表 pre_common_usergroup_field 用户组权限表 pre_common_usergroup_field 用户组权限表 pre_common_visit 访问表 pre_common_word_type 敏感词类型表 pre_connect_disktask 磁盘任务 pre_connect_feedlog Connect feed日志表 pre_connect_memberbindlog Connect 用户绑定/解绑记录表 pre_connect_postfeedlog Connect 回帖帖feed日志 pre_connect_tthreadlog Connect 发帖帖帖feed日志 pre_connect_tlog 微博日志表 pre_forum_access 论坛访问权限单独设置表 pre_forum_activity 论坛活动表 pre_forum_activityapply 论坛活动报名表 pre_forum_announcement 论坛公告表 pre_forum_attachment 1.5 = 论坛附件表, x2 = 附件索引表 pre_forum_attachment_0 附件表(x2),用了分表即表名最后一位数字 = 附件tid的最后一位 pre_forum_attachmentfield 论坛附件扩展表(x2以去除) pre_forum_attachment_exif 论坛附件exif信息表 pre_forum_attachment_unused 未使用的附件表 pre_forum_attachtype 论坛附件类型表 pre_forum_bbcode 论坛UBBCODE表 pre_forum_collection 淘帖专辑表 pre_forum_collectioncomment 淘帖评论表 pre_forum_collectionfollow 淘帖订阅表 pre_forum_collectioninvite 邀请管理淘专辑表 pre_forum_collectionrelated 淘帖主题被收入专辑表 pre_forum_collectionteamworker 淘帖合作编辑表 pre_forum_collectionthread 淘帖包含主题表 pre_forum_creditslog 论坛积分日志表 pre_forum_debate 辩论主题表 pre_forum_debatepost 辩论帖子表 pre_forum_faq 常见问答表 pre_forum_filter_post 过滤回帖表 pre_forum_forum 论坛板块表 pre_forum_forumfield 论坛板块设置表 pre_forum_forumrecommend 版块推荐帖表 pre_forum_forum_threadtable 主帖表 pre_forum_groupcreditslog 群组积分日志 pre_forum_groupfield 群组表 pre_forum_groupinvite 群组邀请表 pre_forum_grouplevel 群组级别表 pre_forum_groupuser 群组用户表 pre_forum_hotreply_member 火热回复用户表 pre_forum_hotreply_number 火热回复数字表 pre_forum_imagetype 图像类型表 pre_forum_medal 勋章表 pre_forum_medallog 勋章发放日志表 pre_forum_memberrecommend 用户推荐表 pre_forum_moderator 版主表 pre_forum_modwork 版主工作表 pre_forum_newthread 论坛新主题表 pre_forum_onlinelist 论坛在线列表 pre_forum_order 论坛订单表 pre_forum_poll 论坛投票帖表 pre_forum_polloption 论坛投票选项表 pre_forum_polloption_image 投票选项图片表 pre_forum_pollvoter 论坛投票用户表 pre_forum_post 论坛回复表 pre_forum_postcomment 帖子评论表 pre_forum_postlog 回复日志表 pre_forum_postposition 回复楼层表 pre_forum_poststick 回复置顶到主题帖表 pre_forum_post_moderate 论坛回复管理表 pre_forum_post_location 论坛回复地理信息位置表 pre_forum_post_tableid 分表后回复帖的ID pre_forum_postcache 论坛回复缓存表 pre_forum_postcomment 论坛回复点评表 pre_forum_postlog 论坛回复日志表 pre_forum_poststick 论坛回复插入 pre_forum_promotion 网站推广表 pre_forum_ratelog 打分日志表 pre_forum_relatedthread 相关帖子表 pre_forum_rsscache RSS缓存表 pre_forum_sofa 论坛沙发表 pre_forum_spacecache 空间信息缓存表 pre_forum_statlog 论坛统计日志 pre_forum_thread 主帖列表 pre_forum_threadpreview 主帖预览表 pre_forum_threadprofile 帖子信息表 pre_forum_threadprofile_group 帖子信息组表 pre_forum_threadcalendar 帖子日历表 pre_forum_thread_moderate 主题管理表 pre_forum_threadaddviews 帖子查看数字表 pre_forum_threadclass 帖子分类表 pre_forum_threadclosed 帖子关闭表 pre_forum_threaddisablepos 帖子取消表 pre_forum_threadhot 火热主题表 pre_forum_threadimage 主题图片表 pre_forum_threadlog 主题日志表 pre_forum_threadmod 主题管理记录表 pre_forum_threadtype 主题分类信息表 pre_forum_trade 商品帖数据表 pre_forum_tradecomment 商品帖评论 pre_forum_tradelog 商品帖交易日志 pre_forum_typeoption 类型选项 pre_forum_typeoptionvar 类型选项参数 pre_forum_typevar 类型参数 pre_forum_warning 警告表 pre_home_album 家园相册表 pre_home_album_category 家园相册分类表 pre_home_appcreditlog 家园应用积分日志 pre_home_blacklist 家园黑名单表 pre_home_blog 家园博客表 pre_home_blogfield 家园博客内容表 pre_home_blog_category 家园博客分类表 pre_home_blog_moderate 家园日志管理表 pre_home_class 日志个人分类表 pre_home_click 对日志和图片表态动作 pre_home_clickuser 静态用户表 pre_home_comment 家园评论表 pre_home_comment_moderate 家园评论留言管理表 pre_home_docomment 家园记录回复表 pre_home_doing 家园记录表 pre_home_doing_moderate 家园记录管理表 pre_home_favorite 家园收藏表 pre_home_feed 家园动态表 pre_home_feed_app 漫游APP动态表 pre_home_follow 家园收听表 pre_home_follow_feed 收听FEED表 pre_home_follow_feed_archiver 收听归档表 pre_home_friend 家园好友表 pre_home_friendlog 好友日志表 pre_home_friend_request 好友请求表 pre_home_notification 通知消息 pre_home_pic 家园图片表 pre_home_pic_moderate 家园日志管理表 pre_home_picfield 相册相关信息表 pre_home_poke 打招呼表 pre_home_pokearchive 打招呼归档 pre_home_share 分享表 pre_home_share_moderate 家园分享管理表 pre_home_show 上榜宣言 pre_home_specialuser 明星会员表 pre_home_userapp 漫游APP pre_home_userappfield 漫游APP pre_home_userapp_stat 漫游APP统计 pre_home_viewlog 日志和用户访问记录表 pre_home_visitor 最近访客记录表 pre_home_follow 广播收听表 pre_home_follow_feed 广播表 pre_home_follow_feed_archiver 广播归档表 pre_mobile_setting 手机设置表 pre_portal_article_content 文章内容表 pre_portal_article_count 文章计数表 pre_portal_article_moderate 门户文章管理表
表数据举例:
三 、全局变量 $_G
|
1. 定义及初始化
在discuz_application.php中_init_env定义了这个变量以及对它初始化
global $_G;
$_G= array(
'uid'=> 0,
'username'=> '',
'adminid'=> 0,
'groupid'=> 1,
'sid'=> '',
'formhash'=> '',
'connectguest'=> 0,
'timestamp'=> TIMESTAMP,
'starttime'=> microtime(true),
'clientip'=> $this->_get_client_ip(),
'remoteport'=> $_SERVER['REMOTE_PORT'],
'referer'=> '',
'charset'=> '',
'gzipcompress'=> '',
'authkey'=> '',
'timenow'=> array(),
'widthauto'=> 0,
……
2. 部分成员
$_G['uid'] =>当前登录UID
$_G['username']=> 当前登录用户名
$_G['adminid']=> 当前登录ID管理组ID
$_G['groupid']=> 当前登录ID用户组ID
$_G['cookie']=> 客户端cookie
$_G['formhash']=> 当前登录ID的【FORMHASH】主要用于表单提交
$_G['timestamp']=> 当前活动时间
$_G['starttime']=> 1317042440.3242
$_G['clientip']=> 当前访问者IP地址
$_G['referer']=> 当前请求的地址,主要用户表单提交
$_G['charset']=> 程序编码
$_G['PHP_SELF']=> 当前访问页面的相对地址
$_G['siteurl']=> 程序访问地址
$_G['siteroot']=> 程序所在域名的相对目录
$_G['fid'] =>当前版块id【主题列表页、帖子页】出现
3.部分风格变量
$_G['style']=> Array
$_G['style'][styleid]=> 当前风格ID
$_G['style'][name]=> 当前风格名
$_G['style'][templateid]=> 当前模板体系
$_G['style'][tpldir]=> 当前模板目录
$_G['style'][menuhoverbgcolor]=> 导航菜单高亮背景颜色
$_G['style'][lightlink]=> 浅色链接颜色
$_G['style'][floatbgcolor]=> 弹出窗口背景属性
四 forum.php代码
forum.php是论坛的主页面,我们学习一下它的主要流程:
/**
* [Discuz!] (C)2001-2099 Comsenz Inc.
* This is NOT a freeware, use is subject to license terms
*
* $Id:forum.php 33828 2013-08-20 02:29:32Z nemohou $
*/
//定义应用ID
define('APPTYPEID',2);
// //定义当前应用脚本名称
define('CURSCRIPT','forum');
//基础文件引入 discuz核心类 ,几乎所有模块使用
require'./source/class/class_core.php';
//论坛通用函数集
require'./source/function/function_forum.php';
//模块定义,模块数组
$modarray =array('ajax','announcement','attachment','forumdisplay',
'group','image','index','medal','misc','modcp','notice','post','redirect',
'relatekw','relatethread','rss','topicadmin','trade','viewthread','tag',
'collection','guide');
//模块缓存定义,模块缓存hash表
$modcachelist =array(
'index' =>array('announcements', 'onlinelist', 'forumlinks',
'heats','historyposts', 'onlinerecord', 'userstats', ' diytemplatenameforum'),
'forumdisplay' => array('smilies', 'announcements_forum', 'globalstick',
'forums', 'onlinelist', 'forumstick', 'threadtable_info','threadtableids', 'stamps',
'diytemplatenameforum'),
'viewthread' => array('smilies', 'smileytypes', 'forums', 'usergroups',
'stamps', 'bbcodes', 'smilies', 'custominfo', 'groupicon', 'stamps',
'threadtableids', 'threadtable_info','posttable_info', 'diytemplatenameforum'),
'redirect' =>array('threadtableids', 'threadtable_info', 'posttable_info'),
'post' => array('bbcodes_display','bbcodes', 'smileycodes', 'smilies',
'smileytypes', 'domainwhitelist', 'albumcategory'),
'space' =>array('fields_required', 'fields_optional', 'custominfo'),
'group' =>array('grouptype', 'diytemplatenamegroup'),
);
//合法性判断
$mod =!in_array(C::app()->var['mod'], $modarray) ? 'index' :C::app()->var['mod'];
//将$mod的值定义给常量CURMODULE,论坛及模板解析时会用到
define('CURMODULE',$mod);
$cachelist =array();
if(isset($modcachelist[CURMODULE])){
$cachelist = $modcachelist[CURMODULE];
$cachelist[] = 'plugin';
$cachelist[] = 'pluginlanguage_system';
}
//判断core中app方法返回的对象中的var数组中键位mod的元素值是否等于group
//第一次var['mod']的值应该为null
if(C::app()->var['mod']== 'group') {
$_G['basescript'] = 'group';
}
C::app()->cachelist= $cachelist;
//初始化,Init函数包含了init db,memory,user,session,setting,cron等
C::app()->init();
//重要函数,获取论坛数据,查数据库
loadforum();
set_rssauth();
//插件加载函数
runhooks();
$navtitle =str_replace('{bbname}', $_G['setting']['bbname'],$_G['setting']['seotitle']['forum']);
$_G['setting']['threadhidethreshold']= 1;
require DISCUZ_ROOT.'./source/module/forum/forum_'.$mod.'.php';
?>
五 一个利用discuz api的例子
下面我用一个
//这个只是获取当前用户账号以及积分的方法
require './source/class/class_core.php';//引入系统核心文件
$discuz = & discuz_core::instance();//以下代码为创建及初始化对象
$discuz->cachelist = $cachelist;
$discuz->init();//以上是调用discuz公共执行类等核心代码
$discuz_user= $_G['username'];
echo "current user:".$discuz_user;
$connect=mysql_pconnect("localhost","root","wang");//mysql数据库域名,账户,密码
if(!mysql_select_db('ultrax',$connect))//discuz 数据库名
echo ("数据库连接失败!");
//构造查询的SQL语句,查询积分
$sql="SELECT * FROM pre_common_memberWHERE username='".$discuz_user."'";
$res = mysql_query($sql);//执行查询语句
$row=mysql_fetch_assoc($res);//将结果转换成数组
echo " credits:".$row["credits"];//显示积分字段credits的内容
echo mysql_error();//发生错误后显+示错误信息
?>
运行结果:
参考:
数据表: http://blog.csdn.net/quweiie/article/details/38636331
相关知识: http://blog.csdn.net/yanhui_wei/article/details/24967399
论坛入口forum : http://blog.sina.com.cn/s/blog_5e2308c80101m9a1.html