目录
一、数据库模块
1、创建数据库
2、使用MyBatis连接并操作数据库
编写后端数据库代码
二、约定前后端交互接口
三、后端代码编写
文件路径如下:
UserAPI:
UserMapper:
四、前端代码
登录页面 login.html:
注册页面 register.html:
一、数据库模块
1、创建数据库
数据库中存放的是用户信息,其中用户信息包含用户ID、用户名、用户密码、用户天梯分数、用户对战场数,用户胜场数。
根据上述信息,写SQL语句:
create database if not exists java_gobang;
use java_gobang;
drop table if exists use;
create table user (
user_id int primary key auto_increment,
user_name varchar(50) unique, --用户名,不能重复
password varchar(50),
score int, --用户天梯积分
total_count int, --总场数
win_count 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, "admin", "123", 1000, 0, 0);
运行这些代码,查询是否创建成功。
2、使用MyBatis连接并操作数据库
加入依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
配置yml文件,连接本地数据库:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/java_gobang?characterEncoding=utf8&useSSL=false
username: root
password: 1234
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
# 配置 mybatis xml 的⽂件路径,在 resources/mybatis 创建所有表的 xml ⽂件
mapper-locations: classpath:mapper/*Mapper.xml
configuration: # 配置打印 MyBatis日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true #配置驼峰自动转换
编写后端数据库代码
登录接口:根据用户名,查询数据库中的用户信息,校验密码是否正确
注册模块:根据用户名 和 密码,往数据库中插入新的用户信息。
先创建一个用户类:
@Data
public class UserInfo {
private Integer userId;
private String userName;
private String password;
private Integer score;//用户天梯积分
private Integer totalCount;//总场数
private Integer winCount;//胜场数
}
使用MyBatis操作数据库:
@Mapper
public interface UserMapper {
//根据用户名,查询用户的详情信息,用于登录功能
@Select("select * from user where user_name = #{userName}")
UserInfo selectByName(String userName);
//往数据库里插入信息,用于注册功能
@Insert("insert into user values (null, #{userName}, #{password}, 1000, 0, 0);")
Integer insert(UserInfo userInfo);
}
二、约定前后端交互接口
登录:
注册:
从服务器获取到当前登录的用户信息:
(程序运行过程中,用户登录了之后,让客户端随时通过这个接口,来访问服务器,获取到自身的信息)
三、后端代码编写
文件路径如下:
UserAPI:
@RestController
@RequestMapping("/user")
public class UserAPI {
@Autowired
private UserMapper userMapper;
@PostMapping("/login")
@ResponseBody
public Object selectByName(String username, String password, HttpServletRequest request) {
System.out.println("userName:" + username + " " + "password:" + password);
User user = userMapper.selectByName(username);
if(user == null || !user.getPassword().equals(password)) {
return new User();
}
//正确的情况
HttpSession session = request.getSession(true);
session.setAttribute("user", user);
user.setPassword("");
return user;
}
@PostMapping("/register")
@ResponseBody
public Object register(String username, String password) {
if(!StringUtils.hasLength(username) || !StringUtils.hasLength(password)) {
return new User();
}
try {
User user = new User();
user.setUsername(username);
user.setPassword(password);
userMapper.register(user);
return user;
} catch (org.springframework.dao.DuplicateKeyException e) {
//注册的用户名可能重复,就返回空的对象
return new User();
}
}
@GetMapping("/userInfo")
@ResponseBody
public Object getUserInfo(HttpServletRequest request) {
try {
HttpSession session = request.getSession(false);
User user = (User) session.getAttribute("user");
User newUser = userMapper.selectByName(user.getUsername());
return newUser;
} catch (NullPointerException e) {
return new User();
}
}
}
UserMapper:
@Mapper
public interface UserMapper {
//根据用户名,查询用户的详情信息,用于登录功能
@Select("select * from user where user_name = #{username}")
User selectByName(String username);
//往数据库里插入信息,用于注册功能
@Insert("insert into user values (null, #{username}, #{password}, 1000, 0, 0);")
void register(User userInfo);
}
四、前端代码
登录页面 login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
<link rel="stylesheet" href="css/common.css">
<link rel="stylesheet" href="css/login.css">
</head>
<body>
<div class="nav">
五子棋对战
</div>
<div class="login-container">
<!-- 登录界面的对话框 -->
<div class="login-dialog">
<!-- 提示信息 -->
<h3>登录</h3>
<!-- 这个表示一行 -->
<div class="row">
<span>用户名</span>
<input type="text" id="username">
</div>
<!-- 这个表示另一行 -->
<div class="row">
<span>密码</span>
<input type="password" id="password">
</div>
<!-- 提交按钮 -->
<div class="row">
<button id="submit">登录</button>
</div>
</div>
</div>
<script src="./js/jquery.min.js"></script>
<script>
let usernameInput = document.querySelector('#username');
let passwordInput = document.querySelector('#password');
let submitButton = document.querySelector('#submit');
submitButton.onclick = function() {
$.ajax({
type: 'post',
url: '/user/login',
data: {
username: usernameInput.value,
password: passwordInput.value
},
success: function(body) {
//请求成功之后的回调函数
//判定当前是否登录成功
//如果登录成功,服务器会返回当前的User对象;如果登录失败,服务器会返回一个空的User对象
if(body && body.userId > 0) {
//登录成功
alert("登录成功");
//重定向跳转到游戏大厅页面
location.assign('/game_hall.html');
} else {
alert("登录失败");
}
},
error: function() {
//请求失败后的回调函数
alert("登录失败");
}
});
}
</script>
</body>
</html>
注册页面 register.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
<link rel="stylesheet" href="css/common.css">
<link rel="stylesheet" href="css/login.css">
</head>
<body>
<div class="nav">
五子棋对战
</div>
<div class="login-container">
<!-- 登录界面的对话框 -->
<div class="login-dialog">
<!-- 提示信息 -->
<h3>注册</h3>
<!-- 这个表示一行 -->
<div class="row">
<span>用户名</span>
<input type="text" id="username">
</div>
<!-- 这个表示另一行 -->
<div class="row">
<span>密码</span>
<input type="password" id="password">
</div>
<!-- 提交按钮 -->
<div class="row">
<button id="submit">登录</button>
</div>
</div>
</div>
<script src="./js/jquery.min.js"></script>
<script>
let usernameInput = document.querySelector('#username');
let passwordInput = document.querySelector('#password');
let submitButton = document.querySelector('#submit');
submitButton.onclick = function() {
$.ajax({
type: 'post',
url: '/user/register',
data: {
username: usernameInput.value,
password: passwordInput.value
},
success: function(body) {
//如果注册成功,就会返回一个新注册好的用户对象
if(body && body.username) {
//注册成功
alert("注册成功");
location.assign("/login.html");
} else {
alert("注册失败");
}
},
error: function() {
//请求失败后的回调函数
alert("注册失败");
}
});
}
</script>
</body>
</html>