核心思路与原理

在开始之前,我们需要理解整合的核心原理:

dede整合ecshop教程
(图片来源网络,侵删)
  1. 共享用户表:Dede 和 EcsShop 都有自己的用户表 (dede_memberecs_users),整合的关键就是让这两个表共享数据。
  2. 统一登录流程
    • 当用户在 Dede 站点登录时,除了在 Dede 的 session 中记录登录状态,我们还会额外执行一段代码,将用户信息写入 EcsShop 的 session,并设置 EcsShop 的 cookie,从而实现 EcsShop 站点的“自动登录”。
    • 反之,在 EcsShop 登录时,同样执行代码,让用户在 Dede 站点也“自动登录”。
  3. 统一注册流程
    • 我们将隐藏 EcsShop 的注册入口,所有用户都必须通过 Dede 的注册页面进行注册。
    • 当用户在 Dede 注册时,除了向 dede_member 表插入数据,我们还会同时向 ecs_users 表插入一条完全对应的用户记录。

准备工作

  1. 环境:一个本地或线上的 PHP + MySQL 环境。
  2. 程序
    • DedeCMS:建议使用稳定版本,如 V5.7 或 V5.8 SP1。
    • EcsShop:建议使用稳定版本,如 V4.1.0 或 V4.1.2。
  3. 目录结构:为了方便管理,我们采用 “同目录级” 的安装方式。
    • 将 DedeCMS 解压到网站根目录,此时根目录下有 dede/ 文件夹。
    • 将 EcsShop 解压到网站根目录,此时根目录下有 ecs/ 文件夹。
    • 最终的目录结构如下:
      /wwwroot/ (网站根目录)
      ├── /dede/      (DedeCMS 程序目录)
      ├── /ecs/       (EcsShop 程序目录)
      ├── /data/      (DedeCMS 数据目录,权限设置为 755 或 777)
      ├── ...
      └── index.php   (网站首页,可以指向 dede 或 ecs)

第一步:数据库准备与用户表结构统一

这是最关键的一步,我们需要确保两个用户表的核心字段能够对应起来。

  1. 安装 DedeCMS:正常安装 DedeCMS,记下数据库名、用户名、密码。
  2. 安装 EcsShop使用与 DedeCMS 完全相同的数据库名、用户名、密码 进行安装,安装时,EcsShop 会自动创建自己的数据表,包括 ecs_users
  3. 分析表结构
    • DedeCMS 用户表 (dede_member)
      • uid (用户ID, int)
      • userid (用户名, varchar)
      • pwd (密码, varchar, MD5加密)
      • email (邮箱, varchar)
      • uname (昵称, varchar)
      • mtype (会员类型, varchar)
      • jointime (注册时间, int)
      • logintime (登录时间, int)
      • loginip (登录IP, varchar)
    • EcsShop 用户表 (ecs_users)
      • user_id (用户ID, int)
      • user_name (用户名, varchar)
      • password (密码, varchar, MD5加密)
      • email (邮箱, varchar)
      • user_rank (用户等级, int)
      • reg_time (注册时间, int)
      • last_login (最后登录时间, int)
      • last_ip (最后登录IP, varchar)

两个字段名不同,但含义和类型基本可以一一对应。


第二步:修改 DedeCMS,实现统一注册和登录

我们需要修改 DedeCMS 的核心文件,让它在处理用户注册和登录时,同时操作 ecs_users 表。

1 修改用户注册文件 (member/reg_new.php)

找到 DedeCMS 根目录下的 member/reg_new.php 文件。

dede整合ecshop教程
(图片来源网络,侵删)
  1. 查找并修改用户数据处理部分: 在文件中找到类似 $inpwd = md5($password); 的代码段,这是在处理用户提交的数据。

  2. 在插入 Dede 数据库之前,添加插入 EcsShop 数据库的代码

    // ... DedeCMS 原有代码,获取用户信息 $mid, $mname, $mpwd, $memail 等 ...
    // --- 以下是新增的 EcsShop 数据插入代码 ---
    // 1. 引入 EcsShop 的数据库配置文件
    require_once(dirname(__FILE__) . '/../ecs/config.php');
    // 2. 准备 EcsShop 需要的数据
    $ecs_user_name = $mname; // 用户名
    $ecs_password = $mpwd;   // 密码 (已经是MD5格式)
    $ecs_email = $memail;    // 邮箱
    $ecs_reg_time = time();   // 注册时间戳
    $ecs_user_rank = '0';    // 默认用户等级,根据你的EcsShop设置
    // 3. 执行 SQL 插入到 ecs_users 表
    // 注意:这里使用了 SQL 语句,确保你的 ECS 表前缀是 'ecs_',如果不是,请修改。
    $sql = "INSERT INTO `ecs_users` (user_name, password, email, reg_time, user_rank) VALUES ('{$ecs_user_name}', '{$ecs_password}', '{$ecs_email}', '{$ecs_reg_time}', '{$ecs_user_rank}')";
    $dsql->Execute('ecs', $sql); // 使用 Dede 的数据库执行对象
    // --- 新增代码结束 ---
    // ... DedeCMS 原有代码,执行向 dede_member 表插入数据的操作 ...

说明

  • require_once('../ecs/config.php');:引入 EcsShop 的数据库配置,这样 $dsql->Execute('ecs', $sql) 中的 'ecs' 参数会使用 config.php 中定义的 $cfg_dbprefix (即 'ecs_') 作为表前缀。
  • 确保字段名和变量名正确对应。

2 修改用户登录文件 (member/index_do.php)

找到 DedeCMS 根目录下的 member/index_do.php 文件,这个文件处理登录请求。

  1. 找到登录成功后的代码块:通常在 if($dlogin == 1) 条件判断内部。

  2. 在 Dede 设置登录 Session 之后,添加设置 EcsShop 登录状态的代码

    // ... DedeCMS 原有代码,登录成功后 ...
    // $cfg_ml->PutLoginInfo($uid); ...
    // --- 以下是新增的 EcsShop 登录同步代码 ---
    // 1. 引入 EcsShop 的数据库配置和公共函数库
    require_once(dirname(__FILE__) . '/../ecs/config.php');
    require_once(dirname(__FILE__) . '/../ecs/includes/lib_passport.php');
    // 2. 获取当前登录用户信息
    $user_id = $uid; // Dede 的 uid
    $user_name = $cfg_ml->M_UserName; // Dede 的用户名
    $email = $cfg_ml->M_Email; // Dede 的邮箱
    // 3. 调用 EcsShop 的函数同步登录
    // 这会自动在 EcsShop 的 session 中写入用户信息,并设置 cookie
    if (function_exists('syncLogin')) {
        syncLogin($user_id); // EcsShop 的 passport 函数需要 user_id
    }
    // --- 新增代码结束 ---
    // ... DedeCMS 原有代码,跳转到登录成功页面 ...
    // ShowMsg('成功登录,正在进入...', $gourl, 0, 2000);

说明

  • lib_passport.php 是 EcsShop 处理用户登录的核心文件,里面包含了 syncLogin() 等关键函数。
  • 这样,当用户在 Dede 登录后,EcsShop 的 session 也会被激活,实现无缝跳转。

第三步:修改 EcsShop,实现反向登录同步

我们需要让用户在 EcsShop 登录后,也能在 Dede 站点自动登录。

1 修改 EcsShop 登录文件 (user.php)

找到 EcsShop 根目录下的 user.php 文件。

  1. 找到登录成功的处理逻辑:通常在 if ($_REQUEST['act'] == 'login') 分支中,找到 $user->login() 函数调用之后。

  2. 在 EcsShop 设置登录 Session 之后,添加设置 Dede 登录状态的代码

    // ... EcsShop 原有代码 ...
    // $user->login($username, $password, $remember); ...
    // 登录成功后,会设置 ECS 的 session
    // --- 以下是新增的 Dede 登录同步代码 ---
    // 1. 引入 DedeCMS 的数据库配置文件
    // 注意路径,从 ecs 目录看 dede 目录
    require_once(dirname(__FILE__) . '/../dede/config.php');
    // 2. 获取当前登录用户信息 (从 ECS 的 session 中获取)
    $ecs_user_id = $_SESSION['user_id']; // EcsShop 的 user_id
    $ecs_user_name = $_SESSION['user_name']; // EcsShop 的 user_name
    // 3. 查询 DedeCMS 的用户ID (因为两个表的ID可能不同)
    $dede_uid = $dsql->GetOne("SELECT uid FROM `dede_member` WHERE userid = '{$ecs_user_name}'");
    if (is_array($dede_uid)) {
        $dede_uid = $dede_uid['uid'];
        // 4. 模拟 DedeCMS 的登录过程
        // DedeCMS 的登录信息存储在 $_SESSION['member_V'] 中
        $_SESSION['member_V'] = array(
            'm_ID' => $dede_uid,
            'm_LoginTime' => time(),
            'm_LoginID' => $ecs_user_name
        );
        // 5. 设置 DedeCMS 的 cookie (如果它有设置的话)
        // DedeCMS 的登录由其内部类处理,设置 session 即可。
        // 如果需要 cookie,可以查看 Dede 登录代码,复制相关逻辑。
    }
    // --- 新增代码结束 ---
    // ... EcsShop 原有代码,跳转到登录成功页面 ...
    // ecs_header("Location: user.php\n");

第四步:统一注册入口(可选但推荐)

为了更好的用户体验,我们应该隐藏 EcsShop 的注册页面,强制所有用户通过 DedeCMS 注册。

  1. 修改 EcsShop 模板

    • 打开 EcsShop 的模板文件,themes/default/library/register.lbi (或对应的 .dwt 文件)。
    • 找到注册表单,将其替换为一个指向 DedeCMS 注册页面的链接或提示信息。
    • <form action="user.php?act=act_register">...</form> 替换为:
      <div style="text-align: center; padding: 20px;">
          <p>新用户请先在网站首页进行注册。</p>
          <a href="/dede/member/reg_new.php">点击这里注册</a>
      </div>
  2. 修改 EcsShop 逻辑

    • 打开 user.php,找到 act_register 的处理部分。
    • 在最前面添加一行代码,直接跳转到 Dede 的注册页面:
      // 在 case 'register': 的开头
      case 'register':
          // 强制跳转到 Dede 注册页面
          ecs_header("Location: /dede/member/reg_new.php\n");
          exit;
          break;

第五步:测试与注意事项

  1. 测试流程

    • 注册测试:访问 Dede 的注册页面,注册一个新用户,然后去 EcsShop 的数据库 ecs_users 表中查看,是否成功插入了数据。
    • Dede 登录测试:用新注册的用户在 Dede 登录,然后直接访问 EcsShop 的任何需要登录的页面(如“我的账户”),看是否已经自动登录。
    • Ecs 登录测试:退出登录,用该用户在 EcsShop 登录,然后访问 Dede 的会员中心,看是否已经自动登录。
    • 退出登录测试:在一个站点退出登录,然后访问另一个站点,看是否也已退出。
  2. 重要注意事项

    • 备份!备份!备份! 在修改任何核心文件之前,务必备份原始文件和数据库。
    • 密码加密:本教程默认双方都使用 MD5 加密,如果一方使用 MD5+盐值等更复杂的加密方式,则需要编写额外的密码转换函数,这会使整合变得非常复杂。
    • Session 冲突:确保 Dede 和 EcsShop 的 Session 名称(session_name())不冲突,否则会互相干扰,通常默认情况下不会有问题。
    • Cookie 域名:确保两个系统都在同一个主域名下,这样 cookie 才能共享。www.example.com/dedewww.example.com/ecs
    • 升级问题:未来如果升级 Dede 或 EcsShop,这些修改过的文件可能会被覆盖,届时需要重新进行修改。
    • 代码兼容性:不同版本的 Dede/EcsShop 文件路径和代码结构可能略有不同,本教程提供的是通用思路,请根据你实际下载的版本进行微调。

高级与扩展

  • 统一退出登录:可以参考登录同步的思路,修改 Dede 和 EcsShop 的退出登录文件,让在一处退出时,另一处也清除 session。
  • 单点登录 (SSO):如果网站结构更复杂(如多个子域名),可以考虑使用专业的 SSO 解决方案,这通常需要更复杂的架构设计,如使用中央认证中心。

这份教程涵盖了从原理到实践的完整流程,希望能帮助你成功整合 DedeCMS 和 EcsShop,如果在操作中遇到具体问题,可以提供错误信息,我们可以进一步探讨。