springboot+vue 旅游信息管理系统(二)用户注册与用户登录的实现
com.gohb.travels.Controller.UserController代码如下:package com.gohb.travels.Controller;import com.gohb.travels.entity.Result;import com.gohb.travels.entity.User;import com.gohb.travels.service.UserSe...
·
旅游信息管理系统 用户注册与用户登录的实现
前言
代码已上传至github:https://github.com/kalipoison/travelManageSystem
流程
com.gohb.travels.Controller.UserController代码如下:
package com.gohb.travels.Controller;
import com.gohb.travels.entity.Result;
import com.gohb.travels.entity.User;
import com.gohb.travels.service.UserService;
import com.gohb.travels.utils.CreateImageCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.Base64Utils;
import org.springframework.web.bind.annotation.*;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("user")
@CrossOrigin //允许跨域
@Slf4j
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("login")
public Result login(@RequestBody User user,HttpServletRequest request) {
Result result = new Result();
log.info("user: " + user);
try {
User userDB = userService.login(user);
//登录成功之后保存用户的标记 ServletContext application Redis userid userdb
request.getServletContext().setAttribute(userDB.getId(),userDB);
result.setMsg("登录成功~~").setUserId(userDB.getId());
} catch (Exception e) {
result.setState(false).setMsg(e.getMessage());
}
return result;
}
/**
* 用户注册
*
* @param code
* @param user
* @return
*/
@PostMapping("register")
public Result register(String code, String key, @RequestBody User user, HttpServletRequest request) {
Result result = new Result();
log.info("接收的验证码: " + code);
log.info("接收的验证码的key: " + key);
log.info("接收到user对象: " + user);
//验证验证码
String keyCode = (String) request.getServletContext().getAttribute(key);
log.info(keyCode);
try {
if (code.equalsIgnoreCase(keyCode)) {
//注册用户
userService.register(user);
result.setMsg("注册成功!!!");
} else {
throw new RuntimeException("验证码错误!!!");
}
} catch (Exception e) {
e.printStackTrace();
result.setMsg(e.getMessage()).setState(false);
}
return result;
}
/**
* 生成验证码
*
* @throws IOException
*/
@GetMapping("getImage")
public Map<String, String> getImage(HttpServletRequest request) throws IOException {
Map<String, String> result = new HashMap<>();
CreateImageCode createImageCode = new CreateImageCode();
//获取验证码
String securityCode = createImageCode.getCode();
//验证码存入session
String key = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
request.getServletContext().setAttribute(key, securityCode);
//生成图片
BufferedImage image = createImageCode.getBuffImg();
//进行base64编码
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "png", bos);
String string = Base64Utils.encodeToString(bos.toByteArray());
result.put("key", key);
result.put("image", string);
return result;
}
}
com.gohb.travels.dao.UserDAO代码如下:
package com.gohb.travels.dao;
import com.gohb.travels.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserDAO {
//根据用户名查询用户
User findByUsername(String username);
//注册用户
void save(User user);
}
com.gohb.travels.entity.Result代码如下:
package com.gohb.travels.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain=true)
public class Result {
private Boolean state = true;
private String msg;
private String userId;
}
com.gohb.travels.entity.Users代码如下:
package com.gohb.travels.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
private String id;
private String username;
private String password;
private String email;
}
com.gohb.travels.service.UserService代码如下:
package com.gohb.travels.service;
import com.gohb.travels.entity.User;
public interface UserService {
User login(User user);
void register(User user);
}
com.gohb.travels.service.UserServiceImpl代码如下:
package com.gohb.travels.service;
import com.gohb.travels.dao.UserDAO;
import com.gohb.travels.entity.User;
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;
@Override
public User login(User user) {
User userDB = userDAO.findByUsername(user.getUsername());
if(userDB!=null){
if(userDB.getPassword().equals(user.getPassword())){
return userDB;
}
throw new RuntimeException("密码输入错误~~~");
}else{
throw new RuntimeException("用户名输入错误!!!");
}
}
@Override
public void register(User user) {
if (userDAO.findByUsername(user.getUsername()) == null) {
userDAO.save(user);
}else{
throw new RuntimeException("用户名已经存在~~~~");
}
}
}
com.gohb.travels.utils.CreateImageCode代码如下:
package com.gohb.travels.utils;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
public class CreateImageCode {
// 图片的宽度。
private int width = 160;
// 图片的高度。
private int height = 40;
// 验证码字符个数
private int codeCount = 4;
// 验证码干扰线数
private int lineCount = 20;
// 验证码
private String code = null;
// 验证码图片Buffer
private BufferedImage buffImg = null;
Random random = new Random();
public CreateImageCode() {
creatImage();
}
public CreateImageCode(int width, int height) {
this.width = width;
this.height = height;
creatImage();
}
public CreateImageCode(int width, int height, int codeCount) {
this.width = width;
this.height = height;
this.codeCount = codeCount;
creatImage();
}
public CreateImageCode(int width, int height, int codeCount, int lineCount) {
this.width = width;
this.height = height;
this.codeCount = codeCount;
this.lineCount = lineCount;
creatImage();
}
// 生成图片
private void creatImage() {
int fontWidth = width / codeCount;// 字体的宽度
int fontHeight = height - 5;// 字体的高度
int codeY = height - 8;
// 图像buffer
buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = buffImg.getGraphics();
//Graphics2D g = buffImg.createGraphics();
// 设置背景色
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height);
// 设置字体
//Font font1 = getFont(fontHeight);
Font font = new Font("Fixedsys", Font.BOLD, fontHeight);
g.setFont(font);
// 设置干扰线
for (int i = 0; i < lineCount; i++) {
int xs = random.nextInt(width);
int ys = random.nextInt(height);
int xe = xs + random.nextInt(width);
int ye = ys + random.nextInt(height);
g.setColor(getRandColor(1, 255));
g.drawLine(xs, ys, xe, ye);
}
// 添加噪点
float yawpRate = 0.01f;// 噪声率
int area = (int) (yawpRate * width * height);
for (int i = 0; i < area; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
buffImg.setRGB(x, y, random.nextInt(255));
}
String str1 = randomStr(codeCount);// 得到随机字符
this.code = str1;
for (int i = 0; i < codeCount; i++) {
String strRand = str1.substring(i, i + 1);
g.setColor(getRandColor(1, 255));
// g.drawString(a,x,y);
// a为要画出来的东西,x和y表示要画的东西最左侧字符的基线位于此图形上下文坐标系的 (x, y) 位置处
g.drawString(strRand, i*fontWidth+3, codeY);
}
}
// 得到随机字符
private String randomStr(int n) {
String str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
String str2 = "";
int len = str1.length() - 1;
double r;
for (int i = 0; i < n; i++) {
r = (Math.random()) * len;
str2 = str2 + str1.charAt((int) r);
}
return str2;
}
// 得到随机颜色
private Color getRandColor(int fc, int bc) {// 给定范围获得随机颜色
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
/**
* 产生随机字体
*/
private Font getFont(int size) {
Random random = new Random();
Font font[] = new Font[5];
font[0] = new Font("Ravie", Font.PLAIN, size);
font[1] = new Font("Antique Olive Compact", Font.PLAIN, size);
font[2] = new Font("Fixedsys", Font.PLAIN, size);
font[3] = new Font("Wide Latin", Font.PLAIN, size);
font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, size);
return font[random.nextInt(5)];
}
// 扭曲方法
private void shear(Graphics g, int w1, int h1, Color color) {
shearX(g, w1, h1, color);
shearY(g, w1, h1, color);
}
private void shearX(Graphics g, int w1, int h1, Color color) {
int period = random.nextInt(2);
boolean borderGap = true;
int frames = 1;
int phase = random.nextInt(2);
for (int i = 0; i < h1; i++) {
double d = (double) (period >> 1)
* Math.sin((double) i / (double) period
+ (6.2831853071795862D * (double) phase)
/ (double) frames);
g.copyArea(0, i, w1, 1, (int) d, 0);
if (borderGap) {
g.setColor(color);
g.drawLine((int) d, i, 0, i);
g.drawLine((int) d + w1, i, w1, i);
}
}
}
private void shearY(Graphics g, int w1, int h1, Color color) {
int period = random.nextInt(40) + 10; // 50;
boolean borderGap = true;
int frames = 20;
int phase = 7;
for (int i = 0; i < w1; i++) {
double d = (double) (period >> 1)
* Math.sin((double) i / (double) period
+ (6.2831853071795862D * (double) phase)
/ (double) frames);
g.copyArea(i, 0, 1, h1, 0, (int) d);
if (borderGap) {
g.setColor(color);
g.drawLine(i, (int) d, i, 0);
g.drawLine(i, (int) d + h1, i, h1);
}
}
}
public void write(OutputStream sos) throws IOException {
ImageIO.write(buffImg, "png", sos);
sos.close();
}
public BufferedImage getBuffImg() {
return buffImg;
}
public String getCode() {
return code.toLowerCase();
}
//使用方法
/*public void getCode3(HttpServletRequest req, HttpServletResponse response,HttpSession session) throws IOException{
// 设置响应的类型格式为图片格式
response.setContentType("image/jpeg");
//禁止图像缓存。
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
CreateImageCode vCode = new CreateImageCode(100,30,5,10);
session.setAttribute("code", vCode.getCode());
vCode.write(response.getOutputStream());
}*/
}
com/gohb/travels/mapper/UserDAOMapper.xml内容如下:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gohb.travels.dao.UserDAO">
<!--用户登录-->
<select id="findByUsername" parameterType="String" resultType="User">
select * from t_user where username = #{username}
</select>
<!--注册用户-->
<insert id="save" parameterType="User" useGeneratedKeys="true" keyProperty="id">
insert into t_user values(#{id},#{username},#{password},#{email})
</insert>
</mapper>
application.properties内容如下:
server.port=8989
spring.application.name=travels
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/travels?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=12345
mybatis.mapper-locations=classpath:com/gohb/travels/mapper/*.xml
mybatis.type-aliases-package=com.gohb.travels.entity
logging.level.root=info
logging.level.com.baizhi.travels.dao=debug
login.html代码如下:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="css/style.css">
<style>
form{
width:270px;
}
input{
width: 70%;
background: #eee;
}
input:focus{
background: #fff;
}
form{
padding: 0 12px 12px;
}
label{
display: block;
padding-bottom:12px;
}
#img-vcode{
width: 56px;
height: 21px;
float:right;
position: relative;
top:2px;
left:-6px
}
.label-text{
width: 30%;
float: left;
}
</style>
</head>
<body>
<div id="app">
<div id="wrap">
<div id="header">
<div style="float: right;padding-top: 24px">2009/11/20</div>
<h1>旅游信息管理系统</h1>
</div>
<div id="header-bar"></div>
<div id="content" style="height: 360px">
<img src="img/timg.jpg" style="float: right;height: 320px">
<h2>登录</h2>
<form action="province/provincelist.html" method="post">
<label>
<div class="label-text">账 号:</div>
<input type="text" v-model="user.username" name="username">
</label>
<label>
<div class="label-text">密 码:</div>
<input type="password" v-model="user.password" name="password">
</label>
<!--<img src="img/vcode.png" id="img-vcode">-->
<!--<label>-->
<!--<div class="label-text">验证码:</div>-->
<!--<input type="text" name="vcode" style="width: 100px">-->
<!--</label>-->
<button type="button" @click="login">提 交</button> 
<a href="reg.html">去注册</a>
</form>
</div>
<div id="footer">
ABC@126.com
</div>
</div>
</div>
</body>
</html>
<script src="./js/vue.js"></script>
<script src="./js/axios.min.js"></script>
<script>
const app = new Vue({
el:"#app",
data:{
user:{}
},
methods:{
login(){//登录
axios.post("http://localhost:8989/user/login",this.user).then((res)=>{
console.log(res.data);
localStorage.setItem("userid",res.data.userId);
if(res.data.state){
alert(res.data.msg +",点击确定进入主页!")
location.href='./province/provincelist.html';
}else{
alert(res.data.msg);
}
});
}
}
})
</script>
reg.html代码如下:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="css/style.css">
<style>
form {
width: 270px;
}
input {
width: 70%;
background: #eee;
}
input:focus {
background: #fff;
}
form {
padding: 0 12px 12px;
}
label {
display: block;
padding-bottom: 12px;
}
#img-vcode {
width: 56px;
height: 21px;
float: right;
position: relative;
top: 2px;
left: -6px
}
.label-text {
width: 30%;
float: left;
}
</style>
</head>
<body>
<div id="app">
<div id="wrap">
<div id="header">
<div style="float: right;padding-top: 24px">2009/11/20</div>
<h1>旅游信息管理系统</h1>
</div>
<div id="header-bar"></div>
<div id="content" style="height: 360px">
<img src="img/timg.jpg" style="float: right;height: 320px">
<h2>注册</h2>
<form action="province/provincelist.html" method="post">
<label>
<div class="label-text">账 号:</div>
<input type="text" v-model="user.username" name="username">
</label>
<label>
<div class="label-text">密 码:</div>
<input type="password" v-model="user.password" name="password">
</label>
<label>
<div class="label-text">邮 箱:</div>
<input type="text" v-model="user.email" name="email">
</label>
<img :src="src" id="img-vcode" @click="getImage" :key="key">
<label>
<div class="label-text">验证码:</div>
<input type="text" v-model="code" name="vcode" style="width: 100px">
</label>
<button type="button" @click="saveUserInfo">提 交</button> 
<a href="login.html">去登录</a>
</form>
</div>
<div id="footer">
ABC@126.com
</div>
</div>
</div>
</body>
</html>
<script src="./js/vue.js"></script>
<script src="./js/axios.min.js"></script>
<script>
const app = new Vue({
el: "#app",
data:{
user:{},
code:"",
src:"",
key:"",
},
methods:{
saveUserInfo(){ //注册
console.log(this.user.username + this.user.password + this.user.email);
console.log(this.code);
if(!this.user.username){
alert('用户名不能为空!!!!');
return;
}
if(!this.user.password){
alert('密码不能为空!!!!');
return;
}
//发送axios
axios.post("http://localhost:8989/user/register?code="+this.code+"&key="+this.key,this.user).then((res)=>{
console.log(res);
if(res.data.state){
alert(res.data.msg+",点击确定跳转到登录页面!!!");
location.href='./login.html';
}else{
alert(res.data.msg);
}
});
},
getImage(){ //获取验证码
_this = this;
axios.get("http://localhost:8989/user/getImage").then((res)=>{
console.log(res.data.key);
_this.src = "data:image/png;base64,"+res.data.image;
_this.key = res.data.key;
});
}
},
created(){
this.getImage();//获取验证码
}
});
</script>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/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.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gohb</groupId>
<artifactId>travels</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>travels</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>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.19</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
更多推荐
已为社区贡献1条内容
所有评论(0)