简介:这份资源是DedeCMS V5.6正式最终稳定版的完整源码包,面向使用PHP进行网站开发的程序员、站长以及需要搭建内容管理系统的学习者。DedeCMS是国内应用广泛的开源CMS,该版本作为V5.6系列的最终稳定版,适合用于企业建站、门户网站搭建及二次开发学习。压缩包共收录2000个文件,整体约7.55MB,其中PHP文件530个承载核心逻辑与后台功能,HTM与HTML文件合计600余个对应模板与静态页面,另有GIF、PNG、JPG等图片资源660余个用于界面素材,JS、CSS文件负责前端交互与样式,并包含少量WAV、SWF、XML、字体等辅助文件,目录结构完整。目前已有144人学习下载。通过该源码包,读者可完整了解DedeCMS的目录组织、模板机制与模块划分,便于本地部署调试、研究其PHP实现思路,或在此基础上进行功能定制与二次开发,是学习国产CMS架构的实用参考。
1. 拿到 DedeCMS V5.6 正式最终稳定版.zip:它到底解决什么问题
如果你手上有一个DedeCMS V5.6 正式最终稳定版.zip,大概率不是要研究它有多先进,而是要给一个老站做迁移、复刻、二次开发,或者接手别人留下的烂摊子。DedeCMS 是一套基于 PHP 的内容管理系统,V5.6 这个版本在当年属于正式最终稳定版,很多企业站、资讯站、下载站至今还跑着它。它的价值不在于技术多新,而在于模板体系成熟、后台功能完整、二次开发资料多,遇到问题能搜到答案。适合谁?适合需要快速搭一个内容型站点、又不想从零写后台的 PHP 开发者,也适合要维护存量老站的运维。但要注意,这个版本对 PHP 8 并不友好,直接扔进 php8 环境大概率报错,后面会讲怎么处理。
2. 环境选型与部署:PHP 版本、扩展和目录权限怎么定
2.1 为什么 PHP 8 跑 DedeCMS V5.6 容易翻车
DedeCMS V5.6 的代码大量使用了mysql_*系列函数和旧式ereg正则,这些在 PHP 7 以后就被移除或废弃了。你如果在 php8 环境里直接访问,最常见的是白屏或者Fatal error: Uncaught Error: Call to undefined function mysql_connect()。所以选型上,我一般会优先用 PHP 5.6 到 7.0 之间的版本,最稳的是 PHP 5.6,配合 MySQL 5.5 或 5.6。如果服务器只能装 PHP 7.x,那就需要打补丁,把mysql_*换成mysqli_*或者用兼容层,这个工作量不小,新手不建议硬上。
宝塔面板和小皮面板都能一键装 PHP 5.6,但要注意,宝塔在较新的系统上可能已经不再提供 PHP 5.6 的安装选项,这时候要么换系统镜像,要么用 Docker 自己拉一个php:5.6-apache镜像。用 Docker 的好处是环境隔离,不会污染宿主机,坏处是文件权限和网络配置要自己调。
2.2 用 Docker 跑通最小可访问环境
下面这个docker-compose.yml是我常用的最小组合,PHP 5.6 + MySQL 5.6 + Apache,挂载源码目录,改完代码直接生效。
version: '3' services: web: image: php:5.6-apache ports: - "8080:80" volumes: - ./dedecms:/var/www/html environment: - PHP_INI_DIR=/usr/local/etc/php command: > bash -c "docker-php-ext-install mysql mysqli gd && a2enmod rewrite && apache2-foreground" db: image: mysql:5.6 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: dedecms ports: - "3306:3306"逻辑说明:php:5.6-apache这个镜像自带 Apache,但默认没有装mysql和gd扩展,所以用docker-php-ext-install在启动时安装。a2enmod rewrite是为了开启 URL 重写,DedeCMS 的伪静态依赖它。volumes把当前目录下的dedecms文件夹挂到容器里,你解压后的文件放进去就行。
参数说明:MYSQL_ROOT_PASSWORD和MYSQL_DATABASE按需改,数据库主机填db,不是localhost。端口映射8080:80表示宿主机访问http://localhost:8080。如果 8080 被占用,改成其他端口。
启动命令:
docker-compose up -d然后浏览器打开http://localhost:8080/install/,按安装向导走。数据库地址填db,用户名root,密码root123,库名dedecms。
2.3 目录权限和安装目录删除
安装完成后,第一件事是删掉install目录,否则后台会一直提示安全风险。第二件事是检查data、uploads、html这几个目录的写权限。在 Docker 里,Apache 以www-data用户运行,所以需要:
docker exec -it <容器名> chown -R www-data:www-data /var/www/html/data docker exec -it <容器名> chown -R www-data:www-data /var/www/html/uploads docker exec -it <容器名> chown -R www-data:www-data /var/www/html/html如果你用的是宝塔,直接在文件管理里把权限改成 755,所有者改成www。注意不要图省事给 777,老版本 DedeCMS 本身就有不少历史漏洞,权限放开等于开门揖盗。
3. 数据库配置与后台跑通:从安装向导到登录后台
3.1 安装向导里容易填错的几个参数
安装向导第一步是环境检测,如果mysql扩展没装,这里会红。第二步填数据库信息,常见错误是把数据库主机填成localhost,在 Docker 里应该填db,在宝塔里填127.0.0.1。表前缀默认dede_,如果你一个库里要装多个 DedeCMS,改前缀就行,但改完要记住,后面配置文件里也是这个前缀。
第三步是填管理员账号和密码,还有后台目录。默认后台目录是dede,建议改成别的,比如manage2024,减少被扫描的风险。这个目录名在安装完成后也可以手动改,改完要同步改data/common.inc.php里的$cfg_admin_dir。
3.2 手动检查 data/common.inc.php
安装完成后,data/common.inc.php是核心配置文件,内容大概长这样:
<?php $cfg_dbhost = 'db'; $cfg_dbname = 'dedecms'; $cfg_dbuser = 'root'; $cfg_dbpwd = 'root123'; $cfg_dbprefix = 'dede_'; $cfg_db_language = 'utf8'; $cfg_admin_dir = 'manage2024'; ?>逻辑说明:这个文件是 DedeCMS 连接数据库的唯一入口,所有数据库操作都读这里。如果你迁移站点,只要把这个文件里的数据库信息改对,再把数据库导入,基本就能跑起来。
参数说明:$cfg_dbhost在 Docker 里是服务名db,在宝塔里通常是127.0.0.1。$cfg_db_language一般保持utf8,如果你的数据库是utf8mb4,这里也要改,否则中文可能乱码。$cfg_admin_dir必须和实际后台目录名一致,否则登录后台会 404。
3.3 登录后台和常见登录失败排查
后台地址是http://你的域名/后台目录/index.php。登录失败常见三种情况:一是密码错,可以用dede_admin表里的密码字段重置,DedeCMS 的密码是md5加盐,盐值在dede_admin表的pwd字段里,直接改比较麻烦,最简单的办法是重新安装一遍,或者用官方提供的密码重置工具。二是验证码不显示,通常是gd扩展没装,回到 Docker 里执行docker-php-ext-install gd然后重启容器。三是登录后空白,多半是 PHP 版本不兼容,看 Apache 错误日志,如果是mysql_*未定义,就说明 PHP 版本太高了。
提示:后台登录成功后,第一件事是去「系统」->「系统基本参数」里把网站根地址改对,否则前台链接和图片路径会错乱。
4. 模板机制与二次开发:标签、缓存和自定义字段
4.1 DedeCMS 模板标签的解析逻辑
DedeCMS 的模板不是纯 PHP,而是一套自己的标签系统,比如{dede:arclist typeid='1' row='10'}这种。它的解析过程是:前台请求 -> 读取模板文件 -> 用正则把标签替换成 PHP 代码 -> 编译成缓存文件放在data/tplcache目录 -> 执行缓存文件输出 HTML。所以你会遇到改了模板不生效的情况,这时候要清空data/tplcache目录,或者后台「生成」->「更新缓存」。
理解这个机制很重要,因为二次开发时你写的自定义标签也要走这套流程。常见做法是在include/taglib目录下新建一个.lib.php文件,比如mytag.lib.php,然后在模板里用{dede:mytag}调用。
4.2 写一个最简单的自定义标签
下面这个例子实现一个「输出最新 5 条文章标题」的标签,文件放在include/taglib/mylist.lib.php:
<?php if (!defined('DEDEINC')) exit('Request Error!'); function lib_mylist(&$ctag, &$refObj) { global $dsql; $row = $ctag->GetAtt('row'); if (empty($row)) $row = 5; $sql = "SELECT title, arcurl FROM `#@__archives` ORDER BY id DESC LIMIT $row"; $dsql->SetQuery($sql); $dsql->Execute(); $revalue = ''; while ($arr = $dsql->GetArray()) { $revalue .= '<li><a href="' . $arr['arcurl'] . '">' . $arr['title'] . '</a></li>'; } return $revalue; } ?>逻辑说明:lib_mylist是固定命名规则,mylist对应模板里的{dede:mylist}。$ctag->GetAtt('row')获取标签属性row的值。#@__archives是 DedeCMS 的表名占位符,执行时会自动替换成你配置的前缀。$dsql是全局数据库对象,直接用就行。
参数说明:row控制输出条数,默认 5。如果你要加排序字段,改ORDER BY后面的内容。注意 SQL 里不要直接拼用户输入,老版本 DedeCMS 的注入漏洞很多就是这么来的。
模板里这样调用:
<ul> {dede:mylist row='8'} </ul>改完模板后,去后台更新一下缓存,前台就能看到效果。
4.3 自定义字段和模型扩展
DedeCMS 允许你给文章加自定义字段,在后台「系统」->「SQL命令行工具」里执行ALTER TABLE加字段,然后去「核心」->「内容模型」里给对应模型添加字段。但要注意,自定义字段的值存在dede_addonarticle表里,不是主表。如果你在模板里直接调{dede:field.你的字段名/},需要确保当前模板是内容页模板,并且字段已经添加到模型里。
常见坑是字段名用了保留字,比如type、order,会导致 SQL 报错。我一般会加前缀,比如my_type、my_order。
5. 避坑与排查:老版本 DedeCMS 的五个血泪教训
5.1 现象:前台空白,后台正常
原因:PHP 版本过高,mysql_*函数不存在,但后台某些页面用了兼容写法所以能跑。 解决:降级到 PHP 5.6,或者全局搜索mysql_替换成mysqli_,但后者工作量大,容易漏。
5.2 现象:中文乱码,数据库里正常
原因:数据库连接字符集和页面字符集不一致。DedeCMS V5.6 默认用utf8,但有些环境默认latin1。 解决:在data/common.inc.php里加上$cfg_db_charset = 'utf8';,并在数据库连接后执行SET NAMES utf8。如果还不行,检查dede_archives表的字符集是不是utf8。
5.3 现象:上传图片失败,提示「文件类型不允许」
原因:php.ini里的upload_max_filesize和post_max_size太小,或者uploads目录没写权限。 解决:改php.ini把这两个值调到 20M 以上,然后给uploads目录写权限。如果用的是 Docker,改完要重启容器。
5.4 现象:伪静态规则不生效,链接还是动态的
原因:Apache 没开mod_rewrite,或者.htaccess文件没放对位置。 解决:Docker 里执行a2enmod rewrite,宝塔里在网站设置里开启伪静态,选择 DedeCMS 规则。.htaccess要放在网站根目录,不是 DedeCMS 子目录。
5.5 现象:后台登录提示「验证码错误」但明明输对了
原因:data/sessions目录没写权限,或者 PHP 的session.save_path不可写。 解决:给data/sessions目录 755 权限,所有者改成 Web 用户。如果还不行,在php.ini里把session.save_path指到一个可写目录。
6. 迁移与备份:把老站安全搬到新环境的实操技巧
迁移 DedeCMS 最稳的方式是「文件 + 数据库」一起搬,不要只搬数据库,因为data/common.inc.php和data/tplcache里的缓存文件会影响行为。我一般会先在新环境装一个干净的 DedeCMS V5.6,然后把老站的uploads、data(除了common.inc.php和tplcache)、templets覆盖过去,再导入数据库,最后改common.inc.php里的数据库信息。这样比直接打包整个目录再解压要干净,能避免旧缓存导致的玄学问题。
备份时,数据库用mysqldump:
mysqldump -u root -p dedecms > dedecms_backup.sql文件用tar:
tar -czf dedecms_files.tar.gz ./dedecms --exclude=./dedecms/data/tplcache恢复时,先建库,再导入:
mysql -u root -p dedecms < dedecms_backup.sql然后解压文件,改common.inc.php,清空data/tplcache,访问后台更新缓存。
一个验证迁移是否成功的小技巧:打开前台首页,按Ctrl+U看源码,搜索uploads路径,如果图片路径都是新域名,说明基本正常。如果还有旧域名,去数据库dede_sysconfig表里改cfg_basehost,或者后台「系统基本参数」里改网站根地址。
我自己的习惯是,迁移完成后先不急着切域名,用 hosts 绑定新环境测试一遍,确认后台能登录、前台能打开、图片能显示、伪静态生效,再切正式域名。这个习惯帮我省过好几次后悔药。希望帮到你。
本文还有配套的精品资源,点击获取