忘川书阁 / PHP学习 / ThinkPhp5 笔记

分享

   

ThinkPhp5 笔记

2018-04-10  忘川书阁

一、project  应用部署目录
├─application             应用目录(可设置)
│  ├─common              公共模块目录(可更改)
│  ├─index               模块目录(可更改)
│  │  ├─config.php      模块配置文件
│  │  ├─common.php      模块函数文件
│  │  ├─controller      控制器目录
│  │  ├─model           模型目录
│  │  ├─view            视图目录
│  │  └─ ...            更多类库目录
│  ├─command.php         命令行工具配置文件
│  ├─common.php          应用公共(函数)文件
│  ├─config.php          应用(公共)配置文件
│  ├─database.php        数据库配置文件
│  ├─tags.php            应用行为扩展定义文件
│  └─route.php           路由配置文件
├─extend                  扩展类库目录(可定义)
├─public                  WEB 部署目录(对外访问目录)
│  ├─static              静态资源存放目录(css,js,image)
│  ├─index.php           应用入口文件
│  ├─router.php          快速测试文件
│  └─.htaccess           用于 apache 的重写
├─runtime                 应用的运行时目录(可写,可设置)
├─vendor                  第三方类库目录(Composer)
├─thinkphp                框架系统目录
│  ├─lang                语言包目录
│  ├─library             框架核心类库目录
│  │  ├─think           Think 类库包目录
│  │  └─traits          系统 Traits 目录
│  ├─tpl                 系统模板目录
│  ├─.htaccess           用于 apache 的重写
│  ├─.travis.yml         CI 定义文件
│  ├─base.php            基础定义文件
│  ├─composer.json       composer 定义文件
│  ├─console.php         控制台入口文件
│  ├─convention.php      惯例配置文件
│  ├─helper.php          助手函数文件(可选)
│  ├─LICENSE.txt         授权说明文件
│  ├─phpunit.xml         单元测试配置文件
│  ├─README.md           README 文件
│  └─start.php           框架引导文件
├─build.php               自动生成定义文件(参考)
├─composer.json           composer 定义文件
├─LICENSE.txt             授权说明文件
├─README.md               README 文件
├─think                   命令行入口文件
二、安装
三、TP5运行原理(重点)
技术:
(1)mvc设计模式
    m 模型
    v 视图
    c 控制器
    原理:c调度M获取数据,加载视图将数据显示给客户端
(2)模板引擎技术(TP5内置的模板引擎,并不是smarty)
(3)命名空间    
    在没有开启路由的情况下 访问格式:
    index.php 入口文件
    index 应用下的模块
    Index 模块下的控制器
    index 控制器下的方法
2.配置架构(重点)
(1)搭建虚拟主机
(2)构架
   <1>url 访问:不支持普通的模式
        只支持pathinfo模式      
        pathinfo 模式:简化url地址,可以提高网站的收录排名,有利于seo优化
       <2>开启错误调试:
              application/config.php
          // 应用调试模式
        'app_debug'              => true,
        // 应用Trace
        'app_trace'              => true,
(3)配置  
3.路由(重点)
(1)普通使用:
Route::rule(路由规则,'模块/控制器/方法','请求方式','[伪静态设置]',[参数类型设置]);
格式:
Route::rule("/index/:id","index/Index/index5",'get',['ext'=>'html'],['id'=>'\d+']);
(2)请求方式路由
Route::get("路由规则","模块/控制器/方法");
格式:
Route::get("/test","index/Index/index");
(3)快捷路由
把所有的访问操作统统交给同一个路由规则(/test)处理
Route::controller("路由规则","模块/控制器");
格式:
Route::controller("/test","index/Index");
namespace app\admin\controller;
app 应用
admin 模块
controller 控制器
(4)路由别名
通过路由别名访问控制器下的所有方法
Route::alias("别名","模块/控制器");
格式:
Route::alias("users","admin/Test");
4.控制器(重点)
  (1)控制器初始化
    _initialize
    session 在tp5里是自动开启
    session使用:
    <1>导入session
        use think\Session;
    <2>session 设置 Session::set('session名字','session值');
    <3>session 获取 Session::get('session名字');
    <4>session 检测 Session::has("session 名字");
    <5>session 删除 Session::delete("session 名字");
  (2)重定向
     $this->redirect("/路由规则/方法"); 主要用于购物车和结算页.
无限分类
<?php
namespace app\admin\controller;
//导入Controller
use think\Controller;
use think\Db;
class Cate extends Allow
{
    //加载添加模板
    public function getAdd()
    {
        //获取分类信息
        // $cate=Db::table("cates")->select();
        $cate=$this->cates();
        //加载模板
        return $this->fetch("Cate/add",['cate'=>$cate]);
    }
    //执行添加
    public function postInsert()
    {
        //创建请求对象
        $request=request();
        //获取pid和name参数
        $data=$request->only(['pid','name']);
        //获取pid参数
        $pid=$request->param("pid");
        //判断
        if($pid==0){
            //添加是顶级分类
            // echo "<pre>";
            // var_dump($data);
            //拼接path
            $data['path']="0";
        }else{
            //添加不是顶级分类
            // echo "<pre>";
            // var_dump($data);
            
            //获取父类信息 (id=$pid)
            $info=Db::table("cates")->where("id","{$pid}")->find();
            // echo "<pre>";
            // var_dump($info);
            //拼接path 父类path.父类id
            $data['path']=$info['path'].",".$info['id'];
        }
        // echo "<pre>";
        // var_dump($data);
        //执行数据库的插入
        if(Db::table("cates")->insert($data)){
            // echo "111";
            $this->success("添加成功","/cate/index");
        }else{
            // echo "000";
            $this->error("添加失败","/cate/add");
        }
    }
    //调整类别顺序  加分隔符
    public function cates(){
        $cate=Db::query("select *,concat(path,',',id) as paths from cates order by paths");
        //遍历
        foreach($cate as $key=>$value){
            // echo $value['path']."<br>";
            //获取path
            $path=$value['path'];
            //把path 转换为数组
            $arr=explode(",",$path);
            // echo "<pre>";
            // var_dump($arr);
            //获取逗号个数
            $len=count($arr)-1;
            // echo $len."<br>";
            //str_repeat 重复字符串
            $cate[$key]['name']=str_repeat("---|",$len).$value['name'];
        }
        return $cate;
    }
    //分类列表
    public function getIndex(){
        //获取分类信息
        // $cate=Db::table("cates")->select();
        $cate=$this->cates();
        return $this->fetch("Cate/index",['cate'=>$cate]);
    }
    //执行删除
    public function getDelete(){
        //创建请求对象
        $request=request();
        $id=$request->param("id");
        //执行删除
        //判断当前类别下是否具有子类信息
        //获取
        $s=Db::table("cates")->where("pid","{$id}")->Count();
        // echo $s;
        if($s>0){
            $this->error("请先干掉孩子","/cate/index");
        }
        //执行删除
        if(Db::table("cates")->where("id","{$id}")->delete()){
            $this->success("删除成功","/cate/index");
        }else{
            $this->error("删除失败","/cate/index");
        }
    }
    public function getEdit(){
        $request=request();
        $id=$request->param("id");
        //获取需要修改的数据
        $info=Db::table("cates")->where("id","{$id}")->find();
        //获取类别信息
        $cate=Db::table("cates")->select();
        return $this->fetch("Cate/edit",['info'=>$info,'cate'=>$cate]);
    }
    //执行修改
    public function postUpdate(){
        $request=request();
        $id=$request->param('id');
        $data['name']=$request->param('name');
        if(Db::table("cates")->where("id","{$id}")->update($data)){
            $this->success("修改成功","/cate/index");
        }else{
            $this->error("修改失败");
        }
    }
}

前台分类
<?php
namespace app\index\widget;
use think\Controller;
use think\Db;
    class Cate extends Controller
    {
        public function getcatebypid($pid)
        {
            $cate=Db::table("cates")->where("pid",$pid)->select();
            $data=[];
            //遍历
            foreach($cate as $key=>$value){
                //shop 下标用来存储当前父类的子类信息 $value['id']==子类pid
                $value['shop']=$this->getcatebypid($value['id']);
                $data[]=$value;
            }
            return $data;
        }
        //加载头部
        public function header(){
            $cate=$this->getcatebypid(0);
            //加载模板
            return $this->fetch("Cate:header",['cate'=>$cate]);
        }
        //加载尾部方法
        public function footer(){
            return $this->fetch("Cate:footer");
        }
    }
?>

<nav class="nav-main mega-menu">
       <ul class="nav nav-pills nav-main" id="mainMenu">
          {foreach name="cate" item="row"}
          <li class="dropdown"> <a class="dropdown-toggle" href="#"> {$row['name']} <i class="fa fa-angle-down"></i> </a>
            {if condition="$row['shop']"}
             <ul class="dropdown-menu">
                {foreach name="row['shop']" item="rows"}
                <li class="dropdown-submenu"> <a href="#">{$rows['name']}</a>
                  {if condition="$rows['shop']"}
                   <ul class="dropdown-menu">
                      {foreach name="rows['shop']" item="rowss"}
                        <li><a href="index.html">{$rowss['name']}</a></li>
                      {/foreach}
                   </ul>
                   {/if}
                </li>
                {/foreach}
             </ul>
             {/if}
          </li>
          {/foreach}
       </ul>
      </nav>
用户添加修改
<?php
namespace app\admin\controller;
//导入Controller
use think\Controller;
use think\Db;
class User extends Allow
{
    //列表
    public function getIndex()
    {
        $request=request();
        //获取搜索的关键词
        $keywords=$request->get('keywords');
        // echo $keywords;
        //获取数据
        $user=Db::table("users")->where('username',"like","%".$keywords."%")->paginate(4);
        //加载模板
        return $this->fetch("User/index",['user'=>$user,'request'=>$request->param(),'keywords'=>$keywords]);
    }
    //添加
    public function getAdd(){
        //加载模板
        return $this->fetch("User/add");
    }
    //执行添加
    public function postInsert(){
        //请求对象
        $request=request();
        //获取参数
        $data=$request->only(['username','email','password']);
        $data['status']=2;
        $data['token']=rand(1,10000);
        // echo "<pre>";
        // var_dump($data);
        // echo "111";
        //验证操作
        $result=$this->validate($request->param(),'User');
        if(true!==$result){
                // echo $result;
                $this->error($result,'/user/add');
        }
        // echo "111";
        $s=Db::table("users")->insert($data);
        if($s){
            $this->success("添加成功",'/user/index');
        }else{
            $this->error("添加失败",'/user/add');
        }
    }
    //执行删除
    public function getDelete(){
        //获取id
        //创建请求对象
        $request=request();
        $id=$request->param('id');
        // echo $id;
        if(Db::table("users")->where('id',$id)->delete()){
            $this->success("删除成功","/user/index");
        }else{
            $this->error("删除失败");
        }
    }
    public function getEdit(){
        $request=request();
        $id=$request->param('id');
        //获取需要修改的数据
        $info=Db::table("users")->where("id",$id)->find();
        return $this->fetch("User/edit",['info'=>$info]);
    }
    public function postUpdate(){
        $request=request();
        //获取参数
        $data=$request->only(['username','email']);
        // $data=
        if(Db::table("users")->where("id",$request->param('id'))->update($data)){
            $this->success("修改成功","/user/index");
        }else{
            $this->error("修改失败","/user/edit");
        }
    }
}

登录
<?php
namespace app\admin\controller;
//导入Controller
use think\Controller;
use think\Db;
use think\Session;
class Login extends Controller
{
    public function getLogin()
    {
        //加载模板
        return $this->fetch("Login/login");
    }
    //执行登录
    public function postDologin(){
        //获取输入的验证码
        //创建请求对象
        $request=request();
        $fcode=$request->param('fcode');
        //检测验证码
        if(!captcha_check($fcode)){
            $this->error("验证码错误","/adminlogin/login");
        }else{
            // echo "111";
            //检测管理员和密码
            //获取数据库数据
            $info=Db::table("admin_users")->where('name',$request->param('name'))->find();
            if(!$info){
                $this->error("用户名不正确","/adminlogin/login");
            }else{
                //检测密码
                if($info['password']==$request->param('password')){
                    //把用户的信息存储在session里
                    Session::set('islogin',$info['id']);
                    // (1)获取当前登录用户的所有权限信息(当前用户所能访问到的控制器和方法)
                    $node=Db::query("select n.name,n.mname,n.aname from user_role as ur,role_node as rn,node as n where ur.rid=rn.rid and rn.nid=n.id and uid={$info['id']}");
                    // echo "<pre>";
                    // var_dump($node);exit;
                    // (2)处理权限信息
                    //后台首页权限(每个管理员都拥有)
                    $nodelist['admin'][]="getindex";
                    //如果有add 添加insert 如果有edit 添加update
                    //遍历
                    foreach($node as $v){
                        $nodelist[$v['mname']][]=$v['aname'];
                        //如果有add 添加insert
                        if($v['aname']=="getadd"){
                            $nodelist[$v['mname']][]="postinsert";
                        }
                        //如果有edit 添加update
                        if($v['aname']=="getedit"){
                            $nodelist[$v['mname']][]="postupdate";
                        }
                    }
                    //   echo "<pre>";
                    // var_dump($nodelist);exit;
                    // (3)把当前登录的用户所具有的权限信息(当前用户所能访问到的控制器和方法)存储在session里
                    Session::set('nodelist',$nodelist);
                    // echo "后台首页";
                    $this->success("登录成功","/admin/index");
                }else{
                    $this->error("密码不正确","/adminlogin/login");
                }
            }
        }
    }
    //退出
    public function getLogout(){
        //销毁session作用域
        Session::delete('islogin');
        $this->success("退出成功","/adminlogin/login");
    }
}

文件上传
<?php
namespace app\admin\controller;
//导入Controller
use think\Controller;
use think\Db;
class File extends Controller
{
    public function getIndex()
    {
        //加载模板
        return $this->fetch("File/index");
    }
    //执行上传
    public function postUpload(){
        //普通上传
        // $request=request();
        // //1.获取表单数据
        // $file=$request->file("image");
        // //2.移动到项目根目录下
        // if($file){
        //     // ROOT_PATH 根目录 DS 分隔符 全局变量
        //     $info=$file->move(ROOT_PATH.'public'.DS.'uploads');
        //     //后缀
        //     echo $info->getExtension()."<br>";
        //     //文件信息
        //     echo $info->getSaveName()."<br>";
        // }else{
        //     echo "error";
        //     // $this->error($file->getError(),"/file/index");
        // }
        //验证上传
        $request=request();
        // //1.获取表单数据
        $file=$request->file("image");
        //添加验证规则  validate 验证方法
        $result=$this->validate(['file2'=>$file],['file2'=>'require|image|fileSize:31456677788888'],['file2.require'=>'请选择上传文件','file2.image'=>'非法图像文件','file2.fileSize'=>'图像大小超出']);
        //对比
        if(true!==$result){
            $this->error($result,"/file/index");
        }
        //2.移动到根目录下
        $info=$file->move(ROOT_PATH.'public'.DS.'uploads');
        //获取savename
        $savename=$info->getSaveName();
        // echo $savename;
        $img=\think\Image::open("./uploads/".$savename);
        //名字
        $name=time()+rand(1,10000);
        //后缀
        $type=$img->type();
        //裁剪
        // $img->crop(100,100)->save("./uploads/"."crop/".$name.".".$type);
        //缩放
           // $img->thumb(100,100)->save("./uploads/"."crop/".$name.".".$type);
        //翻转
        // $img->flip()->save("./uploads/"."crop/".$name.".".$type);
        //旋转
        // $img->rotate(-90)->save("./uploads/"."crop/".$name.".".$type);
        //水印
        // $img->water("./logo.jpg",\think\Image::WATER_NORTHWEST)->save("./uploads/"."crop/".$name.".".$type);
        //文字水印
        // $img->text('sm',"./msyh.ttf",25,"#ffffff")->save("./uploads/"."crop/".$name.".".$type);
        // var_dump($img); 可以听见我说话吗   
    }
}

图片删除

Ajax分页
php代码
<?php
namespace app\admin\controller;
//导入Controller
use think\Controller;
use think\Db;
class Article extends Controller
{
    public function getIndex()
    {
        //创建数据对象
        $request=request();
        //获取数据总条数
        $tot=Db::table("articles")->Count();
        // echo $tot;
        //每页显示的数据条数2
        $rev=3;
        //获取数据最大页
        $sums=ceil($tot/$rev);
        $pp=array();
        //循环
        for($i=1;$i<=$sums;$i++){
            $pp[$i]=$i;
        }
        //获取page
        $page=$request->get('page');
        //判断
        if(empty($page)){
            $page=1;
        }
        //获取偏移量
        $offset=($page-1)*$rev;
        //准备sql
        // {$offset} 数据偏移量 {$rev} 每页显示的数据条数
        $sql="select * from articles limit {$offset},{$rev}";
        //判断是否为Ajax
        if($request->isAjax()){
            //执行sql
            $article=Db::query($sql);
            //加载模板
            return $this->fetch("Article/test",['article'=>$article]);
            // exit;
        }
        //执行sql
        $article=Db::query($sql);
          //加载模板
        return $this->fetch("Article/index",['pp'=>$pp,'article'=>$article]);
    }
}

html代码:
<div class="dataTables_paginate paging_full_numbers" id="">
      {foreach name="pp" item="row"}
         <li style="list-style-type:none;width:30px;height:30px;text-align:center;line-height:30px;float:left"><a href="javascript:void(0)" class="btn btn-info" onclick="page({$row})">{$row}</a></li>
       {/foreach}
     </div>
js 代码:
<script type="text/javascript">
    function page(page){
      // alert(page);
      // alert($);
      //Ajax
      $.get("/article/index",{page:page},function(data){
        // alert(data);
        //赋值 把响应数据赋值给id为uid div
        $("#uid").html(data);
      });
    }
</script>

Ajax批量删除
php代码:
//Ajax 删除
    public function getDel(){
        //接收uname参数
        $uname=isset($_GET['uname'])?$_GET['uname']:'';
        if($uname==""){
            echo "请至少选中一条数据";
            exit;
        }
        //遍历
        foreach($uname as $key=>$value){
            if(Db::table("users")->where("id","{$value}")->delete()){
            }
        }
        echo 1;
    }
html代码:
<tr>
      <!-- javascript:void(0)  屏蔽a连接的默认行为-->
      <td colspan="7"><a href="javascript:void(0)" class=" btn btn-info allchoose">全选</a><a href="javascript:void(0)" class=" btn btn-info nochoose">全不选</a><a href="javascript:void(0)" class=" btn btn-info fchoose">反选</a></td>
</tr>
<tr>
     <td colspan="7"><a href="javascript:void(0)" class="btn btn-success del">删除</a></td>
</tr>
js代码:
<script type="text/javascript">
  //全选
  $(".allchoose").click(function(){
    //选中全部的input each JQuery 遍历
    $("#DataTables_Table_1").find("tr").each(function(){
      // alert('sss');
      //获取tr下的input
      $(this).find(":checkbox").attr("checked",true);
    });
  })
  //全不选
  $(".nochoose").click(function(){
    //选中全部的input each JQuery 遍历
    $("#DataTables_Table_1").find("tr").each(function(){
      // alert('sss');
      //获取tr下的input
      $(this).find(":checkbox").attr("checked",false);
    });
  })
  //反选
  $(".fchoose").click(function(){
    $("#DataTables_Table_1").find("tr").each(function(){
      //判断
      if($(this).find(":checked").attr("checked")){
        //设置为不选中
        $(this).find(":checkbox").attr("checked",false);
      }else{
        //选中
        $(this).find(":checkbox").attr("checked",true);
      }
    });
  });
  //删除
  $(".del").click(function(){
    arr=[];
    //遍历全部的input
    $(":checkbox").each(function(){
      //判断选中的input
      if($(this).attr("checked")){
        //获取选中的id
        id=$(this).val();
        // alert(id);
        //push 添加
        arr.push(id);
      }
    })
    // alert(arr);
    //Ajax
    $.get("/user/del",{uname:arr},function(data){
      // alert(data);
      if(data==1){
        // alert("删除成功");
        if($(":checked").attr("checked")){
          //遍历arr
          for(var i=0;i<arr.length;i++){
            //获取选中的input
            $("input[value="+arr[i]+"]").parents("tr").remove();
          }
        }
      }else{
        alert(data);
      }
    });
  })
</script>

图片批量上传
<form action="{地址}" method="POST" enctype="multipart/form-data"
    <input name="image[]" type="file" value="" multiple='multiple' /> 
    <input type="submit" value="提交" />
</form>
import('ORG.Net.UploadFile');
$upload = new UploadFile();// 实例化上传类 
$upload->maxSize = 3145728 ;// 设置附件上传大小 
$upload->allowExts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型 
$upload->savePath = '{本地路径}';// 设置附件上传目录 
if(!$upload->upload()){ $this->error($upload->getErrorMsg());die;//输出错误提示 
}else{ $info = $upload->getUploadFileInfo(); //取得成功上传的文件信息 
foreach($info as $key => $value){ $data[$key]['path'] = '{本地路径}'.$value['savename'];//这里以获取在本地的保存路径为例 } }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>