核心原理:数据是桥梁
无论采用哪种技术方案,其核心思想都是一样的:将 DedeCMS 网站的数据库作为“单一数据源”,百度小程序通过某种方式从这个数据源获取数据,或者 DedeCMS 将数据主动推送到小程序。

你需要明确以下几点:
- :你需要同步哪些数据?通常是文章列表、文章详情、分类、商品信息等。
- 同步方向:
- 单向同步 (Dede -> 小程序):最常见,网站发布内容后,小程序自动或手动同步更新。
- 双向同步 (Dede <-> 小程序):较少见,且更复杂,比如小程序用户评论、点赞等数据需要同步回网站数据库。
- 实时性要求:
- 实时同步:网站一发布,小程序马上就更新,对技术要求高。
- 准实时同步:每隔一段时间(如每5分钟、每小时)同步一次,技术上简单,用户体验稍差。
- 手动同步:管理员在后台点击一个按钮进行同步,最简单,但不够自动化。
主流同步方案对比
| 方案 | 实现方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| API 接口方案 (推荐) | 在 DedeCMS 中开发一个或多个 API 接口,小程序通过 HTTP 请求调用这些接口获取数据。 | 解耦度高:网站和小程序完全独立,互不影响。 灵活性高:可以精确控制返回给小程序的数据格式。 可扩展性强:未来可以轻松对接其他平台(如微信、App)。 数据安全可控:可以设置接口密钥、权限验证。 |
开发成本较高:需要一定的后端开发能力来编写 API。 需要额外服务器:DedeCMS 是虚拟主机,可能不支持复杂的 API 服务。 |
绝大多数项目,特别是对数据结构、性能有要求的项目。 |
| 数据库直连方案 | 小程序直接连接 DedeCMS 的数据库,进行数据读取。 | 性能最高:直接读写数据库,没有中间环节。 实现简单(理论上):如果数据库在同一内网,直接连接即可。 |
极度不安全:暴露了数据库地址、用户名、密码,风险极高。 耦合性极强:数据库结构一变,小程序代码就必须跟着改。 环境限制大:小程序服务器通常无法直接访问网站的数据库。 |
不推荐,仅适用于开发测试阶段,或在内网绝对安全的封闭环境中。 |
| 定时任务/爬虫方案 | 编写一个独立的脚本(如 Python、PHP),通过定时任务(如 Crontab)定期访问 DedeCMS 网站,解析 HTML 页面或直接读取数据库,然后将数据转换成小程序需要的格式,并保存到小程序自己的数据库或通过小程序提供的接口写入。 | 技术实现灵活:可以使用任何语言编写脚本。 解耦:不直接修改 DedeCMS 代码。 |
实现复杂:需要处理页面解析、数据清洗、编码转换等问题。 维护成本高:脚本需要持续维护,特别是当 DedeCMS 模板或结构变化时。 实时性差:依赖定时任务的频率。 |
DedeCMS 无法修改或无法提供 API 的“遗留”系统,或者需要将数据同步到多个不同平台时。 |
强烈推荐使用方案一(API 接口方案),它是最专业、最稳定、最安全、最具扩展性的解决方案。
方案一:API 接口方案详细实施步骤
我们将以最常见的需求——同步文章列表和文章详情为例,进行详细说明。
第 1 步:在 DedeCMS 后台创建 API 专用目录
为了安全和管理方便,不要把 API 文件放在网站根目录,我们创建一个专门用于存放 API 文件的目录。

- 通过 FTP 或服务器管理工具,在 DedeCMS 安装目录下创建一个文件夹,
api。 - 将此文件夹的权限设置为
755(Linux/Unix)或仅允许网站程序读写(Windows)。
你的网站根目录/
├── api/ <-- 新建这个文件夹
├── dede/ <-- 后台管理目录
├── uploads/ <-- 上传文件目录
└── ...
第 2 步:创建 API 入口文件
在 api 文件夹中,创建一个入口文件,index.php,这个文件将用于处理所有的 API 请求。
api/index.php
<?php
/**
* DedeCMS API 入口文件
* 接收来自小程序的请求,并分发到对应的处理文件
*/
// 1. 安全设置:防止直接访问
if (!defined('DEDEROOT')) {
// 引入 DedeCMS 的核心文件,确保常量已定义
// 根据你的实际路径调整
require_once '../include/common.inc.php';
}
// 2. 获取请求的参数,action=article_list
$action = isset($_GET['action']) ? trim($_GET['action']) : '';
// 3. 根据不同的 action 分发请求
switch ($action) {
case 'article_list':
// 引入文章列表处理逻辑
require_once 'article_list.php';
break;
case 'article_detail':
// 引入文章详情处理逻辑
require_once 'article_detail.php';
break;
default:
// 如果没有匹配的 action,返回错误信息
$response = [
'code' => 404,
'msg' => 'API 接口不存在',
'data' => null
];
header('Content-Type: application/json; charset=utf-8');
echo json_encode($response, JSON_UNESCAPED_UNICODE);
break;
}
?>
第 3 步:创建具体的 API 处理文件(以文章列表为例)
在 api 文件夹中创建 article_list.php 文件。
api/article_list.php

<?php
/**
* 获取文章列表 API
*/
// 1. 引入 DedeCMS 的数据库操作类
require_once '../include/dedehtml2.php'; // 引入必要的文件
// 或者更直接的方式
require_once '../data/common.inc.php'; // 引入数据库配置
require_once '../include/dedesql.class.php'; // 引入SQL类
// 2. 安全验证(非常重要!)
// 这里使用一个简单的 token 验证,实际项目中应更复杂(如 OAuth2.0)
$token = isset($_GET['token']) ? trim($_GET['token']) : '';
$valid_token = 'YOUR_SECRET_API_TOKEN'; // 请设置一个复杂的、不易猜测的密钥
if ($token !== $valid_token) {
$response = [
'code' => 403,
'msg' => 'API 访问令牌无效',
'data' => null
];
header('Content-Type: application/json; charset=utf-8');
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit();
}
// 3. 获取分页参数
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$pagesize = isset($_GET['pagesize']) ? intval($_GET['pagesize']) : 10;
$offset = ($page - 1) * $pagesize;
// 4. 查询 DedeCMS 数据库
// 这里直接使用原生的 SQL 查询,确保灵活性
// 注意:`dede_archives` 是文章主表,`dede_arctype` 是栏目表
$sql = "SELECT a.id, a.title, a.pubdate, a.click, t.typename, t.id as typeid
FROM `#@__archives` a
LEFT JOIN `#@__arctype` t ON a.typeid = t.id
ORDER BY a.id DESC
LIMIT {$offset}, {$pagesize}";
$dsql = new DedeSql(false);
$dsql->SetQuery($sql);
$dsql->Execute('list');
$articles = [];
while ($row = $dsql->GetArray('list')) {
// 格式化数据,方便小程序使用
$articles[] = [
'article_id' => $row['id'],
'title' => $row['title'],
'pubdate' => date('Y-m-d H:i:s', $row['pubdate']),
'click' => $row['click'],
'category' => $row['typename'],
'category_id' => $row['typeid'],
// 可以在这里拼接文章封面图,通常在附加表 dede_addonarticle 中
// 'cover_image' => '你的图片域名' . $row['litpic'],
];
}
// 5. 返回 JSON 格式的数据
$response = [
'code' => 200,
'msg' => '获取成功',
'data' => [
'list' => $articles,
'page' => $page,
'pagesize' => $pagesize,
'total' => $dsql->GetTotalRow('list') // 获取总记录数,用于小程序分页
]
];
header('Content-Type: application/json; charset=utf-8');
echo json_encode($response, JSON_UNESCAPED_UNICODE);
// 关闭数据库连接
$dsql->Close();
?>
api/article_detail.php
这个文件类似,接收一个 id 参数,然后去 #@__archives 和 #@__addonarticle (文章内容附加表) 中查询对应的文章详情,并返回。
第 4 步:小程序端调用 API
你的 DedeCMS 站点已经准备好了一个 API 接口,
https://www.yourwebsite.com/api/index.php?action=article_list&page=1&pagesize=10&token=YOUR_SECRET_API_TOKEN
在百度小程序的 JS 文件中,你可以使用 swan.request 来调用这个接口。
小程序 JS 示例 (pages/index/index.js)
Page({
data: {
articleList: [],
page: 1,
hasMore: true
},
onLoad: function () {
this.loadArticleList();
},
// 加载文章列表
loadArticleList: function() {
if (!this.data.hasMore) return;
swan.request({
url: 'https://www.yourwebsite.com/api/index.php', // 你的 API 地址
data: {
action: 'article_list',
page: this.data.page,
pagesize: 10,
token: 'YOUR_SECRET_API_TOKEN' // 与后端设置的 token 一致
},
method: 'GET',
success: (res) => {
if (res.data.code === 200) {
const newList = res.data.data.list;
if (newList.length > 0) {
this.setData({
'articleList': this.data.articleList.concat(newList),
'page': this.data.page + 1
});
// 如果返回的列表数小于请求的 pagesize,说明没有更多数据了
if (newList.length < 10) {
this.setData({
hasMore: false
});
}
} else {
this.setData({
hasMore: false
});
}
} else {
swan.showToast({
title: res.data.msg || '获取数据失败',
icon: 'none'
});
}
},
fail: (err) => {
console.error('请求失败', err);
swan.showToast({
title: '网络请求失败',
icon: 'none'
});
}
});
},
// 下拉刷新
onPullDownRefresh: function() {
this.setData({
articleList: [],
page: 1,
hasMore: true
});
this.loadArticleList().then(() => {
swan.stopPullDownRefresh();
});
},
// 上拉加载更多
onReachBottom: function() {
this.loadArticleList();
}
});
进阶与优化
-
数据缓存:为了减轻 DedeCMS 数据库的压力,可以在小程序端对获取到的数据进行缓存,百度小程序提供了
swan.setStorage和swan.getStorageAPI,可以设置一个较短的缓存时间(如5分钟),过期后再重新请求。 -
用户认证与数据提交:如果小程序需要向 DedeCMS 提交数据(如评论、留言),你可以在 API 接口中增加用户认证逻辑(如 Session 或 Token),然后创建新的 API 接口(如
action=add_comment),并在接口中处理数据入库的逻辑。 -
使用 RESTful 风格:可以将 API 设计得更规范,
GET /api/articles-> 获取文章列表GET /api/articles/{id}-> 获取文章详情POST /api/comments-> 提交评论
-
安全加固:
- HTTPS:务必为你的网站配置 SSL 证书,通过
https访问 API,防止数据在传输过程中被窃听。 - Token 机制:如上所示,使用动态 Token 或签名来验证请求的合法性。
- 请求频率限制:可以在 API 接口中加入逻辑,限制单个 IP 或 Token 在单位时间内的请求次数,防止恶意攻击。
- HTTPS:务必为你的网站配置 SSL 证书,通过
将百度小程序与 DedeCMS 网站同步,最佳实践是围绕“API”展开。
- 规划:明确同步的数据和实时性要求。
- 后端开发:在 DedeCMS 中创建安全的 API 接口,封装好数据库查询逻辑,并返回标准化的 JSON 数据。
- 前端对接:在百度小程序中使用
swan.request调用这些 API,处理数据并渲染到页面上。 - 优化与维护:引入缓存、HTTPS、用户认证等机制,确保系统的稳定、安全和高效。
虽然这需要一些后端开发的工作量,但从长远来看,这是最可靠、最易于维护和扩展的方案。
