在上篇博客《Spring-boot使用eclipse搭建项目(一)》中,我们已经搭建好一个spring-boot的初始项目结构,本节我们来丰富我们的项目,完成一个注册登录功能(前端页面使用Bootstrap处理样式)。
由于在pom.xml中我们引入了thymeleaf模板,所以我们的公共资源不用每个页面都写一遍引入,直接引入模板就可以了,类似于jsp中的include。
首先创建一个base.html用来引入公共资源。
base.html代码:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:fragment = "commonHead(title)">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title th:text="${title}">spring boot</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" th:href="@{http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css}">
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script type="text/javascript" th:src="@{http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js}"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script type="text/javascript" th:src="@{http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js}"></script>
</head>
<body>
</body>
</html>
这样其他html页面若需使用到bootstrap、jquery可以引入base.html。
注:我把js放在html代码里面写了,如果想单独引其他js,即放在<head></head>标签外,在引入时和base.html中引入的格式风格一致就可以单独引入js。
register.html代码:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:include="/common/base :: commonHead('注册')">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title th:text="${title}">注册</title>
</head>
<style>
html, body {
height: 100%;
width: 100%
overflow: auto;
}
.alert-warning{
height:30px;
margin-bottom:0;
}
</style>
<body>
<form class="form-horizontal" role="form" style="padding:30px 25% 10px; min-width: 800px;">
<fieldset>
<legend>注册</legend>
</fieldset>
<div class="panel panel-primary">
<div class="panel-heading">账号信息</div>
<div class="panel-body ">
<div class="form-group ">
<label for="username" class="col-sm-3 control-label">账号:</label>
<div class="col-sm-5">
<input type="text" class="form-control" id="username" οnblur="checkuserName()" placeholder="字母开头,6-16位字母和数字组成"/>
</div>
<div id="warn1" class="alert alert-warning col-sm-3" style="padding:6px" ></div>
</div>
<div class="form-group">
<label for="password" class="col-sm-3 control-label">密码:</label>
<div class="col-sm-5">
<input type="password" class="form-control" id="password" οnblur="checkPwd()" placeholder="6-16位字母和数字组成"/>
</div>
<div id="warn2" class="alert alert-warning col-sm-3" style="padding:6px" >
</div>
</div>
<div class="form-group">
<label for="password_cp" class="col-sm-3 control-label">确认密码:</label>
<div class="col-sm-5">
<input type="password" class="form-control" id="password_cp" οnblur="checkPwdcp()" placeholder="确认密码"/>
</div>
<div id="warn3" class="alert alert-warning col-sm-3" style="padding:6px" >
</div>
</div>
</div>
</div>
<div class="form-group">
<div style="text-align:center;">
<button type="button" class="btn btn-warning" style="width:150px" οnclick="resets();">重置</button>
<button type="button" id="registers" class="btn btn-success" style="width:150px" οnclick="register();">立即注册</button>
</div>
</div>
</form>
</body>
<script type="text/javascript">
/*<![CDATA[*/
var basePath = [[@{/}]]; //获取项目根路径
/*]]>*/
$(function(){
$('.alert-warning').hide();
});
function checkuserName(){
$('.alert').hide();
var userName = $.trim($('#username').val());
var regCode=/^[a-zA-Z][a-zA-Z0-9]{5,15}$/;
if(userName == ''){
$('#warn1').html('登录名不能为空!');
$('#warn1').show();
return;
}
if(!regCode.test(userName)){
$('#warn1').html('格式错误!英文字母和数字组成的6-16位字符,以字母开头!');
$('#warn1').show();
return;
}
}
function checkPwd(){
$('.alert-warning').hide();
var password = $.trim($('#password').val());
var regPwd=/^[a-zA-Z0-9]{6,16}$/;
if(password == ''){
$('#warn2').html('密码不能为空!');
$('#warn2').show();
return;
}
if(!regPwd.test(password)){
$('#warn2').html('格式错误!英文字母和数字组成的6-16位字符!');
$('#warn2').show();
return;
}
}
function checkPwdcp(){
$('.alert-warning').hide();
var password = $.trim($('#password').val());
var password_cp = $.trim($('#password_cp').val());
if(password_cp == ''){
$('#warn3').html('确认密码不能为空!');
$('#warn3').show();
return;
}
if(password != password_cp){
$('#warn3').html('前后密码不一致!');
$('#warn3').show();
return;
}
}
function register(){
$('.alert-warning').hide();
var userName = $.trim($('#username').val());
var password = $.trim($('#password').val());
var password_cp = $.trim($('#password_cp').val());
var regCode=/^[a-zA-Z][a-zA-Z0-9]{5,15}$/;
var regPwd=/^[a-zA-Z0-9]{6,16}$/;
if(userName == ''){
alert('登录名不能为空!');
return;
}
if(!regCode.test(userName)){
alert('格式错误!英文字母和数字组成的6-16位字符,以字母开头!');
return;
}
if(password == ''){
alert('密码不能为空!');
return;
}
if(!regPwd.test(password)){
alert('格式错误!英文字母和数字组成的6-16位字符!');
return;
}
if(password_cp == ''){
alert('确认密码不能为空!');
return;
}
if(!regPwd.test(password_cp)){
alert('格式错误!英文字母和数字组成的6-16位字符!');
return;
}
if(password != password_cp){
alert('前后密码不一致!');
return;
}
$.ajax({
type:'POST',
contentType: 'application/x-www-form-urlencoded',
url: basePath + '/login/register',
data:{
user_name:userName,
pass_word:password
},
dataType:'json',
success:function(returnData){
if(returnData){
$('#message').html('');
if(returnData == "400"){
alert('登录名重复!');
}else if(returnData == "500"){
alert('注册异常!');
}else if(returnData == "200"){
resets();
alert('注册成功!');
window.setTimeout('toLoginPage()', 800);
}
}
},
error:function(request){
return false;
}
});
}
function toLoginPage(){
location.href=basePath+'login/loginPage';
}
function resets(){
$('.alert-warning').hide();
$('#username').val('');
$('#password').val('');
$('#password_cp').val('');
}
</script>
</html>
login.html代码:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:include="/common/base :: commonHead('登录')">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title th:text="${title}">登录</title>
</head>
<style>
.lanren {
position: fixed;
left: 50%;
top: 50%;
margin-top: -200px;
margin-left: -530px;
}
</style>
<body>
<div class="top-content lanren">
<div class="inner-bg">
<div class="container">
<div class="row">
<div class="col-sm-5 col-sm-offset-3 form-box">
<div class="form-top">
<fieldset>
<legend>登录</legend>
</fieldset>
</div>
<div class="panel panel-primary">
<div class="panel-heading">请输入</div>
<div class="panel-body">
<div class="form-bottom">
<form role="form" method="post" class="login-form">
<div class="form-group">
<label class="control-label" style="width: 15%;"
for="user_name">账号:</label> <input type="text"
class="form-control pull-right"
style="display: inline-block; width: 80%;" name="user_name"
placeholder="账号...(字母开头,6-16位字母和数字组成)" id="user_name">
</div>
<div class="form-group">
<label class="control-label" style="width: 15%;"
for="password">密码:</label> <input type="password"
class="form-control pull-right"
style="display: inline-block; width: 80%;" name="password"
placeholder="密码...(6-16位字母和数字组成)" id="password">
</div>
</form>
<div>
<button type="submit" class="btn btn-info"
style="width: 150px;" οnclick="toRegisterPage();">注册</button>
<button type="submit" id="login" class="btn btn-success"
style="width: 150px; float: right;" οnclick="login();">登录</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript">
/*<![CDATA[*/
var basePath = [[@{/}]];
/*]]>*/
$(function(){
$(document).keyup(function(event){
if(event.keyCode ==13){
$("#login").trigger("click");
}
});
});
function toRegisterPage(){
var url = basePath+'login/registerPage';
location.href=url;
}
function login(){
var user_name = $('#user_name').val();
var password = $('#password').val();
var regCode=/^[a-zA-Z][a-zA-Z0-9]{5,15}$/;
var regPwd=/^[a-zA-Z0-9]{6,16}$/;
if(user_name == ''){
alert('登录名不能为空!');
return;
}
if(password == ''){
alert('密码不能为空!');
return;
}
if(!regCode.test(user_name)){
alert('登录名格式错误!英文字母和数字组成的6-16位字符,以字母开头!');
return;
}
if(!regPwd.test(password)){
alert('密码格式错误!英文字母和数字组成的6-16位字符!');
return;
}
$.ajax({
type:'POST',
contentType: 'application/x-www-form-urlencoded',
url: basePath + '/login/userLogin',
data:{
user_name:user_name,
pass_word:password
},
dataType:'json',
success:function(returnData){
if(returnData){
if(returnData == "500"){
alert('账号或密码错误!请检查账号和密码是否正确!');
}else if(returnData == "200"){
alert('登录成功!');
window.setTimeout('toSuccess()', 800);
}
}
},
error:function(request){
return false;
}
});
}
function toRegisterPage(){
location.href=basePath+'login/registerPage';
}
function toSuccess(){
location.href=basePath+'login/success';
}
</script>
</html>
success.html代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>登录成功!!</h1>
</body>
</html>
后台代码:
LoginController.java:
package com.springboottest.web;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.springboottest.service.ILoginService;
@Controller
@RequestMapping("/login")
public class LoginController {
@Autowired
private ILoginService loginService;
/**
* 跳转到注册页面
* @return
*/
@RequestMapping("/registerPage")
public String registerPage(){
return "register";
}
/**
* 注册
* @param requestMap
* @return
*/
@RequestMapping("/register")
@ResponseBody
public String register(@RequestParam Map<String,String> requestMap){
return loginService.register(requestMap);
}
/**
* 跳转到登录页面
* @return
*/
@RequestMapping("/loginPage")
public String loginPage(){
return "login";
}
/**
* 登录
* @param requestMap
* @return
*/
@RequestMapping("/userLogin")
@ResponseBody
public String userLogin(@RequestParam Map<String,String> requestMap){
return loginService.login(requestMap);
}
/**
* 跳转到成功页面
* @return
*/
@RequestMapping("/success")
public String toSuccess(){
return "success";
}
}
ILoginService.java:
package com.springboottest.service;
import java.util.Map;
public interface ILoginService {
/**
* 注册
* @param requestMap
* @return
*/
public String register(Map<String,String> requestMap);
/**
* 登录
* @param requestMap
* @return
*/
public String login(Map<String,String> requestMap);
}
LoginServiceImpl.java:
package com.springboottest.service.impl;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.springboottest.dao.ILoginDao;
import com.springboottest.model.User;
import com.springboottest.service.ILoginService;
@Service("loginService")
@Transactional
public class LoginServiceImpl implements ILoginService {
@Autowired
private ILoginDao loginDao;
@Override
public String register(Map<String, String> requestMap) {
String user_name = requestMap.get("user_name");
String pass_word = requestMap.get("pass_word");
User user = new User();
user.setUser_name(user_name);
user.setPass_word(pass_word);
try {
//先校验用户名是否重复
List<Map<String, Object>> checkResult = loginDao.checkUserName(user);
if(checkResult!=null && checkResult.size()>0){
return "400";//用户名重复
}
int result = loginDao.register(user);
if(result>0){
return "200";//成功
}
} catch (Exception e) {
e.printStackTrace();
return "500";//异常
}
return "500";//异常
}
@Override
public String login(Map<String, String> requestMap) {
String user_name = requestMap.get("user_name");
String pass_word = requestMap.get("pass_word");
User user = new User();
user.setUser_name(user_name);
user.setPass_word(pass_word);
List<User> result = loginDao.login(user);
if(result != null && result.size() > 0){
return "200";//登陆成功
}
return "500";//登录失败
}
}
ILoginDao.java:
package com.springboottest.dao;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.springboottest.model.User;
@Mapper
public interface ILoginDao {
/**
* 校验用户名是否重复
* @param user
* @return
*/
@Select("SELECT USER_NAME FROM USER WHERE USER_NAME = #{user.user_name}")
public List<Map<String,Object>> checkUserName(@Param("user") User user);
/**
* 注册
* @param user
* @return
*/
@Insert("INSERT INTO USER(user_name,pass_word) VALUES(#{user.user_name},#{user.pass_word})")
public int register(@Param("user") User user);
/**
* 登录
* @param user
* @return
*/
@Select("SELECT USER_NAME,PASS_WORD FROM USER WHERE USER_NAME = #{user.user_name} AND PASS_WORD = #{user.pass_word}")
public List<User> login(@Param("user") User user);
}
User.java:
package com.springboottest.model;
public class User {
private String user_name;
private String pass_word;
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getPass_word() {
return pass_word;
}
public void setPass_word(String pass_word) {
this.pass_word = pass_word;
}
@Override
public String toString() {
return "User [user_name=" + user_name + ", pass_word=" + pass_word + "]";
}
}
代码里面已实现登录和注册的基本功能,页面样式使用bootstrap响应式布局实现,有很多瑕疵,并且在于非chorme浏览器下可能会出现样式问题。有很多改进空间,如果拿去使用需谨慎。
至此一个基于Spring-boot,应用Bootstrap实现登录注册的项目完毕。