avatar

mdo

Hello

  • 首页
  • 知识库
  • 归档
  • 标签
  • 关于
主页 Forgot password
文章

Forgot password

发表于 2026-05-1 更新于 2026-05- 1
作者 mdo
8~10 分钟 阅读

namespace app\controller;

use app\BaseController;

use think\facade\Db;

use think\facade\Cache;

use think\facade\Mail; // 假设你封装了邮件类

use think\facade\Validate;

class Passport extends BaseController

{

/**

* 第一步:发送重置链接/验证码到邮箱

*/

public function sendResetEmail()

{

$email = $this->request->param('email');

// 1. 验证参数

if (!Validate::isEmail($email)) {

return json(['code' => 0, 'msg' => '邮箱格式不正确']);

}

// 2. 检查用户是否存在

$user = Db::name('user')->where('email', $email)->find();

if (!$user) {

return json(['code' => 0, 'msg' => '该邮箱未注册']);

}

// 3. 生成 6 位随机验证码(或生成的随机 Token)

$code = mt_rand(100000, 999999);

// 4. 存入缓存,有效期 15 分钟

Cache::set('reset_password_'.$email, $code, 900);

// 5. 发送邮件 (这里用伪代码,具体取决于你的邮件发送实现)

try {

// 建议将邮件发送逻辑放在 Service 层

$subject = "重置您的账户密码";

$content = "您的验证码是:{$code},请在15分钟内完成验证。";

// 假设你使用了 PHPMailer 封装

// send_email($email, $subject, $content);

return json(['code' => 1, 'msg' => '重置验证码已发送至您的邮箱']);

} catch (\Exception $e) {

return json(['code' => 0, 'msg' => '邮件发送失败']);

}

}

/**

* 第二步:执行密码重置

*/

public function doResetPassword()

{

$email = $this->request->param('email');

$code = $this->request->param('code');

$newPassword = $this->request->param('password');

// 1. 基础验证

if (empty($code) || strlen($newPassword) < 6) {

return json(['code' => 0, 'msg' => '参数校验失败']);

}

// 2. 校验缓存中的验证码

$cacheCode = Cache::get('reset_password_'.$email);

if (!$cacheCode || $cacheCode != $code) {

return json(['code' => 0, 'msg' => '验证码已失效或不正确']);

}

// 3. 更新数据库密码

$salt = mt_rand(1111, 9999); // 假设你有盐值加密

$hashedPassword = password_hash($newPassword, PASSWORD_DEFAULT);

$res = Db::name('user')

->where('email', $email)

->update([

'password' => $hashedPassword,

'update_time' => time()

]);

if ($res !== false) {

// 重置成功后删除验证码防止重复使用

Cache::delete('reset_password_'.$email);

return json(['code' => 1, 'msg' => '密码修改成功,请重新登录']);

}

return json(['code' => 0, 'msg' => '重置失败,请稍后重试']);

}

}

技术
许可协议:  CC BY 4.0
分享

相关文章

10月 2, 2026

iOS 侧载(Sideloading)工具

AltStore 和 Sideloadly 都是目前最流行的 iOS 侧载(Sideloading)工具。 简单来说,它们的作用就是让你绕过苹果的官方 App Store,直接把第三方的 IPA 安装包(也就是 iOS 的应用安装文件)安装到你的 iPhone 或 iPad 上。 通过这两个工具,你

9月 28, 2026

注册 Chat Participant

将当前服务接入 VS Code 的 AI 聊天窗口是完全可行的。VS Code 在近期的版本中正式推出了 Chat Extensions API(github.copilot.chat),允许第三方扩展将自定义的 LLM 服务或工具注册到 Copilot Chat 面板中。 结合当前 code_ge

9月 23, 2026

php intelephense 设置 if 空格

在 VS Code 中,如果你使用的是 PHP Intelephense 插件,控制 if 关键字后面是否加空格的设置是由其内置的格式化引擎(基于 PSR-12 标准)决定的。 你可以通过修改 VS Code 的 settings.json 来配置这个行为: 1. 开启 if 后面的空格(默认/推荐

下一篇

用 JS 模拟 ThinkPHP 的 url()

上一篇

Js 混淆

最近更新

  • 比尔盖茨的智慧:想多赚钱,就每天循环做这3件事
  • iOS 侧载(Sideloading)工具
  • 程序员越想创业,越不要急着动手
  • 注册 Chat Participant
  • 中秋给在外游子的一封信

热门标签

API CodeGeex Coding Cursor DeepSeek Docker Gitkraken Harness Laravel Management

目录

©2026 mdo. 保留部分权利。