网页版五子棋——用户模块(服务器开发)

news2024/11/28 1:50:20

前一篇文章:网页版五子棋—— WebSocket 协议-CSDN博客

目录

·前言

一、编写数据库代码

1.数据库设计

2.配置 MyBatis

3.创建实体类

4.创建 UserMapper

二、前后端交互接口

1.登录接口

2.注册接口

3.获取用户信息

三、服务器开发

1.代码编写

2.测试后端接口

·结尾


·前言

        本篇文章就开始五子棋项目的正式编写了,在本篇文章中主要是对用户模块中服务器端的代码进行编写与介绍,用户模块主要负责用户的注册、登录、分数记录的功能,这里我们使用 MySQL 数据库来存储数据,服务器端是基于 Spring + MyBatis 来实现对数据库的增、删、查、改,本篇文章新增的代码结构及内容如下图所示:

        下面就开始本篇文章的内容介绍。  

一、编写数据库代码

1.数据库设计

        创建 user 表来保存用户信息和分数信息,我们五子棋项目的数据库设计非常简单,具体的建库建表及测试数据的代码如下,复制粘贴到 MySQL 命令行中就可以完成创建:

create database if not exists spring_gobang charset utf8;

use spring_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);
insert into user values (null, 'zhaoliu', '123', 1000, 0, 0);

2.配置 MyBatis

        在五子棋项目中我们使用 MyBatis 来连接并操作我们的数据库,首先我们需要修改 Spring 的配置文件,使数据库可以连接上,编辑 application.yml 的代码如下,这里要注意根据自己数据库的实际情况来对下面的部分配置加以修改:

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/spring_gobang?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: 111111
    driver-class-name: com.mysql.cj.jdbc.Driver

        如果都是按照我的代码进行编写,这里的配置需要记得修改数据库的密码。 

3.创建实体类

        在代码中创建实体类,用户 User 类,它用来表示我们用户的相关信息,具体代码如下:

import lombok.Data;
// @Data 注解是为我们自动添加 get 与 set 方法的
@Data
public class User {
    private int userId;
    private String username;
    private String password;
    private int score;
    private int totalCount;
    private int winCount;
}

        这里需要注意,User 类中的每个属性名称要与 user 表中对应的每个字段的名称相同,不然·无法对应上。 

4.创建 UserMapper

        UserMapper 是一个接口,这里定义了用户相关数据库的操作,使用 MyBatis 中注解的方式来自动实现数据库的操作,具体代码及介绍如下所示:

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper {
    // 往数据库中插入一个用户,用于注册功能
    @Insert("insert into user values (null, #{username}, #{password}, 1000, 0, 0)")
    void insert(User user);

    // 根据用户名,来查询用户的详细信息,用于登录功能
    @Select("select * from user where username = #{username}")
    User selectByName(String username);
}

二、前后端交互接口

        在我们用户模块,涉及前后端交互的接口主要有三个部分:

  • 登录接口
  • 注册接口
  • 获取用户信息接口

        这个前后端交互的接口,在约定的时候是有很多种交互方式的,我们下面约定好之后,后续的后端/前端代码就都要严格的遵循这个约定来编写代码。 

1.登录接口

        登录接口的设计如下:

  • 请求:

                POST /login HTTP/1.1

                Content-Type:application/x-www-from-urlencoded

                username=zhangsan&password=123


  • 响应:

                Http/1.1 200 OK

                Content-Type:application/json

                {

                        userId:1,

                        username:'zhangsan',

                        score:1000,

                        totalCount:0,

                        winCount:0

                }


  • 登录失败:

                返回一个无效的 user 对象,这个对象的所有属性都为空,后续利用这里的 userId 是否为 0 来判断登录是否成功。

        注意,以上接口格式要严格遵守,里面的数据只是以 zhangsan 为示例进行介绍, 

2.注册接口

        注册接口设计如下:

  • 请求:

                POST /register HTTP/1.1

                Content-Type:application/x-www-from-urlencoded

                username=zhangsan&password=123


  • 响应:

                Http/1.1 200 OK

                Content-Type:application/json

                {

                        userId:1,

                        username:'zhangsan',

                        score:1000,

                        totalCount:0,

                        winCount:0

                }


  • 注册失败(比如用户名重复):

                返回一个无效的 user 对象,这个对象的所有属性都为空,后续利用这里的 userId 是否为 0 来判断注册是否成功。

3.获取用户信息

        从服务器获取到当前登录用户的信息,程序运行过程中,用户登录之后,让客户端随时通过这个接口,来访问服务器获取到用户自身的信息,获取用户信息的接口设计如下:

  • 请求:

                Get /userInfo HTTP/1.1


  • 响应:

                HTTP/1.1 200 OK

                Content-Type:application/json

                {

                        userId:1,

                        username:'zhangsan',

                        score:1000,

                        totalCount:0,

                        winCount:0

                }

三、服务器开发

1.代码编写

        在 api 包下创建 UserAPI 类,这里主要实现用户相关操作的三个方法:

  • login:用来实现登录逻辑;
  • register:用来实现注册逻辑;
  • getUserInfo:用来实现登录成功后显示用户分数的信息。

        具体代码及详细介绍如下所示:

import com.example.springgobang.model.User;
import com.example.springgobang.model.UserMapper;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
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 {
    // 注入 userMapper 对象
    @Autowired
    private UserMapper userMapper;

    // @PostMapping :路由映射
    @PostMapping("/login")
    // @ResponseBody :返回响应
    @ResponseBody
    // login 方法是处理登录的逻辑
    public Object login(String username, String password, HttpServletRequest request) {
        // 关键操作,根据 username 去数据库进行查询.
        User user = userMapper.selectByName(username);
        // 如果能找到匹配的用户,并且密码也一致,就认为登录成功
        if (user == null || !user.getPassword().equals(password)) {
            // 登录失败
            System.out.println("登录失败!");
            return new User();
        }
        System.out.println("[login] user = " + username);
        // getSession() 方法中参数为 true 表示当会话存在直接返回,不存在就创建会话
        // 用户首次登录,允许创建会话
        HttpSession httpSession = request.getSession(true);
        // 把 user 保存到 session 中,以便下次访问服务器时,服务器可以正确识别出当前客户端对应的正确身份信息
        httpSession.setAttribute("user",user);
        return user;
    }

    @PostMapping("/register")
    @ResponseBody
    // register 方法是处理注册相关的逻辑
    public Object register(String username, String password) {
        // 为了预防注册失败(比如出现用户名重复的情况)
        // 这里用 try--catch 包住
        try {
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            userMapper.insert(user);
            return userMapper.selectByName(username);
        } catch (org.springframework.dao.DuplicateKeyException e) {
            // 注册失败,返回一个空的 User 对象
            return new User();
        }
    }

    @GetMapping("/userInfo")
    @ResponseBody
    // getUserInfo 方法用来处理获取用户信息的操作
    public Object getUserInfo(HttpServletRequest request) {
        // 避免获取的用户信息不存在,用 try--catch 包住
        try {
            // getSession() 方法中参数为 false 表示当会话存在直接返回,不存在也不创建新会话
            // 由于这是用户登录后的操作,所以登录了就有会话,没登录就没有会话
            // 这也可以让我们感知到用户是否进行了登录
            HttpSession httpSession = request.getSession(false);
            // 从 session 中获取登录用户的信息
            User user = (User) httpSession.getAttribute("user");
            return user;
        } catch (NullPointerException e) {
            // 当前用户未登录, 直接返回一个空的 User 对象
            return new User();
        }
    }
}

2.测试后端接口

        编写完代码之后,我们来验证一下代码是否正确,功能是否正常,这里我们使用的测试工具是一个软件 Postman ,首先我们要启动我们的程序,然后使用 Postman 来测试我们后端的代码,具体的测试过程及结果如下图所示:

        如上图所示,服务器端关于用户模块的代码及功能就都正确编写完成了。 

·结尾

        文章到此就要结束了,本篇文章主要介绍了五子棋项目中用户模块的服务器端代码编写、数据库设计,以及规定了前后端交互的接口,文章中使用到的 Postman 是非常好用的接口测试工具,在后面的模块中都会使用 Postman 来进行后端接口的测试,如果对本篇文章的内容有所疑惑,欢迎在评论区进行留言,如果感觉本篇文章还不错也希望能收到你的三连支持,那么我们下一篇文章再见吧~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2235719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins声明式Pipeline流水线语法示例

系列文章目录 docker搭建Jenkins2.346.3版本及常用工具集成配置(ldap、maven、ansible、npm等) docker安装低版本的jenkins-2.346.3,在线安装对应版本插件失败的解决方法 文章目录 系列文章目录jenkins流水线基础1、pipeline1.1、什么是pipeline?1.2、为什么使用pi…

【NLP】使用 SpaCy、ollama 创建用于命名实体识别的合成数据集

命名实体识别 (NER) 是自然语言处理 (NLP) 中的一项重要任务,用于自动识别和分类文本中的实体,例如人物、位置、组织等。尽管它很重要,但手动注释大型数据集以进行 NER 既耗时又费钱。受本文 ( https://huggingface.co/blog/synthetic-data-s…

【数据集】【YOLO】【目标检测】道路裂缝数据集 5466 张,YOLO/VOC格式标注!

数据集介绍 【数据集】道路裂缝数据集 5466 张,目标检测,包含YOLO/VOC格式标注。数据集中包含一种分类,检测范围城市道路裂缝、高速道路裂缝、乡村道路裂缝。 戳我头像获取数据,或者主页私聊博主哈~ 一、数据概述 道路裂缝检测…

C++用string实现字符串相加

. - 力扣(LeetCode) -》》》》》题目链接 实现思路:计算数字符串长度并用数组的方式计算出字符位置,用字符的ask码‘0’计算出字符本身。 class Solution { public:string addStrings(string num1, string num2) {string str;int…

easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头

easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头 原版表头和表体字体美化自动拼接错误提示列自适应宽度自动合并单元格使用Easyexcel使用poi导出 在后台管理开发的工作中,离不开的就是导出excel了. 如果是简单的导出, 直接easyexce…

brainpy 动力学编程基础

文章参考: 《神经计算建模实战——基于brainpy》 吴思 【brainpy学习笔记】基础知识2(动力学模型的编程基础)-CSDN博客 Brainpy手册 文章目录 积分器:定义ODE函数数值积分方法 更新函数和动力系统计算介绍什么是brainpy.DynamicalSystem?如…

高级图像处理工具

图像处理-高级 1、功能概览 随着社交媒体的普及和个人创作需求的增长,图像处理成为了日常生活中不可或缺的一部分。无论是专业的设计师还是爱好者,都需要一款强大的工具来帮助他们完成各种任务。今天,我们将介绍一款基于Python开发的高级图…

【Zookeeper集群搭建】安装zookeeper、zookeeper集群配置、zookeeper启动与关闭、zookeeper的shell命令操作

目录 一、安装Zookeeper 二、配置Zookeeper集群 三、Zookeeper服务的启动与关闭 四、Zookeeper的shell操作 前情提要:延续上篇【Hadoop和Hbase集群配置】继续配置Zookeeper,开启三台虚拟机Hadoop1、Hadoop2、Hadoop3,进入终端&#xff0c…

Transformer和BERT的区别

Transformer和BERT的区别比较表: 两者的位置编码: 为什么要对位置进行编码? Attention提取特征的时候,可以获取全局每个词对之间的关系,但是并没有显式保留时序信息,或者说位置信息。就算打乱序列中token…

Python爬虫如何处理验证码与登录

Python爬虫如何处理验证码与登录 Python 爬虫在抓取需要登录的网站数据时,通常会遇到两个主要问题:登录验证和验证码处理。这些机制是网站用来防止自动化程序过度抓取数据的主要手段。本文将详细讲解如何使用 Python 处理登录与验证码,以便进…

《深入浅出Apache Spark》系列②:Spark SQL原理精髓全解析

导读:SQL 诞生于 20 世纪 70 年代,至今已有半个世纪。SQL 语言具有语法简单,低学习门槛等特点,诞生之后迅速普及与流行开来。由于 SQL 具有易学易用的特点,使得开发人员容易掌握,企业若能在其计算机软件中支…

JS实现,防抖节流 + 闭包

防抖(Debounce) 防抖是指短时间内大量触发同一事件,只会在最后一次事件完成后延迟执行一次函数。 防抖的典型应用场景是输入框的搜索建议功能,用户输入时不需要每次输入都去查询,而是在用户停止输入一段时间后才进行…

安卓编程最方便的读写资料类SharedPreferences,多个APP共享

本文介绍Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面详细讲解这五种方式的特点 第一种: 使用SharedPreferences存储数据 …

数据分析:转录组差异fgsea富集分析

文章目录 介绍加载R包数据链接导入数据数据预处理DE testing: 2BP vs no-BP比较limma-voomLoad steroid dataIn No-BP patientsIn 2BP patientsCompare gene expression vs bacterial mass其他系统信息介绍 转录组差异fgsea富集分析是一种基于基因集的富集分析方法,它关注的是…

Day13杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> res new Arra…

Avalonia11如何优雅的跨组件通信

背景&#xff1a; 官网只介绍了推荐适用ReactiveUI&#xff0c;没有过多的案例介绍&#xff0c;对于初入桌面应用开发的小白极其不友好。 本文介绍在Avalonia应用中通过ReactiveUI中的MessageBus进行跨组件通信. 假设需求案例&#xff1a; MainWindowViewModel中发送消息&a…

【开发实战】彻底了解 ThreadLocal

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区:个人社区 💞 个人主页:个人主页 🙉 专栏地址: ✅ Java 中级 🙉八股文专题:剑指大厂,手撕 J…

基于开源 AI 智能名片、S2B2C 商城小程序的用户获取成本优化分析

摘要&#xff1a;本文围绕用户获取成本&#xff08;CAC&#xff09;这一关键指标展开深入剖析&#xff0c;详细阐述其计算方式&#xff0c;并紧密结合开源 AI 智能名片与 S2B2C 商城小程序的独特性质&#xff0c;从多个维度探讨如何通过挖掘新的获客渠道、巧妙运用私域流量池等…

KV260 - PYNQ 主目录 - U盘挂载

目录 1. 简介 2. 具体操作 2.1 查看 USB 设备 2.2 查看 U 盘设备节点 2.3 挂载 U 盘到指定目录 2.4 查看挂载状态 2.5 卸载 U 盘 3. 总结 1. 简介 在 KV260 使用 Jupyter Lab 可以非常方便开发各种应用。有时不方便在 PC 端连接 U 盘&#xff0c;那么可以把 U 盘连在 …

金媒婚恋相亲系统10.4择爱开源旗舰版支持微信小程和抖音小程序上架

最近大家应该注意到了&#xff0c;金媒婚恋相亲系统已经更新至最新的10.4版本了&#xff01;本人作为商业用户也已经更新至最新的旗舰版了&#xff0c;更新的内容是啥&#xff01;这个官方都有列出&#xff0c;一个方面就是更新了多端的登录逻辑和UI 和后台CRM及很多细节的优化…