laravel5基础用法
来源:互联网 发布:词汇量测试什么软件 编辑:程序博客网 时间:2024/05/17 19:21
配置
如果您使用的是Apache服务器,需要找Httpd.conf文件中开启
并且laravel对php版本有所要求,因为laravel使用了很多php的新特性,建议使用php7,现在还有什么理由不使用php7呢?需要开启如下的php扩展
extension=php_openssl.dll
extension=php_mbstring.dll
extension=php_pdo_mysql.dll
还要把storage和vendor目录权限配置为777
安装完 Laravel 后,需要配置一些目录的读写权限:storage 和 bootstrap/cache 目录应该是可写的
还有
控制器
使用laravel提供的命令创建控制器
php artisan make:controller IndexController
在app\Http\Controllers\IndexController.php中
在路由中写
Route::get('/test', 'IndexController@index');
在控制器中写
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class IndexController extends Controller{ public function index() { echo '11'; }}
路由
laravel一开始走的是public/index.php.
当然我们也可以把外面的service.php改为index.php并且把public里面.htaccess复制到外面,这样我们访问laravel就不要跟public/index.php了
内置服务器缓存清理
php artisan serve
这时候我们不要关闭cmd,一关闭,站点就不能用了.
在laravel5.2里面路由是放在app/Http/routes.php这里的.然而在laravel5.4中路由是写在routes/web.php中的
项目的静态资源文件是存放在resources/views中的,在这里面我们可以看到欢迎页面的welcome.blade.php
请求
在routes.php(5.2)或者web.php(5.4)中写路由,(postman测试)
Route::get('/hd',function(){ echo 'get-hd';});Route::post('/hd',function(){ echo 'post-hd';});
可以用postman测试出相应的结果.
有时候还需要注册路由响应多个HTTP请求–这可以通过match方法来实现,或者也可以通过使用any方法注册一个路由来响应所有的HTTP请求
Route::match(['get','post'],'/hello',function(){ echo 'get-post';});Route::any('/foo',function(){ echo 'any';});
同时可以在路由中定义参数
Route::get('userId/{userID}/posts/{posts}',function($Id,$posts){ echo $Id.'--'.$posts;});#地址栏输入http://127.0.0.1:8000/userId/jdxia/posts/17#结果:jdxia--17#注意参数后面加个?,表示可以不写,但是后面形参建议给个默认值Route::get('userId/{userID?}/posts/{posts?}',function($Id=0,$posts=null){ echo $Id.'--'.$posts;});#地址栏输入http://127.0.0.1:8000/userId/20/posts#结果:20--#如果这样,路由不知道和那个对应了,直接报错#http://127.0.0.1:8000/userId/posts#里面的参数还可以正则约束:#可以使用路由实例上的where方法来约束路由参数的格式。where方法接收参数名和一#个正则表达式来定义该参数如何被约束:Route::get('user/{id}/{name}',function(){ //})->where(['id'=>'[0-9]+','name'=>'[a-z]+']);
还有更多参考官方手册
在laravel里面return数组会在页面上显示json,无需我们在编码成json了
Route::get('/hd', function () { return ['name'=>'jdxia'];});{'name':'jdxia'}
注意:
Route::get('/hd', function () { return true;});#这种是不行的会报错,如果我们要返回一个bool类型外面用dd套下就行
命名路由
命名路由为生成 URL 或重定向提供了便利。实现也很简单,在定义路由时使用数组键 as 指定路由名称:
Route::get('user',['as'=>'profile',function(){ echo route('profile'); //http://127.0.0.1/user return '<br />命名路由';}]);
此外,还可以为控制器动作指定路由名称:
Route::get('user1',[ 'as'=>'profix','uses'=>'IndexController@index']);#as后面跟的路由 uses表示使用哪个控制器下面的那个方法#在对应的控制器下面写class IndexController extends Controller{ public function Index() { echo route('profile');//http://127.0.0.1/user1 }}
以后我们可以使用route(路由)表示URL地址
路由分组
我们通常把控制器放在各个文件夹中,比如在app\Http\Controllers下面创建一个Admin文件夹
控制器:
<?phpnamespace App\Http\Controllers\Admin;//和继承的Controller不在同一个文件夹下面要使用命名空间use App\Http\Controllers\Controller;class IndexController extends Controller{ public function index() { echo 'index'; } public function login() { echo 'login'; }}
路由:
Route::get('admin/index', 'Admin\IndexController@index');Route::get('admin/login', 'Admin\IndexController@login');#这样写路由太麻烦了,可以把路由分组Route::group(['prefix'=>'admin','namespace'=>'Admin'],function(){ Route::get('index', 'IndexController@index'); Route::get('login', 'IndexController@login');});
php artisan route:list
资源路由
Route::resource('article','ArticleController');
创建ArticleController,在命令行运行下面命令,会发现我们所有的路由
php artisan route:list
比如上面get方式请求article他会请求ArticleController控制器下index方法
数据迁移
在项目目录下有database文件夹,database/migrations有laravel为我们提供的迁移文件
使用 Artisan 命令make:migration来创建一个新的迁移
php artisan make:migration create_table_questions --create=questions
新的迁移位于database/migrations目录下,每个迁移文件名都包含时间戳从而允许 Laravel 判断其顺序,然后我们把laravel提供的迁移文件删除.如果不删除会生成其他的表
打开对应的迁移文件,里面可以看到有up和down方法 在up方法中我们创建一个表名为table1,并添加些字段
up方法写好了,现在用artisan来创建对应的表
php artisan migrate
可以看到有migrations和table_1这2张表,migrations这张表是记录迁移的
在down方法里面可以写对应代码删除表
public function down(){ //参数是存在的表名 Schema::drop('table_1');}
然后在控制台里运行回滚迁移,删除这张表
php artisan migrate:rollback
对应的数据库里面可以看到已经删除这张表
在对应的命令后面加 –pretend 比如
php artisan migrate --pretend
可以看到这条命令将要执行什么,实际上他还没执行
数据填充
在这个文件夹下会生成这个文件,编辑下,可以用db类
再运行执行单个填充文件就可以
如何批量执行
然后运行批量执行填充文件就可以
中间件
中间件在app/Http/kernel.php这个文件中,其中
protected $middlewareGroups=[ 'web'=>[
这是系统的,如果我们要使用中间件可以自己创建一个
这是我们自己设置的中间件,把上面一行复制下改个名称就好了,在laravel5.2也是一样
在命令行敲> php artisan 可以看到很多命令,里面就有创建中间件的命令
然后我们开始创建中间件
php artisan make:middleware 中间件名字
php artisan make:middleware AdminLogin
可以在对应文件夹里面看到app\Http\Middleware\AdminLogin.php
现在可以使用中间件
Route::group(['middleware'=>['web','Admin.login']],function (){ Route::get('login','IndexController@login');});
视图
单个分配,后面的with可以写多个with();
在resources/views下面新建my/my_laravel.blade.php
上面的视图分配过于繁琐,我们可以使用compact来简化
return view('my/my_laravel',compact('data','name','age'));
但是视图中数组要这样写
{{$data['rel']}}
Blade模板引擎
所有blade视图页面都会编译成原生的php代码并缓存起来,除非模板被修改,否则不会重新编译
支持php语法:
{{in_array($name,$arr)?'true','false'}}
注释
{{--{{11}}--}}
这个注释f12看不到
如果不想让模板引擎解析,就在前面加@
{{$data}} @{{$data}} {{$data}}
#上面会输出11 {{$data}} 11
模板引擎还有一个功能是防止恶意脚本注入:
$data='<script>alert("1");</script>'
return view('my/my_laravel',compact('data'));
上面会在blade模板中显示:
<script>alert('1');</script>
看网页源代码,他把对应的符号解析为实体了,如果想让这js代码能正常执行可以使用这个
<div>{!! $data !!}</div>
如果没有值,值=null,但是模板不想输出null,可以使用这个,有就输出值,没有输出默认
{{$data or 'ok'}}
或者
{{isset($data)?$data:'ok'}}
流程控制
ifelse
<div> @if($data<60 && $data>10) 不及格 @elseif($data<10) 太差 @else 及格 @endif</div>
unless
<div> @unless($data>60) 不及格 @endunless</div>#除非大于60,不进来,否则都不进来
for
@for($i=0;$i<=$data;++$i) {{$i}}<br /> @endfor
foreach
@foreach($data as $k=>$v) {{$k}}-->{{$v}}<br /> @endforeach
forelse
@forelse($data as $v) {{$v}}<br /> @empty 没有数据 @endforelse#有数据就输出$v,没有就输出那段话
模板引擎子视图
比如:
如果我们要把html也放到公共地方呢
外面页面写,其中@section() @endsection是固定格式表示要替换模板中什么内容
如果主模板里面写了内容
那么不会在子模板显示,如果要在子模板显示就要写@parent
URL
三种方式
url()通过路由名字生成url
action()通过制定的控制器和方法生成url
route()通过路由的别名生成url
路由中点击传递参数
数据库基本操作
.env配置和读取
在.env文件中APP_DEBUG=true
生成模式开启true,线上模式为false
.env里面还有APP_KEY这项,可以用命令行 php artisan key:generate 来改变key值,他是对项目中一些敏感的加密,有时候这个还会绑定电脑的mac地址,比如win的laravel传到linux上,可以运行不了,就要改变这个
在.igitignore下面有.env这个文件,提交时候会忽略
.env文件其实就是对config文件夹做一些通用的提取
在config文件夹中有database.php文件里面有数据库相关配置
比如上面数据表前缀
''prefix' => env('DB_PREFIX', ''),'
这样写就可以把前缀写到.env文件,他会读取到.env文件
Laravel读取文件信息文件后面会跟个点
下图读取config文件夹下面的一些文件里面的配置信息
上面一行输出app文件下debug值
下面一行输出database文件下default的值
再下面一行是读取database这文件里面多维数组中的值
数据库连接
不要忘记在配置文件中.env更改连接数据库的一些值
测试连接数据库,注意要在DB前面加\
$pdo=\DB::connection()->getPdo();
dd($pdo);
CURD
DB facade
基本用法
注意这边from后面要跟完整的表名,就算.env文件配置过了也不行
查询构造器
不要写完整表名了,完整表名的blog_stu,然后.env文件里面配置过表名的前缀了
删除数据
自增自减
查询数据
聚合函数
连接查询
内连接(等值连接)
查询构建器还可以用于编写基本的 SQL “内连接”,你可以使用查询构建器实例上的 join 方法,传递给 join 方法的第一个参数是你需要连接到的表名,剩余的其它参数则是为连接指定的列约束,当然,正如你所看到的,你可以在单个查询中连接多张表:
$users = DB::table('users') ->join('contacts', 'users.id', '=', 'contacts.user_id') ->join('orders', 'users.id', '=', 'orders.user_id') ->select('users.*', 'contacts.phone', 'orders.price') ->get();
左连接
如果你是想要执行“左连接”而不是“内连接”,可以使用 leftJoin 方法。该方法和 join 方法的用法一样:
$users = DB::table('users') ->leftJoin('posts', 'users.id', '=', 'posts.user_id') ->get();
交叉连接
要执行“交叉连接”可以使用 crossJoin 方法,传递你想要交叉连接的表名到该方法即可。交叉连接在第一张表和被连接表之间生成一个笛卡尔积:
$users = DB::table('sizes') ->crossJoin('colours') ->get();
联合(union)
查询构建器还提供了“联合”两个查询的快捷方式,比如,你可以先创建一个查询,然后使用 union 方法将其和第二个查询进行联合:
$first = DB::table('users') ->whereNull('first_name');$users = DB::table('users') ->whereNull('last_name') ->union($first) ->get();
ORM
php artisan make:model User
会发现Model already exists!
在app\User.php发现里面之前有个User.php这是他的一个示例文件,把这文件删除
删除之后再创建,然后建个Model文件夹,把创建好的user.php移动到这里,改下命名空间
查询
这图是在控制器写,注意命名空间
ORM中新增,自定义时间戳及批量赋值
通过模型新增数据(涉及到自定义事件戳)
使用模型的create方法新增数据(涉及到批量赋值)
查询数据库有没有这条记录
新增
默认会在数据表中有create_at
和updated_at
时间
如果我们想存储时间戳呢?记住字段的类型不要搞错
在模型中写
create新增数据
然后要在模型中写
修改数据
删除
通过模型删除 通过主键值删除 根据指定条件删除
销毁结果集
$a=xx::where('id','=',12)->firstorFail();
$a->destory();
表单篇
Controller之Request
Laravel请求组件用的是symfony/http-foundation组件
上面通过input取值
Request::only('');
只要请求参数里面的值 Request::except('');
只要过滤请求参数里面的值 Request::url();
输出url,?后面不输出 Request::fullurl();
输出完整url,?也输出
Route::get('/', function () { $rel=Request::only('name'); dd($rel); // return view('welcome');});
Controller之session
Session配置文件保存在config/session.php
默认使用file驱动,如果使用的是数据库驱动
'table'=>'sessions'
表名就是这个
使用session前要开启session,laravel开启session要设置中间件
第一种
注意这边session是使用request组件的
第二种
Session辅助函数
第三种
Session类
如果想存个数组进去
读取所有
判断有没有存在
删除指定key的session
Session::forget('student');
清空所有的session
Session::flush();
laravel中session支持二级存储
session()->set('person.name','jdxia');session()->set('person.friend.age',17);dd(session()->all());/***array:4 [▼* "_token" => "LdCqI9SydkSeur9xrGcWS7ntQGyzDmO5jURx11Ve"* "_previous" => array:1 [▶]* "_flash" => array:2 [▶]* "person" => array:2 [▼* "name" => "jdxia"* "friend" => array:1 [▼* "age" => 17* ]* ]*]
Session暂存
Controller之Response
就是响应
响应常见类型:字符串 视图 json 重定向
重定向
重定向并传递一个暂存的session数据过去
redirect跳转还有return redirect()->action(‘StudentController@show’)->with(‘msg’,’暂存session数据’);//下面路由别名跳转return redirect()->route(‘show’ ->with(‘msg’,’暂存session数据’);
重定向上一层数据
return redirect()->back();
Controller之Middleware
用来过滤进入程序的http请求
首先在kernel.php中创建中间件
'activity'=>\App\Http\Middleware\Activity::class
然后在routes.php中
宣传页面就不要放在中间件中
然后控制器页面
然后中间件文件中
如果请求是/act1,时间没有满足就跳跳act0,满足就执行操作
在请求前执行叫前置,后面执行叫后置
也可以把这个打印出来
Input
表单提交上来可以用Input类来获取
获取所有的Input::all()
获取get的Input::get()
获取上传文件的Input::file()
里面也可以写参数,如:Input::file('filename')
请求历史
Route::get('/', function () { //把请求数据暂存到session中 Request::flash(); });Route::get('/old', function () { //返回之前存在session中的值,输出一次就销毁 return Request::old();});
只存某个值flashOnly('name')
除了某个值其他都存flashExcept('name')
CSRF
路由首先要放在中间件中,否则csrf_field中token值为””
控制器
视图
hash加密和验证
加密,生成长度60,每次不一样的加密字符串
$num=123;$rel=Hash::make($num);echo $rel;
简便写法:bcrypt($password);
验证
$num1=123;$rel=Hash::make($num1);$num2=123;$bool=Hash::check($num2, $rel);dd($bool);
一致返回true,不一致false
crypt加密和解密
加密
解密 Crypt::decrypt($str);
Validator验证
密码和确认密码有个注意点在视图上名字要
还有注意命名空间
电话号码验证,首先确定是数字 'phone'=>'numeric'
如果是名字唯一 'username'=>unique:users
表示唯一是users这个表
分页
Student是模型类,每页去2条
页码在视图中这样写就行了
加选中样式
另一中分页
rq是自己定义的函数,获取请求的信息的
表单添加
input里面student是表单名字
Debug
不推荐使用,有时候会出问题
用户认证
php artisan make:auth 在控制台中创建,layout里面用{{asset(‘ ’)}}包含js,css
顺便还要创建表php artisan migrate
文件上传
配置文件config/filesystems.php
支持这些驱动,s3是亚马逊的
Storage_path对应的是这个目录
建立一个上传文件
建一个控制器
如果要判断上传文件的大小可以在上面添加 $file->getSize()
文件在这里
如果想放到public可以改下config/filesystems.php
文件上传方法二:
发送邮件
邮件功能基于swiftMailer函数库之上,提供了简洁的API
配置config/mail.php
支持这些驱动
发件人的全局配置
在.env文件里面可以配置这些
然后在控制器写个方法
缓存
为各种缓存提供了一致的api,支持各种常见的后端缓存系统:如File,memcache和redis
配置文件config/cache.php
有一系列缓存的函数
在文件夹下多了很多文件就是我们缓存目录
错误&日志
错误
配置config/app.php 进行本地开发,应该配置APP_DEBUG环境变量为true,在线上环境应该false
503错误模板
日志
提供了debug,info,notice,warning,error,critical和alert7个错误级别
config/app.php中
模式为single
在控制器里面写
可以看下日志
模式为daily的,每天生成一个日期文件
队列
配置文件config/queue.php
在.env文件中驱动改为数据库驱动
然后在命令行中
迁移文件生成成功,然后执行迁移
创建一个任务类,名字叫SendEmail
可以看到对应文件夹下多出这些文件
然后在SendEmail.php文件下写对应的代码,写个发邮件的
然后可以在我们控制器方法中使用队列了
为什么能直接使用dispatch,因为在控制器继承的controller这个基类已经实现了这个dispatch
如果在模型中要自己手动use,然后运行对应控制器下面方法,可以看到数据库有队列的记录的
然后执行这个队列监听器,有队列进来就执行
处理失败队列
如果队列执行失败会把记录放到一个失败的表里面去,迁移创建一个表
建立失败的表的迁移文件
创建成功现在开始生成表
迁移成功
失败会放到failed_jobs中
如果有很多失败的记录想重新执行
首先查看错误的记录
执行所有的失败队列
删除id4的失败队列记录
全部清除失败的队列记录
帮助函数
array
head
$arr=[1,2,3];
dd(head($arr));
返回1,返回数组第一个元素
arry_only
只要数组中指定的值
$arr=[ 'name'=>'jdxia', 'job'=>'php', 'age'=>17 ];dd(array_only($arr,['name','age']));
array_add
在数组中添加元素,添加到末尾
$arr=[ 'name'=>'Bob', 'age'=>18 ];dd(array_add($arr,'job','php'));array:3 [▼ "name" => "Bob" "age" => 18 "job" => "php"]
array_except
返回数组除了那个值
$arr=[ 'name'=>'Bob', 'age'=>18 ];dd(array_except($arr,'age'));
array_flatten
返回数组最终的值,不管数组维度多深
$arr=[ 'a'=>1, 'b'=>[ 'a'=>2, 'b'=>3 ] ];dd(array_flatten($arr));array:3 [▼ 0 => 1 1 => 2 2 => 3]
last
返回数组中最后一个值
$arr=[ 'name'=>'Bob', 'age'=>18, 'job'=>'php'];return last($arr);
path
路径类的帮助函数
app_path
返回项目中app的绝对路径 return app_path();
返回D:\develop\laravel5.4\app
config_path
返回项目中config的绝对路径 return config_path();
返回D:\develop\laravel5.4\config
public_path
返回项目中public的绝对路径 return public_path();
返回D:\develop\laravel5.4\public
storage_path
返回项目中public的绝对路径 return storage_path();
返回D:\develop\laravel5.4\storage
string
str_plural
英语单词,单数变复数,本来复数的他不会变,有些变复数y变i加es return str_plural('apple');
apples return str_plural('ability');
abilities
starts_with
判断某个单词是不是以某个字符开始,返回bool dd(starts_with('abcd','a'));
true
ends_with
判断某个单词是不是以某个字符结束,返回bool dd(ends_with('abcd','d'));
true
camel_case
把单词转换成驼峰命名法 dd(camel_case('hello_world'));//"helloWorld"
class_basename
输出命名空间最后一个单词 dd(class_basename('App\Controller\Mylaravel'));//Mylaravel
str_limit
限制字符长度 dd(str_limit('abcd',3));//"abc..."
dd(str_limit('你好啊',4));//"你好..."
str_is
判断后面字符串是不是匹配前面模式 dd(str_is('ab*','abcd'));
优化
性能一直是laravel的缺点,所以一定要调优laravel程序
1.配置信息缓存 php artisan config:cache
使用这个命令,把config文件夹里所有的配置信息合并到一个文件里,减少运行时所有配置信息合并到一个文件里,减少运行时文件的载入数量 php artisan config:clear
上面的命令会把bootstrap/cache/config.php
文件删除
注意配置信息缓存不会随着更新而自动加载,所以开发的时候建议关闭信息缓存,一般在生产环境中使用,可以配合Envoy任务运行器
一起使用
2.路由缓存 php artisan route:cache
以上命令会生成 bootstrap/cache/routes.php
文件,需要注意的是,路由缓存不支持路由匿名函数编写逻辑,详见:文档 - 路由缓存。
可以使用下面命令清除路由缓存: php artisan route:clear
此命令做的事情就是把bootstrap/cache/routes.php
文件删除。
注意:路由缓存不会随着更新而自动重载,所以,开发时候建议关闭路由缓存,一般在生产环境中使用,可以配合Envoy 任务运行器
一起使用。
- 类映射加载优化
optimize 命令把常用加载的类合并到一个文件里,通过减少文件的加载,来提高运行效率:php artisan optimize --force
会生成bootstrap/cache/compiled.php
和bootstrap/cache/services.json
两个文件。
你可以可以通过修改config/compile.php
文件来添加要合并的类。
在production
环境中,参数--force
不需要指定,文件就会自动生成。
要清除类映射加载优化,请运行以下命令: php artisan clear-compiled
此命令会删除上面 optimize
生成的两个文件。
注意:此命令要运行在 php artisan config:cache
后,因为 optimize
命令是根据配置信息(如:config/app.php
文件的 providers
数组)来生成文件的。
自动加载优化
此命令不止针对于 Laravel 程序,适用于所有使用composer
来构建的程序。此命令会把PSR-0
和PSR-4
转换为一个类映射表,来提高类的加载速度。composer dumpautoload -o
注意:php artisan optimize --force
命令里已经做了这个操作。使用
Memcached
来存储会话
每一个Laravel
的请求,都会产生会话,修改会话的存储方式能有效提高程序效率,会话的配置信息是config/session.php
,建议修改为Memcached
或者Redis
等专业的缓存软件:'driver' => 'memcached',
使用专业缓存驱动器
「缓存」是提高应用程序运行效率的法宝之一,默认缓存驱动是file
文件缓存,建议切换到专业的缓存系统,如Redis
或者Memcached
,不建议使用数据库缓存。'default' => 'redis',
数据库请求优化
数据库请求优化
数据关联模型读取时使用 延迟预加载 和 预加载 ;
使用Laravel Debugbar
或者Clockwork
留意每一个页面的总数据库请求数量;
这里的篇幅只写到与 Laravel 相关的,其他关于数据优化的内容,请自行查阅其他资料。为数据集书写缓存逻辑
合理的使用 Laravel 提供的缓存层操作,把从数据库里面拿出来的数据集合进行缓存,减少数据库的压力,运行在内存上的专业缓存软件对数据的读取也远远快于数据库。
$posts = Cache::remember('index.posts', $minutes = 30, function(){ return Post::with('comments', 'tags', 'author', 'seo')->whereHidden(0)->get();});
remember 甚至连数据关联模型也都一并缓存了,多么方便呀。
使用即时编译器
HHVM
和OpCache
都能轻轻松松的让你的应用程序在不用做任何修改的情况下,直接提高 50% 或者更高的性能前端资源合并
作为优化的标准,一个页面只应该加载一个CSS
和 一个JS
文件,并且文件要能方便走CDN
,需要文件名随着修改而变化。Laravel Elixir
提供了一套简便实用的方案,详细请见文档:Laravel Elixi
r 文档。
- laravel5基础用法
- laravel5基础用法
- laravel5.1基础路由的使用
- 初识laravel5
- laravel5 timestamp
- Laravel5入门
- Laravel5 安装
- Laravel5 +phpmailer
- laravel5 入门
- Java基础-->static用法基础
- laravel5.0 升级到 laravel5.1
- Ant基础用法
- SQL*PLUS基础用法
- Ant基础用法
- const基础用法
- flex若干基础用法
- NSKeyedArchiver的基础用法
- log4j基础用法
- HDU 1503 Advanced Fruits
- Module 'mysql' already loaded in Unknown on line 0解决方法
- SOA面向服务的架构 学习分享
- Redo Log File(inactive、active)损坏,处理恢复对策
- js中getDay()和getDate(),常用的时间函数
- laravel5基础用法
- 【PM】【进度】:把握项目节奏的方法
- IntelliJ使用指南—— 导入Eclipse的Web项目
- 初识Java之概念
- 经典案例-制作FAO列表页
- caffe loss 曲线(python 正则表达式)
- UEFI原理与编程(四):UEFI工程模块文件-使用main函数的应用程序工程模块
- 正则表达式
- JAVA实现仿微信红包分配规则