<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>防翻墙 &#8211; 个人随笔</title>
	<atom:link href="/label/%E9%98%B2%E7%BF%BB%E5%A2%99/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Sat, 19 May 2018 16:03:50 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.1</generator>

<image>
	<url>/wp-content/uploads/2022/01/cropped-截屏2022-01-01-18.57.09-32x32.png</url>
	<title>防翻墙 &#8211; 个人随笔</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Laravel框架（四）视图、会话、中间价、防翻墙、数据验证、多表查询、扩展：PHP use使用场景、钻石设计软件</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6079.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6079.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 16:03:50 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[中间价]]></category>
		<category><![CDATA[会话]]></category>
		<category><![CDATA[多表查询]]></category>
		<category><![CDATA[扩展：PHP use使用场景]]></category>
		<category><![CDATA[数据验证]]></category>
		<category><![CDATA[视图]]></category>
		<category><![CDATA[钻石设计软件]]></category>
		<category><![CDATA[防翻墙]]></category>
		<guid isPermaLink="false">/?p=6079</guid>

					<description><![CDATA[Laravel框架第4天 复习 composer：就是PHP的软件管家，帮助PHP下载项目所需组件（类），如： [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1><a id="post-6079-_Toc487903166"></a>Laravel框架第4天</h1>
<h1>复习</h1>
<p>
  composer：就是PHP的软件管家，帮助PHP下载项目所需组件（类），如：验证码类、上传文件类等等
</p>
<p>
  数据迁移：就是用PHP管理数据库
</p>
<p>
  创建迁移：php artisan make:migration 数据迁移名称
</p>
<p>
  创建迁移：php artisan make:migration create_表名_table  &#8211;create=表名
</p>
<p>
  创建迁移：php artisan make:migration update_表名_table  &#8211;table=表名
</p>
<p>
  运行迁移：php artisan migrate
</p>
<p>
  撤销迁移：php artisan migrate:rollback
</p>
<p>
  数据填充：就是用PHP快速插入测试数据
</p>
<p>
  创建填充：php artisan make:seeder 填充器名称
</p>
<p>
  运行填充：php artisan db:seed &#8211;class=填充器名称
</p>
<p>
  faker说明：就是PHP的一个库（类）
</p>
<p>
  faker作用：生成假数据
</p>
<h1><a id="post-6079-_Toc487990951"></a>一、视图2（页面布局） </h1>
<h2>1、说明</h2>
<p>
  一般在做网站的时候，我们会将网页中公共的部分提取出来，形成一个公共的布局文件（父模板，提取公共的区域），然后在让其他的页面继承该文件以获取公共的区域内容。同时在子页面我们可以定义好自己的内容，然后在公共的页面进行调用显示。
</p>
<p><img fetchpriority="high" decoding="async" width="1055" height="388" src="/wp-content/uploads/2018/05/word-image-5530.png" class="wp-image-6080" srcset="/wp-content/uploads/2018/05/word-image-5530.png 1055w, /wp-content/uploads/2018/05/word-image-5530-300x110.png 300w, /wp-content/uploads/2018/05/word-image-5530-768x282.png 768w, /wp-content/uploads/2018/05/word-image-5530-1024x377.png 1024w" sizes="(max-width: 1055px) 100vw, 1055px" /></p>
<h2>2、语法</h2>
<p>
  @yield(&#8216;标识&#8217;)  	 			父（公共区域）定义内容片段，子填充
</p>
<p>
  @extends(&#8216;标识&#8217;) 	 		子继承父（公共区域）
</p>
<p>
  @section(&#8216;标识&#8217;, &#8216;默认值&#8217;)   子填充父（公共区域）文字
</p>
<p>
  @section(&#8216;标识&#8217;) 				子填充父（公共区域）HTML代码
</p>
<p>
  存放子页面内容
</p>
<p>
  @endsection
</p>
<p>
  @include(&#8216;视图标识&#8217;, [&#8216;key&#8217; =&gt; &#8216;value变量值&#8217;]) 调取公共页面（一般多个子页面提取）
</p>
<h2>3、代码</h2>
<h3>resources\views\layouts\common.blade.php</h3>
<p>
  &lt;!DOCTYPE html&gt;
</p>
<p>
  &lt;html lang=&#8221;zh-CN&#8221;&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
      &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge&#8221;&gt;
</p>
<p>
      &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width, initial-scale=1&#8243;&gt;
</p>
<p>
      &lt;title&gt;laravel&lt;/title&gt;
</p>
<p>
      &lt;!&#8211; Bootstrap CSS 文件 &#8211;&gt;
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; href=&#8221;{{ asset(&#8216;asset/static&#8217;) }}/bootstrap/css/bootstrap.min.css&#8221;&gt;
</p>
<p><strong>    @yield(&#8216;css&#8217;)</strong>
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;div class=&#8221;navbar navbar-default&#8221;&gt;
</p>
<p>
      &lt;div class=&#8221;container&#8221;&gt;
</p>
<p>
          &lt;div class=&#8221;navbar-header&#8221;&gt;
</p>
<p>
              &lt;a href=&#8221;/&#8221; class=&#8221;navbar-brand&#8221;&gt;首页&lt;/a&gt;
</p>
<p>
              &lt;button type=&#8221;button&#8221; class=&#8221;navbar-toggle collapsed&#8221; data-toggle=&#8221;collapse&#8221; data-target=&#8221;#menu&#8221; aria-expanded=&#8221;false&#8221;&gt;
</p>
<p>
                  &lt;span class=&#8221;sr-only&#8221;&gt;菜单折叠&lt;/span&gt;
</p>
<p>
                  &lt;span class=&#8221;icon-bar&#8221;&gt;&lt;/span&gt;
</p>
<p>
                  &lt;span class=&#8221;icon-bar&#8221;&gt;&lt;/span&gt;
</p>
<p>
                  &lt;span class=&#8221;icon-bar&#8221;&gt;&lt;/span&gt;
</p>
<p>
              &lt;/button&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
          &lt;div class=&#8221;collapse navbar-collapse&#8221; id=&#8221;menu&#8221;&gt;
</p>
<p>
              &lt;ul class=&#8221;nav navbar-nav&#8221;&gt;
</p>
<p>
                  &lt;li class=&#8221;active&#8221;&gt;&lt;a href=&#8221;/&#8221;&gt;开发&lt;/a&gt;&lt;/li&gt;
</p>
<p>
                  &lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;列表&lt;/a&gt;&lt;/li&gt;
</p>
<p>
                  &lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;头条&lt;/a&gt;&lt;/li&gt;
</p>
<p>
                  &lt;li class=&#8221;dropdown&#8221;&gt;
</p>
<p>
                      &lt;a href=&#8221;#&#8221; class=&#8221;dropdown-toggle&#8221; data-toggle=&#8221;dropdown&#8221;&gt;资讯 &lt;span class=&#8221;caret&#8221;&gt;&lt;/span&gt;&lt;/a&gt;
</p>
<p>
                      &lt;ul class=&#8221;dropdown-menu&#8221;&gt;
</p>
<p>
                          &lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;学习一&lt;/a&gt;&lt;/li&gt;
</p>
<p>
                          &lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;学习二&lt;/a&gt;&lt;/li&gt;
</p>
<p>
                          &lt;li class=&#8221;divider&#8221;&gt;&lt;/li&gt;
</p>
<p>
                          &lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;技术学习&lt;/a&gt;&lt;/li&gt;
</p>
<p>
                          &lt;li class=&#8221;divider&#8221;&gt;&lt;/li&gt;
</p>
<p>
                          &lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;jq学习&lt;/a&gt;&lt;/li&gt;
</p>
<p>
                      &lt;/ul&gt;
</p>
<p>
                  &lt;/li&gt;
</p>
<p>
              &lt;/ul&gt;
</p>
<p>
              &lt;form class=&#8221;navbar-form navbar-left&#8221;&gt;
</p>
<p>
                  &lt;div class=&#8221;form-group&#8221;&gt;
</p>
<p>
                      &lt;input type=&#8221;text&#8221; class=&#8221;form-control&#8221; placeholder=&#8221;Search&#8230;&#8221;&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
                  &lt;button type=&#8221;submit&#8221; class=&#8221;btn btn-default&#8221;&gt;搜索&lt;/button&gt;
</p>
<p>
              &lt;/form&gt;
</p>
<p>
              &lt;ul class=&#8221;nav navbar-nav navbar-right&#8221;&gt;
</p>
<p>
                  &lt;li&gt;&lt;a href=&#8221;./login.html&#8221;&gt;登录&lt;/a&gt;&lt;/li&gt;
</p>
<p>
                  &lt;li&gt;&lt;a href=&#8221;./register.html&#8221;&gt;注册&lt;/a&gt;&lt;/li&gt;
</p>
<p>
                  &lt;li class=&#8221;dropdown&#8221;&gt;
</p>
<p>
                      &lt;a href=&#8221;#&#8221; class=&#8221;dropdown-toggle&#8221; data-toggle=&#8221;dropdown&#8221;&gt;相关&lt;span class=&#8221;caret&#8221;&gt;&lt;/span&gt;&lt;/a&gt;
</p>
<p>
                      &lt;ul class=&#8221;dropdown-menu&#8221;&gt;
</p>
<p>
                          &lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;系列一&lt;/a&gt;&lt;/li&gt;
</p>
<p>
                          &lt;li class=&#8221;divider&#8221;&gt;&lt;/li&gt;
</p>
<p>
                          &lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;系列二&lt;/a&gt;&lt;/li&gt;
</p>
<p>
                      &lt;/ul&gt;
</p>
<p>
                  &lt;/li&gt;
</p>
<p>
              &lt;/ul&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<p>
  &lt;!&#8211; 头部 &#8211;&gt;
</p>
<p>
  &lt;div class=&#8221;jumbotron jump&#8221;&gt;
</p>
<p>
      &lt;div class=&#8221;container&#8221;&gt;
</p>
<p><strong>        &lt;h2&gt;@yield(&#8216;title&#8217;)&lt;/h2&gt;</strong>
</p>
<p>
          &lt;p&gt; 玩转- laravel&lt;/p&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<p><strong>&lt;!&#8211; 中间内容区局 &#8211;&gt;</strong>
</p>
<p><strong>&lt;div class=&#8221;container&#8221;&gt;</strong>
</p>
<p><strong>    @yield(&#8216;main&#8217;)</strong>
</p>
<p><strong>&lt;/div&gt;</strong>
</p>
<p>
  &lt;!&#8211; 尾部 &#8211;&gt;
</p>
<p>
  &lt;div class=&#8221;jumbotron&#8221; style=&#8221;margin:0;&#8221;&gt;
</p>
<p>
      &lt;div class=&#8221;container&#8221;&gt;
</p>
<p>
          &lt;span&gt;  @2017 laravel&lt;/span&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<p>
  &lt;!&#8211; jQuery 文件 &#8211;&gt;
</p>
<p>
  &lt;script src=&#8221;{{ asset(&#8216;asset/static&#8217;) }}/jquery/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;!&#8211; Bootstrap JavaScript 文件 &#8211;&gt;
</p>
<p>
  &lt;script src=&#8221;{{ asset(&#8216;asset/static&#8217;) }}/bootstrap/js/bootstrap.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;link href=&#8221;https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css&#8221; rel=&#8221;stylesheet&#8221;&gt;
</p>
<p>
  &lt;script src=&#8221;https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert-dev.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
      @if (Session::has(&#8216;tips&#8217;))
</p>
<p>
      swal(&#8220;{{ Session::get(&#8216;tips&#8217;) }}！&#8221;, &#8220;操作提示！&#8221;,&#8221;{{ Session::get(&#8216;state&#8217;) }}&#8221;)
</p>
<p>
      @endif
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h3>resources\views\layouts\form.blade.php</h3>
<p>
  &lt;form  action=&#8221;{{ url(&#8216;student/add&#8217;) }}&#8221; class=&#8221;form-horizontal&#8221; method=&#8221;post&#8221;&gt;
</p>
<p>
      {{ csrf_field() }}
</p>
<p>
      &lt;div class=&#8221;form-group&#8221;&gt;
</p>
<p>
          &lt;label for=&#8221;name&#8221; class=&#8221;col-sm-2 control-label&#8221;&gt;姓名&lt;/label&gt;
</p>
<p>
          &lt;div class=&#8221;col-sm-5&#8243;&gt;
</p>
<p>
              &lt;input type=&#8221;text&#8221; name=&#8221;uname&#8221; class=&#8221;form-control&#8221; id=&#8221;name&#8221; placeholder=&#8221;请输入学生姓名&#8221;&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
          &lt;div class=&#8221;col-sm-5&#8243;&gt;
</p>
<p>
              &lt;p class=&#8221;form-control-static text-danger&#8221;&gt;姓名不能为空&lt;/p&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
      &lt;div class=&#8221;form-group&#8221;&gt;
</p>
<p>
          &lt;label for=&#8221;age&#8221; class=&#8221;col-sm-2 control-label&#8221;&gt;密码&lt;/label&gt;
</p>
<p>
          &lt;div class=&#8221;col-sm-5&#8243;&gt;
</p>
<p>
              &lt;input type=&#8221;text&#8221; name=&#8221;pwd&#8221; class=&#8221;form-control&#8221; id=&#8221;age&#8221; placeholder=&#8221;请输入学生年龄&#8221;&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
          &lt;div class=&#8221;col-sm-5&#8243;&gt;
</p>
<p>
              &lt;p class=&#8221;form-control-static text-danger&#8221;&gt;密码不能为空&lt;/p&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
      &lt;div class=&#8221;form-group&#8221;&gt;
</p>
<p>
          &lt;label for=&#8221;age&#8221; class=&#8221;col-sm-2 control-label&#8221;&gt;年龄&lt;/label&gt;
</p>
<p>
          &lt;div class=&#8221;col-sm-5&#8243;&gt;
</p>
<p>
              &lt;input type=&#8221;text&#8221; name=&#8221;age&#8221; class=&#8221;form-control&#8221; id=&#8221;age&#8221; placeholder=&#8221;请输入学生年龄&#8221;&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
          &lt;div class=&#8221;col-sm-5&#8243;&gt;
</p>
<p>
              &lt;p class=&#8221;form-control-static text-danger&#8221;&gt;年龄只能为整数&lt;/p&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
      &lt;div class=&#8221;form-group&#8221;&gt;
</p>
<p>
          &lt;label class=&#8221;col-sm-2 control-label&#8221;&gt;性别&lt;/label&gt;
</p>
<p>
          &lt;div class=&#8221;col-sm-5&#8243;&gt;
</p>
<p>
              &lt;label class=&#8221;radio-inline&#8221;&gt;
</p>
<p>
                  &lt;input type=&#8221;radio&#8221; name=&#8221;sex&#8221; value=&#8221;1&#8243;&gt; 男
</p>
<p>
              &lt;/label&gt;
</p>
<p>
              &lt;label class=&#8221;radio-inline&#8221;&gt;
</p>
<p>
                  &lt;input type=&#8221;radio&#8221; name=&#8221;sex&#8221; value=&#8221;2&#8243;&gt; 女
</p>
<p>
              &lt;/label&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
          &lt;div class=&#8221;col-sm-5&#8243;&gt;
</p>
<p>
              &lt;p class=&#8221;form-control-static text-danger&#8221;&gt;请选择性别&lt;/p&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
      &lt;div class=&#8221;form-group&#8221;&gt;
</p>
<p>
          &lt;div class=&#8221;col-sm-offset-2 col-sm-10&#8243;&gt;
</p>
<p>
              &lt;button type=&#8221;submit&#8221; class=&#8221;btn btn-primary&#8221;&gt;提交&lt;/button&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
  &lt;/form&gt;
</p>
<h3>resources\views\student\add.blade.php</h3>
<p>
  @extends(&#8216;student.layout.common&#8217;)
</p>
<p>
  @section(&#8216;title&#8217;, &#8216;添加&#8217;)
</p>
<p>
  @section(&#8216;css&#8217;)
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; href=&#8221;{{ asset(&#8216;asset/static&#8217;) }}/bootstrap/css/form.css&#8221;&gt;
</p>
<p>
  @endsection
</p>
<p><strong>@section(&#8216;main&#8217;)</strong>
</p>
<p>
      &lt;div class=&#8221;row&#8221;&gt;
</p>
<p>
          &lt;!&#8211; 左侧菜单区域   &#8211;&gt;
</p>
<p>
          &lt;div class=&#8221;col-md-3&#8243;&gt;
</p>
<p>
              &lt;div class=&#8221;list-group&#8221;&gt;
</p>
<p>
                  &lt;a href=&#8221;./index.html&#8221; class=&#8221;list-group-item &#8220;&gt;学生列表&lt;/a&gt;
</p>
<p>
                  &lt;a href=&#8221;./form.html&#8221; class=&#8221;list-group-item active&#8221;&gt;新增学生&lt;/a&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
          &lt;!&#8211; 右侧内容区域 &#8211;&gt;
</p>
<p>
          &lt;div class=&#8221;col-md-9&#8243;&gt;
</p>
<p>
              &lt;!&#8211; 所有的错误提示 &#8211;&gt;
</p>
<p>
              &lt;div class=&#8221;alert alert-danger&#8221;&gt;
</p>
<p>
                  &lt;ul&gt;
</p>
<p>
                      &lt;li&gt;姓名不能为空&lt;/li&gt;
</p>
<p>
                      &lt;li&gt;年龄只能为整数&lt;/li&gt;
</p>
<p>
                      &lt;li&gt;请选择性别&lt;/li&gt;
</p>
<p>
                  &lt;/ul&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;!&#8211; 自定义内容区域 &#8211;&gt;
</p>
<p>
              &lt;div class=&#8221;panel panel-default&#8221;&gt;
</p>
<p>
                  &lt;div class=&#8221;panel-heading&#8221;&gt;新增学生&lt;/div&gt;
</p>
<p>
                  &lt;div class=&#8221;panel-body&#8221;&gt;
</p>
<p>
                      @include(&#8216;student.layout.form&#8217;)
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p><strong>@endsection</strong>
</p>
<h3>resources\views\student\index.blade.php</h3>
<p>
  @extends(&#8216;student.layout.common&#8217;)
</p>
<p>
  @section(&#8216;title&#8217;, &#8216;首页&#8217;)
</p>
<p>
  @section(&#8216;css&#8217;)
</p>
<p>
      &lt;link rel=&#8221;stylesheet&#8221; href=&#8221;{{ asset(&#8216;asset/static&#8217;) }}/bootstrap/css/index.css&#8221;&gt;
</p>
<p>
  @endsection
</p>
<p>
  @section(&#8216;main&#8217;)
</p>
<p>
      &lt;div class=&#8221;row&#8221;&gt;
</p>
<p>
          &lt;!&#8211; 左侧菜单区域   &#8211;&gt;
</p>
<p>
          &lt;div class=&#8221;col-md-3&#8243;&gt;
</p>
<p>
              &lt;div class=&#8221;list-group&#8221;&gt;
</p>
<p>
                  &lt;a href=&#8221;index.blade.php&#8221; class=&#8221;list-group-item active&#8221;&gt;学生列表&lt;/a&gt;
</p>
<p>
                  &lt;a href=&#8221;./form.html&#8221; class=&#8221;list-group-item&#8221;&gt;新增学生&lt;/a&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
          &lt;!&#8211; 右侧内容区域 &#8211;&gt;
</p>
<p>
          &lt;div class=&#8221;col-md-9&#8243;&gt;
</p>
<p>
              &lt;!&#8211; 成功提示框 &#8211;&gt;
</p>
<p>
              &lt;div class=&#8221;alert alert-success alert-dismissible&#8221; role=&#8221;alert&#8221;&gt;
</p>
<p>
                  &lt;button type=&#8221;button&#8221; class=&#8221;close&#8221; data-dismiss=&#8221;alert&#8221; aria-label=&#8221;Close&#8221;&gt;
</p>
<p>
                      &lt;span aria-hidden=&#8221;true&#8221;&gt;&amp;times;&lt;/span&gt;
</p>
<p>
                  &lt;/button&gt;
</p>
<p>
                  &lt;strong&gt;成功!&lt;/strong&gt; 操作成功提示！
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;!&#8211; 失败提示框 &#8211;&gt;
</p>
<p>
              &lt;div class=&#8221;alert alert-danger alert-dismissible&#8221; role=&#8221;alert&#8221;&gt;
</p>
<p>
                  &lt;button type=&#8221;button&#8221; class=&#8221;close&#8221; data-dismiss=&#8221;alert&#8221; aria-label=&#8221;Close&#8221;&gt;
</p>
<p>
                      &lt;span aria-hidden=&#8221;true&#8221;&gt;&amp;times;&lt;/span&gt;
</p>
<p>
                  &lt;/button&gt;
</p>
<p>
                  &lt;strong&gt;失败!&lt;/strong&gt; 操作失败提示！
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;!&#8211; 自定义内容区域 &#8211;&gt;
</p>
<p>
              &lt;div class=&#8221;panel panel-default&#8221;&gt;
</p>
<p>
                  &lt;div class=&#8221;panel-heading&#8221;&gt;学生列表&lt;/div&gt;
</p>
<p>
                  &lt;table class=&#8221;table table-striped table-hover table-responsive&#8221;&gt;
</p>
<p>
                      &lt;thead&gt;
</p>
<p>
                      &lt;tr&gt;
</p>
<p>
                          &lt;th&gt;ID&lt;/th&gt;
</p>
<p>
                          &lt;th&gt;姓名&lt;/th&gt;
</p>
<p>
                          &lt;th&gt;年龄&lt;/th&gt;
</p>
<p>
                          &lt;th&gt;性别&lt;/th&gt;
</p>
<p>
                          &lt;th&gt;添加时间&lt;/th&gt;
</p>
<p>
                          &lt;th width=&#8221;120&#8243;&gt;操作&lt;/th&gt;
</p>
<p>
                      &lt;/tr&gt;
</p>
<p>
                      &lt;/thead&gt;
</p>
<p>
                      &lt;tbody&gt;
</p>
<p>
                      @foreach ($student as $item)
</p>
<p>
                          &lt;tr&gt;
</p>
<p>
                              &lt;th scope=&#8221;row&#8221;&gt;{{ $item-&gt;id }}&lt;/th&gt;
</p>
<p>
                              &lt;td&gt;{{ $item-&gt;uname }}&lt;/td&gt;
</p>
<p>
                              &lt;td&gt;{{ $item-&gt;age }}&lt;/td&gt;
</p>
<p>
                              &lt;td&gt;
</p>
<p>
                                  @if ($item-&gt;sex === 1)
</p>
<p>
                                      公
</p>
<p>
                                  @else
</p>
<p>
                                      母
</p>
<p>
                                  @endif
</p>
<p>
                              &lt;/td&gt;
</p>
<p>
                              &lt;td&gt;{{ $item-&gt;created_at }}&lt;/td&gt;
</p>
<p>
                              &lt;td&gt;
</p>
<p>
                                  &lt;a href=&#8221;&#8221;&gt;详情&lt;/a&gt;
</p>
<p>
                                  &lt;a href=&#8221;&#8221;&gt;修改&lt;/a&gt;
</p>
<p>
                                  &lt;a href=&#8221;&#8221;&gt;删除&lt;/a&gt;
</p>
<p>
                              &lt;/td&gt;
</p>
<p>
                          &lt;/tr&gt;
</p>
<p>
                      @endforeach
</p>
<p>
                      &lt;/tbody&gt;
</p>
<p>
                  &lt;/table&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;!&#8211; 分页  &#8211;&gt;
</p>
<p>
              &lt;div style=&#8221;text-align: right;&#8221;&gt;
</p>
<p>
                  {{ $student-&gt;links() }}
</p>
<p>
                  {{&#8211;&lt;ul class=&#8221;pagination pull-right&#8221;&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;li&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;a href=&#8221;#&#8221; aria-label=&#8221;Previous&#8221;&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;span aria-hidden=&#8221;true&#8221;&gt;&amp;laquo;&lt;/span&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;/a&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;/li&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;li class=&#8221;active&#8221;&gt;&lt;a href=&#8221;#&#8221;&gt;1&lt;/a&gt;&lt;/li&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;2&lt;/a&gt;&lt;/li&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;3&lt;/a&gt;&lt;/li&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;4&lt;/a&gt;&lt;/li&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;li&gt;&lt;a href=&#8221;#&#8221;&gt;5&lt;/a&gt;&lt;/li&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;li&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;a href=&#8221;#&#8221; aria-label=&#8221;Next&#8221;&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;span aria-hidden=&#8221;true&#8221;&gt;&amp;raquo;&lt;/span&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;/a&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;/li&gt;&#8211;}}
</p>
<p>
                  {{&#8211;&lt;/ul&gt;&#8211;}}
</p>
<p>
              &lt;/div&gt;
</p>
<p>
          &lt;/div&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
  @endsection
</p>
<h1>二、会话技术</h1>
<h2>1、session会话</h2>
<h3>1）语法</h3>
<ul>
<li><strong>位置：</strong>config\session.php存储了session的相关配置说明（注：非php.ini）
  </li>
</ul>
<p>
  脚下留心
</p>
<p><img decoding="async" width="995" height="368" src="/wp-content/uploads/2018/05/word-image-5531.png" class="wp-image-6081" srcset="/wp-content/uploads/2018/05/word-image-5531.png 995w, /wp-content/uploads/2018/05/word-image-5531-300x111.png 300w, /wp-content/uploads/2018/05/word-image-5531-768x284.png 768w" sizes="(max-width: 995px) 100vw, 995px" /></p>
<ul>
<li><strong>说明：Laravel中支持三种方式操作session</strong>
  </li>
<li>
    Http Request类的session方法
  </li>
</ul>
<p>
  设置：    $request-&gt;session()-&gt;put（键，值）
</p>
<p>
  获取指定：$request-&gt;session()-&gt;get（键 [，默认值]）
</p>
<p>
  获取所有：$request-&gt;session()-&gt;all（）
</p>
<p>
  判断：    $request-&gt;session()-&gt;has(键);
</p>
<ul>
<li>
    session辅助函数
  </li>
</ul>
<p>
  设置：session（[键1=&gt;值1,&#8230;,键n=&gt;值n]）
</p>
<p>
  获取：session（键）
</p>
<ul>
<li>
    Session facade门面 （通过Session类调用静态方法）
  </li>
</ul>
<p>
  设置：			   Session::put（键，值）;
</p>
<p>
  获取指定：		   Session::get（键 [，默认值]）
</p>
<p>
  获取所有：		   Session::all（）
</p>
<p>
  删除指定：	 	   Session::forget(key)
</p>
<p>
  判断：		  	   Session::has(key)
</p>
<p>
  删除所有：  	   Session::flush()
</p>
<p>
  压入session数组：Session::push(key, value)
</p>
<p>
  获取后删除：	   Session::pull(key)
</p>
<p>
  闪存：			   Session::flash(key, value)
</p>
<h3>2）练习</h3>
<p>
  设置
</p>
<p>
  获取全部
</p>
<p>
  压入
</p>
<p>
  获取指定
</p>
<p>
  获取全部
</p>
<p>
  闪存
</p>
<p>
  查看
</p>
<p><img decoding="async" width="686" height="578" src="/wp-content/uploads/2018/05/word-image-5532.png" class="wp-image-6082" srcset="/wp-content/uploads/2018/05/word-image-5532.png 686w, /wp-content/uploads/2018/05/word-image-5532-300x253.png 300w" sizes="(max-width: 686px) 100vw, 686px" /></p>
<h2>2、cookie会话</h2>
<h3>1）语法</h3>
<ul>
<li>
    设置：Cookie::make（键，值）
  </li>
<li>
    设置：Cookie::forever（键，键）							   #理论上的永久设置
  </li>
<li>
    获取：Cookie::get（键）
  </li>
</ul>
<p>
  Laravel中必须通过withCookie使响应头中携带cookie信息
</p>
<h3>2）练习</h3>
<p>
  设置cookie
</p>
<p><img loading="lazy" decoding="async" width="1189" height="433" src="/wp-content/uploads/2018/05/word-image-5533.png" class="wp-image-6083" srcset="/wp-content/uploads/2018/05/word-image-5533.png 1189w, /wp-content/uploads/2018/05/word-image-5533-300x109.png 300w, /wp-content/uploads/2018/05/word-image-5533-768x280.png 768w, /wp-content/uploads/2018/05/word-image-5533-1024x373.png 1024w" sizes="(max-width: 1189px) 100vw, 1189px" /></p>
<p>
  控制器
</p>
<p><img loading="lazy" decoding="async" width="1227" height="661" src="/wp-content/uploads/2018/05/word-image-5534.png" class="wp-image-6084" srcset="/wp-content/uploads/2018/05/word-image-5534.png 1227w, /wp-content/uploads/2018/05/word-image-5534-300x162.png 300w, /wp-content/uploads/2018/05/word-image-5534-768x414.png 768w, /wp-content/uploads/2018/05/word-image-5534-1024x552.png 1024w" sizes="(max-width: 1227px) 100vw, 1227px" /></p>
<h1>三、中间件（middleware）</h1>
<h2>概念</h2>
<ul>
<li>
      中间件：就是将HTTP请求交给控制器方法处理前的过滤层
  </li>
<li>
    简单理解：
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1033" height="467" src="/wp-content/uploads/2018/05/word-image-5535.png" class="wp-image-6085" srcset="/wp-content/uploads/2018/05/word-image-5535.png 1033w, /wp-content/uploads/2018/05/word-image-5535-300x136.png 300w, /wp-content/uploads/2018/05/word-image-5535-768x347.png 768w, /wp-content/uploads/2018/05/word-image-5535-1024x463.png 1024w" sizes="(max-width: 1033px) 100vw, 1033px" /></p>
<h2>语法</h2>
<ul>
<li>
    语法：php artisan make:middleware 中间件名称
  </li>
<li>
    位置：Http\Middleware\中间件名称
  </li>
<li>
    使用步骤
  </li>
<li>
    步骤1：创建中间件，并书写过滤代码
  </li>
<li>
    步骤2：注册激活中间件（app\Http\Kernel.php）
  </li>
<li>
    步骤3：路由声明使用哪个中间件过滤
  </li>
</ul>
<p>
  Route::HTTP请求类型(路径，闭包函数或控制器方法)-&gt;middleware（中间件名称）
</p>
<p>
  Route::group([&#8216;namespace&#8217;=&gt;, &#8216;prefix&#8217;=&gt;&#8221;, &#8216;middleware&#8217;=&gt;中间件名称], function(){
</p>
<p>
  })
</p>
<h2>练习（需求：访问 /test时闭包函数输出111，中间件输出222）</h2>
<p>
  步骤1：创建中间件并书写逻辑代码
</p>
<p><img loading="lazy" decoding="async" width="1341" height="573" src="/wp-content/uploads/2018/05/word-image-5536.png" class="wp-image-6086" srcset="/wp-content/uploads/2018/05/word-image-5536.png 1341w, /wp-content/uploads/2018/05/word-image-5536-300x128.png 300w, /wp-content/uploads/2018/05/word-image-5536-768x328.png 768w, /wp-content/uploads/2018/05/word-image-5536-1024x438.png 1024w" sizes="(max-width: 1341px) 100vw, 1341px" /></p>
<p>
  步骤2；激活
</p>
<p><img loading="lazy" decoding="async" width="1212" height="422" src="/wp-content/uploads/2018/05/word-image-5537.png" class="wp-image-6087" srcset="/wp-content/uploads/2018/05/word-image-5537.png 1212w, /wp-content/uploads/2018/05/word-image-5537-300x104.png 300w, /wp-content/uploads/2018/05/word-image-5537-768x267.png 768w, /wp-content/uploads/2018/05/word-image-5537-1024x357.png 1024w" sizes="(max-width: 1212px) 100vw, 1212px" /></p>
<p>
  步骤3：路由使用
</p>
<p><img loading="lazy" decoding="async" width="530" height="214" src="/wp-content/uploads/2018/05/word-image-5538.png" class="wp-image-6088" srcset="/wp-content/uploads/2018/05/word-image-5538.png 530w, /wp-content/uploads/2018/05/word-image-5538-300x121.png 300w" sizes="(max-width: 530px) 100vw, 530px" /></p>
<h2>防翻墙</h2>
<p>
  步骤1：保存用户信息到session中
</p>
<p><img loading="lazy" decoding="async" width="978" height="448" src="/wp-content/uploads/2018/05/word-image-5539.png" class="wp-image-6089" srcset="/wp-content/uploads/2018/05/word-image-5539.png 978w, /wp-content/uploads/2018/05/word-image-5539-300x137.png 300w, /wp-content/uploads/2018/05/word-image-5539-768x352.png 768w" sizes="(max-width: 978px) 100vw, 978px" /></p>
<p>
  步骤2：创建中间件
</p>
<p><img loading="lazy" decoding="async" width="1323" height="579" src="/wp-content/uploads/2018/05/word-image-5540.png" class="wp-image-6090" srcset="/wp-content/uploads/2018/05/word-image-5540.png 1323w, /wp-content/uploads/2018/05/word-image-5540-300x131.png 300w, /wp-content/uploads/2018/05/word-image-5540-768x336.png 768w, /wp-content/uploads/2018/05/word-image-5540-1024x448.png 1024w" sizes="(max-width: 1323px) 100vw, 1323px" /></p>
<p>
  //判断用户是否登录
</p>
<p>
  if (!Session::has(&#8216;userinfo&#8217;)) {
</p>
<p>
      return redirect(&#8216;/student/login&#8217;)-&gt;with([&#8216;state&#8217;=&gt;&#8217;error&#8217;, &#8216;tips&#8217;=&gt;&#8217;犊子，去登录&#8217;]);
</p>
<p>
  }
</p>
<p>
  步骤3：激活中间件
</p>
<p><img loading="lazy" decoding="async" width="1073" height="475" src="/wp-content/uploads/2018/05/word-image-5541.png" class="wp-image-6091" srcset="/wp-content/uploads/2018/05/word-image-5541.png 1073w, /wp-content/uploads/2018/05/word-image-5541-300x133.png 300w, /wp-content/uploads/2018/05/word-image-5541-768x340.png 768w, /wp-content/uploads/2018/05/word-image-5541-1024x453.png 1024w" sizes="(max-width: 1073px) 100vw, 1073px" /></p>
<p>
  步骤4：使用
</p>
<p><img loading="lazy" decoding="async" width="1278" height="592" src="/wp-content/uploads/2018/05/word-image-5542.png" class="wp-image-6092" srcset="/wp-content/uploads/2018/05/word-image-5542.png 1278w, /wp-content/uploads/2018/05/word-image-5542-300x139.png 300w, /wp-content/uploads/2018/05/word-image-5542-768x356.png 768w, /wp-content/uploads/2018/05/word-image-5542-1024x474.png 1024w" sizes="(max-width: 1278px) 100vw, 1278px" /></p>
<p>
  步骤5：修改laravel的session机制
</p>
<p><img loading="lazy" decoding="async" width="1041" height="372" src="/wp-content/uploads/2018/05/word-image-5543.png" class="wp-image-6093" srcset="/wp-content/uploads/2018/05/word-image-5543.png 1041w, /wp-content/uploads/2018/05/word-image-5543-300x107.png 300w, /wp-content/uploads/2018/05/word-image-5543-768x274.png 768w, /wp-content/uploads/2018/05/word-image-5543-1024x366.png 1024w" sizes="(max-width: 1041px) 100vw, 1041px" /></p>
<h1><a id="post-6079-_Toc487990952"></a>四、Laravel控制器数据验证</h1>
<h2>1、概念</h2>
<h3>1）说明</h3>
<p>
  为了保证项目安全除前段必须验证外后端也必须进行数据验证，Laravel提供了一套完善的验证机制。
</p>
<h3>2）分类（Laravel提供了三种方式验证）</h3>
<ul>
<li>
    控制器直接使用validate方法
  </li>
<li>
    单独创建验证类
  </li>
<li>
    使用validator门面验证
  </li>
</ul>
<p>
  验证规则
</p>
<p>
  required: 不能为空
</p>
<p>
  max:255最长255个字符，
</p>
<p>
  min:1最少1个字符
</p>
<p>
  email:验证邮箱是否合法
</p>
<p>
  confirmed:验证两个字段是否相同，如果验证的字段是password,则必须输入一个与之匹配的password_confirmation字段
</p>
<p>
  integer:验证字段必须是整型
</p>
<p>
  ip:验证字段必须是IP地址
</p>
<p>
  numeric 验证字段必须是数值
</p>
<p>
  max:value 验证字段必须小于等于最大值，和字符串，数值，文件字段的size规则一起使用。
</p>
<p>
  min:value 验证字段的最小值，对字符串、数值、文件字段而言，和size规则使用方式一致。
</p>
<p>
  size:value 验证字段必须有和给定值value想匹配的尺寸，对字符串而言，value是相应的字符数目，对数值而言，value是给定整型值；对文件而言，value是相应的文件字节数。
</p>
<p>
  string 验证字段必须是字符串
</p>
<p>
  unique:表名，字段，需要排除的ID
</p>
<p>
  验证规则手册：<a href="http://laravelacademy.org/post/6768.html#toc_17">http://laravelacademy.org/post/6768.html#toc_17</a>
</p>
<p>
  多学一招：多个验证规则可以通过 &#8220;|&#8221; 字符进行隔开
</p>
<h2>方法1：控制器使用validate方法</h2>
<h3>语法</h3>
<ul>
<li>
    $this-&gt;validate（$request，验证规则 [，提示信息]）
  </li>
</ul>
<h3>练习</h3>
<p>
  控制器
</p>
<p><img loading="lazy" decoding="async" width="985" height="555" src="/wp-content/uploads/2018/05/word-image-5544.png" class="wp-image-6094" srcset="/wp-content/uploads/2018/05/word-image-5544.png 985w, /wp-content/uploads/2018/05/word-image-5544-300x169.png 300w, /wp-content/uploads/2018/05/word-image-5544-768x433.png 768w" sizes="(max-width: 985px) 100vw, 985px" /></p>
<p>
  //数据验证
</p>
<p>
  $this-&gt;validate($request, [
</p>
<p>
      &#8216;uname&#8217; =&gt; &#8216;required&#8217;,
</p>
<p>
      &#8216;pwd&#8217; =&gt; &#8216;required&#8217;,
</p>
<p>
      &#8216;age&#8217; =&gt; &#8216;required|integer&#8217;,
</p>
<p>
      &#8216;sex&#8217; =&gt; &#8216;required|integer&#8217;,
</p>
<p>
  ], [
</p>
<p>
      &#8216;age.integer&#8217; =&gt; &#8216;年龄必须是整型&#8217;,
</p>
<p>
      &#8216;age.required&#8217; =&gt; &#8216;年龄必须&#8217;,
</p>
<p>
  ]);
</p>
<p>
  视图
</p>
<p><img loading="lazy" decoding="async" width="989" height="434" src="/wp-content/uploads/2018/05/word-image-5545.png" class="wp-image-6095" srcset="/wp-content/uploads/2018/05/word-image-5545.png 989w, /wp-content/uploads/2018/05/word-image-5545-300x132.png 300w, /wp-content/uploads/2018/05/word-image-5545-768x337.png 768w" sizes="(max-width: 989px) 100vw, 989px" /></p>
<p>
  @if (count($errors) &gt; 0)
</p>
<p>
      &lt;div class=&#8221;alert alert-danger&#8221;&gt;
</p>
<p>
          &lt;ul&gt;
</p>
<p>
              @foreach ($errors-&gt;all() as $error)
</p>
<p>
                  &lt;li&gt;{{ $error }}&lt;/li&gt;
</p>
<p>
              @endforeach
</p>
<p>
          &lt;/ul&gt;
</p>
<p>
      &lt;/div&gt;
</p>
<p>
  @endif
</p>
<p>
  多学一招：验证提示信息汉化
</p>
<ol>
<li>
  下载：https://github.com/caouecs/Laravel-lang
</li>
<li>
  将下载的汉化包放到项目中
</li>
</ol>
<p><img loading="lazy" decoding="async" width="782" height="395" src="/wp-content/uploads/2018/05/word-image-5546.png" class="wp-image-6096" srcset="/wp-content/uploads/2018/05/word-image-5546.png 782w, /wp-content/uploads/2018/05/word-image-5546-300x152.png 300w, /wp-content/uploads/2018/05/word-image-5546-768x388.png 768w" sizes="(max-width: 782px) 100vw, 782px" /></p>
<ol>
<li>
  修改config\app.php
</li>
</ol>
<p><img loading="lazy" decoding="async" width="789" height="210" src="/wp-content/uploads/2018/05/word-image-5547.png" class="wp-image-6097" srcset="/wp-content/uploads/2018/05/word-image-5547.png 789w, /wp-content/uploads/2018/05/word-image-5547-300x80.png 300w, /wp-content/uploads/2018/05/word-image-5547-768x204.png 768w" sizes="(max-width: 789px) 100vw, 789px" /></p>
<p>
  4）重新提交测试即可
</p>
<h2>方法2：单独创建验证类</h2>
<h3>语法</h3>
<ul>
<li>
    语法：php artisan make:request 验证类名称
  </li>
<li>
    位置：app\Http\Requests
  </li>
</ul>
<h3>2）练习</h3>
<p>
  步骤1：创建验证类并书写规则
</p>
<p><img loading="lazy" decoding="async" width="1063" height="624" src="/wp-content/uploads/2018/05/word-image-5548.png" class="wp-image-6098" srcset="/wp-content/uploads/2018/05/word-image-5548.png 1063w, /wp-content/uploads/2018/05/word-image-5548-300x176.png 300w, /wp-content/uploads/2018/05/word-image-5548-768x451.png 768w, /wp-content/uploads/2018/05/word-image-5548-1024x601.png 1024w" sizes="(max-width: 1063px) 100vw, 1063px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Requests;
</p>
<p>
  use Illuminate\Foundation\Http\FormRequest;
</p>
<p>
  class CheckStudent extends FormRequest
</p>
<p>
  {
</p>
<p>
      public function authorize()
</p>
<p>
      {
</p>
<p>
          return true; //开启验证
</p>
<p>
      }
</p>
<p>
      public function rules()
</p>
<p>
      {
</p>
<p>
          if ($this-&gt;isMethod(&#8216;get&#8217;)) return [];
</p>
<p>
          return [
</p>
<p>
              &#8216;uname&#8217; =&gt; &#8216;required&#8217;,
</p>
<p>
              &#8216;pwd&#8217; =&gt; &#8216;required&#8217;,
</p>
<p>
              &#8216;age&#8217; =&gt; &#8216;required|integer&#8217;,
</p>
<p>
              &#8216;sex&#8217; =&gt; &#8216;required|integer&#8217;,
</p>
<p>
          ];
</p>
<p>
      }
</p>
<p>
      public function messages()
</p>
<p>
      {
</p>
<p>
          return [
</p>
<p>
              &#8216;uname.required&#8217; =&gt; &#8216;用户名有消磁&#8217;
</p>
<p>
          ];
</p>
<p>
      }
</p>
<p>
  }
</p>
<p>
  步骤2：在控制器中使用
</p>
<p><img loading="lazy" decoding="async" width="1050" height="544" src="/wp-content/uploads/2018/05/word-image-5549.png" class="wp-image-6099" srcset="/wp-content/uploads/2018/05/word-image-5549.png 1050w, /wp-content/uploads/2018/05/word-image-5549-300x155.png 300w, /wp-content/uploads/2018/05/word-image-5549-768x398.png 768w, /wp-content/uploads/2018/05/word-image-5549-1024x531.png 1024w" sizes="(max-width: 1050px) 100vw, 1050px" /></p>
<h2>方法3：使用Validator门面验证器（类）</h2>
<h3>1）语法</h3>
<ul>
<li>
    $validator = Validator::make（待验证的数据，验证规则 [，提示信息]）
  </li>
<li>
    $validator-&gt;passes()   		是否成功：成功-true，失败-false
  </li>
<li>
    $validator-&gt;fails()    		是否失败：失败-true，成功-false
  </li>
<li>
    $validator-&gt;messages()     获取错误信息
  </li>
</ul>
<h3>2）练习</h3>
<p><img loading="lazy" decoding="async" width="1206" height="522" src="/wp-content/uploads/2018/05/word-image-5550.png" class="wp-image-6100" srcset="/wp-content/uploads/2018/05/word-image-5550.png 1206w, /wp-content/uploads/2018/05/word-image-5550-300x130.png 300w, /wp-content/uploads/2018/05/word-image-5550-768x332.png 768w, /wp-content/uploads/2018/05/word-image-5550-1024x443.png 1024w" sizes="(max-width: 1206px) 100vw, 1206px" /></p>
<p>
  $validator = Validator::make($request-&gt;all(), [
</p>
<p>
      &#8216;uname&#8217; =&gt; &#8216;required&#8217;,
</p>
<p>
      &#8216;pwd&#8217; =&gt; &#8216;required&#8217;,
</p>
<p>
      &#8216;age&#8217; =&gt; &#8216;required|integer&#8217;,
</p>
<p>
      &#8216;sex&#8217; =&gt; &#8216;required|integer&#8217;,
</p>
<p>
  ]);
</p>
<p>
  if ($validator-&gt;fails()) {
</p>
<p>
      //如果异步请求则响应json    dd($validator-&gt;messages());
</p>
<p>
      return redirect(&#8216;student/add&#8217;)-&gt;withErrors($validator);
</p>
<p>
  }
</p>
<h2>︴显示单个错误</h2>
<p>
  语法：{{ $errors-&gt;first(键) }}
</p>
<p><img loading="lazy" decoding="async" width="1243" height="592" src="/wp-content/uploads/2018/05/word-image-5551.png" class="wp-image-6101" srcset="/wp-content/uploads/2018/05/word-image-5551.png 1243w, /wp-content/uploads/2018/05/word-image-5551-300x143.png 300w, /wp-content/uploads/2018/05/word-image-5551-768x366.png 768w, /wp-content/uploads/2018/05/word-image-5551-1024x488.png 1024w" sizes="(max-width: 1243px) 100vw, 1243px" /></p>
<h1>多表查询【★★★★★★★★★★★★★★】</h1>
<h2>︴测试数据准备</h2>
<p>
  DROP TABLE IF EXISTS `article`;
</p>
<p>
  CREATE TABLE `article` (
</p>
<p>
    `aid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT &#8216;编号&#8217;,
</p>
<p>
    `title` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT &#8216;用户名&#8217;,
</p>
<p>
    `content` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT &#8216;密码&#8217;,
</p>
<p>
    `uid` int(11) DEFAULT NULL,
</p>
<p>
    PRIMARY KEY (`aid`)
</p>
<p>
  ) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
</p>
<p>
  INSERT INTO `article` VALUES (&#8216;1&#8217;, &#8216;文章1&#8217;, &#8216;内容1&#8217;, &#8216;1&#8217;);
</p>
<p>
  INSERT INTO `article` VALUES (&#8216;2&#8217;, &#8216;文章2&#8217;, &#8216;内容2&#8217;, &#8216;1&#8217;);
</p>
<p>
  INSERT INTO `article` VALUES (&#8216;3&#8217;, &#8216;文章3&#8217;, &#8216;内容3&#8217;, &#8216;2&#8217;);
</p>
<p>
  INSERT INTO `article` VALUES (&#8216;4&#8217;, &#8216;文章4&#8217;, &#8216;内容4&#8217;, &#8216;3&#8217;);
</p>
<p>
  DROP TABLE IF EXISTS `student`;
</p>
<p>
  CREATE TABLE `student` (
</p>
<p>
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT &#8216;编号&#8217;,
</p>
<p>
    `uname` varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT &#8216;用户名&#8217;,
</p>
<p>
    `pwd` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT &#8216;密码&#8217;,
</p>
<p>
    `age` tinyint(3) unsigned NOT NULL DEFAULT &#8216;0&#8217; COMMENT &#8216;年龄&#8217;,
</p>
<p>
    `sex` tinyint(3) unsigned NOT NULL DEFAULT &#8216;1&#8217; COMMENT &#8216;性别：1-男,2-女&#8217;,
</p>
<p>
    `created_at` int(11) NOT NULL DEFAULT &#8216;0&#8217; COMMENT &#8216;创建于&#8217;,
</p>
<p>
    `updated_at` int(11) NOT NULL DEFAULT &#8216;0&#8217; COMMENT &#8216;更新于&#8217;,
</p>
<p>
    PRIMARY KEY (`id`)
</p>
<p>
  ) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
</p>
<p>
  INSERT INTO `student` VALUES
</p>
<p>
  (&#8216;1&#8217;, &#8216;test&#8217;, &#8216;$2y$10$0.wXoff3zfaqM4DSMzlzbOEkDfk5ztnJn32vilBAS/WEWSWLcZcrK&#8217;, &#8217;64&#8217;, &#8216;1&#8217;, &#8216;1515226698&#8217;, &#8216;1515226698&#8217;),
</p>
<p>
  (&#8216;2&#8217;, &#8216;Kariane Shields&#8217;, &#8216;$2y$10$xM5YmEL5D3jpomMvqIH/5eS.W.F0o.9oqfNr/FhlmTInRJFEBc9Wi&#8217;, &#8217;94&#8217;, &#8216;2&#8217;, &#8216;1515226713&#8217;, &#8216;1515226713&#8217;),
</p>
<p>
  (&#8216;3&#8217;, &#8216;Prof. Dino Brakus&#8217;, &#8216;$2y$10$hhSBJh69wyAO9wK.JABiEO02rxOzz2MfjHZVbfbLE5RiI7ZRuw6qa&#8217;, &#8216;107&#8217;, &#8216;1&#8217;, &#8216;1515226713&#8217;, &#8216;1515226713&#8217;),
</p>
<p>
  (&#8216;4&#8217;, &#8216;Miss Vivienne Senger V&#8217;, &#8216;$2y$10$CgsLmcYEmYukWKV4i/qAtOHnnnLvUSlJ/NU46.Tke/OuNRgrRES9W&#8217;, &#8217;15&#8217;, &#8216;1&#8217;, &#8216;1515226713&#8217;, &#8216;1515226713&#8217;);
</p>
<h2>1、概念</h2>
<p>
  一对一关系：一篇文章属于一个用户
</p>
<p>
  一对多关系：一个用户有多篇文章
</p>
<h2>查询构建器</h2>
<h3>1）语法</h3>
<p>
  DB::table（表1）
</p>
<p>
  -&gt;leftJoin（表2， &#8216;表1.公共字段&#8217;, &#8216;=&#8217;, &#8216;表2.公共字段&#8217;）
</p>
<p>
  -&gt;get()
</p>
<h3>2）练习</h3>
<p>
  #一对一关系：一遍文章属于一个用户
</p>
<p><img loading="lazy" decoding="async" width="1330" height="643" src="/wp-content/uploads/2018/05/word-image-5552.png" class="wp-image-6102" srcset="/wp-content/uploads/2018/05/word-image-5552.png 1330w, /wp-content/uploads/2018/05/word-image-5552-300x145.png 300w, /wp-content/uploads/2018/05/word-image-5552-768x371.png 768w, /wp-content/uploads/2018/05/word-image-5552-1024x495.png 1024w" sizes="(max-width: 1330px) 100vw, 1330px" /></p>
<p>
  public function test()
</p>
<p>
  {
</p>
<p>
      #一对一关系：一遍文章属于一个用户
</p>
<p>
      $data = DB::table(&#8216;article&#8217;)
</p>
<p>
      -&gt;leftJoin(&#8216;student&#8217;, &#8216;article.uid&#8217;, &#8216;=&#8217;, &#8216;student.id&#8217;)
</p>
<p>
      -&gt;get();
</p>
<p>
      echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
      print_r($data);
</p>
<p>
      #一对多关系：一个用户拥有多篇文章
</p>
<p>
  }
</p>
<p>
  #一对多关系：一个用户拥有多篇文章
</p>
<p><img loading="lazy" decoding="async" width="1365" height="512" src="/wp-content/uploads/2018/05/word-image-5553.png" class="wp-image-6103" srcset="/wp-content/uploads/2018/05/word-image-5553.png 1365w, /wp-content/uploads/2018/05/word-image-5553-300x113.png 300w, /wp-content/uploads/2018/05/word-image-5553-768x288.png 768w, /wp-content/uploads/2018/05/word-image-5553-1024x384.png 1024w" sizes="(max-width: 1365px) 100vw, 1365px" /></p>
<p>
  #一对多关系：一个用户拥有多篇文章
</p>
<p>
  $data = DB::table(&#8216;student&#8217;)
</p>
<p>
      -&gt;leftJoin(&#8216;article&#8217;, &#8216;article.uid&#8217;, &#8216;=&#8217;, &#8216;student.id&#8217;)
</p>
<p>
      -&gt;get();
</p>
<p>
  echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
  print_r($data);
</p>
<h2>模型</h2>
<h3>1）语法</h3>
<ul>
<li>
    一对一
  </li>
</ul>
<p>
  步骤1：模型定义
</p>
<p>
  public function 推荐写表名()
</p>
<p>
  {
</p>
<p>
  return $this-&gt;hasOne(关联模型，关联模型公共字段, 本模型公共字段);
</p>
<p>
  }
</p>
<p>
  步骤2：控制器调用【模型名::with(&#8216;推荐写表名&#8217;)-&gt;get()】
</p>
<ul>
<li>
    一对多
  </li>
</ul>
<p>
  步骤1：模型定义
</p>
<p>
  public function 推荐写表名s()
</p>
<p>
  {
</p>
<p>
  return  $this-&gt;hasMany(关联模型，关联模型公共字段, 本模型公共字段);
</p>
<p>
  }
</p>
<p>
  步骤2：控制器调用【模型名::with(&#8216;推荐写表名&#8217;)-&gt;get()】
</p>
<h3>2）练习</h3>
<p>
  #一对一关系：一遍文章属于一个用户
</p>
<p>
  步骤1：设置模型
</p>
<p><img loading="lazy" decoding="async" width="1290" height="474" src="/wp-content/uploads/2018/05/word-image-5554.png" class="wp-image-6104" srcset="/wp-content/uploads/2018/05/word-image-5554.png 1290w, /wp-content/uploads/2018/05/word-image-5554-300x110.png 300w, /wp-content/uploads/2018/05/word-image-5554-768x282.png 768w, /wp-content/uploads/2018/05/word-image-5554-1024x376.png 1024w" sizes="(max-width: 1290px) 100vw, 1290px" /></p>
<p>
  步骤2：控制器调用
</p>
<p><img loading="lazy" decoding="async" width="873" height="601" src="/wp-content/uploads/2018/05/word-image-5555.png" class="wp-image-6105" srcset="/wp-content/uploads/2018/05/word-image-5555.png 873w, /wp-content/uploads/2018/05/word-image-5555-300x207.png 300w, /wp-content/uploads/2018/05/word-image-5555-768x529.png 768w, /wp-content/uploads/2018/05/word-image-5555-220x150.png 220w" sizes="(max-width: 873px) 100vw, 873px" /></p>
<p>
  public function test()
</p>
<p>
  {
</p>
<p>
      #潜规则：
</p>
<p>
      #单模型直接查询，  则$v是一个小对象  通过$v-&gt;字段名可以获取数据
</p>
<p>
      #with模型关联查询，则$v是一个小对象
</p>
<p>
      #                  获取本模型数据： 通过$v-&gt;本模型的字段
</p>
<p>
      #                  获取其他模型数据：通过$v-&gt;with的名称-&gt;其他模型的字段
</p>
<p>
      echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
      #一对一关系：一遍文章属于一个用户
</p>
<p>
      $articles = Article::with(&#8216;student&#8217;)-&gt;get();
</p>
<p>
      print_r($articles);
</p>
<p>
      foreach ($articles as $article) {
</p>
<p>
          echo &#8216;学生表ID：&#8217;.$article-&gt;student-&gt;id . &#8216;&lt;br /&gt;&#8217;;
</p>
<p>
          echo &#8216;文章表ID：&#8217;.$article-&gt;aid . &#8216;&lt;br /&gt;&#8217;;
</p>
<p>
          echo &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
      }
</p>
<p>
  }
</p>
<p>
  #一对多关系：一个用户拥有多篇文章
</p>
<p>
  模型
</p>
<p><img loading="lazy" decoding="async" width="1055" height="554" src="/wp-content/uploads/2018/05/word-image-5556.png" class="wp-image-6106" srcset="/wp-content/uploads/2018/05/word-image-5556.png 1055w, /wp-content/uploads/2018/05/word-image-5556-300x158.png 300w, /wp-content/uploads/2018/05/word-image-5556-768x403.png 768w, /wp-content/uploads/2018/05/word-image-5556-1024x538.png 1024w" sizes="(max-width: 1055px) 100vw, 1055px" /></p>
<p>
  控制器
</p>
<p><img loading="lazy" decoding="async" width="1148" height="613" src="/wp-content/uploads/2018/05/word-image-5557.png" class="wp-image-6107" srcset="/wp-content/uploads/2018/05/word-image-5557.png 1148w, /wp-content/uploads/2018/05/word-image-5557-300x160.png 300w, /wp-content/uploads/2018/05/word-image-5557-768x410.png 768w, /wp-content/uploads/2018/05/word-image-5557-1024x547.png 1024w" sizes="(max-width: 1148px) 100vw, 1148px" /></p>
<p>
      public function test()
</p>
<p>
      {
</p>
<p>
          #潜规则：
</p>
<p>
          #单模型直接查询，  则$v是一个小对象  通过$v-&gt;字段名可以获取数据
</p>
<p>
          #with模型关联查询，则$v是一个小对象（1：N）
</p>
<p>
          #                  获取本模型数据： 通过$v-&gt;本模型的字段
</p>
<p>
          #                  获取其他模型数据：通过$v-&gt;with的名称  （数组，需要foreach   第二次foreach的$v是关联模型的一个个小对象）
</p>
<p>
          echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
          #一对多关系：一个用户拥有多篇文章
</p>
<p>
          $students = Student::with(&#8216;articles&#8217;)-&gt;get();
</p>
<p>
          foreach ($students as $student) {
</p>
<p>
              echo $student-&gt;id . &#8216;&lt;br /&gt;&#8217;;
</p>
<p>
              //显示学生信息（脚下留心：relations是数组，没有关联数据则空数组）
</p>
<p>
              foreach ($student-&gt;articles as $student) {
</p>
<p>
                  echo  $student-&gt;aid. &#8220;&lt;br /&gt;&#8221;;
</p>
<p>
              }
</p>
<p>
              echo &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
          }
</p>
<p>
      }
</p>
<h1>路由2</h1>
<h2>理解RESTful</h2>
<ul>
<li>
    说    明：RESTful是目前最流行的一种互联网软件架构（思想）
  </li>
<li>
    架构规则：
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="746" height="380" src="/wp-content/uploads/2018/05/word-image-5558.png" class="wp-image-6108" srcset="/wp-content/uploads/2018/05/word-image-5558.png 746w, /wp-content/uploads/2018/05/word-image-5558-300x153.png 300w" sizes="(max-width: 746px) 100vw, 746px" /><br />
<img loading="lazy" decoding="async" width="727" height="373" src="/wp-content/uploads/2018/05/word-image-5559.png" class="wp-image-6109" srcset="/wp-content/uploads/2018/05/word-image-5559.png 727w, /wp-content/uploads/2018/05/word-image-5559-300x154.png 300w" sizes="(max-width: 727px) 100vw, 727px" /><br />
<img loading="lazy" decoding="async" width="782" height="502" src="/wp-content/uploads/2018/05/word-image-5560.png" class="wp-image-6110" srcset="/wp-content/uploads/2018/05/word-image-5560.png 782w, /wp-content/uploads/2018/05/word-image-5560-300x193.png 300w, /wp-content/uploads/2018/05/word-image-5560-768x493.png 768w" sizes="(max-width: 782px) 100vw, 782px" /></p>
<h2>Laravel资源控制器语法（RESTful）</h2>
<ul>
<li>
    创建资源控制器：php artisan make:controller Home\Day3Controler  &#8211;resource
  </li>
<li>
    创建资源控制器路由：Route::resource(URL信息，控制器);
  </li>
</ul>
<p>
  资源控制器指会自定帮我们按照restful规则创建好方法
</p>
<h2>︴练习</h2>
<h3>创建资源控制器</h3>
<p><img loading="lazy" decoding="async" width="1268" height="538" src="/wp-content/uploads/2018/05/word-image-5561.png" class="wp-image-6111" srcset="/wp-content/uploads/2018/05/word-image-5561.png 1268w, /wp-content/uploads/2018/05/word-image-5561-300x127.png 300w, /wp-content/uploads/2018/05/word-image-5561-768x326.png 768w, /wp-content/uploads/2018/05/word-image-5561-1024x434.png 1024w" sizes="(max-width: 1268px) 100vw, 1268px" /></p>
<h3>2）创建资源控制器路由</h3>
<p><img loading="lazy" decoding="async" width="1022" height="537" src="/wp-content/uploads/2018/05/word-image-5562.png" class="wp-image-6112" srcset="/wp-content/uploads/2018/05/word-image-5562.png 1022w, /wp-content/uploads/2018/05/word-image-5562-300x158.png 300w, /wp-content/uploads/2018/05/word-image-5562-768x404.png 768w" sizes="(max-width: 1022px) 100vw, 1022px" /></p>
<h3>3）访问</h3>
<p><img loading="lazy" decoding="async" width="1022" height="537" src="/wp-content/uploads/2018/05/word-image-5563.png" class="wp-image-6113" srcset="/wp-content/uploads/2018/05/word-image-5563.png 1022w, /wp-content/uploads/2018/05/word-image-5563-300x158.png 300w, /wp-content/uploads/2018/05/word-image-5563-768x404.png 768w" sizes="(max-width: 1022px) 100vw, 1022px" /></p>
<h2>扩展</h2>
<p><a href="https://www.cnblogs.com/CraryPrimitiveMan/p/6242167.html?utm_source=itdadao&amp;utm_medium=referral">https://www.cnblogs.com/CraryPrimitiveMan/p/6242167.html?utm_source=itdadao&amp;utm_medium=referral</a>
</p>
<h1>︴其他扩展</h1>
<h2>1、PHP use 使用场景（or  or and 数据库操作）</h2>
<p><img loading="lazy" decoding="async" width="930" height="375" src="/wp-content/uploads/2018/05/word-image-5564.png" class="wp-image-6114" srcset="/wp-content/uploads/2018/05/word-image-5564.png 930w, /wp-content/uploads/2018/05/word-image-5564-300x121.png 300w, /wp-content/uploads/2018/05/word-image-5564-768x310.png 768w" sizes="(max-width: 930px) 100vw, 930px" /><br />
<img loading="lazy" decoding="async" width="681" height="285" src="/wp-content/uploads/2018/05/word-image-5565.png" class="wp-image-6115" srcset="/wp-content/uploads/2018/05/word-image-5565.png 681w, /wp-content/uploads/2018/05/word-image-5565-300x126.png 300w" sizes="(max-width: 681px) 100vw, 681px" /></p>
<h2>2、钻石设计软件</h2>
<p><img loading="lazy" decoding="async" width="767" height="457" src="/wp-content/uploads/2018/05/word-image-5566.png" class="wp-image-6116" srcset="/wp-content/uploads/2018/05/word-image-5566.png 767w, /wp-content/uploads/2018/05/word-image-5566-300x179.png 300w" sizes="(max-width: 767px) 100vw, 767px" /><br />
<img loading="lazy" decoding="async" width="273" height="54" src="/wp-content/uploads/2018/05/word-image-5567.png" class="wp-image-6117" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6079.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Laravel在线教育平台（一）开发背景、涉及技术点、开发周期、项目初始化、后台登录功能、路由、防翻墙、注册激活</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6025.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6025.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 15:59:47 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Laravel在线教育平台]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[后台登录功能]]></category>
		<category><![CDATA[开发周期]]></category>
		<category><![CDATA[开发背景]]></category>
		<category><![CDATA[注册激活]]></category>
		<category><![CDATA[涉及技术点]]></category>
		<category><![CDATA[路由]]></category>
		<category><![CDATA[防翻墙]]></category>
		<category><![CDATA[项目初始化]]></category>
		<guid isPermaLink="false">/?p=6025</guid>

					<description><![CDATA[Laravel框架实战-在线教育平台（1） 一、项目说明 1、开发背景 现在社会流行视频直播，应用场景：在线教 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1><a id="post-6025-_Toc487731707"></a>Laravel框架实战-在线教育平台（1）</h1>
<h1><a id="post-6025-_Toc487731708"></a>一、项目说明</h1>
<h2><a id="post-6025-_Toc487731709"></a>1、开发背景</h2>
<p>
  现在社会流行视频直播，应用场景：在线教育、主播大秀、游戏直播等
</p>
<p>
  现在社会非常重视教育，各种教育机构层出不穷，教育形式多种多样，大班授课，中班
</p>
<p>
  授课，小班授课，1对1授课，但是有的学员由于地域、时间、条件、经济的限制并适合面授形式接受教育，故出现在线教育形式，即在网上就可以完成学习的过程，是一种非常灵活的学习方式。我们开发的线上教育系统，集成视频授课、试卷作答、直播课程、等功能。
</p>
<p>
  在线教育涉略的领域也非常广泛，基本上所有的教育内容都可以搬到网上进行。
</p>
<h2><a id="post-6025-_Toc487731713"></a>2、涉及到的技术点</h2>
<p>
  Datatables（无刷新分页插件）、webuploader（无刷新上传插件）、
</p>
<p>
  zyupload（多文件无刷新上传）、播放器插件、七牛接口、支付宝支付等等。
</p>
<h2><a id="post-6025-_Toc487731710"></a>3、项目开发周期规划</h2>
<ul>
<li>
    开发周期：6天（2天前台+4天后台）
  </li>
<li>
    开发框架：Laravel框架
  </li>
<li>
    开发功能：
  </li>
<li>
    后台4天：
  </li>
<li>
    后台登录功能、RBAC、专业管理、课程管理、课时管理、会员管理、试卷管理
  </li>
<li>
    前台2天：
  </li>
<li>
    登录、首页显示课程、课程详情页面、视频点播页面、视频直播页面、答题功能
  </li>
</ul>
<h1><a id="post-6025-_Toc487731715"></a>二、项目初始化</h1>
<h2><a id="post-6025-_Toc487731716"></a>1、创建项目</h2>
<p>
  步骤1：切换国内镜像
</p>
<p>
  composer config -g repo.packagist composer https://packagist.phpcomposer.com/
</p>
<p>
  步骤2：通过composer创建项目
</p>
<p>
  composer create-project laravel/laravel=5.4.* edu
</p>
<p><img loading="lazy" decoding="async" width="908" height="473" src="/wp-content/uploads/2018/05/word-image-5478.png" class="wp-image-6026" srcset="/wp-content/uploads/2018/05/word-image-5478.png 908w, /wp-content/uploads/2018/05/word-image-5478-300x156.png 300w, /wp-content/uploads/2018/05/word-image-5478-768x400.png 768w" sizes="(max-width: 908px) 100vw, 908px" /><br />
<img loading="lazy" decoding="async" width="1096" height="467" src="/wp-content/uploads/2018/05/word-image-5479.png" class="wp-image-6027" srcset="/wp-content/uploads/2018/05/word-image-5479.png 1096w, /wp-content/uploads/2018/05/word-image-5479-300x128.png 300w, /wp-content/uploads/2018/05/word-image-5479-768x327.png 768w, /wp-content/uploads/2018/05/word-image-5479-1024x436.png 1024w" sizes="(max-width: 1096px) 100vw, 1096px" /></p>
<h2><a id="post-6025-_Toc487731717"></a>开发前的准备工作</h2>
<h3><a id="post-6025-_Toc491186203"></a><a id="post-6025-_Toc493776230"></a><a id="post-6025-_Toc498268261"></a><a id="post-6025-_Toc499911971"></a>1）建立数据库开发前的准备工作</h3>
<p>
  步骤1：创建edu数据库
</p>
<p><img loading="lazy" decoding="async" width="600" height="288" src="/wp-content/uploads/2018/05/word-image-5480.png" class="wp-image-6028" srcset="/wp-content/uploads/2018/05/word-image-5480.png 600w, /wp-content/uploads/2018/05/word-image-5480-300x144.png 300w" sizes="(max-width: 600px) 100vw, 600px" /></p>
<p>
  步骤2：修改.env配置文件
</p>
<p><img loading="lazy" decoding="async" width="787" height="455" src="/wp-content/uploads/2018/05/word-image-5481.png" class="wp-image-6029" srcset="/wp-content/uploads/2018/05/word-image-5481.png 787w, /wp-content/uploads/2018/05/word-image-5481-300x173.png 300w, /wp-content/uploads/2018/05/word-image-5481-768x444.png 768w" sizes="(max-width: 787px) 100vw, 787px" /></p>
<p>
  多学一招：utf8升级版本utf8mb4一个字符支持4个字节
</p>
<p><img loading="lazy" decoding="async" width="222" height="196" src="/wp-content/uploads/2018/05/word-image-5482.png" class="wp-image-6030" /></p>
<h3>2）设置语言包</h3>
<p>
  步骤1：下载（<a href="https://github.com/caouecs/Laravel-lang">https://github.com/caouecs/Laravel-lang</a>）
</p>
<p>
  步骤2：将zh-CH移动到resources\lang目录中
</p>
<p><img loading="lazy" decoding="async" width="763" height="424" src="/wp-content/uploads/2018/05/word-image-5483.png" class="wp-image-6031" srcset="/wp-content/uploads/2018/05/word-image-5483.png 763w, /wp-content/uploads/2018/05/word-image-5483-300x167.png 300w" sizes="(max-width: 763px) 100vw, 763px" /></p>
<p>
  步骤3：修改配置config\app.php
</p>
<p><img loading="lazy" decoding="async" width="773" height="566" src="/wp-content/uploads/2018/05/word-image-5484.png" class="wp-image-6032" srcset="/wp-content/uploads/2018/05/word-image-5484.png 773w, /wp-content/uploads/2018/05/word-image-5484-300x220.png 300w, /wp-content/uploads/2018/05/word-image-5484-768x562.png 768w" sizes="(max-width: 773px) 100vw, 773px" /></p>
<h3><a id="post-6025-_Toc499911973"></a><a id="post-6025-_Toc491186205"></a><a id="post-6025-_Toc498268263"></a><a id="post-6025-_Toc493776232"></a>设置时区为中国（config/app.php文件）</h3>
<p><img loading="lazy" decoding="async" width="713" height="285" src="/wp-content/uploads/2018/05/word-image-5485.png" class="wp-image-6033" srcset="/wp-content/uploads/2018/05/word-image-5485.png 713w, /wp-content/uploads/2018/05/word-image-5485-300x120.png 300w" sizes="(max-width: 713px) 100vw, 713px" /></p>
<h3><a id="post-6025-_Toc491186206"></a><a id="post-6025-_Toc498268264"></a><a id="post-6025-_Toc499911974"></a><a id="post-6025-_Toc493776233"></a>4）清理项目</h3>
<ul>
<li>
    删除app/Http/Controllers/Auth目录，因为需要自定义登录逻辑
  </li>
<li>
    删除
  </li>
</ul>
<p>
  database/migrations/2014_10_12_000000_create_users_table.php
</p>
<p>
  database/migrations/2014_10_12_100000_create_password_resets_table.php
</p>
<ul>
<li>
    删除resources/views/welcome.blade.php欢迎页面
  </li>
</ul>
<h3>5）session机制</h3>
<p><img loading="lazy" decoding="async" width="922" height="417" src="/wp-content/uploads/2018/05/word-image-5486.png" class="wp-image-6034" srcset="/wp-content/uploads/2018/05/word-image-5486.png 922w, /wp-content/uploads/2018/05/word-image-5486-300x136.png 300w, /wp-content/uploads/2018/05/word-image-5486-768x347.png 768w" sizes="(max-width: 922px) 100vw, 922px" /></p>
<h1><a id="post-6025-_Toc487731721"></a>后台登录功能</h1>
<h2><a id="post-6025-_Toc487731718"></a>1、创建管理员数据表</h2>
<h3><a id="post-6025-_Toc487731719"></a>1）创建管理员的数据表</h3>
<p>
  create table admin (
</p>
<p>
  id int unsigned primary key auto_increment comment &#8216;管理员ID&#8217;,
</p>
<p>
  username varchar(20) not null comment &#8216;用户名&#8217;,
</p>
<p>
  password varchar(255) not null comment &#8216;密码&#8217;,
</p>
<p>
  sex tinyint(1) unsigned not null default 1 comment &#8216;性别:1-男,2-女,3-未知&#8217;,
</p>
<p>
  mobile char(11) not null default &#8221; comment &#8216;手机号&#8217;,
</p>
<p>
  email varchar(40) not null default &#8221; comment &#8216;邮箱&#8217;,
</p>
<p>
  role_id tinyint  unsigned not null comment &#8216;角色ID&#8217;,
</p>
<p>
  created_at int unsigned not null default 0 comment &#8216;创建于&#8217;,
</p>
<p>
  updated_at int unsigned not null default 0 comment &#8216;更新于&#8217;,
</p>
<p>
  state tinyint unsigned not null default 1 comment &#8216;用户状态:0-禁用,1启动&#8217;,
</p>
<p>
  remember_token varchar(255) not null default &#8221; comment &#8216;记住密码TOKEN&#8217;
</p>
<p>
  )engine=myisam charset=utf8mb4;
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p><img loading="lazy" decoding="async" width="1217" height="638" src="/wp-content/uploads/2018/05/word-image-5487.png" class="wp-image-6035" srcset="/wp-content/uploads/2018/05/word-image-5487.png 1217w, /wp-content/uploads/2018/05/word-image-5487-300x157.png 300w, /wp-content/uploads/2018/05/word-image-5487-768x403.png 768w, /wp-content/uploads/2018/05/word-image-5487-1024x537.png 1024w" sizes="(max-width: 1217px) 100vw, 1217px" /></p>
<p>
  Schema::create(&#8216;admin&#8217;, function (Blueprint $table) {
</p>
<p>
      $table-&gt;engine = &#8216;myisam&#8217;;
</p>
<p>
      $table-&gt;increments(&#8216;id&#8217;)-&gt;comment(&#8216;管理员ID&#8217;);
</p>
<p>
      $table-&gt;string(&#8216;username&#8217;, 20)-&gt;comment(&#8216;用户名&#8217;);
</p>
<p>
      $table-&gt;string(&#8216;password&#8217;, 255)-&gt;comment(&#8216;密码&#8217;);
</p>
<p>
      $table-&gt;unsignedTinyInteger(&#8216;sex&#8217;)-&gt;default(1)-&gt;comment(&#8216;性别:1-男,2-女,3-未知&#8217;);
</p>
<p>
      $table-&gt;char(&#8216;mobile&#8217;, 11)-&gt;default(&#8221;)-&gt;comment(&#8216;手机号&#8217;);
</p>
<p>
      $table-&gt;string(&#8217;email&#8217;, 40)-&gt;default(&#8221;)-&gt;comment(&#8216;邮箱&#8217;);
</p>
<p>
      $table-&gt;unsignedTinyInteger(&#8216;role_id&#8217;)-&gt;comment(&#8216;角色ID&#8217;);
</p>
<p>
      $table-&gt;unsignedInteger(&#8216;created_at&#8217;)-&gt;default(0)-&gt;comment(&#8216;创建于&#8217;);
</p>
<p>
      $table-&gt;unsignedInteger(&#8216;updated_at&#8217;)-&gt;default(0)-&gt;comment(&#8216;更新于&#8217;);
</p>
<p>
      $table-&gt;unsignedTinyInteger(&#8216;state&#8217;)-&gt;default(1)-&gt;comment(&#8216;用户状态:0-禁用,1-启动&#8217;);
</p>
<p>
      $table-&gt;string(&#8216;remember_token&#8217;, 255)-&gt;default(&#8221;)-&gt;comment(&#8216;记住密码TOKEN&#8217;);
</p>
<p>
  });
</p>
<p>
  效果图
</p>
<p><img loading="lazy" decoding="async" width="1036" height="297" src="/wp-content/uploads/2018/05/word-image-5488.png" class="wp-image-6036" srcset="/wp-content/uploads/2018/05/word-image-5488.png 1036w, /wp-content/uploads/2018/05/word-image-5488-300x86.png 300w, /wp-content/uploads/2018/05/word-image-5488-768x220.png 768w, /wp-content/uploads/2018/05/word-image-5488-1024x294.png 1024w" sizes="(max-width: 1036px) 100vw, 1036px" /></p>
<h3><a id="post-6025-_Toc487731720"></a>2）插入测试数据（填充器 + Faker）</h3>
<p>
  步骤1：创建填充器
</p>
<p><img loading="lazy" decoding="async" width="1294" height="535" src="/wp-content/uploads/2018/05/word-image-5489.png" class="wp-image-6037" srcset="/wp-content/uploads/2018/05/word-image-5489.png 1294w, /wp-content/uploads/2018/05/word-image-5489-300x124.png 300w, /wp-content/uploads/2018/05/word-image-5489-768x318.png 768w, /wp-content/uploads/2018/05/word-image-5489-1024x423.png 1024w" sizes="(max-width: 1294px) 100vw, 1294px" /></p>
<p>
  public function run()
</p>
<p>
  {
</p>
<p>
      $faker = Faker\Factory::create(&#8216;zh_CN&#8217;);
</p>
<p>
      for ($i = 1; $i&lt;30; $i++) {
</p>
<p>
          DB::table(&#8216;admin&#8217;)-&gt;insert([
</p>
<p>
              &#8216;username&#8217; =&gt; $faker-&gt;userName,
</p>
<p>
              &#8216;password&#8217; =&gt; bcrypt($faker-&gt;password),
</p>
<p>
              &#8216;sex&#8217; =&gt; mt_rand(1,3),
</p>
<p>
              &#8216;mobile&#8217; =&gt; $faker-&gt;phoneNumber,
</p>
<p>
              &#8217;email&#8217; =&gt; $faker-&gt;email,
</p>
<p>
              &#8216;role_id&#8217; =&gt; mt_rand(1,150),
</p>
<p>
              &#8216;created_at&#8217; =&gt; time(),
</p>
<p>
              &#8216;updated_at&#8217; =&gt; time()
</p>
<p>
          ]);
</p>
<p>
      }
</p>
<p>
  }
</p>
<p>
  步骤2：执行填充器
</p>
<p><img loading="lazy" decoding="async" width="944" height="404" src="/wp-content/uploads/2018/05/word-image-5490.png" class="wp-image-6038" srcset="/wp-content/uploads/2018/05/word-image-5490.png 944w, /wp-content/uploads/2018/05/word-image-5490-300x128.png 300w, /wp-content/uploads/2018/05/word-image-5490-768x329.png 768w" sizes="(max-width: 944px) 100vw, 944px" /></p>
<h2><a id="post-6025-_Toc487731722"></a>2、显示登录页</h2>
<h3>1）后台静态模板介绍</h3>
<ul>
<li>
    模版文件：H-ui Admin后台模版
  </li>
<li>
    下载地址：http://www.h-ui.net/H-ui.admin.shtml
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="711" height="167" src="/wp-content/uploads/2018/05/word-image-5491.png" class="wp-image-6039" srcset="/wp-content/uploads/2018/05/word-image-5491.png 711w, /wp-content/uploads/2018/05/word-image-5491-300x70.png 300w" sizes="(max-width: 711px) 100vw, 711px" /></p>
<h3>2）显示登录页</h3>
<p>
  步骤1：
</p>
<p>
  创建路由，访问/admin/login就通过Admin\LoginController@login加载视图
</p>
<p><img loading="lazy" decoding="async" width="1198" height="324" src="/wp-content/uploads/2018/05/word-image-5492.png" class="wp-image-6040" srcset="/wp-content/uploads/2018/05/word-image-5492.png 1198w, /wp-content/uploads/2018/05/word-image-5492-300x81.png 300w, /wp-content/uploads/2018/05/word-image-5492-768x208.png 768w, /wp-content/uploads/2018/05/word-image-5492-1024x277.png 1024w" sizes="(max-width: 1198px) 100vw, 1198px" /></p>
<p>
  步骤2：创建登录控制器和方法，并在方法中加载视图
</p>
<p><img loading="lazy" decoding="async" width="1057" height="509" src="/wp-content/uploads/2018/05/word-image-5493.png" class="wp-image-6041" srcset="/wp-content/uploads/2018/05/word-image-5493.png 1057w, /wp-content/uploads/2018/05/word-image-5493-300x144.png 300w, /wp-content/uploads/2018/05/word-image-5493-768x370.png 768w, /wp-content/uploads/2018/05/word-image-5493-1024x493.png 1024w" sizes="(max-width: 1057px) 100vw, 1057px" /></p>
<p>
  步骤3：创建视图
</p>
<p><img loading="lazy" decoding="async" width="892" height="691" src="/wp-content/uploads/2018/05/word-image-5494.png" class="wp-image-6042" srcset="/wp-content/uploads/2018/05/word-image-5494.png 892w, /wp-content/uploads/2018/05/word-image-5494-300x232.png 300w, /wp-content/uploads/2018/05/word-image-5494-768x595.png 768w" sizes="(max-width: 892px) 100vw, 892px" /></p>
<p>
  效果
</p>
<p><img loading="lazy" decoding="async" width="811" height="546" src="/wp-content/uploads/2018/05/word-image-5495.png" class="wp-image-6043" srcset="/wp-content/uploads/2018/05/word-image-5495.png 811w, /wp-content/uploads/2018/05/word-image-5495-300x202.png 300w, /wp-content/uploads/2018/05/word-image-5495-768x517.png 768w" sizes="(max-width: 811px) 100vw, 811px" /></p>
<h2>登录数据处理（用户认证，使用Auth做登录和退出功能）</h2>
<h3>用户认证（Auth）相关语法</h3>
<p>
  验证信息并登陆：Auth::guard(参数)-&gt;attempt（用户名和密码数组，是否保存用户状态:true-是,false-否）
</p>
<p>
  检查状态：Auth::guard(参数)-&gt;check（）
</p>
<p>
  获得登陆用户：Auth::guard(参数)-&gt;user（）-&gt;键
</p>
<p>
  退出登录：Auth::guard(参数)-&gt;logout（）
</p>
<h3>2）准备</h3>
<p><strong>步骤1：创建模型（注：因为该模型需要使用Auth类所以必须实现指定接口）</strong>
</p>
<p><img loading="lazy" decoding="async" width="1172" height="523" src="/wp-content/uploads/2018/05/word-image-5496.png" class="wp-image-6044" srcset="/wp-content/uploads/2018/05/word-image-5496.png 1172w, /wp-content/uploads/2018/05/word-image-5496-300x134.png 300w, /wp-content/uploads/2018/05/word-image-5496-768x343.png 768w, /wp-content/uploads/2018/05/word-image-5496-1024x457.png 1024w" sizes="(max-width: 1172px) 100vw, 1172px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Model;
</p>
<p>
  use Illuminate\Auth\Authenticatable;
</p>
<p>
  use Illuminate\Database\Eloquent\Model;
</p>
<p>
  class Admin extends Model implements \Illuminate\Contracts\Auth\Authenticatable
</p>
<p>
  {
</p>
<p>
      use Authenticatable;
</p>
<p>
      /**
</p>
<p>
       * 声明表名
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $table = &#8216;admin&#8217;;
</p>
<p>
  }
</p>
<p>
  步骤2：修改config/auth.php用户认证配置文件，目的设置（验证用户信息并登陆语法中的参数 Auth::guard(参数)）
</p>
<p><img loading="lazy" decoding="async" width="1086" height="457" src="/wp-content/uploads/2018/05/word-image-5497.png" class="wp-image-6045" srcset="/wp-content/uploads/2018/05/word-image-5497.png 1086w, /wp-content/uploads/2018/05/word-image-5497-300x126.png 300w, /wp-content/uploads/2018/05/word-image-5497-768x323.png 768w, /wp-content/uploads/2018/05/word-image-5497-1024x431.png 1024w" sizes="(max-width: 1086px) 100vw, 1086px" /><br />
<img loading="lazy" decoding="async" width="1005" height="271" src="/wp-content/uploads/2018/05/word-image-5498.png" class="wp-image-6046" srcset="/wp-content/uploads/2018/05/word-image-5498.png 1005w, /wp-content/uploads/2018/05/word-image-5498-300x81.png 300w, /wp-content/uploads/2018/05/word-image-5498-768x207.png 768w" sizes="(max-width: 1005px) 100vw, 1005px" /></p>
<h3>代码1：身份验证</h3>
<p>
  步骤1：修改路由，既可以get又可以post
</p>
<p><img loading="lazy" decoding="async" width="1124" height="370" src="/wp-content/uploads/2018/05/word-image-5499.png" class="wp-image-6047" srcset="/wp-content/uploads/2018/05/word-image-5499.png 1124w, /wp-content/uploads/2018/05/word-image-5499-300x99.png 300w, /wp-content/uploads/2018/05/word-image-5499-768x253.png 768w, /wp-content/uploads/2018/05/word-image-5499-1024x337.png 1024w" sizes="(max-width: 1124px) 100vw, 1124px" /></p>
<p>
  步骤2：修改登录form表单参数
</p>
<p><img loading="lazy" decoding="async" width="1129" height="588" src="/wp-content/uploads/2018/05/word-image-5500.png" class="wp-image-6048" srcset="/wp-content/uploads/2018/05/word-image-5500.png 1129w, /wp-content/uploads/2018/05/word-image-5500-300x156.png 300w, /wp-content/uploads/2018/05/word-image-5500-768x400.png 768w, /wp-content/uploads/2018/05/word-image-5500-1024x533.png 1024w" sizes="(max-width: 1129px) 100vw, 1129px" /></p>
<p>
  步骤3：在login方法中增加判断是否post提交，否-则加载视图，是-则接受数据，并调用Auth类的验证信息并登录方法实现登录功能
</p>
<p><img loading="lazy" decoding="async" width="1211" height="603" src="/wp-content/uploads/2018/05/word-image-5501.png" class="wp-image-6049" srcset="/wp-content/uploads/2018/05/word-image-5501.png 1211w, /wp-content/uploads/2018/05/word-image-5501-300x149.png 300w, /wp-content/uploads/2018/05/word-image-5501-768x382.png 768w, /wp-content/uploads/2018/05/word-image-5501-1024x510.png 1024w" sizes="(max-width: 1211px) 100vw, 1211px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p><strong>use Illuminate\Support\Facades\Auth;</strong>
</p>
<p>
  class LoginController extends Controller
</p>
<p>
  {
</p>
<p>
      //加载登录视图
</p>
<p>
      public function login(Request $request)
</p>
<p>
      {
</p>
<p>
          //1.判断HTTP请求类型
</p>
<p>
          if ($request-&gt;isMethod(&#8216;post&#8217;)) {
</p>
<p>
              //2.接受数据
</p>
<p>
              $postData = $request-&gt;only([&#8216;username&#8217;, &#8216;password&#8217;]);
</p>
<p>
              //3.验证身份 并 登录（注：也就是调用Auth类的方法会自动帮我们验证数据并且保存session）
</p>
<p>
              //语法；Auth::guard(参数)-&gt;attempt(用户名和密码数组，是否保存用户状态:true-是,false-否)
</p>
<p>
                                                                   //true-后期相当于cookie存储，false-session
</p>
<p>
           <strong>  $rs = Auth::guard(&#8216;admin&#8217;)-&gt;attempt($postData, $request-&gt;only(&#8216;online&#8217;)[&#8216;online&#8217;]);</strong>
</p>
<p>
             //4.判断用户是否登录成功
</p>
<p>
              if ($rs) {
</p>
<p>
                  return redirect(&#8216;admin/index/index&#8217;);
</p>
<p>
              } else {
</p>
<p>
                  return redirect(&#8216;admin/login&#8217;);
</p>
<p>
              }
</p>
<p>
          } else {
</p>
<p>
              //2.加载视图
</p>
<p>
              return view(&#8216;admin.login.login&#8217;);
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
  }
</p>
<h3>代码2：数据过滤</h3>
<p>
  用户名：必须，3~2个字符
</p>
<p>
  密码：必须，6~32个字符
</p>
<p>
  验证码：必须，5个字符
</p>
<p><strong>步骤1：控制器通过validate方法进行数据过滤</strong>
</p>
<p><img loading="lazy" decoding="async" width="1230" height="335" src="/wp-content/uploads/2018/05/word-image-5502.png" class="wp-image-6050" srcset="/wp-content/uploads/2018/05/word-image-5502.png 1230w, /wp-content/uploads/2018/05/word-image-5502-300x82.png 300w, /wp-content/uploads/2018/05/word-image-5502-768x209.png 768w, /wp-content/uploads/2018/05/word-image-5502-1024x279.png 1024w" sizes="(max-width: 1230px) 100vw, 1230px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  use Illuminate\Support\Facades\Auth;
</p>
<p>
  class LoginController extends Controller
</p>
<p>
  {
</p>
<p>
      //加载登录视图
</p>
<p>
      public function login(Request $request)
</p>
<p>
      {
</p>
<p>
          //1.判断HTTP请求类型
</p>
<p>
          if ($request-&gt;isMethod(&#8216;post&#8217;)) {
</p>
<p>
            <strong>  //数据过滤，发送HTTP请求进行验证：成功-则不管，失败-重定向到来源页面，并给视图传递$errors变量</strong>
</p>
<p><strong>            $this-&gt;validate($request, [</strong>
</p>
<p><strong>                &#8216;username&#8217; =&gt; &#8216;required|min:2|max:10&#8217;,</strong>
</p>
<p><strong>                &#8216;password&#8217; =&gt; &#8216;required|min:6|max:32&#8217;,</strong>
</p>
<p><strong>                &#8216;captcha&#8217; =&gt; &#8216;required|size:5&#8217;,</strong>
</p>
<p><strong>            ]);</strong>
</p>
<p>
              //2.接受数据
</p>
<p>
              $postData = $request-&gt;only([&#8216;username&#8217;, &#8216;password&#8217;]);
</p>
<p>
              //3.验证身份 并 登录（注：也就是调用Auth类的方法会自动帮我们验证数据并且保存session）
</p>
<p>
              //语法；Auth::guard(参数)-&gt;attempt(用户名和密码数组，是否保存用户状态:true-是,false-否)
</p>
<p>
              //true-后期相当于cookie存储，false-session
</p>
<p>
              $rs = Auth::guard(&#8216;admin&#8217;)-&gt;attempt($postData, $request-&gt;only(&#8216;online&#8217;)[&#8216;online&#8217;]);
</p>
<p>
              //4.判断用户是否登录成功
</p>
<p>
              if ($rs) {
</p>
<p>
                  return redirect(&#8216;admin/index/index&#8217;);
</p>
<p>
              } else {
</p>
<p>
                  return redirect(&#8216;admin/login&#8217;);
</p>
<p>
              }
</p>
<p>
          } else {
</p>
<p>
              //2.加载视图
</p>
<p>
              return view(&#8216;admin.login.login&#8217;);
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
  }
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p><strong>步骤2：视图弹出错误信息</strong>
</p>
<p><img loading="lazy" decoding="async" width="878" height="363" src="/wp-content/uploads/2018/05/word-image-5503.png" class="wp-image-6051" srcset="/wp-content/uploads/2018/05/word-image-5503.png 878w, /wp-content/uploads/2018/05/word-image-5503-300x124.png 300w, /wp-content/uploads/2018/05/word-image-5503-768x318.png 768w" sizes="(max-width: 878px) 100vw, 878px" /></p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  @if (count($errors) &gt; 0)
</p>
<p>
      var errors = &#8221;;
</p>
<p>
      @foreach ($errors-&gt;all() as $error)
</p>
<p>
          errors += &#8220;{{ $error }} \n&#8221;;
</p>
<p>
      @endforeach
</p>
<p>
      alert(errors);
</p>
<p>
  @endif
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
</p>
<p><strong>步骤3：发现验证码captcha不能被识别</strong>
</p>
<p><img loading="lazy" decoding="async" width="941" height="284" src="/wp-content/uploads/2018/05/word-image-5504.png" class="wp-image-6052" srcset="/wp-content/uploads/2018/05/word-image-5504.png 941w, /wp-content/uploads/2018/05/word-image-5504-300x91.png 300w, /wp-content/uploads/2018/05/word-image-5504-768x232.png 768w" sizes="(max-width: 941px) 100vw, 941px" /><br />
<img loading="lazy" decoding="async" width="954" height="417" src="/wp-content/uploads/2018/05/word-image-5505.png" class="wp-image-6053" srcset="/wp-content/uploads/2018/05/word-image-5505.png 954w, /wp-content/uploads/2018/05/word-image-5505-300x131.png 300w, /wp-content/uploads/2018/05/word-image-5505-768x336.png 768w" sizes="(max-width: 954px) 100vw, 954px" /><br />
<img loading="lazy" decoding="async" width="1007" height="341" src="/wp-content/uploads/2018/05/word-image-5506.png" class="wp-image-6054" srcset="/wp-content/uploads/2018/05/word-image-5506.png 1007w, /wp-content/uploads/2018/05/word-image-5506-300x102.png 300w, /wp-content/uploads/2018/05/word-image-5506-768x260.png 768w" sizes="(max-width: 1007px) 100vw, 1007px" /></p>
<h2><a id="post-6025-_Toc487731724"></a>4、登录验证码（mews/captcha）</h2>
<h3>1）通过composer下载验证码类库 并 激活</h3>
<p>
  步骤1：下载
</p>
<p><img loading="lazy" decoding="async" width="776" height="401" src="/wp-content/uploads/2018/05/word-image-5507.png" class="wp-image-6055" srcset="/wp-content/uploads/2018/05/word-image-5507.png 776w, /wp-content/uploads/2018/05/word-image-5507-300x155.png 300w, /wp-content/uploads/2018/05/word-image-5507-768x397.png 768w" sizes="(max-width: 776px) 100vw, 776px" /></p>
<p>
  步骤2：打开config\app.php进行机会
</p>
<p><img loading="lazy" decoding="async" width="1029" height="313" src="/wp-content/uploads/2018/05/word-image-5508.png" class="wp-image-6056" srcset="/wp-content/uploads/2018/05/word-image-5508.png 1029w, /wp-content/uploads/2018/05/word-image-5508-300x91.png 300w, /wp-content/uploads/2018/05/word-image-5508-768x234.png 768w, /wp-content/uploads/2018/05/word-image-5508-1024x311.png 1024w" sizes="(max-width: 1029px) 100vw, 1029px" /><br />
<img loading="lazy" decoding="async" width="985" height="248" src="/wp-content/uploads/2018/05/word-image-5509.png" class="wp-image-6057" srcset="/wp-content/uploads/2018/05/word-image-5509.png 985w, /wp-content/uploads/2018/05/word-image-5509-300x76.png 300w, /wp-content/uploads/2018/05/word-image-5509-768x193.png 768w" sizes="(max-width: 985px) 100vw, 985px" /></p>
<p>
  步骤3：打开视图显示验证码
</p>
<p><img loading="lazy" decoding="async" width="828" height="276" src="/wp-content/uploads/2018/05/word-image-5510.png" class="wp-image-6058" srcset="/wp-content/uploads/2018/05/word-image-5510.png 828w, /wp-content/uploads/2018/05/word-image-5510-300x100.png 300w, /wp-content/uploads/2018/05/word-image-5510-768x256.png 768w" sizes="(max-width: 828px) 100vw, 828px" /></p>
<p>
  效果
</p>
<p><img loading="lazy" decoding="async" width="503" height="239" src="/wp-content/uploads/2018/05/word-image-5511.png" class="wp-image-6059" srcset="/wp-content/uploads/2018/05/word-image-5511.png 503w, /wp-content/uploads/2018/05/word-image-5511-300x143.png 300w" sizes="(max-width: 503px) 100vw, 503px" /></p>
<h3>视图显示验证码，并实现点击切换</h3>
<p><img loading="lazy" decoding="async" width="1216" height="261" src="/wp-content/uploads/2018/05/word-image-5512.png" class="wp-image-6060" srcset="/wp-content/uploads/2018/05/word-image-5512.png 1216w, /wp-content/uploads/2018/05/word-image-5512-300x64.png 300w, /wp-content/uploads/2018/05/word-image-5512-768x165.png 768w, /wp-content/uploads/2018/05/word-image-5512-1024x220.png 1024w" sizes="(max-width: 1216px) 100vw, 1216px" /></p>
<p>
  &lt;img src=&#8221;{{ Captcha::src() }}&#8221; onclick=&#8221;this.src = &#8216;{{ Captcha::src() }}&#8217; + &#8216;&amp;_=&#8217;+Math.random()&#8221;&gt;
</p>
<h3>控制器判断验证码是否正确</h3>
<p>
  步骤1：直接在validate方法中使用captcha验证规则即可
</p>
<p><img loading="lazy" decoding="async" width="939" height="299" src="/wp-content/uploads/2018/05/word-image-5513.png" class="wp-image-6061" srcset="/wp-content/uploads/2018/05/word-image-5513.png 939w, /wp-content/uploads/2018/05/word-image-5513-300x96.png 300w, /wp-content/uploads/2018/05/word-image-5513-768x245.png 768w" sizes="(max-width: 939px) 100vw, 939px" /></p>
<p>
   步骤2：提示汉化
</p>
<p><img loading="lazy" decoding="async" width="957" height="293" src="/wp-content/uploads/2018/05/word-image-5514.png" class="wp-image-6062" srcset="/wp-content/uploads/2018/05/word-image-5514.png 957w, /wp-content/uploads/2018/05/word-image-5514-300x92.png 300w, /wp-content/uploads/2018/05/word-image-5514-768x235.png 768w" sizes="(max-width: 957px) 100vw, 957px" /></p>
<h1><a id="post-6025-_Toc487731727"></a>四、后台首页展示</h1>
<h2>1、显示后台首页</h2>
<p>
  步骤1：定义路由  /admin/index/index  对应  Admin\IndexController@index
</p>
<p><img loading="lazy" decoding="async" width="1025" height="356" src="/wp-content/uploads/2018/05/word-image-5515.png" class="wp-image-6063" srcset="/wp-content/uploads/2018/05/word-image-5515.png 1025w, /wp-content/uploads/2018/05/word-image-5515-300x104.png 300w, /wp-content/uploads/2018/05/word-image-5515-768x267.png 768w, /wp-content/uploads/2018/05/word-image-5515-1024x356.png 1024w" sizes="(max-width: 1025px) 100vw, 1025px" /></p>
<p>
  步骤2：创建控制器和方法并调用视图
</p>
<p><img loading="lazy" decoding="async" width="1098" height="522" src="/wp-content/uploads/2018/05/word-image-5516.png" class="wp-image-6064" srcset="/wp-content/uploads/2018/05/word-image-5516.png 1098w, /wp-content/uploads/2018/05/word-image-5516-300x143.png 300w, /wp-content/uploads/2018/05/word-image-5516-768x365.png 768w, /wp-content/uploads/2018/05/word-image-5516-1024x487.png 1024w" sizes="(max-width: 1098px) 100vw, 1098px" /></p>
<p>
  步骤3：创建视图
</p>
<p><img loading="lazy" decoding="async" width="1098" height="660" src="/wp-content/uploads/2018/05/word-image-5517.png" class="wp-image-6065" srcset="/wp-content/uploads/2018/05/word-image-5517.png 1098w, /wp-content/uploads/2018/05/word-image-5517-300x180.png 300w, /wp-content/uploads/2018/05/word-image-5517-768x462.png 768w, /wp-content/uploads/2018/05/word-image-5517-1024x616.png 1024w" sizes="(max-width: 1098px) 100vw, 1098px" /></p>
<h2>2、显示后台欢迎页</h2>
<p>
  步骤1：定义路由
</p>
<p><img loading="lazy" decoding="async" width="1100" height="355" src="/wp-content/uploads/2018/05/word-image-5518.png" class="wp-image-6066" srcset="/wp-content/uploads/2018/05/word-image-5518.png 1100w, /wp-content/uploads/2018/05/word-image-5518-300x97.png 300w, /wp-content/uploads/2018/05/word-image-5518-768x248.png 768w, /wp-content/uploads/2018/05/word-image-5518-1024x330.png 1024w" sizes="(max-width: 1100px) 100vw, 1100px" /></p>
<p>
  步骤2：创建控制器和方法
</p>
<p><img loading="lazy" decoding="async" width="858" height="519" src="/wp-content/uploads/2018/05/word-image-5519.png" class="wp-image-6067" srcset="/wp-content/uploads/2018/05/word-image-5519.png 858w, /wp-content/uploads/2018/05/word-image-5519-300x181.png 300w, /wp-content/uploads/2018/05/word-image-5519-768x465.png 768w" sizes="(max-width: 858px) 100vw, 858px" /></p>
<p>
  步骤3：创建视图
</p>
<p><img loading="lazy" decoding="async" width="1044" height="556" src="/wp-content/uploads/2018/05/word-image-5520.png" class="wp-image-6068" srcset="/wp-content/uploads/2018/05/word-image-5520.png 1044w, /wp-content/uploads/2018/05/word-image-5520-300x160.png 300w, /wp-content/uploads/2018/05/word-image-5520-768x409.png 768w, /wp-content/uploads/2018/05/word-image-5520-1024x545.png 1024w" sizes="(max-width: 1044px) 100vw, 1044px" /></p>
<p>
  步骤4：修改后台首页的iframe的src地址
</p>
<p><img loading="lazy" decoding="async" width="1143" height="334" src="/wp-content/uploads/2018/05/word-image-5521.png" class="wp-image-6069" srcset="/wp-content/uploads/2018/05/word-image-5521.png 1143w, /wp-content/uploads/2018/05/word-image-5521-300x88.png 300w, /wp-content/uploads/2018/05/word-image-5521-768x224.png 768w, /wp-content/uploads/2018/05/word-image-5521-1024x299.png 1024w" sizes="(max-width: 1143px) 100vw, 1143px" /></p>
<p>
  效果
</p>
<p><img loading="lazy" decoding="async" width="1072" height="476" src="/wp-content/uploads/2018/05/word-image-5522.png" class="wp-image-6070" srcset="/wp-content/uploads/2018/05/word-image-5522.png 1072w, /wp-content/uploads/2018/05/word-image-5522-300x133.png 300w, /wp-content/uploads/2018/05/word-image-5522-768x341.png 768w, /wp-content/uploads/2018/05/word-image-5522-1024x455.png 1024w" sizes="(max-width: 1072px) 100vw, 1072px" /></p>
<h2>3、显示后台首页右上角（当前登录用户名称）</h2>
<p><img loading="lazy" decoding="async" width="1317" height="467" src="/wp-content/uploads/2018/05/word-image-5523.png" class="wp-image-6071" srcset="/wp-content/uploads/2018/05/word-image-5523.png 1317w, /wp-content/uploads/2018/05/word-image-5523-300x106.png 300w, /wp-content/uploads/2018/05/word-image-5523-768x272.png 768w, /wp-content/uploads/2018/05/word-image-5523-1024x363.png 1024w" sizes="(max-width: 1317px) 100vw, 1317px" /></p>
<h2>退出功能</h2>
<p>
  步骤1：定义路由
</p>
<p><img loading="lazy" decoding="async" width="1153" height="398" src="/wp-content/uploads/2018/05/word-image-5524.png" class="wp-image-6072" srcset="/wp-content/uploads/2018/05/word-image-5524.png 1153w, /wp-content/uploads/2018/05/word-image-5524-300x104.png 300w, /wp-content/uploads/2018/05/word-image-5524-768x265.png 768w, /wp-content/uploads/2018/05/word-image-5524-1024x353.png 1024w" sizes="(max-width: 1153px) 100vw, 1153px" /></p>
<p>
  步骤2：书写退出功能代码
</p>
<p><img loading="lazy" decoding="async" width="1134" height="393" src="/wp-content/uploads/2018/05/word-image-5525.png" class="wp-image-6073" srcset="/wp-content/uploads/2018/05/word-image-5525.png 1134w, /wp-content/uploads/2018/05/word-image-5525-300x104.png 300w, /wp-content/uploads/2018/05/word-image-5525-768x266.png 768w, /wp-content/uploads/2018/05/word-image-5525-1024x355.png 1024w" sizes="(max-width: 1134px) 100vw, 1134px" /></p>
<p>
  步骤3：设置退出连接
</p>
<p><img loading="lazy" decoding="async" width="1012" height="333" src="/wp-content/uploads/2018/05/word-image-5526.png" class="wp-image-6074" srcset="/wp-content/uploads/2018/05/word-image-5526.png 1012w, /wp-content/uploads/2018/05/word-image-5526-300x99.png 300w, /wp-content/uploads/2018/05/word-image-5526-768x253.png 768w" sizes="(max-width: 1012px) 100vw, 1012px" /></p>
<h1>五、防翻墙</h1>
<h2>1、创建中间件，并书写过滤代码</h2>
<p><img loading="lazy" decoding="async" width="1284" height="617" src="/wp-content/uploads/2018/05/word-image-5527.png" class="wp-image-6075" srcset="/wp-content/uploads/2018/05/word-image-5527.png 1284w, /wp-content/uploads/2018/05/word-image-5527-300x144.png 300w, /wp-content/uploads/2018/05/word-image-5527-768x369.png 768w, /wp-content/uploads/2018/05/word-image-5527-1024x492.png 1024w" sizes="(max-width: 1284px) 100vw, 1284px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Middleware;
</p>
<p>
  use Closure;
</p>
<p>
  use Illuminate\Support\Facades\Auth;
</p>
<p>
  class CheckAdminLogin
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * Handle an incoming request.
</p>
<p>
       *
</p>
<p>
       * @param  \Illuminate\Http\Request  $request
</p>
<p>
       * @param  \Closure  $next
</p>
<p>
       * @return mixed
</p>
<p>
       */
</p>
<p>
      public function handle($request, Closure $next)
</p>
<p>
      {
</p>
<p>
          if (!Auth::guard(&#8216;admin&#8217;)-&gt;check()) {
</p>
<p>
              return redirect(&#8216;admin/login&#8217;)-&gt;withErrors([&#8216;errors&#8217; =&gt; &#8216;登录超时，请重新登录&#8217;]);
</p>
<p>
          }
</p>
<p>
          return $next($request);
</p>
<p>
      }
</p>
<p>
  }
</p>
<h2>注册激活</h2>
<p><img loading="lazy" decoding="async" width="1199" height="422" src="/wp-content/uploads/2018/05/word-image-5528.png" class="wp-image-6076" srcset="/wp-content/uploads/2018/05/word-image-5528.png 1199w, /wp-content/uploads/2018/05/word-image-5528-300x106.png 300w, /wp-content/uploads/2018/05/word-image-5528-768x270.png 768w, /wp-content/uploads/2018/05/word-image-5528-1024x360.png 1024w" sizes="(max-width: 1199px) 100vw, 1199px" /></p>
<h2>3、路由使用</h2>
<p><img loading="lazy" decoding="async" width="1219" height="446" src="/wp-content/uploads/2018/05/word-image-5529.png" class="wp-image-6077" srcset="/wp-content/uploads/2018/05/word-image-5529.png 1219w, /wp-content/uploads/2018/05/word-image-5529-300x110.png 300w, /wp-content/uploads/2018/05/word-image-5529-768x281.png 768w, /wp-content/uploads/2018/05/word-image-5529-1024x375.png 1024w" sizes="(max-width: 1219px) 100vw, 1219px" /></p>
<p>
  &lt;?php
</p>
<p>
  //后台登录
</p>
<p>
  Route::match([&#8216;get&#8217;, &#8216;post&#8217;], &#8216;admin/login&#8217;, &#8216;Admin\LoginController@login&#8217;);
</p>
<p>
  Route::group([&#8216;middleware&#8217; =&gt; &#8216;CheckAdminLogin&#8217;], function(){
</p>
<p>
  //退出功能
</p>
<p>
      Route::get(&#8216;admin/loginout&#8217;, &#8216;Admin\LoginController@loginout&#8217;);
</p>
<p>
  //后台首页
</p>
<p>
      Route::get(&#8216;admin/index/index&#8217;, &#8216;Admin\IndexController@index&#8217;);
</p>
<p>
      Route::get(&#8216;admin/index/welcome&#8217;, &#8216;Admin\IndexController@welcome&#8217;);
</p>
<p>
  });
</p>
<h1><a id="post-6025-_Toc487731728"></a>六、管理员管理</h1>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6025.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
