Discuz!NT+系统架构分析
discuz!、discuz!NT和discuz!X的区别
discuz!、discuz!NT和discuz!X的区别从去年开始接触discuz,当时只有php的版本,版本是7.0的,我是net技术出身。
所以一开始有排斥。
不过对于他们的前台,后台功能在使用的体验确实让人比较满意。
稍微懂一点技术和css的操作起后台并不困难。
可惜众口难调,功能不管怎么不错,毕竟不能让人真的满意。
于是开始对它开始修改。
七改八改几次后。
发现了问题。
自己都不知道改了哪些地方。
官方发布新的版本,如果你没有修改过css 或是php代码,那么恭喜你。
你可以比较顺利的升级了。
如惹不然。
你就要为升级准备加班了。
目前已经有的版本,基本php语言和net(C#)的平台。
都遵守三层的mvc结构。
discuz!,discuz!NT,discuz!X。
三个版本。
于其说是版本的进步。
不如理解为发展方向的改变。
discuz!,discuz!X都是基于php的语言。
x版更像一个多元的门户网把所有的东西进行一鼓脑的整合。
从论坛到空间,相册,再到聚合。
网站的结构和规模都越来越大。
不知道什么样的方向定位也使得许多站长非常无奈。
当然如果是新的项目,最好的选择是直接用最新的平台。
从用户体验上说,三者存在一定的差别,nt版到3.1了,支持silverlight的技术变得成熟了,加入一个特效。
就论坛而言,和discuz!没有什么非常大的用户体验差异。
discuz!X版呢由于整合的功能太多。
常常感觉不知道从哪里开始点。
怎么用这个网站。
从技术角度上说,可以说是一个痛苦的过程。
一个是升级,很可能会失败,一旦这样多数站长就不准备升级了。
就直接这样将就着。
从修改的角度看。
discuz!发展到7.2的版本,主题风格改变,如果你没有修改过功能或是样式。
那更换主题是一件相对轻松的事。
不然你又要头痛熬夜了。
如果你掌握了它的文件结构比如css和xml。
加上自己会做美工。
那你很幸运。
你可以花上几个礼拜的时间自己做一个喜欢的。
discuz!X版目前聚合首页没有模板,nt也存在这样的问题。
网站建设系统解决方案Discuz!社区动力论坛系统解决方案
--------------------------------------------------------------------------------------------------------------------------本资料由郑州网站建设E网中国()整理编辑,未经许可不得转载。
郑州网站建设,郑州网站设计制作,郑州网络公司,网站优化,网站推广,网站搜索引擎优化请找专业郑州网站建设E网中国--------------------------------------------------------------------------------------------------------------------------一、Discuz!社区动力论坛系统简介:Crossday Discuz! Board 论坛系统(简称Discuz! 论坛,中国国家版权局著作权登记号2006SR11895)是一个采用PHP 和MySQL 等其他多种数据库构建的高效论坛解决方案。
论坛软件系统亦称电子公告板(BBS)系统,它伴随社区BBS的流行而成为互联网最重要的应用之一,也逐渐成为网站核心竞争力的标志性体现。
作为商业软件产品,Discuz! 在代码质量,运行效率,负载能力,安全等级,功能可操控性和权限严密性等方面都在广大用户中有良好的口碑。
2006年7月CNNIC 发布的最新统计表明,43.2% 的中国网民经常使用论坛/BBS/讨论组,论坛社区应用首次超过即时通讯 IM ,成为仅次于收发Email的互联网基本应用。
Crossday Discuz! Board(以下简称 Discuz!,中国国家版权局著作权登记号 2006SR11895)是康盛创想(北京)科技有限公司(英文简称Comsenz)推出的一套通用的社区论坛软件系统,用户可以在不需要任何编程的基础上,通过简单的设置和安装,在互联网上搭建起具备完善功能、很强负载能力和可高度定制的论坛服务。
discuz! 页面含义及目录结构分析
discuz!页面含义及目录结构分析2009-6-10 15:35admincp.php——后台系统设置程序文件,一般只处理菜单的显示的访问权限,不处理管理控制。
attachment——附件文件,仅仅处理附件下载的功能。
announcement.php——论坛公告的显示,一般很少改blog.php——浏览BLOG文章时候会用的,非常容易理解config.inc.php——配置论坛数据库、密码等信息,这个大家最熟悉了digest.php——论坛精华区的信息显示,不用多说了吧?discuz_version.php——论坛版本信息,用来更新用的,没有官方说明绝对不要修改faq.php——论坛帮助系统,不过我看绝对没人用forumdisplay.php——很简单,论坛主题列表的显示index.php——控制首页元素显示logging.php——登陆系统,判断用户名、密码。
mail_config.inc.php——配置论坛EMAIL功能member.php——控制会员列表显示,积分策略等等信息显示memcp.php——会员控制面板misc.php——控制评分功能、BLOG、论坛界面显示功能等等plugin.php——论坛插件,这个主要控制论坛插件的菜单的显示,一般极少修改pm.php——论坛短信息程序,控制短信息发表与浏览post.php——与viewthread.php相似,但是更多是管理帖子发表、编辑等等信息,也会有权限的控制提示redirect.php——控制显示论坛的最后发表的主题访问register.php——注册文件,同时也会控制注册的信息的合法性rss.php——RSS快速订阅,不用多说了吧?search.php——处理论坛搜索功能中的信息筛选seccode.php——论坛注册,生成验证码的程序stats.php——处理统计中的统计信息topic.php——一般无法直接访问,控制页面显示,显示主题条数topicadmin.php——控制的是管理人员的前台管理操作,如精华、置顶、高亮等等viewpro.php——处理浏览会员信息的内容显示viewthread.php——处理浏览帖子时候的帖子信息显示,例如信息、标题等等,同时也处理访问帖子的权限,如阅读权限是否足够等等。
论坛系统设计方案
论坛系统设计方案论坛系统是一种用于在线讨论、交流的平台,用户可以在论坛上发表帖子、回复他人的帖子,并与其他用户进行讨论。
为了设计一个高效、可扩展、安全的论坛系统,下面是一个论坛系统设计方案。
首先,需要确定论坛系统的功能需求。
常见的论坛系统功能包括用户注册、登录、发帖、回帖、搜索、私信等。
用户注册和登录模块可以使用常见的用户认证方式,如用户名+密码,手机验证码等。
发帖和回帖模块需要提供富文本编辑器,并支持图片、链接、表情等元素的插入。
搜索功能可以基于关键词实时搜索帖子和用户,并提供相关性排序。
私信模块可以通过建立用户之间的关注关系实现,用户可以发送私信给关注的用户。
其次,需要设计论坛系统的数据结构和数据库表结构。
论坛系统的数据结构主要包括用户、帖子、回帖、标签等。
用户表包含用户的基本信息,如用户名、密码、邮箱、头像等。
帖子表包含帖子的基本信息,如标题、内容、发帖时间等。
回帖表包含回帖的基本信息,如回帖内容、回帖时间等。
标签表用于给帖子添加标签,方便用户进行分类浏览和搜索。
在数据库设计方面,可以采用关系数据库来存储论坛系统的数据。
用户表、帖子表、回帖表和标签表可以分别建立对应的数据库表,并通过主键和外键来建立关联关系。
同时,为了提高查询效率,可以建立索引来加速常见的查询操作。
另外,为了提高论坛系统的性能和可扩展性,可以采用分布式架构。
可以使用分布式文件系统存储用户上传的图片和其他附件,使用分布式缓存来缓存热门帖子和用户数据,使用负载均衡技术来均衡请求,使用数据库读写分离来提高数据库性能等。
此外,还可以使用CDN来加速图片和静态文件的访问速度。
最后,为了保证论坛系统的安全性,可以采取一些措施。
可以通过用户登录认证、权限控制等方式来保护用户数据的安全性。
同时,对于用户发表的帖子和评论,可以设置敏感词过滤和人工审核等机制,防止违法和不良信息的出现。
此外,还需要对用户上传的图片和附件进行安全验证和过滤,防止恶意代码的注入。
BBS论坛系统
数据库表及关系建立
1.用户基本资料表 2.用户详细信息表 3.论坛文章表 4.论坛版块表 5.回帖信息表
用户基本资料表
用户详细信息表
论坛文章表
论坛版块表
回帖信息表
封装的Bean
usersBean.java userdetaiBean.java forumBean.java boardBean.java replyBean.java DB.java page.java
系统功能结构_前台功能结构
用户访问论坛首页面后,可进行查看版面 下根贴信息、查看自己发表的帖子、查看 根贴信息、用户注册等功能。用户在此 BBS论坛中通过注册成为该网站的真正用 户并成功登录系统后,可进行发表帖子、 回复帖子、查看自己发表的帖子等操作。 前台功能结构图如图下所示。
系统功能结构_后台功能结构
若用户的权限为管理员,则可进入后台, 可进行回帖的管理、版块管理和用户管理 等操作。后台功能结构图如ER图概念化地构建实体间关系的模型,这使得它 们区别于数据库模型图。ER图的理念是:项目所 有参与者能理解ER图。ER图由不同实体类型、 关系、特性和类型构成。实体是诸如用户的实际 对象,有时更抽象,但必须有业务意义。特性用 于描述实体,关系用于实体之间 (1)实体:现实世界中的事物; (2)属性:事物的特性; (3)联系:现实世界中事物间的关系。实体集的 关系有一对一、一对多、多对多的联系。
Discuz!任务系统简析 (一)帖子类任务
Discuz!任务系统简析 (一)帖子类任务
与以往版本相比,Discuz! 7.0.0 正式版的亮点之一是增加了任务系统。
任务系统常见于各种计算机软件程序和大型网游。
对于网游来说,游戏开发商为了活跃用户、提高用户与游戏、用户与用户之间的交互性而设计了任务系统,往往是大有收获;与网游不同的是,Discuz! 7.0.0 正式版的任务系统是为了活跃论坛,同时也能活跃会员,提高论坛会员的参与性、积极性,会员除了看帖、回帖,现在也可以做做任务,更有各种奖励。
无论是新会员还是潜水的老会员,都将被任务系统“钓”出水面。
下面,就对任务系统中的“帖子类任务”进行简单分析。
可以看到Discuz! 7.0.0 正式版目前开放了5个任务系统,这里只着重分析帖子类任务。
完成任务基本设置:任务名称、任务描述、任务图标、上线日期等。
帖子类任务常用于论坛举办各种重大活动、发布各种重大公告、决议事项等等,例如新产品发布、新活动上线、新版块开张、新主题策划、论坛重大调整或人事变动等等。
在2008年12月12日发布 Discuz! 和UCenter Home新版本时,康盛创想(Comsenz)公司就设置了帖子类任务“庆祝 Discuz! 和UCenter Home发布,百万金币等你来拿”。
此活动让这个任务帖子在一天之内回复达12404页,总回复124031楼,浏览量数十万。
这个案例的成功,证实了帖子类任务的作用。
中小站长对任务系统的合理运用,也能为自己的论坛带来超高的人气。
文章来源于:/article-24378-1.html。
论坛三层架构设计说明书
BBS论坛三层架构设计说明目录一、概述 (2)1、三层架构的含义 (2)2、三层架构的优势 (3)3、开发平台和支持技术 (3)二、系统设计框架 (4)1、架构设计思想 (4)2、系统设计思路 (4)三、三层架构的应用实现 (4)1、创建数据库 (4)2、创建数据访问层 (5)3、创建业务逻辑层 (7)4、创建用户表示层 (9)四、总结 (11)一、概述1、三层架构的含义三层体系架构是N层体系结构的一种特殊结构,也是最常见的一种结构。
简单地说,N层结构是指把解决方案分解到N个逻辑层中。
在一个比较复杂的项目中,把业务层分解为多个层有许多好处,如结构清晰、代码复用性强、维护方便等。
该文以网上购买服务的Web应用系统的实现为例,说明使用三层结构的技术方法和优势。
选择三层架构是因为它提供了N层体系结构的大多数优势,同时不需要花费很长时间来设计用以支持N层复杂体系结构的代码。
三层架构自下而上分别指的是业务表示层(UI)、逻辑层(DDL)、数据访问层(DAL)。
表示层主要是由窗体和用户控件组成,该层是直接面向用户的,要求设计美观大方、界面方便使用。
表示层中的业务逻辑都存储在业务逻辑层中,当用户操作界面发生请求时,由表示层调用业务逻辑层中相应的方法来具体实现。
业务逻辑层是程序的核心部分,它主要是由各种函数构成,它们集中在该层有利于模块化管理和程序复用,且能够使程序结构清晰、提高可读性。
数据访问层负责接收来自业务层的数据调用请求,该层包含数据库访问链接字符串,负责访问数据库调用存储过程,并将数据操作结果返回给业务逻辑层。
2、三层架构的优势1)扩展性强、依赖性小。
假设一个没有分层的系统各种逻辑关系紧密连接、相互关联制约、彼此间相互依赖不可替代,那么需要一旦要求改变,对系统的影响将是极为严重的,甚至是颠覆性的。
三层架构规范了各层的职责,降低了层与层之间的依赖性,大大提高了系统的可扩展性。
2)复用性强、开发周期缩短。
论坛系统组织结构与功能分析
计算机分析与设计——论坛系统分析报告学校:学院:班级:姓名:______________________学号:指导教师:____________2010年10月目录1.引言 (3)1.1开发背景: (3)2组织结构与功能分析 (3)2.2 业务功能一览表: (4)3.业务流程分析 (5)3 .1 业务总流程图 (5)3.2 各部门的流程图 (5)3.2.1会员注册流程图 (5)3.2.2 会员登录流程图 (6)3.2.3会员管理流程图 (6)3.2.4 论坛版块管理流程图 (7)3.2.5帖子发表 (7)3.2.6 帖子回复 (8)3.2.7帖子管理 (9)4.数据与数据流程图 (10)4.1整体数据流程图 (10)4.2各模块数据流程图 (10)4.2.1 管理方面数据流程图 (10)4.2.2帖子管理数据流程图 (11)4.2.3用户功能数据流程图 (11)5.系统设计 (12)5.1系统目标 (12)5.2系统构架 (12)5.3软件平台环境 (12)5.4数据库设计 (12)5.4.1用户信息表tb_user (12)5.4.2发帖信息表tb_manager (13)5.4.3用户回帖信息表tb_auther (13)5.4.4 管理员信息表 (14)6.UC矩阵图 (14)7. 论坛系统简介 (15)7.1论坛由如下功能模块组成: (15)7.2论坛页面及相关功能 (16)1.引言1.1开发背景:BBS的英文全称是Bulletin BoardSystem,翻译为中文就是“电子公告板”,是有许多人参与的网络论坛系统。
用户只要链接到因特网上,利用浏览器就可以直接使用BBS来阅读其他用户的留言和发表自己的意见。
根据The definitiveBBS list 1 999年的数据,全世界有超过40000个BBS,BBS的历史比互联网(1ntemet)要早,但发展到今天,绝大多数BBS是建立在互联网上的,BBS有自己的文化,有自己的“行话”,有自己的管理者。
discuz数据表及结构详解
@亲爱的php/计算机语言爱好者,开发者好,希望在这里你能收获到你需要的,祝你工作顺利,生活愉快!@姜祖斌,web爱好者,开发者@喜欢和业界的普一起交流,分享,关注互联网,关注媒体,关注开发,关注产品,关注技术@感兴趣的朋友可以和我一起交流技术的精华@weibo:/yangpage@mail/gtalk:jiangzubin1989@@msn:jiangzubin1989@@qq:757576387@honepage:/@facebook:https:///zubin.jiangDiscus数据表结构详解DROP TABLE IF EXISTS pre_common_admincp_cmenu;CREATE TABLE pre_common_admincp_cmenu (`id` SMALLINT(6) UNSIGNED NOT NULL AUTO_INCREMENT,`title` VARCHAR(255) NOT NULL COMMENT '菜单名称',`url` VARCHAR(255) NOT NULL COMMENT '菜单地址',`sort` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '菜单类型,备用',`displayorder` TINYINT(3) NOT NULL COMMENT '显示顺序',`clicks` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '1' COMMENT '点击数,备用',`uid` MEDIUMINT(8) UNSIGNED NOT NULL COMMENT '添加用户',`dateline` INT(10) UNSIGNED NOT NULL COMMENT '添加时间',PRIMARY KEY (`id`),KEY `uid` (`uid`),KEY `displayorder` (`displayorder`)) ENGINE=MYISAM COMMENT='后台菜单收藏表';DROP TABLE IF EXISTS pre_common_admingroup;CREATE TABLE pre_common_admingroup (admingid smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT '所属管理员分组ID', alloweditpost tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许编辑帖子',alloweditpoll tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许编辑投票', allowstickthread tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许置顶主题', allowmodpost tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许审核帖子', allowdelpost tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许删除帖子', allowmassprune tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许批量删帖', allowrefund tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许强制退款', allowcensorword tinyint(1) NOT NULL DEFAULT '0' COMMENT '兼容性字段',allowviewip tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许查看IP',allowbanip tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许禁止IP',allowedituser tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许编辑用户', allowmoduser tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许审核用户',allowbanuser tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许禁止用户发言', allowbanvisituser tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许禁止用户访问', allowpostannounce tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许发布站点公告', allowviewlog tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许查看管理日志', allowbanpost tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许屏蔽帖子',supe_allowpushthread tinyint(1) NOT NULL DEFAULT '0' COMMENT '兼容性字段', allowhighlightthread tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许高亮主题', allowdigestthread tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许精华主题', allowrecommendthread tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许推荐主题', allowbumpthread tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许提升主题', allowclosethread tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许关闭主题', allowmovethread tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许移动主题', allowedittypethread tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许编辑主题分类', allowstampthread tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许添加主题图章', allowstamplist tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许添加主题图标', allowcopythread tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许复制主题', allowmergethread tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许合并主题', allowsplitthread tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许分割主题', allowrepairthread tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许修复主题', allowwarnpost tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许警告帖子', allowviewreport tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许查看用户报告', alloweditforum tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许编辑版块', allowremovereward tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许移除悬赏', allowedittrade tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许编辑商品', alloweditactivity tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理活动报名者', allowstickreply tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许置顶回帖', allowmanagearticle tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理所有文章', allowaddtopic tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许创建专题', allowmanagetopic tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理专题', allowdiy tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许DIY',allowclearrecycle tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许删除回收站的帖子', allowmanagetag tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理标签', alloweditusertag tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理用户标签', managefeed tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理动态(feed)', managedoing tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理记录', manageshare tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理分享', manageblog tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理日志', managealbum tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理相册', managecomment tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理评论', managemagiclog tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理道具记录', managereport tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理举报', managehotuser tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理推荐成员', managedefaultuser tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理推荐好友', managevideophoto tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理视频认证',managemagic tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理道具', manageclick tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理表态动作', allowmanagecollection tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否允许管理淘专辑', PRIMARY KEY (admingid)) ENGINE=MyISAM COMMENT='管理组表';DROP TABLE IF EXISTS pre_common_adminnote;CREATE TABLE pre_common_adminnote (id mediumint(8) unsigned NOT NULL auto_increment COMMENT '后台留言id',admin varchar(15) NOT NULL default COMMENT '管理员姓名',access tinyint(3) NOT NULL default '0' COMMENT '哪组可以看到信息',adminid tinyint(3) NOT NULL default '0' COMMENT '管理员id',dateline int(10) unsigned NOT NULL default '0' COMMENT '发表时间',expiration int(10) unsigned NOT NULL default '0' COMMENT '过期时间',message text NOT NULL COMMENT '消息',PRIMARY KEY (id)) ENGINE=MyISAM COMMENT='后台留言表';DROP TABLE IF EXISTS pre_common_advertisement;CREATE TABLE pre_common_advertisement (advid mediumint(8) unsigned NOT NULL auto_increment COMMENT '广告id',available tinyint(1) NOT NULL default '0' COMMENT '是否启用',`type` varchar(50) NOT NULL default '0' COMMENT '类型',displayorder tinyint(3) NOT NULL default '0' COMMENT '显示顺序',title varchar(255) NOT NULL default COMMENT '广告标题',targets text NOT NULL COMMENT '投放范围',parameters text NOT NULL COMMENT '参数\n序列化存放的数组数据',`code` text NOT NULL COMMENT '代码',starttime int(10) unsigned NOT NULL default '0' COMMENT '开始时间',endtime int(10) unsigned NOT NULL default '0' COMMENT '结束时间',PRIMARY KEY (advid)) ENGINE=MyISAM COMMENT='广告数据表';DROP TABLE IF EXISTS pre_common_advertisement_custom;CREATE TABLE pre_common_advertisement_custom (`id` smallint(5) unsigned NOT NULL auto_increment COMMENT '自定义广告类型id',`name` varchar(255) NOT NULL COMMENT '名称',PRIMARY KEY (`id`),KEY `name` (`name`)) ENGINE=MyISAM COMMENT='自定义广告数据表';DROP TABLE IF EXISTS pre_common_banned;CREATE TABLE pre_common_banned (id smallint(6) unsigned NOT NULL auto_increment COMMENT '禁止id',ip1 smallint(3) NOT NULL default '0' COMMENT 'IP分段1',ip2 smallint(3) NOT NULL default '0' COMMENT 'IP分段2',ip3 smallint(3) NOT NULL default '0' COMMENT 'IP分段3',ip4 smallint(3) NOT NULL default '0' COMMENT 'IP分段4',admin varchar(15) NOT NULL default COMMENT '管理员姓名',dateline int(10) unsigned NOT NULL default '0' COMMENT '禁止时间',expiration int(10) unsigned NOT NULL default '0' COMMENT '过期时间',PRIMARY KEY (id)) ENGINE=MyISAM COMMENT='禁止访问表';DROP TABLE IF EXISTS pre_common_cache;CREATE TABLE pre_common_cache (cachekey varchar(255) NOT NULL default ,cachevalue mediumblob NOT NULL,dateline int(10) unsigned NOT NULL default '0',PRIMARY KEY (cachekey)) ENGINE=MyISAM COMMENT='通用缓存表';DROP TABLE IF EXISTS pre_common_card;CREATE TABLE pre_common_card (id char(255) NOT NULL default COMMENT '生成的卡片号码',typeid smallint(6) unsigned NOT NULL default '1' COMMENT '卡片分类',maketype tinyint(1) NOT NULL default '0' COMMENT '卡片生成的方法',makeruid mediumint(8) unsigned NOT NULL default '0' COMMENT '卡片生成者uid',`price` mediumint(8) unsigned NOT NULL default '0' COMMENT '卡片面值',`extcreditskey` tinyint(1) NOT NULL default '0' COMMENT '充值积分种类',`extcreditsval` int(10) NOT NULL default '0' COMMENT '积分数额',`status` tinyint(1) unsigned NOT NULL default '1' COMMENT '卡片状态(位与):1:可用,2:已用', dateline int(10) unsigned NOT NULL default '0' COMMENT '卡片生成时间',cleardateline int(10) unsigned NOT NULL default '0' COMMENT '卡片清理时间', useddateline int(10) unsigned NOT NULL default '0' COMMENT '使用时间',uid mediumint(8) unsigned NOT NULL default '0' COMMENT '使用者',PRIMARY KEY (id),KEY `dateline` (`dateline`)) ENGINE=MyISAM COMMENT='充值卡密表';DROP TABLE IF EXISTS pre_common_card_log;CREATE TABLE pre_common_card_log (id smallint(6) NOT NULL auto_increment COMMENT '生成的卡片号码',`uid` mediumint(8) NOT NULL default '0' COMMENT '卡片生成者',`username` varchar(20) NOT NULL default COMMENT '卡片生成者',cardrule varchar(255) NOT NULL default COMMENT '卡片生成规则',`info` text NOT NULL COMMENT '卡片生成log',dateline INT(10) unsigned NOT NULL default '0' COMMENT '本次log生成时间',description mediumtext NOT NULL COMMENT '卡片描述',operation tinyint(1) NOT NULL default '0' COMMENT '操作动作(位与):1:生成,2:任务生成,4:删除,9:卡片过期',PRIMARY KEY (id),KEY `dateline` (`dateline`),KEY `operation_dateline` (`operation`, `dateline`)) ENGINE=MyISAM COMMENT='充值卡密表';DROP TABLE IF EXISTS pre_common_card_type;CREATE TABLE pre_common_card_type (id smallint(6) NOT NULL auto_increment COMMENT '卡片分类ID',typename char(20) NOT NULL default COMMENT '分类名称',PRIMARY KEY (id)) ENGINE=MyISAM COMMENT='卡片分类表';DROP TABLE IF EXISTS pre_common_credit_log;CREATE TABLE pre_common_credit_log (`uid` mediumint(8) unsigned NOT NULL default '0' COMMENT '所属用户uid',`operation` char(3) NOT NULL default COMMENT '操作类型',`relatedid` int(10) unsigned NOT NULL COMMENT '操作相关ID',`dateline` int(10) unsigned NOT NULL COMMENT '记录时间',`extcredits1` int(10) NOT NULL COMMENT '积分1变化值',`extcredits2` int(10) NOT NULL COMMENT '积分2变化值',`extcredits3` int(10) NOT NULL COMMENT '积分3变化值',`extcredits4` int(10) NOT NULL COMMENT '积分4变化值',`extcredits5` int(10) NOT NULL COMMENT '积分5变化值',`extcredits6` int(10) NOT NULL COMMENT '积分6变化值',`extcredits7` int(10) NOT NULL COMMENT '积分7变化值',`extcredits8` int(10) NOT NULL COMMENT '积分8变化值',KEY `uid` (`uid`),KEY `operation` (`operation`),KEY `relatedid` (`relatedid`),KEY `dateline` (`dateline`)) ENGINE=MyISAM COMMENT='积分日志表';DROP TABLE IF EXISTS pre_common_credit_rule_log;CREATE TABLE pre_common_credit_rule_log (clid mediumint(8) unsigned NOT NULL auto_increment COMMENT '策略日志ID',uid mediumint(8) unsigned NOT NULL default '0' COMMENT '策略日志所有者uid',rid mediumint(8) unsigned NOT NULL default '0' COMMENT '策略ID',fid mediumint(8) unsigned NOT NULL default '0' COMMENT '版块ID',total mediumint(8) unsigned NOT NULL default '0' COMMENT '策略被执行总次数',cyclenum mediumint(8) unsigned NOT NULL default '0' COMMENT '周期被执行次数', extcredits1 int(10) NOT NULL default '0' COMMENT '扩展1',extcredits2 int(10) NOT NULL default '0' COMMENT '扩展2',extcredits3 int(10) NOT NULL default '0' COMMENT '扩展3',extcredits4 int(10) NOT NULL default '0' COMMENT '扩展4',extcredits5 int(10) NOT NULL default '0' COMMENT '扩展5',extcredits6 int(10) NOT NULL default '0' COMMENT '扩展6',extcredits7 int(10) NOT NULL default '0' COMMENT '扩展7',extcredits8 int(10) NOT NULL default '0' COMMENT '扩展8',starttime int(10) unsigned NOT NULL default '0' COMMENT '周期开始时间',dateline int(10) unsigned NOT NULL default '0' COMMENT '策略最后执行时间',PRIMARY KEY (clid),KEY uid (uid,rid, fid),KEY dateline (dateline)) ENGINE=MyISAM COMMENT='积分规则日志表';DROP TABLE IF EXISTS pre_common_credit_rule_log_field;CREATE TABLE pre_common_credit_rule_log_field (clid mediumint(8) unsigned NOT NULL default '0' COMMENT '策略日志ID',uid mediumint(8) unsigned NOT NULL default '0' COMMENT '策略日志所有者uid',info text NOT NULL COMMENT '记录信息防重',`user` text NOT NULL COMMENT '记录用户防重',app text NOT NULL COMMENT '记录应用防重',PRIMARY KEY (uid, clid)) ENGINE=MyISAM COMMENT='积分规则日志扩展表';DROP TABLE IF EXISTS pre_common_credit_rule;CREATE TABLE pre_common_credit_rule (rid mediumint(8) unsigned NOT NULL auto_increment COMMENT '规则ID',rulename varchar(20) NOT NULL default COMMENT '规则名称',`action` varchar(20) NOT NULL default COMMENT '规则action唯一KEY',cycletype tinyint(1) NOT NULL default '0' COMMENT '奖励周期0:一次;1:每天;2:整点;3:间隔分钟;4:不限;',cycletime int(10) NOT NULL default '0' COMMENT '间隔时间',rewardnum tinyint(2) NOT NULL default '1' COMMENT '奖励次数',norepeat tinyint(1) NOT NULL default '0' COMMENT '是否去重1:去重;0:不去重', extcredits1 int(10) NOT NULL default '0' COMMENT '扩展1',extcredits2 int(10) NOT NULL default '0' COMMENT '扩展2',extcredits3 int(10) NOT NULL default '0' COMMENT '扩展3',extcredits4 int(10) NOT NULL default '0' COMMENT '扩展4',extcredits5 int(10) NOT NULL default '0' COMMENT '扩展5',extcredits6 int(10) NOT NULL default '0' COMMENT '扩展6',extcredits7 int(10) NOT NULL default '0' COMMENT '扩展7',extcredits8 int(10) NOT NULL default '0' COMMENT '扩展8',fids text NOT NULL COMMENT '记录自定义策略版块ID',PRIMARY KEY (rid),UNIQUE KEY `action` (`action`)) ENGINE=MyISAM COMMENT='积分规则表';DROP TABLE IF EXISTS pre_common_cron;CREATE TABLE pre_common_cron (cronid smallint(6) unsigned NOT NULL auto_increment COMMENT '计划任务id',available tinyint(1) NOT NULL default '0' COMMENT '是否启用',`type` enum('user','system') NOT NULL default 'user' COMMENT '类型',`name` char(50) NOT NULL default COMMENT '名称',filename char(50) NOT NULL default COMMENT '对应文件',lastrun int(10) unsigned NOT NULL default '0' COMMENT '上次执行时间',nextrun int(10) unsigned NOT NULL default '0' COMMENT '下次执行时间',weekday tinyint(1) NOT NULL default '0' COMMENT '周计划',`day` tinyint(2) NOT NULL default '0' COMMENT '日计划',`hour` tinyint(2) NOT NULL default '0' COMMENT '小时计划',`minute` char(36) NOT NULL default COMMENT '分计划',PRIMARY KEY (cronid),KEY nextrun (available,nextrun)) ENGINE=MyISAM COMMENT='计划任务表';DROP TABLE IF EXISTS pre_common_domain;CREATE TABLE pre_common_domain (domain char(30) NOT NULL default COMMENT '域名前缀',domainroot char(60) NOT NULL default COMMENT '二级域名后缀',id mediumint(8) unsigned NOT NULL default '0' COMMENT '对应对象id',idtype char(15) NOT NULL default COMMENT '对应对象类型subarea:分区、forum:版块、home:个人空间、group:群组、topic:专题、channel:频道',PRIMARY KEY (id, idtype),KEY domain (domain, domainroot),KEY idtype (idtype)) ENGINE=MyISAM COMMENT='二级域名表';DROP TABLE IF EXISTS pre_common_failedlogin;CREATE TABLE pre_common_failedlogin (ip char(15) NOT NULL default COMMENT '失败IP',username char(32) NOT NULL default COMMENT '失败时的用户名',count tinyint(1) unsigned NOT NULL default '0' COMMENT '尝试次数',lastupdate int(10) unsigned NOT NULL default '0' COMMENT '最后一次尝试时间',PRIMARY KEY (ip,username)) ENGINE=MyISAM COMMENT='失败登录表';DROP TABLE IF EXISTS pre_common_friendlink;CREATE TABLE pre_common_friendlink (id smallint(6) unsigned NOT NULL auto_increment COMMENT 'id',displayorder tinyint(3) NOT NULL default '0' COMMENT '显示顺序,正序',`name` varchar(100) NOT NULL default COMMENT '名称',url varchar(255) NOT NULL default COMMENT 'url',description mediumtext NOT NULL COMMENT '解释说明',logo varchar(255) NOT NULL default COMMENT 'logo',`type` tinyint(3) NOT NULL default '0',PRIMARY KEY (id)) ENGINE=MyISAM COMMENT='友情链接表';DROP TABLE IF EXISTS pre_common_relatedlink;CREATE TABLE pre_common_relatedlink (id smallint(6) unsigned NOT NULL auto_increment COMMENT 'id',`name` varchar(100) NOT NULL default COMMENT '名称',url varchar(255) NOT NULL default COMMENT 'url',`extent` tinyint(3) NOT NULL default '0',PRIMARY KEY (id)) ENGINE=MyISAM COMMENT='关联链接表';DROP TABLE IF EXISTS pre_common_invite;CREATE TABLE pre_common_invite (id mediumint(8) unsigned NOT NULL auto_increment COMMENT 'ID',uid mediumint(8) unsigned NOT NULL default '0' COMMENT '邀请人',`code` char(20) NOT NULL default COMMENT '邀请码',fuid mediumint(8) unsigned NOT NULL default '0' COMMENT '受邀人UID', fusername char(20) NOT NULL default COMMENT '受邀人姓名',`type` tinyint(1) NOT NULL default '0' COMMENT '邮件邀请1是0否', email char(40) NOT NULL default COMMENT '邀请Email',inviteip char(15) NOT NULL default COMMENT '邀请IP',appid mediumint(8) unsigned NOT NULL default '0' COMMENT '应用ID', dateline int(10) unsigned NOT NULL default '0' COMMENT '邀请码生成时间', endtime int(10) unsigned NOT NULL default '0' COMMENT '邀请码结束时间', regdateline int(10) unsigned NOT NULL DEFAULT '0' COMMENT '注册时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '邀请码状态',orderid char(32) NOT NULL default COMMENT '购买邀请码的订单号id', PRIMARY KEY (id),KEY uid (uid, dateline)) ENGINE=MyISAM COMMENT='邀请表';DROP TABLE IF EXISTS pre_common_mailcron;CREATE TABLE pre_common_mailcron (cid mediumint(8) unsigned NOT NULL auto_increment,touid mediumint(8) unsigned NOT NULL default '0',email varchar(100) NOT NULL default ,sendtime int(10) unsigned NOT NULL default '0',PRIMARY KEY (cid),) ENGINE=MyISAM COMMENT='邮件计划任务表';DROP TABLE IF EXISTS pre_common_mailqueue;CREATE TABLE pre_common_mailqueue (qid mediumint(8) unsigned NOT NULL auto_increment,cid mediumint(8) unsigned NOT NULL default '0',`subject` text NOT NULL,message text NOT NULL,dateline int(10) unsigned NOT NULL default '0',PRIMARY KEY (qid),KEY mcid (cid,dateline)) ENGINE=MyISAM COMMENT='邮件队列表';DROP TABLE IF EXISTS pre_common_member;CREATE TABLE pre_common_member (uid mediumint(8) unsigned NOT NULL auto_increment COMMENT '会员id',email char(40) NOT NULL default COMMENT '邮箱',username char(15) NOT NULL default COMMENT '用户名',`password` char(32) NOT NULL default COMMENT '密码',`status` tinyint(1) NOT NULL default '0' COMMENT '判断用户是否已经删除需要discuz程序加判断,并增加整体清理的功能。
Discuz!NT中集成Memcached分布式缓存
大约在两年前我写过一篇关于Discuz!NT缓存架构的文章,在那篇文章的结尾介绍了在IIS中如果开启多个应用程序池会造成多个缓存实例之间数据同步的问题。
虽然给出了一个解决方案,但无形中却把压力转移到了磁盘I/O上(多个进程并发访问cache.config文件)。
其实从那时起我就开始关注有什么更好的方案,当然今天本文中所说的Memcached,以及Velocity等这类的分布式缓存方案之前都考虑过,但一直未能决定该使用那个。
起码Velocity要在.net 4.0之后才会提供,虽然是原生态,但有些远水解不了近火。
我想真正等到Velocity能堪当重任还要等上一段时间。
于是我就开始将注意力转移到了Memcached,必定有Facebook这只“超级小白鼠”使用它并且反响还不错。
所以就开始尝试动手在产品中集成Memcached。
其实在之前的那篇关于Discuz!NT缓存架构的文章中已提到过,使用了设计模式中的“策略模式”来构造。
所以为了与以往使用缓存的代码格式相兼容,所以这里采用新添加MemCachedStrategy(MemCached策略)来构造一个缓存策略类以便于当管理后台开启“MemCached”时以“MemCached策略模式”来做为当前系统默认的策略模式。
其代码段如下(Discuz.Cache/MemCached.cs):///<summary>/// MemCache缓存策略类///</summary>public class MemCachedStrategy : Discuz.Cache.ICacheStrategy{///<summary>///添加指定ID的对象///</summary>///<param name="objId"></param>///<param name="o"></param>public void AddObject(string objId, object o){RemoveObject(objId);if (TimeOut > 0){MemCachedManager.CacheClient.Set(objId, o, System.DateTim e.Now.AddMinutes(TimeOut));}else{MemCachedManager.CacheClient.Set(objId, o);}}///<summary>///添加指定ID的对象(关联指定文件组)///</summary>///<param name="objId"></param>///<param name="o"></param>///<param name="files"></param>public void AddObjectWithFileChange(string objId, object o, strin g[] files){;}///<summary>///添加指定ID的对象(关联指定键值组)///</summary>///<param name="objId"></param>///<param name="o"></param>///<param name="dependKey"></param>public void AddObjectWithDepend(string objId, object o, string [] dependKey){;}///<summary>///移除指定ID的对象///</summary>///<param name="objId"></param>public void RemoveObject(string objId){if (MemCachedManager.CacheClient.KeyExists(objId))MemCachedManager.CacheClient.Delete(objId);}///<summary>///返回指定ID的对象///</summary>///<param name="objId"></param>///<returns></returns>public object RetrieveObject(string objId){return MemCachedManager.CacheClient.Get(objId); }///<summary>///到期时间///</summary>public int TimeOut { set; get; }}上面类实现的接口Discuz.Cache.ICacheStrategy定义如下:///<summary>///公共缓存策略接口///</summary>public interface ICacheStrategy{///<summary>///添加指定ID的对象///</summary>///<param name="objId"></param>///<param name="o"></param>void AddObject(string objId, object o);///<summary>///添加指定ID的对象(关联指定文件组)///</summary>///<param name="objId"></param>///<param name="o"></param>///<param name="files"></param>void AddObjectWithFileChange(string objId, object o, string[] fi les);///<summary>///添加指定ID的对象(关联指定键值组)///</summary>///<param name="objId"></param>///<param name="o"></param>///<param name="dependKey"></param>void AddObjectWithDepend(string objId, object o, string[] depend Key);///<summary>///移除指定ID的对象///</summary>///<param name="objId"></param>void RemoveObject(string objId);///<summary>///返回指定ID的对象///</summary>///<param name="objId"></param>///<returns></returns>object RetrieveObject(string objId);///<summary>///到期时间///</summary>int TimeOut { set;get;}}当然在MemCachedStrategy类中还有一个对象要加以说明,就是MemCachedManager,该类主要是对Memcached一些常操作和相关初始化实例调用的“封装”,下面是是其变量定义和初始化构造方法的代码:///<summary>/// MemCache管理操作类///</summary>public sealed class MemCachedManager{#region静态方法和属性private static MemcachedClient mc = null;private static SockIOPool pool = null;private static MemCachedConfigInfo memCachedConfigInfo = MemCache dConfigs.GetConfig();private static string [] serverList = null;static MemCachedManager(){CreateManager();}private static void CreateManager(){serverList = Utils.SplitString(memCachedConfigInfo.ServerLis t, ""r"n");pool = SockIOPool.GetInstance(memCachedConfigInfo.PoolName); pool.SetServers(serverList);pool.InitConnections = memCachedConfigInfo.IntConnections;//初始化链接数pool.MinConnections = memCachedConfigInfo.MinConnections;//最少链接数pool.MaxConnections = memCachedConfigInfo.MaxConnections;//最大连接数pool.SocketConnectTimeout = memCachedConfigInfo.SocketConnect Timeout;//Socket链接超时时间pool.SocketTimeout = memCachedConfigInfo.SocketTimeout;// Soc ket超时时间pool.MaintenanceSleep = memCachedConfigInfo.MaintenanceSleep; //维护线程休息时间pool.Failover = memCachedConfigInfo.FailOver; //失效转移(一种备份操作模式)pool.Nagle = memCachedConfigInfo.Nagle;//是否用nagle算法启动so cketpool.HashingAlgorithm = HashingAlgorithm.NewCompatibleHash; pool.Initialize();mc = new MemcachedClient();mc.PoolName = memCachedConfigInfo.PoolName; mc.EnableCompression = false;}///<summary>///缓存服务器地址列表///</summary>public static string[] ServerList{set{if (value != null)serverList = value;}get { return serverList; }}///<summary>///客户端缓存操作对象///</summary>public static MemcachedClient CacheClient{get{if (mc == null)CreateManager();return mc;}}public static void Dispose(){if (pool != null)pool.Shutdown();}上面代码中构造方法会初始化一个池来管理执行Socket链接,并提供静态属性CacheClient以便MemCachedStrategy来调用。
Discuz目录结构
│ │ ├── table 数据表操作类
│ │ └── task 站点任务功能
│ ├── function 函数文件
│ │ └── cache 缓存功能拆分目录
│ │ ├── home 家园
│ │ ├── member 登录注册
│ │ ├── misc 杂项
│ │ ├── portal 门户
│ │ ├── search 搜索
│ │ └── userapp 应用
│ ├── log 站点日志,前/后台管理日志、错误日志等
│ ├── plugindata 插件缓存数据
│ ├── template 模板缓存目录
│ └── threadcache 帖子缓存
├── install 安装目录
├── source 代码主目录
│ │ └── temp 临时文件
│ ├── avatar 视频认证专用
│ ├── backup 站点数据备份
│ ├── cache 数据缓存
│ ├── diy DIY模块缓存
│ ├── ipdata Discuz!IP库
│ └── soso_smilies 腾讯搜搜表情
├── static 非PHP文件
│ ├── image 界面图片
│ ├── js 站点JS脚本 │ ├── space 空间皮肤
│ └── topic 门户皮肤
/┬── api 外部接口
│ ├── connect 腾讯互联
│ ├── db UCenter数据库备份接口
│ ├── google Google引擎使用
│ ├── javascript 数据和广告的 JS调用
Discuz!NT代码阅读笔记(3)--网站安装也能自动化DNT安装时使用到的几个函数解析
Discuz!NT代码阅读笔记(3)--网站安装也能自动化:DNT安装时使用到的几个函数解析前文提到:在DNT安装项目:Discuz.Install中,有9个CS文件。
其中位于SetupPage.cs.文件中的SetupPage类是继承自System.Web.UI.Page。
它是其安装过程中用到的其他页面类的基类。
在SetupPage的构造函数中,程序组织了一些版权、版本等文本的Html。
但在整个安装过程中,我没看见这些信息。
安装时,由于Index.Aspx没有隐藏任何类的信息,可以当作静态页面来看待。
安装过程中的第二和第三个页面完成信息收集工作,之后在第四个页面自信数据库脚本创建存储过程和表。
前两个页面基层之文件step3.aspx.cs中的install类,最后一个页面基层自step4.aspx.cs文件中的InstallStep4类。
这篇就说说安装过程中用到的几个有意思函数。
1、安装前软件BIN目录检测函数IISSystemBINCheck()这个函数位于SetupPage类中,检查程序依赖的DLL是否都存在。
通过File.Exists()判断文件是否存在。
2、检查对程序目录的读写权限函数SystemFolderCheck()这个函数通过在程序主目录下创建一个文件,之后再删除这个文件来检查对程序根目录的读写权限3、检查对操作系统临时目录的读写权限函数TempTest()private static bool TempTest(){string UserGuid = Guid.NewGuid().ToString();string TempPath = Path.GetTempPath();string path = TempPath + UserGuid;try{using (StreamWriter sw = new StreamWriter(path)){sw.WriteLine(DateTime.Now);}using (StreamReader sr = new StreamReader(path)){sr.ReadLine();return true;}}catchreturn false;}}这个函数首先通过System.IO中的Path.GetTempPath();函数获取系统历史文件目录,之后使用Guid.NewGuid().ToString()在临时目录下随机生成一个文件目录名并创建一个文件,在文件中追加一行数据并读取,以测试对临时目录的权限。
discuz表结构注释分析
posts--mediumint(8)--共有多少贴子的统计
lastpost--varchar(110)--最后发帖用户名,发帖时间,标题这三个信息组成的字串
allowsmilies--tinyint(1)--是否允许使用表情
allowhtml--tinyint(1)--是否允许使用HTML
cdb_settings--论坛基本设置相关。(包括后台基本设置、注册人数、最多在线人数、功能、其它设置
等等。)
cdb_smilies--表情设置
cdb_stats--论坛统计信息
cdb_styles--风格信息表
cdb_stylevars--风格的配置信息
cdb_subscriptions--记录订阅主题的相关信息
各表概述
cdb_access--当某用户对某些版块有特定的权限的时候,该表记录了该用户在这些版块有什么权限。
cdb_admingroups--管理模组信息表
cdb_adminsessions--后台管理登录记录
cdb_announcements--论坛公告信息
cdb_attachments--附件信息表
description--varchar(255)--版块简介
status--tinyint(1)--是否在论坛上显示
displayorder--tinyint(3)--各版块显示顺序
moderator--varchar(255)--版主名单
styleid--smallint(6)--所用的风格ID
fid--smallint(6)--版块的ID号
allowview--tinyint(1)--是否允许查看贴子
论坛简介架构
论坛简介以及架构
电子论坛平台简介:
电子论坛平台一般由如下模块构成:论坛分为版块,版块内分为子论坛,在子论坛内新发表的文章就叫主题。
在主题下面回复的就是回贴,不属于主题,一般情况下注册的帐号可以全论坛通用,但是有些子论坛因设置为浏览权限所以有可能不能进入。
电子标识设计
主页面与栏目大致分类:
论坛首页:展示论坛分类,论坛目录,论坛现有项目帖子数数量,推荐帖子数量,以及商品的展示与评论区。
栏目分类:
用简单的栏目版块进行加载,达到一目了然的效果,能够快速的找到各自的需求。
满足不同人群的需求。
域名:
琥珀论坛 黄龙玉论坛 博文分享
琥珀论坛
大体架构:一级页面为主页面和flash的商品滚屏画面,二级页面是由浏览者自主选择加载,由此可进入论坛进行浏览。
一级页面
二级页面琥珀论坛。
BBS论坛系统概要设计说明书
BBS论坛系统概要设计说明书1.1编写目的本文档作为BBS的概要设计说明文档,用于与用户确定最终的目标,并成为协议文本的一部分,同时也是本系统设计人员的基础文档。
1.1.1 概要设计说明书目的本概要设计说明书说明了BBS论坛系统设计的整体结构。
1.1.2 预期读者本系统开发人员及维护人员。
1.2背景BBS论坛,或者称为社区,是电子商务中一种常见功能,也是互联网上一种极为常见的互动交流服务。
它为上网用户提供了也各自由的讨论区。
通过论坛可以向用户提供开放性的分类专题讨论区服务,同时注册的用户可以根据需要在论坛上发表文章,交流技术经验,或者提出问题并表达自己的观点。
不仅如此,上网的用户还可以在论坛中看到他人发表的文章,并且能够对该文章进行评论。
一般情况下,BBS按不同主题分为多个布告栏,其设立多是依据使用者的要求和喜好,但多具有信件交流、软件交流、信息发布等功能。
目前,大部分BBS由教育机构、研究机构或商业机构管理,大多有自己的拨入,用户只需电脑、调制解调器和线就可通过拨号登录BBS站点。
1.2.1 待开发软件系统的名称BBS论坛系统1.2.2 项目的任务提出者1.2.3 项目的任务开发者1.3定义1.3.1 本文档中涉及的专业词汇1、GB:中华人民国国家标准的英文缩写字母2、构件:具有某种功能的可重用的软件模版单元,表示了系统中主要的计算元素和数据存储。
3、逻辑视图:描述支持系统的功能需求的视图。
4、开发视图:也称模块视图,主要侧重于软件模块的组织和管理描述。
1.3.2 名词说明1、BBS:Bulletin Board Service2、JSP(JavaServer Pages)JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。
网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。
JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易3、Struts只是一个MVC框架(Framework)它用于快速开发Java Web应用。
SF4.0整合Discuz!NT3.6论坛(不同在一个网站)
SF4.0整合Discuz!NT3.6论坛(不同在一个网站)1、首先下载安装这两个系统,都可以正常访问。
这两个系统的安装方法非常相似,配置权限和安装步骤都几乎相同。
例如我们的SF网站地址:http://localhost:81,Discuz!NT3.6地址:http://localhost:822、下载整合所需的接口文件:点击下载3、解压上面下载的文件,将文件夹中的bin、api文件夹覆盖到论坛根目录下,如图:4、修改”SF网站”接口文件,打开Config\ API.config修改以下内容。
开启接口,填写接口密钥(两个网站密钥必须相同),指定Discuz!NT论坛”API接口地址”<?xml version="1.0" encoding="utf-8"?><Config><APISettings><Item><Name>API_Enable</Name><Value>true</Value></Item><Item><Name>API_Key</Name><Value>123456</Value></Item><Item><Name>API_Timeout</Name><Value>10000</Value></Item><Item><Name>API_Urls</Name><Value>http://localhost:82/API/API_Response.aspx</Value></Item></APISettings></Config>5.修改” Discuz!NT论坛”接口文件,打开api\API.config开启接口,填写接口密钥(两个网站密钥必须相同),指定SF网站”API接口地址”<?xml version="1.0" encoding="gb2312"?><Config><APISettings><Item><Name>API_Enable</Name><Value>true</Value></Item><Item><Name>API_Key</Name><Value>123456</Value></Item><Item><Name>API_Timeout</Name><Value>10000</Value></Item><Item><Name>API_Urls</Name><Value>http://localhost:81/API/API_Response.aspx</Value> </Item></APISettings></Config>登录测试一下。
BBS论坛系统架构设计
本讲的简要回顾
1、子曰:“学而不思则罔,思而不学则殆。” “学而时习之”
2、子曰:“知之者不如好之者,好之者不如乐之者”
3、子曰:“三人行,必有我师焉”
4、子曰:“我非生而知之者,好古,敏以求之者也”
5、师者:“传道、授业和解惑 ”
“信息系统业务层架构实现方法综述” 主要内容
(1)BBS论坛系统架构设计 (2)BBS论坛项目持久层实现 (3)BBS论坛项目服务层实现 (4)在项目中应用Spring框架 (5)在项目中应用Spring AOP (6)BBS论坛项目控制层实现 (7)将Struts和Spring进行整合 (8)BBS论坛项目表示层实现
4本项目的系统架构为ssh框架1strutsspringdwr前台服务2struts2springhibernate后台管理特别适合项目实训教学也就是我倡导的可教学项目当然在功能实现方面没有实现真实项目中的所有功能重点是放在架构实现方面特别是三大框架的相互整合环境搭建等5前台功能演示将进入分类信息版块页面可以发表回复查看信息等方面的功能但在细节方面没有花太多的精力比较粗糙是我自己在07年写的
1、计算所培训中心的论坛(/) 计算所培训中心的论坛系统采用的是目前比较流行的 “Discuz 论坛”,下面是其首页的局部截图。
2、Discuz 论坛项目介绍 Discuz 论坛(/)是一个采用 PHP 和 MySQL 构建的高效论坛解决方案。Discuz在代码质 量,运行效率,负载能力,安全等级,功能可操控性和权 限严密性等目,为什么要采用该项目?
4、本项目的系统架构为SSH框架 (1)Struts +Spring + Hibernate + DWR 前台服务 (2)Struts2 +Spring + Hibernate 后台管理 特别适合项目实训教学(也就是我倡导的“可教学项目” ) 当然在功能实现方面没有实现真实项目中的所有功能 重点是放在架构实现方面,特别是三大框架的相互整合、
discuz默认模板文件结构详解-模板文件夹介绍
discuz默认模板⽂件结构详解-模板⽂件夹介绍| — template — default 系统内置风格模板(默认风格)| — template — default – discuz_style_default.xml 风格安装⽂件,可⽤风格导出功能创建| — template — default – preview.jpg 预览图| — template — default – common 风格中的公共包含⽂件,内含css、htm模板⽂件| — template — default – common – block_forumtree.htm 树形论坛版块分⽀js⽂件| — template — default – common – block_thread.htm 特殊主题的风格模块⽂件| — template — default – common – block_userinfo.htm ⽤户资料的风格模块,⽤于显⽰| — template — default – common – common.css 公共CSS⽂件。
| — template — default – common – css_diy.htm DIY⾯板的样式⽂件| — template — default – common – editor.css 编辑器样式| — template — default – common – editor.htm 编辑器模板⽂件| — template — default – common – editor_menu.htm 编辑器菜单⽂件| — template — default – common – faq.htm 帮助模板⽂件| — template — default – common – footer.htm 系统总底部模板| — template — default – common – footer_ajax.htm ajax模式是使⽤到的系统总底部模板,ajax模式⼤部分为浮动框登录、注册、发帖等。
discuz数据库详解
Discuz数据表详解方便二次开发Discuz数据表详解,方便二次开发,有时候还是感觉直接改动数据库比较方便一些Discuz默认库的53个数据表cdb_access (用户权限表)uid 用户idfid 论坛idallowview 允许浏览allowpost 允许发新帖allowreply 允许回复allowgetattach 允许下载附件allowpostattach 允许上传附件cdb_adminactions 关联用户组admingid 管理组iddisabledactions 关联后的权限 cdb_admingroups 管理组权限设置(3条)admingid 管理组idalloweditpost 允许编辑帖子alloweditpoll 允许编辑投票allowstickthread 允许固定主题allowmodpost 允许编辑帖子allowdelpost 允许删除帖子allowmassprune 允许批量删除帖子allowrefund 允许强制退款allowcensorword 允许过滤词语allowviewip 允许查看用户IP信息allowbanip 允许禁止IPallowedituser 允许编辑用户allowmoduser 允许审核用户allowbanuser 允许禁止用户访问allowpostannounce 允许发布公告allowviewlog 允许查看版主管理记录和用户评分记录disablepostctrl 发贴不受***(不受灌水预防和最大字数等)cdb_adminnotes (后台留言表)id 后台留言idadmin 留言人access 阅读权限adminid 管理组iddateline 发表时间expiration 过期时间message 留言内容cdb_adminsessions 管理记录(0条)uid 用户idip ipdateline 时间errorcount 错误次数cdb_advertisements 后台广告管理advid 广告idavailable 是否启用type 类型displayorder 排列顺序title 标题targets 投放范围parameters 参数code 代码starttime 开始时间endtime 结束时间cdb_announcements 公告表(0条)id 公告IDauthor 发布者用户名subject 公告标题displayorder 排列顺序starttime 公告开始时间endtime 公告失效时间message 公告内容cdb_attachments 附件表(0条)aid 附件数据IDtid 主题IDpid 帖子IDdateline 发布附件时间readperm 阅读权限filename 附件的原始文件名description 附件描述filetype 附件类型filesize 附件文件的大小attachment 服务器路径,相对于(config.php中$attachdir值)downloads 下载/浏览次数cdb_attachtypes 附件类型(0条)id 数据IDextension 扩展名maxsize 最大允许的上传大小cdb_banned 被禁止访问表id 禁止访问idip1 ip字段1ip2 ip字段2ip3 ip字段3ip4 ip字段4admin 操作人dateline 操作时间expiration 过期时间cdb_bbcodes 自定义Discuz!代码(3条)id 数据IDavailable 是否启用tag 标签replacement 替换内容example 使用举例explanation 代码的解释说明params 参数个数nest 嵌套次数cdb_buddys (好友表)uid 用户idbuddyid 好友的iddateline 加入时间description 备注cdb_creditslog(积分转帐交易记录表)uid 用户idfromto 来自/到sendcredits 转出积分字段receivecredits 接受积分字段send 转出积分receive 收到积分dateline 操作时间operation 操作cdb_failedlogins 登陆失败的记录(0条)ip IP地址count 失败的次数lastupdate 最后尝试登陆时间cdb_favorites 用户主题收藏(0条)uid 用户idtid 主题idcdb_forumfields 论坛扩展信息表fid 论坛iddescription 论坛简介password 访问密码icon 论坛图标postcredits 自定义发主题增加积分replycredits 自定义发回复增加积分redirect 论坛转向 URLattachextensions 本论坛允许附件类型moderators 斑竹列表rules 本论坛规则threadtypes 主题分类viewperm 浏览论坛许可postperm 发新话题许可replyperm 发表回复许可getattachperm 下载/查看附件许可postattachperm 上传附件许可cdb_forumlinks 联盟论坛(1条)id 数据IDdisplayorder 显示顺序name 网站名称url 地址note 说明logo logo地址cdb_forums 论坛表(1条)fid 论坛idfup 上级论坛idtype 论坛类型,cat为分类,forum为论坛,sub为子论坛name 论坛的名字status 显示论坛displayorder 显示顺序styleid 风格方案idthreads 主题数量posts 帖子数量todayposts 今日发帖数量lastpost 最后发表信息allowsmilies 允许smilies图标allowhtml 允许htmlallowbbcode 允许discuz!代码allowimgcode 允许[img]标签allowblog 允许加入blogallowtrade 允许发起交易alloweditrules 允许版主修改本论坛规则modnewposts 发帖审核jammer 启用内容干扰码disablewatermark 禁用图片附件添加水印inheritedmod 本论坛或分类版主的权力继承到下级论坛autoclose 主题自动关闭cdb_medals 勋章表medalid 勋章idname 勋章名称available 是否启用image 图片地址cdb_memberfields 用户扩展信息表uid 用户idnickname 用户昵称site 主页alipy 支付宝帐号icq ICQqq QQyahoo Yahoomsn MSNtaobao 淘宝旺旺location 来自customstatus 自定义头衔medals 勋章avatar 头像avatarwidth 头像宽度avatarheight 头像高度bio 生日signature 个人签名sightml html解析后的签名ignorepm 忽略PM列表(拒绝接受本名单中的用户发来的短消息) groupterms 公众用户组信息authstr 待审核用户cdb_members 用户表(1条)uid 用户idusername 用户名password 密码(md5)secques 安全提示问题(独立加密)gender 性别adminid 管理组idgroupid 用户组idgroupexpiry 用户组有效期extgroupids 扩展用户组regip 注册ipregdate 注册时间lastip 最后登陆iplastvisit 上次访问时间lastactivity 上次访问时间(记录)lastpost 最后发表时间posts 发贴数digestposts 精华帖数oltime 在线时间pageviews 页面访问量credits 总积分extcredits1 扩展积分1extcredits2 扩展积分2extcredits3 扩展积分3extcredits4 扩展积分4extcredits5 扩展积分5extcredits6 扩展积分6extcredits7 扩展积分7extcredits8 扩展积分8 avatarshowid 天下秀email 邮箱bday 生日sigstatus 签名是否改动tpp 每页显示主题数ppp 每页显示帖子数styleid 个性定义风格iddateformat 个性日期格式timeformat 个性时间格式pmsound 短消息提示音showemail 是否公开email地址newsletter 是否接受论坛通知invisible 是否隐身登录timeoffset 时区校正newpm 是否有新短消息accessmasks Access标志cdb_moderators 版主表uid 用户idfid 版区iddisplayorder 显示顺序inherited 是否继承cdb_onlinelist 在线列表定制(4条)groupid 用户组IDdisplayorder 显示顺序title 组头衔url 用户组图例位置(相对于./images/common目录)cdb_onlinetime 在线时间表uid 用户idthismonth 本月在线时间total 总计在线时间lastupdate 最后访问时间cdb_orders 订单信息表orderid 订单号status 状态buyer 购买者admin 补单操作者uid 购买人idamount 数量price 价格submitdate 提交日期confirmdate 确认日期cdb_paymentlog 帖子买卖表uid 用户idtid 主题idauthorid 作者iddateline 时间amount 价格netamount 作者收入cdb_plugins 插件管理表pluginid 插件idavailable 是否启用adminid 管理插件的管理组idname 插件名称identifier 唯一标识符description 描述datatables 插件的数据表directory 插件目录copyright 版权信息modules 记录插件详细信息cdb_pluginvarsplginvarid 插件变量idpluginid 插件iddisplayorder 显示顺序title 标题description 描述variable 变量type 类型value 数值extra 存储下拉列表的详细信息cdb_pms 短消息表pmid 数据IDmsgfrom 发送者名msgfromid 发送者idmsgtoid 接收者idfolder 文件夹new 是否为已读subject 消息标题dateline 发送时间message 内容cdb_polls 投票(0条)tid 主题IDpollopts 投票数据cdb_posts 帖子表(0条)pid 帖子idfid 论坛idtid 主题idfirst 是否为主题(1为主题,0为帖子)author 帖子作者用户名authorid 帖子作者用户idsubject 帖子标题dateline 帖子发表时间message 帖子正文内容useip 发贴时的IPinvisible 帖子状态(是否是被审核或者是否在回收站)usesig 是否显示签名htmlon 是否开启htmlbbcodeoff 是否允许Discuz!代码标签smileyoff 是否允许Smile表情图标parseurloff 是否允许自动加链接attachment 是否有附件rate 本帖子被评分数ratetimes 本帖子被评分次数cdb_profilefields 用户栏目定制(0条)fieldid 数据idavailable 是否可用invisible 是否隐藏title 栏目标题description 简短描述size 内容最大长度displayorder 显示顺序required 必填内容unchangeable 不可修改showinthread 在帖子中显示selective 是否可选choices 选项内容cdb_ranks (用户级别表)rankid 级别idranktitle 发帖数级别头衔postshigher 发帖数级别阀值stars 星星数color 颜色cdb_ratelog(帖子评分记录表)pid 帖子iduid 用户idusername 用户名extcredits 评分字段dateline 时间score 分数reason 操作原因cdb_regips (注册ip表(开启新用户注册验证后记录)) ip IPdateline 时间count 次数cdb_rsscaches rss缓存表lastupdate 最后更新fid 版块idtid 主题iddateline 发表时间forum 版块名称author 作者subject 标题description 简短描述cdb_searchindex 论坛搜索索引(0条)searchid 数据IDkeywords 搜索类型/关键字searchstring 搜索内容useip 搜索者IPuid 用户iddateline 搜索开始时间expiration 搜索失效时间threads 主题数量tids 主题id多个以,分割cdb_sessions 在线统计(0条)sid 数据IDip1 IP地址第一栏ip2 IP地址第二栏ip3 IP地址第三栏ip4 IP地址第四栏uid 用户idusername 用户名groupid 用户组idstyleid 风格idinvisible 是否隐身登陆action 当前动作lastactivity 最后活动时间lastolupdate 在线时间最后更新pageviews 页面访问量seccode 记录验证码fid 正在浏览的版区idtid 正在浏览的主题idbloguid 记录blog用户idcdb_settings 论坛基本设置表(64条)variable 变量名value 赋值cdb_smilies 论坛表情符号(18条)id 数据IDdisplayorder 显示顺序type 类别(smiley/icon)code smilies代码(对于type=smiley有效)url 图标位置cdb_stats 论坛统计记录(50条)type 统计类别variable 统计的变量名count 统计计数cdb_statvars 论坛统计记录(在后台启用了论坛统计以后有记录)type 统计类别variable 统计的变量名value 统计的数值cdb_styles 风格样式(1条)styleid 风格idname 风格的名称available 是否可用templateid 关联的模板idcdb_stylevars 风格变量设置(25条)stylevarid 数据IDstyleid 关联的风格idvariable 风格的变量名substitute 变量赋值cdb_subscriptions 用户定阅表(0条)uid 订阅用户idtid 用户订阅的主题idemail 用户email地址lastnotify 上次email通知时间cdb_templates 模板表(1条)templateid 数据IDname 模板的名称directory 模板所在的目录copyright 设计者版权信息cdb_threads 主题表(0条)tid 主题idfid 论坛idiconid 主题前面的表情图标idtypeid 主题类型idreadperm 阅读权限price 售价author 作者的用户名authorid 作者的idsubject 标题dateline 主题发表时间lastpost 最后回复者的idlastposter 最后回复者的用户名views 浏览次数replies 回复数量displayorder 显示顺序(0为普通主题,1~3分别为I,II,III级置顶) highlight 是否高亮显示digest 是否精华rate 是否评分blog 是否加入blogpoll 是否为投票帖attachment 是否包含附件,且附件类型moderated 是否被编辑过closed 主题是否关闭cdb_threadsmod 主题管理记录表tid 主题iduid 用户idusername 用户姓名dateline 操作时间action 什么操作cdb_threadtypes 主题类型表typeid 类型iddisplayorder 显示顺序name 类型名称description 描述cdb_usergroups 用户组权限表(15条)groupid 用户组idradminid 关联的管理组idtype 组类型(system系统组/member会员组/special特殊组)grouptitle 组头衔creditshigher 该组需要的积分上限creditslower 改组需要的积分下限stars 星星数量color 组头衔颜色groupavatar 组头像图标readaccess 阅读权限allowvisit 允许访问论坛.allowpost 允许发表新主题.allowreply 允许发表回复allowpostpoll 允许发表投票.allowdirectpost 允许直接发表新主题是否需要审核allowgetattach 允许下载附件.allowpostattach 允许发表附件.allowvote 允许参与投票.allowmultigroups 允许加入/离开公众用户组allowsearch 允许搜索.allowavatar 允许使用头像.allowcstatus 允许自定义头衔allowuserblog 允许使用blogallowinvisible 允许隐身登陆.allowtransfer 允许积分转账allowsetreadperm 允许设置帖子权限allowsetattachperm 允许设置附件下载权限.allowhidecode 允许使用[hide]代码.allowhtml 允许使用htmlallowcusbbcode 允许使用自定义Discuz!代码. allownickname 允许使用昵称allowsigbbcode 允许签名中使用Discuz!代码allowsigimgcode 允许签名中使用img代码allowviewpro 允许查看用户资料allowviewstats 允许查看统计数据. disableperiodctrl 不受时间段***reasonpm 操作理由短消息通知作者maxprice 主题最高售价maxpmnum 短消息收件箱容量.maxsigsize 签名的最大长度.maxattachsize 最大附件尺寸. maxsizeperday 每天最大附件总尺寸(字节): attachextensions 允许发布的附件类型. raterange 评分范围cdb_validating 用户审核表uid 待审核用户idsubmitdate 提交日期moddate 审核日期admin 进行审核的管理员submittimes 提交的次数status 状态message 注册原因remark 管理员留言cdb_words 词语过滤(0条)id 数据IDadmin 操作者IDfind 不良词语replacement 替换为cdb_access 用户权限表cdb_adminactions 管理动作表cdb_admingroups 管理组数据表cdb_adminnotes 管理员留言cdb_adminsessions 管理员后台在线记录cdb_advertisements 广告资料表cdb_announcements 论坛公告资料表cdb_attachments 附件资料表cdb_attachtypes 附件类型表cdb_banned 被禁止的ip列表cdb_bbcodes bb代码资料表cdb_blogcaches 博客缓存表cdb_buddys 好友信息表cdb_creditslog 积分交易记录表cdb_crons 计划任务表cdb_failedlogins 错误登录记录cdb_favorites 个人收藏信息表cdb_forumfields 板块扩展信息数据表cdb_forumlinks 友情链接数据表cdb_forums 版块资料表cdb_medals 勋章资料表cdb_memberfields 用户扩展资料表cdb_members 用户基本资料表cdb_moderators 版主信息数据表cdb_modworks 版主工作记录表cdb_onlinelist 在线列表定制cdb_onlinetime 用户在线时间信息表cdb_orders 订单数据表cdb_paymentlog 支付记录cdb_pluginhooks 插件钩子表cdb_plugins 插件表cdb_pluginvars 插件配置表cdb_pms 短信资料表cdb_pmsearchindex 短消息搜索缓存表cdb_polls 投票帖资料表cdb_posts 帖子资料表cdb_profilefields 用户栏目定制cdb_promotions 论坛推广cdb_ranks 头衔表cdb_ratelog 帖子评分记录表cdb_regips 注册ip记录表cdb_relatedthreads 相关主题cdb_rsscaches RSS缓存cdb_searchindex 搜索缓存cdb_sessions 在线表cdb_settings 论坛设置表cdb_smilies 表情信息表cdb_stats 统计数据表cdb_statvars 统计变量表cdb_styles 风格cdb_stylevars 风格变量表cdb_subscriptions 订阅信息表cdb_templates 模板cdb_threads 主题资料表cdb_threadsmod 主题管理记录表cdb_threadtypes 主题分类表cdb_usergroups 用户组数据表cdb_validating 等待人工审核的会员记录cdb_words 词语过滤表。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Discuz!NT 系统架构分析
前一段时间负责负责论坛的迁移工作,对其架构进行了简单的整理。
前几天看到有人说discuz的介绍很少,因此整理了一下,发布出来。
也是第一次发表文章,大侠们手下留情。
Discuz整体架构如下图所示:
横向表示同一层次中涉及的各个模块(项目)
纵向表示不同层次之间模块的关系,某些关系是如何在各层次中传递(穿越)
Discuz架构上采用了比较流行的三层架构,即表现层,业务逻辑层,数据访问层来进行设计,并结合自己的情况进行了特殊处理。
表现层:
表现层即为上图中蓝色虚线表示,主要包括:Web,Services,UI,Control。
各项目主要功能为:UI 定义各种页面基类,提供Ajax访问访问接口。
Control存放Discuz用到的自定义服务器端控件。
Services提供外部访问接口。
Discuz引入了一种模板引擎的机制,来实现表现层的多样化。
主要设计思想为:针对设计人员,提供纯静态页面,并提供了一套约定的语法和标签(具体位置在:templates)。
模板制作完成后,要进行模板导入,此时discuz会将静态模板进行解析将其转换成aspx页面,然后放到aspx/1..n下。
如果你打开这下面的文件,会发现前端只是一个字符串拼接的过程。
要进行的逻辑判断,都放到了后台代码中。
后台代码只有一份,所有的aspx 模板引用同一个后台处理类。
由此实现web表现的多样化
当用户进行页面浏览时,首先确定显示哪个模板,然后采用地址重写技术,将其转移到实际的处理文件。
在web.config配置为
可见Discuz对所有的请求进行了控制,其代码如下(以Index.aspx为例):
首先程序会先查找Cookie,找到TemplateId,然后重定向到相应的模板文件。
综上所述:模板+重定向实现了表现层的多样化。
业务逻辑层:
业务逻辑,顾名思义就是处理与业务相关的代码。
Discuz采用的也是中小型项目的常用的“贫血模式”,即在业务逻辑层只是进行实体的获取,转发和赋值,几乎没有业务操作。
本该封装在此层的业务代码进行了分散,一部分前移至表现层(比如发帖时的加分操作,附件处理),一部分后移到了存储过程(比如发帖后更新我的发帖列表)。
注:关于贫血模式的论述详见Martin Fowler的相关著作<企业应用架构模式>等
在业务层,使用了Discuz缓存。
主要是更改了存储体,将其存储在xml中(为啥这么喜欢用xml呢,印象中它是很慢的),调用方法和通常情况下几乎无差别。
个人感觉其业务逻辑层是项目中设计最失败的地方。
拿发帖举例,如果我进行设计,我的方案可能会是这样:
时间关系,有时间再写一篇文章。
顺便说一句:如果要进行Discuz的整合,主要调用的就是此层的代码。
主要项目为:
Discuz.Forum
Discuz.Space
数据访问层:
Discuz基于商业考虑和版本限制等因素,迄今为止已有多种数据源:access,mysql,sqlserver 等。
为了实现三种数据库的接口统一,此处使用了接口和抽象类进行规范。
其类库结构如下(调用方以Post为例):
各个数据库中的PostManage都使用DbHelper进行通用数据库的访问。
DbHelper本身并没有指定具体的数据库链接类型,参数类型,而是使用.Net自带的抽象类DbProviderFactory来创建。
具体数据库的加载要等其静态属性Provider,Factory调用时,读取配置文件,以反射形式进行初始化。
代码如下:
通过此种形式,可以实现各种数据接口的调用的统一,同时方便数据库类型的拓展。
比如要加入Oracle的支持,只需要继承IDbProvider实现OracleProvider,新的PostManage继承IDataProvider 重写部分方法即可。
而业务层(Posts)的调用通过IDataProvider接口来进行统一,避免了和数据库类型的耦合,可以在不改变业务层,表现层的代码基础上实现数据库之间的迁移。
这正是大型项目所需要的,以接口来实现层与层之间的通讯,将更多的可变因素,扩充点实现配置化。
其他子模块的介绍
1.配置
对配置的管理,小型项目可以直接使用web.config,中大型项目一般使用自己的配置解
决方案。
原因是:
1. 中大型项目配置文件过多,直接使用web.config来会造成其体积过大
2. web.config直接使用字符串进行读取不方便,
试着比较一下:
ConfigurationManager.AppSetting[“SiteName”];
3. 每次都需要进行类型转换
Discuz实现了自己的配置类,其类结构如下(以Email为例)
IConfigInfo为空接口,没有定义任何方法,主要是方便DefaultConfigFileManager传递,方便以后扩充。
对配置文件的解析也没有使用.Net自带的接口,而是重新定义了接口,同时使用了xml 反序列化实现配置文件的加载和类型转换。
代码见: DefaultConfigFileManager.DeserializeInfo
比较疑惑的是这个项目中某些类给出了实现,却没有发现调用。
可能是兼容或者扩充问题留下的,谁对这方面了解的,也可以跟帖说下。
这些类有:ConfigProvider,IConfigFileManager
2.数据库表的设计
数据库设计中有两个引人注意的地方:
1.主题表分离
如果由我们来设计主题表和回帖表,通常的做法是如下。
这样在获取主题列表时,直接使用分页算法提取Topics;查看某一帖子时,还需要对Topics,Posts 进行jion链接。
此种设计的缺陷为:
1.Topics表存储Content的内容,其体积将会很大,对大体积表进行分页,性能很慢。
2.显示Posts内容时将进行join操作,损耗性能
而Discuz的做法是进行如下设计。
将Topics里的Content拆分到Posts中去,同时Topics的主题帖也作为回帖放置到Posts里面,这样就解决了上面我们提出的两个问题。
这是典型的违反数据库设计范式以换取更好性能的示例。
2.对Posts表进行水平拆分
原来以为每一百万帖子,discuz会自动进行拆分,后来发现在discuz后台能够进行设置,手动进行分表,discuz建议每30-50万帖子进行一次拆分。
进行拆分后,每个表的体积将会减少,保证了查询的效率
Discuz的整体架构还有很多其他值得细说的地方,例如插件、扩展等,这些需要感兴趣的人自己一一去研究,在此就不多讲了.。