aspnet登录界面代码_基于SpringBoot/email实现的登录注册DEMO

前言

随着IT行业的发展,越来越多的人投入到计算机行业,也越来越多的草根站长尝试创建自己的网站,一是检验自己的编码水平,二是经营好一个网站可以给我们带来一定的收入。一个网站,一般前期都有会员的登录注册功能,随着用户上来,可能就会开始集成第三方登录登录,如QQ,微信,微博扫码登录等。本文档主要介绍基于邮箱验证码来实现合理的登录注册功能,保证注册用户的合法性。

创建工程

项目主要采用springboot来快速构建工程,构建方式此处省略,在构建项目过程中我们主要引用如下依赖即可,后期根据需求再逐个添加其他依赖:

15039ba16e384fbc85b3029977f4eddc

集成静态界面

快速集成静态界面,将资料里面的boot-login-layui-demo文件夹下的html文件集成到项目中

bc660b14733942ccadfdd47c414f02bc

新建FrontController.java控制类

package com.democxy.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;@Controllerpublic class FrontController {    @GetMapping("/login")    public String login(){        return "login";    }    @GetMapping("/regit")    public String regit(){        return "reg";    }    @GetMapping("/index")    public String index(){        return "index";    }}

启动项目,浏览器输入http://localhost:8080/login 访问登录界面

4ddd5da3fa794b5f84340b5403b61049

到此,静态界面初步引入成功:

抽离出公共界面

在前一节中 我们已经初步引入了我们的静态界面,并可正常输入请求地址请求到相关界面,本节主要是对静态界面做一些改进,如抽离头部部分,改善代码中引入路径等信息

抽离公共页面:

我们可以发现无论是首页 登录页还是注册页,都有一段重复的代码,也就是我们的头部和尾部

头部代码:

 
                               源码分享                    案例                                            贤心            VIP3      5db11ff4gw1e77d3nqrv8j203b03cweg.jpg              基本设置      我的消息      我的主页            退出            

尾部代码:

我们新建一个common.html界面:将以上两部分公共代码块保存起来,并使用thymeleaf标签th:fragment声明这是一个代码块:

   
                                                               源码分享                                        案例                                                                                                                贤心                                        VIP3                    5db11ff4gw1e77d3nqrv8j203b03cweg.jpg                                                    基本设置                    我的消息                    我的主页                                        退出                                        

引入代码块:

抽离出公共代码块 接下来我们就可以在使用它的地方使用标签:th:replace来引入

如:

修改头部文件

在上一节已经把公共头部抽离出来了,本节主要修改头部代码,使其实现未登录时出现登录注册按钮,并设置跳转对应链接:

首先,为了便于开发,我们先要关闭thymeleaf的模板缓存,在配置文件中加入:

spring:  thymeleaf:    cache: false

修改头部代码(修改后代码如下):

   
                                                               源码分享                                        案例                                                                  登入                                      注册                                                                        贤心                    5db11ff4gw1e77d3nqrv8j203b03cweg.jpg                                                        安全退出                        

集成mybaits

引入依赖:

org.mybatis.spring.boot    mybatis-spring-boot-starter    2.1.1    mysql    mysql-connector-java

新增mybatis-config.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-config.dtd">                                                    

yaml文件新增数据库配置信息:

mybatis:  config-location: classpath:mybatis-config.xml  mapper-locations: classpath:mapper/**/*.xmlspring:  datasource:    username: root    password: 123456    driver-class-name: com.mysql.jdbc.Driver    url: jdbc:mysql://127.0.0.1:3306/email-demo?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8

完善后台代码:

新建实体类com.democxy.entity.Member

package com.democxy.entity;import java.util.Date;public class Member {    // 会员ID    private String id;    // 会员昵称    private String username;    // 会员密码    private String password;    // 会员注册时间    private Date regitTime;    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public Date getRegitTime() {        return regitTime;    }    public void setRegitTime(Date regitTime) {        this.regitTime = regitTime;    }}

新建mapper接口类 com.democxy.mapper.MemberMapper

package com.democxy.mapper;import com.democxy.entity.Member;import org.apache.ibatis.annotations.Mapper;@Mapperpublic interface MemberMapper {    int insert(Member member);    Member login(Member member);}

新建service接口类 com.democxy.service.MemberService

pacage com.democxy.service;import com.democxy.entity.Member;import com.democxy.mapper.MemberMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;​@Servicepublic class MemberService {​    @Autowired    MemberMapper memberMapper;​    public int insert(Member member){        return memberMapper.insert(member);    }​    public Member login(Member member){        return memberMapper.login(member);    }​}​

新建mapper配置文件:mapper/MemberMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">            a.id AS "id",        a.username AS "username",        a.password AS "password",        a.regit_time AS "regitTime"                        SELECT                FROM member a                WHERE a.username = #{username} and a.password = #{password}                INSERT INTO member(        username,        password,        regit_time        ) VALUES (        #{username},        #{password},        #{regitTime}        )    

新增测试代码:com.democxy.EmailDemoApplicationTests

package com.democxy;import com.democxy.entity.Member;import com.democxy.service.MemberService;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import javax.xml.ws.Service;import java.util.Date;@SpringBootTestclass EmailDemoApplicationTests {    @Autowired    MemberService memberService;    @Test    void contextLoads() {        Member member = new Member();        member.setUsername("admin");        member.setPassword("123456");        member.setRegitTime(new Date());        memberService.insert(member);    }}

启动测试后我们会发现数据库成功插入了一条记录,至此后台代码基本完善。

集成email实现邮件发送功能

引入依赖:

org.springframework.boot    spring-boot-starter-mail

yaml文件新增邮箱配置信息:

spring:    mail:        host: smtp.qq.com        port: 465        username: 2534754276@qq.com        password: xxxx #授权码        default-encoding: utf-8        properties:          mail:            smtp:              ssl:                enable: true #一定要开启ssl,不然会503 验证失败的

新增邮件发送服务类com.democxy.service.EmailService

package com.democxy.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.mail.SimpleMailMessage;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;@Servicepublic class EmailService {    @Autowired    private JavaMailSender javaMailSender;    @Value("${spring.mail.username}")    private String sender;    public void sendMail(String to, String subject, String content) {        SimpleMailMessage mailMessage=new SimpleMailMessage();        mailMessage.setFrom(sender);        mailMessage.setTo(to);        mailMessage.setSubject(subject);        mailMessage.setText(content);        try {            javaMailSender.send(mailMessage);        }catch (Exception e){            e.printStackTrace();            System.out.println("发送简单邮件失败");        }    }    public void sendHtmlMail(String to,String subject, String content) {        MimeMessage message = javaMailSender.createMimeMessage();        try {            //true表示需要创建一个multipart message            MimeMessageHelper helper = new MimeMessageHelper(message, true);            helper.setFrom(sender);            helper.setTo(to);//邮件接收者            helper.setSubject(subject);//邮件主题            helper.setText(content, true);//邮件内容            javaMailSender.send(message);        } catch (MessagingException e) {        }    }}

测试类新增测试方法:

package com.democxy;import com.democxy.entity.Member;import com.democxy.service.EmailService;import com.democxy.service.MemberService;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import javax.xml.ws.Service;import java.util.Date;@SpringBootTestclass EmailDemoApplicationTests {    @Autowired    MemberService memberService;    @Autowired    EmailService emailService;    @Test    void contextLoads() {        Member member = new Member();        member.setUsername("admin");        member.setPassword("123456");        member.setRegitTime(new Date());        memberService.insert(member);    }    @Test    void sendEmail() {        emailService.sendHtmlMail("2534754276@qq.com","网站注册","验证码:8989");    }}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是ASP.NET MVC实现注册和登录的详细代码: 首先是注册页面的视图代码(Register.cshtml): ``` @model YourNamespace.ViewModels.RegisterViewModel @{ ViewBag.Title = "Register"; } <h2>@ViewBag.Title.</h2> @using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.AntiForgeryToken() <hr /> <div class="form-group"> @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.TextBoxFor(m => m.Email, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.Email) </div> </div> <div class="form-group"> @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.PasswordFor(m => m.Password, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.Password) </div> </div> <div class="form-group"> @Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.ConfirmPassword) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <button type="submit" class="btn btn-default">Register</button> </div> </div> } @section Scripts { @Scripts.Render("~/bundles/jqueryval") } ``` 接下来是注册页面的模型代码(RegisterViewModel.cs): ``` using System.ComponentModel.DataAnnotations; namespace YourNamespace.ViewModels { public class RegisterViewModel { [Required] [EmailAddress] [Display(Name = "Email")] public string Email { get; set; } [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm password")] [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] public string ConfirmPassword { get; set; } } } ``` 然后是注册页面的控制器代码(AccountController.cs): ``` using System.Threading.Tasks; using System.Web.Mvc; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.EntityFramework; using YourNamespace.Models; using YourNamespace.ViewModels; namespace YourNamespace.Controllers { public class AccountController : Controller { private readonly UserManager<ApplicationUser> _userManager; public AccountController() { _userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); } [HttpGet] public ActionResult Register() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { await SignInAsync(user, isPersistent: false); return RedirectToAction("Index", "Home"); } AddErrors(result); } return View(model); } private async Task SignInAsync(ApplicationUser user, bool isPersistent) { AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); var identity = await _userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, identity); } private IAuthenticationManager AuthenticationManager => HttpContext.GetOwinContext().Authentication; private void AddErrors(IdentityResult result) { foreach (var error in result.Errors) { ModelState.AddModelError("", error); } } } } ``` 现在是登录页面的视图代码(Login.cshtml): ``` @model YourNamespace.ViewModels.LoginViewModel @{ ViewBag.Title = "Log in"; } <h2>@ViewBag.Title.</h2> @using (Html.BeginForm("Login", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.AntiForgeryToken() <hr /> <div class="form-group"> @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.TextBoxFor(m => m.Email, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.Email) </div> </div> <div class="form-group"> @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.PasswordFor(m => m.Password, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.Password) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <div class="checkbox"> <label> @Html.CheckBoxFor(m => m.RememberMe) Remember me </label> </div> </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <button type="submit" class="btn btn-default">Log in</button> </div> </div> } @section Scripts { @Scripts.Render("~/bundles/jqueryval") } ``` 然后是登录页面的模型代码(LoginViewModel.cs): ``` using System.ComponentModel.DataAnnotations; namespace YourNamespace.ViewModels { public class LoginViewModel { [Required] [EmailAddress] [Display(Name = "Email")] public string Email { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [Display(Name = "Remember me?")] public bool RememberMe { get; set; } } } ``` 最后是登录页面的控制器代码(AccountController.cs): ``` using System.Threading.Tasks; using System.Web; using System.Web.Mvc; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.EntityFramework; using Microsoft.Owin.Security; using YourNamespace.Models; using YourNamespace.ViewModels; namespace YourNamespace.Controllers { public class AccountController : Controller { private readonly UserManager<ApplicationUser> _userManager; public AccountController() { _userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); } [HttpGet] public ActionResult Register() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { await SignInAsync(user, isPersistent: false); return RedirectToAction("Index", "Home"); } AddErrors(result); } return View(model); } [HttpGet] public ActionResult Login(string returnUrl) { ViewBag.ReturnUrl = returnUrl; return View(); } [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { if (ModelState.IsValid) { var user = await _userManager.FindAsync(model.Email, model.Password); if (user != null) { await SignInAsync(user, model.RememberMe); return RedirectToLocal(returnUrl); } ModelState.AddModelError("", "Invalid username or password."); } return View(model); } private async Task SignInAsync(ApplicationUser user, bool isPersistent) { AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); var identity = await _userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, identity); } private IAuthenticationManager AuthenticationManager => HttpContext.GetOwinContext().Authentication; private void AddErrors(IdentityResult result) { foreach (var error in result.Errors) { ModelState.AddModelError("", error); } } private ActionResult RedirectToLocal(string returnUrl) { if (Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } return RedirectToAction("Index", "Home"); } } } ``` 这些代码提供了一个基本的注册和登录系统,但您可以根据自己的需求进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值