xiao9469 发表于 2020-10-31 09:21:40

discuz能否将邮箱和用户名登录合并为一个

discuz能否将邮箱和用户名登录合并为一个,也就是不需要用户选择,可以自动识别。
有些用户,他们不知道选择,直接上邮箱,导致登录失败。

Crystαl 发表于 2020-10-31 09:21:49

Discuz智能体 发表于 2025-3-21 05:49:35

在Discuz中,默认情况下,用户登录时需要选择使用用户名或邮箱进行登录。如果你希望将邮箱和用户名登录合并为一个输入框,并且让系统自动识别用户输入的是用户名还是邮箱,可以通过以下步骤实现:

### 1. 修改登录模板
首先,你需要修改Discuz的登录模板文件,将用户名和邮箱的输入框合并为一个。

找到模板文件 `template/default/member/login.htm`,并找到以下代码:

<input type="text" name="username" id="username" class="px" tabindex="1" autocomplete="off" />

将其替换为:

<input type="text" name="login" id="login" class="px" tabindex="1" autocomplete="off" placeholder="用户名/邮箱" />

### 2. 修改登录处理逻辑
接下来,你需要修改Discuz的登录处理逻辑,使其能够自动识别用户输入的是用户名还是邮箱。

找到文件 `source/module/member/member_login.php`,并找到以下代码:

$username = $_GET['username'];

将其替换为:

$login = $_GET['login'];

然后,在登录验证逻辑中,添加自动识别用户名或邮箱的代码:

if (strpos($login, '@') !== false) {
    // 如果输入包含@符号,认为是邮箱
    $email = $login;
    $username = '';
} else {
    // 否则认为是用户名
    $username = $login;
    $email = '';
}

### 3. 修改登录验证逻辑
在同一个文件中,找到登录验证的逻辑部分,通常是调用 `C::t('common_member')->fetch_by_username($username)` 或 `C::t('common_member')->fetch_by_email($email)` 的地方。

修改为:

if ($email) {
    $member = C::t('common_member')->fetch_by_email($email);
} else {
    $member = C::t('common_member')->fetch_by_username($username);
}

### 4. 测试
完成上述修改后,保存文件并上传到服务器。然后,测试登录功能,确保系统能够正确识别用户名和邮箱,并允许用户使用任意一种方式登录。

### 5. 注意事项
- 在修改代码之前,建议备份相关文件,以防修改出错导致系统无法正常运行。
- 如果你使用的是自定义模板,可能需要根据模板的路径进行调整。
- 如果你对Discuz的代码结构不熟悉,建议在本地环境进行测试,确保修改无误后再上传到生产环境。

通过以上步骤,你可以实现Discuz的邮箱和用户名登录合并为一个输入框,并自动识别用户输入的是用户名还是邮箱。这样可以提升用户体验,减少用户因选择错误而导致的登录失败问题。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: discuz能否将邮箱和用户名登录合并为一个