精华内容
下载资源
问答
  • 内核版本:7.2语言编码:UTF-8 模板颜色:蓝色欢迎使用《粉多多》帝国CMS企业网站模板源码 UTF-8 国际通用编码主要特色:帝国CMS企业网站模板,帝国CMS整站源码,帝国CMS响应式模板,帝国CMS自适应模板,帝国HTML5...
    内核版本:7.2
    
    语言编码:UTF-8 
    模板颜色:蓝色

    欢迎使用《粉多多》帝国CMS企业网站模板源码  UTF-8 国际通用编码

    主要特色:帝国CMS企业网站模板,帝国CMS整站源码,帝国CMS响应式模板,帝国CMS自适应模板,帝国HTML5模板,帝国cms7.2企业模板,帝国PC模板,帝国CMS手机模板,帝国CMS移动端模板,适应各种手机浏览器,支持微信浏览,已录入采集规则,新闻产品图片可自适应大小

    文件安装说明:

    1、先执行安装: /e/install/ ,默认后台帐号密码和认证码都是admin,登陆后台,系统-备份与恢复数据-恢复数据
    2、后台执行:数据更新-更新数据库缓存-恢复栏目目录-清除临时文件和数据-批量更新动态页面,即可正常访问

    本站所有源码都是经过精心测试,采用帝国CMS7.2最新内核开发的模板,该模板属于企业通用,一款适用性很强的模板,基本可以适合各行业的企业网站,程序上传安装即可使用,附带测试数据;粉多多专业网站制作团队,兼容各种主流浏览器,使用标准的网页布局方式,也就是符合W3C的布局,设计出兼容性非常好的页面!

    网站效果:



    展开全文
  • 国内著名CMS: PHPCMS 整站代码分析讲解 2010-05-11 11:28:00| 分类: 建站 | 标签: |字号大中小 订阅 原贴地址:http://www.phpchina.com/bbs/thread-47107-1-1.html 作者:逆雪寒 从今天开始.我会一有时间...

    国内著名CMS: PHPCMS 整站代码分析讲解  

    2010-05-11 11:28:00|  分类: 建站 |  标签: |字号大中小 订阅

    原贴地址:http://www.phpchina.com/bbs/thread-47107-1-1.html

    作者:逆雪寒

    从今天开始.我会一有时间就对PHPCMS 整站的代码做一个详细的分析.目的很简单.让大家都能在phpchina 里面得到进步.

    谢谢.  代码讲解分析全部是本人.按照本人的知识水平来讲解.如果有说得不对的.请指正.也欢迎指正.大家一起进步.谢谢

    希望大家支持哦  

    首先我对 PHPCMS 的 头程序文件开始讲解 : include/common.inc.php   这个文件是程序启动的核心文件.

    引用:

        <?php

        /**

        代码讲解分析: 逆雪寒. 2007 - 12 - 20

        */

        $mtime = explode(' ', microtime());  

        $phpcms_starttime = $mtime[1] + $mtime[0];

        /**

        计算脚本开始运行的时间。很常见的写法。最后结算还在程序运行的终点位置。讲到了在给各位说。

        */

        unset($LANG, $_REQUEST, $HTTP_ENV_VARS, $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_POST_FILES, $HTTP_COOKIE_VARS);

        /**

        把  $HTTP_ENV_VARS $HTTP_POST_VARS 全局变量设置为 NULL  因为php4.1.0以上默认以 $_POST 来替代。unset后防止程序运行在低版本会出现安全等问题。比如变量注入

        */

        set_magic_quotes_runtime(0);

        //地球人都知道。关了字符窜入库自动转意 比如  my name is on'x     转成  my name is on \'x  为了最大的程序性能所以我们关掉吧~哈哈

        define('IN_PHPCMS', TRUE);

        /**

        程序入口标记。为什么需要这个东西呢。就好比你进一个小区,保安大哥哥肯定要你签字或是挂个鸟牌证明你是从正门进来的。

        防止你fan*qiang进入去偷东西搞破坏。这个入口标记也有这个功能。 在这里定义了一个常量 IN_PHPCMS 为 TRUE ,然后我在其他程序文件里面检查这个标记。如果不存在或不为真,

        那么就基本可以肯定你这个家伙是个小偷来的。 人可能fan*qiang进入。但程序怎么fan*qiang呢。只要在php.ini文件里面激活 allow_url_fopen选项,include() 就可以包含 URL 地址了。你想下如果你有个 放密码的PHP文件。如果给人家include 了以后。你怕不怕。

        */

        define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8)));

        /**

        为了程序产品的跨平台。自动获取程序的安装目录路径 ,定义为 PHPCMS_ROOT 常量。方便以后程序使用。建议大家都这样做哦

        */

        require PHPCMS_ROOT.'/include/global.func.php';  

        /**

        包含 全局函数 global.func.php 文件。里面放了些程序全局都有需要用的函数.大家看到了吧。  常量 PHPCMS_ROOT 已经发挥作用。 这样程序给人家发布到了 二级目录下。也不需要人家手动改整站根目录路径了。

        自己好好理解下。。。。。

        */

        $search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i");

        /**

        ("/ union /i")  这个是]正则的写法?不懂]正则的自己百度找教程来学。 这里不详细说了

        */

        $replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');

        /**

        看这个意思很明了。 union :连接两条SQL语句。 outfile : 主要用来导出数据库资料到其他介质上。

        干啥字要定义这两个变量呢? 在 global.func.php 文件(前面已经加载)里面有个函数 strip_sql() 各位可以看下。

        function strip_sql($string)

        {

        global $search_arr,$replace_arr;

        return is_array($string) ? array_map('strip_sql', $string) : preg_replace($search_arr, $replace_arr, $string);

        }

        函数里面定义了这两个变量为 global全局变量。 那么函数里就可以直接使用了。  先讲解下这个函数吧。 顾名思义这个函数是过滤字符窜里面的SQL语句使得关键的SQL语句单词失效。

        主要过滤那些SQL语句呢。 主要是这几个关键字: union  select  update outfile  or 等。因为这几个SQL字是极度容易在$_GET传输中给截注.

        这个函数写得实在精妙。  is_array 来判断 $string 是否为数组。如果 是  就 array_map() 函数来递归过滤 $string数组里面的每一个单元. 每个单元是一个字符窜吧?

        当递归调用 strip_sql() 以后 is_array()判断 $string 肯定为假了,因为$string已经不是数组而是字符窜。所以 执行 preg_replace()函数。这个函数很好理解了。就是替换了。

        */

        $_POST = strip_sql($_POST);

        $_GET = strip_sql($_GET);

        $_COOKIE = strip_sql($_COOKIE);

        /**

        使用strip_sql()函数来过滤 $_POST  $_GET   $_COOKIE;

        一般不是开源的站。很少过SQL关键字过滤。不过这个也是冒很大风险的。

        */

        unset($search_arr, $replace_arr);

        /**

        unset 使用过但以后不需要的变量。这个是很好的习惯。第一不会浪费内存。如果变量存了大量的数据字节,而后你的程序是一直不需要用的。那么

        就会很浪费内存。拉底程序性能 . 哈哈。真很书面。反正是好习惯我们都要学习的拉。

        */

        $magic_quotes_gpc = get_magic_quotes_gpc(); // get_magic_quotes_gpc()检测gpc是否系统自动转意。 gpc 是什么呢? GET POST COOKIE 来来去去就这几个东西罗。会返回 真或假

        if(!$magic_quotes_gpc)

        {

        $_POST = new_addslashes($_POST);

        $_GET = new_addslashes($_GET);

        }

        /**

        判断一下系统是否打开了自动对gpc进行转意这个选择。如果是的话,就不需要我们自动转意了。如果不是那么还是要老百姓的手段。自己动手丰衣足食。

        来看下也是在global.func.php 文件里面定义的这个函数: 其实是一个封装好的php的 addslashes() 函数的函数。PHP都自己有了为什么还要自己封装成函数呢?

        理由很简单。为了以后的扩展更改容易罗。如果我们一开始就全部用 addslashes() 这个函数来对 ' 进行转意的话。那么以后随着程序的发展。我可能想多过滤个 ^ * ( )之类的

        那如何是好呢?所以为了以后孩子的成长。我们还是最好封起来吧。 记住:以后有可能会边的东西。最好都封装成模块。函数 。类。 这样程序的灵活度就上去了。

        function new_addslashes($string)

        {

        if(!is_array($string)) return addslashes($string);

        foreach($string as $key => $val) $string[$key] = new_addslashes($val);

        return $string;

        }

        这个函数也是写得贼好。也是同时考虑过滤 字符窜或数组,也是使用了 传归。看下就应该明白了吧。这个不用说了。我们要学下这个思路这个方法方式哦。这样才能进步。

        哈哈。我们要懂模仿。

        */

        @extract($_POST, EXTR_OVERWRITE);

        @extract($_GET, EXTR_OVERWRITE);

        /**

        嘿。 extract 前面加个 @鸡蛋做什么呢??抑制错误的。还不懂的话。自己百度了。

        为什么用extract()函数呢.  平时我们程序 是不是要常使用 $_POST  $_GET来获取传递的变量呀。是不是感觉贼麻烦呀。

        比如 $_POST['xx']  这样接受是挺好。但写多了很麻烦是吧。我是感觉麻烦。我现在想直接就 $xx就可以获取传递过来的东西。那怎么办呢。

        就用了 extract()函数来实现这么一个技巧。 这个技巧在discuz 论坛上也有应用。

        */

        unset($_POST, $_GET);

        /**

        unset() 好处不用说了吧。 释放 $_POST $_GET 数组 ,因为已经不需要他们了。

        */

        ?>

        明天放假了.今天在写点罗.放假没空写了.要陪老婆,大家看了有什么不明白的.可以跟帖问.我懂的我会回答.谢谢

    继续::

    2007-12-21

    吃完中午开始分析了点代码.时间不多.

    引用:

        /**

        代码讲解分析: 逆雪寒. 2007 - 12 - 21

        */

        require PHPCMS_ROOT.'/config.inc.php';

        /**

        加栽整站的配置参数文件。一般的程序都会有这个文件。做什么的呢?比如一些数据库连接地址。用户名,密码等。需要用到的参数都定义在这个文件里面。这样以后配置变了。我们只要改动下这个文件里面的

        变量值就好。是不是很方便呢。呵呵.  在这里说下 require() 这个加载函数。 require 和 include 都是用来加载其他PHP文件用的。但他们是有区别的。 require 函数:是"预解释"函数。就是程序一加载,就执行了require函数。而include  呢。是个过程加载函数。我们可以在逻辑里比如: if 里面使用include 来动态的加载其他程序片段。而require 就不行。*/

        require PHPCMS_ROOT.'/languages/'.$CONFIG['language'].'/phpcms.lang.php';

        /**

        顾名思义: 这个就是加载语言包了。PHP的国际化目前做得最多的。就是直接用PHP文件来实现。 在 phpcms.lang.php 文件里面定义程序中要用到的中文信息。然后在程序一开始就加载。那里程序里面

        就可以使用这个文件里面的变量和一切。那么就简单了。模板上就不需要直接写中文信息了。直接用这个文件里面定义的变量等来替换。从而实现国际化。over!!!最好自己打开这个语言文件再加上自己思考下。就知道。原来如此简单。

        */

        define('PHPCMS_PATH', $CONFIG['rootpath']);

        define('PHPCMS_CACHEDIR', $CONFIG['cachedir']);

        /**

        $CONFIG['rootpath']  这个就是全局配置文件 config.inc.php 文件里面数据库信息。等全部配置信息。在这里把他们定义为 常量。 为什么需要定义为常量呢。因为作者感觉这样写爽罗。呵呵。其实因为后面

        用到这两个变量多。所以干脆定义为常量。方便使用。再多说一个技巧: $CONFIG['rootpath']  其实也可以写成  $CONFIG[rootpath]  但是最好不要这样。为什么呢。因为PHP引擎会先判断  rootpath 是不是常量。如果不是才会认定     $CONFIG[rootpath]  是数组。 这样性能上就差了一点点了。 再多说一个技巧: 为什么程序多数都用 '' 单引号呢而不用 "" 双引号呢。因为这样效率好, "" 双引号。

        php引擎还会先检查里面是否有变量,如果有就解释。而 '' 单引号不会做这一步的检查。而直接就当成字符窜了。所以效率上也会有一点点影响哦。

        */

        $CONFIG['enablephplog'] ? set_error_handler('phpcms_error') : error_reporting(E_ERROR | E_WARNING | E_PARSE);

        /**

        $CONFIG['enablephplog']  是否开启错误日志设置。这个设置在全局配置文件里面.config.inc.php 。 这里使用了 三目运算符   偶最喜欢用了。一些简短的逻辑判断。可以使用 ? : ; 来实现比较简洁

        set_error_handler() 这个函数就大有来头了。php4里面的典型自定义程序出错后行为的一个函数。十分好用。怎么用呢? set_error_handler(函数) 的参数也是一个函数。这个函数。反映了程序出错后行为的。

        phpcms_error 函数存在 global.func.php 全局函数里面。

        function phpcms_error($errno, $errmsg, $filename, $linenum, $vars)

        {

        $filename = str_replace(PHPCMS_ROOT, '.', $filename);

            $filename = str_replace("\\", '/', $filename);  //  把win平台的 \\ 换成  /兼容常见系统的路径

            if(!defined('E_STRICT')) define('E_STRICT', 2048);

        $dt = date('Y-m-d H:i:s');

        $errortype = array (  

                E_ERROR           => 'Error',

                E_WARNING         => 'Warning',

                E_PARSE           => 'Parsing Error',

                E_NOTICE          => 'Notice',

                E_CORE_ERROR      => 'Core Error',

                E_CORE_WARNING    => 'Core Warning',

                E_COMPILE_ERROR   => 'Compile Error',

                E_COMPILE_WARNING => 'Compile Warning',

                E_USER_ERROR      => 'User Error',

                E_USER_WARNING    => 'User Warning',

                E_USER_NOTICE     => 'User Notice',

                E_STRICT          => 'Runtime Notice'

                      );

        $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);

        $err = "<errorentry>\n";

        $err .= "\t<datetime>" . $dt . "</datetime>\n";

        $err .= "\t<errornum>" . $errno . "</errornum>\n";

        $err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n";

        $err .= "\t<errormsg>" . $errmsg . "</errormsg>\n";

        $err .= "\t<scriptname>" . $filename . "</scriptname>\n";

        $err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n";

        if (in_array($errno, $user_errors))

        {

            $err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n";

        }

        $err .= "</errorentry>\n\n";

        echo $err;

        error_log($err, 3, PHPCMS_ROOT.'/data/php_error_log.xml');

        chmod(PHPCMS_ROOT.'/data/php_error_log.xml', 0777);

        }

        就是这个鸟蛋。 现在我们慢慢来干掉他。呵呵   这个自定义出错信息函数默认带有四个参数。 第一个参数 $errno 是程序出错的等级。 第二参数是程序出错的界面信息。第三是出现错误的程序文件名。

        第四是 第几行出现错误。第五个参数。要不要都行是当前变量状态的快照.看吧。我们有这些信息后。想定义怎么样的错误信息给客户看都很容易了是吧?但现在我们是要生成错误日志呢?这里phpcms 作者是动态生成一个XML文件来做错误日志的。不错不错.  他使用了 in_array() 函数来实现(因为比较简单,自己理解下) 只记录 E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE 这三个级别的错误日志信息。\n 是文本换行符  \t是制表符. 这里他使用了一个比较漂亮而不常用的函数 wddx_serialize_value () wddx 其实也是一种 xml 。 wddx_serialize_value() 这个函数就是把一般变量以XML格式输出。这样我们就不用自己模拟写xml了。方便吧。呵呵 第一个参数就是: 要格式输出的变量,第二个参数是输出的xml的介绍信息. 下面就是 error_log() 函数。这个函数十分有用了。就是生成错误日志XML文件。不需要我们fopen 了。方便吧。它还有很多功能。详细的看手册。chmod 设置日志文件的权限是 可读可写可执行。  在php5中。我习惯使用 extends Exception 来定义自己的出错信息。所以很少用 set_error_handle(). 如果没开启日志功能。那么 error_reporting(E_ERROR | E_WARNING | E_PARSE) 就运行了。把一般出错信息先出过来。

        */

        if($CONFIG['sessionsavepath']) session_save_path($CONFIG['sessionsavepath']);

        /**

        定义session 的存储路径,session 其实 也是cookie 不过 session 是实现在服务器端的。安全但负载重点。这样做的好处?效率很好。如果你在虚拟主机的话。大家的session cookie 都放在了php.ini里面设置的默认地方。文件夹臃肿就会慢罗。是吧。第二就是安全罗。 记得一定要定义在 session_start()函数之前

        */

        session_start();

        if(function_exists('date_default_timezone_set')) date_default_timezone_set($CONFIG['timezone']);

        /**

        php5开始有时区的概念了。记得就行

        */

        header('Content-type: text/html; charset='.$CONFIG['charset']);

        /**

        设置页面编码.  php编码有: 页面编码。数据库编码。文件内码。如果三码相同就一般不会出现乱码. 文件内码是什么呢?每个文件都有自己的内部编码。一般都用UTF8比较爽。怎么改变文件内码?你用DW也行  UE 也行。随便。 数据库编码那肯定是要指定的了。mysql5开始也有字符集模式这个最好也设置这样可以兼容更多平台。

        页面编码:<meta http-equiv="Content-Type" c />  这句就是。一般的HTML头文件都有。那 还需要header('Content-type: text/html; charset='.$CONFIG['charset']);吗?  其实需要的。因为有些自己写的提示层呀。或是文件里没指定页面编码的。就很容易出现乱码那么我们就防范于未然。 header 一个编码过去。那就OK了。多好。

        */

        if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown'))

        {

        $PHP_IP = getenv('HTTP_CLIENT_IP');

        }

        elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown'))

        {

        $PHP_IP = getenv('HTTP_X_FORWARDED_FOR');

        }

        elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown'))

        {

        $PHP_IP = getenv('REMOTE_ADDR');

        }

        elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown'))

        {

        $PHP_IP = $_SERVER['REMOTE_ADDR'];

        }

        preg_match("/[\d\.]{7,15}/", $PHP_IP, $ipmatches);

        $PHP_IP = $ipmatches[0] ? $ipmatches[0] : 'unknown';

        /**

        函数 getenv() 是获取环境变量。  环境变量: HTTP_CLIENT_IP 是获取客户端的IP 。但有可能人家是通过代理来访问你的程序的呢。那么这时候就要用 环境变量:

        HTTP_X_FORWARDED_FOR  了。 包括  getenv('REMOTE_ADDR')  $_SERVER['REMOTE_ADDR']  都是获取人家  IP的。反正碰罗。碰到那个能获取就大工告成。

        */

        $PHP_TIME = time();

        $PHP_SELF = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : (isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : $_SERVER['ORIG_PATH_INFO']);

        /**

        获取当前运行的脚本名:  刚开始看是不是有点乱呢。 咋没用if else 呢。 看这样的东西。我们最好从右看到左。这样比较好明白点。$_SERVER['SCRIPT_NAME'] $_SERVER['PHP_SELF']  $_SERVER['ORIG_PATH_INFO'] 这三个服务器全局变量都是获取 当前脚本名的。主要看服务器当前环境了。那个存在的就获取那个。

        isset() 函数 十分有用。 测试一个变量是否已经定义。 注: $a= NULL ; isset($a) 这样会返回false的哦。 注意 isset 和empty 两个函数的用法。用得不好会出大问题的。自己看手册。  

        */

        $PHP_QUERYSTRING = $_SERVER['QUERY_STRING'];

        $PHP_DOMAIN = $_SERVER['SERVER_NAME'];

        $PHP_REFERER = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';

        $PHP_SCHEME = $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://'; //测试服务器是否启动了ssl 连接如果是的话。就用https://安全连接来进行通行

        $PHP_PORT = $_SERVER['SERVER_PORT'] == '80' ? '' : ':'.$_SERVER['SERVER_PORT'];

        $PHP_SITEURL = $PHP_SCHEME.$PHP_DOMAIN.$PHP_PORT.PHPCMS_PATH;

        $PHP_URL = $PHP_SCHEME.$PHP_DOMAIN.$PHP_PORT.$PHP_SELF.($PHP_QUERYSTRING ? '?'.$PHP_QUERYSTRING : '');

        /**

        获取当前脚本的URL

        */

        $db_file = $db_class = 'db_'.$CONFIG['database'];

        if(!defined('IN_ADMIN')) //如果不是在后台。 常量 IN_ADMIN 是后台标志

        {

        if($CONFIG['dbiscache']) $db_file .= '_cache';

        if($CONFIG['phpcache'] == '2') // 如果在config.inc.php 里面开启了缓存

        {

          $cachefileid = md5($PHP_SELF.'?'.$PHP_QUERYSTRING); //把脚本名和后面的get信息 md5加密,以此来生成下面的缓存目录和缓存文件

          $cachefiledir = PHPCMS_ROOT.'/data/phpcache/'.substr($cachefileid, 0, 2).'/'; //缓存目录

          $cachefile = $cachefiledir.$cachefileid.'.html'; //缓存文件: xxx.html 格式 

          if(file_exists($cachefile) && ($PHP_TIME < @filemtime($cachefile) + $CONFIG['phpcacheexpires']))

          {   //如果缓存文件存在和缓存没有过期效,那么就返回缓存文件名

           require $cachefile;

           exit;

          }

        }

        if($PHP_QUERYSTRING && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", $PHP_QUERYSTRING, $urlvar)) //获取传递过来的变量。有什么用的呢?请看下面解释

        {

          parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1]));

        }

        }

        /**

        上面这部分相对复杂了点。但没关系。慢慢讲解. 首先缓存只针对前台.所以我们一开始就判断.这个脚本是运行在前台的而不是在后台 !defined('IN_ADMIN') 来判断.

        然后呢.再看客户配置 config.inc.php文件是否开启了缓存. ==2 就是开启了. .接着开始用一系列的规则来找出缓寸的文件名和目录: 以 脚本名:xx.php和后续传递的参数 ?xx=ee&bb=jj 他两的字符窜的MD5 .以这个md5窜来定义出了缓存目录.和缓存文件 .接着再判断这个缓存文件是否存在和是否没过缓存有效期.如果没有就返回这个缓存文件的名字.

        然后到主菜了. 最后一个if逻辑是做什么的呢? 不知道大家有没见过 这样的网址:http://www.beihai.com/dd.php/xx-23/cc-22.html  他们其实都算是伪静态.优化URL用的.咋看起来还很象静态.爽. 但你可能想.这样的地址.我们写PHP程序的.怎么获取get 变量呢?  最后if 就是解答这个问题的. 先剥离url来获取  传递的字符窜.然后 str_replace 来把 '/'  '-'  替换成标准的  '&' '='  好象:  http://www.beihai.com/dd.php&xx=23&cc=22  看这样你应该看明白了吧.然后用 parse_str() 函数来把xx 变 $xx=23   cc 变 $cc=22    php真是什么都给你想到了.强.看明白了吧.OK.过了.

        */

    继续

    require PHPCMS_ROOT.'/include/'.$db_file.'.class.php'; // 包含数据库操作类,下章详说

    require PHPCMS_ROOT.'/include/tag.func.php';  //遇到再说

    require PHPCMS_ROOT.'/include/extension.inc.php'; //遇到再说

    $db = new $db_class;   // 实例化数据库类

    $db->connect($CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['dbname'], $CONFIG['pconnect']); //连接数据库@_@

    $db->iscache = $CONFIG['dbiscache']; //是否开启SQL缓存

    $db->expires = $CONFIG['dbexpires']; //缓存时间

    if(!cache_read('table.php'))

    {

    require_once PHPCMS_ROOT.'/include/cache.func.php';

        cache_all(); //生成所有缓存

    }

    /**

    cache_read() 函数 读缓存文件函数存在 global.func.php 里面.上菜先:

    function cache_read($file, $mode = 'i')

    {

    $cachefile = PHPCMS_CACHEDIR.$file;

    if(!file_exists($cachefile)) return array();

    return $mode == 'i' ? include $cachefile : file_get_contents($cachefile);

    }

    就这么简单.文本缓存,在一些大的开源的PHP项目中经常见到.主要是为了减轻数据库的负荷的. 比如在程序启动文件里面,就把一些后台配置的常用信息缓存到php文件里面.然后在以后的程序就可以直接使用而不用每次都访问数据库了.但对经常要更新的信息.最好不要用文本缓存这形式,因为PHP文件内置的文件锁flock()不是很好用.大系统中多用户同时写访问的时候有可能会把缓存文件破坏.大系统建议使用 memcached  mysql5.1 分区  mysql 主从 来实现负载均衡 @=@ 废话太多了. 这个函数很简单.自己看下就明白了.如果缓存和模式变量 $mode 是否为 i 是就include 不是就 把文件以字符窜形式读到内存中.

    如果 cache_read()找不到缓存文件'table.php'就会返回false,那么就 加栽 cache.func.php  文件.它里面是些创建缓存的一些函数. 然后呢执行 cache_all()函数生成所有的常用信息缓存.

    关于phpcms 的缓存更详细包括生成原理.打算在弄完启动文件common.inc.php 后再开篇写个详细的.  

    */

    $CACHE = cache_read('common.php');

    /**

    加载 common.php 缓存文件里面的变量(数据) 这样我们不用从数据库读了每次.是吧

    common.php 文件里面是什么来的呢?上菜:

    <?php

    return array (

      'module' =>

      array (

        'phpcms' =>

        array (

          'module' => 'phpcms',

          'name' => 'phpcms',

          'iscore' => '1',

          'iscopy' => '0',

          'isshare' => '0',

          'moduledir' => '',

          'linkurl' => '',

        ),

        'member' =>

        array (

          'module' => 'member',

          'name' => '会员',

          'iscore' => '1',

          'iscopy' => '0',

          'isshare' => '0',

          'moduledir' => 'member',

          'linkurl' => '/phpcms/member/',

        ),

        'article' =>

        array (

          'module' => 'article',

          'name' => '文章',

          'iscore' => '0',

          'iscopy' => '1',

          'isshare' => '0',

          'moduledir' => 'article',

          'linkurl' => '',

        )

    ?>

    看到了吧.这个就是全部从数据库里面生成的文本缓存信息.我们不用每次都连接数据库读数据库.而只要访问里面的数组就可以得到一些配置信息.

    这个就是文本缓存的作用了,至于怎么会生成这个文本缓存文件的.我会另外开一篇来介绍。

    */

    $MODULE = $CACHE['module']; //缓存中的数据

    $CHANNEL = $CACHE['channel'];

    $PHPCMS = $CACHE['phpcms'];

    $FIELD = $CACHE['field'];

    unset($CACHE, $ipmatches, $CONFIG['timezone'], $CONFIG['cachedir'], $CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['pconnect'], $CONFIG['dbiscache'], $CONFIG['dbexpires']);

    /

    **

    unset 掉不需要用的变量.

    */

    if($PHPCMS['enablebanip'] && ip_banned($PHP_IP)) showmessage($LANG['administrator_banned_this_IP']);

    /**

    $PHPCMS['enablebanip']  是什么.不用说应该知道了吧.这个就是后台里面设置是否开启过滤IP访问的功能.(因为我没用过phpcms,我是按照代码猜的,不对的请指出)从这里就看出了文本缓存也有他的作用的。 ip_banned()函数是什么呢.上菜再说:

    function ip_banned($ip)

    {

    global $PHP_TIME; //前面定义过的.当前的时间

    $ipbanneds = cache_read('banip.php');

    if(!is_array($ipbanneds)) return FALSE;

    foreach($ipbanneds as $v)

    {

      if($v['overtime'] < $PHP_TIME) return FALSE;

      if($ip == $v['ip'] || preg_match("/^".str_replace('.', '[.]', $v['ip'])."$/", $ip)) return TRUE;

    }

    }

    里面也用到了 cache_read() 这个函数,还是读banip.php 这个文件.banip.php这个文件里面存着你在后台甚至的要过滤的IP列表.

    里面的逻辑比较简单.自己消化下了.不明白跟帖问

    showmessage() 函数是提示出错信息封装好的一个函数. 国家化的 $LANG['administrator_banned_this_IP']这个看到了吧.这个就是读语言包里面的.这样我们就可以出好多个语言版本的程序拉.

    */

    $TEMP = $MOD = $CHA = $CATEGORY = $CAT = array();

    $ftp = $enableftp = $tags = $html = 0;

    /**

    初始化变量.这个是好习惯我们要模仿.

    */

    if(!isset($mod))

    {

    $mod = 'phpcms'; //phpcms 是默认加载的模块

    }

    elseif($mod != 'phpcms')

    {

    isset($MODULE[$mod]) or exit($LANG['module_not_exists']); // 从缓存中读加载的模块是否开启

    /**

    这个写法,我十分喜欢,平时也用.   xx && dd ; xx and dd  ;与运算要同时两边都为真整个公式才为真,就是利用这个原理. ; xx || dd ; xx or dd  或运算只要一个条件满足就不会执行下一个条件而继续执行下去. 这样写是不是很酷.  

    */

    $MOD = cache_read($mod.'_setting.php'); //开始加载这个模块的一些常用配置数值。 phpcms 对应的每个模块都有一个缓存配置文件。@@ 怪不得速度那么快

    @include PHPCMS_ROOT.'/languages/'.(defined('IN_ADMIN') ? $CONFIG['adminlanguage'].'/'.$mod.'_admin.lang.php' : $CONFIG['language'].'/'.$mod.'.lang.php');

    /**

    加载想对应的模块语言包.

    */

    }

    if(!isset($forward)) $forward = $PHP_REFERER; //记录前一个URL地址。估计以后下面程序有需要用这个变量

    $dosubmit = isset($dosubmit) ? 1 : 0; //记录是否有表单提交过.也是以后有用

    $channelid = isset($channelid) ? intval($channelid) : 0; //记录当前频道的id  如果$channelid 没有 isset 那么就为 0. intval() 十分有用。数字和数字的比较加减速度会快很多。记得哦

    $skindir = PHPCMS_PATH.'templates/'.$CONFIG['defaulttemplate'].'/skins/'.$CONFIG['defaultskin']; //加载默认phpcms皮肤

    if($PHPCMS['enablegzip'] && function_exists('ob_gzhandler'))

    {

    ($CONFIG['phpcache'] || defined('SHOWJS')) ? ob_start() : ob_start('ob_gzhandler');

    }

    else

    {

    $PHPCMS['enablegzip'] = 0;

    ob_start();

    }

    /**

    $PHPCMS['enablegzip']   这个变量就是存在于 phpcms_setting.php 文件里。上面已经说过了。每个模块都有相对应的模块配置缓存文件(是从数据库copy过来的信息) 这个变量标致 是否开启 压缩传输。

    压缩传输,听名字就知道。就是把数据按照一定的算法压缩小罗。然后再传送到客户端。这样就可以在有限的带宽中传输更大的数据拉。当然速度快了不少。压缩的数据到了你的浏览器,它就自动解压缩,老版本的一些浏览器不支持解压缩哦。不过现在还有谁用很久的浏览器呢。用法很简单的:看上面就知道:

    首先判断下,看客户老大们是否在后台选择了这个模块的压缩传输(如果是的话。自然的已经加载到了相对应的文本缓存文件里面拉) 标致:$PHPCMS['enablegzip']  和 判断 回调函数 ob_gzhandler 是否开启,  ob_gzhandler 其实不算是个函数。看手册说明。 就这么简单。它只是一个专门给 ob_start() 做回调使用的一个参数函数。详细请看下手册。别偷懒哦,在程序开头ob_start('ob_gzhandler')就算是开始压缩传输了;判断完了 如果为真。就继续下面的代码:

    ($CONFIG['phpcache'] || defined('SHOWJS')) ? ob_start() : ob_start('ob_gzhandler');

    看代码phpcms 是这样的: 如果用户在后台开启了压缩传输。而用户又开启了 页面缓存。那么就默认不使用压缩传输了。我也不知道为什么这样设计。我测试了下。后台开启压缩传输。又同时又使用页面缓存。没发现有什么问题。@@

    如果没开启压缩传输,那么我们就ob_start(); 使用session 之前必须要 ob_start() ; 而且在ob_start() 之前不能有任何的 头文件发送和输出。比如:echo header等要不会出错的哦。

    */

    $_userid = 0;

    $_username = '';

    $_groupid = 3;

    $_arrgroupid = array();

    $phpcms_auth = getcookie('auth');

    /**

    $_userid,$_username,$_groupid  这几个记录用户信息的变量初始化,不初始化危险就太大了。@@ 如果给人家$_GET一个 _userid 变量过来。那么就会把我们这个变量覆盖。但是我们如果给这几个变量一个值,

    那么按照就近原则。就算你GET个变量过来。你也一样改不了我原来的变量值。大家好好自己想下。就会明白了。

    getcookie() 这个自定义函数在 global.func.php文件里定义的。上菜:

    function getcookie($var)

    {

    global $CONFIG;

    $var = $CONFIG['cookiepre'].$var;

    return isset($_COOKIE[$var]) ? $_COOKIE[$var] : FALSE;

    }

    这个函数用来提取我们设置的cookie 值. $CONFIG['cookiepre']  在 config.inc.php 文件里面设置,cookie 名的前缀.  函数很简单。一看就明白不说了。

    */

    if($phpcms_auth)

    {

    $phpcms_auth_key = md5($PHPCMS['authkey'].$_SERVER['HTTP_USER_AGENT']);

    list($_userid, $_password, $_answer) = $phpcms_auth ? explode("\t", phpcms_auth($phpcms_auth, 'DECODE')) : array(0, '', '');

    /**

      list() = array(); 用户大家自己试下。 意会下

      phpcms_auth()  是加密和解密 函数,  因为cookie 是存在于客户端。十分危险呀。 你看连用户的密码也存在cookie 不加密能行吗。但是呢加密后又要能解密。因为用户名和用户密码我们往下操作要

      获取的。 这个函数存在于 global.func.php 文件里面。大家想了解这个算法的自己去看下吧。挺简单的。 其实就是围绕着  $phpcms_auth_key  这个变量来加密解密和discuz 的cookie 机制差不。

      $phpcms_auth_key = md5($PHPCMS['authkey'].$_SERVER['HTTP_USER_AGENT']);  看$PHPCMS['authkey'], 估计后台有个 cookie 加密值让你填,然后以这个值和 $_SERVER['HTTP_USER_AGENT'](系统信息)

    */

    $_userid = intval($_userid);

    if($_userid < 0) $_userid = 0; //读出的cookie 的用户id 如果是 小于0

    if($_userid) //如果 cookie 保存的这个uid 存在,那么开始按照这个ID来查数据库用户表 来取出用户信息

    {

      $memberinfo = $db->get_one("SELECT username,password,groupid,arrgroupid,email,chargetype,begindate,enddate,money,point,credit,newmessages FROM ".TABLE_MEMBER." WHERE userid=$_userid LIMIT 0,1");

      /**

      phpcms 封装好的数据库类,下篇开讲这个大家就大概看行了。  大家看下 select  sql语句。 也可以学习下。 首先最好不要使用 select * from xx  的 * 形式,除非你想获取所有字段的记录。只罗列你要的字段。这样在数据量大的查询中。速度明显上去。    常量: TABLE_MEMBER  定义了表名。这样做有什么好处呢?想都知道了,为了以后变更表名方便而定义为常量。这个东西那里来的。估计在一个文件里面定义好的。遇到了再讲吧懒得找了。

      */

      if($memberinfo && $memberinfo['password'] == $_password)  //用查询出来的密码和 cookie 中存在的密码想对比.为了在效率: 在比较前 先判断查询是否成功先。很多phper往往忽略。

      {

       if($memberinfo['groupid'] == 2)  //如果用户属于的组的ID 为 2  那么这个用户是被管理员禁止访问的了。

       {

                    mkcookie('auth', ''); // 清除cookie

        showmessage($LANG['userid_banned_by_administrator']); //提示出错菜单

       }

       @extract($memberinfo, EXTR_PREFIX_ALL, ''); //又来这招,应该明白了吧各位老大:把字段 变成 我们能直接使用的变量

       unset($memberinfo, $_password, $_answer);

       $_arrgroupid = $_arrgroupid ? array_filter(explode(',', $_arrgroupid)) : array();  //把 字段为 arrgroupid  值为 FALSE 过滤掉。array_filter()不带回调参数的用法,请看手册。

      }

      else

      {

       mkcookie('auth', '');

      }

      /**

    经过上面的读cookie 和查数据库用户信息后。当确定这个用户信息是合法以后。就会自动登陆了。比如phpchina论坛。当你登陆后没注销。下次访问的时候还是登陆状态。就是这个原理。记得模仿哦

      这里详细解释下 mkcookie ()函数  上菜:

      function mkcookie($var, $value = '', $time = 0)

      {

       global $CONFIG,$PHP_TIME;

       $time = $time > 0 ? $time : (empty($value) ? $PHP_TIME - 3600 : 0);

       $s = $_SERVER['SERVER_PORT'] == '443' ? 1 : 0;

       $var = $CONFIG['cookiepre'].$var;

       return setcookie($var, $value, $time, $CONFIG['cookiepath'], $CONFIG['cookiedomain'], $s);

      }

      $time  为 cookie 的存活时间:  如果为 0  就是关闭浏览器 cookie 就自动失效 ,  $PHP_TIME 在前面定义了:当前时间。   $PHP_TIME -3600  减去3600秒。就是一个小时前的意思,那肯定是设置cookie 失效的意思了。

      $s  变量是 获取 是否开启SSL安全传输的标致。 cookie 有一个参数是ssl传输的。如果服务器已经opensll 了那么我们肯定不能浪费这么好的安全资源了。

      $var cookie名的前缀,主要防止混淆。

      $CONFIG['cookiedomain']  这个家伙在 config.inc.php里面已经配置的了。定义为: '/'   意思就是说 在当前域 的所有目录的PHP程序都能访问这个COOKIE ,还有限制目录访问COOKIE 的弄法。具体请看 setcookie () 函数手册上说明。

      */

     

    }

    }

    unset($db_class, $db_file, $phpcms_auth, $phpcms_auth_key, $memberinfo);

    恩继续 帖.  

    这个讲  phpcms 的数据库类  和  phpcms 的文本缓存的实现.看了看

    都是很简单的东西.大家看着我注释慢慢看吧.慢慢理解,最好能装了PHPCMS 在来看.因为这样可以看下它的数据库结构信息.可以帮助理解.

    不明白的继续问吧.

    首先是数据库类,phpcms 的数据库 分mysql 和mssql 版本.  MSSQL 版本的我就不说了.  他们主要的sql 语句不同点就在于我们分页常用到的 limit  语句.所以.在 mssql 数据库类驱动里.他做了个挺好的封装.让mysql 和MSSQL在SQL语句方面的差异性就很小了.可以说PHPCMS你可以随便转换数据库只要在代码中换下数据库类驱动就行.

    引用:

        <?php

        /**

        mysql数据库类。写得比较简单。也没什么好说的。大家自己看下理解下。

        然后就可以跳过了。

        */

        defined('IN_PHPCMS') or exit('Access Denied');

        /**

        这个东西是不是很熟呀。对了。在上一章已经讲过了。也已经在上一章的common.inc.php 启动文件里面定义了  IN_PHPCMS   所以在以下的PHP文件里都检测下是否是人为”跳墙“进来的。是就中断

        */

        /**

        * mysql 数据库类,支持Cache功能

        */

        class db_mysql

        {

        /**

        * mysql 连接标识

        * @var resource

        */

        var $connid;

        /**

        * 整型变量用来计算被执行的sql语句数量

        * @var int

        */

        var $querynum = 0;

        /**

        * 数据库连接,返回数据库连接标识符

        * @param string 数据库服务器主机

        * @param string 数据库服务器帐号

        * @param string 数据库服务器密码

        * @param string 数据库名

        * @param bool 是否保持持续连接,1为持续连接,0为非持续连接

        * @return link_identifier

        */

        function connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0)

        {

          global $CONFIG;

          $func = $pconnect == 1 ? 'mysql_pconnect' : 'mysql_connect';

          /**

          mysql_pconnect()  为常连接。它和mysql_connect 的区别是 前者在多进程的WEB服务器上效率比较好。但也有瑕疵就是在有关事务和数据表锁方面。详情请查看自己的手册。

          */

          if(!$this->connid = @$func($dbhost, $dbuser, $dbpw))

          {

           $this->halt('Can not connect to mysql server');

          }

          // 当mysql版本为4.1以上时,启用数据库字符集设置

          if($this->version() > '4.1' && $CONFIG['dbcharset'])

                {

           mysql_query("SET NAMES '".$CONFIG['dbcharset']."'" , $this->connid);

          }

          // 当mysql版本为5.0以上时,设置sql mode,mysql5数据库带了字符集模式。设置下就好

          if($this->version() > '5.0')

          {

           mysql_query("SET sql_mode=''" , $this->connid);

          }

          if($dbname)

          {

           if([email=!@mysql_select_db($dbname]!@mysql_select_db($dbname[/email] , $this->connid))

           {

            $this->halt('Cannot use database '.$dbname);

           }

          }

          return $this->connid;

        }

        /**

        * 选择数据库

        * @param string 数据库名

        */

        function select_db($dbname)

        {

          return mysql_select_db($dbname , $this->connid);

        }

        /**

        * 执行sql语句

        * @param string sql语句

        * @param string 默认为空,可选值为 CACHE UNBUFFERED

        * @param int Cache以秒为单位的生命周期

        * @return resource

        */

        function query($sql , $type = '' , $expires = 3600, $dbname = '')

        {

          $func = $type == 'UNBUFFERED' ? 'mysql_unbuffered_query' : 'mysql_query';

          /**

          mysql_unbuffered_query 效率更好。节省内存 看手册

          */

          if(!($query = $func($sql , $this->connid)) && $type != 'SILENT')

          {

           $this->halt('mysql Query Error', $sql);

          }

          $this->querynum++;

          return $query;

        }

        /**

        * 执行sql语句,只得到一条记录

        * @param string sql语句

        * @param string 默认为空,可选值为 CACHE UNBUFFERED

        * @param int Cache以秒为单位的生命周期

        * @return array

        */

        function get_one($sql, $type = '', $expires = 3600, $dbname = '')

        {

          $query = $this->query($sql, $type, $expires, $dbname);

          $rs = $this->fetch_array($query);

          $this->free_result($query);

          return $rs ;

        }

        /**

        * 从结果集中取得一行作为关联数组

        * @param resource 数据库查询结果资源

        * @param string 定义返回类型

        * @return array

        */

        function fetch_array($query, $result_type = mysql_ASSOC)

        {

          return mysql_fetch_array($query, $result_type);

        }

        /**

        * 取得前一次 mysql 操作所影响的记录行数

        * @return int

        */

        function affected_rows()

        {

          return mysql_affected_rows($this->connid);

        }

        /**

        * 取得结果集中行的数目

        * @return int

        */

        function num_rows($query)

        {

          return mysql_num_rows($query);

        }

        /**

        * 返回结果集中字段的数目

        * @return int

        */

        function num_fields($query)

        {

          return mysql_num_fields($query);

        }

            /**

        * @return array

        */

        function result($query, $row)

        {

          return @mysql_result($query, $row);

        }

        function free_result($query)

        {

          return mysql_free_result($query);

        }

        /**

        * 取得上一步 INSERT 操作产生的 ID

        * @return int

        */

        function insert_id()

        {

          return mysql_insert_id($this->connid);

        }

            /**

        * @return array

        */

        function fetch_row($query)

        {

          return mysql_fetch_row($query);

        }

            /**

        * @return string

        */

        function version()

        {

          return mysql_get_server_info($this->connid);

        }

        function close()

        {

          return mysql_close($this->connid);

        }

            /**

        * @return string

        */

        function error()

        {

          return @mysql_error($this->connid);

        }

            /**

        * @return int

        */

        function errno()

        {

          return intval(@mysql_errno($this->connid)) ;

        }

        /**

        mysql_errno()  函数也挺好使的哦。自己试下

        */

            /**

        * 显示mysql错误信息

        */

        function halt($message = '', $sql = '')

        {

          exit("mysql Query:$sql <br> mysql Error:".$this->error()." <br> mysql Errno:".$this->errno()." <br> Message:$message");

        }

        }

        ?>

    PHPCMS的文本缓存实现:

    引用:

        <?php

        defined('IN_PHPCMS') or exit('Access Denied');

        /**

        这个文件里面全是有关生成文本缓存的函数。文本缓存是个好东西。一般的项目,我们用不着内存缓存 : memcached  ,文本搞定。

        原理是这样的: 我们在后台是不是可以设置很多有关网站的参数。而这些参数很多都是固定的。就不变化的。都存到咱的数据库上。而我们程序那里呢

        每次都要访问数据库读出参数来进行我们程序中的操作。首先数据库查询是个很耗硬盘IO资源的一个东西,所以文本缓存刚好能减轻数据库那边的承重。

        我们在程序开始就把数据库里面的配置都转化为数组 等  放到  php文件里面。这样我们可以直接访问php文件而不用每次都访问数据库了。  php文本缓存其实成了

        我们程序和数据库的一个中间件。 所以我们自己写自己的文本缓存的时候其实要实现的很简单:  读数据库  ->  写到PHP文件 ->  程序中include

        来吧。开始文本缓存学习

        */

        function cache_all()  //生成所有缓存的总操作函数

        {

        cache_table(); //生成所有的数据库表名,表名是根据数据库里面当前的表明而生成。请看这个函数的详细分析

        require_once PHPCMS_CACHEDIR.'table.php'; //包含表常量

        cache_common();

        cache_member_group();

        $modules = cache_module();

        $channelids = cache_channel(0);

        $keyids = array_merge($modules, $channelids);

        foreach($keyids as $keyid)

        {

          $catids = cache_categorys($keyid);

          if(is_array($catids))

          {

           foreach($catids as $catid)

           {

            cache_category($catid);

           }

          }

        }

        cache_type(0);

        return TRUE;

        }

        function cache_common()

        {

        global $db;

        $query = $db->query("SELECT module,name,iscore,iscopy,isshare,moduledir,moduledomain FROM ".TABLE_MODULE." WHERE disabled=0"); //查询所有能用的模块

        while($r = $db->fetch_array($query))

        {

          $r['linkurl'] = '';

          if($r['module'] != 'phpcms' && $r['iscopy'] == 0) $r['linkurl'] = linkurl($r['moduledomain'] ? dir_path($r['moduledomain']) : $r['moduledir'].'/');

          //如果模块存在目录的就取它目录地址

          unset($r['moduledomain']);

          $key = $r['module'];

          $data[$key] = $r;

        }

        $CACHE['module'] = $data; //存到缓存数组,等一下一起把 $CACHE 数组写到文本里去

        $data = array();

        $query = $db->query("SELECT channelid,module,channelname,channeldir,channeldomain,channelpic,introduce,style,islink,linkurl,cat_html_urlruleid,item_html_urlruleid,special_html_urlruleid,cat_php_urlruleid,item_php_urlruleid,special_php_urlruleid FROM ".TABLE_CHANNEL." WHERE disabled=0 ORDER by listorder"); //罗列能用的频道列表

        while($r = $db->fetch_array($query))

        {

          $r['linkurl'] = linkurl($r['linkurl']);

          $key = $r['channelid'];

          $data[$key] = $r;

        }

        $CACHE['channel'] = $data; //存到缓存数组

        $data = array();

            $r = $db->get_one("SELECT setting FROM ".TABLE_MODULE." WHERE module='phpcms'");

        $CACHE['phpcms'] = unserialize($r['setting']);

        //查询 phpcms这个模块的设置信息,大家可以看下数据库这个表内容。setting 字段里面的信息是经过serialize 函数窜行化的。

        //所以取出的内容要unserialize 反窜行.我是挺喜欢使用serialize 函数的。他可以实现把一个数组存到数据库或把一个对象存到数据库。或是拿来GET传递都行。

        //太强了。大家可以试用下。可能你项目某个地方需要用到哦。

        $fields = array();

        $result = $db->query("SELECT * FROM ".TABLE_FIELD." ORDER BY fieldid"); //下栽模块的信息,请自己看下这个表的数据就明白

            while($r = $db->fetch_array($result))

        {

          $tablename = $r['tablename'];

          $fields[$tablename] .= ','.$r['name'];

        }

        $CACHE['field'] = $fields;

        cache_write('common.php', $CACHE); //开始把$CACHE 数组写到 common.php 这个文本缓存里。大家可以自己去打开这个文件看下内容。一切了然

            return $CACHE;

        }

        function cache_update($action='')//更新文本缓存。最好在后台操作使用。因为PHP的文件flock 文件锁在某些平台使用不是很好。会出现多用户同写一个文件从而破坏缓存文件

        {

        global $db;

        $data=array();

        switch($action)

        {

          case 'keylink';

           $query=$db->query("SELECT linktext,linkurl FROM ".TABLE_KEYLINK." where passed=1");

           while($r=$db->fetch_array($query)){

              $data[]=$r;

           }

          break;

          case 'reword';

           $query = $db->query("SELECT word,replacement FROM ".TABLE_REWORD." where passed=1");

           while($r = $db->fetch_array($query))

           {

            $data[]=$r;

           }

          break;

          default:

           $actions = array('keylink','reword');

           array_map('cache_update', $actions);

           return TRUE;

        }

        cache_write('cache_'.$action.'.php', $data);

        return $data;

        }

        function cache_table()

        {

        global $db,$CONFIG;

        $query = $db->query("SHOW TABLES FROM `".$CONFIG['dbname']."`");

        /**

        显示数据库里面的所有表名

        */

        while($r = $db->fetch_row($query))

        {

          $table = $r[0];

          if(preg_match("/^".$CONFIG['tablepre']."/i", $table)) //寻找表前缀等于 $CONFIG['tablepre'] (在config.inc.php里设置) @@表前缀还有这个作用 嘿嘿

          {

           $tablename = str_replace($CONFIG['tablepre'], 'table_', $table);

           $data[$tablename] = $table;    //  $data['table_xx'] = xx; 形式   只能意会下了

          }

        }

        $db->free_result($query);  //$db->free_result()  这个类方法其实是掉用了函数:mysql_free_result() 函数 主要是为了清除数据库大的查询而占用的内存。还是有必要的哦

        if(!is_dir(PHPCMS_CACHEDIR)) // 常量 PHPCMS_CACHEDIR 在 common.inc.php 里面定义的。大家不记得了去看看吧。是存放phpcms 缓存目录的路径,这里意思是:如果缓存目录不存在

        {

          dir_create(PHPCMS_CACHEDIR); //如果缓存目录不存在那么就创建

          dir_create($CONFIG['templatescachedir']); //创建编译后的PHP模板目录,有关phpcms模板引擎编写。在下一章合适就开讲

          /**

          dir_create() 函数为创建 目录函数。PHPCMS自己封装的,刚看了下。phpcms 挺强。这个函数还可以通过ftp 来创建目录。这样就可以解决一些 开启了安全模式下的服务器对于创建目录等出现的问题

          因为涉及到PHP FTP 知识。所以打算讲解到下面再说。

          */

        }

        cache_write('table.php', $data , 'constant'); //很多朋友说找不到phpcms 表常量在那里定义的。就是在这里。

        /**

        cache_write() 函数在global.func.php里面定义的。是把 已经从数据库取出来的数组信息写到 PHP文本上去。@@文本缓存关键的一步  废话少说上菜:

          function cache_write($file, $string, $type = 'array')

          {

           if(is_array($string)) //检测 $string 内容是字符窜的呢还是数组的,是数组的那就继续 ..

           {

            $type = strtolower($type);  

            if($type == 'array')//然后再判断这个函数的模式标致 ,是否为数组模式,默认为数组模式

            {

             $string = "<?php\n return ".var_export($string,TRUE).";\n?>";

             //这个太关键了。因为我们把数据库的信息写到文本上去的时候。是以符合PHP语法的格式写进去的。为什么呢?@@ 十分废话,因为如果不是以PHP格式写到文件里面去

             那么这个PHP文件怎么能给我们include 进程序运行调用呢? 呵呵。 知道这一点就真的明白文本缓存的实现了。忒简单。 这里使用了个小技巧:使用了 var_export() 函数

             这个函数会返回一个变量的字符窜形式。这个函数太有帮助了。如果没有这个函数,我们还要自己想办法实现呢。自己写一次文本缓存就明白了。会碰到这个问题的。 '\n' 这个是

             文本文件的换行。初学者 别把<br> 和 '\n' 搞混罗。 一个是html 的 一个是文本文件的

            }

            elseif($type == 'constant') //以内容形式

            {

             $data='';

             foreach($string as $key => $value) $data .= "define('".strtoupper($key)."','".addslashes($value)."');\n";

             $string = "<?php\n".$data."\n?>";

             如果以内容形式的话。就不是写数组到文本里面了。而是把内容都定义成常量。

            }

           }

           $strlen = file_put_contents(PHPCMS_CACHEDIR.$file, $string);//file_put_contents()函数 是PHP5才支持的 效率最好。建议使用

           chmod(PHPCMS_CACHEDIR.$file, 0777); 设置目录 为可读可写可执行

           return $strlen; //返回写到文本的字节数

          }

          

          再说多一个读 缓存文件的操作函数  :上菜

          function cache_read($file, $mode = 'i')

           {

            $cachefile = PHPCMS_CACHEDIR.$file;

            if(!file_exists($cachefile)) return array();

            return $mode == 'i' ? include $cachefile : file_get_contents($cachefile);

           }

           读缓存其实就是 include php缓存文件。 讲完走人

        */

        return $data;

        }

        /**

        phpcms 的所有数据库表名 都用根据数据库当前的表名来用常量来进行定义。我认为这样设计不是很好。不够灵活:比如如果我们更改数据库的一个表名的话。

        那么会出现找不到表的错误信息。而且想要修复还很麻烦。就是说不能随便更改表名了。不推荐大家这样写。我们可以把表名都定义在一个PHP文件里面。这样我们以后

        要改某个表名,就很方便了。

        */

        function cache_module($module = '')

        {

        global $db;

        if($module)

        {

          $r = $db->get_one("SELECT setting,module,name,iscopy,moduledir,moduledomain FROM ".TABLE_MODULE." WHERE module='$module'"); //模块具体信息

          if($r['setting'])

          {

           $setting = unserialize($r['setting']); //讲过了反窜行。因为里面信息是窜行化后再存到数据库的

          }

          $setting['name'] = $r['name'];

          $setting['moduledir'] = $r['moduledir'];

          $setting['moduledomain'] = $r['moduledomain'];

          $setting['linkurl'] = '';

          if($r['module'] != 'phpcms' && $r['iscopy'] == 0)

          {

           $setting['linkurl'] = linkurl($r['moduledomain'] ? dir_path($r['moduledomain']) : $r['moduledir'].'/');

                    cache_categorys($module);

          }

          unset($r['moduledomain']);

          cache_write($module.'_setting.php', $setting);

          return $setting;

        }

        else

        {

          $query = $db->query("SELECT module FROM ".TABLE_MODULE." WHERE disabled=0 ORDER by moduleid");

          while($r = $db->fetch_array($query))

          {

           cache_module($r['module']);

           $modules[] = $r['module'];

                }

          return $modules;

        }

        }

        function cache_channel($channelid=0)

        {

        global $db;

        if($channelid)

        {

          $data = $db->get_one("SELECT * FROM ".TABLE_CHANNEL." WHERE channelid=$channelid");

          if($data && !$data['islink'])

          {

           if($data['setting'])

           {

                  $setting = unserialize($data['setting']);

            unset($data['setting']);

            $data = is_array($setting) ? array_merge($data, $setting) : $data;

           }

           $data['linkurl'] = linkurl($data['linkurl']);

           cache_write('channel_'.$channelid.'.php', $data);

           cache_categorys($channelid);

           return $data;

          }

            }

        else

        {

          $query = $db->query("SELECT channelid FROM ".TABLE_CHANNEL." WHERE islink=0 AND disabled=0 ORDER by channelid");

          while($r = $db->fetch_array($query))

          {

           cache_channel($r['channelid']);

           $channelids[] = $r['channelid'];

          }

          return $channelids;

        }

        }

        function cache_categorys($keyid)

        {

        global $db,$PHPCMS,$CHANNEL;

        $urlpre = '';

        if(is_numeric($keyid))

        {

          $keyid = intval($keyid);

          $module = $CHANNEL[$keyid]['module'];

                $sql = " channelid=$keyid ";

        }

        else

        {

                $sql = " module='$keyid' ";

        }

    引用:

        $catids = $data = array();

            $query = $db->query("SELECT module,channelid,catid,catname,style,introduce,catpic,islink,catdir,linkurl,parentid,arrparentid,parentdir,child,arrchildid,items,itemordertype,itemtarget,ismenu,islist,ishtml,htmldir,prefix,urlruleid,item_prefix,item_html_urlruleid,item_php_urlruleid FROM ".TABLE_CATEGORY." WHERE $sql ORDER by listorder,catid");

            while($r = $db->fetch_array($query))

        {

          $r['linkurl'] = str_replace($PHPCMS['index'].'.'.$PHPCMS['fileext'], '', $r['linkurl']);

             $r['linkurl'] = $urlpre ? preg_replace("|^".$urlpre."|", '', $r['linkurl']) : linkurl($r['linkurl']);

          $catid = $r['catid'];

                $data[$catid] = $r;

          $catids[] = $catid;

            }

        if($data) cache_write('categorys_'.$keyid.'.php', $data); //写缓存罗。

        return $catids;

        }

        function cache_category($catid)

        {

        global $db,$PHPCMS;

        if(!$catid) return FALSE;

            $data = $db->get_one("SELECT * FROM ".TABLE_CATEGORY." WHERE catid=$catid");

        $setting = unserialize($data['setting']);

        unset($data['setting']);

        $data = is_array($setting) ? array_merge($data, $setting) : $data;

        $data['linkurl'] = linkurl(str_replace($PHPCMS['index'].'.'.$PHPCMS['fileext'], '', $data['linkurl']));

        cache_write('category_'.$catid.'.php', $data);

        return $data;

        }

        function cache_type($keyid=0)

        {

        global $db;

        if($keyid)

        {

             $result = $db->query("SELECT * FROM ".TABLE_TYPE." WHERE keyid='$keyid'");

             $data = array();

             while($r = $db->fetch_array($result))

             {

           $r['introduce'] = $r['introduce']? $r['introduce']:' ';

              $data[$r['typeid']] = $r;

             }

             if($data)

             {

           cache_write('type_'.$keyid.'.php', $data);

             }

          return $data;

        }

        else

        {

          $modules = array();

          $query = $db->query("SELECT module FROM ".TABLE_MODULE." WHERE disabled=0 ORDER by moduleid");

          while($r = $db->fetch_array($query))

          {

           $modules[] = $r['module'];

                }  

          $channelids = array();

          $query = $db->query("SELECT channelid FROM ".TABLE_CHANNEL." WHERE islink=0 AND disabled=0 ORDER by channelid");

          while($r = $db->fetch_array($query))

          {

           $channelids[] = $r['channelid'];

          }

          $modulechannels = array_merge($modules,$channelids);

          foreach($modulechannels as $m)

          {

           $result = $db->query("SELECT * FROM ".TABLE_TYPE." WHERE keyid='$m'");

           $TYPE = array();

           while($r = $db->fetch_array($result))

           {

            $r['introduce'] = $r['introduce']? $r['introduce']:' ';

            $TYPE[$r['typeid']] = $r;

           }

           cache_write('type_'.$m.'.php',$TYPE);

          }

          return $modulechannels;  

        }

        }

        function cache_member_group()

        {

        global $db;

        $query = $db->query("SELECT * FROM ".TABLE_MEMBER_GROUP." ORDER BY groupid"); //用户组信息

        while($r = $db->fetch_array($query))

        {

          $groupid = $r['groupid'];

          cache_write('member_group_'.$groupid.'.php', $r);

          $data[$groupid] = $r;

        }

        cache_write('member_group.php', $data); //明白了吧。写缓存罗

        return $data;

        }

        function cache_banip()

        {

        global $db,$PHP_TIME;

        $result = $db->query("SELECT ip,overtime FROM ".TABLE_BANIP." WHERE ifban=1 and overtime>=$PHP_TIME order by id desc ");

        while($r = $db->fetch_array($result))

        {

          $data[] = array('ip'=>$r['ip'],'overtime'=>$r['overtime']);

        }

        $db->free_result($result);

        cache_write('banip.php', $data);

        return $data;

        }

        ?>

    尽量每天都有新的东西每天都能进一小步

    现在开始讲  index.php 首页文件. 基本来说PHPCMS的加载到显示操作的整个流程都分析完了.大家看一遍后.还要整体的来看来分析.慢慢体会.把些好的思想和思路实现到自己以后的项目里.我相信大家都会变得很强的. 记得: 程序是死的,人是活的.有实现思路一切都好办了.

    引用:

        <?php

        /**

        代码分析版权所有:逆雪寒

        */

        require './include/common.inc.php';

        /**

        看 common.inc.php 核心启动文件我们已经讲解完了。应该都明白了吧

        */

        if($PHPCMS['ishtml'] == 1 && file_exists(PHPCMS_ROOT.'/'.$PHPCMS['index'].'.'.$PHPCMS['fileext']))

        {

        header('location:'.$PHPCMS['index'].'.'.$PHPCMS['fileext']);

        exit;

        }

        /**

        phpcms 允许在后台生静态和使用静态,这里就是先判断 $PHPCMS['ishtml'](从文本缓存弄过来的。应该知道了吧)是否为1 就是开启了。和这个 静态的html文件是否存在。

        */

        $channels = array();

        $channels['article'] = $channels['down'] = $channels['picture'] = $channels['info']= array();

        foreach($CHANNEL as $v)

        {

        $module = $v['module'];

        if($v['islink'] == 0 && $MODULE[$module]['iscopy'] == 1) $channels[$module][$v['channelid']] = $v;

        }

        //获取频道模块的信息。都是从缓存中取的

        $head['title'] = $PHPCMS['seo_title'];

        $head['keywords'] = $PHPCMS['seo_keywords'];

        $head['description'] = $PHPCMS['seo_description'];

        // 这个是网页的SEO (title,keywords,description)信息。这个写好了。网络蜘蛛会找你哦。

        include template('phpcms', 'index');

        //  template() 函数是模板函数。这个就是这章的主题。往下会讲模板引擎的制作,大家都看到include 了吧。它的参数是文件地址。那么就可以想到 template()函数其实就是

        //  模板编译后的PHP文件地址。

        phpcache();

        /**

        这个函数厉害了。用来自动生缓存页的(这个是页面缓存和数据库信息的文本缓存不是一会事),页面缓存,就是把你所看的页自动生成 XX.html 静态页。请注意前面代码。是不是有个 header()跳转到静态页呀。

        那静态页那里来的?就是给这个函数弄出来的。自动静态化了其实。@@是不是很简单呢。上菜先:

        function phpcache($is_js = 0)

        {

        global $CONFIG,$cachefiledir,$cachefile;

            if(!$is_js && $CONFIG['phpcache'] != '2') return FALSE;

        $contents = ob_get_clean();

        if($is_js) $contents = strip_js($contents);

        if($CONFIG['phpcache'] == '2' && $cachefiledir && $cachefile)

        {

          dir_create($cachefiledir);

          file_put_contents($cachefile, $contents);

          @chmod($cachefile, 0777);

        }

        header('Expires: Mon, 26 Jul 2000 05:00:00 GMT'); 告诉浏览器此页面的过期时间(用格林威治时间表示),只要是已经过去的日期即可

        header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');  告诉服务器本页最后修改日期。目的就是强迫浏览器获取最新资料

        header('Cache-Control: no-cache, must-revalidate');  这句 session_cache_limiter('private') 作用差不多。就是用户 点击后退不会出现警告页。十分有用哦。大家别忘了

        header('Pragma: no-cache'); 不缓存当前页 。其实和前一句一样意思,这句不过是为了兼容http1.0协议。

        echo $contents; //输出内容。

        }

        首先判断。文件当前文件不是JS问文件和后台打开了页面缓存静态化,。然后使用了OB读写缓冲区系列函数来操作缓冲区。

        ob_get_clean() 函数。十分有用。一般我们做整站静态化也是利用OB系列函数来实现。

        这个函数就是获取当前缓冲区的HTML内容。然后把将要输出的缓冲区内容清除掉。网页先是一点点读到浏览器的缓冲区。当缓冲区满了以后才会放出来。所以我们

        可以用OB系列函数在缓冲区没有输出之前截取内容来做我们要做的过滤等动作。(dz的伪静态有部分就这样实现的。把缓冲区中的所有超级连接地址更改成:thread-46695-1-3.html 形式。然后apache 那边再用.hataccess 来做判断跳转) 这里也是。我们获取将要输出的内容以后 调用 strip_js() 这个函数来过滤HTML内容。 因为比较简单继续上菜:

        function strip_js($string, $js = 1)

        {

        $string = str_replace(array("\n","\r","\""),array('','',"[url=]\\\""),$string[/url]);

        return $js==1 ? "document.write(\"".$string."\");\n" : $string;

        }

        主要是来过滤内容里面的 \n 换行 、\r 换页符 和  '\'  具体请百度:制表符

        继续我们上个函数strip_js过滤完内容后。 在使用 file_put_contents() 函数 把内容写到文件里面去。也就是那个 HTML静态页

    展开全文
  • CMS(Content Management System),中文叫作整站系统、文章系统,大概2003以前asp出现之前,个人网站如果想进行网站内容管理,基本上都是靠手工维护,但千变万化的信息流,但没有好的程序支持,还继续靠手工完成是不可能...
    CMS(Content Management System),中文叫作整站系统、文章系统,大概2003以前asp出现之前,个人网站如果想进行网站内容管理,基本上都是靠手工维护,但千变万化的信息流,但没有好的程序支持,还继续靠手工完成是不可能的事,如果有一个好的系统来支撑你的网站,那将节省大量的人力物力,开发者就可能给客户一个软件包,可以用它定期人工修改网站。只要你配置安装好,你的编辑,在线记者,更新员只要定期更新数据,剩下的事就交给CMS去处理。 
    

    === Asp ===
    动易CMS管理系统,官方网站:http://www.asp163.net/这套是国产AspCMS中非常强大的系统,从3.0的简单的一个文章系统到现在的2005的版本,一路走来,动易不断完善,而且也不断加强功能,包括个人版,学校版,政府版,企业版,后台包括的功能,信息发布,类别管理,权限控制,信息采集,而且跟第三方的程序,比如论坛,商城(2005的已经自带了), blog可以完美结合,基本上可以满足一个中大型网站的要求,但Asp和Access的的局限性,还有本身功能Dll的限制,使得免费版差不多成鸡肋。例:河南工业大学粮油食品学院网站,比较老的版本了,2002年当时还叫“动力新闻系统”。
    新云网站管理系统官方http://www.newasp.cn/一款Asp的CMS后起之秀,发现有不少的网站都在使用。由文章、下载、商城、留言、用户管理五大功能模块和广告、公告、连接、统计、采集、模板管理、数据库管理等多个通用模块组成,而且功能确实有一些值得称道的地方,不过又是DLL的,免费版有不少限制,但对一个简单基本网站来说,功能够用了。
    乔客(asp) 官方网站:http://www.joekoe.com/ 这个系统已经很久了,但好像一直存活在动易和风讯两者之间,现在3.0的Joekoe CMS出来了,但令女我比较失望,相比免费版的1.2,功能是增强了,但也Dll,这个可能也是国产程序的一个特色罢了。它本身已经是一个融合度非常高的系统,有商城,新闻,下载,论坛,留言,影视,博客圈等,感觉有那么点WEB2.0 的味道,,不想怎么修改的朋友直接拿去就可以用了。 例:朝阳沟http://cyg.zhaola.cn,什么也不用动,模版也多。

    风讯系统官方网站:http://www.foosun.cn/风讯的系统功能强大,自由度高,是现在人气比较高的系统之一,可以根据自己的想法做出一个网页从而建立一个有自我风格的网站,更新速度快,一直有新的版本出现,现在又开放采集、下载、投稿、图片整站管理系统,第三方整合等功能,开源是它最大特点,希望保持。然后缺点就是后台人性化差了一点,上手有点难度,而且连一套默认的模板都没有,因为自由度太高了,让一些新手更难上手,还有就是免费版的生成静态发布的效率不高。3.1已经出来一段时间了,愿各方面都更上一层楼。
    例:河南工业大学校团委女大学生风采大赛网站,风讯体系太庞大了,功能完善,自由度高,但不容易上手,但仍然推荐学习使用,用来做大站。 科汛网站管理系统 http://www.kesion.com Kesioncms V3.2正式版集成Web2.0元素,她是一个经过完善设计有着及其强大的会员互动和独特创新的内容管理系统。主要功能模块包括:文章、图片、下载、动漫、音乐、影视、商城、供求、采集管理、专题等等。系统通用模块:用户、博客日志、相册、音乐盒、朋友圈、广告、公告、模板、网站信息配置、高级自定义SQL扩展标签,RSS在线订阅功能、网站统计、邮件列表、邮件群发、数据库管理、站内短消息、收费模块、文件上传、友情链接、调查管理、操作日志记录、缩略图及水印、IP访问限制管理、Google站点地图、站内搜索小助理、在线HTML编辑器模块等。是一款适合于从个人站长到各大企业方面应用需求的软件,为您提供一个更安全、更稳定、更高效、更快捷的Web站点和一体化的商务平台解决方案。采用人性化的Windows操作方式开发,操作简单,运行速度快,服务器资源占用更少;无论在稳定性、负载能力、安全等方面都有可靠的保证并赢得了广大用户的良好称赞。
    NB文章系统(asp) 官方:http://forum.nbarticle.com/default.asp现在最新的是v3.0 RC1 ,上手挺容易,后台很简洁,安全性能不错,发布效率比较高,当然想到同类型的,RSS不错,它也是将模板写入数据库,但修改还是蛮方便。不过这样相对来说功能是少了一些,而且官方就一个论坛技术支持,论坛的人气差了一点。
    例:河南工业大学评估办、组织部、对外合作处网站,比较易用,功能完善新闻、评论、用户、文集、友情链接,带RSS。
    tsys信息发布系统官方:http://www.tsyschina.com 非常遗憾 2.0刚刚出测试版,作者就好像人间蒸发一样消失了!不过对于一个免费开源,没有版权的CMS来说我们也没有什么可要求的!抛开强大,但可能不成熟(我没用过)的2.0不谈!单说1.1版!从 1.1就可以说他是ASP CMS中的老大了!在TSYS的各个版本中均没有出现过重大的安全漏洞而且对于目前1.1来说已经是很完善成熟的了!tsys和一般的Asp 的CMS不一样!他的功能并非由本身而定!而是根据使用者的能力而定!使用者越厉害 TSYS本身也可以变的更厉害!因为TSYS可以说是一个核心!而其他的东西和功能均需要使用者自己搞定!从这点来说!TSYS的功能可以说是无限的!但这也决定了TSYS不会流行起来!说白了只有高手使用TSYS才能把TSYS的优点发挥的淋漓尽致!可惜啊.... 例:河南工业大学笃行网、先进性教育、学科建设处、产业管理处,自由度高,会编程的可很好的开发。安全性好。使用也方便。 晓宇听幽新闻管理系统(xoYu News) 2004 v1.2正式版(无任何限制)http://code.im286.com/s/201/ 2004年后不再开发,在当时是功能最强大的系统,现在看来也不弱,不过应用上也不太容易,有兴趣了可以研究一下。全静态支持。无限级分类、多级分类并存,空间查看程序。专题无限级分类、多级分类并存,同栏目分类,模版管理。模版种类包括:1 首页模版、2 类别模版、3 文章列表模版、4 具体文章模版。模版由模块拼装而成也可通过自由JS生成功能生成自定义JS。自由设定版面样式。真正实现了模版、JS并存。模版设计、编辑、添加、保存灵活方便。自带模版。文章自动内部链接生成(此功能常见于大型新闻网站)。文章分页功能。批量文章自动生成功能 可选择自动生成指定ID的文章或者类别范围,重新生成指定文章。文章内部任意位置插入任意图片。分为图片上传和添加图片URL两种添加图片方式。五级用户管理。 多样化的文章输入方式。文章标题颜色变换。自定义全能JS可实现图片文章个性化排列。去掉了用处不大的广告插件。 世纪易网新闻系统、WpsCms 在易网新闻管理系统 v2.0的基础上修改美化,是一套基于WEB的网站管理系统,整合了论坛、新闻采集、信息反馈、投票、友情链接、站点统计。有些杀毒软件会把\admin\collect\inc\Function.asp看成是病毒,其实Function.asp是新闻采集系统里的一个配置文件而非病毒。 WpsCMS Version 3.2 新春贺岁版特性:1. 系统前后台实现完全分离,前台页面自己设计并插入相关的JS代码即可,真正实现个性化;2.系统自动生成HTM静态页面,实现85%以上的浏览量为纯静态访问,可以承载门户级的访问量;3.可以对前台调用的JS代码进行自定义,包括新闻条数、标题前修饰代码、标题后是否显示时间;『还可以根据页面的实际情况,手动设置』4.整合了论坛、采集、下载、图片模块 5.支持RSS 6. 发表文章采用功能强大的在线编辑器,实现所见即所得的录入功能7. 管理用户采用四级分类。
    php的CMS: Ecms 帝国网站管理系统官方:http://www.phome.net/可以说这个是最让我值得写的东西,作者wm_chief是个超人,偶像啊!官方的title里面是 在这里只有原创,那家伙也是疯子,比如数据库管理,论坛,新闻,下载,flash,域名交易系统等, 还包括JSP的版本,都是自己一个人写,还有一个人搞定后期服务,客户支持,产品宣传。还要每天抽时间灌水AD,ECMS的功能非常多,包括下载,flash,商城,图片,新闻,友情链接,广告管理等, 比如一些远程发布,刷新效率,类别管理,权限细分,万能的论坛接口,信息采集,附件管理等这些都是Ecms特别的亮点,而且免费版也不错,作者WC也非常虚心接受客户的建议,基本上任何一个小的功能,都力求做到最好, 他明白用户的需求,一切能从用户本身出发的系统才是好的系统,3.6已经出来了,而且下一个版本可能会结合EXE软件发布,刷新的功能,让我们拭目以待。 Mambo系统 http://www.mambochina.net/ 曼波整站系统是在 Mambo 全球版基础上改进开发的适合中国人的智能建站系统,由 Mambo中国 和 Mambo Resource 联合增强开发,是 Mambo 中文化的传承和发扬光大! 曼波整站系统是免费的自由软件,遵循 GNU/GPL 开源许可协议。曼波整站系统做为 Mambo 的中文分支,英文代码为 Mambors,以区分英文版Mambo。今后 Mambo中国将走两条路线,以满足大家的选择,一条是以汉化 Mambo 英文版为主的曼波全球版,保持曼波原汁原味;一条就是曼波整站系统,本土团队自主开发维护,对曼波的核心做大量的增强,优化系统性能,提高运行效率,及时满足国内用户使用习惯。曼波整站系统开发指导思想:1. 愈简,愈强 (More Simple, More Powerful),在追求功能强大的同时,操作更加精简,建站不再是技术人员的专利。 2. 兼容 Mambo/Joomla 的插件(组件、模块、触发器和模版),具有丰富的扩展功能。 Supersite/Xspace http://x.discuz.net/ http://x-space.discuz.net/ 2.0概念社区型门户网站,功能超强大,界面美观,由discuz!开发全免费。SupeSite/X-Space是一套使用跨平台的PHP语言和MySQL数据库构建的社区门户解决方案包。通过安装使用SupeSite/X-Space,网站建设者可以轻松、迅速和高效的构建拥有高度Web2.0特性的社区门户,为站点的会员提供包含日志(博客)、影音视频(播客)、群组(圈子)、相册图片、商品买卖、软件分享、书签收藏等在内的全方位的Web2.0服务。已经有数十万的站点使用了SupeSite/X-Space来为站内的会员提供最新的个人空间服务,使用X-Space作为自己个人空间的用户群体已经接近千万!而且,这个数字每天都在以上千计的速度递增着欢迎使用SupeSite/X-Space。如果您的站点已经有了Discuz!论坛,您只需要下载程序,运行一下install.php就可以了。对于个人站点,这一切,都是免费的、无限制的! DedeCMS 官方:http://dedecms.com/这是一套令人爱憎分明的系统,首先它是国内一款开源的系统,2.x的时候功能都已经另它的fans为之疯狂, 非常灵活的定制,强大的功能,简洁的操作,但2.x的瓶颈问题:大数据处理,到3.0的时候可能会解决, 但3.0的一直跳票,迟迟不见发布,另很多人都非常失望,希望能在3.0的时候看到一个全新的Dedecms, 当然也支持开源产品。

    CMSware 官方:http://www.cmsware.com/一个非常不错的CMS系统,比较看好的他的后台操作简介,一些新技术,比如Ajax的应用,Wap的功能, 还有它的PSN的发布,节点和模块的定制,,自定义模型,数据库字段, 率先引进的工作流的概念,更多的发布自由度,非常强大的模板体系, 确实处处体现了自由的思想,让您体验自由管理的非凡感受.
    深喉咙(Deepthroat) 可同时生成企业网站的前台和后台,并实现前后台同步管理。基于PHP技术开发,系统构架安全合理,独特的缓存处理机制,使生成网站的浏览速度极快,结合Web设计简单理念,使生成的后台管理界面直观操作简单,支持插件模块、支持模版皮肤,使系统具有良好的扩充性,升级方便。
    eZ Publish CMS 还有免费的Xoops,功能繁多的玩意,还有Mambo的变种LimboCMS,Mamhoo。 .Net的cms:
    动网新闻(asp.net)动网论坛做的新闻系统,最新的4.X也出来了,也是DLL的,不过系统是.NET的,不过我个人不趋向使用DLL的系统,运行速度快,效率高,安全做足。 不过以前3.X的没有Dll,感觉也蛮好的, 缺点就是风格改起来不容易。 现在加密了,反而能更快上手,不过这样可以定制的地方就少了。
    渐飞新闻出版系统(asp) 4.0官方网站: http://www.xunt.net/
    这个系统也有一段时日了,从asp转为.Net架构,免费版与收费版主要区别是数据库支持,主要针对商业客户,生成全静态,适合门户,自从推出免费版后,市场份额逐渐做大。全站生成静态文件,自定义生成网页的格式(包括htm,html,shtml,asp,aspx……),自定文件文件名。独创渐飞智能标签,可组合出所有用户想要的显示效果来。栏目无限级分类,无限极分类管理。全文搜索。强大的模板自定义,可将网站的每个栏目首页,每个栏目分页,以及每条新闻都使用不同的模板。采集模块。计划任务模块。整站批量更新模块。资讯批量转移模块。强大的自定义文件(静态文件及JS功能)。专题管理。评论。批量修改站网站域名及物理存放路径、导航栏路径模块。强大的Web文件夹管理。投票系统。广告系统。会员管理模块。投稿模块。RSS订阅功能。数据库压缩及备分功能…… 倒奶CMS,也是.net的,不见什么特别之处,一笔带过
    JSP的cms:
    OpenCMS 是一个非常不错的系统,只可惜架构与自己的方向不符,而且需要大量的二次开发工作,只好放弃。OpenCMS号称可以承受很大强度的访问量,这听起来似乎很诱人。然而我在研究它的过程中发现OpenCMS复杂且庞大,文档过时,需要花费大量的精力进行二次开发,作为业余时间搞网站的我们来说的确没有这个精力,于是只好放弃。现在要我回头看这个问题,我认为我的选择是正确的,选择CMS要考虑到自身的二次开发和日后维护的能力与精力耗费以及网站的业务需要,选择开发维护快速方便和自己也比较熟悉的的LAMP架构已经能适应我网站的需要。
    Gpower CMS 是业界领先的网站内容管理系统,专门用于国内大中型企业、政府、ICP的网站建设。Gpower CMS采用国际领先的Java、XML技术和组件化的开发,完全基于浏览器的操作界面,可轻松创建与管理企业、政府的内部与外部网站。利用Gpower CMS,
    Netark CMS 方正翔宇CMS 开源的Magnolia Magnolia CMS TurboCMS 这样只面向企业用户,几十万的系统,我们不用考虑。
    JSP的应用门槛对我们个人用户来说,有点高,也不想多提

    OPENSOURCE CMS进行了一个最佳网站内容管理系统的投票评选,不如就从这里入手去探寻CMS系统的情况。现在排在前5名,也就是最终入围项目的名单是:
    Drupal e107 Joomla! Plone Xoops

    现在每个CMS功能介绍上都会说自己的产品如何强大,比如说什么模板体系如何好,缓存技术如何高明,刷新效率,负载容量如何强,操作如何如何简单,容易上手,跟第三方无缝结合,还有功能模块的如何丰富,生成静态发布,信息采集…… 吹牛谁都会,大家都会写,关键是客户如何认为,反正一句话,适合自己的就是最好的。网站大发展过程中一个决定性的因素就是网站构建技术和网站本身的服务内容之间的分离。几年前,在BLOGGER之前,要想在网络上顺利的发表,还真的需要知道一点技术,而现在,大多数天天书写着BLOG的人,都是没有任何技术背景的普通用户。随着开源CMS项目如火如茶的发展趋势,加上未来主机托管或者虚拟主机租用费用的不断降低,一个不具备专业网络技术知识的人,都可以轻易的建立自己的网站,如果说这几年BLOG 的发展解放了普通民众的发言权,这种功能更为复杂的CMS系统的发展,将会促使那些更加会创造,会关心别的用户的需求的人的创造得到利益上的回报。甚至可以预言,这可能会是一轮新的去中心化的开始,即中小型网站对大型内容门户的蚕食的开始。内容是互联网的生命,内容管理系统将那些深藏在用户内心深处的想法流畅的表达出来,从而使整个网络充满活力。将来转载型的网站的重要性一定会不断降低,除非它在这个过程中创造了新的对用户有利的价值,随着GOOGLE算法的改进,将来出现在搜索结果首页的东西一定是那些用户最想需要的东西,而且是一定是那些创造者的网页。未来将会有更多的人将会应用到较为复杂的多人参与型CMS系统,这会与网络发展的去中心化趋势有关,一个中小型的,以一个或者几个人创造为主,大量读者松散参与的网站,会比中心化垄断型的网站更具有活力。同时,它也使创造者的利益得到更加合理的体现。现在一个好的,内容专一又专业的小网站,很容易会得到足够的流量,仅仅通过GOOGLE类似的广告就可以维持。
    展开全文
  • CMS

    千次阅读 2013-06-18 19:12:11
    CMS 百科名片   CMS CMS是Content Management System的缩写,意为"内容管理系统",它具有许多基于模板的优秀设计,可以加快网站开发的速度和减少开发的成本。CMS的功能并不只限于文本处理,它也可以...

    CMS

    百科名片

    CMS   
    CMS
    CMS是Content Management System的缩写,意为"内容管理系统",它具有许多基于模板的优秀设计,可以加快网站开发的速度和减少开发的成本。CMS的功能并不只限于文本处理,它也可以处理图片、 Flash动画、声像流、图像甚至 电子邮件档案。

    编辑本段简介

    CMS其实是一个很广泛的称呼,从一般的 博客程序, 新闻发布程序,到综合性的 网站管理程序都可以被称为内容管理系统。
    cms系统

      cms系统

    编辑本段分类

    根据不同的需求,CMS有几种不同的分类方法。比如,根据应用层面的不同,可以被划分为:
    ○重视后台管理的CMS
    ○ 重视风格设计的CMS
    ○重视前台发布的CMS
    等等。最终界面上都是大同小异,但是在编程风格与管理方式上来讲却是千差万别。
    就CMS本身被设计出来的出发点来说,应该是方便一些对于各种网络编程语言并不是很熟悉的用户用一种比较简单的方式来管理自己的网站。这虽然是本身的出发点,但由于各个CMS系统的原创者们自己本身的背景与对“简单”这两个字的理解程度的不同,造成了现在群雄纷争的局面。
    简而言之,CMS就是可以让你不需要学习复杂的建站技术,不需要学习太多复杂的 HTML语言,你就能够利用CMS构建出一个风格统一功能强大的专业网站。

    功能

    CMS具有许多基于模板的优秀设计,可以加快网站开发的速度和减少开发的成本。CMS的功能并不只限于文本处理,它也可以处理图片、 Flash动画、声像流、图像甚至电子邮件档案。
    CMS还分各个平台脚本种类的。
    内容管理系统是企业信息化建设和电子政务的新宠,也是一个相对较新的市场,对于内容管理,业界还没有一个统一的定义,不同的机构有不同的理解:
    Gartner Group 《加特纳集团》认为内容管理从内涵上应该包括企业内部内容管理、Web内容管理、电子商务交易内容管理和企业外部网(Extranet)信息共享内容管理(如 CRM和SCM等),Web内容管理是当前的重点,e-business《电子商务》和XML是推动内容管理发展的源动力。
    Merrill Lynch的分析师认为内容管理侧重于企业员工、企业用户、合作伙伴和供应商方便获得非结构化信息的处理过程。内容管理的目的是把非结构化信息出版到intranets《内部网, extranets《内扩网和ITE(Internet Trading Exchanges), 从而使用户可以检索、使用、分析和共享。商业智能系统(BI)侧重于结构化数据的价值提取,而内容管理则侧重于企业内部和外部非结构化资源的战略价值提取。
    Giga Group 认为作为电子商务引擎,内容管理解决方案必须和电子商务服务器紧密集成,从而形成内容生产(Production)、传递(Delivery)以及电子商务端到端系统。

    CMS网站模板

    市场上有很多公司自行开发的 CMS系统模板,几个比较大的网站上也经常能够看到一些国外(欧美,韩国)的模板,当中比较有代表性的,在美国有较大影响力的当属怪兽模板了。起源于美国,随即登陆亚洲市场,瞬间风靡全球的网站建设的崭新模式--怪兽网页模板的CMS网站模板,包括了 WordPress,joomla,magento,drupal,mambo等目前市场上最流行的模板。
    中国也有一些好的开源项目如: jeecms、kooboo、wojilu
    作为面向 WEB开发的CMS系统,其开发阵营一般分为PHP、.NET、JSP三大阵营,而国内.NET开发阵营中典型的CMS产品:Zoomla!逐浪CMS集聚了FLEX、3D、全景等应用,力求为用户提供更多便利,并开始集成信息化系统,以符合未来互联网的发展需求。

    编辑本段发展过程

    产生

    CMS产生的过程背景
    随着网络应用的丰富和发展,很多网站往往不能迅速跟进大量信息衍生及业务模式变革的脚步,常常需要花费许多时间、人力和物力来处理信息更新和维护工作;遇到网站扩充的时候,整合内外网及分支网站的工作就变得更加复杂,甚至还需重新建设网站;如此下去,用户始终在一个高成本、低效率的循环中升级、整合。
    于是,我们听到许多用户这样的反馈:
    页面制作无序,网站风格不统一,大量信息堆积,发布显得异常沉重
    内容繁杂,手工管理效率低下,手工链接视音频信息经常无法实现;
    应用难度较高,许多工作需要技术人员配合才能完成,角色分工不明确
    改版工作量大,系统扩展能力差,集成其它应用时更是降低了灵活性;
    对于网站建设和信息发布人员来说,他们最关注的系统的易用性和的功能的完善性,因此,这对网站建设和信息发布工具提出了一个很高的要求。
    首先,角色定位明确,以充分保证工作人员的工作效率;其次,功能完整,满足各门道"把关人"应用所需,使信息发布准确无误。比如,为 编辑、美工、主编及运维人员设置权限和实时管理功能。
    此外,保障网站架构的安全性也是用户关注的焦点。能有效管理网站访问者的登陆权限,使内网数据库不受攻击,从而时刻保证网站的安全稳定,免于用户的后顾之忧。
    根据以上需求,一套专业的内容管理系统CMS应运而生,来有效解决用户网站建设与信息发布中常见的问题和需求。对网站内容管理是该软件的最大优势,它流程完善、功能丰富,可把稿件分门别类并授权给合法用户编辑管理,而不需要用户去理会那些难懂的SQL语法。

    发展

    内容管理从2000年开始成为一个重要的应用领域,这时.COM和B2B, B2C等经历了资本和市场的考验及洗礼,人们重新回到信息技术应用的基本面-如何提高竞争能力,而内容管理恰恰能够通过对企业各种类型的数字资产的产生、管理、增值和再利用,改善组织的运行效率和企业的竞争能力,企事业单位也开始认识到内容管理的重要性。
    从企事业单位信息化的观点来看,以下因素导致对内容管理软件的巨大需求:
    (1) 知识是企业的财富。
    在Internet交互过程中,只有十分之一涉及销售,其他十分之九都和信息交互有关,员工的知识获取越来越依赖于互联网,特别是在电子商务的个性化环境中,客户为了做出购买决定,需要智能化地获取信息,不仅仅是商品的数量和价格,更重要的可能是产品的手册、安全保证、技术指标、售后服务、图片文件等等。
    (2) 信息的及时性和准确性
    无论在企业内网还是 外网,信息的更新越来越快,企事业单位的信息生产量越来越多,且呈现成倍增长的趋势,企事业单位更需要的是一个功能强大、可扩展的、灵活的内容管理技术来满足不断的信息更新、维护,这时如何保证信息的准确性和真实性将越来越显得重要。
    (3) 企业内外网统一的需求增长。
    随着企事业单位信息化的建设,内联网和外联网之间的信息交互越来越多,优秀的内容管理系统对企业内部来说,能够很好地做到信息的收集和重复利用以及信息的增值利用, 对于外联网来说,更重要的是真正交互式和协作性的内容。

    开发CMS

    内容管理系统是一个很泛的概念:从商业门户网站的新闻系统到个人的Weblog都可以称作发布系统。
    框架型:本身不包含任何应用实现,只是提供了底层框架,具体应用需要一定的二次开发,比如Cocoon,Vignette;
    应用型:本身是一个面向具体类型的应用实现,已经包含了新闻/评论管理,投票,论坛,WIKI等一些子系统。比如:postNuke xoops等
    但无论如何,在发布系统选型之前,首先了解自己的实际需求是最重要的:想根据现成系统将自己的需求硬往上照搬是非常不可取的。访问量,权限控制和各种功能需求。每个模块和功能自己都比较清晰一点以后,你会发现其实每个环节到目前上都有比较成熟的实现了,如果没有:你的需求太特殊,或者可以尝试分解成更小的系统组合实现。
    内容管理系统被分离成以下几个层面:各个层面优先考虑的需求不同
    1,后台业务子系统管理(管理优先:内容管理):新闻录入系统, BBS论坛子系统,全文检索子系统等,针对不同系统的方便管理者的内容录入:所见即所得的编辑管理界面等,清晰的业务逻辑:各种子系统的权限控制机制等
    2,Portal系统(表现优先:模板管理):大部分最终的输出页面:网站首页,子频道/专题页,新闻详情页一般就是各种后台子系统模块的各种组合,这种发布组合逻辑是非常丰富的,Portal系统就是负责以上这些后台子系统的组合表现管理;
    3,前台发布(效率优先:发布管理):面向最终用户的缓存发布,和搜索引擎spider的URL设计等……
    内容管理和表现的分离:很多成套的CMS系统没有把后台各种子系统和Portal分离开设计,以至于在Portal层的模板表现管理和新闻子系统的内容管理逻辑混合在一起,甚至和BBS等子系统的管理都耦合的非常高,整个系统会显得非常庞杂。而且这样的系统各个子系统捆绑的比较死,如果后台的模块很难改变。但是如果把后台各种子系统内容管理逻辑和前台的表现/发布分离后,Portal和后台各个子系统之间只是数据传递的关系:Portal只决定后台各个子系统数据的取舍和表现,而后台的各个子系统也都非常容易插拔。
    内容管理和数据分发的分离:需要要Portal系统设计的时候注意可缓存性(Cache Friendly)性设计:CMS后台管理和发布机制,本身不要过多考虑"效率"问题,只要最终页面输出设计的比较Cacheable,效率问题可通过更前端专门的缓存服务器解决。
    此外,就是除了面向最终浏览器用户外,还要注意面向搜索引擎友好(Search engine Friendly)的URL设计:通过URL REWRITE转向或基于PATH_INFO的参数解析使得动态网页在链接(URI)形式上更像静态的目录结构,方便网站内容被搜索引擎收录

    编辑本段CMS推荐介绍

    PHPCMS
    采用全球认可的最为先进的开放理念——OOP(面向对象),进行全新框架设计。框架结构更为清晰,代码更易于维护。模块化做为功能的开发形式,让扩展性得到保证。V9特别设计的二次开发扩展方式,让你不再修改官方的代码文件,就可以对功能代码进行重写。轻松享受二次开发带来的便捷,不再为官方升级而担忧。
    DEDECMS
    织梦内容管理系统(DedeCms) 以简单、实用、开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历了二年多的发展,都有了长足的发展,DedeCms免费版的主要目标用户锁定在个人站长,功能更专注于个人网站或中小型门户的构建,当然也不乏有企业用户和学校等在使用本系统。织梦内容管理系统(DedeCms)基于PHP+MySQL的技术架构,完全开源加上强大稳定的技术架构。
    2010年国内最常用的PHP+MySql免费CMS系统大全
    1. DEDE-这是一款国内开源的cms,作者仅一人,能做出如此功能的cms,是相当不错的。2007版功能十分强大,希望能改善之前数据量一大,更新静态页就很慢的缺点。因为开源,有较多的玩家和拥护者。非常适合有一定编程基础的站长。
    2. phpcms-一个综合的网站管理系统,由PHP+MYSQL构架全站生成html,能够快速高效地应用于LINUX和WINDOWS服务器平台,是目前中国LINUX环境下最佳的网站管理应用解决方案之一。之前被酷6收购,现在被盛大收购,但差别不会太大。
    3. 帝国网站管理系统-Ecms全称为“帝国网站管理系统”,英文译为"Empire CMS"简称"Ecms".Ecms是基于B/S结构,且功能强大而易用的网站管理系统.是一个经过完善设计的适用于Linux/windows/Unix等环境下高效的网站解决方案。
    4. php168 -PHP168整站系统,代码全部开源,可方便的进行二次开发,功能模块可以自由安装与删除,个人用户免费使用。系统频道模块很多,适合作个人门户网站。较多页面没有生成静态页。如果你想建站,就义无反顾的选择它吧!!!
    5. HBcms :一个以PHP官方推荐的PEAR+SMARTY技术架构的cms,比较容易上手,适合没经验的新人做网站。没有下载,分类信息等模块,适合做文章为主的网站。全站生成静态页,默认附带了几套模板,可以方便的更换模板。个人企业都免费,无需授权。
    6. SupeSite-一款将论坛资源自动转换成门户网站的php程序系统,使用SupeSite,并利用你现有的论坛,你将自动拥有一个功能完备的,资源丰富的站点系统;由论坛变成网站,一切都是自动完成,你不需要任何干涉。让你轻轻松松实现建立网站的目的。
    7. 曼波-MAMBO,一个国外的CMS系统,功能很强大,支持添加很多组件,模块;拥有丰富的模板.Mambo是一个网站内容管理系统(CMS),它是网站的后台引擎,使网站内容的创建、管理和共享更加简易。Mambo十分强大,但官方网站也承认,它不是典型的“门户”网站解决方案。
    8. Joomla! 是一套在国外相当知名的内容管理系统,2007年开源cms第一名!Joomla!是使用PHP语言加上MySQL数据库所开发的软件系统,可以在 Linux、Windows、MacOSX等各种不同的平台上执行。操作接口除了美观之外,也花了很多心力在设计这些接口的简易操作性。但初次使用者,需要花一点时间学习一下操作的方式,才能运用自如。。
    9. Drupal-Drupal是一个强大的软件,它可以让个人或社区使用者很容易地发表、管理并组织一个网站里大量且多样的内容。已经有许多个人和组织采用Drupal来建立各种不同的网站。Drupal是一套采用GPL授权的开放源码软件,是由数以千计的使用者和开发人员所共同维护和开发的。
    10. WordPress- 是一款基于PHP和MySQL的Blog软件,但是它也可以当作简单的cms系统来用。通过它可以快速而简便的搭建属于你自己的Blog(网站)平台。简而言之,这个Wordpress就相当于咱们用来搭建论坛的那些程序,比如用在自留地上的雷傲,还有别的比如PHPBB等等…Wordpress因为它的安装简单和可扩展性好几乎已经成了独立搭建Blog平台的第一选择。Wordpress还有一个MU就是多用户的版本,支持多用户的Blog系统。
    11. OpenWBS 是一种全新的互联网应用模式建站系统,前后历经四年时间精心策划研发设计。它一改过去传统的企业建站方式,只需应用系统所提供的各种强大丰富的功能模块,即可轻松生成功能强大和个性化的精美网站。OpenWBS功能模块非常灵活,可随意组合出个性化的网站,用户在短时间内即可迅速架设属于自己的企业网站、电子商务网站、外贸网站甚至是门户和博客。
    国内最常用的dotNET CMS(含ASP)系统大全(参照alexa排名)
    1.动易--这套是国产AspCMS中非常强大的系统,包括个人版,学校版,政府版,企业版,后台包括的功能,信息发布,类别管理,权限控制,信息采集,而且跟第三方的程序,比如论坛,商城, blog可以完美结合,基本上可以满足一个中大型网站的要求,但Asp和Access的的局限性,还有本身功能Dll的限制,使得免费版差不多成鸡肋。这套系统比较适合非专业人士使用。
    2.易点内容管理系统(DianCMS)--系统特点:自定义搜索及搜索结果显示方式,首次引用一条数据属于多个栏目功能,全站录入界面统一生成aspx文件,方便管理和扩展。后台支持选项卡功能,可记录最近操作的8个功能连接。超强采集系统:采用多线程设计可暂停、继续、终止采集任务。灵活的VS自由标签。终极列表内置24种分页效果,满足不同网站风格。数据字典内置多种常用类别:三级地区、个人爱好、评分等级等。URL伪静态功能:采用微软URLRewriter核心架构。使用自定义模型、自定义字段可以创建图片系统、下载系统、个人求职、企业招聘、房产系统、音乐系统、视频系统、网上商店等。
    3.逐浪CMS是基于.net 开发的CMS,目前采用Zoomla!逐浪CMS的用户大多以高端电子商务应用为主,其中包括对接金蝶K3等应用,并融合三维全景、3D、智能组卷、教育行业、视频、微博等应用,系统集成站群、开放API、数据接口,同时不集成任何强制LOGO,定位是“面向开发者的CMS”,与动易CMS正好定位相反,初学者困难,但一旦上手即进入自我境界。每年元旦逐浪CMS都会发布重要版本,是国内更新与研发投入最大的CMS系统之一。
    4.Siteserver---较特殊的.netCMS,系统安装后需要建立子站点才可以应用,虽然这类“子站”可以建成多个网站,但用户上手需要一段时间,siteserver同步提供了微博与小型论坛应用。
    5.风讯-- 风讯的系统功能强大,自由度高,是现在人气比较高的系统之一,可以根据自己的想法做出一个网页从而建立一个有自我风格的网站。缺点就是后台人性化差了一点,上手有点难度,而且连一套默认的模板都没有,因为自由度太高了,让一些新手更难上手,还有就是免费版的生成静态发布的效率不高。
    6、创力--- 创力是一套无任何文件加密,不需要注册组件,不需要绑定域名,经过完善设计、精心打造的一个适用于各种服务器环境的安全、稳定、快速、强大、高效、易用、优秀的网站建设解决方案。系统功能齐全,集成文章、下载、图片、影视、商城、留言、用户等大模块,并可无限制N个与文章、下载、图片等模块相同的的模块,每个模块下更可无限栏目分类,加上Rss订阅、公告、广告、统计、关键字、友情链接、JS代码、站点地图……等等,综合来说是一套不错的网站系统。
    7.JTBC-- JTBC也是新出不久的一套可对现有模块进行扩充与克隆的网站系统核心,采用UTF-8编码,是目前ASPCMS界中唯一一款真正意义上做到代码与程序全脱离的程序,似乎采用了xml的散存储技术,而且在代码与程序脱离的技术上,又加人了语言与代码脱离,语言与程序脱离的两两脱离关系,基于这种特性,JTBC就具有了非常强大的可扩充性和可二次开发性,目前具有文章系统,下载系统,商城系统三大传统模块,有友情链接,在线支付,网站留言,网站评论等常规管理项目,JTBC可能对于未上手的人来说是一套很头大的系统,但对于熟悉的人而言使用起来非常有效率,做企业网站与其他网站均可。
    8.TSYS---对于一个免费开源,没有版权的CMS来说我们也没有什么可要求的!在TSYS的各个版本中均没有出现过重大的安全漏洞而且对于目前1.1来说已经是很完善成熟的了,TSYS和一般的Asp 的CMS不大一样,他的功能并非由本身而定,而是根据使用者的能力而定。使用者越厉害TSYS本身也可以变的更厉害。强大的诸如碎片等的信息管理,可以将信息在显示的时候重新整合,说白了就是只有对TSYS非常熟悉的人才可以将TSYS的优势发挥出来,因此,光就这点也就注定了TSYS流行不起来,除非具有人性话操作的修改版本出来。(官网:暂无收录)
    9.乔客-- 这个系统已经很久了,但好像一直存活在动易和风讯两者之间,现在3.0的Joekoe CMS出来了,但另我比较失望,相比免费版的1.2,功能是增强了,但也Dll,这个可能也是国产程序的一个特色罢了。它本身已经是一个融合度非常高的系统,有商城,新闻,下载,论坛,留言,影视,博客圈等,感觉有那么点WEB2.0 的味道,不想怎么修改的朋友直接拿去就可以用了。
    10.科汛--科汛是一套新出的网站系统,其功能非常强大,目前主流网站的功能在其系统内均能实现,具有强大的标签(JS)管理功能,个性化的标签(JS)参数配置功能,做一个个性的大站不再是梦想。网站整体开源,具有文章模块,图片模块,下载模块,动漫模块,音乐模块,会员模块,采集模块等等,功能非常不错。
    11.新云--新云最初做的是下载站,后来转为多模块的系统,最近发现有不少的网站都在使用。由文章、下载、商城、留言、用户管理五大功能模块和广告、公告、连接、统计、采集、模板管理、数据库管理等多个通用模块组成,而且功能确实有一些值得称道的地方,不过又是DLL的,免费版有不少的限制,但对一个简单基本的网站来说,功能够用了。
    12.94xhcms是一套免费的ASP内容管理系统,可选择安装ACCESS版和MSSQL版
    系统快速稳定,现有功能支持: 无限级分类,建立门户网站也轻而易举
    模块化采集,一键实现远程文档本地化
    集成自定义表单,满足各种交互应用
    自定义可视化标签,模板风格随时更换
    ......
    13.UECMS是一款基于微软.NET平台开发的网站内容管理系统,旨在帮用户加快网站开发的速度和降低网站开发的成本,同时为用户提供一个安全、稳定、易用的网站基础平台。UECMS默认支持MS SQL数据库,可扩展支持Access、Mysql、Oracle等多种数据库格式。
    目前比较经典的CMS模板下载
    Chainsoft开发的魔方cube TemplateMonster(怪兽模板)的WordPress 网站模板 目前市场上有很多公司自行开发的网站模板,当中比较有代表性的,在美国有较大影响力的当属怪兽模板。怪兽模板板开发了 WordPress很多CMS网站模板包括joomla,WordPress,magento,drupal,mambo等,以及设计精美的 ZenCart, magento,oscommerce网店系统等目前市场上最流行各种类型各种行业的的网站模板。
    CMS在不同的领域有不同的定义。 CMS也被称为校园管理系统,正对于校园的教务系统、教师的考核而设计的,类似于我们常说的CRP。

    编辑本段主流CMS

    CMS按语言来分,主要有四大类,分别是ASP、PHP、.NET、JSP。由于PHP和Mysql自身的开源特性,以及PHP和MySQL在开源的服务器操作系统Linux下的优越表现,PHP的开源CMS格外受到关注,市场前景也是其他CMS所不能比拟的。目前国内PHP语言开源免费的主要有以下几大CMS:
    一、PHPCMS
    PHPCMS V9(后面简称V9)采用PHP5+MYSQL做为技术基础进行开发。V9采用OOP(面向对象)方式进行基础运行框架搭建。模块化开发方式做为功能开发形式。框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求。 5年开发经验的优秀团队,勇于创新追求完美的设计理念,为全球多达10万网站提供助力,并被更多的政府机构、教育机构、事业单位所认可。V9在保留2008版的特点的同时,对新版本作出重大的创新,以期待全新的PHPCMS系统服务更多的用户。
    二、帝国CMS
    《帝国网站管理系统》英文译为"EmpireCMS",它是基于B/S结构, 安全、稳定、强大、灵活的网站管理系统.本系统由帝国开发工作组独立开发,是一个经过完善设计的适用于Linux/windows/Unix等环境下高效的网站解决方案。从帝国新闻系统 1.0版至今天的帝国网站管理系统,她的功能进行了数次飞跃性的革新,使得网站的架设与管理变得极其轻松!她采用了系统模型功能:用户通过此功能可直接在后台扩展与实现各种系统,如产品、房产、供求、等等系统,因此特性,帝国CMS又被誉为“ 万能建站工具”;采用了模板分离功能:把内容与界面完全分离,灵活的标签+用户自定义标签,使之能实现各式各样的网站页面与风格;栏目无限级分类;前台全部静态:可随受强大的访问量;强大的信息采集功能;超强广告管理功能...... 她可以完全满足从小流量到大流量,从个人到企业各方面应用的要求,为你提供一个全新、快速和优秀的网站解决方案。目前EmpireCMS程序已经广泛应用在国内数十万家网站,覆盖国内上千万上网人群,并经过上千家知名网站的严格检测,被称为国内最稳定的CMS系统。
    三、齐博CMS
    齐博CMS系统是国内领先的开源内容管理系统之一,凭借着独创的可视化标签技术优势,使得页面的管理维护与风格的制作的门槛降低到最低程度。因此而深受广大用户喜爱。齐博CMS系统可以说是一个万能系统,采用核心+插件+频道模块的系统架构,同时再结合独创的可视化标签技术,你可以演变成各种企业、政府、教育、单位、学校网站,他将是您轻松建站的首选利器。8年开发经验的优秀团队,勇于创新追求完美的设计理念,为全球多达10多万网站提供助力,并被更多的政府机构、教育机构、事业单位。
    四、DEDECMS
    织梦内容管理系统,他将是您轻松建站的首选利器。采用XML名字空间风格核心模板:模板全部使用文件形式保存,对用户设计模板、网站升级转移均提供很大的 便利,健壮的模板标签为站长DIY 自己的网站提供了强有力的支持。高效率标签缓存机制:允许对类同的标签进行缓存,在生成 HTML的时候,有利于提高系统反应速度,降低系统消耗的资源。模型与模块概念并存:在模型不能满足用户所有需求的情况下,DedeCMS推出一些互动的 模块对系统进行补充,尽量满足用户的需求。众多的应用支持:为用户提供了各类网站建设的一体化解决方案,在本版本中,增加了分类、书库、黄页、圈子、问答 等模块,补充一些用户的特殊要求。面向未来过渡:织梦团队的组建为织梦CMS的发展提供坚实的基础,在织梦团队未来的构想中,它以后将会具有更大的灵活性 和稳定的性能。
    展开全文
  • 国内四大php语言cms系统

    千次阅读 2009-07-12 13:54:00
    具体的我就不再一一详述,有兴趣的话可以到官方论坛看看,我这里只想说一点,他与其他CMS的差别问题,目前来看他的采集功能和连载系统是一个亮点!但是黄页也就是商务应用上是比较弱的! 随后开源免费的
  • EmpireCMS 系统是一套采用PHP + MySQL数据库方式运行的开放源代码软件程序,所需要的环境是:PHP,MySQL数据库,环境所需要的程序均为免费。... ·在线直接恢复数据 ·备份EmpireCMS整站非常简单:只需备份数据库+...
  • Umbraco CMS源代码

    2021-03-18 15:06:45
    Umbraco是一个开源的asp.net的CMS内容管理系统,使用mssql进行存储数据。使用Umbraco,设计师能创造出有效的XHTML标记... 主要特点包括: 漂亮,友好的用户界面(支持多语言) 综合所见即所得编辑器(可以创建各类控件
  • cms

    2016-08-25 22:41:00
    一套在国外相当知名的内容管理系统,2007年开源cms第一名!Joomla!是使用PHP语言加上MySQL数据库所开发的软件系统,可以在 Linux、Windows、MacOSX等各种不同的平台上执行。操作接口除了美观之外,也花了很心力在...
  • 常用的建程序-CMS

    2016-01-30 14:26:24
    CSM又称内容管理系统,是现在最流利的...程序分几种语言,现在比较见的就是ASP、PHP和ASP.net。今天和大家 分析下这三类常用的建系统。   一、ASP类的CMS程序 1.动易CMS 官方网址:http://www.powereasy.net/
  • 曼波整站系统5.1.0

    2007-06-16 22:19:24
    曼波整站系统是在 Mambo 全球版基础上改进开发的适合中国人的智能建站系统,由 Mambo中国 和 Mambo Resource 联合增强开发,是 Mambo 中文化的传承和发扬光大! <br/>曼波整站系统是免费的自由软件,遵循 GNU/...
  • 阿斯科企业建站CMS系统v12.8 ----点击测试工具直接使用    演示地址:http://www.jianzhancms.net/cs/ashike/ 管理地址:admin/login.asp 后台帐号:admin 后台密码:admin2009 部分功能介绍: 一、网站...
  • 天时达企业建站CMS系统v2.9 **************************** 声明:本建站是无任何功能限制 **************************** 管理地址:admin/login.asp 后台帐号:admin 后台密码:admin2009 注意事项: 安装时...
  • SDM企业建站CMS系统v6.6 SDM企业网站管理系统拥有企业网站常用的模块功能:企业简介模块、联系我们模块、新闻(文章)模块、产品模块、图片模块、招聘模块、在线留言、反馈系统、在线交流、友情链接、网站地图、栏目...
  • 一些个人网站的崛起也让他们看到了成功的曙光,与此同时,各类网站管理系统(以下简称cms)也犹如雨后春笋般地出现在了大家的眼前,给很有站长梦的朋友建设网站带来了曙光。  但问题也随之而来,那就是:站长们...
  • 5. 系统的后台有一个很好的多语言管理功能。前后台的多语言设置,你可以添加多个语言包。我们使用最多的还是中英文版。比如,你是中国人,使用习惯为中文,但是你需要管理网站的英文版内容,那么你登录后台可以调整...
  • 采用 ACTCM 网站管理系统。 ACTCMS是一款具有强大的功能的基于ASP语言的开源内容管理软件,有UTF-8和GB2132两个编码版本,支持ACCESS和MSSQL两种数据库。ACTCMS是一款完全开源的程序,都毫无保留的完全开放源...
  • CMS大全

    2019-09-23 04:34:09
    CMS(Content Management System),中文叫作整站系统、文章系统,大概2004以前,如果想进行网站内容管理,基本上都是靠手工维护,但千变万化的信息流,但没有好的程序支持,还继续靠手工完成是不可能的事,如果有一个好的...
  • 十款ASP CMS系统源码

    千次阅读 2008-06-07 15:16:00
    一:动易 http://www.powereasy.net/动易无疑是ASPCMS系统中的老大哥了,国内著名的站长综合网站“网页吧”采用的也是这套系统,这套国产AspCMS是一套非常强大的且人性话系统,一路走来,动易不断完善,而且也不断...
  • CMS介绍

    2019-10-03 18:05:15
    CMS介绍 CMS是Content Management System的缩写,意为“内容管理系统”,它具有许多基于模板的优秀设计,可以加快网站开发的速度和减少开发的成本。 CMS的功能不仅限于处理文本,它也可以处理图片、Flash动画、...
  • ,在这儿本只做简单介绍和提供下载链接,总结得不好的,希望大家多多指教: 1.DEDE -这是一款开源的cms。功能也比较完善,因为开源,在个人站长中有众多的拥护者,是目前市场占有率最高的CMS。 下载地址:...
  • 天时达企业建站CMS系统v2.8 声明:本建站是无任何功能限制 演示地址:http://xc.tb11.net/xt/tianshida/ 管理地址:admin/login.asp 后台帐号:admin 后台密码:admin2009 注意事项: 安装时要给网站所在文件夹添加...
  • 常用cms

    2017-08-16 16:49:00
    最近,朋友要建让我帮着推荐个好的CMS(内容管理系统),个人认为其实选择哪个CMS并不重要,除了对搜索引擎的亲好外,个人的使用操作习惯和对所选CMS系统的熟悉程度有很大关系。  这里为需要建但又徘徊的朋友...
  • 建筑设计行业绿色风格整站源码是一款开源的THinkphp5.0 的 Blog系统,其衍生于优秀的内容管理系统易优cms。 建筑设计行业绿色风格整站源码秉承了易优CMS的先进设计理念,并且专注于旧物回收。 建筑设计行业绿色风格...
  • 发表时间:2009-5-16 8:35:42发表者:马海涛  先说最早走开源免费路线的DedeCMS。...具体的我就不再一一详述,有兴趣的话可以到官方论坛看看,我这里只想说一点,他与其他CMS的差别问题,目前来看他的采集...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,636
精华内容 654
关键字:

多语言整站cms