当前位置: 首页 > news >正文

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

前一篇文章:网页版五子棋—— 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%2B8username: rootpassword: 111111driver-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 对象@Autowiredprivate 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 来进行后端接口的测试,如果对本篇文章的内容有所疑惑,欢迎在评论区进行留言,如果感觉本篇文章还不错也希望能收到你的三连支持,那么我们下一篇文章再见吧~~~

相关文章:

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

前一篇文章:网页版五子棋—— WebSocket 协议-CSDN博客 目录 前言 一、编写数据库代码 1.数据库设计 2.配置 MyBatis 3.创建实体类 4.创建 UserMapper 二、前后端交互接口 1.登录接口 2.注册接口 3.获取用户信息 三、服务器开发 1.代码编写 2.测试后端…...

以RK3568为例,ARM核心板如何实现NTP精准时间同步?

背景 网络时间协议NTP(Network TimeProtocol)是用于互联网中时间同步的标准互联网协议,可以把计算机的时间同步到某些时间标准。NTP对于我们产品来说有什么用呢,简单的讲,当你的设备时间不准确了,你可以接…...

Twitter(X)2024最新注册教程

Twitter 现名为X,因为图标是一只小鸟的形象,大家也叫它小蓝鸟(埃隆马斯克于 2023 年对该平台进行了品牌重塑),目前仍然是全球最受欢迎的社交媒体和微博平台之一,全球活跃用户量大概在4.5亿。尤其是欧美国家…...

10.桥接模式设计思想

10.桥接模式设计思想 目录介绍 01.桥接模式基础 1.1 桥接模式由来1.2 桥接模式定义1.3 桥接模式场景1.4 桥接模式思考1.5 解决的问题 02.桥接模式实现 2.1 罗列一个场景2.2 桥接结构2.3 桥接基本实现2.4 有哪些注意点 03.桥接实例演示 3.1 需求分析3.2 代码案例实现3.3 是否可…...

Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized

这里是Themberfue 在上一节的最后,我们讨论两个线程同时对一个变量累加所产生的现象 在这一节中,我们将更加详细地解释这个现象背后发生的原因以及该如何解决这样类似的现象 线程安全问题 public class Demo15 {private static int count 0;public …...

(已解决)Dependency “ ” not found 细谈

剖析原因:依赖在pom文件中引用后,然后ReLoad,此依赖会在你配置的本地仓库里面找,并下载下来,他报not found就是没有找到。 本地仓库的位置: 进一步深究:在本地仓库找的时候,他又会…...

网络编程、UDP、TCP、三次握手、四次挥手

一、初识网络编程 网络编程的概念:在网络通信协议下,不同计算机上运行的程序,进行的数据传输。 应用场景:即时通信、网游对战、金融证券、国际贸易、邮件等等。 不管是什么场景,都是计算机和计算机之间通过网络进行…...

程序员的生活周刊 #7:耐克总裁被裁记

0. 庙宇 这张图来自 Tianshu Liu, 被树木环绕的宝塔庙宇 1. 耐克总裁 耐克最近的总裁 John Donahoe 干了 5 年,终于被裁掉了。 这位总裁即不了解球鞋文化,也没有零售经验,但不懂事的董事会还是聘用它,寄托把耐克从运…...

sparkSQL的UDF,最常用的regeister方式自定义函数和udf注册方式定义UDF函数 (详细讲解)

- UDF:一对一的函数【User Defined Functions】 - substr、split、concat、instr、length、from_unixtime - UDAF:多对一的函数【User Defined Aggregation Functions】 聚合函数 - count、sum、max、min、avg、collect_set/list - UDTF:…...

【Ubuntu20】VSCode Python代码规范工具配置 Pylint + Black + MyPy + isort

​ 常用工具: 在 Ubuntu20 下,有以下常见的 Python 代码工具: 静态分析工具: Pylint 和 Flake8 功能范围:Pylint功能非常强大,能够检查代码质量、潜在错误、代码风格、复杂度等多个方面, 并生成详细的报…...

游戏提示错误:xinput1_3.dll缺失?四种修复错误的xinput1_3.dll文件

在计算机的运行过程中,我们可能会遇到各种各样的问题,其中与“xinput1_3.dll”相关的问题也并不罕见。“xinput1_3.dll”是一个在许多游戏和多媒体应用程序运行过程中可能会用到的动态链接库文件。当我们启动某些游戏时,可能会突然弹出一个错…...

YOLOv11融合IncepitonNeXt[CVPR2024]及相关改进思路

YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 一、 模块介绍 论文链接:https://arxiv.org/abs/2303.16900 代码链接:https://github.com/sail-sg/inceptionnext 论文速览:受 ViT 长距离建模能力的启发,大核卷积…...

[Web安全 网络安全]-学习文章汇总导航(持续更新中)

文章目录: 一:学习路线资源 1.路线 2.资源 二:工具 三:学习笔记 1.基础阶段 2.进阶阶段 四:好的参考 五:靶场 博主对网络安全很感兴趣,但是不知道如何取学习,自己一步一步…...

Docker Compose部署Rabbitmq(Docker file安装延迟队列)

整个工具的代码都在Gitee或者Github地址内 gitee:solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb github:GitHub - ZeroNing/solomon-parent: 这个项目主要是…...

SpringBoot+FileBeat+ELK8.x版本收集日志

一、准备环境 1、ElasticSearch:8.1.0 2、FileBeat:8.1.0 3、Kibana:8.1.0 4、logstach:8.1.0 本次统一版本:8.1.0,4个组件,划分目录,保持版本一致。 说明:elasticsearch和kib…...

本地模型导入ollama

文章目录 Modelfile模板导入到 ollama Modelfile模板 在本地模型目录下创建 Modelfile FROM ./qwen2.5-7b-instruct-q4_k_m.gguf# 设定温度参数为1 [更高的更具有创新性,更低的更富有连贯性] PARAMETER temperature 1 # 将上下文窗口大小设置为4096,这…...

scala Map训练

Map实训内容: 1.创建一个可变Map,用于存储图书馆中的书籍信息(键为书籍编号,值为包含书籍名称、作者、库存数量的元组),初始化为包含几本你喜欢的书籍信息。 2.使用 操作符添加两本新的书籍到图书馆集合中。 3.根据书籍编号查询某一本特定的书籍信息&…...

WorkFlow源码剖析——Communicator之TCPServer(下)

WorkFlow源码剖析——Communicator之TCPServer(下) 前言 系列链接如下: WorkFlow源码剖析——GO-Task 源码分析 WorkFlow源码剖析——Communicator之TCPServer(上) WorkFlow源码剖析——Communicator之TCPServer&…...

数据结构与算法分析:专题内容——动态规划2之例题讲解(代码详解+万字长文+算法导论+力扣题)

一、最长公共子序列 在生物应用中,经常需要比较两个(或多个)不同生物体的 DNA。一个 DNA 串由一串称为碱基(base)的分子组成,碱基有腺嘌呤、鸟嘌呤、胞嘧啶和胸腺嘧啶 4 种类型。我们用英文单词首字母表示 4 种碱基,这样就可以将一个 DNA 串…...

【Qt】QTreeView 和 QStandardItemModel的关系

QTreeView 和 QAbstractItemModel(通常是其子类,如 QStandardItemModel 或自定义模型)是 Qt 框架中的两个关键组件,它们之间存在密切的关系。 关系概述 QTreeView: QTreeView 是一个用于显示和编辑层次数据的视图小部…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 ​ 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...