忘记密码功能模块的实现

数据层

忘记密码涉及到的是用户密码的更改。就是password的update。

  1. dao的操作
    在dao包下编写 UserMapper 的接口代码,增加一个updatePassword()。
    在这里插入图片描述
  2. 在 mapper 下实现这个方法的xml,写 SQL。
   <update id="updatePassword">
        update user set password = #{password} where email = #{email}
    </update>

service层

service 层主要实现2个功能:1.给邮箱发送验证码。 2.重置密码.

  1. 给邮箱发送验证码:
    1. 空值判断。
    2. 验证该邮箱是否存在数据库。
    3. 验证该邮箱的状态是否正常/激活。
    4. 都没问题的话就给邮箱发送验证码。
  public Map<String, Object> getCode(String email) {
        Map<String,Object> map = new HashMap<>();
        //空值判断
        if (StringUtils.isBlank(email)){
            map.put("emailMsg","请输入邮箱!");
            return map;
        }
        //邮箱是否正确
        User user = userMapper.selectByEmail(email);
        if (user == null){
            map.put("emailMsg","该邮箱还未注册过,请注册后再使用!");
            return map;
        }
        //该用户还未激活
        if (user.getStatus() == 0){
            map.put("emailMsg","该邮箱还未激活,请到邮箱中激活后再使用!");
            return map;
        }
        //邮箱正确的情况下,发送验证码到邮箱
        Context context = new Context();
        context.setVariable("email",email);
        String code = CommunityUtil.generateUUID().substring(0,5);
        context.setVariable("code",code);
        String content = templateEngine.process("mail/forget", context);
        mailClient.sendMail(email, "验证码", content);

        map.put("code",code);//map中存放一份,为了之后和用户输入的验证码进行对比
        map.put("expirationTime", LocalDateTime.now().plusMinutes(5L));//过期时间
        return map;
    }
  1. 重置密码:
    1. 空值判断。
    2. 更改的密码加盐再md5加密存于数据库。
    3. 往 userMapper 中存新的密码。
   public Map<String, Object> forget(String email, String verifycode, String password){
        Map<String,Object> map = new HashMap<>();
        //空值处理
        if (StringUtils.isBlank(email)){
            map.put("emailMsg","请输入邮箱!");
            return map;
        }
        if (StringUtils.isBlank(verifycode)){
            map.put("codeMsg","请输入验证码!");
            return map;
        }
        if (StringUtils.isBlank(password)){
            map.put("passwordMsg","请输入新密码!");
            return map;
        }

        //邮箱在获取验证码那一步已经验证过了,是有效的邮箱,且验证码也有效
        User user = userMapper.selectByEmail(email);
        password = CommunityUtil.md5(password + user.getSalt());
        userMapper.updatePassword(String.valueOf(user.getId()),password);

        return map;
    }

controller层

1.用户点‘忘记密码’超链后跳转到重设密码的页面。
2. 实现获取验证码的方法,调用 Service 层获取验证码(底层实现了发送邮件的功能); 如果有错误信息,错误信息显示给客户端;如果没有错误信息,告诉客户端验证码已发送的消息; 同时将验证码和过期时间记录在 session 中,以便后续和用户输入的信息作比较。
3. 验证验证码是否正确,是否过期。

  1. 跳转到忘记密码页面
@RequestMapping(path = "/forget" , method = RequestMethod.GET)
public String getForget(Model model){

    return "/site/forget";

}
  1. 给用户邮箱发送验证码:
   @RequestMapping(path = "/getCode", method = RequestMethod.GET)
    public String getCode(String email, Model model,HttpSession session) {
        Map<String, Object> map = forgetService.getCode(email);
        if (map.containsKey("emailMsg")) {//有错误的情况下
            model.addAttribute("emailMsg", map.get("emailMsg"));
        } else {//正确的情况下,向邮箱发送了验证码
            model.addAttribute("msg", "验证码已经发送到您的邮箱,5分钟内有效!");
            //将验证码存放在 session 中,后序和用户输入的信息进行比较
            session.setAttribute("code",map.get("code"));
            //后序判断用户输入验证码的时候验证码是否已经过期
            session.setAttribute("expirationTime",map.get("expirationTime"));
        }
        return "site/forget";
    }
  1. 重置密码:
 @RequestMapping(path = "/forget", method = RequestMethod.POST)
    public String forget(Model model, String email, String verifycode, String password, HttpSession session) {
        //验证验证码是否正确
        if (!verifycode.equals(session.getAttribute("code"))) {
            model.addAttribute("codeMsg", "输入的验证码不正确!");
            return "site/forget";
        }
        //验证码是否过期
        if (LocalDateTime.now().isAfter((LocalDateTime) session.getAttribute("expirationTime"))) {
            model.addAttribute("codeMsg", "输入的验证码已过期,请重新获取验证码!");
            return "site/forget";
        }
        Map<String, Object> map = forgetService.forget(email, verifycode, password);
        if (map == null || map.isEmpty()) {
            model.addAttribute("msg", "密码修改成功,可以使用新密码登录了!");
            model.addAttribute("target", "/login");
            return "site/operate-result";
        } else {
            model.addAttribute("emailMsg", map.get("emailMsg"));
            model.addAttribute("codeMsg", map.get("codeMsg"));
            model.addAttribute("passwordMsg", map.get("passwordMsg"));
            return "/site/forget";
        }
    }
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用Node.js和MySQL来实现搜索功能,需要以下几个步骤: 1. 首先,确保你已经安装了Node.js和MySQL,并在你的项目中安装了mysql包(可以使用npm install mysql命令进行安装)。 2. 在你的Node.js代码中,首先需要创建与MySQL数据库的连接。使用mysql包的createConnection方法来创建连接,并传入数据库的主机名、用户名、密码和数据库名等信息。 3. 使用Connection对象的connect方法来连接到数据库。 4. 在连接成功后,可以使用Connection对象的query方法来执行SQL查询语句。例如,如果要实现一个简单的搜索功能,可以执行类似于SELECT * FROM table_name WHERE column_name LIKE '%search_keyword%'的查询语句,其中table_name是你要搜索的表名,column_name是你要搜索的列名,search_keyword是你要搜索的关键字。 5. 查询结果会以一个数组的形式返回给你。你可以对查询结果进行进一步的处理,例如将结果展示在网页上或者进行其他操作。 6. 最后,记得关闭与数据库的连接,使用Connection对象的end方法即可。 总结来说,要使用Node.js和MySQL实现搜索功能,你需要创建数据库连接、执行查询语句、处理查询结果,并在最后关闭与数据库的连接。 ### 回答2: 使用Node.js结合MySQL数据库实现搜索功能的步骤如下: 1. 首先,需要安装相关的依赖包。在项目根目录下运行以下命令安装必要的依赖包: ``` npm install mysql express ``` 2. 创建一个express应用并引入mysql模块: ```javascript const express = require('express'); const mysql = require('mysql'); const app = express(); ``` 3. 创建MySQL数据库连接: ```javascript const connection = mysql.createConnection({ host: 'localhost', user: 'root', // 数据库用户名 password: 'password', // 数据库密码 database: 'mydatabase' // 数据库名称 }); // 连接数据库 connection.connect((err) => { if (err) { console.error('数据库连接失败: ', err); } else { console.log('数据库连接成功'); } }); ``` 4. 创建搜索路由: ```javascript app.get('/search', (req, res) => { const searchTerm = req.query.term; // 获取搜索关键词 // 查询数据库 connection.query(`SELECT * FROM mytable WHERE column LIKE '%${searchTerm}%'`, (error, results, fields) => { if (error) { console.error('搜索出错: ', error); } else { res.send(results); // 将查询结果返回给客户端 } }); }); ``` 5. 启动服务器并监听端口: ```javascript app.listen(3000, () => { console.log('服务器已启动,正在监听3000端口'); }); ``` 将以上代码保存为一个文件(例如`app.js`),在终端执行`node app.js`启动服务器。然后,可以通过访问`http://localhost:3000/search?term=关键词`进行搜索,服务器会返回相应的结果。 注意,上述示例代码仅提供了基本的搜索功能,实际使用时需要根据具体需求进行修改和优化,例如处理查询参数、数据库表结构设计、结果过滤等。 ### 回答3: 在使用Node.js和MySQL实现搜索功能时,可以按照以下步骤进行操作: 1. 安装和配置MySQL数据库:首先,需要在本地或远程服务器上安装MySQL数据库,并创建一个用于存储数据的数据库。然后,使用适当的用户名和密码配置数据库连接。 2. 安装mysql模块:使用Node.js的包管理器(npm),可以安装mysql模块,该模块将允许我们与MySQL数据库进行交互。在终端中,运行以下命令进行安装:npm install mysql 3. 连接到数据库:首先,需要在Node.js文件中引入mysql模块,并使用创建的用户名、密码和数据库信息创建一个数据库连接。例如:var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'mydatabase' }); connection.connect(); 4. 编写搜索功能的API端点:在Node.js文件中,编写一个处理搜索请求的API端点。该端点应该接收来自前端的搜索关键字,并使用该关键字在数据库中查询匹配的结果。 5. 执行数据库查询:使用mysql模块提供的query方法,可以执行数据库查询。在搜索API端点中,构造SQL查询语句,使用关键字进行模糊匹配,并执行查询。例如:connection.query('SELECT * FROM products WHERE name LIKE ?', ['%' + keyword + '%'], function(error, results, fields) { if (error) throw error; // 处理查询结果 }); 6. 处理查询结果:在query方法的回调函数中,可以处理查询结果。根据具体需求,可以将结果发送回前端,或在后端进行进一步处理。 7. 关闭数据库连接:在搜索功能完成后,不要忘记关闭数据库连接,以释放资源。例如:connection.end(); 通过上述步骤,可以使用Node.js和MySQL实现搜索功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值