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

thinkphp6的请求

由于笔者是刚入门thinkphp,所以学习时对照thinkphp的官网,各位读者也可以对照官网学习。还麻烦各位笔者一键三连,谢谢。

1.请求对象

当前的请求对象由think\Request类负责,该类不需要单独实例化调用,通常使用依赖注入即可。在其它场合则可以使用think\facade\Request静态类操作。

项目里面应该使用app\Request对象,该对象继承了系统的think\Request对象,但可以增加自定义方法或者覆盖已有方法。项目里面已经在provider.php中进行了定义,所以你仍然可以和之前一样直接使用容器和静态代理操作请求对象。

构造方法注入

一般适用于没有继承系统的控制器类的情况。

<?phpnamespace app\index\controller;use think\Request;class Index 
{/*** @var \think\Request Request实例*/protected $request;/*** 构造方法* @param Request $request Request对象* @access public*/public function __construct(Request $request){$this->request = $request;}public function index(){return $this->request->param('name');}    
}

操作方法注入

另外一种选择是在每个方法中使用依赖注入。

<?phpnamespace app\index\controller;use think\Request;class Index
{public function index(Request $request){return $request->param('name');}    
}

无论是否继承系统的控制器基类,都可以使用操作方法注入。

静态调用

在没有使用依赖注入的场合,可以通过Facade机制来静态调用请求对象的方法(注意use引入的类库区别)。

<?phpnamespace app\index\controller;use think\facade\Request;class Index
{public function index(){return Request::param('name');}    
}

该方法也同样适用于依赖注入无法使用的场合。

助手函数

为了简化调用,系统还提供了request助手函数,可以在任何需要的时候直接调用当前请求对象。

<?phpnamespace app\index\controller;class Index
{public function index(){return request()->param('name');}
}

自定义请求对象

你可以在项目里面自定义Request对象,修改已有的方法或者增加新的方法,默认已经在项目里面为你准备了app\Request类,你只需要直接修改该类就可以为你的项目单独自定义请求对象。

自定义请求对象不支持为多应用的某个应用自定义,只能是全局自定义,如果你需要为某个应用定义不同的请求对象,可以在入口文件里面修改。例如:

// 执行HTTP应用并响应
$request = new app\common\Request();
$http = (new App())->http;
$response = $http->run($request);
$response->send();
$http->end($response);
<?php
namespace app\controller;
use app\BaseController;
use think\facade\Request;
use think\facade\View;
use think\facade\Route;
class RequestTest extends BaseController{//使用类有两种方式//1.先use再直接拿类名使用//2.直接使用:空间名\类名public function test (){echo "1-----测试成功~~~~";//通过请求对象来获取请求信息//使用请求类得到请求对象 think\Request//1.获取请求对象-静态获取dump(Request::method());}public function test1(\think\Request $request){//2.动态获取请求对象,参数绑定dump($request->method());}//3.继承父类的request属性(就是请求对象)public function test2(){dump($this->request->method());}//请求方法public function test3(){//客户端ip地址dump($this->request->ip());//当前访问的域名dump($this->request->host());//当前请求的url地址dump($this->request->url());//当前请求的路由信息dump($this->request->route());//当前请求的请求类型dump($this->request->isGet());//当前请求的请求参数dump($this->request->param());}public function test4(){//get请求//http://localhost:8000/RequestTest/test4?123dump($this->request->get());//pathinfo请求//http://localhost:8000/RequestTest/test4/123=123dump($this->request->pathinfo());//通用请求dump($this->request->param());}public function add(){dump($this->request->method());if($this->request->isPost()){//获取表单提交的数据$post=$this->request->param();//什么都不传默认获取全部数据$postName=$this->request->param('name');dump($post);dump($postName);}else{//get请求,展示表单}return View::fetch();}}
?>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form action="/RequestTest/add" method="post">姓名:<input type="text" name="name"><br>性别:<input type="radio" name="sex" value="male"><input type="radio" name="sex" value="female"><br>年龄:<input type="number" name="age"><br>邮箱:<input type="email" name="email"><br>密码:<input type="password" name="password"><br>爱好:<input type="checkbox" name="hobby[]" value="reading"> 阅读<input type="checkbox" name="hobby[]" value="swimming"> 游泳<input type="checkbox" name="hobby[]" value="running"> 跑步<br>学历:<select name="education"><option value="primary">小学</option><option value="middle">初中</option><option value="high">高中</option><option value="college">大学</option></select><br><input type="submit" value="提交"><a href="/RequestTest/run"></a></form>
</body>
</html>

2.请求信息

Request对象支持获取当前的请求信息,包括:

方法含义
host当前访问域名或者IP
scheme当前访问协议
port当前访问的端口
remotePort当前请求的REMOTE_PORT
protocol当前请求的SERVER_PROTOCOL
contentType当前请求的CONTENT_TYPE
domain当前包含协议的域名
subDomain当前访问的子域名
panDomain当前访问的泛域名
rootDomain当前访问的根域名
url当前完整URL
baseUrl当前URL(不含QUERY_STRING)
query当前请求的QUERY_STRING参数
baseFile当前执行的文件
rootURL访问根地址
rootUrlURL访问根目录
pathinfo当前请求URL的pathinfo信息(含URL后缀)
ext当前URL的访问后缀
time获取当前请求的时间
type当前请求的资源类型
method当前请求类型
rule当前请求的路由对象实例

对于上面的这些请求方法,一般调用无需任何参数,但某些方法可以传入true参数,表示获取带域名的完整地址,例如

use think\facade\Request;
// 获取完整URL地址 不带域名
Request::url();
// 获取完整URL地址 包含域名
Request::url(true);
// 获取当前URL(不含QUERY_STRING) 不带域名
Request::baseFile();
// 获取当前URL(不含QUERY_STRING) 包含域名
Request::baseFile(true);
// 获取URL访问根地址 不带域名
Request::root();
// 获取URL访问根地址 包含域名
Request::root(true);

获取当前控制器/操作

可以通过请求对象获取当前请求的控制器/操作名。

方法含义
controller当前请求的控制器名
action当前请求的操作名

获取当前控制器

Request::controller();

返回的是控制器的驼峰形式(首字母大写),和控制器类名保持一致(不含后缀)。

如果需要返回小写可以使用

Request::controller(true);

如果要返回小写+下划线的方式,可以使用

parse_name(Request::controller());

获取当前操作

Request::action();

返回的是当前操作方法的实际名称,如果需要返回小写可以使用

Request::action(true);

如果要返回小写+下划线的方式,可以使用

parse_name(Request::action());

如果使用了多应用模式,可以通过下面的方法来获取当前应用

app('http')->getName();

3.输入变量

可以通过Request对象完成全局输入变量的检测、获取和安全过滤,支持包括$_GET$_POST$_REQUEST$_SERVER$_SESSION$_COOKIE$_ENV等系统变量,以及文件上传信息。

use think\facade\Request;

检测变量是否设置

可以使用has方法来检测一个变量参数是否设置,如下:

Request::has('id','get');
Request::has('name','post');

变量检测可以支持所有支持的系统变量,包括get/post/put/request/cookie/server/session/env/file

变量获取

变量获取使用\think\Request类的如下方法及参数:

变量类型方法(‘变量名/变量修饰符’,‘默认值’,‘过滤方法’)

变量类型方法包括:

方法描述
param获取当前请求的变量
get获取 $_GET 变量
post获取 $_POST 变量
put获取 PUT 变量
delete获取 DELETE 变量
session获取 SESSION 变量
cookie获取 $_COOKIE 变量
request获取 $_REQUEST 变量
server获取 $_SERVER 变量
env获取 $_ENV 变量
route获取 路由(包括PATHINFO) 变量
middleware获取 中间件赋值/传递的变量
file获取 $_FILES 变量
all V6.0.8+获取包括 $_FILES 变量在内的请求变量,相当于param+file

获取PARAM变量

PARAM类型变量是框架提供的用于自动识别当前请求的一种变量获取方式,是系统推荐的获取请求参数的方法,用法如下:

// 获取当前请求的name变量
Request::param('name');
// 获取当前请求的所有变量(经过过滤)
Request::param();
// 获取当前请求未经过滤的所有变量
Request::param(false);
// 获取部分变量
Request::param(['name', 'email']);

param方法会把当前请求类型的参数和路由变量以及GET请求合并,并且路由变量是优先的。

其它的输入变量获取方法和param方法用法基本一致。

你无法使用get方法获取路由变量,例如当访问地址是

http://localhost/index.php/index/index/hello/name/thinkphp

下面的用法是错误的

echo Request::get('name'); // 输出为空

正确的用法是

echo Request::param('name'); // 输出thinkphp

除了serverenv方法的变量名不区分大小写(会自动转为大写后获取),其它变量名区分大小写。

默认值

获取输入变量的时候,可以支持默认值,例如当URL中不包含$_GET['name']的时候,使用下面的方式输出的结果比较。

Request::get('name'); // 返回值为null
Request::get('name',''); // 返回值为空字符串
Request::get('name','default'); // 返回值为default

前面提到的方法都支持在第二个参数中传入默认值的方式。

变量过滤

框架默认没有设置任何全局过滤规则,你可以在app\Request对象中设置filter全局过滤属性:

namespace app;class Request extends \think\Request
{protected $filter = ['htmlspecialchars'];
}

也支持使用Request对象进行全局变量的获取过滤,过滤方式包括函数、方法过滤,以及PHP内置的Types of filters,我们可以设置全局变量过滤方法,支持设置多个过滤方法,例如:

Request::filter(['strip_tags','htmlspecialchars']),

也可以在获取变量的时候添加过滤方法,例如:

Request::get('name','','htmlspecialchars'); // 获取get变量 并用htmlspecialchars函数过滤
Request::param('username','','strip_tags'); // 获取param变量 并用strip_tags函数过滤
Request::post('name','','org\Filter::safeHtml'); // 获取post变量 并用org\Filter类的safeHtml方法过滤

可以支持传入多个过滤规则,例如:

Request::param('username','','strip_tags,strtolower'); // 获取param变量 并依次调用strip_tags、strtolower函数过滤

如果当前不需要进行任何过滤的话,可以使用

// 获取get变量 并且不进行任何过滤 即使设置了全局过滤
Request::get('name', '', null);

对于body中提交的json对象,你无需使用php://input去获取,可以直接当做表单提交的数据使用,因为系统已经自动处理过了

获取部分变量

如果你只需要获取当前请求的部分参数,可以使用:

// 只获取当前请求的id和name变量
Request::only(['id','name']);

采用only方法能够安全的获取你需要的变量,避免额外变量影响数据处理和写入。

only方法可以支持批量设置默认值,如下:

// 设置默认值
Request::only(['id'=>0,'name'=>'']);

表示id的默认值为0,name的默认值为空字符串。

默认获取的是当前请求参数(PARAM类型变量),如果需要获取其它类型的参数,可以在第二个参数传入,例如:

// 只获取GET请求的id和name变量
Request::only(['id','name'], 'get');
// 等效于
Request::get(['id', 'name']);
// 只获取POST请求的id和name变量
Request::only(['id','name'], 'post');
// 等效于
Request::post(['id', 'name']);

也支持排除某些变量后获取,例如

// 排除id和name变量
Request::except(['id','name']);

同样支持指定变量类型获取:

// 排除GET请求的id和name变量
Request::except(['id','name'], 'get');
// 排除POST请求的id和name变量
Request::except(['id','name'], 'post');

变量修饰符

支持对变量使用修饰符功能,可以一定程度上简单过滤变量,更为严格的过滤请使用前面提过的变量过滤功能。

用法如下:

Request::变量类型(‘变量名/修饰符’);

支持的变量修饰符,包括:

修饰符作用
s强制转换为字符串类型
d强制转换为整型类型
b强制转换为布尔类型
a强制转换为数组类型
f强制转换为浮点类型

下面是一些例子:

Request::get('id/d');
Request::post('name/s');
Request::post('ids/a');

中间件变量

可以在中间件里面设置和获取请求变量的值,这个值的改变不会影响PARAM变量的获取。

<?phpnamespace app\http\middleware;class Check
{public function handle($request, \Closure $next){if ('think' == $request->name) {$request->name = 'ThinkPHP';}return $next($request);}
}

助手函数

为了简化使用,还可以使用系统提供的input助手函数完成上述大部分功能。

判断变量是否定义

input('?get.id');
input('?post.name');

获取PARAM参数

input('param.name'); // 获取单个参数
input('param.'); // 获取全部参数
// 下面是等效的
input('name'); 
input('');

获取GET参数

// 获取单个变量
input('get.id');
// 使用过滤方法获取 默认为空字符串
input('get.name');
// 获取全部变量
input('get.');

使用过滤方法

input('get.name','','htmlspecialchars'); // 获取get变量 并用htmlspecialchars函数过滤
input('username','','strip_tags'); // 获取param变量 并用strip_tags函数过滤
input('post.name','','org\Filter::safeHtml'); // 获取post变量 并用org\Filter类的safeHtml方法过滤

使用变量修饰符

input('get.id/d');
input('post.name/s');
input('post.ids/a');

4.请求类型

获取请求类型

在很多情况下面,我们需要判断当前操作的请求类型是GETPOSTPUTDELETE或者HEAD,一方面可以针对请求类型作出不同的逻辑处理,另外一方面有些情况下面需要验证安全性,过滤不安全的请求。

请求对象Request类提供了下列方法来获取或判断当前请求类型:

用途方法
获取当前请求类型method
判断是否GET请求isGet
判断是否POST请求isPost
判断是否PUT请求isPut
判断是否DELETE请求isDelete
判断是否AJAX请求isAjax
判断是否PJAX请求isPjax
判断是否JSON请求isJson
判断是否手机访问isMobile
判断是否HEAD请求isHead
判断是否PATCH请求isPatch
判断是否OPTIONS请求isOptions
判断是否为CLI执行isCli
判断是否为CGI模式isCgi

method方法返回的请求类型始终是大写,这些方法都不需要传入任何参数。

没有必要在控制器中判断请求类型再来执行不同的逻辑,完全可以在路由中进行设置。

请求类型伪装

支持请求类型伪装,可以在POST表单里面提交_method变量,传入需要伪装的请求类型,例如:

<form method="post" action=""><input type="text" name="name" value="Hello"><input type="hidden" name="_method" value="PUT" ><input type="submit" value="提交">
</form>

提交后的请求类型会被系统识别为PUT请求。

你可以设置为任何合法的请求类型,包括GETPOSTPUTDELETE等,但伪装变量_method只能通过POST请求进行提交。

如果要获取原始的请求类型,可以使用

Request::method(true);

在命令行下面执行的话,请求类型返回的始终是GET

如果你需要改变伪装请求的变量名,可以修改自定义Request类的varMethod属性:

AJAX/PJAX伪装

可以对请求进行AJAX请求伪装,如下:

http://localhost/index?_ajax=1

或者PJAX请求伪装

http://localhost/index?_pjax=1

如果你需要改变伪装请求的变量名,可以修改自定义Request类的varAjaxvarPjax属性:

_ajax_pjax可以通过GET/POST/PUT等请求变量伪装。

5.HTTP头信息

可以使用Request对象的header方法获取当前请求的HTTP请求头信息,例如:

$info = Request::header();
echo $info['accept'];
echo $info['accept-encoding'];
echo $info['user-agent'];

也可以直接获取某个请求头信息,例如:

$agent = Request::header('user-agent');

HTTP请求头信息的名称不区分大小写,并且_会自动转换为-,所以下面的写法都是等效的:

$agent = Request::header('user-agent');
$agent = Request::header('USER_AGENT');

6.伪静态

URL伪静态通常是为了满足更好的SEO效果,ThinkPHP支持伪静态URL设置,可以通过设置url_html_suffix参数随意在URL的最后增加你想要的静态后缀,而不会影响当前操作的正常执行。例如,我们在route.php中设置

'url_html_suffix' => 'shtml'

的话,我们可以把下面的URL

http://serverName/blog/read/id/1

变成

http://serverName/blog/read/id/1.shtml

后者更具有静态页面的URL特征,但是具有和前面的URL相同的执行效果,并且不会影响原来参数的使用。

默认情况下,伪静态的设置为html,如果我们设置伪静态后缀为空字符串,

'url_html_suffix'=>''

则支持所有的静态后缀访问,如果要获取当前的伪静态后缀,可以使用Request对象的ext方法。

例如:

http://serverName/blog/3.html
http://serverName/blog/3.shtml
http://serverName/blog/3.xml
http://serverName/blog/3.pdf

都可以正常访问。

我们可以在控制器的操作方法中获取当前访问的伪静态后缀,例如:

$ext = Request::ext();

如果希望支持多个伪静态后缀,可以直接设置如下:

// 多个伪静态后缀设置 用|分割
'url_html_suffix' => 'html|shtml|xml'

那么,当访问 http://serverName/blog/3.pdf 的时候会报系统错误。

如果要关闭伪静态访问,可以设置

// 关闭伪静态后缀访问
'url_html_suffix' => false,

关闭伪静态访问后,不再支持伪静态方式的URL访问,并且伪静态后缀将会被解析为最后一个参数的值,例如:

http://serverName/blog/read/id/3.html

最终的id参数的值将会变成 3.html

7.参数绑定

参数绑定是把当前请求的变量作为操作方法(也包括架构方法)的参数直接传入,参数绑定并不区分请求类型。

参数绑定传入的值会经过全局过滤,如果你有额外的过滤需求可以在操作方法中单独处理。

参数绑定方式默认是按照变量名进行绑定,例如,我们给Blog控制器定义了两个操作方法readarchive方法,由于read操作需要指定一个id参数,archive方法需要指定年份(year)和月份(month)两个参数,那么我们可以如下定义:

<?php
namespace app\controller;class Blog 
{public function read($id){return 'id=' . $id;}public function archive($year, $month='01'){return 'year=' . $year . '&month=' . $month;}
}

注意这里的操作方法并没有具体的业务逻辑,只是简单的示范。

URL的访问地址分别是:

http://serverName/index.php/blog/read/id/5
http://serverName/index.php/blog/archive/year/2016/month/06

两个URL地址中的id参数和yearmonth参数会自动和read操作方法以及archive操作方法的同名参数绑定。

变量名绑定不一定由访问URL决定,路由地址也能起到相同的作用

输出的结果依次是:

id=5
year=2016&month=06

按照变量名进行参数绑定的参数必须和URL中传入的变量名称一致,但是参数顺序不需要一致。也就是说

http://serverName/index.php/blog/archive/month/06/year/2016

和上面的访问结果是一致的,URL中的参数顺序和操作方法中的参数顺序都可以随意调整,关键是确保参数名称一致即可。

如果用户访问的URL地址是:

http://serverName/index.php/blog/read

那么会抛出下面的异常提示: 参数错误:id

报错的原因很简单,因为在执行read操作方法的时候,id参数是必须传入参数的,但是方法无法从URL地址中获取正确的id参数信息。由于我们不能相信用户的任何输入,因此建议你给read方法的id参数添加默认值,例如:

public function read($id = 0)
{return 'id=' . $id;
}

这样,当我们访问 http://serverName/index.php/blog/read/ 的时候 就会输出

id=0

始终给操作方法的参数定义默认值是一个避免报错的好办法(依赖注入参数除外)

为了更好的配合前端规范,支持自动识别小写+下划线的请求变量使用驼峰注入,例如:

http://serverName/index.php/blog/read/blog_id/5

可以使用下面的方式接收blog_id变量,所以请确保在方法的参数使用驼峰(首字母小写)规范。

public function read($blogId = 0)
{return 'id=' . $blogId;
}

8.请求缓存

支持请求缓存功能,支持对GET请求设置缓存访问,并设置有效期。

请求缓存仅对GET请求有效

有两种方式可以设置请求缓存:

路由设置

可以在路由规则里面调用cache方法设置当前路由规则的请求缓存,例如:

// 定义GET请求路由规则 并设置3600秒的缓存
Route::get('new/:id','News/read')->cache(3600);

第二次访问相同的路由地址的时候,会自动获取请求缓存的数据响应输出,并发送304状态码。

默认请求缓存的标识为当前访问的pathinfo地址,可以定义请求缓存的标识,如下:

// 定义GET请求路由规则 并设置3600秒的缓存
Route::get('new/:id','News/read')->cache([ 'new/:id/:page', 3600]
);

:id:page表示使用当前请求的param参数进行动态标识替换,也就是根据idpage变量进行3600秒的请求缓存。

如果cache参数传入false,则表示关闭当前路由的请求缓存(即使开启全局请求缓存)。

// 定义GET请求路由规则 并关闭请求缓存(即使开启了全局请求缓存)
Route::get('new/:id','News/read')->cache(false);

支持给一组路由设置缓存标签

// 定义GET请求路由规则 并设置3600秒的缓存
Route::get('new/:id','News/read')->cache([ 'new/:id/:page', 3600, 'page']
);

这样可以在需要的时候统一清理缓存标签为page的请求缓存。

全局请求缓存

如果需要开启全局请求缓存,只需要在全局(或者应用)的中间件定义文件middleware.php中增加

 'think\middleware\CheckRequestCache',

然后只需要在route.php配置文件中设置全局缓存的有效时间(秒):

'request_cache_expire'	=>	3600,

就会自动根据当前请求URL地址(只针对GET请求类型)进行请求缓存,全局缓存有效期为3600秒。

如果需要对全局缓存设置缓存规则,可以直接设置request_cache_key参数,例如:

'request_cache_key'	=>	'__URL__',
'request_cache_expire'	=>	3600,

缓存标识支持下面的特殊定义

标识含义
__CONTROLLER__当前控制器名
__ACTION__当前操作名
__URL__当前完整URL地址(包含域名)

全局请求缓存支持设置排除规则,使用方法如下:

'request_cache_key'        => true,
'request_cache_expire' => 3600,
'request_cache_except' => ['/blog/index','/user/member',
],

排除规则为不使用请求缓存的地址(不支持变量)开头部分(不区分大小写)。

    public function run(){//URL生成echo Route::buildUrl()."<br>";//生成当前控制器的URLecho Route::buildUrl('add')."<br>";//访问其他控制器的URLecho Route::buildUrl('Index/index')."<br>";//其他应用下的URLecho Route::buildUrl('admin/index/index')."<br>";//访问时带参数echo Route::buildUrl('add', ['id' => 123])."<br>";//访问时带多个参数echo Route::buildUrl('add', ['id' => 123, 'name' => 'thinkphp'])."<br>";//config下的route.ph可以修改静态路由规则//修改伪静态后缀名echo Route::buildUrl('RequestTest/test', [], '.shtml')."<br>";//带上域名echo Route::buildUrl('RequestTest/test', [], '.shtml')->domain('www.thinkphp.cn')."<br>";return "跳过";}

如果您在浏览文章的时候发现了错误,还请您在评论区留言,笔者看到后会在第一时间处理,谢谢。

相关文章:

thinkphp6的请求

由于笔者是刚入门thinkphp&#xff0c;所以学习时对照thinkphp的官网&#xff0c;各位读者也可以对照官网学习。还麻烦各位笔者一键三连&#xff0c;谢谢。 1.请求对象 当前的请求对象由think\Request类负责&#xff0c;该类不需要单独实例化调用&#xff0c;通常使用依赖注入…...

ant design vue 表格错位,表头错位

ant design vue 表格错位,表头错位 在官网中,我们可以看到下面图片的描述: 好的,我们按照官网来一波,前面都设置了固定宽度,娃哈哈就不设置了.会出现下面效果 为啥会多了一个竖线(因为按照官网来一波x:1300,这个1300太小的原因) 3.那我们把1300改成1600,1700试试,结果也不是…...

【小白向】微信小程序解密反编译教程

# 前言 最近笔者有做到微信小程序的渗透测试&#xff0c;其中有一个环节就是对微信小程序的反编译进行源码分析&#xff0c;所谓微信小程序反编译&#xff0c;就是将访问的小程序进行反向编译拿到部分源码&#xff0c;然后对源码进行安全审计&#xff0c;分析出其中可能存在的…...

Flutter基础 -- Dart 语言 -- 类抽象接口继承函数库

目录 1. 类 class 1.1 定义、使用类 1.2 构造函数 1.3 初始化列表 1.4 命名构造函数 1.5 重定向构造函数 1.6 callable 2. 类 get set 2.1 定义、使用 get set 2.2 简化 get set 2.3 业务场景 3. 静态 static 3.1 static 定义 3.2 函数内部访问 3.3 静态方法 3…...

【TB作品】msp430单片机,播放蜂鸣器音乐,天空之城

功能 msp430单片机&#xff0c;连接一个无源蜂鸣器&#xff0c;播放蜂鸣器音乐&#xff0c;天空之城。 适用于所有msp430单片机。 硬件 无源蜂鸣器&#xff0c;接单片机P1.5&#xff0c;使用vcc3.3v供电。 如果根据简谱修改音乐? //第一步 //首先修改music0 的变量&…...

C语言(数据存储)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#xff0c;在这里撰写成文一…...

Linux shell编程学习笔记56:date命令——显示或设置系统时间与日期

0 前言 2024年的网络安全检查又开始了&#xff0c;对于使用基于Linux的国产电脑&#xff0c;我们可以编写一个脚本来收集系统的有关信息。在收集的信息中&#xff0c;应该有一条是搜索信息的时间。 1. date命令 的功能、格式和选项说明 我们可以使用命令 date --help 来查看 d…...

Realsense的一些事情

Realsense的一些事情 librealsense的安装 官网教程&#xff1a; apt 安装教程&#xff1a; https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md自行clone并编译教程&#xff1a; https://github.com/IntelRealSense/librealsense/blo…...

CISCN 2023 初赛 被加密的生产流量

题目附件给了 modbus.pcap 存在多个协议 但是这道题多半是 考 modbus 会发现 每次的 Query 末尾的两个字符 存在规律 猜测是base家族 可以尝试提取流量中的数据 其中Word Count字段中的22871 是10进制转16进制在转ascii字符串 先提取 过滤器判断字段 tshark -r modbus.pcap …...

初识C语言第三十天——设计三子棋游戏

目录 一.设计游戏框架 1.打印游戏菜单 2.输入选择判断&#xff08;玩游戏/游戏结束/输入错误重新输入&#xff09; 二、玩游戏过程设计 1.设计棋格存放棋子——二维数组 2.初始化棋盘——初始化为空格 3.打印棋盘——本质上就是打印数组 4.游戏过程——1.玩家走棋 2.…...

ehcache3多级缓存应用

项目中如果有使用大量的本地缓存场景&#xff0c;可以使用redisehcache组合缓存&#xff0c;优先使用ehcache本地缓存&#xff0c;本地缓存没有查询到再使用redis缓存 可看前文中如何集成 本地缓存使用存在的问题 1、本地缓存如何保证缓存的是最新值 可定义版本号、自增id或者…...

C# WinForm —— 24 Threading.Timer 组件介绍与使用

1. 简介 System.Threading.Timer 多线程 轻量级 精度高 提供以指定的时间间隔对线程池线程执行方法的机制 和System.Timers.Timer 类似&#xff0c;每隔一段时间触发事件&#xff0c;执行操作(不是由UI线程执行的)&#xff0c;即使事件中执行了比较耗时的操作&#xff0c;也…...

03-07Java自动化之JAVA基础之循环

JAVA基础之循环 一、for循环 1.1for循环的含义 for&#xff08;初始化语句;条件判断;条件控制或–&#xff09;{ ​ //代码语句 } 1、首先执行初始话语句&#xff0c;给变量一个起始的值 2、条件判断进行判断&#xff0c;为true&#xff0c;执行循环体中的代码语句 ​ …...

【人工智能Ⅱ】实验8:生成对抗网络

实验8&#xff1a;生成对抗网络 一&#xff1a;实验目的 1&#xff1a;理解生成对抗网络的基本原理。 2&#xff1a;学会构建改进的生成对抗网络&#xff0c;如DCGAN、WGAN、WGAN-GP等。 3&#xff1a;学习在更为真实的数据集上应用生成对抗网络的方法。 二&#xff1a;实验…...

vmware将物理机|虚拟机转化为vmware虚机

有时&#xff0c;我们需要从不同的云平台迁移虚拟机、上下云、或者需要将不再受支持的老旧的物理服务器转化为虚拟机&#xff0c;这时&#xff0c;我们可以用一款虚拟机转化工具&#xff1a;vmware vcenter converter standalone&#xff0c;我用的是6.6的版本&#xff0c;当然…...

redis 高可用及哨兵模式 @by_TWJ

目录 1. 高可用2. redis 哨兵模式3. 图文的方式让我们读懂这几个算法3.1. Raft算法 - 图文3.2. Paxos算法 - 图文3.3. 区别&#xff1a; 1. 高可用 在 Redis 中&#xff0c;实现 高可用 的技术主要包括 持久化、复制、哨兵 和 集群&#xff0c;下面简单说明它们的作用&#xf…...

封装tab栏,tab切换可刷新页面

dom结构 <template><div class"container"><!-- tab栏 --><div class"border-b"><tabs:tabsList"tabsList":selectTabsIndex"selectTabsIndex"tabsEven"tabsEven"></tabs></div>…...

JavaScript第八讲:日期,Math,自定义对象

目录 前言 日期 1. 创建日期对象 2. 年/月/日 3. 时:分:秒:毫秒 4. 一周的第几天 5. 经历的毫秒数 6. 修改日期和时间 Math 1. 自然对数和圆周率 2. 绝对值 3. 最小最大 4. 求幂 5. 四舍五入 6. 随机数 自定义对象 1. 通过 new Object 创建对象 2. 通过 funct…...

php质量工具系列之phploc

phploc是一个快速测量PHP项目大小的工具 结果支持raw csv xml json格式&#xff0c;可输出文件或者打印到控制台 安装 PHAR方式 wget https://phar.phpunit.de/phploc.pharphp phploc.phar -vComposer方式(推荐) composer global require --dev phploc/phplocphploc -v使用 …...

创建模拟器

修改模拟器默认路径 由于模拟器文件比较大&#xff0c;默认路径在C:\Users\用户名.android\avd&#xff0c;可修改默认路径 创建修改后的路径文件 D:\A-software\Android\AVD添加系统变量ANDROID_SDK_HOME&#xff1a;D:\A-software\Android\AVD重启Android Studio 创建模拟…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...