做开源的虚拟主机管理系统

作者 : admin 于 2009年05月15日, 05:47:06
2009
05-15

经过痛苦的削减,我把我预想中的虚拟主机管理系统功能裁到了最小 - 标准的单机lamp虚拟主机管理系统。

这个过程是很痛苦的。在软件设计的时候,我参考了好多成型的虚拟主机管理系统,包括蓝芒,webmin,还有德国等几个虚拟主机管理。不过在做的过程中发现了各自的优缺点,做了取并集综合的方法,整理出一个无比强大的功能设计文档。另外,根据国情,设计了完善的业务流程和各种接口。

不过在做的过程才发现,庞大的系统我根本不可能去实现。另外在做的时候的确卡在了一些技术细节上,python的使用毕竟不如php熟练,另外socket通讯在不同语言上有很多细节的区别,还得一一去测试突破。

基于以上原因,我把设计文档一再精简,到了目前仅适合我使用的程度:

1、开设虚拟主机,mysql数据库,并开ftp帐号。

2、用户可以修改mysql数据库密码。

3、用户可以修改ftp帐号密码。

如此以来,我项目可以继续进行了。因为足够简单。另外之前的折腾并不是白做,因为好多问题悬在了心中。因为之前的鸿鹄大志,导致我现在设计的结构可扩展性比较强,程序功能模块也都进行了合理规划。

希望在半个月后能出第一版程序,届时会开源公测。 希望对此有兴趣的同学加入我们(其实是我)。

如何才能作出一款好的游戏

作者 : admin 于 2009年05月13日, 03:42:48
2009
05-13

貌似我也进入了如火如荼的webgame领域。虽然鄙人玩游戏很少,不过本着发展社会主义建设、全民奔小康的目的,还是要把这个东西搞好。

游戏的一些细节,我还是门外汉,仅总结一下游戏的几个要点:

背景,剧情。

游戏的背景和剧情是游戏的一个重头戏。纵观国内国外游戏,无一不建立在一个有鲜明背景的基础上。魔兽世界讲的希腊神话的故事,剑侠情缘讲的是古代武林故事,劲舞团把迪厅搬到了家里,CS让你在家里就可以与敌方激战。任何一个好的游戏都无法摆脱一个主线,就像一个电影的剧情,一本小说的线索。而只是打怪升级的游戏显然已经失去了原有的魅力,动人的故事背景是吸引玩家的一个先决条件,流畅的剧情是黏合用户的必要条件。

完善的程序架构

一直很讨厌提架构这个词,因为到现在我也不知道啥是架构,架构师依然是神秘的东西。我所谓的架构,是要作出一套程序,而程序可伸缩,可扩展,灵活自由,不会因为一点小的改动而逼疯程序员,更不会因为编码人员的牢骚而影响游戏的运营。程序要兼顾开发,策划,运营,运维多个部门,总之一句话:大家好才是真的好。

强大的运营支持系统

公司总是要盈利的,而且,不管做任何项目之前都得把这个事情想在前头。记住:老板得养活一个公司的人,投资人需要高额的利润。别听那帮人瞎扯:当时我们只想做用户,没想挣钱!那些人智商都不低,不用怀疑。任何事情都要提前想到,运营系统虽然是游戏内测公测很久才用得着的,但一定要在前期考虑进去。虽然收费系统,支付系统是无用的,但行为分析,数据分析,bug跟踪,用户反馈,推广系统,这些系统在游戏测试的时候既能发挥起作用,在数据基础上的数据挖掘更是游戏发展的风向标。

团队

没有一个人的英雄,尤其在IT这个圈子。

陪大亮加班之所想

作者 : admin 于 2009年05月09日, 08:37:37
2009
05-9

大亮又在加班,看来无双休还是小事,这么下去人的肉身能不能保全都是问题。

问题不大,琐碎的JS问题,不能算新手,但js的确是让人头疼的问题,何况人家是javaer。

想起了我刚毕业那股松散浪荡劲,后悔我的时间,我的青春。

客户给钱就能当大爷,老板给钱就能当黄世仁。这是千古不变的道理。

Business is business-抛开这些来讲,就是纯扯淡了。

耽误了两个小时的思考时间。一会要补上。

再也不敢浪费时间了。

Smarty分页类修正版

作者 : admin 于 2009年05月08日, 03:59:49
2009
05-8

原来写的分页类有问题,经过排查,发现一个变量用错了,修改之

效果,很简单,黑白配,有心的人可以自己修改一下风格,欢迎共享

e69caae591bde5908d-1

PHP部分

  1. < ?php
  2. /*  Page.Class.php
  3.  *  Page
  4.  *  @link        http://www.sunboyu.cn
  5.  *  @package     OA
  6.  *  @version     V1.0
  7.  *
  8.  *  2009 05 07  sunboyu@gmail.com
  9.  *  Demo
  10. $page = new Page( 1 , 'v_user' , '*' , '' );
  11. $rs = $page->__getlist();
  12. $smarty->assign("page",$page->__getpagelist());
  13.  */
  14.  class Page
  15.  {
  16. public $count;      #结果总数
  17. public $page;       #当前页
  18. public $pagesize;   #每页结果数
  19. public $pagecount;  #翻页数
  20. public $baseurl;    #url
  21. public $result;     #结果数组集
  22. public $pagelist;   #每翻页数
  23. public $db;         #数据库连接
  24. public $table;      #要查询的表
  25. public $fileds;     #要返回的字段
  26. public $where;      #where条件
  27.  
  28. #构造函数,初始化变量
  29. function __construct( $page , $table , $fields = '*' , $where = false , $baseurl = false )
  30. {
  31.      global $_CFG,$db;
  32. $this->db        = $db;
  33. $this->table     = $table;
  34. $this->page      = isset($page) ? intval($page) : 1;
  35. $this->fileds    = $fields;
  36. $this->pagesize  = $_CFG['pagesize'];
  37. $this->baseurl   = ($baseurl!=false) ? $baseurl : $this->__geturl();
  38. $this->pagelist  = $_CFG['pagelist'];
  39. $this->where     = $where;
  40. }
  41.  
  42. #获得当前url
  43. function __geturl()
  44. {
  45. parse_str($_SERVER['QUERY_STRING'],$str);
  46. if(isset($str['page']))
  47. {
  48. unset($str['page']);
  49. }
  50. return count($str) > 0 ? "?".http_build_query($str) : "?";
  51. }
  52.  
  53. #获得记录集
  54. function __getlist()
  55. {
  56.      #获得count记录
  57. $sql = sprintf("SELECT COUNT(*) AS table_count FROM %s %s",$this->table,(($this->where!=false) ? " WHERE ".$this->where : ''));
  58. $rs = $this->db->fetch( $sql );
  59. $this->count = $rs['table_count'];
  60.      $offset = ($this->page-1)*$this->pagesize-1;
  61.      $sql = sprintf("SELECT %s FROM %s %s LIMIT %d,%d",$this->fileds,$this->table,(($this->where!=false) ? " WHERE ".$this->where : ''),$this->pagesize*($this->page-1),$this->pagesize);
  62. #echo $sql;
  63.          $list = $this->db->fetchAll( $sql );
  64. return $list;
  65. }
  66.  
  67. #获得分页列表
  68. function __getpagelist()
  69. {
  70. $this->result['count'] = $this->count;
  71. $this->result['page'] = $this->page;
  72. $this->result['pagesize'] = $this->pagesize;
  73. $this->result['pagecount'] = ceil($this->count/$this->pagesize);
  74. if($this->result['pagecount']< =1) //只有一页以下
  75. {
  76. $this->result['pagelist'] = 0;
  77. }
  78. else //一页以上
  79. {
  80. #前一页,第一页的算法
  81. $this->result['first'] = ($this->page == 1) ? 0 : 1;
  82. $this->result['pre'] = ($this->page == 1) ? 0 : 1;
  83. #后一页,最后一页的算法
  84. $this->result['next'] = ($this->page == $this->result['pagecount'] ) ? 0 : 1;
  85. $this->result['last'] = ($this->page == $this->result['pagecount'] ) ? 0 : 1;
  86.  
  87. #起始
  88. $pagearray = array();
  89. $start = floor(($this->page-1)/10)*10+1;
  90. for($i=0;$i&lt;10;$i++)
  91. {
  92.      if( ($start+$i) < = $this->result['pagecount'])
  93. {
  94.      $pagearray[$i]['page'] = $start+$i;
  95. }
  96. if( ($start+$i) != $this->page )
  97. {
  98.      $pagearray[$i]['link'] = 1;
  99. }
  100. }
  101. #分页导航列表
  102. $this->result['pagelist'] = $pagearray;
  103. $this->result['baseurl'] = $this->baseurl;
  104. }
  105. return $this->result;
  106. }
  107. }
  108. ?>

模板部分

  1. <div id="page">
  2. <table>
  3.     <tr>
  4.     <td>
  5. 共{{$page.count}}条数据 每页{{$page.pagesize}}条  共{{$page.pagecount}}页 当前第{{$page.page}}页
  6. </td>
  7. <td>
  8. {{if $page.pagecount>1}}
  9. {{if $page.first eq 1}}
  10. <a href="{{$page.baseurl}}">首页</a>
  11. {{else}}
  12. 首页
  13. {{/if}}
  14. {{if $page.pre eq 1}}
  15. <a href="{{$page.baseurl}}&page={{$page.page-1}}">上一页</a>
  16. {{else}}
  17. 上一页
  18. {{/if}}
  19. {{foreach from=$page.pagelist item=vols}}
  20.     {{if ($vols.page > 0 ) && ($vols.page < = $page.pagecount) }}
  21. {{if $vols.link eq 1}}
  22. <a href="{{$page.baseurl}}&page={{$vols.page}}">[{{$vols.page}}]
  23. {{else}}
  24. [{{$vols.page}}]
  25. {{/if}}
  26. {{/if}}
  27. {{/foreach}}
  28. {{if $page.next eq 1}}
  29. <a href="{{$page.baseurl|default:"?"}}&page={{$page.page+1}}">下一页</a>
  30. {{else}}
  31. 下一页
  32. {{/if}}
  33. {{if $page.last eq 1}}
  34. <a href="{{$page.baseurl|default:"?"}}&page={{$page.pagecount}}">尾页</a>
  35. {{else}}
  36. 尾页
  37. {{/if}}
  38. {{/if}}
  39. </td>
  40. </tr>
  41. </table>
  42. </div>

补充一个demo

  1. #PHP部分
  2. $page = new Page( $page , $this->area_table , $fields = '*' , $where);
  3. $result['rs'] = $page->__getlist();
  4. $result['page'] = $page->__getpagelist();
  5. $smarty->assign("list",$result['rs']);
  6. $smarty->assign("page",$result['page']);
  7. $smarty->display('list.tpl');
  8. #模板里边只要引用这个分页模板即可
  9. {{include file=$smarty.const.Tpl|cat:"/Page.tpl"}}

我的框架依然有人记得

作者 : admin 于 2009年05月05日, 19:59:09
2009
05-5

去年尝试开发了一个框架,开发了一半。或者说第一阶段开发完成。

为了开发这个框架,阅读了大量框架代码,框架思想,然后精心去调试了自己的框架。

在框架完成后,我并没有去使用。

框架的初衷是为了性能跟开发规范,而我在这个框架下兼职无法写代码,无法发挥。自从学写PHP,我从来没受什么规矩约束过,向来是自由度很高。而规则则是多年编程留下的一些经验。后来发现我的风格实在无法用框架来约束,所以放弃使用这个框架,依然按照自己的风格进行开发。

但反思,为什么有很多的框架在项目中应用-那就是规范。不成规矩,不成方圆。尤其在团队合作开发过程中,团队利益就高于个体利益。如果每个人能损失一点个人利益,那团队就可能拥有至高的利益。

因此,我又尝试开发了一套闭源自用的框架。其既集成了框架的一些模块化,规范化的理念,又适合程序员在小范围内自由发挥。后来我又加上了一些管理功能,通用模块系统,现在我可以在这个上边快速开发,又可以很轻松得把模块拆离重组。

内心我并没有把他当作框架,叫做程序“模子”会更好,感谢lamp群友给这么个名字。

蓝芒主机管理系统简析

作者 : admin 于 2009年05月02日, 20:24:01
2009
05-2

最近问了下蓝芒的销售,一套全功能的主机管理系统网络版是5000来块,而且现在可以打8折,也就是4000。

蓝芒的软件可以说是国内拔尖的,论技术,可能仅次于创值立信。这个价格多少对我写自己的主机管理系统有点打击。如果只是为了完善我的主机业务,买一套软件比我写可划算的多,而且他们有现成的售后队伍。

不过我还是网上google了一套破解的系统先看看。

昨天的帖子也说了,我弄了PHP DeZend系统去反解他们代码,很顺利,整套代码跃然呈现出来,最新版。5.0,程序注释都是5.1,估计是最新版。

能反解的,只是他的主控端,集成了业务系统。而被控端是一个windows的被控程序,没有反解,因为我没那个能耐。

下边是我阅读代码后分析的其软件架构:

e8939de88a92

主控端可以看出集成了业务平台,管理平台,代理平台等应用,而被控端可以是windows或者linux等操作系统。

主控端无需考虑操作系统,只需要销售产品,而被控端根据主控端传来的参数执行指令,生成产品。

这里蓝芒设计比较巧妙的,就是对windows和linux的一些相似业务做了规整,作出了通用的控制接口,可无缝去对接w或l的操作系统。

经过考虑,我决定还是购买一套蓝芒的系统,不过,我自己的系统依然准备进行开源开发,重新整合。

PHP DeZend真的很爽

作者 : admin 于 2009年05月02日, 00:19:03
2009
05-2

突然在网上发现一套我渴望已久的IDC管理软件,下载下来,除用vb之类的加密外,其源代码是用zend加密过的PHP代码。大喜,网上找到这个工具,然后迅速反接后,看到所有源代码。开始研究。

PHP DeZend

 Page 2 of 2 « 1  2