admin管理员组

文章数量:1663660

文章目录

    • 激活原理
    • 运行说明(重点)
    • 实例演示(重点)
    • 代码说明
    • 项目结构图
    • 准备工作
    • emailactivate项目详细代码
      • common
        • UUIDUtils
      • config
        • DruidDbConfig
      • controller
        • IndexController
        • UserController
      • dao
        • UserDao
      • entity
        • User
      • service
        • UserService
        • UserServiceImpl
        • EmailService
        • EmailServiceImpl
      • EmailactivateApplication启动类
    • resources
      • mapper
        • UserMapper.xml
    • templates
      • error
        • 404.html
        • 500.html
      • index.html
      • login.html
      • success.html
      • welcome.html
    • application.properties
    • pom.xml

你是否在某些网站注册账户,注册时输入的邮箱,会收到激活的一串链接,邮箱点击进去此链接后才能激活账户的情况呢,相信你应该也遇到过。那这个功能大概是怎么实现的呢?今天我就带你们来分析分析。

此功能是基于java开发的,用springboot所完成的。

激活原理

在您注册的时候,User类中设置一个邮件码code,同时用户状态未激活。邮件码可以通过UUID实现,这样在注册的时候发送一封邮件,把这个邮件码以html的格式发送到指定邮箱,然后通过点击链接,把邮件码在提交到后台进行对比,如果邮件中的邮件码跟发送时设置的一样,就把用户状态改为激活,然后登陆即可。

运行说明(重点)

由于邮箱在收到激活链接时,需要点击链接访问到线上的地址才可激活,如果是本地localhost运行的地址,点击邮箱激活链接会找不到地址哦,找不到地址则就无法激活当前账户登录的权限了,故此项目就失去了运行实例的意义。 一定要注意 一定要注意 一定要注意。重要的话说三遍!! 建议使用自己的服务器进行访问。
在此项目的测试演示中,使用的是Ngrok内网穿透所演示的,会把本地端口映射通过特定的网址进行访问

Ngrok 内网端口映射,在线访问项目一看即会.
另一篇博文链接 https://blog.csdn/qq_41157588/article/details/115755791

实例演示(重点)

注意:此demo使用的是qq邮箱的stmp进行发送的邮箱,项目中application.properties的配置需要更改为自己的qq邮箱stmp的服务(qq邮箱->设置->账户->翻到底部 开启IMAP/SMTP服务), 不懂的可百度搜索,开启后要在自己项目的application中配置自己的stmp服务邮箱及密码,如不使用qq的stmp服务可在百度搜索其他邮箱stmp开启方法,在项目的applicaion.properties根据注释 自行配置即可

如本地的localhost:8080链接访问,点击邮箱地址会访问不到本地,需要服务端地址,此处已做重点说明!!推荐配合 服务器 或 Ngrok内网穿透 的链接地址,点击邮箱链接会进行激活账户.

代码说明

此代码的演示是发送邮件至邮箱激活,点击邮箱链接后激活此账户 。   还存在一些bug。例如:用户名和邮箱已存在还可再次注册 发送邮件等,需要自己后期加入条件判断做进一步的优化,如账户已存在则给予提示等等

复制此项目代码重点修改application.properties的配置 和UserServiceImplsuccess.html 的链接地址

QQ邮箱为例,开启stmp服务

开启之后,复制生成的stmp的一串字符,配置到application.properties即可

接下来直奔主题

注册用户,输入邮箱

注册时,成功发送邮箱至邮箱激活的链接激活信息,点击邮箱链接后会激活此账号的登录权限。

注册时,数据库的也已经添加了新注册的用户信息

当不点击了邮箱的激活链接时,code的状态默认为0,此时账户为未激激活状态,不能进行登录。

当点击了邮箱的链接时,code的状态会改为1,此时账户为激活状态,可以进行登录账户

如已经成功激活,再次登录刚刚注册的账户,此时会登录成功跳转到登录成功后设置的页面。

项目结构图

准备工作

数据库

SQLyog Ultimate v12.3.1 (64 bit)
MySQL - 5.7.20-log 
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;

create table `useremail` (
	`id` int (11),
	`username` varchar (150),
	`password` varchar (150),
	`useremail` varchar (150),
	`status` int (11),
	`code` varchar (600)
); 

insert into `useremail` (`id`, `username`, `password`, `useremail`, `status`, `code`) values('1','admin','123456','1136720013@qq','1','');
insert into `useremail` (`id`, `username`, `password`, `useremail`, `status`, `code`) values('2','aaa','aaaaaa','483444018@qq','0','c14dcdb9c63c4ad7980bda0beb1fcbe4e1f6ba7baa704966a6f9f2ac18acf075');

emailactivate项目详细代码

根据以上项目结构图由上而下提供代码
com.lemon.emailactivate

common

UUIDUtils
package com.lemon.emailactivatemon;

import java.util.UUID;

/**
 * @Author: xiangti
 * @Description:使用UUIDUtils生产发送给用户的邮箱验证码
 * @Date: Create in 2020/5/29 18:32
 */
public class UUIDUtils {
    public static String getUUID() {
        return UUID.randomUUID().toString().replace("-", "");
    }
}

config

DruidDbConfig
package com.lemon.emailactivate.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by lemon on 2020/5/29 18:32
 * @author xiangti
 * @CoonfigurationProperties(prefix="xxx")两种配置方法
 */
@Configuration
public class DruidDbConfig {
    private Logger logger = LoggerFactory.getLogger(DruidDbConfig.class);

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DruidDataSource druidConfig() {

        return new DruidDataSource();
    }
}

controller

IndexController
package com.lemon.emailactivate.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @Author: xiangti
 * @Description:
 * @Date: Create in 2020/5/29 18:34
 */
@Controller
public class IndexController {
    /**
     * 首页
     */
    @RequestMapping(value = "/")
    public String index() {
        return "index";
    }
}
UserController

import com.lemon.emailactivatemon.UUIDUtils;
import com.lemon.emailactivate.entity.User;
import com.lemon.emailactivate.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @Author: xiangti
 * @Description:用户注册
 * @Date: Create in 2020/5/29 18:37
 */
@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 注册
     * @param user
     * @return
     */
    @RequestMapping("/registerUser")
    public String register(User user) {
        user.setStatus(0);
        String code = UUIDUtils.getUUID() + UUIDUtils.getUUID();
        user.setCode(code);
        userService.register(user);
        return "success";
    }

    /**
     * 校验邮箱中的code激活账户
     * 首先根据激活码code查询用户,之后再把状态修改为"1"
     */
    @RequestMapping("/checkCode")
    public String checkCode(String code) {
        User user = userService.checkCode(code);
        System.out.println(user);
        //如果用户不等于null,把用户状态修改status=1
        if (user != null) {
            //已经点击邮箱链接 将状态改为1
            user.setStatus(1);
            //把code验证码清空,已经不需要了
            user.setCode("");
            System.out.println(user);
            userService.updateUserStatus(user);
        }
        return "login";
    }
    /**
     * 跳转到注册页面
     * @return login
     */
    @RequestMapping("/indexPage")
    public String index() {
        return "index";
    }

    /**
     * 跳转到登录页面
     * @return login
     */
    @RequestMapping("/loginPage")
    public String login() {
        return "login";
    }


    /**
     * 登录
     */
    @RequestMapping("/loginUser")
    public String login(User user, Model model) {
        User u = userService.loginUser(user);

        if (u != null) {
            //登录成功  跳转到welcome欢迎页
            return "welcome";
        } else {
            model.addAttribute("msg", "用户名或密码有误,请确认是否已激活!");
            return "login";
        }

    }
}

dao

UserDao

import com.lemon.emailactivate.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

/**
 * @Author: xiangti
 * @Description:
 * @Date: Create in 2020/5/29 18:31
 */
@Mapper
public interface UserDao {
    /**
     * 用户注册,注册的时候默认状态为0:未激活,并且调用邮件服务发送激活码到邮箱
     *
     * @param user
     */
    void register(User user);

    /**
     * 点击邮箱中的激活码进行激活,根据激活码查询用户,之后再进行修改用户状态为1进行激活
     *
     * @param code
     * @return
     */
    User checkCode(String code);

    /**
     * 激活账户,修改用户状态为“1”进行激活
     *
     * @param user
     */
    void updateUserStatus(User user);

    /**
     * 登录,根据用户状态为“1”来查询
     *
     * @param user
     * @return
     */
    User loginUser(User user);

    /**
     * 查出当前用户的状态
     *
     * @param status
     * @return
     */
    User selStatus(String status);

}

entity

User
package com.lemon.emailactivate.entity;

import java.io.Serializable;

/**
 * @Author: xiangti
 * @Description:
 * @Date: Create in 2020/5/12 18:30
 */
public class User implements Serializable {
    private Integer id;
    private String username;
    private String password;
    private String useremail;
    /**
     * 状态:0代表未激活,1代表激活
     */
    private Integer status;
    /**
     * 利用UUID生成一段数字,发动到用户邮箱,当用户点击链接时
     * 在做一个校验如果用户传来的code跟我们发生的code一致,更改状态为“1”来激活用户
     */
    private String code;

    public Integer getId() {
        return id;
    }


    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public String getUseremail() {
        return useremail;
    }

    public void setUseremail(String useremail) {
        this.useremail = useremail;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", useremail='" + useremail + '\'' +
                ", status=" + status +
                ", code='" + code + '\'' +
                '}';
    }
}

service

UserService
package com.lemon.emailactivate.service;


import com.lemon.emailactivate.entity.User;

/**
 * @Author: xiangti
 * @Description:
 * @Date: Create in 2020/5/12/29 18:32
 */
public interface UserService {
    /**
     * 用户注册
     *
     * @param user
     */
    void register(User user);

    /**
     * 根据激活码code查询用户,之后再进行修改状态
     *
     * @param code
     * @return
     */
    User checkCode(String code);

    /**
     * 激活账户,修改用户状态
     *
     * @param user
     */
    void updateUserStatus(User user);

    /**
     * 登录,根据用户状态为“1”来查询
     *
     * @param user
     * @return
     */
    User loginUser(User user);
}

UserServiceImpl
package com.lemon.emailactivate.service.impl;

import com.lemon.emailactivate.dao.UserDao;
import com.lemon.emailactivate.entity.User;
import com.lemon.emailactivate.service.EmailService;
import com.lemon.emailactivate.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    /**
     * 注入邮件接口
     */
    @Autowired
    private EmailService mailService;

    /**
     * 用户注册,同时发送一封激活邮件
     *
     * @param user
     */
    @Override
    public void register(User user) {
        userDao.register(user);

        //获取激活码
        String code = user.getCode();
        System.out.println("code:" + code);
        //主题
        String subject = "来自激活用户认证的邮件";

        //user/checkCode?code=code(激活码)是我们点击邮件链接之后根据激活码查询用户,如果存在说明一致,将用户状态修改为“1”激活
        //上面的激活码发送到用户注册邮箱
        //**************************************本地测试的路径 会失效。**************************************************************
        //String context = "<a href=\"/user/checkCode?code="+code+"\">激活请点击:"+code+"</a>";
        //String context = "<a href=\"http://localhost:8080/user/checkCode?code="+code+"\">激活请点击:"+code+"</a>";
        //*************************************************************************************************************************

        //user/checkCode?code=code(激活码)是我们点击邮件链接之后根据激活码查询用户,如果存在说明一致,将用户状态修改为“1”激活
        //上面的激活码发送到用户注册邮箱
        //注意:此处的链接地址,是项目内部地址,如果我们没有正式的服务器地址,暂时无法从qq邮箱中跳转到我们自己项目的激活页面

        //方式1 注意看上述说明(如不服务器测试 把上面本地代码链接注释)
        String context = "<a href=\"服务器端地址/user/checkCode?code=" + code + "\">激活用户认证请点击=> " + code + "</a>";
        //方式2 注意看上述说明(如不服务器测试 把上面本地代码取消注释)
        //String context = "<a href='服务端地址/user/checkCode?code='+code+'>激活用户认证请点击=> '+code+'</a>";

        //发送激活邮件
        mailService.sendHtmlMail(user.getUseremail(), subject, context);
    }

    /**
     * 根据激活码code进行查询用户,之后再进行修改状态
     *
     * @param code
     * @return
     */
    @Override
    public User checkCode(String code) {

        return userDao.checkCode(code);
    }

    /**
     * 激活账户,修改用户状态
     *
     * @param user
     */
    @Override
    public void updateUserStatus(User user) {
        userDao.updateUserStatus(user);
    }

    /**
     * 登录
     *
     * @param user
     * @return
     */
    @Override
    public User loginUser(User user) {
        User user1 = userDao.loginUser(user);
        if (user1 != null) {
            return user1;
        }
        return null;
    }
}
EmailService
package com.lemon.emailactivate.service;

/**
 * @Author: xiangti
 * @Description:
 * @Date: Create in 2020/5/12/29 18:32
 */
public interface EmailService {

    /**
     * 发送文本邮件,注册部分用不到
     * @param to
     * @param subject
     * @param content
     */
    //void sendSimpleMail(String to, String subject, String content);

    /**
     * 发送HTML邮件,方便用户点击附带的code用来验证激活账户
     *
     * @param to      收件人
     * @param subject 主题
     * @param content 内容
     */
    void sendHtmlMail(String to, String subject, String content);
}

EmailServiceImpl
package com.lemon.emailactivate.service.impl;

import com.lemon.emailactivate.service.EmailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

/**
 * @Author: xiangti
 * @Description:
 * @Date: Create in 2020/5/12/ 18:20
 */
@Service
public class EmailServiceImpl implements EmailService {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    private JavaMailSender mailSender;
    /**
     * 配置文件中我的qq邮箱
     */
    @Value("${spring.mail.from}")
    private String from;

    /**
     * 发送HTML邮件
     *
     * @param to      收件者
     * @param subject 邮件主题
     * @param content 文本内容
     */
    @Override
    public void sendHtmlMail(String to, String subject, String content) {
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = null;
        try {
            helper = new MimeMessageHelper(message, true);
            //邮件发送人
            helper.setFrom(from);
            //邮件主题
            helper.setSubject(subject);
            //邮件接收人
            helper.setTo(to);
            //邮件内容
            helper.setText(content, true);
            //发送邮件
            mailSender.send(message);
            //日志信息
            logger.info("邮件已经发送。");
        } catch (MessagingException e) {
            logger.error("发送邮件时发生异常!", e);
        }
    }
}

EmailactivateApplication启动类

package com.lemon.emailactivate;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
//@MapperScan("com.lemon.emailactivate.dao")  //等同于 dao接口的@Mapper注解
public class EmailactivateApplication {

    public static void main(String[] args) {
        SpringApplication.run(EmailactivateApplication.class, args);
    }

}

resources

mapper

UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis//DTD Mapper 3.0//EN" "http://mybatis/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="com.lemon.emailactivate.dao.UserDao">
    <!--注册用户-->
    <insert id="register" parameterType="User">
        insert into useremail ( username, password,useremail,status,code)
        values (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{useremail,jdbcType=VARCHAR},
        #{status,jdbcType=INTEGER},#{code,jdbcType=INTEGER})
    </insert>

    <!--根据激活码code查询用户-->
    <select id="checkCode" parameterType="String" resultType="User">
        select * from useremail where code = #{code}
    </select>

    <!--激活账户,修改用户状态-->
    <update id="updateUserStatus" parameterType="User">
        update useremail set status=1,code=null where id=#{id}
    </update>

    <!--登录,根据 status=1 进行查询-->
    <select id="loginUser" resultType="User">
        select * from useremail where username=#{username} and password=#{password} and status=1
    </select>

</mapper>

templates

error

404.html
500.html

可自行百度搜索报错页面效果,也可不写404和500页面。

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
    <!-- 引入 Bootstrap在线cdn -->
    <link href="https://cdn.jsdelivr/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="row clearfix" style="text-align: center">
    <div class="page-header">
        <h1>
            <small>注册中心</small>
        </h1>
    </div>
</div>

<div align="center">
    <form action="/user/registerUser" method="post" style="width: 30%">
        <div class="form-group">
            <label for="username">用户名</label><br>
            <input type="text" class="form-control" id="username" maxlength="10" name="username" placeholder="请输入注册的用户名"
                   required/>
            <br>
        </div>

        <div class="form-group">
            <label for="password">登录密码</label><br>
            <input type="password" class="form-control" maxlength="16" id="password" name="password"
                   placeholder="请输入注册的密码" required/><br>
        </div>

        <div class="form-group">
            <label for="email">邮箱地址</label><br>
            <input type="email" class="form-control" id="email" name="useremail" placeholder="请输入可接收邮件的邮箱" required><br>
        </div>


        <input type="submit" class="btn btn-primary" value="确认注册" onclick="return confirm('确认注册吗?')"/>
    </form>
</div>

<div class="row clearfix" style="text-align: center">
    <br>
    <a href="/user/loginPage" class="btn btn-warning">去登录页面</a>
</div>

</body>
</html>

login.html

<html lang="en" xmlns:th="http://www.thymeleaf">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
    <!-- 引入 Bootstrap在线cdn -->
    <link href="https://cdn.jsdelivr/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="row clearfix" style="text-align: center">
    <div class="page-header">
        <h1>
            <small>登录页面</small>
        </h1>
    </div>
</div>

<div align="center">
    <form action="/user/loginUser" method="post" style="width: 30%">
        <!--如果msg的值为空 不显示提示的信息-->
        <span th:text="${msg}" th:if="${not #strings.isEmpty(msg)}" style="color: red"></span>
        <span th:text="${status}" style="color: pink"></span>
        <div class="form-group">
            <label for="username">用户名</label><br>
            <input type="text" class="form-control" id="username" maxlength="10" name="username" placeholder="请输入您的账户"
                   required style="width: 60%"/><br>
        </div>

        <div class="form-group">
            <label for="password">密码</label><br>
            <input type="password" class="form-control" maxlength="16" id="password" name="password"
                   placeholder="请输入您的密码" required style="width: 60%"/><br>
        </div>

        <!--判断是否激活用的-->
        <!--<input type="hidden" name="status" value="1">-->

        <input type="submit" class="btn btn-primary" value="登录账号"/>
    </form>
</div>

<div class="row clearfix" style="text-align: center">
    <br>
    <a href="/user/indexPage" class="btn btn-warning">去注册页面</a>
</div>

</body>
</html>

success.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册成功</title>
    <!-- 引入 Bootstrap在线cdn -->
    <link href="https://cdn.jsdelivr/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<script type="text/javascript">
    function countDown(secs, surl) {
        //alert(surl);
        var jumpTo = document.getElementById('jumpTo');
        jumpTo.innerHTML = secs;
        if (--secs > 0) {
            setTimeout("countDown(" + secs + ",'" + surl + "')", 1000);
        } else {
            location.href = surl;
        }
    }
</script>
<body>

<div class="row clearfix" style="text-align: center;background-color: pink;color: blue;margin-top: 30px">
    <div style="font-size: 20px">
        <span>邮件已成功发送,请点击邮箱链接激活用户哦~ </span>
        <span id="jumpTo" style="color: black">15</span>秒后将自动跳转到登录页
    </div>
</div>
<script type="text/javascript">
    // 15 秒后跳转的页面

    countDown(15,'http://localhost:8080/user/loginPage');//地测试的路径(15s后自动跳转到登录页)
    //countDown(15, 'http://服务端地址/user/loginPage');//服务器测试的路径
</script>

</body>
</html>

welcome.html

处的欢迎页是我找的源码设置的,欢迎页可自定义为自己想设置的内容,此欢迎页效果图如下图所示,可自己更改。

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>welcome</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        body {
            overflow: hidden;
        }

        /*canvas{ background: #0c0c0c; }*/
    </style>
</head>
<body>
<canvas id="canvas"> 您的浏览器不支持canvas标签,请您更换浏览器</canvas>
<script>
    var canvas = document.getElementById("canvas");
    var can = canvas.getContext("2d");
    var s = window.screen;//获取屏幕
    var w = canvas.width = s.width;//获取屏幕宽度
    var h = canvas.height = s.height;//获取屏幕高度

    can.fillStyle = color2();

    var words = Array(256).join("1").split("");
    //设置一个包含256个空元素的数组,join("1")用来把数组里的元素拼接成字符串,split("")过滤掉数组里的空元素

    setInterval(draw, 50);


    // can.font="30px 微软雅黑"; //只设置一个不生效,一定要两个属性都设
    // //绘制实心的文本:绘制的文本,文本的坐标x,文本的坐标y
    // can.fillText("黑客帝国",100,100);
    // // setInterval(draw,50);


    function draw() {
        //can.fillRect()画一个实心矩形:坐标x,坐标y,矩形宽,举行高
        can.fillStyle = 'rgba(0,0,0,0.05)';
        can.fillRect(0, 0, w, h);
        can.fillStyle = color2();
        words.map(function (y, n) {
            text = String.fromCharCode(Math.ceil(65 + Math.random() * 57)); //转换为键盘上值
            x = n * 10;
            can.fillText(text, x, y)
            words[n] = (y > 758 + Math.random() * 484 ? 0 : y + 10);
        });//数组元素的一个映射
    }

    //获取随机颜色,三种方法
    function color1() {
        var colors = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];
        var color = "";
        for (var i = 0; i < 6; i++) {
            //Math.random()产生一个0-1之间的小数
            var n = Math.ceil(Math.random() * 15);
            color += "" + colors[n];
            // console.log(color);
        }
        return '#' + color;
    }

    function color2() {
        var color = Math.ceil(Math.random() * 16777215).toString(16);
        // for( var i=color.length; i<6; i++ ){
        // 	color = '0'+color;
        // }
        while (color.length < 6) {
            color = '0' + color;
        }
        return '#' + color;
    }

    function color3() {
        return "#" + (function (color) {
            return new Array(7 - color.length).join("0") + color;
            //神奇的方法,总共字符串有6位,如果只产生了3位,则前面应该补三个0,在长度为7-3=4的空数组中利用join插入0,则为['',0,'',0,'',0,''],刚好三个0补在前面
        })((Math.random() * 0x1000000 << 0).toString(16))
        // << 0 也是一种取整的方法
    }


</script>
</body>
</html>

application.properties

注意设置数据库连接需要更改为自己的,如不是qq邮箱地址 此处要更改邮箱类型地址,此处为qq邮箱。 以及还要配置自己邮箱stmp密码 不会开启邮箱stmp的参考文章顶部方法配置

server.port=8080

# MyBatis相关配置
spring.devtools.remote.restart.enabled=true
spring.devtools.restart.additional-paths=src/main
# 数据库连接配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/数据库?characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=12345678
spring.http.encoding.charset=UTF-8
spring.http.encoding.force=true
spring.http.encoding.enabled=true
server.tomcat.uri-encoding=UTF-8
#MyBatis别名
mybatis.type-aliases-package=com.lemon.emailactivate.entity
mybatis.mapper-locations=mapper/*.xml
spring.thymeleaf.prefix=classpath:/templates/

#QQ smtp.qq
#sina smtp.sina
#aliyun smtp.aliyun
#163 smtp.163
# ↑ 邮箱服务器地址

#此处设置的stmp为qq邮箱
spring.mail.host=smtp.qq
#邮箱用户名(使用自己的邮箱)
spring.mail.username=xxx.qq
#邮箱密码(注意:qq邮箱应该使用独立密码,去qq邮箱设置里面开启POP3/SMTP服务)
spring.mail.password=输入邮箱stmp字符
#编码格式
spring.mail.default-encoding=UTF-8
##发送邮件地址(使用自己的邮箱)
spring.mail.from=xxxx.qq

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache/POM/4.0.0" xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache/POM/4.0.0 https://maven.apache/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.lemon</groupId>
    <artifactId>emailactivate</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>emailactivate</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--MyBatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

        <!--SpringBoot测试支持-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--MySQL-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--SpringBoot热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
        </dependency>

        <!--Druid数据库连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--邮件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

        <!--thymeleaf-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

此代码只供一个发送邮件至邮箱激活,存在一些bug。例如:用户名邮箱已存在还注册 发送邮件等,需要自己后期加入条件判断做进一步的优化

此项目代码已完全提供完毕,如果有遇到问题联系qq1136720013,vx:it566666 ,希望给个赞评论支持一下,感谢支持,你的支持是我创作最大的动力,愿开发道路上一起更进一步!

本文标签: 账户激活码邮箱功能SpringBoot