discuz社区如何实现同步写入信息到数据库 注册登录流程原理整理
discuz bbs 用户注册流程第一步:
/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 bbs 登陆流程
第一步:
/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 && $return['ucresult'] != -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 行左右写入
如果在自己平台处于登陆状态,在bbs也为登陆状态,则可以考虑从_init_user 方法入手。做登录判断
在Discuz!社区中,用户注册和登录的流程涉及到多个步骤和文件的交互。以下是对你提供的流程的详细解释和整理:
### 用户注册流程
1. **注册入口**:
- 文件路径:`/source/class/class_member.php`
- 方法:`on_register`
- 代码位置:大约在第602行
- 功能:检查用户是否已经注册过。如果用户未注册,则调用`uc_user_register`方法将用户注册到用户中心。
2. **调用用户中心注册方法**:
- 文件路径:`/uc_client/client.php`
- 方法:`uc_user_register`
- 功能:调用用户中心的注册方法,进一步调用`onregister`方法。
3. **用户中心注册**:
- 文件路径:`/uc_client/control/user.php`
- 方法:`onregister`
- 功能:将用户注册到用户中心,并调用`add_user`方法。
4. **添加用户到用户中心**:
- 文件路径:`/uc_client/model/user.php`
- 方法:`add_user`
- 功能:将用户注册到用户中心,并返回用户ID。
5. **写入用户信息到数据库**:
- 文件路径:`/source/class/class_member.php`
- 代码位置:大约在第685行
- 功能:将用户信息写入`common_member`表,完成注册流程。
### 用户登录流程
1. **登录入口**:
- 文件路径:`/source/class/class_member.php`
- 方法:`on_login`
- 代码位置:大约在第87行
- 功能:调用`userlogin`方法进行用户登录。
2. **登录检查**:
- 文件路径:`/source/function/function_member.php`
- 方法:`logincheck`
- 代码位置:大约在第72行
- 功能:检查用户登录状态,如果未登录则显示登录提示。
3. **用户登录查询**:
- 文件路径:`/source/function/function_member.php`
- 方法:`userlogin`
- 代码位置:大约在第29-40行
- 功能:调用`uc_user_login`方法进行用户登录验证。
4. **用户登录验证**:
- 文件路径:`/uc_client/client.php`
- 方法:`uc_user_login`
- 功能:验证用户登录信息,并返回登录结果。
5. **写入用户信息到数据库**:
- 文件路径:`/source/class/class_member.php`
- 代码位置:大约在第95-106行
- 功能:如果用户信息不存在于`common_member`表中,则写入用户信息。
### 与外部平台打通
1. **注册打通**:
- 在`/uc_client/model/user.php`的`add_user`方法中,可以调用外部平台的注册接口,将用户注册到外部平台,并返回用户ID,然后将用户ID写入用户中心。
2. **登录打通**:
- 在调用`uc_user_login`方法之前,可以调用外部平台的接口查询用户信息。
- 检查用户是否存在于用户中心,如果不存在则插入一条数据。
- 可以选择是否将用户信息写入`common_member`表。
3. **保持登录状态**:
- 如果外部平台和Discuz!社区都处于登录状态,可以从`/source/class/discuz/discuz_application.php`的`_init_user`方法入手,进行登录判断和状态同步。
### 总结
通过以上流程,你可以清晰地了解Discuz!社区的用户注册和登录流程,并且可以根据需要与外部平台进行打通。在注册和登录的关键步骤中,你可以插入自定义的逻辑,以实现与外部平台的同步操作。
如果你有更多具体的问题或需要进一步的帮助,请随时提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页:
[1]