<?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>Laravel &#8211; 个人随笔</title>
	<atom:link href="/classify/%E5%90%8E%E5%8F%B0%E6%A1%86%E6%9E%B6/laravel/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Sat, 19 Mar 2022 04:02:42 +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>Laravel &#8211; 个人随笔</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>[避坑指南] Laravel知多少(&#x1f464;个人总结)</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/laravel/8954.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/laravel/8954.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 Mar 2022 03:54:50 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[资料]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[laravel知多少]]></category>
		<category><![CDATA[个人总结]]></category>
		<category><![CDATA[避坑指南]]></category>
		<guid isPermaLink="false">/?p=8954</guid>

					<description><![CDATA[面试php的时候总是会被问到，你对你现在用的框架了解多少？有哪些优缺点？如果你用过多个框架的话，还会被用来框架 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>面试php的时候总是会被问到，你对你现在用的框架了解多少？有哪些优缺点？如果你用过多个框架的话，还会被用来框架与框架做对比。</p>



<p>没办法，<strong>面试造航母，上班拧螺丝</strong>。以是程序员的常态。只能好好对待。</p>



<p>目前所在项目用的是Laravel框架，下面是自己个人对这个框架的总结吧，应该还有很多漏掉的，你也可以在留言处做补充。关键还是 要如何去回答 面试官 。希望能对你面试 用Laravel 有些许帮助吧！</p>



<p><strong>laravel框架最大的特点和优秀之处就是集合了php比较新的特点,以及各种各样的设计模式,Ioc模式,依赖注入等</strong></p>



<h2 class="wp-block-heading"><strong>一、Laravel有哪些特点</strong></h2>



<p>1 强大的rest router:用简单的回调函数就可以调用,快速绑定controller和router</p>



<p>2 artisan:命令行工具,很多手动的工作都自动化</p>



<p>3 可继承的模板,简化view的开发和管理</p>



<p>4 blade模板:渲染速度更快</p>



<p>5 ORM操作数据库</p>



<p>6 migration:管理数据库和版本控制</p>



<p>7 测试功能也很强大</p>



<p>8 composer也是亮点</p>



<p>9 队列</p>



<p>10 定时任务等</p>



<h2 class="wp-block-heading"><strong>二、架构模式</strong></h2>



<p>laravel框架是使用了服务组件化的开发模式，由多个服务提供者构成了组件，再由多个组件提供不同的服务，然后是多个服务构成了项目。</p>



<p>服务提供者是应用配置的核心，是通过 register方法中绑定服务到服务容器的。</p>



<h2 class="wp-block-heading"><strong>三、涉及到的设计模式</strong></h2>



<p>laravel框架使用了大量设计模式，使模块之间耦合度很低，服务容器可以方便的扩展框架功能以及编写测试。</p>



<p>1.ORM &#8211; 对象关系映射模式</p>



<p>2 依赖注入与IOC容器 &#8211; 策略模式</p>



<p>3 监听与触发&nbsp; &#8211;&nbsp; 观察者模式</p>



<p>4 门面模式 &#8211; 静态代理</p>



<p>5 注册树模式&nbsp; &#8211;&nbsp; 比如app.php里用到的数组存储</p>



<p>还有其他的，比如注册门面的时候用到单例模式app()-&gt;singleton等。</p>



<h2 class="wp-block-heading"><strong>四、服务方面</strong></h2>



<p>能快速开发出功能，自带各种方便的服务，比如数据验证、队列、缓存、数据迁移、测试、artisan 命令行等等，还有强大的 ORM，artisan强大的命令行工具，实现自动化。</p>



<p>Laravel安全功能有效地利用了盐散列和加密码机制，Bcrypt哈希算法”来创建加密密码。</p>



<h2 class="wp-block-heading"><strong>五、框架的其他知识点</strong></h2>



<p><strong>服务容器：</strong>是一个用于管理类依赖和执行依赖注入的强大工具。其实质是通过构造函数或者某些情况下通过「setter」方法将类依赖注入到类中。&nbsp;</p>



<p><strong>门面：</strong>为应用服务容器中的绑定类提供了一个「静态」接口 ，优点：在维护时能够提供更加易于测试、更加灵活、简明优雅的语法。</p>



<p><strong>契约：</strong>用来规划服务提供者的格式、方法、参数等，给服务提供者规范了一定约束。</p>



<p><strong>反射：</strong>主要用来动态地获取系统中类、实例对象、方法等语言构件的信息，通过发射API函数可以实现对这些语言构件信息的动态获取和动态操作等。主要用在ORM</p>



<p><strong>后期静态绑定：</strong>用于在继承范围内引用静态调用的类，即在类的继承过程中，使用的类不再是当前类，而是调用的类。</p>



<h2 class="wp-block-heading"><strong>六、生命周期</strong></h2>



<p>生命周期我是这样总结的：</p>



<p>入口文件 -&gt; 请求web服务器导入这个文件&nbsp; -&gt; 载入 Composer 生成的自动加载启动核心文件 -&gt; 内核启动(服务提供者启动框架的各种组件) -&gt; 交给路由分发到到（控制器，中间件等）-&gt; 逻辑处理&nbsp; &nbsp;-&gt; 返回结果</p>



<h2 class="wp-block-heading"><strong>七、laravel框架运用到的repository模式的主要思想</strong></h2>



<p>建立一个数据操作代理层，把controller里的数据操作剥离出来，这样做有几个好处：</p>



<p>1 把数据处理逻辑分离使得代码更容易维护</p>



<p>2 数据处理逻辑和业务逻辑分离，可以对这两个代码分别进行测试</p>



<p>3 减少代码重复</p>



<p>4 降低代码出错的几率</p>



<p>5 让controller代码的可读性大大提高&nbsp;</p>



<pre class="wp-block-preformatted">还有其他的，大家可以留言做总结哈！<br><br></pre>



<p><strong>以上是本文的全部内容，希望对大家的学习有帮助，觉得有用，有需要就支持一下吧</strong></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/laravel/8954.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>LaravelV8.6.10</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/laravel/8773.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/laravel/8773.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 25 Dec 2021 12:43:38 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Laravel8]]></category>
		<category><![CDATA[MAC]]></category>
		<category><![CDATA[MAMP PRO]]></category>
		<category><![CDATA[NUXT]]></category>
		<category><![CDATA[PhpStorm]]></category>
		<guid isPermaLink="false">/?p=8773</guid>

					<description><![CDATA[LaravelV8.6.10]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Mac下搭建Laravel环境（V8.6.10）</h2>



<p><a rel="noreferrer noopener" href="/goto/cdc2" rel="nofollow" data-type="URL" data-id="https://github.com/LeeYouRan/Server-Laravel" target="_blank">Dem</a><a href="/goto/cdc2" data-type="URL" data-id="https://github.com/LeeYouRan/Server-Laravel" target="_blank" rel="nofollow noreferrer noopener">o</a></p>



<p>1.需要<strong>的安装文件 Mamp Pro &amp; Phpstrom</strong></p>



<p><a rel="noreferrer noopener" href="/goto/sz79" rel="nofollow" data-type="URL" data-id="https://www.digit77.com/macapps/mamp-pro/" target="_blank">MAMP Pro 6.6 fix – 快速安装PHP/MySQL开发环境</a></p>



<p><a rel="noreferrer noopener" href="/goto/h92h" rel="nofollow" data-type="URL" data-id="https://www.jetbrains.com/phpstorm/download/download-thanks.html?platform=mac" target="_blank">PhpStorm 2021.3</a></p>



<p><a href="/goto/1ib6" data-type="URL" data-id="https://product-downloads.atlassian.com/software/sourcetree/ga/Sourcetree_4.1.5_241.zip" target="_blank" rel="nofollow noreferrer noopener">SourceTree 4.1.5</a></p>



<p><a rel="noreferrer noopener" href="/goto/hzn6" rel="nofollow" data-type="URL" data-id="https://www.digit77.com/macapps/navicat-premium/#download-explan" target="_blank">Navicat Premium 15.0.30</a></p>



<p><a href="/goto/0bi5" data-type="URL" data-id="https://www.digit77.com/macapps/another-redis-desktop-manager/#download-explan" target="_blank" rel="nofollow noreferrer noopener">Another Redis Desktop Manager 1.5.0</a>&nbsp;</p>



<p><strong>2.安装Laravel</strong></p>



<p><a rel="noreferrer noopener" href="/goto/b2ff" rel="nofollow" data-type="URL" data-id="https://www.jianshu.com/p/5b0718f1fe93" target="_blank">Mac下安装Laravel</a> </p>



<p><strong>3.配置开发环境</strong></p>



<p><a rel="noreferrer noopener" href="/goto/atqc" rel="nofollow" data-type="URL" data-id="https://blog.csdn.net/weixin_44103733/article/details/113749546" target="_blank">MAMP搭建Laravel虚拟机环境</a></p>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-25-20.28.56.png"><img fetchpriority="high" decoding="async" width="2880" height="1800" src="/wp-content/uploads/2021/12/截屏2021-12-25-20.28.56.png" alt="" class="wp-image-8800" srcset="/wp-content/uploads/2021/12/截屏2021-12-25-20.28.56.png 2880w, /wp-content/uploads/2021/12/截屏2021-12-25-20.28.56-300x188.png 300w, /wp-content/uploads/2021/12/截屏2021-12-25-20.28.56-1024x640.png 1024w, /wp-content/uploads/2021/12/截屏2021-12-25-20.28.56-768x480.png 768w, /wp-content/uploads/2021/12/截屏2021-12-25-20.28.56-1536x960.png 1536w, /wp-content/uploads/2021/12/截屏2021-12-25-20.28.56-2048x1280.png 2048w" sizes="(max-width: 2880px) 100vw, 2880px" /></a></figure>



<p><strong>4.伪静态</strong></p>



<p><a rel="noreferrer noopener" href="/goto/4qjo" rel="nofollow" data-type="URL" data-id="https://blog.csdn.net/qq_41150667/article/details/79156465" target="_blank">laravel+Apache 解决路由404问题</a></p>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-25-20.34.25.png"><img decoding="async" width="2880" height="1800" src="/wp-content/uploads/2021/12/截屏2021-12-25-20.34.25.png" alt="" class="wp-image-8804" srcset="/wp-content/uploads/2021/12/截屏2021-12-25-20.34.25.png 2880w, /wp-content/uploads/2021/12/截屏2021-12-25-20.34.25-300x188.png 300w, /wp-content/uploads/2021/12/截屏2021-12-25-20.34.25-1024x640.png 1024w, /wp-content/uploads/2021/12/截屏2021-12-25-20.34.25-768x480.png 768w, /wp-content/uploads/2021/12/截屏2021-12-25-20.34.25-1536x960.png 1536w, /wp-content/uploads/2021/12/截屏2021-12-25-20.34.25-2048x1280.png 2048w" sizes="(max-width: 2880px) 100vw, 2880px" /></a></figure>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-25-20.33.43.png"><img decoding="async" width="2880" height="1800" src="/wp-content/uploads/2021/12/截屏2021-12-25-20.33.43.png" alt="" class="wp-image-8805" srcset="/wp-content/uploads/2021/12/截屏2021-12-25-20.33.43.png 2880w, /wp-content/uploads/2021/12/截屏2021-12-25-20.33.43-300x188.png 300w, /wp-content/uploads/2021/12/截屏2021-12-25-20.33.43-1024x640.png 1024w, /wp-content/uploads/2021/12/截屏2021-12-25-20.33.43-768x480.png 768w, /wp-content/uploads/2021/12/截屏2021-12-25-20.33.43-1536x960.png 1536w, /wp-content/uploads/2021/12/截屏2021-12-25-20.33.43-2048x1280.png 2048w" sizes="(max-width: 2880px) 100vw, 2880px" /></a></figure>



<p>.htaccess</p>



<pre class="wp-block-code"><code>&lt;IfModule mod_rewrite.c&gt;  
    &lt;IfModule mod_negotiation.c&gt;  
        Options +FollowSymLinks  
    &lt;/IfModule&gt;  
  
    RewriteEngine On  
  
    # Redirect Trailing Slashes If Not A Folder...  
    RewriteCond %{REQUEST_FILENAME} !-d  
    RewriteRule ^(.*)/$ /$1 &#91;L,R=301]  
  
    # Handle Front Controller...  
    RewriteCond %{REQUEST_FILENAME} !-d  
    RewriteCond %{REQUEST_FILENAME} !-f  
    RewriteRule ^ index.php &#91;L]  
  
    # Handle Authorization Header  
    RewriteCond %{HTTP:Authorization} .  
    RewriteRule .* - &#91;E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]  
&lt;/IfModule&gt;  </code></pre>



<p><strong>5.laravel-modules安装</strong></p>



<p>Larvel-modules会在项目目录下生成modules目录，不会更改框架原有结构，方便后续框架升级，开发代码直接写在modules目录下。</p>



<p>5.1.首先在 Laravel 项目根目录下使用 Composer 安装该扩展包。</p>



<p><br>composer require nwidart/laravel-modules</p>



<p><br>5.2.你可以通过运行如下命令来发布配置文件。</p>



<p><br>php artisan vendor:publish &#8211;provider=&#8221;Nwidart\Modules\LaravelModulesServiceProvider&#8221;</p>



<p>5.3.通过如下命令生成应用的第一个模块。</p>



<p><br>php artisan module:make Admin</p>



<p><br>5.4.要让模块目录中定义的类可以自动加载，需要配置根目录下的composer.json。</p>



<pre class="wp-block-code"><code>{
  "autoload": {
    "psr-4": {
      "App\\": "app/",
      "Modules\\": "Modules/"
    }
  }
}
</code></pre>



<p>5.5.配置完成后运行以下命令让修改生效。</p>



<p><br>composer dump-autoload</p>



<p>5.6.执行域名加模块名（例如：<a href="/goto/o5nf" rel="nofollow">http://demo:8888/admin</a><a rel="noreferrer noopener" href="/goto/74qp" rel="nofollow" target="_blank">）</a></p>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-26-12.14.47.png"><img loading="lazy" decoding="async" width="1300" height="272" src="/wp-content/uploads/2021/12/截屏2021-12-26-12.14.47.png" alt="" class="wp-image-8821" srcset="/wp-content/uploads/2021/12/截屏2021-12-26-12.14.47.png 1300w, /wp-content/uploads/2021/12/截屏2021-12-26-12.14.47-300x63.png 300w, /wp-content/uploads/2021/12/截屏2021-12-26-12.14.47-1024x214.png 1024w, /wp-content/uploads/2021/12/截屏2021-12-26-12.14.47-768x161.png 768w" sizes="(max-width: 1300px) 100vw, 1300px" /></a><figcaption><strong>6.laravel8自动生成api文档</strong></figcaption></figure>



<p><a href="/goto/q8h6" data-type="URL" data-id="https://blog.csdn.net/JianShengShuaiest/article/details/120357911" target="_blank" rel="nofollow noreferrer noopener">laravel8自动生成api文档</a></p>



<p><a href="/goto/38a0" data-type="URL" data-id="https://www.jianshu.com/p/56c25d9bb880" target="_blank" rel="nofollow noreferrer noopener">Swagger 使用教程</a></p>



<p><a rel="noreferrer noopener" href="/goto/uhmv" rel="nofollow" data-type="URL" data-id="https://wxiangqian.blog.csdn.net/article/details/81866873" target="_blank">Swagger生成api接口文档</a></p>



<p>添加配置：</p>



<p>路径：resources/views/vendor/l5-swagger/index.blade.php</p>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-25-17.55.53.png"><img loading="lazy" decoding="async" width="816" height="256" src="/wp-content/uploads/2021/12/截屏2021-12-25-17.55.53.png" alt="" class="wp-image-8781" srcset="/wp-content/uploads/2021/12/截屏2021-12-25-17.55.53.png 816w, /wp-content/uploads/2021/12/截屏2021-12-25-17.55.53-300x94.png 300w, /wp-content/uploads/2021/12/截屏2021-12-25-17.55.53-768x241.png 768w" sizes="(max-width: 816px) 100vw, 816px" /></a></figure>



<p>添加：deepLinking: true</p>



<p></p>



<p>修改默认模块</p>



<p>路径：config/l5-swagger.php</p>



<p>将 <em>base_path(&#8216;app&#8217;),  </em>更改为 base_path(&#8216;Modules&#8217;),</p>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-25-17.59.12.png"><img loading="lazy" decoding="async" width="1540" height="386" src="/wp-content/uploads/2021/12/截屏2021-12-25-17.59.12.png" alt="" class="wp-image-8783" srcset="/wp-content/uploads/2021/12/截屏2021-12-25-17.59.12.png 1540w, /wp-content/uploads/2021/12/截屏2021-12-25-17.59.12-300x75.png 300w, /wp-content/uploads/2021/12/截屏2021-12-25-17.59.12-1024x257.png 1024w, /wp-content/uploads/2021/12/截屏2021-12-25-17.59.12-768x192.png 768w, /wp-content/uploads/2021/12/截屏2021-12-25-17.59.12-1536x385.png 1536w" sizes="(max-width: 1540px) 100vw, 1540px" /></a></figure>



<pre class="wp-block-code"><code>php artisan l5-swagger:generate</code></pre>



<p>最终效果：</p>



<figure class="wp-block-image size-full is-resized"><a href="/wp-content/uploads/2021/12/截屏2021-12-25-17.53.09-1.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2021/12/截屏2021-12-25-17.53.09-1.png" alt="" class="wp-image-8782" width="840" height="448" srcset="/wp-content/uploads/2021/12/截屏2021-12-25-17.53.09-1.png 2880w, /wp-content/uploads/2021/12/截屏2021-12-25-17.53.09-1-300x160.png 300w, /wp-content/uploads/2021/12/截屏2021-12-25-17.53.09-1-1024x546.png 1024w, /wp-content/uploads/2021/12/截屏2021-12-25-17.53.09-1-768x410.png 768w, /wp-content/uploads/2021/12/截屏2021-12-25-17.53.09-1-1536x819.png 1536w, /wp-content/uploads/2021/12/截屏2021-12-25-17.53.09-1-2048x1092.png 2048w" sizes="(max-width: 840px) 100vw, 840px" /></a></figure>



<p><strong>7.laravel数据迁移加注释</strong></p>



<p>默认laravel是没有带添加表注释组件的，这里需要安装zedisdog/laravel-schema-extend包<br>该组件包要求使用大于等于5.0版本的laravel</p>



<p>1.拉取组件<br></p>



<pre class="wp-block-code"><code>composer require zedisdog/laravel-schema-extend
</code></pre>



<p>2.申明依赖 （修改config-&gt;app.php-&gt;aliases）<br></p>



<pre class="wp-block-code"><code>'aliases' =&gt; &#91;
    ...
    // 'Schema' =&gt; Illuminate\Support\Facades\Schema::class,
    'Schema'    =&gt; Jialeo\LaravelSchemaExtend\Schema::class,

],
</code></pre>



<p>3.使用（默认创建的migration文件对应的“Schema”还是引用的laravel自带的，需要修改为该组件包的引用）<br></p>



<pre class="wp-block-code"><code> //use Illuminate\\Support\\Facades\\Schema;
 use Jialeo\\LaravelSchemaExtend\\Schema;
Schema::create('users', function (Blueprint $table) {
$table-&gt;comment = '用户表';
 });</code></pre>



<p><strong>8.JWT用户验证</strong></p>



<pre class="wp-block-code"><code>1.安装 jwt-auth。
composer require tymon/jwt-auth 1.*@rc
或者
composer require tymon/jwt-auth:^1.0.2

2.将服务提供程序添加到配置文件中的providers数组，config/app.php如下所示：
'providers' =&gt; &#91;
        ...
        Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
    ]

3.运行以下命令以发布程序包配置文件：
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

4.生成加密密钥:
php artisan jwt:secret

5.修改 config/auth.php
'guards'  =&gt;  &#91;
        'auth_admin' =&gt; &#91;
            'driver' =&gt; 'jwt',
            'provider' =&gt; 'auth_admins'
        ]
    ],
'providers' =&gt; &#91;
        'auth_admins' =&gt; &#91;
            'driver' =&gt; 'eloquent',
            'model' =&gt; Modules\Admin\Models\AuthAdmin::class,
        ]
    ],
6.创建模型
&lt;?php
namespace Modules\Admin\Models;
use DateTimeInterface;
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class AuthAdmin extends Authenticatable implements JWTSubject
{
    use Notifiable;
    protected $guard = 'auth_admin';
    protected $hidden = &#91;
        'password'
    ];
    /**
     * @name jwt标识
     * @description
     * @author Winston
     * @date 2021/12/25 3:11
     **/
    public function getJWTIdentifier()
    {
        return $this-&gt;getKey();
    }
    /**
     * @name jwt自定义声明
     * @description
     * @author Winston
     * @date 2021/12/25 3:11
     **/
    public function getJWTCustomClaims()
    {
        return &#91;];
    }
    /**
     * @name 更新时间为null时返回
     * @description
     * @author Winston
     * @date 2021/12/25 3:11
     **/
    public function getUpdatedAtAttribute($value)
    {
        return $value?$value:'';
    }
    /**
     * @name  关联权限组表   多对一
     * @description
     * @author Winston
     * @date 2021/12/25 3:12
     **/
    public function auth_groups()
    {
        return $this-&gt;belongsTo('Modules\Admin\Models\AuthGroup','group_id','id');
    }
    /**
     * @name  关联平台项目表   多对一
     * @description
     * @author Winston
     * @date 2021/12/25 3:12
     **/
    public function auth_projects()
    {
        return $this-&gt;belongsTo('Modules\Admin\Models\AuthProject','project_id','id');
    }
    /**
     * @name 时间格式传唤
     * @description
     * @author Winston
     * @date 2021/12/25 16:15
     **/
    protected function serializeDate(DateTimeInterface $date)
    {
        return $date-&gt;format('Y-m-d H:i:s');
    }
}
7.创建token的Services
&lt;?php
/**
 * @Name 管理员信息服务
 * @Description
 * @Auther Winston
 * @Date 2021/12/25 17:10
 */
namespace Modules\Admin\Services\auth;
use Modules\Admin\Services\BaseApiService;
use Modules\Common\Exceptions\ApiException;
use Modules\Common\Exceptions\MessageData;
use Modules\Common\Exceptions\StatusData;
use Tymon\JWTAuth\Exceptions\TokenBlacklistedException;
use Tymon\JWTAuth\Facades\JWTAuth;

class TokenService extends BaseApiService
{
    /**
     * @name 设置token 生成机制
     * @description
     * @author Winston
     * @date 2021/12/25 17:23
     * @return JSON
     **/
    public function __construct()
    {
        \Config::set('auth.defaults.guard', 'auth_admin');
        \Config::set('jwt.ttl', 60);
    }
    /**
     * @name 设置token
     * @description
     * @author Winston
     * @date 2021/12/25 17:24
     * @param data  Array 用户信息
     * @param data.username String 账号
     * @param data.password String 密码$
     * @return JSON | Array
     **/
    public function setToken($data){
        if (! $token = JWTAuth::attempt($data)){
            $this-&gt;apiError('token生成失败');
        }
        return $this-&gt;respondWithToken($token);
    }
    /**
     * @name 刷新token
     * @description
     * @author Winston
     * @date 2021/12/25 17:48
     * @return JSON
     **/
    public function refreshToken()
    {
        try {
            $old_token = JWTAuth::getToken();
            $token = JWTAuth::refresh($old_token);
        }catch (TokenBlacklistedException $e) {
            // 这个时候是老的token被拉到黑名单了
            throw new ApiException(&#91;'status'=&gt;StatusData::TOKEN_ERROR_BLACK,'message'=&gt;MessageData::TOKEN_ERROR_BLACK]);
        }
        return $this-&gt;apiSuccess('', $this-&gt;respondWithToken($token));
    }
    /**
     * @name 管理员信息
     * @description
     * @author Winston
     * @date 2021/12/25 19:11
     * @return Array
     **/
    public function my():Object
    {
        return JWTAuth::parseToken()-&gt;touser();
    }
    /**
     * @name
     * @description
     * @author Winston
     * @date 2021/12/25 9:53
     * @method  GET
     * @param
     * @return JSON
     **/
    public function info()
    {
        $data = $this-&gt;my();
        return $this-&gt;apiSuccess('',&#91;'username'=&gt;$data&#91;'username']]);
    }
    /**
     * @name 退出登录
     * @description
     * @author Winston
     * @date 2021/12/25 19:12
     * @return JSON
     **/
    public function logout()
    {
        JWTAuth::parseToken()-&gt;invalidate();
        return $this-&gt;apiSuccess('退出成功！');
    }

    /**
     * @name 组合token数据
     * @description
     * @author Winston
     * @date 2021/12/25 17:47
     * @return Array
     **/
    protected function respondWithToken($token):Array
    {
        return &#91;
            'token' =&gt; $token,
            'token_type' =&gt; 'bearer',
            'expires_in' =&gt; JWTAuth::factory()-&gt;getTTL() * 60
        ];
    }
}
8.创建登录Services
&lt;?php
/**
 * @Name 用户登录服务
 * @Description
 * @Auther Winston
 * @Date 2021/12/25 16:50
 */
namespace Modules\Admin\Services\auth;
use Modules\Admin\Services\BaseApiService;
use Modules\Admin\Models\AuthAdmin as AuthAdminModel;
class LoginService extends BaseApiService
{
    /**
     * @name 用户登录
     * @description
     * @author Winston
     * @date 2021/12/25 16:53
     * @param data  Array 用户信息
     * @param data.username String 账号
     * @param data.password String 密码
     * @return JSON
     **/
    public function login(array $data){
        if (true == \Auth::guard('auth_admin')-&gt;attempt($data)) {
            $userInfo = AuthAdminModel::where(&#91;'username'=&gt;$data&#91;'username']])-&gt;select('id','username')-&gt;first();
            if($userInfo){
                $user_info = $userInfo-&gt;toArray();
                $user_info&#91;'password'] = $data&#91;'password'];
                $token = (new TokenService())-&gt;setToken($user_info);
                return $this-&gt;apiSuccess('登录成功！',$token);
            }
        }
        $this-&gt;apiError('账号或密码错误！');
    }
}
9.创建中间件
&lt;?php
// +----------------------------------------------------------------------
// | Name: 管理系统 &#91; 为了快速搭建软件应用而生的，希望能够帮助到大家提高开发效率。 ]
// +----------------------------------------------------------------------
// | Copyright: (c) 2020~2021 / All rights reserved.
// +----------------------------------------------------------------------
// | Licensed: 这是一个自由软件，允许对程序代码进行修改，但希望您留下原有的注释。
// +----------------------------------------------------------------------
// | Author: Winston &lt;liyouran@live.com&gt;
// +----------------------------------------------------------------------
// | Version: V1
// +----------------------------------------------------------------------

/**
 * @Name  后台权限验证中间件
 * @Description
 * @Auther Winston
 * @Date 2021/12/25 13:37
 */

namespace Modules\Admin\Http\Middleware;

use Closure;
use Modules\Admin\Services\log\OperationLogService;
use Modules\Common\Exceptions\ApiException;
use Illuminate\Http\Request;
use Modules\Common\Exceptions\MessageData;
use Modules\Common\Exceptions\StatusData;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Exceptions\TokenInvalidException;
use Tymon\JWTAuth\Exceptions\TokenBlacklistedException;
use JWTAuth;
use Modules\Admin\Models\Admin as AdminModel;
use Modules\Admin\Models\AuthGroup as AuthGroupModel;
use Modules\Admin\Models\AuthRule as AuthRuleModel;
class AdminApiAuth
{

    public function handle($request, Closure $next)
    {
        \Config::set('auth.defaults.guard', 'auth_admin');
        \Config::set('jwt.ttl', 60);
        $route_data = $request-&gt;route();
        $url = str_replace($route_data-&gt;getAction()&#91;'prefix'] . '/',"",$route_data-&gt;uri);
        $url_arr = &#91;'auth/login/login','auth/index/getMain','auth/index/refreshToken'];
        $api_key = $request-&gt;header('apikey');
        if($api_key != config('admin.api_key')){
            throw new ApiException(&#91;'status'=&gt;StatusData::TOKEN_ERROR_KEY,'message'=&gt;MessageData::TOKEN_ERROR_KEY]);
            return $next();
        }
        if(in_array($url,$url_arr)){
            return $next($request);
        }
        try {
            if (! $user = JWTAuth::parseToken()-&gt;authenticate()) {  //获取到用户数据，并赋值给$user   'msg' =&gt; '用户不存在'
                throw new ApiException(&#91;'status'=&gt;StatusData::TOKEN_ERROR_SET,'message'=&gt;MessageData::TOKEN_ERROR_SET]);
                return $next();
            }

        }catch (TokenBlacklistedException $e) {
            //token无效
            if(in_array($url,&#91;'auth/index/logout'])){
                return $next($request);
            }
            // 这个时候是老的token被拉到黑名单了
            throw new ApiException(&#91;'status'=&gt;StatusData::TOKEN_ERROR_BLACK,'message'=&gt;MessageData::TOKEN_ERROR_BLACK]);
            return $next();
        } catch (TokenExpiredException $e) {
            //token无效
            if(in_array($url,&#91;'auth/index/logout'])){
                return $next($request);
            }
            //token已过期
            throw new ApiException(&#91;'status'=&gt;StatusData::TOKEN_ERROR_EXPIRED,'message'=&gt;MessageData::TOKEN_ERROR_EXPIRED]);
            return $next();
        } catch (TokenInvalidException $e) {
            //token无效
            if(!in_array($url,&#91;'auth/index/refresh','auth/index/logout'])){
                throw new ApiException(&#91;'status'=&gt;StatusData::TOKEN_ERROR_JWT,'message'=&gt;MessageData::TOKEN_ERROR_JWT]);
            }
            return $next();
        } catch (JWTException $e) {
            //'缺少token'
            throw new ApiException(&#91;'status'=&gt;StatusData::TOKEN_ERROR_JTB,'message'=&gt;MessageData::TOKEN_ERROR_JTB]);
            return $next();
        }
        // 写入日志
        (new OperationLogService())-&gt;store($user&#91;'id']);
//        if(!in_array($url,&#91;'auth/index/refresh','auth/index/logout'])){
//            if($user&#91;'id'] != 1 &amp;&amp; $id = AuthRuleModel::where(&#91;'href'=&gt;$url])-&gt;value('id')){
//                $rules = AuthGroupModel::where(&#91;'id'=&gt;$user&#91;'group_id']])-&gt;value('rules');
//                if(!in_array($id,explode('|',$rules))){
//                    throw new ApiException(&#91;'code'=&gt;6781,'msg'=&gt;'您没有权限！']);
//                }
//            }
//        }
        return $next($request);
    }
}
10.laravel登陆模块Demo

<meta charset="utf-8">10.1.修改config/auth.php
增加guards、providers

    'guards' =&gt; &#91;
        'web' =&gt; &#91;
            'driver' =&gt; 'session',
            'provider' =&gt; 'users',
        ],

        'api' =&gt; &#91;
            'driver' =&gt; 'token',
            'provider' =&gt; 'users',
            'hash' =&gt; false,
        ],
        'auth_admin' =&gt; &#91;
            'driver' =&gt; 'jwt',
            'provider' =&gt; 'auth_admins'
        ]
    ],

    'providers' =&gt; &#91;
        'users' =&gt; &#91;
            'driver' =&gt; 'eloquent',
            'model' =&gt; App\Models\User::class,
        ],
        'auth_admins' =&gt; &#91;
            'driver' =&gt; 'eloquent',
            'model' =&gt; Modules\Admin\Models\AuthAdmin::class,
        ]
    ],

<meta charset="utf-8">10.2.增加中间件
\Modules\Admin\Http\Middleware\AdminApiAuth

<meta charset="utf-8">10.3.app\Http\Kernel.php $routeMiddleware中增加中间件
'AdminApiAuth'=&gt; \Modules\Admin\Http\Middleware\AdminApiAuth::class,

<meta charset="utf-8">10.4.Modules\Admin\Config\config.php 定义api_key

return &#91;
'name' =&gt; 'Admin',
'api_key'=&gt;'123456',
'update_pwd'=&gt;'123456',
];

10.5编写基础控制器
&lt;?php
// +----------------------------------------------------------------------
// | Name: 管理系统 &#91; 为了快速搭建软件应用而生的，希望能够帮助到大家提高开发效率。 ]
// +----------------------------------------------------------------------
// | Copyright: (c) 2021~2022 / All rights reserved.
// +----------------------------------------------------------------------
// | Licensed: 这是一个自由软件，允许对程序代码进行修改，但希望您留下原有的注释。
// +----------------------------------------------------------------------
// | Author: Winston &lt;liyouran@live.com&gt;
// +----------------------------------------------------------------------
// | Version: V1
// +----------------------------------------------------------------------

/**
 * @Name 当前模块控制器基类
 * @Description
 * @Auther Winston
 * @Date 2021/12/26 13:10
 */

namespace Modules\Admin\Http\Controllers\v1;


use Modules\Common\Controllers\BaseController;

class BaseApiController extends BaseController
{
    public function __construct(){
        parent::__construct();
    }
}


<meta charset="utf-8">10.6.编写登陆controller
&lt;?php
// +----------------------------------------------------------------------
// | Name: 管理系统 &#91; 为了快速搭建软件应用而生的，希望能够帮助到大家提高开发效率。 ]
// +----------------------------------------------------------------------
// | Copyright: (c) 2021~2022 / All rights reserved.
// +----------------------------------------------------------------------
// | Licensed: 这是一个自由软件，允许对程序代码进行修改，但希望您留下原有的注释。
// +----------------------------------------------------------------------
// | Author: Winston &lt;liyouran@live.com&gt;
// +----------------------------------------------------------------------
// | Version: V1
// +----------------------------------------------------------------------

/**
 * @Name 用户登录
 * @Description
 * @Auther Winston
 * @Date 2021/12/26 13:10
 */

namespace Modules\Admin\Http\Controllers\v1;


use Modules\Admin\Http\Requests\LoginRequest;
use Modules\Admin\Services\auth\LoginService;
class LoginController extends BaseApiController
{
    /**
     * @name 用户登录
     * @description
     * @author Winston
     * @date 2021/12/26 13:10
     * @method  POST
     * @param username String 账号
     * @param password String 密码
     * @return JSON
     **/
    public function login(LoginRequest $request)
    {
        return (new LoginService())-&gt;login($request-&gt;only(&#91;'username','password']));
    }
}

<meta charset="utf-8">10.7.编写登陆request
&lt;?php

namespace Modules\Admin\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class LoginRequest extends FormRequest
{
	/**
     * php artisan module:make-request LoginRequest AuthAdmin
     */


	 /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return &#91;
			'username' =&gt; 'required',
            'password'  =&gt; 'required'
        ];
    }
	public function messages(){
		return &#91;
			'username.required' =&gt; '请输入账号！',
			'password.required' =&gt; '请输入密码！',
		];
	}

}


<meta charset="utf-8">10.8.编写api路由
&lt;?php

use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::middleware('auth:api')-&gt;get('/admin', function (Request $request) {
    return $request-&gt;user();
});

Route::group(&#91;"prefix"=&gt;"v1/admin","middleware"=&gt;"AdminApiAuth"],function (){
    //登录
    Route::post('login/login', 'v1\LoginController@login');
});


<meta charset="utf-8">10.9.修改config/databases.php
增加表前缀：prefix =&gt; 'lv_',

<meta charset="utf-8">10.10.修改.env中数据库连接配置
DB_PORT:8889,
DB_DATABASES:laravel,
DB_USERNAME=root,
DB_PASSWORD=root,

<meta charset="utf-8">10.11.连接数据库，创建用户表及数据初始化
USE laravel;
DROP TABLE IF EXISTS `lv_auth_admins`;
CREATE TABLE `lv_auth_admins` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '管理员ID',
`name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '名称',
`phone` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '手机号',
`username` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '账号',
`password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码',
`group_id` int(11) DEFAULT NULL COMMENT '权限组ID',
`project_id` int(11) DEFAULT NULL COMMENT '项目ID',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态:0=禁用,1=启用',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `lv_auth_admins_username_unique` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='管理员表';

INSERT INTO `lv_auth_admins` VALUES (1,'','','admin','$2y$10$gddj.QV7l7OP3I2MpgM9COcCKCBM8SMPq.xe/JrqkOXY3DlnozTP.',1,1,1,'2021-12-26 14:56:02','2021-12-26 14:56:02');
INSERT INTO `lv_auth_admins` VALUES (2,'winston','','winston','$2y$10$NhdagpIFbxK2zAVFeCFEa.wUrtKv.2o4aG4ZZ5W3yYB9epkx/Xm9y',2,1,1,'2021-12-26 14:56:02','2021-12-26 14:56:02');

<meta charset="utf-8">10.12.php artisan l5-swagger:generate更新接口文档

<meta charset="utf-8">10.13.打开http://域名/api/documentation 查看文档及进行测试</code></pre>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-26-15.26.18.png"><img loading="lazy" decoding="async" width="2880" height="1660" src="/wp-content/uploads/2021/12/截屏2021-12-26-15.26.18.png" alt="" class="wp-image-8826" srcset="/wp-content/uploads/2021/12/截屏2021-12-26-15.26.18.png 2880w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.18-300x173.png 300w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.18-1024x590.png 1024w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.18-768x443.png 768w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.18-1536x885.png 1536w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.18-2048x1180.png 2048w" sizes="(max-width: 2880px) 100vw, 2880px" /></a></figure>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-26-15.26.46.png"><img loading="lazy" decoding="async" width="2880" height="1484" src="/wp-content/uploads/2021/12/截屏2021-12-26-15.26.46.png" alt="" class="wp-image-8827" srcset="/wp-content/uploads/2021/12/截屏2021-12-26-15.26.46.png 2880w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.46-300x155.png 300w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.46-1024x528.png 1024w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.46-768x396.png 768w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.46-1536x791.png 1536w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.46-2048x1055.png 2048w" sizes="(max-width: 2880px) 100vw, 2880px" /></a></figure>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-26-15.26.59.png"><img loading="lazy" decoding="async" width="2880" height="354" src="/wp-content/uploads/2021/12/截屏2021-12-26-15.26.59.png" alt="" class="wp-image-8828" srcset="/wp-content/uploads/2021/12/截屏2021-12-26-15.26.59.png 2880w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.59-300x37.png 300w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.59-1024x126.png 1024w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.59-768x94.png 768w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.59-1536x189.png 1536w, /wp-content/uploads/2021/12/截屏2021-12-26-15.26.59-2048x252.png 2048w" sizes="(max-width: 2880px) 100vw, 2880px" /></a></figure>



<p><strong>9.laravel使用redis</strong></p>



<p>首先确认服务器已经安装redis服务,php安装了redis扩展.<br>因为我们在laravel的项目中需要下载laravel的redis扩展</p>



<pre class="wp-block-code"><code>composer require predis/predis

1.打开config/database.php。在redis配置项中增加session的连接</code></pre>



<pre class="wp-block-code"><code>'session' =&gt; &#91;
            'host' =&gt; env('REDIS_HOST', '127.0.0.1'),
            'password' =&gt; env('REDIS_PASSWORD', null),
            'port' =&gt; env('REDIS_PORT', 6379),
            'database' =&gt; 10,
 ],
</code></pre>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-26-12.03.37.png"><img loading="lazy" decoding="async" width="2006" height="1348" src="/wp-content/uploads/2021/12/截屏2021-12-26-12.03.37.png" alt="" class="wp-image-8813" srcset="/wp-content/uploads/2021/12/截屏2021-12-26-12.03.37.png 2006w, /wp-content/uploads/2021/12/截屏2021-12-26-12.03.37-300x202.png 300w, /wp-content/uploads/2021/12/截屏2021-12-26-12.03.37-1024x688.png 1024w, /wp-content/uploads/2021/12/截屏2021-12-26-12.03.37-768x516.png 768w, /wp-content/uploads/2021/12/截屏2021-12-26-12.03.37-1536x1032.png 1536w" sizes="(max-width: 2006px) 100vw, 2006px" /></a><figcaption>2.打开config/session.php ,修改driver配置项,将默认的&#8217;file&#8217;改为&#8217;redis&#8217;；connection配置项填入第一步中配置的redis连接名&#8217;session&#8217;</figcaption></figure>



<pre class="wp-block-code"><code>'driver' =&gt; env('SESSION_DRIVER','redis'),
'connection' =&gt; 'session',
</code></pre>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-26-12.05.02.png"><img loading="lazy" decoding="async" width="932" height="152" src="/wp-content/uploads/2021/12/截屏2021-12-26-12.05.02.png" alt="" class="wp-image-8815" srcset="/wp-content/uploads/2021/12/截屏2021-12-26-12.05.02.png 932w, /wp-content/uploads/2021/12/截屏2021-12-26-12.05.02-300x49.png 300w, /wp-content/uploads/2021/12/截屏2021-12-26-12.05.02-768x125.png 768w" sizes="(max-width: 932px) 100vw, 932px" /></a></figure>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-26-12.05.12.png"><img loading="lazy" decoding="async" width="854" height="104" src="/wp-content/uploads/2021/12/截屏2021-12-26-12.05.12.png" alt="" class="wp-image-8816" srcset="/wp-content/uploads/2021/12/截屏2021-12-26-12.05.12.png 854w, /wp-content/uploads/2021/12/截屏2021-12-26-12.05.12-300x37.png 300w, /wp-content/uploads/2021/12/截屏2021-12-26-12.05.12-768x94.png 768w" sizes="(max-width: 854px) 100vw, 854px" /></a><figcaption>3.修改.env文件,使用redis存取sessoin</figcaption></figure>



<pre class="wp-block-code"><code>SESSION_DRIVER=redis
</code></pre>



<h1 class="wp-block-heading">phpstorm相关配置</h1>



<p>1.phpstorm设置ctrl+鼠标滚轮更改字体大小。</p>



<p>Flie-&gt;Settings-&gt;Editor-&gt;General</p>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-26-12.06.12.png"><img loading="lazy" decoding="async" width="1960" height="1410" src="/wp-content/uploads/2021/12/截屏2021-12-26-12.06.12.png" alt="" class="wp-image-8817" srcset="/wp-content/uploads/2021/12/截屏2021-12-26-12.06.12.png 1960w, /wp-content/uploads/2021/12/截屏2021-12-26-12.06.12-300x216.png 300w, /wp-content/uploads/2021/12/截屏2021-12-26-12.06.12-1024x737.png 1024w, /wp-content/uploads/2021/12/截屏2021-12-26-12.06.12-768x552.png 768w, /wp-content/uploads/2021/12/截屏2021-12-26-12.06.12-1536x1105.png 1536w" sizes="(max-width: 1960px) 100vw, 1960px" /></a></figure>



<p>Flie-&gt;Settings-&gt;File Encodings</p>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-26-12.07.19.png"><img loading="lazy" decoding="async" width="1952" height="1406" src="/wp-content/uploads/2021/12/截屏2021-12-26-12.07.19.png" alt="" class="wp-image-8818" srcset="/wp-content/uploads/2021/12/截屏2021-12-26-12.07.19.png 1952w, /wp-content/uploads/2021/12/截屏2021-12-26-12.07.19-300x216.png 300w, /wp-content/uploads/2021/12/截屏2021-12-26-12.07.19-1024x738.png 1024w, /wp-content/uploads/2021/12/截屏2021-12-26-12.07.19-768x553.png 768w, /wp-content/uploads/2021/12/截屏2021-12-26-12.07.19-1536x1106.png 1536w" sizes="(max-width: 1952px) 100vw, 1952px" /></a></figure>



<p>File-&gt;setting&#8211;&gt;Editor&#8211;&gt;File and Code Templates</p>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-26-12.08.59.png"><img loading="lazy" decoding="async" width="1950" height="1410" src="/wp-content/uploads/2021/12/截屏2021-12-26-12.08.59.png" alt="" class="wp-image-8819" srcset="/wp-content/uploads/2021/12/截屏2021-12-26-12.08.59.png 1950w, /wp-content/uploads/2021/12/截屏2021-12-26-12.08.59-300x217.png 300w, /wp-content/uploads/2021/12/截屏2021-12-26-12.08.59-1024x740.png 1024w, /wp-content/uploads/2021/12/截屏2021-12-26-12.08.59-768x555.png 768w, /wp-content/uploads/2021/12/截屏2021-12-26-12.08.59-1536x1111.png 1536w" sizes="(max-width: 1950px) 100vw, 1950px" /></a></figure>



<pre class="wp-block-code"><code><meta charset="utf-8">// +----------------------------------------------------------------------
// | Name: 管理系统 &#91; 为了快速搭建软件应用而生的，希望能够帮助到大家提高开发效率。 ]
// +----------------------------------------------------------------------
// | Copyright: (c) 2020~2021 / All rights reserved.
// +----------------------------------------------------------------------
// | Licensed: 这是一个自由软件，允许对程序代码进行修改，但希望您留下原有的注释。
// +----------------------------------------------------------------------
// | Author: Winston &lt;liyouran@live.com&gt;
// +----------------------------------------------------------------------
// | Version: V1
// +----------------------------------------------------------------------

/**
 * @Name   
 * @Description
 * @Auther Winston
 * @Date ${DATE} ${HOUR}:${MINUTE}
 */

4.设置方法注释。

File-&gt;setting--&gt;Editor--&gt;live Templates
点击右边加号添加一个Templates Group -&gt; 然后选中添加的Group再次点击加号添加Live Templates，之后点击Edit variables，配置variables。</code></pre>



<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2021/12/截屏2021-12-25-18.35.49.png"><img loading="lazy" decoding="async" width="2796" height="1652" src="/wp-content/uploads/2021/12/截屏2021-12-25-18.35.49.png" alt="" class="wp-image-8793" srcset="/wp-content/uploads/2021/12/截屏2021-12-25-18.35.49.png 2796w, /wp-content/uploads/2021/12/截屏2021-12-25-18.35.49-300x177.png 300w, /wp-content/uploads/2021/12/截屏2021-12-25-18.35.49-1024x605.png 1024w, /wp-content/uploads/2021/12/截屏2021-12-25-18.35.49-768x454.png 768w, /wp-content/uploads/2021/12/截屏2021-12-25-18.35.49-1536x908.png 1536w, /wp-content/uploads/2021/12/截屏2021-12-25-18.35.49-2048x1210.png 2048w" sizes="(max-width: 2796px) 100vw, 2796px" /></a></figure>



<pre class="wp-block-code"><code>/**
 * @Name 
 * @Author<meta charset="utf-8"> Winston
 * @Description 
 * @Date $date$ $time$ 
 * @Method  GET	
 * @Param 
 * @Return JSON
 **/</code></pre>



<h1 class="wp-block-heading">NUXT文档</h1>



<h2 class="wp-block-heading">nuxt安装</h2>



<p>确保安装了 npx（npx 在 NPM 版本 5.2.0 默认安装了）：</p>



<p>npx create-nuxt-app &lt;项目名&gt;<br>或者用 yarn ：</p>



<p>yarn create nuxt-app &lt;项目名&gt;<br>它会让你进行一些选择:</p>



<p>在集成的服务器端框架之间进行选择:<br>None (Nuxt 默认服务器)<br>Express<br>Koa<br>Hapi<br>Feathers<br>Micro<br>Fastify<br>Adonis(WIP)<br>选择您喜欢的 UI 框架:<br>None (无)<br>Bootstrap<br>Vuetify<br>Bulma<br>Tailwind<br>Element UI<br>Ant Design Vue<br>Buefy<br>iView<br>Tachyons<br>选择您喜欢的测试框架:<br>None (随意添加一个)<br>Jest<br>AVA<br>选择你想要的 Nuxt 模式 (UniversalorSPA)<br>添加axios module以轻松地将 HTTP 请求发送到您的应用程序中。<br>添加EsLint以在保存时代码规范和错误检查您的代码。<br>添加Prettier以在保存时格式化/美化您的代码。<br>当运行完时，它将安装所有依赖项，因此下一步是启动项目:</p>



<p>$ cd<br>$ npm run dev</p>



<p>应用现在运行在 http://localhost:3000/ 上运行。</p>



<p>注意：Nuxt.js 会监听pages目录中的文件更改，因此在添加新页面时无需重新启动应用程序。</p>



<p>了解模板项目的目录结构：目录结构。</p>



<p>从头开始新建项目<br>如果不使用 Nuxt.js 提供的 starter 模板，我们也可以从头开始新建一个 Nuxt.js 应用项目，过程非常简单，只需要1 个文件和 1 个目录。如下所示：</p>



<p>$ mkdir &lt;项目名&gt;<br>$ cd &lt;项目名&gt;</p>



<p><strong>提示:</strong>将&lt;项目名&gt;替换成为你想创建的实际项目名。</p>



<p>新建 package.json 文件<br>package.json文件用来设定如何运行nuxt：</p>



<p>{<br>&#8220;name&#8221;: &#8220;my-app&#8221;,<br>&#8220;scripts&#8221;: {<br>&#8220;dev&#8221;: &#8220;nuxt&#8221;<br>}<br>}</p>



<p>上面的配置使得我们可以通过运行npm run dev来运行nuxt。</p>



<p>安装nuxt<br>一旦package.json创建好， 可以通过以下 npm 命令将nuxt安装至项目中：</p>



<p>npm install &#8211;save nuxt</p>



<p>pages 目录<br>Nuxt.js 会依据pages目录中的所有*.vue文件生成应用的路由配置。</p>



<p>创建pages目录：</p>



<p>mkdir pages</p>



<p>创建我们的第一个页面pages/index.vue：</p>



<p><br>然后启动项目：</p>



<p>$ npm run dev</p>



<p></p>



<h2 class="wp-block-heading">nuxt的生命周期</h2>



<p>服务端生命周期<br>服务器初始化nuxtServerInit<br>创建store/index.js</p>



<p>export const actions = {<br>nuxtServerInit(store,context){<br>console.log(&#8216;nuxtServerInit&#8217;,store,context)<br>}<br>}<br>中间件运行middleware<br>在nuxt.config.js中定义中间件</p>



<p>router:{<br>middleware:&#8217;auth&#8217;<br>}<br>创建中间件文件middleware/auth.js</p>



<p>export default function({store,route,redirect,params,query,req,res}) {<br>console.log(&#8216;middleware&#8217;)<br>}<br>定义在layouts/default.vue中</p>



<p>export default{<br>// middleware:&#8217;auth&#8217; ,<br>middleware(){<br>console.log(&#8216;middleware&#8217;)<br>}<br>}<br>定义在pages/index.vue中</p>



<p>export default{<br>// middleware:&#8217;auth&#8217; ,<br>middleware(){<br>console.log(&#8216;middleware&#8217;)<br>}<br>}<br>验证参数validate</p>



<p>export default{<br>validate(context){<br>console.log(&#8216;validate&#8217;)<br>return true<br>}<br>}<br>异步数据处理asyncData、 fetch</p>



<p>export default{<br>asyncData(context){<br>console.log(&#8216;asyncData&#8217;)<br>return {<br>a:666<br>}<br>},<br>fetch(context){<br>console.log(&#8216;fetch&#8217;)<br>}<br>}<br>开始客户端渲染Render</p>



<p>Vue生命周期 SSR CSR<br>组件创建前beforeCreated</p>



<p>export default{<br>beforeCreated(){<br>console.log(&#8216;beforeCreated&#8217;)<br>}<br>}<br>组件创建后created</p>



<p>export default{<br>created(){<br>console.log(&#8216;created&#8217;)<br>}<br>}<br>运行在客户端<br>组件加载前 beforeMount<br>组件加载完毕 mounted<br>组件更新前 beforeUpdate<br>组件更新完毕 updated<br>组件卸载前 beforeDestroy<br>组件卸载后 destroyed</p>



<h2 class="wp-block-heading">nuxt安装element-ui</h2>



<p>1.安装element-ui<br>npm install element-ui &#8211;save &#8211;registry=https://registry.npm.taobao.org/<br>2.创建文件<br>在项目的根目录下的plugins下创建element-ui.js文件</p>



<p>import Vue from &#8220;vue&#8221;;<br>import ElementUI from &#8220;element-ui&#8221;<br>Vue.use(ElementUI)</p>



<p>import Button from &#8220;element-ui&#8221;<br>Vue.use(Button)<br>3.引入文件<br>在nuxt.config.js中修改如下：</p>



<p>// Global CSS: https://go.nuxtjs.dev/config-css<br>css: [ &#8220;element-ui/lib/theme-chalk/index.css&#8221;],</p>



<p>// Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins<br>plugins: [{ src: &#8220;~plugins/element-ui&#8221;,ssr:true,mode:&#8217;server&#8217;//client }],<br>build:{<br>transpile:[&#8216;/^element-ui/&#8217;]<br>}</p>



<h2 class="wp-block-heading">vue监听路由</h2>



<p>watch:{<br>$route:{<br>immediate:true,<br>handler(route){</p>



<pre class="wp-block-code"><code>      }
}</code></pre>



<p>}</p>



<h2 class="wp-block-heading">vue跳转页面</h2>



<p>this.$router.push()</p>



<h2 class="wp-block-heading">Nuxt安装scss(sass)</h2>



<p>1.安装需要用到的loader</p>



<pre class="wp-block-code"><code>npm install --save-dev node-sass@4.12.0 --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
npm install --save-dev sass-loader@7.1.0  --registry=https://registry.npm.taobao.org/
</code></pre>



<p>2.使用</p>



<pre class="wp-block-code"><code>&lt;style lang="scss"&gt;//注意!这里很关键,很多配置成了不编译就是漏了lang="scss"

   @import '../assets/css/index.scss';
   @import '../assets/css/base.scss';
   @import '../assets/css/common.scss';

&lt;/style&gt;
</code></pre>



<h2 class="wp-block-heading">nuxt数据交互</h2>



<p>1.nuxt做数据交互需要依靠&nbsp;<code>@nuxtjs/axios</code><code>@nuxtjs/proxy</code></p>



<pre class="wp-block-code"><code>npm install @nuxtjs/axios  --save --registry=https://registry.npm.taobao.org/
npm install @nuxtjs/proxy --save --registry=https://registry.npm.taobao.org/
</code></pre>



<p>2.在nuxt.config.js中进行配置</p>



<pre class="wp-block-code"><code>modules:&#91;
    '@nuxtjs/axios'
]
</code></pre>



<p>3.使用<code>axios</code></p>



<pre class="wp-block-code"><code>async asyncData({$axios}){
    const res = await $axios({url:'接口'})
}
</code></pre>



<p>4.处理跨域请求， 在nuxt.config.js中进行配置</p>



<pre class="wp-block-code"><code>        axios:{
                proxy:true,//  开启跨域行为
                prefix:'/api/v1/blogApi',  //配置基本的url地址 
          },
        
        proxy:{
                '/api':{
                target:'http://www.mileduo.com/',  //  代理转发的地址
                pathRewrite:{
                // '^/api':''                // 找到地址中的api并替换成空    
                       }
                }
        
          },
</code></pre>



<p>5.定义拦截器，修改nuxt.config.js</p>



<pre class="wp-block-code"><code>plugins:&#91;
    {
        src:'~/plugins/axios',
        'ssr':true     //  服务端渲染
    }
]
</code></pre>



<p>6.书写axios.js</p>



<pre class="wp-block-code"><code>export default function({$axios,redirect,route,store}){
    // 基本配置
    $axios.defaults.timeout = 1000
    $axios.defaults.validateStatus = (status)=&gt;{
            return status &gt;= 200 &amp;&amp; status &lt; 600
    }
    // 请求拦截
    $axios.onRequest(config=&gt;{
        config.headers.token = ''
        return config
    })
    // 相应拦截
    $axios.onResponse(res\=&gt;{
        returnres.data
    })
    // 错误处理
    $axios.onError(error\=&gt;{
        return error
    })
}
</code></pre>



<p>7.Promise返回值</p>



<pre class="wp-block-code"><code>return new Promise(resolve=&gt;{

    resolve(res.data)

})


</code></pre>



<h2 class="wp-block-heading">nuxt中使用vuex</h2>



<p>1.定义</p>



<pre class="wp-block-code"><code>export const state = ()=&gt;({
    typeList : &#91;]
})
export const mutations = {
    SET_TYPE_LIST(state,typeList){
        state.typeList = typeList
    }
 }
export const actions = {
     UPDATE_TYPE_LIST({commit,state},typeList){
            commit('SET_TYPE_LIST',typeList)        
    }
}
export const getters = {
    getTypeList(state){
        return state.typeList
    }
}
</code></pre>



<p>2.使用</p>



<pre class="wp-block-code"><code>// 调用actions   异步请求
this.$store.dispatch('UPDATE_TYPE_LIST',&#91;])

// 调用mutations 
this.$store.commit('SET_TYPE_LIST',&#91;])
</code></pre>



<p>辅助函数</p>



<pre class="wp-block-code"><code> import {mapActions,mapGetters,mapState,mapMutations} from 'vuex'

methods:{
        getTypeList(){
            this.UPDATE_TYPE_LIST(&#91;])
            this.SET_TYPE_LIST(&#91;])
        },
    ...mapActions('user',&#91;'UPDATE_TYPE_LIST'])
    ...mapMutations('user',&#91;'SET_TYPE_LIST'])
},
// 计算属性
computed:{
    ..mapGetters('模块名称，根模块可以不传',&#91;'getTypeList'])
     ..mapState('模块名称，根模块可以不传',&#91;'typeList '])
}
</code></pre>



<h2 class="wp-block-heading">nuxt的token持久化存储</h2>



<p>1.安装cookie-nuiversal-nuxt</p>



<pre class="wp-block-code"><code>npm install cookie-nuiversal-nuxt --save  --registry=https://registry.npm.taobao.org/
</code></pre>



<p>2.配置nuxt.config.js</p>



<pre class="wp-block-code"><code>modules:&#91;
    'cookie-nuiversal-nuxt'
]
</code></pre>



<p>.3.使用</p>



<pre class="wp-block-code"><code>this.$cookies.set('user',&#91;])
this.$cookies.get('user')
this.$cookies.remove('user')
</code></pre>



<p>4.登录跳转</p>



<pre class="wp-block-code"><code>if(!this.$route.query.path || /login/reg/.test(this.$route.query.path)){
    this.$router.replace('/user')
}else{
    this.$router.replace(this.$route.query.path)
}
</code></pre>



<p>5.页面刷新初始化vuex</p>



<pre class="wp-block-code"><code>export const actions = {
    nuxtServerInit(store,{app:{$cookies}}){
        let user = $cookies.get('user')
        user = user?user:''
        store.commit('user/asdds')
    }
}
</code></pre>



<p>6.拦截器定义</p>



<pre class="wp-block-code"><code>$axios.onRequest(config=&gt;{
    config.headers.token = store.state.user.token 
})
</code></pre>



<h2 class="wp-block-heading">nuxt定义错误页面</h2>



<p>在layouts下创建error.vue页面，内容如下。</p>



<pre class="wp-block-code"><code>&lt;template&gt;
    &lt;div&gt;
        &lt;h1 v-if="error.statusCode"&gt;{{error.message}}&lt;/h1&gt;
        &lt;h1 v-else&gt;应用异常&lt;/h1&gt;
        &lt;el-button @click="$router.replace('/')"&gt;返回首页&lt;/el-button&gt;
    &lt;/div&gt;
&lt;/template&gt;
&lt;script&gt;
    export default{
        props:&#91;'error']
    }
&lt;/script&gt;
</code></pre>



<h2 class="wp-block-heading">unxt路由跳转过度动画</h2>



<p>1.在/assert目录下建立一个page-transletion.css文件，里面包含过渡动画内容，内容如下：</p>



<pre class="wp-block-code"><code> .page-enter-active, .page-leave-active {
  transition: opacity  .5s;
  }
  .page-enter, .page-leave-active {
  opacity: 0;
  }
</code></pre>



<p>2.在nuxt.config.js中配置：</p>



<pre class="wp-block-code"><code>css: &#91;
'assets/page-transletion.css'
]</code></pre>



<h2 class="wp-block-heading">nuxt自定义loading</h2>



<p>1.修改配置</p>



<pre class="wp-block-code"><code>loading:{color:#399,height:'3px'}
</code></pre>



<pre class="wp-block-code"><code>loading:'~/components/Loading/index.vue'
</code></pre>



<p>2.编写loading组件</p>



<pre class="wp-block-code"><code>&lt;template lang="html"&gt;
  &lt;div class="loading-page" v-if="loading"&gt;
    &lt;p&gt;Loading...&lt;/p&gt;
  &lt;/div&gt;
&lt;/template&gt;

&lt;script&gt;
export default {
  data: () =&gt; ({
    loading: false
  }),
  methods: {
    start () {
      this.loading = true
    },
    finish () {
      this.loading = false
    }
  }
}
&lt;/script&gt;

&lt;style scoped&gt;
.loading-page {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(255, 255, 255, 0.8);
  text-align: center;
  padding-top: 200px;
  font-size: 30px;
  font-family: sans-serif;
}
&lt;/style&gt;</code></pre>



<h1 class="wp-block-heading">ZSH</h1>



<pre class="wp-block-code"><code>Last login: Sat Dec 25 13:15:03 on console
lee@MacBook-Pro ~ % composer create-project --prefer-dist laravel/laravel laraveldemo
Creating a "laravel/laravel" project at "./laraveldemo"
Installing laravel/laravel (v8.6.10)
  - Installing laravel/laravel (v8.6.10): Extracting archive
Created project in /Users/lee/laraveldemo
&gt; @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies
Lock file operations: 110 installs, 0 updates, 0 removals
  - Locking asm89/stack-cors (v2.0.3)
  - Locking brick/math (0.9.3)
  - Locking dflydev/dot-access-data (v3.0.1)
  - Locking doctrine/inflector (2.0.4)
  - Locking doctrine/instantiator (1.4.0)
  - Locking doctrine/lexer (1.2.1)
  - Locking dragonmantank/cron-expression (v3.1.0)
  - Locking egulias/email-validator (2.1.25)
  - Locking facade/flare-client-php (1.9.1)
  - Locking facade/ignition (2.17.3)
  - Locking facade/ignition-contracts (1.0.2)
  - Locking fakerphp/faker (v1.17.0)
  - Locking filp/whoops (2.14.4)
  - Locking fruitcake/laravel-cors (v2.0.4)
  - Locking graham-campbell/result-type (v1.0.4)
  - Locking guzzlehttp/guzzle (7.4.1)
  - Locking guzzlehttp/promises (1.5.1)
  - Locking guzzlehttp/psr7 (2.1.0)
  - Locking hamcrest/hamcrest-php (v2.0.1)
  - Locking laravel/framework (v8.77.1)
  - Locking laravel/sail (v1.12.12)
  - Locking laravel/sanctum (v2.13.0)
  - Locking laravel/serializable-closure (v1.0.5)
  - Locking laravel/tinker (v2.6.3)
  - Locking league/commonmark (2.1.0)
  - Locking league/config (v1.1.1)
  - Locking league/flysystem (1.1.9)
  - Locking league/mime-type-detection (1.9.0)
  - Locking mockery/mockery (1.4.4)
  - Locking monolog/monolog (2.3.5)
  - Locking myclabs/deep-copy (1.10.2)
  - Locking nesbot/carbon (2.55.2)
  - Locking nette/schema (v1.2.2)
  - Locking nette/utils (v3.2.6)
  - Locking nikic/php-parser (v4.13.2)
  - Locking nunomaduro/collision (v5.10.0)
  - Locking opis/closure (3.6.2)
  - Locking phar-io/manifest (2.0.3)
  - Locking phar-io/version (3.1.0)
  - Locking phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (5.3.0)
  - Locking phpdocumentor/type-resolver (1.5.1)
  - Locking phpoption/phpoption (1.8.1)
  - Locking phpspec/prophecy (v1.15.0)
  - Locking phpunit/php-code-coverage (9.2.10)
  - Locking phpunit/php-file-iterator (3.0.6)
  - Locking phpunit/php-invoker (3.1.1)
  - Locking phpunit/php-text-template (2.0.4)
  - Locking phpunit/php-timer (5.0.3)
  - Locking phpunit/phpunit (9.5.10)
  - Locking psr/container (1.1.2)
  - Locking psr/event-dispatcher (1.0.0)
  - Locking psr/http-client (1.0.1)
  - Locking psr/http-factory (1.0.1)
  - Locking psr/http-message (1.0.1)
  - Locking psr/log (2.0.0)
  - Locking psr/simple-cache (1.0.1)
  - Locking psy/psysh (v0.10.12)
  - Locking ralouphie/getallheaders (3.0.3)
  - Locking ramsey/collection (1.2.2)
  - Locking ramsey/uuid (4.2.3)
  - Locking sebastian/cli-parser (1.0.1)
  - Locking sebastian/code-unit (1.0.8)
  - Locking sebastian/code-unit-reverse-lookup (2.0.3)
  - Locking sebastian/comparator (4.0.6)
  - Locking sebastian/complexity (2.0.2)
  - Locking sebastian/diff (4.0.4)
  - Locking sebastian/environment (5.1.3)
  - Locking sebastian/exporter (4.0.4)
  - Locking sebastian/global-state (5.0.3)
  - Locking sebastian/lines-of-code (1.0.3)
  - Locking sebastian/object-enumerator (4.0.4)
  - Locking sebastian/object-reflector (2.0.4)
  - Locking sebastian/recursion-context (4.0.4)
  - Locking sebastian/resource-operations (3.0.3)
  - Locking sebastian/type (2.3.4)
  - Locking sebastian/version (3.0.2)
  - Locking swiftmailer/swiftmailer (v6.3.0)
  - Locking symfony/console (v5.4.1)
  - Locking symfony/css-selector (v6.0.1)
  - Locking symfony/deprecation-contracts (v3.0.0)
  - Locking symfony/error-handler (v5.4.1)
  - Locking symfony/event-dispatcher (v6.0.1)
  - Locking symfony/event-dispatcher-contracts (v3.0.0)
  - Locking symfony/finder (v5.4.0)
  - Locking symfony/http-foundation (v5.4.1)
  - Locking symfony/http-kernel (v5.4.1)
  - Locking symfony/mime (v5.4.0)
  - Locking symfony/polyfill-ctype (v1.23.0)
  - Locking symfony/polyfill-iconv (v1.23.0)
  - Locking symfony/polyfill-intl-grapheme (v1.23.1)
  - Locking symfony/polyfill-intl-idn (v1.23.0)
  - Locking symfony/polyfill-intl-normalizer (v1.23.0)
  - Locking symfony/polyfill-mbstring (v1.23.1)
  - Locking symfony/polyfill-php72 (v1.23.0)
  - Locking symfony/polyfill-php73 (v1.23.0)
  - Locking symfony/polyfill-php80 (v1.23.1)
  - Locking symfony/polyfill-php81 (v1.23.0)
  - Locking symfony/process (v5.4.0)
  - Locking symfony/routing (v5.4.0)
  - Locking symfony/service-contracts (v2.4.1)
  - Locking symfony/string (v6.0.1)
  - Locking symfony/translation (v6.0.1)
  - Locking symfony/translation-contracts (v3.0.0)
  - Locking symfony/var-dumper (v5.4.1)
  - Locking theseer/tokenizer (1.2.1)
  - Locking tijsverkoyen/css-to-inline-styles (2.2.4)
  - Locking vlucas/phpdotenv (v5.4.1)
  - Locking voku/portable-ascii (1.5.6)
  - Locking webmozart/assert (1.10.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 110 installs, 0 updates, 0 removals
  - Installing doctrine/inflector (2.0.4): Extracting archive
  - Installing doctrine/lexer (1.2.1): Extracting archive
  - Installing symfony/polyfill-ctype (v1.23.0): Extracting archive
  - Installing webmozart/assert (1.10.0): Extracting archive
  - Installing dragonmantank/cron-expression (v3.1.0): Extracting archive
  - Installing symfony/polyfill-php80 (v1.23.1): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.23.1): Extracting archive
  - Installing symfony/var-dumper (v5.4.1): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.23.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.23.1): Extracting archive
  - Installing symfony/string (v6.0.1): Extracting archive
  - Installing psr/container (1.1.2): Extracting archive
  - Installing symfony/service-contracts (v2.4.1): Extracting archive
  - Installing symfony/polyfill-php73 (v1.23.0): Extracting archive
  - Installing symfony/deprecation-contracts (v3.0.0): Extracting archive
  - Installing symfony/console (v5.4.1): Extracting archive
  - Installing psr/log (2.0.0): Extracting archive
  - Installing monolog/monolog (2.3.5): Extracting archive
  - Installing voku/portable-ascii (1.5.6): Extracting archive
  - Installing phpoption/phpoption (1.8.1): Extracting archive
  - Installing graham-campbell/result-type (v1.0.4): Extracting archive
  - Installing vlucas/phpdotenv (v5.4.1): Extracting archive
  - Installing symfony/css-selector (v6.0.1): Extracting archive
  - Installing tijsverkoyen/css-to-inline-styles (2.2.4): Extracting archive
  - Installing symfony/routing (v5.4.0): Extracting archive
  - Installing symfony/process (v5.4.0): Extracting archive
  - Installing symfony/polyfill-php72 (v1.23.0): Extracting archive
  - Installing symfony/polyfill-intl-idn (v1.23.0): Extracting archive
  - Installing symfony/mime (v5.4.0): Extracting archive
  - Installing symfony/http-foundation (v5.4.1): Extracting archive
  - Installing psr/event-dispatcher (1.0.0): Extracting archive
  - Installing symfony/event-dispatcher-contracts (v3.0.0): Extracting archive
  - Installing symfony/event-dispatcher (v6.0.1): Extracting archive
  - Installing symfony/error-handler (v5.4.1): Extracting archive
  - Installing symfony/http-kernel (v5.4.1): Extracting archive
  - Installing symfony/finder (v5.4.0): Extracting archive
  - Installing symfony/polyfill-iconv (v1.23.0): Extracting archive
  - Installing egulias/email-validator (2.1.25): Extracting archive
  - Installing swiftmailer/swiftmailer (v6.3.0): Extracting archive
  - Installing symfony/polyfill-php81 (v1.23.0): Extracting archive
  - Installing ramsey/collection (1.2.2): Extracting archive
  - Installing brick/math (0.9.3): Extracting archive
  - Installing ramsey/uuid (4.2.3): Extracting archive
  - Installing psr/simple-cache (1.0.1): Extracting archive
  - Installing opis/closure (3.6.2): Extracting archive
  - Installing symfony/translation-contracts (v3.0.0): Extracting archive
  - Installing symfony/translation (v6.0.1): Extracting archive
  - Installing nesbot/carbon (2.55.2): Extracting archive
  - Installing league/mime-type-detection (1.9.0): Extracting archive
  - Installing league/flysystem (1.1.9): Extracting archive
  - Installing nette/utils (v3.2.6): Extracting archive
  - Installing nette/schema (v1.2.2): Extracting archive
  - Installing dflydev/dot-access-data (v3.0.1): Extracting archive
  - Installing league/config (v1.1.1): Extracting archive
  - Installing league/commonmark (2.1.0): Extracting archive
  - Installing laravel/serializable-closure (v1.0.5): Extracting archive
  - Installing laravel/framework (v8.77.1): Extracting archive
  - Installing facade/ignition-contracts (1.0.2): Extracting archive
  - Installing facade/flare-client-php (1.9.1): Extracting archive
  - Installing facade/ignition (2.17.3): Extracting archive
  - Installing fakerphp/faker (v1.17.0): Extracting archive
  - Installing asm89/stack-cors (v2.0.3): Extracting archive
  - Installing fruitcake/laravel-cors (v2.0.4): Extracting archive
  - Installing psr/http-message (1.0.1): Extracting archive
  - Installing psr/http-client (1.0.1): Extracting archive
  - Installing ralouphie/getallheaders (3.0.3): Extracting archive
  - Installing psr/http-factory (1.0.1): Extracting archive
  - Installing guzzlehttp/psr7 (2.1.0): Extracting archive
  - Installing guzzlehttp/promises (1.5.1): Extracting archive
  - Installing guzzlehttp/guzzle (7.4.1): Extracting archive
  - Installing laravel/sail (v1.12.12): Extracting archive
  - Installing laravel/sanctum (v2.13.0): Extracting archive
  - Installing nikic/php-parser (v4.13.2): Extracting archive
  - Installing psy/psysh (v0.10.12): Extracting archive
  - Installing laravel/tinker (v2.6.3): Extracting archive
  - Installing hamcrest/hamcrest-php (v2.0.1): Extracting archive
  - Installing mockery/mockery (1.4.4): Extracting archive
  - Installing filp/whoops (2.14.4): Extracting archive
  - Installing nunomaduro/collision (v5.10.0): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing phpdocumentor/type-resolver (1.5.1): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.3.0): Extracting archive
  - Installing sebastian/version (3.0.2): Extracting archive
  - Installing sebastian/type (2.3.4): Extracting archive
  - Installing sebastian/resource-operations (3.0.3): Extracting archive
  - Installing sebastian/recursion-context (4.0.4): Extracting archive
  - Installing sebastian/object-reflector (2.0.4): Extracting archive
  - Installing sebastian/object-enumerator (4.0.4): Extracting archive
  - Installing sebastian/global-state (5.0.3): Extracting archive
  - Installing sebastian/exporter (4.0.4): Extracting archive
  - Installing sebastian/environment (5.1.3): Extracting archive
  - Installing sebastian/diff (4.0.4): Extracting archive
  - Installing sebastian/comparator (4.0.6): Extracting archive
  - Installing sebastian/code-unit (1.0.8): Extracting archive
  - Installing sebastian/cli-parser (1.0.1): Extracting archive
  - Installing phpunit/php-timer (5.0.3): Extracting archive
  - Installing phpunit/php-text-template (2.0.4): Extracting archive
  - Installing phpunit/php-invoker (3.1.1): Extracting archive
  - Installing phpunit/php-file-iterator (3.0.6): Extracting archive
  - Installing theseer/tokenizer (1.2.1): Extracting archive
  - Installing sebastian/lines-of-code (1.0.3): Extracting archive
  - Installing sebastian/complexity (2.0.2): Extracting archive
  - Installing sebastian/code-unit-reverse-lookup (2.0.3): Extracting archive
  - Installing phpunit/php-code-coverage (9.2.10): Extracting archive
  - Installing doctrine/instantiator (1.4.0): Extracting archive
  - Installing phpspec/prophecy (v1.15.0): Extracting archive
  - Installing phar-io/version (3.1.0): Extracting archive
  - Installing phar-io/manifest (2.0.3): Extracting archive
  - Installing myclabs/deep-copy (1.10.2): Extracting archive
  - Installing phpunit/phpunit (9.5.10): Extracting archive
63 package suggestions were added by new dependencies, use `composer suggest` to see details.
Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead.
Generating optimized autoload files
&gt; Illuminate\Foundation\ComposerScripts::postAutoloadDump
&gt; @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/sanctum
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
77 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
&gt; @php artisan vendor:publish --tag=laravel-assets --ansi --force
No publishable resources for tag &#91;laravel-assets].
Publishing complete.
&gt; @php artisan key:generate --ansi
Application key set successfully.
lee@MacBook-Pro ~ % ls
Applications			Parallels
Desktop				Pictures
Documents			Public
Downloads			Sites
Library				Sunlogin Files
Movies				Virtual Machines.localized
Music				laraveldemo
OneDrive			sensors
lee@MacBook-Pro ~ % mv laraveldemo ./Downloads 
lee@MacBook-Pro ~ % ll
zsh: command not found: ll
lee@MacBook-Pro ~ % ls
Applications			Parallels
Desktop				Pictures
Documents			Public
Downloads			Sites
Library				Sunlogin Files
Movies				Virtual Machines.localized
Music				sensors
OneDrive
lee@MacBook-Pro ~ % ls 
Applications			Parallels
Desktop				Pictures
Documents			Public
Downloads			Sites
Library				Sunlogin Files
Movies				Virtual Machines.localized
Music				sensors
OneDrive
lee@MacBook-Pro ~ % cd Sites 
lee@MacBook-Pro Sites % ls
laraveldemo	localhost
lee@MacBook-Pro Sites % cd laraveldemo 
lee@MacBook-Pro laraveldemo % composer require nwidart/laravel-modules
Using version ^8.2 for nwidart/laravel-modules
./composer.json has been updated
Running composer update nwidart/laravel-modules
Loading composer repositories with package information
https://repo.packagist.org/ could not be fully loaded (curl error 28 while downloading https://repo.packagist.org/packages.json: Operation timed out after 10000 milliseconds with 0 out of 0 bytes received), package information was loaded from the local cache and may be out of date
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking nwidart/laravel-modules (8.2.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing nwidart/laravel-modules (8.2.0): Extracting archive
Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead.
Generating optimized autoload files
&gt; Illuminate\Foundation\ComposerScripts::postAutoloadDump
&gt; @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/sanctum
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Discovered Package: nwidart/laravel-modules
Package manifest generated successfully.
78 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
&gt; @php artisan vendor:publish --tag=laravel-assets --ansi --force
No publishable resources for tag &#91;laravel-assets].
Publishing complete.
lee@MacBook-Pro laraveldemo % php artisan vendor:publish --provider="Nwidart\Modules\LaravelModulesServiceProvider"

Copied File &#91;/vendor/nwidart/laravel-modules/config/config.php] To &#91;/config/modules.php]
Publishing complete.
lee@MacBook-Pro laraveldemo % php artisan module:make Admin
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/module.json
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/Routes/web.php
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/Routes/api.php
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/Resources/views/index.blade.php
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/Resources/views/layouts/master.blade.php
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/Config/config.php
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/composer.json
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/Resources/assets/js/app.js
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/Resources/assets/sass/app.scss
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/webpack.mix.js
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/package.json
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/Database/Seeders/AdminDatabaseSeeder.php
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/Providers/AdminServiceProvider.php
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/Providers/RouteServiceProvider.php
Created : /Users/lee/Sites/laraveldemo/Modules/Admin/Http/Controllers/AdminController.php
Module &#91;Admin] created successfully.
lee@MacBook-Pro laraveldemo % composer dump-autoload
Generating optimized autoload files
&gt; Illuminate\Foundation\ComposerScripts::postAutoloadDump
&gt; @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/sanctum
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Discovered Package: nwidart/laravel-modules
Package manifest generated successfully.
Generated optimized autoload files containing 5099 classes
lee@MacBook-Pro laraveldemo % composer require "darkaonline/l5-swagger"
Using version ^8.0 for darkaonline/l5-swagger
./composer.json has been updated
Running composer update darkaonline/l5-swagger
Loading composer repositories with package information
Updating dependencies
Lock file operations: 6 installs, 0 updates, 0 removals
  - Locking darkaonline/l5-swagger (8.0.9)
  - Locking doctrine/annotations (1.13.2)
  - Locking psr/cache (3.0.0)
  - Locking swagger-api/swagger-ui (v3.52.5)
  - Locking symfony/yaml (v5.4.0)
  - Locking zircote/swagger-php (3.3.3)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 6 installs, 0 updates, 0 removals
  - Installing symfony/yaml (v5.4.0): Extracting archive
  - Installing psr/cache (3.0.0): Extracting archive
  - Installing doctrine/annotations (1.13.2): Extracting archive
  - Installing zircote/swagger-php (3.3.3): Extracting archive
  - Installing swagger-api/swagger-ui (v3.52.5): Extracting archive
  - Installing darkaonline/l5-swagger (8.0.9): Extracting archive
Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead.
Generating optimized autoload files
&gt; Illuminate\Foundation\ComposerScripts::postAutoloadDump
&gt; @php artisan package:discover --ansi
Discovered Package: darkaonline/l5-swagger
Discovered Package: facade/ignition
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/sanctum
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Discovered Package: nwidart/laravel-modules
Package manifest generated successfully.
80 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
&gt; @php artisan vendor:publish --tag=laravel-assets --ansi --force
No publishable resources for tag &#91;laravel-assets].
Publishing complete.
lee@MacBook-Pro laraveldemo % php artisan vendor:publish --provider "L5Swagger\L5SwaggerServiceProvider"
Copied File &#91;/vendor/darkaonline/l5-swagger/config/l5-swagger.php] To &#91;/config/l5-swagger.php]
Copied Directory &#91;/vendor/darkaonline/l5-swagger/resources/views] To &#91;/resources/views/vendor/l5-swagger]
Publishing complete.
lee@MacBook-Pro laraveldemo % php artisan l5-swagger:generate

Regenerating docs default

   ErrorException 

  Required @OA\Info() not found

  at vendor/zircote/swagger-php/src/Logger.php:40
     36▕         $this-&gt;log = function ($entry, $type) {
     37▕             if ($entry instanceof Exception) {
     38▕                 $entry = $entry-&gt;getMessage();
     39▕             }
  ➜  40▕             trigger_error($entry, $type);
     41▕         };
     42▕     }
     43▕ 
     44▕     public static function getInstance(): Logger

      +27 vendor frames 
  28  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
lee@MacBook-Pro laraveldemo % php artisan l5-swagger:generate

Regenerating docs default

   ErrorException 

  Required @OA\Info() not found

  at vendor/zircote/swagger-php/src/Logger.php:40
     36▕         $this-&gt;log = function ($entry, $type) {
     37▕             if ($entry instanceof Exception) {
     38▕                 $entry = $entry-&gt;getMessage();
     39▕             }
  ➜  40▕             trigger_error($entry, $type);
     41▕         };
     42▕     }
     43▕ 
     44▕     public static function getInstance(): Logger

      +27 vendor frames 
  28  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
lee@MacBook-Pro laraveldemo % php artisan l5-swagger:generate

Regenerating docs default

   ErrorException 

  Required @OA\Info() not found

  at vendor/zircote/swagger-php/src/Logger.php:40
     36▕         $this-&gt;log = function ($entry, $type) {
     37▕             if ($entry instanceof Exception) {
     38▕                 $entry = $entry-&gt;getMessage();
     39▕             }
  ➜  40▕             trigger_error($entry, $type);
     41▕         };
     42▕     }
     43▕ 
     44▕     public static function getInstance(): Logger

      +27 vendor frames 
  28  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
lee@MacBook-Pro laraveldemo % php artisan l5-swagger:generate

Regenerating docs default

   ErrorException 

  Required @OA\PathItem() not found

  at vendor/zircote/swagger-php/src/Logger.php:40
     36▕         $this-&gt;log = function ($entry, $type) {
     37▕             if ($entry instanceof Exception) {
     38▕                 $entry = $entry-&gt;getMessage();
     39▕             }
  ➜  40▕             trigger_error($entry, $type);
     41▕         };
     42▕     }
     43▕ 
     44▕     public static function getInstance(): Logger

      +27 vendor frames 
  28  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
lee@MacBook-Pro laraveldemo % php artisan l5-swagger:generate

Regenerating docs default
lee@MacBook-Pro laraveldemo % php artisan l5-swagger:generate

Regenerating docs default
lee@MacBook-Pro laraveldemo % php artisan l5-swagger:generate

Regenerating docs default
lee@MacBook-Pro laraveldemo % php artisan l5-swagger:generate

Regenerating docs default
lee@MacBook-Pro laraveldemo % php artisan l5-swagger:generate

Regenerating docs default
lee@MacBook-Pro laraveldemo % php artisan l5-swagger:generate

Regenerating docs default
lee@MacBook-Pro laraveldemo % php artisan vendor:publish --provider="Nwidart\Modules\LaravelModulesServiceProvider"

Publishing complete.
lee@MacBook-Pro laraveldemo % php artisan l5-swagger:generate

Regenerating docs default
lee@MacBook-Pro laraveldemo % php artisan
Laravel Framework 8.77.1

Usage:
  command &#91;options] &#91;arguments]

Options:
  -h, --help            Display help for the given command. When no command is given display help for the list command
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi|--no-ansi  Force (or disable --no-ansi) ANSI output
  -n, --no-interaction  Do not ask any interactive question
      --env&#91;=ENV]       The environment the command should run under
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  clear-compiled              Remove the compiled class file
  completion                  Dump the shell completion script
  db                          Start a new database CLI session
  down                        Put the application into maintenance / demo mode
  env                         Display the current framework environment
  help                        Display help for a command
  inspire                     Display an inspiring quote
  list                        List commands
  migrate                     Run the database migrations
  optimize                    Cache the framework bootstrap files
  serve                       Serve the application on the PHP development server
  test                        Run the application tests
  tinker                      Interact with your application
  up                          Bring the application out of maintenance mode
 auth
  auth:clear-resets           Flush expired password reset tokens
 cache
  cache:clear                 Flush the application cache
  cache:forget                Remove an item from the cache
  cache:table                 Create a migration for the cache database table
 config
  config:cache                Create a cache file for faster configuration loading
  config:clear                Remove the configuration cache file
 db
  db:seed                     Seed the database with records
  db:wipe                     Drop all tables, views, and types
 event
  event:cache                 Discover and cache the application's events and listeners
  event:clear                 Clear all cached events and listeners
  event:generate              Generate the missing events and listeners based on registration
  event:list                  List the application's events and listeners
 key
  key:generate                Set the application key
 l5-swagger
  l5-swagger:generate         Regenerate docs
 make
  make:cast                   Create a new custom Eloquent cast class
  make:channel                Create a new channel class
  make:command                Create a new Artisan command
  make:component              Create a new view component class
  make:controller             Create a new controller class
  make:event                  Create a new event class
  make:exception              Create a new custom exception class
  make:factory                Create a new model factory
  make:job                    Create a new job class
  make:listener               Create a new event listener class
  make:mail                   Create a new email class
  make:middleware             Create a new middleware class
  make:migration              Create a new migration file
  make:model                  Create a new Eloquent model class
  make:notification           Create a new notification class
  make:observer               Create a new observer class
  make:policy                 Create a new policy class
  make:provider               Create a new service provider class
  make:request                Create a new form request class
  make:resource               Create a new resource
  make:rule                   Create a new validation rule
  make:seeder                 Create a new seeder class
  make:test                   Create a new test class
 migrate
  migrate:fresh               Drop all tables and re-run all migrations
  migrate:install             Create the migration repository
  migrate:refresh             Reset and re-run all migrations
  migrate:reset               Rollback all database migrations
  migrate:rollback            Rollback the last database migration
  migrate:status              Show the status of each migration
 model
  model:prune                 Prune models that are no longer needed
 module
  module:delete               Delete a module from the application
  module:disable              Disable the specified module.
  module:dump                 Dump-autoload the specified module or for all module.
  module:enable               Enable the specified module.
  module:install              Install the specified module by given package name (vendor/name).
  module:list                 Show list of all modules.
  module:make                 Create a new module.
  module:make-command         Generate new Artisan command for the specified module.
  module:make-controller      Generate new restful controller for the specified module.
  module:make-event           Create a new event class for the specified module
  module:make-factory         Create a new model factory for the specified module.
  module:make-job             Create a new job class for the specified module
  module:make-listener        Create a new event listener class for the specified module
  module:make-mail            Create a new email class for the specified module
  module:make-middleware      Create a new middleware class for the specified module.
  module:make-migration       Create a new migration for the specified module.
  module:make-model           Create a new model for the specified module.
  module:make-notification    Create a new notification class for the specified module.
  module:make-policy          Create a new policy class for the specified module.
  module:make-provider        Create a new service provider class for the specified module.
  module:make-request         Create a new form request class for the specified module.
  module:make-resource        Create a new resource class for the specified module.
  module:make-rule            Create a new validation rule for the specified module.
  module:make-seed            Generate new seeder for the specified module.
  module:make-test            Create a new test class for the specified module.
  module:migrate              Migrate the migrations from the specified module or from all modules.
  module:migrate-refresh      Rollback &amp; re-migrate the modules migrations.
  module:migrate-reset        Reset the modules migrations.
  module:migrate-rollback     Rollback the modules migrations.
  module:migrate-status       Status for all module migrations
  module:publish              Publish a module's assets to the application
  module:publish-config       Publish a module's config files to the application
  module:publish-migration    Publish a module's migrations to the application
  module:publish-translation  Publish a module's translations to the application
  module:route-provider       Create a new route service provider for the specified module.
  module:seed                 Run database seeder from the specified module or from all modules.
  module:setup                Setting up modules folders for first use.
  module:unuse                Forget the used module with module:use
  module:update               Update dependencies for the specified module or for all modules.
  module:use                  Use the specified module.
  module:v6:migrate           Migrate laravel-modules v5 modules statuses to v6.
 notifications
  notifications:table         Create a migration for the notifications table
 optimize
  optimize:clear              Remove the cached bootstrap files
 package
  package:discover            Rebuild the cached package manifest
 queue
  queue:batches-table         Create a migration for the batches database table
  queue:clear                 Delete all of the jobs from the specified queue
  queue:failed                List all of the failed queue jobs
  queue:failed-table          Create a migration for the failed queue jobs database table
  queue:flush                 Flush all of the failed queue jobs
  queue:forget                Delete a failed queue job
  queue:listen                Listen to a given queue
  queue:monitor               Monitor the size of the specified queues
  queue:prune-batches         Prune stale entries from the batches database
  queue:prune-failed          Prune stale entries from the failed jobs table
  queue:restart               Restart queue worker daemons after their current job
  queue:retry                 Retry a failed queue job
  queue:retry-batch           Retry the failed jobs for a batch
  queue:table                 Create a migration for the queue jobs database table
  queue:work                  Start processing jobs on the queue as a daemon
 route
  route:cache                 Create a route cache file for faster route registration
  route:clear                 Remove the route cache file
  route:list                  List all registered routes
 sail
  sail:install                Install Laravel Sail's default Docker Compose file
  sail:publish                Publish the Laravel Sail Docker files
 schedule
  schedule:list               List the scheduled commands
  schedule:run                Run the scheduled commands
  schedule:test               Run a scheduled command
  schedule:work               Start the schedule worker
 schema
  schema:dump                 Dump the given database schema
 session
  session:table               Create a migration for the session database table
 storage
  storage:link                Create the symbolic links configured for the application
 stub
  stub:publish                Publish all stubs that are available for customization
 vendor
  vendor:publish              Publish any publishable assets from vendor packages
 view
  view:cache                  Compile all of the application's Blade templates
  view:clear                  Clear all compiled view files
lee@MacBook-Pro laraveldemo % php artisan l5-swagger:generate

Regenerating docs default
lee@MacBook-Pro laraveldemo % php artisan l5-swagger:generate

Regenerating docs default
lee@MacBook-Pro laraveldemo % 
</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/laravel/8773.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Laravel框架（一）安装、Composer、目录结构、路由、模型、视图、控制器</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6202.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6202.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 16:19:00 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[安装]]></category>
		<category><![CDATA[控制器]]></category>
		<category><![CDATA[模型]]></category>
		<category><![CDATA[目录结构]]></category>
		<category><![CDATA[视图]]></category>
		<category><![CDATA[路由]]></category>
		<guid isPermaLink="false">/?p=6202</guid>

					<description><![CDATA[Laravel框架第1天 一、Laravel概述 1、Laravel框架简介 Laravel是一套简洁、优雅的 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>Laravel框架第1天</h1>
<h1>一、Laravel概述</h1>
<h2>1、Laravel框架简介</h2>
<ul>
<li>
    Laravel是一套简洁、优雅的PHP WEB开发框架（目前最流行的PHP框架，
  </li>
</ul>
<p>
  基于symfony开发）
</p>
<ul>
<li>
    具有富于表达性且简洁的语法。更加语意化
  </li>
<li>
    Laravel是易于理解且强大的，它提供了强大的工具用于开发大型、健壮的应用，如：
  </li>
</ul>
<p>
  验证、反向路由、会话技术、缓存、数据迁移、单元测试等等常用工具和功能
</p>
<h2>2、什么是Laravel</h2>
<p>
  就是用PHP写的框架
</p>
<h2>3、Laravel框架相对于其他框架优势</h2>
<p>
  强大路由（route）
</p>
<p>
  命令行工具（artisan）：加快项目开发（很多手动的工作都自动了）
</p>
<p>
  blade模版：可继承、渲染速度快、简化view开发和管理
</p>
<p>
  数据迁移（Migrations）: 管理数据库和版本控制
</p>
<p>
  单元测试（PHPUnit）：保证稳定性（便于发现问题，无论是需求更变还是代码本
</p>
<p>
  身的bug及代码重构）
</p>
<p>
  支持Composer：项目组件管理工具
</p>
<h1>二、Laravel的安装</h1>
<h2> 准备：PHP运行环境</h2>
<h3>a. 环境要求</h3>
<p><img loading="lazy" decoding="async" width="321" height="133" src="/wp-content/uploads/2018/05/word-image-5647.png" class="wp-image-6203" srcset="/wp-content/uploads/2018/05/word-image-5647.png 321w, /wp-content/uploads/2018/05/word-image-5647-300x124.png 300w" sizes="(max-width: 321px) 100vw, 321px" /></p>
<h3>b. 通过phpStudy搭建PHP运行环境</h3>
<p><img loading="lazy" decoding="async" width="557" height="339" src="/wp-content/uploads/2018/05/word-image-5648.png" class="wp-image-6204" srcset="/wp-content/uploads/2018/05/word-image-5648.png 557w, /wp-content/uploads/2018/05/word-image-5648-300x183.png 300w" sizes="(max-width: 557px) 100vw, 557px" /><br />
<img loading="lazy" decoding="async" width="290" height="125" src="/wp-content/uploads/2018/05/word-image-5649.png" class="wp-image-6205" /><br />
<img loading="lazy" decoding="async" width="395" height="346" src="/wp-content/uploads/2018/05/word-image-5650.png" class="wp-image-6206" srcset="/wp-content/uploads/2018/05/word-image-5650.png 395w, /wp-content/uploads/2018/05/word-image-5650-300x263.png 300w" sizes="(max-width: 395px) 100vw, 395px" /></p>
<h3>c. PHP相关配置（修改并保存）</h3>
<p><strong>1）切换PHP版本</strong>
</p>
<p><img loading="lazy" decoding="async" width="890" height="659" src="/wp-content/uploads/2018/05/word-image-5651.png" class="wp-image-6207" srcset="/wp-content/uploads/2018/05/word-image-5651.png 890w, /wp-content/uploads/2018/05/word-image-5651-300x222.png 300w, /wp-content/uploads/2018/05/word-image-5651-768x569.png 768w" sizes="(max-width: 890px) 100vw, 890px" /></p>
<p><strong>2）开启openssl、mbstring、pdo、fileinfo扩展</strong>
</p>
<p><img loading="lazy" decoding="async" width="1022" height="405" src="/wp-content/uploads/2018/05/word-image-5652.png" class="wp-image-6208" srcset="/wp-content/uploads/2018/05/word-image-5652.png 1022w, /wp-content/uploads/2018/05/word-image-5652-300x119.png 300w, /wp-content/uploads/2018/05/word-image-5652-768x304.png 768w" sizes="(max-width: 1022px) 100vw, 1022px" /><br />
<img loading="lazy" decoding="async" width="393" height="373" src="/wp-content/uploads/2018/05/word-image-5653.png" class="wp-image-6209" srcset="/wp-content/uploads/2018/05/word-image-5653.png 393w, /wp-content/uploads/2018/05/word-image-5653-300x285.png 300w" sizes="(max-width: 393px) 100vw, 393px" /></p>
<ol>
<li><strong>修改时区</strong>
</li>
</ol>
<p><img loading="lazy" decoding="async" width="417" height="214" src="/wp-content/uploads/2018/05/word-image-5654.png" class="wp-image-6210" srcset="/wp-content/uploads/2018/05/word-image-5654.png 417w, /wp-content/uploads/2018/05/word-image-5654-300x154.png 300w" sizes="(max-width: 417px) 100vw, 417px" /></p>
<ol>
<li><strong>验证</strong>
</li>
</ol>
<p><img loading="lazy" decoding="async" width="386" height="320" src="/wp-content/uploads/2018/05/word-image-5655.png" class="wp-image-6211" srcset="/wp-content/uploads/2018/05/word-image-5655.png 386w, /wp-content/uploads/2018/05/word-image-5655-300x249.png 300w" sizes="(max-width: 386px) 100vw, 386px" /><br />
<img loading="lazy" decoding="async" width="540" height="486" src="/wp-content/uploads/2018/05/word-image-5656.png" class="wp-image-6212" srcset="/wp-content/uploads/2018/05/word-image-5656.png 540w, /wp-content/uploads/2018/05/word-image-5656-300x270.png 300w" sizes="(max-width: 540px) 100vw, 540px" /><br />
<img loading="lazy" decoding="async" width="1081" height="216" src="/wp-content/uploads/2018/05/word-image-5657.png" class="wp-image-6213" srcset="/wp-content/uploads/2018/05/word-image-5657.png 1081w, /wp-content/uploads/2018/05/word-image-5657-300x60.png 300w, /wp-content/uploads/2018/05/word-image-5657-768x153.png 768w, /wp-content/uploads/2018/05/word-image-5657-1024x205.png 1024w" sizes="(max-width: 1081px) 100vw, 1081px" /><br />
<img loading="lazy" decoding="async" width="1086" height="289" src="/wp-content/uploads/2018/05/word-image-5658.png" class="wp-image-6214" srcset="/wp-content/uploads/2018/05/word-image-5658.png 1086w, /wp-content/uploads/2018/05/word-image-5658-300x80.png 300w, /wp-content/uploads/2018/05/word-image-5658-768x204.png 768w, /wp-content/uploads/2018/05/word-image-5658-1024x273.png 1024w" sizes="(max-width: 1086px) 100vw, 1086px" /><br />
<img loading="lazy" decoding="async" width="938" height="336" src="/wp-content/uploads/2018/05/word-image-5659.png" class="wp-image-6215" srcset="/wp-content/uploads/2018/05/word-image-5659.png 938w, /wp-content/uploads/2018/05/word-image-5659-300x107.png 300w, /wp-content/uploads/2018/05/word-image-5659-768x275.png 768w" sizes="(max-width: 938px) 100vw, 938px" /></p>
<h3>d. 设置PHP环境变量</h3>
<p><img loading="lazy" decoding="async" width="260" height="362" src="/wp-content/uploads/2018/05/word-image-5660.png" class="wp-image-6216" srcset="/wp-content/uploads/2018/05/word-image-5660.png 260w, /wp-content/uploads/2018/05/word-image-5660-215x300.png 215w" sizes="(max-width: 260px) 100vw, 260px" /><br />
<img loading="lazy" decoding="async" width="1267" height="711" src="/wp-content/uploads/2018/05/word-image-5661.png" class="wp-image-6217" srcset="/wp-content/uploads/2018/05/word-image-5661.png 1267w, /wp-content/uploads/2018/05/word-image-5661-300x168.png 300w, /wp-content/uploads/2018/05/word-image-5661-768x431.png 768w, /wp-content/uploads/2018/05/word-image-5661-1024x575.png 1024w" sizes="(max-width: 1267px) 100vw, 1267px" /></p>
<p>
  验证是否设置成功
</p>
<p><img loading="lazy" decoding="async" width="500" height="185" src="/wp-content/uploads/2018/05/word-image-5662.png" class="wp-image-6218" srcset="/wp-content/uploads/2018/05/word-image-5662.png 500w, /wp-content/uploads/2018/05/word-image-5662-300x111.png 300w" sizes="(max-width: 500px) 100vw, 500px" /></p>
<h3>e. 创建虚拟主机</h3>
<ol>
<li>
  修改C:\Windows\System32\drivers\etc\hosts文件
</li>
</ol>
<p><img loading="lazy" decoding="async" width="432" height="156" src="/wp-content/uploads/2018/05/word-image-5663.png" class="wp-image-6219" srcset="/wp-content/uploads/2018/05/word-image-5663.png 432w, /wp-content/uploads/2018/05/word-image-5663-300x108.png 300w" sizes="(max-width: 432px) 100vw, 432px" /></p>
<ol>
<li>
  创建文件e:\www\test.php文件
</li>
</ol>
<p><img loading="lazy" decoding="async" width="478" height="224" src="/wp-content/uploads/2018/05/word-image-5664.png" class="wp-image-6220" srcset="/wp-content/uploads/2018/05/word-image-5664.png 478w, /wp-content/uploads/2018/05/word-image-5664-300x141.png 300w" sizes="(max-width: 478px) 100vw, 478px" /></p>
<ol>
<li>
  新增虚拟主机
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1001" height="638" src="/wp-content/uploads/2018/05/word-image-5665.png" class="wp-image-6221" srcset="/wp-content/uploads/2018/05/word-image-5665.png 1001w, /wp-content/uploads/2018/05/word-image-5665-300x191.png 300w, /wp-content/uploads/2018/05/word-image-5665-768x489.png 768w" sizes="(max-width: 1001px) 100vw, 1001px" /></p>
<p>
  发现：直接输入网址不加具体访问的php文件名则显示403 Forbidden
</p>
<p>
  解决：
</p>
<p><img loading="lazy" decoding="async" width="1173" height="421" src="/wp-content/uploads/2018/05/word-image-5666.png" class="wp-image-6222" srcset="/wp-content/uploads/2018/05/word-image-5666.png 1173w, /wp-content/uploads/2018/05/word-image-5666-300x108.png 300w, /wp-content/uploads/2018/05/word-image-5666-768x276.png 768w, /wp-content/uploads/2018/05/word-image-5666-1024x368.png 1024w" sizes="(max-width: 1173px) 100vw, 1173px" /></p>
<h2>1、安装方式</h2>
<ul>
<li>
    方法1：直接下载源代码安装
  </li>
<li>
    方法2：通过composer安装
  </li>
</ul>
<h2>2、直接下载源代码安装【方法1】</h2>
<h3>步骤1：下载</h3>
<p>
  下载地址：<a href="http://laravelacademy.org/resources-download">http://laravelacademy.org/resources-download</a>
</p>
<p><img loading="lazy" decoding="async" width="121" height="126" src="/wp-content/uploads/2018/05/word-image-5667.png" class="wp-image-6223" /></p>
<h3>步骤2：解压到指定虚拟主机目录</h3>
<p><img loading="lazy" decoding="async" width="682" height="348" src="/wp-content/uploads/2018/05/word-image-5668.png" class="wp-image-6224" srcset="/wp-content/uploads/2018/05/word-image-5668.png 682w, /wp-content/uploads/2018/05/word-image-5668-300x153.png 300w" sizes="(max-width: 682px) 100vw, 682px" /></p>
<h3>步骤3：访问（注：入口文件在public目录下）</h3>
<p><img loading="lazy" decoding="async" width="533" height="396" src="/wp-content/uploads/2018/05/word-image-5669.png" class="wp-image-6225" srcset="/wp-content/uploads/2018/05/word-image-5669.png 533w, /wp-content/uploads/2018/05/word-image-5669-300x223.png 300w" sizes="(max-width: 533px) 100vw, 533px" /></p>
<h2>3、通过Composer安装Laravel【方法2】</h2>
<h3>1）什么是Composer</h3>
<p><img loading="lazy" decoding="async" width="233" height="272" src="/wp-content/uploads/2018/05/word-image-5670.png" class="wp-image-6226" /></p>
<ul>
<li>
    介绍：是 PHP 用来管理依赖（dependency）关系的工具。你可以在自己的项目中
  </li>
</ul>
<p>
  声明所依赖的外部工具库（libraries），Composer 会帮你安装这些依赖的库文件。
</p>
<ul>
<li>
    理解：
  </li>
<li>
    如果PHP是win操作系统，composer就是杀毒软件的软件管家
  </li>
<li>
    如果PHP是Linux操作系统，composer就是yum
  </li>
</ul>
<p>
  之前：项目中需要发送邮件、验证码等功能必须自己去网上下载整合到项目中
</p>
<p>
  现在：通过composer命令安装自动整合到项目中
</p>
<ul>
<li>
    总结：
  </li>
<li>
    Composer是为PHP准备的软件管家，项目所需工具库都可以通过Composer下载
  </li>
</ul>
<h3>2）下载Composer</h3>
<ul>
<li>
    官方网站：<a href="https://getcomposer.org/">https://getcomposer.org/</a>
  </li>
<li>
    中文网站：<a href="http://www.phpcomposer.com/">http://www.phpcomposer.com/</a>
  </li>
</ul>
<p><strong>【方法1】</strong>
</p>
<ul>
<li>
    下载composer-setup.exe文件安装
  </li>
<li>
    好处：傻瓜式、安装简单
  </li>
<li>
    坏处：容易报错、仅win操作系统使用
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="568" height="380" src="/wp-content/uploads/2018/05/word-image-5671.png" class="wp-image-6227" srcset="/wp-content/uploads/2018/05/word-image-5671.png 568w, /wp-content/uploads/2018/05/word-image-5671-300x201.png 300w" sizes="(max-width: 568px) 100vw, 568px" /></p>
<p><strong>【方法2】</strong>
</p>
<ul>
<li>
    下载composer.phar文件安装
  </li>
<li>
    好处：跨平台
  </li>
<li>
    坏处：渣渣上手难
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="678" height="313" src="/wp-content/uploads/2018/05/word-image-5672.png" class="wp-image-6228" srcset="/wp-content/uploads/2018/05/word-image-5672.png 678w, /wp-content/uploads/2018/05/word-image-5672-300x138.png 300w" sizes="(max-width: 678px) 100vw, 678px" /></p>
<h3>■ 方法1：通过composer-setup.exe安装</h3>
<p><strong>步骤1：双击</strong>
</p>
<p><img loading="lazy" decoding="async" width="425" height="144" src="/wp-content/uploads/2018/05/word-image-5673.png" class="wp-image-6229" srcset="/wp-content/uploads/2018/05/word-image-5673.png 425w, /wp-content/uploads/2018/05/word-image-5673-300x102.png 300w" sizes="(max-width: 425px) 100vw, 425px" /></p>
<p><strong>步骤2：安装（注：除下图选择php.exe其余直接下一步next）:</strong>
</p>
<p><img loading="lazy" decoding="async" width="553" height="271" src="/wp-content/uploads/2018/05/word-image-5674.png" class="wp-image-6230" srcset="/wp-content/uploads/2018/05/word-image-5674.png 553w, /wp-content/uploads/2018/05/word-image-5674-300x147.png 300w" sizes="(max-width: 553px) 100vw, 553px" /></p>
<p><strong>步骤3：检查是否安装成功（在DOS窗口输入 composer出现下图字样则安装成功）</strong>
</p>
<p><img loading="lazy" decoding="async" width="647" height="318" src="/wp-content/uploads/2018/05/word-image-5675.png" class="wp-image-6231" srcset="/wp-content/uploads/2018/05/word-image-5675.png 647w, /wp-content/uploads/2018/05/word-image-5675-300x147.png 300w" sizes="(max-width: 647px) 100vw, 647px" /></p>
<h3>■ 方法2：通过composer.phar文件安装</h3>
<p><strong>步骤1：该文件免安装所以可以直接使用</strong>
</p>
<p><strong>步骤2：检查是否安装成功（在DOS窗口输入 composer出现下图字样则安装成功）</strong>
</p>
<p><img loading="lazy" decoding="async" width="806" height="318" src="/wp-content/uploads/2018/05/word-image-5676.png" class="wp-image-6232" srcset="/wp-content/uploads/2018/05/word-image-5676.png 806w, /wp-content/uploads/2018/05/word-image-5676-300x118.png 300w, /wp-content/uploads/2018/05/word-image-5676-768x303.png 768w" sizes="(max-width: 806px) 100vw, 806px" /></p>
<h3>3）Composer命令</h3>
<ul>
<li>
    复杂：php composer.phar 指令
  </li>
<li>
    简化：composer 指令
  </li>
</ul>
<p>
  说明：后期大量使用composer命令，语法：【php composer.phar 指令】
</p>
<p>
  发现：每次重复敲【php composer.phar】太长
</p>
<p>
  解决：
</p>
<ol>
<li>
  将composer.phar放到www目录中然后输入DOS命令
</li>
</ol>
<p>
  【echo @php &#8220;%~dp0composer.phar&#8221; %*&gt;composer.bat】后发现www目录下新增了.bat文件将其加入环境变量即可
</p>
<p><img loading="lazy" decoding="async" width="722" height="190" src="/wp-content/uploads/2018/05/word-image-5677.png" class="wp-image-6233" srcset="/wp-content/uploads/2018/05/word-image-5677.png 722w, /wp-content/uploads/2018/05/word-image-5677-300x79.png 300w" sizes="(max-width: 722px) 100vw, 722px" /></p>
<p>
  2）将composer.bat将去环境变量
</p>
<p><img loading="lazy" decoding="async" width="1248" height="717" src="/wp-content/uploads/2018/05/word-image-5678.png" class="wp-image-6234" srcset="/wp-content/uploads/2018/05/word-image-5678.png 1248w, /wp-content/uploads/2018/05/word-image-5678-300x172.png 300w, /wp-content/uploads/2018/05/word-image-5678-768x441.png 768w, /wp-content/uploads/2018/05/word-image-5678-1024x588.png 1024w" sizes="(max-width: 1248px) 100vw, 1248px" /></p>
<p>
  3）验证
</p>
<p><img loading="lazy" decoding="async" width="464" height="255" src="/wp-content/uploads/2018/05/word-image-5679.png" class="wp-image-6235" srcset="/wp-content/uploads/2018/05/word-image-5679.png 464w, /wp-content/uploads/2018/05/word-image-5679-300x165.png 300w" sizes="(max-width: 464px) 100vw, 464px" /></p>
<h3>安装Laravel（后天详细讲解）</h3>
<p>
  步骤1：配置通过国内镜像下载
</p>
<p>
  composer config -g repo.packagist composer <a href="https://packagist.phpcomposer.com/">https://packagist.phpcomposer.com/</a>
</p>
<p>
  步骤2：通过Composer下载框架
</p>
<p>
  composer create-project laravel/laravel test_laravel
</p>
<p><img loading="lazy" decoding="async" width="1135" height="509" src="/wp-content/uploads/2018/05/word-image-5680.png" class="wp-image-6236" srcset="/wp-content/uploads/2018/05/word-image-5680.png 1135w, /wp-content/uploads/2018/05/word-image-5680-300x135.png 300w, /wp-content/uploads/2018/05/word-image-5680-768x344.png 768w, /wp-content/uploads/2018/05/word-image-5680-1024x459.png 1024w" sizes="(max-width: 1135px) 100vw, 1135px" /><br />
<img loading="lazy" decoding="async" width="777" height="518" src="/wp-content/uploads/2018/05/word-image-5681.png" class="wp-image-6237" srcset="/wp-content/uploads/2018/05/word-image-5681.png 777w, /wp-content/uploads/2018/05/word-image-5681-300x200.png 300w, /wp-content/uploads/2018/05/word-image-5681-768x512.png 768w" sizes="(max-width: 777px) 100vw, 777px" /></p>
<h1>三、Laravel目录结构分析</h1>
<h2>1、整体目录</h2>
<p><img loading="lazy" decoding="async" width="440" height="606" src="/wp-content/uploads/2018/05/word-image-5682.png" class="wp-image-6238" srcset="/wp-content/uploads/2018/05/word-image-5682.png 440w, /wp-content/uploads/2018/05/word-image-5682-218x300.png 218w" sizes="(max-width: 440px) 100vw, 440px" /></p>
<h2>2、app目录</h2>
<p><img loading="lazy" decoding="async" width="451" height="265" src="/wp-content/uploads/2018/05/word-image-5683.png" class="wp-image-6239" srcset="/wp-content/uploads/2018/05/word-image-5683.png 451w, /wp-content/uploads/2018/05/word-image-5683-300x176.png 300w" sizes="(max-width: 451px) 100vw, 451px" /></p>
<h2>3、Http目录</h2>
<p><img loading="lazy" decoding="async" width="551" height="493" src="/wp-content/uploads/2018/05/word-image-5684.png" class="wp-image-6240" srcset="/wp-content/uploads/2018/05/word-image-5684.png 551w, /wp-content/uploads/2018/05/word-image-5684-300x268.png 300w" sizes="(max-width: 551px) 100vw, 551px" /></p>
<h2>4、boostrap目录</h2>
<p><img loading="lazy" decoding="async" width="1004" height="489" src="/wp-content/uploads/2018/05/word-image-5685.png" class="wp-image-6241" srcset="/wp-content/uploads/2018/05/word-image-5685.png 1004w, /wp-content/uploads/2018/05/word-image-5685-300x146.png 300w, /wp-content/uploads/2018/05/word-image-5685-768x374.png 768w" sizes="(max-width: 1004px) 100vw, 1004px" /></p>
<h2>5、config目录</h2>
<p><img loading="lazy" decoding="async" width="432" height="452" src="/wp-content/uploads/2018/05/word-image-5686.png" class="wp-image-6242" srcset="/wp-content/uploads/2018/05/word-image-5686.png 432w, /wp-content/uploads/2018/05/word-image-5686-287x300.png 287w" sizes="(max-width: 432px) 100vw, 432px" /></p>
<h2>6、database目录</h2>
<p><img loading="lazy" decoding="async" width="403" height="276" src="/wp-content/uploads/2018/05/word-image-5687.png" class="wp-image-6243" srcset="/wp-content/uploads/2018/05/word-image-5687.png 403w, /wp-content/uploads/2018/05/word-image-5687-300x205.png 300w, /wp-content/uploads/2018/05/word-image-5687-220x150.png 220w" sizes="(max-width: 403px) 100vw, 403px" /></p>
<h2>7、public目录</h2>
<p><img loading="lazy" decoding="async" width="438" height="469" src="/wp-content/uploads/2018/05/word-image-5688.png" class="wp-image-6244" srcset="/wp-content/uploads/2018/05/word-image-5688.png 438w, /wp-content/uploads/2018/05/word-image-5688-280x300.png 280w" sizes="(max-width: 438px) 100vw, 438px" /></p>
<p>
  为什么public下比tp32安全
</p>
<p>
  为什么tp32每个目录下都要新建index.html文件
</p>
<h2>8、resource目录</h2>
<p><img loading="lazy" decoding="async" width="496" height="498" src="/wp-content/uploads/2018/05/word-image-5689.png" class="wp-image-6245" srcset="/wp-content/uploads/2018/05/word-image-5689.png 496w, /wp-content/uploads/2018/05/word-image-5689-150x150.png 150w, /wp-content/uploads/2018/05/word-image-5689-300x300.png 300w" sizes="(max-width: 496px) 100vw, 496px" /></p>
<h2>9、storage目录</h2>
<p><img loading="lazy" decoding="async" width="484" height="315" src="/wp-content/uploads/2018/05/word-image-5690.png" class="wp-image-6246" srcset="/wp-content/uploads/2018/05/word-image-5690.png 484w, /wp-content/uploads/2018/05/word-image-5690-300x195.png 300w" sizes="(max-width: 484px) 100vw, 484px" /></p>
<h2>10、vendor目录</h2>
<p><img loading="lazy" decoding="async" width="518" height="510" src="/wp-content/uploads/2018/05/word-image-5691.png" class="wp-image-6247" srcset="/wp-content/uploads/2018/05/word-image-5691.png 518w, /wp-content/uploads/2018/05/word-image-5691-300x295.png 300w" sizes="(max-width: 518px) 100vw, 518px" /></p>
<h2>11、.env文件</h2>
<p><img loading="lazy" decoding="async" width="992" height="643" src="/wp-content/uploads/2018/05/word-image-5692.png" class="wp-image-6248" srcset="/wp-content/uploads/2018/05/word-image-5692.png 992w, /wp-content/uploads/2018/05/word-image-5692-300x194.png 300w, /wp-content/uploads/2018/05/word-image-5692-768x498.png 768w" sizes="(max-width: 992px) 100vw, 992px" /></p>
<h1>︴思考：通过框架完成下属功能需要哪些知识点？</h1>
<h2>1、留言列表显示</h2>
<p><img loading="lazy" decoding="async" width="397" height="436" src="/wp-content/uploads/2018/05/word-image-5693.png" class="wp-image-6249" srcset="/wp-content/uploads/2018/05/word-image-5693.png 397w, /wp-content/uploads/2018/05/word-image-5693-273x300.png 273w" sizes="(max-width: 397px) 100vw, 397px" /></p>
<p>
  【展示视图】
</p>
<p>
  如何创建路由
</p>
<p>
  如何创建控制器
</p>
<p>
  如何创建视图
</p>
<p>
  【循环显示数据】
</p>
<p>
  控制器如何操作数据库
</p>
<p>
  视图如何循环
</p>
<h2>添加留言</h2>
<p><img loading="lazy" decoding="async" width="386" height="315" src="/wp-content/uploads/2018/05/word-image-5694.png" class="wp-image-6250" srcset="/wp-content/uploads/2018/05/word-image-5694.png 386w, /wp-content/uploads/2018/05/word-image-5694-300x245.png 300w" sizes="(max-width: 386px) 100vw, 386px" /></p>
<p>
  【页面显示】如何创建路由 -&gt; 如何创建控制器 -&gt; 如何创建添加表单视图
</p>
<p>
  【数据处理】如何接口提交的数据，如何保存到数据库
</p>
<h2>总结（新框架快速上手原则）</h2>
<p>
  如何创建路由
</p>
<p>
  如何创建控制器
</p>
<p>
  如何创建视图
</p>
<h1>四、Laravel框架中的控制器</h1>
<h2>1、控制器的存放目录</h2>
<p>
  app\Http\Controllers\平台名\控制器名Controller.php
</p>
<h2>控制器的命名规则</h2>
<p>
  规    则：大驼峰命名法（单词首字母大写）
</p>
<p>
  举个栗子：UserController.php 或 GoodsController.php
</p>
<h2>3、创建控制器</h2>
<h3>方法1：artisan命令创建 （使用代码生成器创建控制器）</h3>
<p>
  命令：php artisan make:controller 平台名\控制器名Controller
</p>
<p>
  说明：必须在项目根目录下执行，因为artisan在根目录下
</p>
<p><img loading="lazy" decoding="async" width="1129" height="659" src="/wp-content/uploads/2018/05/word-image-5695.png" class="wp-image-6251" srcset="/wp-content/uploads/2018/05/word-image-5695.png 1129w, /wp-content/uploads/2018/05/word-image-5695-300x175.png 300w, /wp-content/uploads/2018/05/word-image-5695-768x448.png 768w, /wp-content/uploads/2018/05/word-image-5695-1024x598.png 1024w" sizes="(max-width: 1129px) 100vw, 1129px" /></p>
<h3>方法2：手动创建</h3>
<p>
  直接复制已经创建的控制器即可
</p>
<p><img loading="lazy" decoding="async" width="875" height="378" src="/wp-content/uploads/2018/05/word-image-5696.png" class="wp-image-6252" srcset="/wp-content/uploads/2018/05/word-image-5696.png 875w, /wp-content/uploads/2018/05/word-image-5696-300x130.png 300w, /wp-content/uploads/2018/05/word-image-5696-768x332.png 768w" sizes="(max-width: 875px) 100vw, 875px" /></p>
<h1>路由1</h1>
<h2>准备：PHP闭包</h2>
<h3>1）JS闭包</h3>
<ul>
<li>
    概念：在JS中当一个函数执行时可以让其内部局部变量不受其他作用域影响，同
  </li>
</ul>
<p>
  时当前函数执行完毕后还可能让其内部变量常驻内存不销毁的运行机制被称为JavaScript的闭包。
</p>
<ul>
<li>
    定义：两个函数彼此嵌套，并返回内部函数
  </li>
</ul>
<p>
  function f1() {
</p>
<p>
  function f2() {
</p>
<p>
  }
</p>
<p>
  return f2;
</p>
<p>
  }
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
</p>
<p>
  var arr = new Array();
</p>
<p>
  for (var i = 1; i &lt; 3; i++) {
</p>
</p>
<p>
  	//arr[i] = function(i) {
</p>
<p>
  	//	alert(i);
</p>
<p>
  	//}
</p>
<p>
  	arr[i] = f1(i);
</p>
<p>
  }
</p>
<p>
  function f1(num) {
</p>
<p>
  	function f2() {
</p>
<p>
  		alert(num);
</p>
<p>
  	}
</p>
<p>
  	return f2;
</p>
<p>
  }
</p>
<h3>PHP闭包函数（php5.3+）</h3>
<p><img loading="lazy" decoding="async" width="747" height="175" src="/wp-content/uploads/2018/05/word-image-5697.png" class="wp-image-6253" srcset="/wp-content/uploads/2018/05/word-image-5697.png 747w, /wp-content/uploads/2018/05/word-image-5697-300x70.png 300w" sizes="(max-width: 747px) 100vw, 747px" /><br />
<img loading="lazy" decoding="async" width="958" height="471" src="/wp-content/uploads/2018/05/word-image-5698.png" class="wp-image-6254" srcset="/wp-content/uploads/2018/05/word-image-5698.png 958w, /wp-content/uploads/2018/05/word-image-5698-300x147.png 300w, /wp-content/uploads/2018/05/word-image-5698-768x378.png 768w" sizes="(max-width: 958px) 100vw, 958px" /></p>
<h2>1、路由的作用</h2>
<ul>
<li>
    概念：路由就是网址的参数
  </li>
<li>
    作用：将用户发送的HTTP请求，交给指定的控制器方法处理
  </li>
</ul>
<h2>2、路由配置文件</h2>
<p><img loading="lazy" decoding="async" width="886" height="387" src="/wp-content/uploads/2018/05/word-image-5699.png" class="wp-image-6255" srcset="/wp-content/uploads/2018/05/word-image-5699.png 886w, /wp-content/uploads/2018/05/word-image-5699-300x131.png 300w, /wp-content/uploads/2018/05/word-image-5699-768x335.png 768w" sizes="(max-width: 886px) 100vw, 886px" /></p>
<h2><a id="post-6202-_Toc487903151"></a>3、配置路由（routes\web.php）</h2>
<h3><a id="post-6202-_Toc487903152"></a>1、路由定义格式（语法）</h3>
<p>
  Route::HTTP请求方法（路径，闭包函数或者控制器方法）
</p>
<p>
  响应多个HTTP请求
</p>
<p>
  Route::match（[请求类型，请求类型&#8230;.], 路径，闭包函数或者控制器方法）
</p>
<p>
  响应任意HTTP请求
</p>
<p>
  Route::any（路径，闭包函数或者控制器方法）
</p>
<h3><a id="post-6202-_Toc487903153"></a>2、请求方式有哪些？</h3>
<p>
  可以是HTTP的8种请求类型之一，如：get、put、post、delete&#8230;等，常用get和post
</p>
<h3>︴练习</h3>
<ul>
<li>
    不同的请求响应
  </li>
<li>
    get请求，闭包函数响应
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1212" height="610" src="/wp-content/uploads/2018/05/word-image-5700.png" class="wp-image-6256" srcset="/wp-content/uploads/2018/05/word-image-5700.png 1212w, /wp-content/uploads/2018/05/word-image-5700-300x151.png 300w, /wp-content/uploads/2018/05/word-image-5700-768x387.png 768w, /wp-content/uploads/2018/05/word-image-5700-1024x515.png 1024w" sizes="(max-width: 1212px) 100vw, 1212px" /></p>
<ul>
<li>
    get请求，控制器响应
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1335" height="635" src="/wp-content/uploads/2018/05/word-image-5701.png" class="wp-image-6257" srcset="/wp-content/uploads/2018/05/word-image-5701.png 1335w, /wp-content/uploads/2018/05/word-image-5701-300x143.png 300w, /wp-content/uploads/2018/05/word-image-5701-768x365.png 768w, /wp-content/uploads/2018/05/word-image-5701-1024x487.png 1024w" sizes="(max-width: 1335px) 100vw, 1335px" /></p>
<ul>
<li>
    post请求，闭包函数响应（注：app\Http\Kernel.php注释VerifyCsrfToken）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1087" height="672" src="/wp-content/uploads/2018/05/word-image-5702.png" class="wp-image-6258" srcset="/wp-content/uploads/2018/05/word-image-5702.png 1087w, /wp-content/uploads/2018/05/word-image-5702-300x185.png 300w, /wp-content/uploads/2018/05/word-image-5702-768x475.png 768w, /wp-content/uploads/2018/05/word-image-5702-1024x633.png 1024w" sizes="(max-width: 1087px) 100vw, 1087px" /><br />
<img loading="lazy" decoding="async" width="1251" height="510" src="/wp-content/uploads/2018/05/word-image-5703.png" class="wp-image-6259" srcset="/wp-content/uploads/2018/05/word-image-5703.png 1251w, /wp-content/uploads/2018/05/word-image-5703-300x122.png 300w, /wp-content/uploads/2018/05/word-image-5703-768x313.png 768w, /wp-content/uploads/2018/05/word-image-5703-1024x417.png 1024w" sizes="(max-width: 1251px) 100vw, 1251px" /></p>
<ul>
<li>
    post请求，控制器响应
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1334" height="659" src="/wp-content/uploads/2018/05/word-image-5704.png" class="wp-image-6260" srcset="/wp-content/uploads/2018/05/word-image-5704.png 1334w, /wp-content/uploads/2018/05/word-image-5704-300x148.png 300w, /wp-content/uploads/2018/05/word-image-5704-768x379.png 768w, /wp-content/uploads/2018/05/word-image-5704-1024x506.png 1024w" sizes="(max-width: 1334px) 100vw, 1334px" /></p>
<ul>
<li>
    响应<strong>多个</strong>HTTP请求
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="622" height="159" src="/wp-content/uploads/2018/05/word-image-5705.png" class="wp-image-6261" srcset="/wp-content/uploads/2018/05/word-image-5705.png 622w, /wp-content/uploads/2018/05/word-image-5705-300x77.png 300w" sizes="(max-width: 622px) 100vw, 622px" /></p>
<ul>
<li>
    响应<strong>所有</strong>HTTP请求
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="477" height="176" src="/wp-content/uploads/2018/05/word-image-5706.png" class="wp-image-6262" srcset="/wp-content/uploads/2018/05/word-image-5706.png 477w, /wp-content/uploads/2018/05/word-image-5706-300x111.png 300w" sizes="(max-width: 477px) 100vw, 477px" /></p>
<h2>4、路由参数</h2>
<h3>1）语法</h3>
<p>
  Route::HTTP请求方式（路径/{参数}，闭包函数或控制器方法名）-&gt;where（参数名,正则表达式）
</p>
<p>
  多个参数： 路径/{参数}/{参数}   或者   路径/{参数}-{参数}/{参数}
</p>
<p>
  多个限制：-&gt;where（[参数=&gt;正则，&#8230;，参数n-&gt;正则n]）
</p>
<p>
  多学一招：{参数名？} 表示可以设置默认值
</p>
<h3>2）闭包函数操作参数</h3>
<ul>
<li>
    一个参数
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="663" height="213" src="/wp-content/uploads/2018/05/word-image-5707.png" class="wp-image-6263" srcset="/wp-content/uploads/2018/05/word-image-5707.png 663w, /wp-content/uploads/2018/05/word-image-5707-300x96.png 300w" sizes="(max-width: 663px) 100vw, 663px" /></p>
<p>
  #一个参数
</p>
<p>
  Route::get(&#8216;/test7/{id}&#8217;, function($id){
</p>
<p>
      echo $id;
</p>
<p>
  });
</p>
<ul>
<li>
    多个参数
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="793" height="236" src="/wp-content/uploads/2018/05/word-image-5708.png" class="wp-image-6264" srcset="/wp-content/uploads/2018/05/word-image-5708.png 793w, /wp-content/uploads/2018/05/word-image-5708-300x89.png 300w, /wp-content/uploads/2018/05/word-image-5708-768x229.png 768w" sizes="(max-width: 793px) 100vw, 793px" /></p>
<p>
  #多个参数
</p>
<p>
  Route::get(&#8216;/test7/{id}/{name}&#8217;, function($id, $name){
</p>
<p>
      echo $id . &#8216;__&#8217; . $name;
</p>
<p>
  });
</p>
<ul>
<li>
    默认参数
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="802" height="332" src="/wp-content/uploads/2018/05/word-image-5709.png" class="wp-image-6265" srcset="/wp-content/uploads/2018/05/word-image-5709.png 802w, /wp-content/uploads/2018/05/word-image-5709-300x124.png 300w, /wp-content/uploads/2018/05/word-image-5709-768x318.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></p>
<h3>3）控制器操作参数</h3>
<p><img loading="lazy" decoding="async" width="814" height="541" src="/wp-content/uploads/2018/05/word-image-5710.png" class="wp-image-6266" srcset="/wp-content/uploads/2018/05/word-image-5710.png 814w, /wp-content/uploads/2018/05/word-image-5710-300x199.png 300w, /wp-content/uploads/2018/05/word-image-5710-768x510.png 768w" sizes="(max-width: 814px) 100vw, 814px" /><br />
<img loading="lazy" decoding="async" width="1120" height="527" src="/wp-content/uploads/2018/05/word-image-5711.png" class="wp-image-6267" srcset="/wp-content/uploads/2018/05/word-image-5711.png 1120w, /wp-content/uploads/2018/05/word-image-5711-300x141.png 300w, /wp-content/uploads/2018/05/word-image-5711-768x361.png 768w, /wp-content/uploads/2018/05/word-image-5711-1024x482.png 1024w" sizes="(max-width: 1120px) 100vw, 1120px" /></p>
<h3>4）正则表达式限制参数</h3>
<ul>
<li>
    限制一个参数
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="544" height="152" src="/wp-content/uploads/2018/05/word-image-5712.png" class="wp-image-6268" srcset="/wp-content/uploads/2018/05/word-image-5712.png 544w, /wp-content/uploads/2018/05/word-image-5712-300x84.png 300w" sizes="(max-width: 544px) 100vw, 544px" /></p>
<ul>
<li>
    限制多个参数
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="751" height="252" src="/wp-content/uploads/2018/05/word-image-5713.png" class="wp-image-6269" srcset="/wp-content/uploads/2018/05/word-image-5713.png 751w, /wp-content/uploads/2018/05/word-image-5713-300x101.png 300w" sizes="(max-width: 751px) 100vw, 751px" /></p>
<h2>5、路由群组</h2>
<h3>1）概念</h3>
<p>
  多个路由之间共享路由属性，减少冗余。
</p>
<h3>语法</h3>
<p>
  Route::group（[属性名=&gt;属性值n,&#8230;,属性名=&gt;属性值n]，function（）{
</p>
<p>
       将其他路由放进来即可&#8230;.
</p>
<p>
  }）
</p>
<h3>3）案例</h3>
<p><img loading="lazy" decoding="async" width="1154" height="640" src="/wp-content/uploads/2018/05/word-image-5714.png" class="wp-image-6270" srcset="/wp-content/uploads/2018/05/word-image-5714.png 1154w, /wp-content/uploads/2018/05/word-image-5714-300x166.png 300w, /wp-content/uploads/2018/05/word-image-5714-768x426.png 768w, /wp-content/uploads/2018/05/word-image-5714-1024x568.png 1024w" sizes="(max-width: 1154px) 100vw, 1154px" /></p>
<p>
  #路由群组举个栗子（需求：完成用户增删改查）
</p>
<p>
  Route::group([&#8216;namespace&#8217;=&gt;&#8217;Admin&#8217;, &#8216;prefix&#8217; =&gt; &#8216;/user&#8217;], function(){
</p>
<p>
      #Route::get(&#8216;/user/index&#8217;, &#8216;Admin\UserController@index&#8217;);
</p>
<p>
      #Route::get(&#8216;/user/create&#8217;, &#8216;Admin\UserController@create&#8217;);
</p>
<p>
      #Route::get(&#8216;/user/delete/{id}&#8217;, &#8216;Admin\UserController@delete&#8217;);
</p>
<p>
      #Route::get(&#8216;/user/update&#8217;, &#8216;Admin\UserController@update&#8217;);
</p>
<p>
      Route::get(&#8216;index&#8217;, &#8216;UserController@index&#8217;);
</p>
<p>
      Route::get(&#8216;create&#8217;, &#8216;UserController@create&#8217;);
</p>
<p>
      Route::get(&#8216;delete/{id}&#8217;, &#8216;UserController@delete&#8217;);
</p>
<p>
      Route::get(&#8216;update&#8217;, &#8216;UserController@update&#8217;);
</p>
<p>
  });
</p>
<h2>6、路由别名</h2>
<p><img loading="lazy" decoding="async" width="863" height="621" src="/wp-content/uploads/2018/05/word-image-5715.png" class="wp-image-6271" srcset="/wp-content/uploads/2018/05/word-image-5715.png 863w, /wp-content/uploads/2018/05/word-image-5715-300x216.png 300w, /wp-content/uploads/2018/05/word-image-5715-768x553.png 768w" sizes="(max-width: 863px) 100vw, 863px" /></p>
<p>
  #路由别名：同MySQL需要别名因为名字太长或者不好记等情况
</p>
<p>
  //Route::get(&#8216;/jintainwofeichangkaixinsdfadsf&#8217;, function() {
</p>
<p>
  //    echo &#8216;test11&#8217;;
</p>
<p>
  //});
</p>
<p>
  Route::get(&#8216;/jintainwofeichangkaixinsdfadsf&#8217;, [
</p>
<p>
      &#8216;as&#8217; =&gt; &#8216;bieming&#8217;,
</p>
<p>
      &#8216;uses&#8217; =&gt; function() {
</p>
<p>
          echo &#8216;我们都不容易&#8217;;
</p>
<p>
      }
</p>
<p>
  ]);
</p>
<p>
  Route::get(&#8216;/test11&#8217;, function() {
</p>
<p>
  //    {{ U（&#8217;user/index&#8217;） }}
</p>
<p>
  //    {{ url(‘/jintainwofeichangkaixinsdfadsf’) }}
</p>
<p>
      echo route(&#8216;bieming&#8217;); //通过路由别名替换url方法，放到表单action属性中
</p>
<p>
  });
</p>
<h2>小总结</h2>
<ul>
<li>
    什么是路由：就是网址
  </li>
<li>
    路由作用：将用户的请求交给指定的控制器方法处理
  </li>
<li>
    路由在哪：routes\web.php
  </li>
<li>
    路由语法
  </li>
<li>
    基        本：Route::HTTP类型（路径，闭包函数或控制器方法）
  </li>
<li>
    响应指定请求：Route::match（[类型，..，类型]，路径，闭包函数或控制器方法）
  </li>
<li>
    响应多有请求：Route::any（路径，闭包函数或控制器方法）
  </li>
<li>
    路由参数语法
  </li>
<li>
    Route::HTTP类型（路径/{参数}，闭包函数或控制器方法）-&gt;where（参数，正则）
  </li>
</ul>
<p>
  多个参数：就是写多个{}
</p>
<p>
  多个限制：则where使用数组 [参数=&gt;正则, &#8230;, 参数n=&gt;正则n]
</p>
<ul>
<li>
    路由群组
  </li>
<li>
    概念：就是给多个路由设置相同的属性，减少冗余
  </li>
<li>
    语法
  </li>
</ul>
<p>
  Route::group（[&#8216;namespace&#8217; =&gt; &#8221;, &#8216;preifx&#8217;=&gt;&#8221;]， function（）{
</p>
<p>
       写其他路由&#8230;
</p>
<p>
  }）
</p>
<ul>
<li>
    路由别名
  </li>
<li>
    概念：就是路由名称太长，则写个别名，后期可以通过方法route获取别名的真实
  </li>
</ul>
<p>
  路由地址
</p>
<ul>
<li>
    语法
  </li>
</ul>
<p>
  Route::请求类型（路径，[
</p>
<p>
      ‘as’ =&gt; 别名,
</p>
<p>
      ‘uses’ =&gt;  闭包函数 或者 控制器方法
</p>
<p>
  ]）
</p>
<h1>视图1</h1>
<h2>控制器调用视图</h2>
<h3>1）语法</h3>
<ul>
<li>
    方法1：return‘字符串’
  </li>
<li>
    方法2：return view（视图文件，compact（变量名，&#8230;，变量名n））；
  </li>
</ul>
<p>
  return view加载视图会去resources/views下面找（ps. view所有名称统一小写）
</p>
<p>
  return view（&#8217;php12&#8217;）会优先找blade模板引擎
</p>
<p>
  如果需要调用resources/views/子目录中的文件则用“.”拼接
</p>
<h3>2）练习（调用视图）</h3>
<p>
  步骤1：
</p>
<p><img loading="lazy" decoding="async" width="1045" height="409" src="/wp-content/uploads/2018/05/word-image-5716.png" class="wp-image-6272" srcset="/wp-content/uploads/2018/05/word-image-5716.png 1045w, /wp-content/uploads/2018/05/word-image-5716-300x117.png 300w, /wp-content/uploads/2018/05/word-image-5716-768x301.png 768w, /wp-content/uploads/2018/05/word-image-5716-1024x401.png 1024w" sizes="(max-width: 1045px) 100vw, 1045px" /></p>
<p>
  步骤2：
</p>
<p><img loading="lazy" decoding="async" width="1048" height="656" src="/wp-content/uploads/2018/05/word-image-5717.png" class="wp-image-6273" srcset="/wp-content/uploads/2018/05/word-image-5717.png 1048w, /wp-content/uploads/2018/05/word-image-5717-300x188.png 300w, /wp-content/uploads/2018/05/word-image-5717-768x481.png 768w, /wp-content/uploads/2018/05/word-image-5717-1024x641.png 1024w" sizes="(max-width: 1048px) 100vw, 1048px" /><br />
<img loading="lazy" decoding="async" width="1255" height="534" src="/wp-content/uploads/2018/05/word-image-5718.png" class="wp-image-6274" srcset="/wp-content/uploads/2018/05/word-image-5718.png 1255w, /wp-content/uploads/2018/05/word-image-5718-300x128.png 300w, /wp-content/uploads/2018/05/word-image-5718-768x327.png 768w, /wp-content/uploads/2018/05/word-image-5718-1024x436.png 1024w" sizes="(max-width: 1255px) 100vw, 1255px" /></p>
<h2><a id="post-6202-_Toc487903182"></a>基本用法视图传参</h2>
<h3>认识compact函数</h3>
<ul>
<li>
    语法：compact（变量名，&#8230;.，变量名n）
  </li>
<li>
    作用：将多个变量组成数组
  </li>
<li>
    代码：
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="785" height="420" src="/wp-content/uploads/2018/05/word-image-5719.png" class="wp-image-6275" srcset="/wp-content/uploads/2018/05/word-image-5719.png 785w, /wp-content/uploads/2018/05/word-image-5719-300x161.png 300w, /wp-content/uploads/2018/05/word-image-5719-768x411.png 768w" sizes="(max-width: 785px) 100vw, 785px" /></p>
<p>
  &lt;?php
</p>
<p>
  $a = &#8216;h1&#8217;;
</p>
<p>
  $b = &#8216;h2&#8217;;
</p>
<p>
  $c = &#8216;hd&#8217;;
</p>
<p>
  $data = compact(&#8216;a&#8217;,&#8217;b&#8217;,&#8217;fasdfasd&#8217;);
</p>
<p>
  echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
  print_r($data);
</p>
<h3>2）数组方式</h3>
<p><img loading="lazy" decoding="async" width="1316" height="707" src="/wp-content/uploads/2018/05/word-image-5720.png" class="wp-image-6276" srcset="/wp-content/uploads/2018/05/word-image-5720.png 1316w, /wp-content/uploads/2018/05/word-image-5720-300x161.png 300w, /wp-content/uploads/2018/05/word-image-5720-768x413.png 768w, /wp-content/uploads/2018/05/word-image-5720-1024x550.png 1024w" sizes="(max-width: 1316px) 100vw, 1316px" /></p>
<h3>3）工作常用</h3>
<p><img loading="lazy" decoding="async" width="1306" height="712" src="/wp-content/uploads/2018/05/word-image-5721.png" class="wp-image-6277" srcset="/wp-content/uploads/2018/05/word-image-5721.png 1306w, /wp-content/uploads/2018/05/word-image-5721-300x164.png 300w, /wp-content/uploads/2018/05/word-image-5721-768x419.png 768w, /wp-content/uploads/2018/05/word-image-5721-1024x558.png 1024w" sizes="(max-width: 1306px) 100vw, 1306px" /></p>
<h2><a id="post-6202-_Toc487903184"></a>4、【★】blade模板</h2>
<h3>1）什么是blade模板</h3>
<ul>
<li>
    blade模板同smarty模板一样都是PHP模板引擎
  </li>
<li>
    blade模板是laravel自带模板引擎（推荐使用也可以使用原声php）
  </li>
</ul>
<p>
  问：什么是模板引擎
</p>
<p>
  答：就是用PHP写的一个类
</p>
<p>
  问：是个类就是模板引擎吗
</p>
<p>
  答：非也，具备将php代码和html代码分离类称之为模板引擎
</p>
<h3>2）blade模板标签</h3>
<ul>
<li>
    注释（同Smarty注释响应时不含注释内容）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="992" height="506" src="/wp-content/uploads/2018/05/word-image-5722.png" class="wp-image-6278" srcset="/wp-content/uploads/2018/05/word-image-5722.png 992w, /wp-content/uploads/2018/05/word-image-5722-300x153.png 300w, /wp-content/uploads/2018/05/word-image-5722-768x392.png 768w" sizes="(max-width: 992px) 100vw, 992px" /></p>
<ul>
<li>
    展示变量数据
  </li>
</ul>
<p>
  {{ $变量名 }}
</p>
<p><img loading="lazy" decoding="async" width="717" height="447" src="/wp-content/uploads/2018/05/word-image-5723.png" class="wp-image-6279" srcset="/wp-content/uploads/2018/05/word-image-5723.png 717w, /wp-content/uploads/2018/05/word-image-5723-300x187.png 300w" sizes="(max-width: 717px) 100vw, 717px" /></p>
<ul>
<li>
    循环
  </li>
</ul>
<p>
  @foreach（变量名 as  键=&gt;值）
</p>
<p>
  @endforeach
</p>
<p><img loading="lazy" decoding="async" width="701" height="427" src="/wp-content/uploads/2018/05/word-image-5724.png" class="wp-image-6280" srcset="/wp-content/uploads/2018/05/word-image-5724.png 701w, /wp-content/uploads/2018/05/word-image-5724-300x183.png 300w" sizes="(max-width: 701px) 100vw, 701px" /></p>
<ul>
<li>
    判断
  </li>
</ul>
<p>
  @if ()
</p>
<p>
  @else if ()
</p>
<p>
  @else
</p>
<p>
  @endif
</p>
<p><img loading="lazy" decoding="async" width="665" height="510" src="/wp-content/uploads/2018/05/word-image-5725.png" class="wp-image-6281" srcset="/wp-content/uploads/2018/05/word-image-5725.png 665w, /wp-content/uploads/2018/05/word-image-5725-300x230.png 300w" sizes="(max-width: 665px) 100vw, 665px" /></p>
<ul>
<li>
    指定原声PHP（少用）
  </li>
</ul>
<p>
  @php
</p>
<p>
  @endphp
</p>
<p><img loading="lazy" decoding="async" width="720" height="444" src="/wp-content/uploads/2018/05/word-image-5726.png" class="wp-image-6282" srcset="/wp-content/uploads/2018/05/word-image-5726.png 720w, /wp-content/uploads/2018/05/word-image-5726-300x185.png 300w" sizes="(max-width: 720px) 100vw, 720px" /></p>
<h1>获取请求输入</h1>
<h2>1、语法</h2>
<h3>1）方法1</h3>
<ul>
<li>
    步骤1：导入类【use Illuminate\Http\Request;】
  </li>
<li>
    步骤2：在控制器方法中声明使用，如
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="470" height="65" src="/wp-content/uploads/2018/05/word-image-5727.png" class="wp-image-6283" srcset="/wp-content/uploads/2018/05/word-image-5727.png 470w, /wp-content/uploads/2018/05/word-image-5727-300x41.png 300w" sizes="(max-width: 470px) 100vw, 470px" /></p>
<ul>
<li>
    步骤3：最后使用下属语法获取数据
  </li>
<li>
    $request-&gt;all（）										获取所有数据
  </li>
<li>
    $request-&gt;input（键 [,默认值]）					获取GET数据
  </li>
<li>
    $request-&gt;only（[参数名1，&#8230;，参数名n]）    获取指定数据
  </li>
<li>
    $request-&gt;except（[参数名1，&#8230;，参数名n]）   获取指定数据外的所有数据
  </li>
<li>
    查看更多：<a href="http://laravelacademy.org/post/6750.html#toc_4">http://laravelacademy.org/post/6750.html#toc_4</a>
  </li>
</ul>
<h3>方法2</h3>
<ul>
<li>
    步骤1：导入类【Illuminate\Support\Facades\Input;】
  </li>
<li>
    步骤2：最后使用下属语法获取数据
  </li>
<li>
    Input::all（）										获取所有数据
  </li>
<li>
    Input::get（参数名[，默认值]）  				获取单个数据
  </li>
<li>
    Input::only（[键1，&#8230;，键n]）   				获取指定数据
  </li>
<li>
    Input::except（[键1，&#8230;，键n]） 				获取指定数据外的所有数据
  </li>
</ul>
<h2>2、练习</h2>
<p>
  步骤1：定义路由
</p>
<p><img loading="lazy" decoding="async" width="1156" height="361" src="/wp-content/uploads/2018/05/word-image-5728.png" class="wp-image-6284" srcset="/wp-content/uploads/2018/05/word-image-5728.png 1156w, /wp-content/uploads/2018/05/word-image-5728-300x94.png 300w, /wp-content/uploads/2018/05/word-image-5728-768x240.png 768w, /wp-content/uploads/2018/05/word-image-5728-1024x320.png 1024w" sizes="(max-width: 1156px) 100vw, 1156px" /></p>
<p>
  步骤2：创建控制器方法
</p>
<p><img loading="lazy" decoding="async" width="1319" height="536" src="/wp-content/uploads/2018/05/word-image-5729.png" class="wp-image-6285" srcset="/wp-content/uploads/2018/05/word-image-5729.png 1319w, /wp-content/uploads/2018/05/word-image-5729-300x122.png 300w, /wp-content/uploads/2018/05/word-image-5729-768x312.png 768w, /wp-content/uploads/2018/05/word-image-5729-1024x416.png 1024w" sizes="(max-width: 1319px) 100vw, 1319px" /></p>
<p>
  步骤3:创建视图
</p>
<p><img loading="lazy" decoding="async" width="1196" height="617" src="/wp-content/uploads/2018/05/word-image-5730.png" class="wp-image-6286" srcset="/wp-content/uploads/2018/05/word-image-5730.png 1196w, /wp-content/uploads/2018/05/word-image-5730-300x155.png 300w, /wp-content/uploads/2018/05/word-image-5730-768x396.png 768w, /wp-content/uploads/2018/05/word-image-5730-1024x528.png 1024w" sizes="(max-width: 1196px) 100vw, 1196px" /></p>
<h1>八、留言板功能</h1>
<h2>︴准备（数据库初体验，明天详细讲）</h2>
<ul>
<li>
    语法
  </li>
</ul>
<p>
  查询所有数据语法：DB::table（表名）-&gt;get（）
</p>
<p>
  插入数据语法：DB::table（表名）-&gt;insert（关联数组）
</p>
<ul>
<li>
    练习
  </li>
</ul>
<p>
  步骤1：创建数据库和留言表并插入数据
</p>
<p>
  create database laravel54;
</p>
<p>
  use laravel54;
</p>
<p>
  #标准写法
</p>
<p>
  &#8212; create table msg (
</p>
<p>
  &#8212; id int primary key auto_increment comment &#8216;编号&#8217;,
</p>
<p>
  &#8212; uname varchar(45) not null comment &#8216;用户名&#8217;,
</p>
<p>
  &#8212; content text not null comment &#8216;内容&#8217;,
</p>
<p>
  &#8212; created_at int not null default 0 comment &#8216;创建于&#8217;,
</p>
<p>
  &#8212; updated_at int not null default 0 comment &#8216;更新于&#8217;
</p>
<p>
  &#8212; )engine=myisam charset=utf8;
</p>
<p>
  #为铺垫后面课程修改
</p>
<p>
  create table msg (
</p>
<p>
  id int primary key auto_increment comment &#8216;编号&#8217;,
</p>
<p>
  uname varchar(45) comment &#8216;用户名&#8217;,
</p>
<p>
  content text comment &#8216;内容&#8217;,
</p>
<p>
  created_at int not null default 0 comment &#8216;创建于&#8217;,
</p>
<p>
  updated_at int not null default 0 comment &#8216;更新于&#8217;
</p>
<p>
  )engine=myisam charset=utf8;
</p>
<p>
  insert into msg values
</p>
<p>
  (null,&#8217;a&#8217;,&#8217;aaaa&#8217;,0,0),
</p>
<p>
  (null,&#8217;a&#8217;,&#8217;aaaa&#8217;,0,0),
</p>
<p>
  (null,&#8217;a&#8217;,&#8217;aaaa&#8217;,0,0);
</p>
<p>
  步骤2：修改laravel数据库配置文件
</p>
<p><img loading="lazy" decoding="async" width="678" height="509" src="/wp-content/uploads/2018/05/word-image-5731.png" class="wp-image-6287" srcset="/wp-content/uploads/2018/05/word-image-5731.png 678w, /wp-content/uploads/2018/05/word-image-5731-300x225.png 300w" sizes="(max-width: 678px) 100vw, 678px" /></p>
<h2>1、留言列表</h2>
<h3>1）思路</h3>
<ul>
<li>
    步骤1：定义路由访问列表页（Admin\MsgController@index）
  </li>
<li>
    步骤2：创建控制器MsgController和方法index 并且调用视图
  </li>
<li>
    步骤3：调用视图
  </li>
<li>
    步骤4：获取数据并循环显示
  </li>
</ul>
<h3>2）代码</h3>
<ul>
<li>
    步骤1：定义路由访问列表页（Admin\MsgController@index）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1033" height="425" src="/wp-content/uploads/2018/05/word-image-5732.png" class="wp-image-6288" srcset="/wp-content/uploads/2018/05/word-image-5732.png 1033w, /wp-content/uploads/2018/05/word-image-5732-300x123.png 300w, /wp-content/uploads/2018/05/word-image-5732-768x316.png 768w, /wp-content/uploads/2018/05/word-image-5732-1024x421.png 1024w" sizes="(max-width: 1033px) 100vw, 1033px" /></p>
<ul>
<li>
    步骤2：创建控制器MsgController和方法index 并且调用视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1027" height="638" src="/wp-content/uploads/2018/05/word-image-5733.png" class="wp-image-6289" srcset="/wp-content/uploads/2018/05/word-image-5733.png 1027w, /wp-content/uploads/2018/05/word-image-5733-300x186.png 300w, /wp-content/uploads/2018/05/word-image-5733-768x477.png 768w, /wp-content/uploads/2018/05/word-image-5733-1024x636.png 1024w" sizes="(max-width: 1027px) 100vw, 1027px" /></p>
<ul>
<li>
    步骤3：调用视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1189" height="721" src="/wp-content/uploads/2018/05/word-image-5734.png" class="wp-image-6290" srcset="/wp-content/uploads/2018/05/word-image-5734.png 1189w, /wp-content/uploads/2018/05/word-image-5734-300x182.png 300w, /wp-content/uploads/2018/05/word-image-5734-768x466.png 768w, /wp-content/uploads/2018/05/word-image-5734-1024x621.png 1024w" sizes="(max-width: 1189px) 100vw, 1189px" /></p>
<ul>
<li>
    步骤4：获取数据并循环显示
  </li>
</ul>
<p>
  控制器
</p>
<p><img loading="lazy" decoding="async" width="1157" height="460" src="/wp-content/uploads/2018/05/word-image-5735.png" class="wp-image-6291" srcset="/wp-content/uploads/2018/05/word-image-5735.png 1157w, /wp-content/uploads/2018/05/word-image-5735-300x119.png 300w, /wp-content/uploads/2018/05/word-image-5735-768x305.png 768w, /wp-content/uploads/2018/05/word-image-5735-1024x407.png 1024w" sizes="(max-width: 1157px) 100vw, 1157px" /></p>
<p>
  视图
</p>
<p><img loading="lazy" decoding="async" width="1171" height="549" src="/wp-content/uploads/2018/05/word-image-5736.png" class="wp-image-6292" srcset="/wp-content/uploads/2018/05/word-image-5736.png 1171w, /wp-content/uploads/2018/05/word-image-5736-300x141.png 300w, /wp-content/uploads/2018/05/word-image-5736-768x360.png 768w, /wp-content/uploads/2018/05/word-image-5736-1024x480.png 1024w" sizes="(max-width: 1171px) 100vw, 1171px" /><br />
<img loading="lazy" decoding="async" width="1365" height="604" src="/wp-content/uploads/2018/05/word-image-5737.png" class="wp-image-6293" srcset="/wp-content/uploads/2018/05/word-image-5737.png 1365w, /wp-content/uploads/2018/05/word-image-5737-300x133.png 300w, /wp-content/uploads/2018/05/word-image-5737-768x340.png 768w, /wp-content/uploads/2018/05/word-image-5737-1024x453.png 1024w" sizes="(max-width: 1365px) 100vw, 1365px" /></p>
<h2>2、添加留言</h2>
<h3>1）思路</h3>
<ul>
<li>
    说 明：因为添加特殊（其和列表在同一个页面所以不需要重新加载视图）
  </li>
<li>
    步骤1：修改路由
  </li>
<li>
    步骤2：控制器接受数据，并添加到数据库
  </li>
</ul>
<h3>2）代码</h3>
<ul>
<li>
    步骤1：修改路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1050" height="396" src="/wp-content/uploads/2018/05/word-image-5738.png" class="wp-image-6294" srcset="/wp-content/uploads/2018/05/word-image-5738.png 1050w, /wp-content/uploads/2018/05/word-image-5738-300x113.png 300w, /wp-content/uploads/2018/05/word-image-5738-768x290.png 768w, /wp-content/uploads/2018/05/word-image-5738-1024x386.png 1024w" sizes="(max-width: 1050px) 100vw, 1050px" /></p>
<ul>
<li>
    步骤2：控制器接受数据，并添加到数据库
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1160" height="650" src="/wp-content/uploads/2018/05/word-image-5739.png" class="wp-image-6295" srcset="/wp-content/uploads/2018/05/word-image-5739.png 1160w, /wp-content/uploads/2018/05/word-image-5739-300x168.png 300w, /wp-content/uploads/2018/05/word-image-5739-768x430.png 768w, /wp-content/uploads/2018/05/word-image-5739-1024x574.png 1024w" sizes="(max-width: 1160px) 100vw, 1160px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6202.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Laravel框架（二）CSRF攻击、闪存数据、留言板案例、数据库操作、DB类操作、内置分页功能</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6168.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6168.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 16:12:46 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[CSRF攻击]]></category>
		<category><![CDATA[DB类操作]]></category>
		<category><![CDATA[内置分页功能]]></category>
		<category><![CDATA[数据库操作]]></category>
		<category><![CDATA[留言板案例]]></category>
		<category><![CDATA[闪存数据]]></category>
		<guid isPermaLink="false">/?p=6168</guid>

					<description><![CDATA[Laravel框架第2天 复习回顾 了解Laravel：就是用PHP写的框架 安装和使用：必须laravel5 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1><a id="post-6168-_Toc487990937"></a><a id="post-6168-_Toc487903166"></a>Laravel框架第2天</h1>
<h1>复习回顾</h1>
<p>
  了解Laravel：就是用PHP写的框架
</p>
<p>
  安装和使用：必须laravel5.4(php&gt;=5.6) 开启openssl、pdo、mbstring、fileinfo
</p>
<p>
  目录说明
</p>
<p>
  控制器语法：php artisan make:controller 平台名\控制器名Controller
</p>
<p>
  加载视图：return view（视图文件，compact（变量名，变量名，变量名））
</p>
<p>
  脚下留心：
</p>
<p>
  1）打开views下面子文件夹则用点隔开，如：view（‘a.xxx’）
</p>
<p>
  2）优先打开blade模板文件
</p>
<p>
  模板标签：
</p>
<p>
  1）输出变量：{{ $变量名 }}
</p>
<p>
  2）判断循环等潜规则： @标签名   @end标签名
</p>
<p>
  路由
</p>
<p>
      基本语法：Route::请求类型（路径，闭包函数或控制器方法）
</p>
<p>
  匹配指定类型：Route::match（[类型1,..,类型n]，路径，闭包函数或控制器方法）
</p>
<p>
  匹配任意类型：Route::any（路径，闭包函数或控制器方法）
</p>
<p>
  路由参数语法：Route::请求类型（路径/{参数}，闭包函数或控制器方法）-&gt;where（参数名，正则）
</p>
<p>
  说明
</p>
<p>
  1）多个参数则在路径处写多个{}即可
</p>
<p>
  2）多个限制则用数组来写，键是参数名，值是对应的正则
</p>
<p>
  路由分组
</p>
<p>
  好处：减少冗余
</p>
<p>
  语法：
</p>
<p>
  Route::group([&#8216;namespace&#8217;=&gt;&#8221;，&#8217;prefix&#8217;=&gt;&#8221;],function(){
</p>
</p>
<p>
      基本语法：Route::请求类型（路径，闭包函数或控制器方法）
</p>
<p>
      基本语法：Route::请求类型（路径，闭包函数或控制器方法）
</p>
<p>
  });
</p>
<p>
  路由别名：
</p>
<p>
  作用：避免后期通过url方法时感觉长
</p>
<p>
  解决：通过as别名
</p>
<p>
  语法：
</p>
<p>
  Route::请求类型（路径，[
</p>
<p>
  	&#8216;as&#8217; =&gt; 别名,
</p>
<p>
  	&#8216;uses&#8217; =&gt; 闭包函数或控制器方法
</p>
<p>
  ]）
</p>
<p>
  后期将url函数替换成 route函数(别名) 就可以自动生成该别名对应的路由
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p>
  输入请求：
</p>
<p>
  Request
</p>
<p>
  $request-&gt;all() 		获取所有数据
</p>
<p>
  $request-&gt;input(键 [, 默认值])  获取get数据
</p>
<p>
  $request-&gt;only（[参数名1，&#8230;，参数名n]）    获取指定数据
</p>
<p>
  $request-&gt;except（[参数名1，&#8230;，参数名n]）   获取指定数据外的所有数据
</p>
<p>
  Input
</p>
<p>
  Input::all()			获取所有数据
</p>
<p>
  Input::get(键[, 默认值]) 	获取get数据
</p>
<p>
  Input::only（[键1，&#8230;，键n]）   获取指定数据
</p>
<p>
  Input::except（[键1，&#8230;，键n]）获取指定数据外的所有数据
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<h1>一、CSRF攻击</h1>
<h2><a id="post-6168-_Toc487990938"></a>1、什么是CSRF攻击</h2>
<ul>
<li>
    CSRF（Cross-site request forgery）中文名：跨站请求伪造。
  </li>
<li>
    CSRF是网站攻击的一种，存在巨大的危险性。
  </li>
</ul>
<h2>2、CSRF攻击场景 </h2>
<h3>1）跨站攻击留言板（随便写一个表单只要知道请求地址和请求参数就可以提交，危险 ）</h3>
<p>
  &lt;!DOCTYPE html&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  	&lt;title&gt;测试攻击&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  	&lt;form action=&#8221;http://localhost/laravel54/public/msg&#8221; method=&#8221;post&#8221;&gt;
</p>
<p>
  		&lt;p&gt;
</p>
<p>
  			用户名：&lt;input type=&#8221;text&#8221; name=&#8221;uname&#8221;/&gt;
</p>
<p>
  		&lt;/p&gt;
</p>
<p>
  		&lt;p&gt;
</p>
<p>
  			内容：&lt;input type=&#8221;text&#8221; name=&#8221;content&#8221;/&gt;
</p>
<p>
  		&lt;/p&gt;
</p>
<p>
  		&lt;p&gt;
</p>
<p>
  			&lt;input type=&#8221;submit&#8221; value=&#8221;提交&#8221;/&gt;
</p>
<p>
  		&lt;/p&gt;
</p>
<p>
  	&lt;/form&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h3>2）实战慕课网攻击</h3>
<p><img loading="lazy" decoding="async" width="1073" height="649" src="/wp-content/uploads/2018/05/word-image-5615.png" class="wp-image-6169" srcset="/wp-content/uploads/2018/05/word-image-5615.png 1073w, /wp-content/uploads/2018/05/word-image-5615-300x181.png 300w, /wp-content/uploads/2018/05/word-image-5615-768x465.png 768w, /wp-content/uploads/2018/05/word-image-5615-1024x619.png 1024w" sizes="(max-width: 1073px) 100vw, 1073px" /></p>
<p>
  &lt;?php
</p>
<p>
  //1.初始化curl
</p>
<p>
  $ch = curl_init();
</p>
<p>
  //2.配置
</p>
<p>
  // 设置header需要发送的参数
</p>
<p>
  $header = array(
</p>
<p>
      &#8216;Cookie: imooc_uuid=d67f1568-c3c5-4aca-8e4b-5eabd35f8409; imooc_isnew=1; imooc_isnew_ct=1515116337; IMCDNS=0; loginstate=1; apsid=NkNWUxODA2NGM2NzU1ZjdlOGYyN2E2ZjU0ZjE5NzcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANjIxODQ1OQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADZkZDJmNTliMWE2YWE0NGVkMTZiNjQ0Y2ZlODFlMjdmh9dOWnzXTlo%3DNG; PHPSESSID=ph1fngr8r7esumvn9ru5i3ian7; Hm_lvt_f0cfcccd7b1393990c78efdeebff3968=1515116350,1515116778; Hm_lpvt_f0cfcccd7b1393990c78efdeebff3968=1515117138; cvde=5a4ed8e8b70db-9&#8217;
</p>
<p>
  );
</p>
<p>
  curl_setopt($ch, CURLOPT_HTTPHEADER  , $header);
</p>
<p>
  curl_setopt($ch, CURLOPT_URL, &#8216;https://www.imooc.com/article/ajaxpublish&#8217;);
</p>
<p>
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
</p>
<p>
  curl_setopt($ch, CURLOPT_POST, true);
</p>
<p>
  $postData = [
</p>
<p>
  	&#8216;label_ids&#8217; =&gt; 19,
</p>
<p>
  	&#8216;title&#8217; =&gt; &#8216;汉子怎么写，小编是不是女dsfsdfs的&#8217;,
</p>
<p>
  	&#8216;is_original&#8217; =&gt; 0,
</p>
<p>
  	&#8216;pic&#8217; =&gt; &#8221;,
</p>
<p>
  	&#8216;content&#8217; =&gt; &#8216;大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费大发的说法是打发斯蒂芬水电费&#8217;
</p>
<p>
  ];
</p>
<p>
  curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
</p>
<p>
  // https请求 不验证证书和hosts
</p>
<p>
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
</p>
<p>
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
</p>
<p>
  //3.发送请求
</p>
<p>
  $rs = curl_exec($ch);
</p>
<p>
  //4.关闭释放
</p>
<p>
  curl_close($ch);
</p>
<p>
  echo $rs;
</p>
<h2><a id="post-6168-_Toc487990940"></a>3、防止CSRF攻击</h2>
<ul>
<li>
    防止方案：通过session过滤
  </li>
<li>
    步骤1：控制器打开视图时候,生成随意唯一的字符串保存在session中的token键中
  </li>
</ul>
<p>
  【控制器（伪代码）】
</p>
<p>
  session_start()
</p>
<p>
  $_SESSION[&#8216;token&#8217;] = 随机字符串
</p>
<p>
  return view();
</p>
<p>
  【视图中】
</p>
<p>
  表单隐藏域
</p>
<p>
  &lt;input type=&#8221;hidden&#8221; value=&#8221;{{$_SESSION[&#8216;token&#8217;]}}&#8221; name=&#8221;token&#8221; /&gt;
</p>
<ul>
<li>
    步骤2：验证表单提交的随机字符串和session中的是否一致
  </li>
</ul>
<p>
  session_start();
</p>
<p>
  if ($_SESSION[&#8216;token&#8217;] !== $_POST[&#8216;token&#8217;]) {
</p>
<p>
  非法操作
</p>
<p>
  }
</p>
<h2><a id="post-6168-_Toc487990939"></a>Laravel中避免CSRF攻击（留言板案例）</h2>
<p>
  步骤1：打开app\Http\Kernel.php核心文件开启cstf攻击（注：默认已经开启）
</p>
<p><img loading="lazy" decoding="async" width="1075" height="416" src="/wp-content/uploads/2018/05/word-image-5616.png" class="wp-image-6170" srcset="/wp-content/uploads/2018/05/word-image-5616.png 1075w, /wp-content/uploads/2018/05/word-image-5616-300x116.png 300w, /wp-content/uploads/2018/05/word-image-5616-768x297.png 768w, /wp-content/uploads/2018/05/word-image-5616-1024x396.png 1024w" sizes="(max-width: 1075px) 100vw, 1075px" /></p>
<p>
  步骤2：后期所有post提交的表单都必须增加_token键
</p>
<p><img loading="lazy" decoding="async" width="963" height="371" src="/wp-content/uploads/2018/05/word-image-5617.png" class="wp-image-6171" srcset="/wp-content/uploads/2018/05/word-image-5617.png 963w, /wp-content/uploads/2018/05/word-image-5617-300x116.png 300w, /wp-content/uploads/2018/05/word-image-5617-768x296.png 768w" sizes="(max-width: 963px) 100vw, 963px" /></p>
<p>
  了解更多：<a href="http://laravelacademy.org/post/6742.html">http://laravelacademy.org/post/6742.html</a>
</p>
<h1>二、操作提示功能：Laravel 的闪存数据（Flash Data）</h1>
<h2>1、概念</h2>
<p>
  简单概括：闪存数据指将数据存在session中并且只能读取一次
</p>
<p><img loading="lazy" decoding="async" width="825" height="336" src="/wp-content/uploads/2018/05/word-image-5618.png" class="wp-image-6172" srcset="/wp-content/uploads/2018/05/word-image-5618.png 825w, /wp-content/uploads/2018/05/word-image-5618-300x122.png 300w, /wp-content/uploads/2018/05/word-image-5618-768x313.png 768w" sizes="(max-width: 825px) 100vw, 825px" /></p>
<h2>留言板案例（数据插入状态弹框提示）</h2>
<p>
  控制器
</p>
<p><img loading="lazy" decoding="async" width="1259" height="550" src="/wp-content/uploads/2018/05/word-image-5619.png" class="wp-image-6173" srcset="/wp-content/uploads/2018/05/word-image-5619.png 1259w, /wp-content/uploads/2018/05/word-image-5619-300x131.png 300w, /wp-content/uploads/2018/05/word-image-5619-768x336.png 768w, /wp-content/uploads/2018/05/word-image-5619-1024x447.png 1024w" sizes="(max-width: 1259px) 100vw, 1259px" /></p>
<p>
  视图
</p>
<p><img loading="lazy" decoding="async" width="977" height="421" src="/wp-content/uploads/2018/05/word-image-5620.png" class="wp-image-6174" srcset="/wp-content/uploads/2018/05/word-image-5620.png 977w, /wp-content/uploads/2018/05/word-image-5620-300x129.png 300w, /wp-content/uploads/2018/05/word-image-5620-768x331.png 768w" sizes="(max-width: 977px) 100vw, 977px" /></p>
<p>
  概况
</p>
<p><img loading="lazy" decoding="async" width="868" height="270" src="/wp-content/uploads/2018/05/word-image-5621.png" class="wp-image-6175" srcset="/wp-content/uploads/2018/05/word-image-5621.png 868w, /wp-content/uploads/2018/05/word-image-5621-300x93.png 300w, /wp-content/uploads/2018/05/word-image-5621-768x239.png 768w" sizes="(max-width: 868px) 100vw, 868px" /></p>
<p>
  with（键，值）   						=&gt; 相当于 $_SESSION[&#8216;键&#8217;] = 值
</p>
<p>
  with（[键=&gt;值,..,键n=&gt;值n]）		=&gt; 相当于批量设置
</p>
<p>
  						 				$_SESSION[&#8216;键1&#8217;] = 值1
</p>
<p>
  						 				&#8230;
</p>
<p>
  						 				$_SESSION[&#8216;键n&#8217;] = 值n
</p>
<p>
  以前PHP存储到session中，通过$_SESSION[&#8216;键&#8217;]来获取
</p>
<p>
  问：在Laravel中如何获取？
</p>
<p>
  答：通过session函数，语法：echo session（键）
</p>
<h2>留言板案例（优雅的弹框）</h2>
<h3>1）插件</h3>
<p>
  layer插件（闲心）
</p>
<p>
  网站：<a href="http://layer.layui.com/">http://layer.layui.com/</a>
</p>
<p>
  手册：<a href="http://layer.layui.com/hello.html">http://layer.layui.com/hello.html</a>
</p>
<p>
  sweet alert插件
</p>
<p>
  网站：<a href="http://mishengqiang.com/sweetalert/" class="broken_link">http://mishengqiang.com/sweetalert/</a>
</p>
<p>
  laravel的sweet alert版本：<a href="https://github.com/uxweb/sweet-alert">https://github.com/uxweb/sweet-alert</a>
</p>
<h3>使用</h3>
<p><img loading="lazy" decoding="async" width="1145" height="544" src="/wp-content/uploads/2018/05/word-image-5622.png" class="wp-image-6176" srcset="/wp-content/uploads/2018/05/word-image-5622.png 1145w, /wp-content/uploads/2018/05/word-image-5622-300x143.png 300w, /wp-content/uploads/2018/05/word-image-5622-768x365.png 768w, /wp-content/uploads/2018/05/word-image-5622-1024x487.png 1024w" sizes="(max-width: 1145px) 100vw, 1145px" /></p>
<p>
  &lt;!DOCTYPE html&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
      &lt;title&gt;&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
      &lt;!&#8211;
</p>
<p>
      http://mishengqiang.com/sweetalert/
</p>
<p>
      &lt;style type=&#8221;text/css&#8221;&gt;
</p>
<p>
      .sweet-alert h2 { line-height: 1px !important }
</p>
<p>
      &lt;/style&gt;
</p>
<p>
      &#8211;&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>
      swal(&#8220;大标题&#8221;, &#8220;&#8221;,&#8221;error&#8221;)
</p>
<p>
      &lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h3>留言板整合</h3>
<p>
  控制机器
</p>
<p><img loading="lazy" decoding="async" width="1353" height="491" src="/wp-content/uploads/2018/05/word-image-5623.png" class="wp-image-6177" srcset="/wp-content/uploads/2018/05/word-image-5623.png 1353w, /wp-content/uploads/2018/05/word-image-5623-300x109.png 300w, /wp-content/uploads/2018/05/word-image-5623-768x279.png 768w, /wp-content/uploads/2018/05/word-image-5623-1024x372.png 1024w" sizes="(max-width: 1353px) 100vw, 1353px" /></p>
<p>
  视图
</p>
<p><img loading="lazy" decoding="async" width="1283" height="521" src="/wp-content/uploads/2018/05/word-image-5624.png" class="wp-image-6178" srcset="/wp-content/uploads/2018/05/word-image-5624.png 1283w, /wp-content/uploads/2018/05/word-image-5624-300x122.png 300w, /wp-content/uploads/2018/05/word-image-5624-768x312.png 768w, /wp-content/uploads/2018/05/word-image-5624-1024x416.png 1024w" sizes="(max-width: 1283px) 100vw, 1283px" /></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>
  	{{&#8211;@if (session(&#8216;tips&#8217;))&#8211;}}
</p>
<p>
  		{{&#8211;alert(&#8220;{{ session(&#8216;tips&#8217;) }}&#8221;);&#8211;}}
</p>
<p>
  	{{&#8211;@endif&#8211;}}
</p>
<p>
  	@if (session(&#8216;tips&#8217;))
</p>
<p>
      swal(&#8220;{{session(&#8216;tips&#8217;)}}&#8221;, &#8220;&#8221;,&#8221;{{session(&#8216;state&#8217;)}}&#8221;);
</p>
<p>
  	@endif
</p>
<p>
  &lt;/script&gt;
</p>
<h1>︴数据库操作学前扩展（foreach遍历Laravel集合对象，会将其属性中的对象赋给 $v）</h1>
<p>
  &lt;?php
</p>
<p>
  //以前：从数据库查询处理，是个二维数组
</p>
<p>
  // $arrData = [
</p>
<p>
  // 	[&#8216;name&#8217;=&gt;&#8217;xx&#8217;, &#8216;age&#8217;=&gt;19],
</p>
<p>
  // 	[&#8216;name&#8217;=&gt;&#8217;xx&#8217;, &#8216;age&#8217;=&gt;19],
</p>
<p>
  // 	[&#8216;name&#8217;=&gt;&#8217;xx&#8217;, &#8216;age&#8217;=&gt;19],
</p>
<p>
  // 	[&#8216;name&#8217;=&gt;&#8217;xx&#8217;, &#8216;age&#8217;=&gt;19]
</p>
<p>
  // ];
</p>
<p>
  // foreach ($arrData as $key =&gt; $arr) {
</p>
<p>
  // 	#$arr就是数据库的一条条记录， [&#8216;name&#8217;=&gt;&#8217;xx&#8217;, &#8216;age&#8217;=&gt;19]
</p>
<p>
  // 	#$arr[&#8216;name&#8217;]   和  $arr[&#8216;age&#8217;]
</p>
<p>
  // }
</p>
<p>
  //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
  //现在：laravel不同（小对象对应数据库的每一条记录）
</p>
<p>
  // 大对象
</p>
<p>
  // {
</p>
<p>
  // 	属性名:受保护 =&gt; array(
</p>
<p>
  // 		0 =&gt; 小对象,
</p>
<p>
  // 		1 =&gt; 小对象,
</p>
<p>
  // 		2 =&gt; 小对象
</p>
<p>
  // 	)
</p>
<p>
  // }
</p>
<p>
  //======================
</p>
<p>
  //【小栗子】定义学生类
</p>
<p>
  // class Stu
</p>
<p>
  // {
</p>
<p>
  // 	public $a = &#8216;a1&#8217;;
</p>
<p>
  // 	public $b = &#8216;b2&#8217;;
</p>
<p>
  // 	protected $c = &#8216;c3&#8217;;
</p>
<p>
  // 	public function d() {}
</p>
<p>
  // }
</p>
<p>
  // //创建对象
</p>
<p>
  // $stuObj = new Stu;
</p>
<p>
  // foreach ($stuObj as $key =&gt; $v) {
</p>
<p>
  // 	print_r($key);
</p>
<p>
  // 	print_r($v);
</p>
<p>
  // 	echo &#8216;&lt;hr /&gt;&#8217;; //【结论】只有公开的属性才可以
</p>
<p>
  // }
</p>
<p>
  //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
</p>
<p><strong>class smallObj </strong>
</p>
<p><strong>{</strong>
</p>
<p><strong>	public $name = &#8216;h&#8217;;</strong>
</p>
<p><strong>	public $age = &#8216;hh&#8217;;</strong>
</p>
<p><strong>}</strong>
</p>
<p><strong>class Stu implements IteratorAggregate </strong>
</p>
<p><strong>{</strong>
</p>
<p><strong>	protected $items;</strong>
</p>
<p><strong>	public function __construct()</strong>
</p>
<p><strong>	{</strong>
</p>
<p><strong>		$this-&gt;items = array(</strong>
</p>
<p><strong>			new smallObj,</strong>
</p>
<p><strong>			new smallObj,</strong>
</p>
<p><strong>			new smallObj</strong>
</p>
<p><strong>		);</strong>
</p>
<p><strong>	}</strong>
</p>
<p><strong>	//说明：实现IteratorAggregate接口里面的抽象方法</strong>
</p>
<p><strong>	//触发：当foreach时候触发</strong>
</p>
<p><strong>    public function getIterator() {</strong>
</p>
<p><strong>    		   //通过ArrayIterator迭代器遍历$this-&gt;items挨个返回给$v</strong>
</p>
<p><strong>        return new ArrayIterator($this-&gt;items);//通过ArrayIterator迭代器过滤items属性</strong>
</p>
<p><strong>    }</strong>
</p>
<p><strong>}</strong>
</p>
<p><strong>//创建对象</strong>
</p>
<p><strong>$stuObj = new Stu;</strong>
</p>
<p><strong>echo &#8216;&lt;pre&gt;&#8217;;</strong>
</p>
<p><strong>// print_r($stuObj);</strong>
</p>
<p><strong>foreach ($stuObj as $key =&gt; $v) {</strong>
</p>
<p><strong>	print_r($v);</strong>
</p>
<p><strong>}</strong>
</p>
<p><img loading="lazy" decoding="async" width="1116" height="248" src="/wp-content/uploads/2018/05/word-image-5625.png" class="wp-image-6179" srcset="/wp-content/uploads/2018/05/word-image-5625.png 1116w, /wp-content/uploads/2018/05/word-image-5625-300x67.png 300w, /wp-content/uploads/2018/05/word-image-5625-768x171.png 768w, /wp-content/uploads/2018/05/word-image-5625-1024x228.png 1024w" sizes="(max-width: 1116px) 100vw, 1116px" /></p>
<h1>三、Laravel数据库操作</h1>
<h2>1、说明</h2>
<p>
  按照MVC架构理论上数据操作应该在模型中（Model）完成，但对于某些极其复杂的SQL语句，可以使用DB类来操作数据库。
</p>
<h2>2、操作数据库的三种方式（★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★）</h2>
<ul>
<li>
    使用模型操作（Eloquent ORM）
  </li>
<li>
    使用原生SQL语句，语法：DB::CURD（SQL语句）
  </li>
<li>
    使用查询构建器，语法：DB::table（表名）
  </li>
</ul>
<p>
  模型Eloquent ORM  相当于TP    D方法
</p>
<p>
  查询构建器           相当于TP     M方法
</p>
<p>
  多学一招：实际工作使用M还是D呢？
</p>
<p>
  答：模型，因为减少冗余、增加代码可读性便于维护
</p>
<h2>3、准备，操作数据库（数据表的创建与配置）</h2>
<h3>1）创建数据库和表</h3>
<p>
  create database laravel54;
</p>
<p>
  use laravel54;
</p>
<p>
  create table day2_t1(
</p>
<p>
  id int primary key auto_increment comment &#8216;编号&#8217;,
</p>
<p>
  uname varchar(45) not null comment &#8216;用户名&#8217;,
</p>
<p>
  content text not null comment &#8216;内容&#8217;,
</p>
<p>
  created_at int not null default 0 comment &#8216;创建于&#8217;,
</p>
<p>
  updated_at int not null default 0 comment &#8216;更新于&#8217;
</p>
<p>
  )engine=myisam charset=utf8;
</p>
<h3>2）数据库在laravel框架中的配置（更改数据库配置文件）</h3>
<p><img loading="lazy" decoding="async" width="674" height="340" src="/wp-content/uploads/2018/05/word-image-5626.png" class="wp-image-6180" srcset="/wp-content/uploads/2018/05/word-image-5626.png 674w, /wp-content/uploads/2018/05/word-image-5626-300x151.png 300w" sizes="(max-width: 674px) 100vw, 674px" /></p>
<h3>3）创建一个Day2Controller.php的控制器</h3>
<p>
  php artisan make:controller Home\Day2Controller
</p>
<h3>3）设计路由规则</h3>
<p><img loading="lazy" decoding="async" width="1055" height="413" src="/wp-content/uploads/2018/05/word-image-5627.png" class="wp-image-6181" srcset="/wp-content/uploads/2018/05/word-image-5627.png 1055w, /wp-content/uploads/2018/05/word-image-5627-300x117.png 300w, /wp-content/uploads/2018/05/word-image-5627-768x301.png 768w, /wp-content/uploads/2018/05/word-image-5627-1024x401.png 1024w" sizes="(max-width: 1055px) 100vw, 1055px" /></p>
<p>
  Route::get(&#8216;/db&#8217;, &#8216;Home\Day2Controller@db&#8217;);
</p>
<h1>四、DB类操作数据库（查询构建器、原始SQL语句）</h1>
<h2><a id="post-6168-_Toc487903168"></a>1、【C】增加数据（insert）</h2>
<h3>语法</h3>
<ul>
<li>
    【  插入多条数据】DB::table（表名）-&gt;insert（数组）
  </li>
<li>
    【插入一条反主键】DB::table（表名）-&gt;insertGetId（数组）
  </li>
</ul>
<h3>2）练习</h3>
<p>
  //【返回状态】插入数据（一条）
</p>
<p>
  //【返回状态】插入数据（多条）
</p>
<p>
  //【返回主键】插入数据（仅能插入一条）
</p>
<p><img loading="lazy" decoding="async" width="837" height="650" src="/wp-content/uploads/2018/05/word-image-5628.png" class="wp-image-6182" srcset="/wp-content/uploads/2018/05/word-image-5628.png 837w, /wp-content/uploads/2018/05/word-image-5628-300x233.png 300w, /wp-content/uploads/2018/05/word-image-5628-768x596.png 768w" sizes="(max-width: 837px) 100vw, 837px" /></p>
<p>
  //学习数据库测试方法
</p>
<p>
  public function db()
</p>
<p>
  {
</p>
<p>
      //【返回状态】插入数据（一条）
</p>
<p>
  //        $rs = DB::table(&#8216;day2_t1&#8217;)-&gt;insert([
</p>
<p>
  //            &#8216;uname&#8217; =&gt; &#8216;dsfsdaf&#8217;,
</p>
<p>
  //            &#8216;content&#8217; =&gt; &#8216;aaaaaa&#8217;,
</p>
<p>
  //            &#8216;created_at&#8217; =&gt; time(),
</p>
<p>
  //            &#8216;updated_at&#8217; =&gt; time()
</p>
<p>
  //        ]);
</p>
<p>
  //        var_dump($rs);
</p>
<p>
      //【返回状态】插入数据（多条）
</p>
<p>
  //        $rs = DB::table(&#8216;day2_t1&#8217;)-&gt;insert([
</p>
<p>
  //            [&#8216;uname&#8217; =&gt; &#8216;dsfsdaf&#8217;, &#8216;content&#8217; =&gt; &#8216;aaaaaa&#8217;],
</p>
<p>
  //            [&#8216;uname&#8217; =&gt; &#8216;dsfsdaf&#8217;, &#8216;content&#8217; =&gt; &#8216;aaaaaa&#8217;]
</p>
<p>
  //        ]);
</p>
<p>
  //        var_dump($rs);
</p>
<p>
      //【返回主键】插入数据（仅能插入一条）
</p>
<p>
      $rs = DB::table(&#8216;day2_t1&#8217;)-&gt;insertGetId([
</p>
<p>
          &#8216;uname&#8217; =&gt; &#8216;dsfsdaf&#8217;,
</p>
<p>
          &#8216;content&#8217; =&gt; &#8216;aaaaaa&#8217;,
</p>
<p>
          &#8216;created_at&#8217; =&gt; time(),
</p>
<p>
          &#8216;updated_at&#8217; =&gt; time()
</p>
<p>
      ]);
</p>
<p>
      var_dump($rs);
</p>
<p>
  }
</p>
<h2><a id="post-6168-_Toc487903177"></a>【D】删除数据(delete)</h2>
<h3>1）语法</h3>
<ul>
<li>
    【删除一条】DB::table（表名）-&gt;delete（主键）
  </li>
<li>
    【删除多条】DB::table（表名）-&gt;where（字段名，条件，值）-&gt;delete（）
  </li>
</ul>
<h3>2）练习</h3>
<p><img loading="lazy" decoding="async" width="1038" height="456" src="/wp-content/uploads/2018/05/word-image-5629.png" class="wp-image-6183" srcset="/wp-content/uploads/2018/05/word-image-5629.png 1038w, /wp-content/uploads/2018/05/word-image-5629-300x132.png 300w, /wp-content/uploads/2018/05/word-image-5629-768x337.png 768w, /wp-content/uploads/2018/05/word-image-5629-1024x450.png 1024w" sizes="(max-width: 1038px) 100vw, 1038px" /></p>
<p>
      //学习数据库测试方法
</p>
<p>
      public function db()
</p>
<p>
      {
</p>
<p>
          //【删除一条】
</p>
<p>
  //        $rs = DB::table(&#8216;day2_t1&#8217;)-&gt;delete(1);
</p>
<p>
  //        var_dump($rs);
</p>
<p>
          //【删除多条】
</p>
<p>
          $rs = DB::table(&#8216;day2_t1&#8217;)-&gt;where(&#8216;id&#8217;, &#8216;&lt;&#8216;, 5)-&gt;delete();
</p>
<p>
          var_dump($rs);
</p>
<p>
      }
</p>
<h2><a id="post-6168-_Toc487903169"></a>【U】修改数据( update)</h2>
<h3>1）语法</h3>
<ul>
<li>
    【修改多条】DB::table（表名）-&gt;update（数组）
  </li>
<li>
    【修改指定】DB::table（表名）-&gt;where（字段名，条件，值）-&gt;update（数组）
  </li>
<li>
    【递增】DB::table（表名）-&gt;increment（字段名 [,数字默认1]）
  </li>
<li>
    【递减】DB::table（表名）-&gt;decrement（字段名 [,数字默认1]）
  </li>
</ul>
<h3>2）练习</h3>
<p><img loading="lazy" decoding="async" width="1276" height="567" src="/wp-content/uploads/2018/05/word-image-5630.png" class="wp-image-6184" srcset="/wp-content/uploads/2018/05/word-image-5630.png 1276w, /wp-content/uploads/2018/05/word-image-5630-300x133.png 300w, /wp-content/uploads/2018/05/word-image-5630-768x341.png 768w, /wp-content/uploads/2018/05/word-image-5630-1024x455.png 1024w" sizes="(max-width: 1276px) 100vw, 1276px" /></p>
<p>
      //学习数据库测试方法
</p>
<p>
      public function db()
</p>
<p>
      {
</p>
<p>
          #需求：将id=6的name改成六六六
</p>
<p>
  //        $rs = DB::table(&#8216;day2_t1&#8217;)-&gt;where(&#8216;id&#8217;,&#8217;=&#8217;,6)-&gt;update([
</p>
<p>
  //            &#8216;uname&#8217; =&gt; &#8216;六六六&#8217;
</p>
<p>
  //        ]);
</p>
<p>
  //        var_dump($rs);
</p>
<p>
          //脚下留心：php操作数据库特性如果数据已经修改，没有改变则影响0行，至此推荐修改数据的时候加上updated_at字段
</p>
<p>
  //        DB::table(&#8216;day2_t1&#8217;)-&gt;where(&#8216;id&#8217;,&#8217;=&#8217;,6)-&gt;increment(&#8216;created_at&#8217;);
</p>
<p>
  //        DB::table(&#8216;day2_t1&#8217;)-&gt;where(&#8216;id&#8217;,&#8217;=&#8217;,6)-&gt;increment(&#8216;created_at&#8217;, 4);
</p>
<p>
          DB::table(&#8216;day2_t1&#8217;)-&gt;where(&#8216;id&#8217;,&#8217;=&#8217;,6)-&gt;decrement(&#8216;created_at&#8217;);
</p>
<p>
          DB::table(&#8216;day2_t1&#8217;)-&gt;where(&#8216;id&#8217;,&#8217;=&#8217;,6)-&gt;decrement(&#8216;created_at&#8217;, 4);
</p>
<p>
      }
</p>
<h2><a id="post-6168-_Toc487903170"></a>4、【R】查询数据(get)</h2>
<h3>1）语法</h3>
<p>
  DB::table(表名)
</p>
<p>
  -&gt;select(字段名1,..,字段名n)  显示自定的字段 （注：字段名 as 别名）
</p>
<p>
  -&gt;where（字段名，条件，值）    多学一招：如果是等于忽略条件，语法：-&gt;where（字段名，值）
</p>
<p>
                                  多学一招：-&gt;where（[字段名=&gt;值，字段名=&gt;值]）
</p>
<p>
  -&gt;orderBy(字段名，升序或降序)
</p>
<p>
  -&gt;groupBy（字段名）			 注：多个则数组
</p>
<p>
  -&gt;having（同where）
</p>
<p>
  -&gt;skip（数字）  跳过多少条
</p>
<p>
  -&gt;take（数字）  获取多少条
</p>
<p>
  或
</p>
<p>
  -&gt;offset（数字）
</p>
<p>
  -&gt;limit（数字）
</p>
<p>
  -&gt;get()      查询所有数据
</p>
<p>
  -&gt;first()    查询一条数据
</p>
<p>
  并且where条件语法：-&gt;where()-&gt;where()
</p>
<p>
  或者where条件语法：-&gt;where()-&gt;orWhere()      参数统一两个或三个
</p>
<h3><a id="post-6168-_Toc487903171"></a>练习1</h3>
<ul>
<li>
    #插入测试数据
  </li>
</ul>
<p>
  INSERT INTO `day2_t1`
</p>
<p>
  VALUES
</p>
<p>
  (&#8216;1&#8217;, &#8216;aa&#8217;, &#8216;aaaa&#8217;, &#8216;0&#8217;, &#8216;0&#8217;),
</p>
<p>
  (&#8216;2&#8217;, &#8216;bb&#8217;, &#8216;dfasf&#8217;, &#8216;0&#8217;, &#8216;0&#8217;),
</p>
<p>
  (&#8216;3&#8217;, &#8216;cc&#8217;, &#8216;sdf&#8217;, &#8216;0&#8217;, &#8216;0&#8217;),
</p>
<p>
  (&#8216;4&#8217;, &#8216;dd&#8217;, &#8216;asdf&#8217;, &#8216;0&#8217;, &#8216;0&#8217;),
</p>
<p>
  (&#8216;5&#8217;, &#8216;ee&#8217;, &#8216;asd&#8217;, &#8216;0&#8217;, &#8216;0&#8217;),
</p>
<p>
  (&#8216;6&#8217;, &#8216;ff&#8217;, &#8216;adsfasdf&#8217;, &#8216;0&#8217;, &#8216;0&#8217;),
</p>
<p>
  (&#8216;7&#8217;, &#8216;ff&#8217;, &#8216;dsf&#8217;, &#8216;0&#8217;, &#8216;0&#8217;),
</p>
<p>
  (&#8216;8&#8217;, &#8216;h&#8217;, &#8216;asdf&#8217;, &#8216;0&#8217;, &#8216;0&#8217;),
</p>
<p>
  (&#8216;9&#8217;, &#8216;i&#8217;, &#8216;asf&#8217;, &#8216;0&#8217;, &#8216;0&#8217;),
</p>
<p>
  (&#8217;10&#8217;, &#8216;g&#8217;, &#8216;gsdfg&#8217;, &#8216;0&#8217;, &#8216;0&#8217;),
</p>
<p>
  (&#8217;11&#8217;, &#8216;k&#8217;, &#8216;dfdf&#8217;, &#8216;0&#8217;, &#8216;0&#8217;),
</p>
<p>
  (&#8217;12&#8217;, &#8216;l&#8217;, &#8216;dfgsdfg&#8217;, &#8216;0&#8217;, &#8216;0&#8217;),
</p>
<p>
  (&#8217;13&#8217;, &#8216;m&#8217;, &#8216;g&#8217;, &#8216;0&#8217;, &#8216;0&#8217;),
</p>
<p>
  (&#8217;14&#8217;, &#8216;n&#8217;, &#8216;dfg&#8217;, &#8216;0&#8217;, &#8216;0&#8217;),
</p>
<p>
  (&#8217;15&#8217;, &#8216;o&#8217;, &#8216;sfadsf&#8217;, &#8216;0&#8217;, &#8216;0&#8217;);
</p>
<ul>
<li>
    例题
  </li>
</ul>
<p>
  #题目1：查询一条数据
</p>
<p>
  #题目2：查询所有数据
</p>
<p>
  #题目3：按照id降序模糊查询content中含有a的数据，最终取2条
</p>
<p><img loading="lazy" decoding="async" width="1007" height="394" src="/wp-content/uploads/2018/05/word-image-5631.png" class="wp-image-6185" srcset="/wp-content/uploads/2018/05/word-image-5631.png 1007w, /wp-content/uploads/2018/05/word-image-5631-300x117.png 300w, /wp-content/uploads/2018/05/word-image-5631-768x300.png 768w" sizes="(max-width: 1007px) 100vw, 1007px" /></p>
<p>
     //学习数据库测试方法
</p>
<p>
      public function db()
</p>
<p>
      {
</p>
<p>
          echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
          #题目1：查询一条数据（直接小对象）
</p>
<p>
  //        $data = DB::table(&#8216;day2_t1&#8217;)-&gt;first();
</p>
<p>
  //        print_r($data);
</p>
<p>
  //        echo $data-&gt;content;
</p>
<p>
          #题目2：查询所有数据（大对象里小对象，如果foreach那么$v 小对象）
</p>
<p>
  //        $data = DB::table(&#8216;day2_t1&#8217;)-&gt;get();
</p>
<p>
  //        print_r($data);
</p>
<p>
          #题目3：按照id降序模糊查询content中含有a的数据，最终取2条
</p>
<p>
          $data = DB::table(&#8216;day2_t1&#8217;)-&gt;where(&#8216;content&#8217;, &#8216;like&#8217;, &#8216;%a%&#8217;)-&gt;orderBy(&#8216;id&#8217;, &#8216;desc&#8217;)-&gt;limit(2)-&gt;get();
</p>
<p>
          print_r($data);
</p>
<p>
      }
</p>
<h3><a id="post-6168-_Toc487903173"></a>3）练习2：where条件</h3>
<p>
  #题目1：查询id=1（方法一）
</p>
<p>
  #题目2：查询id=1（方法二）
</p>
<p>
  #题目3：查询id&gt;1
</p>
<p>
  #题目4：查询id=1并且name=aa
</p>
<p>
  #题目5：查询id=1或id=2
</p>
<p><img loading="lazy" decoding="async" width="667" height="555" src="/wp-content/uploads/2018/05/word-image-5632.png" class="wp-image-6186" srcset="/wp-content/uploads/2018/05/word-image-5632.png 667w, /wp-content/uploads/2018/05/word-image-5632-300x250.png 300w" sizes="(max-width: 667px) 100vw, 667px" /></p>
<p>
  //学习数据库测试方法
</p>
<p>
  public function db()
</p>
<p>
  {
</p>
<p>
      echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
      #题目1：查询id=1（方法一）
</p>
<p>
  //        $data = DB::table(&#8220;day2_t1&#8221;)-&gt;where(&#8216;id&#8217;, 1)-&gt;get();
</p>
<p>
  //        print_r($data);
</p>
<p>
      #题目2：查询id=1（方法二）
</p>
<p>
  //        $data = DB::table(&#8220;day2_t1&#8221;)-&gt;where(&#8216;id&#8217;,&#8217;=&#8217;, 1)-&gt;get();
</p>
<p>
  //        print_r($data);
</p>
<p>
      #题目3：查询id&gt;1
</p>
<p>
  //        $data = DB::table(&#8220;day2_t1&#8221;)-&gt;where(&#8216;id&#8217;,&#8217;&gt;&#8217;, 1)-&gt;get();
</p>
<p>
  //        print_r($data);
</p>
<p>
      #题目4：查询id=1并且name=aa
</p>
<p>
      //$data = DB::table(&#8216;day2_t1&#8217;)-&gt;where(&#8216;id&#8217;,1)-&gt;where(&#8216;uname&#8217;,&#8217;aa&#8217;)-&gt;get();
</p>
<p>
  //        $data = DB::table(&#8216;day2_t1&#8217;)-&gt;where([&#8216;id&#8217;=&gt;1,&#8217;uname&#8217;=&gt;&#8217;aa&#8217;])-&gt;get();
</p>
<p>
  //        print_r($data);
</p>
<p>
      #题目5：查询id=1或id=2
</p>
<p>
      $data = DB::table(&#8216;day2_t1&#8217;)
</p>
<p>
          -&gt;where(&#8216;id&#8217;,1)
</p>
<p>
          -&gt;orWhere(&#8216;id&#8217;,2)
</p>
<p>
          -&gt;get();
</p>
<p>
      print_r($data);
</p>
<p>
  }
</p>
<h1><a id="post-6168-_Toc487903178"></a>五、执行任意的SQL语句（可忽略）</h1>
<h3>1）语法</h3>
<ul>
<li>
    DB::select（SQL语句）
  </li>
<li>
    DB::insert（SQL语句）
  </li>
<li>
    DB::update（SQL语句）
  </li>
<li>
    DB::delete（SQL语句）
  </li>
</ul>
<h3>2）练习</h3>
<p><img loading="lazy" decoding="async" width="930" height="441" src="/wp-content/uploads/2018/05/word-image-5633.png" class="wp-image-6187" srcset="/wp-content/uploads/2018/05/word-image-5633.png 930w, /wp-content/uploads/2018/05/word-image-5633-300x142.png 300w, /wp-content/uploads/2018/05/word-image-5633-768x364.png 768w" sizes="(max-width: 930px) 100vw, 930px" /></p>
<p>
      //学习数据库测试方法
</p>
<p>
      public function db()
</p>
<p>
      {
</p>
<p>
          echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
  //        $data = DB::select(&#8216;select * from day2_t1&#8217;);
</p>
<p>
  //        print_r($data);
</p>
<p>
  //
</p>
<p>
  //        $rs = DB::update(&#8220;update day2_t1 set uname = &#8216;a111&#8217; where id = 1&#8221;);
</p>
<p>
  //        var_dump($rs);
</p>
<p>
  //         $data = DB::insert(&#8220;insert into day2_t1 (uname,content) values (&#8216;aaa&#8217;, &#8216;bbbb&#8217;)&#8221;);
</p>
<p>
  //         var_dump($data);
</p>
<p>
      }
</p>
<h1><a id="post-6168-_Toc487990941"></a>模型使用（Eloquent ORM）</h1>
<h2>说明</h2>
<ul>
<li><strong>什么是ORM？</strong>
  </li>
</ul>
<p>
  ORM技术主要为了避免手工编写 SQL，直接在对象（Object，O）和关系型数据（Relation, R）之间进行转换（Mapping, M）。
</p>
<p>
  ORM的好处就是使得你的开发几乎不用接触到SQL语句。创建一张表，声明一个对应的类，然后你就只用和这个类的实例进行交互了，至于这个对象里的数据该怎么存储又该怎么获取，通通不用关心。
</p>
<ul>
<li><strong>什么是Eloquent ORM？</strong>
  </li>
</ul>
<p>
  Eloquent 是 Laravel 中实现ORM的一个名称
</p>
<p>
  大致规则
</p>
<p>
  PHP编写的类  	===  库.表
</p>
<p>
  类里面存在属性  ===  表.字段
</p>
<p>
  类的实例方法 	===  表的操作
</p>
<p>
  类的实例 	    ===  表.记录
</p>
<h2><a id="post-6168-_Toc487990942"></a>2、创建模型</h2>
<ul>
<li>
    语法：php artisan make:model Http\Model\模型名
  </li>
<li>
    说明：说明模型默认在app目录下，为了方便管理将其放到Model目录中
  </li>
<li>
    模型属性【★】
  </li>
</ul>
<p>
  #声明表名（必须，注：不写则默认标明复数）
</p>
<p>
  protected $table       =  表名 			#默认模型对应的表名就是类型（注：类名大写则下划线分割+s）
</p>
<p>
  #声明主键字段名（默认主键为id字段，后期调用find(1)，则条件是id=1）
</p>
<p>
  protected $primaryKey =  主键名称
</p>
<p>
  #可被批量赋值的属性（当模型通过create方法创建数据时则必须）
</p>
<p>
  protected $fillable   =  [字段1,&#8230;,字段n]
</p>
<p>
  #是否字段管理created_at和updated_at字段：是-true默认，false-否
</p>
<p>
  public $timestamps =  bool
</p>
<p>
  #必须，模型日期列的存储格式（unix时间戳存储）
</p>
<p>
  protected $dateFormat = &#8216;U&#8217;;
</p>
<p>
  注：更改时间戳名称（一般不改）
</p>
<p>
  const CREATED_AT = &#8216;creation_date&#8217;;
</p>
<p>
  const UPDATED_AT = &#8216;last_update&#8217;;
</p>
<h2><a id="post-6168-_Toc487990943"></a>2、初体验控制器调用模型（获取所有数据）</h2>
<p>
  步骤1：创建模型
</p>
<p><img loading="lazy" decoding="async" width="677" height="335" src="/wp-content/uploads/2018/05/word-image-5634.png" class="wp-image-6188" srcset="/wp-content/uploads/2018/05/word-image-5634.png 677w, /wp-content/uploads/2018/05/word-image-5634-300x148.png 300w" sizes="(max-width: 677px) 100vw, 677px" /></p>
<p>
  步骤2：控制器调用模型
</p>
<p><img loading="lazy" decoding="async" width="795" height="423" src="/wp-content/uploads/2018/05/word-image-5635.png" class="wp-image-6189" srcset="/wp-content/uploads/2018/05/word-image-5635.png 795w, /wp-content/uploads/2018/05/word-image-5635-300x160.png 300w, /wp-content/uploads/2018/05/word-image-5635-768x409.png 768w" sizes="(max-width: 795px) 100vw, 795px" /><br />
<img loading="lazy" decoding="async" width="786" height="598" src="/wp-content/uploads/2018/05/word-image-5636.png" class="wp-image-6190" srcset="/wp-content/uploads/2018/05/word-image-5636.png 786w, /wp-content/uploads/2018/05/word-image-5636-300x228.png 300w, /wp-content/uploads/2018/05/word-image-5636-768x584.png 768w" sizes="(max-width: 786px) 100vw, 786px" /></p>
<h2><a id="post-6168-_Toc487990944"></a>3、基本操作</h2>
<h3><a id="post-6168-_Toc487990945"></a>1）添加数据</h3>
<ul>
<li>
    语法
  </li>
<li>
    方法1：模型名::create（数组）
  </li>
<li>
    方法2：
  </li>
</ul>
<p>
  $模型名 = new 模型名;
</p>
<p>
  $模型名-&gt;字段名 = 值;
</p>
<p>
  &#8230;
</p>
<p>
  $模型名-&gt;字段名n = 值n;
</p>
<p>
  $模型名-&gt;save();
</p>
<ul>
<li>
    练习
  </li>
<li>
    方法2：
  </li>
</ul>
<p>
  模型
</p>
<p><img loading="lazy" decoding="async" width="1112" height="644" src="/wp-content/uploads/2018/05/word-image-5637.png" class="wp-image-6191" srcset="/wp-content/uploads/2018/05/word-image-5637.png 1112w, /wp-content/uploads/2018/05/word-image-5637-300x174.png 300w, /wp-content/uploads/2018/05/word-image-5637-768x445.png 768w, /wp-content/uploads/2018/05/word-image-5637-1024x593.png 1024w" sizes="(max-width: 1112px) 100vw, 1112px" /></p>
<p>
  控制器
</p>
<p><img loading="lazy" decoding="async" width="914" height="642" src="/wp-content/uploads/2018/05/word-image-5638.png" class="wp-image-6192" srcset="/wp-content/uploads/2018/05/word-image-5638.png 914w, /wp-content/uploads/2018/05/word-image-5638-300x211.png 300w, /wp-content/uploads/2018/05/word-image-5638-768x539.png 768w" sizes="(max-width: 914px) 100vw, 914px" /></p>
<p>
  脚下留心：
</p>
<p>
  1）使用create方法批量设置属性创建数据，必须在模型声明 $fillable属性
</p>
<p>
  2）模型默认托管创建于和更新于 并且 以字符串型插入，如果需要unix时间戳 得声明$dateformat属性
</p>
<ul>
<li>
    方法1：
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="629" height="562" src="/wp-content/uploads/2018/05/word-image-5639.png" class="wp-image-6193" srcset="/wp-content/uploads/2018/05/word-image-5639.png 629w, /wp-content/uploads/2018/05/word-image-5639-300x268.png 300w" sizes="(max-width: 629px) 100vw, 629px" /></p>
<h3><a id="post-6168-_Toc487990946"></a>2）查询操作</h3>
<ul>
<li>
    语法
  </li>
</ul>
<p>
  模型名::下属任意一个方法()
</p>
<p>
  -&gt;select(字段名1,..,字段名n)  显示自定的字段 （注：字段名 as 别名）
</p>
<p>
  -&gt;where（字段名，条件，值）    多学一招：如果是等于忽略条件，语法：-&gt;where（字段名，值）
</p>
<p>
                                  多学一招：-&gt;where（[字段名=&gt;值，字段名=&gt;值]）
</p>
<p>
  -&gt;orderBy(字段名，升序或降序)
</p>
<p>
  -&gt;groupBy（字段名）			 注：多个则数组
</p>
<p>
  -&gt;having（同where）
</p>
<p>
  -&gt;skip（数字）  跳过多少条
</p>
<p>
  -&gt;take（数字）  获取多少条
</p>
<p>
  或
</p>
<p>
  -&gt;offset（数字）
</p>
<p>
  -&gt;limit（数字）
</p>
<p>
  -&gt;get()      查询所有数据
</p>
<p>
  -&gt;first()    查询一条数据
</p>
<p>
  并且where条件语法：-&gt;where()-&gt;where()
</p>
<p>
  或者where条件语法：-&gt;where()-&gt;orWhere()      参数统一两个或三个
</p>
<ul>
<li>
    练习
  </li>
</ul>
<p>
  #题目1：查询id=1（方法一）
</p>
<p>
  #题目2：查询id=1（方法二）
</p>
<p>
  #题目3：查询id&gt;1
</p>
<p>
  #题目4：查询id=1并且id=2
</p>
<p>
  #题目5：查询id=1或id=2
</p>
<p><img loading="lazy" decoding="async" width="445" height="546" src="/wp-content/uploads/2018/05/word-image-5640.png" class="wp-image-6194" srcset="/wp-content/uploads/2018/05/word-image-5640.png 445w, /wp-content/uploads/2018/05/word-image-5640-245x300.png 245w" sizes="(max-width: 445px) 100vw, 445px" /></p>
<p>
  //学习数据库测试方法
</p>
<p>
  public function db()
</p>
<p>
  {
</p>
<p>
      #题目1：查询id=1（方法一）
</p>
<p>
  //        $day2T1 = Day2T1::where(&#8216;id&#8217;, 1)-&gt;first();
</p>
<p>
  //        echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
  //        print_r($day2T1);
</p>
<p>
  //        #题目2：查询id=1（方法二）
</p>
<p>
  //        $day2T1 = Day2T1::where(&#8216;id&#8217;,&#8217;=&#8217;, 1)-&gt;first();
</p>
<p>
  //        echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
  //        print_r($day2T1);
</p>
<p>
      #题目3：查询id&gt;1
</p>
<p>
  //        $day2T1 = Day2T1::where(&#8216;id&#8217;,&#8217;&gt;&#8217;, 1)-&gt;get();
</p>
<p>
  //        echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
  //        print_r($day2T1);
</p>
<p>
      #题目4：查询id=1并且id=2
</p>
<p>
  //        $day2T1 = Day2T1::where(&#8216;id&#8217;,&#8217;=&#8217;, 1)
</p>
<p>
  //            -&gt;where(&#8216;id&#8217;,&#8217;=&#8217;, 2)
</p>
<p>
  //            -&gt;get();
</p>
<p>
  //        var_dump($day2T1);
</p>
<p>
      #题目5：查询id=1或id=2
</p>
<p>
      $day2T1 = Day2T1::where(&#8216;id&#8217;,&#8217;=&#8217;, 1)
</p>
<p>
          -&gt;orWhere(&#8216;id&#8217;,&#8217;=&#8217;, 2)
</p>
<p>
          -&gt;get();
</p>
<p>
      echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
      print_r($day2T1);
</p>
<p>
  }
</p>
<h3><a id="post-6168-_Toc487990947"></a>3）修改数据</h3>
<ul>
<li>
    语法
  </li>
<li>
    方法1：模型名::where()-&gt;update（数组）
  </li>
<li>
    方法2：
  </li>
</ul>
<p>
  $模型名 = 模型名::find(主键)
</p>
<p>
  $模型名-&gt;字段名 = 修改值
</p>
<p>
  &#8230;.
</p>
<p>
  $模型名-&gt;save();
</p>
<p>
  模型中查询一条数据：find(主键)  或者 first
</p>
<p>
  模型中查询多条数据：get（）     或者 all()
</p>
<ul>
<li>
    练习
  </li>
</ul>
<p>
  #方法1：多条，返回受影响的行数
</p>
<p>
  #方法2：仅修改一条，返回bool($rs);
</p>
<p><img loading="lazy" decoding="async" width="677" height="468" src="/wp-content/uploads/2018/05/word-image-5641.png" class="wp-image-6195" srcset="/wp-content/uploads/2018/05/word-image-5641.png 677w, /wp-content/uploads/2018/05/word-image-5641-300x207.png 300w" sizes="(max-width: 677px) 100vw, 677px" /></p>
<p>
      //学习数据库测试方法
</p>
<p>
      public function db()
</p>
<p>
      {
</p>
<p>
          #方法1：多条，返回受影响的行数
</p>
<p>
  //        $rs = Day2T1::where(&#8216;id&#8217;, &#8216;&lt;&#8216;, 5)-&gt;update([
</p>
<p>
  //            &#8216;uname&#8217; =&gt; &#8216;a2&#8217;
</p>
<p>
  //        ]);
</p>
<p>
  //        var_dump($rs);
</p>
<p>
          #方法2：仅修改一条，返回bool($rs);
</p>
<p>
          $day2T1 = Day2T1::find(1);
</p>
<p>
          $day2T1-&gt;uname = &#8216;bbbb&#8217;;
</p>
<p>
          $day2T1-&gt;content = &#8216;ccccc&#8217;;
</p>
<p>
          $rs = $day2T1-&gt;save();
</p>
<p>
          var_dump($rs);
</p>
<p>
      }
</p>
<h3><a id="post-6168-_Toc487990948"></a>4）删除数据</h3>
<ul>
<li>
    语法
  </li>
<li>
    方法1：模型名::where（）-&gt;delete（）
  </li>
<li>
    方法2：
  </li>
</ul>
<p>
  $模型名 = 模型名::find(主键)
</p>
<p>
  $模型名-&gt;delete（）
</p>
<ul>
<li>
    练习
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="694" height="486" src="/wp-content/uploads/2018/05/word-image-5642.png" class="wp-image-6196" srcset="/wp-content/uploads/2018/05/word-image-5642.png 694w, /wp-content/uploads/2018/05/word-image-5642-300x210.png 300w" sizes="(max-width: 694px) 100vw, 694px" /></p>
<p>
      //学习数据库测试方法
</p>
<p>
      public function db()
</p>
<p>
      {
</p>
<p>
          $rs = Day2T1::destroy(12);
</p>
<p>
          var_dump($rs);die;
</p>
<p>
  //        $rs = Day2T1::where(&#8216;id&#8217;, &#8216;&lt;&#8216;, 6)-&gt;delete();
</p>
<p>
  //        var_dump($rs);
</p>
<p>
  //        $day2T1 = Day2T1::find(6);
</p>
<p>
  //        $rs = $day2T1-&gt;delete();
</p>
<p>
  //        var_dump($rs);
</p>
<p>
      }
</p>
<h1>︴将数据转化为数组（强烈不推荐使用）</h1>
<p><img loading="lazy" decoding="async" width="864" height="601" src="/wp-content/uploads/2018/05/word-image-5643.png" class="wp-image-6197" srcset="/wp-content/uploads/2018/05/word-image-5643.png 864w, /wp-content/uploads/2018/05/word-image-5643-300x209.png 300w, /wp-content/uploads/2018/05/word-image-5643-768x534.png 768w" sizes="(max-width: 864px) 100vw, 864px" /></p>
<p>
  //数据库练习
</p>
<p>
  public function db()
</p>
<p>
  {
</p>
<p>
      echo &#8216;&lt;pre&gt;&#8217;;
</p>
<p>
      #DB first 不可以
</p>
<p>
  //       $day2 = DB::table(&#8216;day2_t1&#8217;)-&gt;first()-&gt;toArray();
</p>
<p>
  //       dd($day2);
</p>
<p>
      #DB get  可以，数组里面是小对象
</p>
<p>
  //        $day2 = DB::table(&#8216;day2_t1&#8217;)-&gt;get()-&gt;toArray();
</p>
<p>
  //        print_r($day2);
</p>
<p>
      #模型 first 可以，数组
</p>
<p>
  //        $day2 = Day2T1Model::first()-&gt;toArray();
</p>
<p>
  //        print_r($day2);
</p>
<p>
      #模型 get   可以，数组里面是数组
</p>
<p>
  //        $day2 = Day2T1Model::get()-&gt;toArray();
</p>
<p>
  //        print_r($day2);
</p>
<p>
      #为什么不推荐使用
</p>
<p>
  //        $day2 = Day2T1Model::where(&#8216;id&#8217;, 1)-&gt;first()-&gt;toArray();
</p>
<p>
  //        print_r($day2);
</p>
<p>
  //        if ($day2) {
</p>
<p>
  //            //进一步操作
</p>
<p>
  //        }
</p>
<p>
      #说明因为容易出现查询不到数据，转化报错  所以尽量不用
</p>
<p>
  }
</p>
<h1><a id="post-6168-_Toc487990950"></a>七、内置分页功能使用</h1>
<h2>1、说明</h2>
<p>
  项目百分百需要使用分页、为了让开发者更快速开发项目，Laravel提供了paginate方法
</p>
<h2>练习</h2>
<p>
  控制器
</p>
<p><img loading="lazy" decoding="async" width="908" height="482" src="/wp-content/uploads/2018/05/word-image-5644.png" class="wp-image-6198" srcset="/wp-content/uploads/2018/05/word-image-5644.png 908w, /wp-content/uploads/2018/05/word-image-5644-300x159.png 300w, /wp-content/uploads/2018/05/word-image-5644-768x408.png 768w" sizes="(max-width: 908px) 100vw, 908px" /></p>
<p>
  视图
</p>
<p><img loading="lazy" decoding="async" width="613" height="377" src="/wp-content/uploads/2018/05/word-image-5645.png" class="wp-image-6199" srcset="/wp-content/uploads/2018/05/word-image-5645.png 613w, /wp-content/uploads/2018/05/word-image-5645-300x185.png 300w" sizes="(max-width: 613px) 100vw, 613px" /></p>
<p>
  @foreach ($data as $item)
</p>
<p>
      {{ $item-&gt;id }}
</p>
<p>
      {{ $item-&gt;uname }}
</p>
<p>
      &lt;br /&gt;
</p>
<p>
  @endforeach
</p>
<p>
  &lt;hr /&gt;
</p>
<p>
  {{ $data-&gt;links() }}
</p>
<h2>3、自定义分页样式（美化分页）</h2>
<p><a href="https://www.cnblogs.com/lamp01/p/6869762.html">https://www.cnblogs.com/lamp01/p/6869762.html</a>
</p>
<p>
  @foreach ($data as $item)
</p>
<p>
      {{ $item-&gt;id }}
</p>
<p>
      {{ $item-&gt;uname }}
</p>
<p>
      &lt;br /&gt;
</p>
<p>
  @endforeach
</p>
<p>
  &lt;hr /&gt;
</p>
<p>
  //CSS样式
</p>
<p>
  &lt;style type=&#8221;text/css&#8221;&gt;
</p>
<p>
      #pull_right{
</p>
<p>
          text-align:center;
</p>
<p>
      }
</p>
<p>
      .pull-right {
</p>
<p>
          /*float: left!important;*/
</p>
<p>
      }
</p>
<p>
      .pagination {
</p>
<p>
          display: inline-block;
</p>
<p>
          padding-left: 0;
</p>
<p>
          margin: 20px 0;
</p>
<p>
          border-radius: 4px;
</p>
<p>
      }
</p>
<p>
      .pagination &gt; li {
</p>
<p>
          display: inline;
</p>
<p>
      }
</p>
<p>
      .pagination &gt; li &gt; a,
</p>
<p>
      .pagination &gt; li &gt; span {
</p>
<p>
          position: relative;
</p>
<p>
          float: left;
</p>
<p>
          padding: 6px 12px;
</p>
<p>
          margin-left: -1px;
</p>
<p>
          line-height: 1.42857143;
</p>
<p>
          color: #428bca;
</p>
<p>
          text-decoration: none;
</p>
<p>
          background-color: #fff;
</p>
<p>
          border: 1px solid #ddd;
</p>
<p>
      }
</p>
<p>
      .pagination &gt; li:first-child &gt; a,
</p>
<p>
      .pagination &gt; li:first-child &gt; span {
</p>
<p>
          margin-left: 0;
</p>
<p>
          border-top-left-radius: 4px;
</p>
<p>
          border-bottom-left-radius: 4px;
</p>
<p>
      }
</p>
<p>
      .pagination &gt; li:last-child &gt; a,
</p>
<p>
      .pagination &gt; li:last-child &gt; span {
</p>
<p>
          border-top-right-radius: 4px;
</p>
<p>
          border-bottom-right-radius: 4px;
</p>
<p>
      }
</p>
<p>
      .pagination &gt; li &gt; a:hover,
</p>
<p>
      .pagination &gt; li &gt; span:hover,
</p>
<p>
      .pagination &gt; li &gt; a:focus,
</p>
<p>
      .pagination &gt; li &gt; span:focus {
</p>
<p>
          color: #2a6496;
</p>
<p>
          background-color: #eee;
</p>
<p>
          border-color: #ddd;
</p>
<p>
      }
</p>
<p>
      .pagination &gt; .active &gt; a,
</p>
<p>
      .pagination &gt; .active &gt; span,
</p>
<p>
      .pagination &gt; .active &gt; a:hover,
</p>
<p>
      .pagination &gt; .active &gt; span:hover,
</p>
<p>
      .pagination &gt; .active &gt; a:focus,
</p>
<p>
      .pagination &gt; .active &gt; span:focus {
</p>
<p>
          z-index: 2;
</p>
<p>
          color: #fff;
</p>
<p>
          cursor: default;
</p>
<p>
          background-color: #428bca;
</p>
<p>
          border-color: #428bca;
</p>
<p>
      }
</p>
<p>
      .pagination &gt; .disabled &gt; span,
</p>
<p>
      .pagination &gt; .disabled &gt; span:hover,
</p>
<p>
      .pagination &gt; .disabled &gt; span:focus,
</p>
<p>
      .pagination &gt; .disabled &gt; a,
</p>
<p>
      .pagination &gt; .disabled &gt; a:hover,
</p>
<p>
      .pagination &gt; .disabled &gt; a:focus {
</p>
<p>
          color: #777;
</p>
<p>
          cursor: not-allowed;
</p>
<p>
          background-color: #fff;
</p>
<p>
          border-color: #ddd;
</p>
<p>
      }
</p>
<p>
      .clear{
</p>
<p>
          clear: both;
</p>
<p>
      }
</p>
<p>
      li.active span {background: red !important;}
</p>
<p>
  &lt;/style&gt;
</p>
<p>
  //blade模板展示
</p>
<p>
  &lt;div id=&#8221;pull_right&#8221;&gt;
</p>
<p>
      &lt;div class=&#8221;pull-right&#8221;&gt;
</p>
<p>
          {!! $data-&gt;links() !!}
</p>
<p>
      &lt;/div&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<h1>扩展任务</h1>
<ol>
<li>
  自定义错误页面，百度关键词：laravel自定义错误页面
</li>
<li>
  搜索功能
</li>
<li>
  通过jq日期插件   开始时间  结束时间（http://www.my97.net/demo/index.htm ）
</li>
</ol>
<p><img loading="lazy" decoding="async" width="745" height="337" src="/wp-content/uploads/2018/05/word-image-5646.png" class="wp-image-6200" srcset="/wp-content/uploads/2018/05/word-image-5646.png 745w, /wp-content/uploads/2018/05/word-image-5646-300x136.png 300w" sizes="(max-width: 745px) 100vw, 745px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6168.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Laravel框架（三）Composer、数据迁移、学生管理小项目（登录模块、学生列表）</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6119.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6119.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 16:09:30 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[学生列表）]]></category>
		<category><![CDATA[学生管理小项目（登录模块]]></category>
		<category><![CDATA[数据迁移]]></category>
		<guid isPermaLink="false">/?p=6119</guid>

					<description><![CDATA[Laravel框架第3天 一、学习Composer 1、了解Composer 1）什么是Composer Co [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1><a id="post-6119-_Toc487903166"></a>Laravel框架第3天</h1>
<h1>一、学习Composer</h1>
<h2>1、了解Composer</h2>
<h3>1）什么是Composer</h3>
<p><img loading="lazy" decoding="async" width="233" height="272" src="/wp-content/uploads/2018/05/word-image-5568.png" class="wp-image-6120" /></p>
<p>
  Composer是 PHP 用来管理依赖（dependency）关系的工具。你可以在自己的项目中声明所依赖的外部工具库（libraries），Composer 会帮你安装这些依赖的库文件。
</p>
<h3>2）理解</h3>
<ul>
<li>
    如果PHP是win操作系统，composer就是杀毒软件的软件管家
  </li>
<li>
    如果PHP是Linux操作系统，composer就是yum
  </li>
</ul>
<p>
  之前：项目中需要发送邮件、验证码等功能必须自己去网上下载整合到项目中
</p>
<p>
  现在：通过composer命令安装自动整合到项目中
</p>
<h3>3）总结</h3>
<p>
  Composer是为PHP准备的软件管家，项目所需工具库都可以通过Composer下载
</p>
<h2>下载Composer</h2>
<h3>❉ 官网</h3>
<ul>
<li>
    官方网站：<a href="https://getcomposer.org/">https://getcomposer.org/</a>    		（安装下载composer用）
  </li>
<li>
    中文网站：<a href="http://www.phpcomposer.com/">http://www.phpcomposer.com/</a> （学习，切换镜像）
  </li>
<li>
    仓库地址：<a href="https://packagist.org/">https://packagist.org/</a> 			（存放组件的仓库，需翻墙）
  </li>
</ul>
<h3>※ 方法1：说明，下载并安装（不推荐）</h3>
<ul>
<li>
    下载composer-setup.exe文件安装
  </li>
<li>
    好处：傻瓜式、安装简单
  </li>
<li>
    坏处：容易报错、仅win操作系统使用
  </li>
</ul>
<p><strong>步骤1：下载</strong>
</p>
<p><img loading="lazy" decoding="async" width="568" height="380" src="/wp-content/uploads/2018/05/word-image-5569.png" class="wp-image-6121" srcset="/wp-content/uploads/2018/05/word-image-5569.png 568w, /wp-content/uploads/2018/05/word-image-5569-300x201.png 300w" sizes="(max-width: 568px) 100vw, 568px" /></p>
<p><strong>步骤2：双击</strong>
</p>
<p><img loading="lazy" decoding="async" width="425" height="144" src="/wp-content/uploads/2018/05/word-image-5570.png" class="wp-image-6122" srcset="/wp-content/uploads/2018/05/word-image-5570.png 425w, /wp-content/uploads/2018/05/word-image-5570-300x102.png 300w" sizes="(max-width: 425px) 100vw, 425px" /></p>
<p><strong>步骤3：安装（注：除下图选择php.exe其余直接下一步next）:</strong>
</p>
<p><img loading="lazy" decoding="async" width="553" height="271" src="/wp-content/uploads/2018/05/word-image-5571.png" class="wp-image-6123" srcset="/wp-content/uploads/2018/05/word-image-5571.png 553w, /wp-content/uploads/2018/05/word-image-5571-300x147.png 300w" sizes="(max-width: 553px) 100vw, 553px" /></p>
<p><strong>步骤4：检查是否安装成功（在DOS窗口输入 composer出现下图字样则安装成功）</strong>
</p>
<p><img loading="lazy" decoding="async" width="647" height="318" src="/wp-content/uploads/2018/05/word-image-5572.png" class="wp-image-6124" srcset="/wp-content/uploads/2018/05/word-image-5572.png 647w, /wp-content/uploads/2018/05/word-image-5572-300x147.png 300w" sizes="(max-width: 647px) 100vw, 647px" /></p>
<h3>※ 方法2：说明，下载并安装（推荐使用）</h3>
<ul>
<li>
    下载composer.phar文件安装
  </li>
<li>
    好处：跨平台
  </li>
<li>
    坏处：渣渣上手难
  </li>
</ul>
<p><strong>步骤1：下载（打开网页，拖拽到底部）</strong>
</p>
<p><img loading="lazy" decoding="async" width="678" height="313" src="/wp-content/uploads/2018/05/word-image-5573.png" class="wp-image-6125" srcset="/wp-content/uploads/2018/05/word-image-5573.png 678w, /wp-content/uploads/2018/05/word-image-5573-300x138.png 300w" sizes="(max-width: 678px) 100vw, 678px" /></p>
<p><strong>步骤2：该文件免安装所以可以直接使用</strong>
</p>
<p><strong>步骤2：检查是否安装成功（在DOS窗口输入 composer出现下图字样则安装成功）</strong>
</p>
<p><img loading="lazy" decoding="async" width="806" height="318" src="/wp-content/uploads/2018/05/word-image-5574.png" class="wp-image-6126" srcset="/wp-content/uploads/2018/05/word-image-5574.png 806w, /wp-content/uploads/2018/05/word-image-5574-300x118.png 300w, /wp-content/uploads/2018/05/word-image-5574-768x303.png 768w" sizes="(max-width: 806px) 100vw, 806px" /></p>
<h2>语法</h2>
<p><a href="http://docs.phpcomposer.com/03-cli.html">http://docs.phpcomposer.com/03-cli.html</a>
</p>
<p>
  composer install 			#第一次从远处仓库拉去php包的时候执行
</p>
<p>
  composer update 			#修改本地的composer.json后执行（安装，更新）
</p>
<p>
  composer require  			#包含/下载一个php包到vendor目录中
</p>
<p>
  composer init 				#创建一个composer.json文件（不推荐，自己手动创建即可）
</p>
<p>
  composer about 				#查看composer的信息
</p>
<p>
  composer self-update			#composer自己更新
</p>
<p>
  composer list				#查看帮助
</p>
<h2>︴简化Composer命令</h2>
<ul>
<li>
    复杂：php composer.phar 指令
  </li>
<li>
    简化：composer 指令
  </li>
</ul>
<p>
  说明：后期大量使用composer命令，语法：【php composer.phar 指令】
</p>
<p>
  发现：每次重复敲【php composer.phar】太长
</p>
<p>
  解决：
</p>
<p>
  步骤1：将composer.phar放到www目录中
</p>
<p>
  步骤2：打开DOS窗口输入DOS命令<strong>echo @php &#8220;%~dp0composer.phar&#8221; %*&gt;composer.bat</strong>（注：执行命令后会自动创建.bat文件）
</p>
<p><img loading="lazy" decoding="async" width="722" height="190" src="/wp-content/uploads/2018/05/word-image-5575.png" class="wp-image-6127" srcset="/wp-content/uploads/2018/05/word-image-5575.png 722w, /wp-content/uploads/2018/05/word-image-5575-300x79.png 300w" sizes="(max-width: 722px) 100vw, 722px" /></p>
<p>
  步骤3：将composer.bat将去环境变量
</p>
<p><img loading="lazy" decoding="async" width="1248" height="717" src="/wp-content/uploads/2018/05/word-image-5576.png" class="wp-image-6128" srcset="/wp-content/uploads/2018/05/word-image-5576.png 1248w, /wp-content/uploads/2018/05/word-image-5576-300x172.png 300w, /wp-content/uploads/2018/05/word-image-5576-768x441.png 768w, /wp-content/uploads/2018/05/word-image-5576-1024x588.png 1024w" sizes="(max-width: 1248px) 100vw, 1248px" /></p>
<p>
  步骤4：验证
</p>
<p><img loading="lazy" decoding="async" width="464" height="255" src="/wp-content/uploads/2018/05/word-image-5577.png" class="wp-image-6129" srcset="/wp-content/uploads/2018/05/word-image-5577.png 464w, /wp-content/uploads/2018/05/word-image-5577-300x165.png 300w" sizes="(max-width: 464px) 100vw, 464px" /></p>
<h2>4、Composer下载软件包流程</h2>
<p><img loading="lazy" decoding="async" width="641" height="77" src="/wp-content/uploads/2018/05/word-image-5578.png" class="wp-image-6130" srcset="/wp-content/uploads/2018/05/word-image-5578.png 641w, /wp-content/uploads/2018/05/word-image-5578-300x36.png 300w" sizes="(max-width: 641px) 100vw, 641px" /></p>
<h1>二、数据迁移</h1>
<h2>1、概念</h2>
<p>
  数据迁移就是使用PHP管理数据库
</p>
<h2>传统数据管理和数据迁移区别</h2>
<p><img loading="lazy" decoding="async" width="700" height="401" src="/wp-content/uploads/2018/05/word-image-5579.png" class="wp-image-6131" srcset="/wp-content/uploads/2018/05/word-image-5579.png 700w, /wp-content/uploads/2018/05/word-image-5579-300x172.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<h2>语法</h2>
<h3>︴手册</h3>
<p><a href="http://laravelacademy.org/post/6964.html">http://laravelacademy.org/post/6964.html</a>
</p>
</p>
<h3>调用方法声明创建字段</h3>
<ul>
<li>
    php artisan make:migration 数据迁移名称
  </li>
<li>
    php artisan make:migration create_表名_table  &#8211;create=表名	 （创建表）
  </li>
<li>
    php artisan make:migration update_表名_table  &#8211;table=表名  （修改表）
  </li>
</ul>
<p>
  问：三个语法区别
</p>
<p>
  答：相对而言语法2语法3比语法1多了一些数据，便于创建和修改表
</p>
<h3>2）运行/撤销迁移</h3>
<ul>
<li>
    运行：php  artisan  migrate
  </li>
<li>
    撤销：php  artisan  migrate:rollback
  </li>
</ul>
<h2>︴初体验（创建表、修改表）</h2>
<ul>
<li>
    需求：创建表a（字段：id，uname）
  </li>
</ul>
<p>
  步骤1：创建数据迁移文件（也就是创建一个php文件 管理生成a表）
</p>
<p><img loading="lazy" decoding="async" width="1092" height="447" src="/wp-content/uploads/2018/05/word-image-5581.png" class="wp-image-6133" srcset="/wp-content/uploads/2018/05/word-image-5581.png 1092w, /wp-content/uploads/2018/05/word-image-5581-300x123.png 300w, /wp-content/uploads/2018/05/word-image-5581-768x314.png 768w, /wp-content/uploads/2018/05/word-image-5581-1024x419.png 1024w" sizes="(max-width: 1092px) 100vw, 1092px" /></p>
<p>
  public function up()
</p>
<p>
  {
</p>
<p>
      Schema::create(&#8216;a&#8217;, function (Blueprint $table) {
</p>
<p>
          $table-&gt;increments(&#8216;id&#8217;);
</p>
<p>
          $table-&gt;string(&#8216;name&#8217;, 30);
</p>
<p>
      });
</p>
<p>
  }
</p>
<p><img loading="lazy" decoding="async" width="1193" height="570" src="/wp-content/uploads/2018/05/word-image-5582.png" class="wp-image-6134" srcset="/wp-content/uploads/2018/05/word-image-5582.png 1193w, /wp-content/uploads/2018/05/word-image-5582-300x143.png 300w, /wp-content/uploads/2018/05/word-image-5582-768x367.png 768w, /wp-content/uploads/2018/05/word-image-5582-1024x489.png 1024w" sizes="(max-width: 1193px) 100vw, 1193px" /></p>
<ul>
<li>
    需求：修改表a（name改成varchar类型长度为1、增加一个创建于created_at字段）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1177" height="596" src="/wp-content/uploads/2018/05/word-image-5583.png" class="wp-image-6135" srcset="/wp-content/uploads/2018/05/word-image-5583.png 1177w, /wp-content/uploads/2018/05/word-image-5583-300x152.png 300w, /wp-content/uploads/2018/05/word-image-5583-768x389.png 768w, /wp-content/uploads/2018/05/word-image-5583-1024x519.png 1024w" sizes="(max-width: 1177px) 100vw, 1177px" /></p>
<p>
  public function up()
</p>
<p>
  {
</p>
<p>
      Schema::table(&#8216;a&#8217;, function (Blueprint $table) {
</p>
<p>
          //改已存在的字段类型
</p>
<p>
          $table-&gt;string(&#8216;name&#8217;, 4)-&gt;change();
</p>
<p>
          //新增
</p>
<p>
          $table-&gt;integer(&#8216;created_at&#8217;);
</p>
<p>
      });
</p>
<p>
  }
</p>
<h2>︴练习1：通过数据迁移创建下属表</h2>
<h3>1）原声SQL</h3>
<p>
  create table day3_t2 (
</p>
<p>
  id int primary key auto_increment comment &#8216;编号&#8217;,
</p>
<p>
  uname varchar(30) not null comment &#8216;用户名&#8217;,
</p>
<p>
  pwd char(32) not null comment &#8216;密码&#8217;,
</p>
<p>
  content text not null comment &#8216;内容&#8217;,
</p>
<p>
  created_at int not null default 0 comment &#8216;创建于&#8217;,
</p>
<p>
  updated_at int not null default 0 comment &#8216;更新于&#8217;
</p>
<p>
  )engine=myisam charset=utf8;
</p>
<h3>数据迁移</h3>
<p>
  步骤1：创建迁移文件（php artisan make:migration create_day3_t2_table &#8211;create=day3_t2）
</p>
<p>
  步骤2：编写迁移代码
</p>
<p><img loading="lazy" decoding="async" width="1124" height="643" src="/wp-content/uploads/2018/05/word-image-5584.png" class="wp-image-6136" srcset="/wp-content/uploads/2018/05/word-image-5584.png 1124w, /wp-content/uploads/2018/05/word-image-5584-300x172.png 300w, /wp-content/uploads/2018/05/word-image-5584-768x439.png 768w, /wp-content/uploads/2018/05/word-image-5584-1024x586.png 1024w" sizes="(max-width: 1124px) 100vw, 1124px" /></p>
<p>
  public function up()
</p>
<p>
  {
</p>
<p>
      Schema::create(&#8216;day3_t2&#8217;, function (Blueprint $table) {
</p>
<p>
  //            create table day3_t2 (
</p>
<p>
  //            id int primary key auto_increment comment &#8216;编号&#8217;,
</p>
<p>
  //            uname varchar(30) not null comment &#8216;用户名&#8217;,
</p>
<p>
  //            pwd char(32) not null comment &#8216;密码&#8217;,
</p>
<p>
  //            content text not null comment &#8216;内容&#8217;,
</p>
<p>
  //            created_at int not null default 0 comment &#8216;创建于&#8217;,
</p>
<p>
  //            updated_at int not null default 0 comment &#8216;更新于&#8217;
</p>
<p>
  //            )engine=myisam charset=utf8;
</p>
<p>
          //编码已数据库配置文件为主
</p>
<p>
          $table-&gt;engine = &#8216;myisam&#8217;;
</p>
<p>
          $table-&gt;increments(&#8216;id&#8217;)-&gt;comment(&#8216;编号&#8217;);
</p>
<p>
          $table-&gt;string(&#8216;uname&#8217;, 30)-&gt;comment(&#8216;用户名&#8217;);
</p>
<p>
          $table-&gt;char(&#8216;pwd&#8217;, 32)-&gt;comment(&#8216;密码&#8217;);
</p>
<p>
          $table-&gt;text(&#8216;content&#8217;)-&gt;comment(&#8216;内容&#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>
      });
</p>
<p>
  }
</p>
<h2>︴练习2：通过SQL语句修复线上BUG</h2>
<h3>1）原声SQL</h3>
<p>
  #首先插入一条数据，然后test改为test2
</p>
<p>
  insert into day3_t2
</p>
<p>
  values
</p>
<p>
  (null,&#8217;test&#8217;,&#8217;adfadsf&#8217;,&#8217;dfads&#8217;,0,0);
</p>
<h3>2）数据迁移</h3>
<p>
  #创建数据迁移文件，文件名规则：fix_bug_BUG版本号
</p>
<p>
  #将用户名改成test2
</p>
<p><img loading="lazy" decoding="async" width="1139" height="640" src="/wp-content/uploads/2018/05/word-image-5585.png" class="wp-image-6137" srcset="/wp-content/uploads/2018/05/word-image-5585.png 1139w, /wp-content/uploads/2018/05/word-image-5585-300x169.png 300w, /wp-content/uploads/2018/05/word-image-5585-768x432.png 768w, /wp-content/uploads/2018/05/word-image-5585-1024x575.png 1024w" sizes="(max-width: 1139px) 100vw, 1139px" /></p>
<p>
  public function up()
</p>
<p>
  {
</p>
<p>
      DB::table(&#8216;day3_t2&#8217;)-&gt;where(&#8216;uname&#8217;, &#8216;test&#8217;)-&gt;update([
</p>
<p>
          &#8216;uname&#8217;=&gt;&#8217;test2&#8217;
</p>
<p>
      ]);
</p>
<p>
  }
</p>
<h1>三、填充数据（seeder）</h1>
<h2>1、概念</h2>
<ul>
<li>
    数据迁移：就是使用php管理数据库
  </li>
<li>
    填充数据：就是使用php快速插入测试数据
  </li>
</ul>
<h2>2、语法（seeder）</h2>
<p>
  创建填充器：php artisan make:seeder 填充器名称  （推荐：表名TableSeeder 大驼峰）
</p>
<p>
  运行填充器：php artisan db:seed &#8211;class=填充器名称
</p>
<h2>︴练习1：给day3_t2插入两百条数据</h2>
<p>
  准备文件
</p>
<p>
  php artisan make:seeder Day3t2TableSeeder
</p>
<p>
  执行
</p>
<p><img loading="lazy" decoding="async" width="1326" height="639" src="/wp-content/uploads/2018/05/word-image-5586.png" class="wp-image-6138" srcset="/wp-content/uploads/2018/05/word-image-5586.png 1326w, /wp-content/uploads/2018/05/word-image-5586-300x145.png 300w, /wp-content/uploads/2018/05/word-image-5586-768x370.png 768w, /wp-content/uploads/2018/05/word-image-5586-1024x493.png 1024w" sizes="(max-width: 1326px) 100vw, 1326px" /></p>
<h2>︴练习2：faker使用</h2>
<h3>1）概念</h3>
<ul>
<li>
    说明：faker就是PHP的一个库（类）
  </li>
<li>
    作用：生成假数据，如手机号、地址、姓名等
  </li>
<li>
    地址：<a href="https://packagist.org/packages/fzaninotto/faker">https://packagist.org/packages/fzaninotto/faker</a>
  </li>
<li>
    地址：<a href="https://github.com/fzaninotto/Faker#fakerproviderimage">https://github.com/fzaninotto/Faker#fakerproviderimage</a>
  </li>
</ul>
<h3>使用</h3>
<p>
  步骤1：下载（composer require fzaninotto/faker）
</p>
<p>
  步骤2：使用
</p>
<p><img loading="lazy" decoding="async" width="1302" height="502" src="/wp-content/uploads/2018/05/word-image-5587.png" class="wp-image-6139" srcset="/wp-content/uploads/2018/05/word-image-5587.png 1302w, /wp-content/uploads/2018/05/word-image-5587-300x116.png 300w, /wp-content/uploads/2018/05/word-image-5587-768x296.png 768w, /wp-content/uploads/2018/05/word-image-5587-1024x395.png 1024w" sizes="(max-width: 1302px) 100vw, 1302px" /></p>
<p>
  Route::get(&#8216;/test&#8217;, function() {
</p>
<p>
      $faker = \Faker\Factory::create(&#8216;zh_CN&#8217;);
</p>
<p>
      echo $faker-&gt;name . &#8216;&lt;br /&gt;&#8217;;
</p>
<p>
      echo $faker-&gt;email . &#8216;&lt;br /&gt;&#8217;;
</p>
<p>
      echo $faker-&gt;phoneNumber . &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
      echo $faker-&gt;company . &#8216;&lt;br /&gt;&#8217;;
</p>
<p>
      echo $faker-&gt;city . &#8216;&lt;br /&gt;&#8217;;
</p>
<p>
      echo $faker-&gt;unixTime . &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
      echo $faker-&gt;imageUrl() . &#8216;&lt;br /&gt;&#8217;;
</p>
<p>
      echo $faker-&gt;imageUrl(50,50) . &#8216;&lt;hr /&gt;&#8217;;
</p>
<p>
      echo $faker-&gt;paragraph(20) . &#8216;&lt;br /&gt;&#8217;;
</p>
<p>
  });
</p>
<h3>整合数据填充</h3>
<p><img loading="lazy" decoding="async" width="1183" height="615" src="/wp-content/uploads/2018/05/word-image-5588.png" class="wp-image-6140" srcset="/wp-content/uploads/2018/05/word-image-5588.png 1183w, /wp-content/uploads/2018/05/word-image-5588-300x156.png 300w, /wp-content/uploads/2018/05/word-image-5588-768x399.png 768w, /wp-content/uploads/2018/05/word-image-5588-1024x532.png 1024w" sizes="(max-width: 1183px) 100vw, 1183px" /></p>
<p>
  public function run()
</p>
<p>
  {
</p>
<p>
      for ($i = 0; $i &lt; 100; $i++) {
</p>
<p>
          $faker = \Faker\Factory::create(&#8216;zh_CN&#8217;);
</p>
<p>
          $insertData[] = [
</p>
<p>
              &#8216;uname&#8217; =&gt; $faker-&gt;name,
</p>
<p>
              &#8216;pwd&#8217; =&gt; $faker-&gt;password,
</p>
<p>
              &#8216;content&#8217; =&gt; $faker-&gt;paragraph(20)
</p>
<p>
          ];
</p>
<p>
      }
</p>
<p>
      DB::table(&#8216;day3_t2&#8217;)-&gt;insert($insertData);
</p>
<p>
  }
</p>
<h1>小总结</h1>
<p>
  什么是数据迁移：就是用PHP文件管理数据库
</p>
<p>
  语法：
</p>
<p>
  1）  php  artisan make:migration 迁移文件名称
</p>
<p>
  2）  php  artisan make:migration create_表名_table  &#8211;create=表名
</p>
<p>
  3）  php  artisan make:migration update_表名_table  &#8211;table=表名
</p>
<p>
  运行迁移文件：php artisan migrate
</p>
<p>
  撤销迁移文件：php artisan migrate:rollback
</p>
<p>
  什么是数据填充：就是用PHP插入测试数据
</p>
<p>
  什么是faker：就是PHP一个类，这个类生成假数据
</p>
<p>
  数据填充： php artisan make:seeder 填充器名称/文件名   （注：推荐表名TableSeeder  大驼峰）
</p>
<p>
  执行填充： php artisan db:seed &#8211;class=填充器名/文件名
</p>
<h1>四、学生管理小项目（登录模块）</h1>
<h2>1、准备</h2>
<h3>1）根据效果图（静态模板）设计表</h3>
<p><img loading="lazy" decoding="async" width="1657" height="903" src="/wp-content/uploads/2018/05/word-image-5589.png" class="wp-image-6141" srcset="/wp-content/uploads/2018/05/word-image-5589.png 1657w, /wp-content/uploads/2018/05/word-image-5589-300x163.png 300w, /wp-content/uploads/2018/05/word-image-5589-768x419.png 768w, /wp-content/uploads/2018/05/word-image-5589-1024x558.png 1024w" sizes="(max-width: 1657px) 100vw, 1657px" /><br />
<img loading="lazy" decoding="async" width="1152" height="461" src="/wp-content/uploads/2018/05/word-image-5590.png" class="wp-image-6142" srcset="/wp-content/uploads/2018/05/word-image-5590.png 1152w, /wp-content/uploads/2018/05/word-image-5590-300x120.png 300w, /wp-content/uploads/2018/05/word-image-5590-768x307.png 768w, /wp-content/uploads/2018/05/word-image-5590-1024x410.png 1024w" sizes="(max-width: 1152px) 100vw, 1152px" /></p>
<p>
  create database laravel54;
</p>
<p>
  use laravel54;
</p>
<p>
  create table student(
</p>
<p>
  id int primary key auto_increment comment &#8216;编号&#8217;,
</p>
<p>
  uname varchar(45) not null comment &#8216;用户名&#8217;,
</p>
<p>
  pwd varchar(255) not null comment &#8216;密码&#8217;,
</p>
<p>
  age tinyint(3) not null default 0 comment &#8216;年龄&#8217;,
</p>
<p>
  sex tinyint(1) not null default 1 comment &#8216;性别：1-男,2-女&#8217;,
</p>
<p>
  created_at int not null default 0 comment &#8216;创建于&#8217;,
</p>
<p>
  updated_at int not null default 0 comment &#8216;更新于&#8217;
</p>
<p>
  )engine=myisam charset=utf8;
</p>
<p>
  Laravel存储用户密码非MD5算法，而是使用php5.5新函数password_hash和password_verify
</p>
<p>
  加密语法：Hash::make(&#8216;admin888&#8217;);  或者  bcrypt(&#8216;admin888&#8217;);
</p>
<p>
  校验语法：Hash::check(&#8216;admin888&#8217;, 密文);
</p>
<p><img loading="lazy" decoding="async" width="770" height="242" src="/wp-content/uploads/2018/05/word-image-5591.png" class="wp-image-6143" srcset="/wp-content/uploads/2018/05/word-image-5591.png 770w, /wp-content/uploads/2018/05/word-image-5591-300x94.png 300w, /wp-content/uploads/2018/05/word-image-5591-768x241.png 768w" sizes="(max-width: 770px) 100vw, 770px" /></p>
<h3>2）通过PHP创建表并填充数据（数据迁移和填充数据）</h3>
<ul>
<li>
    数据迁移
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1248" height="614" src="/wp-content/uploads/2018/05/word-image-5592.png" class="wp-image-6144" srcset="/wp-content/uploads/2018/05/word-image-5592.png 1248w, /wp-content/uploads/2018/05/word-image-5592-300x148.png 300w, /wp-content/uploads/2018/05/word-image-5592-768x378.png 768w, /wp-content/uploads/2018/05/word-image-5592-1024x504.png 1024w" sizes="(max-width: 1248px) 100vw, 1248px" /></p>
<p>
  public function up()
</p>
<p>
  {
</p>
<p>
  //        create table student(
</p>
<p>
  //        id int primary key auto_increment comment &#8216;编号&#8217;,
</p>
<p>
  //        uname varchar(45) not null comment &#8216;用户名&#8217;,
</p>
<p>
  //        pwd varchar(255) not null comment &#8216;密码&#8217;,
</p>
<p>
  //        age tinyint(3) not null default 0 comment &#8216;年龄&#8217;,
</p>
<p>
  //        sex tinyint(1) not null default 1 comment &#8216;性别：1-男,2-女&#8217;,
</p>
<p>
  //        created_at int not null default 0 comment &#8216;创建于&#8217;,
</p>
<p>
  //        updated_at int not null default 0 comment &#8216;更新于&#8217;
</p>
<p>
  //        )engine=myisam charset=utf8;
</p>
<p>
      Schema::create(&#8216;student&#8217;, function (Blueprint $table) {
</p>
<p>
          $table-&gt;increments(&#8216;id&#8217;)-&gt;comment(&#8216;编号&#8217;);
</p>
<p>
          $table-&gt;string(&#8216;uname&#8217;, 45)-&gt;comment(&#8216;用户名&#8217;);
</p>
<p>
          $table-&gt;string(&#8216;pwd&#8217;, 255)-&gt;comment(&#8216;密码&#8217;);
</p>
<p>
          $table-&gt;unsignedTinyInteger(&#8216;age&#8217;)-&gt;default(0)-&gt;comment(&#8216;年龄&#8217;);
</p>
<p>
          $table-&gt;unsignedTinyInteger(&#8216;sex&#8217;)-&gt;default(1)-&gt;comment(&#8216;性别：1-男,2-女&#8217;);
</p>
<p>
          $table-&gt;integer(&#8216;created_at&#8217;)-&gt;default(0)-&gt;comment(&#8216;创建于&#8217;);
</p>
<p>
          $table-&gt;integer(&#8216;updated_at&#8217;)-&gt;default(0)-&gt;comment(&#8216;更新于&#8217;);
</p>
<p>
      });
</p>
<p>
  }
</p>
<ul>
<li>
    创建模型
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1281" height="607" src="/wp-content/uploads/2018/05/word-image-5593.png" class="wp-image-6145" srcset="/wp-content/uploads/2018/05/word-image-5593.png 1281w, /wp-content/uploads/2018/05/word-image-5593-300x142.png 300w, /wp-content/uploads/2018/05/word-image-5593-768x364.png 768w, /wp-content/uploads/2018/05/word-image-5593-1024x485.png 1024w" sizes="(max-width: 1281px) 100vw, 1281px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Model;
</p>
<p>
  use Illuminate\Database\Eloquent\Model;
</p>
<p>
  class Student extends Model
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * 设置表名
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $table = &#8216;student&#8217;;
</p>
<p>
      /**
</p>
<p>
       * 声明可以批量设置的属性
</p>
<p>
       * @var array
</p>
<p>
       */
</p>
<p>
      protected $fillable   =  [&#8216;uname&#8217;, &#8216;pwd&#8217;, &#8216;age&#8217;, &#8216;sex&#8217;];
</p>
<p>
      /**
</p>
<p>
       * Unix时间戳填充数据（注：默认托管创建于更新于）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $dateFormat = &#8216;U&#8217;;
</p>
<p>
  }
</p>
<ul>
<li>
    填充数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1296" height="595" src="/wp-content/uploads/2018/05/word-image-5594.png" class="wp-image-6146" srcset="/wp-content/uploads/2018/05/word-image-5594.png 1296w, /wp-content/uploads/2018/05/word-image-5594-300x138.png 300w, /wp-content/uploads/2018/05/word-image-5594-768x353.png 768w, /wp-content/uploads/2018/05/word-image-5594-1024x470.png 1024w" sizes="(max-width: 1296px) 100vw, 1296px" /></p>
<p>
  说明：tinker是Laravel自带的便于调试数据库的工具
</p>
<p>
  运行：php artisan tinker
</p>
<p>
  指令：通过模型操作数据库
</p>
<p>
  调用工厂文件：factory(App\Http\Model\AModel::class, 2)-&gt;create()
</p>
<p>
  脚下留心：工厂文件中定义的模型必须通过migration创建无法将无法找到模型
</p>
<h2>登录模块【加载视图】</h2>
<h3>1）思路</h3>
<ul>
<li>
    步骤1：定义路由 （/student/login 对应控制器 Student\LoginController@login）
  </li>
<li>
    步骤2：创建控制器并加载视图
  </li>
<li>
    步骤3：创建视图
  </li>
</ul>
<h3>代码</h3>
<ul>
<li>
    步骤1：定义路由 （/student/login 对应控制器 Student\LoginController@login）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1251" height="373" src="/wp-content/uploads/2018/05/word-image-5595.png" class="wp-image-6147" srcset="/wp-content/uploads/2018/05/word-image-5595.png 1251w, /wp-content/uploads/2018/05/word-image-5595-300x89.png 300w, /wp-content/uploads/2018/05/word-image-5595-768x229.png 768w, /wp-content/uploads/2018/05/word-image-5595-1024x305.png 1024w" sizes="(max-width: 1251px) 100vw, 1251px" /></p>
<ul>
<li>
    步骤2：创建控制器并加载视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1120" height="579" src="/wp-content/uploads/2018/05/word-image-5596.png" class="wp-image-6148" srcset="/wp-content/uploads/2018/05/word-image-5596.png 1120w, /wp-content/uploads/2018/05/word-image-5596-300x155.png 300w, /wp-content/uploads/2018/05/word-image-5596-768x397.png 768w, /wp-content/uploads/2018/05/word-image-5596-1024x529.png 1024w" sizes="(max-width: 1120px) 100vw, 1120px" /></p>
<ul>
<li>
    步骤3：创建视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1236" height="662" src="/wp-content/uploads/2018/05/word-image-5597.png" class="wp-image-6149" srcset="/wp-content/uploads/2018/05/word-image-5597.png 1236w, /wp-content/uploads/2018/05/word-image-5597-300x161.png 300w, /wp-content/uploads/2018/05/word-image-5597-768x411.png 768w, /wp-content/uploads/2018/05/word-image-5597-1024x548.png 1024w" sizes="(max-width: 1236px) 100vw, 1236px" /></p>
<h2>登录模块【登录数据处理】</h2>
<h3>1）思路</h3>
<ul>
<li>
    步骤1：修改登录视图form参数
  </li>
<li>
    步骤2：修改路由支持post提交（注：cstf 和 弹框资源处理）
  </li>
<li>
    步骤3：控制器方法增加判断，是否POST提交（是-添加数据，否-加载视图）
  </li>
</ul>
<h3>代码</h3>
<ul>
<li>
    步骤1：修改登录视图form参数（注：cstf 和 弹框资源处理）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1142" height="541" src="/wp-content/uploads/2018/05/word-image-5598.png" class="wp-image-6150" srcset="/wp-content/uploads/2018/05/word-image-5598.png 1142w, /wp-content/uploads/2018/05/word-image-5598-300x142.png 300w, /wp-content/uploads/2018/05/word-image-5598-768x364.png 768w, /wp-content/uploads/2018/05/word-image-5598-1024x485.png 1024w" sizes="(max-width: 1142px) 100vw, 1142px" /></p>
<p>
  弹框资源
</p>
<p><img loading="lazy" decoding="async" width="1147" height="331" src="/wp-content/uploads/2018/05/word-image-5599.png" class="wp-image-6151" srcset="/wp-content/uploads/2018/05/word-image-5599.png 1147w, /wp-content/uploads/2018/05/word-image-5599-300x87.png 300w, /wp-content/uploads/2018/05/word-image-5599-768x222.png 768w, /wp-content/uploads/2018/05/word-image-5599-1024x296.png 1024w" sizes="(max-width: 1147px) 100vw, 1147px" /></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>
<ul>
<li>
    步骤2：修改路由支持post提交
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1219" height="428" src="/wp-content/uploads/2018/05/word-image-5600.png" class="wp-image-6152" srcset="/wp-content/uploads/2018/05/word-image-5600.png 1219w, /wp-content/uploads/2018/05/word-image-5600-300x105.png 300w, /wp-content/uploads/2018/05/word-image-5600-768x270.png 768w, /wp-content/uploads/2018/05/word-image-5600-1024x360.png 1024w" sizes="(max-width: 1219px) 100vw, 1219px" /></p>
<ul>
<li>
    步骤3：控制器方法增加判断，是否POST提交（是-判断数据，否-加载视图）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1201" height="537" src="/wp-content/uploads/2018/05/word-image-5601.png" class="wp-image-6153" srcset="/wp-content/uploads/2018/05/word-image-5601.png 1201w, /wp-content/uploads/2018/05/word-image-5601-300x134.png 300w, /wp-content/uploads/2018/05/word-image-5601-768x343.png 768w, /wp-content/uploads/2018/05/word-image-5601-1024x458.png 1024w" sizes="(max-width: 1201px) 100vw, 1201px" /></p>
<p>
  public function login(Request $request)
</p>
<p>
  {
</p>
<p>
      //1.判断是否提交
</p>
<p>
      if ($request-&gt;isMethod(&#8216;post&#8217;)) {
</p>
<p>
          //2.接受数据
</p>
<p>
          $postData = $request-&gt;all();
</p>
<p>
          //3.根据用户名查询用户信息
</p>
<p>
          $student = Student::where(&#8216;uname&#8217;, $postData[&#8216;uname&#8217;])-&gt;first();
</p>
<p>
          //4.判断状态
</p>
<p>
          if (!$student || !Hash::check($postData[&#8216;pwd&#8217;], $student-&gt;pwd)) {
</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>
          //5.登录成功去首页
</p>
<p>
          return redirect(&#8216;/student&#8217;)-&gt;with([&#8216;state&#8217;=&gt;&#8217;success&#8217;, &#8216;tips&#8217;=&gt;&#8217;老铁，登录成功&#8217;]);
</p>
<p>
      } else {
</p>
<p>
          return view(&#8216;student.login.login&#8217;);
</p>
<p>
      }
</p>
<p>
  }
</p>
<p><img loading="lazy" decoding="async" width="796" height="283" src="/wp-content/uploads/2018/05/word-image-5602.png" class="wp-image-6154" srcset="/wp-content/uploads/2018/05/word-image-5602.png 796w, /wp-content/uploads/2018/05/word-image-5602-300x107.png 300w, /wp-content/uploads/2018/05/word-image-5602-768x273.png 768w" sizes="(max-width: 796px) 100vw, 796px" /></p>
<h1>五、学生管理小项目（学生列表）</h1>
<h2>1、学生列表</h2>
<h3>1）思路</h3>
<ul>
<li>
    步骤1：定义路由 （/student 对应控制器 Student\IndexController@index）
  </li>
<li>
    步骤2：创建控制器、查询所有数据、加载视图
  </li>
<li>
    步骤3：创建视图
  </li>
<li>
    步骤4：视图循环显示数据
  </li>
</ul>
<h3>2）代码</h3>
<ul>
<li>
    步骤1：定义路由 （/student 对应控制器 Student\IndexController@index）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1221" height="307" src="/wp-content/uploads/2018/05/word-image-5603.png" class="wp-image-6155" srcset="/wp-content/uploads/2018/05/word-image-5603.png 1221w, /wp-content/uploads/2018/05/word-image-5603-300x75.png 300w, /wp-content/uploads/2018/05/word-image-5603-768x193.png 768w, /wp-content/uploads/2018/05/word-image-5603-1024x257.png 1024w" sizes="(max-width: 1221px) 100vw, 1221px" /></p>
<ul>
<li>
    步骤2：创建学生控制器、查询所有数据、加载视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1063" height="528" src="/wp-content/uploads/2018/05/word-image-5604.png" class="wp-image-6156" srcset="/wp-content/uploads/2018/05/word-image-5604.png 1063w, /wp-content/uploads/2018/05/word-image-5604-300x149.png 300w, /wp-content/uploads/2018/05/word-image-5604-768x381.png 768w, /wp-content/uploads/2018/05/word-image-5604-1024x509.png 1024w" sizes="(max-width: 1063px) 100vw, 1063px" /></p>
<ul>
<li>
    步骤3：创建视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1256" height="660" src="/wp-content/uploads/2018/05/word-image-5605.png" class="wp-image-6157" srcset="/wp-content/uploads/2018/05/word-image-5605.png 1256w, /wp-content/uploads/2018/05/word-image-5605-300x158.png 300w, /wp-content/uploads/2018/05/word-image-5605-768x404.png 768w, /wp-content/uploads/2018/05/word-image-5605-1024x538.png 1024w" sizes="(max-width: 1256px) 100vw, 1256px" /></p>
<ul>
<li>
    步骤4：视图循环显示数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1007" height="568" src="/wp-content/uploads/2018/05/word-image-5606.png" class="wp-image-6158" srcset="/wp-content/uploads/2018/05/word-image-5606.png 1007w, /wp-content/uploads/2018/05/word-image-5606-300x169.png 300w, /wp-content/uploads/2018/05/word-image-5606-768x433.png 768w" sizes="(max-width: 1007px) 100vw, 1007px" /></p>
<p>
  分页
</p>
<p><img loading="lazy" decoding="async" width="949" height="584" src="/wp-content/uploads/2018/05/word-image-5607.png" class="wp-image-6159" srcset="/wp-content/uploads/2018/05/word-image-5607.png 949w, /wp-content/uploads/2018/05/word-image-5607-300x185.png 300w, /wp-content/uploads/2018/05/word-image-5607-768x473.png 768w" sizes="(max-width: 949px) 100vw, 949px" /></p>
<p>
  弹框
</p>
<p><img loading="lazy" decoding="async" width="1012" height="368" src="/wp-content/uploads/2018/05/word-image-5608.png" class="wp-image-6160" srcset="/wp-content/uploads/2018/05/word-image-5608.png 1012w, /wp-content/uploads/2018/05/word-image-5608-300x109.png 300w, /wp-content/uploads/2018/05/word-image-5608-768x279.png 768w" sizes="(max-width: 1012px) 100vw, 1012px" /></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>
<h2>2、学生添加【加载视图】</h2>
<h3>1）思路</h3>
<ul>
<li>
    步骤1：定义路由 （/student/add 对应控制器 Student\IndexController@add）
  </li>
<li>
    步骤2：创建控制器方法、加载视图
  </li>
<li>
    步骤3：创建视图
  </li>
</ul>
<h3>代码</h3>
<ul>
<li>
    步骤1：定义路由 （/student/add 对应控制器 Student\IndexController@add）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1082" height="458" src="/wp-content/uploads/2018/05/word-image-5609.png" class="wp-image-6161" srcset="/wp-content/uploads/2018/05/word-image-5609.png 1082w, /wp-content/uploads/2018/05/word-image-5609-300x127.png 300w, /wp-content/uploads/2018/05/word-image-5609-768x325.png 768w, /wp-content/uploads/2018/05/word-image-5609-1024x433.png 1024w" sizes="(max-width: 1082px) 100vw, 1082px" /></p>
<ul>
<li>
    步骤2：创建控制器方法、加载视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="889" height="482" src="/wp-content/uploads/2018/05/word-image-5610.png" class="wp-image-6162" srcset="/wp-content/uploads/2018/05/word-image-5610.png 889w, /wp-content/uploads/2018/05/word-image-5610-300x163.png 300w, /wp-content/uploads/2018/05/word-image-5610-768x416.png 768w" sizes="(max-width: 889px) 100vw, 889px" /></p>
<ul>
<li>
    步骤3：创建视图并修改表单action等属性
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1187" height="622" src="/wp-content/uploads/2018/05/word-image-5611.png" class="wp-image-6163" srcset="/wp-content/uploads/2018/05/word-image-5611.png 1187w, /wp-content/uploads/2018/05/word-image-5611-300x157.png 300w, /wp-content/uploads/2018/05/word-image-5611-768x402.png 768w, /wp-content/uploads/2018/05/word-image-5611-1024x537.png 1024w" sizes="(max-width: 1187px) 100vw, 1187px" /></p>
<p>
  表单属性和cstf隐藏域
</p>
<p><img loading="lazy" decoding="async" width="934" height="641" src="/wp-content/uploads/2018/05/word-image-5612.png" class="wp-image-6164" srcset="/wp-content/uploads/2018/05/word-image-5612.png 934w, /wp-content/uploads/2018/05/word-image-5612-300x206.png 300w, /wp-content/uploads/2018/05/word-image-5612-768x527.png 768w, /wp-content/uploads/2018/05/word-image-5612-220x150.png 220w" sizes="(max-width: 934px) 100vw, 934px" /></p>
<h2>3、学生添加【数据处理】</h2>
<h3>1）思路</h3>
<ul>
<li>
    步骤1：更改路由支持post提交
  </li>
<li>
    步骤2：控制器接受数据、插入数据库、判断（成功-列表页，失败-当前页）
  </li>
</ul>
<h3>代码</h3>
<ul>
<li>
    步骤1：更改路由支持post提交
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1178" height="333" src="/wp-content/uploads/2018/05/word-image-5613.png" class="wp-image-6165" srcset="/wp-content/uploads/2018/05/word-image-5613.png 1178w, /wp-content/uploads/2018/05/word-image-5613-300x85.png 300w, /wp-content/uploads/2018/05/word-image-5613-768x217.png 768w, /wp-content/uploads/2018/05/word-image-5613-1024x289.png 1024w" sizes="(max-width: 1178px) 100vw, 1178px" /></p>
<ul>
<li>
    步骤2：控制器接受数据、插入数据库、判断（成功-列表页，失败-当前页）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1151" height="622" src="/wp-content/uploads/2018/05/word-image-5614.png" class="wp-image-6166" srcset="/wp-content/uploads/2018/05/word-image-5614.png 1151w, /wp-content/uploads/2018/05/word-image-5614-300x162.png 300w, /wp-content/uploads/2018/05/word-image-5614-768x415.png 768w, /wp-content/uploads/2018/05/word-image-5614-1024x553.png 1024w" sizes="(max-width: 1151px) 100vw, 1151px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Student;
</p>
<p>
  use App\Http\Model\Student;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class IndexController extends Controller
</p>
<p>
  {
</p>
<p>
      //添加
</p>
<p>
      public function add(Request $request)
</p>
<p>
      {
</p>
<p>
          //1.判断
</p>
<p>
          if ($request-&gt;isMethod(&#8216;post&#8217;)) {
</p>
<p>
              //2.接受数据
</p>
<p>
              $postData = $request-&gt;all();
</p>
<p>
              unset($postData[&#8216;_token&#8217;]);
</p>
<p>
              $postData[&#8216;pwd&#8217;] = bcrypt($postData[&#8216;pwd&#8217;]);
</p>
<p>
              //3.插入数据
</p>
<p>
              $rs = Student::create($postData);//脚下留心：cstf有隐藏域_token 模型自动托管创建于和更新于
</p>
<p>
              //4.判断
</p>
<p>
              if ($rs) {
</p>
<p>
                  return redirect(&#8216;/student&#8217;)-&gt;with([&#8216;state&#8217;=&gt;&#8217;success&#8217;, &#8216;tips&#8217;=&gt;&#8217;插入成功&#8217;]);
</p>
<p>
              } else {
</p>
<p>
                  return redirect(&#8216;/student/add&#8217;)-&gt;with([&#8216;state&#8217;=&gt;&#8217;error&#8217;, &#8216;tips&#8217;=&gt;&#8217;插入失败&#8217;]);
</p>
<p>
              }
</p>
<p>
          } else {
</p>
<p>
              //直接加载视图
</p>
<p>
              return view(&#8216;student.index.add&#8217;);
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
      //列表
</p>
<p>
      public function index()
</p>
<p>
      {
</p>
<p>
          //1.分页查询数据
</p>
<p>
          $student = Student::orderBy(&#8216;id&#8217;, &#8216;desc&#8217;)-&gt;paginate(2);
</p>
<p>
          //2.加载视图并传递数据
</p>
<p>
          return view(&#8216;student.index.index&#8217;, compact(&#8216;student&#8217;));
</p>
<p>
      }
</p>
<p>
  }</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/6119.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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 loading="lazy" 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 loading="lazy" 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 loading="lazy" 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>
		<item>
		<title>Laravel在线教育平台（二） Datatables 表格插件、RBAC、权限分配数据处理、中间件鉴权</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/5944.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/5944.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 15:54:11 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Laravel在线教育平台]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[Datatables表格插件]]></category>
		<category><![CDATA[RBAC]]></category>
		<category><![CDATA[中间件鉴权]]></category>
		<category><![CDATA[权限分配数据处理]]></category>
		<guid isPermaLink="false">/?p=5944</guid>

					<description><![CDATA[Laravel框架实战-在线教育平台（2） 一、管理员管理 Datatables说明 Datatables是一 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1><a id="post-5944-_Toc487817413"></a>Laravel框架实战-在线教育平台（2）<a id="post-5944-_Toc487817414"></a></h1>
<h1>一、管理员管理</h1>
<h2>Datatables说明 </h2>
<p>
  Datatables是一款基于jQuery表格插件
</p>
<h2>管理员列表</h2>
<h3>︴效果</h3>
<p><img loading="lazy" decoding="async" width="1344" height="418" src="/wp-content/uploads/2018/05/word-image-5403.png" class="wp-image-5945" srcset="/wp-content/uploads/2018/05/word-image-5403.png 1344w, /wp-content/uploads/2018/05/word-image-5403-300x93.png 300w, /wp-content/uploads/2018/05/word-image-5403-768x239.png 768w, /wp-content/uploads/2018/05/word-image-5403-1024x318.png 1024w" sizes="(max-width: 1344px) 100vw, 1344px" /></p>
<h3>显示视图</h3>
<ul>
<li>
    步骤1：定义路由  admin\admin\index   AdminController@index
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1010" height="444" src="/wp-content/uploads/2018/05/word-image-5404.png" class="wp-image-5946" srcset="/wp-content/uploads/2018/05/word-image-5404.png 1010w, /wp-content/uploads/2018/05/word-image-5404-300x132.png 300w, /wp-content/uploads/2018/05/word-image-5404-768x338.png 768w" sizes="(max-width: 1010px) 100vw, 1010px" /></p>
<ul>
<li>
    步骤2：创建控制器和方法  并且 调用视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1007" height="476" src="/wp-content/uploads/2018/05/word-image-5405.png" class="wp-image-5947" srcset="/wp-content/uploads/2018/05/word-image-5405.png 1007w, /wp-content/uploads/2018/05/word-image-5405-300x142.png 300w, /wp-content/uploads/2018/05/word-image-5405-768x363.png 768w" sizes="(max-width: 1007px) 100vw, 1007px" /></p>
<ul>
<li>
    步骤3：创建视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1249" height="668" src="/wp-content/uploads/2018/05/word-image-5406.png" class="wp-image-5948" srcset="/wp-content/uploads/2018/05/word-image-5406.png 1249w, /wp-content/uploads/2018/05/word-image-5406-300x160.png 300w, /wp-content/uploads/2018/05/word-image-5406-768x411.png 768w, /wp-content/uploads/2018/05/word-image-5406-1024x548.png 1024w" sizes="(max-width: 1249px) 100vw, 1249px" /></p>
<h3>数据处理：使用datatables插件展示数据（客户端分页）</h3>
<ul>
<li>
    步骤1：修改路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1161" height="320" src="/wp-content/uploads/2018/05/word-image-5407.png" class="wp-image-5949" srcset="/wp-content/uploads/2018/05/word-image-5407.png 1161w, /wp-content/uploads/2018/05/word-image-5407-300x83.png 300w, /wp-content/uploads/2018/05/word-image-5407-768x212.png 768w, /wp-content/uploads/2018/05/word-image-5407-1024x282.png 1024w" sizes="(max-width: 1161px) 100vw, 1161px" /></p>
<ul>
<li>
    步骤2：更改控制器方法
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1191" height="566" src="/wp-content/uploads/2018/05/word-image-5408.png" class="wp-image-5950" srcset="/wp-content/uploads/2018/05/word-image-5408.png 1191w, /wp-content/uploads/2018/05/word-image-5408-300x143.png 300w, /wp-content/uploads/2018/05/word-image-5408-768x365.png 768w, /wp-content/uploads/2018/05/word-image-5408-1024x487.png 1024w" sizes="(max-width: 1191px) 100vw, 1191px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use App\Http\Model\Admin;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class AdminController extends Controller
</p>
<p>
  {
</p>
<p>
      //列表
</p>
<p>
      public function index(Request $request)
</p>
<p>
      {
</p>
<p>
          //1.判断HTTP请求类型
</p>
<p>
          if ($request-&gt;isMethod(&#8216;post&#8217;)) {
</p>
<p>
              //2.获取数据
</p>
<p>
              $admins = Admin::select(&#8216;id&#8217;, &#8216;username&#8217;, &#8216;mobile&#8217;, &#8217;email&#8217;, &#8216;role_id&#8217;, &#8216;state&#8217;, &#8216;created_at&#8217;)-&gt;get();
</p>
<p>
              //3.响应json数据
</p>
<p>
              return response()-&gt;json([
</p>
<p>
                  &#8216;data&#8217; =&gt; $admins
</p>
<p>
              ]);
</p>
<p>
          } else {
</p>
<p>
              //2.加载视图并传递数据
</p>
<p>
              return view(&#8216;admin.admin.index&#8217;);
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
  }
</p>
<ul>
<li>
    步骤2：视图显示数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1233" height="684" src="/wp-content/uploads/2018/05/word-image-5409.png" class="wp-image-5951" srcset="/wp-content/uploads/2018/05/word-image-5409.png 1233w, /wp-content/uploads/2018/05/word-image-5409-300x166.png 300w, /wp-content/uploads/2018/05/word-image-5409-768x426.png 768w, /wp-content/uploads/2018/05/word-image-5409-1024x568.png 1024w" sizes="(max-width: 1233px) 100vw, 1233px" /></p>
<p>
  $(&#8216;table&#8217;).dataTable({
</p>
<p>
      ajax: {
</p>
<p>
  		url: &#8220;{{ url(&#8216;admin/admin/index&#8217;) }}&#8221;,
</p>
<p>
          &#8220;type&#8221;: &#8220;post&#8221;,
</p>
<p>
          &#8216;headers&#8217;: { &#8216;X-CSRF-TOKEN&#8217; : &#8216;{{ csrf_token() }}&#8217; },
</p>
<p>
  		&#8220;data&#8221;: function (data) {
</p>
<p>
  			// data.startTime = $(&#8216;#datemin&#8217;).val();
</p>
<p>
  			// data.endTime = $(&#8216;#datemax&#8217;).val();
</p>
<p>
  			// data.username = $(&#8216;#username&#8217;).val();
</p>
<p>
  		}
</p>
<p>
  	},
</p>
<p>
      //columns
</p>
<p>
      //作用：设置服务端返回数据填充规则
</p>
<p>
      //语法：{&#8220;data&#8221;: &#8220;键&#8221;，&#8221;defaultContent&#8221;: &#8220;默认值&#8221;}
</p>
<p>
      &#8220;columns&#8221;: [
</p>
<p>
          { &#8220;data&#8221;: &#8220;tmp1&#8221;,  defaultContent: &#8220;占位，复选框&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;id&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;username&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;mobile&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;email&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;role_id&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;created_at&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;state&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;tmp2&#8221;, defaultContent: &#8220;占位，操作&#8221; },
</p>
<p>
      ],
</p>
<p>
      //createdRow
</p>
<p>
      //作用：创建tr时回调
</p>
<p>
      //row:创建好的tr的dom对象
</p>
<p>
      //data:数据源，代表服务器端返回的每条记录的实体信息
</p>
<p>
      //dataIndex:数据源的索引号码
</p>
<p>
      &#8220;createdRow&#8221;: function(row, data, dataIndex) {
</p>
<p>
  		//匹配每一行的第一列
</p>
<p>
  		$(row).find(&#8220;td:first&#8221;).html(&#8220;&lt;input type=&#8217;checkbox&#8217; name=&#8217;choose[]&#8217; value='&#8221;+data.id+&#8221;&#8216; /&gt;&#8221;)
</p>
<p>
  		//匹配每一行的第八列
</p>
<p>
  		if (data.state == 1) {
</p>
<p>
  			$(row).find(&#8220;td:eq(7)&#8221;).html(&#8216;&lt;span class=&#8221;label label-success radius&#8221;&gt;已启用&lt;/span&gt;&#8217;);
</p>
<p>
  		} else {
</p>
<p>
  			$(row).find(&#8220;td:eq(7)&#8221;).html(&#8216;&lt;span class=&#8221;label radius&#8221;&gt;已停用&lt;/span&gt;&#8217;);
</p>
<p>
  		}
</p>
<p>
  		//匹配每一行的最后一列
</p>
<p>
  		var lastHtml = &#8216;&lt;a style=&#8221;text-decoration:none&#8221; onClick=&#8221;admin_start(this,10001)&#8221; href=&#8221;javascript:;&#8221; title=&#8221;启用&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe615;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;编辑&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_edit(\&#8217;管理员编辑\&#8217;,\&#8217;admin-add.html\&#8217;,2,800,500)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6df;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;删除&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_del(this,1)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt;&lt;/a&gt;&#8217;;
</p>
<p>
  		$(row).find(&#8220;td:last&#8221;).html(lastHtml);
</p>
<p>
  	},
</p>
<p>
  	searching : false, 		 //禁用搜索
</p>
<p>
      bLengthChange: false,   //去掉每页显示多少条数据方法
</p>
<p>
  });
</p>
<p>
  响应json数据：return response()-&gt;json([&#8216;data&#8217; =&gt; $admins]);
</p>
<h3>数据处理：使用datatables插件展示数据（服务端分页）</h3>
<ul>
<li>
    步骤1：修改视图（搜索的id和name， datatables）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1146" height="423" src="/wp-content/uploads/2018/05/word-image-5410.png" class="wp-image-5952" srcset="/wp-content/uploads/2018/05/word-image-5410.png 1146w, /wp-content/uploads/2018/05/word-image-5410-300x111.png 300w, /wp-content/uploads/2018/05/word-image-5410-768x283.png 768w, /wp-content/uploads/2018/05/word-image-5410-1024x378.png 1024w" sizes="(max-width: 1146px) 100vw, 1146px" /><br />
<img loading="lazy" decoding="async" width="911" height="337" src="/wp-content/uploads/2018/05/word-image-5411.png" class="wp-image-5953" srcset="/wp-content/uploads/2018/05/word-image-5411.png 911w, /wp-content/uploads/2018/05/word-image-5411-300x111.png 300w, /wp-content/uploads/2018/05/word-image-5411-768x284.png 768w" sizes="(max-width: 911px) 100vw, 911px" /><br />
<img loading="lazy" decoding="async" width="709" height="390" src="/wp-content/uploads/2018/05/word-image-5412.png" class="wp-image-5954" srcset="/wp-content/uploads/2018/05/word-image-5412.png 709w, /wp-content/uploads/2018/05/word-image-5412-300x165.png 300w" sizes="(max-width: 709px) 100vw, 709px" /></p>
<p>
  var table  = $(&#8216;table&#8217;).dataTable({
</p>
<p>
      //开启服务端分页（注：开启后发送的HTTP请求会携带起始位置和每页显示条数等信息）
</p>
<p>
      &#8220;serverSide&#8221;: true,
</p>
<p>
      ajax: {
</p>
<p>
  		url: &#8220;{{ url(&#8216;admin/admin/index&#8217;) }}&#8221;,
</p>
<p>
          &#8220;type&#8221;: &#8220;post&#8221;,
</p>
<p>
          &#8216;headers&#8217;: { &#8216;X-CSRF-TOKEN&#8217; : &#8216;{{ csrf_token() }}&#8217; },
</p>
<p>
  		&#8220;data&#8221;: function (data) {
</p>
<p>
  			data.startTime = $(&#8216;#startTime&#8217;).val();
</p>
<p>
  			data.endTime = $(&#8216;#endTime&#8217;).val();
</p>
<p>
  			data.username = $(&#8216;#username&#8217;).val();
</p>
<p>
  		}
</p>
<p>
  	},
</p>
<p>
      //columns
</p>
<p>
      //作用：设置服务端返回数据填充规则
</p>
<p>
      //语法：{&#8220;data&#8221;: &#8220;键&#8221;，&#8221;defaultContent&#8221;: &#8220;默认值&#8221;}
</p>
<p>
      &#8220;columns&#8221;: [
</p>
<p>
          { &#8220;data&#8221;: &#8220;tmp1&#8221;,  defaultContent: &#8220;&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;id&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;username&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;mobile&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;email&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;role_id&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;created_at&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;state&#8221; },
</p>
<p>
          { &#8220;data&#8221;: &#8220;tmp2&#8221;, defaultContent: &#8220;操作&#8221; },
</p>
<p>
      ],
</p>
<p>
      //createdRow
</p>
<p>
      //作用：创建tr时回调
</p>
<p>
      //row:创建好的tr的dom对象
</p>
<p>
      //data:数据源，代表服务器端返回的每条记录的实体信息
</p>
<p>
      //dataIndex:数据源的索引号码
</p>
<p>
      &#8220;createdRow&#8221;: function(row, data, dataIndex) {
</p>
<p>
  		//匹配每一行的第一列
</p>
<p>
  		$(row).find(&#8220;td:first&#8221;).html(&#8220;&lt;input type=&#8217;checkbox&#8217; name=&#8217;choose[]&#8217; value='&#8221;+data.id+&#8221;&#8216; /&gt;&#8221;)
</p>
<p>
  		//匹配每一行的第八列
</p>
<p>
  		if (data.state == 1) {
</p>
<p>
  			$(row).find(&#8220;td:eq(7)&#8221;).html(&#8216;&lt;span class=&#8221;label label-success radius&#8221;&gt;已启用&lt;/span&gt;&#8217;);
</p>
<p>
  		} else {
</p>
<p>
  			$(row).find(&#8220;td:eq(7)&#8221;).html(&#8216;&lt;span class=&#8221;label radius&#8221;&gt;已停用&lt;/span&gt;&#8217;);
</p>
<p>
  		}
</p>
<p>
  		//匹配每一行的最后一列
</p>
<p>
  		var lastHtml = &#8216;&lt;a style=&#8221;text-decoration:none&#8221; onClick=&#8221;admin_start(this,10001)&#8221; href=&#8221;javascript:;&#8221; title=&#8221;启用&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe615;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;编辑&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_edit(\&#8217;管理员编辑\&#8217;,\&#8217;admin-add.html\&#8217;,2,800,500)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6df;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;删除&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_del(this,1)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt;&lt;/a&gt;&#8217;;
</p>
<p>
  		$(row).find(&#8220;td:last&#8221;).html(lastHtml);
</p>
<p>
  	},
</p>
<p>
  	searching : false, 		 //禁用搜索
</p>
<p>
      bLengthChange: false,   //去掉每页显示多少条数据方法
</p>
<p>
  });
</p>
<p>
  //点击按钮后重新发送HTTP请求
</p>
<p>
  $(&#8216;#searchd&#8217;).click(function(){
</p>
<p>
      //需要重新带参数请求数据
</p>
<p>
      table.api().ajax.reload();
</p>
<p>
  });
</p>
<ul>
<li>
    步骤2：控制器方法（接受起始位置和结束位置）增加limit过滤
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1120" height="639" src="/wp-content/uploads/2018/05/word-image-5413.png" class="wp-image-5955" srcset="/wp-content/uploads/2018/05/word-image-5413.png 1120w, /wp-content/uploads/2018/05/word-image-5413-300x171.png 300w, /wp-content/uploads/2018/05/word-image-5413-768x438.png 768w, /wp-content/uploads/2018/05/word-image-5413-1024x584.png 1024w" sizes="(max-width: 1120px) 100vw, 1120px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use App\Http\Model\Admin;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class AdminController extends Controller
</p>
<p>
  {
</p>
<p>
      //列表
</p>
<p>
      public function index(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;start&#8217;, &#8216;length&#8217;, &#8216;startTime&#8217;, &#8216;endTime&#8217;, &#8216;username&#8217;, &#8216;draw&#8217;]);
</p>
<p>
              //3.组装模型
</p>
<p>
              <strong>$admins = Admin::select(&#8216;id&#8217;, &#8216;username&#8217;, &#8216;mobile&#8217;, &#8217;email&#8217;, &#8216;role_id&#8217;, &#8216;state&#8217;, &#8216;created_at&#8217;);</strong>
</p>
<p>
              //4.模型过滤组装
</p>
<p>
              if ($postData[&#8216;username&#8217;]) $admins-&gt;where(&#8216;username&#8217;, &#8216;like&#8217;, &#8216;%&#8217;. $postData[&#8216;username&#8217;] .&#8217;%&#8217;);
</p>
<p>
              if ($postData[&#8216;startTime&#8217;]) $admins-&gt;where(&#8216;created_at&#8217;, &#8216;&gt;&#8217;, strtotime($postData[&#8216;startTime&#8217;]));
</p>
<p>
              if ($postData[&#8216;endTime&#8217;]) $admins-&gt;where(&#8216;created_at&#8217;, &#8216;&lt;&#8216;, strtotime($postData[&#8216;endTime&#8217;]));
</p>
<p>
              //5.响应json数据
</p>
<p>
              return response()-&gt;json([
</p>
<p>
                  &#8216;draw&#8217; =&gt; (int)$postData[&#8216;draw&#8217;],       //必须，HTTP请求发送什么就响应什么
</p>
<p>
                  &#8216;recordsTotal&#8217; =&gt; Admin::count(),       //必须，admin表总记录数
</p>
<p>
                  &#8216;recordsFiltered&#8217; =&gt; $admins-&gt;count(),  //必须，admin表总记录数（增加where条件）
</p>
<p>
                  &#8216;data&#8217; =&gt; $admins-&gt;offset($postData[&#8216;start&#8217;])-&gt;limit($postData[&#8216;length&#8217;])-&gt;get()
</p>
<p>
              ]);
</p>
<p>
          } else {
</p>
<p>
              //2.加载视图并传递数据
</p>
<p>
              return view(&#8216;admin.admin.index&#8217;);
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
  }
</p>
<h1><a id="post-5944-_Toc487817417"></a>RBAC准备</h1>
<h2>说明</h2>
<p>
  RBAC：role-based access control（角色权限控制）
</p>
<p>
  在很多网站的后台会使用RBAC去实现权限管理。
</p>
<p>
  常见的RBAC实现方式有：三表方式、五表方式。
</p>
<p>
  三表：管理员表、角色表、权限表。
</p>
<p>
  五表：管理员表、角色表、权限表、管理员和角色表、角色和权限表
</p>
<p><img loading="lazy" decoding="async" width="956" height="356" src="/wp-content/uploads/2018/05/word-image-5414.png" class="wp-image-5956" srcset="/wp-content/uploads/2018/05/word-image-5414.png 956w, /wp-content/uploads/2018/05/word-image-5414-300x112.png 300w, /wp-content/uploads/2018/05/word-image-5414-768x286.png 768w" sizes="(max-width: 956px) 100vw, 956px" /></p>
<h2><a id="post-5944-_Toc487817418"></a>设计角色表和权限表</h2>
<h3>1）设计角色表</h3>
<p><strong>后台角色表</strong>
</p>
<table>
<tr>
<td>
<p><strong>表名</strong>
</p>
</td>
<td colspan="7">
<p>
  role
</p>
</td>
</tr>
<tr>
<td>
<p><strong>序号</strong>
</p>
</td>
<td>
<p><strong>字段</strong>
</p>
</td>
<td>
<p><strong>类型</strong>
</p>
</td>
<td>
<p><strong>说明</strong>
</p>
</td>
<td>
<p><strong>空</strong>
</p>
</td>
<td>
<p><strong>默认值</strong>
</p>
</td>
<td>
<p><strong>主键</strong>
</p>
</td>
</tr>
<tr>
<td>
<p>
  1
</p>
</td>
<td>
<p>
  id
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  自增主键
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  N/A
</p>
</td>
<td>
<p>
  是
</p>
</td>
</tr>
<tr>
<td>
<p>
  2
</p>
</td>
<td>
<p>
  role_name
</p>
</td>
<td>
<p>
  varchar(20)
</p>
</td>
<td>
<p>
  角色名称，如：超级管理员
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  3
</p>
</td>
<td>
<p>
  auth_ids
</p>
</td>
<td>
<p>
  varchar(255)
</p>
</td>
<td>
<p>
  权限表主键id集合，如1,2,3
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  4
</p>
</td>
<td>
<p>
  auth_ac
</p>
</td>
<td>
<p>
  varchar(255)
</p>
</td>
<td>
<p>
  权限对应的控制器方法集合,如：
</p>
<p>
  admincontroller@index,indexcontroller@index
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  5
</p>
</td>
<td>
<p>
  created_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  创建于
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
<tr>
<td>
<p>
  6
</p>
</td>
<td>
<p>
  update_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  更新于
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
</table>
<p>
  步骤1：创建迁移文件并书写
</p>
<p><img loading="lazy" decoding="async" width="1277" height="573" src="/wp-content/uploads/2018/05/word-image-5415.png" class="wp-image-5957" srcset="/wp-content/uploads/2018/05/word-image-5415.png 1277w, /wp-content/uploads/2018/05/word-image-5415-300x135.png 300w, /wp-content/uploads/2018/05/word-image-5415-768x345.png 768w, /wp-content/uploads/2018/05/word-image-5415-1024x459.png 1024w" sizes="(max-width: 1277px) 100vw, 1277px" /></p>
<p>
  Schema::create(&#8216;role&#8217;, function (Blueprint $table) {
</p>
<p>
      $table-&gt;increments(&#8216;id&#8217;);
</p>
<p>
      $table-&gt;string(&#8216;role_name&#8217;, 20)-&gt;comment(&#8216;角色名称&#8217;);
</p>
<p>
      $table-&gt;string(&#8216;auth_ids&#8217;)-&gt;comment(&#8216;权限表ID集合,如:1,2,3&#8217;);
</p>
<p>
      $table-&gt;string(&#8216;auth_ac&#8217;)-&gt;comment(&#8216;权限表对应控制器方法集合,如:admincontroller@index,indexcontroller@index&#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>
  });
</p>
<p>
  步骤2：执行
</p>
<p><img loading="lazy" decoding="async" width="516" height="321" src="/wp-content/uploads/2018/05/word-image-5416.png" class="wp-image-5958" srcset="/wp-content/uploads/2018/05/word-image-5416.png 516w, /wp-content/uploads/2018/05/word-image-5416-300x187.png 300w" sizes="(max-width: 516px) 100vw, 516px" /></p>
<h3>2）设计权限表</h3>
<p><strong>后台权限表</strong>
</p>
<table>
<tr>
<td>
<p><strong>表名</strong>
</p>
</td>
<td colspan="6">
<p>
  auth
</p>
</td>
</tr>
<tr>
<td>
<p><strong>序号</strong>
</p>
</td>
<td>
<p><strong>字段</strong>
</p>
</td>
<td>
<p><strong>类型</strong>
</p>
</td>
<td>
<p><strong>说明</strong>
</p>
</td>
<td>
<p><strong>空</strong>
</p>
</td>
<td>
<p><strong>默认值</strong>
</p>
</td>
<td>
<p><strong>主键</strong>
</p>
</td>
</tr>
<tr>
<td>
<p>
  1
</p>
</td>
<td>
<p>
  id
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  自增主键
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  N/A
</p>
</td>
<td>
<p>
  是
</p>
</td>
</tr>
<tr>
<td>
<p>
  2
</p>
</td>
<td>
<p>
  auth_name
</p>
</td>
<td>
<p>
  varchar(20)
</p>
</td>
<td>
<p>
  权限名称，如：管理员管理
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  3
</p>
</td>
<td>
<p>
  controller
</p>
</td>
<td>
<p>
  varchar(40)
</p>
</td>
<td>
<p>
  控制器名
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  4
</p>
</td>
<td>
<p>
  action
</p>
</td>
<td>
<p>
  varchar(30)
</p>
</td>
<td>
<p>
  权限对应的方法名称
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  5
</p>
</td>
<td>
<p>
  pid
</p>
</td>
<td>
<p>
  tinyint
</p>
</td>
<td>
<p>
  等级：0-顶级，其他-子级（最多2级）
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
<tr>
<td>
<p>
  6
</p>
</td>
<td>
<p>
  is_nav
</p>
</td>
<td>
<p>
  tinyint
</p>
</td>
<td>
<p>
  是否菜单显示：1-是，0-否
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  1
</p>
</td>
<td></td>
</tr>
<tr>
<td>
<p>
  7
</p>
</td>
<td>
<p>
  created_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  创建于
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
<tr>
<td>
<p>
  8
</p>
</td>
<td>
<p>
  update_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  更新于
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
</table>
<p>
  步骤1：创建数据迁移并书写代码
</p>
<p><img loading="lazy" decoding="async" width="1236" height="432" src="/wp-content/uploads/2018/05/word-image-5417.png" class="wp-image-5959" srcset="/wp-content/uploads/2018/05/word-image-5417.png 1236w, /wp-content/uploads/2018/05/word-image-5417-300x105.png 300w, /wp-content/uploads/2018/05/word-image-5417-768x268.png 768w, /wp-content/uploads/2018/05/word-image-5417-1024x358.png 1024w" sizes="(max-width: 1236px) 100vw, 1236px" /></p>
<p>
  Schema::create(&#8216;auth&#8217;, function (Blueprint $table) {
</p>
<p>
      $table-&gt;increments(&#8216;id&#8217;);
</p>
<p>
      $table-&gt;string(&#8216;auth_name&#8217;, 20)-&gt;comment(&#8216;权限名称&#8217;);
</p>
<p>
      $table-&gt;string(&#8216;controller&#8217;, 40)-&gt;comment(&#8216;控制器名&#8217;);
</p>
<p>
      $table-&gt;string(&#8216;action&#8217;, 30)-&gt;comment(&#8216;方法名&#8217;);
</p>
<p>
      $table-&gt;unsignedTinyInteger(&#8216;pid&#8217;)-&gt;default(0)-&gt;comment(&#8216;等级:0-顶级,其他-子级（最多2级）&#8217;);
</p>
<p>
      $table-&gt;unsignedTinyInteger(&#8216;is_nav&#8217;)-&gt;default(1)-&gt;comment(&#8216;是否菜单显示:1-是,0-否&#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>
  });
</p>
<p>
  步骤2：执行
</p>
<p><img loading="lazy" decoding="async" width="598" height="349" src="/wp-content/uploads/2018/05/word-image-5418.png" class="wp-image-5960" srcset="/wp-content/uploads/2018/05/word-image-5418.png 598w, /wp-content/uploads/2018/05/word-image-5418-300x175.png 300w" sizes="(max-width: 598px) 100vw, 598px" /></p>
<h2><a id="post-5944-_Toc487817419"></a>3、了解三张表之间的关系</h2>
<p><img loading="lazy" decoding="async" width="854" height="238" src="/wp-content/uploads/2018/05/word-image-5419.png" class="wp-image-5961" srcset="/wp-content/uploads/2018/05/word-image-5419.png 854w, /wp-content/uploads/2018/05/word-image-5419-300x84.png 300w, /wp-content/uploads/2018/05/word-image-5419-768x214.png 768w" sizes="(max-width: 854px) 100vw, 854px" /></p>
<h2><a id="post-5944-_Toc487817420"></a>4、模拟数据</h2>
<p><img loading="lazy" decoding="async" width="888" height="130" src="/wp-content/uploads/2018/05/word-image-5420.png" class="wp-image-5962" srcset="/wp-content/uploads/2018/05/word-image-5420.png 888w, /wp-content/uploads/2018/05/word-image-5420-300x44.png 300w, /wp-content/uploads/2018/05/word-image-5420-768x112.png 768w" sizes="(max-width: 888px) 100vw, 888px" /></p>
<p>
  INSERT INTO `admin` VALUES (null, &#8216;@php12&#8217;, &#8216;$2y$10$SZ50r80SEK4zMaHVkODqVupVLufzQuZQ4lHBm46QDsGwY5yeXL3lK&#8217;, &#8216;1&#8217;, &#8216;18888888888&#8217;, &#8216;8@itcast.cn&#8217;, &#8216;1&#8217;, &#8216;1515464653&#8217;, &#8216;1515464653&#8217;, &#8216;1&#8217;, &#8221;);
</p>
<p><strong>#密码是：admin888</strong>
</p>
<p><img loading="lazy" decoding="async" width="1239" height="178" src="/wp-content/uploads/2018/05/word-image-5421.png" class="wp-image-5963" srcset="/wp-content/uploads/2018/05/word-image-5421.png 1239w, /wp-content/uploads/2018/05/word-image-5421-300x43.png 300w, /wp-content/uploads/2018/05/word-image-5421-768x110.png 768w, /wp-content/uploads/2018/05/word-image-5421-1024x147.png 1024w" sizes="(max-width: 1239px) 100vw, 1239px" /></p>
<p>
  INSERT INTO `role` VALUES (&#8216;1&#8217;, &#8216;超级管理员&#8217;, &#8216;1,2,3,4,5,6,7,8,10,9&#8217;, &#8216;OrderController@add,OrderController@update,OrderController@update,MemberController@add,MemberController@update,ArticleController@update,ArticleController@add&#8217;, &#8216;1515464653&#8217;, &#8216;1515464653&#8217;);
</p>
<p>
  INSERT INTO `role` VALUES (&#8216;2&#8217;, &#8216;网站编辑&#8217;, &#8216;8,10,9&#8217;, &#8216;ArticleController@add,ArticleController@update&#8217;, &#8216;1515464653&#8217;, &#8216;1515464653&#8217;);
</p>
<p>
  INSERT INTO `role` VALUES (&#8216;3&#8217;, &#8216;水电费&#8217;, &#8216;1,2,4,5,6,7,8,9&#8217;, &#8216;OrderController@add,OrderController@update,MemberController@add,MemberController@update,ArticleController@add&#8217;, &#8216;1515464653&#8217;, &#8216;1515464653&#8217;);
</p>
<p><img loading="lazy" decoding="async" width="749" height="327" src="/wp-content/uploads/2018/05/word-image-5422.png" class="wp-image-5964" srcset="/wp-content/uploads/2018/05/word-image-5422.png 749w, /wp-content/uploads/2018/05/word-image-5422-300x131.png 300w" sizes="(max-width: 749px) 100vw, 749px" /></p>
<p>
  INSERT INTO `auth` VALUES
</p>
<p>
  (&#8216;1&#8217;, &#8216;订单管理&#8217;, &#8216;OrderController&#8217;, &#8221;, &#8216;0&#8217;, &#8216;0&#8217;, &#8216;1515464653&#8217;, &#8216;1515464653&#8217;),
</p>
<p>
  (&#8216;2&#8217;, &#8216;订单添加&#8217;, &#8216;OrderController&#8217;, &#8216;add&#8217;, &#8216;1&#8217;, &#8216;0&#8217;, &#8216;1515464653&#8217;, &#8216;1515464653&#8217;),
</p>
<p>
  (&#8216;3&#8217;, &#8216;订单修改&#8217;, &#8216;OrderController&#8217;, &#8216;update&#8217;, &#8216;1&#8217;, &#8216;0&#8217;, &#8216;1515464653&#8217;, &#8216;1515464653&#8217;),
</p>
<p>
  (&#8216;4&#8217;, &#8216;订单列表&#8217;, &#8216;OrderController&#8217;, &#8216;update&#8217;, &#8216;1&#8217;, &#8216;0&#8217;, &#8216;1515464653&#8217;, &#8216;1515464653&#8217;),
</p>
<p>
  (&#8216;5&#8217;, &#8216;会员管理&#8217;, &#8216;MemberController&#8217;, &#8221;, &#8216;0&#8217;, &#8216;0&#8217;, &#8216;1515464653&#8217;, &#8216;1515464653&#8217;),
</p>
<p>
  (&#8216;6&#8217;, &#8216;会员添加&#8217;, &#8216;MemberController&#8217;, &#8216;add&#8217;, &#8216;5&#8217;, &#8216;0&#8217;, &#8216;1515464653&#8217;, &#8216;1515464653&#8217;),
</p>
<p>
  (&#8216;7&#8217;, &#8216;会员修改&#8217;, &#8216;MemberController&#8217;, &#8216;update&#8217;, &#8216;5&#8217;, &#8216;0&#8217;, &#8216;1515464653&#8217;, &#8216;1515464653&#8217;),
</p>
<p>
  (&#8216;8&#8217;, &#8216;文章管理&#8217;, &#8216;ArticleController&#8217;, &#8221;, &#8216;0&#8217;, &#8216;0&#8217;, &#8216;1515464653&#8217;, &#8216;1515464653&#8217;),
</p>
<p>
  (&#8216;9&#8217;, &#8216;文章添加&#8217;, &#8216;ArticleController&#8217;, &#8216;add&#8217;, &#8216;8&#8217;, &#8216;0&#8217;, &#8216;1515464653&#8217;, &#8216;1515464653&#8217;),
</p>
<p>
  (&#8217;10&#8217;, &#8216;文章修改&#8217;, &#8216;ArticleController&#8217;, &#8216;update&#8217;, &#8216;8&#8217;, &#8216;0&#8217;, &#8216;1515464653&#8217;, &#8216;1515464653&#8217;);
</p>
<p>
  补充：在有数据的基础上，将之前遗留的管理员身份显示完全
</p>
<p><img loading="lazy" decoding="async" width="254" height="61" src="/wp-content/uploads/2018/05/word-image-5423.png" class="wp-image-5965" /></p>
<p><strong>通过ORM解决这个问题</strong>（<strong>关联模型</strong>）：
</p>
<p>
  用户表和角色表是一对一的关系：使用hasOne方法
</p>
<p><img loading="lazy" decoding="async" width="460" height="48" src="/wp-content/uploads/2018/05/word-image-5424.png" class="wp-image-5966" srcset="/wp-content/uploads/2018/05/word-image-5424.png 460w, /wp-content/uploads/2018/05/word-image-5424-300x31.png 300w" sizes="(max-width: 460px) 100vw, 460px" /></p>
<p>
  需要在Admin模型中关联Role模型：
</p>
<p><img loading="lazy" decoding="async" width="655" height="181" src="/wp-content/uploads/2018/05/word-image-5425.png" class="wp-image-5967" srcset="/wp-content/uploads/2018/05/word-image-5425.png 655w, /wp-content/uploads/2018/05/word-image-5425-300x83.png 300w" sizes="(max-width: 655px) 100vw, 655px" /></p>
<p>
  创建Role模型：
</p>
<p><img loading="lazy" decoding="async" width="405" height="82" src="/wp-content/uploads/2018/05/word-image-5426.png" class="wp-image-5968" srcset="/wp-content/uploads/2018/05/word-image-5426.png 405w, /wp-content/uploads/2018/05/word-image-5426-300x61.png 300w" sizes="(max-width: 405px) 100vw, 405px" /><br />
<img loading="lazy" decoding="async" width="794" height="317" src="/wp-content/uploads/2018/05/word-image-5427.png" class="wp-image-5969" srcset="/wp-content/uploads/2018/05/word-image-5427.png 794w, /wp-content/uploads/2018/05/word-image-5427-300x120.png 300w, /wp-content/uploads/2018/05/word-image-5427-768x307.png 768w" sizes="(max-width: 794px) 100vw, 794px" /></p>
<p>
  去显示用户身份（模版文件admin/inedx/index.blade.php）：
</p>
<p>
  在之前调用guard的时候其实已经实例化了Admin模型，所以可以直接调用Admin模型中的关联方法，取出结果集中的第1条记录，显示出角色名称：
</p>
<p><img loading="lazy" decoding="async" width="670" height="122" src="/wp-content/uploads/2018/05/word-image-5428.png" class="wp-image-5970" srcset="/wp-content/uploads/2018/05/word-image-5428.png 670w, /wp-content/uploads/2018/05/word-image-5428-300x55.png 300w" sizes="(max-width: 670px) 100vw, 670px" /></p>
<p>
  显示效果：
</p>
<p><img loading="lazy" decoding="async" width="183" height="67" src="/wp-content/uploads/2018/05/word-image-5429.png" class="wp-image-5971" /></p>
<h1><a id="post-5944-_Toc487817421"></a>三、权限管理</h1>
<h2>︴效果</h2>
<p>
  列表
</p>
<p><img loading="lazy" decoding="async" width="1311" height="629" src="/wp-content/uploads/2018/05/word-image-5430.png" class="wp-image-5972" srcset="/wp-content/uploads/2018/05/word-image-5430.png 1311w, /wp-content/uploads/2018/05/word-image-5430-300x144.png 300w, /wp-content/uploads/2018/05/word-image-5430-768x368.png 768w, /wp-content/uploads/2018/05/word-image-5430-1024x491.png 1024w" sizes="(max-width: 1311px) 100vw, 1311px" /></p>
<p>
  添加
</p>
<p><img loading="lazy" decoding="async" width="931" height="480" src="/wp-content/uploads/2018/05/word-image-5431.png" class="wp-image-5973" srcset="/wp-content/uploads/2018/05/word-image-5431.png 931w, /wp-content/uploads/2018/05/word-image-5431-300x155.png 300w, /wp-content/uploads/2018/05/word-image-5431-768x396.png 768w" sizes="(max-width: 931px) 100vw, 931px" /></p>
<h2>列表功能</h2>
<h3>1）显示列表（模板文件：admin-permission.html）</h3>
<ul>
<li>
    步骤1：定义路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1117" height="263" src="/wp-content/uploads/2018/05/word-image-5432.png" class="wp-image-5974" srcset="/wp-content/uploads/2018/05/word-image-5432.png 1117w, /wp-content/uploads/2018/05/word-image-5432-300x71.png 300w, /wp-content/uploads/2018/05/word-image-5432-768x181.png 768w, /wp-content/uploads/2018/05/word-image-5432-1024x241.png 1024w" sizes="(max-width: 1117px) 100vw, 1117px" /></p>
<p>
  Route::get(&#8216;admin/auth/index&#8217;, &#8216;Admin\AuthController@index&#8217;);
</p>
<ul>
<li>
    步骤2：创建控制器和方法，并调用视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="978" height="491" src="/wp-content/uploads/2018/05/word-image-5433.png" class="wp-image-5975" srcset="/wp-content/uploads/2018/05/word-image-5433.png 978w, /wp-content/uploads/2018/05/word-image-5433-300x151.png 300w, /wp-content/uploads/2018/05/word-image-5433-768x386.png 768w" sizes="(max-width: 978px) 100vw, 978px" /></p>
<ul>
<li>
    步骤3：创建视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1165" height="651" src="/wp-content/uploads/2018/05/word-image-5434.png" class="wp-image-5976" srcset="/wp-content/uploads/2018/05/word-image-5434.png 1165w, /wp-content/uploads/2018/05/word-image-5434-300x168.png 300w, /wp-content/uploads/2018/05/word-image-5434-768x429.png 768w, /wp-content/uploads/2018/05/word-image-5434-1024x572.png 1024w" sizes="(max-width: 1165px) 100vw, 1165px" /></p>
<h3>数据处理</h3>
<ul>
<li>
    步骤1：创建Auth模型
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="967" height="577" src="/wp-content/uploads/2018/05/word-image-5435.png" class="wp-image-5977" srcset="/wp-content/uploads/2018/05/word-image-5435.png 967w, /wp-content/uploads/2018/05/word-image-5435-300x179.png 300w, /wp-content/uploads/2018/05/word-image-5435-768x458.png 768w" sizes="(max-width: 967px) 100vw, 967px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Model;
</p>
<p>
  use Illuminate\Database\Eloquent\Model;
</p>
<p>
  class Auth extends Model
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * 声明表名（注：laravel会自动加s所以自己声明覆盖）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $table = &#8216;auth&#8217;;
</p>
<p>
      /**
</p>
<p>
       * Unix时间戳形式填充创建于和更新于（注：模型默认托管时间但是是datetime类型）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $dateFormat = &#8216;U&#8217;;
</p>
<p>
      /**
</p>
<p>
       * 声明可批量设置的属性（注：当使用create静态方式时）
</p>
<p>
       * @var array
</p>
<p>
       */
</p>
<p>
      protected $fillable = [&#8216;auth_name&#8217;, &#8216;controller&#8217;, &#8216;action&#8217;, &#8216;pid&#8217;, &#8216;is_nav&#8217;];
</p>
<p>
  }
</p>
<ul>
<li>
    步骤2：修改控制器方法查询所有数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1076" height="478" src="/wp-content/uploads/2018/05/word-image-5436.png" class="wp-image-5978" srcset="/wp-content/uploads/2018/05/word-image-5436.png 1076w, /wp-content/uploads/2018/05/word-image-5436-300x133.png 300w, /wp-content/uploads/2018/05/word-image-5436-768x341.png 768w, /wp-content/uploads/2018/05/word-image-5436-1024x455.png 1024w" sizes="(max-width: 1076px) 100vw, 1076px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use App\Http\Model\Auth;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class AuthController extends Controller
</p>
<p>
  {
</p>
<p>
      //列表
</p>
<p>
      public function index()
</p>
<p>
      {
</p>
<p>
          //1.查询所有数据（注；因为权限节点数据不是很多所以直接显示）
</p>
<p>
          $auths = Auth::get();
</p>
<p>
          //2.加载视图并传递数据
</p>
<p>
          return view(&#8216;admin.auth.index&#8217;, compact(&#8216;auths&#8217;));
</p>
<p>
      }
</p>
<p>
  }
</p>
<ul>
<li>
    步骤1：实现视图客户端分页
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1270" height="387" src="/wp-content/uploads/2018/05/word-image-5437.png" class="wp-image-5979" srcset="/wp-content/uploads/2018/05/word-image-5437.png 1270w, /wp-content/uploads/2018/05/word-image-5437-300x91.png 300w, /wp-content/uploads/2018/05/word-image-5437-768x234.png 768w, /wp-content/uploads/2018/05/word-image-5437-1024x312.png 1024w" sizes="(max-width: 1270px) 100vw, 1270px" /><br />
<img loading="lazy" decoding="async" width="1253" height="539" src="/wp-content/uploads/2018/05/word-image-5438.png" class="wp-image-5980" srcset="/wp-content/uploads/2018/05/word-image-5438.png 1253w, /wp-content/uploads/2018/05/word-image-5438-300x129.png 300w, /wp-content/uploads/2018/05/word-image-5438-768x330.png 768w, /wp-content/uploads/2018/05/word-image-5438-1024x440.png 1024w" sizes="(max-width: 1253px) 100vw, 1253px" /><br />
<img loading="lazy" decoding="async" width="861" height="511" src="/wp-content/uploads/2018/05/word-image-5439.png" class="wp-image-5981" srcset="/wp-content/uploads/2018/05/word-image-5439.png 861w, /wp-content/uploads/2018/05/word-image-5439-300x178.png 300w, /wp-content/uploads/2018/05/word-image-5439-768x456.png 768w" sizes="(max-width: 861px) 100vw, 861px" /></p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;title&gt;权限管理&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;nav class=&#8221;breadcrumb&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe67f;&lt;/i&gt; 首页 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 管理员管理 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 权限管理 &lt;a class=&#8221;btn btn-success radius r&#8221; style=&#8221;line-height:1.6em;margin-top:3px&#8221; href=&#8221;javascript:location.replace(location.href);&#8221; title=&#8221;刷新&#8221; &gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe68f;&lt;/i&gt;&lt;/a&gt;&lt;/nav&gt;
</p>
<p>
  &lt;div class=&#8221;page-container&#8221;&gt;
</p>
<p>
  	&lt;div class=&#8221;text-c&#8221;&gt;
</p>
<p>
  		&lt;form class=&#8221;Huiform&#8221; method=&#8221;post&#8221; action=&#8221;&#8221; target=&#8221;_self&#8221;&gt;
</p>
<p>
  			&lt;input type=&#8221;text&#8221; class=&#8221;input-text&#8221; style=&#8221;width:250px&#8221; placeholder=&#8221;权限名称&#8221; id=&#8221;search_content&#8221; name=&#8221;&#8221;&gt;
</p>
<p>
  			&lt;button type=&#8221;button&#8221; class=&#8221;btn btn-success&#8221; id=&#8221;search&#8221; name=&#8221;&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe665;&lt;/i&gt; 搜权限节点&lt;/button&gt;
</p>
<p>
  		&lt;/form&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;cl pd-5 bg-1 bk-gray mt-20&#8243;&gt; &lt;span class=&#8221;l&#8221;&gt;&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;datadel()&#8221; class=&#8221;btn btn-danger radius&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt; 批量删除&lt;/a&gt; &lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_add(&#8216;添加权限节点&#8217;,&#8217;admin-permission-add.html&#8217;,&#8221;,&#8217;310&#8242;)&#8221; class=&#8221;btn btn-primary radius&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe600;&lt;/i&gt; 添加权限节点&lt;/a&gt;&lt;/span&gt; &lt;span class=&#8221;r&#8221;&gt;共有数据：&lt;strong&gt;54&lt;/strong&gt; 条&lt;/span&gt; &lt;/div&gt;
</p>
<p>
  	&lt;table class=&#8221;table table-border table-bordered table-bg&#8221;&gt;
</p>
<p>
  		&lt;thead&gt;
</p>
<p>
  			&lt;tr&gt;
</p>
<p>
  				&lt;th scope=&#8221;col&#8221; colspan=&#8221;8&#8243;&gt;权限节点&lt;/th&gt;
</p>
<p>
  			&lt;/tr&gt;
</p>
<p>
  			&lt;tr class=&#8221;text-c&#8221;&gt;
</p>
<p>
  				&lt;th width=&#8221;25&#8243;&gt;&lt;input type=&#8221;checkbox&#8221; name=&#8221;&#8221; value=&#8221;&#8221;&gt;&lt;/th&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;上级权限ID&lt;/th&gt;
</p>
<p>
  				&lt;th&gt;是否作为导航&lt;/th&gt;
</p>
<p>
  				&lt;th width=&#8221;100&#8243;&gt;操作&lt;/th&gt;
</p>
<p>
  			&lt;/tr&gt;
</p>
<p>
  		&lt;/thead&gt;
</p>
<p>
  		&lt;tbody&gt;
</p>
<p>
  			@foreach ($auths as $auth)
</p>
<p>
  			&lt;tr class=&#8221;text-c&#8221;&gt;
</p>
<p>
  				&lt;td&gt;&lt;input type=&#8221;checkbox&#8221; value=&#8221;{{ $auth-&gt;id }}&#8221; name=&#8221;&#8221;&gt;&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;{{ $auth-&gt;id }}&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;{{ $auth-&gt;auth_name }}&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;{{ $auth-&gt;controller }}&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;{{ $auth-&gt;action }}&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;{{ $auth-&gt;pid }}&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;
</p>
<p>
  					@if ($auth-&gt;is_nav)
</p>
<p>
  						是
</p>
<p>
  					@else
</p>
<p>
  						否
</p>
<p>
  					@endif
</p>
<p>
  				&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;&lt;a title=&#8221;编辑&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_edit(&#8216;角色编辑&#8217;,&#8217;admin-permission-add.html&#8217;,&#8217;1&#8242;,&#8221;,&#8217;310&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6df;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;删除&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_del(this,&#8217;1&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt;&lt;/a&gt;&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;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/datatables/1.10.0/jquery.dataTables.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  var table = $(&#8216;table&#8217;).DataTable({
</p>
<p>
      iDisplayLength:2,	    //限制每页显示条数
</p>
<p>
      // searching : false, 		 //禁用搜索
</p>
<p>
      bLengthChange: false,   //去掉每页显示多少条数据方法
</p>
<p>
  });
</p>
<p>
  //客户端搜索功能更
</p>
<p>
  $(&#8216;#search&#8217;).click(function(){
</p>
<p>
      var search_content = $(&#8216;#search_content&#8217;).val();
</p>
<p>
      table.search(search_content).draw();
</p>
<p>
  });
</p>
<p>
  $(function(){
</p>
<p>
      $(&#8216;#DataTables_Table_0_filter&#8217;).hide();
</p>
<p>
  });
</p>
<p>
  /*
</p>
<p>
  	参数解释：
</p>
<p>
  	title	标题
</p>
<p>
  	url		请求的url
</p>
<p>
  	id		需要操作的数据id
</p>
<p>
  	w		弹出层宽度（缺省调默认值）
</p>
<p>
  	h		弹出层高度（缺省调默认值）
</p>
<p>
  */
</p>
<p>
  /*管理员-权限-添加*/
</p>
<p>
  function admin_permission_add(title,url,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-权限-编辑*/
</p>
<p>
  function admin_permission_edit(title,url,id,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-权限-删除*/
</p>
<p>
  function admin_permission_del(obj,id){
</p>
<p>
  	layer.confirm(&#8216;确认要删除吗？&#8217;,function(index){
</p>
<p>
  		$.ajax({
</p>
<p>
  			type: &#8216;POST&#8217;,
</p>
<p>
  			url: &#8221;,
</p>
<p>
  			dataType: &#8216;json&#8217;,
</p>
<p>
  			success: function(data){
</p>
<p>
  				$(obj).parents(&#8220;tr&#8221;).remove();
</p>
<p>
  				layer.msg(&#8216;已删除!&#8217;,{icon:1,time:1000});
</p>
<p>
  			},
</p>
<p>
  			error:function(data) {
</p>
<p>
  				console.log(data.msg);
</p>
<p>
  			},
</p>
<p>
  		});
</p>
<p>
  	});
</p>
<p>
  }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2>添加功能</h2>
<h3>1）显示添加页（模板文件：admin-add.html）</h3>
<ul>
<li>
    步骤1：定义路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1027" height="269" src="/wp-content/uploads/2018/05/word-image-5440.png" class="wp-image-5982" srcset="/wp-content/uploads/2018/05/word-image-5440.png 1027w, /wp-content/uploads/2018/05/word-image-5440-300x79.png 300w, /wp-content/uploads/2018/05/word-image-5440-768x201.png 768w, /wp-content/uploads/2018/05/word-image-5440-1024x268.png 1024w" sizes="(max-width: 1027px) 100vw, 1027px" /></p>
<ul>
<li>
    步骤2：创建控制器和方法、并获取所有顶级传递传递给视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="865" height="373" src="/wp-content/uploads/2018/05/word-image-5441.png" class="wp-image-5983" srcset="/wp-content/uploads/2018/05/word-image-5441.png 865w, /wp-content/uploads/2018/05/word-image-5441-300x129.png 300w, /wp-content/uploads/2018/05/word-image-5441-768x331.png 768w" sizes="(max-width: 865px) 100vw, 865px" /></p>
<p>
  //添加
</p>
<p>
  public function add()
</p>
<p>
  {
</p>
<p>
      //1.查询所有顶级权限
</p>
<p>
      $topAuths = Auth::where(&#8216;pid&#8217;, 0)-&gt;get();
</p>
<p>
      //2.加载视图并传递数据
</p>
<p>
      return view(&#8216;admin.auth.add&#8217;, compact(&#8216;topAuths&#8217;));
</p>
<p>
  }
</p>
<ul>
<li>
    步骤3：创建视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1210" height="662" src="/wp-content/uploads/2018/05/word-image-5442.png" class="wp-image-5984" srcset="/wp-content/uploads/2018/05/word-image-5442.png 1210w, /wp-content/uploads/2018/05/word-image-5442-300x164.png 300w, /wp-content/uploads/2018/05/word-image-5442-768x420.png 768w, /wp-content/uploads/2018/05/word-image-5442-1024x560.png 1024w" sizes="(max-width: 1210px) 100vw, 1210px" /><br />
<img loading="lazy" decoding="async" width="799" height="532" src="/wp-content/uploads/2018/05/word-image-5443.png" class="wp-image-5985" srcset="/wp-content/uploads/2018/05/word-image-5443.png 799w, /wp-content/uploads/2018/05/word-image-5443-300x200.png 300w, /wp-content/uploads/2018/05/word-image-5443-768x511.png 768w" sizes="(max-width: 799px) 100vw, 799px" /></p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;title&gt;添加管理员 &#8211; 管理员管理 &#8211; H-ui.admin v3.1&lt;/title&gt;
</p>
<p>
  &lt;meta name=&#8221;keywords&#8221; content=&#8221;H-ui.admin v3.1,H-ui网站后台模版,后台模版下载,后台管理系统模版,HTML后台模版下载&#8221;&gt;
</p>
<p>
  &lt;meta name=&#8221;description&#8221; content=&#8221;H-ui.admin v3.1，是一款由国人开发的轻量级扁平化网站后台模板，完全免费开源的网站后台管理系统模版，适合中小型CMS后台系统。&#8221;&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;article class=&#8221;page-container&#8221;&gt;
</p>
<p>
  	&lt;form class=&#8221;form form-horizontal&#8221; id=&#8221;form-admin-add&#8221;&gt;
</p>
<p>
  		{{ csrf_field() }}
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;&lt;span class=&#8221;c-red&#8221;&gt;*&lt;/span&gt;权限名称：&lt;/label&gt;
</p>
<p>
  		&lt;div class=&#8221;formControls col-xs-8 col-sm-9&#8243;&gt;
</p>
<p>
  			&lt;input type=&#8221;text&#8221; class=&#8221;input-text&#8221; value=&#8221;&#8221; placeholder=&#8221;&#8221; id=&#8221;auth_name&#8221; name=&#8221;auth_name&#8221;&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;&lt;span class=&#8221;c-red&#8221;&gt;*&lt;/span&gt;控制器名称：&lt;/label&gt;
</p>
<p>
  		&lt;div class=&#8221;formControls col-xs-8 col-sm-9&#8243;&gt;
</p>
<p>
  			&lt;input type=&#8221;text&#8221; class=&#8221;input-text&#8221; autocomplete=&#8221;off&#8221; value=&#8221;&#8221; placeholder=&#8221;控制器名称&#8221; id=&#8221;controller&#8221; name=&#8221;controller&#8221;&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;&lt;span class=&#8221;c-red&#8221;&gt;*&lt;/span&gt;方法名：&lt;/label&gt;
</p>
<p>
  		&lt;div class=&#8221;formControls col-xs-8 col-sm-9&#8243;&gt;
</p>
<p>
  			&lt;input type=&#8221;text&#8221; class=&#8221;input-text&#8221; autocomplete=&#8221;off&#8221;  placeholder=&#8221;方法名&#8221; id=&#8221;action&#8221; name=&#8221;action&#8221;&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;&lt;span class=&#8221;c-red&#8221;&gt;*&lt;/span&gt;作为导航：&lt;/label&gt;
</p>
<p>
  		&lt;div class=&#8221;formControls col-xs-8 col-sm-9 skin-minimal&#8221;&gt;
</p>
<p>
  			&lt;div class=&#8221;radio-box&#8221;&gt;
</p>
<p>
  				&lt;input type=&#8221;radio&#8221; name=&#8221;is_nav&#8221; value=&#8221;1&#8243; id=&#8221;sex-1&#8243; checked&gt;
</p>
<p>
  				&lt;label for=&#8221;sex-1&#8243;&gt;是&lt;/label&gt;
</p>
<p>
  			&lt;/div&gt;
</p>
<p>
  			&lt;div class=&#8221;radio-box&#8221;&gt;
</p>
<p>
  				&lt;input type=&#8221;radio&#8221; name=&#8221;is_nav&#8221; value=&#8221;0&#8243; id=&#8221;sex-2&#8243; &gt;
</p>
<p>
  				&lt;label for=&#8221;sex-2&#8243;&gt;否&lt;/label&gt;
</p>
<p>
  			&lt;/div&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;上级权限：&lt;/label&gt;
</p>
<p>
  		&lt;div class=&#8221;formControls col-xs-8 col-sm-9&#8243;&gt; &lt;span class=&#8221;select-box&#8221; style=&#8221;width:150px;&#8221;&gt;
</p>
<p>
  			&lt;select class=&#8221;select&#8221; name=&#8221;pid&#8221; size=&#8221;1&#8243;&gt;
</p>
<p>
  				&lt;option value=&#8221;0&#8243;&gt;顶级权限&lt;/option&gt;
</p>
<p>
  				@foreach ($topAuths as $topAuths)
</p>
<p>
  				&lt;option value=&#8221;{{ $topAuths-&gt;id }}&#8221;&gt;{{ $topAuths-&gt;auth_name }}&lt;/option&gt;
</p>
<p>
  				@endforeach
</p>
<p>
  			&lt;/select&gt;
</p>
<p>
  			&lt;/span&gt; &lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;div class=&#8221;col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-3&#8243;&gt;
</p>
<p>
  			&lt;input class=&#8221;btn btn-primary radius&#8221; type=&#8221;submit&#8221; value=&#8221;&amp;nbsp;&amp;nbsp;提交&amp;nbsp;&amp;nbsp;&#8221;&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;/form&gt;
</p>
<p>
  &lt;/article&gt;
</p>
<p>
  &lt;!&#8211;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/jquery.validate.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/validate-methods.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/messages_zh.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  $(function(){
</p>
<p>
  	$(&#8216;.skin-minimal input&#8217;).iCheck({
</p>
<p>
  		checkboxClass: &#8216;icheckbox-blue&#8217;,
</p>
<p>
  		radioClass: &#8216;iradio-blue&#8217;,
</p>
<p>
  		increaseArea: &#8216;20%&#8217;
</p>
<p>
  	});
</p>
</p>
<p>
  	$(&#8220;#form-admin-add&#8221;).validate({
</p>
<p>
  		rules:{
</p>
<p>
  			atuh_name:{
</p>
<p>
  				required:true,
</p>
<p>
  				minlength:4,
</p>
<p>
  				maxlength:16
</p>
<p>
  			},
</p>
<p>
  			controller:{
</p>
<p>
  				required:true,
</p>
<p>
  			},
</p>
<p>
  			action:{
</p>
<p>
  				required:true,
</p>
<p>
  			},
</p>
<p>
  		},
</p>
<p>
  		onkeyup:false,
</p>
<p>
  		focusCleanup:true,
</p>
<p>
  		success:&#8221;valid&#8221;,
</p>
<p>
  		submitHandler:function(form){
</p>
<p>
  			$(form).ajaxSubmit({
</p>
<p>
  				type: &#8216;post&#8217;,
</p>
<p>
  				url: &#8220;{{ url(&#8216;admin/auth/add&#8217;) }}&#8221;,
</p>
<p>
  				success: function(data){
</p>
<p>
  				    //在父元素提示
</p>
<p>
                      parent.layer.msg(&#8216;添加成功!&#8217;,{icon:1,time:1000});
</p>
<p>
  					//成功则关闭窗口
</p>
<p>
                      var index = parent.layer.getFrameIndex(window.name);
</p>
<p>
                      parent.$(&#8216;.btn-refresh&#8217;).click();
</p>
<p>
                      parent.layer.close(index);
</p>
<p>
  				},
</p>
<p>
                  error: function(XmlHttpRequest, textStatus, errorThrown){
</p>
<p>
  					layer.msg(&#8216;error!&#8217;,{icon:1,time:1000});
</p>
<p>
  				}
</p>
<p>
  			});
</p>
<p>
  		}
</p>
<p>
  	});
</p>
<p>
  });
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;!&#8211;/请在上方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<ul>
<li>
    步骤4：打开列表页设置添加按钮连接
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="805" height="469" src="/wp-content/uploads/2018/05/word-image-5444.png" class="wp-image-5986" srcset="/wp-content/uploads/2018/05/word-image-5444.png 805w, /wp-content/uploads/2018/05/word-image-5444-300x175.png 300w, /wp-content/uploads/2018/05/word-image-5444-768x447.png 768w" sizes="(max-width: 805px) 100vw, 805px" /><br />
<img loading="lazy" decoding="async" width="1207" height="424" src="/wp-content/uploads/2018/05/word-image-5445.png" class="wp-image-5987" srcset="/wp-content/uploads/2018/05/word-image-5445.png 1207w, /wp-content/uploads/2018/05/word-image-5445-300x105.png 300w, /wp-content/uploads/2018/05/word-image-5445-768x270.png 768w, /wp-content/uploads/2018/05/word-image-5445-1024x360.png 1024w" sizes="(max-width: 1207px) 100vw, 1207px" /></p>
<p>
  &lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_add(&#8216;添加权限节点&#8217;,'{{ url(&#8216;admin/auth/add&#8217;) }}&#8217;,&#8217;400&#8242;,&#8217;360&#8242;)&#8221; class=&#8221;btn btn-primary radius&#8221;&gt;
</p>
<p>
  	&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe600;&lt;/i&gt; 添加权限节点
</p>
<p>
  &lt;/a&gt;
</p>
<h3>1）添加数据处理</h3>
<ul>
<li>
    步骤1：修改路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1015" height="423" src="/wp-content/uploads/2018/05/word-image-5446.png" class="wp-image-5988" srcset="/wp-content/uploads/2018/05/word-image-5446.png 1015w, /wp-content/uploads/2018/05/word-image-5446-300x125.png 300w, /wp-content/uploads/2018/05/word-image-5446-768x320.png 768w" sizes="(max-width: 1015px) 100vw, 1015px" /></p>
<ul>
<li>
    步骤2：更改控制器方法代码
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1171" height="546" src="/wp-content/uploads/2018/05/word-image-5447.png" class="wp-image-5989" srcset="/wp-content/uploads/2018/05/word-image-5447.png 1171w, /wp-content/uploads/2018/05/word-image-5447-300x140.png 300w, /wp-content/uploads/2018/05/word-image-5447-768x358.png 768w, /wp-content/uploads/2018/05/word-image-5447-1024x477.png 1024w" sizes="(max-width: 1171px) 100vw, 1171px" /></p>
<p>
  //添加
</p>
<p>
  public function add(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;auth_name&#8217;, &#8216;controller&#8217;, &#8216;action&#8217;, &#8216;is_nav&#8217;, &#8216;pid&#8217;]);
</p>
<p>
          //3.调用模型批量设置属性创建数据
</p>
<p>
          $rs = Auth::create($postData);
</p>
<p>
          //4.判断状态
</p>
<p>
          echo $rs ? 1 : 0;
</p>
<p>
      } else {
</p>
<p>
          //2.查询所有顶级权限
</p>
<p>
          $topAuths = Auth::where(&#8216;pid&#8217;, 0)-&gt;get();
</p>
<p>
          //3.加载视图并传递数据
</p>
<p>
          return view(&#8216;admin.auth.add&#8217;, compact(&#8216;topAuths&#8217;));
</p>
<p>
      }
</p>
<p>
  }
</p>
<h1><a id="post-5944-_Toc487817425"></a>四、角色管理</h1>
<h2>︴效果</h2>
<p>
  列表
</p>
<p><img loading="lazy" decoding="async" width="1329" height="288" src="/wp-content/uploads/2018/05/word-image-5448.png" class="wp-image-5990" srcset="/wp-content/uploads/2018/05/word-image-5448.png 1329w, /wp-content/uploads/2018/05/word-image-5448-300x65.png 300w, /wp-content/uploads/2018/05/word-image-5448-768x166.png 768w, /wp-content/uploads/2018/05/word-image-5448-1024x222.png 1024w" sizes="(max-width: 1329px) 100vw, 1329px" /></p>
<p>
  添加
</p>
<p><img loading="lazy" decoding="async" width="1184" height="306" src="/wp-content/uploads/2018/05/word-image-5449.png" class="wp-image-5991" srcset="/wp-content/uploads/2018/05/word-image-5449.png 1184w, /wp-content/uploads/2018/05/word-image-5449-300x78.png 300w, /wp-content/uploads/2018/05/word-image-5449-768x198.png 768w, /wp-content/uploads/2018/05/word-image-5449-1024x265.png 1024w" sizes="(max-width: 1184px) 100vw, 1184px" /></p>
<h2>1、列表功能</h2>
<h3>1）显示列表（模板文件：admin-role.html）</h3>
<ul>
<li>
    步骤1：定义路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1003" height="304" src="/wp-content/uploads/2018/05/word-image-5450.png" class="wp-image-5992" srcset="/wp-content/uploads/2018/05/word-image-5450.png 1003w, /wp-content/uploads/2018/05/word-image-5450-300x91.png 300w, /wp-content/uploads/2018/05/word-image-5450-768x233.png 768w" sizes="(max-width: 1003px) 100vw, 1003px" /></p>
<ul>
<li>
    步骤2：创建控制器和方法，并调用视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="848" height="540" src="/wp-content/uploads/2018/05/word-image-5451.png" class="wp-image-5993" srcset="/wp-content/uploads/2018/05/word-image-5451.png 848w, /wp-content/uploads/2018/05/word-image-5451-300x191.png 300w, /wp-content/uploads/2018/05/word-image-5451-768x489.png 768w" sizes="(max-width: 848px) 100vw, 848px" /></p>
<ul>
<li>
    步骤3：创建视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1040" height="590" src="/wp-content/uploads/2018/05/word-image-5452.png" class="wp-image-5994" srcset="/wp-content/uploads/2018/05/word-image-5452.png 1040w, /wp-content/uploads/2018/05/word-image-5452-300x170.png 300w, /wp-content/uploads/2018/05/word-image-5452-768x436.png 768w, /wp-content/uploads/2018/05/word-image-5452-1024x581.png 1024w" sizes="(max-width: 1040px) 100vw, 1040px" /></p>
<h3>2）数据处理</h3>
<ul>
<li>
    步骤1：创建模型
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="977" height="615" src="/wp-content/uploads/2018/05/word-image-5453.png" class="wp-image-5995" srcset="/wp-content/uploads/2018/05/word-image-5453.png 977w, /wp-content/uploads/2018/05/word-image-5453-300x189.png 300w, /wp-content/uploads/2018/05/word-image-5453-768x483.png 768w" sizes="(max-width: 977px) 100vw, 977px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Model;
</p>
<p>
  use Illuminate\Database\Eloquent\Model;
</p>
<p>
  class Role extends Model
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * 声明表名（注：laravel会自动加s所以自己声明覆盖）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $table = &#8216;role&#8217;;
</p>
<p>
      /**
</p>
<p>
       * Unix时间戳形式填充创建于和更新于（注：模型默认托管时间但是是datetime类型）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $dateFormat = &#8216;U&#8217;;
</p>
<p>
      /**
</p>
<p>
       * 声明可批量设置的属性（注：当使用create静态方式时）
</p>
<p>
       * @var array
</p>
<p>
       */
</p>
<p>
      protected $fillable = [&#8216;role_name&#8217;, &#8216;auth_ids&#8217;, &#8216;auth_ac&#8217;];
</p>
<p>
  }
</p>
<ul>
<li>
    步骤2：控制器调用数据，并传递给视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="781" height="467" src="/wp-content/uploads/2018/05/word-image-5454.png" class="wp-image-5996" srcset="/wp-content/uploads/2018/05/word-image-5454.png 781w, /wp-content/uploads/2018/05/word-image-5454-300x179.png 300w, /wp-content/uploads/2018/05/word-image-5454-768x459.png 768w" sizes="(max-width: 781px) 100vw, 781px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use App\Http\Model\Role;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class RoleController extends Controller
</p>
<p>
  {
</p>
<p>
      //列表
</p>
<p>
      public function index()
</p>
<p>
      {
</p>
<p>
          //1.通过内置分页功能获取数据，每页显示2条
</p>
<p>
          $roles = Role::paginate(2);
</p>
<p>
          //2.加载视图
</p>
<p>
          return view(&#8216;admin.role.index&#8217;, compact(&#8216;roles&#8217;));
</p>
<p>
      }
</p>
<p>
  }
</p>
<ul>
<li>
    步骤3：循环显示
  </li>
<li><a href="https://www.cnblogs.com/lamp01/p/6869762.html">https://www.cnblogs.com/lamp01/p/6869762.html</a>
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="889" height="582" src="/wp-content/uploads/2018/05/word-image-5455.png" class="wp-image-5997" srcset="/wp-content/uploads/2018/05/word-image-5455.png 889w, /wp-content/uploads/2018/05/word-image-5455-300x196.png 300w, /wp-content/uploads/2018/05/word-image-5455-768x503.png 768w" sizes="(max-width: 889px) 100vw, 889px" /><br />
<img loading="lazy" decoding="async" width="1184" height="530" src="/wp-content/uploads/2018/05/word-image-5456.png" class="wp-image-5998" srcset="/wp-content/uploads/2018/05/word-image-5456.png 1184w, /wp-content/uploads/2018/05/word-image-5456-300x134.png 300w, /wp-content/uploads/2018/05/word-image-5456-768x344.png 768w, /wp-content/uploads/2018/05/word-image-5456-1024x458.png 1024w" sizes="(max-width: 1184px) 100vw, 1184px" /></p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;style type=&#8221;text/css&#8221;&gt;
</p>
<p>
  	/*分页CSS样式*/
</p>
<p>
  	#pull_right{
</p>
<p>
  		text-align:center;
</p>
<p>
  	}
</p>
<p>
  	.pull-right {
</p>
<p>
  		/*float: left!important;*/
</p>
<p>
  	}
</p>
<p>
  	.pagination {
</p>
<p>
  		display: inline-block;
</p>
<p>
  		padding-left: 0;
</p>
<p>
  		margin: 20px 0;
</p>
<p>
  		border-radius: 4px;
</p>
<p>
  	}
</p>
<p>
  	.pagination &gt; li {
</p>
<p>
  		display: inline;
</p>
<p>
  	}
</p>
<p>
  	.pagination &gt; li &gt; a,
</p>
<p>
  	.pagination &gt; li &gt; span {
</p>
<p>
  		position: relative;
</p>
<p>
  		float: left;
</p>
<p>
  		padding: 6px 12px;
</p>
<p>
  		margin-left: -1px;
</p>
<p>
  		line-height: 1.42857143;
</p>
<p>
  		color: #428bca;
</p>
<p>
  		text-decoration: none;
</p>
<p>
  		background-color: #fff;
</p>
<p>
  		border: 1px solid #ddd;
</p>
<p>
  	}
</p>
<p>
  	.pagination &gt; li:first-child &gt; a,
</p>
<p>
  	.pagination &gt; li:first-child &gt; span {
</p>
<p>
  		margin-left: 0;
</p>
<p>
  		border-top-left-radius: 4px;
</p>
<p>
  		border-bottom-left-radius: 4px;
</p>
<p>
  	}
</p>
<p>
  	.pagination &gt; li:last-child &gt; a,
</p>
<p>
  	.pagination &gt; li:last-child &gt; span {
</p>
<p>
  		border-top-right-radius: 4px;
</p>
<p>
  		border-bottom-right-radius: 4px;
</p>
<p>
  	}
</p>
<p>
  	.pagination &gt; li &gt; a:hover,
</p>
<p>
  	.pagination &gt; li &gt; span:hover,
</p>
<p>
  	.pagination &gt; li &gt; a:focus,
</p>
<p>
  	.pagination &gt; li &gt; span:focus {
</p>
<p>
  		color: #2a6496;
</p>
<p>
  		background-color: #eee;
</p>
<p>
  		border-color: #ddd;
</p>
<p>
  	}
</p>
<p>
  	.pagination &gt; .active &gt; a,
</p>
<p>
  	.pagination &gt; .active &gt; span,
</p>
<p>
  	.pagination &gt; .active &gt; a:hover,
</p>
<p>
  	.pagination &gt; .active &gt; span:hover,
</p>
<p>
  	.pagination &gt; .active &gt; a:focus,
</p>
<p>
  	.pagination &gt; .active &gt; span:focus {
</p>
<p>
  		z-index: 2;
</p>
<p>
  		color: #fff;
</p>
<p>
  		cursor: default;
</p>
<p>
  		background-color: #428bca;
</p>
<p>
  		border-color: #428bca;
</p>
<p>
  	}
</p>
<p>
  	.pagination &gt; .disabled &gt; span,
</p>
<p>
  	.pagination &gt; .disabled &gt; span:hover,
</p>
<p>
  	.pagination &gt; .disabled &gt; span:focus,
</p>
<p>
  	.pagination &gt; .disabled &gt; a,
</p>
<p>
  	.pagination &gt; .disabled &gt; a:hover,
</p>
<p>
  	.pagination &gt; .disabled &gt; a:focus {
</p>
<p>
  		color: #777;
</p>
<p>
  		cursor: not-allowed;
</p>
<p>
  		background-color: #fff;
</p>
<p>
  		border-color: #ddd;
</p>
<p>
  	}
</p>
<p>
  	.clear{
</p>
<p>
  		clear: both;
</p>
<p>
  	}
</p>
<p>
  &lt;/style&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;title&gt;角色管理&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;nav class=&#8221;breadcrumb&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe67f;&lt;/i&gt; 首页 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 管理员管理 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 角色管理 &lt;a class=&#8221;btn btn-success radius r&#8221; style=&#8221;line-height:1.6em;margin-top:3px&#8221; href=&#8221;javascript:location.replace(location.href);&#8221; title=&#8221;刷新&#8221; &gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe68f;&lt;/i&gt;&lt;/a&gt;&lt;/nav&gt;
</p>
<p>
  &lt;div class=&#8221;page-container&#8221;&gt;
</p>
<p>
  	&lt;div class=&#8221;cl pd-5 bg-1 bk-gray&#8221;&gt; &lt;span class=&#8221;l&#8221;&gt; &lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;datadel()&#8221; class=&#8221;btn btn-danger radius&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt; 批量删除&lt;/a&gt; &lt;a class=&#8221;btn btn-primary radius&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_role_add(&#8216;添加角色&#8217;,&#8217;admin-role-add.html&#8217;,&#8217;800&#8242;)&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe600;&lt;/i&gt; 添加角色&lt;/a&gt; &lt;/span&gt; &lt;span class=&#8221;r&#8221;&gt;共有数据：&lt;strong&gt;54&lt;/strong&gt; 条&lt;/span&gt; &lt;/div&gt;
</p>
<p>
  	&lt;table class=&#8221;table table-border table-bordered table-hover table-bg&#8221;&gt;
</p>
<p>
  		&lt;thead&gt;
</p>
<p>
  			&lt;tr&gt;
</p>
<p>
  				&lt;th scope=&#8221;col&#8221; colspan=&#8221;6&#8243;&gt;角色管理&lt;/th&gt;
</p>
<p>
  			&lt;/tr&gt;
</p>
<p>
  			&lt;tr class=&#8221;text-c&#8221;&gt;
</p>
<p>
  				&lt;th width=&#8221;25&#8243;&gt;&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;&#8221;&gt;&lt;/th&gt;
</p>
<p>
  				&lt;th width=&#8221;40&#8243;&gt;ID&lt;/th&gt;
</p>
<p>
  				&lt;th width=&#8221;200&#8243;&gt;角色名&lt;/th&gt;
</p>
<p>
  				&lt;th width=&#8221;70&#8243;&gt;操作&lt;/th&gt;
</p>
<p>
  			&lt;/tr&gt;
</p>
<p>
  		&lt;/thead&gt;
</p>
<p>
  		&lt;tbody&gt;
</p>
<p>
  			@foreach ($roles as $role)
</p>
<p>
  			&lt;tr class=&#8221;text-c&#8221;&gt;
</p>
<p>
  				&lt;td&gt;&lt;input type=&#8221;checkbox&#8221; value=&#8221;{{ $role-&gt;id }}&#8221; name=&#8221;&#8221;&gt;&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;{{ $role-&gt;id }}&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;{{ $role-&gt;role_name }}&lt;/td&gt;
</p>
<p>
  				&lt;td class=&#8221;f-14&#8243;&gt;
</p>
<p>
  					&lt;a title=&#8221;编辑&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_role_edit(&#8216;角色编辑&#8217;,&#8217;admin-role-add.html&#8217;,&#8217;1&#8242;)&#8221; style=&#8221;text-decoration:none&#8221;&gt;
</p>
<p>
  						&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6df;&lt;/i&gt;
</p>
<p>
  					&lt;/a&gt;
</p>
<p>
  					&lt;a title=&#8221;删除&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_role_del(this,&#8217;1&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;
</p>
<p>
  						&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt;
</p>
<p>
  					&lt;/a&gt;
</p>
<p>
  					&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;admin_role_del(this,&#8217;1&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;
</p>
<p>
  						分配权限
</p>
<p>
  					&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 id=&#8221;pull_right&#8221;&gt;
</p>
<p>
  		&lt;div class=&#8221;pull-right&#8221;&gt;
</p>
<p>
  			{!! $roles-&gt;links() !!}
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<p>
  &lt;!&#8211;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/datatables/1.10.0/jquery.dataTables.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  /*管理员-角色-添加*/
</p>
<p>
  function admin_role_add(title,url,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-角色-编辑*/
</p>
<p>
  function admin_role_edit(title,url,id,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-角色-删除*/
</p>
<p>
  function admin_role_del(obj,id){
</p>
<p>
  	layer.confirm(&#8216;角色删除须谨慎，确认要删除吗？&#8217;,function(index){
</p>
<p>
  		$.ajax({
</p>
<p>
  			type: &#8216;POST&#8217;,
</p>
<p>
  			url: &#8221;,
</p>
<p>
  			dataType: &#8216;json&#8217;,
</p>
<p>
  			success: function(data){
</p>
<p>
  				$(obj).parents(&#8220;tr&#8221;).remove();
</p>
<p>
  				layer.msg(&#8216;已删除!&#8217;,{icon:1,time:1000});
</p>
<p>
  			},
</p>
<p>
  			error:function(data) {
</p>
<p>
  				console.log(data.msg);
</p>
<p>
  			},
</p>
<p>
  		});
</p>
<p>
  	});
</p>
<p>
  }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2>2、权限分配数据处理【难点】</h2>
<h3>1）显示分配视图（模板文件：admin-role-add.html）</h3>
<ul>
<li>
    步骤1：打开角色列表，点击分配权限按钮弹框设置
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1149" height="188" src="/wp-content/uploads/2018/05/word-image-5457.png" class="wp-image-5999" srcset="/wp-content/uploads/2018/05/word-image-5457.png 1149w, /wp-content/uploads/2018/05/word-image-5457-300x49.png 300w, /wp-content/uploads/2018/05/word-image-5457-768x126.png 768w, /wp-content/uploads/2018/05/word-image-5457-1024x168.png 1024w" sizes="(max-width: 1149px) 100vw, 1149px" /></p>
<p>
  &lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;admin_role_assign(&#8216;分配权限&#8217;,'{{ url(&#8216;admin/role/assignAuth&#8217;) }}?role_id={{$role-&gt;id}}&#8217;,860,400)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;
</p>
<p>
  分配权限
</p>
<p>
  &lt;/a&gt;
</p>
<p><img loading="lazy" decoding="async" width="647" height="232" src="/wp-content/uploads/2018/05/word-image-5458.png" class="wp-image-6000" srcset="/wp-content/uploads/2018/05/word-image-5458.png 647w, /wp-content/uploads/2018/05/word-image-5458-300x108.png 300w" sizes="(max-width: 647px) 100vw, 647px" /></p>
<p>
  /*管理员-角色-权限分配*/
</p>
<p>
  function admin_role_assign(title,url,w,h){
</p>
<p>
      layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<ul>
<li>
    步骤2：定义路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1144" height="160" src="/wp-content/uploads/2018/05/word-image-5459.png" class="wp-image-6001" srcset="/wp-content/uploads/2018/05/word-image-5459.png 1144w, /wp-content/uploads/2018/05/word-image-5459-300x42.png 300w, /wp-content/uploads/2018/05/word-image-5459-768x107.png 768w, /wp-content/uploads/2018/05/word-image-5459-1024x143.png 1024w" sizes="(max-width: 1144px) 100vw, 1144px" /></p>
<ul>
<li>
    步骤2：创建控制器和方法，并调用视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="905" height="481" src="/wp-content/uploads/2018/05/word-image-5460.png" class="wp-image-6002" srcset="/wp-content/uploads/2018/05/word-image-5460.png 905w, /wp-content/uploads/2018/05/word-image-5460-300x159.png 300w, /wp-content/uploads/2018/05/word-image-5460-768x408.png 768w" sizes="(max-width: 905px) 100vw, 905px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use App\Http\Model\Auth;
</p>
<p>
  use App\Http\Model\Role;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class RoleController extends Controller
</p>
<p>
  {
</p>
<p>
      //列表
</p>
<p>
      public function index()
</p>
<p>
      {
</p>
<p>
          //1.通过内置分页功能获取数据，每页显示2条
</p>
<p>
          $roles = Role::paginate(2);
</p>
<p>
          //2.加载视图
</p>
<p>
          return view(&#8216;admin.role.index&#8217;, compact(&#8216;roles&#8217;));
</p>
<p>
      }
</p>
<p>
      //分配权限
</p>
<p>
      public function assignAuth(Request $request)
</p>
<p>
      {
</p>
<p>
          return view(&#8216;admin.role.assignAuth&#8217;);
</p>
<p>
      }
</p>
<p>
  }
</p>
<ul>
<li>
    步骤3：创建视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1147" height="612" src="/wp-content/uploads/2018/05/word-image-5461.png" class="wp-image-6003" srcset="/wp-content/uploads/2018/05/word-image-5461.png 1147w, /wp-content/uploads/2018/05/word-image-5461-300x160.png 300w, /wp-content/uploads/2018/05/word-image-5461-768x410.png 768w, /wp-content/uploads/2018/05/word-image-5461-1024x546.png 1024w" sizes="(max-width: 1147px) 100vw, 1147px" /></p>
<p>
  &lt;!&#8211;_meta 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;Bookmark&#8221; href=&#8221;/favicon.ico&#8221; &gt;
</p>
<p>
  &lt;link rel=&#8221;Shortcut Icon&#8221; href=&#8221;/favicon.ico&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;!&#8211;/meta 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;title&gt;新建网站角色 &#8211; 管理员管理 &#8211; H-ui.admin v3.1&lt;/title&gt;
</p>
<p>
  &lt;meta name=&#8221;keywords&#8221; content=&#8221;H-ui.admin v3.1,H-ui网站后台模版,后台模版下载,后台管理系统模版,HTML后台模版下载&#8221;&gt;
</p>
<p>
  &lt;meta name=&#8221;description&#8221; content=&#8221;H-ui.admin v3.1，是一款由国人开发的轻量级扁平化网站后台模板，完全免费开源的网站后台管理系统模版，适合中小型CMS后台系统。&#8221;&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;article class=&#8221;page-container&#8221;&gt;
</p>
<p>
  	&lt;form action=&#8221;&#8221; method=&#8221;post&#8221; class=&#8221;form form-horizontal&#8221; id=&#8221;form-admin-role-add&#8221;&gt;
</p>
<p>
  		&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  			&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;权限名称：&lt;/label&gt;
</p>
<p>
  			&lt;div class=&#8221;formControls col-xs-8 col-sm-9&#8243;&gt;
</p>
<p>
  				&lt;dl class=&#8221;permission-list&#8221;&gt;
</p>
<p>
  					&lt;dt&gt;
</p>
<p>
  						&lt;label&gt;
</p>
<p>
  							&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0&#8243; id=&#8221;user-Character-0&#8243;&gt;
</p>
<p>
  							资讯管理&lt;/label&gt;
</p>
<p>
  					&lt;/dt&gt;
</p>
<p>
  					&lt;dd&gt;
</p>
<p>
  						&lt;dl class=&#8221;cl permission-list2&#8243;&gt;
</p>
<p>
  							&lt;dt&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0-0&#8243; id=&#8221;user-Character-0-0&#8243;&gt;
</p>
<p>
  									栏目管理&lt;/label&gt;
</p>
<p>
  							&lt;/dt&gt;
</p>
<p>
  							&lt;dd&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0-0-0&#8243; id=&#8221;user-Character-0-0-0&#8243;&gt;
</p>
<p>
  									添加&lt;/label&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0-0-0&#8243; id=&#8221;user-Character-0-0-1&#8243;&gt;
</p>
<p>
  									修改&lt;/label&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0-0-0&#8243; id=&#8221;user-Character-0-0-2&#8243;&gt;
</p>
<p>
  									删除&lt;/label&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0-0-0&#8243; id=&#8221;user-Character-0-0-3&#8243;&gt;
</p>
<p>
  									查看&lt;/label&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0-0-0&#8243; id=&#8221;user-Character-0-0-4&#8243;&gt;
</p>
<p>
  									审核&lt;/label&gt;
</p>
<p>
  								&lt;label class=&#8221;c-orange&#8221;&gt;&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0-0-0&#8243; id=&#8221;user-Character-0-0-5&#8243;&gt; 只能操作自己发布的&lt;/label&gt;
</p>
<p>
  							&lt;/dd&gt;
</p>
<p>
  						&lt;/dl&gt;
</p>
<p>
  						&lt;dl class=&#8221;cl permission-list2&#8243;&gt;
</p>
<p>
  							&lt;dt&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0-1&#8243; id=&#8221;user-Character-0-1&#8243;&gt;
</p>
<p>
  									文章管理&lt;/label&gt;
</p>
<p>
  							&lt;/dt&gt;
</p>
<p>
  							&lt;dd&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0-1-0&#8243; id=&#8221;user-Character-0-1-0&#8243;&gt;
</p>
<p>
  									添加&lt;/label&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0-1-0&#8243; id=&#8221;user-Character-0-1-1&#8243;&gt;
</p>
<p>
  									修改&lt;/label&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0-1-0&#8243; id=&#8221;user-Character-0-1-2&#8243;&gt;
</p>
<p>
  									删除&lt;/label&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0-1-0&#8243; id=&#8221;user-Character-0-1-3&#8243;&gt;
</p>
<p>
  									查看&lt;/label&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0-1-0&#8243; id=&#8221;user-Character-0-1-4&#8243;&gt;
</p>
<p>
  									审核&lt;/label&gt;
</p>
<p>
  								&lt;label class=&#8221;c-orange&#8221;&gt;&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0-2-0&#8243; id=&#8221;user-Character-0-2-5&#8243;&gt; 只能操作自己发布的&lt;/label&gt;
</p>
<p>
  							&lt;/dd&gt;
</p>
<p>
  						&lt;/dl&gt;
</p>
<p>
  					&lt;/dd&gt;
</p>
<p>
  				&lt;/dl&gt;
</p>
<p>
  				&lt;dl class=&#8221;permission-list&#8221;&gt;
</p>
<p>
  					&lt;dt&gt;
</p>
<p>
  						&lt;label&gt;
</p>
<p>
  							&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-0&#8243; id=&#8221;user-Character-1&#8243;&gt;
</p>
<p>
  							用户中心&lt;/label&gt;
</p>
<p>
  					&lt;/dt&gt;
</p>
<p>
  					&lt;dd&gt;
</p>
<p>
  						&lt;dl class=&#8221;cl permission-list2&#8243;&gt;
</p>
<p>
  							&lt;dt&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-1-0&#8243; id=&#8221;user-Character-1-0&#8243;&gt;
</p>
<p>
  									用户管理&lt;/label&gt;
</p>
<p>
  							&lt;/dt&gt;
</p>
<p>
  							&lt;dd&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-1-0-0&#8243; id=&#8221;user-Character-1-0-0&#8243;&gt;
</p>
<p>
  									添加&lt;/label&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-1-0-0&#8243; id=&#8221;user-Character-1-0-1&#8243;&gt;
</p>
<p>
  									修改&lt;/label&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-1-0-0&#8243; id=&#8221;user-Character-1-0-2&#8243;&gt;
</p>
<p>
  									删除&lt;/label&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-1-0-0&#8243; id=&#8221;user-Character-1-0-3&#8243;&gt;
</p>
<p>
  									查看&lt;/label&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input type=&#8221;checkbox&#8221; value=&#8221;&#8221; name=&#8221;user-Character-1-0-0&#8243; id=&#8221;user-Character-1-0-4&#8243;&gt;
</p>
<p>
  									审核&lt;/label&gt;
</p>
<p>
  							&lt;/dd&gt;
</p>
<p>
  						&lt;/dl&gt;
</p>
<p>
  					&lt;/dd&gt;
</p>
<p>
  				&lt;/dl&gt;
</p>
<p>
  			&lt;/div&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  		&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  			&lt;div class=&#8221;col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-3&#8243;&gt;
</p>
<p>
  				&lt;button type=&#8221;submit&#8221; class=&#8221;btn btn-success radius&#8221; id=&#8221;admin-role-save&#8221; name=&#8221;admin-role-save&#8221;&gt;&lt;i class=&#8221;icon-ok&#8221;&gt;&lt;/i&gt; 确定&lt;/button&gt;
</p>
<p>
  			&lt;/div&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/form&gt;
</p>
<p>
  &lt;/article&gt;
</p>
<p>
  &lt;!&#8211;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/jquery.validate.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/validate-methods.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/messages_zh.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  $(function(){
</p>
<p>
  	$(&#8220;.permission-list dt input:checkbox&#8221;).click(function(){
</p>
<p>
  		$(this).closest(&#8220;dl&#8221;).find(&#8220;dd input:checkbox&#8221;).prop(&#8220;checked&#8221;,$(this).prop(&#8220;checked&#8221;));
</p>
<p>
  	});
</p>
<p>
  	$(&#8220;.permission-list2 dd input:checkbox&#8221;).click(function(){
</p>
<p>
  		var l =$(this).parent().parent().find(&#8220;input:checked&#8221;).length;
</p>
<p>
  		var l2=$(this).parents(&#8220;.permission-list&#8221;).find(&#8220;.permission-list2 dd&#8221;).find(&#8220;input:checked&#8221;).length;
</p>
<p>
  		if($(this).prop(&#8220;checked&#8221;)){
</p>
<p>
  			$(this).closest(&#8220;dl&#8221;).find(&#8220;dt input:checkbox&#8221;).prop(&#8220;checked&#8221;,true);
</p>
<p>
  			$(this).parents(&#8220;.permission-list&#8221;).find(&#8220;dt&#8221;).first().find(&#8220;input:checkbox&#8221;).prop(&#8220;checked&#8221;,true);
</p>
<p>
  		}
</p>
<p>
  		else{
</p>
<p>
  			if(l==0){
</p>
<p>
  				$(this).closest(&#8220;dl&#8221;).find(&#8220;dt input:checkbox&#8221;).prop(&#8220;checked&#8221;,false);
</p>
<p>
  			}
</p>
<p>
  			if(l2==0){
</p>
<p>
  				$(this).parents(&#8220;.permission-list&#8221;).find(&#8220;dt&#8221;).first().find(&#8220;input:checkbox&#8221;).prop(&#8220;checked&#8221;,false);
</p>
<p>
  			}
</p>
<p>
  		}
</p>
<p>
  	});
</p>
</p>
<p>
  	$(&#8220;#form-admin-role-add&#8221;).validate({
</p>
<p>
  		rules:{
</p>
<p>
  			roleName:{
</p>
<p>
  				required:true,
</p>
<p>
  			},
</p>
<p>
  		},
</p>
<p>
  		onkeyup:false,
</p>
<p>
  		focusCleanup:true,
</p>
<p>
  		success:&#8221;valid&#8221;,
</p>
<p>
  		submitHandler:function(form){
</p>
<p>
  			$(form).ajaxSubmit();
</p>
<p>
  			var index = parent.layer.getFrameIndex(window.name);
</p>
<p>
  			parent.layer.close(index);
</p>
<p>
  		}
</p>
<p>
  	});
</p>
<p>
  });
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;!&#8211;/请在上方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h3>2）数据数据动态化（显示所有权限，和默认选中权限）</h3>
<ul>
<li>
    步骤1：查询所有顶级权限和子级权限
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="901" height="217" src="/wp-content/uploads/2018/05/word-image-5462.png" class="wp-image-6004" srcset="/wp-content/uploads/2018/05/word-image-5462.png 901w, /wp-content/uploads/2018/05/word-image-5462-300x72.png 300w, /wp-content/uploads/2018/05/word-image-5462-768x185.png 768w" sizes="(max-width: 901px) 100vw, 901px" /></p>
<p>
  //分配权限
</p>
<p>
  public function assignAuth(Request $request)
</p>
<p>
  {
</p>
<p>
      //【显示所有权限节点功能】
</p>
<p>
      //1.查询所有顶级权限
</p>
<p>
      $topAuths = Auth::where(&#8216;pid&#8217;, 0)-&gt;get();
</p>
<p>
      //2.查询所有子级权限
</p>
<p>
      $sonAuths = Auth::where(&#8216;pid&#8217;, &#8216;&lt;&gt;&#8217;, 0)-&gt;get();
</p>
<p>
      //4.加载视图
</p>
<p>
      return view(&#8216;admin.role.assignAuth&#8217;, compact(&#8216;topAuths&#8217;, &#8216;sonAuths&#8217;));
</p>
<p>
  }
</p>
<ul>
<li>
    步骤2：视图循环显示所有权限（规则：先老子后儿子）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="893" height="584" src="/wp-content/uploads/2018/05/word-image-5463.png" class="wp-image-6005" srcset="/wp-content/uploads/2018/05/word-image-5463.png 893w, /wp-content/uploads/2018/05/word-image-5463-300x196.png 300w, /wp-content/uploads/2018/05/word-image-5463-768x502.png 768w" sizes="(max-width: 893px) 100vw, 893px" /></p>
<p>
  &lt;form action=&#8221;&#8221; method=&#8221;post&#8221; class=&#8221;form form-horizontal&#8221; id=&#8221;form-admin-role-add&#8221;&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;权限名称：&lt;/label&gt;
</p>
<p>
  		&lt;div class=&#8221;formControls col-xs-8 col-sm-9&#8243;&gt;
</p>
<p>
  			<strong>@foreach($topAuths as $topAuth)</strong>
</p>
<p><strong>			&lt;dl class=&#8221;permission-list&#8221;&gt;</strong>
</p>
<p><strong>				&lt;dd&gt;</strong>
</p>
<p><strong>					&lt;dl class=&#8221;cl permission-list2&#8243;&gt;</strong>
</p>
<p><strong>						&lt;dt&gt;</strong>
</p>
<p><strong>							&lt;label class=&#8221;&#8221;&gt;</strong>
</p>
<p><strong>								&lt;input </strong>
</p>
<p><strong>									type=&#8221;checkbox&#8221; </strong>
</p>
<p><strong>									value=&#8221;&#8221; </strong>
</p>
<p><strong>									name=&#8221;user-Character-1-0&#8243; </strong>
</p>
<p><strong>									id=&#8221;user-Character-1-0&#8243;</strong>
</p>
<p><strong>								&gt;</strong>
</p>
<p><strong>								{{ $topAuth-&gt;auth_name}}</strong>
</p>
<p><strong>							&lt;/label&gt;</strong>
</p>
<p><strong>						&lt;/dt&gt;</strong>
</p>
<p><strong>						&lt;dd&gt;</strong>
</p>
<p><strong>							@foreach($sonAuths as $sonAuth)</strong>
</p>
<p><strong>								&lt;!&#8211; 父元素的ID  == 子元素PID &#8211;&gt;</strong>
</p>
<p><strong>								@if ($topAuth-&gt;id == $sonAuth-&gt;pid) </strong>
</p>
<p><strong>								&lt;label class=&#8221;&#8221;&gt;</strong>
</p>
<p><strong>									&lt;input </strong>
</p>
<p><strong>										type=&#8221;checkbox&#8221; </strong>
</p>
<p><strong>										value=&#8221;&#8221; </strong>
</p>
<p><strong>										name=&#8221;user-Character-1-0-0&#8243; </strong>
</p>
<p><strong>										id=&#8221;user-Character-1-0-0&#8243;</strong>
</p>
<p><strong>									&gt;</strong>
</p>
<p><strong>									{{ $sonAuth-&gt;auth_name}}</strong>
</p>
<p><strong>								&lt;/label&gt;</strong>
</p>
<p><strong>								@endif</strong>
</p>
<p><strong>							@endforeach</strong>
</p>
<p><strong>						&lt;/dd&gt;</strong>
</p>
<p><strong>					&lt;/dl&gt;</strong>
</p>
<p><strong>				&lt;/dd&gt;</strong>
</p>
<p><strong>			&lt;/dl&gt;</strong>
</p>
<p><strong>			@endforeach</strong>
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;div class=&#8221;col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-3&#8243;&gt;
</p>
<p>
  			&lt;button type=&#8221;submit&#8221; class=&#8221;btn btn-success radius&#8221; id=&#8221;admin-role-save&#8221; name=&#8221;admin-role-save&#8221;&gt;&lt;i class=&#8221;icon-ok&#8221;&gt;&lt;/i&gt; 确定&lt;/button&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  &lt;/form&gt;
</p>
<ul>
<li>
    步骤3：根据角色ID获取所有权限，默认选中已有权限
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1165" height="323" src="/wp-content/uploads/2018/05/word-image-5464.png" class="wp-image-6006" srcset="/wp-content/uploads/2018/05/word-image-5464.png 1165w, /wp-content/uploads/2018/05/word-image-5464-300x83.png 300w, /wp-content/uploads/2018/05/word-image-5464-768x213.png 768w, /wp-content/uploads/2018/05/word-image-5464-1024x284.png 1024w" sizes="(max-width: 1165px) 100vw, 1165px" /></p>
<p>
  //分配权限
</p>
<p>
  public function assignAuth(Request $request)
</p>
<p>
  {
</p>
<p>
      //【显示所有权限节点功能】
</p>
<p>
      //1.查询所有顶级权限
</p>
<p>
      $topAuths = Auth::where(&#8216;pid&#8217;, 0)-&gt;get();
</p>
<p>
      //2.查询所有子级权限
</p>
<p>
      $sonAuths = Auth::where(&#8216;pid&#8217;, &#8216;&lt;&gt;&#8217;, 0)-&gt;get();
</p>
<p>
      <strong>//【根据角色ID获取角色的所有权限】</strong>
</p>
<p><strong>    $role = Role::where(&#8216;id&#8217;, $request-&gt;input(&#8216;role_id&#8217;))-&gt;first();</strong>
</p>
<p><strong>    $authArr = !empty($role-&gt;auth_ids) ? explode(&#8216;,&#8217;, $role-&gt;auth_ids) : [];</strong>
</p>
<p>
      //4.加载视图
</p>
<p>
      return view(&#8216;admin.role.assignAuth&#8217;, compact(&#8216;topAuths&#8217;, &#8216;sonAuths&#8217;, <strong>&#8216;authArr&#8217;</strong>));
</p>
<p>
  }
</p>
<p><img loading="lazy" decoding="async" width="855" height="646" src="/wp-content/uploads/2018/05/word-image-5465.png" class="wp-image-6007" srcset="/wp-content/uploads/2018/05/word-image-5465.png 855w, /wp-content/uploads/2018/05/word-image-5465-300x227.png 300w, /wp-content/uploads/2018/05/word-image-5465-768x580.png 768w" sizes="(max-width: 855px) 100vw, 855px" /></p>
<p>
  @foreach($topAuths as $topAuth)
</p>
<p>
  &lt;dl class=&#8221;permission-list&#8221;&gt;
</p>
<p>
  	&lt;dd&gt;
</p>
<p>
  		&lt;dl class=&#8221;cl permission-list2&#8243;&gt;
</p>
<p>
  			&lt;dt&gt;
</p>
<p>
  				&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  					&lt;input
</p>
<p>
  						type=&#8221;checkbox&#8221;
</p>
<p>
  						value=&#8221;&#8221;
</p>
<p>
  						name=&#8221;user-Character-1-0&#8243;
</p>
<p>
  						id=&#8221;user-Character-1-0&#8243;
</p>
<p>
  						<strong>@if(in_array($topAuth-&gt;id, $authArr)) </strong>
</p>
<p><strong>							checked=checked</strong>
</p>
<p><strong>						@endif</strong>
</p>
<p>
  					&gt;
</p>
<p>
  					{{ $topAuth-&gt;auth_name}}
</p>
<p>
  				&lt;/label&gt;
</p>
<p>
  			&lt;/dt&gt;
</p>
<p>
  			&lt;dd&gt;
</p>
<p>
  				@foreach($sonAuths as $sonAuth)
</p>
<p>
  					&lt;!&#8211; 父元素的ID  == 子元素PID &#8211;&gt;
</p>
<p>
  					@if ($topAuth-&gt;id == $sonAuth-&gt;pid)
</p>
<p>
  					&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  						&lt;input
</p>
<p>
  							type=&#8221;checkbox&#8221;
</p>
<p>
  							value=&#8221;&#8221;
</p>
<p>
  							name=&#8221;user-Character-1-0-0&#8243;
</p>
<p>
  							id=&#8221;user-Character-1-0-0&#8243;
</p>
<p>
  							<strong>@if(in_array($sonAuth-&gt;id, $authArr)) </strong>
</p>
<p><strong>								checked=checked</strong>
</p>
<p><strong>							@endif</strong>
</p>
<p>
  						&gt;
</p>
<p>
  						{{ $sonAuth-&gt;auth_name}}
</p>
<p>
  					&lt;/label&gt;
</p>
<p>
  					@endif
</p>
<p>
  				@endforeach
</p>
<p>
  			&lt;/dd&gt;
</p>
<p>
  		&lt;/dl&gt;
</p>
<p>
  	&lt;/dd&gt;
</p>
<p>
  &lt;/dl&gt;
</p>
<p>
  @endforeach
</p>
<h3>3）保存更改角色权限</h3>
<ul>
<li>
    步骤1：更改表单
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="865" height="606" src="/wp-content/uploads/2018/05/word-image-5466.png" class="wp-image-6008" srcset="/wp-content/uploads/2018/05/word-image-5466.png 865w, /wp-content/uploads/2018/05/word-image-5466-300x210.png 300w, /wp-content/uploads/2018/05/word-image-5466-768x538.png 768w" sizes="(max-width: 865px) 100vw, 865px" /><br />
<img loading="lazy" decoding="async" width="964" height="502" src="/wp-content/uploads/2018/05/word-image-5467.png" class="wp-image-6009" srcset="/wp-content/uploads/2018/05/word-image-5467.png 964w, /wp-content/uploads/2018/05/word-image-5467-300x156.png 300w, /wp-content/uploads/2018/05/word-image-5467-768x400.png 768w" sizes="(max-width: 964px) 100vw, 964px" /></p>
<p>
  &lt;!&#8211;_meta 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;Bookmark&#8221; href=&#8221;/favicon.ico&#8221; &gt;
</p>
<p>
  &lt;link rel=&#8221;Shortcut Icon&#8221; href=&#8221;/favicon.ico&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;!&#8211;/meta 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;title&gt;新建网站角色 &#8211; 管理员管理 &#8211; H-ui.admin v3.1&lt;/title&gt;
</p>
<p>
  &lt;meta name=&#8221;keywords&#8221; content=&#8221;H-ui.admin v3.1,H-ui网站后台模版,后台模版下载,后台管理系统模版,HTML后台模版下载&#8221;&gt;
</p>
<p>
  &lt;meta name=&#8221;description&#8221; content=&#8221;H-ui.admin v3.1，是一款由国人开发的轻量级扁平化网站后台模板，完全免费开源的网站后台管理系统模版，适合中小型CMS后台系统。&#8221;&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;article class=&#8221;page-container&#8221;&gt;
</p>
<p>
  	&lt;form action=&#8221;&#8221; method=&#8221;post&#8221; class=&#8221;form form-horizontal&#8221; id=&#8221;form-admin-role-add&#8221;&gt;
</p>
<p>
  		&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  			&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;权限名称：&lt;/label&gt;
</p>
<p>
  			&lt;div class=&#8221;formControls col-xs-8 col-sm-9&#8243;&gt;
</p>
<p>
  				@foreach($topAuths as $topAuth)
</p>
<p>
  				&lt;dl class=&#8221;permission-list&#8221;&gt;
</p>
<p>
  					&lt;dd&gt;
</p>
<p>
  						&lt;dl class=&#8221;cl permission-list2&#8243;&gt;
</p>
<p>
  							&lt;dt&gt;
</p>
<p>
  								&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  									&lt;input
</p>
<p>
  										type=&#8221;checkbox&#8221;
</p>
<p><strong>										value=&#8221;{{ $topAuth-&gt;id }}&#8221; </strong>
</p>
<p><strong>										name=&#8221;auth[]&#8221; </strong>
</p>
<p>
  										id=&#8221;user-Character-1-0&#8243;
</p>
<p>
  										@if(in_array($topAuth-&gt;id, $authArr))
</p>
<p>
  											checked=checked
</p>
<p>
  										@endif
</p>
<p>
  									&gt;
</p>
<p>
  									{{ $topAuth-&gt;auth_name}}
</p>
<p>
  								&lt;/label&gt;
</p>
<p>
  							&lt;/dt&gt;
</p>
<p>
  							&lt;dd&gt;
</p>
<p>
  								@foreach($sonAuths as $sonAuth)
</p>
<p>
  									&lt;!&#8211; 父元素的ID  == 子元素PID &#8211;&gt;
</p>
<p>
  									@if ($topAuth-&gt;id == $sonAuth-&gt;pid)
</p>
<p>
  									&lt;label class=&#8221;&#8221;&gt;
</p>
<p>
  										&lt;input
</p>
<p>
  											type=&#8221;checkbox&#8221;
</p>
<p><strong>											value=&#8221;{{ $sonAuth-&gt;id }}&#8221; </strong>
</p>
<p><strong>											name=&#8221;auth[]&#8221; </strong>
</p>
<p>
  											id=&#8221;user-Character-1-0-0&#8243;
</p>
<p>
  											@if(in_array($sonAuth-&gt;id, $authArr))
</p>
<p>
  												checked=checked
</p>
<p>
  											@endif
</p>
<p>
  										&gt;
</p>
<p>
  										{{ $sonAuth-&gt;auth_name}}
</p>
<p>
  									&lt;/label&gt;
</p>
<p>
  									@endif
</p>
<p>
  								@endforeach
</p>
<p>
  							&lt;/dd&gt;
</p>
<p>
  						&lt;/dl&gt;
</p>
<p>
  					&lt;/dd&gt;
</p>
<p>
  				&lt;/dl&gt;
</p>
<p>
  				@endforeach
</p>
<p>
  			&lt;/div&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  		&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  			&lt;div class=&#8221;col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-3&#8243;&gt;
</p>
<p>
  				&lt;button type=&#8221;submit&#8221; class=&#8221;btn btn-success radius&#8221; id=&#8221;admin-role-save&#8221; name=&#8221;admin-role-save&#8221;&gt;&lt;i class=&#8221;icon-ok&#8221;&gt;&lt;/i&gt; 确定&lt;/button&gt;
</p>
<p>
  			&lt;/div&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/form&gt;
</p>
<p>
  &lt;/article&gt;
</p>
<p>
  &lt;!&#8211;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/jquery.validate.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/validate-methods.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/messages_zh.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  $(function(){
</p>
<p>
  	$(&#8220;.permission-list dt input:checkbox&#8221;).click(function(){
</p>
<p>
  		$(this).closest(&#8220;dl&#8221;).find(&#8220;dd input:checkbox&#8221;).prop(&#8220;checked&#8221;,$(this).prop(&#8220;checked&#8221;));
</p>
<p>
  	});
</p>
<p>
  	$(&#8220;.permission-list2 dd input:checkbox&#8221;).click(function(){
</p>
<p>
  		var l =$(this).parent().parent().find(&#8220;input:checked&#8221;).length;
</p>
<p>
  		var l2=$(this).parents(&#8220;.permission-list&#8221;).find(&#8220;.permission-list2 dd&#8221;).find(&#8220;input:checked&#8221;).length;
</p>
<p>
  		if($(this).prop(&#8220;checked&#8221;)){
</p>
<p>
  			$(this).closest(&#8220;dl&#8221;).find(&#8220;dt input:checkbox&#8221;).prop(&#8220;checked&#8221;,true);
</p>
<p>
  			$(this).parents(&#8220;.permission-list&#8221;).find(&#8220;dt&#8221;).first().find(&#8220;input:checkbox&#8221;).prop(&#8220;checked&#8221;,true);
</p>
<p>
  		}
</p>
<p>
  		else{
</p>
<p>
  			if(l==0){
</p>
<p>
  				$(this).closest(&#8220;dl&#8221;).find(&#8220;dt input:checkbox&#8221;).prop(&#8220;checked&#8221;,false);
</p>
<p>
  			}
</p>
<p>
  			if(l2==0){
</p>
<p>
  				$(this).parents(&#8220;.permission-list&#8221;).find(&#8220;dt&#8221;).first().find(&#8220;input:checkbox&#8221;).prop(&#8220;checked&#8221;,false);
</p>
<p>
  			}
</p>
<p>
  		}
</p>
<p>
  	});
</p>
</p>
<p>
  	<strong>$(&#8220;#form-admin-role-add&#8221;).validate({</strong>
</p>
<p><strong>		rules:{</strong>
</p>
<p><strong>		},</strong>
</p>
<p><strong>		onkeyup:false,</strong>
</p>
<p><strong>		focusCleanup:true,</strong>
</p>
<p><strong>		success:&#8221;valid&#8221;,</strong>
</p>
<p><strong>		submitHandler:function(form){</strong>
</p>
<p><strong>			$(form).ajaxSubmit({</strong>
</p>
<p><strong>				type: &#8216;post&#8217;,</strong>
</p>
<p><strong>				url: window.location,</strong>
</p>
<p><strong>				success: function(data){</strong>
</p>
<p><strong>				    //在父元素提示</strong>
</p>
<p><strong>                    parent.layer.msg(&#8216;更新成功!&#8217;,{icon:1,time:1000});</strong>
</p>
<p><strong>					//成功则关闭窗口</strong>
</p>
<p><strong>                    var index = parent.layer.getFrameIndex(window.name);</strong>
</p>
<p><strong>                    parent.$(&#8216;.btn-refresh&#8217;).click();</strong>
</p>
<p><strong>                    parent.layer.close(index);</strong>
</p>
<p><strong>				},</strong>
</p>
<p><strong>                error: function(XmlHttpRequest, textStatus, errorThrown){</strong>
</p>
<p><strong>					layer.msg(&#8216;error!&#8217;,{icon:1,time:1000});</strong>
</p>
<p><strong>				}</strong>
</p>
<p><strong>			});</strong>
</p>
<p><strong>		}</strong>
</p>
<p><strong>	});</strong>
</p>
<p>
  });
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;!&#8211;/请在上方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<ul>
<li>
    步骤2：更改路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1217" height="267" src="/wp-content/uploads/2018/05/word-image-5468.png" class="wp-image-6010" srcset="/wp-content/uploads/2018/05/word-image-5468.png 1217w, /wp-content/uploads/2018/05/word-image-5468-300x66.png 300w, /wp-content/uploads/2018/05/word-image-5468-768x168.png 768w, /wp-content/uploads/2018/05/word-image-5468-1024x225.png 1024w" sizes="(max-width: 1217px) 100vw, 1217px" /></p>
<ul>
<li>
    步骤3：控制器方法接受处理数据
  </li>
</ul>
<p><strong>控制器</strong>
</p>
<p><img loading="lazy" decoding="async" width="1136" height="649" src="/wp-content/uploads/2018/05/word-image-5469.png" class="wp-image-6011" srcset="/wp-content/uploads/2018/05/word-image-5469.png 1136w, /wp-content/uploads/2018/05/word-image-5469-300x171.png 300w, /wp-content/uploads/2018/05/word-image-5469-768x439.png 768w, /wp-content/uploads/2018/05/word-image-5469-1024x585.png 1024w" sizes="(max-width: 1136px) 100vw, 1136px" /></p>
<p>
  //分配权限
</p>
<p>
  public function assignAuth(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;auth&#8217;]);
</p>
<p>
          //3.更新数据
</p>
<p>
          $rs = Role::updateAuth($request-&gt;input(&#8216;role_id&#8217;), $postData[&#8216;auth&#8217;]);
</p>
<p>
          //4.判断状态
</p>
<p>
          echo $rs ? 1 : 0;
</p>
<p>
      } else {
</p>
<p>
          //【显示所有权限节点功能】
</p>
<p>
          //1.查询所有顶级权限
</p>
<p>
          $topAuths = Auth::where(&#8216;pid&#8217;, 0)-&gt;get();
</p>
<p>
          //2.查询所有子级权限
</p>
<p>
          $sonAuths = Auth::where(&#8216;pid&#8217;, &#8216;&lt;&gt;&#8217;, 0)-&gt;get();
</p>
<p>
          //【根据角色ID获取角色的所有权限】
</p>
<p>
          $role = Role::where(&#8216;id&#8217;, $request-&gt;input(&#8216;role_id&#8217;))-&gt;first();
</p>
<p>
          $authArr = !empty($role-&gt;auth_ids) ? explode(&#8216;,&#8217;, $role-&gt;auth_ids) : [];
</p>
<p>
          //4.加载视图
</p>
<p>
          return view(&#8216;admin.role.assignAuth&#8217;, compact(&#8216;topAuths&#8217;, &#8216;sonAuths&#8217;, &#8216;authArr&#8217;));
</p>
<p>
      }
</p>
<p>
  }
</p>
<p><strong>模型</strong>
</p>
<p><img loading="lazy" decoding="async" width="1086" height="537" src="/wp-content/uploads/2018/05/word-image-5470.png" class="wp-image-6012" srcset="/wp-content/uploads/2018/05/word-image-5470.png 1086w, /wp-content/uploads/2018/05/word-image-5470-300x148.png 300w, /wp-content/uploads/2018/05/word-image-5470-768x380.png 768w, /wp-content/uploads/2018/05/word-image-5470-1024x506.png 1024w" sizes="(max-width: 1086px) 100vw, 1086px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Model;
</p>
<p>
  use Illuminate\Database\Eloquent\Model;
</p>
<p>
  class Role extends Model
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * 声明表名（注：laravel会自动加s所以自己声明覆盖）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $table = &#8216;role&#8217;;
</p>
<p>
      /**
</p>
<p>
       * Unix时间戳形式填充创建于和更新于（注：模型默认托管时间但是是datetime类型）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $dateFormat = &#8216;U&#8217;;
</p>
<p>
      /**
</p>
<p>
       * 声明可批量设置的属性（注：当使用create静态方式时）
</p>
<p>
       * @var array
</p>
<p>
       */
</p>
<p>
      protected $fillable = [&#8216;role_name&#8217;, &#8216;auth_ids&#8217;, &#8216;auth_ac&#8217;];
</p>
<p>
     <strong> /**</strong>
</p>
<p><strong>     * 更改角色权限</strong>
</p>
<p><strong>     * @param  int   $role_id  角色ID</strong>
</p>
<p><strong>     * @param  array $authArr  权限数组</strong>
</p>
<p><strong>     * @return bool</strong>
</p>
<p><strong>     */</strong>
</p>
<p><strong>    public static function updateAuth($role_id, $authArr)</strong>
</p>
<p><strong>    {</strong>
</p>
<p><strong>        //1.将选中的权限划分为字符串，逗号分隔</strong>
</p>
<p><strong>        $data[&#8216;auth_ids&#8217;] = implode(&#8216;,&#8217;, $authArr);</strong>
</p>
<p><strong>        //2.根据权限ID获取对应控制器方法</strong>
</p>
<p><strong>        $auths = Auth::select(&#8216;controller&#8217;, &#8216;action&#8217;)-&gt;whereIn(&#8216;id&#8217;, $authArr)-&gt;get();</strong>
</p>
<p><strong>        foreach ($auths as $auth) {</strong>
</p>
<p><strong>            $temp[] = $auth-&gt;controller .&#8217;@&#8217;.$auth-&gt;action;</strong>
</p>
<p><strong>        }</strong>
</p>
<p><strong>        //3.划分控制器和方法</strong>
</p>
<p><strong>        $data[&#8216;auth_ac&#8217;] = implode(&#8216;,&#8217;, $temp);</strong>
</p>
<p><strong>        //4.更新数据库</strong>
</p>
<p><strong>        return self::where(&#8216;id&#8217;, $role_id)-&gt;update($data);</strong>
</p>
<p><strong>    }</strong>
</p>
<p>
  }
</p>
<h1>管理员登录系统显示所属角色</h1>
<h2>︴效果（后台首页右上角）</h2>
<p><img loading="lazy" decoding="async" width="819" height="176" src="/wp-content/uploads/2018/05/word-image-5471.png" class="wp-image-6013" srcset="/wp-content/uploads/2018/05/word-image-5471.png 819w, /wp-content/uploads/2018/05/word-image-5471-300x64.png 300w, /wp-content/uploads/2018/05/word-image-5471-768x165.png 768w" sizes="(max-width: 819px) 100vw, 819px" /></p>
<h2>︴步骤</h2>
<ul>
<li>
    步骤1：admin模型关联角色表
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="941" height="497" src="/wp-content/uploads/2018/05/word-image-5472.png" class="wp-image-6014" srcset="/wp-content/uploads/2018/05/word-image-5472.png 941w, /wp-content/uploads/2018/05/word-image-5472-300x158.png 300w, /wp-content/uploads/2018/05/word-image-5472-768x406.png 768w" sizes="(max-width: 941px) 100vw, 941px" /></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>
       * 关联角色表（1:1）
</p>
<p>
       * @return \Illuminate\Database\Eloquent\Relations\HasOne
</p>
<p>
       */
</p>
<p>
      public function role()
</p>
<p>
      {
</p>
<p>
          return $this -&gt; hasOne(&#8216;App\Http\Model\Role&#8217;, &#8216;id&#8217;, &#8216;role_id&#8217;);
</p>
<p>
      }
</p>
<p>
  }
</p>
<ul>
<li>
    步骤2：视图修改显示角色
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1205" height="267" src="/wp-content/uploads/2018/05/word-image-5473.png" class="wp-image-6015" srcset="/wp-content/uploads/2018/05/word-image-5473.png 1205w, /wp-content/uploads/2018/05/word-image-5473-300x66.png 300w, /wp-content/uploads/2018/05/word-image-5473-768x170.png 768w, /wp-content/uploads/2018/05/word-image-5473-1024x227.png 1024w" sizes="(max-width: 1205px) 100vw, 1205px" /></p>
<p>
  {{ Auth::guard(&#8216;admin&#8217;)-&gt;user()-&gt;role()-&gt;first()-&gt;role_name }}
</p>
<p>
  脚下留心：role()对应模型中的方法名
</p>
<h1><a id="post-5944-_Toc487817428"></a>使用中间件鉴权</h1>
<h2>︴效果</h2>
<p><img loading="lazy" decoding="async" width="881" height="229" src="/wp-content/uploads/2018/05/word-image-5474.png" class="wp-image-6016" srcset="/wp-content/uploads/2018/05/word-image-5474.png 881w, /wp-content/uploads/2018/05/word-image-5474-300x78.png 300w, /wp-content/uploads/2018/05/word-image-5474-768x200.png 768w" sizes="(max-width: 881px) 100vw, 881px" /></p>
<h2>1、说明</h2>
<p>
  在ThinkPHP中使用RBAC鉴权的时候会创建一个基础/中间控制器的控制器，然后在其中的构造/初始化方法中来进行权限判断。
</p>
<p>
  在laravel中可以通过中间件的方法来实现rbac鉴权，其原理和ThinkPHP中的原理是一样的，使用中间件可以省去更改控制器的继承关系。
</p>
<h2>2、使用</h2>
<ul>
<li>
    步骤1：创建中间件并书写代码
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1262" height="600" src="/wp-content/uploads/2018/05/word-image-5475.png" class="wp-image-6017" srcset="/wp-content/uploads/2018/05/word-image-5475.png 1262w, /wp-content/uploads/2018/05/word-image-5475-300x143.png 300w, /wp-content/uploads/2018/05/word-image-5475-768x365.png 768w, /wp-content/uploads/2018/05/word-image-5475-1024x487.png 1024w" sizes="(max-width: 1262px) 100vw, 1262px" /></p>
<p>
  public function handle($request, Closure $next)
</p>
<p>
  {
</p>
<p>
      //1.获取当前的路由（包含控制器和方法的地址）
</p>
<p>
      $route = strtolower(Route::currentRouteAction()); //&#8221;App\Http\Controllers\Admin\IndexController@index&#8221;
</p>
<p>
      //2.获取当前角色权限
</p>
<p>
      $ac = Auth::guard(&#8216;admin&#8217;)-&gt;user()-&gt;role()-&gt;first()-&gt;auth_ac;
</p>
<p>
      //3.组装权限：默认全部用户都有后台首页路由的权限
</p>
<p>
      $ac = strtolower($ac . &#8216;,IndexController@index,IndexController@welcome&#8217;);
</p>
<p>
      //4.比较范围是否存在包含关系,可以使用strpos进行比较，也可以转化成数组进行in_array
</p>
<p>
      $array = explode(&#8216;\\&#8217;,$route);
</p>
<p>
      //dd(prev($array));
</p>
<p>
      if(strpos($ac,end($array)) === false){    //end是将数组的指针移向最后一个元素并且返回其值
</p>
<p>
          //echo &#8216;您没有访问权限&#8217;;die;
</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>
<ul>
<li>
    步骤2：激活中间件
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1035" height="402" src="/wp-content/uploads/2018/05/word-image-5476.png" class="wp-image-6018" srcset="/wp-content/uploads/2018/05/word-image-5476.png 1035w, /wp-content/uploads/2018/05/word-image-5476-300x117.png 300w, /wp-content/uploads/2018/05/word-image-5476-768x298.png 768w, /wp-content/uploads/2018/05/word-image-5476-1024x398.png 1024w" sizes="(max-width: 1035px) 100vw, 1035px" /></p>
<ul>
<li>
    步骤3：使用
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1217" height="606" src="/wp-content/uploads/2018/05/word-image-5477.png" class="wp-image-6019" srcset="/wp-content/uploads/2018/05/word-image-5477.png 1217w, /wp-content/uploads/2018/05/word-image-5477-300x149.png 300w, /wp-content/uploads/2018/05/word-image-5477-768x382.png 768w, /wp-content/uploads/2018/05/word-image-5477-1024x510.png 1024w" sizes="(max-width: 1217px) 100vw, 1217px" /></p>
<h1><a id="post-5944-_Toc487817429"></a>︴作业</h1>
<p>
  1）实现今天的代码；
</p>
<p>
  2）完善RBAC三部分管理模块的后续CURD操作；</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/5944.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/5892.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/5892.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 15:47:15 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Laravel在线教育平台]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[专业分类管理]]></category>
		<category><![CDATA[课时管理]]></category>
		<category><![CDATA[课程管理]]></category>
		<guid isPermaLink="false">/?p=5892</guid>

					<description><![CDATA[Laravel框架实战-在线教育平台（3） ︴准备 1、说明 专业分类数据表 前段 后端 web开发、编程、开 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1><a id="post-5892-_Toc487817413"></a>Laravel框架实战-在线教育平台（3）<a id="post-5892-_Toc487817414"></a></h1>
<h1>︴准备</h1>
<h2>1、说明  </h2>
<p>
  专业分类数据表
</p>
<p>
  前段 后端  web开发、编程、开发、数据库、大数据
</p>
<p>
  专业数据表（学科表）
</p>
<p>
  PHP  Java   C++  Python    全栈   UI专业
</p>
<p>
  课程数据表
</p>
<p>
  如PHP专业下面有PHP核心编程，Javascript，jquery，ajax，商城项目,TP框架课程，等等
</p>
<p>
  课时数据表
</p>
<p>
  如PHP专业下面的PHP核心编程课程下面有，php的函数，PHP的数组，php的文件上传。
</p>
<p>
  它们的关系如下图：
</p>
<p><img loading="lazy" decoding="async" width="862" height="391" src="/wp-content/uploads/2018/05/word-image-5353.png" class="wp-image-5893" srcset="/wp-content/uploads/2018/05/word-image-5353.png 862w, /wp-content/uploads/2018/05/word-image-5353-300x136.png 300w, /wp-content/uploads/2018/05/word-image-5353-768x348.png 768w" sizes="(max-width: 862px) 100vw, 862px" /></p>
<p>
  点播: 点击课时直接播放视频
</p>
<p>
  直播：对面有人和你试试互动看到的画面
</p>
<h2>数据字典</h2>
<h3>后台专业分类表（protype）</h3>
<table>
<tr>
<td>
<p><strong>表名</strong>
</p>
</td>
<td colspan="6">
<p>
  protype
</p>
</td>
</tr>
<tr>
<td>
<p><strong>序号</strong>
</p>
</td>
<td>
<p><strong>字段</strong>
</p>
</td>
<td>
<p><strong>类型</strong>
</p>
</td>
<td>
<p><strong>说明</strong>
</p>
</td>
<td>
<p><strong>空</strong>
</p>
</td>
<td>
<p><strong>默认值</strong>
</p>
</td>
<td>
<p><strong>主键</strong>
</p>
</td>
</tr>
<tr>
<td>
<p>
  1
</p>
</td>
<td>
<p>
  id
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  自增主键
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  N/A
</p>
</td>
<td>
<p>
  是
</p>
</td>
</tr>
<tr>
<td>
<p>
  2
</p>
</td>
<td>
<p>
  protype_name
</p>
</td>
<td>
<p>
  varchar(20)
</p>
</td>
<td>
<p>
  分类名
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  3
</p>
</td>
<td>
<p>
  sort
</p>
</td>
<td>
<p>
  tinyint
</p>
</td>
<td>
<p>
  排序编号
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
<tr>
<td>
<p>
  4
</p>
</td>
<td>
<p>
  state
</p>
</td>
<td>
<p>
  tinyint
</p>
</td>
<td>
<p>
  状态：0-禁用，1-启用
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td>
<p>
  启用
</p>
</td>
<td></td>
</tr>
<tr>
<td>
<p>
  5
</p>
</td>
<td>
<p>
  created_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  记录创建时间
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  6
</p>
</td>
<td>
<p>
  updated_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  记录更新时间
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td></td>
<td></td>
</tr>
</table>
<h3>后台专业表（profession）</h3>
<table>
<tr>
<td>
<p><strong>表名</strong>
</p>
</td>
<td colspan="6">
<p>
  profession
</p>
</td>
</tr>
<tr>
<td>
<p><strong>序号</strong>
</p>
</td>
<td>
<p><strong>字段</strong>
</p>
</td>
<td>
<p><strong>类型</strong>
</p>
</td>
<td>
<p><strong>说明</strong>
</p>
</td>
<td>
<p><strong>空</strong>
</p>
</td>
<td>
<p><strong>默认值</strong>
</p>
</td>
<td>
<p><strong>主键</strong>
</p>
</td>
</tr>
<tr>
<td>
<p>
  1
</p>
</td>
<td>
<p>
  id
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  自增主键
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  N/A
</p>
</td>
<td>
<p>
  是
</p>
</td>
</tr>
<tr>
<td>
<p>
  2
</p>
</td>
<td>
<p>
  protype_id
</p>
</td>
<td>
<p>
  tinyint
</p>
</td>
<td>
<p>
  专业分类表的主键
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  3
</p>
</td>
<td>
<p>
  profession_name
</p>
</td>
<td>
<p>
  varchar(32)
</p>
</td>
<td>
<p>
  专业名称
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  4
</p>
</td>
<td>
<p>
  profession_desc
</p>
</td>
<td>
<p>
  varchar(255)
</p>
</td>
<td>
<p>
  专业描述
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  5
</p>
</td>
<td>
<p>
  img
</p>
</td>
<td>
<p>
  varchar(255)
</p>
</td>
<td>
<p>
  在列表页面展示的图片地址
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  6
</p>
</td>
<td>
<p>
  updated_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  创建于
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
<tr>
<td>
<p>
  7
</p>
</td>
<td>
<p>
  created_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  更新于
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
</table>
<h3>后台课程表（course）</h3>
<table>
<tr>
<td>
<p><strong>表名</strong>
</p>
</td>
<td colspan="6">
<p>
  course
</p>
</td>
</tr>
<tr>
<td>
<p><strong>序号</strong>
</p>
</td>
<td>
<p><strong>字段</strong>
</p>
</td>
<td>
<p><strong>类型</strong>
</p>
</td>
<td>
<p><strong>说明</strong>
</p>
</td>
<td>
<p><strong>空</strong>
</p>
</td>
<td>
<p><strong>默认值</strong>
</p>
</td>
<td>
<p><strong>主键</strong>
</p>
</td>
</tr>
<tr>
<td>
<p>
  1
</p>
</td>
<td>
<p>
  id
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  自增主键
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  N/A
</p>
</td>
<td>
<p>
  是
</p>
</td>
</tr>
<tr>
<td>
<p>
  2
</p>
</td>
<td>
<p>
  profession_id
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  关联专业id
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  3
</p>
</td>
<td>
<p>
  course_name
</p>
</td>
<td>
<p>
  varchar(30)
</p>
</td>
<td>
<p>
  课程名称
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  4
</p>
</td>
<td>
<p>
  course_price
</p>
</td>
<td>
<p>
  decimal(9,2)
</p>
</td>
<td>
<p>
  课程的价格
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  5
</p>
</td>
<td>
<p>
  img
</p>
</td>
<td>
<p>
  varchar(120)
</p>
</td>
<td>
<p>
  封面地址
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  6
</p>
</td>
<td>
<p>
  course_desc
</p>
</td>
<td>
<p>
  varchar(255)
</p>
</td>
<td>
<p>
  课程描述
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  7
</p>
</td>
<td>
<p>
  created_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  记录创建时间
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
<tr>
<td>
<p>
  8
</p>
</td>
<td>
<p>
  updated_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  记录更新时间
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
</table>
<h3>后台课时点播表（lession）</h3>
<table>
<tr>
<td>
<p><strong>表名</strong>
</p>
</td>
<td colspan="6">
<p>
  lession
</p>
</td>
</tr>
<tr>
<td>
<p><strong>序号</strong>
</p>
</td>
<td>
<p><strong>字段</strong>
</p>
</td>
<td>
<p><strong>类型</strong>
</p>
</td>
<td>
<p><strong>说明</strong>
</p>
</td>
<td>
<p><strong>空</strong>
</p>
</td>
<td>
<p><strong>默认值</strong>
</p>
</td>
<td>
<p><strong>主键</strong>
</p>
</td>
</tr>
<tr>
<td>
<p>
  1
</p>
</td>
<td>
<p>
  id
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  自增主键
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  N/A
</p>
</td>
<td>
<p>
  是
</p>
</td>
</tr>
<tr>
<td>
<p>
  2
</p>
</td>
<td>
<p>
  course_id
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  所属的课程id，关联课程表
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  3
</p>
</td>
<td>
<p>
  img
</p>
</td>
<td>
<p>
  varchar(120)
</p>
</td>
<td>
<p>
  封面图
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  4
</p>
</td>
<td>
<p>
  lession_name
</p>
</td>
<td>
<p>
  varchar(50)
</p>
</td>
<td>
<p>
  点播记录名
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  5
</p>
</td>
<td>
<p>
  video_address
</p>
</td>
<td>
<p>
  varchar(255)
</p>
</td>
<td>
<p>
  点播视频的地址
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  6
</p>
</td>
<td>
<p>
  video_time
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  视频的长度，单位秒
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
<tr>
<td>
<p>
  7
</p>
</td>
<td>
<p>
  teacher_name
</p>
</td>
<td>
<p>
  varchar(32)
</p>
</td>
<td>
<p>
  讲师名称
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  8
</p>
</td>
<td>
<p>
  lesson_desc
</p>
</td>
<td>
<p>
  varchar(255)
</p>
</td>
<td>
<p>
  课时描述
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  9
</p>
</td>
<td>
<p>
  state
</p>
</td>
<td>
<p>
  tinyint
</p>
</td>
<td>
<p>
  状态：0-禁用，1-启用
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  启用
</p>
</td>
<td></td>
</tr>
<tr>
<td>
<p>
  10
</p>
</td>
<td>
<p>
  created_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  记录创建时间
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  11
</p>
</td>
<td>
<p>
  updated_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  记录更新时间
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td></td>
<td></td>
</tr>
</table>
<h2>3、迁移</h2>
<p>
  步骤1：创建迁移文件 并复制下属代码
</p>
<p><img loading="lazy" decoding="async" width="1294" height="593" src="/wp-content/uploads/2018/05/word-image-5354.png" class="wp-image-5894" srcset="/wp-content/uploads/2018/05/word-image-5354.png 1294w, /wp-content/uploads/2018/05/word-image-5354-300x137.png 300w, /wp-content/uploads/2018/05/word-image-5354-768x352.png 768w, /wp-content/uploads/2018/05/word-image-5354-1024x469.png 1024w" sizes="(max-width: 1294px) 100vw, 1294px" /></p>
<p>
  步骤2：运行
</p>
<p><img loading="lazy" decoding="async" width="1112" height="467" src="/wp-content/uploads/2018/05/word-image-5355.png" class="wp-image-5895" srcset="/wp-content/uploads/2018/05/word-image-5355.png 1112w, /wp-content/uploads/2018/05/word-image-5355-300x126.png 300w, /wp-content/uploads/2018/05/word-image-5355-768x323.png 768w, /wp-content/uploads/2018/05/word-image-5355-1024x430.png 1024w" sizes="(max-width: 1112px) 100vw, 1112px" /></p>
<p>
  /**
</p>
<p>
   * Run the migrations.
</p>
<p>
   *
</p>
<p>
   * @return void
</p>
<p>
   */
</p>
<p>
  public function up()
</p>
<p>
  {
</p>
<p>
  	//创建专业分类表
</p>
<p>
  	Schema::create(&#8216;protype&#8217;,function($table){
</p>
<p>
  		$table-&gt;increments(&#8216;id&#8217;);
</p>
<p>
  		$table-&gt;string(&#8216;protype_name&#8217;,20)-&gt;comment(&#8216;分类名&#8217;);
</p>
<p>
  		$table-&gt;tinyInteger(&#8216;sort&#8217;)-&gt;default(0);
</p>
<p>
  		$table-&gt;unsignedTinyInteger(&#8216;state&#8217;)-&gt;default(1)-&gt;comment(&#8216;状态:0停用1开启&#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>
  	});
</p>
<p>
  	//创建专业表
</p>
<p>
  	Schema::create(&#8216;profession&#8217;, function (Blueprint $table) {
</p>
<p>
  		$table-&gt;increments(&#8216;id&#8217;);
</p>
<p>
  		$table-&gt;string(&#8216;profession_name&#8217;,32)-&gt;comment(&#8216;专业名称&#8217;);
</p>
<p>
  		$table-&gt;unsignedTinyInteger(&#8216;protype_id&#8217;)-&gt;comment(&#8216;专业分类表的主键&#8217;);
</p>
<p>
  		$table-&gt;string(&#8216;img&#8217;,120)-&gt;default(&#8221;)-&gt;comment(&#8216;封面图&#8217;);
</p>
<p>
  		$table-&gt;string(&#8216;profession_desc&#8217;)-&gt;default(&#8221;)-&gt;comment(&#8216;描述&#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>
  	});
</p>
<p>
  	//创建课程表
</p>
<p>
  	Schema::create(&#8216;course&#8217;, function (Blueprint $table) {
</p>
<p>
  		$table-&gt;increments(&#8216;id&#8217;);
</p>
<p>
  		$table-&gt;string(&#8216;course_name&#8217;,32)-&gt;comment(&#8216;课程名称&#8217;);
</p>
<p>
  		$table-&gt;integer(&#8216;profession_id&#8217;)-&gt;comment(&#8216;课程所属专业的id&#8217;);
</p>
<p>
  		$table-&gt;decimal(&#8216;course_price&#8217;,9,2)-&gt;default(0)-&gt;comment(&#8216;课程的价格&#8217;);
</p>
<p>
  		$table-&gt;string(&#8216;img&#8217;,120)-&gt;default(&#8221;)-&gt;comment(&#8216;封面图&#8217;);
</p>
<p>
  		$table-&gt;string(&#8216;course_desc&#8217;)-&gt;default(&#8221;)-&gt;comment(&#8216;课程描述&#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>
  	});
</p>
<p>
  	//创建课时表
</p>
<p>
  	Schema::create(&#8216;lesson&#8217;, function (Blueprint $table) {
</p>
<p>
  		$table-&gt;increments(&#8216;id&#8217;);
</p>
<p>
  $table-&gt;integer(&#8216;course_id&#8217;)-&gt;comment(&#8216;课时所属课程的id&#8217;);
</p>
<p>
  $table-&gt;string(&#8216;img&#8217;,120)-&gt;default(&#8221;)-&gt;comment(&#8216;封面图&#8217;);
</p>
<p>
  $table-&gt;string(&#8216;lesson_name&#8217;,32)-&gt;comment(&#8216;课时名称&#8217;);
</p>
<p>
  $table-&gt;string(&#8216;video_address&#8217;,120)-&gt;default(&#8221;)-&gt;comment(&#8216;视频的地址&#8217;);
</p>
<p>
  $table-&gt;integer(&#8216;video_time&#8217;)-&gt;default(10)-&gt;comment(&#8216;课时的时长&#8217;);
</p>
<p>
  $table-&gt;string(&#8216;teacher_name&#8217;,32)-&gt;default(&#8221;)-&gt;comment(&#8216;讲师名称&#8217;);
</p>
<p>
  $table-&gt;string(&#8216;lesson_desc&#8217;)-&gt;default(&#8221;)-&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;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>
  	});
</p>
<p>
  }
</p>
<p>
  /**
</p>
<p>
   * Reverse the migrations.
</p>
<p>
   *
</p>
<p>
   * @return void
</p>
<p>
   */
</p>
<p>
  public function down()
</p>
<p>
  {
</p>
<p>
      Schema::drop(&#8216;protype&#8217;);
</p>
<p>
  	Schema::drop(&#8216;profession&#8217;);
</p>
<p>
  	Schema::drop(&#8216;course&#8217;);
</p>
<p>
  	Schema::drop(&#8216;lesson&#8217;);
</p>
<p>
  }
</p>
<h2>4、填充</h2>
<h3>1）专业分类表（php artisan make:seeder ProtypeTableSeeder）</h3>
<p>
  &lt;?php
</p>
<p>
  use Illuminate\Database\Seeder;
</p>
<p>
  class ProtypeTableSeeder extends Seeder
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * Run the database seeds.
</p>
<p>
       *
</p>
<p>
       * @return void
</p>
<p>
       */
</p>
<p>
      public function run()
</p>
<p>
      {
</p>
<p>
          DB::table(&#8216;protype&#8217;)-&gt;insert([
</p>
<p>
                  [
</p>
<p>
                      &#8216;protype_name&#8217;=&gt;&#8217;后端&#8217;
</p>
<p>
                  ],
</p>
<p>
                  [
</p>
<p>
                      &#8216;protype_name&#8217;=&gt;&#8217;web开发&#8217;
</p>
<p>
                  ],
</p>
<p>
                  [
</p>
<p>
                      &#8216;protype_name&#8217;=&gt;&#8217;运维&#8217;
</p>
<p>
                  ],
</p>
<p>
                  [
</p>
<p>
                      &#8216;protype_name&#8217;=&gt;&#8217;数据库&#8217;
</p>
<p>
                  ],
</p>
<p>
                  [
</p>
<p>
                      &#8216;protype_name&#8217;=&gt;&#8217;大数据&#8217;
</p>
<p>
                  ]
</p>
<p>
          ]);
</p>
<p>
      }
</p>
<p>
  }
</p>
<h3>2）专业表（php artisan make:seeder ProfessionTableSeeder ）</h3>
<p>
  &lt;?php
</p>
<p>
  use Illuminate\Database\Seeder;
</p>
<p>
  class ProfessionTableSeeder extends Seeder
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * Run the database seeds.
</p>
<p>
       *
</p>
<p>
       * @return void
</p>
<p>
       */
</p>
<p>
      public function run()
</p>
<p>
      {
</p>
<p>
          DB::table(&#8216;profession&#8217;)-&gt;insert([
</p>
<p>
          		[
</p>
<p>
                      &#8216;protype_id&#8217;=&gt; 1,
</p>
<p>
                      &#8216;profession_name&#8217;=&gt;&#8217;PHP学科&#8217;,
</p>
<p>
          			&#8216;profession_desc&#8217;=&gt;&#8217;是世界上最好的语言&#8217;
</p>
<p>
          		],
</p>
<p>
          		[
</p>
<p>
                      &#8216;protype_id&#8217;=&gt; 2,
</p>
<p>
          			&#8216;profession_name&#8217;=&gt;&#8217;HTML5&amp;全栈&#8217;,
</p>
<p>
          			&#8216;profession_desc&#8217;=&gt;&#8217;是世界上最好的语言&#8217;
</p>
<p>
          		],
</p>
<p>
          		[
</p>
<p>
                      &#8216;protype_id&#8217;=&gt; 3,
</p>
<p>
          			&#8216;profession_name&#8217;=&gt;&#8217;Python全栈&#8217;,
</p>
<p>
          			&#8216;profession_desc&#8217;=&gt;&#8217;是世界上最好的语言&#8217;
</p>
<p>
          		]
</p>
<p>
          ]);
</p>
<p>
      }
</p>
<p>
  }
</p>
<h3>3）课程表（php artisan make:seeder CourseTableSeeder ）</h3>
<p>
  &lt;?php
</p>
<p>
  use Illuminate\Database\Seeder;
</p>
<p>
  class CourseTableSeeder extends Seeder
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * Run the database seeds.
</p>
<p>
       *
</p>
<p>
       * @return void
</p>
<p>
       */
</p>
<p>
      public function run()
</p>
<p>
      {
</p>
<p>
         	DB::table(&#8216;course&#8217;)-&gt;insert([
</p>
<p>
         		[
</p>
<p>
         			&#8216;course_name&#8217;=&gt;&#8217;PHP核心编程&#8217;,
</p>
<p>
         			&#8216;profession_id&#8217;=&gt;1,
</p>
<p>
         			&#8216;course_price&#8217;=&gt;12.34,
</p>
<p>
         			&#8216;course_desc&#8217;=&gt;&#8217;非常经典的课程&#8217;
</p>
<p>
         		],
</p>
<p>
         		[
</p>
<p>
         			&#8216;course_name&#8217;=&gt;&#8217;LInux环境安装&#8217;,
</p>
<p>
         			&#8216;profession_id&#8217;=&gt;2,
</p>
<p>
         			&#8216;course_price&#8217;=&gt;4512.34,
</p>
<p>
         			&#8216;course_desc&#8217;=&gt;&#8217;非常经典的课程&#8217;
</p>
<p>
         		],
</p>
<p>
         		[
</p>
<p>
         			&#8216;course_name&#8217;=&gt;&#8217;PHP文件上传&#8217;,
</p>
<p>
         			&#8216;profession_id&#8217;=&gt;3,
</p>
<p>
         			&#8216;course_price&#8217;=&gt;6712.34,
</p>
<p>
         			&#8216;course_desc&#8217;=&gt;&#8217;非常经典的课程&#8217;
</p>
<p>
         		],
</p>
<p>
         	]);
</p>
<p>
      }
</p>
<p>
  }
</p>
<h3>4）课时点播表（php artisan make:seeder LessonTableSeeder ）</h3>
<p>
  &lt;?php
</p>
<p>
  use Illuminate\Database\Seeder;
</p>
<p>
  class LessonTableSeeder extends Seeder
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * Run the database seeds.
</p>
<p>
       *
</p>
<p>
       * @return void
</p>
<p>
       */
</p>
<p>
      public function run()
</p>
<p>
      {
</p>
<p>
          //填充lesson表里面的数据
</p>
<p>
          DB::table(&#8216;lesson&#8217;)-&gt;insert([
</p>
<p>
          	[
</p>
<p>
          		&#8216;lesson_name&#8217;=&gt;&#8217;PHP文件上传&#8217;,
</p>
<p>
          		&#8216;course_id&#8217;=&gt;1,
</p>
<p>
          		&#8216;video_time&#8217;=&gt;20,
</p>
<p>
          		&#8216;teacher_name&#8217;=&gt;&#8217;李白&#8217;,
</p>
<p>
          		&#8216;lesson_desc&#8217;=&gt;&#8217;非常经典的课程&#8217;
</p>
<p>
          	],
</p>
<p>
          	[
</p>
<p>
          		&#8216;lesson_name&#8217;=&gt;&#8217;PHP数组&#8217;,
</p>
<p>
          		&#8216;course_id&#8217;=&gt;2,
</p>
<p>
          		&#8216;video_time&#8217;=&gt;30,
</p>
<p>
          		&#8216;teacher_name&#8217;=&gt;&#8217;刘备&#8217;,
</p>
<p>
          		&#8216;lesson_desc&#8217;=&gt;&#8217;非常经典的课程&#8217;
</p>
<p>
          	],
</p>
<p>
          	[
</p>
<p>
          		&#8216;lesson_name&#8217;=&gt;&#8217;ajax的前生今世&#8217;,
</p>
<p>
          		&#8216;course_id&#8217;=&gt;1,
</p>
<p>
          		&#8216;video_time&#8217;=&gt;10,
</p>
<p>
          		&#8216;teacher_name&#8217;=&gt;&#8217;曹操&#8217;,
</p>
<p>
          		&#8216;lesson_desc&#8217;=&gt;&#8217;非常经典的课程&#8217;
</p>
<p>
          	],
</p>
<p>
          	[
</p>
<p>
          		&#8216;lesson_name&#8217;=&gt;&#8217;linux的环境安装&#8217;,
</p>
<p>
          		&#8216;course_id&#8217;=&gt;1,
</p>
<p>
          		&#8216;video_time&#8217;=&gt;15,
</p>
<p>
          		&#8216;teacher_name&#8217;=&gt;&#8217;李逵&#8217;,
</p>
<p>
          		&#8216;lesson_desc&#8217;=&gt;&#8217;非常经典的课程&#8217;
</p>
<p>
          	],
</p>
<p>
          ]);
</p>
<p>
      }
</p>
<p>
  }
</p>
<h3>︴操作步骤</h3>
<ul>
<li>
    步骤1：创建上述4个填充器
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="862" height="430" src="/wp-content/uploads/2018/05/word-image-5356.png" class="wp-image-5896" srcset="/wp-content/uploads/2018/05/word-image-5356.png 862w, /wp-content/uploads/2018/05/word-image-5356-300x150.png 300w, /wp-content/uploads/2018/05/word-image-5356-768x383.png 768w" sizes="(max-width: 862px) 100vw, 862px" /></p>
<ul>
<li>
    步骤2：创建完毕后将上述代码赋值粘贴到对应填充器中即可
  </li>
<li>
    步骤3：执行所有填充器即可（插入数据）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="700" height="317" src="/wp-content/uploads/2018/05/word-image-5357.png" class="wp-image-5897" srcset="/wp-content/uploads/2018/05/word-image-5357.png 700w, /wp-content/uploads/2018/05/word-image-5357-300x136.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<p>
  php artisan db:seed &#8211;class=ProtypeTableSeeder
</p>
<p>
  php artisan db:seed &#8211;class=ProfessionTableSeeder
</p>
<p>
  php artisan db:seed &#8211;class=CourseTableSeeder
</p>
<p>
  php artisan db:seed &#8211;class=LessonTableSeeder
</p>
<h2>5、创建模型</h2>
<h3>1）专业分类表</h3>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Model;
</p>
<p>
  use Illuminate\Database\Eloquent\Model;
</p>
<p>
  class Protype extends Model
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * 声明表名（注：laravel会自动加s所以自己声明覆盖）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $table = &#8216;protype&#8217;;
</p>
<p>
      /**
</p>
<p>
       * Unix时间戳形式填充创建于和更新于（注：模型默认托管时间但是是datetime类型）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $dateFormat = &#8216;U&#8217;;
</p>
<p>
      /**
</p>
<p>
       * 声明可批量设置的属性（注：当使用create静态方式时）
</p>
<p>
       * @var array
</p>
<p>
       */
</p>
<p>
      protected $fillable = [&#8216;protype_name&#8217;, &#8216;sort&#8217;, &#8216;state&#8217;];
</p>
<p>
  }
</p>
<h3>2）专业表</h3>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Model;
</p>
<p>
  use Illuminate\Database\Eloquent\Model;
</p>
<p>
  class Profession extends Model
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * 声明表名（注：laravel会自动加s所以自己声明覆盖）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $table = &#8216;profession&#8217;;
</p>
<p>
      /**
</p>
<p>
       * Unix时间戳形式填充创建于和更新于（注：模型默认托管时间但是是datetime类型）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $dateFormat = &#8216;U&#8217;;
</p>
<p>
      /**
</p>
<p>
       * 声明可批量设置的属性（注：当使用create静态方式时）
</p>
<p>
       * @var array
</p>
<p>
       */
</p>
<p>
      protected $fillable = [&#8216;profession_name&#8217;, &#8216;protype_id&#8217;, &#8216;img&#8217;, &#8216;profession_desc&#8217;];
</p>
<p>
  }
</p>
<h3>3）课程表</h3>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Model;
</p>
<p>
  use Illuminate\Database\Eloquent\Model;
</p>
<p>
  class Course extends Model
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * 声明表名（注：laravel会自动加s所以自己声明覆盖）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $table = &#8216;course&#8217;;
</p>
<p>
      /**
</p>
<p>
       * Unix时间戳形式填充创建于和更新于（注：模型默认托管时间但是是datetime类型）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $dateFormat = &#8216;U&#8217;;
</p>
<p>
      /**
</p>
<p>
       * 声明可批量设置的属性（注：当使用create静态方式时）
</p>
<p>
       * @var array
</p>
<p>
       */
</p>
<p>
      protected $fillable = [&#8216;course_name&#8217;, &#8216;profession_id&#8217;, &#8216;course_price&#8217;, &#8216;img&#8217;, &#8216;course_desc&#8217;];
</p>
<p>
  }
</p>
<h3>4）课时点播</h3>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Model;
</p>
<p>
  use Illuminate\Database\Eloquent\Model;
</p>
<p>
  class Lession extends Model
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * 声明表名（注：laravel会自动加s所以自己声明覆盖）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $table = &#8216;lession&#8217;;
</p>
<p>
      /**
</p>
<p>
       * Unix时间戳形式填充创建于和更新于（注：模型默认托管时间但是是datetime类型）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $dateFormat = &#8216;U&#8217;;
</p>
<p>
      /**
</p>
<p>
       * 声明可批量设置的属性（注：当使用create静态方式时）
</p>
<p>
       * @var array
</p>
<p>
       */
</p>
<p>
      protected $fillable = [
</p>
<p>
          &#8216;course_id&#8217;,
</p>
<p>
          &#8216;img&#8217;,
</p>
<p>
          &#8216;lesson_name&#8217;,
</p>
<p>
          &#8216;video_address&#8217;,
</p>
<p>
          &#8216;video_time&#8217;,
</p>
<p>
          &#8216;teacher_name&#8217;,
</p>
<p>
          &#8216;lesson_desc&#8217;,
</p>
<p>
          &#8216;state&#8217;
</p>
<p>
      ];
</p>
<p>
  }
</p>
<h1><a id="post-5892-_Toc487989197"></a>一、专业分类管理</h1>
<h2>︴效果</h2>
<p>
  列表
</p>
<p><img loading="lazy" decoding="async" width="1365" height="554" src="/wp-content/uploads/2018/05/word-image-5358.png" class="wp-image-5898" srcset="/wp-content/uploads/2018/05/word-image-5358.png 1365w, /wp-content/uploads/2018/05/word-image-5358-300x122.png 300w, /wp-content/uploads/2018/05/word-image-5358-768x312.png 768w, /wp-content/uploads/2018/05/word-image-5358-1024x416.png 1024w" sizes="(max-width: 1365px) 100vw, 1365px" /></p>
<h2>列表功能</h2>
<h3>1）显示列表（模板文件：admin-permission.html）</h3>
<ul>
<li>
    步骤1：定义路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="992" height="260" src="/wp-content/uploads/2018/05/word-image-5359.png" class="wp-image-5899" srcset="/wp-content/uploads/2018/05/word-image-5359.png 992w, /wp-content/uploads/2018/05/word-image-5359-300x79.png 300w, /wp-content/uploads/2018/05/word-image-5359-768x201.png 768w" sizes="(max-width: 992px) 100vw, 992px" /></p>
<ul>
<li>
    步骤2：创建控制器和方法，并调用视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="883" height="509" src="/wp-content/uploads/2018/05/word-image-5360.png" class="wp-image-5900" srcset="/wp-content/uploads/2018/05/word-image-5360.png 883w, /wp-content/uploads/2018/05/word-image-5360-300x173.png 300w, /wp-content/uploads/2018/05/word-image-5360-768x443.png 768w" sizes="(max-width: 883px) 100vw, 883px" /></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>
  class ProtypeController extends Controller
</p>
<p>
  {
</p>
<p>
      //列表
</p>
<p>
      public function index()
</p>
<p>
      {
</p>
<p>
          //2.加载视图
</p>
<p>
          return view(&#8216;admin.protype.index&#8217;);
</p>
<p>
      }
</p>
<p>
  }
</p>
<ul>
<li>
    步骤3：创建视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1322" height="589" src="/wp-content/uploads/2018/05/word-image-5361.png" class="wp-image-5901" srcset="/wp-content/uploads/2018/05/word-image-5361.png 1322w, /wp-content/uploads/2018/05/word-image-5361-300x134.png 300w, /wp-content/uploads/2018/05/word-image-5361-768x342.png 768w, /wp-content/uploads/2018/05/word-image-5361-1024x456.png 1024w" sizes="(max-width: 1322px) 100vw, 1322px" /></p>
<h3>2）数据处理</h3>
<ul>
<li>
    步骤1：修改路由（注：datatables客户端分页也得发送一步请求）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1131" height="292" src="/wp-content/uploads/2018/05/word-image-5362.png" class="wp-image-5902" srcset="/wp-content/uploads/2018/05/word-image-5362.png 1131w, /wp-content/uploads/2018/05/word-image-5362-300x77.png 300w, /wp-content/uploads/2018/05/word-image-5362-768x198.png 768w, /wp-content/uploads/2018/05/word-image-5362-1024x264.png 1024w" sizes="(max-width: 1131px) 100vw, 1131px" /></p>
<ul>
<li>
    步骤2：更改视图设置datatables
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1272" height="536" src="/wp-content/uploads/2018/05/word-image-5363.png" class="wp-image-5903" srcset="/wp-content/uploads/2018/05/word-image-5363.png 1272w, /wp-content/uploads/2018/05/word-image-5363-300x126.png 300w, /wp-content/uploads/2018/05/word-image-5363-768x324.png 768w, /wp-content/uploads/2018/05/word-image-5363-1024x431.png 1024w" sizes="(max-width: 1272px) 100vw, 1272px" /><br />
<img loading="lazy" decoding="async" width="1044" height="506" src="/wp-content/uploads/2018/05/word-image-5364.png" class="wp-image-5904" srcset="/wp-content/uploads/2018/05/word-image-5364.png 1044w, /wp-content/uploads/2018/05/word-image-5364-300x145.png 300w, /wp-content/uploads/2018/05/word-image-5364-768x372.png 768w, /wp-content/uploads/2018/05/word-image-5364-1024x496.png 1024w" sizes="(max-width: 1044px) 100vw, 1044px" /><br />
<img loading="lazy" decoding="async" width="1090" height="608" src="/wp-content/uploads/2018/05/word-image-5365.png" class="wp-image-5905" srcset="/wp-content/uploads/2018/05/word-image-5365.png 1090w, /wp-content/uploads/2018/05/word-image-5365-300x167.png 300w, /wp-content/uploads/2018/05/word-image-5365-768x428.png 768w, /wp-content/uploads/2018/05/word-image-5365-1024x571.png 1024w" sizes="(max-width: 1090px) 100vw, 1090px" /><br />
<img loading="lazy" decoding="async" width="716" height="164" src="/wp-content/uploads/2018/05/word-image-5366.png" class="wp-image-5906" srcset="/wp-content/uploads/2018/05/word-image-5366.png 716w, /wp-content/uploads/2018/05/word-image-5366-300x69.png 300w" sizes="(max-width: 716px) 100vw, 716px" /></p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;title&gt;专业分类管理&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;nav class=&#8221;breadcrumb&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe67f;&lt;/i&gt; 首页 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 管理员管理 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 专业分类管理 &lt;a class=&#8221;btn btn-success radius r&#8221; style=&#8221;line-height:1.6em;margin-top:3px&#8221; href=&#8221;javascript:location.replace(location.href);&#8221; title=&#8221;刷新&#8221; &gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe68f;&lt;/i&gt;&lt;/a&gt;&lt;/nav&gt;
</p>
<p>
  &lt;div class=&#8221;page-container&#8221;&gt;
</p>
<p>
  	&lt;div class=&#8221;text-c&#8221;&gt;
</p>
<p>
  		&lt;form class=&#8221;Huiform&#8221; method=&#8221;post&#8221; action=&#8221;&#8221; target=&#8221;_self&#8221;&gt;
</p>
<p>
  			&lt;input type=&#8221;text&#8221; class=&#8221;input-text&#8221; style=&#8221;width:250px&#8221; placeholder=&#8221;专业分类名称&#8221; id=&#8221;<strong>search_content</strong>&#8221; name=&#8221;&#8221;&gt;
</p>
<p>
  			&lt;button type=&#8221;button&#8221; class=&#8221;btn btn-success&#8221; id=&#8221;<strong>search</strong>&#8221; name=&#8221;&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe665;&lt;/i&gt; 搜专业分类节点&lt;/button&gt;
</p>
<p>
  		&lt;/form&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;cl pd-5 bg-1 bk-gray mt-20&#8243;&gt; &lt;span class=&#8221;l&#8221;&gt;&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;datadel()&#8221; class=&#8221;btn btn-danger radius&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt; 批量删除&lt;/a&gt; &lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_add(&#8216;添加专业分类节点&#8217;,&#8217;admin-permission-add.html&#8217;,&#8221;,&#8217;310&#8242;)&#8221; class=&#8221;btn btn-primary radius&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe600;&lt;/i&gt; 添加专业分类节点&lt;/a&gt;&lt;/span&gt; &lt;span class=&#8221;r&#8221;&gt;共有数据：&lt;strong&gt;54&lt;/strong&gt; 条&lt;/span&gt; &lt;/div&gt;
</p>
<p>
  	&lt;table class=&#8221;table table-border table-bordered table-bg&#8221;&gt;
</p>
<p>
  		&lt;thead&gt;
</p>
<p>
  			<strong>&lt;tr&gt;</strong>
</p>
<p><strong>				&lt;th scope=&#8221;col&#8221; colspan=&#8221;8&#8243;&gt;专业分类节点&lt;/th&gt;</strong>
</p>
<p><strong>			&lt;/tr&gt;</strong>
</p>
<p><strong>			&lt;tr class=&#8221;text-c&#8221;&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;25&#8243;&gt;&lt;input type=&#8221;checkbox&#8221; name=&#8221;&#8221; value=&#8221;&#8221;&gt;&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;40&#8243;&gt;ID&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;200&#8243;&gt;分类名称&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;排序&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;状态&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;创建于&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;更新于&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;100&#8243;&gt;操作&lt;/th&gt;</strong>
</p>
<p><strong>			&lt;/tr&gt;</strong>
</p>
<p>
  		&lt;/thead&gt;
</p>
<p>
  		&lt;tbody&gt;
</p>
<p>
  			<strong>{{&#8211;&lt;tr class=&#8221;text-c&#8221;&gt;&#8211;}}</strong>
</p>
<p><strong>				{{&#8211;&lt;td&gt;&lt;input type=&#8221;checkbox&#8221; value=&#8221;1&#8243; name=&#8221;&#8221;&gt;&lt;/td&gt;&#8211;}}</strong>
</p>
<p><strong>				{{&#8211;&lt;td&gt;1&lt;/td&gt;&#8211;}}</strong>
</p>
<p><strong>				{{&#8211;&lt;td&gt;栏目添加&lt;/td&gt;&#8211;}}</strong>
</p>
<p><strong>				{{&#8211;&lt;td&gt;&lt;/td&gt;&#8211;}}</strong>
</p>
<p><strong>				{{&#8211;&lt;td&gt;&lt;a title=&#8221;编辑&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_edit(&#8216;角色编辑&#8217;,&#8217;admin-permission-add.html&#8217;,&#8217;1&#8242;,&#8221;,&#8217;310&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6df;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;删除&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_del(this,&#8217;1&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt;&lt;/a&gt;&lt;/td&gt;&#8211;}}</strong>
</p>
<p>
  			&lt;/tr&gt;
</p>
<p>
  		&lt;/tbody&gt;
</p>
<p>
  	&lt;/table&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<p>
  &lt;!&#8211;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/datatables/1.10.0/jquery.dataTables.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p><strong>//客户端分页大DD  服务端分页小DD</strong>
</p>
<p><strong>var table  = $(&#8216;table&#8217;).DataTable({</strong>
</p>
<p><strong>	//开启服务端分页（注：开启后发送的HTTP请求会携带起始位置和每页显示条数等信息）</strong>
</p>
<p><strong>	//&#8221;serverSide&#8221;: true,</strong>
</p>
<p><strong>	ajax: {</strong>
</p>
<p><strong>		url: &#8220;{{ url(&#8216;admin/protype/index&#8217;) }}&#8221;,</strong>
</p>
<p><strong>		&#8220;type&#8221;: &#8220;post&#8221;,</strong>
</p>
<p><strong>		&#8216;headers&#8217;: { &#8216;X-CSRF-TOKEN&#8217; : &#8216;{{ csrf_token() }}&#8217; },</strong>
</p>
<p><strong>		&#8220;data&#8221;: function (data) {</strong>
</p>
<p><strong>		}</strong>
</p>
<p><strong>	},</strong>
</p>
<p><strong>	//columns</strong>
</p>
<p><strong>	//作用：设置服务端返回数据填充规则</strong>
</p>
<p><strong>	//语法：{&#8220;data&#8221;: &#8220;键&#8221;，&#8221;defaultContent&#8221;: &#8220;默认值&#8221;}</strong>
</p>
<p><strong>	&#8220;columns&#8221;: [</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;tmp1&#8221;,  defaultContent: &#8220;占位，复选框&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;id&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;protype_name&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;sort&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;state&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;created_at&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;updated_at&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;tmp2&#8221;, defaultContent: &#8220;占位，操作&#8221; },</strong>
</p>
<p><strong>	],</strong>
</p>
<p><strong>	//createdRow</strong>
</p>
<p><strong>	//作用：创建tr时回调</strong>
</p>
<p><strong>	//row:创建好的tr的dom对象</strong>
</p>
<p><strong>	//data:数据源，代表服务器端返回的每条记录的实体信息</strong>
</p>
<p><strong>	//dataIndex:数据源的索引号码</strong>
</p>
<p><strong>	&#8220;createdRow&#8221;: function(row, data, dataIndex) {</strong>
</p>
<p><strong>		//匹配每一行的第一列</strong>
</p>
<p><strong>		$(row).find(&#8220;td:first&#8221;).html(&#8220;&lt;input type=&#8217;checkbox&#8217; name=&#8217;choose[]&#8217; value='&#8221;+data.id+&#8221;&#8216; /&gt;&#8221;)</strong>
</p>
<p><strong>		//匹配每一行的第八列</strong>
</p>
<p><strong>		if (data.state == 1) {</strong>
</p>
<p><strong>			$(row).find(&#8220;td:eq(4)&#8221;).html(&#8216;&lt;span class=&#8221;label label-success radius&#8221;&gt;已启用&lt;/span&gt;&#8217;);</strong>
</p>
<p><strong>		} else {</strong>
</p>
<p><strong>			$(row).find(&#8220;td:eq(4)&#8221;).html(&#8216;&lt;span class=&#8221;label radius&#8221;&gt;已停用&lt;/span&gt;&#8217;);</strong>
</p>
<p><strong>		}</strong>
</p>
<p><strong>		//匹配每一行的最后一列</strong>
</p>
<p><strong>		var lastHtml = &#8216;&lt;a style=&#8221;text-decoration:none&#8221; onClick=&#8221;admin_start(this,10001)&#8221; href=&#8221;javascript:;&#8221; title=&#8221;启用&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe615;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;编辑&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_edit(\&#8217;管理员编辑\&#8217;,\&#8217;admin-add.html\&#8217;,2,800,500)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6df;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;删除&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_del(this,1)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt;&lt;/a&gt;&#8217;;</strong>
</p>
<p><strong>		$(row).find(&#8220;td:last&#8221;).html(lastHtml);</strong>
</p>
<p><strong>        //让每一行居中</strong>
</p>
<p><strong>        $(row).addClass(&#8216;text-c&#8217;);</strong>
</p>
<p><strong>	},</strong>
</p>
<p><strong>	// searching : false, 		 //禁用搜索</strong>
</p>
<p><strong>	bLengthChange: false,   //去掉每页显示多少条数据方法</strong>
</p>
<p><strong>    // iDisplayLength:2,	    //限制每页显示条数</strong>
</p>
<p><strong>});</strong>
</p>
<p><strong>//客户端搜索功能更</strong>
</p>
<p><strong>$(&#8216;#search&#8217;).click(function(){</strong>
</p>
<p><strong>    var search_content = $(&#8216;#search_content&#8217;).val();</strong>
</p>
<p><strong>    table.search(search_content).draw();</strong>
</p>
<p><strong>});</strong>
</p>
<p><strong>$(&#8216;#DataTables_Table_0_filter&#8217;).hide();</strong>
</p>
<p>
  /*
</p>
<p>
  	参数解释：
</p>
<p>
  	title	标题
</p>
<p>
  	url		请求的url
</p>
<p>
  	id		需要操作的数据id
</p>
<p>
  	w		弹出层宽度（缺省调默认值）
</p>
<p>
  	h		弹出层高度（缺省调默认值）
</p>
<p>
  */
</p>
<p>
  /*管理员-专业分类-添加*/
</p>
<p>
  function admin_permission_add(title,url,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-专业分类-编辑*/
</p>
<p>
  function admin_permission_edit(title,url,id,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-专业分类-删除*/
</p>
<p>
  function admin_permission_del(obj,id){
</p>
<p>
  	layer.confirm(&#8216;确认要删除吗？&#8217;,function(index){
</p>
<p>
  		$.ajax({
</p>
<p>
  			type: &#8216;POST&#8217;,
</p>
<p>
  			url: &#8221;,
</p>
<p>
  			dataType: &#8216;json&#8217;,
</p>
<p>
  			success: function(data){
</p>
<p>
  				$(obj).parents(&#8220;tr&#8221;).remove();
</p>
<p>
  				layer.msg(&#8216;已删除!&#8217;,{icon:1,time:1000});
</p>
<p>
  			},
</p>
<p>
  			error:function(data) {
</p>
<p>
  				console.log(data.msg);
</p>
<p>
  			},
</p>
<p>
  		});
</p>
<p>
  	});
</p>
<p>
  }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<ul>
<li>
    步骤3：更改控制器方法
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1009" height="572" src="/wp-content/uploads/2018/05/word-image-5367.png" class="wp-image-5907" srcset="/wp-content/uploads/2018/05/word-image-5367.png 1009w, /wp-content/uploads/2018/05/word-image-5367-300x170.png 300w, /wp-content/uploads/2018/05/word-image-5367-768x435.png 768w" sizes="(max-width: 1009px) 100vw, 1009px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use App\Http\Model\Protype;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class ProtypeController extends Controller
</p>
<p>
  {
</p>
<p>
      //列表
</p>
<p>
      public function index(Request $request)
</p>
<p>
      {
</p>
<p>
          //1.判断HTTP请求类型（脚下留心：客户端分页直接向所有数据响应即可）
</p>
<p>
          if ($request-&gt;isMethod(&#8216;post&#8217;)) {
</p>
<p>
              //2.查询所有数据
</p>
<p>
              $protypes = Protype::get();
</p>
<p>
              //3.响应json数据
</p>
<p>
              return response()-&gt;json([
</p>
<p>
                  &#8216;data&#8217; =&gt; $protypes
</p>
<p>
              ]);
</p>
<p>
          } else {
</p>
<p>
              //2.加载视图
</p>
<p>
              return view(&#8216;admin.protype.index&#8217;);
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
  }
</p>
<h1>专业管理</h1>
<h2>︴效果</h2>
<p>
  列表
</p>
<p><img loading="lazy" decoding="async" width="1359" height="635" src="/wp-content/uploads/2018/05/word-image-5368.png" class="wp-image-5908" srcset="/wp-content/uploads/2018/05/word-image-5368.png 1359w, /wp-content/uploads/2018/05/word-image-5368-300x140.png 300w, /wp-content/uploads/2018/05/word-image-5368-768x359.png 768w, /wp-content/uploads/2018/05/word-image-5368-1024x478.png 1024w" sizes="(max-width: 1359px) 100vw, 1359px" /></p>
<h2>1、列表功能（模板文件：admin-permission.html）</h2>
<h3>1）显示页面</h3>
<ul>
<li>
    步骤1：定义路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1176" height="256" src="/wp-content/uploads/2018/05/word-image-5369.png" class="wp-image-5909" srcset="/wp-content/uploads/2018/05/word-image-5369.png 1176w, /wp-content/uploads/2018/05/word-image-5369-300x65.png 300w, /wp-content/uploads/2018/05/word-image-5369-768x167.png 768w, /wp-content/uploads/2018/05/word-image-5369-1024x223.png 1024w" sizes="(max-width: 1176px) 100vw, 1176px" /></p>
<ul>
<li>
    步骤2：创建控制器方法 并 加载视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="841" height="510" src="/wp-content/uploads/2018/05/word-image-5370.png" class="wp-image-5910" srcset="/wp-content/uploads/2018/05/word-image-5370.png 841w, /wp-content/uploads/2018/05/word-image-5370-300x182.png 300w, /wp-content/uploads/2018/05/word-image-5370-768x466.png 768w" sizes="(max-width: 841px) 100vw, 841px" /></p>
<ul>
<li>
    步骤3：创建视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1109" height="593" src="/wp-content/uploads/2018/05/word-image-5371.png" class="wp-image-5911" srcset="/wp-content/uploads/2018/05/word-image-5371.png 1109w, /wp-content/uploads/2018/05/word-image-5371-300x160.png 300w, /wp-content/uploads/2018/05/word-image-5371-768x411.png 768w, /wp-content/uploads/2018/05/word-image-5371-1024x548.png 1024w" sizes="(max-width: 1109px) 100vw, 1109px" /></p>
<h3>2）数据处理</h3>
<ul>
<li>
    步骤1：修改路由（客户端分页）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="892" height="105" src="/wp-content/uploads/2018/05/word-image-5372.png" class="wp-image-5912" srcset="/wp-content/uploads/2018/05/word-image-5372.png 892w, /wp-content/uploads/2018/05/word-image-5372-300x35.png 300w, /wp-content/uploads/2018/05/word-image-5372-768x90.png 768w" sizes="(max-width: 892px) 100vw, 892px" /></p>
<ul>
<li>
    步骤2：修改视图，设置datatables插件
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1201" height="418" src="/wp-content/uploads/2018/05/word-image-5373.png" class="wp-image-5913" srcset="/wp-content/uploads/2018/05/word-image-5373.png 1201w, /wp-content/uploads/2018/05/word-image-5373-300x104.png 300w, /wp-content/uploads/2018/05/word-image-5373-768x267.png 768w, /wp-content/uploads/2018/05/word-image-5373-1024x356.png 1024w" sizes="(max-width: 1201px) 100vw, 1201px" /><br />
<img loading="lazy" decoding="async" width="921" height="669" src="/wp-content/uploads/2018/05/word-image-5374.png" class="wp-image-5914" srcset="/wp-content/uploads/2018/05/word-image-5374.png 921w, /wp-content/uploads/2018/05/word-image-5374-300x218.png 300w, /wp-content/uploads/2018/05/word-image-5374-768x558.png 768w" sizes="(max-width: 921px) 100vw, 921px" /></p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;title&gt;专业管理&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;nav class=&#8221;breadcrumb&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe67f;&lt;/i&gt; 首页 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 管理员管理 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 专业管理 &lt;a class=&#8221;btn btn-success radius r&#8221; style=&#8221;line-height:1.6em;margin-top:3px&#8221; href=&#8221;javascript:location.replace(location.href);&#8221; title=&#8221;刷新&#8221; &gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe68f;&lt;/i&gt;&lt;/a&gt;&lt;/nav&gt;
</p>
<p>
  &lt;div class=&#8221;page-container&#8221;&gt;
</p>
<p>
  	&lt;div class=&#8221;text-c&#8221;&gt;
</p>
<p>
  		&lt;form class=&#8221;Huiform&#8221; method=&#8221;post&#8221; action=&#8221;&#8221; target=&#8221;_self&#8221;&gt;
</p>
<p>
  			&lt;input type=&#8221;text&#8221; class=&#8221;input-text&#8221; style=&#8221;width:250px&#8221; placeholder=&#8221;专业名称&#8221; id=&#8221;&#8221; name=&#8221;&#8221;&gt;
</p>
<p>
  			&lt;button type=&#8221;submit&#8221; class=&#8221;btn btn-success&#8221; id=&#8221;&#8221; name=&#8221;&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe665;&lt;/i&gt; 搜专业节点&lt;/button&gt;
</p>
<p>
  		&lt;/form&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;cl pd-5 bg-1 bk-gray mt-20&#8243;&gt; &lt;span class=&#8221;l&#8221;&gt;&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;datadel()&#8221; class=&#8221;btn btn-danger radius&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt; 批量删除&lt;/a&gt; &lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_add(&#8216;添加专业节点&#8217;,&#8217;admin-permission-add.html&#8217;,&#8221;,&#8217;310&#8242;)&#8221; class=&#8221;btn btn-primary radius&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe600;&lt;/i&gt; 添加专业节点&lt;/a&gt;&lt;/span&gt; &lt;span class=&#8221;r&#8221;&gt;共有数据：&lt;strong&gt;54&lt;/strong&gt; 条&lt;/span&gt; &lt;/div&gt;
</p>
<p>
  	&lt;table class=&#8221;table table-border table-bordered table-bg&#8221;&gt;
</p>
<p>
  		&lt;thead&gt;
</p>
<p>
  			&lt;tr&gt;
</p>
<p>
  				&lt;th scope=&#8221;col&#8221; colspan=&#8221;7&#8243;&gt;专业节点&lt;/th&gt;
</p>
<p>
  			&lt;/tr&gt;
</p>
<p>
  			&lt;tr class=&#8221;text-c&#8221;&gt;
</p>
<p><strong>				&lt;th width=&#8221;25&#8243;&gt;&lt;input type=&#8221;checkbox&#8221; name=&#8221;&#8221; value=&#8221;&#8221;&gt;&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;40&#8243;&gt;ID&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;200&#8243;&gt;封面&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;专业分类名称&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;专业名称&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;更新于&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;创建于&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;100&#8243;&gt;操作&lt;/th&gt;</strong>
</p>
<p>
  			&lt;/tr&gt;
</p>
<p>
  		&lt;/thead&gt;
</p>
<p>
  		&lt;tbody&gt;
</p>
<p>
  			&lt;!&#8211; &lt;tr class=&#8221;text-c&#8221;&gt;
</p>
<p>
  				&lt;td&gt;&lt;input type=&#8221;checkbox&#8221; value=&#8221;1&#8243; name=&#8221;&#8221;&gt;&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;1&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;栏目添加&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;&lt;a title=&#8221;编辑&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_edit(&#8216;角色编辑&#8217;,&#8217;admin-permission-add.html&#8217;,&#8217;1&#8242;,&#8221;,&#8217;310&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6df;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;删除&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_del(this,&#8217;1&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt;&lt;/a&gt;&lt;/td&gt;
</p>
<p>
  			&lt;/tr&gt; &#8211;&gt;
</p>
<p>
  		&lt;/tbody&gt;
</p>
<p>
  	&lt;/table&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<p>
  &lt;!&#8211;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/datatables/1.10.0/jquery.dataTables.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p><strong>&lt;script type=&#8221;text/javascript&#8221;&gt;</strong>
</p>
<p><strong>//客户端分页大DD  服务端分页小DD</strong>
</p>
<p><strong>var table  = $(&#8216;table&#8217;).DataTable({</strong>
</p>
<p><strong>    //开启服务端分页（注：开启后发送的HTTP请求会携带起始位置和每页显示条数等信息）</strong>
</p>
<p><strong>    //&#8221;serverSide&#8221;: true,</strong>
</p>
<p><strong>    ajax: {</strong>
</p>
<p><strong>        url: &#8220;{{ url(&#8216;admin/profession/index&#8217;) }}&#8221;,</strong>
</p>
<p><strong>        &#8220;type&#8221;: &#8220;post&#8221;,</strong>
</p>
<p><strong>        &#8216;headers&#8217;: { &#8216;X-CSRF-TOKEN&#8217; : &#8216;{{ csrf_token() }}&#8217; },</strong>
</p>
<p><strong>        &#8220;data&#8221;: function (data) {</strong>
</p>
<p><strong>        }</strong>
</p>
<p><strong>    },</strong>
</p>
<p><strong>    //columns</strong>
</p>
<p><strong>    //作用：设置服务端返回数据填充规则</strong>
</p>
<p><strong>    //语法：{&#8220;data&#8221;: &#8220;键&#8221;，&#8221;defaultContent&#8221;: &#8220;默认值&#8221;}</strong>
</p>
<p><strong>    &#8220;columns&#8221;: [</strong>
</p>
<p><strong>        { &#8220;data&#8221;: &#8220;tmp1&#8221;,  defaultContent: &#8220;占位，复选框&#8221; },</strong>
</p>
<p><strong>        { &#8220;data&#8221;: &#8220;id&#8221; },</strong>
</p>
<p><strong>        { &#8220;data&#8221;: &#8220;img&#8221;,  defaultContent: &#8220;占位，图片&#8221; },</strong>
</p>
<p><strong>        // { &#8220;data&#8221;: &#8220;protype_id&#8221; },</strong>
</p>
<p><strong>        { &#8220;data&#8221;: &#8220;protype.protype_name&#8221; },</strong>
</p>
<p><strong>        { &#8220;data&#8221;: &#8220;profession_name&#8221; },</strong>
</p>
<p><strong>        { &#8220;data&#8221;: &#8220;created_at&#8221; },</strong>
</p>
<p><strong>        { &#8220;data&#8221;: &#8220;updated_at&#8221; },</strong>
</p>
<p><strong>        { &#8220;data&#8221;: &#8220;tmp2&#8221;, defaultContent: &#8220;占位，操作&#8221; },</strong>
</p>
<p><strong>    ],</strong>
</p>
<p><strong>    //createdRow</strong>
</p>
<p><strong>    //作用：创建tr时回调</strong>
</p>
<p><strong>    //row:创建好的tr的dom对象</strong>
</p>
<p><strong>    //data:数据源，代表服务器端返回的每条记录的实体信息</strong>
</p>
<p><strong>    //dataIndex:数据源的索引号码</strong>
</p>
<p><strong>    &#8220;createdRow&#8221;: function(row, data, dataIndex) {</strong>
</p>
<p><strong>        //匹配每一行的第一列</strong>
</p>
<p><strong>        $(row).find(&#8220;td:first&#8221;).html(&#8220;&lt;input type=&#8217;checkbox&#8217; name=&#8217;choose[]&#8217; value='&#8221;+data.id+&#8221;&#8216; /&gt;&#8221;)</strong>
</p>
<p><strong>        //匹配每一行的第八列</strong>
</p>
<p><strong>        if (data.img) {</strong>
</p>
<p><strong>            $(row).find(&#8220;td:eq(2)&#8221;).html(&#8216;&lt;img src=&#8217;+data.img+&#8217; width=&#8221;120&#8243; height=&#8221;60&#8243;&gt;&#8217;);</strong>
</p>
<p><strong>        } else {</strong>
</p>
<p><strong>            var defaultImg = &#8220;{{ asset(&#8216;img/default.png&#8217;) }}&#8221;;</strong>
</p>
<p><strong>            $(row).find(&#8220;td:eq(2)&#8221;).html(&#8216;&lt;img src=&#8221;&#8216;+defaultImg+'&#8221; width=&#8221;120&#8243; height=&#8221;60&#8243;&gt;&#8217;);</strong>
</p>
<p><strong>        }</strong>
</p>
<p><strong>        //匹配每一行的最后一列</strong>
</p>
<p><strong>        var lastHtml = &#8216;&lt;a style=&#8221;text-decoration:none&#8221; onClick=&#8221;admin_start(this,10001)&#8221; href=&#8221;javascript:;&#8221; title=&#8221;启用&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe615;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;编辑&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_edit(\&#8217;管理员编辑\&#8217;,\&#8217;admin-add.html\&#8217;,2,800,500)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6df;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;删除&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_del(this,1)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt;&lt;/a&gt;&#8217;;</strong>
</p>
<p><strong>        $(row).find(&#8220;td:last&#8221;).html(lastHtml);</strong>
</p>
<p><strong>        //让每一行居中</strong>
</p>
<p><strong>        $(row).addClass(&#8216;text-c&#8217;);</strong>
</p>
<p><strong>    },</strong>
</p>
<p><strong>    // searching : false, 		 //禁用搜索</strong>
</p>
<p><strong>    bLengthChange: false,   //去掉每页显示多少条数据方法</strong>
</p>
<p><strong>    // iDisplayLength:2,	    //限制每页显示条数</strong>
</p>
<p><strong>});</strong>
</p>
<p>
  /*
</p>
<p>
  	参数解释：
</p>
<p>
  	title	标题
</p>
<p>
  	url		请求的url
</p>
<p>
  	id		需要操作的数据id
</p>
<p>
  	w		弹出层宽度（缺省调默认值）
</p>
<p>
  	h		弹出层高度（缺省调默认值）
</p>
<p>
  */
</p>
<p>
  /*管理员-专业-添加*/
</p>
<p>
  function admin_permission_add(title,url,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-专业-编辑*/
</p>
<p>
  function admin_permission_edit(title,url,id,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-专业-删除*/
</p>
<p>
  function admin_permission_del(obj,id){
</p>
<p>
  	layer.confirm(&#8216;确认要删除吗？&#8217;,function(index){
</p>
<p>
  		$.ajax({
</p>
<p>
  			type: &#8216;POST&#8217;,
</p>
<p>
  			url: &#8221;,
</p>
<p>
  			dataType: &#8216;json&#8217;,
</p>
<p>
  			success: function(data){
</p>
<p>
  				$(obj).parents(&#8220;tr&#8221;).remove();
</p>
<p>
  				layer.msg(&#8216;已删除!&#8217;,{icon:1,time:1000});
</p>
<p>
  			},
</p>
<p>
  			error:function(data) {
</p>
<p>
  				console.log(data.msg);
</p>
<p>
  			},
</p>
<p>
  		});
</p>
<p>
  	});
</p>
<p>
  }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<ul>
<li>
    步骤3：修改控制器方法响应数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="872" height="636" src="/wp-content/uploads/2018/05/word-image-5375.png" class="wp-image-5915" srcset="/wp-content/uploads/2018/05/word-image-5375.png 872w, /wp-content/uploads/2018/05/word-image-5375-300x219.png 300w, /wp-content/uploads/2018/05/word-image-5375-768x560.png 768w" sizes="(max-width: 872px) 100vw, 872px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use App\Http\Model\Profession;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class ProfessionController extends Controller
</p>
<p>
  {
</p>
<p>
      //列表
</p>
<p>
      public function index(Request $request)
</p>
<p>
      {
</p>
<p>
          //1.判断HTTP类型
</p>
<p>
          if ($request-&gt;isMethod(&#8216;post&#8217;)) {
</p>
<p>
              //2.查询所有数据
</p>
<p>
              $professions = Profession::with(&#8216;protype&#8217;)-&gt;get();
</p>
<p>
              //3.响应json数据
</p>
<p>
              return response()-&gt;json([
</p>
<p>
                  &#8216;data&#8217; =&gt; $professions
</p>
<p>
              ]);
</p>
<p>
          } else {
</p>
<p>
              //2.加载视图
</p>
<p>
              return view(&#8216;admin.profession.index&#8217;);
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
  }
</p>
<p><img loading="lazy" decoding="async" width="873" height="607" src="/wp-content/uploads/2018/05/word-image-5376.png" class="wp-image-5916" srcset="/wp-content/uploads/2018/05/word-image-5376.png 873w, /wp-content/uploads/2018/05/word-image-5376-300x209.png 300w, /wp-content/uploads/2018/05/word-image-5376-768x534.png 768w" sizes="(max-width: 873px) 100vw, 873px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Model;
</p>
<p>
  use Illuminate\Database\Eloquent\Model;
</p>
<p>
  class Profession extends Model
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * 声明表名（注：laravel会自动加s所以自己声明覆盖）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $table = &#8216;profession&#8217;;
</p>
<p>
      /**
</p>
<p>
       * Unix时间戳形式填充创建于和更新于（注：模型默认托管时间但是是datetime类型）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $dateFormat = &#8216;U&#8217;;
</p>
<p>
      /**
</p>
<p>
       * 声明可批量设置的属性（注：当使用create静态方式时）
</p>
<p>
       * @var array
</p>
<p>
       */
</p>
<p>
      protected $fillable = [&#8216;profession_name&#8217;, &#8216;protype_id&#8217;, &#8216;img&#8217;, &#8216;profession_desc&#8217;];
</p>
<p>
     <strong> /**</strong>
</p>
<p><strong>     * 关联模型（1:1）</strong>
</p>
<p><strong>     * @return \Illuminate\Database\Eloquent\Builder|static</strong>
</p>
<p><strong>     */</strong>
</p>
<p><strong>    public function protype()</strong>
</p>
<p><strong>    {</strong>
</p>
<p><strong>        return $this-&gt;hasOne(&#8216;App\Http\Model\Protype&#8217;, &#8216;id&#8217;, &#8216;protype_id&#8217;);</strong>
</p>
<p><strong>    }</strong>
</p>
<p>
  }
</p>
<h1>三、课程管理</h1>
<h2>︴效果</h2>
<p>
  列表
</p>
<p><img loading="lazy" decoding="async" width="1363" height="598" src="/wp-content/uploads/2018/05/word-image-5377.png" class="wp-image-5917" srcset="/wp-content/uploads/2018/05/word-image-5377.png 1363w, /wp-content/uploads/2018/05/word-image-5377-300x132.png 300w, /wp-content/uploads/2018/05/word-image-5377-768x337.png 768w, /wp-content/uploads/2018/05/word-image-5377-1024x449.png 1024w" sizes="(max-width: 1363px) 100vw, 1363px" /></p>
<h2>列表功能（模板文件：admin-permission.html）</h2>
<h3>1）显示页面</h3>
<ul>
<li>
    步骤1：定义路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="666" height="88" src="/wp-content/uploads/2018/05/word-image-5378.png" class="wp-image-5918" srcset="/wp-content/uploads/2018/05/word-image-5378.png 666w, /wp-content/uploads/2018/05/word-image-5378-300x40.png 300w" sizes="(max-width: 666px) 100vw, 666px" /></p>
<ul>
<li>
    步骤2：创建控制器和方法并调用视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="799" height="372" src="/wp-content/uploads/2018/05/word-image-5379.png" class="wp-image-5919" srcset="/wp-content/uploads/2018/05/word-image-5379.png 799w, /wp-content/uploads/2018/05/word-image-5379-300x140.png 300w, /wp-content/uploads/2018/05/word-image-5379-768x358.png 768w" sizes="(max-width: 799px) 100vw, 799px" /></p>
<ul>
<li>
    步骤2：创建视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1079" height="672" src="/wp-content/uploads/2018/05/word-image-5380.png" class="wp-image-5920" srcset="/wp-content/uploads/2018/05/word-image-5380.png 1079w, /wp-content/uploads/2018/05/word-image-5380-300x187.png 300w, /wp-content/uploads/2018/05/word-image-5380-768x478.png 768w, /wp-content/uploads/2018/05/word-image-5380-1024x638.png 1024w" sizes="(max-width: 1079px) 100vw, 1079px" /></p>
<h3>2）数据处理</h3>
<ul>
<li>
    步骤1：修改路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="833" height="105" src="/wp-content/uploads/2018/05/word-image-5381.png" class="wp-image-5921" srcset="/wp-content/uploads/2018/05/word-image-5381.png 833w, /wp-content/uploads/2018/05/word-image-5381-300x38.png 300w, /wp-content/uploads/2018/05/word-image-5381-768x97.png 768w" sizes="(max-width: 833px) 100vw, 833px" /></p>
<ul>
<li>
    步骤2：修改视图，设置datatable
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1288" height="626" src="/wp-content/uploads/2018/05/word-image-5382.png" class="wp-image-5922" srcset="/wp-content/uploads/2018/05/word-image-5382.png 1288w, /wp-content/uploads/2018/05/word-image-5382-300x146.png 300w, /wp-content/uploads/2018/05/word-image-5382-768x373.png 768w, /wp-content/uploads/2018/05/word-image-5382-1024x498.png 1024w" sizes="(max-width: 1288px) 100vw, 1288px" /><br />
<img loading="lazy" decoding="async" width="794" height="670" src="/wp-content/uploads/2018/05/word-image-5383.png" class="wp-image-5923" srcset="/wp-content/uploads/2018/05/word-image-5383.png 794w, /wp-content/uploads/2018/05/word-image-5383-300x253.png 300w, /wp-content/uploads/2018/05/word-image-5383-768x648.png 768w" sizes="(max-width: 794px) 100vw, 794px" /></p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;title&gt;课程管理&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;nav class=&#8221;breadcrumb&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe67f;&lt;/i&gt; 首页 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 管理员管理 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 课程管理 &lt;a class=&#8221;btn btn-success radius r&#8221; style=&#8221;line-height:1.6em;margin-top:3px&#8221; href=&#8221;javascript:location.replace(location.href);&#8221; title=&#8221;刷新&#8221; &gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe68f;&lt;/i&gt;&lt;/a&gt;&lt;/nav&gt;
</p>
<p>
  &lt;div class=&#8221;page-container&#8221;&gt;
</p>
<p>
  	&lt;div class=&#8221;text-c&#8221;&gt;
</p>
<p>
  		&lt;form class=&#8221;Huiform&#8221; method=&#8221;post&#8221; action=&#8221;&#8221; target=&#8221;_self&#8221;&gt;
</p>
<p>
  			&lt;input type=&#8221;text&#8221; class=&#8221;input-text&#8221; style=&#8221;width:250px&#8221; placeholder=&#8221;课程名称&#8221; id=&#8221;&#8221; name=&#8221;&#8221;&gt;
</p>
<p>
  			&lt;button type=&#8221;submit&#8221; class=&#8221;btn btn-success&#8221; id=&#8221;&#8221; name=&#8221;&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe665;&lt;/i&gt; 搜课程节点&lt;/button&gt;
</p>
<p>
  		&lt;/form&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;cl pd-5 bg-1 bk-gray mt-20&#8243;&gt; &lt;span class=&#8221;l&#8221;&gt;&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;datadel()&#8221; class=&#8221;btn btn-danger radius&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt; 批量删除&lt;/a&gt; &lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_add(&#8216;添加课程节点&#8217;,&#8217;admin-permission-add.html&#8217;,&#8221;,&#8217;310&#8242;)&#8221; class=&#8221;btn btn-primary radius&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe600;&lt;/i&gt; 添加课程节点&lt;/a&gt;&lt;/span&gt; &lt;span class=&#8221;r&#8221;&gt;共有数据：&lt;strong&gt;54&lt;/strong&gt; 条&lt;/span&gt; &lt;/div&gt;
</p>
<p>
  	<strong>&lt;table class=&#8221;table table-border table-bordered table-bg&#8221;&gt;</strong>
</p>
<p><strong>		&lt;thead&gt;</strong>
</p>
<p><strong>			&lt;tr&gt;</strong>
</p>
<p><strong>				&lt;th scope=&#8221;col&#8221; colspan=&#8221;9&#8243;&gt;课程节点&lt;/th&gt;</strong>
</p>
<p><strong>			&lt;/tr&gt;</strong>
</p>
<p><strong>			&lt;tr class=&#8221;text-c&#8221;&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;25&#8243;&gt;&lt;input type=&#8221;checkbox&#8221; name=&#8221;&#8221; value=&#8221;&#8221;&gt;&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;40&#8243;&gt;ID&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;封面地址&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;200&#8243;&gt;所属专业&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;课程名称&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;课程的价格&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;创建于&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;更新于&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;100&#8243;&gt;操作&lt;/th&gt;</strong>
</p>
<p><strong>			&lt;/tr&gt;</strong>
</p>
<p><strong>		&lt;/thead&gt;</strong>
</p>
<p>
  		&lt;tbody&gt;
</p>
<p>
  			&lt;!&#8211; &lt;tr class=&#8221;text-c&#8221;&gt;
</p>
<p>
  				&lt;td&gt;&lt;input type=&#8221;checkbox&#8221; value=&#8221;1&#8243; name=&#8221;&#8221;&gt;&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;1&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;栏目添加&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;&lt;a title=&#8221;编辑&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_edit(&#8216;角色编辑&#8217;,&#8217;admin-permission-add.html&#8217;,&#8217;1&#8242;,&#8221;,&#8217;310&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6df;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;删除&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_del(this,&#8217;1&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt;&lt;/a&gt;&lt;/td&gt;
</p>
<p>
  			&lt;/tr&gt; &#8211;&gt;
</p>
<p>
  		&lt;/tbody&gt;
</p>
<p>
  	&lt;/table&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<p>
  &lt;!&#8211;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/datatables/1.10.0/jquery.dataTables.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p><strong>//客户端分页大DD  服务端分页小DD</strong>
</p>
<p><strong>var table  = $(&#8216;table&#8217;).dataTable({</strong>
</p>
<p><strong>	//开启服务端分页（注：开启后发送的HTTP请求会携带起始位置和每页显示条数等信息）</strong>
</p>
<p><strong>	&#8220;serverSide&#8221;: true,</strong>
</p>
<p><strong>	ajax: {</strong>
</p>
<p><strong>		url: &#8220;{{ url(&#8216;admin/course/index&#8217;) }}&#8221;,</strong>
</p>
<p><strong>		&#8220;type&#8221;: &#8220;post&#8221;,</strong>
</p>
<p><strong>		&#8216;headers&#8217;: { &#8216;X-CSRF-TOKEN&#8217; : &#8216;{{ csrf_token() }}&#8217; },</strong>
</p>
<p><strong>		&#8220;data&#8221;: function (data) {</strong>
</p>
<p><strong>			// data.startTime = $(&#8216;#startTime&#8217;).val();</strong>
</p>
<p><strong>			// data.endTime = $(&#8216;#endTime&#8217;).val();</strong>
</p>
<p><strong>			// data.username = $(&#8216;#username&#8217;).val();</strong>
</p>
<p><strong>		}</strong>
</p>
<p><strong>	},</strong>
</p>
<p><strong>	//作用：设置服务端返回数据填充规则</strong>
</p>
<p><strong>	//语法：{&#8220;data&#8221;: &#8220;键&#8221;，&#8221;defaultContent&#8221;: &#8220;默认值&#8221;}</strong>
</p>
<p><strong>	&#8220;columns&#8221;: [</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;tmp1&#8221;,  defaultContent: &#8220;占位，复选框&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;id&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;img&#8221; },</strong>
</p>
<p><strong>		// { &#8220;data&#8221;: &#8220;profession_id&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;profession.profession_name&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;course_name&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;course_price&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;created_at&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;updated_at&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;tmp2&#8221;, defaultContent: &#8220;占位，操作&#8221; },</strong>
</p>
<p><strong>	],</strong>
</p>
<p><strong>	//createdRow</strong>
</p>
<p><strong>	//作用：创建tr时回调</strong>
</p>
<p><strong>	//row:创建好的tr的dom对象</strong>
</p>
<p><strong>	//data:数据源，代表服务器端返回的每条记录的实体信息</strong>
</p>
<p><strong>	//dataIndex:数据源的索引号码</strong>
</p>
<p><strong>	&#8220;createdRow&#8221;: function(row, data, dataIndex) {</strong>
</p>
<p><strong>		//匹配每一行的第一列</strong>
</p>
<p><strong>		$(row).find(&#8220;td:first&#8221;).html(&#8220;&lt;input type=&#8217;checkbox&#8217; name=&#8217;choose[]&#8217; value='&#8221;+data.id+&#8221;&#8216; /&gt;&#8221;)</strong>
</p>
<p><strong>        //匹配每一行的第二列</strong>
</p>
<p><strong>        if (data.img) {</strong>
</p>
<p><strong>            $(row).find(&#8220;td:eq(2)&#8221;).html(&#8216;&lt;img src=&#8217;+data.img+&#8217; width=&#8221;120&#8243; height=&#8221;60&#8243;&gt;&#8217;);</strong>
</p>
<p><strong>        } else {</strong>
</p>
<p><strong>            var defaultImg = &#8220;{{ asset(&#8216;img/default.png&#8217;) }}&#8221;;</strong>
</p>
<p><strong>            $(row).find(&#8220;td:eq(2)&#8221;).html(&#8216;&lt;img src=&#8221;&#8216;+defaultImg+'&#8221; width=&#8221;120&#8243; height=&#8221;60&#8243;&gt;&#8217;);</strong>
</p>
<p><strong>        }</strong>
</p>
<p><strong>		//匹配每一行的最后一列</strong>
</p>
<p><strong>		var lastHtml = &#8216;&lt;a style=&#8221;text-decoration:none&#8221; onClick=&#8221;admin_start(this,10001)&#8221; href=&#8221;javascript:;&#8221; title=&#8221;启用&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe615;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;编辑&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_edit(\&#8217;管理员编辑\&#8217;,\&#8217;admin-add.html\&#8217;,2,800,500)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6df;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;删除&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_del(this,1)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt;&lt;/a&gt;&#8217;;</strong>
</p>
<p><strong>		$(row).find(&#8220;td:last&#8221;).html(lastHtml);</strong>
</p>
<p><strong>        //让每一行居中</strong>
</p>
<p><strong>        $(row).addClass(&#8216;text-c&#8217;);</strong>
</p>
<p><strong>	},</strong>
</p>
<p><strong>	searching : false, 		 //禁用搜索</strong>
</p>
<p><strong>	bLengthChange: false,    //去掉每页显示多少条数据方法</strong>
</p>
<p><strong>    iDisplayLength:6,	 	 //限制每页显示条数</strong>
</p>
<p><strong>});</strong>
</p>
<p>
  /*
</p>
<p>
  	参数解释：
</p>
<p>
  	title	标题
</p>
<p>
  	url		请求的url
</p>
<p>
  	id		需要操作的数据id
</p>
<p>
  	w		弹出层宽度（缺省调默认值）
</p>
<p>
  	h		弹出层高度（缺省调默认值）
</p>
<p>
  */
</p>
<p>
  /*管理员-课程-添加*/
</p>
<p>
  function admin_permission_add(title,url,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-课程-编辑*/
</p>
<p>
  function admin_permission_edit(title,url,id,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-课程-删除*/
</p>
<p>
  function admin_permission_del(obj,id){
</p>
<p>
  	layer.confirm(&#8216;确认要删除吗？&#8217;,function(index){
</p>
<p>
  		$.ajax({
</p>
<p>
  			type: &#8216;POST&#8217;,
</p>
<p>
  			url: &#8221;,
</p>
<p>
  			dataType: &#8216;json&#8217;,
</p>
<p>
  			success: function(data){
</p>
<p>
  				$(obj).parents(&#8220;tr&#8221;).remove();
</p>
<p>
  				layer.msg(&#8216;已删除!&#8217;,{icon:1,time:1000});
</p>
<p>
  			},
</p>
<p>
  			error:function(data) {
</p>
<p>
  				console.log(data.msg);
</p>
<p>
  			},
</p>
<p>
  		});
</p>
<p>
  	});
</p>
<p>
  }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<ul>
<li>
    步骤3：修改控制器方法响应数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1253" height="664" src="/wp-content/uploads/2018/05/word-image-5384.png" class="wp-image-5924" srcset="/wp-content/uploads/2018/05/word-image-5384.png 1253w, /wp-content/uploads/2018/05/word-image-5384-300x159.png 300w, /wp-content/uploads/2018/05/word-image-5384-768x407.png 768w, /wp-content/uploads/2018/05/word-image-5384-1024x543.png 1024w" sizes="(max-width: 1253px) 100vw, 1253px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use App\Http\Model\Course;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class CourseController extends Controller
</p>
<p>
  {
</p>
<p>
      //列表
</p>
<p>
      public function index(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;start&#8217;, &#8216;length&#8217;, &#8216;draw&#8217;]);
</p>
<p>
              //3.查询数据
</p>
<p>
              $courses = Course::with(&#8216;profession&#8217;)-&gt;orderBy(&#8216;id&#8217;, &#8216;desc&#8217;);
</p>
<p>
              //4.响应json数据
</p>
<p>
              return response()-&gt;json([
</p>
<p>
                  &#8216;draw&#8217; =&gt; (int)$postData[&#8216;draw&#8217;],       //必须，HTTP请求发送什么就响应什么
</p>
<p>
                  &#8216;recordsTotal&#8217; =&gt; Course::count(),       //必须，admin表总记录数
</p>
<p>
                  &#8216;recordsFiltered&#8217; =&gt; $courses-&gt;count(),  //必须，admin表总记录数（增加where条件）
</p>
<p>
                  &#8216;data&#8217; =&gt; $courses-&gt;offset($postData[&#8216;start&#8217;])-&gt;limit($postData[&#8216;length&#8217;])-&gt;get()
</p>
<p>
              ]);
</p>
<p>
          } else {
</p>
<p>
              //2.加载视图
</p>
<p>
              return view(&#8216;admin.course.index&#8217;);
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
  }
</p>
<p><img loading="lazy" decoding="async" width="970" height="635" src="/wp-content/uploads/2018/05/word-image-5385.png" class="wp-image-5925" srcset="/wp-content/uploads/2018/05/word-image-5385.png 970w, /wp-content/uploads/2018/05/word-image-5385-300x196.png 300w, /wp-content/uploads/2018/05/word-image-5385-768x503.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Model;
</p>
<p>
  use Illuminate\Database\Eloquent\Model;
</p>
<p>
  class Course extends Model
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * 声明表名（注：laravel会自动加s所以自己声明覆盖）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $table = &#8216;course&#8217;;
</p>
<p>
      /**
</p>
<p>
       * Unix时间戳形式填充创建于和更新于（注：模型默认托管时间但是是datetime类型）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $dateFormat = &#8216;U&#8217;;
</p>
<p>
      /**
</p>
<p>
       * 声明可批量设置的属性（注：当使用create静态方式时）
</p>
<p>
       * @var array
</p>
<p>
       */
</p>
<p>
      protected $fillable = [&#8216;course_name&#8217;, &#8216;profession_id&#8217;, &#8216;course_price&#8217;, &#8216;img&#8217;, &#8216;course_desc&#8217;];
</p>
<p>
     <strong> /**</strong>
</p>
<p><strong>     * 关联专业模型（1:1）</strong>
</p>
<p><strong>     * 语法：模型名::with（&#8217;role&#8217;）-&gt;first()</strong>
</p>
<p><strong>     * @return \Illuminate\Database\Eloquent\Relations\HasOne</strong>
</p>
<p><strong>     */</strong>
</p>
<p><strong>    public function profession()</strong>
</p>
<p><strong>    {</strong>
</p>
<p><strong>        #return $this-&gt;hasOne(关联模型名，关联模型公共字段，本模型公共字段)</strong>
</p>
<p><strong>        return $this-&gt;hasOne(&#8216;App\Http\Model\Profession&#8217;,&#8217;id&#8217;, &#8216;profession_id&#8217;);</strong>
</p>
<p><strong>    }</strong>
</p>
<p>
  }
</p>
<h1>四、课时管理（点播）</h1>
<h2>︴效果</h2>
<p>
  列表
</p>
<p><img loading="lazy" decoding="async" width="1351" height="676" src="/wp-content/uploads/2018/05/word-image-5386.png" class="wp-image-5926" srcset="/wp-content/uploads/2018/05/word-image-5386.png 1351w, /wp-content/uploads/2018/05/word-image-5386-300x150.png 300w, /wp-content/uploads/2018/05/word-image-5386-768x384.png 768w, /wp-content/uploads/2018/05/word-image-5386-1024x512.png 1024w" sizes="(max-width: 1351px) 100vw, 1351px" /></p>
<p>
  播放
</p>
<p><img loading="lazy" decoding="async" width="1316" height="682" src="/wp-content/uploads/2018/05/word-image-5387.png" class="wp-image-5927" srcset="/wp-content/uploads/2018/05/word-image-5387.png 1316w, /wp-content/uploads/2018/05/word-image-5387-300x155.png 300w, /wp-content/uploads/2018/05/word-image-5387-768x398.png 768w, /wp-content/uploads/2018/05/word-image-5387-1024x531.png 1024w" sizes="(max-width: 1316px) 100vw, 1316px" /></p>
<h2>列表功能（模板文件：admin-permission.html）</h2>
<h3>1）显示页面</h3>
<ul>
<li>
    步骤1：定义路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="989" height="269" src="/wp-content/uploads/2018/05/word-image-5388.png" class="wp-image-5928" srcset="/wp-content/uploads/2018/05/word-image-5388.png 989w, /wp-content/uploads/2018/05/word-image-5388-300x82.png 300w, /wp-content/uploads/2018/05/word-image-5388-768x209.png 768w" sizes="(max-width: 989px) 100vw, 989px" /></p>
<ul>
<li>
    步骤2：创建控制器和方法、并且调用视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="661" height="431" src="/wp-content/uploads/2018/05/word-image-5389.png" class="wp-image-5929" srcset="/wp-content/uploads/2018/05/word-image-5389.png 661w, /wp-content/uploads/2018/05/word-image-5389-300x196.png 300w" sizes="(max-width: 661px) 100vw, 661px" /></p>
<ul>
<li>
    步骤3：加载视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1016" height="636" src="/wp-content/uploads/2018/05/word-image-5390.png" class="wp-image-5930" srcset="/wp-content/uploads/2018/05/word-image-5390.png 1016w, /wp-content/uploads/2018/05/word-image-5390-300x188.png 300w, /wp-content/uploads/2018/05/word-image-5390-768x481.png 768w" sizes="(max-width: 1016px) 100vw, 1016px" /></p>
<h3>2）数据处理</h3>
<ul>
<li>
    步骤1：修改路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1129" height="344" src="/wp-content/uploads/2018/05/word-image-5391.png" class="wp-image-5931" srcset="/wp-content/uploads/2018/05/word-image-5391.png 1129w, /wp-content/uploads/2018/05/word-image-5391-300x91.png 300w, /wp-content/uploads/2018/05/word-image-5391-768x234.png 768w, /wp-content/uploads/2018/05/word-image-5391-1024x312.png 1024w" sizes="(max-width: 1129px) 100vw, 1129px" /></p>
<ul>
<li>
    步骤2：修改视图，设置datatables
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1214" height="611" src="/wp-content/uploads/2018/05/word-image-5392.png" class="wp-image-5932" srcset="/wp-content/uploads/2018/05/word-image-5392.png 1214w, /wp-content/uploads/2018/05/word-image-5392-300x151.png 300w, /wp-content/uploads/2018/05/word-image-5392-768x387.png 768w, /wp-content/uploads/2018/05/word-image-5392-1024x515.png 1024w" sizes="(max-width: 1214px) 100vw, 1214px" /><br />
<img loading="lazy" decoding="async" width="870" height="700" src="/wp-content/uploads/2018/05/word-image-5393.png" class="wp-image-5933" srcset="/wp-content/uploads/2018/05/word-image-5393.png 870w, /wp-content/uploads/2018/05/word-image-5393-300x241.png 300w, /wp-content/uploads/2018/05/word-image-5393-768x618.png 768w" sizes="(max-width: 870px) 100vw, 870px" /></p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;title&gt;课时管理&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;nav class=&#8221;breadcrumb&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe67f;&lt;/i&gt; 首页 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 管理员管理 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 课时管理 &lt;a class=&#8221;btn btn-success radius r&#8221; style=&#8221;line-height:1.6em;margin-top:3px&#8221; href=&#8221;javascript:location.replace(location.href);&#8221; title=&#8221;刷新&#8221; &gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe68f;&lt;/i&gt;&lt;/a&gt;&lt;/nav&gt;
</p>
<p>
  &lt;div class=&#8221;page-container&#8221;&gt;
</p>
<p>
  	&lt;div class=&#8221;text-c&#8221;&gt;
</p>
<p>
  		&lt;form class=&#8221;Huiform&#8221; method=&#8221;post&#8221; action=&#8221;&#8221; target=&#8221;_self&#8221;&gt;
</p>
<p>
  			&lt;input type=&#8221;text&#8221; class=&#8221;input-text&#8221; style=&#8221;width:250px&#8221; placeholder=&#8221;课时名称&#8221; id=&#8221;&#8221; name=&#8221;&#8221;&gt;
</p>
<p>
  			&lt;button type=&#8221;submit&#8221; class=&#8221;btn btn-success&#8221; id=&#8221;&#8221; name=&#8221;&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe665;&lt;/i&gt; 搜课时节点&lt;/button&gt;
</p>
<p>
  		&lt;/form&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;cl pd-5 bg-1 bk-gray mt-20&#8243;&gt; &lt;span class=&#8221;l&#8221;&gt;&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;datadel()&#8221; class=&#8221;btn btn-danger radius&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt; 批量删除&lt;/a&gt; &lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_add(&#8216;添加课时节点&#8217;,&#8217;admin-permission-add.html&#8217;,&#8221;,&#8217;310&#8242;)&#8221; class=&#8221;btn btn-primary radius&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe600;&lt;/i&gt; 添加课时节点&lt;/a&gt;&lt;/span&gt; &lt;span class=&#8221;r&#8221;&gt;共有数据：&lt;strong&gt;54&lt;/strong&gt; 条&lt;/span&gt; &lt;/div&gt;
</p>
<p>
  	<strong>&lt;table class=&#8221;table table-border table-bordered table-bg&#8221;&gt;</strong>
</p>
<p><strong>		&lt;thead&gt;</strong>
</p>
<p><strong>			&lt;tr&gt;</strong>
</p>
<p><strong>				&lt;th scope=&#8221;col&#8221; colspan=&#8221;11&#8243;&gt;课时节点&lt;/th&gt;</strong>
</p>
<p><strong>			&lt;/tr&gt;</strong>
</p>
<p><strong>			&lt;tr class=&#8221;text-c&#8221;&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;25&#8243;&gt;&lt;input type=&#8221;checkbox&#8221; name=&#8221;&#8221; value=&#8221;&#8221;&gt;&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;40&#8243;&gt;ID&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;40&#8243;&gt;封面图&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;所属课程&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;课时名称&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;预览视频&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;播放时间/s&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;讲师&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;状态&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;创建于&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th&gt;更新于&lt;/th&gt;</strong>
</p>
<p><strong>				&lt;th width=&#8221;100&#8243;&gt;操作&lt;/th&gt;</strong>
</p>
<p><strong>			&lt;/tr&gt;</strong>
</p>
<p><strong>		&lt;/thead&gt;</strong>
</p>
<p>
  		&lt;tbody&gt;
</p>
<p>
  			&lt;!&#8211; &lt;tr class=&#8221;text-c&#8221;&gt;
</p>
<p>
  				&lt;td&gt;&lt;input type=&#8221;checkbox&#8221; value=&#8221;1&#8243; name=&#8221;&#8221;&gt;&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;1&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;栏目添加&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;&lt;a title=&#8221;编辑&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_edit(&#8216;角色编辑&#8217;,&#8217;admin-permission-add.html&#8217;,&#8217;1&#8242;,&#8221;,&#8217;310&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6df;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;删除&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_del(this,&#8217;1&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt;&lt;/a&gt;&lt;/td&gt;
</p>
<p>
  			&lt;/tr&gt; &#8211;&gt;
</p>
<p>
  		&lt;/tbody&gt;
</p>
<p>
  	&lt;/table&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<p>
  &lt;!&#8211;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/datatables/1.10.0/jquery.dataTables.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p><strong>//客户端分页大DD  服务端分页小DD</strong>
</p>
<p><strong>var table  = $(&#8216;table&#8217;).dataTable({</strong>
</p>
<p><strong>	//开启服务端分页（注：开启后发送的HTTP请求会携带起始位置和每页显示条数等信息）</strong>
</p>
<p><strong>	&#8220;serverSide&#8221;: true,</strong>
</p>
<p><strong>	ajax: {</strong>
</p>
<p><strong>		url: &#8220;{{ url(&#8216;admin/lesson/index&#8217;) }}&#8221;,</strong>
</p>
<p><strong>		&#8220;type&#8221;: &#8220;post&#8221;,</strong>
</p>
<p><strong>		&#8216;headers&#8217;: { &#8216;X-CSRF-TOKEN&#8217; : &#8216;{{ csrf_token() }}&#8217; },</strong>
</p>
<p><strong>		&#8220;data&#8221;: function (data) {</strong>
</p>
<p><strong>		}</strong>
</p>
<p><strong>	},</strong>
</p>
<p><strong>	//作用：设置服务端返回数据填充规则</strong>
</p>
<p><strong>	//语法：{&#8220;data&#8221;: &#8220;键&#8221;，&#8221;defaultContent&#8221;: &#8220;默认值&#8221;}</strong>
</p>
<p><strong>	&#8220;columns&#8221;: [</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;tmp1&#8221;,  defaultContent: &#8220;占位，复选框&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;id&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;img&#8221; },</strong>
</p>
<p><strong>		// { &#8220;data&#8221;: &#8220;course_id&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;course.course_name&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;lesson_name&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;tmp3&#8221;,  defaultContent: &#8220;占位，播放按钮&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;video_time&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;teacher_name&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;state&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;created_at&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;updated_at&#8221; },</strong>
</p>
<p><strong>		{ &#8220;data&#8221;: &#8220;tmp2&#8221;, defaultContent: &#8220;占位，操作&#8221; },</strong>
</p>
<p><strong>	],</strong>
</p>
<p><strong>	//createdRow</strong>
</p>
<p><strong>	//作用：创建tr时回调</strong>
</p>
<p><strong>	//row:创建好的tr的dom对象</strong>
</p>
<p><strong>	//data:数据源，代表服务器端返回的每条记录的实体信息</strong>
</p>
<p><strong>	//dataIndex:数据源的索引号码</strong>
</p>
<p><strong>	&#8220;createdRow&#8221;: function(row, data, dataIndex) {</strong>
</p>
<p><strong>		//匹配每一行的第一列</strong>
</p>
<p><strong>		$(row).find(&#8220;td:first&#8221;).html(&#8220;&lt;input type=&#8217;checkbox&#8217; name=&#8217;choose[]&#8217; value='&#8221;+data.id+&#8221;&#8216; /&gt;&#8221;)</strong>
</p>
<p><strong>        //匹配每一行的第二列</strong>
</p>
<p><strong>        if (data.img) {</strong>
</p>
<p><strong>            $(row).find(&#8220;td:eq(2)&#8221;).html(&#8216;&lt;img src=&#8217;+data.img+&#8217; width=&#8221;120&#8243; height=&#8221;60&#8243;&gt;&#8217;);</strong>
</p>
<p><strong>        } else {</strong>
</p>
<p><strong>            var defaultImg = &#8220;{{ asset(&#8216;img/default.png&#8217;) }}&#8221;;</strong>
</p>
<p><strong>            $(row).find(&#8220;td:eq(2)&#8221;).html(&#8216;&lt;img src=&#8221;&#8216;+defaultImg+'&#8221; width=&#8221;120&#8243; height=&#8221;60&#8243;&gt;&#8217;);</strong>
</p>
<p><strong>        }</strong>
</p>
<p><strong>        //预览播放按钮</strong>
</p>
<p><strong>        $(row).find(&#8220;td:eq(5)&#8221;).html(&#8216;&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;&#8221; class=&#8221;btn btn-primary radius&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e6;&lt;/i&gt;播放&lt;/a&gt;&#8217;);</strong>
</p>
<p><strong>        if (data.state == 1) {</strong>
</p>
<p><strong>			$(row).find(&#8220;td:eq(8)&#8221;).html(&#8216;&lt;span class=&#8221;label label-success radius&#8221;&gt;已启用&lt;/span&gt;&#8217;);</strong>
</p>
<p><strong>		} else {</strong>
</p>
<p><strong>			$(row).find(&#8220;td:eq(8)&#8221;).html(&#8216;&lt;span class=&#8221;label radius&#8221;&gt;已停用&lt;/span&gt;&#8217;);</strong>
</p>
<p><strong>		}</strong>
</p>
<p><strong>		//匹配每一行的最后一列</strong>
</p>
<p><strong>		var lastHtml = &#8216;&lt;a style=&#8221;text-decoration:none&#8221; onClick=&#8221;admin_start(this,10001)&#8221; href=&#8221;javascript:;&#8221; title=&#8221;启用&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe615;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;编辑&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_edit(\&#8217;管理员编辑\&#8217;,\&#8217;admin-add.html\&#8217;,2,800,500)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6df;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;删除&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_del(this,1)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt;&lt;/a&gt;&#8217;;</strong>
</p>
<p><strong>		$(row).find(&#8220;td:last&#8221;).html(lastHtml);</strong>
</p>
<p><strong>        //让每一行居中</strong>
</p>
<p><strong>        $(row).addClass(&#8216;text-c&#8217;);</strong>
</p>
<p><strong>	},</strong>
</p>
<p><strong>	searching : false, 		 //禁用搜索</strong>
</p>
<p><strong>	bLengthChange: false,    //去掉每页显示多少条数据方法</strong>
</p>
<p><strong>    iDisplayLength:6,	 	 //限制每页显示条数</strong>
</p>
<p><strong>});</strong>
</p>
<p>
  /*
</p>
<p>
  	参数解释：
</p>
<p>
  	title	标题
</p>
<p>
  	url		请求的url
</p>
<p>
  	id		需要操作的数据id
</p>
<p>
  	w		弹出层宽度（缺省调默认值）
</p>
<p>
  	h		弹出层高度（缺省调默认值）
</p>
<p>
  */
</p>
<p>
  /*管理员-课时-添加*/
</p>
<p>
  function admin_permission_add(title,url,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-课时-编辑*/
</p>
<p>
  function admin_permission_edit(title,url,id,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-课时-删除*/
</p>
<p>
  function admin_permission_del(obj,id){
</p>
<p>
  	layer.confirm(&#8216;确认要删除吗？&#8217;,function(index){
</p>
<p>
  		$.ajax({
</p>
<p>
  			type: &#8216;POST&#8217;,
</p>
<p>
  			url: &#8221;,
</p>
<p>
  			dataType: &#8216;json&#8217;,
</p>
<p>
  			success: function(data){
</p>
<p>
  				$(obj).parents(&#8220;tr&#8221;).remove();
</p>
<p>
  				layer.msg(&#8216;已删除!&#8217;,{icon:1,time:1000});
</p>
<p>
  			},
</p>
<p>
  			error:function(data) {
</p>
<p>
  				console.log(data.msg);
</p>
<p>
  			},
</p>
<p>
  		});
</p>
<p>
  	});
</p>
<p>
  }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<ul>
<li>
    步骤1：修改控制器方法响应数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1131" height="654" src="/wp-content/uploads/2018/05/word-image-5394.png" class="wp-image-5934" srcset="/wp-content/uploads/2018/05/word-image-5394.png 1131w, /wp-content/uploads/2018/05/word-image-5394-300x173.png 300w, /wp-content/uploads/2018/05/word-image-5394-768x444.png 768w, /wp-content/uploads/2018/05/word-image-5394-1024x592.png 1024w" sizes="(max-width: 1131px) 100vw, 1131px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use App\Http\Model\Lesson;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class LessonController extends Controller
</p>
<p>
  {
</p>
<p>
      //列表
</p>
<p>
      public function index(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;start&#8217;, &#8216;length&#8217;, &#8216;draw&#8217;]);
</p>
<p>
              //3.查询数据
</p>
<p>
              $courses = Lesson::with(&#8216;course&#8217;)-&gt;orderBy(&#8216;id&#8217;, &#8216;desc&#8217;);
</p>
<p>
              //4.响应json数据
</p>
<p>
              return response()-&gt;json([
</p>
<p>
                  &#8216;draw&#8217; =&gt; (int)$postData[&#8216;draw&#8217;],       //必须，HTTP请求发送什么就响应什么
</p>
<p>
                  &#8216;recordsTotal&#8217; =&gt; Lesson::count(),       //必须，admin表总记录数
</p>
<p>
                  &#8216;recordsFiltered&#8217; =&gt; $courses-&gt;count(),  //必须，admin表总记录数（增加where条件）
</p>
<p>
                  &#8216;data&#8217; =&gt; $courses-&gt;offset($postData[&#8216;start&#8217;])-&gt;limit($postData[&#8216;length&#8217;])-&gt;get()
</p>
<p>
              ]);
</p>
<p>
          } else {
</p>
<p>
              //2.加载视图
</p>
<p>
              return view(&#8216;admin.lesson.index&#8217;);
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
  }
</p>
<h2>列表播放功能</h2>
<h3>1）思路</h3>
<ul>
<li>
    步骤1：用户点击播放按钮弹框，打开admin/lesson/play页面（注：
  </li>
</ul>
<p>
  播放视频地址url，如：admin/lesson/play?video=xxxx.mp3）
</p>
<ul>
<li>
    步骤2：控制器方法 echo html播放标签即可
  </li>
</ul>
<p>
  &lt;video src=&#8221;/i/movie.ogg&#8221; controls=&#8221;controls&#8221;&gt;
</p>
<p>
  your browser does not support the video tag
</p>
<p>
  &lt;/video&gt;
</p>
<h3>代码步骤</h3>
<ul>
<li>
    步骤1：绑定点击事件，点击后打开弹框（弹框加载页面）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1225" height="316" src="/wp-content/uploads/2018/05/word-image-5395.png" class="wp-image-5935" srcset="/wp-content/uploads/2018/05/word-image-5395.png 1225w, /wp-content/uploads/2018/05/word-image-5395-300x77.png 300w, /wp-content/uploads/2018/05/word-image-5395-768x198.png 768w, /wp-content/uploads/2018/05/word-image-5395-1024x264.png 1024w" sizes="(max-width: 1225px) 100vw, 1225px" /><br />
<img loading="lazy" decoding="async" width="689" height="260" src="/wp-content/uploads/2018/05/word-image-5396.png" class="wp-image-5936" srcset="/wp-content/uploads/2018/05/word-image-5396.png 689w, /wp-content/uploads/2018/05/word-image-5396-300x113.png 300w" sizes="(max-width: 689px) 100vw, 689px" /></p>
<p>
   //预览播放按钮
</p>
<p>
          var playurl = &#8220;{{ url(&#8216;admin/lesson/play&#8217;) }}?video=&#8221; + data.video_address;
</p>
<p>
          $(row).find(&#8220;td:eq(5)&#8221;).html(&#8216;&lt;a href=&#8221;javascript:;&#8221; onclick=video_play(&#8220;&#8216;+data.lesson_name+&#8217;预览&#8221;,&#8221;&#8216;+playurl+'&#8221;,800,450) class=&#8221;btn btn-primary radius&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e6;&lt;/i&gt;播放&lt;/a&gt;&#8217;);
</p>
<p>
  /*管理员-课时-播放*/
</p>
<p>
  function video_play(title,url,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<ul>
<li>
    步骤2：设置路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1089" height="158" src="/wp-content/uploads/2018/05/word-image-5397.png" class="wp-image-5937" srcset="/wp-content/uploads/2018/05/word-image-5397.png 1089w, /wp-content/uploads/2018/05/word-image-5397-300x44.png 300w, /wp-content/uploads/2018/05/word-image-5397-768x111.png 768w, /wp-content/uploads/2018/05/word-image-5397-1024x149.png 1024w" sizes="(max-width: 1089px) 100vw, 1089px" /></p>
<ul>
<li>
    步骤3：常见控制器方法获取播放地址
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1276" height="270" src="/wp-content/uploads/2018/05/word-image-5398.png" class="wp-image-5938" srcset="/wp-content/uploads/2018/05/word-image-5398.png 1276w, /wp-content/uploads/2018/05/word-image-5398-300x63.png 300w, /wp-content/uploads/2018/05/word-image-5398-768x163.png 768w, /wp-content/uploads/2018/05/word-image-5398-1024x217.png 1024w" sizes="(max-width: 1276px) 100vw, 1276px" /></p>
<p>
  //点播
</p>
<p>
  public function play(Request $request)
</p>
<p>
  {
</p>
<p>
      //1.接受播放地址
</p>
<p>
      //dd(asset(&#8216;img/default.mp4&#8217;));
</p>
<p>
      $video_addr = $request-&gt;input(&#8216;video&#8217;) ? $request-&gt;input(&#8216;video&#8217;) : asset(&#8216;img/default.mp4&#8217;);
</p>
<p>
      echo &#8220;&lt;video width=&#8217;100%&#8217; height=&#8217;390&#8242; src='{$video_addr}&#8217; autoplay controls=&#8217;controls&#8217;&gt;
</p>
<p>
      您的浏览器不支持 video 标签。
</p>
<p>
      &lt;/video&gt;&#8221;;
</p>
<p>
  }
</p>
<h1>︴完善</h1>
<h2>左侧菜单</h2>
<p><img loading="lazy" decoding="async" width="787" height="578" src="/wp-content/uploads/2018/05/word-image-5399.png" class="wp-image-5939" srcset="/wp-content/uploads/2018/05/word-image-5399.png 787w, /wp-content/uploads/2018/05/word-image-5399-300x220.png 300w, /wp-content/uploads/2018/05/word-image-5399-768x564.png 768w" sizes="(max-width: 787px) 100vw, 787px" /></p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;Bookmark&#8221; href=&#8221;/favicon.ico&#8221; &gt;
</p>
<p>
  &lt;link rel=&#8221;Shortcut Icon&#8221; href=&#8221;/favicon.ico&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;title&gt;H-ui.admin v3.1&lt;/title&gt;
</p>
<p>
  &lt;meta name=&#8221;keywords&#8221; content=&#8221;H-ui.admin v3.1,H-ui网站后台模版,后台模版下载,后台管理系统模版,HTML后台模版下载&#8221;&gt;
</p>
<p>
  &lt;meta name=&#8221;description&#8221; content=&#8221;H-ui.admin v3.1，是一款由国人开发的轻量级扁平化网站后台模板，完全免费开源的网站后台管理系统模版，适合中小型CMS后台系统。&#8221;&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;header class=&#8221;navbar-wrapper&#8221;&gt;
</p>
<p>
  	&lt;div class=&#8221;navbar navbar-fixed-top&#8221;&gt;
</p>
<p>
  		&lt;div class=&#8221;container-fluid cl&#8221;&gt; &lt;a class=&#8221;logo navbar-logo f-l mr-10 hidden-xs&#8221; href=&#8221;/aboutHui.shtml&#8221;&gt;H-ui.admin&lt;/a&gt; &lt;a class=&#8221;logo navbar-logo-m f-l mr-10 visible-xs&#8221; href=&#8221;/aboutHui.shtml&#8221;&gt;H-ui&lt;/a&gt;
</p>
<p>
  			&lt;span class=&#8221;logo navbar-slogan f-l mr-10 hidden-xs&#8221;&gt;v3.1&lt;/span&gt;
</p>
<p>
  			&lt;a aria-hidden=&#8221;false&#8221; class=&#8221;nav-toggle Hui-iconfont visible-xs&#8221; href=&#8221;javascript:;&#8221;&gt;&amp;#xe667;&lt;/a&gt;
</p>
<p>
  			&lt;nav class=&#8221;nav navbar-nav&#8221;&gt;
</p>
<p>
  				&lt;ul class=&#8221;cl&#8221;&gt;
</p>
<p>
  					&lt;li class=&#8221;dropDown dropDown_hover&#8221;&gt;&lt;a href=&#8221;javascript:;&#8221; class=&#8221;dropDown_A&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe600;&lt;/i&gt; 新增 &lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6d5;&lt;/i&gt;&lt;/a&gt;
</p>
<p>
  						&lt;ul class=&#8221;dropDown-menu menu radius box-shadow&#8221;&gt;
</p>
<p>
  							&lt;li&gt;&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;article_add(&#8216;添加资讯&#8217;,&#8217;article-add.html&#8217;)&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe616;&lt;/i&gt; 资讯&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  							&lt;li&gt;&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;picture_add(&#8216;添加资讯&#8217;,&#8217;picture-add.html&#8217;)&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe613;&lt;/i&gt; 图片&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  							&lt;li&gt;&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;product_add(&#8216;添加资讯&#8217;,&#8217;product-add.html&#8217;)&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe620;&lt;/i&gt; 产品&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  							&lt;li&gt;&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;member_add(&#8216;添加用户&#8217;,&#8217;member-add.html&#8217;,&#8221;,&#8217;510&#8242;)&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe60d;&lt;/i&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;/nav&gt;
</p>
<p>
  		&lt;nav id=&#8221;Hui-userbar&#8221; class=&#8221;nav navbar-nav navbar-userbar hidden-xs&#8221;&gt;
</p>
<p>
  			&lt;ul class=&#8221;cl&#8221;&gt;
</p>
<p>
  				&lt;li&gt;{{ Auth::guard(&#8216;admin&#8217;)-&gt;user()-&gt;role()-&gt;first()-&gt;role_name }} &lt;/li&gt;
</p>
<p>
  				&lt;li class=&#8221;dropDown dropDown_hover&#8221;&gt;
</p>
<p>
  					&lt;a href=&#8221;#&#8221; class=&#8221;dropDown_A&#8221;&gt;{{ Auth::guard(&#8216;admin&#8217;)-&gt;user()-&gt;username }} &lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6d5;&lt;/i&gt;&lt;/a&gt;
</p>
<p>
  					&lt;ul class=&#8221;dropDown-menu menu radius box-shadow&#8221;&gt;
</p>
<p>
  						&lt;li&gt;&lt;a href=&#8221;javascript:;&#8221; onClick=&#8221;myselfinfo()&#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;{{ url(&#8216;admin/loginout&#8217;) }}&#8221;&gt;退出&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  				&lt;/ul&gt;
</p>
<p>
  			&lt;/li&gt;
</p>
<p>
  				&lt;li id=&#8221;Hui-msg&#8221;&gt; &lt;a href=&#8221;#&#8221; title=&#8221;消息&#8221;&gt;&lt;span class=&#8221;badge badge-danger&#8221;&gt;1&lt;/span&gt;&lt;i class=&#8221;Hui-iconfont&#8221; style=&#8221;font-size:18px&#8221;&gt;&amp;#xe68a;&lt;/i&gt;&lt;/a&gt; &lt;/li&gt;
</p>
<p>
  				&lt;li id=&#8221;Hui-skin&#8221; class=&#8221;dropDown right dropDown_hover&#8221;&gt; &lt;a href=&#8221;javascript:;&#8221; class=&#8221;dropDown_A&#8221; title=&#8221;换肤&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221; style=&#8221;font-size:18px&#8221;&gt;&amp;#xe62a;&lt;/i&gt;&lt;/a&gt;
</p>
<p>
  					&lt;ul class=&#8221;dropDown-menu menu radius box-shadow&#8221;&gt;
</p>
<p>
  						&lt;li&gt;&lt;a href=&#8221;javascript:;&#8221; data-val=&#8221;default&#8221; title=&#8221;默认（黑色）&#8221;&gt;默认（黑色）&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  						&lt;li&gt;&lt;a href=&#8221;javascript:;&#8221; data-val=&#8221;blue&#8221; title=&#8221;蓝色&#8221;&gt;蓝色&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  						&lt;li&gt;&lt;a href=&#8221;javascript:;&#8221; data-val=&#8221;green&#8221; title=&#8221;绿色&#8221;&gt;绿色&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  						&lt;li&gt;&lt;a href=&#8221;javascript:;&#8221; data-val=&#8221;red&#8221; title=&#8221;红色&#8221;&gt;红色&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  						&lt;li&gt;&lt;a href=&#8221;javascript:;&#8221; data-val=&#8221;yellow&#8221; title=&#8221;黄色&#8221;&gt;黄色&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  						&lt;li&gt;&lt;a href=&#8221;javascript:;&#8221; data-val=&#8221;orange&#8221; title=&#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;/nav&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<p>
  &lt;/header&gt;
</p>
<p>
  &lt;aside class=&#8221;Hui-aside&#8221;&gt;
</p>
<p>
  	&lt;div class=&#8221;menu_dropdown bk_2&#8243;&gt;
</p>
<p>
  		<strong>&lt;dl id=&#8221;menu-article&#8221;&gt;</strong>
</p>
<p><strong>			&lt;dt&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe616;&lt;/i&gt;专业分类管理&lt;i class=&#8221;Hui-iconfont menu_dropdown-arrow&#8221;&gt;&amp;#xe6d5;&lt;/i&gt;&lt;/dt&gt;</strong>
</p>
<p><strong>			&lt;dd&gt;</strong>
</p>
<p><strong>				&lt;ul&gt;</strong>
</p>
<p><strong>					&lt;li&gt;&lt;a data-href=&#8221;{{ url(&#8216;admin/protype/index&#8217;) }}&#8221; data-title=&#8221;资讯管理&#8221; href=&#8221;javascript:void(0)&#8221;&gt;分类管理&lt;/a&gt;&lt;/li&gt;</strong>
</p>
<p><strong>					&lt;li&gt;&lt;a data-href=&#8221;{{ url(&#8216;admin/profession/index&#8217;) }}&#8221; data-title=&#8221;资讯管理&#8221; href=&#8221;javascript:void(0)&#8221;&gt;专业管理&lt;/a&gt;&lt;/li&gt;</strong>
</p>
<p><strong>			&lt;/ul&gt;</strong>
</p>
<p><strong>		&lt;/dd&gt;</strong>
</p>
<p><strong>	&lt;/dl&gt;</strong>
</p>
<p><strong>		&lt;dl id=&#8221;menu-product&#8221;&gt;</strong>
</p>
<p><strong>			&lt;dt&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe620;&lt;/i&gt;课程课时管理&lt;i class=&#8221;Hui-iconfont menu_dropdown-arrow&#8221;&gt;&amp;#xe6d5;&lt;/i&gt;&lt;/dt&gt;</strong>
</p>
<p><strong>			&lt;dd&gt;</strong>
</p>
<p><strong>				&lt;ul&gt;</strong>
</p>
<p><strong>					&lt;li&gt;&lt;a data-href=&#8221;{{ url(&#8216;admin/course/index&#8217;) }}&#8221; data-title=&#8221;课程管理&#8221; href=&#8221;javascript:void(0)&#8221;&gt;课程管理&lt;/a&gt;&lt;/li&gt;</strong>
</p>
<p><strong>					&lt;li&gt;&lt;a data-href=&#8221;{{ url(&#8216;admin/lesson/index&#8217;) }}&#8221; data-title=&#8221;课时管理&#8221; href=&#8221;javascript:void(0)&#8221;&gt;课时管理&lt;/a&gt;&lt;/li&gt;</strong>
</p>
<p><strong>			&lt;/ul&gt;</strong>
</p>
<p><strong>		&lt;/dd&gt;</strong>
</p>
<p><strong>	&lt;/dl&gt;</strong>
</p>
<p><strong>		&lt;dl id=&#8221;menu-admin&#8221;&gt;</strong>
</p>
<p><strong>			&lt;dt&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe62d;&lt;/i&gt;管理员管理&lt;i class=&#8221;Hui-iconfont menu_dropdown-arrow&#8221;&gt;&amp;#xe6d5;&lt;/i&gt;&lt;/dt&gt;</strong>
</p>
<p><strong>			&lt;dd&gt;</strong>
</p>
<p><strong>				&lt;ul&gt;</strong>
</p>
<p><strong>					&lt;li&gt;&lt;a data-href=&#8221;{{ url(&#8216;admin/role/index&#8217;) }}&#8221; data-title=&#8221;角色管理&#8221; href=&#8221;javascript:void(0)&#8221;&gt;角色管理&lt;/a&gt;&lt;/li&gt;</strong>
</p>
<p><strong>					&lt;li&gt;&lt;a data-href=&#8221;{{ url(&#8216;admin/auth/index&#8217;) }}&#8221; data-title=&#8221;权限管理&#8221; href=&#8221;javascript:void(0)&#8221;&gt;权限管理&lt;/a&gt;&lt;/li&gt;</strong>
</p>
<p><strong>					&lt;li&gt;&lt;a data-href=&#8221;{{ url(&#8216;admin/admin/index&#8217;) }}&#8221; data-title=&#8221;管理员列表&#8221; href=&#8221;javascript:void(0)&#8221;&gt;管理员列表&lt;/a&gt;&lt;/li&gt;</strong>
</p>
<p><strong>			&lt;/ul&gt;</strong>
</p>
<p><strong>		&lt;/dd&gt;</strong>
</p>
<p><strong>	&lt;/dl&gt;</strong>
</p>
<p>
  		&lt;dl id=&#8221;menu-picture&#8221;&gt;
</p>
<p>
  			&lt;dt&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe613;&lt;/i&gt; 图片管理&lt;i class=&#8221;Hui-iconfont menu_dropdown-arrow&#8221;&gt;&amp;#xe6d5;&lt;/i&gt;&lt;/dt&gt;
</p>
<p>
  			&lt;dd&gt;
</p>
<p>
  				&lt;ul&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;picture-list.html&#8221; data-title=&#8221;图片管理&#8221; href=&#8221;javascript:void(0)&#8221;&gt;图片管理&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  			&lt;/ul&gt;
</p>
<p>
  		&lt;/dd&gt;
</p>
<p>
  	&lt;/dl&gt;
</p>
<p>
  		&lt;dl id=&#8221;menu-comments&#8221;&gt;
</p>
<p>
  			&lt;dt&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe622;&lt;/i&gt; 评论管理&lt;i class=&#8221;Hui-iconfont menu_dropdown-arrow&#8221;&gt;&amp;#xe6d5;&lt;/i&gt;&lt;/dt&gt;
</p>
<p>
  			&lt;dd&gt;
</p>
<p>
  				&lt;ul&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;http://h-ui.duoshuo.com/admin/&#8221; data-title=&#8221;评论列表&#8221; href=&#8221;javascript:;&#8221;&gt;评论列表&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;feedback-list.html&#8221; data-title=&#8221;意见反馈&#8221; href=&#8221;javascript:void(0)&#8221;&gt;意见反馈&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  			&lt;/ul&gt;
</p>
<p>
  		&lt;/dd&gt;
</p>
<p>
  	&lt;/dl&gt;
</p>
<p>
  		&lt;dl id=&#8221;menu-member&#8221;&gt;
</p>
<p>
  			&lt;dt&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe60d;&lt;/i&gt; 会员管理&lt;i class=&#8221;Hui-iconfont menu_dropdown-arrow&#8221;&gt;&amp;#xe6d5;&lt;/i&gt;&lt;/dt&gt;
</p>
<p>
  			&lt;dd&gt;
</p>
<p>
  				&lt;ul&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;member-list.html&#8221; data-title=&#8221;会员列表&#8221; href=&#8221;javascript:;&#8221;&gt;会员列表&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;member-del.html&#8221; data-title=&#8221;删除的会员&#8221; href=&#8221;javascript:;&#8221;&gt;删除的会员&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;member-level.html&#8221; data-title=&#8221;等级管理&#8221; href=&#8221;javascript:;&#8221;&gt;等级管理&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;member-scoreoperation.html&#8221; data-title=&#8221;积分管理&#8221; href=&#8221;javascript:;&#8221;&gt;积分管理&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;member-record-browse.html&#8221; data-title=&#8221;浏览记录&#8221; href=&#8221;javascript:void(0)&#8221;&gt;浏览记录&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;member-record-download.html&#8221; data-title=&#8221;下载记录&#8221; href=&#8221;javascript:void(0)&#8221;&gt;下载记录&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;member-record-share.html&#8221; data-title=&#8221;分享记录&#8221; href=&#8221;javascript:void(0)&#8221;&gt;分享记录&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  			&lt;/ul&gt;
</p>
<p>
  		&lt;/dd&gt;
</p>
<p>
  	&lt;/dl&gt;
</p>
<p>
  		&lt;dl id=&#8221;menu-tongji&#8221;&gt;
</p>
<p>
  			&lt;dt&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe61a;&lt;/i&gt; 系统统计&lt;i class=&#8221;Hui-iconfont menu_dropdown-arrow&#8221;&gt;&amp;#xe6d5;&lt;/i&gt;&lt;/dt&gt;
</p>
<p>
  			&lt;dd&gt;
</p>
<p>
  				&lt;ul&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;charts-1.html&#8221; data-title=&#8221;折线图&#8221; href=&#8221;javascript:void(0)&#8221;&gt;折线图&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;charts-2.html&#8221; data-title=&#8221;时间轴折线图&#8221; href=&#8221;javascript:void(0)&#8221;&gt;时间轴折线图&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;charts-3.html&#8221; data-title=&#8221;区域图&#8221; href=&#8221;javascript:void(0)&#8221;&gt;区域图&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;charts-4.html&#8221; data-title=&#8221;柱状图&#8221; href=&#8221;javascript:void(0)&#8221;&gt;柱状图&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;charts-5.html&#8221; data-title=&#8221;饼状图&#8221; href=&#8221;javascript:void(0)&#8221;&gt;饼状图&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;charts-6.html&#8221; data-title=&#8221;3D柱状图&#8221; href=&#8221;javascript:void(0)&#8221;&gt;3D柱状图&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;charts-7.html&#8221; data-title=&#8221;3D饼状图&#8221; href=&#8221;javascript:void(0)&#8221;&gt;3D饼状图&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  			&lt;/ul&gt;
</p>
<p>
  		&lt;/dd&gt;
</p>
<p>
  	&lt;/dl&gt;
</p>
<p>
  		&lt;dl id=&#8221;menu-system&#8221;&gt;
</p>
<p>
  			&lt;dt&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe62e;&lt;/i&gt; 系统管理&lt;i class=&#8221;Hui-iconfont menu_dropdown-arrow&#8221;&gt;&amp;#xe6d5;&lt;/i&gt;&lt;/dt&gt;
</p>
<p>
  			&lt;dd&gt;
</p>
<p>
  				&lt;ul&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;system-base.html&#8221; data-title=&#8221;系统设置&#8221; href=&#8221;javascript:void(0)&#8221;&gt;系统设置&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;system-category.html&#8221; data-title=&#8221;栏目管理&#8221; href=&#8221;javascript:void(0)&#8221;&gt;栏目管理&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;system-data.html&#8221; data-title=&#8221;数据字典&#8221; href=&#8221;javascript:void(0)&#8221;&gt;数据字典&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;system-shielding.html&#8221; data-title=&#8221;屏蔽词&#8221; href=&#8221;javascript:void(0)&#8221;&gt;屏蔽词&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  					&lt;li&gt;&lt;a data-href=&#8221;system-log.html&#8221; data-title=&#8221;系统日志&#8221; href=&#8221;javascript:void(0)&#8221;&gt;系统日志&lt;/a&gt;&lt;/li&gt;
</p>
<p>
  			&lt;/ul&gt;
</p>
<p>
  		&lt;/dd&gt;
</p>
<p>
  	&lt;/dl&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<p>
  &lt;/aside&gt;
</p>
<p>
  &lt;div class=&#8221;dislpayArrow hidden-xs&#8221;&gt;&lt;a class=&#8221;pngfix&#8221; href=&#8221;javascript:void(0);&#8221; onClick=&#8221;displaynavbar(this)&#8221;&gt;&lt;/a&gt;&lt;/div&gt;
</p>
<p>
  &lt;section class=&#8221;Hui-article-box&#8221;&gt;
</p>
<p>
  	&lt;div id=&#8221;Hui-tabNav&#8221; class=&#8221;Hui-tabNav hidden-xs&#8221;&gt;
</p>
<p>
  		&lt;div class=&#8221;Hui-tabNav-wp&#8221;&gt;
</p>
<p>
  			&lt;ul id=&#8221;min_title_list&#8221; class=&#8221;acrossTab cl&#8221;&gt;
</p>
<p>
  				&lt;li class=&#8221;active&#8221;&gt;
</p>
<p>
  					&lt;span title=&#8221;我的桌面&#8221; data-href=&#8221;welcome.html&#8221;&gt;我的桌面&lt;/span&gt;
</p>
<p>
  					&lt;em&gt;&lt;/em&gt;&lt;/li&gt;
</p>
<p>
  		&lt;/ul&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  		&lt;div class=&#8221;Hui-tabNav-more btn-group&#8221;&gt;&lt;a id=&#8221;js-tabNav-prev&#8221; class=&#8221;btn radius btn-default size-S&#8221; href=&#8221;javascript:;&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6d4;&lt;/i&gt;&lt;/a&gt;&lt;a id=&#8221;js-tabNav-next&#8221; class=&#8221;btn radius btn-default size-S&#8221; href=&#8221;javascript:;&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6d7;&lt;/i&gt;&lt;/a&gt;&lt;/div&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<p>
  	&lt;div id=&#8221;iframe_box&#8221; class=&#8221;Hui-article&#8221;&gt;
</p>
<p>
  		&lt;div class=&#8221;show_iframe&#8221;&gt;
</p>
<p>
  			&lt;div style=&#8221;display:none&#8221; class=&#8221;loading&#8221;&gt;&lt;/div&gt;
</p>
<p>
  			&lt;iframe scrolling=&#8221;yes&#8221; frameborder=&#8221;0&#8243; src=&#8221;{{ url(&#8216;admin/index/welcome&#8217;) }}&#8221;&gt;&lt;/iframe&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<p>
  &lt;/section&gt;
</p>
<p>
  &lt;div class=&#8221;contextMenu&#8221; id=&#8221;Huiadminmenu&#8221;&gt;
</p>
<p>
  	&lt;ul&gt;
</p>
<p>
  		&lt;li id=&#8221;closethis&#8221;&gt;关闭当前 &lt;/li&gt;
</p>
<p>
  		&lt;li id=&#8221;closeall&#8221;&gt;关闭全部 &lt;/li&gt;
</p>
<p>
  &lt;/ul&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<p>
  &lt;!&#8211;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.contextmenu/jquery.contextmenu.r2.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  $(function(){
</p>
<p>
  	/*$(&#8220;#min_title_list li&#8221;).contextMenu(&#8216;Huiadminmenu&#8217;, {
</p>
<p>
  		bindings: {
</p>
<p>
  			&#8216;closethis&#8217;: function(t) {
</p>
<p>
  				console.log(t);
</p>
<p>
  				if(t.find(&#8220;i&#8221;)){
</p>
<p>
  					t.find(&#8220;i&#8221;).trigger(&#8220;click&#8221;);
</p>
<p>
  				}
</p>
<p>
  			},
</p>
<p>
  			&#8216;closeall&#8217;: function(t) {
</p>
<p>
  				alert(&#8216;Trigger was &#8216;+t.id+&#8217;\nAction was Email&#8217;);
</p>
<p>
  			},
</p>
<p>
  		}
</p>
<p>
  	});*/
</p>
<p>
  });
</p>
<p>
  /*个人信息*/
</p>
<p>
  function myselfinfo(){
</p>
<p>
  	layer.open({
</p>
<p>
  		type: 1,
</p>
<p>
  		area: [&#8216;300px&#8217;,&#8217;200px&#8217;],
</p>
<p>
  		fix: false, //不固定
</p>
<p>
  		maxmin: true,
</p>
<p>
  		shade:0.4,
</p>
<p>
  		title: &#8216;查看信息&#8217;,
</p>
<p>
  		content: &#8216;&lt;div&gt;管理员信息&lt;/div&gt;&#8217;
</p>
<p>
  	});
</p>
<p>
  }
</p>
<p>
  /*资讯-添加*/
</p>
<p>
  function article_add(title,url){
</p>
<p>
  	var index = layer.open({
</p>
<p>
  		type: 2,
</p>
<p>
  		title: title,
</p>
<p>
  		content: url
</p>
<p>
  	});
</p>
<p>
  	layer.full(index);
</p>
<p>
  }
</p>
<p>
  /*图片-添加*/
</p>
<p>
  function picture_add(title,url){
</p>
<p>
  	var index = layer.open({
</p>
<p>
  		type: 2,
</p>
<p>
  		title: title,
</p>
<p>
  		content: url
</p>
<p>
  	});
</p>
<p>
  	layer.full(index);
</p>
<p>
  }
</p>
<p>
  /*产品-添加*/
</p>
<p>
  function product_add(title,url){
</p>
<p>
  	var index = layer.open({
</p>
<p>
  		type: 2,
</p>
<p>
  		title: title,
</p>
<p>
  		content: url
</p>
<p>
  	});
</p>
<p>
  	layer.full(index);
</p>
<p>
  }
</p>
<p>
  /*用户-添加*/
</p>
<p>
  function member_add(title,url,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2>打开数据库，录入专业分类、专业、课程、课时的权限</h2>
<p>
  步骤1：
</p>
<p><img loading="lazy" decoding="async" width="809" height="535" src="/wp-content/uploads/2018/05/word-image-5400.png" class="wp-image-5940" srcset="/wp-content/uploads/2018/05/word-image-5400.png 809w, /wp-content/uploads/2018/05/word-image-5400-300x198.png 300w, /wp-content/uploads/2018/05/word-image-5400-768x508.png 768w" sizes="(max-width: 809px) 100vw, 809px" /></p>
<p>
  步骤2：打开后台分配权限
</p>
<p><img loading="lazy" decoding="async" width="1246" height="592" src="/wp-content/uploads/2018/05/word-image-5401.png" class="wp-image-5941" srcset="/wp-content/uploads/2018/05/word-image-5401.png 1246w, /wp-content/uploads/2018/05/word-image-5401-300x143.png 300w, /wp-content/uploads/2018/05/word-image-5401-768x365.png 768w, /wp-content/uploads/2018/05/word-image-5401-1024x487.png 1024w" sizes="(max-width: 1246px) 100vw, 1246px" /></p>
<p>
  步骤3：开启路由权限验证
</p>
<p><img loading="lazy" decoding="async" width="1032" height="384" src="/wp-content/uploads/2018/05/word-image-5402.png" class="wp-image-5942" srcset="/wp-content/uploads/2018/05/word-image-5402.png 1032w, /wp-content/uploads/2018/05/word-image-5402-300x112.png 300w, /wp-content/uploads/2018/05/word-image-5402-768x286.png 768w, /wp-content/uploads/2018/05/word-image-5402-1024x381.png 1024w" sizes="(max-width: 1032px) 100vw, 1032px" /></p>
<h1><a id="post-5892-_Toc487817429"></a>︴作业</h1>
<p>
  1）实现今天的代码；
</p>
<p>
  2）完善RBAC三部分管理模块的后续CURD操作；</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/5892.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Laravel在线教育平台（四）直播、七牛云、OBS、直播流管理、直播课程管理、首页直播、在线观看</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/5812.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/5812.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 15:42:11 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Laravel在线教育平台]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[OBS]]></category>
		<category><![CDATA[七牛云]]></category>
		<category><![CDATA[在线观看]]></category>
		<category><![CDATA[直播]]></category>
		<category><![CDATA[直播流管理]]></category>
		<category><![CDATA[直播课程管理]]></category>
		<category><![CDATA[首页直播]]></category>
		<guid isPermaLink="false">/?p=5812</guid>

					<description><![CDATA[Laravel框架实战-在线教育平台（4） 一、直播介绍【★★★】 1、术语介绍 直播：实时播放某个画面（国内 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1><a id="post-5812-_Toc488249285"></a>Laravel框架实战-在线教育平台（4）</h1>
<h1><a id="post-5812-_Toc488249288"></a>一、直播介绍【★★★】</h1>
<h2><a id="post-5812-_Toc488249289"></a>1、术语介绍</h2>
<p>
  直播：实时播放某个画面（国内最大的有yy、战旗、斗鱼tv、龙珠等）
</p>
<p>
  点播：类似于重播，编辑好的视频，观众可以重任意时间段观看（优酷、土豆、爱奇艺等）
</p>
<p>
  直播流：也可以称之为数据流，就是直播中的视频画面数据
</p>
<p>
  七牛：目前比较大的云数据服务公司
</p>
<h2>直播和点播实现原理</h2>
<h3>1）概括</h3>
<p>
  步骤1：采集视频画面数据，通过摄像机、手机、录屏软件等设备。
</p>
<p>
  步骤2：用户打开视频播放器拉去视频中的数据播放
</p>
<p>
  思考：直播和点播步骤1和步骤2的区别
</p>
<p>
  回答：直播必须实时采集视频画面数据、点播是提前录制
</p>
<h3>直播流程详细说明</h3>
<ul>
<li>
    直播<strong>推流</strong>（push）：指视频画面数据，从采集点到服务器的过程。
  </li>
<li>
    直播<strong>拉流</strong>（pull）：指视频画面数据，从服务器到观众的过程。
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="676" height="209" src="/wp-content/uploads/2018/05/word-image-5275.png" class="wp-image-5813" srcset="/wp-content/uploads/2018/05/word-image-5275.png 676w, /wp-content/uploads/2018/05/word-image-5275-300x93.png 300w" sizes="(max-width: 676px) 100vw, 676px" /><br />
<img loading="lazy" decoding="async" width="801" height="184" src="/wp-content/uploads/2018/05/word-image-5276.png" class="wp-image-5814" srcset="/wp-content/uploads/2018/05/word-image-5276.png 801w, /wp-content/uploads/2018/05/word-image-5276-300x69.png 300w, /wp-content/uploads/2018/05/word-image-5276-768x176.png 768w" sizes="(max-width: 801px) 100vw, 801px" /></p>
<h1>直播初体验</h1>
<h2>1、申请直播云服务步骤</h2>
<h3>1）注册并登陆七牛云</h3>
<ul>
<li>
    官网网址：<a href="https://www.qiniu.com/">https://www.qiniu.com/</a>
  </li>
<li>
    步骤
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="834" height="468" src="/wp-content/uploads/2018/05/word-image-5277.png" class="wp-image-5815" srcset="/wp-content/uploads/2018/05/word-image-5277.png 834w, /wp-content/uploads/2018/05/word-image-5277-300x168.png 300w, /wp-content/uploads/2018/05/word-image-5277-768x431.png 768w" sizes="(max-width: 834px) 100vw, 834px" /><br />
<img loading="lazy" decoding="async" width="908" height="562" src="/wp-content/uploads/2018/05/word-image-5278.png" class="wp-image-5816" srcset="/wp-content/uploads/2018/05/word-image-5278.png 908w, /wp-content/uploads/2018/05/word-image-5278-300x186.png 300w, /wp-content/uploads/2018/05/word-image-5278-768x475.png 768w" sizes="(max-width: 908px) 100vw, 908px" /></p>
<h3>2）申请直播云服务，填写如下信息</h3>
<p><img loading="lazy" decoding="async" width="1074" height="513" src="/wp-content/uploads/2018/05/word-image-5279.png" class="wp-image-5817" srcset="/wp-content/uploads/2018/05/word-image-5279.png 1074w, /wp-content/uploads/2018/05/word-image-5279-300x143.png 300w, /wp-content/uploads/2018/05/word-image-5279-768x367.png 768w, /wp-content/uploads/2018/05/word-image-5279-1024x489.png 1024w" sizes="(max-width: 1074px) 100vw, 1074px" /></p>
<h3><a id="post-5812-_Toc488249290"></a>3）填写完成后，要等待审核（目前：1~3个工作日）</h3>
<p><img loading="lazy" decoding="async" width="762" height="289" src="/wp-content/uploads/2018/05/word-image-5280.png" class="wp-image-5818" srcset="/wp-content/uploads/2018/05/word-image-5280.png 762w, /wp-content/uploads/2018/05/word-image-5280-300x114.png 300w" sizes="(max-width: 762px) 100vw, 762px" /></p>
<h3>4）审核通过后，重新选择‘立即添加’直播云服务</h3>
<p><img loading="lazy" decoding="async" width="860" height="494" src="/wp-content/uploads/2018/05/word-image-5281.png" class="wp-image-5819" srcset="/wp-content/uploads/2018/05/word-image-5281.png 860w, /wp-content/uploads/2018/05/word-image-5281-300x172.png 300w, /wp-content/uploads/2018/05/word-image-5281-768x441.png 768w" sizes="(max-width: 860px) 100vw, 860px" /><br />
<img loading="lazy" decoding="async" width="821" height="595" src="/wp-content/uploads/2018/05/word-image-5282.png" class="wp-image-5820" srcset="/wp-content/uploads/2018/05/word-image-5282.png 821w, /wp-content/uploads/2018/05/word-image-5282-300x217.png 300w, /wp-content/uploads/2018/05/word-image-5282-768x557.png 768w" sizes="(max-width: 821px) 100vw, 821px" /></p>
<h2>直播云服务管理</h2>
<h3>1）介绍</h3>
<p>
  直播空间（1）   对应   ‘直播流’（n）
</p>
<p>
  ‘直播流’（1）    对应     直播项目（1）
</p>
<h3>2）直播空间管理</h3>
<ul>
<li>
    创建空间
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1304" height="637" src="/wp-content/uploads/2018/05/word-image-5283.png" class="wp-image-5821" srcset="/wp-content/uploads/2018/05/word-image-5283.png 1304w, /wp-content/uploads/2018/05/word-image-5283-300x147.png 300w, /wp-content/uploads/2018/05/word-image-5283-768x375.png 768w, /wp-content/uploads/2018/05/word-image-5283-1024x500.png 1024w" sizes="(max-width: 1304px) 100vw, 1304px" /><br />
<img loading="lazy" decoding="async" width="1312" height="629" src="/wp-content/uploads/2018/05/word-image-5284.png" class="wp-image-5822" srcset="/wp-content/uploads/2018/05/word-image-5284.png 1312w, /wp-content/uploads/2018/05/word-image-5284-300x144.png 300w, /wp-content/uploads/2018/05/word-image-5284-768x368.png 768w, /wp-content/uploads/2018/05/word-image-5284-1024x491.png 1024w" sizes="(max-width: 1312px) 100vw, 1312px" /><br />
<img loading="lazy" decoding="async" width="1327" height="587" src="/wp-content/uploads/2018/05/word-image-5285.png" class="wp-image-5823" srcset="/wp-content/uploads/2018/05/word-image-5285.png 1327w, /wp-content/uploads/2018/05/word-image-5285-300x133.png 300w, /wp-content/uploads/2018/05/word-image-5285-768x340.png 768w, /wp-content/uploads/2018/05/word-image-5285-1024x453.png 1024w" sizes="(max-width: 1327px) 100vw, 1327px" /><br />
<img loading="lazy" decoding="async" width="1324" height="588" src="/wp-content/uploads/2018/05/word-image-5286.png" class="wp-image-5824" srcset="/wp-content/uploads/2018/05/word-image-5286.png 1324w, /wp-content/uploads/2018/05/word-image-5286-300x133.png 300w, /wp-content/uploads/2018/05/word-image-5286-768x341.png 768w, /wp-content/uploads/2018/05/word-image-5286-1024x455.png 1024w" sizes="(max-width: 1324px) 100vw, 1324px" /><br />
<img loading="lazy" decoding="async" width="1228" height="616" src="/wp-content/uploads/2018/05/word-image-5287.png" class="wp-image-5825" srcset="/wp-content/uploads/2018/05/word-image-5287.png 1228w, /wp-content/uploads/2018/05/word-image-5287-300x150.png 300w, /wp-content/uploads/2018/05/word-image-5287-768x385.png 768w, /wp-content/uploads/2018/05/word-image-5287-1024x514.png 1024w" sizes="(max-width: 1228px) 100vw, 1228px" /></p>
<p>
  域名解析操作
</p>
<p><img loading="lazy" decoding="async" width="698" height="520" src="/wp-content/uploads/2018/05/word-image-5288.png" class="wp-image-5826" srcset="/wp-content/uploads/2018/05/word-image-5288.png 698w, /wp-content/uploads/2018/05/word-image-5288-300x223.png 300w" sizes="(max-width: 698px) 100vw, 698px" /><br />
<img loading="lazy" decoding="async" width="1158" height="402" src="/wp-content/uploads/2018/05/word-image-5289.png" class="wp-image-5827" srcset="/wp-content/uploads/2018/05/word-image-5289.png 1158w, /wp-content/uploads/2018/05/word-image-5289-300x104.png 300w, /wp-content/uploads/2018/05/word-image-5289-768x267.png 768w, /wp-content/uploads/2018/05/word-image-5289-1024x355.png 1024w" sizes="(max-width: 1158px) 100vw, 1158px" /></p>
<p>
  设置推流地址
</p>
<p><img loading="lazy" decoding="async" width="1348" height="595" src="/wp-content/uploads/2018/05/word-image-5290.png" class="wp-image-5828" srcset="/wp-content/uploads/2018/05/word-image-5290.png 1348w, /wp-content/uploads/2018/05/word-image-5290-300x132.png 300w, /wp-content/uploads/2018/05/word-image-5290-768x339.png 768w, /wp-content/uploads/2018/05/word-image-5290-1024x452.png 1024w" sizes="(max-width: 1348px) 100vw, 1348px" /></p>
<p>
  设置拉流地址
</p>
<p><img loading="lazy" decoding="async" width="1328" height="487" src="/wp-content/uploads/2018/05/word-image-5291.png" class="wp-image-5829" srcset="/wp-content/uploads/2018/05/word-image-5291.png 1328w, /wp-content/uploads/2018/05/word-image-5291-300x110.png 300w, /wp-content/uploads/2018/05/word-image-5291-768x282.png 768w, /wp-content/uploads/2018/05/word-image-5291-1024x376.png 1024w" sizes="(max-width: 1328px) 100vw, 1328px" /><br />
<img loading="lazy" decoding="async" width="1086" height="439" src="/wp-content/uploads/2018/05/word-image-5292.png" class="wp-image-5830" srcset="/wp-content/uploads/2018/05/word-image-5292.png 1086w, /wp-content/uploads/2018/05/word-image-5292-300x121.png 300w, /wp-content/uploads/2018/05/word-image-5292-768x310.png 768w, /wp-content/uploads/2018/05/word-image-5292-1024x414.png 1024w" sizes="(max-width: 1086px) 100vw, 1086px" /></p>
<ul>
<li>
    删除空间（慎用）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="790" height="582" src="/wp-content/uploads/2018/05/word-image-5293.png" class="wp-image-5831" srcset="/wp-content/uploads/2018/05/word-image-5293.png 790w, /wp-content/uploads/2018/05/word-image-5293-300x221.png 300w, /wp-content/uploads/2018/05/word-image-5293-768x566.png 768w" sizes="(max-width: 790px) 100vw, 790px" /><br />
<img loading="lazy" decoding="async" width="925" height="598" src="/wp-content/uploads/2018/05/word-image-5294.png" class="wp-image-5832" srcset="/wp-content/uploads/2018/05/word-image-5294.png 925w, /wp-content/uploads/2018/05/word-image-5294-300x194.png 300w, /wp-content/uploads/2018/05/word-image-5294-768x497.png 768w" sizes="(max-width: 925px) 100vw, 925px" /></p>
<h3>3）直播空间-直播流管理</h3>
<p><img loading="lazy" decoding="async" width="980" height="402" src="/wp-content/uploads/2018/05/word-image-5295.png" class="wp-image-5833" srcset="/wp-content/uploads/2018/05/word-image-5295.png 980w, /wp-content/uploads/2018/05/word-image-5295-300x123.png 300w, /wp-content/uploads/2018/05/word-image-5295-768x315.png 768w" sizes="(max-width: 980px) 100vw, 980px" /><br />
<img loading="lazy" decoding="async" width="1253" height="333" src="/wp-content/uploads/2018/05/word-image-5296.png" class="wp-image-5834" srcset="/wp-content/uploads/2018/05/word-image-5296.png 1253w, /wp-content/uploads/2018/05/word-image-5296-300x80.png 300w, /wp-content/uploads/2018/05/word-image-5296-768x204.png 768w, /wp-content/uploads/2018/05/word-image-5296-1024x272.png 1024w" sizes="(max-width: 1253px) 100vw, 1253px" /><br />
<img loading="lazy" decoding="async" width="1260" height="604" src="/wp-content/uploads/2018/05/word-image-5297.png" class="wp-image-5835" srcset="/wp-content/uploads/2018/05/word-image-5297.png 1260w, /wp-content/uploads/2018/05/word-image-5297-300x144.png 300w, /wp-content/uploads/2018/05/word-image-5297-768x368.png 768w, /wp-content/uploads/2018/05/word-image-5297-1024x491.png 1024w" sizes="(max-width: 1260px) 100vw, 1260px" /></p>
<h2>初体验（一套直播实现流程）</h2>
<h3>【推流】使用OBS软件获将幕、摄像头等数据推送到七牛云</h3>
<ul>
<li>
    步骤1：打开OBS软件官网：<a href="http://www.obsapp.net/">http://www.obsapp.net/</a>
  </li>
<li>
    步骤2：下载并安装（注：安装就是傻瓜式下一步即可）
  </li>
<li>
    步骤3：设置使用获取屏幕数据或者摄像头数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="909" height="676" src="/wp-content/uploads/2018/05/word-image-5298.png" class="wp-image-5836" srcset="/wp-content/uploads/2018/05/word-image-5298.png 909w, /wp-content/uploads/2018/05/word-image-5298-300x223.png 300w, /wp-content/uploads/2018/05/word-image-5298-768x571.png 768w" sizes="(max-width: 909px) 100vw, 909px" /><br />
<img loading="lazy" decoding="async" width="658" height="547" src="/wp-content/uploads/2018/05/word-image-5299.png" class="wp-image-5837" srcset="/wp-content/uploads/2018/05/word-image-5299.png 658w, /wp-content/uploads/2018/05/word-image-5299-300x249.png 300w" sizes="(max-width: 658px) 100vw, 658px" /></p>
<ul>
<li>
    步骤4：继续设置，将通过OBS软件获取的屏幕或摄像头等数据
  </li>
</ul>
<p>
  内容推送到七牛云
</p>
<ol>
<li>
  获取推送地址
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1231" height="454" src="/wp-content/uploads/2018/05/word-image-5300.png" class="wp-image-5838" srcset="/wp-content/uploads/2018/05/word-image-5300.png 1231w, /wp-content/uploads/2018/05/word-image-5300-300x111.png 300w, /wp-content/uploads/2018/05/word-image-5300-768x283.png 768w, /wp-content/uploads/2018/05/word-image-5300-1024x378.png 1024w" sizes="(max-width: 1231px) 100vw, 1231px" /></p>
<p>
  2）打开软件设置推送地址
</p>
<p><img loading="lazy" decoding="async" width="227" height="256" src="/wp-content/uploads/2018/05/word-image-5301.png" class="wp-image-5839" /><br />
<img loading="lazy" decoding="async" width="1136" height="711" src="/wp-content/uploads/2018/05/word-image-5302.png" class="wp-image-5840" srcset="/wp-content/uploads/2018/05/word-image-5302.png 1136w, /wp-content/uploads/2018/05/word-image-5302-300x188.png 300w, /wp-content/uploads/2018/05/word-image-5302-768x481.png 768w, /wp-content/uploads/2018/05/word-image-5302-1024x641.png 1024w" sizes="(max-width: 1136px) 100vw, 1136px" /><br />
<img loading="lazy" decoding="async" width="1365" height="572" src="/wp-content/uploads/2018/05/word-image-5303.png" class="wp-image-5841" srcset="/wp-content/uploads/2018/05/word-image-5303.png 1365w, /wp-content/uploads/2018/05/word-image-5303-300x126.png 300w, /wp-content/uploads/2018/05/word-image-5303-768x322.png 768w, /wp-content/uploads/2018/05/word-image-5303-1024x429.png 1024w" sizes="(max-width: 1365px) 100vw, 1365px" /></p>
<p><strong>rtmp://pili-publish.php12.sk-school.com/201801140001/test2?e=1515897779&amp;token=RlWO59USAL86QtQ4LhYFWsAGjLZEYbgD5H9_Fhob:8_jLY7p5M34epelW0oKP66WBZ40=</strong>
</p>
<p><strong>红色填入：URL</strong>
</p>
<p><strong>绿色填入：流秘钥</strong>
</p>
<p>
  多学一招：OBS就是一个软件，作用就是推送直播所需画面数据）
</p>
<h3>【拉流1】flash方式播放【直播】</h3>
<p>
  &lt;!DOCTYPE html&gt;
</p>
<p>
  &lt;html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221;&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=utf-8&#8243; /&gt;
</p>
<p>
  &lt;title&gt;ckplayer简单调用演示&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;div id=&#8221;a1&#8243;&gt;&lt;/div&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;ckplayer/ckplayer.js&#8221; charset=&#8221;utf-8&#8243;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  	var flashvars={
</p>
<p>
  		f:&#8217;<strong>rtmp://pili-live-rtmp.php12.sk-school.com/201801140001/test2?sign=930b44c2efd1e384e3dfc8a6aee6035c&amp;t=5a5aba5d</strong>&#8216;,
</p>
<p>
  		c:0,
</p>
<p>
  		b:1,
</p>
<p>
  		i:&#8217;http://www.ckplayer.com/static/images/cqdw.jpg&#8217;
</p>
<p>
  		};
</p>
<p>
  	var video=[&#8216;http://img.ksbbs.com/asset/Mon_1605/0ec8cc80112a2d6.mp4-&gt;video/mp4&#8217;];
</p>
<p>
  	CKobject.embed(&#8216;ckplayer/ckplayer.swf&#8217;,&#8217;a1&#8242;,&#8217;ckplayer_a1&#8242;,&#8217;600&#8242;,&#8217;400&#8242;,false,flashvars,video)
</p>
<p>
  	function closelights(){//关灯
</p>
<p>
  		alert(&#8216; 本演示不支持开关灯&#8217;);
</p>
<p>
  	}
</p>
<p>
  	function openlights(){//开灯
</p>
<p>
  		alert(&#8216; 本演示不支持开关灯&#8217;);
</p>
<p>
  	}
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h3>【拉流2】html5方式播放【√】</h3>
<p>
  仓库地址：<a href="https://github.com/huangyaoxin/hLive">https://github.com/huangyaoxin/hLive</a>
</p>
<p>
  &lt;!DOCTYPE html&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=utf-8 /&gt;
</p>
<p>
  &lt;title&gt;fz-live&lt;/title&gt;
</p>
<p>
    &lt;link href=&#8221;./css/video.css&#8221; rel=&#8221;stylesheet&#8221;&gt;
</p>
<p>
    &lt;script src=&#8221;./js/video.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
    &lt;script src=&#8221;./js/videojs-live.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
    &lt;video id=&#8221;my_video_1&#8243; class=&#8221;video-js vjs-default-skin&#8221; controls preload=&#8221;auto&#8221; width=&#8221;1000&#8243; height=&#8221;500&#8243;
</p>
<p>
    data-setup='{}&#8217;&gt;
</p>
<p>
      &lt;source src=&#8221;http://pili-live-hls.php12.sk-school.com/201801140001/test2.m3u8?sign=2f34f36a8c32f69a87559da2dfd1e3e4&amp;t=5a5ac230&#8243; type=&#8221;application/x-mpegURL&#8221;&gt;
</p>
<p>
    &lt;/video&gt;
</p>
</p>
<p>
    &lt;script&gt;
</p>
<p>
    &lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2>︴扩展</h2>
<p>
  手机APP开发直播功能相关文档
</p>
<ul>
<li><a href="https://www.apicloud.com/mod_detail/45964">https://www.apicloud.com/mod_detail/45964</a>
  </li>
<li><a href="https://docs.apicloud.com/Client-API/Open-SDK/qiniuLive">https://docs.apicloud.com/Client-API/Open-SDK/qiniuLive</a>
  </li>
</ul>
<h1>三、直播流管理（在线教育后台）</h1>
<h2>1、准备</h2>
<h3>1）直播流表</h3>
<p><strong>后台直播流表</strong>
</p>
<table>
<tr>
<td>
<p><strong>表名</strong>
</p>
</td>
<td colspan="6">
<p>
  stream
</p>
</td>
</tr>
<tr>
<td>
<p><strong>序号</strong>
</p>
</td>
<td>
<p><strong>字段</strong>
</p>
</td>
<td>
<p><strong>类型</strong>
</p>
</td>
<td>
<p><strong>说明</strong>
</p>
</td>
<td>
<p><strong>空</strong>
</p>
</td>
<td>
<p><strong>默认值</strong>
</p>
</td>
<td>
<p><strong>主键</strong>
</p>
</td>
</tr>
<tr>
<td>
<p>
  1
</p>
</td>
<td>
<p>
  id
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  自增主键
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  N/A
</p>
</td>
<td>
<p>
  是
</p>
</td>
</tr>
<tr>
<td>
<p>
  2
</p>
</td>
<td>
<p>
  stream _name
</p>
</td>
<td>
<p>
  varchar(200)
</p>
</td>
<td>
<p>
  直播流名称
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  3
</p>
</td>
<td>
<p>
  state
</p>
</td>
<td>
<p>
  tinyint
</p>
</td>
<td>
<p>
  直播流状态：1=正常，2=永久禁播，3=限时禁播
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  正常
</p>
</td>
<td></td>
</tr>
<tr>
<td>
<p>
  4
</p>
</td>
<td>
<p>
  created_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  创建于
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
<tr>
<td>
<p>
  5
</p>
</td>
<td>
<p>
  update_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  更新于
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
</table>
<p>
  步骤1：创建迁移文件并书写
</p>
<p>
  步骤2：执行迁移文件
</p>
<p><img loading="lazy" decoding="async" width="1167" height="599" src="/wp-content/uploads/2018/05/word-image-5304.png" class="wp-image-5842" srcset="/wp-content/uploads/2018/05/word-image-5304.png 1167w, /wp-content/uploads/2018/05/word-image-5304-300x154.png 300w, /wp-content/uploads/2018/05/word-image-5304-768x394.png 768w, /wp-content/uploads/2018/05/word-image-5304-1024x526.png 1024w" sizes="(max-width: 1167px) 100vw, 1167px" /></p>
<p>
  Schema::create(&#8216;stream&#8217;, function (Blueprint $table) {
</p>
<p>
      $table-&gt;increments(&#8216;id&#8217;);
</p>
<p>
      $table-&gt;string(&#8216;stream_name&#8217;)-&gt;comment(&#8216;直播流名称&#8217;);
</p>
<p>
      $table-&gt;unsignedTinyInteger(&#8216;state&#8217;)-&gt;default(1)-&gt;comment(&#8216;直播流状态:1-正常,2-永久禁播,3-限时禁播&#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>
  });
</p>
<p><img loading="lazy" decoding="async" width="739" height="312" src="/wp-content/uploads/2018/05/word-image-5305.png" class="wp-image-5843" srcset="/wp-content/uploads/2018/05/word-image-5305.png 739w, /wp-content/uploads/2018/05/word-image-5305-300x127.png 300w" sizes="(max-width: 739px) 100vw, 739px" /></p>
<h3>模型</h3>
<p><img loading="lazy" decoding="async" width="1109" height="586" src="/wp-content/uploads/2018/05/word-image-5306.png" class="wp-image-5844" srcset="/wp-content/uploads/2018/05/word-image-5306.png 1109w, /wp-content/uploads/2018/05/word-image-5306-300x159.png 300w, /wp-content/uploads/2018/05/word-image-5306-768x406.png 768w, /wp-content/uploads/2018/05/word-image-5306-1024x541.png 1024w" sizes="(max-width: 1109px) 100vw, 1109px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Model;
</p>
<p>
  use Illuminate\Database\Eloquent\Model;
</p>
<p>
  class Stream extends Model
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * 声明表名（注：laravel会自动加s所以自己声明覆盖）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $table = &#8216;stream&#8217;;
</p>
<p>
      /**
</p>
<p>
       * Unix时间戳形式填充创建于和更新于（注：模型默认托管时间但是是datetime类型）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $dateFormat = &#8216;U&#8217;;
</p>
<p>
      /**
</p>
<p>
       * 声明可批量设置的属性（注：当使用create静态方式时）
</p>
<p>
       * @var array
</p>
<p>
       */
</p>
<p>
      protected $fillable = [&#8216;stream_name&#8217;, &#8216;state&#8217;];
</p>
<p>
  }
</p>
<h3>更改后台菜单</h3>
<p><img loading="lazy" decoding="async" width="1335" height="491" src="/wp-content/uploads/2018/05/word-image-5307.png" class="wp-image-5845" srcset="/wp-content/uploads/2018/05/word-image-5307.png 1335w, /wp-content/uploads/2018/05/word-image-5307-300x110.png 300w, /wp-content/uploads/2018/05/word-image-5307-768x282.png 768w, /wp-content/uploads/2018/05/word-image-5307-1024x377.png 1024w" sizes="(max-width: 1335px) 100vw, 1335px" /></p>
<h2>2、列表功能</h2>
<h3>1）加载视图</h3>
<p>
  步骤1：路由
</p>
<p><img loading="lazy" decoding="async" width="992" height="138" src="/wp-content/uploads/2018/05/word-image-5308.png" class="wp-image-5846" srcset="/wp-content/uploads/2018/05/word-image-5308.png 992w, /wp-content/uploads/2018/05/word-image-5308-300x42.png 300w, /wp-content/uploads/2018/05/word-image-5308-768x107.png 768w" sizes="(max-width: 992px) 100vw, 992px" /></p>
<p>
  步骤2：创建控制器方法并加载视图
</p>
<p><img loading="lazy" decoding="async" width="866" height="509" src="/wp-content/uploads/2018/05/word-image-5309.png" class="wp-image-5847" srcset="/wp-content/uploads/2018/05/word-image-5309.png 866w, /wp-content/uploads/2018/05/word-image-5309-300x176.png 300w, /wp-content/uploads/2018/05/word-image-5309-768x451.png 768w" sizes="(max-width: 866px) 100vw, 866px" /></p>
<p>
  步骤3：创建视图
</p>
<p><img loading="lazy" decoding="async" width="1057" height="638" src="/wp-content/uploads/2018/05/word-image-5310.png" class="wp-image-5848" srcset="/wp-content/uploads/2018/05/word-image-5310.png 1057w, /wp-content/uploads/2018/05/word-image-5310-300x181.png 300w, /wp-content/uploads/2018/05/word-image-5310-768x464.png 768w, /wp-content/uploads/2018/05/word-image-5310-1024x618.png 1024w" sizes="(max-width: 1057px) 100vw, 1057px" /></p>
<h3>2）数据处理</h3>
<ul>
<li>
    步骤1：控制器方法调用模型查询所有数据并分页，传递给视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1015" height="501" src="/wp-content/uploads/2018/05/word-image-5311.png" class="wp-image-5849" srcset="/wp-content/uploads/2018/05/word-image-5311.png 1015w, /wp-content/uploads/2018/05/word-image-5311-300x148.png 300w, /wp-content/uploads/2018/05/word-image-5311-768x379.png 768w" sizes="(max-width: 1015px) 100vw, 1015px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use App\Http\Model\Stream;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class StreamController extends Controller
</p>
<p>
  {
</p>
<p>
      //列表
</p>
<p>
      public function index()
</p>
<p>
      {
</p>
<p>
      	//1.分页获取数据
</p>
<p>
      	$streams = Stream::orderBy(&#8216;id&#8217;, &#8216;desc&#8217;)-&gt;paginate(8);
</p>
<p>
      	//2.加载视图并传递数据
</p>
<p>
          return view(&#8216;admin.stream.index&#8217;, compact(&#8216;streams&#8217;));
</p>
<p>
      }
</p>
<p>
  }
</p>
<ul>
<li>
    步骤2：视图循环显示即可
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="934" height="525" src="/wp-content/uploads/2018/05/word-image-5312.png" class="wp-image-5850" srcset="/wp-content/uploads/2018/05/word-image-5312.png 934w, /wp-content/uploads/2018/05/word-image-5312-300x169.png 300w, /wp-content/uploads/2018/05/word-image-5312-768x432.png 768w" sizes="(max-width: 934px) 100vw, 934px" /><br />
<img loading="lazy" decoding="async" width="1202" height="303" src="/wp-content/uploads/2018/05/word-image-5313.png" class="wp-image-5851" srcset="/wp-content/uploads/2018/05/word-image-5313.png 1202w, /wp-content/uploads/2018/05/word-image-5313-300x76.png 300w, /wp-content/uploads/2018/05/word-image-5313-768x194.png 768w, /wp-content/uploads/2018/05/word-image-5313-1024x258.png 1024w" sizes="(max-width: 1202px) 100vw, 1202px" /></p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;title&gt;直播流管理&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;nav class=&#8221;breadcrumb&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe67f;&lt;/i&gt; 首页 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 管理员管理 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 直播流管理 &lt;a class=&#8221;btn btn-success radius r&#8221; style=&#8221;line-height:1.6em;margin-top:3px&#8221; href=&#8221;javascript:location.replace(location.href);&#8221; title=&#8221;刷新&#8221; &gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe68f;&lt;/i&gt;&lt;/a&gt;&lt;/nav&gt;
</p>
<p>
  &lt;div class=&#8221;page-container&#8221;&gt;
</p>
<p>
  	&lt;div class=&#8221;text-c&#8221;&gt;
</p>
<p>
  		&lt;form class=&#8221;Huiform&#8221; method=&#8221;post&#8221; action=&#8221;&#8221; target=&#8221;_self&#8221;&gt;
</p>
<p>
  			&lt;input type=&#8221;text&#8221; class=&#8221;input-text&#8221; style=&#8221;width:250px&#8221; placeholder=&#8221;直播流名称&#8221; id=&#8221;&#8221; name=&#8221;&#8221;&gt;
</p>
<p>
  			&lt;button type=&#8221;submit&#8221; class=&#8221;btn btn-success&#8221; id=&#8221;&#8221; name=&#8221;&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe665;&lt;/i&gt; 搜直播流节点&lt;/button&gt;
</p>
<p>
  		&lt;/form&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;cl pd-5 bg-1 bk-gray mt-20&#8243;&gt;
</p>
<p>
  		&lt;span class=&#8221;l&#8221;&gt;
</p>
<p>
  			&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;datadel()&#8221; class=&#8221;btn btn-danger radius&#8221;&gt;
</p>
<p>
  				&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt; 批量删除
</p>
<p>
  			&lt;/a&gt;
</p>
<p>
  			&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_add(&#8216;添加直播流节点&#8217;,'{{ url(&#8216;admin/stream/add&#8217;) }}&#8217;,&#8221;,&#8217;310&#8242;)&#8221; class=&#8221;btn btn-primary radius&#8221;&gt;
</p>
<p>
  				&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe600;&lt;/i&gt; 添加直播流节点
</p>
<p>
  			&lt;/a&gt;
</p>
<p>
  		&lt;/span&gt;
</p>
<p>
  		&lt;span class=&#8221;r&#8221;&gt;共有数据：&lt;strong&gt;54&lt;/strong&gt; 条&lt;/span&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;table class=&#8221;table table-border table-bordered table-bg&#8221;&gt;
</p>
<p>
  		&lt;thead&gt;
</p>
<p>
  			&lt;tr&gt;
</p>
<p>
  				&lt;th scope=&#8221;col&#8221; colspan=&#8221;6&#8243;&gt;直播流节点&lt;/th&gt;
</p>
<p>
  			&lt;/tr&gt;
</p>
<p>
  			&lt;tr class=&#8221;text-c&#8221;&gt;
</p>
<p>
  				&lt;th width=&#8221;25&#8243;&gt;&lt;input type=&#8221;checkbox&#8221; name=&#8221;&#8221; value=&#8221;&#8221;&gt;&lt;/th&gt;
</p>
<p>
  				&lt;th width=&#8221;40&#8243;&gt;ID&lt;/th&gt;
</p>
<p>
  				&lt;th width=&#8221;200&#8243;&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;100&#8243;&gt;操作&lt;/th&gt;
</p>
<p>
  			&lt;/tr&gt;
</p>
<p>
  		&lt;/thead&gt;
</p>
<p>
  		&lt;tbody&gt;
</p>
<p>
  			@foreach ($streams as $stream)
</p>
<p>
  			&lt;tr class=&#8221;text-c&#8221;&gt;
</p>
<p>
  				&lt;td&gt;&lt;input type=&#8221;checkbox&#8221; value=&#8221;1&#8243; name=&#8221;&#8221;&gt;&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;{{ $stream-&gt;id }}&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;{{ $stream-&gt;stream_name }}&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;
</p>
<p>
  					@if($stream-&gt;state == 1)
</p>
<p>
  					正常
</p>
<p>
  					@elseif($stream-&gt;state == 2)
</p>
<p>
  					永久禁用
</p>
<p>
  					@else
</p>
<p>
  					限时禁用
</p>
<p>
  					@endif
</p>
<p>
  				&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;{{ $stream-&gt;created_at }}&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;&lt;a title=&#8221;编辑&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_edit(&#8216;角色编辑&#8217;,&#8217;admin-permission-add.html&#8217;,&#8217;1&#8242;,&#8221;,&#8217;310&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6df;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;删除&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_del(this,&#8217;1&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt;&lt;/a&gt;&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;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/datatables/1.10.0/jquery.dataTables.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  /*
</p>
<p>
  	参数解释：
</p>
<p>
  	title	标题
</p>
<p>
  	url		请求的url
</p>
<p>
  	id		需要操作的数据id
</p>
<p>
  	w		弹出层宽度（缺省调默认值）
</p>
<p>
  	h		弹出层高度（缺省调默认值）
</p>
<p>
  */
</p>
<p>
  /*管理员-直播流-添加*/
</p>
<p>
  function admin_permission_add(title,url,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-直播流-编辑*/
</p>
<p>
  function admin_permission_edit(title,url,id,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-直播流-删除*/
</p>
<p>
  function admin_permission_del(obj,id){
</p>
<p>
  	layer.confirm(&#8216;确认要删除吗？&#8217;,function(index){
</p>
<p>
  		$.ajax({
</p>
<p>
  			type: &#8216;POST&#8217;,
</p>
<p>
  			url: &#8221;,
</p>
<p>
  			dataType: &#8216;json&#8217;,
</p>
<p>
  			success: function(data){
</p>
<p>
  				$(obj).parents(&#8220;tr&#8221;).remove();
</p>
<p>
  				layer.msg(&#8216;已删除!&#8217;,{icon:1,time:1000});
</p>
<p>
  			},
</p>
<p>
  			error:function(data) {
</p>
<p>
  				console.log(data.msg);
</p>
<p>
  			},
</p>
<p>
  		});
</p>
<p>
  	});
</p>
<p>
  }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2>添加功能</h2>
<h3>1）加载视图</h3>
<p>
  步骤1：路由
</p>
<p><img loading="lazy" decoding="async" width="978" height="152" src="/wp-content/uploads/2018/05/word-image-5314.png" class="wp-image-5852" srcset="/wp-content/uploads/2018/05/word-image-5314.png 978w, /wp-content/uploads/2018/05/word-image-5314-300x47.png 300w, /wp-content/uploads/2018/05/word-image-5314-768x119.png 768w" sizes="(max-width: 978px) 100vw, 978px" /></p>
<p>
  步骤2：设置控制器方法并加载视图
</p>
<p><img loading="lazy" decoding="async" width="791" height="328" src="/wp-content/uploads/2018/05/word-image-5315.png" class="wp-image-5853" srcset="/wp-content/uploads/2018/05/word-image-5315.png 791w, /wp-content/uploads/2018/05/word-image-5315-300x124.png 300w, /wp-content/uploads/2018/05/word-image-5315-768x318.png 768w" sizes="(max-width: 791px) 100vw, 791px" /></p>
<p>
  步骤3：创建视图
</p>
<p><img loading="lazy" decoding="async" width="1023" height="459" src="/wp-content/uploads/2018/05/word-image-5316.png" class="wp-image-5854" srcset="/wp-content/uploads/2018/05/word-image-5316.png 1023w, /wp-content/uploads/2018/05/word-image-5316-300x135.png 300w, /wp-content/uploads/2018/05/word-image-5316-768x345.png 768w" sizes="(max-width: 1023px) 100vw, 1023px" /></p>
<h3>2）数据处理</h3>
<p>
  步骤1：更改路由
</p>
<p><img loading="lazy" decoding="async" width="1093" height="172" src="/wp-content/uploads/2018/05/word-image-5317.png" class="wp-image-5855" srcset="/wp-content/uploads/2018/05/word-image-5317.png 1093w, /wp-content/uploads/2018/05/word-image-5317-300x47.png 300w, /wp-content/uploads/2018/05/word-image-5317-768x121.png 768w, /wp-content/uploads/2018/05/word-image-5317-1024x161.png 1024w" sizes="(max-width: 1093px) 100vw, 1093px" /></p>
<p>
  步骤2：更改视图
</p>
<p><img loading="lazy" decoding="async" width="1192" height="637" src="/wp-content/uploads/2018/05/word-image-5318.png" class="wp-image-5856" srcset="/wp-content/uploads/2018/05/word-image-5318.png 1192w, /wp-content/uploads/2018/05/word-image-5318-300x160.png 300w, /wp-content/uploads/2018/05/word-image-5318-768x410.png 768w, /wp-content/uploads/2018/05/word-image-5318-1024x547.png 1024w" sizes="(max-width: 1192px) 100vw, 1192px" /><br />
<img loading="lazy" decoding="async" width="992" height="605" src="/wp-content/uploads/2018/05/word-image-5319.png" class="wp-image-5857" srcset="/wp-content/uploads/2018/05/word-image-5319.png 992w, /wp-content/uploads/2018/05/word-image-5319-300x183.png 300w, /wp-content/uploads/2018/05/word-image-5319-768x468.png 768w" sizes="(max-width: 992px) 100vw, 992px" /></p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;title&gt;添加管理员 &#8211; 管理员管理 &#8211; H-ui.admin v3.1&lt;/title&gt;
</p>
<p>
  &lt;meta name=&#8221;keywords&#8221; content=&#8221;H-ui.admin v3.1,H-ui网站后台模版,后台模版下载,后台管理系统模版,HTML后台模版下载&#8221;&gt;
</p>
<p>
  &lt;meta name=&#8221;description&#8221; content=&#8221;H-ui.admin v3.1，是一款由国人开发的轻量级扁平化网站后台模板，完全免费开源的网站后台管理系统模版，适合中小型CMS后台系统。&#8221;&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;article class=&#8221;page-container&#8221;&gt;
</p>
<p>
  	&lt;form class=&#8221;form form-horizontal&#8221; id=&#8221;form-admin-add&#8221;&gt;
</p>
<p>
  		{{ csrf_field() }}
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;&lt;span class=&#8221;c-red&#8221;&gt;*&lt;/span&gt;数据流名称&lt;/label&gt;
</p>
<p>
  		&lt;div class=&#8221;formControls col-xs-8 col-sm-9&#8243;&gt;
</p>
<p>
  			&lt;input type=&#8221;text&#8221; class=&#8221;input-text&#8221; value=&#8221;&#8221; placeholder=&#8221;&#8221; id=&#8221;stream_name&#8221; name=&#8221;stream_name&#8221;&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;&lt;span class=&#8221;c-red&#8221;&gt;*&lt;/span&gt;直播流状态&lt;/label&gt;
</p>
<p>
  		&lt;div class=&#8221;formControls col-xs-8 col-sm-9 skin-minimal&#8221;&gt;
</p>
<p>
  			&lt;div class=&#8221;radio-box&#8221;&gt;
</p>
<p>
  				&lt;input type=&#8221;radio&#8221; name=&#8221;state&#8221; id=&#8221;sex-1&#8243; value=&#8221;1&#8243; checked&gt;
</p>
<p>
  				&lt;label for=&#8221;sex-1&#8243;&gt;正常&lt;/label&gt;
</p>
<p>
  			&lt;/div&gt;
</p>
<p>
  			&lt;div class=&#8221;radio-box&#8221;&gt;
</p>
<p>
  				&lt;input type=&#8221;radio&#8221; name=&#8221;state&#8221; id=&#8221;sex-2&#8243; value=&#8221;2&#8243; name=&#8221;sex&#8221;&gt;
</p>
<p>
  				&lt;label for=&#8221;sex-2&#8243;&gt;永久禁播&lt;/label&gt;
</p>
<p>
  			&lt;/div&gt;
</p>
<p>
  			&lt;div class=&#8221;radio-box&#8221;&gt;
</p>
<p>
  				&lt;input type=&#8221;radio&#8221; name=&#8221;state&#8221; id=&#8221;sex-2&#8243; value=&#8221;3&#8243; name=&#8221;sex&#8221;&gt;
</p>
<p>
  				&lt;label for=&#8221;sex-2&#8243;&gt;限时禁播&lt;/label&gt;
</p>
<p>
  			&lt;/div&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;div class=&#8221;col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-3&#8243;&gt;
</p>
<p>
  			&lt;input class=&#8221;btn btn-primary radius&#8221; type=&#8221;submit&#8221; value=&#8221;&amp;nbsp;&amp;nbsp;提交&amp;nbsp;&amp;nbsp;&#8221;&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;/form&gt;
</p>
<p>
  &lt;/article&gt;
</p>
<p>
  &lt;!&#8211;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/jquery.validate.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/validate-methods.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/messages_zh.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  $(function(){
</p>
<p>
  	$(&#8216;.skin-minimal input&#8217;).iCheck({
</p>
<p>
  		checkboxClass: &#8216;icheckbox-blue&#8217;,
</p>
<p>
  		radioClass: &#8216;iradio-blue&#8217;,
</p>
<p>
  		increaseArea: &#8216;20%&#8217;
</p>
<p>
  	});
</p>
</p>
<p>
  	$(&#8220;#form-admin-add&#8221;).validate({
</p>
<p>
  		rules:{
</p>
<p>
  			stream_name:{
</p>
<p>
  				required:true,
</p>
<p>
  				minlength:4,
</p>
<p>
  				maxlength:16
</p>
<p>
  			},
</p>
<p>
  		},
</p>
<p>
  		onkeyup:false,
</p>
<p>
  		focusCleanup:true,
</p>
<p>
  		success:&#8221;valid&#8221;,
</p>
<p>
  		submitHandler:function(form){
</p>
<p>
  			$(form).ajaxSubmit({
</p>
<p>
  				type: &#8216;post&#8217;,
</p>
<p>
  				url: &#8220;{{ url(&#8216;admin/stream/add&#8217;) }}&#8221; ,
</p>
<p>
  				success: function(data){
</p>
<p>
  					window.parent.location.reload(); //刷新父页面
</p>
</p>
<p>
  					parent.layer.msg(&#8216;添加成功!&#8217;,{icon:1,time:1000});
</p>
<p>
  					var index = parent.layer.getFrameIndex(window.name);
</p>
<p>
  					parent.$(&#8216;.btn-refresh&#8217;).click();
</p>
<p>
  					parent.layer.close(index);
</p>
<p>
  					// window.location.href = location.href;
</p>
<p>
  					// alert(location.href);
</p>
<p>
  				},
</p>
<p>
                  error: function(XmlHttpRequest, textStatus, errorThrown){
</p>
<p>
  					layer.msg(&#8216;error!&#8217;,{icon:1,time:1000});
</p>
<p>
  				}
</p>
<p>
  			});
</p>
<p>
  		}
</p>
<p>
  	});
</p>
<p>
  });
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;!&#8211;/请在上方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<p>
  步骤3：更改控制器
</p>
<p><img loading="lazy" decoding="async" width="945" height="383" src="/wp-content/uploads/2018/05/word-image-5320.png" class="wp-image-5858" srcset="/wp-content/uploads/2018/05/word-image-5320.png 945w, /wp-content/uploads/2018/05/word-image-5320-300x122.png 300w, /wp-content/uploads/2018/05/word-image-5320-768x311.png 768w" sizes="(max-width: 945px) 100vw, 945px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use App\Http\Model\Stream;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class StreamController extends Controller
</p>
<p>
  {
</p>
<p>
      //列表
</p>
<p>
      public function index()
</p>
<p>
      {
</p>
<p>
      	//1.分页获取数据
</p>
<p>
      	$streams = Stream::orderBy(&#8216;id&#8217;, &#8216;desc&#8217;)-&gt;paginate(8);
</p>
<p>
      	//2.加载视图并传递数据
</p>
<p>
          return view(&#8216;admin.stream.index&#8217;, compact(&#8216;streams&#8217;));
</p>
<p>
      }
</p>
<p>
      //添加
</p>
<p>
      public function add(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;stream_name&#8217;,&#8217;state&#8217;]);
</p>
<p>
      		//3.通过模型添加数据
</p>
<p>
      		$rs = Stream::create($postData);
</p>
<p>
      		//4.判断
</p>
<p>
      		echo $rs ? 1 : 0;
</p>
<p>
      	} else {
</p>
<p>
  	    	//2.加载视图并传递数据
</p>
<p>
  	        return view(&#8216;admin.stream.add&#8217;);
</p>
<p>
      	}
</p>
<p>
      }
</p>
<p>
  }
</p>
<h2>同步七牛云创建直播流</h2>
<h3>1）接口文档说明</h3>
<p>
  接口说明：<a href="https://developer.qiniu.com/pili/api/2515/create-a-flow">https://developer.qiniu.com/pili/api/2515/create-a-flow</a>
</p>
<p><img loading="lazy" decoding="async" width="1246" height="327" src="/wp-content/uploads/2018/05/word-image-5321.png" class="wp-image-5859" srcset="/wp-content/uploads/2018/05/word-image-5321.png 1246w, /wp-content/uploads/2018/05/word-image-5321-300x79.png 300w, /wp-content/uploads/2018/05/word-image-5321-768x202.png 768w, /wp-content/uploads/2018/05/word-image-5321-1024x269.png 1024w" sizes="(max-width: 1246px) 100vw, 1246px" /><br />
<img loading="lazy" decoding="async" width="785" height="614" src="/wp-content/uploads/2018/05/word-image-5322.png" class="wp-image-5860" srcset="/wp-content/uploads/2018/05/word-image-5322.png 785w, /wp-content/uploads/2018/05/word-image-5322-300x235.png 300w, /wp-content/uploads/2018/05/word-image-5322-768x601.png 768w" sizes="(max-width: 785px) 100vw, 785px" /><br />
<img loading="lazy" decoding="async" width="886" height="613" src="/wp-content/uploads/2018/05/word-image-5323.png" class="wp-image-5861" srcset="/wp-content/uploads/2018/05/word-image-5323.png 886w, /wp-content/uploads/2018/05/word-image-5323-300x208.png 300w, /wp-content/uploads/2018/05/word-image-5323-768x531.png 768w" sizes="(max-width: 886px) 100vw, 886px" /><br />
<img loading="lazy" decoding="async" width="1340" height="598" src="/wp-content/uploads/2018/05/word-image-5324.png" class="wp-image-5862" srcset="/wp-content/uploads/2018/05/word-image-5324.png 1340w, /wp-content/uploads/2018/05/word-image-5324-300x134.png 300w, /wp-content/uploads/2018/05/word-image-5324-768x343.png 768w, /wp-content/uploads/2018/05/word-image-5324-1024x457.png 1024w" sizes="(max-width: 1340px) 100vw, 1340px" /></p>
<h3>安装配置工具库（七牛SDK、发送请求工具库）</h3>
<ul>
<li>
    七牛SDK（zgldh/qiniu-laravel-storage）
  </li>
</ul>
<p>
  #【安装并配置】
</p>
<p><img loading="lazy" decoding="async" width="900" height="461" src="/wp-content/uploads/2018/05/word-image-5325.png" class="wp-image-5863" srcset="/wp-content/uploads/2018/05/word-image-5325.png 900w, /wp-content/uploads/2018/05/word-image-5325-300x154.png 300w, /wp-content/uploads/2018/05/word-image-5325-768x393.png 768w" sizes="(max-width: 900px) 100vw, 900px" /><br />
<img loading="lazy" decoding="async" width="1151" height="459" src="/wp-content/uploads/2018/05/word-image-5326.png" class="wp-image-5864" srcset="/wp-content/uploads/2018/05/word-image-5326.png 1151w, /wp-content/uploads/2018/05/word-image-5326-300x120.png 300w, /wp-content/uploads/2018/05/word-image-5326-768x306.png 768w, /wp-content/uploads/2018/05/word-image-5326-1024x408.png 1024w" sizes="(max-width: 1151px) 100vw, 1151px" /><br />
<img loading="lazy" decoding="async" width="944" height="535" src="/wp-content/uploads/2018/05/word-image-5327.png" class="wp-image-5865" srcset="/wp-content/uploads/2018/05/word-image-5327.png 944w, /wp-content/uploads/2018/05/word-image-5327-300x170.png 300w, /wp-content/uploads/2018/05/word-image-5327-768x435.png 768w" sizes="(max-width: 944px) 100vw, 944px" /><br />
<img loading="lazy" decoding="async" width="1226" height="577" src="/wp-content/uploads/2018/05/word-image-5328.png" class="wp-image-5866" srcset="/wp-content/uploads/2018/05/word-image-5328.png 1226w, /wp-content/uploads/2018/05/word-image-5328-300x141.png 300w, /wp-content/uploads/2018/05/word-image-5328-768x361.png 768w, /wp-content/uploads/2018/05/word-image-5328-1024x482.png 1024w" sizes="(max-width: 1226px) 100vw, 1226px" /><br />
<img loading="lazy" decoding="async" width="718" height="216" src="/wp-content/uploads/2018/05/word-image-5329.png" class="wp-image-5867" srcset="/wp-content/uploads/2018/05/word-image-5329.png 718w, /wp-content/uploads/2018/05/word-image-5329-300x90.png 300w" sizes="(max-width: 718px) 100vw, 718px" /><br />
<img loading="lazy" decoding="async" width="1301" height="500" src="/wp-content/uploads/2018/05/word-image-5330.png" class="wp-image-5868" srcset="/wp-content/uploads/2018/05/word-image-5330.png 1301w, /wp-content/uploads/2018/05/word-image-5330-300x115.png 300w, /wp-content/uploads/2018/05/word-image-5330-768x295.png 768w, /wp-content/uploads/2018/05/word-image-5330-1024x394.png 1024w" sizes="(max-width: 1301px) 100vw, 1301px" /></p>
<ul>
<li>
    发送请求工具库（guzzlehttp/guzzle）：是更加强大的curl
  </li>
</ul>
<p>
  #【安装】composer require guzzlehttp/guzzle
</p>
<p><img loading="lazy" decoding="async" width="538" height="311" src="/wp-content/uploads/2018/05/word-image-5331.png" class="wp-image-5869" srcset="/wp-content/uploads/2018/05/word-image-5331.png 538w, /wp-content/uploads/2018/05/word-image-5331-300x173.png 300w" sizes="(max-width: 538px) 100vw, 538px" /></p>
<p>
  #【基本语法】
</p>
<p>
  $client = new \Guzzle\Client();
</p>
<p>
  $client-&gt;request(方式，host，[headers  body]);
</p>
<h3>使用</h3>
<p><img loading="lazy" decoding="async" width="1170" height="710" src="/wp-content/uploads/2018/05/word-image-5332.png" class="wp-image-5870" srcset="/wp-content/uploads/2018/05/word-image-5332.png 1170w, /wp-content/uploads/2018/05/word-image-5332-300x182.png 300w, /wp-content/uploads/2018/05/word-image-5332-768x466.png 768w, /wp-content/uploads/2018/05/word-image-5332-1024x621.png 1024w" sizes="(max-width: 1170px) 100vw, 1170px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use App\Http\Model\Stream;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class StreamController extends Controller
</p>
<p>
  {
</p>
<p>
      //列表
</p>
<p>
      public function index()
</p>
<p>
      {
</p>
<p>
      	//1.分页获取数据
</p>
<p>
      	$streams = Stream::orderBy(&#8216;id&#8217;, &#8216;desc&#8217;)-&gt;paginate(8);
</p>
<p>
      	//2.加载视图并传递数据
</p>
<p>
          return view(&#8216;admin.stream.index&#8217;, compact(&#8216;streams&#8217;));
</p>
<p>
      }
</p>
<p>
      //添加
</p>
<p>
      public function add(Request $request)
</p>
<p>
      {
</p>
<p>
      	//1.判断HTTP请求类型
</p>
<p>
      	if ($request-&gt;ismethod(&#8216;post&#8217;)) {
</p>
<p>
              //直播流名称过滤：必须唯一
</p>
</p>
<p>
      		//2.接受数据
</p>
<p>
      		$postData = $request-&gt;only([&#8216;stream_name&#8217;,&#8217;state&#8217;]);
</p>
<p>
      		//3.通过模型添加数据
</p>
<p>
      		$rs = Stream::create($postData);
</p>
<p>
      		//4.判断
</p>
<p>
              if ($rs) {
</p>
<p>
              <strong>//成功同步创建直播流</strong>
</p>
<p><strong>                $method = &#8216;POST&#8217;;                       //HTTP请求类型</strong>
</p>
<p><strong>                $space = &#8216;201801140002&#8217;;                //空间名称（注：该空间必须存在）</strong>
</p>
<p><strong>                $path = &#8216;/v2/hubs/&#8217;.$space.&#8217;/streams&#8217;;  //请求接口地址</strong>
</p>
<p><strong>                $host = &#8216;pili.qiniuapi.com&#8217;;            //接口请求域名</strong>
</p>
<p><strong>                $contentType = &#8216;application/json&#8217;;  </strong>
</p>
<p><strong>                $body = json_encode([                   //将请求体数据转化为json格式</strong>
</p>
<p><strong>                    &#8216;key&#8217;=&gt;$request-&gt;input(&#8216;stream_name&#8217;)</strong>
</p>
<p><strong>                ]);</strong>
</p>
<p><strong>                //根据请求包，我们要制作鉴权信息(用于验证请求包在传输中是否被篡改)；</strong>
</p>
<p><strong>                //Authorization: &lt;QiniuToken&gt;</strong>
</p>
<p><strong>                //生成签名字符串；</strong>
</p>
<p><strong>                $data = &#8220;$method $path\nHost: $host\nContent-Type: $contentType\n\n$body&#8221;;</strong>
</p>
<p><strong>                $ak =  config(&#8216;filesystems.disks.qiniu.access_key&#8217;); //通过config函数获取配置文件信息</strong>
</p>
<p><strong>                $sk =  config(&#8216;filesystems.disks.qiniu.secret_key&#8217;);</strong>
</p>
<p><strong>                $qiniu = new  \Qiniu\Auth($ak,$sk);</strong>
</p>
<p><strong>                $token =  &#8220;Qiniu &#8220;.$qiniu-&gt;sign($data); //根据HTTP请求鉴权接口生成秘钥</strong>
</p>
<p><strong>                //利用GuzzleHttp发送请求表</strong>
</p>
<p><strong>                $cli = new \GuzzleHttp\Client();</strong>
</p>
<p><strong>                $res = $cli-&gt;request($method, $host.$path, [</strong>
</p>
<p><strong>                    &#8216;headers&#8217; =&gt; [</strong>
</p>
<p><strong>                        &#8216;Authorization&#8217; =&gt; $token,</strong>
</p>
<p><strong>                        &#8216;Content-Type&#8217; =&gt; $contentType,</strong>
</p>
<p><strong>                        &#8216;Accept-Encoding&#8217; =&gt; &#8216;gzip&#8217;,</strong>
</p>
<p><strong>                        &#8216;Content-Length&#8217; =&gt; strlen($body),</strong>
</p>
<p><strong>                        &#8216;User-Agent&#8217; =&gt; &#8216;pili-sdk-go/v2 go1.6 darwin/amd64&#8217;,</strong>
</p>
<p><strong>                    ],</strong>
</p>
<p><strong>                    &#8216;body&#8217;=&gt;$body,</strong>
</p>
<p><strong>                ]);</strong>
</p>
<p><strong>                //var_dump($res);die;</strong>
</p>
<p><strong>            }</strong>
</p>
<p><strong>    		echo $rs ? 1 : 0;</strong>
</p>
<p>
      	} else {
</p>
<p>
  	    	//2.加载视图并传递数据
</p>
<p>
  	        return view(&#8216;admin.stream.add&#8217;);
</p>
<p>
      	}
</p>
<p>
      }
</p>
<p>
  }
</p>
<h1>四、直播课程管理（在线教育后台）</h1>
<h2>1、准备</h2>
<h3>1）直播课程流表</h3>
<p><strong>后台直播课程表</strong>
</p>
<table>
<tr>
<td>
<p><strong>表名</strong>
</p>
</td>
<td colspan="6">
<p>
  live
</p>
</td>
</tr>
<tr>
<td>
<p><strong>序号</strong>
</p>
</td>
<td>
<p><strong>字段</strong>
</p>
</td>
<td>
<p><strong>类型</strong>
</p>
</td>
<td>
<p><strong>说明</strong>
</p>
</td>
<td>
<p><strong>空</strong>
</p>
</td>
<td>
<p><strong>默认值</strong>
</p>
</td>
<td>
<p><strong>主键</strong>
</p>
</td>
</tr>
<tr>
<td>
<p>
  1
</p>
</td>
<td>
<p>
  id
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  自增主键
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  N/A
</p>
</td>
<td>
<p>
  是
</p>
</td>
</tr>
<tr>
<td>
<p>
  2
</p>
</td>
<td>
<p>
  live_name
</p>
</td>
<td>
<p>
  varchar(200)
</p>
</td>
<td>
<p>
  直播课程名称
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  3
</p>
</td>
<td>
<p>
  stream_id
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  所属直播流
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  4
</p>
</td>
<td>
<p>
  img
</p>
</td>
<td>
<p>
  varchar(255)
</p>
</td>
<td>
<p>
  封面
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  5
</p>
</td>
<td>
<p>
  start_time
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  直播开始时间
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  6
</p>
</td>
<td>
<p>
  end_time
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  直播结束时间
</p>
</td>
<td>
<p>
  Y
</p>
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<p>
  7
</p>
</td>
<td>
<p>
  created_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  创建于
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
<tr>
<td>
<p>
  8
</p>
</td>
<td>
<p>
  update_at
</p>
</td>
<td>
<p>
  int
</p>
</td>
<td>
<p>
  更新于
</p>
</td>
<td>
<p>
  N
</p>
</td>
<td>
<p>
  0
</p>
</td>
<td></td>
</tr>
</table>
<p><img loading="lazy" decoding="async" width="1251" height="676" src="/wp-content/uploads/2018/05/word-image-5333.png" class="wp-image-5871" srcset="/wp-content/uploads/2018/05/word-image-5333.png 1251w, /wp-content/uploads/2018/05/word-image-5333-300x162.png 300w, /wp-content/uploads/2018/05/word-image-5333-768x415.png 768w, /wp-content/uploads/2018/05/word-image-5333-1024x553.png 1024w" sizes="(max-width: 1251px) 100vw, 1251px" /></p>
<p>
  &lt;?php
</p>
<p>
  use Illuminate\Support\Facades\Schema;
</p>
<p>
  use Illuminate\Database\Schema\Blueprint;
</p>
<p>
  use Illuminate\Database\Migrations\Migration;
</p>
<p>
  class CreateLiveTable extends Migration
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * Run the migrations.
</p>
<p>
       *
</p>
<p>
       * @return void
</p>
<p>
       */
</p>
<p>
      public function up()
</p>
<p>
      {
</p>
<p>
          Schema::create(&#8216;live&#8217;, function (Blueprint $table) {
</p>
<p>
              $table-&gt;increments(&#8216;id&#8217;);
</p>
<p>
              $table-&gt;string(&#8216;live_name&#8217;, 200)-&gt;comment(&#8216;直播课程名称&#8217;);
</p>
<p>
              $table-&gt;unsignedInteger(&#8216;stream_id&#8217;)-&gt;comment(&#8216;所属直播流&#8217;);
</p>
<p>
              $table-&gt;string(&#8216;img&#8217;)-&gt;default(&#8221;)-&gt;comment(&#8216;封面&#8217;);
</p>
<p>
              $table-&gt;unsignedInteger(&#8216;start_time&#8217;)-&gt;default(0)-&gt;comment(&#8216;直播开始时间&#8217;);
</p>
<p>
              $table-&gt;unsignedInteger(&#8216;end_time&#8217;)-&gt;default(0)-&gt;comment(&#8216;直播结束时间&#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>
          });
</p>
<p>
      }
</p>
<p>
      /**
</p>
<p>
       * Reverse the migrations.
</p>
<p>
       *
</p>
<p>
       * @return void
</p>
<p>
       */
</p>
<p>
      public function down()
</p>
<p>
      {
</p>
<p>
          Schema::dropIfExists(&#8216;live&#8217;);
</p>
<p>
      }
</p>
<p>
  }
</p>
<h3>2）模型</h3>
<p><img loading="lazy" decoding="async" width="1213" height="581" src="/wp-content/uploads/2018/05/word-image-5334.png" class="wp-image-5872" srcset="/wp-content/uploads/2018/05/word-image-5334.png 1213w, /wp-content/uploads/2018/05/word-image-5334-300x144.png 300w, /wp-content/uploads/2018/05/word-image-5334-768x368.png 768w, /wp-content/uploads/2018/05/word-image-5334-1024x490.png 1024w" sizes="(max-width: 1213px) 100vw, 1213px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Model;
</p>
<p>
  use Illuminate\Database\Eloquent\Model;
</p>
<p>
  class Live extends Model
</p>
<p>
  {
</p>
<p>
      /**
</p>
<p>
       * 声明表名（注：laravel会自动加s所以自己声明覆盖）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $table = &#8216;live&#8217;;
</p>
<p>
      /**
</p>
<p>
       * Unix时间戳形式填充创建于和更新于（注：模型默认托管时间但是是datetime类型）
</p>
<p>
       * @var string
</p>
<p>
       */
</p>
<p>
      protected $dateFormat = &#8216;U&#8217;;
</p>
<p>
      /**
</p>
<p>
       * 声明可批量设置的属性（注：当使用create静态方式时）
</p>
<p>
       * @var array
</p>
<p>
       */
</p>
<p>
      protected $fillable = [&#8216;live_name&#8217;, &#8216;stream_id&#8217;, &#8216;img&#8217;, &#8216;start_time&#8217;, &#8216;end_time&#8217;];
</p>
<p>
  }
</p>
<h2>2、列表功能</h2>
<p>
  步骤1：路由
</p>
<p><img loading="lazy" decoding="async" width="1037" height="247" src="/wp-content/uploads/2018/05/word-image-5335.png" class="wp-image-5873" srcset="/wp-content/uploads/2018/05/word-image-5335.png 1037w, /wp-content/uploads/2018/05/word-image-5335-300x71.png 300w, /wp-content/uploads/2018/05/word-image-5335-768x183.png 768w, /wp-content/uploads/2018/05/word-image-5335-1024x244.png 1024w" sizes="(max-width: 1037px) 100vw, 1037px" /></p>
<p>
  步骤2：创建控制器方法，分页获取数据，加载视图并传递数据
</p>
<p><img loading="lazy" decoding="async" width="1020" height="567" src="/wp-content/uploads/2018/05/word-image-5336.png" class="wp-image-5874" srcset="/wp-content/uploads/2018/05/word-image-5336.png 1020w, /wp-content/uploads/2018/05/word-image-5336-300x167.png 300w, /wp-content/uploads/2018/05/word-image-5336-768x427.png 768w" sizes="(max-width: 1020px) 100vw, 1020px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Admin;
</p>
<p>
  use App\Http\Model\Live;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class LiveController extends Controller
</p>
<p>
  {
</p>
<p>
      //列表
</p>
<p>
      public function index()
</p>
<p>
      {
</p>
<p>
      	//1.分页获取数据
</p>
<p>
      	$lives = Live::orderBy(&#8216;id&#8217;, &#8216;desc&#8217;)-&gt;paginate(8);
</p>
<p>
      	//2.加载视图并传递数据
</p>
<p>
          return view(&#8216;admin.stream.index&#8217;, compact(&#8216;lives&#8217;));
</p>
<p>
      }
</p>
<p>
  }
</p>
<p>
  步骤3：创建视图
</p>
<p><img loading="lazy" decoding="async" width="1362" height="385" src="/wp-content/uploads/2018/05/word-image-5337.png" class="wp-image-5875" srcset="/wp-content/uploads/2018/05/word-image-5337.png 1362w, /wp-content/uploads/2018/05/word-image-5337-300x85.png 300w, /wp-content/uploads/2018/05/word-image-5337-768x217.png 768w, /wp-content/uploads/2018/05/word-image-5337-1024x289.png 1024w" sizes="(max-width: 1362px) 100vw, 1362px" /></p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;title&gt;直播课程管理&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;nav class=&#8221;breadcrumb&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe67f;&lt;/i&gt; 首页 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 管理员管理 &lt;span class=&#8221;c-gray en&#8221;&gt;&amp;gt;&lt;/span&gt; 直播课程管理 &lt;a class=&#8221;btn btn-success radius r&#8221; style=&#8221;line-height:1.6em;margin-top:3px&#8221; href=&#8221;javascript:location.replace(location.href);&#8221; title=&#8221;刷新&#8221; &gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe68f;&lt;/i&gt;&lt;/a&gt;&lt;/nav&gt;
</p>
<p>
  &lt;div class=&#8221;page-container&#8221;&gt;
</p>
<p>
  	&lt;div class=&#8221;text-c&#8221;&gt;
</p>
<p>
  		&lt;form class=&#8221;Huiform&#8221; method=&#8221;post&#8221; action=&#8221;&#8221; target=&#8221;_self&#8221;&gt;
</p>
<p>
  			&lt;input type=&#8221;text&#8221; class=&#8221;input-text&#8221; style=&#8221;width:250px&#8221; placeholder=&#8221;直播课程名称&#8221; id=&#8221;&#8221; name=&#8221;&#8221;&gt;
</p>
<p>
  			&lt;button type=&#8221;submit&#8221; class=&#8221;btn btn-success&#8221; id=&#8221;&#8221; name=&#8221;&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe665;&lt;/i&gt; 搜直播课程节点&lt;/button&gt;
</p>
<p>
  		&lt;/form&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;cl pd-5 bg-1 bk-gray mt-20&#8243;&gt;
</p>
<p>
  		&lt;span class=&#8221;l&#8221;&gt;
</p>
<p>
  			&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;datadel()&#8221; class=&#8221;btn btn-danger radius&#8221;&gt;
</p>
<p>
  				&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt; 批量删除
</p>
<p>
  			&lt;/a&gt;
</p>
<p>
  			&lt;a href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_add(&#8216;添加直播课程节点&#8217;,'{{ url(&#8216;admin/stream/add&#8217;) }}&#8217;,&#8221;,&#8217;310&#8242;)&#8221; class=&#8221;btn btn-primary radius&#8221;&gt;
</p>
<p>
  				&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe600;&lt;/i&gt; 添加直播课程节点
</p>
<p>
  			&lt;/a&gt;
</p>
<p>
  		&lt;/span&gt;
</p>
<p>
  		&lt;span class=&#8221;r&#8221;&gt;共有数据：&lt;strong&gt;54&lt;/strong&gt; 条&lt;/span&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;table class=&#8221;table table-border table-bordered table-bg&#8221;&gt;
</p>
<p>
  		&lt;thead&gt;
</p>
<p>
  			&lt;tr&gt;
</p>
<p>
  				&lt;th scope=&#8221;col&#8221; colspan=&#8221;6&#8243;&gt;直播课程节点&lt;/th&gt;
</p>
<p>
  			&lt;/tr&gt;
</p>
<p>
  			&lt;tr class=&#8221;text-c&#8221;&gt;
</p>
<p>
  				&lt;th width=&#8221;25&#8243;&gt;&lt;input type=&#8221;checkbox&#8221; name=&#8221;&#8221; value=&#8221;&#8221;&gt;&lt;/th&gt;
</p>
<p>
  				&lt;th width=&#8221;40&#8243;&gt;ID&lt;/th&gt;
</p>
<p>
  				&lt;th width=&#8221;40&#8243;&gt;封面&lt;/th&gt;
</p>
<p>
  				&lt;th width=&#8221;200&#8243;&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;100&#8243;&gt;操作&lt;/th&gt;
</p>
<p>
  			&lt;/tr&gt;
</p>
<p>
  		&lt;/thead&gt;
</p>
<p>
  		&lt;tbody&gt;
</p>
<p>
  			@foreach ($lives as $live)
</p>
<p>
  			&lt;tr class=&#8221;text-c&#8221;&gt;
</p>
<p>
  				&lt;td&gt;&lt;input type=&#8221;checkbox&#8221; value=&#8221;1&#8243; name=&#8221;&#8221;&gt;&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;{{ $live-&gt;id }}&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;
</p>
<p>
  					@if ($live-&gt;img )
</p>
<p>
  						&lt;img src=&#8221;{{ $live-&gt;img }}&#8221; /&gt;
</p>
<p>
  					@else
</p>
<p>
  						&lt;img src=&#8221;{{ asset(&#8216;img/default.png&#8217;) }}&#8221; /&gt;
</p>
<p>
  					@endif
</p>
<p>
  				&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;{{ $live-&gt;start_time }}&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;{{ $live-&gt;end_time }}&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;{{ $live-&gt;created_at }}&lt;/td&gt;
</p>
<p>
  				&lt;td&gt;&lt;a title=&#8221;编辑&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_edit(&#8216;角色编辑&#8217;,&#8217;admin-permission-add.html&#8217;,&#8217;1&#8242;,&#8221;,&#8217;310&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6df;&lt;/i&gt;&lt;/a&gt; &lt;a title=&#8221;删除&#8221; href=&#8221;javascript:;&#8221; onclick=&#8221;admin_permission_del(this,&#8217;1&#8242;)&#8221; class=&#8221;ml-5&#8243; style=&#8221;text-decoration:none&#8221;&gt;&lt;i class=&#8221;Hui-iconfont&#8221;&gt;&amp;#xe6e2;&lt;/i&gt;&lt;/a&gt;&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;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/datatables/1.10.0/jquery.dataTables.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  /*
</p>
<p>
  	参数解释：
</p>
<p>
  	title	标题
</p>
<p>
  	url		请求的url
</p>
<p>
  	id		需要操作的数据id
</p>
<p>
  	w		弹出层宽度（缺省调默认值）
</p>
<p>
  	h		弹出层高度（缺省调默认值）
</p>
<p>
  */
</p>
<p>
  /*管理员-直播课程-添加*/
</p>
<p>
  function admin_permission_add(title,url,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-直播课程-编辑*/
</p>
<p>
  function admin_permission_edit(title,url,id,w,h){
</p>
<p>
  	layer_show(title,url,w,h);
</p>
<p>
  }
</p>
<p>
  /*管理员-直播课程-删除*/
</p>
<p>
  function admin_permission_del(obj,id){
</p>
<p>
  	layer.confirm(&#8216;确认要删除吗？&#8217;,function(index){
</p>
<p>
  		$.ajax({
</p>
<p>
  			type: &#8216;POST&#8217;,
</p>
<p>
  			url: &#8221;,
</p>
<p>
  			dataType: &#8216;json&#8217;,
</p>
<p>
  			success: function(data){
</p>
<p>
  				$(obj).parents(&#8220;tr&#8221;).remove();
</p>
<p>
  				layer.msg(&#8216;已删除!&#8217;,{icon:1,time:1000});
</p>
<p>
  			},
</p>
<p>
  			error:function(data) {
</p>
<p>
  				console.log(data.msg);
</p>
<p>
  			},
</p>
<p>
  		});
</p>
<p>
  	});
</p>
<p>
  }
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<h2>3、添加功能</h2>
<h3>1）加载视图</h3>
<p>
  步骤1：路由
</p>
<p><img loading="lazy" decoding="async" width="1171" height="288" src="/wp-content/uploads/2018/05/word-image-5338.png" class="wp-image-5876" srcset="/wp-content/uploads/2018/05/word-image-5338.png 1171w, /wp-content/uploads/2018/05/word-image-5338-300x74.png 300w, /wp-content/uploads/2018/05/word-image-5338-768x189.png 768w, /wp-content/uploads/2018/05/word-image-5338-1024x252.png 1024w" sizes="(max-width: 1171px) 100vw, 1171px" /></p>
<p>
  步骤2：创建控制器对应方法并加载视图
</p>
<p><img loading="lazy" decoding="async" width="889" height="433" src="/wp-content/uploads/2018/05/word-image-5339.png" class="wp-image-5877" srcset="/wp-content/uploads/2018/05/word-image-5339.png 889w, /wp-content/uploads/2018/05/word-image-5339-300x146.png 300w, /wp-content/uploads/2018/05/word-image-5339-768x374.png 768w" sizes="(max-width: 889px) 100vw, 889px" /></p>
<p>
  步骤3：创建视图
</p>
<p>
  步骤1：
</p>
<p><img loading="lazy" decoding="async" width="1033" height="699" src="/wp-content/uploads/2018/05/word-image-5340.png" class="wp-image-5878" srcset="/wp-content/uploads/2018/05/word-image-5340.png 1033w, /wp-content/uploads/2018/05/word-image-5340-300x203.png 300w, /wp-content/uploads/2018/05/word-image-5340-768x520.png 768w, /wp-content/uploads/2018/05/word-image-5340-1024x693.png 1024w, /wp-content/uploads/2018/05/word-image-5340-220x150.png 220w" sizes="(max-width: 1033px) 100vw, 1033px" /></p>
<p>
  步骤2：打开列表页，设置添加弹出看连接
</p>
<p><img loading="lazy" decoding="async" width="1248" height="268" src="/wp-content/uploads/2018/05/word-image-5341.png" class="wp-image-5879" srcset="/wp-content/uploads/2018/05/word-image-5341.png 1248w, /wp-content/uploads/2018/05/word-image-5341-300x64.png 300w, /wp-content/uploads/2018/05/word-image-5341-768x165.png 768w, /wp-content/uploads/2018/05/word-image-5341-1024x220.png 1024w" sizes="(max-width: 1248px) 100vw, 1248px" /></p>
<h3>2）加载视图 （修改form表单）</h3>
<p>
  步骤1：控制器方法获取所有直播流数据传递给视图显示
</p>
<p><img loading="lazy" decoding="async" width="955" height="440" src="/wp-content/uploads/2018/05/word-image-5342.png" class="wp-image-5880" srcset="/wp-content/uploads/2018/05/word-image-5342.png 955w, /wp-content/uploads/2018/05/word-image-5342-300x138.png 300w, /wp-content/uploads/2018/05/word-image-5342-768x354.png 768w" sizes="(max-width: 955px) 100vw, 955px" /></p>
<p>
  步骤2：更改form表单
</p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;title&gt;添加管理员 &#8211; 管理员管理 &#8211; H-ui.admin v3.1&lt;/title&gt;
</p>
<p>
  &lt;meta name=&#8221;keywords&#8221; content=&#8221;H-ui.admin v3.1,H-ui网站后台模版,后台模版下载,后台管理系统模版,HTML后台模版下载&#8221;&gt;
</p>
<p>
  &lt;meta name=&#8221;description&#8221; content=&#8221;H-ui.admin v3.1，是一款由国人开发的轻量级扁平化网站后台模板，完全免费开源的网站后台管理系统模版，适合中小型CMS后台系统。&#8221;&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;article class=&#8221;page-container&#8221;&gt;
</p>
<p>
  	&lt;form class=&#8221;form form-horizontal&#8221; id=&#8221;form-admin-add&#8221;&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;&lt;span class=&#8221;c-red&#8221;&gt;*&lt;/span&gt;直播课程名称：&lt;/label&gt;
</p>
<p>
  		&lt;div class=&#8221;formControls col-xs-8 col-sm-9&#8243;&gt;
</p>
<p>
  			&lt;input type=&#8221;text&#8221; class=&#8221;input-text&#8221; value=&#8221;&#8221; placeholder=&#8221;&#8221; id=&#8221;adminName&#8221; name=&#8221;adminName&#8221;&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;所属直播流：&lt;/label&gt;
</p>
<p>
  		&lt;div class=&#8221;formControls col-xs-8 col-sm-9&#8243;&gt; &lt;span class=&#8221;select-box&#8221; style=&#8221;width:150px;&#8221;&gt;
</p>
<p>
  			&lt;select class=&#8221;select&#8221; name=&#8221;adminRole&#8221; size=&#8221;1&#8243;&gt;
</p>
<p>
  				@foreach ($streams as $stream)
</p>
<p>
  				&lt;option value=&#8221;{{ $stream-&gt;id }}&#8221;&gt;{{ $stream-&gt;stream_name }}&lt;/option&gt;
</p>
<p>
  				@endforeach
</p>
<p>
  			&lt;/select&gt;
</p>
<p>
  			&lt;/span&gt; &lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;&lt;span class=&#8221;c-red&#8221;&gt;*&lt;/span&gt;直播日期：&lt;/label&gt;
</p>
<p>
  		&lt;div class=&#8221;formControls col-xs-8 col-sm-9&#8243;&gt;
</p>
<p>
  			&lt;input type=&#8221;text&#8221; onfocus=&#8221;WdatePicker({ maxDate:&#8217;#F{$dp.$D(\&#8217;start_time\&#8217;)||\&#8217;%y-%M-%d\&#8217;}&#8217; })&#8221; id=&#8221;start_time&#8221; class=&#8221;input-text Wdate&#8221; style=&#8221;width:120px;&#8221;&gt;
</p>
<p>
  			&#8211;
</p>
<p>
  			&lt;input type=&#8221;text&#8221; onfocus=&#8221;WdatePicker({ minDate:&#8217;#F{$dp.$D(\&#8217;end_time\&#8217;)}&#8217;,maxDate:&#8217;%y-%M-%d&#8217; })&#8221; id=&#8221;end_time&#8221; class=&#8221;input-text Wdate&#8221; style=&#8221;width:120px;&#8221;&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;div class=&#8221;col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-3&#8243;&gt;
</p>
<p>
  			&lt;input class=&#8221;btn btn-primary radius&#8221; type=&#8221;submit&#8221; value=&#8221;&amp;nbsp;&amp;nbsp;提交&amp;nbsp;&amp;nbsp;&#8221;&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;/form&gt;
</p>
<p>
  &lt;/article&gt;
</p>
<p>
  &lt;!&#8211;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/My97DatePicker/4.8/WdatePicker.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/jquery.validate.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/validate-methods.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/messages_zh.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  $(function(){
</p>
<p>
  	$(&#8216;.skin-minimal input&#8217;).iCheck({
</p>
<p>
  		checkboxClass: &#8216;icheckbox-blue&#8217;,
</p>
<p>
  		radioClass: &#8216;iradio-blue&#8217;,
</p>
<p>
  		increaseArea: &#8216;20%&#8217;
</p>
<p>
  	});
</p>
</p>
<p>
  	$(&#8220;#form-admin-add&#8221;).validate({
</p>
<p>
  		rules:{
</p>
<p>
  			adminName:{
</p>
<p>
  				required:true,
</p>
<p>
  				minlength:4,
</p>
<p>
  				maxlength:16
</p>
<p>
  			},
</p>
<p>
  			password:{
</p>
<p>
  				required:true,
</p>
<p>
  			},
</p>
<p>
  			password2:{
</p>
<p>
  				required:true,
</p>
<p>
  				equalTo: &#8220;#password&#8221;
</p>
<p>
  			},
</p>
<p>
  			sex:{
</p>
<p>
  				required:true,
</p>
<p>
  			},
</p>
<p>
  			phone:{
</p>
<p>
  				required:true,
</p>
<p>
  				isPhone:true,
</p>
<p>
  			},
</p>
<p>
  			email:{
</p>
<p>
  				required:true,
</p>
<p>
  				email:true,
</p>
<p>
  			},
</p>
<p>
  			adminRole:{
</p>
<p>
  				required:true,
</p>
<p>
  			},
</p>
<p>
  		},
</p>
<p>
  		onkeyup:false,
</p>
<p>
  		focusCleanup:true,
</p>
<p>
  		success:&#8221;valid&#8221;,
</p>
<p>
  		submitHandler:function(form){
</p>
<p>
  			$(form).ajaxSubmit({
</p>
<p>
  				type: &#8216;post&#8217;,
</p>
<p>
  				url: &#8220;xxxxxxx&#8221; ,
</p>
<p>
  				success: function(data){
</p>
<p>
  					layer.msg(&#8216;添加成功!&#8217;,{icon:1,time:1000});
</p>
<p>
  				},
</p>
<p>
                  error: function(XmlHttpRequest, textStatus, errorThrown){
</p>
<p>
  					layer.msg(&#8216;error!&#8217;,{icon:1,time:1000});
</p>
<p>
  				}
</p>
<p>
  			});
</p>
<p>
  			var index = parent.layer.getFrameIndex(window.name);
</p>
<p>
  			parent.$(&#8216;.btn-refresh&#8217;).click();
</p>
<p>
  			parent.layer.close(index);
</p>
<p>
  		}
</p>
<p>
  	});
</p>
<p>
  });
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;!&#8211;/请在上方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<p><img loading="lazy" decoding="async" width="1065" height="485" src="/wp-content/uploads/2018/05/word-image-5343.png" class="wp-image-5881" srcset="/wp-content/uploads/2018/05/word-image-5343.png 1065w, /wp-content/uploads/2018/05/word-image-5343-300x137.png 300w, /wp-content/uploads/2018/05/word-image-5343-768x350.png 768w, /wp-content/uploads/2018/05/word-image-5343-1024x466.png 1024w" sizes="(max-width: 1065px) 100vw, 1065px" /></p>
<h3>3）数据处理</h3>
<p>
  表单验证插件：<a href="http://validform.rjboy.cn/">http://validform.rjboy.cn/</a>
</p>
<p>
  后台表单提交插件说明：<a href="https://www.cnblogs.com/si-shaohua/p/3780321.html">https://www.cnblogs.com/si-shaohua/p/3780321.html</a>
</p>
<p>
  步骤1：更改表单插件
</p>
<p>
  &lt;!DOCTYPE HTML&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;renderer&#8221; content=&#8221;webkit|ie-comp|ie-stand&#8221;&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;
</p>
<p>
  &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#8221; /&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-siteapp&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if lt IE 9]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/html5shiv.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/respond.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/css/H-ui.min.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/H-ui.admin.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/Hui-iconfont/1.0.8/iconfont.css&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/skin/default/skin.css&#8221; id=&#8221;skin&#8221; /&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/css/style.css&#8221; /&gt;
</p>
<p>
  &lt;!&#8211;[if IE 6]&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/DD_belatedPNG_0.0.8a-min.js&#8221; &gt;&lt;/script&gt;
</p>
<p>
  &lt;script&gt;DD_belatedPNG.fix(&#8216;*&#8217;);&lt;/script&gt;
</p>
<p>
  &lt;![endif]&#8211;&gt;
</p>
<p>
  &lt;title&gt;添加管理员 &#8211; 管理员管理 &#8211; H-ui.admin v3.1&lt;/title&gt;
</p>
<p>
  &lt;meta name=&#8221;keywords&#8221; content=&#8221;H-ui.admin v3.1,H-ui网站后台模版,后台模版下载,后台管理系统模版,HTML后台模版下载&#8221;&gt;
</p>
<p>
  &lt;meta name=&#8221;description&#8221; content=&#8221;H-ui.admin v3.1，是一款由国人开发的轻量级扁平化网站后台模板，完全免费开源的网站后台管理系统模版，适合中小型CMS后台系统。&#8221;&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;article class=&#8221;page-container&#8221;&gt;
</p>
<p>
  	&lt;form class=&#8221;form form-horizontal&#8221; id=&#8221;form-admin-add&#8221;&gt;
</p>
<p>
  		{{ csrf_field() }}
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;&lt;span class=&#8221;c-red&#8221;&gt;*&lt;/span&gt;直播课程名称：&lt;/label&gt;
</p>
<p>
  		&lt;div class=&#8221;formControls col-xs-8 col-sm-9&#8243;&gt;
</p>
<p>
  			&lt;input required type=&#8221;text&#8221; class=&#8221;input-text&#8221; value=&#8221;&#8221; placeholder=&#8221;&#8221; id=&#8221;live_name&#8221; name=&#8221;live_name&#8221;&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;所属直播流：&lt;/label&gt;
</p>
<p>
  		&lt;div class=&#8221;formControls col-xs-8 col-sm-9&#8243;&gt; &lt;span class=&#8221;select-box&#8221; style=&#8221;width:150px;&#8221;&gt;
</p>
<p>
  			&lt;select class=&#8221;select&#8221; name=&#8221;stream_id&#8221; size=&#8221;1&#8243;&gt;
</p>
<p>
  				@foreach ($streams as $stream)
</p>
<p>
  				&lt;option value=&#8221;{{ $stream-&gt;id }}&#8221;&gt;{{ $stream-&gt;stream_name }}&lt;/option&gt;
</p>
<p>
  				@endforeach
</p>
<p>
  			&lt;/select&gt;
</p>
<p>
  			&lt;/span&gt; &lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;label class=&#8221;form-label col-xs-4 col-sm-3&#8243;&gt;&lt;span class=&#8221;c-red&#8221;&gt;*&lt;/span&gt;直播日期：&lt;/label&gt;
</p>
<p>
  		&lt;div class=&#8221;formControls col-xs-8 col-sm-9&#8243;&gt;
</p>
<p>
  			&lt;input required type=&#8221;text&#8221; onfocus=&#8221;WdatePicker({ maxDate:&#8217;#F{$dp.$D(\&#8217;start_time\&#8217;)||\&#8217;%y-%M-%d\&#8217;}&#8217; })&#8221; id=&#8221;start_time&#8221; name=&#8221;start_time&#8221; class=&#8221;input-text Wdate&#8221; style=&#8221;width:120px;&#8221;&gt;
</p>
<p>
  			&#8211;
</p>
<p>
  			&lt;input required type=&#8221;text&#8221; onfocus=&#8221;WdatePicker({ minDate:&#8217;#F{$dp.$D(\&#8217;end_time\&#8217;)}&#8217;,maxDate:&#8217;%y-%M-%d&#8217; })&#8221; id=&#8221;end_time&#8221; name=&#8221;end_time&#8221; class=&#8221;input-text Wdate&#8221; style=&#8221;width:120px;&#8221;&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;div class=&#8221;row cl&#8221;&gt;
</p>
<p>
  		&lt;div class=&#8221;col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-3&#8243;&gt;
</p>
<p>
  			&lt;input class=&#8221;btn btn-primary radius&#8221; type=&#8221;submit&#8221; value=&#8221;&amp;nbsp;&amp;nbsp;提交&amp;nbsp;&amp;nbsp;&#8221;&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  	&lt;/form&gt;
</p>
<p>
  &lt;/article&gt;
</p>
<p>
  &lt;!&#8211;_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/My97DatePicker/4.8/WdatePicker.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery/1.9.1/jquery.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/layer/2.4/layer.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui/js/H-ui.min.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/static&#8217;) }}/h-ui.admin/js/H-ui.admin.js&#8221;&gt;&lt;/script&gt; &lt;!&#8211;/_footer 作为公共模版分离出去&#8211;&gt;
</p>
<p>
  &lt;!&#8211;请在下方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/jquery.validate.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/validate-methods.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;admin/lib&#8217;) }}/jquery.validation/1.14.0/messages_zh.js&#8221;&gt;&lt;/script&gt;
</p>
<p><strong>&lt;script type=&#8221;text/javascript&#8221;&gt;</strong>
</p>
<p><strong>$(function(){</strong>
</p>
<p><strong>	$(&#8216;.skin-minimal input&#8217;).iCheck({</strong>
</p>
<p><strong>		checkboxClass: &#8216;icheckbox-blue&#8217;,</strong>
</p>
<p><strong>		radioClass: &#8216;iradio-blue&#8217;,</strong>
</p>
<p><strong>		increaseArea: &#8216;20%&#8217;</strong>
</p>
<p><strong>	});</strong>
</p>
<p><strong>	</strong>
</p>
<p><strong>	$(&#8220;#form-admin-add&#8221;).validate({</strong>
</p>
<p><strong>		rules:{</strong>
</p>
<p><strong>			live_name:{</strong>
</p>
<p><strong>				required:true,</strong>
</p>
<p><strong>				minlength:4,</strong>
</p>
<p><strong>				maxlength:16</strong>
</p>
<p><strong>			},</strong>
</p>
<p><strong>			start_time:{</strong>
</p>
<p><strong>				required:true,</strong>
</p>
<p><strong>			},</strong>
</p>
<p><strong>			end_time:{</strong>
</p>
<p><strong>				required:true,</strong>
</p>
<p><strong>			},</strong>
</p>
<p><strong>		},</strong>
</p>
<p><strong>		onkeyup:false,</strong>
</p>
<p><strong>		focusCleanup:true,</strong>
</p>
<p><strong>		success:&#8221;valid&#8221;,</strong>
</p>
<p><strong>		submitHandler:function(form){</strong>
</p>
<p><strong>			$(form).ajaxSubmit({</strong>
</p>
<p><strong>				type: &#8216;post&#8217;,</strong>
</p>
<p><strong>				url: &#8220;{{ url(&#8216;admin/live/add&#8217;) }}&#8221; ,</strong>
</p>
<p><strong>				success: function(data){</strong>
</p>
<p><strong>					window.parent.location.reload();</strong>
</p>
<p><strong>					parent.layer.msg(&#8216;添加成功!&#8217;,{icon:1,time:1000});</strong>
</p>
<p><strong>					var index = parent.layer.getFrameIndex(window.name);</strong>
</p>
<p><strong>					parent.$(&#8216;.btn-refresh&#8217;).click();</strong>
</p>
<p><strong>					parent.layer.close(index);</strong>
</p>
<p><strong>				},</strong>
</p>
<p><strong>                error: function(XmlHttpRequest, textStatus, errorThrown){</strong>
</p>
<p><strong>					layer.msg(&#8216;error!&#8217;,{icon:1,time:1000});</strong>
</p>
<p><strong>				}</strong>
</p>
<p><strong>			});</strong>
</p>
<p><strong>		}</strong>
</p>
<p><strong>	});</strong>
</p>
<p><strong>});</strong>
</p>
<p><strong>&lt;/script&gt; </strong>
</p>
<p>
  &lt;!&#8211;/请在上方写此页面业务相关的脚本&#8211;&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<p>
  步骤2：数据处理
</p>
<p><img loading="lazy" decoding="async" width="1168" height="607" src="/wp-content/uploads/2018/05/word-image-5344.png" class="wp-image-5882" srcset="/wp-content/uploads/2018/05/word-image-5344.png 1168w, /wp-content/uploads/2018/05/word-image-5344-300x156.png 300w, /wp-content/uploads/2018/05/word-image-5344-768x399.png 768w, /wp-content/uploads/2018/05/word-image-5344-1024x532.png 1024w" sizes="(max-width: 1168px) 100vw, 1168px" /></p>
<p>
  //添加方法
</p>
<p>
  public function add(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;live_name&#8217;, &#8216;stream_id&#8217;, &#8216;start_time&#8217;, &#8216;end_time&#8217;]);
</p>
<p>
  		$postData[&#8216;start_time&#8217;] = strtotime($postData[&#8216;start_time&#8217;]);
</p>
<p>
  		$postData[&#8216;end_time&#8217;] = strtotime($postData[&#8216;end_time&#8217;]);
</p>
<p>
  		//3.插入数据库
</p>
<p>
  		$rs = Live::create($postData);
</p>
<p>
  		//4.判断状态
</p>
<p>
  		echo $rs ? 1 : 0;
</p>
<p>
  	} else {
</p>
<p>
  		//2.获取所有直播流数据
</p>
<p>
  		$streams = Stream::get();
</p>
<p>
  		//3.加载视图并传递数据
</p>
<p>
  		return view(&#8216;admin.live.add&#8217;, compact(&#8216;streams&#8217;));
</p>
<p>
  	}
</p>
<p>
  }
</p>
<h1>在线教育首页</h1>
<h2>加载视图</h2>
<ul>
<li>
    步骤1：创建路由
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="951" height="221" src="/wp-content/uploads/2018/05/word-image-5345.png" class="wp-image-5883" srcset="/wp-content/uploads/2018/05/word-image-5345.png 951w, /wp-content/uploads/2018/05/word-image-5345-300x70.png 300w, /wp-content/uploads/2018/05/word-image-5345-768x178.png 768w" sizes="(max-width: 951px) 100vw, 951px" /></p>
<ul>
<li>
    步骤2：创建控制器方法并加载视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="878" height="485" src="/wp-content/uploads/2018/05/word-image-5346.png" class="wp-image-5884" srcset="/wp-content/uploads/2018/05/word-image-5346.png 878w, /wp-content/uploads/2018/05/word-image-5346-300x166.png 300w, /wp-content/uploads/2018/05/word-image-5346-768x424.png 768w" sizes="(max-width: 878px) 100vw, 878px" /></p>
<ul>
<li>
    步骤3：创建视图
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1037" height="659" src="/wp-content/uploads/2018/05/word-image-5347.png" class="wp-image-5885" srcset="/wp-content/uploads/2018/05/word-image-5347.png 1037w, /wp-content/uploads/2018/05/word-image-5347-300x191.png 300w, /wp-content/uploads/2018/05/word-image-5347-768x488.png 768w, /wp-content/uploads/2018/05/word-image-5347-1024x651.png 1024w" sizes="(max-width: 1037px) 100vw, 1037px" /></p>
<h2>数据处理（循环直播数据）</h2>
<ul>
<li>
    步骤1：更改控制器方法，查询数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1105" height="472" src="/wp-content/uploads/2018/05/word-image-5348.png" class="wp-image-5886" srcset="/wp-content/uploads/2018/05/word-image-5348.png 1105w, /wp-content/uploads/2018/05/word-image-5348-300x128.png 300w, /wp-content/uploads/2018/05/word-image-5348-768x328.png 768w, /wp-content/uploads/2018/05/word-image-5348-1024x437.png 1024w" sizes="(max-width: 1105px) 100vw, 1105px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Home;
</p>
<p>
  use App\Http\Model\Live;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class IndexController extends Controller
</p>
<p>
  {
</p>
<p>
      //首页
</p>
<p>
      public function index()
</p>
<p>
      {
</p>
<p>
      	//1.获取所有直播数据（保证正在直播中，注：实战工作中根据产品经理的算法显示首页数据）
</p>
<p>
      	$lives = Live::where(&#8216;start_time&#8217;, &#8216;&lt;&#8216;, time())
</p>
<p>
      		-&gt;where(&#8216;end_time&#8217;, &#8216;&gt;&#8217;, time())
</p>
<p>
      		-&gt;limit(4)
</p>
<p>
      		-&gt;get();
</p>
<p>
      	//2.传递给视图
</p>
<p>
          return view(&#8216;home.index.index&#8217;, compact(&#8216;lives&#8217;));
</p>
<p>
      }
</p>
<p>
  }
</p>
<ul>
<li>
    步骤2：视图循环显示
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="1277" height="588" src="/wp-content/uploads/2018/05/word-image-5349.png" class="wp-image-5887" srcset="/wp-content/uploads/2018/05/word-image-5349.png 1277w, /wp-content/uploads/2018/05/word-image-5349-300x138.png 300w, /wp-content/uploads/2018/05/word-image-5349-768x354.png 768w, /wp-content/uploads/2018/05/word-image-5349-1024x472.png 1024w" sizes="(max-width: 1277px) 100vw, 1277px" /></p>
<p>
  &lt;ul class=&#8221;public-class-live-content clearfix&#8221;&gt;
</p>
<p>
      &lt;!&#8211; &lt;li&gt;
</p>
<p>
          &lt;a style=&#8221;cursor:pointer&#8221; data-url=&#8221;/web/html/liveVideo.html?roomId=2C2A076B02BDE9FE9C33DC5901307461&amp;amp;courseId=126&#8243;&gt;
</p>
<p>
              &lt;div class=&#8221;img&#8221;&gt;
</p>
<p>
                  &lt;img src=&#8221;{{ asset(&#8216;home/img&#8217;) }}/7fc5a47439f2483b8dca9536144dcb6d.jpg&#8221;&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;public-class-live-detail&#8221;&gt;
</p>
<p>
                  &lt;div class=&#8221;detailCourseInfo clearfix&#8221;&gt;
</p>
<p>
                      &lt;div class=&#8221;detailCourseName&#8221; title=&#8221;PS超级设计师公开课&#8221;&gt;PS超级设计师公开课&lt;/div&gt;
</p>
<p>
                      &lt;div class=&#8221;detailTeacher&#8221;&gt;讲师：任老师&lt;/div&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
                  &lt;div class=&#8221;detailLiveInfo clearfix&#8221;&gt;
</p>
<p>
                      &lt;div class=&#8221;detailLiveDate&#8221;&gt;最近直播：03/24  20:00&lt;/div&gt;
</p>
<p>
                      &lt;div class=&#8221;detailLiving&#8221;&gt;
</p>
<p>
                          &lt;img src=&#8221;{{ asset(&#8216;home/img&#8217;) }}/zhiboNoStart.png&#8221; alt=&#8221;&#8221;&gt;
</p>
<p>
                          &lt;span class=&#8221;noStart&#8221;&gt;直播未开始&lt;/span&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
          &lt;/a&gt;
</p>
<p>
      &lt;/li&gt; &#8211;&gt;
</p>
<p>
      @foreach ($lives as $live)
</p>
<p>
      &lt;li&gt;
</p>
<p>
          &lt;a style=&#8221;cursor:pointer&#8221; &gt;
</p>
<p>
              &lt;div class=&#8221;img&#8221;&gt;
</p>
<p>
                  @if ($live-&gt;img )
</p>
<p>
                      &lt;img src=&#8221;{{ $live-&gt;img }}&#8221; with=&#8221;285&#8243; height=&#8221;161&#8243;/&gt;
</p>
<p>
                  @else
</p>
<p>
                      &lt;img src=&#8221;{{ asset(&#8216;img/default.png&#8217;) }}&#8221; with=&#8221;285&#8243; height=&#8221;161&#8243;/&gt;
</p>
<p>
                  @endif
</p>
<p>
              &lt;/div&gt;
</p>
<p>
              &lt;div class=&#8221;public-class-live-detail&#8221;&gt;
</p>
<p>
                   &lt;div class=&#8221;detailCourseInfo clearfix&#8221;&gt;
</p>
<p>
                      &lt;div class=&#8221;detailCourseName&#8221; title=&#8221;PS超级设计师公开课&#8221;&gt;{{ $live-&gt;live_name}}&lt;/div&gt;
</p>
<p>
                      &lt;div class=&#8221;detailTeacher&#8221;&gt;讲师：任老师&lt;/div&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
                  &lt;div class=&#8221;detailLiveInfo clearfix&#8221;&gt;
</p>
<p>
                      &lt;div class=&#8221;detailLiveDate&#8221;&gt;最近直播：03/24  20:00&lt;/div&gt;
</p>
<p>
                      &lt;div class=&#8221;detailLiving&#8221;&gt;
</p>
<p>
                          &lt;img src=&#8221;{{ asset(&#8216;home/img&#8217;) }}/zhiboNoStart.png&#8221; alt=&#8221;&#8221;&gt;
</p>
<p>
                          &lt;span class=&#8221;noStart&#8221;&gt;直播未开始&lt;/span&gt;
</p>
<p>
                      &lt;/div&gt;
</p>
<p>
                  &lt;/div&gt;
</p>
<p>
              &lt;/div&gt;
</p>
<p>
          &lt;/a&gt;
</p>
<p>
      &lt;/li&gt;
</p>
<p>
      @endforeach
</p>
<p>
  &lt;/ul&gt;
</p>
<h1>点击首页直播，在线观看</h1>
<p>
  步骤1：点击跳转到直播详情页
</p>
<p>
  1）定义路由
</p>
<p><img loading="lazy" decoding="async" width="853" height="191" src="/wp-content/uploads/2018/05/word-image-5350.png" class="wp-image-5888" srcset="/wp-content/uploads/2018/05/word-image-5350.png 853w, /wp-content/uploads/2018/05/word-image-5350-300x67.png 300w, /wp-content/uploads/2018/05/word-image-5350-768x172.png 768w" sizes="(max-width: 853px) 100vw, 853px" /></p>
<p>
  2）修改首页跳转链接
</p>
<p><img loading="lazy" decoding="async" width="1203" height="307" src="/wp-content/uploads/2018/05/word-image-5351.png" class="wp-image-5889" srcset="/wp-content/uploads/2018/05/word-image-5351.png 1203w, /wp-content/uploads/2018/05/word-image-5351-300x77.png 300w, /wp-content/uploads/2018/05/word-image-5351-768x196.png 768w, /wp-content/uploads/2018/05/word-image-5351-1024x261.png 1024w" sizes="(max-width: 1203px) 100vw, 1203px" /></p>
<p>
  步骤2：创建控制器方法，接受直播id，获取直播流相关信息拼接拉流地址
</p>
<p><img loading="lazy" decoding="async" width="1207" height="580" src="/wp-content/uploads/2018/05/word-image-5352.png" class="wp-image-5890" srcset="/wp-content/uploads/2018/05/word-image-5352.png 1207w, /wp-content/uploads/2018/05/word-image-5352-300x144.png 300w, /wp-content/uploads/2018/05/word-image-5352-768x369.png 768w, /wp-content/uploads/2018/05/word-image-5352-1024x492.png 1024w" sizes="(max-width: 1207px) 100vw, 1207px" /></p>
<p>
  &lt;?php
</p>
<p>
  namespace App\Http\Controllers\Home;
</p>
<p>
  use App\Http\Model\Live;
</p>
<p>
  use App\Http\Model\Stream;
</p>
<p>
  use Illuminate\Http\Request;
</p>
<p>
  use App\Http\Controllers\Controller;
</p>
<p>
  class LiveController extends Controller
</p>
<p>
  {
</p>
<p>
      //视频播放页
</p>
<p>
      public function detail(Request $request)
</p>
<p>
      {
</p>
<p>
      	//1.接受数据获取直播流信息
</p>
<p>
          $stream_id = $request-&gt;input(&#8216;stream_id&#8217;);
</p>
<p>
          //2.查询直播流信息
</p>
<p>
          $stream = Stream::where(&#8216;id&#8217;, $stream_id)-&gt;first();
</p>
<p>
          //3.拼接拉流地址
</p>
<p>
          $pullVideo = &#8220;rtmp://pili-live-rtmp.php.sk-school.com/201801140002/&#8221;.$stream-&gt;stream_name;
</p>
</p>
<p>
      	//2.传递给视图
</p>
<p>
          return view(&#8216;home.live.detail&#8217;, compact(&#8216;pullVideo&#8217;));
</p>
<p>
      }
</p>
<p>
  }
</p>
<p>
  步骤3：点击进入详情通过ck播放器播放
</p>
<p>
  &lt;!DOCTYPE html&gt;
</p>
<p>
  &lt;html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221;&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=utf-8&#8243; /&gt;
</p>
<p>
  &lt;title&gt;ckplayer简单调用演示&lt;/title&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;div id=&#8221;a1&#8243;&gt;&lt;/div&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; <strong>src=&#8221;{{ asset(&#8216;ck/ckplayer&#8217;) }}/ckplayer.js&#8221; </strong>charset=&#8221;utf-8&#8243;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  	var flashvars={
</p>
<p><strong>		f:'{{ $pullVideo }}&#8217;,</strong>
</p>
<p>
  		c:0,
</p>
<p>
  		b:1,
</p>
<p>
  		i:&#8217;http://www.ckplayer.com/static/images/cqdw.jpg&#8217;
</p>
<p>
  		};
</p>
<p>
  	var video=[&#8216;http://img.ksbbs.com/asset/Mon_1605/0ec8cc80112a2d6.mp4-&gt;video/mp4&#8217;];
</p>
<p>
  	CKobject.embed(&#8220;<strong>{{ asset(&#8216;ck/ckplayer&#8217;) }}</strong>/ckplayer.swf&#8221;,&#8217;a1&#8242;,&#8217;ckplayer_a1&#8242;,&#8217;600&#8242;,&#8217;400&#8242;,false,flashvars,video)
</p>
<p>
  	function closelights(){//关灯
</p>
<p>
  		alert(&#8216; 本演示不支持开关灯&#8217;);
</p>
<p>
  	}
</p>
<p>
  	function openlights(){//开灯
</p>
<p>
  		alert(&#8216; 本演示不支持开关灯&#8217;);
</p>
<p>
  	}
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/5812.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
