完成注册登录以及用户分数管理
创建 java_gobang
数据库, user
表,表示用户信息和分数信息
create database if not exists java_gobang;
use java_gobang;
drop table if exists user;
create table user (
userId int primary key auto_increment,
username varchar(50) unique,
password varchar(50),
score int, -- 天梯积分
totalCount int, -- 比赛总场数
winCount int -- 获胜场数
);
insert into user values (null, 'zhangsan', '123', 1000, 0, 0);
insert into user values (null, 'lisi', '123', 1000, 0, 0);
insert into user values (null, 'wangwu', '123', 1000, 0, 0);
使用 MyBatis
来连接并操作我们的数据库
修改 Spring
的配置文件,使用数据库可以被连接上
spring:
application:
name: java_gobang
datasource:
url: jdbc:mysql://127.0.0.1:3306/java_gobang?characterEncoding=utf8&useSSL=false
username: root
password: 20230153018
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/**Mapper.xml
driver-class-name
报错,可能是没有引入 Maven
依赖的原因创建一个实体类:用户
package org.example.model;
public class User {
private int userId;
private String username;
private String password;
private int score;
private int totalCount;
private int winCount;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
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 int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getWinCount() {
return winCount;
}
public void setWinCount(int winCount) {
this.winCount = winCount;
}
}
package org.example.model;
/**
* 接口里面创建一些典型的方法
*/
public interface UserMapper {
// 往数据库中插入一个用户,用于注册功能
void insert(User user);
// 根据用户名,来查询用户的详细信息,用于登录功能
User selectByName(String userName);
}
实现 MyBatis
的相关 xml
配置文件,来自动实现数据库操作
实现 UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.java_gobang.model.UserMapper">
<insert id="insert">
insert into user values(null, #{username}, #{password}, 1000, 0, 0);
</insert>
<select id="selectByName" resultType="org.example.java_gobang.model.User">
select * from user where username = #{username};
</select>
</mapper>
请求:
响应:
user
对象 userId => 0
请求:
响应:
前后端交互的接口,在约定的时候,是有很多种交互方式的
从服务器获取到当前登录用户的信息
请求:
响应:
创建 api.UserAPI
类,主要实现三个方法:
login
:用来实现登录逻辑register
:用来实现注册逻辑getUserInfo
:用来实现登录成功后显示用户分数的信息在登录的时候,我们要做的关键操作就是:
username
,去数据库里面查一下,看查到的结果能不能和传入进来的 password
匹配 @PostMapping("/login")
@ResponseBody
public Object login(String username, String password, HttpServletRequest req) {
// 关键操作,就是根据 username 去数据库中进行查找,
// 如果能找到匹配的用户,并且密码也一直,就认为登录成功
User user = userMapper.selectByName(username);
System.out.println("[login] username=" + username);
if (user == null || !user.getPassword().equals(password)) {
// 登录失败
System.out.println("登录失败!");
return new User();
}
HttpSession httpSession = req.getSession(true);
httpSession.setAttribute("user", user);
return user;
}
HttpServletRequest
:可以通过这个对象获取或创建 Session
,以及访问其他 HTTP
属性getSession(true)
: Session ID
,或者 Session
已过期,就会创建一个新的 HttpSession
对象Session
,会返回当前 Session
getSession(false)
: Session
,会返回 null
,不会创建新的 Session
httpSession.setAttribute("user", user)
Session
保存一项属性,键是 “user”
,值是当前登录的用户对象Session ID
(通常通过 cookie
自动携带),就能取出这个对象@PostMapping("/register")
@ResponseBody
public Object register(String username, String password) {
try {
User user = new User();
user.setUsername(username);
user.setPassword(password);
userMapper.insert(user);
return user;
}catch (org.springframework.dao.DuplicateKeyException e) {
User user = new User();
return user;
}
}
} catch (org.springframework.dao.DuplicateKeyException e) {
username
为唯一索引(UNIQUE
),当插入一个已存在的用户名时会抛出此异常Spring
的 DataAccessException
系列,专门处理数据库层的错误@GetMapping("/userInfo")
@ResponseBody
public Object getUserInfo(HttpServletRequest req) {
try {
HttpSession httpSession = req.getSession(false);
User user = (User) httpSession.getAttribute("user");
return user;
}catch (NullPointerException e) {
return new User();
}
}
package org.example.java_gobang.api;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.example.java_gobang.model.User;
import org.example.java_gobang.model.UserMapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserAPI{
@Resource
private UserMapper userMapper;
@PostMapping("/login")
@ResponseBody
public Object login(String username, String password, HttpServletRequest req) {
// 关键操作,就是根据 username 去数据库中进行查找,
// 如果能找到匹配的用户,并且密码也一直,就认为登录成功
User user = userMapper.selectByName(username);
System.out.println("[login] username=" + username);
if (user == null || !user.getPassword().equals(password)) {
// 登录失败
System.out.println("登录失败!");
return new User();
}
HttpSession httpSession = req.getSession(true);
httpSession.setAttribute("user", user);
return user;
}
@PostMapping("/register")
@ResponseBody
public Object register(String username, String password) {
try {
User user = new User();
user.setUsername(username);
user.setPassword(password);
userMapper.insert(user);
return user;
}catch (org.springframework.dao.DuplicateKeyException e) {
User user = new User();
return user;
}
}
@GetMapping("/userInfo")
@ResponseBody
public Object getUserInfo(HttpServletRequest req) {
try {
HttpSession httpSession = req.getSession(false);
User user = (User) httpSession.getAttribute("user");
return user;
}catch (NullPointerException e) {
return new User();
}
}
}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有