7.thinkphp的路由

news2025/4/19 7:02:10

一.路由简介 1. 路由的作用就是让URL地址更加的规范和优雅,或者说更加简洁;

2. 设置路由对URL的检测、验证等一系列操作提供了极大的便利性;

3. 路由是默认开启的,如果想要关闭路由,在config/app.php配置; // 是否启用路由 'with_route' => false,

4. 路由的配置文件在config/route.php中,定义文件在route/app.php;

配置文件是指的是配置相关的属性,定义文件是定义路由规则。

5. route目录下的定义文件的文件名随机,都有效,或多个均有效果;

6. 创建一个Address控制器类,创建两个方法,具体如下:

class Address
 {
 public function index()
 {
 return 'index';
 }
 public function details($id)
 {
 return 'details 目前调用的id:'.$id;
 }
 }

演示:

由于address/details/id/5,想变成ds/5,就要使用路由规则:

那么,

====================================================================

7. 为了让我们路由的课程观看更加直观,我们采用内置服务器的方式来演示;

8. 通过命令行模式键入到当前项目目录后输入命令:php think run启动;

9. 此时,public目录会自动被绑定到顶级域名:127.0.0.1:8000上;

10. 我们只要在地址栏键入:http://localhost:8000或(127.0.0.1:8000)即可;

二.路由定义

1. 在没有定义路由规则的情况下,我们访问address/details包含id的URL为: http://localhost:8000/address/details/id/5 //或者.../id/5.html

2. 将这个URL定义路由规则,在根目录route下的app.php里配置; Route::rule('details/:id', 'Address/details');

3.当配置好路由规则后,会出现非法请求的错误,我们需要用路由规则的URL访问; http://localhost:8000/details/5 //或者.../details/5.html

4. rule()方法是默认请求是any,即任何请求类型均可,第三参数可以限制:

Route::rule('details/:id','Address/xxx,'GET');  //GET
Route::rule('details/:id','Address/xxx,'POST'); //POST 
Route::rule('details/:id','Address/xxx,'GET|POST');  //GET或POST

5.所有请求方式(快捷方式):GET(get)、POST(post)、DELETE(delete)、PUT(put) PATCH(patch)、*(any,任意请求方式)

Route::get(...)、Route::post(...)、Route::delete(...)...

6.快捷方式,就是直接用Route::get、Route::post等方式即可,无须第三参数;

7.当我们设置了强制路由的时候,访问首页就会报错,必须强制设置首页路由;

8.开始强制路由,需要在route.php里面进行配置,然后配置首页路由;

'url_route_must' => true,
 Route::rule('/', 'Index/index'); //反斜杠就是首页默认访问的地址

9.在路由的规则表达式中,有多种地址的配置规则,具体如下:

//静态路由
Route::rule('ad','Address/index');
 //静态动态结合的地址
Route::rule('details/:id','Address/details');
 //多参数静态动态结合的地址
Route::rule('search/:id/:uid', 'Address/search');
 //全动态地址,不限制是否search固定
Route::rule(':search/:id/:uid','Address/search');
 //包含可选参数的地址
Route::rule('find/:id/[:content]', 'Address/find');
 //规则完全匹配的地址
Route::rule('search/:id/:uid$','Address/search');

10.路由定义好之后,我们在控制器要创建这个路由地址,可以通过url()方法实现;

//不定义标识的做法
return url('Address/details',['id'=>10]);
 //定义标识的做法
Route::rule('details/:id','Address/details')->name('det');
 return url('det',['id'=>10]);

不定义标识的做法:

显示把路由放到模板。

定义标识的做法:

========================================================================

要使用Route类注册路由必须首先在路由定义文件开头添加引用(后面不再重复说明)

use think\facade\Route;

注册路由

最基础的路由定义方法是:

Route::rule('路由表达式', '路由地址', '请求类型');

例如注册如下路由规则(假设为单应用模式):

// 注册路由到News控制器的read操作
Route::rule('new/:id','News/read');

我们访问:

http://serverName/new/5

会自动路由到:

http://serverName/news/read/id/5

并且原来的访问地址会自动失效。

可以在rule方法中指定请求类型(不指定的话默认为任何请求类型有效),例如:

Route::rule('new/:id', 'News/update', 'POST');

请求类型参数不区分大小写。

表示定义的路由规则在POST请求下才有效。如果要定义GETPOST请求支持的路由规则,可以用:

Route::rule('new/:id','News/read','GET|POST');

不过通常我们更推荐使用对应请求类型的快捷方法,包括:

类型描述快捷方法
GETGET请求get
POSTPOST请求post
PUTPUT请求put
DELETEDELETE请求delete
PATCHPATCH请求patch
HEADHEAD请求head (V6.0.13+
*任何请求类型any

快捷注册方法的用法为:

Route::快捷方法名('路由表达式', '路由地址');

使用示例如下:

Route::get('new/<id>','News/read'); // 定义GET请求路由规则
Route::post('new/<id>','News/update'); // 定义POST请求路由规则
Route::put('new/:id','News/update'); // 定义PUT请求路由规则
Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则
Route::any('new/:id','News/read'); // 所有请求都支持的路由规则

注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始执行最终的调度方法,后续规则就不再检测。

变量规则

一.变量规则

1. 系统默认的路由变量规则为\w+,即字母、数字、中文和下划线;

2. 如果你想更改默认的匹配规则,可以修改config/route.php配置; // 默认的路由变量规则 'default_route_pattern' => '[\w\.]+',

3. 如果我们需要对于具体的变量进行单独的规则设置,则需要通过pattern()方法;

4. 将details方法里的id传值,严格限制必须只能是数字\d+;

Route::rule('details/:id', 'Address/details')->pattern(['id'=>'\d+']);

5. 也可以设置search方法的两个值的规则,通过数组的方式传递参数;

Route::rule('search/:id/:uid', 'Address/search')->pattern([
 'id'
 => '\d+',
 'uid' => '\d+'
 ]);

6. 以上两种,均为局部变量规则,也可以直接在app.php设置全局变量规则;

Route::pattern([
 'id'
 => '\d+',
 'uid' => '\d+'
 ]);

7. 也支持使用组合变量规则方式,实现路由规则;

Route::rule('details-<id>', 'address/details')->pattern('id', '\d+');

我们路由不一定要/这个符号,也可以其它的。

--------------------------------------------------------------------------

也可以把:id改成<id>

8. 动态组合的拼装,地址和参数如果都是模糊动态的,可以使用如下方法;

Route::rule('details-:name-:id', 'Hello:name/index')->pattern('id', '\d+');

====================================================================

系统默认的变量规则设置是\w+,只会匹配字母、数字、中文和下划线字符,并不会匹配特殊符号以及其它字符,需要定义变量规则或者调整默认变量规则。

可以在路由配置文件中自定义默认的变量规则,例如增加中划线字符的匹配:

'default_route_pattern'	=>	'[\w\-]+',

支持在规则路由中指定变量规则,弥补了动态变量无法限制具体的类型问题,并且支持全局规则设置。使用方式如下:

局部变量规则

局部变量规则,仅在当前路由有效:

// 定义GET请求路由规则 并设置name变量规则
Route::get('new/:name', 'News/read')
    ->pattern(['name' => '[\w|\-]+']);

不需要开头添加^或者在最后添加$,也不支持模式修饰符,系统会自动添加。

全局变量规则

设置全局变量规则,全部路由有效:

// 支持批量添加
Route::pattern([
    'name' => '\w+',
    'id'   => '\d+',
]);

组合变量

如果你的路由规则比较特殊,可以在路由定义的时候使用组合变量。

例如:

Route::get('item-<name>-<id>', 'product/detail')
    ->pattern(['name' => '\w+', 'id' => '\d+']);

组合变量的优势是路由规则中没有固定的分隔符,可以随意组合需要的变量规则和分割符,例如路由规则改成如下一样可以支持:

Route::get('item<name><id>', 'product/detail')
    ->pattern(['name' => '[a-zA-Z]+', 'id' => '\d+']);
Route::get('item@<name>-<id>', 'product/detail')
    ->pattern(['name' => '\w+', 'id' => '\d+']);

使用组合变量的情况下如果需要使用可选变量,则可以使用下面的方式:

Route::get('item-<name><id?>', 'product/detail')
    ->pattern(['name' => '[a-zA-Z]+', 'id' => '\d+']);

动态路由

可以把路由规则中的变量传入路由地址中,就可以实现一个动态路由,例如:

// 定义动态路由
Route::get('hello/:name', 'index/:name/hello');

name变量的值作为路由地址传入。

动态路由中的变量也支持组合变量及拼装,例如:

Route::get('item-<name>-<id>', 'product_:name/detail')
    ->pattern(['name' => '\w+', 'id' => '\d+']);

路由地址

一.路由地址 1. 路由的地址一般为:控制器/操作方法构成; 

//默认Index控制器 
Route::rule('/', 'index'); 

//控制器/操作方法 
Route::rule('details/:id', 'Address/details');

2. 支持多级控制器,并且支持路由到相应的地址; 

//目录为:app\controller\group
 namespace app\controller\group;
 //地址为:app\controller\group
 http://localhost:8000/group.blog/details/id/5
 //支持多级路由
Route::rule('details/:id', 'group.Blog/details');

3. 对于地址,还有一种完整路径的方式去执行操作方法:完整类名@操作方法;

4. 另一种静态方式:完整路径支持这种方法的路由地址:完整类名::静态方法; 

Route::rule('ds/:id', '\app\controller\Address@details');

5. 路由可以通过::redirect()方法实现重定向跳转,第三参数为状态码; 

Route::redirect('ds/:id', 'http://localhost/', 302);

路由到控制器/操作

这是最常用的一种路由方式,把满足条件的路由规则路由到相关的控制器和操作,然后由系统调度执行相关的操作,格式为:

控制器/操作

解析规则是从操作开始解析,然后解析控制器,例如:

// 路由到blog控制器
Route::get('blog/:id','Blog/read');

Blog类定义如下:

<?php
namespace app\index\controller;

class Blog
{
    public function read($id)
    {
        return 'read:' . $id;
    }
}

路由地址中支持多级控制器,使用下面的方式进行设置:

Route::get('blog/:id','group.Blog/read');

表示路由到下面的控制器类,

index/controller/group/Blog

还可以支持路由到动态的应用、控制器或者操作,例如:

// action变量的值作为操作方法传入
Route::get(':action/blog/:id', 'Blog/:action');

路由到类的方法

这种方式的路由可以支持执行任何类的方法,而不局限于执行控制器的操作方法。

路由地址的格式为(动态方法):

\完整类名@方法名

或者(静态方法)

\完整类名::方法名

例如:

Route::get('blog/:id','\app\index\service\Blog@read');

执行的是 \app\index\service\Blog类的read方法。
也支持执行某个静态方法,例如:

Route::get('blog/:id','\app\index\service\Blog::read');

重定向路由

可以直接使用redirect方法注册一个重定向路由

Route::redirect('blog/:id', 'http://blog.thinkphp.cn/read/:id', 302);

路由到模板

支持路由直接渲染模板输出。

// 路由到模板文件
Route::view('hello/:name', 'index/hello');

表示该路由会渲染当前应用下面的view/index/hello.html模板文件输出。

模板文件中可以直接输出当前请求的param变量,如果需要增加额外的模板变量,可以使用:

Route::view('hello/:name', 'index/hello', ['city'=>'shanghai']);

在模板中可以输出namecity两个变量。

Hello,{$name}--{$city}!

路由到闭包

我们可以使用闭包的方式定义一些特殊需求的路由,而不需要执行控制器的操作方法了,例如:

Route::get('hello', function () {
    return 'hello,world!';
});

可以通过闭包的方式支持路由自定义响应输出,例如:

Route::get('hello/:name', function () {
    response()->data('Hello,ThinkPHP')
    ->code(200)
    ->contentType('text/plain');
});

参数传递

闭包定义的时候支持参数传递,例如:

Route::get('hello/:name', function ($name) {
    return 'Hello,' . $name;
});

规则路由中定义的动态变量的名称 就是闭包函数中的参数名称,不分次序。

因此,如果我们访问的URL地址是:

http://serverName/hello/thinkphp

则浏览器输出的结果是:

Hello,thinkphp

依赖注入

可以在闭包中使用依赖注入,例如:

Route::rule('hello/:name', function (Request $request, $name) {
    $method = $request->method();
    return '[' . $method . '] Hello,' . $name;
});

路由到调度对象(V6.0.3+

// 路由到自定义调度对象
Route::get('blog/:id',\app\route\BlogDispatch::class);
namespace app\route;

use think\route\Dispatch;
use think\route\Rule;
use think\Request;

class BlogDispatch extends Dispatch
{
    public function exec()
    {
        // 自定义路由调度
    }
}

具体调度类的实现可以参考内置的几个调度类的实现。

路由分组

1. 路由分组,即将相同前缀的路由合并分组,这样可以简化路由定义,提高匹配效率;

2. 使用group()方法,来进行分组路由的注册;

Route::group('address', function () {
 Route::rule(':id', 'Address/details');
 Route::rule(':name', 'Address/search');
 })->ext('html')->pattern(['id'=>'\d+', 'name'=>'\w+']);

pattern 方法能够为路由参数指定正则表达式匹配规则,以此确保只有符合特定规则的参数值才能匹配对应的路由。

'id'=>'\d+':规定 id 参数只能是一个或多个数字。这意味着,只有当 id 为纯数字时,ds/:id 这条路由规则才会匹配成功。例如,ds/123.html 可以匹配,但 ds/abc.html 就无法匹配。

'name'=>'\w+':规定 name 参数只能是一个或多个单词字符(包含字母、数字和下划线)。所以,sr/john.html 能够匹配,而 sr/@#$.html 则不能匹配。

3. 也可以省去第一参数,让分组路由更灵活一些;

Route::group(function () {
 Route::rule('ds/:id', 'Address/details');
 Route::rule('sr/:name', 'Address/search');
 })->ext('html')->pattern(['id'=>'\d+', 'name'=>'\w+']);

4. 使用prefix()方法,可以省略掉分组地址里的控制器;

Route::group('address', function () {
 Route::rule(':id', 'details');
 Route::rule(':name', 'search');
 })->ext('html')->prefix('Address/')->pattern(['id'=>'\d+', 'name'=>'\w+']);

5. 使用append()方法,可以额外传入参数;

Route::group()...->append(['status'=>1]);

6. 路由规则(主要是分组和域名路由)定义的文件,加载时会解析消耗较多的资源;

7. 尤其是规则特别庞大的时候,延迟解析开启让你只有在匹配的时候才会注册解析;

8. 我们在route.php中开启延迟解析,多复制几组规则,然后来查看内存占用;

'url_lazy_route'
 => true,

MISS路由

1. 全局MISS,类似开启强制路由功能,匹配不到相应规则时自动跳转到MISS;

Route::miss('public/miss');

2. 分组MISS,可以在分组中使用miss方法,当不满足匹配规则时跳转到这里;

Route::miss('miss');

====================================================================

路由分组功能允许把相同前缀的路由定义合并分组,这样可以简化路由定义,并且提高路由匹配的效率,不必每次都去遍历完整的路由规则(尤其是开启了路由延迟解析后性能更佳)。

使用Route类的group方法进行注册,给分组路由定义一些公用的路由设置参数,例如:

Route::group('blog', function () {
    Route::rule(':id', 'blog/read');
    Route::rule(':name', 'blog/read');
})->ext('html')->pattern(['id' => '\d+', 'name' => '\w+']);

分组路由支持所有的路由参数设置,具体参数的用法请参考路由参数章节内容。

如果仅仅是用于对一些路由规则设置一些公共的路由参数(也称之为虚拟分组),也可以使用:

Route::group(function () {
    Route::rule('blog/:id', 'blog/read');
    Route::rule('blog/:name', 'blog/read');
})->ext('html')->pattern(['id' => '\d+', 'name' => '\w+']);

路由分组支持嵌套,例如:

Route::group(function () {
    Route::group('blog', function () {
        Route::rule(':id', 'blog/read');
        Route::rule(':name', 'blog/read');
    });
})->ext('html')->pattern(['id' => '\d+', 'name' => '\w+']);

如果使用了嵌套分组的情况,子分组会继承父分组的参数和变量规则,而最终的路由规则里面定义的参数和变量规则为最优先。

可以使用prefix方法简化相同路由地址的定义,例如下面的定义

Route::group('blog', function () {
    Route::get(':id', 'blog/read');
    Route::post(':id', 'blog/update');
    Route::delete(':id', 'blog/delete');
})->ext('html')->pattern(['id' => '\d+']);

可以简化为

Route::group('blog', function () {
    Route::get(':id', 'read');
    Route::post(':id', 'update');
    Route::delete(':id', 'delete');
})->prefix('blog/')->ext('html')->pattern(['id' => '\d+']);

路由完全匹配

如果希望某个分组下面的路由都采用完全匹配,可以使用

Route::group('blog', function () {
    Route::get(':id', 'read');
    Route::post(':id', 'update');
    Route::delete(':id', 'delete');
})->completeMatch()->prefix('blog/')->ext('html')->pattern(['id' => '\d+']);

延迟路由解析

支持延迟路由解析,也就是说你定义的路由规则(主要是分组路由和域名路由规则)在加载路由定义文件的时候并没有实际注册,而是在匹配到路由分组或者域名的情况下,才会实际进行注册和解析,大大提高了路由注册和解析的性能。

默认是关闭延迟路由解析的,你可以在路由配置文件中设置:

// 开启路由延迟解析
'url_lazy_route'         => true,

开启延迟路由解析后,如果你需要生成路由反解URL,需要使用命令行指令

php think optimize:route

来生成路由缓存解析。

通过路由分组或者域名路由来定义路由才能发挥延迟解析的优势。

一旦开启路由的延迟解析,将会对定义的域名路由和分组路由进行延迟解析,也就是说只有实际匹配到该域名或者分组后才会进行路由规则的注册,避免不必要的注册和解析开销。

路由规则合并解析

同一个路由分组下的路由规则支持合并解析,而不需要遍历该路由分组下的所有路由规则,可以大大提升路由解析的性能。

对某个分组单独开启合并规则解析的用法如下

Route::group('user', function () {
    Route::rule('hello/:name','hello');
    Route::rule('think/:name','think');
})->mergeRuleRegex();

这样该分组下的所有路由规则无论定义多少个都只需要匹配检查一次即可(实际上只会合并检查符合当前请求类型的路由规则)。

mergeRuleRegex方法只能用于路由分组或者域名路由(域名路由其实是一个特殊的分组)。

或者在路由配置文件中设置开启全局合并规则(对所有分组有效)

// 开启路由合并解析
'route_rule_merge'	=> true,

传入额外参数

可以统一给分组路由传入额外的参数

Route::group('blog', [
    ':id'   => 'Blog/read',
    ':name' => 'Blog/read',
])->ext('html')
->pattern(['id' => '\d+'])
->append(['group_id' => 1]);

上面的分组路由统一传入了group_id参数,该参数的值可以通过Request类的param方法获取。

指定分组调度

V6.0.8+版本开始,可以给路由分组单独指定调度类,例如:

Route::group('blog', [
    ':id'   => 'Blog/read',
    ':name' => 'Blog/read',
])->dispatcher(GroupDispatcher::class);

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

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

相关文章

(五)机器学习---决策树和随机森林

在分类问题中还有一个常用算法&#xff1a;就是决策树。本文将会对决策树和随机森林进行介绍。 目录 一.决策树的基本原理 &#xff08;1&#xff09;决策树 &#xff08;2&#xff09;决策树的构建过程 &#xff08;3&#xff09;决策树特征选择 &#xff08;4&#xff0…

【项目管理】第16章 项目采购管理-- 知识点整理

项目管理-相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 &#xff08;一&#xff09;知识总览 项目管理知识域 知识点&#xff1a; &#xff08;项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域&#xff09; 对应&…

从图像“看出动作”

&#x1f4d8; 第一部分&#xff1a;运动估计&#xff08;Motion Estimation&#xff09; &#x1f9e0; 什么是运动估计&#xff1f; 简单说&#xff1a; &#x1f449; 给你一段视频&#xff0c;计算机要“看懂”里面什么东西动了、往哪动了、有多快。 比如&#xff1a; 一…

鸿蒙案例---生肖抽卡

案例源码&#xff1a; Zodiac_cards: 鸿蒙生肖抽奖卡片 效果演示 初始布局 1. Badge 角标组件 此处为语雀内容卡片&#xff0c;点击链接查看&#xff1a;https://www.yuque.com/kevin-nzthp/lvl039/rccg0o4pkp3v6nua 2. Grid 布局 // 定义接口 interface ImageCount {url:…

宿舍管理系统(servlet+jsp)

宿舍管理系统(servletjsp) 宿舍管理系统是一个用于管理学生宿舍信息的平台&#xff0c;支持超级管理员、教师端和学生端三种用户角色登录。系统功能包括宿舍管理员管理、学生管理、宿舍楼管理、缺勤记录、添加宿舍房间、心理咨询留言板、修改密码和退出系统等模块。宿舍管理员…

驱动-兼容不同设备-container_of

驱动兼容不同类型设备 在 Linux 驱动开发中&#xff0c;container_of 宏常被用来实现一个驱动兼容多种不同设备的架构。这种设计模式在 Linux 内核中非常常见&#xff0c;特别 是在设备驱动模型中。linux内核的主要开发语言是C&#xff0c;但是现在内核的框架使用了非常多的面向…

MySQLQ_数据库约束

目录 什么是数据库约束约束类型NOT NULL 非空约束UNIQUE 唯一约束PRIMARY KEY主键约束FOREIGN KEY外键约束CHECK约束DEFAULT 默认值(缺省)约束 什么是数据库约束 数据库约束就是对数据库添加一些规则&#xff0c;使数据更准确&#xff0c;关联性更强 比如加了唯一值约束&#…

责任链设计模式(单例+多例)

目录 1. 单例责任链 2. 多例责任链 核心区别对比 实际应用场景 单例实现 多例实现 初始化 初始化责任链 执行测试方法 欢迎关注我的博客&#xff01;26届java选手&#xff0c;一起加油&#x1f498;&#x1f4a6;&#x1f468;‍&#x1f393;&#x1f604;&#x1f602; 最近在…

林纳斯·托瓦兹:Linux系统之父 Git创始人

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 林纳斯托瓦兹&#xff1a;Linux之父、Git创始人 一、传奇人物的诞生 1. 早年生活与家…

8. RabbitMQ 消息队列 + 结合配合 Spring Boot 框架实现 “发布确认” 的功能

8. RabbitMQ 消息队列 结合配合 Spring Boot 框架实现 “发布确认” 的功能 文章目录 8. RabbitMQ 消息队列 结合配合 Spring Boot 框架实现 “发布确认” 的功能1. RabbitMQ 消息队列 结合配合 Spring Boot 框架实现 “发布确认” 的功能1.1 回退消息 2.备用交换机3. API说…

维港首秀!沃飞长空AE200亮相香港特别行政区

4月13日-16日&#xff0c;第三届香港国际创科展在香港会议展览中心盛大举办。 作为国内领先、国际一流的eVTOL主机厂&#xff0c;沃飞长空携旗下AE200批产构型登陆国际舞台&#xff0c;以前瞻性的创新技术与商业化应用潜力&#xff0c;吸引了来自全球17个国家及地区的行业领袖…

redis6.2.6-prometheus监控

一、软件及系统信息 redis&#xff1a;redis-6.2.6 redis_exporter&#xff1a;redis_exporter-v1.50.0.linux-amd64.tar.gz # cat /etc/anolis-release Anolis OS release 8.9 granfa; 7.5.3 二、下载地址 https://github.com/oliver006/redis_exporter/releases?page…

如何在idea中快速搭建一个Spring Boot项目?

文章目录 前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热启动&#xff08;热部署&#xff09;结语 前言 Spring Boot 凭借其便捷的开发特性&#xff0c;极大提升了开发效率&#xff0c;为 Java 开发工作带来诸多便利。许多大伙伴希望快速…

itext7 html2pdf 将html文本转为pdf

1、将html转为pdf需求分析 经常会看到爬虫有这样的需求&#xff0c;将某一个网站上的数据&#xff0c;获取到了以后&#xff0c;进行分析&#xff0c;然后将需要的数据进行存储&#xff0c;也有将html转为pdf进行存储&#xff0c;作为原始存档&#xff0c;当然这里看具体的需求…

docker compose搭建博客wordpress

一、前言 docker安装等入门知识见我之前的这篇文章 https://blog.csdn.net/m0_73118788/article/details/146986119?fromshareblogdetail&sharetypeblogdetail&sharerId146986119&sharereferPC&sharesourcem0_73118788&sharefromfrom_link 1.1 docker co…

代码随想录算法训练营Day30

力扣452.用最少数量的箭引爆气球【medium】 力扣435.无重叠区间【medium】 力扣763.划分字母区间【medium】 力扣56.合并区间【medium】 一、力扣452.用最少数量的箭引爆气球【medium】 题目链接&#xff1a;力扣452.用最少数量的箭引爆气球 视频链接&#xff1a;代码随想录 题…

无感改造,完美监控:Docker 多阶段构建 Go 应用无侵入观测

作者&#xff1a;牧思 背景 随着云原生的普及&#xff0c;Golang 编程语言变得越来越热门。相比 Java&#xff0c;Golang 凭借其轻量&#xff0c;易学习的特点得到了越来越多工程师的青睐&#xff0c;然而由于 Golang 应用需要被编译成二进制文件再进行运行&#xff0c;Golan…

006.Gitlab CICD流水线触发

文章目录 触发方式介绍触发方式类型 触发方式实践分支名触发MR触发tag触发手动人为触发定时任务触发指定文件变更触发结合分支及文件变更触发正则语法触发 触发方式介绍 触发方式类型 Gitlab CICD流水线的触发方式非常灵活&#xff0c;常见的有如下几类触发方式&#xff1a; …

512天,倔强生长:一位技术创作者的独白

亲爱的读者与同行者&#xff1a; 我是倔强的石头_&#xff0c;今天是我在CSDN成为创作者的第512天。当系统提示我写下这篇纪念日文章时&#xff0c;我恍惚间想起了2023年11月19日的那个夜晚——指尖敲下《开端——》的标题&#xff0c;忐忑又坚定地按下了“发布”键。那时的我…

【目标检测】【YOLO综述】YOLOv1到YOLOv10:最快速、最精准的实时目标检测系统

YOLOv1 to YOLOv10&#xff1a; The fastest and most accurate real-time object detection systems YOLOv1到YOLOv10&#xff1a;最快速、最精准的实时目标检测系统 论文链接 0.论文摘要 摘要——本文是对YOLO系列系统的全面综述。与以往文献调查不同&#xff0c;本综述文…