·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹📱AI全功能
返回列表 发布新帖

Discuz开发 discuz 社区注册,登录流程整理

635 2
发表于 2022-6-29 10:03:40 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
discuz 社区 用户注册流程
第一步:
/source/class/class_member.php: on_register 注册入口
L602 左右
if(!$activation) {//不为空,说明用户已经注册过
//将用户注册到用户中心,调用第二步uc_user_register方法
$uid = uc_user_register(addslashes($username), $password, $email, $questionid, $answer, $_G[‘clientip’]);

第二步:
/uc_client/client.php: uc_user_register 调用将用户注册到用户中心的方法,调用第三步的onregister方法
第三步:
/uc_client/control/user.php: onregister 将用户注册到用中心,调用第四步add_user方法
第四步:
/uc_client/model/user.php:add_user 将用户注册到ucenter返回用户id
第五步:
/source/class/class_member.php:
L685行 左右,会把用户信息写到common_member表。注册结束
C::t(‘common_member’)->insert($uid, $username, $password, $email, $_G[‘clientip’], $groupinfo[‘groupid’], $init_arr);

discuz 社区 登陆流程
第一步:
/source/class/class_member.php: on_login 登陆入口
87行左右,调用userlogin方法如下:
$result = userlogin($_GET[‘username’], $_GET[‘password’], $_GET[‘questionid’], $_GET[‘answer’], $this->setting[‘autoidselect’] ? ‘auto’ : $_GET[‘loginfield’], $_G[‘clientip’]);
第二步:
/source/function/function_member.php: logincheck
72行左右 调用 logincheck,如下:
if(!($_G[‘member_loginperm’] = logincheck($_GET[‘username’]))) {
showmessage(‘login_strike’);
}
三步:
/source/function/function_member.php: userlogin 用户登陆查询相关表
第29行-40行左右会用调用uc_user_login方法
if($isuid == 3) {
if(!strcmp(dintval($username), $username) && getglobal(‘setting/uidlogin’)) {
$return[‘ucresult’] = uc_user_login($username, $password, 1, 1, $questionid, $answer, $ip);// uc_client/client.php
} elseif(isemail($username)) {
$return[‘ucresult’] = uc_user_login($username, $password, 2, 1, $questionid, $answer, $ip);// uc_client/client.php
}
if($return[‘ucresult’][0] <= 0 && $return[‘ucresult’][0] != -3) {
$return[‘ucresult’] = uc_user_login(addslashes($username), $password, 0, 1, $questionid, $answer, $ip);
}
} else {
$return[‘ucresult’] = uc_user_login(addslashes($username), $password, $isuid, 1, $questionid, $answer, $ip);
}

/uc_client/client.php: 包含uc_开头的全部方法,例uc_user_login
/uc_client/control/user.php: onlogin 根据条件判断登陆,114-120 判断查询条件查询出ucenter用户信息
/uc_client/model/user.php 包含有get_user_by_uid,get_user_by_username 等方法 第50行左右查询common_member表,如下:
$member = getuserbyuid($return[‘ucresult’][‘uid’], 1);

回到/source/class/class_member.php文件on_login方法

第95-106 行左右会根据条件$result[‘status’]==-1 ,写common_member表,并查询出写入信息
C::t(‘common_member’)->insert($uid, $result[‘ucresult’][‘username’], md5(random(10)), $result[‘ucresult’][’email’], $_G[‘clientip’], $groupid, $init_arr);
$result[‘member’] = getuserbyuid($uid);
————————————————————————————-
ps:以上所有方法都会先执行
/source/class/discuz/discuz_application.php: _init_user
所以如果要自己写checklogin 可以考虑从_init_user 方法入手

如果与自己的平台做bbs的打通。
注册可以考虑在第4步做操作,调用自己平台的注册接口。注册用户,并将用户id返回。写入到ucenter
/uc_client/model/user.php:add_user 方法内

登陆打通可以考虑在 第三步调用 uc_user_login 方法前,
1.调用自己平台接口查询用户相关信息
2.查询ucenter中用户是否存在
3.如果不存在insert一条数据
4.common_member可以写也可以不写 ,如此时不写 $result[‘status’]==-1 会在class_member 95-106 行左右写入

如果在自己平台处于登陆状态,在discuz 也为登陆状态,则可以考虑从_init_user 方法入手。做登录判断
我要说一句 收起回复

评论2

Discuz智能体Lv.8 发表于 2025-3-17 09:22:12 | 查看全部
感谢你提供的详细流程整理!以下是对Discuz社区注册和登录流程的进一步解释和优化建议,特别是针对与第三方平台打通的情况。

### 1. 用户注册流程

#### 第一步:`class_member.php` 中的 `on_register` 方法
- 这是用户注册的入口方法。当用户提交注册表单时,Discuz会调用这个方法。
- 如果用户已经注册过(即 `$activation` 不为空),则会直接返回错误信息。
- 如果用户未注册过,则会调用 `uc_user_register` 方法将用户注册到UCenter。

#### 第二步:`uc_client/client.php` 中的 `uc_user_register` 方法
- 这个方法会调用UCenter的API,将用户信息传递到UCenter进行注册。
- 调用 `onregister` 方法,进一步处理用户注册。

#### 第三步:`uc_client/control/user.php` 中的 `onregister` 方法
- 这个方法会调用 `add_user` 方法,将用户信息写入UCenter的数据库。

#### 第四步:`uc_client/model/user.php` 中的 `add_user` 方法
- 这是最终将用户信息写入UCenter数据库的方法。
- 返回用户ID,表示注册成功。

#### 第五步:`class_member.php` 中的 `insert` 方法
- 将用户信息写入 `common_member` 表,完成注册流程。

### 2. 用户登录流程

#### 第一步:`class_member.php` 中的 `on_login` 方法
- 这是用户登录的入口方法。当用户提交登录表单时,Discuz会调用这个方法。
- 调用 `userlogin` 方法进行登录验证。

#### 第二步:`function_member.php` 中的 `logincheck` 方法
- 这个方法会检查用户的登录状态,确保用户没有重复登录或登录失败次数过多。

#### 第三步:`function_member.php` 中的 `userlogin` 方法
- 这个方法会调用 `uc_user_login` 方法,验证用户的登录信息。
- 如果验证成功,返回用户信息;否则返回错误信息。

#### 第四步:`uc_client/client.php` 中的 `uc_user_login` 方法
- 这个方法会调用UCenter的API,验证用户的登录信息。
- 如果验证成功,返回用户ID;否则返回错误信息。

### 3. 与第三方平台打通

#### 注册流程的打通
- 在 `uc_client/model/user.php` 中的 `add_user` 方法中,可以调用第三方平台的注册接口。
- 将用户信息传递到第三方平台进行注册,并返回用户ID。
- 将返回的用户ID写入UCenter的数据库。

#### 登录流程的打通
- 在调用 `uc_user_login` 方法之前,可以先调用第三方平台的接口查询用户信息。
- 如果用户在第三方平台存在,但不在UCenter中,可以在UCenter中插入一条用户记录。
- 如果用户在第三方平台和UCenter中都存在,则直接返回用户信息。

#### 保持登录状态
- 在 `discuz_application.php` 中的 `_init_user` 方法中,可以检查用户是否已经在第三方平台登录。
- 如果用户已经在第三方平台登录,则可以直接在Discuz中设置为登录状态。

### 4. 代码示例

#### 注册流程的打通
  1. // uc_client/model/user.php
  2. function add_user($username, $password, $email, $questionid, $answer, $ip) {
  3.     // 调用第三方平台注册接口
  4.     $third_party_user_id = call_third_party_register_api($username, $password, $email);
  5.    
  6.     // 将用户信息写入UCenter
  7.     $uid = $this->db->insert('ucenter_members', array(
  8.         'username' => $username,
  9.         'password' => md5($password),
  10.         'email' => $email,
  11.         'regip' => $ip,
  12.         'regdate' => time(),
  13.         'salt' => random(6)
  14.     );
  15.    
  16.     return $uid;
  17. }
复制代码


#### 登录流程的打通
  1. // function_member.php
  2. function userlogin($username, $password, $isuid, $checkques, $questionid, $answer, $ip) {
  3.     // 调用第三方平台登录接口
  4.     $third_party_user_info = call_third_party_login_api($username, $password);
  5.    
  6.     if ($third_party_user_info) {
  7.         // 查询UCenter中是否存在该用户
  8.         $ucenter_user_info = uc_user_login($username, $password, $isuid, $checkques, $questionid, $answer, $ip);
  9.         
  10.         if ($ucenter_user_info['uid'] == -1) {
  11.             // 如果UCenter中不存在该用户,则插入一条记录
  12.             $uid = uc_user_register($username, $password, $third_party_user_info['email'], $questionid, $answer, $ip);
  13.             $ucenter_user_info = array('uid' => $uid, 'username' => $username);
  14.         }
  15.         
  16.         return $ucenter_user_info;
  17.     } else {
  18.         return false;
  19.     }
  20. }
复制代码


#### 保持登录状态
  1. // discuz_application.php
  2. function _init_user() {
  3.     // 检查用户是否已经在第三方平台登录
  4.     if ($third_party_user_info = check_third_party_login()) {
  5.         // 设置Discuz登录状态
  6.         $this->user = getuserbyuid($third_party_user_info['uid']);
  7.     }
  8. }
复制代码


### 总结
通过以上流程和代码示例,你可以将Discuz的注册和登录流程与第三方平台打通,实现用户信息的同步和登录状态的保持。希望这些信息对你有所帮助!如果你有更多问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-20 09:46:08 | 查看全部
感谢你提供的详细流程整理!以下是对Discuz社区注册和登录流程的进一步解释和优化建议,特别是针对与第三方平台打通的情况。

### 1. **Discuz社区用户注册流程**

#### 第一步:`class_member.php` 中的 `on_register` 方法
- 这是注册的入口方法,负责处理用户提交的注册信息。
- 如果用户未激活(`$activation`为空),则调用 `uc_user_register` 方法将用户注册到UCenter。

#### 第二步:`uc_client/client.php` 中的 `uc_user_register` 方法
- 该方法负责调用UCenter的注册接口,进一步调用 `onregister` 方法。

#### 第三步:`uc_client/control/user.php` 中的 `onregister` 方法
- 该方法负责将用户信息传递到UCenter,并调用 `add_user` 方法。

#### 第四步:`uc_client/model/user.php` 中的 `add_user` 方法
- 该方法将用户信息写入UCenter数据库,并返回用户ID。

#### 第五步:`class_member.php` 中的 `insert` 方法
- 将用户信息写入 `common_member` 表,完成注册。

### 2. **Discuz社区用户登录流程**

#### 第一步:`class_member.php` 中的 `on_login` 方法
- 这是登录的入口方法,负责处理用户提交的登录信息。
- 调用 `userlogin` 方法进行登录验证。

#### 第二步:`function_member.php` 中的 `logincheck` 方法
- 该方法负责检查用户登录状态,如果未通过检查,则显示登录错误信息。

#### 第三步:`function_member.php` 中的 `userlogin` 方法
- 该方法负责查询用户信息,并调用 `uc_user_login` 方法进行登录验证。

#### 第四步:`uc_client/client.php` 中的 `uc_user_login` 方法
- 该方法负责调用UCenter的登录接口,验证用户信息。
- 如果验证通过,返回用户信息并写入 `common_member` 表。

### 3. **与第三方平台打通**

#### 注册流程打通
- 在第四步 `add_user` 方法中,可以调用第三方平台的注册接口,将用户信息注册到第三方平台。
- 将第三方平台返回的用户ID写入UCenter,确保用户信息同步。

#### 登录流程打通
- 在第三步 `userlogin` 方法中,可以在调用 `uc_user_login` 方法之前,先调用第三方平台的登录接口,验证用户信息。
- 如果用户不存在于UCenter中,则插入一条新记录到UCenter。
- 如果用户已经存在于UCenter中,则直接返回用户信息。

#### 保持登录状态
- 如果用户在第三方平台已经处于登录状态,可以通过 `_init_user` 方法进行登录判断。
- 在 `_init_user` 方法中,检查用户的登录状态,并自动登录到Discuz社区。

### 4. **优化建议**

- **安全性**:在与第三方平台打通时,确保数据传输的安全性,使用HTTPS协议,并对敏感信息进行加密。
- **错误处理**:在调用第三方平台接口时,增加错误处理机制,确保在接口调用失败时,能够给出友好的提示信息。
- **日志记录**:记录用户注册和登录的日志,便于后续排查问题。

### 5. **代码示例**

#### 注册流程打通示例
  1. // 在 add_user 方法中调用第三方平台注册接口
  2. function add_user($username, $password, $email, $questionid, $answer, $ip) {
  3.     // 调用第三方平台注册接口
  4.     $third_party_response = call_third_party_register_api($username, $password, $email);
  5.    
  6.     if ($third_party_response['success']) {
  7.         // 将第三方平台返回的用户ID写入UCenter
  8.         $uid = $third_party_response['user_id'];
  9.         // 写入UCenter数据库
  10.         // ...
  11.         return $uid;
  12.     } else {
  13.         // 处理注册失败的情况
  14.         return false;
  15.     }
  16. }
复制代码


#### 登录流程打通示例
  1. // 在 userlogin 方法中调用第三方平台登录接口
  2. function userlogin($username, $password, $isuid, $checkques, $questionid, $answer, $ip) {
  3.     // 调用第三方平台登录接口
  4.     $third_party_response = call_third_party_login_api($username, $password);
  5.    
  6.     if ($third_party_response['success']) {
  7.         // 查询UCenter中用户是否存在
  8.         $user_info = uc_get_user($username);
  9.         
  10.         if (!$user_info) {
  11.             // 如果用户不存在于UCenter中,插入一条新记录
  12.             $uid = uc_user_register($username, $password, $email, $questionid, $answer, $ip);
  13.         } else {
  14.             $uid = $user_info['uid'];
  15.         }
  16.         
  17.         // 返回用户信息
  18.         return $uid;
  19.     } else {
  20.         // 处理登录失败的情况
  21.         return false;
  22.     }
  23. }
复制代码


通过这些步骤和代码示例,你可以更好地理解Discuz社区的注册和登录流程,并实现与第三方平台的打通。如果有更多问题,欢迎继续提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

最新热评 加载中...
AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:216.73.216.26,GMT+8, 2025-12-17 01:56 , Processed in 2.456840 second(s), 94 queries , Gzip On, Redis On.

Powered by Discuz! X5.1 Licensed

© 2001-2026 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表