项目实战--网页五子棋(用户模块)(1)

接下来我将使用Java语言,和Spring框架,实现一个简单的网页五子棋。

主要功能包括用户登录注册,人机对战,在线匹配对局,房间邀请对局,积分排行版等。

这篇文件讲解用户模块的后端代码

1. 用户表与实体类

用户需要用户名,密码,以及自己的积分,对战次数以及获胜次数:

sql 复制代码
drop table if exists user;
create table user (
    user_id     int primary key auto_increment,
    username    varchar(16) unique,
    password    varchar(16),
    score       int, -- 积分
    total_count int, -- 比赛次数
    win_count   int  -- 获胜次数
);
java 复制代码
public class User {
    private int id;
    private String username;
    private String password;
    private int score;
    private int totalCount;
    private int winCount;

    public int getId() {
        return id;
    }

    public void setId(int 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 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;
    }

}

2. 后端接口实现

2.1 登录接口

mapper:

java 复制代码
@Mapper
public interface UserMapper {
    @Select("select * from user where username = #{username}")
    User getUserByName(String username);
}

service:

java 复制代码
@Service
public class UserService {
    @Autowired
    UserMapper userMapper;
    public User login(String username, String password) {
        User user = userMapper.getUserByName(username);
        if(user == null || !user.getPassword().equals(password)) {
            //用户名不存在或者密码错误,返回一个空的用户信息
            return new User();
        }
        return user;
    }
}

controller:

java 复制代码
public class UserController {
    @Autowired
    UserService userService;
   @RequestMapping("/login")
    public User login(String username, String password, HttpServletRequest request) {
        if(!StringUtils.hasLength(username) || !StringUtils.hasLength(password)) {
            //用户名或密码为空,返回空用户信息
            return new User();
        }
        User user = userService.login(username, password);

        //把登录用户信息储存在session中,方便后续获取,或验证登录状态
        HttpSession session = request.getSession(true);//参数true表示回话不存在时允许创建新会话
        session.setAttribute("user", user);
        return user;
    }
}

使用postman测试:

可以看到用户名密码正确时能够返回正确的用户信息

2.2 注册接口

mapper:

java 复制代码
@Mapper
public interface UserMapper {
    @Select("select * from user where username = #{username}")
    User getUserByName(String username);
    @Insert("insert into user(username, password) values (#{username}, #{password})")
    Integer insertUser(User user);
}

service:

java 复制代码
public Integer register(User user) {
        return userMapper.insertUser(user);
    }

controller:

java 复制代码
    @RequestMapping("/register")
    public User 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);
            userService.register(user);
            return user;
        }catch (DuplicateKeyException e) {
            //用户名存在,引发异常,返回空对象
            return new User();
        }
    }

使用postman进行测试:

用户不存在时注册成功:

用户存在时注册失败:

2.3 获取用户信息接口
java 复制代码
    @RequestMapping("/getLoginUser")
    public User getLoginUser(HttpServletRequest request) {
        HttpSession session = request.getSession(false);//回话不存在时不允许创建会话
        try{
            return (User)session.getAttribute("user");
        }catch(NullPointerException e) {
            //session为null返回空对象
            return new User();
        }

    }
相关推荐
xieliyu.7 分钟前
Java 文件IO :File 文件类、字节流、字符流讲解
java·ide·笔记·javaee
Hhy_110714 分钟前
【从零开始学数据结构 ⑥】:二叉树之堆——打破规则的优先队列
c语言·开发语言·数据结构·学习·visual studio
云烟成雨TD18 分钟前
Micrometer 系列【28】Spring Boot Actuator | 其他指标速览
java·spring boot·云原生
meilindehuzi_a20 分钟前
深入理解 Linux 进程地址空间:从虚拟内存、页表映射到 fork 写时拷贝与 VMA 管理
java·linux·服务器
莫得感情 o26 分钟前
设计模式 13 · 桥接模式
java·设计模式·桥接模式
吠品27 分钟前
Java中实现拓扑排序的两种方式:Kahn算法和DFS
java·数据库·notepad++
TunerT_TQ38 分钟前
企业智能体工程体系v1.1|企业智能体工程卷 · 第5期· 数据飞轮——用观察—分析—计划—执行持续改进
java·运维·网络·#agent工程化·#企业智能体·#多智能体系统·#数据飞轮
小当家.10542 分钟前
工具并行调用原理与实现:CompletableFuture 实战
java·agent·线程池·工具·并行
曾小猫42 分钟前
20编辑型描述符的使用
开发语言
禁默43 分钟前
信创实战:Python + SQLAlchemy 接入金仓数据库(从驱动安装到完整 CRUD)
开发语言·数据库·python