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

PHP实现登录和注册(附源码)

前言

本博客主要讲述利用php环境实现一个简单的前后端结合的用户登录和注册功能。phpstudy是PHP调试环境的集成包,该程序包集成了 Apache+PHP+MySQL+phpMyAdmin 等多个工具,是很好用的调试环境的程序集成包。

目录

前言

1. 准备工作

1.1 工具

1.2 phpstudy 介绍

2. 创建网站

2.1 搭建PHP环境

3. 用户登录和注册功能

3.1 思路

3.2 准备阶段

3.3 前端部分

3.3.1 登录的前端页面

3.3.2?注册的前端页面

3.4 验证注册的数据

3.4.1 设置验证规则

3.4.2 phpMyAdmin 管理数据库

3.4.3 PHP 连接数据库

3.4.4 保存注册的数据到数据库中

3.5??登录验证

3.5.1 连接数据库


1. 准备工作

1.1 工具

在phpstudy官网中下载即可,选择对应的电脑位数

链接:Windows版phpstudy下载 - 小皮面板(phpstudy)

ddbc590c8118247be9598b600ea26611.png

下载好压缩包后,新建一个文件夹用来解压压缩包里面的文件。解压之后找打该文件夹,里面有如下文件,接着我们进行安装。选择自定义安装路径安装到你想安装的位置即可,这里不展开来说。

924c85fd59656eb222255a8a707dc0d3.png

安装好以后就可以在桌面看到该软件了

1.2 phpstudy 介绍

在桌面找到该软件后双击打开它,就可以看到如下页面,然后我们需要在该集成包中下载一些软件

c45932cedbdac68583b5749c98507c6c.png

403f39c74b236cd026fdd78f0f66043c.png

下载之后就回到主页去看,本次的案例我使用 Nginx 来启动 Web 服务,(这里选择可以多样)

7ba43ea02845488fcf4e7cfbdb00ce13.png

启动MySQL时会出现启动不了的情况 (能正常启动则跳到 “2.创建网站”)

解决: window键 + R 输入SERVICES.MSC 回车 ,找到 mysql服务 后右键停止服务,再重新启动即可

SERVICES.MSC

f83c0d2627ecfa9d6dc2f16981249ce8.png

还有一种情况可能是端口被占用的情况

这边推荐博客:使用phpStudy显示3306端口被占用,该怎么办?_phpstudy3306端口被占用怎么办-CSDN博客

2. 创建网站

2.1 搭建PHP环境

点击创建网站,开始初始化配置

083cd0e0ea722e1d6170298bf89b27a7.png

13eede599476f696d0d52ff7b058f0b1.png

注:端口可能存在被占用的情况,这时我们可以在设置中查看没有被占用的端口号,然后在创建网站时选择该端口即可

ecdeaf19a7bf13f52425d02cdaad70c4.png

然后我们打开网站

ab3e9ad855baccc7243d6e544b7dd9af.png

b9eedcef8d57de70ac1b097897b60ffc.png

也可以直接在网页中输入cs:81 也可以启动

cs ----> 网站域名

81 —> 端口号

这时在WWW下的cs文件就生成了官方默认给我们的文件

97e8e648d9fcf2e4249bf11c981a2eb2.png

可以把这些删除掉,放入我们写的网页(建议不删,因为容易因未知原因报错)

接下来我们来测试,放入我之前练习html+css时写的静态网页文件

b421a62c27c6ae77ad6b26cd85f27c27.png

然后返回创建的网页,也就是cs:81该网站域名,点击左上角的刷新,就可以看到测试成功了

e00521a61a9367e464ab8d9cba0f132a.png

到这里,我们PHP环境就配置成功了,接下来就基于该环境下来编写一个简单的用户登录和注册的功能,涉及到前端和后端以及数据库的数据交互。

3. 用户登录和注册功能

3.1 思路

在写这个功能时,我们来理清一下大致思路

  1. 新用户需要注册,把注册时的数据如用户名,密码和邮箱存放在数据库中
  2. 已经注册过的用户可以直接登录,登录这里的用户名和密码需要和数据库中的数据进行验证,可以在php文件中写验证规则
  3. 验证用户名的唯一性,若用户名不存在,则不允许登录
  4. 用户名正确,若密码错误也不允许登录,密码存在后端的数据库中

接下来一步一步来实现具体的功能

3.2 准备阶段

在phpstudy中新建一个网站,这里我建立了一个网站域名为 localhost ,端口号为 80 的网站,在该文件夹中新建一个名叫 re_login 的文件,然后拖动该文件在 VSCode 中打开,建立几个必要的文件,如下图:(user.php文件用不到,可不建立)

1eaa73218944667f9d869db33aa08841.png

index.html 为入口文件,这里主要编写前端登录页面

register.html 为跳转页面,是注册的前端的页面

login.php 用于验证用户登录时的数据验证,结合数据库的验证

register.php 对注册信息的验证,及操作数据库,把成功注册的数据保存到数据库中

xiaomi.html 为用户成功登录后显示的网页

3.3 前端部分

3.3.1 登录的前端页面

效果图如下:

590ab98b669573143d83c1d8cb4b76fd.png

代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登录</title><style>form{max-width: 400px;height: 300px;background-color: rgba(247, 247, 247, 0.7);border: 1 solid #E4E4E4;margin: 100px auto;color: black;border-radius: 5px;padding: 25px 45px;}body{background-repeat: no-repeat;background-image: url(xingkong.png);background-size: 100%;}div{width: 100%;height: 35px;line-height: 35px;margin-top: 50px;position: relative;}input{position: absolute;right: 80px;width: 60%;height: 25px;line-height: 25px;border: 1px solid #DADADA;color: #888;outline: none;font-size: 12px;padding: 3px 3px 3px 5px;box-shadow: inset 0 1px 4px #ECECEC;}input[type="submit"]{width: 50%;height: 40px;line-height: 15px;font-size: 15px;background-color: #b5ccf3;border: none;box-shadow: none;border-radius: 10px;color: #FFF;position: relative;top: 50px;left: 50%;transform: translateX(-50%);}input[type="submit"]:hover{cursor: pointer;                          /*手型*/background-color: rgb(139, 205, 246);}a{width: 180px;display: block;margin: 80px auto;}</style>
</head>
<body><form action="./login.php" method="post"><div><label for="name">用户名:</label><input type="text" id="name" name="name" placeholder="请输入用户名" required></div><div><label for="pass">密 &nbsp;&nbsp;&nbsp; 码:</label><input type="password" name="pass" id="pass" placeholder="请输入密码" required></div><input type="submit" name="login" value="登录"><a href="register.html">还没有账号,注册一个</a></form>
</body>
</html>

代码解释:

  • 因为实现的简单的页面,直接在当前头文件编写CSS代码就好了
  • 建立一个form表单,用于提交数据进行验证
  • action 提交的地址,提交到 login.php 中进行登录的验证,以 post 的方式发送数据
  • 用户名和密码输入框中都添加了required 属性,设置该字段不能为空(如下图)
  • 给登录按钮设置标识“login”,方便后面获取

dd30635ed18b072dde32abab532e29d2.png

写完登录的前端代码之后,在网页中输入如下代码即可进入该页面(如上图登录页面)

http://localhost/re_login/register.html
3.3.2注册的前端页面

效果图如下:

ef4becefde9904ff806fd93c8515ca04.png

代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>注册</title><style>form{max-width: 400px;height: 350px;background-color: rgba(247, 247, 247, 0.7);border: 1 solid #E4E4E4;margin: 100px auto;color: black;border-radius: 5px;padding: 25px 45px;}body{background-repeat: no-repeat;background-image: url(xingkong.png);background-size: 100%;}div{width: 100%;height: 35px;line-height: 35px;margin-top: 20px;position: relative;}input{position: absolute;right: 80px;width: 60%;height: 25px;line-height: 25px;border: 1px solid #DADADA;color: #888;outline: none;font-size: 12px;padding: 3px 3px 3px 5px;box-shadow: inset 0 1px 4px #ECECEC;}input[type="submit"]{width: 50%;height: 40px;line-height: 15px;font-size: 15px;background-color: #b5ccf3;border: none;box-shadow: none;border-radius: 10px;color: #FFF;position: relative;top: 50px;left: 50%;transform: translateX(-50%);}input[type="submit"]:hover{cursor: pointer;                          /*手型*/background-color: rgb(139, 205, 246);}a{width: 180px;display: block;margin: 80px auto;}</style>
</head>
<body><form action="register.php" method="post" novalidate><div><label for="name">用户名:</label><input type="text" id="name" name="name" placeholder="请输入用户名" required></div><div><label for="pass">密 &nbsp;&nbsp;&nbsp; 码:</label><input type="password" name="pass" id="pass" placeholder="请输入密码" required></div><div><label for="qpass">密 &nbsp;&nbsp;&nbsp; 码:</label><input type="password" name="qpass" id="qpass" placeholder="请输入密码" required></div><div><label for="email">邮&nbsp;&nbsp;&nbsp;箱</label><input type="email" id="email" name="email" placeholder="请输入邮箱" pattern="[^@]*@[^@]*[.com$]" required></div><input type="submit" name="reg" value="注册"><a href="./index.html">已经有账号了,去登录</a></form>
</body>
</html>

代码解释:

和登录页面差不多,就是多了确认密码和邮箱这两个输入框以及一些其他区别

  • 与登录页面不同的是,在注册的 from 表单中,加了novalidate 属性,该属性是去掉 from 表单自带的验证功能,防止数据卡在前端到不了后端进行验证
  • 表单提交的地址是register.php ,在该文件中编写代码对注册的数据进一步验证,以及把能正确注册的用户数据保存到数据库中,方便在登录时进行数据验证
  • 其他基本与登录的代码含义大差不差

pattern 是自己写的验证规则,中括号中写正则表达式。pattern=“[@]*@[@]*[.com$]” 对邮箱的验证写规则,@符号的前后不能再出现@符号,而且必须以.com 为后缀,当然验证规则可以自己写,改一下正则表达式即可。

写完登录的前端代码之后,在网页中输入如下代码即可进入该页面(如上图登录页面)

http://localhost/re_login/register.html

也可以点击 “还没有账号,注册一个” 这个超链接实现注册页面的跳转。

3.4 验证注册的数据

3.4.1 设置验证规则

到这里,我们就开始编写 php 代码了。在register.php 中编写 php 代码。

首先,我们把注册时传动过来的数据进行验证,注册时有用户名、密码、确认密码、邮箱这四个数据,可以使用 if 来进行规则验证。

(1)、注册时的**用户名不能为空,**可使用函数 empty()来检验数据是否为空。如果为空,则函数返回为真,if 语句成立,代表着用户名为空,则输入提示信息并且让程序结束掉、

$_POST 是预定义的变量,用于收集来自 method=“post” 的表单中的值。

        if(empty($_POST["name"])){die("用户名不能为空!");}

0948042b3ff1dd13212dc64f08110c7f.png

跳转到register.php 文件去执行,输入提示信息

44c91bac18d180cf843a71b2aa6f8106.png

(2)、注册时的密码不能为小于6位数(可自行设定)。

if(strlen($_POST["pass"]) < 6){die("密码不能小于6位!!");}

验证和用户名基本一致

(3)、验证两次密码输入是否一样。把 post 过来的数据进行 逻辑判断

if($_POST["pass"] !== $_POST["qpass"]){die("两次输入的密码不一致!");}

(4)、验证邮箱的有效性

if(!filter_var($_POST["email"],FILTER_VALIDATE_EMAIL)){die("请输入有效的邮箱格式!");}

filter_var() 函数通过指定的过滤器过滤一个变量。第一个参数是规定要过滤的变量,第二个参数是规定要使用的过滤器的 ID。FILTER_VALIDATE_EMAIL是把值作为 e-mail 地址来验证。如果函数返回真则是有效的email地址,验证通过

(5)、保护密码

$pass_hash=password_hash($_POST["pass"],PASSWORD_DEFAULT);

password_hash 函数是对密码进行加密的函数,形成一串没有规律、杂乱的字符串,保证了用户信息的安全性。PASSWORD_DEFAULT是一种加密规则。返回来的字符串用一个变量保存起来,方便后面传到数据库中

下图就是注册后,密码加密后显示的字符串

3d994a52a00d6bea9df30f6407f08560.png

38323fb31b0dd89845a3cb7c4ecedc29.png

3.4.2 phpMyAdmin 管理数据库

使用数据库管理工具 phpMyAdmin 工具管理数据库。首先在 PHP 集成包中下载 phpMyAdmin 工具

d94154b7cdcce9a42efa0ea12471bd33.png

安装位置一般选择在 WWW 文件下。然后点击管理,就会跳出要登录的页面,用户名和密码默认是 root 就可以直接登录了。当然也可以修改密码,在数据库一栏中,点击修改密码再输入新密码即可

27bd69326b44b6f9e70bee8eccbd9479.png

进入到数据库管理页面后,新建一个数据库,名字自拟,然后在该数据中新建一张表,用来存放用户注册的信息。然后点击右下角的保存即可

9af4606bc63aee1e0cd767adceaa0708.png

3.4.3 PHP 连接数据库

编写 PHP 代码来连接数据库

$mysqli = new mysqli("localhost","root","root","lo_db");if($mysqli->connect_error){die("数据库连接错误:". $mysqli->connect_error);}

实例化一个数据库对象;localhost 为本地服务器上的数据库,第一个 root 是用户名,第二个 root 是密码,lo_db 是要连接的数据库名

mysqli->connect_error是一个在 PHP 中使用对象范式的方式来检查 MySQLi 数据库连接时是否发生错误的函数。使用 if 语句来判断,返回值为假的话说明连接数据库失败,打印连接失败的原因(保证用户名和密码以及数据库名的正确性)

数据库连接成功后,还不能把信息往数据表里面存放。

3.4.4 保存注册的数据到数据库中
$name = $_POST["name"];
$mail = $_POST["email"];if(isset($_POST["reg"])){$sql = "INSERT INTO tuser (name,email,pass_hash) VALUES ('$name','$mail','$pass_hash')";$mysqli->query($sql);if($mysqli->affected_rows > 0){echo "<script>alert('注册成功!');history.go(-1);</script>";}}
  • 声明两个变量用来保存用户名和密码,接着检测用户是否点击了注册这个按钮,如果点击的话就把能成功注册的数据传到数据表中。
  • **isset()**函数用于检测变量是否已设置并且非 NULL。
  • sql 变量用来保存用户的信息,接着是 SQL 语句,向指定表(tuser)中添加对应的值
  • m y s q l i − > q u e r y ( mysqli->query( mysqli>query(sql) 执行 SQL 语句
  • 用 affected_row 来判断是否新增了数据行,新增的话则表示注册成功,数据也成功存放到数据表中,并打印提示信息。

如下图是已经注册过的用户:

4055ecae81cd9ead21179b7cd74fe0d0.png

自此,注册的功能就实现好了。下面是注册功能register.php 的完整代码

<?php/* 判断用户名是否为空*/if(empty($_POST["name"])){die("用户名不能为空!");}/* 对密码进行规则验证*/if(strlen($_POST["pass"]) < 6){die("密码不能小于6位!!");}/* 判断输入的两次密码是否一致*/if($_POST["pass"] !== $_POST["qpass"]){die("两次输入的密码不一致!");}/* 验证邮箱的有效性*/if(!filter_var($_POST["email"],FILTER_VALIDATE_EMAIL)){die("请输入有效的邮箱格式!");}/* 对密码加密,保证数据的安全*/$pass_hash=password_hash($_POST["pass"],PASSWORD_DEFAULT);/* 保存用户的数据*/$name = $_POST["name"];$mail = $_POST["email"];/* 连接数据库*/$mysqli = new mysqli("localhost","root","root","lo_db");if($mysqli->connect_error){die("数据库连接错误:". $mysqli->connect_error);}/* 向数据表中传入用户的数据,方便后面对登录进行验证*/if(isset($_POST["reg"])){$sql = "INSERT INTO tuser (name,email,pass_hash) VALUES ('$name','$mail','$pass_hash')";$mysqli->query($sql);if($mysqli->affected_rows > 0){echo "<script>alert('注册成功!');history.go(-1);</script>";}}

3.5登录验证

登录功能同样需要连接到数据库。我们直接把在写注册功能时连接数据库的代码拷贝过来即可

$mysqli = new mysqli("localhost","root","root","lo_db");
if($mysqli->connect_error){die("数据库连接错误:". $mysqli->connect_error);
}
$pass_hash=password_hash($_POST["pass"],PASSWORD_DEFAULT);
$name = $_POST["name"];

这里只需要声明两个变量就行,一个用来保存用户名,一个用来保存登录的密码。接着来检查用户是否点击了登录这个按钮,和上面注册的代码差不多,用 if 来判断,如果用户点击了登录这个按钮,就写一个 sql 语句,然后用 query 函数发送数据到数据库中去执行,再用 fetch_assoc 函数返回一个结果集,用一个变量来保存这个结果集,代码如下:

if(isset($_POST["login"])){$sql = "SELECT pass_hash FROM tuser WHERE name='$name'";$res =$mysqli->query($sql)->fetch_assoc();
}

接着来判断返回的这个结果值是否为真,为真则在数据库中找到当前用户输入的用户名在数据库中是否存在,不存在则结束进程,并打印提示信息:“用户不存在”;若输入的用户名存在则进一步判断输入的密码是否正确。我们一下就可以想到可以用 if-else 来进行写

代码如下:

if($res){if(password_verify($_POST["pass"],$res["pass_hash"])){echo "<script>alert('登录成功!') ;window.location.href='xiaomi.html';</script>";}else{echo "<script>alert('密码错误!');history.go(-1);</script>";}}else{echo "<script>alert('用户不存在!');history.go(-1);</script>";}

password_verify(KaTeX parse error: Undefined control sequence: \[ at position 7: \_POST\̲[̲"pass"\],res[“pass_hash”)----password_verify() 函数用于验证密码是否和散列值匹配。pass_hash 是我们在注册时把密码变成一个散列值存放在数据库中,password_verify() 函数则用来验证本次输入的密码映射成的散列值和在数据库中密码的散列值是否相等,相同则表示登录成功,跳转到 xiaomi.html 页面(该页面是本人联系HTML+CSS 写的,用来测试登录成功的页面,大家可以放入其他自己写的网页来进行测试)

ps:上面这个 if 语句其实可以放在判断用户是否点击登录按钮的 if 语句中,意思就是要是用户连登录按钮都没点,也没必要验证其他的东西,$res 的值必然为空

下面是完整的登录验证 PHP 代码:

<?php
/* 连接数据库*/
$mysqli = new mysqli("localhost","root","root","lo_db");
if($mysqli->connect_error){die("数据库连接错误:". $mysqli->connect_error);
}
$pass_hash=password_hash($_POST["pass"],PASSWORD_DEFAULT);
$name = $_POST["name"];
/* 判断用户是否点击了登录按钮*/ 
if(isset($_POST["login"])){$sql = "SELECT pass_hash FROM tuser WHERE name='$name'";$res =$mysqli->query($sql)->fetch_assoc();/**登录验证 */if($res){if(password_verify($_POST["pass"],$res["pass_hash"])){echo "<script>alert('登录成功!') ;window.location.href='xiaomi.html';</script>";}else{echo "<script>alert('密码错误!');history.go(-1);</script>";}}else{echo "<script>alert('用户不存在!');history.go(-1);</script>";}
}

546ae7dbbb9af3630b1d00205f46bb10.png

4107aa4b383053f226a2de84b27e9d08.png

到这里,整个php环境下写登录注册功能的过程就已经结束了,我上传了本篇实例的一些资源包,如果能帮到和我一样的新手小白,我会非常开心!该案例非常适合新手练习,也欢迎大佬们看到错误或者不妥的地方能批评指正。

资源包链接:链接:https://pan.baidu.com/s/1HhW0VV4rU60eiab0UsnYYwpwd=1689
提取码:1689

案例教学参教视频:

【跟师兄做一个注册登录功能~~前端部分-哔哩哔哩】https://b23.tv/CNHvTeT

【跟师兄做一个注册登录功能~~后端部分-哔哩哔哩】https://b23.tv/CYgKSDf

总结

该案例结合了前端+后端+数据库来实现的用户登录和注册功能,利用的是PHP集成包工具来搭建环境,在此环境之下实现。也可以利用 JavaWeb 来实现该功能,当然这比本博客介绍的实现方法偏难,大家可以去尝试一下,今后我也会去学到

我在搭建 PHP 环境的时候出现了很多的错误,一开始尝试不用 phpMyAdmin 来管理数据库,尝试用数据库可视化工具——navicat 来建立数据库,然后在 PHPstudy 中建立数据库,编写php来连接数据库,但是后面遇到了各种各样的错误,什么数据库密码不正确,数据库不存在,还有无法连接数据库(1045-access denied …)、服务名无效等;甚至后面我重装了mysql服务,后面还是觉得用 phpMyAmind 更香,大家遇到什么问题的话多去搜搜,只有去搜了才能解决问题(没解决更焦虑)

最后,每篇一言:世上无难事,只怕有心人。

相关文章:

PHP实现登录和注册(附源码)

前言 本博客主要讲述利用php环境实现一个简单的前后端结合的用户登录和注册功能。phpstudy是PHP调试环境的集成包&#xff0c;该程序包集成了 ApachePHPMySQLphpMyAdmin 等多个工具&#xff0c;是很好用的调试环境的程序集成包。 目录 前言 1. 准备工作 1.1 工具 1.2 php…...

AEO海关认证的注意事项

AEO海关认证的注意事项繁多且至关重要&#xff0c;企业需细致准备&#xff0c;确保万无一失。 首先&#xff0c;企业需深入研读相关政策文件&#xff0c;如《中华人民共和国海关注册登记和备案企业信用管理办法》及《海关高级认证企业标准》&#xff0c;以政策为指引&#xff0…...

ElasticSearch 分布式部署

一、引言 在当今大数据时代&#xff0c;数据呈爆炸式增长&#xff0c;如何高效地存储、检索数据成为了众多企业面临的关键挑战。ElasticSearch 作为一款强大的分布式搜索引擎&#xff0c;凭借其卓越的性能、灵活的扩展性以及强大的全文检索能力&#xff0c;在日志分析、数据分…...

Vue中动态样式绑定+CSS变量实现切换明暗主题功能——从入门到进阶

1.直接借助Vue的动态绑定样式绑定 Vue动态样式绑定 在Vue中&#xff0c;动态样式绑定是一种强大的功能&#xff0c;它允许开发者根据数据的变化动态地更新元素的样式。以下是对Vue动态样式绑定的详细知识梳理与详解&#xff1a; 一、基础知识 Vue的动态样式绑定主要通过v-b…...

vue3 video 播放rtmp视频?(360浏览器支持)

** 注意&#xff1a;目前只能在360浏览器播放rtmp视频** 谷歌浏览器不支持Flash Player的问题 试过上面这个方法&#xff0c;目前没能实现&#xff08;没解决&#xff09;&#xff0c;如果有更好的解决方法&#xff0c;告诉我一下 需要下载版本较低的video.js版本库&#xff0…...

RK356x bsp 7 - PCF8563 RTC调试记录

文章目录 1、环境介绍2、目标3、PCF85634、dts配置5、内核配置6、测试验证 1、环境介绍 硬件&#xff1a;飞凌ok3568-c开发板 软件&#xff1a;原厂rk356x sdk 2、目标 开发板断电后仍正常计时。 3、PCF8563 PCF8563 是由 NXP Semiconductors 公司生产的低功耗 CMOS 实时…...

定义Shape:打造属于你的独特图形

自定义Shape:打造属于你的独特图形 在Android开发中,自定义图形绘制是一个非常重要的技能,尤其是在需要实现复杂UI或特定设计需求时。Android提供了android.graphics.drawable.shapes包,其中包含了一些基本的形状类,如RectShape、OvalShape等。然而,有时这些基本形状无法…...

JavaWeb(一) | 基本概念(web服务器、Tomcat、HTTP、Maven)、Servlet 简介

1. 基本概念 1.1、前言 web开发&#xff1a; web&#xff0c;网页的意思&#xff0c;www.baidu.com静态 web html,css提供给所有人看的数据始终不会发生变化&#xff01; 动态 web 淘宝&#xff0c;几乎是所有的网站&#xff1b;提供给所有人看的数据始终会发生变化&#xf…...

python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶

【1】引言 前序已经掌握了使用cv2.circle()绘制圆形的基本操作&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;二十&#xff09;使用cv2.circle()绘制圆形-CSDN博客 由于圆形本身绘制起来比较简单&#xff0c;因此可以自由操作的空间也就大&#x…...

CLIP:连接文本与图像, 从自然语言监督中学习可迁移的视觉模型

CLIP&#xff1a;连接文本与图像&#xff0c; 从自然语言监督中学习可迁移的视觉模型 flyfish Learning Transferable Visual Models From Natural Language Supervision https://github.com/OpenAI/CLIP 摘要 CLIP Contrastive Language-Image Pre-Training Contrastive&…...

Linux 硬盘扩容 分区 挂载

Linux 硬盘扩容 分区 & 挂载 1. 添加分区 1.1. 查看新添加的硬盘 fdisk -l假设当前未挂载的盘符是/dev/sdb&#xff0c;后文中所有操作都按挂载/dev/sdb 操作 1.2. 分区管理 小硬盘 fdisk /dev/sdb大硬盘&#xff08;2TB以上&#xff09; gdisk /dev/sdb1.3. 编辑分…...

基于 Slf4j 和 AOP 的自动化方法执行时间日志记录方案

前言 其实这个需求很简单&#xff0c;但是这个需求又是项目中必不可少的&#xff0c;尤其对于性能调优这块&#xff0c;但是使用哪种方式更加方便呢&#xff0c;这就是本篇博文需要讨论的重点 系统时间 可以通过 System.currentTimeMillis() 或 System.nanoTime() 来实现。 …...

关于 K8s 的一些基础概念整理-补充【k8s系列之二】

〇、前言 本文继续整理下 K8s 的一些基础概念&#xff0c;作为前一篇概念汇总的补充。 前一篇博文链接&#xff1a;关于 K8s 的一些基础概念整理【k8s系列之一】_集群 master节点 控制节点 宿主机-CSDN博客 一、详情 1.1 Label Label 在 k8s 中是一个非常核心的概念&#xf…...

FPGA的DMA应用——pcileech

硬件通过pcie总线&#xff0c;访存本机的内存&#xff0c;并进行修改&#xff0c;可以进行很多操作。 学习视频&#xff1a;乱讲DMA及TLP 1-pcileech项目简介和自定义模块介绍_哔哩哔哩_bilibili vivado2024.1的下载文章链接和地址&#xff1a;AMD-Xilinx Vivado™ 2024.1 现…...

信息安全管理:运行管理checklist

运行管理checklist内容包括日常操作与维护管理、变更管理、备份与故障恢复、应急与业务连续性管理等内容。 一、日常操作与维护管理 ▼▼制度与流程 是否建立日常运行操作制度与流程&#xff1f;包括网络、主机、应用等方面的操作制度与流程&#xff1f; 是否明确相关部门和人…...

Linux系统之stat命令的基本使用

Linux系统之stat命令的基本使用 一、stat命令 介绍二、stat命令帮助2.1 查询帮助信息2.2 stat命令的帮助解释 三、stat命令的基本使用3.1 查询文件信息3.2 查看文件系统状态3.3 使用格式化输出3.4 以简洁形式打印信息 四、注意事项 一、stat命令 介绍 stat 命令用于显示文件或文…...

云手机+Facebook:让科技与娱乐完美结合

移动互联网时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;早已成为企业、品牌和组织竞相角逐的营销阵地。而云手机的出现&#xff0c;则为Facebook营销注入了新的活力&#xff0c;其独特的优势让营销活动更加高效、精准且灵活。本文将深入探讨云手机在Fa…...

为什么要在PHY芯片和RJ45网口中间加网络变压器

在PHY芯片和RJ45网口之间加入网络变压器是出于以下几个重要的考虑&#xff1a; 1. 电气隔离&#xff1a;网络变压器提供了电气隔离功能&#xff0c;有效阻断了PHY芯片与RJ45之间直流分量的直接连接。这样可以防止可能的电源冲突&#xff0c;降低系统故障的风险&#xff0c;并保…...

LeetCode 19:删除链表的倒数第N 个结点

题目&#xff1a; 地址&#xff1a;https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 方法一&#xff1a; 方法二&#xff1a; 代码&#xff1a; package com.zy.leetcode.LeetCode_19;/*** Author: zy* Date: 2024-12-25-13:01* Description: 删除链表…...

RT-DETR融合[IJCV2024]LSKNet中的LSKBlock模块

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《Large Selective Kernel Network for Remote Sensing Object Detection》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/pdf/2303.09030 代码链接&#xff1a;https:…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...