022-安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用

news2024/11/26 2:51:43

022-安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用

在这里插入图片描述

#知识点:

1、PHP留言板前后端功能实现
2、数据库创建&架构&增删改查
3、内置超全局变量&HTML&JS混编
4、第三方应用插件&传参&对象调用

Untitled

演示案例:

➢数据导入-mysql架构&库表列
➢数据库操作-mysqli函数&增删改查
➢数据接收输出-html混编&超全局变量
➢第三方插件引用-js传参&函数对象调用

#开发环境:

DW + PHPStorm + PhpStudy + Navicat Premium
DW : HTML&JS&CSS开发
PHPStorm : 专业PHP开发IDE
PhpStudy :Apache MYSQL环境
Navicat Premium: 全能数据库管理工具

PHPStorm安装

  • 官网下载:PhpStorm:JetBrains 的 PHP IDE 和代码编辑器

#数据导入-mysql架构&库表列

1、数据库名,数据库表名,数据库列名
2、数据库数据,格式类型,长度,键等

  • 需要先开启phpstudy中的中间件和数据库服务,并检查安装的php版本是否为7.0.9

Untitled

Untitled

  • 打开Navical Premium,创新新的表
  • 补充表的内容,并创建名称gbook

Untitled

Untitled

Untitled

Untitled

#数据库操作-mysqli函数&增删改查

PHP函数:连接,选择,执行,结果,关闭等
参考:https://www.runoob.com/php/php-ref-mysqli.html

常用:
mysqli_connect() 打开一个到MySQL的新的连接。
mysqli_select_db() 更改连接的默认数据库。
mysqli_query() 执行某个针对数据库的查询。
mysqli_fetch_row() 从结果集中取得一行,并作为枚举数组返回。
mysqli_close() 关闭先前打开的数据库连接。

MYSQL增删改查:
查:select * from 表名 where 列名=‘条件’;
增:insert into 表名(列名1, 列名2) value(‘列1值1’, ‘列2值2’);
删:delete from 表名 where 列名 = ‘条件’;
改:update 表名 set 列名 = 数据 where 列名 = ‘条件’;

PHPStorm项目开始的设置

  • 打开PHPStorm**,创建新项目,并把位置放在**phpstudy相关文件目录下G:\develop\safety\phpstudy_pro\WWW\dome01
  • 再创建新文件gbook.php
  • 配置PHP解释器,选择语言级别为7.0,CLI解释器找不到,需要找到小pi本地下载的php版本位置。
  • G:\develop\safety\phpstudy_pro\Extensions\php\php7.0.9nts\php.exe
  • 尝试输入<?phpecho 123; 页面正常显示即可

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

PHPStorm开始书写代码

  • 代码可以正常回写和提交

    • action="" 通常是在 HTML 表单中的 <form> 元素中设置 action 属性来指定表单提交的目标 URL。如果 action 属性为空字符串 (action=""),则表单数据将被提交到当前页面的 URL
    • 使用 @ 符号可以抑制错误报告。在给变量赋值的同时使用 @ 符号时,如果发生错误(比如未定义的变量),PHP 将不会生成错误消息,而是返回 NULL 或者一个空值。
    $u=@$_POST['username'];
    $c=@$_POST['content'];
    

Untitled

Untitled

  • 构建数据库连接,以及执行数据库插入操作

    • 发现可以插入数据,但是由于用户名和内容可以不进行添加加入数据库
    • 加一层判空,如果!empty($u)用户名为空则不写入数据即可

    Untitled

Untitled

Untitled

Untitled

代码如下

<!-- HTML 表单 -->
<form id="form1" name="form1" method="post" action="">
    <p>
        <!-- 用户名输入框 -->
        用户名:<input type="text" name="username">
    </p>
    <p>
        内容:
    </p>
    <p>
        <!-- 文本框 -->
        <textarea name="content"></textarea>
    </p>
    <!-- 提交按钮 -->
    <input type="submit" name="submit" id="submit" value="提交">
</form>

<?php
// 数据库连接参数
$dbip = 'localhost';
$dbuser = 'root';
$dbpass = 'root';
$dbname = 'dome01';

// 使用 mysqli_connect() 函数建立与数据库的连接
$con = mysqli_connect($dbip, $dbuser, $dbpass, $dbname);

// 检查连接是否成功
if (!$con) {
    die("连接错误:" . mysqli_connect_errno());
} else {
    // 获取用户名
    $u = @$_POST['username'];

    // 检查用户名是否非空
    if (!empty($u)) {
        // 获取内容、IP地址和用户代理信息
        $c = @$_POST['content'];
        $i = @$_SERVER['REMOTE_ADDR']; /*获取客户端 IP 地址*/
        $ua = @$_SERVER['HTTP_USER_AGENT'];/*获取客户端用户代理信息*/

        // 数据库查询语句,将数据插入到名为 gbook 的表中
        $sql = "INSERT INTO gbook(`username`, `content`, `ipaddr`, `uagent`) VALUES ('$u', '$c', '$i', '$ua');";

        // 执行数据库查询
        if (mysqli_query($con, $sql)) {
            echo "<script>alert('留言成功!')</script>";

            // 查询并显示留言列表
            $sql1 = "SELECT * FROM gbook";
            $data = mysqli_query($con, $sql1);
            while ($row = mysqli_fetch_row($data)) {
                echo '<hr>';
                echo '用户名:' . $row[0] . '<br>';
                echo '内容:' . $row[1] . '<br>';
                echo 'IP地址:' . $row[2] . '<br>';
                echo 'UA浏览器:' . $row[3] . '<br>';
            }
        } else {
            echo "<script>alert('留言失败!')</script>";
        }
    } else {
        // 用户名为空的情况
        echo "<script>alert('用户名不能为空!')</script>";
    }
}
?>

#数据接收输出-html混编&超全局变量

1、html混编:使HTML(JS)在PHP语言中运行

<?php echo '' ?>

2、超全局变量:
参考:
https://www.w3school.com.cn/php/php_superglobals.asphttps://www.php.net/manual/zh/language.variables.superglobals.php

G L O B A L S :这种全局变量用于在 P H P 脚本中的任意位置访问全局变量 ∗ ∗ GLOBALS:这种全局变量用于在 PHP 脚本中的任意位置访问全局变量 ** GLOBALS:这种全局变量用于在PHP脚本中的任意位置访问全局变量_SERVER:这种超全局变量保存关于报头、路径和脚本位置的信息。**
R E Q U E S T : _REQUEST: REQUEST_REQUEST 用于收集 HTML 表单提交的数据。
$_POST:广泛用于收集提交method=“post” 的HTML表单后的表单数据。
$_GET:收集URL中的发送的数据。也可用于收集提交HTML表单数据(method=“get”)
$_ENV:是一个包含服务器端环境变量的数组。
$_COOKIE:是一个关联数组,包含通过cookie传递给当前脚本的内容。
F I L E S :文件上传且处理包含通过 H T T P P O S T 方法上传给当前脚本的文件内容。 _FILES:文件上传且处理包含通过HTTP POST方法上传给当前脚本的文件内容。 FILES:文件上传且处理包含通过HTTPPOST方法上传给当前脚本的文件内容。_SESSION:是一个关联数组,包含当前脚本中的所有session内容。

POSTGET 是 HTTP 请求中常见的两种方法,用于将数据发送到服务器。它们之间的主要区别在于数据的传输方式和用途:

数据传输方式:

  • GET: 使用 URL 参数传递数据,数据附在 URL 后面,可见于 URL 地址栏。例如:http://example.com/page?name=value&age=25.
  • POST: 将数据放在请求的主体内,而不是作为 URL 的一部分。在请求头中标明数据的类型和长度。

数据大小限制:

  • GET: 由于数据附在 URL 上,对数据的长度有限制,因此适合传递小量数据。
  • POST: 由于数据放在请求主体内,相对于 GET,POST 允许传递更大量的数据。

安全性:

  • GET: 由于数据附在 URL 上,可能会被保存在浏览器历史记录、服务器日志中,不适合传递敏感信息。
  • POST: 数据在请求主体内,相对更安全,适合传递敏感信息。

缓存:

  • GET: 可以被缓存,因为请求参数都包含在 URL 中。
  • POST: 默认情况下不会被缓存,因为数据通常不会暴露在 URL 中。

使用场景:

  • GET: 用于请求数据,通常用于页面跳转,数据量较小。
  • POST: 用于提交表单、上传文件等需要较大数据或涉及敏感信息的场景。

总体而言,GET 适合用于获取数据POST 适合用于提交数据

PHPStorm项目使用全局配置文件,和函数调用

  • 创建gbook-admin.php文件和admin目录,方便执行删除等后台功能
  • 发现重复的代码太多,所以将经常用到的数据库链接操作生成config.php文件,方便管理。修改后正常访问增加,查询。

Untitled

  • 删除功能创建成功

Untitled

Untitled

<?php
// 包含数据库配置文件
include '../config.php';//由于创建的文件夹admin,其距离config.php匹配使用../

// 查询所有留言
$sql1="select * from gbook";
$data=mysqli_query($con,$sql1);
// 循环遍历每条留言并显示信息和删除链接
while ($row=mysqli_fetch_row($data)){
    echo '<hr>';
    echo '用户名:'.$row[0].'<br>';
    echo '内容:'.$row[1].'<br>';
    echo 'IP地址:'.$row[2].'<br>';
    echo 'UA浏览器:'.$row[3].'<br>';
    **// 提供删除链接,传递留言用户名作为参数
    echo "<a href='gbook-admin.php?del=$row[0]'>删除</a>";**
}

// 获取要删除的留言用户名
$delstr=@$_GET['del'];
**// 构建删除留言的 SQL 查询语句
$sql2="delete from gbook where username ='$delstr';";
// 执行删除操作
if(mysqli_query($con,$sql2)){
    echo "<script>alert('删除成功 !')</script>";**
}
  • 发现问题,可以将代码加一层判断当触发的时候,再进行删除操作
// 获取要删除的留言用户名
$delstr = @$_GET['del'];

**// 检查是否设置了要删除的留言用户名
if (isset($delstr)) {**
    // 构建删除留言的 SQL 查询语句
    $sql2 = "DELETE FROM gbook WHERE username ='$delstr';";

    // 执行删除操作
    if (mysqli_query($con, $sql2)) {
        echo "<script>alert('删除成功!')</script>";
    }
}
  • 将初始的代码更改为两个函数。//添加留言 //显示留言

Untitled

include 'config.php';

//添加留言
function add_gbook($con){
    $u=@$_POST['username'];
    if (!empty($u)) {

        $c = @$_POST['content'];
        $i = @$_SERVER['REMOTE_ADDR']; /*获取客户端 IP 地址*/
        $ua = @$_SERVER['HTTP_USER_AGENT'];/*获取客户端用户代理信息*/
        // 数据库查询语句,将数据插入到名为 gbook 的表中
        $sql = "insert into gbook(`username`, `content`,`ipaddr`,`uagent`) value('$u', '$c','$i','$ua');";
        if (mysqli_query($con, $sql)) {
            echo "<script>alert('留言成功!')</script>";
        }
    }
}

//显示留言
function  show_gbook($con)
{
    $sql1="select * from gbook";
            $data=mysqli_query($con,$sql1);
            while ($row=mysqli_fetch_row($data)) {
                echo '<hr>';
                echo '用户名:' . $row[0] . '<br>';
                echo '内容:' . $row[1] . '<br>';
                echo 'IP地址:' . $row[2] . '<br>';
                echo 'UA浏览器:' . $row[3] . '<br>';
            }
}
// 调用添加留言的函数
add_gbook($con);
// 调用显示留言的函数
show_gbook($con);
  • 将删除功能中的代码进行精简
    • 把删除功能在show_gbook 中完成添加
//显示留言
function  show_gbook($con,$del)
{
    $sql1="select * from gbook";
            $data=mysqli_query($con,$sql1);
            while ($row=mysqli_fetch_row($data)) {
                echo '<hr>';
                echo '用户名:' . $row[0] . '<br>';
                echo '内容:' . $row[1] . '<br>';
                echo 'IP地址:' . $row[2] . '<br>';
                echo 'UA浏览器:' . $row[3] . '<br>';
                **//检查变量 $del 是否等于字符串 'del'。如果条件成立,就会生成一个包含删除链接的 HTML 代码。
                //提供删除链接,传递留言用户名作为参数
                if ($del=='del'){
                    echo "<a href='gbook-admin.php?del=$row[0]'>删除</a>";**
                }
            }
}
add_gbook($con);
**// 调用显示留言的函数,传递 'x' 参数(防止生成删除链接)**
show_gbook($con,'x');
  • 删除功能gbook-admin.php中,包含gbook.php文件,并调用其显示留言函数,显示删除链接
  • 在执行的gbook.php时候不显示删除按钮
  • 在执行gbook-admin.php出现删除按钮

Untitled

Untitled

<?php
// 包含数据库配置文件
include '../config.php';
**// 包含处理留言的功能文件
include '../gbook.php';

// 调用显示留言的函数,传递 'del' 参数,以显示删除链接
show_gbook($con,'del');**

// 获取要删除的留言用户名
$delstr=@$_GET['del'];
// 检查是否设置了要删除的留言用户名
if(isset($delstr)){
    // 构建删除留言的 SQL 查询语句
    $sql2="delete from gbook where username ='$delstr';";
// 执行删除操作
    if(mysqli_query($con,$sql2)){
        echo "<script>alert('删除成功 !')</script>";
    }
}

#第三方插件引用-js传参&函数对象调用

引用外部 JavaScript 文件和一个简单的 JavaScript 对象及其方法。:

  1. 引用外部 JavaScript 文件:
htmlCopy code
<script src='../xxx.js'></script>

这是一个在 HTML 中引用外部 JavaScript 文件的标签。src 属性指定了 JavaScript 文件的路径,相对于当前 HTML 文件的位置。在这里,../xxx.js 表示 JavaScript 文件位于上一级目录../)并且文件名为 xxx.js

  1. JavaScript 对象及其方法:
javascriptCopy code
var obj = {
    value: 0,
    increment: function (inc) {
        this.value += typeof inc === 'number' ? inc : 1;
        // 如果传入的 inc 是数字,则将其加到 value 上,否则默认加 1
    }
}

obj.increment();
console.log(obj.value);  // 输出:1
obj.increment(2);
console.log(obj.value);  // 输出:2

这是一个 JavaScript 对象的定义,其中包含一个属性 value 和一个方法 increment。这个方法用于递增对象的 value 属性。在调用 increment 方法后,通过 console.log 输出 obj.value 的值。

解释 increment 方法:

this.value += typeof inc === 'number' ? inc : 1; 表示将传入的参数 inc 加到 value 上。如果 inc 是数字类型,则直接加上 inc,否则默认加上 1。

示例中的调用演示了两种情况:

第一次调用 obj.increment();,由于没有传入参数,所以 value 加上默认值 1,结果为 1。

第二次调用 obj.increment(2);,传入参数 2,所以 value 加上 2,结果为 2。

  • 引用ueditor并创建对应文件夹,导入成功后,然后改变html代码
**<script src="/ueditor/ueditor.config.js">/*引入配置文件*/</script>
<script src="/ueditor/ueditor.all.js">/*引入源码文件*/</script>**
<form id="form1" name="form1" method="post" action=""
      <p>
          用户名:<input type="text" name="username">
      </p>
        <p>
            内容:
        </p>
       <p>
           **<textarea id="content" rows="10" cols="70" name="content" style="border:1px solid #E5E5E5;">
    </textarea>
           <script type="text/javascript">
               UE.getEditor("content");

               //实例化编辑器传参,id为将要被替换的容器。
           </script>
       </p>**

            <input type="submit" name="submit" id="submit" value="提交">

</form>

Untitled

  • 192.168.137.1/gbook.php配置小皮以IP地址进行访问

Untitled

Untitled

Untitled

完整源码

gbook.php

<script src="/ueditor/ueditor.config.js">/*引入配置文件*/</script>
<script src="/ueditor/ueditor.all.js">/*引入源码文件*/</script>
<form id="form1" name="form1" method="post" action=""
      <p>
          用户名:<input type="text" name="username">
      </p>
        <p>
            内容:
        </p>
       <p>
           <textarea id="content" rows="10" cols="70" name="content" style="border:1px solid #E5E5E5;">
    </textarea>
           <script type="text/javascript">
               UE.getEditor("content");

               //实例化编辑器传参,id为将要被替换的容器。
           </script>
       </p>

            <input type="submit" name="submit" id="submit" value="提交">

</form>

<?php
/*// 使用 mysqli_connect() 函数建立与数据库的连接
// $dbip: 数据库服务器的 IP 地址或主机名
// $dbuser: 数据库用户名
// $dbpass: 数据库用户的密码
// $dbname: 要连接的数据库名*/

/*$dbip='localhost';
$dbuser='root';
$dbpass='root';
$dbname='dome01';
$con=mysqli_connect($dbip,$dbuser,$dbpass,$dbname);*/
include 'config.php';

//添加留言
function add_gbook($con){
    $u=@$_POST['username'];
    if (!empty($u)) {

        $c = @$_POST['content'];
        $i = @$_SERVER['REMOTE_ADDR']; /*获取客户端 IP 地址*/
        $ua = @$_SERVER['HTTP_USER_AGENT'];/*获取客户端用户代理信息*/
        // 数据库查询语句,将数据插入到名为 gbook 的表中
        $sql = "insert into gbook(`username`, `content`,`ipaddr`,`uagent`) value('$u', '$c','$i','$ua');";
        if (mysqli_query($con, $sql)) {
            echo "<script>alert('留言成功!')</script>";
        }
    }

}

//显示留言
function  show_gbook($con,$del)
{
    $sql1="select * from gbook";
            $data=mysqli_query($con,$sql1);
            while ($row=mysqli_fetch_row($data)) {
                echo '<hr>';
                echo '用户名:' . $row[0] . '<br>';
                echo '内容:' . $row[1] . '<br>';
                echo 'IP地址:' . $row[2] . '<br>';
                echo 'UA浏览器:' . $row[3] . '<br>';
                //检查变量 $del 是否等于字符串 'del'。如果条件成立,就会生成一个包含删除链接的 HTML 代码。
                //提供删除链接,传递留言用户名作为参数
                if ($del=='del'){
                    echo "<a href='gbook-admin.php?del=$row[0]'>删除</a>";
                }
            }
}

add_gbook($con);
// 调用显示留言的函数,传递 'x' 参数
show_gbook($con,'x');

gbook-admin.php

<?php
// 包含数据库配置文件
include '../config.php';
// 包含处理留言的功能文件
include '../gbook.php';

// 调用显示留言的函数,传递 'del' 参数,以显示删除链接
show_gbook($con,'del');

// 获取要删除的留言用户名
$delstr=@$_GET['del'];
// 检查是否设置了要删除的留言用户名
if(isset($delstr)){
    // 构建删除留言的 SQL 查询语句
    $sql2="delete from gbook where username ='$delstr';";
// 执行删除操作
    if(mysqli_query($con,$sql2)){
        echo "<script>alert('删除成功 !')</script>";
    }
}

// 查询所有留言
/*$sql1="select * from gbook";
$data=mysqli_query($con,$sql1);
// 循环遍历每条留言并显示信息和删除链接
while ($row=mysqli_fetch_row($data)){
    echo '<hr>';
    echo '用户名:'.$row[0].'<br>';
    echo '内容:'.$row[1].'<br>';
    echo 'IP地址:'.$row[2].'<br>';
    echo 'UA浏览器:'.$row[3].'<br>';
    // 提供删除链接,传递留言用户名作为参数
    echo "<a href='gbook-admin.php?del=$row[0]'>删除</a>";
}*/

config.php

<?php
/*配置全局文件。如果有用到数据库链接的时候直接包含此文件即可*/
$dbip='localhost';
$dbuser='root';
$dbpass='root';
$dbname='dome01';
$con=mysqli_connect($dbip,$dbuser,$dbpass,$dbname);

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

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

相关文章

开源的测试平台快2千星了,能带来多少收益呢

最近看了下自己去年初开源的测试平台&#xff0c;star一起算的话也到1.7k了&#xff1a; 做开源的初心一方面是想把自己的理解和思想展示出来&#xff0c;另一方面是想进一步打造个人IP&#xff0c;提升影响力&#xff08;其实这个想法很早之前就有了&#xff0c;计划过无数次但…

威士忌品鉴色泽与味蕾:从颜色到味蕾,解读品质与特点

威士忌的色泽与味蕾是其品质和特点的重要体现。通过对威士忌颜色的观察&#xff0c;我们可以大致判断其酿造原料、陈酿时间以及酒龄等信息。而品尝威士忌的过程&#xff0c;则是对其色泽、香气和味蕾的综合体验。本文将结合雷盛537威士忌深入探讨威士忌的色泽与味蕾之间的关系&…

《WebKit 技术内幕》学习之九(2): JavaScript引擎

2 V8引擎 2.1 基础 V8是一个开源项目&#xff0c;也是一个JavaScript引擎的实现。它最开始是由一些语言方面的专家设计出来的&#xff0c;后被Google收购&#xff0c;成为了JavaScript引擎和众多相关技术的引领者。其目的很简单&#xff0c;就是为了提高性能。因为在当时之前…

houdini fft 使用三层for each结构 以及for 问题

for each 中 使用 attrib wrangle detail时&#xff0c;不连接foreach_count1&#xff0c;只运行一次 for each 问题 merge eachiteration 对结构进行合并 transform 位置的移动针对的是原位置对原点的距离&#xff0c;而非移动后置0后再移

Unity编程#region..#endregion以及面板提示语标签[Tooltip(““)]

C#中的#region..#endregion 在Unity中&#xff0c;#region和#endregion是用于代码折叠的预处理指令。它们并不是Unity特有的&#xff0c;而是C#语言本身提供的功能。 #region用于标记一段代码的开始&#xff0c;而#endregion用于标记一段代码的结束。在编辑器中&#xff0c;可…

C++:迭代器失效问题

目录 1.vector迭代器失效问题 1.底层空间改变 ​编辑 2.指定位置元素的删除操作 2.Linux下的迭代器失效检测 1.扩容 2.删除 3.解决方法 1.vector迭代器失效问题 迭代器的主要作用就是让算法能够不用关心底层数据结构&#xff0c;其底层实际就是一个指针&#xff0c;或者是…

计组与原理:系统总线

大家好啊&#xff0c;这里来到计组第二部分内容&#xff1a;系统总线 跳转上一篇&#xff1a;计组原理&#xff1a;系统概论与基本组成 系统总线 1.总线的基本概念单总线结构框图面向 CPU 的双总线结构框图以存储器为中心的双总线结构框图 2.总线的分类片内总线系统总线通信总线…

牛仔服装行业研究:预计到2025年将达到约650亿美元

牛仔服装是指原美国西部垦拓者(牛仔)穿着的服装&#xff0c;一般用纯棉或棉纤维为主要原材料混纺、交织的色织牛仔布制作。 牛仔布的生产起源于美国。牛仔服装历经百年变迁&#xff0c;由最初的工装演变为时装&#xff0c;征服了人们不同阶段挑剔的目光&#xff0c;最终成为服装…

UDP和TCP代理协议有什么区别?哪个更好

在互联网的世界里&#xff0c;数据传输的方式有很多种&#xff0c;其中 UDP 和 TCP 是两种常见的传输协议。而代理协议则是为了在网络中传输数据时提供安全、稳定和高效的传输环境。那么&#xff0c;UDP 和 TCP 代理协议有什么区别呢&#xff1f;哪个更好呢&#xff1f;接下来&…

自然语言处理的崛起:从初步分析到深度理解

自然语言处理&#xff08;NLP&#xff09;是计算机科学、人工智能和语言学的交叉领域&#xff0c;旨在让计算机能够理解和生成人类语言。随着时间的推移&#xff0c;NLP 经历了一系列革命性的变化&#xff0c;从简单的规则和模式匹配到如今的深度学习模型&#xff0c;它们使计算…

什么是BMC

BMC全称为Baseboard Management Controller&#xff08;基板管理控制器&#xff09;&#xff0c;是一种独立于服务器操作系统和主处理器的专用微控制器&#xff0c;它内置在服务器、网络设备和其他复杂电子系统的主板上。BMC主要负责监控和管理系统硬件的状态&#xff0c;并提供…

ubuntu上创建ftp服务器

今天在linux电脑上安装了ftp服务器&#xff0c;中间碰到不少问题&#xff0c;参照各路攻略&#xff0c;修改多次配置后终于完成了服务器搭建 1&#xff1a;安装vsftp服务器 最简答的一步&#xff0c;直接&#xff1a;apt-get install vsftp 安装完成后&#xff0c;查看版本号…

华为发布 HarmonyOS NEXT 鸿蒙星河版

文章目录 个人简介 在 2024-01-18 下午于深圳举办的鸿蒙生态千帆启航仪式上&#xff0c;华为常务董事兼终端BG CEO余承东宣布了HarmonyOS NEXT&#xff08;鸿蒙星河版&#xff09;的开发者预览版面向开发者开放申请。这一版本旨在实现六大极致原生体验&#xff0c;包括原生精致…

C++——IOStream

什么是IO&#xff1f; C语言和C&#xff0c;我们其实已经接触到了两个IO的概念 #include<stdio.h> #include<iostream> iostream&#xff0c;便是IO流&#xff0c;其中I表示in&#xff0c;O表示out&#xff0c;代表着用户的输入和终端的输出。在之前的C语法中&a…

前端使用css去除input框的默认样式

关键点&#xff1a; /* 关键点&#xff0c;让输入框无边框 */outline:none; border:none; 1.效果图 2.html <div class"container"><input type"text" placeholder"请输入用户名"><input type"text" placeholder&q…

【学习】focal loss 损失函数

focal loss用于解决正负样本的不均衡情况 通常我们需要预测的正样本要少于负样本&#xff0c;正负样本分布不均衡会带来什么影响&#xff1f;主要是两个方面。 样本不均衡的话&#xff0c;训练是低效不充分的。因为困难的正样本数量较少&#xff0c;大部分时间都在学习没有用…

【B站最全唱歌教学】逼自己30天练完这些,唱歌变态好听!从零基础入门让你唱歌彻底变好听,学不会退出音乐圈!第一天

打基础 腹式呼吸&#xff08;口鼻同吸&#xff09;速度要快&#xff0c;练习狗哈气吐气吐快了容易没气&#xff0c;练吐丝&#xff08;男生&#xff1a;40s&#xff0c;女生&#xff1a;30s&#xff09;&#xff0c;要用腹式呼吸&#xff0c;而不是胸式呼吸&#xff08;肺活量…

35岁了,怎么办?

从裁员联想到程序员的转折点——35岁。35岁是一个尴尬的年纪&#xff0c;这个阶段&#xff0c;我们好像失去任性的资本&#xff0c;却也不像更年长的人一样通达而不惑。在这个不上不下的年纪&#xff0c;35岁有着无尽的烦恼&#xff1a;高昂的房价、上有老下有小的家庭、被裁员…

[java数据结构] 栈(Stack)和队列(Queue)

目录 (一) 栈(Stack) 1. 栈的概念 2. 栈的常见的方法 3. 栈的使用 4. 栈的模拟实现 (二) 队列(Queue) 1. 队列的概念 2. 队列常见的方法 3. 队列的使用 5. 队列的模拟实现 6. 循环队列 总结 (一) 栈(Stack) 1. 栈的概念 栈&#xff1a;一种特殊的线性表&#xff0…

webserver 之 线程同步 线程池(半同步半反应堆)

目录 &#x1f402;前言 &#x1f351;B / S 模型 &#x1f418;线程同步机制 &#x1f33c;概念 &#xff08;1&#xff09;RAII &#xff08;2&#xff09;信号量 &#xff08;3&#xff09;互斥量 &#xff08;4&#xff09;条件变量 &#x1f33c;功能 &#xf…