技术学习

THINKPHP 4

day4

分页

$keyword = input('keyword');
$where = [];
if(!empty($keyword)){
    $where['goods_name']=['like','%'.$keyword.'%'];
}

$list = \app\admin\model\Goods::where($where)->order('id desc')->paginate(10,false,['var_page'=>'page','query'=>['keyword'=>$keyword]]);

paginate第一个值当前页多少条数据 第二个true简洁 false全部 第三个值传递参数

不传递参数的话 点击下一页不会带参

<!-- pagination -->
{$list->render()}

<form action="{:url('admin/goods/index')}" method="get" class="form-search">
    <div class="row-fluid" style="text-align: left;">
        <div class="pull-left span4 unstyled">
            <p> 商品名称:<input class="input-medium" name="keyword" value="{$Request.param.keyword}" type="text"></p>
        </div>
    </div>
    <button type="submit" class="btn">查找</button>
    <a class="btn btn-primary" href="{:url('create')}">新增</a>
</form>

action 用{:url{'admin/goods/index'}} 推荐写全

value值{$Request.param.keyword} 这样写搜索后 搜索框值还在

图片上传
<form action="{:url('admin/goods/save')}" method="post" id="tab" enctype="multipart/form-data">
<input type="file" name="logo">

enctype要填写 上传文件name要填写

//文件上传
$params['goods_logo'] =$this->upload_logo();

private function upload_logo(){
    //获取上传的文件
    $file = request()->file('logo');
    //判断是否上传了文件
    if(empty($file)){
        $this->error("没有上传文件");
    }
    //移动图片到指定的目录下 /public/uploads/
    //这里的validate与表单验证的validate没有任何关系
    $info = $file->validate(['size'=>10*1024*1024,'ext'=>'jpg,png,gif,jpeg'])->move(ROOT_PATH.'public'.DS.'uploads');
    if($info){
        //上传成功  /uploads/20190709/fsfs.jpg
        $goods_logo = DS.'uploads'.DS.$info->getSaveName();
        //返回图片路径
        return $goods_logo;
    }else{
        //上传失败
        $error_msg=$file->getError();
        $this->error($error_msg);
    }
}

缩略图

//生成缩略图 \think\Image类 保存
$image =\think\Image::open('.'.$goods_logo);
//生成缩略图 保存图片 /是根 ./是当前目录
$image->thumb(1000,1000)->text('程志辉博客','./ttf/STXINGKA.TTF','30','#ffffff',\Think\Image::WATER_SOUTHEAST,[-30,-50])->save('.'.$goods_logo);

Db类操作数据

//执行原生sql语句 查询  返回数组
// $res = \think\Db::query('select * from tpshop_goods ORDER BY id desc limit 10 ');
$res = \think\Db::query('select * from tpshop_goods where id=:id',['id'=>1]);
dump($res);
//执行原生sql语句 添加  返回影响条数
//$res1 = \think\Db::execute('insert into tpshop_goods (goods_name,goods_price)
// values(:goods_name,:goods_price)'
// ,['goods_name'=>'thinkphp','goods_price'=>"1999"]);
// dump($res1);

//Db类的方法 查询
$res2 = \think\Db::table('tpshop_goods')->where('id','33')->find();
dump($res2);

//        $res3 = \think\Db::table('tpshop_goods')->order('id','desc')->limit(10)->select();
//        dump($res3);
//改
$res4 = \think\Db::table('tpshop_goods')->where('id','108')->update(['goods_name'=>"gouge666"]);
dump($res4);
//删
$res5 = \think\Db::table('tpshop_goods')->where('id','108')->delete();
dump($res5);

路由

路由将用户的请求按照事先规划的方案提交给指定的控制器或者功能函数来进行处理。

Thinkphp5的路由比较灵活,并且不需要强制等你故意,可以总结归纳如下三种方式

普通模式、混合模式、强制模式

强制模式下,系统中的每次请求都不是随意的,必须做相关的设置,该请求才被允许,这样做的好处是系统相对比较安全、路由非常规范、有利于整体协调配置等。

配置方式:开启路由模式(application/config.php)

普通模式

'url_route_on'=>false,     //开启路由设置
'url_route_must'=>false, //必须使用路由

混合模式

'url_route_on'=>true,     //开启路由设置
'url_route_must'=>false, //必须使用路由

强制模式

'url_route_on'=>true,     //开启路由设置'url_route_must'=>true, //必须使用路由

路由定义

Route::rule("路由表达式","路由地址","请求类型","路由参数(数组)","变量规则(数组)");//简化格式Route::get("路由表达式","路由地址","路由参数(数组)","变量规则(数组)");Route::post("路由表达式","路由地址","路由参数(数组)","变量规则(数组)");Route::any("路由表达式","路由地址","路由参数(数组)","变量规则(数组)");

路由表达式:请求地址(比如浏览器地址栏输入的地址)

路由地址:表示路由表达式最终需要路由到的地址(比如模块/控制器/方法),有多重定制方式,常用的是“模块/控制器/方法?额外参数1=值1&额外参数2=值2"形式

请求类型:GET、POST,大写

路由参数:

methods:请求类型

ext:允许的后缀

deny_ext:进制的访问后缀

domain:允许什么样的域名访问有效

https:检测是否是https请求

before_behavior:行为发生前,进行路由检查

after_behavior:行为发生后,要执行的动作

……

变量规则:检查传递的变量是否符合某个(正则)规则,规则可言通过正则定义

Route::rule('login','home/login/login','GET',['ext'=>'html']);访问: http://servername/index.php/login.html路由到: https://servername/index.php/home/login/login Route::rule('login/:id','home/login/login','GET',['ext'=>'html'],['id'=>'\d+']);访问: http://servername/index.php/login/101.html路由到: http://servername/index.php/home/login/login/id/101Route::rule('login/:id/:name','home/login/login','GET',['ext'=>'html'],['id'=>'\d+','name'=>'[a-zA-z]+']);访问: http://servername/index.php/login/101/tom.html路由: http://servername/index.php/home/login/login/id/101/name/tom

注意点:写了路由 默认路径就无法访问 只能用路由地址进行访问

//后台商品新增Route::get('goods_create','admin/goods/create',['ext'=>'html']);//不能简写{:url('create')}        //href="/admin/goods/create.html"//必须写全{:url('admin/goods/create')}        //href="/goods_create.html"

设置路由后 url必须写全 不然无法访问

路由分组

路由分组功能允许把相同前缀的路由定义合并分组,这样可以提高路由匹配的效率,不必每次都去遍历完整地路由规则。

Route::group('分组名称',function(){    //单个路由的定义});//后台商品详情Route::rule('goods_read/:id','admin/goods/read','GET',['ext'=>'html'],['id'=>'\d+']);//后台商品删除Route::get('goods_delete/:id','admin/goods/delete',['ext'=>'html'],['id'=>'\d+']);Route::group('admin',function(){    //后台商品详情    Route::rule('goods_read/:id','admin/goods/read','GET',['ext'=>'html'],['id'=>'\d+']);    //后台商品删除    Route::get('goods_delete/:id','admin/goods/delete',['ext'=>'html'],['id'=>'\d+']);});

路由地址会发生变化 http://www.tpshop.com/admin/goods_read/106.html

分组名+路由名

组合变量

如果路由中的变量,不想使用/:变量名 的方式定义,可以使用<变量名>组合变量

Route::get('item-<name>-<id>','product/detail',[],['name'=>'\w+','id'=>'\d+']);Route::rule('goods_read/:id','admin/goods/read','GET',['ext'=>'html'],['id'=>'\d+']);Route::rule('goods_read_<id>','admin/goods/read','GET',['ext'=>'html'],['id'=>'\d+']);http://www.tpshop.com/admin/goods_read/106.htmlhttp://www.tpshop.com/admin/goods_read_106.html

资源路由

Route::resource('goods','admin/goods');//对应商品的访问地址//列表get请求 http://servername/goods//添加页面    get请求    http://servername/goods/create
域名路由

Thinkphp支持完整域名、子域名和IP部署的路由和绑定功能,同时还可以起到简化URL的作用

要启用域名部署路由功能,首先需要开启

'url_domain_deploy'=>true    //参数 子域名 对应模块Route::domain('admin','admin');http://www.tpshop.com/admin/goods/index.htmlhttp://admin.tpshop.com/goods/index.html

防止表单多次提交

View{:token()}<input type="hidden" name="__token__" value="{$Request.token}" />    Controllersleep(2);  //模拟方便重复点击测试$rule = [    'goods_name|商品名称' => 'require|token',    'goods_price|商品价格' => 'require|float|egt:0',    'goods_number|商品数量' =>'require|integer|egt:0'];

总结

1.分页+查找 paginate方法

2.文件上传 (请求对象的file方法、文件对象的validate方法、move方法、getSaveName方法)

3.缩略图生成(thinkImage::open()->thumb()->save())

4.了解Db方式操作数据库(执行原生sql等)

5.Composer基本使用

6.注册路由(路由的基本定义、路由分组、资源路由、域名路由)

7.防止表单重复提交

重点案例:商品列表分页+查找、商品logo图片上传(新增、修改)、缩略图生成、composer基本使用、莲西路与基本内容

GouGe
程志辉 前行的路充满未知,不努力尝试,永远都不知道有多精彩。

发表评论

已有 5 条评论
  1. 谢谢大佬,学到了,感觉可以开个课

  2. ?开始搞代码了,国庆快乐。

    1. 哈哈,国庆快乐,辉哥~

  3. 国庆节了还这么认真在撸代码呀

    1. 中秋回家休息了,国庆懒得回就呆在学校写代码