整合的关键在于打通两个系统的用户数据表,当用户在 DedeCMS 中注册或登录时,Discuz! 的数据库也相应地执行操作,反之亦然,这通常通过修改注册和登录的代码文件,并引入 Discuz! 的核心函数库来实现。

第一部分:准备工作(非常重要!)
在开始任何修改之前,请务比做好以下准备工作,否则一旦出错,数据恢复将非常困难。
-
环境确认:
- DedeCMS 5.7 (GBK 或 UTF-8 版本,本教程以 GBK 为例,UTF-8 只需注意字符编码一致即可)
- Discuz! 7.2 (必须与 DedeCMS 的编码版本一致,即 Dede 是 GBK,Discuz 也必须是 GBK)
- PHP 5.2+ / MySQL 5.0+
- 支持 Rewrite 的 Web 服务器 (如 Apache/Nginx)
-
文件备份:
- 完整备份你的网站所有文件到本地。
- 完整备份你的网站数据库(导出为 SQL 文件)。
-
安装位置:
(图片来源网络,侵删)- 强烈建议将 Discuz! 安装在 DedeCMS 的一个子目录下。
- DedeCMS 根目录:
/wwwroot/ - Discuz! 根目录:
/wwwroot/bbs/
- DedeCMS 根目录:
- 这种方式可以简化后续的配置和路径处理。
- 强烈建议将 Discuz! 安装在 DedeCMS 的一个子目录下。
第二部分:整合步骤
步骤 1:修改 Discuz! 配置文件
我们需要让 Discuz! 的数据库配置与 DedeCMS 保持一致,并开启整合接口。
-
打开 Discuz! 配置文件:
- 进入你的 Discuz! 安装目录(
/wwwroot/bbs/)。 - 找到并打开
config.inc.php文件。
- 进入你的 Discuz! 安装目录(
-
修改数据库配置:
- 找到数据库连接信息部分,将其修改为与你的 DedeCMS
data/common.inc.php文件中完全一致的信息。 -
// 在 config.inc.php 中找到并修改以下内容 $_config['db']['1']['dbhost'] = 'localhost'; // 数据库地址 $_config['db']['1']['dbuser'] = 'your_db_user'; // 数据库用户名 $_config['db']['1']['dbpw'] = 'your_db_password'; // 数据库密码 $_config['db']['1']['dbname'] = 'your_db_name'; // 数据库名 $_config['db']['1']['tablepre'] = 'pre_'; // Discuz 表前缀,建议保持默认
- 找到数据库连接信息部分,将其修改为与你的 DedeCMS
-
开启 UCenter:
(图片来源网络,侵删)- 虽然我们不使用 UCenter 的 Web 管理界面,但必须启用它的底层功能来整合用户。
- 在
config.inc.php中找到 UC 配置部分,确保ucenabled为1。 -
// 找到以下行 $_config['uc']['_allow'] = '1'; $_config['uc']['enabled'] = '1'; // 确保这个是 1 // 后面的 URL、IP 等配置可以先随便填,因为我们不启动 UCenter 服务 // $_config['uc']['apppath'] = 'http://www.yourdomain.com/bbs/'; // Discuz 的安装目录 $_config['uc']['appdir'] = 'http://www.yourdomain.com/bbs/'; $_config['uc']['connect'] = '0';
-
保存并关闭
config.inc.php。
步骤 2:修改 DedeCMS 的注册文件
目标是让 DedeCMS 在用户注册成功后,自动调用 Discuz! 的注册函数。
-
找到 DedeCMS 注册文件:
- 进入 DedeCMS 根目录(
/wwwroot/)。 - 找到
member/reg_new.php文件。
- 进入 DedeCMS 根目录(
-
在文件末尾添加 Discuz! 注册代码:
- 用文本编辑器打开
reg_new.php。 - 找到文件末尾的
ShowMsg()函数调用,它通常在注册成功之后。 - 在
ShowMsg()函数之前,添加以下代码:
// 引入 Discuz! 的核心函数库 // 注意:这里的路径是相对于 DedeCMS 根目录的 require_once(dirname(__FILE__).'/bbs/ucenter_client/client.php'); // 准备 Discuz! 注册所需的数据 $uid = $_POST['userid']; // DedeCMS 的用户名字段 $password = $_POST['pwd']; // DedeCMS 的密码字段 (MD5) $email = $_POST['email']; // DedeCMS 的邮箱字段 // 调用 Discuz! 的用户注册接口 // 注意:Discuz! 7.2 的用户名和密码字段可能不同,这里需要根据实际情况调整 // Discuz! 的用户名是 username,密码是 password $synuser = array( 'uid' => $uid, 'username' => $uid, 'password' => $password, 'email' => $email ); // 调用 UCenter 的用户注册方法 // 注意:这里需要使用正确的 Discuz! 应用 ID // 在 Discuz! 的 UCenter 设置中,DedeCMS 应该是一个应用,其 appid 通常为 1 (默认) // 如果不确定,可以先不传 $appid,或者查看 ucenter_client 中的函数定义 uc_user_register($uid, $password, $email); - 用文本编辑器打开
-
保存并关闭
reg_new.php。
步骤 3:修改 DedeCMS 的登录文件
目标是让 DedeCMS 在用户登录成功后,自动同步到 Discuz!。
-
找到 DedeCMS 登录文件:
- 进入 DedeCMS 根目录。
- 找到
member/index_do.php文件(这是处理登录动作的文件)。
-
在登录成功后添加 Discuz! 登录代码:
- 打开
index_do.php。 - 找到登录成功的逻辑部分,通常是一个
ShowMsg()跳转,ShowMsg('成功登录,正在进入...',$gourl,0);。 - 在这个
ShowMsg()之前,添加以下代码:
// 引入 Discuz! 的核心函数库 require_once(dirname(__FILE__).'/bbs/ucenter_client/client.php'); // 获取当前登录的用户信息 // $uid 和 $pwd 变量需要在登录验证成功后、跳转前获取到 // 通常在验证登录的 SQL 查询之后,$userid 和 $pwd 变量已经存在 $uid = $userid; // DedeCMS 的用户名 $password = $pwd; // DedeCMS 的密码 (MD5) // 调用 Discuz! 的用户登录接口 // 这个函数会更新 Discuz! 中用户的最后登录时间和 IP uc_user_synlogin($uid);
注意:
$userid和$pwd这两个变量名需要根据你index_do.php文件中的实际变量名来定,通常在执行dede_checkuser($userid, $pwd)函数后,这些变量就已经可用。 - 打开
-
保存并关闭
index_do.php。
步骤 4:修改 Discuz! 的登录文件
目标是让 Discuz! 的登录也能同步回 DedeCMS。
-
找到 Discuz! 登录文件:
- 进入你的 Discuz! 目录(
/wwwroot/bbs/)。 - 找到
logging.php文件。
- 进入你的 Discuz! 目录(
-
在登录成功后添加 DedeCMS 登录代码:
- 打开
logging.php。 - 找到处理登录成功的
switch($action)中的login分支。 - 在
setcookie和showmessage等操作之后,添加以下代码:
// 引入 DedeCMS 的数据库配置,以便直接操作 // 路径是相对于 Discuz! 根目录的 require_once(dirname(__FILE__).'/../../data/common.inc.php'); // 获取登录成功的用户信息 // Discuz! 在登录成功后,会将用户信息存入 $_DCOOKIE['uid'] 等 $discuz_uid = $_DCOOKIE['uid']; $discuz_username = $_DCOOKIE['auth']; // 注意:auth 是加密串,需要解密或从数据库查询 // 更安全的做法是:通过 Discuz! 的用户ID,从数据库中查询出用户名和密码 // 然后更新 DedeCMS 的 dede_member 表的 `mlogintime` 和 `mloginip` 字段 // 这里提供一个简单的示例,直接更新登录时间 if($discuz_uid) { $dsql = new DedeSql(false); $now_time = time(); $now_ip = GetIP(); $query = "UPDATE dede_member SET mlogintime='$now_time', mloginip='$now_ip' WHERE mid='$discuz_uid'"; $dsql->ExecuteNoneQuery($query); $dsql->Close(); }注意: 这部分相对复杂,因为 Discuz! 的用户ID (
uid) 和 DedeCMS 的用户ID (mid) 可能不一致,最稳妥的方法是: a. 在dede_member表中增加一个bbsuid字段,用来存储对应的 Discuz! 用户ID。 b. 在 DedeCMS 注册时,将 Discuz! 返回的$uid(Discuz! 的用户ID) 写入dede_member.bbsuid字段。 c. 在 Discuz! 登录时,通过$_DCOOKIE['uid']查到dede_member.bbsuid,再更新 DedeCMS 的记录。为了简化,上面的代码假设
mid和uid是一致的,这在生产环境中不推荐,更推荐的方案是修改reg_new.php,在调用uc_user_register后,将返回的 Discuz! 用户ID存入 DedeCMS 的bbsuid字段。 - 打开
第三部分:整合后的测试
-
测试注册:
- 清除浏览器 Cookie。
- 访问你的 DedeCMS 注册页面 (
/member/reg_new.php)。 - 填写信息并提交。
- 注册成功后,检查 DedeCMS 的
dede_member表和 Discuz! 的pre_common_member表,看是否都新增了用户数据。
-
测试登录:
- 使用刚才注册的账号,在 DedeCMS 登录页面登录。
- 登录成功后,检查 Discuz! 的
pre_common_member表,看lastvisit和lastactivity字段是否被更新。 - 清除浏览器 Cookie。
- 使用同一账号,在 Discuz! 的登录页面登录。
- 登录成功后,检查 DedeCMS 的
dede_member表,看mlogintime和mloginip字段是否被更新。
-
测试退出:
- 在 DedeCMS 中退出登录,检查 Discuz! 的 Cookie 是否也被清除。
- 在 Discuz! 中退出登录,检查 DedeCMS 的 Cookie 是否也被清除。
- (注:退出同步的修改比较复杂,通常需要引入
uc_user_synlogout()函数,如果不需要可以暂时不做。)
第四部分:常见问题与注意事项
-
字符编码问题:
- 最常见的问题! 确保 DedeCMS 和 Discuz! 的数据库、文件编码完全一致(要么都是 GBK,要么都是 UTF-8),如果混用,会出现乱码。
-
路径问题:
- 在
require_once引入文件时,路径一定要写对,使用dirname(__FILE__)是一个好习惯,可以保证路径的相对正确性。
- 在
-
表前缀问题:
- 在写 SQL 语句时,如果直接操作数据库,要带上 Discuz! 的表前缀(如
pre_),如果使用 Discuz! 提供的函数(如uc_user_register),则不需要关心,函数内部会处理。
- 在写 SQL 语句时,如果直接操作数据库,要带上 Discuz! 的表前缀(如
-
安全性:
整合后,两个系统的安全性是绑定的,确保你的服务器和数据库足够安全,防止一处被攻破,全盘皆输。
-
数据不一致:
- 如果出现数据不同步,首先检查
config.inc.php的数据库配置是否正确,然后检查require_once的路径是否正确,最后检查添加的代码逻辑是否有误。
- 如果出现数据不同步,首先检查
-
UCenter:
- 虽然我们没有使用 UCenter 的管理后台,但它的
client.php文件是整合的核心,确保 Discuz! 能正确加载这个文件。
- 虽然我们没有使用 UCenter 的管理后台,但它的
这个教程涵盖了整合的主要流程,实际操作中可能会因为你的具体环境(如插件、自定义修改等)而产生差异,请灵活变通,再次强调,操作前备份!操作前备份!操作前备份!
