五子棋双人对战项目(2)——登录模块

news2024/9/28 1:35:15

目录

一、数据库模块

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>

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

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

相关文章

C++语法—引用

引用变量 概念 简单理解就是对一个已存在的变量起别名&#xff0c;与那个已存在的变量共用一块内存空间。 用法&#xff1a;已存在变量的类型 & 引用变量名 &#xff08;引用实体&#xff09;已存在变量 int main() {int a 1;int& b a;return 0; }在上面这个示例…

minio 快速入门+单机部署+集群

目录 原理 概念 名词解释 Set /Drive 的关系 MinIO部署 单机 单机单盘 单机多盘 集群 多机单盘 多机多盘 配置负载均衡 调优 原理 MinIO是一个S3兼容的高性能对象存储&#xff0c;其主要特点如下&#xff1a; 适合存储大容量非结构化的数据&#xff0c;如图片&…

骨传导耳机品牌排行榜分享:360度实测分析10款抢手骨传导耳机!

随着科技的不断进步和人们生活方式的变化&#xff0c;骨传导耳机以其独特的传声方式和开放式设计&#xff0c;逐渐成为运动爱好者、户外活动家以及听力障碍人士的新宠。不同于传统耳机将声音直接导入耳道&#xff0c;骨传导耳机通过振动颅骨将声音传递至内耳&#xff0c;不仅能…

数据结构与算法——Java实现 20.习题——二叉树层序遍历

认真的人改变自己&#xff0c;执着的人改变命运 —— 24.9.27 102. 二叉树的层序遍历 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例 2&#xff1a; 输入&#xff1a;root [1] 输出&#xff1a;[[1]]示例 3&…

Java单体服务和集群分布式SpringCloud微服务的理解

单体应用存在的问题 1.随着业务的发展开发变得越来越复杂。 2.修改或者新增&#xff0c;需要对整个系统进行测试、重新部署。 3.一个模块出现问题&#xff0c;很可能导致整个系统崩溃。 4.多个开发团队同时对数据进行管理&#xff0c;容易产生安全漏洞。 5.各个模块使用同…

Spring Session学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

如何在算家云搭建MVSEP-MDX23(音频分离)

一、MVSEP-MDX23简介 模型GitHub网址&#xff1a;MVSEP-MDX23-music-separation-model/README.md 在 main ZFTurbo/MVSEP-MDX23-音乐分离模型 GitHub 上 在音视频领域&#xff0c;把已经发布的混音歌曲或者音频文件逆向分离一直是世界性的课题。音波混合的物理特性导致在没有…

快消品海外仓应该如何选择合适WMS仓储系统?

快消品的“快”属性天然契合海外仓&#xff0c;快消品大部分是必需品&#xff0c;库存周转快&#xff0c;需保持一定量的安全库存&#xff0c;及时、稳定补货尤为重要&#xff1b;快消品最适合全渠道销售&#xff0c;线上线下等&#xff0c;比较考验备货和统筹能力&#xff1b;…

基于RustDesk自建远程桌面服务

最近向日葵越来越难用了&#xff0c;官方好像限制了免费用户的带宽&#xff0c;但是限制的有点过头了&#xff0c;卡的基本没法用。 向日葵的平替todesk对于免费用户又有时长限制&#xff0c;对于经常用的小伙伴不大友好。 咱也不是说非得白嫖&#xff0c;但是向日葵和todesk这…

观测云链路追踪分析最佳实践

背景 如果要在开发、运维和工程层面持续改进一个涉及多服务的应用&#xff0c;以链路追踪、日志检索、指标收集、用户体验监测、性能剖析、关联分析等作为代表性技术的可观测性必不可少&#xff0c;这一看法已成为共识&#xff0c;但在采用这项技术的过程中&#xff0c;如何分…

msvcr100.dll丢失的解决方法,六种解决msvcr100.dll丢失使用技巧

在使用计算机的过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcr100.dll丢失”。这个问题可能会让我们感到困惑和无助&#xff0c;但是不用担心&#xff0c;本文将为大家介绍六种实用的解决方法&#xff0c;帮助你轻松解决这个问题。 一&#xff…

【JAVA报错已解决】Java.lang.NullPointerException

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

朋友圈信息流广告投放,曝光成本是多少?

微信作为国内最流行的社交平台之一&#xff0c;其朋友圈广告凭借精准的用户画像和强大的社交属性&#xff0c;成为了众多品牌商家进行市场推广的重要渠道。云衔科技推出了专业的微信朋友圈广告开户及代运营服务&#xff0c;旨在帮助企业轻松跨越技术门槛&#xff0c;精准触达目…

【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL64

时钟切换 描述 题目描述&#xff1a; 存在两个同步的倍频时钟clk0 clk1,已知clk0是clk1的二倍频&#xff0c;现在要设计一个切换电路&#xff0c;sel选择时候进行切换&#xff0c;要求没有毛刺。 信号示意图&#xff1a; 波形示意图&#xff1a; 输入描述&#xff1a; …

D20【python接口自动化学习】-python基础之内置数据类型

day20 内置数据类型的常见错误 学习日期&#xff1a;20240927 学习目标&#xff1a;内置数据类型--29 内置数据类型的常见错误 学习笔记&#xff1a; 访问错误 不同数据类型之间的操作报错 解决错误的方法 对只读类型进行写入报错 解决错误的方法 引用错误 解决错误的方法 …

产销皆下行,造势口碑遭“反噬”,魏建军能否重振长城汽车?

今年以来&#xff0c;长城汽车可谓多次被打在舆论聚光灯下&#xff0c;既有“一把手”魏建军一反此前低调务实作风而在今年多次于公共场合慨慷激昂频出“金句”宏观层面的&#xff1b;也有旗下多款车型销量数据出现下滑的微观层面。 近日&#xff0c;长城汽车披露了2024年1-8月…

python的 __name__和__doc__属性

__name__属性 __name__属性 用于判断当前模块是不是程序入口&#xff0c;如果当前程序正在使用&#xff0c;__name__的值为__main__。 在编写程序时&#xff0c;通常需要给每个模块添加条件语句&#xff0c;用于单独测试该模块的功能。 每个模块都有一个名称&#xff0c;当一…

ArduSub程序学习(11)--EKF实现逻辑①

1.read_AHRS() 进入EKF&#xff0c;路径ArduSub.cpp里面的fast_loop()里面的read_AHRS(); //从 AHRS&#xff08;姿态与航向参考系统&#xff09;中读取并更新与飞行器姿态有关的信息 void Sub::read_AHRS() {// Perform IMU calculations and get attitude info//----------…

WinForm程序嵌入Web网页

文章目录 前言一、三方库或控件的选择测试二、Microsoft Edge WebView2安装、使用步骤1.安装2.使用 前言 由于此项目需要winform客户端嵌入web网页并于JAVA端交互数据&#xff0c;所以研究了一下嵌入web网页这部分&#xff0c;趟了一遍雷&#xff0c;这里做下记录。 一、三方库…

软件设计之Maven(2)

软件设计之Maven(2) 路线图推荐&#xff1a; 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷新版Maven教程&#xff08;高效入门maven&#xff0c;上手又快又稳&#xff09; 资料可以去尚硅谷官网免费领取 学习内容&#xff1a; 依赖管理版本统一及维护依赖范围Buil…