1. 一.基础
    1. 官网下载
      1. composer安装和更新
        1. 安装
        2. 更新
      2. git下载和更新
        1. 下载安装
          1. 先克隆应用项目仓库
          2. 克隆核心框架仓库
        2. 更新框架.进入thinkphp目录执行
    2. 目录结构
      1. application目录
        1. index目录
          1. config.php
          2. common.php
          3. controller目录
          4. Index.php
          5. model模型目录
          6. view视图目录
          7. 创建index目录对应index控制器类
          8. 在index下编辑html模版文件
        2. command.php
        3. common.php
        4. config.php
        5. tags.php
        6. database.php
        7. route.php
      2. extend目录
      3. public目录
      4. runtime目录
      5. vendor目录
      6. thinkphp目录
        1. lang目录
        2. library目录
          1. think目录
          2. traits目录
        3. tpl目录
        4. base.php
        5. convention.php
        6. helper.php
        7. start.php
      7. build.php
    3. 其他
      1. 读取数据
        1. use think\Db;类
        2. Db::name('data')->find();
  2. 二.URL和路由
    1. url访问
    2. 隐藏index.php入口文件
    3. 定义路由(在application/route.php)配置
    4. 'hello/[:name]$'=>'index/index/hello'
    5. 'hello'=>function($name){return $name}
    6. 先定义好路由.然后可以用Url类
      1. Url::build('blog/read'.'name=mabt')
      2. 使用助手函数url更简单
    7. 模版中生成url
  3. 三.请求和响应
    1. 请求对象
      1. 传统方式调用
        1. 在控制器中先use think\Request;
      2. 继承官方Controller的话可以直接用
      3. 自动注入请求对象
        1. 先use think\request;
        2. 再定义注入
        3. 在函数a内$request->url()可以获取当前url
      4. 更简单使用助手函数request()
      5. 请求信息
        1. 获取请求的参数
        2. 助手函数input('name')
        3. $request->get('name')等价input('get.name')
      6. request对象获取模块控制器/操作方法
        1. 获取当前模块
        2. 获取当前控制器
        3. 获取当前操作方法
    2. 响应对象
      1. 根据配置文件自动输出
      2. 手动输出
      3. 页面跳转
        1. 如果引入官方的Controller的话就不用引入jump类了
        2. $this->success('欢迎使用'.'helo')
        3. $this->error('错误提示'.'guest')
        4. 页面重定向
          1. 助手函数redirect('baidu.com')
  4. 四.数据库
    1. 数据库配置
    2. 数据库查询
      1. 数据库原生查询sql
        1. Db::query('select * from data')
        2. Db::execute('insert into data XXX')
        3. 参数绑定使之安全
      2. 数据库链式查询
        1. Db::name('data')->where('id'.12)->select()
        2. Db::name('data')->where('id'.12)->update(['name']=>'mabt')
        3. Db::name('data')->where('id'.12)->delete()
        4. Db::name('data')->insert(['id'=>10.'name'=>'mabt'])
        5. 还有find/order/field/limit/count等链式方法
        6. Db::transaction(闭包函数)
      3. 模型的对象化查询
    3. 数据库注意事项
      1. Db::name()
        1. Db::name('data')
        2. Db::table('think_data')
      2. 助手函数db()
      3. use \think\Db类
  5. 五.查询语言
    1. 查询表达式
      1. db('data')->where('id'.'>='.1)
      2. exp表达式可以写更复杂的
      3. where('id&并|或userid' '>' 0)
      4. db('data')->where(id 1)->value('name')
      5. db('data')->where(status 1)->column('name')
      6. 还有count/max/min/avg/sum等查询方法
      7. 字符串查询where('id=10')
      8. 时间查询wheretime('time' '>' '2016-02-01')
      9. chunk()分块查询
  6. 六.模型和关联
    1. 模型和Db类的区别
    2. 创建模型并在控制器引用
      1. 创建模型class User extends Model
      2. 在index控制器引入user模型
      3. 在操作方法里面实例化user模型
      4. 保存数据
        1. 先$user->name='mabt'
        2. 再添加数据库(添加新数据)
        3. 更新数据一定要链式isUpdate()
      5. 第二种方法添加数据
        1. 先定义数组$user['name']='mabt'
        2. $re=UserModel::create($user)
      6. 批量新增数据
    3. 查询数据(只找一条数据)
      1. 静态方法getBy字段名()获取一条结果
      2. $a=UserModel::get(['name'=>'mabt'])
    4. 查找多条数据
      1. UserModel::all(['status'=>1])
      2. UserModel::where('id'.'<'.3)->select()
    5. 更新数据
      1. $user->name='mateng'一般实例化之后的save都是默认update操作
    6. 删除数据
      1. 删除操作
      2. 第二种方法更简单
    7. 读取器
      1. 存在的字段值进行转换
      2. 不存在的字段名进行转换调用
    8. 修改器
    9. 字段值类型转换
      1. 将字段的时间戳转换成YMD时间
    10. 自动时间戳
      1. auto_timestamp=>true
    11. 自动完成$insert
      1. protected $insert=['status'=>1]
      2. 除了$insert还有$auto/$update自动完成
    12. 查询范围
      1. page92
    13. 全局查询范围
      1. 定义base全局查询范围的函数
    14. 输入和验证
      1. 先实例化模型
      2. $user->allowField(true)->save(input('post.'))
      3. $this->fetch()渲染模版输出
      4. 表单验证
        1. 定义验证器类模型链式验证
        2. 定义验证器类在控制器验证
        3. Validate::is($b.'date')
    15. 关联模型
      1. 一对一关联
        1. 在模型user中定义一对一关联
        2. 一对一关联的写入
        3. 一对一关联查询
        4. 一对一关联更新
          1. 先实例化对象user
          2. 添加关联的数据
          3. 关联进行更新保存
        5. 一对一关联删除
          1. 先实例化对象user
          2. 先删除user对象
          3. 关联进行删除操作
      2. 一对多关联
        1. 在模型user中定义一对多关联
        2. 一对多关联的新增
        3. 一对多关联的查询
          1. 一对多根据字段查询
          2. 查询写过三本书以上的用户
        4. 一对多关联的更新
          1. $book->title="道德经"
          2. $book->save()
        5. 一对多关联的删除
      3. 多对多关联
        1. 多对多关联一定会有一个中间表
    16. 模型输出
      1. 输出数组(像Db类操作)
      2. 隐藏属性
      3. 只显示指定的属性
      4. 追加读取器的属性()
      5. 输出json格式的数据
  7. 七.视图和模版
    1. 模版输出
      1. 先变量赋值
      2. 再输出渲染模板(view/控制器/方法.html)
      3. 模版中二维数组循环volist
      4. 分页输出
        1. 先实例化获取三条一页
        2. 然后赋值变量输出模版
        3. 在模版总初始化分页数据
      5. 公共模版文件
        1. 在其他模版文件中导入模版文件
          1. 导入的文件也可以定义变量[title]
      6. $this->fetch("list")
    2. 模版布局
      1. {include file='index' /}{__CONTENT__}
      2. 定义其他文件模版
      3. 上面是手动设置.也可以全局自动设置
      4. 全局自动设置某个页面可以临时关闭布局
        1. 或者再模版文件开头加上{__NOLAYOUT__}
      5. 输出替换
      6. $this->display($content)
      7. 助手函数view()
  8. 八.调试和日志
    1. 页面trace
      1. sql栏目查看性能方便优化
      2. 调试栏目可以自定义输出变量或者其他
      3. 配置到console中显示
    2. 异常页面
      1. 执行跳转错误页面的话看提示信息
      2. 红色行就是错误位置
    3. 断点调试
      1. dump()
      2. halt()
      3. tarce($a)
    4. 日志分析
      1. 日志分类级别
        1. log
        2. error
        3. notice
        4. info
        5. debug
        6. sql
    5. 远程调试
  9. 九.API开发
    1. api版本
    2. return json(['daoxia'].404)
    3. abort(404)
    4. 异常处理page158
    5. RESTFul
      1. 添加路由的资源请求
        1. 看着是注册了blogs其实内部注册了7个路由规则
      2. RESTFul请求测试
        1. postman是chrome插件
        2. RESTFul请求伪装
      3. API远程调试
  10. 十.命令行工具
    1. 首先确保php有环境变量可以cmd
    2. 在think目录执行php think
    3. 生成模块
      1. 现在application目录下新建build.php
      2. 执行php think build
    4. 生成控制器文件
      1. 生成模型文件
      2. 默认生成资源控制器自带方法
    5. 生成类库映射文件
      1. 生成类库映射文件
      2. 生成路由缓存文件
      3. 生成数据表字段缓存文件
    6. 指定扩展page177
    7. 命令行调试
  11. 十一.扩展
    1. 函数扩展
      1. 某个模块的公共函数
    2. 类库扩展
      1. 直接将文件放入extend目录下面
    3. 驱动扩展
    4. Composer扩展
  12. 十二.杂项
    1. Session会话
      1. Session初始化
        1. 服务端赋值
        2. 读取某个值
      2. 读取Session
      3. Session操作
      4. 助手函数
      5. 模版输出
      6. Session驱动
      7. Session示例
    2. Cookie
      1. 自动初始化cookie
      2. 读取cookie
      3. 模版输出
      4. cookie操作
        1. 设定cookie
        2. 判断是否存在cookie
        3. 获取cookie
        4. 删除cookie
      5. 助手函数
    3. 验证码
      1. 安装类库(在app目录下执行)
      2. 验证码显示
        1. index方法默认显示模版页
      3. 验证码检测
        1. 在captcha类下创建自己的check检测
          1. 实例化Captcha类调用官方check进行检测
          2. 先实例化验证码类
          3. 检测验证码返回布尔值
          4. 助手函数captcha_check()函数检测
        2. 使用控制器的validate方法进行验证
          1. 注意check函数要注入check(Request $request)
          2. 然后用$request提取参数对code进行必填和验证码验证
      4. 验证码配置
        1. 改变字体大小长度
        2. 中文验证码
        3. 添加背景图
        4. 添加验证码资源(背景图字体等)
        5. 同时使用多个验证码
          1. 显示就是在模版中定义不通id的验证码
          2. 验证在控制器传入第二参数id
    4. 文件上传
      1. 控制器定义
        1. index方法默认html上传页面
        2. up方法进行上传文件提交处理
          1. 先定义up方法进行up(Request $request)
          2. 检测是否是空没有上传成功
          3. 上传文件验证
          4. 移动到框架/public/upload目录下
          5. 另外一种方法可以用$this->validate(好多参数啊)
      2. 上传文件验证
      3. 文件保存规则page222
      4. 多文件上传
        1. 在模版中name="img[]"设定为一个数组
        2. 后端控制器中foreach($files as $file)进行遍历
      5. 后续文件操作page224
    5. 图像处理
      1. 安装扩展
      2. 示例
    6. 单元测试page239