理解 DedeCMS 的核心思想是关键:它不是一个静态的博客系统,而是一个动态生成静态内容的 CMS,这意味着,当你写一篇文章并点击“生成HTML”时,DedeCMS 会将数据库中的文章数据,通过一套模板系统,最终生成一个 .html 文件存放在服务器上。

DedeCMS 博客文章的“源码”可以分为三个层面:
- 数据库层面:文章的核心数据存储在哪里。
- PHP 业务逻辑层面:系统如何处理和调用这些数据。
- HTML 模板层面:最终呈现给用户的页面结构是什么样的。
下面我们逐一深入解析。
数据库层面:文章数据的核心
都存储在 DedeCMS 的数据库中,主要涉及以下几个核心表:
dede_archives (文章主表)
这是文章最核心的表,存储了文章的基本信息。
| 字段名 | 说明 | 示例 |
| :--- | :--- | :--- |
| id | 文章的唯一ID | 123 |
| typeid | 所属栏目的ID | 5 (对应“技术分享”栏目) |
| arcrank | 文章状态(0:正常, -1:草稿, -2:回收站) | 0 |
| click | 点击量 | 1024 | | 文章标题 | "DedeCMS 博客文章源码解析" |
| shorttitle | 文章短标题 | "DedeCMS源码解析" |
| litpic | 文章缩略图 | /uploads/2025/10/thumb_123.jpg |
| pubdate | 发布时间(时间戳) | 1697102400 |
| senddate | 提交时间(时间戳) | 1697102400 |
| mid | 发布会员的ID | 1 |
| description | | "本文详细解析了DedeCMS博客文章的源码结构..." |
| keywords | 文章关键词 | "DedeCMS,博客,源码,PHP" |
| ismake | 是否生成静态HTML(0:是, 1:否) | 0 |

dede_addonarticle (文章内容附加表)内容可能很长,为了优化数据库结构,正文内容被存放在这个附加表中。dede_archives 表通过 aid 字段与 dede_addonarticle 表的 aid 字段关联。
| 字段名 | 说明 |
|---|---|
aid |
关联到 dede_archives 表的 id |
body |
文章的完整HTML内容,这是正文的核心。 |
templet |
使用的文章内容模板(默认为空,使用全局模板) |
小结:一篇文章由 archives 表的元数据和 addonarticle 表的正文内容共同构成。
PHP 业务逻辑层面:数据的处理与调用
当你访问一篇文章(如 https://yourdomain.com/a/123.html)时,背后发生了一系列 PHP 操作。
URL 路由与解析
DedeCMS 的 URL 结构(如 /a/123.html)是通过 .htaccess 文件(Apache服务器)或 web.config(IIS服务器)进行伪静态处理的。
以 .htaccess 为例:

RewriteEngine On # ... 其他规则 ... RewriteRule ^a/(\d+).html$ /plus/view.php?aid=$1 [L]
这行规则的意思是:所有以 /a/数字.html 格式的请求,都交给 plus/view.php 文件处理,并将数字作为 aid 参数传递过去。
核心文件 plus/view.php
这是文章页面的入口文件,它的主要任务是:
- 接收参数:从 URL 中获取
aid(文章ID)。 - 查询数据库:根据
aid从dede_archives和dede_addonarticle表中读取文章的所有数据。 - 权限检查:检查文章是否发布、是否在回收站等。
- 更新点击量:每次访问时,
archives表中的click字段会自动加 1。 - 加载模板:确定使用哪个模板文件来渲染页面。
- 变量赋值:将查询到的文章数据(标题、内容、时间等)赋值给模板引擎。
- 解析并输出:调用模板引擎(通常是 DedeCMS 自定义的模板解析器),将 PHP 变量替换到模板中,最终生成 HTML 并输出到浏览器。
view.php 中的核心逻辑片段(伪代码):
// 1. 获取文章ID
$aid = isset($aid) && is_numeric($aid) ? $aid : 0;
// 2. 查询数据库
$row = $dsql->GetOne("SELECT * FROM `dede_archives` WHERE id = $aid");
if (!$row) {
// 文章不存在,显示404页面
ShowMsg('您请求的文章不存在!', '-', 0, 5000);
exit();
}
// 3. 更新点击量
$dsql->ExecuteNoneQuery("UPDATE `dede_archives` SET click=click+1 WHERE id=$aid");
// 4. 获取文章正文内容
$addRow = $dsql->GetOne("SELECT body FROM `dede_addonarticle` WHERE aid = $aid");
// 5. 准备模板变量
$GLOBALS['arcTitle'] = $row['title'];
$GLOBALS['arcBody'] = $addRow['body'];
// ... 其他变量如 $arcPubDate, $arcDescription 等 ...
// 6. 加载并解析模板
// 默认模板路径通常是 /templets/default/article_article.htm
$tplfile = $cfg_basedir.$cfg_templets_dir.'/'.$cfg_df_style.'/article_article.htm';
require_once(DEDEINC."/arc.partview.class.php");
$pv = new PartView();
$pv->SetTemplet($tplfile);
$pv->Display();
HTML 模板层面:最终页面的结构
这是你在后台“模板管理”里可以编辑和修改的文件,默认情况下,文章页面的模板是 templets/default/article_article.htm。
这个模板文件是 HTML 和 DedeCMS 特定标签的混合体。
article_article.htm 模板结构示例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">{dede:field.title/} - {dede:global.cfg_webname/}</title>
<meta name="description" content="{dede:field.description function='html2text(@me)'/}">
<meta name="keywords" content="{dede:field.keywords/}">
</head>
<body>
<div class="header">
<!-- 网站头部,通常包含导航等 -->
</div>
<div class="main-content">
<!-- 文章标题 -->
<h1>{dede:field.title/}</h1>
<!-- 文章元信息(发布时间、点击量、作者等) -->
<div class="article-info">
<span>发布时间:{dede:field.pubdate function='MyDate('Y-m-d H:i:s', @me)'/}</span>
<span>点击量:<script src="{dede:field name='click'/}"></script></span>
<!-- 其他信息... -->
</div>
<!-- 文章正文内容 -->
<div class="article-content">
{dede:field.body/}
</div>
<!-- 文章页脚(上一篇/下一篇链接) -->
<div class="article-page">
<div class="pre">
{dede:prenext get='pre'/}
</div>
<div class="next">
{dede:prenext get='next'/}
</div>
</div>
<!-- 文章评论 -->
<div class="article-comment">
{dede:include filename="comment.htm"/}
</div>
</div>
<div class="footer">
<!-- 网站底部 -->
</div>
</body>
</html>
模板标签解析
{dede:field.title/}:输出文章标题,等同于 PHP 中的$row['title']。{dede:field.body/}:最核心的标签,输出文章的完整 HTML 正文,等同于 PHP 中的$addRow['body']。{dede:field.pubdate function='MyDate('Y-m-d H:i:s', @me)'/}:输出发布时间,并使用MyDate函数将时间戳格式化为可读的日期字符串。{dede:prenext get='pre'/}:输出上一篇文章的链接。{dede:include filename="comment.htm"/}:包含评论页面的模板,这是一个独立的模板文件。
总结与修改建议
| 层面 | 核心文件/表 | 作用 | 如何修改 |
|---|---|---|---|
| 数据库 | dede_archives, dede_addonarticle |
存储文章所有数据 | 不要直接手动修改! 应通过后台“内容管理”进行增删改。 |
| PHP逻辑 | plus/view.php |
处理请求、查询数据、调用模板 | 高级开发者修改,例如自定义字段处理逻辑、修改URL规则等。 |
| HTML模板 | templets/default/article_article.htm |
定义文章页面的最终样式和结构 | 最常修改,通过后台“模板管理”即可修改,实现网站风格定制。 |
如果你想修改 DedeCMS 博客文章的样式,主要操作就是编辑 article_article.htm 模板文件,调整其中的 HTML、CSS 和标签位置。
如果你想增加新的文章字段(如“文章来源”、“推荐等级”),则需要:
- 修改数据库:在
dede_archives或dede_addonarticle表中添加新字段。 - 修改后台模板:在
templets/default/article_add.htm(添加文章页) 和templets/default/article_edit.htm(编辑文章页) 中添加表单输入框。 - 修改PHP处理文件:修改
dede/content_add.php和dede/content_edit.php等文件,处理新字段的提交和更新。
希望这个详细的解析能帮助你完全理解 DedeCMS 博客文章的源码结构!
