• UID18455
  • 登录2018-04-20
  • 粉丝1
  • 关注0
  • 发帖107
  • 主页
  • 金币555枚
社区居民
原创写手
ThinkSNS 发布于2018-03-21 14:33
0/155

干货:用技术分析致敬老牌开源社群系统—ThinkSNS

楼层直达
  我从高中那会儿便开启了自己的SNS社交之路。这七八年的光景都用在了SNS社交上,其中有微笑、有汗水、也有心酸。我出门采光,会拍几张分享到SNS社交;遇见有损社会的行为,果会断在SNS社交曝光;心里有点小情绪,会发到SNS社交吧一吐为快。渐渐的,我习惯了从SNS社交去寻找那些冷不丁的笑点,从文笔大咖的SNS社交中获取文艺的逼格,从IT大牛的SNS社交里汲取业界动态和新鲜的知识。而在诸多SNS社交系统中我最早接触的开源社交SNS还是基于web2.0版本开发的ThinkSNS。
   通过一些网络检索发现,像知乎等相关网站里关于ThinkSNS的专业技术信息相对较少,许多程序员们想检索一些关于ThinkSNS技术文档却无从获得。因此我便写了这篇关于ThinkSNS技术方面的文章同诸多喜欢ThinkSNS的创业者们分享,同时也为开发者提供自己在技术方面的见解。


      一、我们常说的TS是什么?
      首先,我们来熟悉下什么是TS,TS就是“ThinkSNS”的缩写,喜爱TS程序的人,我们称之为TSer。TS是一款开源程序,代码托管平台是GitHub,所有的细节修改,均为透明性更新。
   使用者可以通过官网(http://www.thinksns.com)和官方演示社区(V4 Demo站 http://demo.thinksns.com;TS+体验站:https://tsplus.zhibocloud.cn/feeds)以及GitHub仓库(https://github.com/slimkit/thinksns-plus)获得TS+最新的开发动态~当然,如果你有兴趣也可以Pull requesTS(简称PR)代码给TS开发人员,开发人员得到代码之后如果符合开源需求,就会合并到TS版本的当中,如果普通用户遇到问题,可以在demo站或者Github中提交Issues,均会得到开发人员的统一回复。
   TS对PHP版本要求压得比较低,基本行业都跨入了php5.5 or php5.6阶段了~但是考虑到国内大部分小众虚拟主机以及很多对相关专业知识不了解的人,所以,TS把php版本压低到了php5.3.12版本~当然,有人认为为什么小版本是12,这个版本是php5.3的第一个稳定版~也就是这个小版本之前的版本都不是稳定版,所以不推荐安装使用。
    二、Laravel框架Eloquent ORM TP框架
   TS在2016年的开发过程中做了比较大的底层架构变动。众所周知,TS的底层是基于ThinkPHP框架进行二次修改的,用户不能就ThinkPHP直接对TS进行升级其中一个主要原因就是TP框架并非完全遵循的MIT开源协议。当然,对开发者来说TP框架技术架构本身也存在不够先进和过于抽象的问题。所以综合考虑,TS在数据交换时使用了Laravel框架的Eloquent ORM 。
   Eloquent ORM 的优势是什么?这款ORM对数据的处理比较类似于Node.js的数据处理即一切皆为对象,而且ORM对数据关系的处理效率是不输于doctrine的,这也是TS这么选择的原因。当然,考虑更多的是为以后更先进的架构做准备。TS将慢慢采用拓展方式进行开发,并对整个TS程序做架构数据交换等。
   新的ORM的引入让TS考虑php7平台的运行,但php7已经完全删除了MySQL的 连接方式,只有PDO和MySQLi。那么,如果想要在php7环境下运行,必定对DB类做重新修改,但是考虑到兼容性的问题,所以目前依旧在旧的应用上,还是由model生成SQL,然后把SQL交给PDO来执行。而新开发的应用和功能均使用全新的ORM做的数据开发。

      三、TS技术优势与拓展
   除了引入新的ORM,TS还有很多技术优势,比如:有更容易被理解和集成的基类。这些基类是在第三方库的基础上进行二次封装,使TS的模块开发中设置的属性更加标准,也使开发入门更简单。因为,如果继承等都是由开发者去集成第三方的类,那么按照国情,这几乎是不可能的。而在此基础上开发者只需要看下基类,就知道集成后自己需要做什么,无需去学习第三方类。
   TS新的拓展(目前是应用)中,原来的静态资源直接引用应用下的资源,在新的架构中,TS的应用都会被统一移动到一个公开缓存目录中,方便外部调用。如此设计是为了使得TS更加安全。这样用户就可以在不暴露代码的前提下得到应用中嵌套的静态资源,站长或者开发人员可以更安全的把非公开代码保留在暴露目录的上层隐藏起来。
   那TS具体有哪些功能特色呢?这个问题基本上是仁者见仁智者见智了。因为TS集大成于一身,除了包含社交核心功能外,还有微吧、频道、资讯,活动、商城等,同时还有许多不同行业属性的TS合作产品,如图:

      四、聊天和风向才是社交的核心
   TS具有独立开发的原生即时聊天系统。我们知道,聊天和风向才是社交的核心。在PC中,TS使用JS轮询来实现消息的接收等操作;移动端中,TS使用了先进的技术方式—Socket技术,为了保证用户记录的不丢失,避免了P2P点对点传输,程序由一个客户端推送给服务器,服务器在把消息转推给另一个客户端,并在数据库中几率,达到了多端同时到达的目的。
   五、TS中基础的技术要点
   不上点干货的分析都是耍流氓。下面,就讲讲TS中基础的技术要点吧。TS中,应用都有一个配置文件,目前应用目录是apps/<app name> 所以,配置文件就是:“apps/<app name>/manage.json”,下面有演示代码:


   我们可以看到这是比较新的应用配置老的应用中只需要配置“resource”项即可配置这项后静态资源会缓存到“storage/app/<app name>”如果你配置了开发者模式每次访问都会移动到这里所以,storage/app目录是公开的暴露目录。
   实现上述所说就不得不提新的应用安装类命名空间是TS\Helper\AppInstall -对新的应用机制做了一些列处理目前是静态资源缓存),应用的运行器也是位于该命名空间下,“TS\Helper\Controller”这个及时运行器只需要传入App Name,Controller Name, Action Name,运行器会通过Composer中查找到应用注册的命名空间来运行需要的控制器代码。
   说到这里不得不提一点重要的技术加入就是Composer包管理工具。Composer可以说是所有语言的包管理工具中最好的工具其提供了第三方包的规范集成升级卸载还有符合PSR-0PSR-4规范的AutoLoader工具。这使得TS中不在需要冗余的自定义自动加载来查找我们需要的类文件和库文件了,使用Composer就可以直接注册。我们用个最简单的例子来说明:
   据了解TS开发团队正在开发的全新Web Application应用,其中的重要代码存在于apps/<app na,e>/src目录下,那么,TS是如何能找到类自定义的目录位置的呢?说到这里,就得知道应用规定的命名空间,应用对命名空间没有任何要求,唯一有要求的就是控制器,Controller的看命名空间规定为“App\<app Name>”,这么规定是方便通过URL参数找到应用的控制器,当然,这个也只是暂时的,以后TS的开发中不在有任何命名空间等技术上的要求,你只需要调用路由器注册控制器,而不再是TS主动查找控制器了,使用的所有东西都需要提前注册,这符合先进的技术要求。
   言归正传,TS怎么找到 Controller的呢
   其实TS做的事情很简单构造一个“App\<app name>\<controller name>”的类然后实例化这个类即可而这个类是应用开发的时候通过Composer注册到了自动加载中的。这个应用准寻的规范是PSR-4,所以,我们可以把代码放在任何目录,而不只是src目录,这个目录对于TS程序来说是未知的,而Composer却知道,所以TS只需要“询问”Composer就可以得到。
   此项新技术的引入,不但减少了繁重的开发工作,而且使得TS代码更加简单,因为我们不在关心和TS本身代码无关的事情,我们只需要专注自己代码部分的开发即可。所以TS的代码包,除开第三方库,从去年的24MB减少到了现在的21MB,为什么还是这么大?因为TS在使用新的技术的同时,要考虑到旧的模块的运行需求,现在无能为力把旧的模块都重新开发一次,因为没有这个必要。我们总不能说,生了一个孩子,孩子长丑了就塞回去重新生的吧!
   TS改变的重点在ORM的加入,那么新的数据model怎么使用呢?来个基础的继承代码:

   没错,加上注释也就20行,那和之前的模型继承有什么区别?一个区别在于传递参数的改变,ORM支持在MySQL,SqlLite,SQL server等数据库中自由切换。另一个区别在于定义的关键词的改变,一但定义了模型,就可以对表经常操作了,是不是很简单。上表中,查询一条feed_id是1的数据,很简单,Feed::find(1)。OK,我们已经查询完成了。当然,返回的是一个object,而不是纯数据的Array。
   如果你想把它变成你要的数组,比如$feed就是上面的查询返回的数据,那么只需要 $feed->toArray()就可以做到。如果我们能知道表的字段,我们就可以直接把查询出来的数据当成对象成员的形式读取,比如$feed->feed_id或者$feed->cTime,也可以直接把这个对象传递给foreach来对属性进行遍历,由此看出,新的ORM对数据处理我们无需像以前那样对数组操作,但是我们可以对遍历等在以前的基础上不变。
   当然,具体的更多用处,可以查询Laravel框架官方文档,再举一个ORM中关系的例子。
public function phone()
{
   return $this->hasOne('Phone');
}
   在上面的方法中定义一个这样的方法我们一对一的关联了Phone这个模型,$data = Feed::find(1)->phone 我们就可以得到phone主键feed_idfeed表相同的值的表对象。是不是很方便?
   最后再来说一点controller上面的事情把,在TS中封装了一个叫做“TS\Base\NoneController”的基类,在你的控制器下,定义一个叫做“App\<app name>\Controller\None”的控制器类,继承这个NoneController对象,那么,你应用下访问到了不存在的controller的时候就会重定向到这个controller。所以,你可以用这个东西拓展出很多意想不到的方法。
六、ThinkSNS不仅仅是开源,也是创业加速器
         我不知道通过这篇文章的介绍,各位是否真的了解了TS,而这只是TS中的凤毛麟角,但也是不可忽视的。
         TS一直在成长,尽其所能的为创业者添动力加速度。
        总结:TS架构先进,代码符合PSR规范,用户使用简单,兼容性高,创业者可以很容易的适应TS来满足自己的业务需求,开发者可以在极短的时间内入手。
       时间对于技术人员和创业者来说,是最昂贵的成本,ThinkSNS的祈望和宗旨,是让创业者,开发者把精力都放在自己该做的事情上。

0人打赏
您需要登录后才可以回帖
发表回复
极贡献
技术问答
专题荟萃
程序人生
视觉设计
Android开发
iOS开发
编程语言
前端开发
后端开发
服务器架构
软件测试
运维方案
创业路上



最热文章墙

  • 88746/384   【精品推荐】200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^

  • 50870/191   情人节福利,程序员表白的正确姿势:改几行代码就变成自己的表白了

  • 48557/0   Python爬虫:常用浏览器的useragent

  • 46063/261   【精品推荐】Android版产品级的音乐播放器源码,功能太强大了,最好的产品原型有木有?

  • 42359/145   省时省力的Android组件群来了,非常棒的原型参考

  • 33635/143   2016抢红包软件及源码

  • 31478/71   原创表白APP,以程序员的姿势备战新年后的7夕,持续完善中!

  • 30210/2   超全!整理常用的iOS第三方资源

  • 27766/161   Android版类似UC浏览器:非常赞,产品级的源码

  • 24250/31   麻省理工的一帮疯子,真的实现了随意操控万物!(绝对黑科技)

  • 24025/27   2016程序员跳槽全攻略

  • 23925/26   Android工程师面试题大全

  • 22927/10   GitHub上排名前50的iOS项目:总有一款你用得着

  • 22171/21   码魂:程序员的牛B漫画

  • 21205/74   【持续更新中】Android福利贴(二):资料源码大放送

  • 20822/85   Android小而全的博客源码:非常适合全面掌握开发技巧

  • 20680/43   一个绚丽的loading动效分析与实现!

  • 19802/10   2016年最全的Android面试考题+答案 精编版

  • 19768/104   Android带弹幕的视频播放器源码,来自大名鼎鼎的Bilibili弹幕网站

  • 19720/3   吐槽那些程序员的搞笑牛逼注释

  • 19379/82   仿京东商城客户端Android最新版,不错的原型和学习资料

  • 19335/45   惊艳的App引导页:背景图片切换加各个页面动画效果

  • 18681/23   Android福利第三波【Android电子书】

  • 18597/25   个人收集的Android 各类功能源代码

  • 18537/81   【精品推荐】类似360安全卫士安Android源码:非常赞的产品原型

  • 18477/1   iOS 动画总结

  • 18252/1   iOS中文版资源库,非常全

  • 18074/5   新一代Android渠道打包工具:1000个渠道包只需要5秒

  • 18023/54   基于瀑布流的美女图片浏览App,有注释的源代码

  • 17661/18   用JavaScript 来开发iOS和Android 原生应用:React Native开源框架中文版来啦

  • 17465/19   65条最常用正则表达式,你要的都在这里了

  • 17407/23   珍藏多年的素材,灵感搜寻网站

  • 17183/10   女程序员的梦,众网友的神回复

  • 17030/11   年会上现场review代码是怎么样的体验!

  • 15836/16   基于Android支付宝支付设计和开发方案

  • 15660/62   【技巧一】搭配Android Studio,如何实现App远程真机debug?

  • 15560/18   什么是真正的黑客:收获12200+Stars,人气远超微软开源VS

  • 15482/47   在线音乐播放器完整版(商用级的源码):非常赞,可听免费高品质专辑

  • 15356/4   46 个非常有用的 PHP 代码片段

  • 15348/11   有木有这样一张酷图帮你集齐所有git命令超实用

  • 14648/0   GitHub iOS 库和框架Top100 

  • 14434/7   一张图搞定iOS学习路线,非常全面

  • 14384/7   用程序员的姿势抢过年的火车票

  • 14003/10   成为Java顶尖程序员 ,看这11本书就够了

  • 13974/10   微信支付终于成功了(安卓,iOS),在此分享

  • 13960/29   【持续更新中】Android福利贴(一):资料源码

  • 13946/18   一张图搞定Android学习路线,非常全面

  • 13861/1   基于node-webkit跨平台应用案例集之(一)

  • 13720/4   基于Node.js的强大爬虫,能直接发布抓取的文章哦

  • 12879/3   即时通信第三方库

  • 12501/9   流媒体视频直播方案

  • 12470/18   八个最优秀的Android Studio插件

  • 12331/2   【精品推荐】高质量PHP代码的50个实用技巧:非常值得收藏

  • 12176/1   过上惬意生活的精华资源:创业、工作、生活成长

  • 12168/9   B站建开源工作组:APP想支持炫酷弹幕的看过来

  • 11783/9   烧了5亿美金,这家神秘的公司即将颠覆人类未来!

  • 11761/12   中国黑客的隐秘江湖:攻守对立,顶尖高手月入千万美元

  • 11296/2   Android性能优化视频,文档以及工具

  • 11082/6   开箱即用!Android四款系统架构工具

  • 10861/4   10款GitHub上最火爆的国产开源项目——可以媲美西半球

  • 返回顶部