【Unity+MySQL】实现注册登录系统(升级版)

news/2024/5/19 19:44:20/

目录

  • 1 UI界面重新设计
    • 1.1 注册界面
    • 1.2 登录界面
    • 1.3 交互实现
  • 2 注册功能完善
    • 2.1 判断用户输入的用户名是否与数据库中的重复
    • 2.2 将当前时间更新至用户表的当前注册时间列
    • 2.3 将用户输入的注册密码使用哈希加密
  • 3 登录功能完善
  • 4 总体功能流程图

接着 上篇文章所谈到的系统缺陷,这篇文章进行升级解决。

1 UI界面重新设计

问题:注册界面与登录界面是同一个界面,导致用户输入用户密码进行注册后,即可点击登录。

解决:在同一个场景中分别创建注册界面和登录界面,使用SetActive控制注册/登录成功后UI的显示与隐藏。

整体的UI框架搭建如下图所示:
在这里插入图片描述

1.1 注册界面

在这里插入图片描述

其中,底下蓝色的文字作为提示信息提示用户的注册情况。

1.2 登录界面

在这里插入图片描述

其中,底下紫色的文字作为提示信息提示用户的注册情况。

1.3 交互实现

由于这里注册与登录使用的是同一个输入框,因此在登录或注册后对输入框清空。这里还需要注意一点,需要判断登录和注册时用户名密码是否为空,如果为空,给出不能为空的提示。

交互功能代码:

using UnityEngine;
using UnityEngine.UI;
using MySql.Data.MySqlClient;
using System;public class DatabaseManager : MonoBehaviour
{// 数据库连接相关变量private MySqlConnection connection;private string serverName = "localhost";private string dbName = "UnityGame";	// 数据库名private string userName = "root";		// 登录数据库的用户名private string password = "123456";		// 登录数据库的密码private string port = "3306";           // MySQL服务的端口号// 注册UI和登录UIpublic GameObject RegisterUI;public GameObject LoginUI;// 用户名输入框和密码输入框public InputField usernameInputField;public InputField passwordInputfield;// 注册消息和登录消息public Text registerMessage;public Text loginMessage;void Start(){// 初始化UI状态LoginUI.SetActive(true);RegisterUI.SetActive(false);// 连接数据库string connectionString = "Server=" + serverName + ";Database=" + dbName + ";Uid=" + userName+ ";Pwd=" + password + ";Port=" + port + ";";connection = new MySqlConnection(connectionString);connection.Open();Debug.Log("连接数据库成功");}// 注册逻辑public void OnRegister(){// 从输入框获取用户名和密码string username = usernameInputField.text;string password = passwordInputfield.text;if (username == "" || password == ""){registerMessage.text = "账号或密码不能为空";}else{// 构造插入数据的SQL语句,并将用户名和密码赋值给参数string query = "INSERT INTO usersinfo(username, password) VALUES (@username, @password)";MySqlCommand cmd = new MySqlCommand(query, connection);cmd.Parameters.AddWithValue("@username", username);cmd.Parameters.AddWithValue("@password", password);// 执行SQL语句,获取影响的行数int rowsAffected = cmd.ExecuteNonQuery();// 根据影响的行数给出注册成功或失败的消息,并清空输入框if (rowsAffected > 0){Debug.Log("注册成功");registerMessage.text = "注册成功";}else{Debug.Log("注册失败");registerMessage.text = "注册失败";}usernameInputField.text = "";passwordInputfield.text = "";}}// 登录逻辑public void OnLogin(){// 从输入框获取用户名和密码string username = usernameInputField.text;string password = passwordInputfield.text;if(username == "" || password == ""){loginMessage.text = "账号或密码不能为空";}else{// 构造查询数据的SQL语句,并将用户名和密码赋值给参数string query = "SELECT COUNT(*) FROM usersinfo WHERE username=@username AND password=@password";MySqlCommand cmd = new MySqlCommand(query, connection);cmd.Parameters.AddWithValue("@username", username);cmd.Parameters.AddWithValue("@password", password);// 执行SQL语句,获取查询结果object result = cmd.ExecuteScalar();int count = Convert.ToInt32(result);// 根据影响的行数给出注册成功或失败的消息,并清空输入框if (count > 0){Debug.Log("登录成功");loginMessage.text = "登录成功";}else{Debug.Log("登录失败");loginMessage.text = "登录失败";}usernameInputField.text = "";passwordInputfield.text = "";}}
}

相关变量绑定:
在这里插入图片描述
去注册的按钮事件绑定:
在这里插入图片描述

去登录的按钮事件绑定:
在这里插入图片描述

2 注册功能完善

问题1:用户注册时没有对用户信息进行校验,如一个用户用同一个用户名进行注册时应该进行提示、用户名或密码为空也应该进行提示。
问题2:用户注册时的注册时间没有加入用户表。
问题3:用户注册时输入的密码以明文存储于数据库中,这是不安全的。

2.1 判断用户输入的用户名是否与数据库中的重复

使用SQL查询语句查询数据库中是否存在具有给定用户名的用户记录,检查查询结果并根据需要返回检查用户输入的信息。如果 count 变量的值为0,则表示数据库中不存在具有该用户名的用户记录,可以继续进行注册流程。如果 count 变量的值大于0,则表示该用户名已经被占用,需要提示用户选择不同的用户名。

修改后的注册功能的代码实现:

	// 注册逻辑public void OnRegister(){// 从输入框获取用户名和密码string username = usernameInputField.text;string password = passwordInputfield.text;if (username == "" || password == ""){registerMessage.text = "账号或密码不能为空";}else{// 检查数据库中是否存在具有给定用户名的用户记录string query1 = "SELECT COUNT(*) FROM usersinfo WHERE username = @Username";MySqlCommand cmd1 = new MySqlCommand(query1, connection);cmd1.Parameters.AddWithValue("@Username", username);int count = Convert.ToInt32(cmd1.ExecuteScalar());// 根据查询结果提示用户if (count > 0){Debug.Log("用户名已存在,请选择不同的用户名!");registerMessage.text = "用户名已存在,请选择不同的用户名!";}else{// 构造插入数据的SQL语句,并将用户名和密码赋值给参数string query2 = "INSERT INTO usersinfo(username, password) VALUES (@username, @password)";MySqlCommand cmd2 = new MySqlCommand(query2, connection);cmd2.Parameters.AddWithValue("@username", username);cmd2.Parameters.AddWithValue("@password", password);// 执行SQL语句,获取影响的行数int rowsAffected = cmd2.ExecuteNonQuery();// 根据影响的行数给出注册成功或失败的消息if (rowsAffected > 0){Debug.Log("注册成功");registerMessage.text = "注册成功";}else{Debug.Log("注册失败");registerMessage.text = "注册失败";}}//清空输入框usernameInputField.text = "";passwordInputfield.text = "";}}

2.2 将当前时间更新至用户表的当前注册时间列

将usersinfo的createtime列类型设置为timestamp,并将其默认值修改为CURRENT_TIMESTAMP。
在这里插入图片描述
注册成功后插入数据库的结果:
在这里插入图片描述

2.3 将用户输入的注册密码使用哈希加密

在C#脚本中对用户注册和登录的结果都使用哈希进行加密,这样在进行比较时,都是使用加密后的密文进行比较的。

修改的部分代码:

using System.Security.Cryptography;// 加密密码private static string HashPassword(string password){SHA256Managed crypt = new SHA256Managed();StringBuilder hash = new StringBuilder();byte[] crypto = crypt.ComputeHash(Encoding.UTF8.GetBytes(password));foreach (byte theByte in crypto){hash.Append(theByte.ToString("x2"));}return hash.ToString();}// 注册逻辑public void OnRegister(){// 从输入框获取用户名和密码string username = usernameInputField.text;//使用哈希进行加密string password = HashPassword(passwordInputfield.text);//省略}// 登录逻辑public void OnLogin(){// 从输入框获取用户名和密码string username = usernameInputField.text;//使用哈希进行加密string password = HashPassword(passwordInputfield.text);//省略}

其中,加入了关闭数据库,用户登录成功后关闭数据库。

注册成功后插入数据库的结果:
在这里插入图片描述

3 登录功能完善

问题:用户登录时,没有针对特定错误进行提示,不论是因用户名密码错误还是该用户未注册都是提示“登录失败”。

修改后的登录功能的代码实现:

	// 登录逻辑public void OnLogin(){// 从输入框获取用户名和密码string username = usernameInputField.text;//使用哈希进行加密string password = HashPassword(passwordInputfield.text);if (username == "" || password == ""){loginMessage.text = "账号或密码不能为空";}else{// 构造查询数据的SQL语句,并将用户名和密码赋值给参数string query = "SELECT COUNT(*) FROM usersinfo WHERE username=@username AND password=@password";MySqlCommand cmd = new MySqlCommand(query, connection);cmd.Parameters.AddWithValue("@username", username);cmd.Parameters.AddWithValue("@password", password);// 执行SQL语句,获取查询结果object result = cmd.ExecuteScalar();int count = Convert.ToInt32(result);// 根据影响的行数给出注册成功或失败的消息,并清空输入框if (count > 0){Debug.Log("登录成功");loginMessage.text = "登录成功";}else{// 根据查询结果给出不同的提示消息string errorMessage;query = "SELECT COUNT(*) FROM usersinfo WHERE username=@username";cmd = new MySqlCommand(query, connection);cmd.Parameters.AddWithValue("@username", username);result = cmd.ExecuteScalar();count = Convert.ToInt32(result);if (count == 0){errorMessage = "用户名不存在";}else{errorMessage = "密码错误";}Debug.Log("登录失败:" + errorMessage);loginMessage.text = errorMessage;}usernameInputField.text = "";passwordInputfield.text = "";}}

4 总体功能流程图

在这里插入图片描述


http://www.ppmy.cn/news/46807.html

相关文章

如何招生?一文教你高职院校有效的招生技巧

生源,是每一所高校的生存之本和生命线。 近几年招生宣传工作作为高职院校招生工作中的重要环节之一,具有政策性强,涉及面广,工作量大等特点,直接关系到学校可持续发展问题。 随着新媒体时代的发展,高职院…

深度学习中的卷积神经网络

博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的&#xff0c…

Mysql安装详细教程

数据库相关概念 而目前主流的关系型数据库管理系统的市场占有率排名如下: Oracle:大型的收费数据库,Oracle公司产品,价格昂贵。 MySQL:开源免费的中小型数据库,后来Sun公司收购了MySQL,而Oracle…

Netty Jemalloc4算法-核心数据结构图示

Netty 从4.1.52版本开始,其内存分配算法,从jemalloc3 切换到了 jemalloc4。本文给出该算法涉及的核心数据结构图示: 想要看懂上图, 要点如下: 1. 小于等于16777216字节的空间,从chunk(一个16M的字节数组)中分配&#…

Python第三方库安装

看见更大的Python世界 Python社区PyPI The Python Package Index PyPI: Python Package Index PSF维护的展示全球Python计算生态的主站 学会检索并利用PyPI,找到合适的第三方库开发程序 实例:开发与区块链相关的程序 第1步:在pypi.org…

【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

原创文章生成器在线版-ai写作生成器

随着人工智能技术的迅猛发展,越来越多的人开始意识到,利用AI可以实现许多以前不可能想象的事情。其中,一种最能体现人工智能技术优势的应用就是“ai原创文章生成器”。它可以为营销从业者提供一种全新的营销推广方式。 那么,什么是…

CAD 二次开发-Handle

在 CAD 二次开发中,Handle 是每个 CAD 实体的唯一标识符,类似于一个 ID。它是一个 long 类型的整数,可以用于标识和引用 CAD 实体,如图形对象、块、图层、实体等。 使用 Handle 可以方便地操作 CAD 实体,例如&#xf…

Java8 判空新写法(Optional方式)

1 引言 在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示 在这种情况下,有如下代码 user.getAddress().getProvince();这种写法&…

Lumen6 /laravel 框架路由请求实现token验证

版本 Lumen6.0 中文文档:https://learnku.com/docs/lumen/5.7/cache/2411 实现功能效果 1、使用缓存存储用户token 2、从请求头head 中获取用户token 3、返回指定的认证失败结构体 4、对指定的接口路由做身份验证 第一步:解除注释 注意&#xff1…

Java的7大好处

Java 的 7 大优势 当 Sun Microsystems 在 1995 年发布 Java 语言环境白皮书时,他们列出了 Java 将给软件开发领域带来的以下 7 大好处: Java 简单而熟悉。Java是面向对象的。Java 是体系结构中立的。Java 健壮且安全。Java是多线程的。Java具有高性能。…

哈希表题目:在系统中查找重复文件

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 解法思路和算法代码复杂度分析 进阶问题答案后记 题目 标题和出处 标题:在系统中查找重复文件 出处:609. 在系统中查找重复文件 难度 6 级 题目描述 要求 给定一个目录信息列表 paths…

入门神经网络——浅层神经网络

文章目录 一、基础知识1.浅层神经网络介绍2.浅层神经网络的正向传播3.反向传播 二、浅层神经网络代码实例 一、基础知识 1.浅层神经网络介绍 此次构件浅层神经网络,相比于单神经元,浅层神经网络拥有多个神经元,因此又可以称为多神经元网络&…

Ubuntu 自带截图工具快捷键盘

PrtSc – 获取整个屏幕的截图并保存到 Pictures 目录。 Shift PrtSc – 获取屏幕的某个区域截图并保存到 Pictures 目录。 Alt PrtSc –获取当前窗口的截图并保存到 Pictures 目录。 Ctrl PrtSc – 获取整个屏幕的截图并存放到剪贴板。 Shift Ctrl PrtSc – 获取屏幕的某个…

【消费战略】解读100个食品品牌丨王小卤 4年10亿爆品破局

爆品破局 王小卤的聚焦发展! 王小卤创建于 2016 年,与饮料行业的独角兽元气森林同年。 相较于元气森林的快速增长,王小卤历经 三年坎坷之路,直至 2019 年才踏上高增长的赛道,实现四年十亿的增长。 “所有的消费品都值得重新 做…

SSM框架MyBatis 三种分页查询 PageHlper的使用以及五个参数的简单解释

SSM框架MyBatis 三种简单的分页查询 1. 基础分页查询(环境在第一天的配置中有) mapper也就是dao //查询总数Select("select count(*) from book;")int selectCount();//分页查询Select("select * from book limit #{currpage},#{size}&q…

KD2684S电机匝间耐电压测试仪

一、产品简介 试验仪适用于电机、变压器、电器线圈等这些由漆包线绕制的产品。因漆包线的绝缘涂敷层本身存在着质量问题,以及在绕线、嵌线、刮线、接头端部整形、绝缘浸漆、装配等工序工艺中不慎而引起绝缘层的损伤等,都会造成线圈层间或匝间绝缘层的绝缘…

NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038

之前使用querydatabasetable处理器来获取mysql中的数据,我们只能写死一个sql的查询语句,但是 实际引用环境中,我们的一张mysql的表,可能有上千万的数据,那么,不可能,我们把sql查询语句写死,这样一次性如果获取所有数据,那么压力太大了,我们怎么弄呢?找了很久没有找到相关教程…

Java 8 中使用 Lambda 表达式和 Stream API 解决 LeetCode 的两数之和问题

Java 8 中使用 Lambda 表达式和 Stream API 解决 LeetCode 的两数之和问题 当我们在面对一个数列,需要查找其中两个元素的和为给定目标值时,可以使用两数之和(Two Sum)问题来解决。这个问题在 LeetCode 上有很高的重要性和普遍性&…

机器人提示词工程师 Robotics Prompt Engineer

还没毕业,在校学习的各项技能都已经没用了,也别急着焦虑和忧伤,工业时代到信息时代,信息时代到智能时代,换代对每个普通人都是非常具有挑战性的,也是新一轮洗牌的开始。 机器人提示词工程师的核心竞争力包括…