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 "跳过";}

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

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

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

相关文章

ubuntu下vscode的安装包

1.引言 ubuntu下面安装vscode&#xff0c;编码调用接口时可以跳到接口api的位置&#xff0c;因此在ubuntu下安装vscode还是非常有意义的。 2.下载地址 链接&#xff1a;https://pan.baidu.com/s/1j3XNmvbL574p_hYeBqO6dg?pwdryr7 提取码&#xff1a;ryr7 --来自百度网盘超…

如何应对触摸一体机触摸屏失灵问题?怎么校准?

触摸一体机是一种功能强大的设备&#xff0c;集成了电脑、电视和触摸屏等多种功能。其中&#xff0c;触摸屏是其重要组成部分之一。然而&#xff0c;当触摸屏突然失灵时&#xff0c;我们该如何应对呢&#xff1f;以下是一些建议&#xff0c;以帮助您排除问题并重新获得正常触摸…

2024 年你应该选择哪个开源大模型?

自2017年发表的论文《Attention Is All You Need》发明了Transformer架构以来&#xff0c;自然语言处理&#xff08;NLP&#xff09;取得了巨大的进展。随着2022年11月ChatGPT的发布&#xff0c;大型语言模型&#xff08;LLM&#xff09;引起了广泛关注。 你是否想在自己的用例…

通过Zerossl给IP申请免费SSL证书, 实现https ip访问

参考通过Zerossl给IP申请免费SSL证书 | LogDicthttps://www.logdict.com/archives/tong-guo-zerosslgei-ipshen-qing-mian-fei-sslzheng-shu

授权调用: 介绍 Transformers 智能体 2.0

简要概述 我们推出了 Transformers 智能体 2.0&#xff01; ⇒ &#x1f381; 在现有智能体类型的基础上&#xff0c;我们新增了两种能够 根据历史观察解决复杂任务的智能体。 ⇒ &#x1f4a1; 我们致力于让代码 清晰、模块化&#xff0c;并确保最终提示和工具等通用属性透明化…

关于指针和数组的一些经典笔试题解析

前言 大家好&#xff0c;本篇博客将为大家展示一些曾经考过的关于指针的经典笔试题&#xff0c;里面有些题目的难度还是不小的&#xff0c;所以希望大家可以认真理解&#xff1b;如果你点开了本篇博客&#xff0c;麻烦各位大佬一键三连&#xff0c;多多支持&#xff0c;感谢&a…

MATLAB算法实战应用案例精讲-【数模应用】NPS净推荐值分析

目录 前言 几个高频面试题目 NPS如何解决运营人客户忠诚度低落问题

只读存储器(ROM)和并行存储器简介

目录 只读存储器&#xff08;ROM&#xff09; ROM的工作原理 ROM的特点 ROM的应用 并行存储器 并行存储器的工作原理 并行存储器的特点 并行存储器的应用 结论 在计算机体系结构中&#xff0c;存储器起着至关重要的作用&#xff0c;它负责存储和检索数据与指令。只读存…

Aws CodeCommit代码仓储库

1 创建IAM用户 IAM创建admin用户&#xff0c;增加AWSCodeCommitFullAccess权限 2 创建存储库 CodePipeline -> CodeCommit -> 存储库 创建存储库 3 SSH 1) window环境 3.1.1 上载SSH公有秘钥 生成SSH秘钥ID 3.1.2 编辑本地 ~/.ssh 目录中名为“config”的 SSH 配置文…

JRT连接希森美康出图

上一篇用JRT连设备实现了比较有难度的Sebia绘图设备和TCP模式连接。这次连接最常见的检验设备&#xff08;西森美康&#xff09;&#xff0c;读文件和图上传出图。 视频演示 结果格式 通道对应 接口设置 接口处理实现&#xff0c;JRT设备连接全部采用CMD驱动方式实现&am…

The First项目报告:解读去中心化衍生品交易所AVEO

2023 年12月8日凌晨&#xff0c;Solana 生态 MEV 基础设施开发商 Jito Labs 开放了 JTO 空投申领窗口&#xff0c;JTO 的价格在开盘短暂震荡后迅速攀高&#xff0c;一度触及 4.94 美元。 JTO 是加密社区这两日关注的热门标的&#xff0c;而在这场讨论中&#xff0c;除 Solana …

springboot 集成 es--未完结

基于es7.10.x版本 一、前提知识 常见的两种方式&#xff1a;spring boot提供的API 和 ES 官方提供的API ES官方&#xff1a; RestHighLevelClient&#xff1a; 适用于复杂、更细粒度控制的Elasticsearch 操作 spring boot&#xff1a; ElasticsearchRestTemplate&#xff1a…

【无标题】MySQL基础命令

好的&#xff0c;以下是15个常见的MySQL命令及其解释&#xff1a; ### 1. 连接到MySQL服务器 sql mysql -u username -p - **解释**&#xff1a;使用指定的用户名连接到MySQL服务器&#xff0c;-p表示需要输入密码。 ### 2. 显示数据库列表 sql SHOW DATABASES; - **解释**…

AI智能体研发之路-模型篇(四):一文入门pytorch开发

博客导读&#xff1a; 《AI—工程篇》 AI智能体研发之路-工程篇&#xff08;一&#xff09;&#xff1a;Docker助力AI智能体开发提效 AI智能体研发之路-工程篇&#xff08;二&#xff09;&#xff1a;Dify智能体开发平台一键部署 AI智能体研发之路-工程篇&#xff08;三&am…

C++ | Leetcode C++题解之第115题不同的子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int numDistinct(string s, string t) {int m s.length(), n t.length();if (m < n) {return 0;}vector<vector<unsigned long long>> dp(m 1, vector<unsigned long long>(n 1));for (i…

[docker] docker 安全知识 - 镜像,port registry

[docker] docker 安全知识 - 镜像&#xff0c;port & registry 这是第一篇&#xff0c;安全部分还有一篇笔记就记完了 说实话&#xff0c;看完了要学的这些东西&#xff0c;感觉大多数安全问题都可以通过验证登录的合法性去解决 镜像 镜像的问题还是比较多的&#xff0…

Mybatis——入门

新建 idea 准备 数据库 create table user(id int unsigned primary key auto_increment comment ID,name varchar(100) comment 姓名,age tinyint unsigned comment 年龄,gender tinyint unsigned comment 性别, 1:男, 2:女,phone varchar(11) comment 手机号 ) comment 用…

C语言 | Leetcode C语言题解之第116题填充每个节点的下一个右侧节点指针

题目&#xff1a; 题解&#xff1a; struct Node* connect(struct Node* root) {if (root NULL) {return root;}// 从根节点开始struct Node* leftmost root;while (leftmost->left ! NULL) {// 遍历这一层节点组织成的链表&#xff0c;为下一层的节点更新 next 指针stru…

调整GIF图大小的方法是什么?分享4个

调整GIF图大小的方法是什么&#xff1f;在数字化时代&#xff0c;GIF以其独特的动图魅力&#xff0c;成为了网络交流中不可或缺的一部分。无论是社交媒体、博客文章还是工作汇报&#xff0c;一个恰到好处的GIF图往往能有效吸引观众的注意&#xff0c;传递信息&#xff0c;但过大…

【YOLOv8改进[Neck]】小目标遮挡检测的性能提升(SEAM、MultiSEAM)- 目标遮挡检测(本文包含代码 + 修改方式等全部内容)

目录 一 SEAM 和 Repulsion Loss 1 SEAM 2 MultiSEAM 3 排斥损失Repulsion Loss 二 使用SEAM和 MultiSEAM改进YoloV8