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
分享

相关文章

7月 26, 2026

完美地解决 TP3 老系统数据的平滑读取

为了彻底、完美地解决 TP3 老系统数据的平滑读取,必须解决两个核心痛点: TP3 的盲猜反序列化机制(标量存原样,数组/对象存原生 serialize,同时兼容 json)。 TP3 与 TP6 的缓存前缀(Prefix)不一致。 以下是为你量身定制的终极落地解决方案,通

7月 26, 2026

thinkphp3 redis序列化和反序列化

在老系统重构迁移至 ThinkPHP 6 (TP6) 的过程中,ThinkPHP 3 (TP3) 的 Redis 序列化历史遗留问题是最核心的连环坑之一。 TP3 的 S('key', $value) 缓存方法和底层 Redis 驱动,在存储非字符串(如数组、对象)时,有一套独特的序列化行为。如果不

7月 24, 2026

Table 空间极易发生哈希冲突并溢出

既然你没有在业务中主动调用 Room,只使用了全局广播,那么这个问题就非常明确了:即使你不用房间功能,think-swoole 只要开启了 WebSocket,底层就会强行初始化并注入一个名为 Room 的驱动组件。 [1] 框架底层默认使用 table 类型来作为 Room 的存储介质。当进行全局

下一篇

用 JS 模拟 ThinkPHP 的 url()

上一篇

Js 混淆

最近更新

  • 完美地解决 TP3 老系统数据的平滑读取
  • thinkphp3 redis序列化和反序列化
  • Table 空间极易发生哈希冲突并溢出
  • 将监控程序直接跑在云端
  • AI 驱动型 Facebook 群组关键词监控 Chrome 浏览器插件

热门标签

API CodeGeex Gitkraken Management Manticore Premiere Sublime Swoole ThinkPHP ThinkPHP5

目录

©2026 mdo. 保留部分权利。