百度小程序与Dede网站如何实现数据同步?

99ANYc3cd6
预计阅读时长 33 分钟
位置: 首页 DEDE建站 正文

核心原理:数据是桥梁

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

百度小程序与dede网站同步
(图片来源网络,侵删)

你需要明确以下几点:

  1. :你需要同步哪些数据?通常是文章列表、文章详情、分类、商品信息等。
  2. 同步方向
    • 单向同步 (Dede -> 小程序):最常见,网站发布内容后,小程序自动或手动同步更新。
    • 双向同步 (Dede <-> 小程序):较少见,且更复杂,比如小程序用户评论、点赞等数据需要同步回网站数据库。
  3. 实时性要求
    • 实时同步:网站一发布,小程序马上就更新,对技术要求高。
    • 准实时同步:每隔一段时间(如每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 文件的目录。

百度小程序与dede网站同步
(图片来源网络,侵删)
  1. 通过 FTP 或服务器管理工具,在 DedeCMS 安装目录下创建一个文件夹,api
  2. 将此文件夹的权限设置为 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

百度小程序与dede网站同步
(图片来源网络,侵删)
<?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();
    }
});

进阶与优化

  1. 数据缓存:为了减轻 DedeCMS 数据库的压力,可以在小程序端对获取到的数据进行缓存,百度小程序提供了 swan.setStorageswan.getStorage API,可以设置一个较短的缓存时间(如5分钟),过期后再重新请求。

  2. 用户认证与数据提交:如果小程序需要向 DedeCMS 提交数据(如评论、留言),你可以在 API 接口中增加用户认证逻辑(如 Session 或 Token),然后创建新的 API 接口(如 action=add_comment),并在接口中处理数据入库的逻辑。

  3. 使用 RESTful 风格:可以将 API 设计得更规范,

    • GET /api/articles -> 获取文章列表
    • GET /api/articles/{id} -> 获取文章详情
    • POST /api/comments -> 提交评论
  4. 安全加固

    • HTTPS:务必为你的网站配置 SSL 证书,通过 https 访问 API,防止数据在传输过程中被窃听。
    • Token 机制:如上所示,使用动态 Token 或签名来验证请求的合法性。
    • 请求频率限制:可以在 API 接口中加入逻辑,限制单个 IP 或 Token 在单位时间内的请求次数,防止恶意攻击。

将百度小程序与 DedeCMS 网站同步,最佳实践是围绕“API”展开

  1. 规划:明确同步的数据和实时性要求。
  2. 后端开发:在 DedeCMS 中创建安全的 API 接口,封装好数据库查询逻辑,并返回标准化的 JSON 数据。
  3. 前端对接:在百度小程序中使用 swan.request 调用这些 API,处理数据并渲染到页面上。
  4. 优化与维护:引入缓存、HTTPS、用户认证等机制,确保系统的稳定、安全和高效。

虽然这需要一些后端开发的工作量,但从长远来看,这是最可靠、最易于维护和扩展的方案。

-- 展开阅读全文 --
头像
哪里可以下载C程序设计语言 第2版PDF?
« 上一篇 01-11
dede修改友情链接的织梦链怎么操作?
下一篇 » 01-11

相关文章

取消
微信二维码
支付宝二维码

目录[+]