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

<channel>
	<title>图片上传 &#8211; 个人随笔</title>
	<atom:link href="/label/%E5%9B%BE%E7%89%87%E4%B8%8A%E4%BC%A0/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Thu, 14 Jun 2018 10:56:19 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.1</generator>

<image>
	<url>/wp-content/uploads/2022/01/cropped-截屏2022-01-01-18.57.09-32x32.png</url>
	<title>图片上传 &#8211; 个人随笔</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>TP5.0（四）添加文章、添加验证、图片上传、缩略图、图片预览、文章列表展示、分页、文章编辑、文章删除、XSS 攻击、Jquery-Validate 验证插件、钩子函数</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7628.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7628.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 09 Jun 2018 00:41:37 +0000</pubDate>
				<category><![CDATA[TP5.0]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[Jquery-Validate 验证插件]]></category>
		<category><![CDATA[XSS 攻击]]></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>
		<category><![CDATA[钩子函数]]></category>
		<guid isPermaLink="false">/?p=7628</guid>

					<description><![CDATA[TP5第四天 一、完成文章的添加 完成文章模板的展示 第一步：修改left.html模板，加一个添加分类的链接 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>TP5第四天</h1>
<h1>一、完成文章的添加</h1>
<h2>完成文章模板的展示</h2>
<p>第一步：修改left.html模板，加一个添加分类的链接地址</p>
<p><img fetchpriority="high" decoding="async" width="1262" height="365" class="wp-image-7629" src="/wp-content/uploads/2018/06/word-image-233.png" srcset="/wp-content/uploads/2018/06/word-image-233.png 1262w, /wp-content/uploads/2018/06/word-image-233-300x87.png 300w, /wp-content/uploads/2018/06/word-image-233-768x222.png 768w, /wp-content/uploads/2018/06/word-image-233-1024x296.png 1024w" sizes="(max-width: 1262px) 100vw, 1262px" /></p>
<p>第二步：在后台admin创建一个Article控制器，并建立一个add方法，完成文章的入库操作</p>
<p><img decoding="async" width="749" height="368" class="wp-image-7630" src="/wp-content/uploads/2018/06/word-image-234.png" srcset="/wp-content/uploads/2018/06/word-image-234.png 749w, /wp-content/uploads/2018/06/word-image-234-300x147.png 300w" sizes="(max-width: 749px) 100vw, 749px" /></p>
<p>模板分配数据：</p>
<p><img decoding="async" width="670" height="389" class="wp-image-7631" src="/wp-content/uploads/2018/06/word-image-235.png" srcset="/wp-content/uploads/2018/06/word-image-235.png 670w, /wp-content/uploads/2018/06/word-image-235-300x174.png 300w" sizes="(max-width: 670px) 100vw, 670px" /></p>
<h2>使用富文本编辑器完成文章的内容添加</h2>
<p>第一步：把课件中的相应的ueditor复制到网站根目录下面的插件目录plugin中</p>
<p><img loading="lazy" decoding="async" width="771" height="251" class="wp-image-7632" src="/wp-content/uploads/2018/06/word-image-236.png" srcset="/wp-content/uploads/2018/06/word-image-236.png 771w, /wp-content/uploads/2018/06/word-image-236-300x98.png 300w, /wp-content/uploads/2018/06/word-image-236-768x250.png 768w" sizes="(max-width: 771px) 100vw, 771px" /></p>
<p>第二步：引入核心js文件，并且给textarea 设置一个id=content</p>
<p><img loading="lazy" decoding="async" width="1304" height="496" class="wp-image-7633" src="/wp-content/uploads/2018/06/word-image-237.png" srcset="/wp-content/uploads/2018/06/word-image-237.png 1304w, /wp-content/uploads/2018/06/word-image-237-300x114.png 300w, /wp-content/uploads/2018/06/word-image-237-768x292.png 768w, /wp-content/uploads/2018/06/word-image-237-1024x389.png 1024w" sizes="(max-width: 1304px) 100vw, 1304px" /></p>
<p><img loading="lazy" decoding="async" width="1277" height="556" class="wp-image-7634" src="/wp-content/uploads/2018/06/word-image-238.png" srcset="/wp-content/uploads/2018/06/word-image-238.png 1277w, /wp-content/uploads/2018/06/word-image-238-300x131.png 300w, /wp-content/uploads/2018/06/word-image-238-768x334.png 768w, /wp-content/uploads/2018/06/word-image-238-1024x446.png 1024w" sizes="(max-width: 1277px) 100vw, 1277px" /></p>
<p>效果如下：</p>
<p><img loading="lazy" decoding="async" width="1040" height="418" class="wp-image-7635" src="/wp-content/uploads/2018/06/word-image-239.png" srcset="/wp-content/uploads/2018/06/word-image-239.png 1040w, /wp-content/uploads/2018/06/word-image-239-300x121.png 300w, /wp-content/uploads/2018/06/word-image-239-768x309.png 768w, /wp-content/uploads/2018/06/word-image-239-1024x412.png 1024w" sizes="(max-width: 1040px) 100vw, 1040px" /></p>
<h2>完成文章数据的入库</h2>
<p>第一步：设置表单name值</p>
<p><img loading="lazy" decoding="async" width="1315" height="712" class="wp-image-7636" src="/wp-content/uploads/2018/06/word-image-240.png" srcset="/wp-content/uploads/2018/06/word-image-240.png 1315w, /wp-content/uploads/2018/06/word-image-240-300x162.png 300w, /wp-content/uploads/2018/06/word-image-240-768x416.png 768w, /wp-content/uploads/2018/06/word-image-240-1024x554.png 1024w" sizes="(max-width: 1315px) 100vw, 1315px" /></p>
<p>第二步：在add方法中，完成数据的入库</p>
<p><img loading="lazy" decoding="async" width="935" height="563" class="wp-image-7637" src="/wp-content/uploads/2018/06/word-image-241.png" srcset="/wp-content/uploads/2018/06/word-image-241.png 935w, /wp-content/uploads/2018/06/word-image-241-300x180.png 300w, /wp-content/uploads/2018/06/word-image-241-768x462.png 768w" sizes="(max-width: 935px) 100vw, 935px" /></p>
<h2>使用验证器完成添加文章的验证</h2>
<p>在后台的admin的validate目录建立一个Article 的验证器</p>
<p><img loading="lazy" decoding="async" width="853" height="503" class="wp-image-7638" src="/wp-content/uploads/2018/06/word-image-242.png" srcset="/wp-content/uploads/2018/06/word-image-242.png 853w, /wp-content/uploads/2018/06/word-image-242-300x177.png 300w, /wp-content/uploads/2018/06/word-image-242-768x453.png 768w" sizes="(max-width: 853px) 100vw, 853px" /></p>
<p>添加文章的时候，调用验证器的对应场景进行验证：</p>
<p><img loading="lazy" decoding="async" width="977" height="645" class="wp-image-7639" src="/wp-content/uploads/2018/06/word-image-243.png" srcset="/wp-content/uploads/2018/06/word-image-243.png 977w, /wp-content/uploads/2018/06/word-image-243-300x198.png 300w, /wp-content/uploads/2018/06/word-image-243-768x507.png 768w" sizes="(max-width: 977px) 100vw, 977px" /></p>
<h2>完成文章的图片上传</h2>
<p>表单上传文件的要求：1、post提交 2、设置form的enctype=’multipart/form-data’</p>
<p><img loading="lazy" decoding="async" width="747" height="155" class="wp-image-7640" src="/wp-content/uploads/2018/06/word-image-244.png" srcset="/wp-content/uploads/2018/06/word-image-244.png 747w, /wp-content/uploads/2018/06/word-image-244-300x62.png 300w" sizes="(max-width: 747px) 100vw, 747px" /></p>
<p>设置上传文件的input标签</p>
<p><img loading="lazy" decoding="async" width="882" height="213" class="wp-image-7641" src="/wp-content/uploads/2018/06/word-image-245.png" srcset="/wp-content/uploads/2018/06/word-image-245.png 882w, /wp-content/uploads/2018/06/word-image-245-300x72.png 300w, /wp-content/uploads/2018/06/word-image-245-768x185.png 768w" sizes="(max-width: 882px) 100vw, 882px" /></p>
<p>控制器add方法处理上传文件的路径入库：</p>
<p><img loading="lazy" decoding="async" width="1076" height="650" class="wp-image-7642" src="/wp-content/uploads/2018/06/word-image-246.png" srcset="/wp-content/uploads/2018/06/word-image-246.png 1076w, /wp-content/uploads/2018/06/word-image-246-300x180.png 300w, /wp-content/uploads/2018/06/word-image-246-768x464.png 768w, /wp-content/uploads/2018/06/word-image-246-1024x619.png 1024w" sizes="(max-width: 1076px) 100vw, 1076px" /></p>
<p>数据库存储的路径形式如下：</p>
<p><img loading="lazy" decoding="async" width="490" height="44" class="wp-image-7643" src="/wp-content/uploads/2018/06/word-image-247.png" srcset="/wp-content/uploads/2018/06/word-image-247.png 490w, /wp-content/uploads/2018/06/word-image-247-300x27.png 300w" sizes="(max-width: 490px) 100vw, 490px" /></p>
<h2>6、完成文章图片缩略图生成</h2>
<p>在有文件上传成功的前提下，处理缩略图生成：</p>
<p><img loading="lazy" decoding="async" width="1208" height="664" class="wp-image-7644" src="/wp-content/uploads/2018/06/word-image-248.png" srcset="/wp-content/uploads/2018/06/word-image-248.png 1208w, /wp-content/uploads/2018/06/word-image-248-300x165.png 300w, /wp-content/uploads/2018/06/word-image-248-768x422.png 768w, /wp-content/uploads/2018/06/word-image-248-1024x563.png 1024w" sizes="(max-width: 1208px) 100vw, 1208px" /></p>
<p>注：函数thumb(width，height,缩放比例) ，缩放比例默认为1为等比例缩放，为2则是填充补白。</p>
<p>存储如下：</p>
<p><img loading="lazy" decoding="async" width="394" height="139" class="wp-image-7645" src="/wp-content/uploads/2018/06/word-image-249.png" srcset="/wp-content/uploads/2018/06/word-image-249.png 394w, /wp-content/uploads/2018/06/word-image-249-300x106.png 300w" sizes="(max-width: 394px) 100vw, 394px" /></p>
<p>数据库存储的路径：</p>
<p><img loading="lazy" decoding="async" width="548" height="53" class="wp-image-7646" src="/wp-content/uploads/2018/06/word-image-250.png" srcset="/wp-content/uploads/2018/06/word-image-250.png 548w, /wp-content/uploads/2018/06/word-image-250-300x29.png 300w" sizes="(max-width: 548px) 100vw, 548px" /></p>
<h2>实现上传图片的实时预览</h2>
<p>引入核心js文件：</p>
<p><img loading="lazy" decoding="async" width="765" height="177" class="wp-image-7647" src="/wp-content/uploads/2018/06/word-image-251.png" srcset="/wp-content/uploads/2018/06/word-image-251.png 765w, /wp-content/uploads/2018/06/word-image-251-300x69.png 300w" sizes="(max-width: 765px) 100vw, 765px" /></p>
<p><img loading="lazy" decoding="async" width="1115" height="287" class="wp-image-7648" src="/wp-content/uploads/2018/06/word-image-252.png" srcset="/wp-content/uploads/2018/06/word-image-252.png 1115w, /wp-content/uploads/2018/06/word-image-252-300x77.png 300w, /wp-content/uploads/2018/06/word-image-252-768x198.png 768w, /wp-content/uploads/2018/06/word-image-252-1024x264.png 1024w" sizes="(max-width: 1115px) 100vw, 1115px" /></p>
<p>在add.html模板文件设置预览的区域：<br />
<img loading="lazy" decoding="async" width="1205" height="362" class="wp-image-7649" src="/wp-content/uploads/2018/06/word-image-253.png" srcset="/wp-content/uploads/2018/06/word-image-253.png 1205w, /wp-content/uploads/2018/06/word-image-253-300x90.png 300w, /wp-content/uploads/2018/06/word-image-253-768x231.png 768w, /wp-content/uploads/2018/06/word-image-253-1024x308.png 1024w" sizes="(max-width: 1205px) 100vw, 1205px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="554" height="367" class="wp-image-7650" src="/wp-content/uploads/2018/06/word-image-254.png" srcset="/wp-content/uploads/2018/06/word-image-254.png 554w, /wp-content/uploads/2018/06/word-image-254-300x199.png 300w" sizes="(max-width: 554px) 100vw, 554px" /></p>
<h1>完成文章的列表展示</h1>
<h2>数据展示</h2>
<p>第一步：在后台admin的Article控制器中建立一个index方法，完成文章列表展示</p>
<p><img loading="lazy" decoding="async" width="1003" height="370" class="wp-image-7651" src="/wp-content/uploads/2018/06/word-image-255.png" srcset="/wp-content/uploads/2018/06/word-image-255.png 1003w, /wp-content/uploads/2018/06/word-image-255-300x111.png 300w, /wp-content/uploads/2018/06/word-image-255-768x283.png 768w" sizes="(max-width: 1003px) 100vw, 1003px" /></p>
<p>模板中index.php,循环输出</p>
<p><img loading="lazy" decoding="async" width="1287" height="516" class="wp-image-7652" src="/wp-content/uploads/2018/06/word-image-256.png" srcset="/wp-content/uploads/2018/06/word-image-256.png 1287w, /wp-content/uploads/2018/06/word-image-256-300x120.png 300w, /wp-content/uploads/2018/06/word-image-256-768x308.png 768w, /wp-content/uploads/2018/06/word-image-256-1024x411.png 1024w" sizes="(max-width: 1287px) 100vw, 1287px" /></p>
<h2>数据分页</h2>
<p>把模型的select方法改为paginate(每页显示条数)即可</p>
<p><img loading="lazy" decoding="async" width="976" height="366" class="wp-image-7653" src="/wp-content/uploads/2018/06/word-image-257.png" srcset="/wp-content/uploads/2018/06/word-image-257.png 976w, /wp-content/uploads/2018/06/word-image-257-300x113.png 300w, /wp-content/uploads/2018/06/word-image-257-768x288.png 768w" sizes="(max-width: 976px) 100vw, 976px" /></p>
<p>模板中输出分页页码：</p>
<p><img loading="lazy" decoding="async" width="1072" height="636" class="wp-image-7654" src="/wp-content/uploads/2018/06/word-image-258.png" srcset="/wp-content/uploads/2018/06/word-image-258.png 1072w, /wp-content/uploads/2018/06/word-image-258-300x178.png 300w, /wp-content/uploads/2018/06/word-image-258-768x456.png 768w, /wp-content/uploads/2018/06/word-image-258-1024x608.png 1024w" sizes="(max-width: 1072px) 100vw, 1072px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="581" height="249" class="wp-image-7655" src="/wp-content/uploads/2018/06/word-image-259.png" srcset="/wp-content/uploads/2018/06/word-image-259.png 581w, /wp-content/uploads/2018/06/word-image-259-300x129.png 300w" sizes="(max-width: 581px) 100vw, 581px" /></p>
<h1>完成文章编辑</h1>
<p>第一步：给编辑设置链接地址，携带文章的参数id</p>
<p><img loading="lazy" decoding="async" width="1304" height="235" class="wp-image-7656" src="/wp-content/uploads/2018/06/word-image-260.png" srcset="/wp-content/uploads/2018/06/word-image-260.png 1304w, /wp-content/uploads/2018/06/word-image-260-300x54.png 300w, /wp-content/uploads/2018/06/word-image-260-768x138.png 768w, /wp-content/uploads/2018/06/word-image-260-1024x185.png 1024w" sizes="(max-width: 1304px) 100vw, 1304px" /></p>
<p>第二步：建立一个upd方法完成数据回显到模板中</p>
<p><img loading="lazy" decoding="async" width="848" height="400" class="wp-image-7657" src="/wp-content/uploads/2018/06/word-image-261.png" srcset="/wp-content/uploads/2018/06/word-image-261.png 848w, /wp-content/uploads/2018/06/word-image-261-300x142.png 300w, /wp-content/uploads/2018/06/word-image-261-768x362.png 768w" sizes="(max-width: 848px) 100vw, 848px" /></p>
<p>第三步：模板中回显数据</p>
<p><img loading="lazy" decoding="async" width="1226" height="660" class="wp-image-7658" src="/wp-content/uploads/2018/06/word-image-262.png" srcset="/wp-content/uploads/2018/06/word-image-262.png 1226w, /wp-content/uploads/2018/06/word-image-262-300x162.png 300w, /wp-content/uploads/2018/06/word-image-262-768x413.png 768w, /wp-content/uploads/2018/06/word-image-262-1024x551.png 1024w" sizes="(max-width: 1226px) 100vw, 1226px" /></p>
<p><img loading="lazy" decoding="async" width="922" height="352" class="wp-image-7659" src="/wp-content/uploads/2018/06/word-image-263.png" srcset="/wp-content/uploads/2018/06/word-image-263.png 922w, /wp-content/uploads/2018/06/word-image-263-300x115.png 300w, /wp-content/uploads/2018/06/word-image-263-768x293.png 768w" sizes="(max-width: 922px) 100vw, 922px" /></p>
<p>效果：<br />
<img loading="lazy" decoding="async" width="516" height="399" class="wp-image-7660" src="/wp-content/uploads/2018/06/word-image-264.png" srcset="/wp-content/uploads/2018/06/word-image-264.png 516w, /wp-content/uploads/2018/06/word-image-264-300x232.png 300w" sizes="(max-width: 516px) 100vw, 516px" /></p>
<p>第四步：在upd方法中判断是否是post请求，完成数据的编辑入库</p>
<p><img loading="lazy" decoding="async" width="725" height="671" class="wp-image-7661" src="/wp-content/uploads/2018/06/word-image-265.png" srcset="/wp-content/uploads/2018/06/word-image-265.png 725w, /wp-content/uploads/2018/06/word-image-265-300x278.png 300w" sizes="(max-width: 725px) 100vw, 725px" /></p>
<p>可以设置Article模型自动维护时间戳：<br />
<img loading="lazy" decoding="async" width="504" height="236" class="wp-image-7662" src="/wp-content/uploads/2018/06/word-image-266.png" srcset="/wp-content/uploads/2018/06/word-image-266.png 504w, /wp-content/uploads/2018/06/word-image-266-300x140.png 300w" sizes="(max-width: 504px) 100vw, 504px" /></p>
<h1>完成文章删除</h1>
<p>第一步：给删除的链接地址设置链接，并且设置参数</p>
<p><img loading="lazy" decoding="async" width="1249" height="475" class="wp-image-7663" src="/wp-content/uploads/2018/06/word-image-267.png" srcset="/wp-content/uploads/2018/06/word-image-267.png 1249w, /wp-content/uploads/2018/06/word-image-267-300x114.png 300w, /wp-content/uploads/2018/06/word-image-267-768x292.png 768w, /wp-content/uploads/2018/06/word-image-267-1024x389.png 1024w" sizes="(max-width: 1249px) 100vw, 1249px" /></p>
<p>第二步：添加del方法完成删除</p>
<p><img loading="lazy" decoding="async" width="942" height="544" class="wp-image-7664" src="/wp-content/uploads/2018/06/word-image-268.png" srcset="/wp-content/uploads/2018/06/word-image-268.png 942w, /wp-content/uploads/2018/06/word-image-268-300x173.png 300w, /wp-content/uploads/2018/06/word-image-268-768x444.png 768w" sizes="(max-width: 942px) 100vw, 942px" /></p>
<h1>五、XSS攻击</h1>
<h2>xss介绍</h2>
<p><img loading="lazy" decoding="async" width="830" height="141" class="wp-image-7665" src="/wp-content/uploads/2018/06/word-image-269.png" srcset="/wp-content/uploads/2018/06/word-image-269.png 830w, /wp-content/uploads/2018/06/word-image-269-300x51.png 300w, /wp-content/uploads/2018/06/word-image-269-768x130.png 768w" sizes="(max-width: 830px) 100vw, 830px" /></p>
<p>如在输入框输入js代码：</p>
<p><img loading="lazy" decoding="async" width="551" height="67" class="wp-image-7666" src="/wp-content/uploads/2018/06/word-image-270.png" srcset="/wp-content/uploads/2018/06/word-image-270.png 551w, /wp-content/uploads/2018/06/word-image-270-300x36.png 300w" sizes="(max-width: 551px) 100vw, 551px" /></p>
<p>&lt;script&gt;</p>
<p>var cookie = document.cookie</p>
<p>//发送一个jsonp请求</p>
<p>&lt;/script&gt;</p>
<p>访问此标题的时候就会弹出1，从而达成攻击；</p>
<p><img loading="lazy" decoding="async" width="423" height="122" class="wp-image-7667" src="/wp-content/uploads/2018/06/word-image-271.png" srcset="/wp-content/uploads/2018/06/word-image-271.png 423w, /wp-content/uploads/2018/06/word-image-271-300x87.png 300w" sizes="(max-width: 423px) 100vw, 423px" /></p>
<h2>防止xss攻击（防止js攻击）</h2>
<h3>使用htmlspecialchars函数防止</h3>
<p>注： 百度富文本编辑器ueditor自动将危险的代码如js进行转化为实体符号。</p>
<p>htmlspecialchars函数的作用：将html标签符号转化为实体符号。</p>
<p>如：大于号“&gt;”会被转化为 “&amp;gt;”</p>
<p>如：大于号“&lt;”会被转化为 “&amp;lt;”</p>
<p>可以在配置文件config,添加全局的过滤函数：</p>
<p><img loading="lazy" decoding="async" width="933" height="232" class="wp-image-7668" src="/wp-content/uploads/2018/06/word-image-272.png" srcset="/wp-content/uploads/2018/06/word-image-272.png 933w, /wp-content/uploads/2018/06/word-image-272-300x75.png 300w, /wp-content/uploads/2018/06/word-image-272-768x191.png 768w" sizes="(max-width: 933px) 100vw, 933px" /></p>
<p>此种缺点：会把html和js代码的特殊符号都进行转移，不满足我们的要求。我们只需要转移js代码。如下所示：</p>
<p><img loading="lazy" decoding="async" width="1068" height="134" class="wp-image-7669" src="/wp-content/uploads/2018/06/word-image-273.png" srcset="/wp-content/uploads/2018/06/word-image-273.png 1068w, /wp-content/uploads/2018/06/word-image-273-300x38.png 300w, /wp-content/uploads/2018/06/word-image-273-768x96.png 768w, /wp-content/uploads/2018/06/word-image-273-1024x128.png 1024w" sizes="(max-width: 1068px) 100vw, 1068px" /></p>
<p>解决办法：</p>
<ol>
<li>不使用函数htmlspecialchars()进行处理，但可能会出现xss攻击。</li>
<li>使用htmlspecialchars()函数处理，页面的数据（富文本html）又不能正常显示出来，可以借助htmlspecialchars_decode()反转，把html实体符号转化为html标签，但这又可能会造成xss攻击。</li>
</ol>
<p>我们的希望是HTML可以正常显示，但是又不希望js代码被执行。</p>
<p>这时可以借助第三方防止xss攻击的插件如：HTMLPurifier，此插件会把浏览器提交过来的数据有选择性的过滤。只过滤危险的js代码，保留html代码，这就刚好满足我们的需求。</p>
<h3>使用插件HTMLPurifier防止</h3>
<p>复制防止xss攻击的库到项目extend目录中。</p>
<p><img loading="lazy" decoding="async" width="965" height="325" class="wp-image-7670" src="/wp-content/uploads/2018/06/word-image-274.png" srcset="/wp-content/uploads/2018/06/word-image-274.png 965w, /wp-content/uploads/2018/06/word-image-274-300x101.png 300w, /wp-content/uploads/2018/06/word-image-274-768x259.png 768w" sizes="(max-width: 965px) 100vw, 965px" /></p>
<p>把HTMLPurifier中的example.php文件中函数定义在common.php中，并且修改路径</p>
<p><img loading="lazy" decoding="async" width="966" height="455" class="wp-image-7671" src="/wp-content/uploads/2018/06/word-image-275.png" srcset="/wp-content/uploads/2018/06/word-image-275.png 966w, /wp-content/uploads/2018/06/word-image-275-300x141.png 300w, /wp-content/uploads/2018/06/word-image-275-768x362.png 768w" sizes="(max-width: 966px) 100vw, 966px" /></p>
<p>需要把函数名为removeXSS设置为tp的全局的默认过滤函数</p>
<p><img loading="lazy" decoding="async" width="928" height="290" class="wp-image-7672" src="/wp-content/uploads/2018/06/word-image-276.png" srcset="/wp-content/uploads/2018/06/word-image-276.png 928w, /wp-content/uploads/2018/06/word-image-276-300x94.png 300w, /wp-content/uploads/2018/06/word-image-276-768x240.png 768w" sizes="(max-width: 928px) 100vw, 928px" /></p>
<p>使用之后，只会把js代码进行过滤，保留html代码：</p>
<p><img loading="lazy" decoding="async" width="1001" height="163" class="wp-image-7673" src="/wp-content/uploads/2018/06/word-image-277.png" srcset="/wp-content/uploads/2018/06/word-image-277.png 1001w, /wp-content/uploads/2018/06/word-image-277-300x49.png 300w, /wp-content/uploads/2018/06/word-image-277-768x125.png 768w" sizes="(max-width: 1001px) 100vw, 1001px" /></p>
<p>显示就不会造成攻击，html正常显示：</p>
<p><img loading="lazy" decoding="async" width="913" height="159" class="wp-image-7674" src="/wp-content/uploads/2018/06/word-image-278.png" srcset="/wp-content/uploads/2018/06/word-image-278.png 913w, /wp-content/uploads/2018/06/word-image-278-300x52.png 300w, /wp-content/uploads/2018/06/word-image-278-768x134.png 768w" sizes="(max-width: 913px) 100vw, 913px" /></p>
<h1>扩展-验证插件jquery-validate的使用</h1>
<p>前端验证目的：减轻服务器压力，提高用户体验。</p>
<p>后端验证：主要保证数据的安全（不要信任浏览器携带过来的任何数据）</p>
<p>具体使用：<a href="/goto/6kfy" rel="nofollow">https://www.jianshu.com/p/e1d5f0dc2f5d</a></p>
<p>手册：</p>
<p><img loading="lazy" decoding="async" width="261" height="25" class="wp-image-7675" src="/wp-content/uploads/2018/06/word-image-279.png" /></p>
<h1>模型的事件（钩子）</h1>
<p>所谓的事件就类似于svn中的钩子一样，做一件事情都有前事件和后事情发生。</p>
<p>给表tp_category添加一个zhujian字段，目的是记录当前记录的主键值。</p>
<p><img loading="lazy" decoding="async" width="637" height="223" class="wp-image-7676" src="/wp-content/uploads/2018/06/word-image-280.png" srcset="/wp-content/uploads/2018/06/word-image-280.png 637w, /wp-content/uploads/2018/06/word-image-280-300x105.png 300w" sizes="(max-width: 637px) 100vw, 637px" /></p>
<p>让zhujian字段和cat_id的值保持一致，我们一把入库成功后要更新:</p>
<p>常规做法如下：</p>
<p><img loading="lazy" decoding="async" width="770" height="139" class="wp-image-7677" src="/wp-content/uploads/2018/06/word-image-281.png" srcset="/wp-content/uploads/2018/06/word-image-281.png 770w, /wp-content/uploads/2018/06/word-image-281-300x54.png 300w, /wp-content/uploads/2018/06/word-image-281-768x139.png 768w" sizes="(max-width: 770px) 100vw, 770px" /></p>
<p>但是不建议上面写，我们希望只把业务逻辑写在控制器，我们把数据有关的操作写在模型的事件中。</p>
<p>模型中注册事件：</p>
<p><img loading="lazy" decoding="async" width="993" height="349" class="wp-image-7678" src="/wp-content/uploads/2018/06/word-image-282.png" srcset="/wp-content/uploads/2018/06/word-image-282.png 993w, /wp-content/uploads/2018/06/word-image-282-300x105.png 300w, /wp-content/uploads/2018/06/word-image-282-768x270.png 768w" sizes="(max-width: 993px) 100vw, 993px" /></p>
<p>我们可以在模型中注册after_insert事件，即入库成功之后，把zhujian的字段和cat_id的保持一致。</p>
<p><img loading="lazy" decoding="async" width="1076" height="562" class="wp-image-7679" src="/wp-content/uploads/2018/06/word-image-283.png" srcset="/wp-content/uploads/2018/06/word-image-283.png 1076w, /wp-content/uploads/2018/06/word-image-283-300x157.png 300w, /wp-content/uploads/2018/06/word-image-283-768x401.png 768w, /wp-content/uploads/2018/06/word-image-283-1024x535.png 1024w" sizes="(max-width: 1076px) 100vw, 1076px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="698" height="34" class="wp-image-7680" src="/wp-content/uploads/2018/06/word-image-284.png" srcset="/wp-content/uploads/2018/06/word-image-284.png 698w, /wp-content/uploads/2018/06/word-image-284-300x15.png 300w" sizes="(max-width: 698px) 100vw, 698px" /></p>
<p>触发事件的流程：入库前事件&#8212;&gt;save()&#8212;-&gt;入库后的事件，</p>
<p>如果在入库前事件前返回false,则事件不会继续执行。</p>
<p><img loading="lazy" decoding="async" width="995" height="443" class="wp-image-7681" src="/wp-content/uploads/2018/06/word-image-285.png" srcset="/wp-content/uploads/2018/06/word-image-285.png 995w, /wp-content/uploads/2018/06/word-image-285-300x134.png 300w, /wp-content/uploads/2018/06/word-image-285-768x342.png 768w" sizes="(max-width: 995px) 100vw, 995px" /></p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/7628.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TP5 商城（四）商品属性、商品添加、图片上传、商品列表、ajax+layer 展示商品详情</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8031.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8031.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 09 Jun 2018 00:37:00 +0000</pubDate>
				<category><![CDATA[TP5.0]]></category>
		<category><![CDATA[TP5.0商城]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[ajax+layer 展示商品详情]]></category>
		<category><![CDATA[商品列表]]></category>
		<category><![CDATA[商品属性]]></category>
		<category><![CDATA[商品添加]]></category>
		<category><![CDATA[图片上传]]></category>
		<guid isPermaLink="false">/?p=8031</guid>

					<description><![CDATA[一、查看商品类型属性 不同的商品类型其属性也是不一样的。 在admin-view-type-index.htm [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>一、查看商品类型属性</h1>
<p>不同的商品类型其属性也是不一样的。</p>
<ol>
<li>在admin-view-type-index.html修改链接地址</li>
</ol>
<p><img loading="lazy" decoding="async" width="1241" height="484" class="wp-image-8093" src="/wp-content/uploads/2018/06/word-image-684.png" srcset="/wp-content/uploads/2018/06/word-image-684.png 1241w, /wp-content/uploads/2018/06/word-image-684-300x117.png 300w, /wp-content/uploads/2018/06/word-image-684-768x300.png 768w, /wp-content/uploads/2018/06/word-image-684-1024x399.png 1024w" sizes="(max-width: 1241px) 100vw, 1241px" /></p>
<ol>
<li>在admin-typeController-getAttr方法中，取出当前分类所有的属性展示在模板中</li>
</ol>
<p><img loading="lazy" decoding="async" width="987" height="385" class="wp-image-8094" src="/wp-content/uploads/2018/06/word-image-685.png" srcset="/wp-content/uploads/2018/06/word-image-685.png 987w, /wp-content/uploads/2018/06/word-image-685-300x117.png 300w, /wp-content/uploads/2018/06/word-image-685-768x300.png 768w" sizes="(max-width: 987px) 100vw, 987px" /></p>
<ol>
<li>模板中遍历数据</li>
</ol>
<p><img loading="lazy" decoding="async" width="1257" height="500" class="wp-image-8095" src="/wp-content/uploads/2018/06/word-image-686.png" srcset="/wp-content/uploads/2018/06/word-image-686.png 1257w, /wp-content/uploads/2018/06/word-image-686-300x119.png 300w, /wp-content/uploads/2018/06/word-image-686-768x305.png 768w, /wp-content/uploads/2018/06/word-image-686-1024x407.png 1024w" sizes="(max-width: 1257px) 100vw, 1257px" /></p>
<h1>二、去除编辑属性时属性值的多个空格</h1>
<p>修改admin/view/attribute/upd.html模板</p>
<p><img loading="lazy" decoding="async" width="1003" height="339" class="wp-image-8096" src="/wp-content/uploads/2018/06/word-image-687.png" srcset="/wp-content/uploads/2018/06/word-image-687.png 1003w, /wp-content/uploads/2018/06/word-image-687-300x101.png 300w, /wp-content/uploads/2018/06/word-image-687-768x260.png 768w" sizes="(max-width: 1003px) 100vw, 1003px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="574" height="120" class="wp-image-8097" src="/wp-content/uploads/2018/06/word-image-688.png" srcset="/wp-content/uploads/2018/06/word-image-688.png 574w, /wp-content/uploads/2018/06/word-image-688-300x63.png 300w" sizes="(max-width: 574px) 100vw, 574px" /></p>
<h1>三、完成商品的添加</h1>
<h2>商品的认识</h2>
<p>商品=产品+商品属性，即同一个产品，但是商品属性不同，就不是同一个商品，且价格也不同。</p>
<p>如：iphone6s黑色 和iphone6s银色</p>
<h2>商品添加所需的数据表</h2>
<p>当在后台添加一个商品的时候，商品相关数据需要入库到以下两个表：</p>
<p>商品表sh_goods和商品属性表sh_goods_attr</p>
<p><img loading="lazy" decoding="async" width="159" height="40" class="wp-image-8098" src="/wp-content/uploads/2018/06/word-image-689.png" /></p>
<p>商品的基本信息数据存储在sh_goods表中，商品属性数据存储在sh_goods_attr中</p>
<p>商品表sh_goods表结构：</p>
<p><img loading="lazy" decoding="async" width="967" height="381" class="wp-image-8099" src="/wp-content/uploads/2018/06/word-image-690.png" srcset="/wp-content/uploads/2018/06/word-image-690.png 967w, /wp-content/uploads/2018/06/word-image-690-300x118.png 300w, /wp-content/uploads/2018/06/word-image-690-768x303.png 768w" sizes="(max-width: 967px) 100vw, 967px" /></p>
<p>注：给我们的商品表添加一个goods_middle字段，存储图片的生成的中图的路径</p>
<p><img loading="lazy" decoding="async" width="731" height="200" class="wp-image-8100" src="/wp-content/uploads/2018/06/word-image-691.png" srcset="/wp-content/uploads/2018/06/word-image-691.png 731w, /wp-content/uploads/2018/06/word-image-691-300x82.png 300w" sizes="(max-width: 731px) 100vw, 731px" /></p>
<p>商品属性表sh_goods_attr表结构：</p>
<p><img loading="lazy" decoding="async" width="935" height="267" class="wp-image-8102" src="/wp-content/uploads/2018/06/word-image-692.png" srcset="/wp-content/uploads/2018/06/word-image-692.png 935w, /wp-content/uploads/2018/06/word-image-692-300x86.png 300w, /wp-content/uploads/2018/06/word-image-692-768x219.png 768w" sizes="(max-width: 935px) 100vw, 935px" /></p>
<h2>完成商品基本信息的入库</h2>
<p>基本信息：商品名称、商品价格、库存、详情、是否热卖&#8230;..</p>
<h3>展示添加商品模板</h3>
<ol>
<li>在admin-GoodsController-add方法中，输出添加商品的模板</li>
</ol>
<p><img loading="lazy" decoding="async" width="889" height="348" class="wp-image-8103" src="/wp-content/uploads/2018/06/word-image-693.png" srcset="/wp-content/uploads/2018/06/word-image-693.png 889w, /wp-content/uploads/2018/06/word-image-693-300x117.png 300w, /wp-content/uploads/2018/06/word-image-693-768x301.png 768w" sizes="(max-width: 889px) 100vw, 889px" /></p>
<ol>
<li>把后台的添加商品的模板复制到admin/view/goods/目录下面，并且修改静态资源路径</li>
</ol>
<p><img loading="lazy" decoding="async" width="762" height="305" class="wp-image-8104" src="/wp-content/uploads/2018/06/word-image-694.png" srcset="/wp-content/uploads/2018/06/word-image-694.png 762w, /wp-content/uploads/2018/06/word-image-694-300x120.png 300w" sizes="(max-width: 762px) 100vw, 762px" /></p>
<p>模板是四个选项卡构成：</p>
<p><img loading="lazy" decoding="async" width="1252" height="541" class="wp-image-8105" src="/wp-content/uploads/2018/06/word-image-695.png" srcset="/wp-content/uploads/2018/06/word-image-695.png 1252w, /wp-content/uploads/2018/06/word-image-695-300x130.png 300w, /wp-content/uploads/2018/06/word-image-695-768x332.png 768w, /wp-content/uploads/2018/06/word-image-695-1024x442.png 1024w" sizes="(max-width: 1252px) 100vw, 1252px" /></p>
<p>先修改第一个和第四选项卡的name名称：</p>
<p>第一个选项卡：</p>
<p><img loading="lazy" decoding="async" width="1217" height="599" class="wp-image-8106" src="/wp-content/uploads/2018/06/word-image-696.png" srcset="/wp-content/uploads/2018/06/word-image-696.png 1217w, /wp-content/uploads/2018/06/word-image-696-300x148.png 300w, /wp-content/uploads/2018/06/word-image-696-768x378.png 768w, /wp-content/uploads/2018/06/word-image-696-1024x504.png 1024w" sizes="(max-width: 1217px) 100vw, 1217px" /> <img loading="lazy" decoding="async" width="1118" height="625" class="wp-image-8107" src="/wp-content/uploads/2018/06/word-image-697.png" srcset="/wp-content/uploads/2018/06/word-image-697.png 1118w, /wp-content/uploads/2018/06/word-image-697-300x168.png 300w, /wp-content/uploads/2018/06/word-image-697-768x429.png 768w, /wp-content/uploads/2018/06/word-image-697-1024x572.png 1024w" sizes="(max-width: 1118px) 100vw, 1118px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="526" height="488" class="wp-image-8108" src="/wp-content/uploads/2018/06/word-image-698.png" srcset="/wp-content/uploads/2018/06/word-image-698.png 526w, /wp-content/uploads/2018/06/word-image-698-300x278.png 300w" sizes="(max-width: 526px) 100vw, 526px" /></p>
<p>第四个选项卡内容：</p>
<p><img loading="lazy" decoding="async" width="880" height="418" class="wp-image-8109" src="/wp-content/uploads/2018/06/word-image-699.png" srcset="/wp-content/uploads/2018/06/word-image-699.png 880w, /wp-content/uploads/2018/06/word-image-699-300x143.png 300w, /wp-content/uploads/2018/06/word-image-699-768x365.png 768w" sizes="(max-width: 880px) 100vw, 880px" /></p>
<h3>基本信息入库操作</h3>
<ol>
<li>定义添加商品的验证器Goods</li>
</ol>
<p><img loading="lazy" decoding="async" width="1145" height="592" class="wp-image-8110" src="/wp-content/uploads/2018/06/word-image-700.png" srcset="/wp-content/uploads/2018/06/word-image-700.png 1145w, /wp-content/uploads/2018/06/word-image-700-300x155.png 300w, /wp-content/uploads/2018/06/word-image-700-768x397.png 768w, /wp-content/uploads/2018/06/word-image-700-1024x529.png 1024w" sizes="(max-width: 1145px) 100vw, 1145px" /></p>
<ol>
<li>在admin-GoodsController-add 方法中完成商品的入库操作</li>
</ol>
<p><img loading="lazy" decoding="async" width="949" height="620" class="wp-image-8111" src="/wp-content/uploads/2018/06/word-image-701.png" srcset="/wp-content/uploads/2018/06/word-image-701.png 949w, /wp-content/uploads/2018/06/word-image-701-300x196.png 300w, /wp-content/uploads/2018/06/word-image-701-768x502.png 768w" sizes="(max-width: 949px) 100vw, 949px" /></p>
<ol>
<li>使用ueditor 完成商品的详情</li>
</ol>
<p>引入三个核心js文件：</p>
<p><img loading="lazy" decoding="async" width="1257" height="383" class="wp-image-8112" src="/wp-content/uploads/2018/06/word-image-702.png" srcset="/wp-content/uploads/2018/06/word-image-702.png 1257w, /wp-content/uploads/2018/06/word-image-702-300x91.png 300w, /wp-content/uploads/2018/06/word-image-702-768x234.png 768w, /wp-content/uploads/2018/06/word-image-702-1024x312.png 1024w" sizes="(max-width: 1257px) 100vw, 1257px" /></p>
<p>设置textarea的id,初始化编辑器：</p>
<p><img loading="lazy" decoding="async" width="1236" height="504" class="wp-image-8113" src="/wp-content/uploads/2018/06/word-image-703.png" srcset="/wp-content/uploads/2018/06/word-image-703.png 1236w, /wp-content/uploads/2018/06/word-image-703-300x122.png 300w, /wp-content/uploads/2018/06/word-image-703-768x313.png 768w, /wp-content/uploads/2018/06/word-image-703-1024x418.png 1024w" sizes="(max-width: 1236px) 100vw, 1236px" /></p>
<h2>添加商品的多图片上传</h2>
<p><img loading="lazy" decoding="async" width="901" height="51" class="wp-image-8114" src="/wp-content/uploads/2018/06/word-image-704.png" srcset="/wp-content/uploads/2018/06/word-image-704.png 901w, /wp-content/uploads/2018/06/word-image-704-300x17.png 300w, /wp-content/uploads/2018/06/word-image-704-768x43.png 768w" sizes="(max-width: 901px) 100vw, 901px" /></p>
<p>建议原图上传800*800 ，生成两种缩略图</p>
<p>中图缩略图：350*350 比例为2</p>
<p>小图：50*50 生成缩略图的类型为2位等比例补白</p>
<ol>
<li>上传文件的form两个要求：post提交 和enctype = multipart/form-data</li>
</ol>
<p><img loading="lazy" decoding="async" width="826" height="169" class="wp-image-8115" src="/wp-content/uploads/2018/06/word-image-705.png" srcset="/wp-content/uploads/2018/06/word-image-705.png 826w, /wp-content/uploads/2018/06/word-image-705-300x61.png 300w, /wp-content/uploads/2018/06/word-image-705-768x157.png 768w" sizes="(max-width: 826px) 100vw, 826px" /></p>
<ol>
<li>设置文件上传的name属性，因为是多图上传，所以呢name后需要加[]。</li>
</ol>
<p><img loading="lazy" decoding="async" width="957" height="229" class="wp-image-8116" src="/wp-content/uploads/2018/06/word-image-706.png" srcset="/wp-content/uploads/2018/06/word-image-706.png 957w, /wp-content/uploads/2018/06/word-image-706-300x72.png 300w, /wp-content/uploads/2018/06/word-image-706-768x184.png 768w" sizes="(max-width: 957px) 100vw, 957px" /></p>
<h3>（1）思路分析</h3>
<p>实现思路：可以参考ecshop开源商城：</p>
<p><img loading="lazy" decoding="async" width="985" height="188" class="wp-image-8117" src="/wp-content/uploads/2018/06/word-image-707.png" srcset="/wp-content/uploads/2018/06/word-image-707.png 985w, /wp-content/uploads/2018/06/word-image-707-300x57.png 300w, /wp-content/uploads/2018/06/word-image-707-768x147.png 768w" sizes="(max-width: 985px) 100vw, 985px" /></p>
<p>①构建布局：</p>
<p>每个文件上传域名其实可以看做是一个li标签，其中包含a标签和input上传文件域</p>
<p>如下结构：</p>
<p>&lt;li&gt; &lt;a href=’javascript:;’ &gt;[+]&lt;/a&gt;&lt;input type=’file’/&gt; &lt;/li&gt;</p>
<p>&lt;li&gt; &lt;a href=’javascript:;’ &gt;[-]&lt;/a&gt;&lt;input type=’file’/&gt; &lt;/li&gt;</p>
<p>②怎么实现图片前的[+][-]加减功能？</p>
<p>思路：</p>
<ol>
<li>给li中的a标签绑定单击事件，获取当前单击元素的内容</li>
<li>判断内容，含两种情况[+]、[-]</li>
</ol>
<p>若是[+]: 则获取当前元素的父元素（即li），克隆一份，在把内部的a标签的[+]变成[-]。</p>
<p>若是[-]: 则获取当前元素的父元素（即li），并移除。</p>
<h3>多图片上传加减特效</h3>
<p>1、修改第三个选项卡的内容，设置标签。以及绑定单击事件</p>
<p><img loading="lazy" decoding="async" width="1244" height="382" class="wp-image-8118" src="/wp-content/uploads/2018/06/word-image-708.png" srcset="/wp-content/uploads/2018/06/word-image-708.png 1244w, /wp-content/uploads/2018/06/word-image-708-300x92.png 300w, /wp-content/uploads/2018/06/word-image-708-768x236.png 768w, /wp-content/uploads/2018/06/word-image-708-1024x314.png 1024w" sizes="(max-width: 1244px) 100vw, 1244px" /></p>
<ol>
<li>实现上面的单击事件克隆图片</li>
</ol>
<p>通过看思路实现代码：</p>
<p>思路：</p>
<p>a、给li中的a标签绑定单击事件，获取当前单击元素的内容</p>
<p>b、判断内容，含两种情况[+]、[-]</p>
<p>若是[+]: 则获取当前元素的父元素（即li），克隆一份，在把内部的a标签的[+]变成[-]。</p>
<p>若是[-]: 则获取当前元素的父元素（即li），并移除。</p>
<p><img loading="lazy" decoding="async" width="795" height="408" class="wp-image-8119" src="/wp-content/uploads/2018/06/word-image-709.png" srcset="/wp-content/uploads/2018/06/word-image-709.png 795w, /wp-content/uploads/2018/06/word-image-709-300x154.png 300w, /wp-content/uploads/2018/06/word-image-709-768x394.png 768w" sizes="(max-width: 795px) 100vw, 795px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="512" height="225" class="wp-image-8120" src="/wp-content/uploads/2018/06/word-image-710.png" srcset="/wp-content/uploads/2018/06/word-image-710.png 512w, /wp-content/uploads/2018/06/word-image-710-300x132.png 300w" sizes="(max-width: 512px) 100vw, 512px" /></p>
<h3>实现多图片的上传</h3>
<ol>
<li>在Goods模型中定义一个方法，判断进行图片的原图上传，并返回上传成功的文件路径</li>
</ol>
<p><img loading="lazy" decoding="async" width="971" height="580" class="wp-image-8121" src="/wp-content/uploads/2018/06/word-image-711.png" srcset="/wp-content/uploads/2018/06/word-image-711.png 971w, /wp-content/uploads/2018/06/word-image-711-300x180.png 300w, /wp-content/uploads/2018/06/word-image-711-768x459.png 768w" sizes="(max-width: 971px) 100vw, 971px" /></p>
<ol>
<li>add方法中进行调用上面的方法，把图片的路径转化为json格式存储到表对应字段中</li>
</ol>
<p><img loading="lazy" decoding="async" width="1127" height="599" class="wp-image-8122" src="/wp-content/uploads/2018/06/word-image-712.png" srcset="/wp-content/uploads/2018/06/word-image-712.png 1127w, /wp-content/uploads/2018/06/word-image-712-300x159.png 300w, /wp-content/uploads/2018/06/word-image-712-768x408.png 768w, /wp-content/uploads/2018/06/word-image-712-1024x544.png 1024w" sizes="(max-width: 1127px) 100vw, 1127px" /></p>
<h3>（4）生成多图片的缩略图</h3>
<p>生成缩略图的步骤：</p>
<ul>
<li>Image打开源图片 $image = \Think\Image::open(源图片);</li>
<li>进行缩放处理 $image -&gt; thumb(宽度，高度，类型)</li>
<li>把缩放好的图片保存到服务器上 $image -&gt; save(小图路径名);</li>
</ul>
<ol>
<li>在goods模型中定义处理原图缩放的方法</li>
</ol>
<p><img loading="lazy" decoding="async" width="1040" height="699" class="wp-image-8123" src="/wp-content/uploads/2018/06/word-image-713.png" srcset="/wp-content/uploads/2018/06/word-image-713.png 1040w, /wp-content/uploads/2018/06/word-image-713-300x202.png 300w, /wp-content/uploads/2018/06/word-image-713-768x516.png 768w, /wp-content/uploads/2018/06/word-image-713-1024x688.png 1024w" sizes="(max-width: 1040px) 100vw, 1040px" /></p>
<ol>
<li>add方法中若原图上传成功，则调用上面的方法进行缩略图处理</li>
</ol>
<p><img loading="lazy" decoding="async" width="1215" height="705" class="wp-image-8124" src="/wp-content/uploads/2018/06/word-image-714.png" srcset="/wp-content/uploads/2018/06/word-image-714.png 1215w, /wp-content/uploads/2018/06/word-image-714-300x174.png 300w, /wp-content/uploads/2018/06/word-image-714-768x446.png 768w, /wp-content/uploads/2018/06/word-image-714-1024x594.png 1024w" sizes="(max-width: 1215px) 100vw, 1215px" /></p>
<p>最终生成的各图片名：</p>
<p><img loading="lazy" decoding="async" width="358" height="440" class="wp-image-8125" src="/wp-content/uploads/2018/06/word-image-715.png" srcset="/wp-content/uploads/2018/06/word-image-715.png 358w, /wp-content/uploads/2018/06/word-image-715-244x300.png 244w" sizes="(max-width: 358px) 100vw, 358px" /></p>
<h1>三、[难点-重点]完成商品的属性添加</h1>
<h2>1、分析商品动态属性的生成</h2>
<p>添加一个商品，其商品属性可能有多个。</p>
<p>即商品表sh_goods的一条记录对应商品属性表sh_goods_attr的多条记录，属于一对多关系。</p>
<p>问题：怎么给商品设置商品属性？</p>
<p>这里可以参考ecshop的方案，当添加商品的,必须先选择一个商品类型，在通过ajax动态获取商品类型的属性，再给商品设置这些属性值。</p>
<p>如在ecshop后台添加商品的时候，选择手机类型，动态生成的属性框如下：</p>
<p><img loading="lazy" decoding="async" width="1084" height="312" class="wp-image-8126" src="/wp-content/uploads/2018/06/word-image-716.png" srcset="/wp-content/uploads/2018/06/word-image-716.png 1084w, /wp-content/uploads/2018/06/word-image-716-300x86.png 300w, /wp-content/uploads/2018/06/word-image-716-768x221.png 768w, /wp-content/uploads/2018/06/word-image-716-1024x295.png 1024w" sizes="(max-width: 1084px) 100vw, 1084px" /></p>
<p>从上面添加商品属性可以看出，动态生成商品属性的时候，共有4种组合情况。</p>
<p>其实就是属性类型和属性值录入方式的互相组合：</p>
<p>①唯一属性+手工输入</p>
<p>②唯一属性+列表选择</p>
<p>③单选属性+手工输入</p>
<p>④单选属性+列表选择</p>
<p>其实可以把上面每个动态生成的属性信息看作是被包含在一个li标签中。</p>
<p>分析四种组合情况生成动态属性的特点如下：元素从左到右分析：</p>
<p><img loading="lazy" decoding="async" width="1084" height="312" class="wp-image-8127" src="/wp-content/uploads/2018/06/word-image-717.png" srcset="/wp-content/uploads/2018/06/word-image-717.png 1084w, /wp-content/uploads/2018/06/word-image-717-300x86.png 300w, /wp-content/uploads/2018/06/word-image-717-768x221.png 768w, /wp-content/uploads/2018/06/word-image-717-1024x295.png 1024w" sizes="(max-width: 1084px) 100vw, 1084px" /> <img loading="lazy" decoding="async" width="857" height="274" class="wp-image-8128" src="/wp-content/uploads/2018/06/word-image-718.png" srcset="/wp-content/uploads/2018/06/word-image-718.png 857w, /wp-content/uploads/2018/06/word-image-718-300x96.png 300w, /wp-content/uploads/2018/06/word-image-718-768x246.png 768w" sizes="(max-width: 857px) 100vw, 857px" /></p>
<ul>
<li>单选属性属性名称前有个[+]或[-]号，可以进行加减，而唯一属性则没有</li>
<li>属性名称</li>
<li>属性值录入方式为手工输入，则对应属性值的输入方式的是一个输入框(&lt;input type=’text’/&gt;)，而属性值录入方式为列表选择的时候则对应属性值的输入方式的是一个select下拉框。</li>
<li>单选属性可以输入价格，而唯一属性则没有</li>
</ul>
<h2>完成商品的动态属性生成</h2>
<ol>
<li>在商品添加的add方法中取出所有的商品类型</li>
</ol>
<p><img loading="lazy" decoding="async" width="919" height="281" class="wp-image-8129" src="/wp-content/uploads/2018/06/word-image-719.png" srcset="/wp-content/uploads/2018/06/word-image-719.png 919w, /wp-content/uploads/2018/06/word-image-719-300x92.png 300w, /wp-content/uploads/2018/06/word-image-719-768x235.png 768w" sizes="(max-width: 919px) 100vw, 919px" /></p>
<ol>
<li>模板中遍历数据在第二个选项卡</li>
</ol>
<p><img loading="lazy" decoding="async" width="1084" height="348" class="wp-image-8130" src="/wp-content/uploads/2018/06/word-image-720.png" srcset="/wp-content/uploads/2018/06/word-image-720.png 1084w, /wp-content/uploads/2018/06/word-image-720-300x96.png 300w, /wp-content/uploads/2018/06/word-image-720-768x247.png 768w, /wp-content/uploads/2018/06/word-image-720-1024x329.png 1024w" sizes="(max-width: 1084px) 100vw, 1084px" /></p>
<p>3、设置一个存储动态生成属性的容器</p>
<p><img loading="lazy" decoding="async" width="914" height="337" class="wp-image-8131" src="/wp-content/uploads/2018/06/word-image-721.png" srcset="/wp-content/uploads/2018/06/word-image-721.png 914w, /wp-content/uploads/2018/06/word-image-721-300x111.png 300w, /wp-content/uploads/2018/06/word-image-721-768x283.png 768w" sizes="(max-width: 914px) 100vw, 914px" /></p>
<ol>
<li>绑定onchange事件给select框</li>
</ol>
<p><img loading="lazy" decoding="async" width="1157" height="338" class="wp-image-8132" src="/wp-content/uploads/2018/06/word-image-722.png" srcset="/wp-content/uploads/2018/06/word-image-722.png 1157w, /wp-content/uploads/2018/06/word-image-722-300x88.png 300w, /wp-content/uploads/2018/06/word-image-722-768x224.png 768w, /wp-content/uploads/2018/06/word-image-722-1024x299.png 1024w" sizes="(max-width: 1157px) 100vw, 1157px" /></p>
<ol>
<li>在admin-GoodsController-ajaxGetTypeAttr方法，获取对应类型的属性，并以json格式输出</li>
</ol>
<p><img loading="lazy" decoding="async" width="944" height="379" class="wp-image-8133" src="/wp-content/uploads/2018/06/word-image-723.png" srcset="/wp-content/uploads/2018/06/word-image-723.png 944w, /wp-content/uploads/2018/06/word-image-723-300x120.png 300w, /wp-content/uploads/2018/06/word-image-723-768x308.png 768w" sizes="(max-width: 944px) 100vw, 944px" /></p>
<ol>
<li>根据ajax返回的属性数据，动态构建属性框</li>
</ol>
<p><img loading="lazy" decoding="async" width="972" height="527" class="wp-image-8134" src="/wp-content/uploads/2018/06/word-image-724.png" srcset="/wp-content/uploads/2018/06/word-image-724.png 972w, /wp-content/uploads/2018/06/word-image-724-300x163.png 300w, /wp-content/uploads/2018/06/word-image-724-768x416.png 768w" sizes="(max-width: 972px) 100vw, 972px" /> <img loading="lazy" decoding="async" width="1093" height="581" class="wp-image-8135" src="/wp-content/uploads/2018/06/word-image-725.png" srcset="/wp-content/uploads/2018/06/word-image-725.png 1093w, /wp-content/uploads/2018/06/word-image-725-300x159.png 300w, /wp-content/uploads/2018/06/word-image-725-768x408.png 768w, /wp-content/uploads/2018/06/word-image-725-1024x544.png 1024w" sizes="(max-width: 1093px) 100vw, 1093px" /></p>
<p>注：上面代码173行有错误：把判断attr_input_type改为attr_type</p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="623" height="423" class="wp-image-8136" src="/wp-content/uploads/2018/06/word-image-726.png" srcset="/wp-content/uploads/2018/06/word-image-726.png 623w, /wp-content/uploads/2018/06/word-image-726-300x204.png 300w" sizes="(max-width: 623px) 100vw, 623px" /></p>
<ol>
<li>完成单选属性的[+]功能</li>
</ol>
<p><img loading="lazy" decoding="async" width="992" height="331" class="wp-image-8137" src="/wp-content/uploads/2018/06/word-image-727.png" srcset="/wp-content/uploads/2018/06/word-image-727.png 992w, /wp-content/uploads/2018/06/word-image-727-300x100.png 300w, /wp-content/uploads/2018/06/word-image-727-768x256.png 768w" sizes="(max-width: 992px) 100vw, 992px" /></p>
<p>说明，逻辑和之前相册的是完全一致</p>
<p><img loading="lazy" decoding="async" width="802" height="283" class="wp-image-8138" src="/wp-content/uploads/2018/06/word-image-728.png" srcset="/wp-content/uploads/2018/06/word-image-728.png 802w, /wp-content/uploads/2018/06/word-image-728-300x106.png 300w, /wp-content/uploads/2018/06/word-image-728-768x271.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="626" height="288" class="wp-image-8139" src="/wp-content/uploads/2018/06/word-image-729.png" srcset="/wp-content/uploads/2018/06/word-image-729.png 626w, /wp-content/uploads/2018/06/word-image-729-300x138.png 300w" sizes="(max-width: 626px) 100vw, 626px" /></p>
<h2>完成商品动态属性的入库</h2>
<p>分析：</p>
<p>在表单中把单选属性值和单选属性价格通过属性attr_id归为同一组，方便后续获取对应属性的值和价格。</p>
<p>单选属性值： name=goodsAttrValue[attr_id][]</p>
<p>单选属性值价格： name=goodsAttrValue[attr_id][]</p>
<p>因为单选属性用户可以点击[+]号会生成多个，所以多个单选属性值和价格name的值后面都必须加上中括号[]。</p>
<p>由于唯一属性只能选择一个值，所以name后不需要加[]</p>
<p>我们最终需要构造类似于下面的数组，存储商品属性值和商品属性价格：</p>
<p><img loading="lazy" decoding="async" width="393" height="372" class="wp-image-8140" src="/wp-content/uploads/2018/06/word-image-730.png" srcset="/wp-content/uploads/2018/06/word-image-730.png 393w, /wp-content/uploads/2018/06/word-image-730-300x284.png 300w" sizes="(max-width: 393px) 100vw, 393px" /></p>
<p>在动态生成的属性框元素中设置name属性：</p>
<p><img loading="lazy" decoding="async" width="1224" height="674" class="wp-image-8141" src="/wp-content/uploads/2018/06/word-image-731.png" srcset="/wp-content/uploads/2018/06/word-image-731.png 1224w, /wp-content/uploads/2018/06/word-image-731-300x165.png 300w, /wp-content/uploads/2018/06/word-image-731-768x423.png 768w, /wp-content/uploads/2018/06/word-image-731-1024x564.png 1024w" sizes="(max-width: 1224px) 100vw, 1224px" /></p>
<p>在admin-GoodsController-add方法中打印提交过来的$postData数据如下：</p>
<p><img loading="lazy" decoding="async" width="675" height="657" class="wp-image-8142" src="/wp-content/uploads/2018/06/word-image-732.png" srcset="/wp-content/uploads/2018/06/word-image-732.png 675w, /wp-content/uploads/2018/06/word-image-732-300x292.png 300w" sizes="(max-width: 675px) 100vw, 675px" /></p>
<p>由于商品属性表（sh_goods_attr）数据需要得到入库成功的商品主键goods_id,所以我们可以在商品模型Goods的入库后钩子after_insert中完成完成商品属性表数据的入库。</p>
<p><img loading="lazy" decoding="async" width="876" height="498" class="wp-image-8143" src="/wp-content/uploads/2018/06/word-image-733.png" srcset="/wp-content/uploads/2018/06/word-image-733.png 876w, /wp-content/uploads/2018/06/word-image-733-300x171.png 300w, /wp-content/uploads/2018/06/word-image-733-768x437.png 768w" sizes="(max-width: 876px) 100vw, 876px" /> <img loading="lazy" decoding="async" width="769" height="611" class="wp-image-8144" src="/wp-content/uploads/2018/06/word-image-734.png" srcset="/wp-content/uploads/2018/06/word-image-734.png 769w, /wp-content/uploads/2018/06/word-image-734-300x238.png 300w, /wp-content/uploads/2018/06/word-image-734-768x610.png 768w" sizes="(max-width: 769px) 100vw, 769px" /></p>
<h1>商品列表展示</h1>
<ol>
<li>在admin-GoodsController-index方法中取出商品数据进行分配到模板</li>
</ol>
<p><img loading="lazy" decoding="async" width="805" height="296" class="wp-image-8145" src="/wp-content/uploads/2018/06/word-image-735.png" srcset="/wp-content/uploads/2018/06/word-image-735.png 805w, /wp-content/uploads/2018/06/word-image-735-300x110.png 300w, /wp-content/uploads/2018/06/word-image-735-768x282.png 768w" sizes="(max-width: 805px) 100vw, 805px" /></p>
<ol>
<li>模板中遍历数据</li>
</ol>
<p><img loading="lazy" decoding="async" width="1259" height="464" class="wp-image-8146" src="/wp-content/uploads/2018/06/word-image-736.png" srcset="/wp-content/uploads/2018/06/word-image-736.png 1259w, /wp-content/uploads/2018/06/word-image-736-300x111.png 300w, /wp-content/uploads/2018/06/word-image-736-768x283.png 768w, /wp-content/uploads/2018/06/word-image-736-1024x377.png 1024w" sizes="(max-width: 1259px) 100vw, 1259px" /></p>
<h1>使用ajax+layer弹出层查看商品详情</h1>
<ol>
<li>给admin-view-goods-index.html模板内容设置查看商品详情的标签属性</li>
</ol>
<p><img loading="lazy" decoding="async" width="1287" height="364" class="wp-image-8147" src="/wp-content/uploads/2018/06/word-image-737.png" srcset="/wp-content/uploads/2018/06/word-image-737.png 1287w, /wp-content/uploads/2018/06/word-image-737-300x85.png 300w, /wp-content/uploads/2018/06/word-image-737-768x217.png 768w, /wp-content/uploads/2018/06/word-image-737-1024x290.png 1024w" sizes="(max-width: 1287px) 100vw, 1287px" /></p>
<ol>
<li>给上面的class=showContent绑定单击事件，发送ajax请求</li>
</ol>
<p><img loading="lazy" decoding="async" width="1139" height="500" class="wp-image-8148" src="/wp-content/uploads/2018/06/word-image-738.png" srcset="/wp-content/uploads/2018/06/word-image-738.png 1139w, /wp-content/uploads/2018/06/word-image-738-300x132.png 300w, /wp-content/uploads/2018/06/word-image-738-768x337.png 768w, /wp-content/uploads/2018/06/word-image-738-1024x450.png 1024w" sizes="(max-width: 1139px) 100vw, 1139px" /></p>
<p>同时引入layer弹出层插件的核心js文件layer.js:</p>
<p><img loading="lazy" decoding="async" width="1109" height="286" class="wp-image-8149" src="/wp-content/uploads/2018/06/word-image-739.png" srcset="/wp-content/uploads/2018/06/word-image-739.png 1109w, /wp-content/uploads/2018/06/word-image-739-300x77.png 300w, /wp-content/uploads/2018/06/word-image-739-768x198.png 768w, /wp-content/uploads/2018/06/word-image-739-1024x264.png 1024w" sizes="(max-width: 1109px) 100vw, 1109px" /></p>
<p>3、在admin-GoodsController-ajaxGetContent获取商品的数据，返回json数据</p>
<p><img loading="lazy" decoding="async" width="1051" height="469" class="wp-image-8150" src="/wp-content/uploads/2018/06/word-image-740.png" srcset="/wp-content/uploads/2018/06/word-image-740.png 1051w, /wp-content/uploads/2018/06/word-image-740-300x134.png 300w, /wp-content/uploads/2018/06/word-image-740-768x343.png 768w, /wp-content/uploads/2018/06/word-image-740-1024x457.png 1024w" sizes="(max-width: 1051px) 100vw, 1051px" /></p>
<p>效果：</p>
<p><img loading="lazy" decoding="async" width="1005" height="472" class="wp-image-8151" src="/wp-content/uploads/2018/06/word-image-741.png" srcset="/wp-content/uploads/2018/06/word-image-741.png 1005w, /wp-content/uploads/2018/06/word-image-741-300x141.png 300w, /wp-content/uploads/2018/06/word-image-741-768x361.png 768w" sizes="(max-width: 1005px) 100vw, 1005px" /></p>
<p>作业：使用ajax修改商品的是否热卖等状态，类似于ecshop如下：</p>
<p><img loading="lazy" decoding="async" width="1229" height="181" class="wp-image-8152" src="/wp-content/uploads/2018/06/word-image-742.png" srcset="/wp-content/uploads/2018/06/word-image-742.png 1229w, /wp-content/uploads/2018/06/word-image-742-300x44.png 300w, /wp-content/uploads/2018/06/word-image-742-768x113.png 768w, /wp-content/uploads/2018/06/word-image-742-1024x151.png 1024w" sizes="(max-width: 1229px) 100vw, 1229px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/8031.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/5792.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/5792.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 15:36:37 +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>
		<guid isPermaLink="false">/?p=5792</guid>

					<description><![CDATA[Laravel框架实战-在线教育平台（5） 一、直播课程管理（获取推流地址、日期插件） 1、获取推流地址 步骤 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1><a id="post-5792-_Toc488249285"></a>Laravel框架实战-在线教育平台（5）</h1>
<h1><a id="post-5792-_Toc488249288"></a>一、直播课程管理（获取推流地址、日期插件）</h1>
<h2><a id="post-5792-_Toc488249289"></a>1、获取推流地址</h2>
<p>
  步骤1：定义模型
</p>
<p><img loading="lazy" decoding="async" width="1053" height="416" src="/wp-content/uploads/2018/05/word-image-5257.png" class="wp-image-5793" srcset="/wp-content/uploads/2018/05/word-image-5257.png 1053w, /wp-content/uploads/2018/05/word-image-5257-300x119.png 300w, /wp-content/uploads/2018/05/word-image-5257-768x303.png 768w, /wp-content/uploads/2018/05/word-image-5257-1024x405.png 1024w" sizes="(max-width: 1053px) 100vw, 1053px" /></p>
<p>
  /**
</p>
<p>
   * 关联直播流模型（1:1）
</p>
<p>
   * 语法：模型名::with（&#8217;role&#8217;）-&gt;first()
</p>
<p>
   * @return \Illuminate\Database\Eloquent\Relations\HasOne
</p>
<p>
   */
</p>
<p>
  public function stream()
</p>
<p>
  {
</p>
<p>
      #return $this-&gt;hasOne(关联模型名，关联模型公共字段，本模型公共字段)
</p>
<p>
      return $this-&gt;hasOne(&#8216;App\Http\Model\Stream&#8217;,&#8217;id&#8217;, &#8216;stream_id&#8217;);
</p>
<p>
  }
</p>
<p>
  步骤2：修改控制器
</p>
<p><img loading="lazy" decoding="async" width="993" height="421" src="/wp-content/uploads/2018/05/word-image-5258.png" class="wp-image-5794" srcset="/wp-content/uploads/2018/05/word-image-5258.png 993w, /wp-content/uploads/2018/05/word-image-5258-300x127.png 300w, /wp-content/uploads/2018/05/word-image-5258-768x326.png 768w" sizes="(max-width: 993px) 100vw, 993px" /></p>
<p>
  步骤3：修改视图
</p>
<p><img loading="lazy" decoding="async" width="1235" height="533" src="/wp-content/uploads/2018/05/word-image-5259.png" class="wp-image-5795" srcset="/wp-content/uploads/2018/05/word-image-5259.png 1235w, /wp-content/uploads/2018/05/word-image-5259-300x129.png 300w, /wp-content/uploads/2018/05/word-image-5259-768x331.png 768w, /wp-content/uploads/2018/05/word-image-5259-1024x442.png 1024w" sizes="(max-width: 1235px) 100vw, 1235px" /></p>
<h2>日期插件</h2>
<p>
  配置手册：<a href="http://www.my97.net/demo/index.htm">http://www.my97.net/demo/index.htm</a>
</p>
<p><img loading="lazy" decoding="async" width="1101" height="335" src="/wp-content/uploads/2018/05/word-image-5260.png" class="wp-image-5796" srcset="/wp-content/uploads/2018/05/word-image-5260.png 1101w, /wp-content/uploads/2018/05/word-image-5260-300x91.png 300w, /wp-content/uploads/2018/05/word-image-5260-768x234.png 768w, /wp-content/uploads/2018/05/word-image-5260-1024x312.png 1024w" sizes="(max-width: 1101px) 100vw, 1101px" /></p>
<h2>图片上传【★★★】</h2>
<h3>webuploader插件介绍</h3>
<p>
  说明：就是由百度团队开发的一个上传插件
</p>
<p>
  地址：<a href="http://fex.baidu.com/webuploader/">http://fex.baidu.com/webuploader/</a>
</p>
<p><img loading="lazy" decoding="async" width="1134" height="495" src="/wp-content/uploads/2018/05/word-image-5261.png" class="wp-image-5797" srcset="/wp-content/uploads/2018/05/word-image-5261.png 1134w, /wp-content/uploads/2018/05/word-image-5261-300x131.png 300w, /wp-content/uploads/2018/05/word-image-5261-768x335.png 768w, /wp-content/uploads/2018/05/word-image-5261-1024x447.png 1024w" sizes="(max-width: 1134px) 100vw, 1134px" /></p>
<h3>使用</h3>
<ul>
<li>
    语法：
  </li>
</ul>
<p>
  检查是否存在指定键：$request-&gt;hasFile(&#8216;file&#8217;)
</p>
<p>
  检查是否上传成功：  $request-&gt;file(&#8216;file&#8217;)-&gt;isValid()
</p>
<p>
  存储文件：    $request-&gt;file(&#8216;file&#8217;)-&gt;store(&#8216;子路径&#8217;，存储驱动器的名称);
</p>
<ul>
<li>
    实现步骤：
  </li>
</ul>
<p>
  步骤1：将官方下载的文件移动到public目录下的webuploader文件夹中
</p>
<p><img loading="lazy" decoding="async" width="335" height="317" src="/wp-content/uploads/2018/05/word-image-5262.png" class="wp-image-5798" srcset="/wp-content/uploads/2018/05/word-image-5262.png 335w, /wp-content/uploads/2018/05/word-image-5262-300x284.png 300w" sizes="(max-width: 335px) 100vw, 335px" /></p>
<p>
  步骤2：（视图代码）打开手册引入静态资源并复制初始化代码
</p>
<p><img loading="lazy" decoding="async" width="1038" height="501" src="/wp-content/uploads/2018/05/word-image-5263.png" class="wp-image-5799" srcset="/wp-content/uploads/2018/05/word-image-5263.png 1038w, /wp-content/uploads/2018/05/word-image-5263-300x145.png 300w, /wp-content/uploads/2018/05/word-image-5263-768x371.png 768w, /wp-content/uploads/2018/05/word-image-5263-1024x494.png 1024w" sizes="(max-width: 1038px) 100vw, 1038px" /><br />
<img loading="lazy" decoding="async" width="953" height="673" src="/wp-content/uploads/2018/05/word-image-5264.png" class="wp-image-5800" srcset="/wp-content/uploads/2018/05/word-image-5264.png 953w, /wp-content/uploads/2018/05/word-image-5264-300x212.png 300w, /wp-content/uploads/2018/05/word-image-5264-768x542.png 768w" sizes="(max-width: 953px) 100vw, 953px" /></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;!&#8211;dom结构部分&#8211;&gt;
</p>
<p>
  		&lt;div id=&#8221;uploader-demo&#8221;&gt;
</p>
<p>
  		    &lt;!&#8211;用来存放item&#8211;&gt;
</p>
<p>
  		    &lt;div id=&#8221;fileList&#8221; class=&#8221;uploader-list&#8221;&gt;&lt;/div&gt;
</p>
<p>
  		    &lt;div id=&#8221;filePicker&#8221;&gt;选择图片&lt;/div&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  		&lt;div id=&#8221;showimg&#8221;&gt;
</p>
<p>
  		&lt;/div&gt;
</p>
<p>
  		&lt;div id=&#8221;uploading&#8221; style=&#8221;width:0%;height:20px;background: blue;&#8221;&gt;&lt;/div&gt;
</p>
<p>
  		&lt;input required type=&#8221;text&#8221; class=&#8221;input-text&#8221; value=&#8221;&#8221; placeholder=&#8221;&#8221; id=&#8221;img&#8221; name=&#8221;img&#8221;&gt;
</p>
<p>
  	&lt;/div&gt;
</p>
<p>
  &lt;/div&gt;
</p>
<p>
  &lt;!&#8211;引入CSS&#8211;&gt;
</p>
<p>
  &lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;{{ asset(&#8216;webuploader&#8217;) }}/webuploader.css&#8221;&gt;
</p>
<p>
  &lt;!&#8211;引入JS&#8211;&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221; src=&#8221;{{ asset(&#8216;webuploader&#8217;) }}/webuploader.js&#8221;&gt;&lt;/script&gt;
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  // 初始化Web Uploader
</p>
<p>
  var uploader = WebUploader.create({
</p>
<p>
  	// 设置自定义请求数据
</p>
<p>
  	formData: {
</p>
<p>
  		_token: &#8216;{{ csrf_token() }}&#8217;
</p>
<p>
  	},
</p>
<p>
      // 选完文件后，是否自动上传。
</p>
<p>
      auto: true,
</p>
<p>
      // swf文件路径
</p>
<p>
      swf: &#8216;{{ asset(&#8220;webuploader&#8221;) }}/Uploader.swf&#8217;,
</p>
<p>
      // 文件接收服务端。
</p>
<p>
      server: &#8221; {{ url(&#8216;admin/upload/file&#8217;) }}&#8221;,
</p>
<p>
      // 选择文件的按钮。可选。
</p>
<p>
      // 内部根据当前运行是创建，可能是input元素，也可能是flash.
</p>
<p>
      pick: &#8216;#filePicker&#8217;,
</p>
<p>
      // 只允许选择图片文件。
</p>
<p>
      accept: {
</p>
<p>
          title: &#8216;Images&#8217;,
</p>
<p>
          extensions: &#8216;gif,jpg,jpeg,bmp,png&#8217;,
</p>
<p>
          mimeTypes: &#8216;image/*&#8217;
</p>
<p>
      }
</p>
<p>
  });
</p>
<p>
  // 文件上传成功，给item添加成功class, 用样式标记上传成功。
</p>
<p>
  uploader.on( &#8216;uploadSuccess&#8217;, function( file, response ) {
</p>
<p>
     //file是原上传文件信息，相当于php的$_FILES数据
</p>
<p>
     //response是php上传文件响应的数据
</p>
<p>
     console.log(response);
</p>
<p>
     $(&#8216;#img&#8217;).val(response.info);
</p>
<p>
     var imgSrc = &#8220;{{asset(&#8216;uploads&#8217;)}}&#8221; + &#8216;/&#8217; + response.info;
</p>
<p>
     $(&#8216;#showimg&#8217;).html(&#8216;&lt;img src=&#8221;&#8216;+imgSrc+'&#8221; width=&#8221;120&#8243; height=&#8221;80&#8243; /&gt;&#8217;)
</p>
<p>
  });
</p>
<p>
  // 文件上传过程中创建进度条实时显示。
</p>
<p>
  uploader.on( &#8216;uploadProgress&#8217;, function( file, percentage ) {
</p>
<p>
      $(&#8216;#uploading&#8217;).css( &#8216;width&#8217;, percentage * 100 + &#8216;%&#8217; );
</p>
<p>
  });
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  步骤3：定义路由，并创建控制器书写上传功能代码
</p>
<p><img loading="lazy" decoding="async" width="1114" height="446" src="/wp-content/uploads/2018/05/word-image-5265.png" class="wp-image-5801" srcset="/wp-content/uploads/2018/05/word-image-5265.png 1114w, /wp-content/uploads/2018/05/word-image-5265-300x120.png 300w, /wp-content/uploads/2018/05/word-image-5265-768x307.png 768w, /wp-content/uploads/2018/05/word-image-5265-1024x410.png 1024w" sizes="(max-width: 1114px) 100vw, 1114px" /><br />
<img loading="lazy" decoding="async" width="1225" height="579" src="/wp-content/uploads/2018/05/word-image-5266.png" class="wp-image-5802" srcset="/wp-content/uploads/2018/05/word-image-5266.png 1225w, /wp-content/uploads/2018/05/word-image-5266-300x142.png 300w, /wp-content/uploads/2018/05/word-image-5266-768x363.png 768w, /wp-content/uploads/2018/05/word-image-5266-1024x484.png 1024w" sizes="(max-width: 1225px) 100vw, 1225px" /></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 UploadController extends Controller
</p>
<p>
  {
</p>
<p>
      //上传文件
</p>
<p>
      public function file(Request $request)
</p>
<p>
      {
</p>
<p>
          //1.判断$_FILES[file键]是否存在，并且$_FILES[键][error] 等于0 （也就是没有错误）
</p>
<p>
          if ($request-&gt;hasFile(&#8216;file&#8217;) &amp;&amp; $request-&gt;file(&#8216;file&#8217;)-&gt;isValid()) {
</p>
<p>
              //2.上传文件
</p>
<p>
              //语法：     request-&gt;file(&#8216;file&#8217;)-&gt;store(&#8216;子路径&#8217;，存储驱动器的名称);
</p>
<p>
              //store是官方存储文件方法
</p>
<p>
              //存储驱动器的名称：对应config/filesystems.php文件
</p>
<p>
              //子路径：          指会在config/filesystems.php文件声明的上传文件夹下再创建一个文件
</p>
<p>
              $filename = $request-&gt;file(&#8216;file&#8217;)-&gt;store(&#8216;img&#8217;, &#8216;upload&#8217;);
</p>
<p>
              return [&#8216;info&#8217; =&gt; $filename];
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
  }
</p>
<p><img loading="lazy" decoding="async" width="936" height="566" src="/wp-content/uploads/2018/05/word-image-5267.png" class="wp-image-5803" srcset="/wp-content/uploads/2018/05/word-image-5267.png 936w, /wp-content/uploads/2018/05/word-image-5267-300x181.png 300w, /wp-content/uploads/2018/05/word-image-5267-768x464.png 768w" sizes="(max-width: 936px) 100vw, 936px" /></p>
<h2>更改图片上传规则到七牛云【★★★】</h2>
<h3>1）对象存储介绍</h3>
<p>
  对象存储简单理解：就是用来存放静态资源的服务器
</p>
<p>
  好处：减少冗余，便于维护
</p>
<h3>2）使用（zgldh/qiniu-laravel-storage）</h3>
<p>
  步骤1：下载并配置根据下图文档 composer reqiure zgldh/qiniu-laravel-storage
</p>
<p><img loading="lazy" decoding="async" width="951" height="574" src="/wp-content/uploads/2018/05/word-image-5268.png" class="wp-image-5804" srcset="/wp-content/uploads/2018/05/word-image-5268.png 951w, /wp-content/uploads/2018/05/word-image-5268-300x181.png 300w, /wp-content/uploads/2018/05/word-image-5268-768x464.png 768w" sizes="(max-width: 951px) 100vw, 951px" /><br />
<img loading="lazy" decoding="async" width="1117" height="539" src="/wp-content/uploads/2018/05/word-image-5269.png" class="wp-image-5805" srcset="/wp-content/uploads/2018/05/word-image-5269.png 1117w, /wp-content/uploads/2018/05/word-image-5269-300x145.png 300w, /wp-content/uploads/2018/05/word-image-5269-768x371.png 768w, /wp-content/uploads/2018/05/word-image-5269-1024x494.png 1024w" sizes="(max-width: 1117px) 100vw, 1117px" /></p>
<p>
  步骤2：打开控制器方法将上传到laravel项目代码更改为上传到七牛云即可
</p>
<p><img loading="lazy" decoding="async" width="652" height="432" src="/wp-content/uploads/2018/05/word-image-5270.png" class="wp-image-5806" srcset="/wp-content/uploads/2018/05/word-image-5270.png 652w, /wp-content/uploads/2018/05/word-image-5270-300x199.png 300w" sizes="(max-width: 652px) 100vw, 652px" /><br />
<img loading="lazy" decoding="async" width="596" height="55" src="/wp-content/uploads/2018/05/word-image-5271.png" class="wp-image-5807" srcset="/wp-content/uploads/2018/05/word-image-5271.png 596w, /wp-content/uploads/2018/05/word-image-5271-300x28.png 300w" sizes="(max-width: 596px) 100vw, 596px" /><br />
<img loading="lazy" decoding="async" width="1236" height="606" src="/wp-content/uploads/2018/05/word-image-5272.png" class="wp-image-5808" srcset="/wp-content/uploads/2018/05/word-image-5272.png 1236w, /wp-content/uploads/2018/05/word-image-5272-300x147.png 300w, /wp-content/uploads/2018/05/word-image-5272-768x377.png 768w, /wp-content/uploads/2018/05/word-image-5272-1024x502.png 1024w" sizes="(max-width: 1236px) 100vw, 1236px" /></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 UploadController extends Controller
</p>
<p>
  {
</p>
<p>
      //上传文件
</p>
<p>
      public function file(Request $request)
</p>
<p>
      {
</p>
<p>
          //1.判断$_FILES[file键]是否存在，并且$_FILES[键][error] 等于0 （也就是没有错误）
</p>
<p>
          if ($request-&gt;hasFile(&#8216;file&#8217;) &amp;&amp; $request-&gt;file(&#8216;file&#8217;)-&gt;isValid()) {
</p>
<p>
              //2.上传文件
</p>
<p>
              //语法：     request-&gt;file(&#8216;file&#8217;)-&gt;store(&#8216;子路径&#8217;，存储驱动器的名称);
</p>
<p>
              //store是官方存储文件方法
</p>
<p>
              //存储驱动器的名称：对应config/filesystems.php文件
</p>
<p>
              //子路径：          指会在config/filesystems.php文件声明的上传文件夹下再创建一个文件
</p>
<p>
              //$filename = $request-&gt;file(&#8216;file&#8217;)-&gt;store(&#8216;img&#8217;, &#8216;upload&#8217;);
</p>
</p>
<p>
              ###更改七牛云存储图片
</p>
<p>
              //定义上传文件名称
</p>
<p>
              $filename = uniqid(&#8216;goods&#8217;.date(&#8216;YmdHis&#8217;,time()));
</p>
<p>
              //从临时文件中获取图片数据
</p>
<p>
              $imgData = file_get_contents($request-&gt;file(&#8216;file&#8217;)-&gt;getPathName());
</p>
<p>
              //上传
</p>
<p>
              \Storage::disk(&#8216;qiniu&#8217;)-&gt;put($filename, $imgData); //上传文件 file_get_contents(XX.PNG)
</p>
<p>
              //获取下载地址（图片地址）
</p>
<p>
              $downloadUrl = \Storage::disk(&#8216;qiniu&#8217;)-&gt;getDriver()-&gt;downloadUrl($filename);
</p>
</p>
<p>
              return [&#8216;info&#8217; =&gt; $downloadUrl];
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
  }
</p>
<h1>更改直播播放视图</h1>
<p>
  步骤1：将直播详情页静态代码替换edu项目中的直播详情页
</p>
<p><img loading="lazy" decoding="async" width="596" height="222" src="/wp-content/uploads/2018/05/word-image-5273.png" class="wp-image-5809" srcset="/wp-content/uploads/2018/05/word-image-5273.png 596w, /wp-content/uploads/2018/05/word-image-5273-300x112.png 300w" sizes="(max-width: 596px) 100vw, 596px" /></p>
<p>
  步骤：将直播地址更改为变量
</p>
<p><img loading="lazy" decoding="async" width="917" height="485" src="/wp-content/uploads/2018/05/word-image-5274.png" class="wp-image-5810" srcset="/wp-content/uploads/2018/05/word-image-5274.png 917w, /wp-content/uploads/2018/05/word-image-5274-300x159.png 300w, /wp-content/uploads/2018/05/word-image-5274-768x406.png 768w" sizes="(max-width: 917px) 100vw, 917px" /></p>
<h1>首页点播功能</h1>
<p>
  快进看视频，主要理解思路，最好自己写一写
</p>
<p>
  图片懒加载：<a href="http://www.jq22.com/jquery-info390">http://www.jq22.com/jquery-info390</a>
</p>
<h1><a id="post-5792-_Toc488330851"></a>四、总结</h1>
<p>
  本项目中使用了以下几个插件/功能：
</p>
<p>
  Laravel自带组件：
</p>
<p>
  DebugBar（调试工具）、
</p>
<p>
  laravelexcel（导出导入excel文件）、
</p>
<p>
  QiniuSDK（云存储）、
</p>
<p>
  GuzzleHttp（发送请求）
</p>
<p>
  JQuery插件：
</p>
<p>
  datatables（数据表格无刷新分页）、
</p>
<p>
  webuploader（上传文件）、
</p>
<p>
  validate（表单验证插件）、
</p>
<p>
  layer（弹框插件）
</p>
<p>
  直播内容
</p>
<p>
  	七牛直播云
</p>
<p>
  	OBS推流软件使用
</p>
<p>
  	视频播放器Ckplayer（拉流）</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/5792.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TP3.2商城 （一）项目开发流程、商品分类、商品管理、图片上传</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/4706.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/4706.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 13:04:55 +0000</pubDate>
				<category><![CDATA[TP3.2]]></category>
		<category><![CDATA[TP3.2商城]]></category>
		<category><![CDATA[后台框架]]></category>
		<category><![CDATA[商品分类]]></category>
		<category><![CDATA[商品管理]]></category>
		<category><![CDATA[图片上传]]></category>
		<category><![CDATA[项目开发流程]]></category>
		<guid isPermaLink="false">/?p=4706</guid>

					<description><![CDATA[项目开发流程; 需求分析 原型界面 UI设计 前端编写代码 核心架构处理(代码层面核心架构，服务器层面的架构、 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>项目开发流程;</h1>
<ol>
<li>
  需求分析
</li>
<li>
  原型界面
</li>
<li>
  UI设计
</li>
<li>
  前端编写代码
</li>
<li>
  核心架构处理(代码层面核心架构，服务器层面的架构、数据库的架构等)
</li>
<li>
  编写代码
</li>
<li>
  测试
</li>
<li>
  上线
</li>
</ol>
<h1>项目分析</h1>
<h2>2.1、项目前台分析</h2>
<p><img loading="lazy" decoding="async" width="992" height="448" src="/wp-content/uploads/2018/05/word-image-4231.png" class="wp-image-4707" srcset="/wp-content/uploads/2018/05/word-image-4231.png 992w, /wp-content/uploads/2018/05/word-image-4231-300x135.png 300w, /wp-content/uploads/2018/05/word-image-4231-768x347.png 768w" sizes="(max-width: 992px) 100vw, 992px" /></p>
<h2>2.2、项目后台分析</h2>
<p><img loading="lazy" decoding="async" width="900" height="469" src="/wp-content/uploads/2018/05/word-image-4232.png" class="wp-image-4708" srcset="/wp-content/uploads/2018/05/word-image-4232.png 900w, /wp-content/uploads/2018/05/word-image-4232-300x156.png 300w, /wp-content/uploads/2018/05/word-image-4232-768x400.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></p>
<h1>ecshop安装</h1>
<h2>3.1、ecshop的配置</h2>
<p>
  ①创建ecshop的web目录
</p>
<p><img loading="lazy" decoding="async" width="828" height="226" src="/wp-content/uploads/2018/05/word-image-4233.png" class="wp-image-4709" srcset="/wp-content/uploads/2018/05/word-image-4233.png 828w, /wp-content/uploads/2018/05/word-image-4233-300x82.png 300w, /wp-content/uploads/2018/05/word-image-4233-768x210.png 768w" sizes="(max-width: 828px) 100vw, 828px" /></p>
<p>
  ②拷贝ecshop的源码
</p>
<p><img loading="lazy" decoding="async" width="1218" height="593" src="/wp-content/uploads/2018/05/word-image-4234.png" class="wp-image-4710" srcset="/wp-content/uploads/2018/05/word-image-4234.png 1218w, /wp-content/uploads/2018/05/word-image-4234-300x146.png 300w, /wp-content/uploads/2018/05/word-image-4234-768x374.png 768w, /wp-content/uploads/2018/05/word-image-4234-1024x499.png 1024w" sizes="(max-width: 1218px) 100vw, 1218px" /></p>
<p>
  ③创建虚拟主机
</p>
<p><img loading="lazy" decoding="async" width="1030" height="383" src="/wp-content/uploads/2018/05/word-image-4235.png" class="wp-image-4711" srcset="/wp-content/uploads/2018/05/word-image-4235.png 1030w, /wp-content/uploads/2018/05/word-image-4235-300x112.png 300w, /wp-content/uploads/2018/05/word-image-4235-768x286.png 768w, /wp-content/uploads/2018/05/word-image-4235-1024x381.png 1024w" sizes="(max-width: 1030px) 100vw, 1030px" /></p>
<p>
  ④修改hosts文件
</p>
<p><img loading="lazy" decoding="async" width="615" height="433" src="/wp-content/uploads/2018/05/word-image-4236.png" class="wp-image-4712" srcset="/wp-content/uploads/2018/05/word-image-4236.png 615w, /wp-content/uploads/2018/05/word-image-4236-300x211.png 300w" sizes="(max-width: 615px) 100vw, 615px" /></p>
<h2>3.2、安装ecshop</h2>
<p>
  ①重启Apache访问安装
</p>
<p><img loading="lazy" decoding="async" width="1253" height="689" src="/wp-content/uploads/2018/05/word-image-4237.png" class="wp-image-4713" srcset="/wp-content/uploads/2018/05/word-image-4237.png 1253w, /wp-content/uploads/2018/05/word-image-4237-300x165.png 300w, /wp-content/uploads/2018/05/word-image-4237-768x422.png 768w, /wp-content/uploads/2018/05/word-image-4237-1024x563.png 1024w" sizes="(max-width: 1253px) 100vw, 1253px" /></p>
<p>
  ②检查环境
</p>
<p><img loading="lazy" decoding="async" width="1198" height="670" src="/wp-content/uploads/2018/05/word-image-4238.png" class="wp-image-4714" srcset="/wp-content/uploads/2018/05/word-image-4238.png 1198w, /wp-content/uploads/2018/05/word-image-4238-300x168.png 300w, /wp-content/uploads/2018/05/word-image-4238-768x430.png 768w, /wp-content/uploads/2018/05/word-image-4238-1024x573.png 1024w" sizes="(max-width: 1198px) 100vw, 1198px" /></p>
<p>
  ③配置信息
</p>
<p><img loading="lazy" decoding="async" width="1195" height="693" src="/wp-content/uploads/2018/05/word-image-4239.png" class="wp-image-4715" srcset="/wp-content/uploads/2018/05/word-image-4239.png 1195w, /wp-content/uploads/2018/05/word-image-4239-300x174.png 300w, /wp-content/uploads/2018/05/word-image-4239-768x445.png 768w, /wp-content/uploads/2018/05/word-image-4239-1024x594.png 1024w" sizes="(max-width: 1195px) 100vw, 1195px" /></p>
<p>
  ④登录后台
</p>
<p><img loading="lazy" decoding="async" width="1115" height="616" src="/wp-content/uploads/2018/05/word-image-4240.png" class="wp-image-4716" srcset="/wp-content/uploads/2018/05/word-image-4240.png 1115w, /wp-content/uploads/2018/05/word-image-4240-300x166.png 300w, /wp-content/uploads/2018/05/word-image-4240-768x424.png 768w, /wp-content/uploads/2018/05/word-image-4240-1024x566.png 1024w" sizes="(max-width: 1115px) 100vw, 1115px" /></p>
<h2>3.3、解决报错问题</h2>
<p>
  ①修改includes目录下的cls_template.php文件
</p>
<p><img loading="lazy" decoding="async" width="867" height="559" src="/wp-content/uploads/2018/05/word-image-4241.png" class="wp-image-4717" srcset="/wp-content/uploads/2018/05/word-image-4241.png 867w, /wp-content/uploads/2018/05/word-image-4241-300x193.png 300w, /wp-content/uploads/2018/05/word-image-4241-768x495.png 768w" sizes="(max-width: 867px) 100vw, 867px" /></p>
<p>
  ②修改cls_image.php文件
</p>
<p><img loading="lazy" decoding="async" width="880" height="533" src="/wp-content/uploads/2018/05/word-image-4242.png" class="wp-image-4718" srcset="/wp-content/uploads/2018/05/word-image-4242.png 880w, /wp-content/uploads/2018/05/word-image-4242-300x182.png 300w, /wp-content/uploads/2018/05/word-image-4242-768x465.png 768w" sizes="(max-width: 880px) 100vw, 880px" /></p>
<p>
  ③修改lib_main.php
</p>
<p><img loading="lazy" decoding="async" width="911" height="533" src="/wp-content/uploads/2018/05/word-image-4243.png" class="wp-image-4719" srcset="/wp-content/uploads/2018/05/word-image-4243.png 911w, /wp-content/uploads/2018/05/word-image-4243-300x176.png 300w, /wp-content/uploads/2018/05/word-image-4243-768x449.png 768w" sizes="(max-width: 911px) 100vw, 911px" /></p>
<p>
  ④清除缓存
</p>
<p><img loading="lazy" decoding="async" width="1366" height="165" src="/wp-content/uploads/2018/05/word-image-4244.png" class="wp-image-4720" srcset="/wp-content/uploads/2018/05/word-image-4244.png 1366w, /wp-content/uploads/2018/05/word-image-4244-300x36.png 300w, /wp-content/uploads/2018/05/word-image-4244-768x93.png 768w, /wp-content/uploads/2018/05/word-image-4244-1024x124.png 1024w" sizes="(max-width: 1366px) 100vw, 1366px" /></p>
<h1>商品分类管理</h1>
<h2>4.1、商品分类列表显示</h2>
<p>
  ①增加index方法获取数据并且渲染模板
</p>
<p><img loading="lazy" decoding="async" width="938" height="474" src="/wp-content/uploads/2018/05/word-image-4245.png" class="wp-image-4721" srcset="/wp-content/uploads/2018/05/word-image-4245.png 938w, /wp-content/uploads/2018/05/word-image-4245-300x152.png 300w, /wp-content/uploads/2018/05/word-image-4245-768x388.png 768w" sizes="(max-width: 938px) 100vw, 938px" /></p>
<p>
  ②拷贝视图
</p>
<p><img loading="lazy" decoding="async" width="1232" height="325" src="/wp-content/uploads/2018/05/word-image-4246.png" class="wp-image-4722" srcset="/wp-content/uploads/2018/05/word-image-4246.png 1232w, /wp-content/uploads/2018/05/word-image-4246-300x79.png 300w, /wp-content/uploads/2018/05/word-image-4246-768x203.png 768w, /wp-content/uploads/2018/05/word-image-4246-1024x270.png 1024w" sizes="(max-width: 1232px) 100vw, 1232px" /></p>
<p>
  ③修改资源地址
</p>
<p><img loading="lazy" decoding="async" width="1117" height="456" src="/wp-content/uploads/2018/05/word-image-4247.png" class="wp-image-4723" srcset="/wp-content/uploads/2018/05/word-image-4247.png 1117w, /wp-content/uploads/2018/05/word-image-4247-300x122.png 300w, /wp-content/uploads/2018/05/word-image-4247-768x314.png 768w, /wp-content/uploads/2018/05/word-image-4247-1024x418.png 1024w" sizes="(max-width: 1117px) 100vw, 1117px" /></p>
<p>
  ④修改模板循环显示数据
</p>
<p><img loading="lazy" decoding="async" width="1115" height="672" src="/wp-content/uploads/2018/05/word-image-4248.png" class="wp-image-4724" srcset="/wp-content/uploads/2018/05/word-image-4248.png 1115w, /wp-content/uploads/2018/05/word-image-4248-300x181.png 300w, /wp-content/uploads/2018/05/word-image-4248-768x463.png 768w, /wp-content/uploads/2018/05/word-image-4248-1024x617.png 1024w" sizes="(max-width: 1115px) 100vw, 1115px" /></p>
<h2>4.2、分类的删除</h2>
<p>
  ①创建方法调用模型方法进行删除
</p>
<p><img loading="lazy" decoding="async" width="958" height="702" src="/wp-content/uploads/2018/05/word-image-4249.png" class="wp-image-4725" srcset="/wp-content/uploads/2018/05/word-image-4249.png 958w, /wp-content/uploads/2018/05/word-image-4249-300x220.png 300w, /wp-content/uploads/2018/05/word-image-4249-768x563.png 768w" sizes="(max-width: 958px) 100vw, 958px" /></p>
<p>
  ②在模型中实现删除方法
</p>
<p><img loading="lazy" decoding="async" width="1047" height="592" src="/wp-content/uploads/2018/05/word-image-4250.png" class="wp-image-4726" srcset="/wp-content/uploads/2018/05/word-image-4250.png 1047w, /wp-content/uploads/2018/05/word-image-4250-300x170.png 300w, /wp-content/uploads/2018/05/word-image-4250-768x434.png 768w, /wp-content/uploads/2018/05/word-image-4250-1024x579.png 1024w" sizes="(max-width: 1047px) 100vw, 1047px" /></p>
<h2>4.3、分类的编辑</h2>
<h3>4.3.1、回显分类信息</h3>
<p>
  ①创建方法获取数据并且显示
</p>
<p><img loading="lazy" decoding="async" width="1047" height="616" src="/wp-content/uploads/2018/05/word-image-4251.png" class="wp-image-4727" srcset="/wp-content/uploads/2018/05/word-image-4251.png 1047w, /wp-content/uploads/2018/05/word-image-4251-300x177.png 300w, /wp-content/uploads/2018/05/word-image-4251-768x452.png 768w, /wp-content/uploads/2018/05/word-image-4251-1024x602.png 1024w" sizes="(max-width: 1047px) 100vw, 1047px" /></p>
<p>
  ②拷贝添加模板为编辑模板
</p>
<p><img loading="lazy" decoding="async" width="865" height="283" src="/wp-content/uploads/2018/05/word-image-4252.png" class="wp-image-4728" srcset="/wp-content/uploads/2018/05/word-image-4252.png 865w, /wp-content/uploads/2018/05/word-image-4252-300x98.png 300w, /wp-content/uploads/2018/05/word-image-4252-768x251.png 768w" sizes="(max-width: 865px) 100vw, 865px" /></p>
<p>
  ③修改模板
</p>
<p><img loading="lazy" decoding="async" width="1160" height="699" src="/wp-content/uploads/2018/05/word-image-4253.png" class="wp-image-4729" srcset="/wp-content/uploads/2018/05/word-image-4253.png 1160w, /wp-content/uploads/2018/05/word-image-4253-300x181.png 300w, /wp-content/uploads/2018/05/word-image-4253-768x463.png 768w, /wp-content/uploads/2018/05/word-image-4253-1024x617.png 1024w" sizes="(max-width: 1160px) 100vw, 1160px" /></p>
<h3>4.3.2、实现提交修改</h3>
<p>
  ①修改edit方法处理提交
</p>
<p><img loading="lazy" decoding="async" width="977" height="585" src="/wp-content/uploads/2018/05/word-image-4254.png" class="wp-image-4730" srcset="/wp-content/uploads/2018/05/word-image-4254.png 977w, /wp-content/uploads/2018/05/word-image-4254-300x180.png 300w, /wp-content/uploads/2018/05/word-image-4254-768x460.png 768w" sizes="(max-width: 977px) 100vw, 977px" /></p>
<p>
  ②修改getTree方法可以根据id标识获取子分类
</p>
<p><img loading="lazy" decoding="async" width="1037" height="536" src="/wp-content/uploads/2018/05/word-image-4255.png" class="wp-image-4731" srcset="/wp-content/uploads/2018/05/word-image-4255.png 1037w, /wp-content/uploads/2018/05/word-image-4255-300x155.png 300w, /wp-content/uploads/2018/05/word-image-4255-768x397.png 768w, /wp-content/uploads/2018/05/word-image-4255-1024x529.png 1024w" sizes="(max-width: 1037px) 100vw, 1037px" /></p>
<p>
  ③模型增加方法实现修改
</p>
<p><img loading="lazy" decoding="async" width="1106" height="697" src="/wp-content/uploads/2018/05/word-image-4256.png" class="wp-image-4732" srcset="/wp-content/uploads/2018/05/word-image-4256.png 1106w, /wp-content/uploads/2018/05/word-image-4256-300x189.png 300w, /wp-content/uploads/2018/05/word-image-4256-768x484.png 768w, /wp-content/uploads/2018/05/word-image-4256-1024x645.png 1024w" sizes="(max-width: 1106px) 100vw, 1106px" /></p>
<h2>4.4、分类使用模板继承</h2>
<h3>4.4.1、介绍模板继承</h3>
<p>
  一个模板继承另外一个模板。在父模板中已有的HTML代码可以直接使用
</p>
<p><img loading="lazy" decoding="async" width="1046" height="635" src="/wp-content/uploads/2018/05/word-image-4257.png" class="wp-image-4733" srcset="/wp-content/uploads/2018/05/word-image-4257.png 1046w, /wp-content/uploads/2018/05/word-image-4257-300x182.png 300w, /wp-content/uploads/2018/05/word-image-4257-768x466.png 768w, /wp-content/uploads/2018/05/word-image-4257-1024x622.png 1024w" sizes="(max-width: 1046px) 100vw, 1046px" /></p>
<h3>4.4.2、使用模板继承</h3>
<p>
  ①定义父模板
</p>
<p><img loading="lazy" decoding="async" width="1119" height="669" src="/wp-content/uploads/2018/05/word-image-4258.png" class="wp-image-4734" srcset="/wp-content/uploads/2018/05/word-image-4258.png 1119w, /wp-content/uploads/2018/05/word-image-4258-300x179.png 300w, /wp-content/uploads/2018/05/word-image-4258-768x459.png 768w, /wp-content/uploads/2018/05/word-image-4258-1024x612.png 1024w" sizes="(max-width: 1119px) 100vw, 1119px" /><br />
<img loading="lazy" decoding="async" width="1096" height="498" src="/wp-content/uploads/2018/05/word-image-4259.png" class="wp-image-4735" srcset="/wp-content/uploads/2018/05/word-image-4259.png 1096w, /wp-content/uploads/2018/05/word-image-4259-300x136.png 300w, /wp-content/uploads/2018/05/word-image-4259-768x349.png 768w, /wp-content/uploads/2018/05/word-image-4259-1024x465.png 1024w" sizes="(max-width: 1096px) 100vw, 1096px" /></p>
<p>
  ②修改添加使用模板继承
</p>
<p><img loading="lazy" decoding="async" width="1101" height="616" src="/wp-content/uploads/2018/05/word-image-4260.png" class="wp-image-4736" srcset="/wp-content/uploads/2018/05/word-image-4260.png 1101w, /wp-content/uploads/2018/05/word-image-4260-300x168.png 300w, /wp-content/uploads/2018/05/word-image-4260-768x430.png 768w, /wp-content/uploads/2018/05/word-image-4260-1024x573.png 1024w" sizes="(max-width: 1101px) 100vw, 1101px" /><br />
<img loading="lazy" decoding="async" width="1080" height="512" src="/wp-content/uploads/2018/05/word-image-4261.png" class="wp-image-4737" srcset="/wp-content/uploads/2018/05/word-image-4261.png 1080w, /wp-content/uploads/2018/05/word-image-4261-300x142.png 300w, /wp-content/uploads/2018/05/word-image-4261-768x364.png 768w, /wp-content/uploads/2018/05/word-image-4261-1024x485.png 1024w" sizes="(max-width: 1080px) 100vw, 1080px" /></p>
<p>
  ③修改index使用模板继承
</p>
<p><img loading="lazy" decoding="async" width="953" height="342" src="/wp-content/uploads/2018/05/word-image-4262.png" class="wp-image-4738" srcset="/wp-content/uploads/2018/05/word-image-4262.png 953w, /wp-content/uploads/2018/05/word-image-4262-300x108.png 300w, /wp-content/uploads/2018/05/word-image-4262-768x276.png 768w" sizes="(max-width: 953px) 100vw, 953px" /></p>
<p>
  ④修改编辑模板使用模板继承
</p>
<p><img loading="lazy" decoding="async" width="1060" height="428" src="/wp-content/uploads/2018/05/word-image-4263.png" class="wp-image-4739" srcset="/wp-content/uploads/2018/05/word-image-4263.png 1060w, /wp-content/uploads/2018/05/word-image-4263-300x121.png 300w, /wp-content/uploads/2018/05/word-image-4263-768x310.png 768w, /wp-content/uploads/2018/05/word-image-4263-1024x413.png 1024w" sizes="(max-width: 1060px) 100vw, 1060px" /></p>
<h1>商品管理</h1>
<h2>5.1、商品数据表创建</h2>
<p>
  CREATE TABLE `shop_goods` (
</p>
<p>
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
</p>
<p>
    `goods_name` varchar(255) NOT NULL DEFAULT &#8221; COMMENT &#8216;商品名称&#8217;,
</p>
<p>
    `goods_sn` varchar(255) NOT NULL DEFAULT &#8221; COMMENT &#8216;货号&#8217;,
</p>
<p>
    `market_price` decimal(10,2) NOT NULL DEFAULT &#8216;0.00&#8217; COMMENT &#8216;市场价格&#8217;,
</p>
<p>
    `shop_price` decimal(10,2) NOT NULL DEFAULT &#8216;0.00&#8217; COMMENT &#8216;本店售价  单位元&#8217;,
</p>
<p>
    `goods_number` int(11) NOT NULL DEFAULT &#8216;0&#8217; COMMENT &#8216;商品数量&#8217;,
</p>
<p>
    `cate_id` int(11) NOT NULL DEFAULT &#8216;0&#8217; COMMENT &#8216;商品的分类ID 关联category表中id字段&#8217;,
</p>
<p>
    `goods_img` varchar(255) NOT NULL DEFAULT &#8221; COMMENT &#8216;商品图片&#8217;,
</p>
<p>
    `goods_thumb` varchar(255) NOT NULL DEFAULT &#8221; COMMENT &#8216;缩略图&#8217;,
</p>
<p>
    `goods_body` text,
</p>
<p>
    `addtime` int(11) NOT NULL DEFAULT &#8216;0&#8217; COMMENT &#8216;添加时间&#8217;,
</p>
<p>
    `is_del` tinyint(4) NOT NULL DEFAULT &#8216;1&#8217; COMMENT &#8216;是否删除 1代表正常 0代表已经删除&#8217;,
</p>
<p>
    `is_hot` tinyint(4) NOT NULL DEFAULT &#8216;0&#8217; COMMENT &#8216;是否热卖 1是 0否&#8217;,
</p>
<p>
    `is_new` tinyint(4) NOT NULL DEFAULT &#8216;0&#8217; COMMENT &#8216;是否新品  1是0否&#8217;,
</p>
<p>
    `is_rec` tinyint(4) NOT NULL DEFAULT &#8216;0&#8217; COMMENT &#8216;是否推荐  1是0否&#8217;,
</p>
<p>
    PRIMARY KEY (`id`)
</p>
<p>
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
</p>
<h2>5.2、实现商品的基本入库</h2>
<h3>5.2.1、显示添加的界面</h3>
<p>
  ①创建控制器方法显示添加的模板
</p>
<p><img loading="lazy" decoding="async" width="964" height="550" src="/wp-content/uploads/2018/05/word-image-4264.png" class="wp-image-4740" srcset="/wp-content/uploads/2018/05/word-image-4264.png 964w, /wp-content/uploads/2018/05/word-image-4264-300x171.png 300w, /wp-content/uploads/2018/05/word-image-4264-768x438.png 768w" sizes="(max-width: 964px) 100vw, 964px" /></p>
<p>
  ②拷贝商品添加模板
</p>
<p><img loading="lazy" decoding="async" width="1158" height="435" src="/wp-content/uploads/2018/05/word-image-4265.png" class="wp-image-4741" srcset="/wp-content/uploads/2018/05/word-image-4265.png 1158w, /wp-content/uploads/2018/05/word-image-4265-300x113.png 300w, /wp-content/uploads/2018/05/word-image-4265-768x288.png 768w, /wp-content/uploads/2018/05/word-image-4265-1024x385.png 1024w" sizes="(max-width: 1158px) 100vw, 1158px" /></p>
<p>
  ③修改模板使用模板继承
</p>
<p><img loading="lazy" decoding="async" width="1113" height="496" src="/wp-content/uploads/2018/05/word-image-4266.png" class="wp-image-4742" srcset="/wp-content/uploads/2018/05/word-image-4266.png 1113w, /wp-content/uploads/2018/05/word-image-4266-300x134.png 300w, /wp-content/uploads/2018/05/word-image-4266-768x342.png 768w, /wp-content/uploads/2018/05/word-image-4266-1024x456.png 1024w" sizes="(max-width: 1113px) 100vw, 1113px" /></p>
<p>
  ④处理模板显示商品分类
</p>
<p><img loading="lazy" decoding="async" width="1125" height="699" src="/wp-content/uploads/2018/05/word-image-4267.png" class="wp-image-4743" srcset="/wp-content/uploads/2018/05/word-image-4267.png 1125w, /wp-content/uploads/2018/05/word-image-4267-300x186.png 300w, /wp-content/uploads/2018/05/word-image-4267-768x477.png 768w, /wp-content/uploads/2018/05/word-image-4267-1024x636.png 1024w" sizes="(max-width: 1125px) 100vw, 1125px" /><br />
<img loading="lazy" decoding="async" width="948" height="416" src="/wp-content/uploads/2018/05/word-image-4268.png" class="wp-image-4744" srcset="/wp-content/uploads/2018/05/word-image-4268.png 948w, /wp-content/uploads/2018/05/word-image-4268-300x132.png 300w, /wp-content/uploads/2018/05/word-image-4268-768x337.png 768w" sizes="(max-width: 948px) 100vw, 948px" /></p>
<h3>5.2.2、实现入库</h3>
<p>
  ①修改方法处理数据提交入库
</p>
<p><img loading="lazy" decoding="async" width="1092" height="703" src="/wp-content/uploads/2018/05/word-image-4269.png" class="wp-image-4745" srcset="/wp-content/uploads/2018/05/word-image-4269.png 1092w, /wp-content/uploads/2018/05/word-image-4269-300x193.png 300w, /wp-content/uploads/2018/05/word-image-4269-768x494.png 768w, /wp-content/uploads/2018/05/word-image-4269-1024x659.png 1024w" sizes="(max-width: 1092px) 100vw, 1092px" /></p>
<p>
  ②创建模型类
</p>
<p><img loading="lazy" decoding="async" width="780" height="473" src="/wp-content/uploads/2018/05/word-image-4270.png" class="wp-image-4746" srcset="/wp-content/uploads/2018/05/word-image-4270.png 780w, /wp-content/uploads/2018/05/word-image-4270-300x182.png 300w, /wp-content/uploads/2018/05/word-image-4270-768x466.png 768w" sizes="(max-width: 780px) 100vw, 780px" /></p>
<p>
  ③添加字段定义
</p>
<p><img loading="lazy" decoding="async" width="1098" height="539" src="/wp-content/uploads/2018/05/word-image-4271.png" class="wp-image-4747" srcset="/wp-content/uploads/2018/05/word-image-4271.png 1098w, /wp-content/uploads/2018/05/word-image-4271-300x147.png 300w, /wp-content/uploads/2018/05/word-image-4271-768x377.png 768w, /wp-content/uploads/2018/05/word-image-4271-1024x503.png 1024w" sizes="(max-width: 1098px) 100vw, 1098px" /></p>
<p>
  ④创建验证规则
</p>
<p><img loading="lazy" decoding="async" width="1064" height="640" src="/wp-content/uploads/2018/05/word-image-4272.png" class="wp-image-4748" srcset="/wp-content/uploads/2018/05/word-image-4272.png 1064w, /wp-content/uploads/2018/05/word-image-4272-300x180.png 300w, /wp-content/uploads/2018/05/word-image-4272-768x462.png 768w, /wp-content/uploads/2018/05/word-image-4272-1024x616.png 1024w" sizes="(max-width: 1064px) 100vw, 1064px" /></p>
<p>
  ⑤增加添加数据的前置钩子函数
</p>
<p><img loading="lazy" decoding="async" width="1103" height="700" src="/wp-content/uploads/2018/05/word-image-4273.png" class="wp-image-4749" srcset="/wp-content/uploads/2018/05/word-image-4273.png 1103w, /wp-content/uploads/2018/05/word-image-4273-300x190.png 300w, /wp-content/uploads/2018/05/word-image-4273-768x487.png 768w, /wp-content/uploads/2018/05/word-image-4273-1024x650.png 1024w" sizes="(max-width: 1103px) 100vw, 1103px" /></p>
<p>
  ⑥修改钩子函数增加价格判断
</p>
<p><img loading="lazy" decoding="async" width="986" height="653" src="/wp-content/uploads/2018/05/word-image-4274.png" class="wp-image-4750" srcset="/wp-content/uploads/2018/05/word-image-4274.png 986w, /wp-content/uploads/2018/05/word-image-4274-300x199.png 300w, /wp-content/uploads/2018/05/word-image-4274-768x509.png 768w" sizes="(max-width: 986px) 100vw, 986px" /></p>
<h2>5.3、使用ueditor实现商品详情</h2>
<h3>5.3.1、项目中使用ueditor</h3>
<p>
  ①拷贝源码
</p>
<p><img loading="lazy" decoding="async" width="1334" height="435" src="/wp-content/uploads/2018/05/word-image-4275.png" class="wp-image-4751" srcset="/wp-content/uploads/2018/05/word-image-4275.png 1334w, /wp-content/uploads/2018/05/word-image-4275-300x98.png 300w, /wp-content/uploads/2018/05/word-image-4275-768x250.png 768w, /wp-content/uploads/2018/05/word-image-4275-1024x334.png 1024w" sizes="(max-width: 1334px) 100vw, 1334px" /></p>
<p>
  ②在添加模板中引入编辑器的js文件
</p>
<p><img loading="lazy" decoding="async" width="1196" height="707" src="/wp-content/uploads/2018/05/word-image-4276.png" class="wp-image-4752" srcset="/wp-content/uploads/2018/05/word-image-4276.png 1196w, /wp-content/uploads/2018/05/word-image-4276-300x177.png 300w, /wp-content/uploads/2018/05/word-image-4276-768x454.png 768w, /wp-content/uploads/2018/05/word-image-4276-1024x605.png 1024w" sizes="(max-width: 1196px) 100vw, 1196px" /></p>
<h3>5.3.2、实现选项卡效果</h3>
<p>
  ①修改选项卡标签
</p>
<p><img loading="lazy" decoding="async" width="1018" height="340" src="/wp-content/uploads/2018/05/word-image-4277.png" class="wp-image-4753" srcset="/wp-content/uploads/2018/05/word-image-4277.png 1018w, /wp-content/uploads/2018/05/word-image-4277-300x100.png 300w, /wp-content/uploads/2018/05/word-image-4277-768x257.png 768w" sizes="(max-width: 1018px) 100vw, 1018px" /></p>
<p>
  ②修改商品详情使用选项卡
</p>
<p><img loading="lazy" decoding="async" width="1099" height="662" src="/wp-content/uploads/2018/05/word-image-4278.png" class="wp-image-4754" srcset="/wp-content/uploads/2018/05/word-image-4278.png 1099w, /wp-content/uploads/2018/05/word-image-4278-300x181.png 300w, /wp-content/uploads/2018/05/word-image-4278-768x463.png 768w, /wp-content/uploads/2018/05/word-image-4278-1024x617.png 1024w" sizes="(max-width: 1099px) 100vw, 1099px" /></p>
<p>
  ③修改父模板引入jQuery
</p>
<p><img loading="lazy" decoding="async" width="1148" height="684" src="/wp-content/uploads/2018/05/word-image-4279.png" class="wp-image-4755" srcset="/wp-content/uploads/2018/05/word-image-4279.png 1148w, /wp-content/uploads/2018/05/word-image-4279-300x179.png 300w, /wp-content/uploads/2018/05/word-image-4279-768x458.png 768w, /wp-content/uploads/2018/05/word-image-4279-1024x610.png 1024w" sizes="(max-width: 1148px) 100vw, 1148px" /></p>
<p>
  ④实现切换效果
</p>
<p><img loading="lazy" decoding="async" width="1027" height="598" src="/wp-content/uploads/2018/05/word-image-4280.png" class="wp-image-4756" srcset="/wp-content/uploads/2018/05/word-image-4280.png 1027w, /wp-content/uploads/2018/05/word-image-4280-300x175.png 300w, /wp-content/uploads/2018/05/word-image-4280-768x447.png 768w, /wp-content/uploads/2018/05/word-image-4280-1024x596.png 1024w" sizes="(max-width: 1027px) 100vw, 1027px" /></p>
<h3>5.3.3、查看ueditor文件上传的流程(了解)</h3>
<p>
  ①抓包查找文件上传地址
</p>
<p><img loading="lazy" decoding="async" width="1177" height="531" src="/wp-content/uploads/2018/05/word-image-4281.png" class="wp-image-4757" srcset="/wp-content/uploads/2018/05/word-image-4281.png 1177w, /wp-content/uploads/2018/05/word-image-4281-300x135.png 300w, /wp-content/uploads/2018/05/word-image-4281-768x346.png 768w, /wp-content/uploads/2018/05/word-image-4281-1024x462.png 1024w" sizes="(max-width: 1177px) 100vw, 1177px" /></p>
<p>
  ②查看controller.php
</p>
<p><img loading="lazy" decoding="async" width="1008" height="698" src="/wp-content/uploads/2018/05/word-image-4282.png" class="wp-image-4758" srcset="/wp-content/uploads/2018/05/word-image-4282.png 1008w, /wp-content/uploads/2018/05/word-image-4282-300x208.png 300w, /wp-content/uploads/2018/05/word-image-4282-768x532.png 768w" sizes="(max-width: 1008px) 100vw, 1008px" /></p>
<p>
  ③查看action_upload.php
</p>
<p><img loading="lazy" decoding="async" width="970" height="627" src="/wp-content/uploads/2018/05/word-image-4283.png" class="wp-image-4759" srcset="/wp-content/uploads/2018/05/word-image-4283.png 970w, /wp-content/uploads/2018/05/word-image-4283-300x194.png 300w, /wp-content/uploads/2018/05/word-image-4283-768x496.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></p>
<p>
  ④查看upload类
</p>
<p><img loading="lazy" decoding="async" width="1016" height="607" src="/wp-content/uploads/2018/05/word-image-4284.png" class="wp-image-4760" srcset="/wp-content/uploads/2018/05/word-image-4284.png 1016w, /wp-content/uploads/2018/05/word-image-4284-300x179.png 300w, /wp-content/uploads/2018/05/word-image-4284-768x459.png 768w" sizes="(max-width: 1016px) 100vw, 1016px" /></p>
<p>
  对于上图的upFile及实现了文件上传的功能，关于需要修改上传逻辑的可以在下图中代码实现
</p>
<p><img loading="lazy" decoding="async" width="989" height="500" src="/wp-content/uploads/2018/05/word-image-4285.png" class="wp-image-4761" srcset="/wp-content/uploads/2018/05/word-image-4285.png 989w, /wp-content/uploads/2018/05/word-image-4285-300x152.png 300w, /wp-content/uploads/2018/05/word-image-4285-768x388.png 768w" sizes="(max-width: 989px) 100vw, 989px" /></p>
<h2>5.3、实现图片上传</h2>
<h3>5.3.1、TP中的文件上传功能</h3>
<p>
  ①查看文件上传的配置信息
</p>
<p><img loading="lazy" decoding="async" width="987" height="702" src="/wp-content/uploads/2018/05/word-image-4286.png" class="wp-image-4762" srcset="/wp-content/uploads/2018/05/word-image-4286.png 987w, /wp-content/uploads/2018/05/word-image-4286-300x213.png 300w, /wp-content/uploads/2018/05/word-image-4286-768x546.png 768w" sizes="(max-width: 987px) 100vw, 987px" /></p>
<p>
  ②查看文件上传的方法
</p>
<p><img loading="lazy" decoding="async" width="966" height="650" src="/wp-content/uploads/2018/05/word-image-4287.png" class="wp-image-4763" srcset="/wp-content/uploads/2018/05/word-image-4287.png 966w, /wp-content/uploads/2018/05/word-image-4287-300x202.png 300w, /wp-content/uploads/2018/05/word-image-4287-768x517.png 768w" sizes="(max-width: 966px) 100vw, 966px" /></p>
<h3>5.3.2、具体实现文件上传</h3>
<p>
  ①创建测试方法显示上传表单
</p>
<p><img loading="lazy" decoding="async" width="805" height="411" src="/wp-content/uploads/2018/05/word-image-4288.png" class="wp-image-4764" srcset="/wp-content/uploads/2018/05/word-image-4288.png 805w, /wp-content/uploads/2018/05/word-image-4288-300x153.png 300w, /wp-content/uploads/2018/05/word-image-4288-768x392.png 768w" sizes="(max-width: 805px) 100vw, 805px" /></p>
<p>
  ②处理上传的表单
</p>
<p><img loading="lazy" decoding="async" width="1055" height="653" src="/wp-content/uploads/2018/05/word-image-4289.png" class="wp-image-4765" srcset="/wp-content/uploads/2018/05/word-image-4289.png 1055w, /wp-content/uploads/2018/05/word-image-4289-300x186.png 300w, /wp-content/uploads/2018/05/word-image-4289-768x475.png 768w, /wp-content/uploads/2018/05/word-image-4289-1024x634.png 1024w" sizes="(max-width: 1055px) 100vw, 1055px" /></p>
<p>
  ③实现文件上传
</p>
<p><img loading="lazy" decoding="async" width="986" height="686" src="/wp-content/uploads/2018/05/word-image-4290.png" class="wp-image-4766" srcset="/wp-content/uploads/2018/05/word-image-4290.png 986w, /wp-content/uploads/2018/05/word-image-4290-300x209.png 300w, /wp-content/uploads/2018/05/word-image-4290-768x534.png 768w" sizes="(max-width: 986px) 100vw, 986px" /></p>
<p>
  ④查看效果
</p>
<p><img loading="lazy" decoding="async" width="491" height="204" src="/wp-content/uploads/2018/05/word-image-4291.png" class="wp-image-4767" srcset="/wp-content/uploads/2018/05/word-image-4291.png 491w, /wp-content/uploads/2018/05/word-image-4291-300x125.png 300w" sizes="(max-width: 491px) 100vw, 491px" /></p>
<p>
  ⑤手动创建上传的根目录
</p>
<p><img loading="lazy" decoding="async" width="732" height="292" src="/wp-content/uploads/2018/05/word-image-4292.png" class="wp-image-4768" srcset="/wp-content/uploads/2018/05/word-image-4292.png 732w, /wp-content/uploads/2018/05/word-image-4292-300x120.png 300w" sizes="(max-width: 732px) 100vw, 732px" /></p>
<p>
  ⑤再次查看效果
</p>
<p><img loading="lazy" decoding="async" width="578" height="328" src="/wp-content/uploads/2018/05/word-image-4293.png" class="wp-image-4769" srcset="/wp-content/uploads/2018/05/word-image-4293.png 578w, /wp-content/uploads/2018/05/word-image-4293-300x170.png 300w" sizes="(max-width: 578px) 100vw, 578px" /></p>
<h3>5.3.3、在项目中使用文件上传</h3>
<p>
  ①修改添加的前置钩子函数实现文件上传
</p>
<p><img loading="lazy" decoding="async" width="1025" height="671" src="/wp-content/uploads/2018/05/word-image-4294.png" class="wp-image-4770" srcset="/wp-content/uploads/2018/05/word-image-4294.png 1025w, /wp-content/uploads/2018/05/word-image-4294-300x196.png 300w, /wp-content/uploads/2018/05/word-image-4294-768x503.png 768w, /wp-content/uploads/2018/05/word-image-4294-1024x670.png 1024w" sizes="(max-width: 1025px) 100vw, 1025px" /><br />
<img loading="lazy" decoding="async" width="996" height="587" src="/wp-content/uploads/2018/05/word-image-4295.png" class="wp-image-4771" srcset="/wp-content/uploads/2018/05/word-image-4295.png 996w, /wp-content/uploads/2018/05/word-image-4295-300x177.png 300w, /wp-content/uploads/2018/05/word-image-4295-768x453.png 768w" sizes="(max-width: 996px) 100vw, 996px" /></p>
<p>
  ②查看结果
</p>
<p><img loading="lazy" decoding="async" width="1090" height="446" src="/wp-content/uploads/2018/05/word-image-4296.png" class="wp-image-4772" srcset="/wp-content/uploads/2018/05/word-image-4296.png 1090w, /wp-content/uploads/2018/05/word-image-4296-300x123.png 300w, /wp-content/uploads/2018/05/word-image-4296-768x314.png 768w, /wp-content/uploads/2018/05/word-image-4296-1024x419.png 1024w" sizes="(max-width: 1090px) 100vw, 1090px" /></p>
<p>
  ③修改前置钩子函数的文件上传
</p>
<p><img loading="lazy" decoding="async" width="1041" height="631" src="/wp-content/uploads/2018/05/word-image-4297.png" class="wp-image-4773" srcset="/wp-content/uploads/2018/05/word-image-4297.png 1041w, /wp-content/uploads/2018/05/word-image-4297-300x182.png 300w, /wp-content/uploads/2018/05/word-image-4297-768x466.png 768w, /wp-content/uploads/2018/05/word-image-4297-1024x621.png 1024w" sizes="(max-width: 1041px) 100vw, 1041px" /></p>
<h2>5.4、处理商品的缩略图</h2>
<h3>5.4.1、生成缩略图流程</h3>
<ol>
<li>
  实例化Image对象
</li>
<li>
  使用对象打开图片
</li>
<li>
  指定方法对图片进行处理，并且将图片进行保存
</li>
</ol>
<h3>5.4.2、生成商品的缩略图</h3>
<p>
  ①修改添加的前置钩子函数
</p>
<p><img loading="lazy" decoding="async" width="1039" height="688" src="/wp-content/uploads/2018/05/word-image-4298.png" class="wp-image-4774" srcset="/wp-content/uploads/2018/05/word-image-4298.png 1039w, /wp-content/uploads/2018/05/word-image-4298-300x199.png 300w, /wp-content/uploads/2018/05/word-image-4298-768x509.png 768w, /wp-content/uploads/2018/05/word-image-4298-1024x678.png 1024w" sizes="(max-width: 1039px) 100vw, 1039px" /></p>
<p>
  针对文件上传成功之后在处理图片
</p>
<p>
  ②查看效果
</p>
<p><img loading="lazy" decoding="async" width="628" height="253" src="/wp-content/uploads/2018/05/word-image-4299.png" class="wp-image-4775" srcset="/wp-content/uploads/2018/05/word-image-4299.png 628w, /wp-content/uploads/2018/05/word-image-4299-300x121.png 300w" sizes="(max-width: 628px) 100vw, 628px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/4706.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
