ThinkSNS 1.6二次开发指南(beta版)2009年智士软件(北京)有限公司北京市海淀区上地十街辉煌国际2号楼2301室010 – 59714755序言这是2009年的第一次,忙碌了太久的企业项目,ThinkSNS终于又开始啦,太多的期待和等待,我们听到很多很多声音,不管怎么样,我们回来啦!,在这沉寂的一年多时间里,我们经历过多次的波折,团队一度徘徊在解散的边缘,生存的压力也中断了产品的持续性开发。
直到09年的5月底,我们终于有了足够的人力和精力来重新启动产品。
在产品开发之前,我们也不断的在讨论,究竟该用怎样的产品去满足不同用户的需求,我们并不认同SNS等同于webgame的发展思路,在我们看来,SNS 的魅力在于它改变了信息的传播方式,如何做好最基本的功能——促进用户之间的交流才是产品的核心所在,至于通过哪些组件实现交流,可以让运营者根据自己的用户特性去选择,而通过游戏的交流只是其中很小的一部分,国内的互联网应用不会永远停留在娱乐阶段,我们希望着眼于未来——围绕社会化服务的核心,深度开发能给用户带来实际效用的交互组件。
基于以上的想法,我们这一版产品的目标就是搭建一个完善的内核架构,独立的API,将应用与核心完全分离,让每个应用都可以在后台独立配置,并提供详尽的开发文档,使得更多的开发者可以很容易的开发出新的组件,丰富TS的组件,满足不同用户的社交需求。
最后感谢所有关注和支持T hinkSNS的朋友,如果你有什么疑问或建议,请在我们社区的群组里找到相应的官方群组并提交你的疑问或建议,我们会一直留意那里提交的问题并及时更改,如果是提交bug,请同时注明你的测试环境,方便我们发现问题所在,我们社区的网址是:目录简介 5什么是ThinkSNS 1.6 5编写目的 6引用术语与缩写说明 6预定义的全局变量说明 6整体说明 7设计说明 7设计目标 7构架说明 8目录结构 8核心结构说明 9ThinkPHP1.6修改说明 10应用结构说明 12分享 13API库 21API接口说明 22用户API 22好友API 24积分API 25动态API 28通知API 31评论API 34附件API 35分享API 36站点信息API 37公共Widget 38评论widget 41举报widget 43好友选择widget 43好友分组widget 44附件widget 45相册widget 46模板开发教程 47应用开发说明 54开发目录说明 54应用的开发方式 54应用开发范例 56开发需求和开发目标 57创建数据表 57创建应用目录 60开始编程 63增加积分消费功能 77增加发动态功能 78增加发通知功能 80更新首页统计数目 82增加应用后台 83增加应用 93调试 94简介什么是ThinkSNS 1.6ThinkSNS 1.6作为智士软件(北京)有限公司旗下最新产品,集成了众多ThinkSNS开发者在大型项目中的经验,并将这些宝贵的经验应用于新版的产品之中,不管是对于普通站长还是对于开发者来说,这都是一款值得期待的SNS 产品。
ThinkSNS 1.6版汲取了国内几大SNS社区网站的优秀体验和设计,满足了众多站长用户的大众需求。
同为一款开源产品,ThinkSNS在商业领域的运用,也使其完全能够满足并适用于企业的需求,并为企业增值和解决方案提供了有力的支持。
相对于ThinkSNS 1.0,最新版的ThinkSNS 1.6做了很大的改变,具体如下:1、完整的产品构架、完善的基础应用、开箱即用。
2、内置API接口、后续支持自建平台、核心和应用分离。
3、完善的后台管理、可植入独立的应用管理。
4、正在完善IM应用,包括独立部署的WebIM和基于Air技术的客户端应用。
同时ThinkSNS官方将不断的促进ThinkSNS的完善和新技术的应用,使用者可以在官方社区里获得最新的应用插件与系统升级信息。
ThinkSNS 官方网站ThinkSNS 1.6版体验网站编写目的本文档是ThinkSNS 1.6版本的二次开发指南,供二次开发人员使用。
引用术语与缩写说明核心:ThinkSNS 1.6的核心的指用户基本操作集成,通过接口给应用提供查询,插入核心信息的的能力。
应用:别名组件,是基于核心的一个单独功能块,为用户提供某项特定服务。
在ThinkSNS 1.6里应用是通过API与核心进行通信,应用与应用之间的耦合度低,并且所有的应用都可以在后台设置关闭和开启。
API:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供给应用程序与核心进行通信的能力,而又无需访问源码,或理解内部工作机制的细节。
注:本指南如没有特殊说明,所有的代码段都基于ThinkPHP 1.6环境开发的。
预定义的全局变量说明在应用/插件开发过程中,可以直接使用下面的全局变量:$this->api 核心API调用的变量,使用例子:$this->api->user_getLoggedInUser(); (获取当前登录的用户ID) $this->opts 调用系统配置信息$this->mid 当前登陆的用户ID$this->uid 当前被浏览的用户ID$this->my_name 当前登陆的用户昵称$this->appid 当前应用ID 如果是THINKSNS核心,则appid=0整体说明设计说明1、本文档主要对ThinkSNS 1.6版本的核心架构进行描述,使设计和开发人员在开发ThinkSNS 1.6版本的应用时遵循统一的规范;2、本文档描述了在ThinkSNS 1.6版本使用的常见设计机制;3、本文档充分描述了在―核心+应用‖中提到的可配置服务及可扩展服务,以便于在开发新的应用时使用;4、本文档还对ThinkSNS 1.6版本的全局配置信息(例如:ThinkSNS 1.6版本Config)及官方提供的应用配置进行了详细说明。
设计目标独立API架构,应用可配置,二次开发的选择为了达成这些设计目标我们采用了以下设计机制:1。
独立API架构:所有的应用单独开发;2。
应用可配置:后台可直接关闭或开启某个应用;3。
二次开发的选择:程序尽量简洁规范化,二次开发人员可以快速地熟悉定制开发的方式和修改现有的功能;构架说明ThinkSNS 1.6版本采用了全新的构架方式,把应用与核心单独分离,使得系统框架更加清晰明了,方便第三方开发和安装新的应用。
目录结构┎━index.php 统一入口文件┝━admin.php网站后台地址文件┝━cleancache.php手动删除缓存文件┝━config.inc.php 网站配置文件┝━define.inc.php 常量定义文件┝━thumb.php 自动缩略图文件┝━a dmin 后台目录┃┝Common 公共文件目录┃┝Conf项目配置目录┃┝Lang 语言包目录┃┝Lib 应用类库目录┃┗Tpl 模版文件目录┝━apps 应用目录┃┝blog日志目录┃┝event活动目录┃┝mini心情目录┃┝photo相册目录┃┝share分享目录┃┝vote 投票目录┃┝group群组目录┃┗…更多项目目录┝━data 后台目录┃┝cache 静态缓存目录┃┝upload上传文件目录┃┗user用户信息目录┝━p ublic 网站公共目录┃┝Js JS文件目录┃┝Images 图片目录┃┝Languages语文包目录┃┗Theme风格主题包目录┝━runtime 核心缓存目录┝━thinkphp TS框架目录┝━thinksns TS核心功能目录所有的应用目录都放在apps/目录下,如果要开发一个新的应用也是在该目录下创建应用的目录。
核心结构说明ThinkSNS1.6核心结构图ThinkSNS 1.6的核心包括两部分:个人空间的基本功能和API库。
个人空间的基本功能有个人资料,隐私,邀请,好友,动态,消息,留言板,随便看看。
关于核心部分开发人员只需要了解API的调用方法即可,没必要花精力研究它的运作和机制,而API库的说明请阅读下面的API库栏目。
ThinkPHP1.6修改说明为了方便开发和优化系统结构,我们对ThinkPHP作了以下几点修改,特别是在核心Model里增加了findPage方法,它集成了findAll方法和分页方法,大大方便了程序的开发,如果使用ThinkPHP作为应用开发框架的话,推荐使用该方法。
2009-06-011、ThinkPHP.php的第28行目的:修改runtime路径2、ThinkPHP.php的第51行目的:新增引入TS公共函数3、ThinkPHP.php的第29行Lib\Think\Template\ThinkTemplate.class.php的第710行目的:使<include标签可以认识__THEME__4、Common\function.php中第569行Lib\Think\Util\Widget.class.php第27行目的:当W函数找不到当前目录的插件的时候,去核心的插件目录去找2009-06-021、convention.php中第151行View.class.php中的第347行目的:为了$this->success可以指向公共Theme目录2009-6-101、ThinkPHP.php中第102行目的:如果不存在runtime目录,则自动创建2009-6-12修改ThinkPHP/Mode/Model.class.php中的findPage方法,更加严格的判断了传入参数。
使用方法和findAll类似,只传递第一个参数即可,@int|array $pageopt 传递数字,就是每页记录数,默认是20条。
也可以传递数组:$pageopt['pagesize'] Page类中的每页记录数$pageopt['param'] Page类中的第三个参数D('S hare')->field('id, toUserName')->findPage(10);输出格式如下所示,其中count和totalRows是总记录数,主要为了兼容性才需要变量,开发人员可以在两个中选用其一就可。
totalPages是总分页数,nowPage 是当前分页数,html是输出页码,data就是用findAll得到的结果。
具体请参考分享应用的输出:array(6) {["count"] => string(2) "65"["totalPages"] => float(7)["totalRows"] => string(2) "65"["nowPage"] => int(1)["html"] => string(453) " <span class='current'>1</span><a href='/ts16//apps/share/index.php?s=/Index/list_friends&p=2'>2</a><a href='/ts16//apps/share/index.php?s=/Index/list_friends&p=3'>3</a><a href='/ts16//apps/share/index.php?s=/Index/list_friends&p=4'>4</a><a href='/ts16//apps/share/index.php?s=/Index/list_friends&p=5'>5</a><a href='/ts16//apps/share/index.php?s=/Index/list_friends&p=6'>6</a><a href='/ts16//apps/share/index.php?s=/Index/list_friends&p=2'>下一页</a>" ["data"] => array(10) {[0] => array(16) {["id"] => string(3) "181"["toUserName"] => string(9) "水上铁"}[1] => array(16) {["id"] => string(3) "171"["toUserName"] => string(6) "奇鸟"}......[9] => array(16) {["id"] => string(3) "147"["toUserName"] => string(9) "水上铁"}}}应用结构说明分享分享应用结构的最大特色是:需求决定模板,模板决定变量。